Задача 1
Нултите хипотези се: - Intercept е нула, се отфрла - парите потрошени на TV не се значајно поврзани со продажбата, се отфрла - парите потрошени на radio не се значајно поврзани со продажбата, се отфрла - парите потрошени на newspaper не се значајно поврзани со продажбата, се прифаќа
Задача 2
KNN класификаторот ги зема најблиските K соседи и ја препишуваа онаа класа која што се појавува најчесто помеѓу нив. KNN регресорот ги зема најблиските К соседи и го пресметува просекот на нивните y-и.
Задача 3
(a)
Не мора да значи. Поради тоа што бета 5 е -10, следи дека жените губат -10 * ГПА, а добиваат +35 за тоа што се жени, па ако фикснатото ГПА е поголемо од 3.5, ова ќе биде точно.
Повторно, не мора да значи. Потребно ни е да знаеме како е дистрибуцијата на GPA кај мажите и жените.
Да, ако ГПА е поголемо од 3.5.
Не.
(b)
print(50 + 20 * 4 + 0.07 * 110 + 35 + 0.01 * 110 * 4 - 10 * 4)
[1] 137.1
(c)
Не. Потребно е да ја видиме и п вредноста за да заклучиме нешто вакво.
Задача 4
(a)
Треба да се приближно исти на тренирачкото множество. Кубната регресија ќе се прилагоди и ќе најде начин да преклопи линеарно множество. Можно е дури и да е во некои случаи подобра кубната регресија.
(b)
Речиси е сигурно дека линеарната регресија ќе биде подобра на тестирачкото множество.
(c)
Не можеме да знаеме. Многу зависи од големината на податочното множество (мало податочно множество може да е многу повеќе overfit-нато), од тоа колку е нелинеарна врската и сл.
(d)
Веројатно е дека на тренирачкото множество, кубната регресија ќе биде делумно подобра. Може да се случи и да е многу подобра, зависно од тоа колку е висок степенот на нелинеарноста.
Задача 5
\[
\hat{y_i}=
x_i\hat{\beta}=
x_i[(\sum_{j=1}^{n} x_{j}y_{j})/(\sum_{j=1}^{n} x_{j}^2)]=
\sum_{j=1}^{n} \frac{x_ix_j}{\sum_{k=1}^{n} x_{k}^2}y_j=
\sum_{j=1}^{n} a_jy_j
\] \[
a_j=\frac{x_ix_j}{\sum_{k=1}^{n} x_{k}^2}
\]
Задача 6
\[
f(\bar{x}) = \beta_0+\beta_1\bar{x}=\bar{y}-\beta_1\bar{x}+\beta_1\bar{x}=\bar{y}
\]
Задача 7
Не сум најсигурен како да се изгуби вториот член во броителот.
\[
R^2=1-\frac{RSS}{TSS}=1-\frac{\sum_{i=1}^n(y_i-\hat{y_i})^2}{\sum_{i=1}^n(y_i-\bar{y_i})^2}=\frac{\sum_{i=1}^n(y_i-\bar{y_i})^2 +\sum_{i=1}^n(y_i-\hat{y_i})^2}{\sum_{i=1}^n(y_i-\bar{y_i})^2}=\\
\frac{\sum_{i=1}^n(x_i-\bar{x_i})^2\sum_{i=1}^n(y_i-\bar{y_i})^2 +\sum_{i=1}^n(x_i-\bar{x_i})^2\sum_{i=1}^n(y_i-\hat{y_i})^2}{\sum_{i=1}^n(x_i-\bar{x_i})^2\sum_{i=1}^n(y_i-\bar{y_i})^2}
\]
Задача 10
(а)
lm.fit = lm(Sales ~ Price + Urban + US, data=Carseats)
summary(lm.fit)
(b)
Price влијае обратно-пропорционално на продажбите. Очекувано е за секоја единица покачување на цената, продажбите да паднат за \(0.05\). Или, ако цената се качи за 20 единици, ќе се продаде едно седиште помалце.
Коефициентот на UrbanYes има преголема стандардна грешка за да се утврди влијанието на Urban со сигурност. Дополнително, ако се погледне p-вредноста, станува јасно дека Urban не треба ни да биде вклучен во моделот. Можеме и да го видиме 95% интервал на доверба на овој параметар, кој 0-та ја содржи речиси во средината.
confint(lm.fit)
Настрана важноста на UrbanYes, двете категориски променливи можеме да ги интерпретираме на следниов начин: \(13.04 - 0.05 * Price\) e просечната продажба на седиштата кои чинат \(Price\), кои не се урбани и не се од САД. Во просек се продаат \(0.02\) седишта помалку доколку се урбани, а \(1.2\) седишта повеќе доколку се од САД.
Интерпретацијата на Intercept-от звучи малку понелогично. Од него можеме да заклучиме дека просечната продажба на бесплатни седишта кои не се урбани и не се од САД изнесѕва \(13.04\).
(c)
\[
Sales =
13.04 - 0.05 * Price - 0.02 * UrbanYes + 1.2 * USYes
\] \[
Sales =
13.04 - 0.05 * Price +
\begin{cases}
1.2 - 0.02 &\mbox{ако седиштето е од САД и е урбано}\\
1.2 &\mbox{ако седиштето е од САД и не е урбано}\\
-0.02 &\mbox{ако седиштето не е од САД и е урбано}\\
0 &\mbox{ако седиштето не е од САД и не е урбано}
\end{cases}
\]
(d)
UrbanYes може да се отстрани.
(e)
lm.fit = lm(Sales ~ Price + US, data=Carseats)
summary(lm.fit)
(f)
Со оглед на тоа што R-squared вредноста во двата случаи е ниска, има значителен простор за подобрување.
(h)
plot(predict(lm.fit), residuals(lm.fit))
plot(predict(lm.fit), rstudent(lm.fit))
Од графиците моежеме да зебележиме дека нема некои очигледни outliers.
plot(hatvalues(lm.fit))
Од графикот можеме да забележиме дека еден од примероците има значителен leverage.
Carseats[which.max(hatvalues(lm.fit)),]
Задача 15
(a)
columns = names(Boston)[2:length(names(Boston))]
p_values = c()
r_squared = c()
uni_coefficients = c()
for (i in 1:length(columns)) {
lm.fit = lm(as.formula(paste("crim ~", columns[i])), data=Boston)
p_values[i] = summary(lm.fit)$coefficients[1, 4]
r_squared[i] = summary(lm.fit)$r.squared
uni_coefficients[i] = lm.fit$coefficients[2]
}
plot(p_values)

plot(r_squared)

Ако се земат предвид графиците, променливата rad има значителна поврзаност со таргет променливата. Тоа може да се заклучи од ниската p-вредност и високиот r2.
(b)
lm.fit = lm(crim ~ ., data=Boston)
summary(lm.fit)
Call:
lm(formula = crim ~ ., data = Boston)
Residuals:
Min 1Q Median 3Q Max
-9.924 -2.120 -0.353 1.019 75.051
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 17.033228 7.234903 2.354 0.018949 *
zn 0.044855 0.018734 2.394 0.017025 *
indus -0.063855 0.083407 -0.766 0.444294
chas -0.749134 1.180147 -0.635 0.525867
nox -10.313535 5.275536 -1.955 0.051152 .
rm 0.430131 0.612830 0.702 0.483089
age 0.001452 0.017925 0.081 0.935488
dis -0.987176 0.281817 -3.503 0.000502 ***
rad 0.588209 0.088049 6.680 6.46e-11 ***
tax -0.003780 0.005156 -0.733 0.463793
ptratio -0.271081 0.186450 -1.454 0.146611
black -0.007538 0.003673 -2.052 0.040702 *
lstat 0.126211 0.075725 1.667 0.096208 .
medv -0.198887 0.060516 -3.287 0.001087 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 6.439 on 492 degrees of freedom
Multiple R-squared: 0.454, Adjusted R-squared: 0.4396
F-statistic: 31.47 on 13 and 492 DF, p-value: < 2.2e-16
Нултата хипотеза може да се отфрли за предихторите dis, rad и medv, а можеби и за black, indus и chas.
(c)
multi_coefficients = c()
for (i in 1:length(columns)) {
multi_coefficients[i] = lm.fit$coefficients[columns[i]]
}
plot(uni_coefficients, multi_coefficients)

(d)
poly_r_squared = c()
for (i in 1:length(columns)) {
if (columns[i] != "chas") {
lm.fit = lm(as.formula(paste("crim ~ poly(", columns[i], ", 3)", sep="")), data=Boston)
} else {
lm.fit = lm(as.formula(paste("crim ~", columns[i])), data=Boston)
}
poly_r_squared[i] = summary(lm.fit)$r.squared
}
summary(r_squared)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.003124 0.084068 0.148274 0.155697 0.177217 0.391257
summary(poly_r_squared)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.003124 0.113782 0.217932 0.216040 0.296978 0.420200
Од двете summaries можеме да забележиме дека резултатите се подобруваат кога користиме кубна регресија. Сите квартили имаат зголемени резултати, како и просекот.
LS0tDQp0aXRsZTogIkxpbmVhciBSZWdyZXNzaW9uIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkoTUFTUykNCmxpYnJhcnkoSVNMUikNCmBgYA0KDQojINCX0LDQtNCw0YfQsCAxDQoNCtCd0YPQu9GC0LjRgtC1INGF0LjQv9C+0YLQtdC30Lgg0YHQtToNCi0gSW50ZXJjZXB0INC1INC90YPQu9CwLCDRgdC1INC+0YLRhNGA0LvQsA0KLSDQv9Cw0YDQuNGC0LUg0L/QvtGC0YDQvtGI0LXQvdC4INC90LAgVFYg0L3QtSDRgdC1INC30L3QsNGH0LDRmNC90L4g0L/QvtCy0YDQt9Cw0L3QuCDRgdC+INC/0YDQvtC00LDQttCx0LDRgtCwLCDRgdC1INC+0YLRhNGA0LvQsA0KLSDQv9Cw0YDQuNGC0LUg0L/QvtGC0YDQvtGI0LXQvdC4INC90LAgcmFkaW8g0L3QtSDRgdC1INC30L3QsNGH0LDRmNC90L4g0L/QvtCy0YDQt9Cw0L3QuCDRgdC+INC/0YDQvtC00LDQttCx0LDRgtCwLCDRgdC1INC+0YLRhNGA0LvQsA0KLSDQv9Cw0YDQuNGC0LUg0L/QvtGC0YDQvtGI0LXQvdC4INC90LAgbmV3c3BhcGVyINC90LUg0YHQtSDQt9C90LDRh9Cw0ZjQvdC+INC/0L7QstGA0LfQsNC90Lgg0YHQviDQv9GA0L7QtNCw0LbQsdCw0YLQsCwg0YHQtSDQv9GA0LjRhNCw0ZzQsA0KDQojINCX0LDQtNCw0YfQsCAyDQoNCktOTiDQutC70LDRgdC40YTQuNC60LDRgtC+0YDQvtGCINCz0Lgg0LfQtdC80LAg0L3QsNGY0LHQu9C40YHQutC40YLQtSBLINGB0L7RgdC10LTQuCDQuCDRmNCwINC/0YDQtdC/0LjRiNGD0LLQsNCwINC+0L3QsNCwINC60LvQsNGB0LAg0LrQvtGY0LAg0YjRgtC+INGB0LUg0L/QvtGY0LDQstGD0LLQsCDQvdCw0ZjRh9C10YHRgtC+INC/0L7QvNC10ZPRgyDQvdC40LIuIEtOTiDRgNC10LPRgNC10YHQvtGA0L7RgiDQs9C4INC30LXQvNCwINC90LDRmNCx0LvQuNGB0LrQuNGC0LUg0Jog0YHQvtGB0LXQtNC4INC4INCz0L4g0L/RgNC10YHQvNC10YLRg9Cy0LAg0L/RgNC+0YHQtdC60L7RgiDQvdCwINC90LjQstC90LjRgtC1IHkt0LguDQoNCiMg0JfQsNC00LDRh9CwIDMNCg0KIyMjIChhKQ0KDQooaSkgDQoNCtCd0LUg0LzQvtGA0LAg0LTQsCDQt9C90LDRh9C4LiDQn9C+0YDQsNC00Lgg0YLQvtCwINGI0YLQviDQsdC10YLQsCA1INC1IC0xMCwg0YHQu9C10LTQuCDQtNC10LrQsCDQttC10L3QuNGC0LUg0LPRg9Cx0LDRgiAtMTAgKiDQk9Cf0JAsINCwINC00L7QsdC40LLQsNCw0YIgKzM1INC30LAg0YLQvtCwINGI0YLQviDRgdC1INC20LXQvdC4LCDQv9CwINCw0LrQviDRhNC40LrRgdC90LDRgtC+0YLQviDQk9Cf0JAg0LUg0L/QvtCz0L7Qu9C10LzQviDQvtC0IDMuNSwg0L7QstCwINGc0LUg0LHQuNC00LUg0YLQvtGH0L3Qvi4NCg0KKGlpKSANCg0K0J/QvtCy0YLQvtGA0L3Qviwg0L3QtSDQvNC+0YDQsCDQtNCwINC30L3QsNGH0LguINCf0L7RgtGA0LXQsdC90L4g0L3QuCDQtSDQtNCwINC30L3QsNC10LzQtSDQutCw0LrQviDQtSDQtNC40YHRgtGA0LjQsdGD0YbQuNGY0LDRgtCwINC90LAgR1BBINC60LDRmCDQvNCw0LbQuNGC0LUg0Lgg0LbQtdC90LjRgtC1Lg0KDQooaWlpKQ0KDQrQlNCwLCDQsNC60L4g0JPQn9CQINC1INC/0L7Qs9C+0LvQtdC80L4g0L7QtCAzLjUuDQoNCihpdikNCg0K0J3QtS4NCg0KIyMjIChiKQ0KDQpgYGB7cn0NCnByaW50KDUwICsgMjAgKiA0ICsgMC4wNyAqIDExMCArIDM1ICsgMC4wMSAqIDExMCAqIDQgLSAxMCAqIDQpDQpgYGANCg0KIyMjIChjKQ0KDQrQndC1LiDQn9C+0YLRgNC10LHQvdC+INC1INC00LAg0ZjQsCDQstC40LTQuNC80LUg0Lgg0L8g0LLRgNC10LTQvdC+0YHRgtCwINC30LAg0LTQsCDQt9Cw0LrQu9GD0YfQuNC80LUg0L3QtdGI0YLQviDQstCw0LrQstC+Lg0KDQojINCX0LDQtNCw0YfQsCA0DQoNCiMjIyAoYSkNCg0K0KLRgNC10LHQsCDQtNCwINGB0LUg0L/RgNC40LHQu9C40LbQvdC+INC40YHRgtC4INC90LAg0YLRgNC10L3QuNGA0LDRh9C60L7RgtC+INC80L3QvtC20LXRgdGC0LLQvi4g0JrRg9Cx0L3QsNGC0LAg0YDQtdCz0YDQtdGB0LjRmNCwINGc0LUg0YHQtSDQv9GA0LjQu9Cw0LPQvtC00Lgg0Lgg0ZzQtSDQvdCw0ZjQtNC1INC90LDRh9C40L0g0LTQsCDQv9GA0LXQutC70L7Qv9C4INC70LjQvdC10LDRgNC90L4g0LzQvdC+0LbQtdGB0YLQstC+LiDQnNC+0LbQvdC+INC1INC00YPRgNC4INC4INC00LAg0LUg0LLQviDQvdC10LrQvtC4INGB0LvRg9GH0LDQuCDQv9C+0LTQvtCx0YDQsCDQutGD0LHQvdCw0YLQsCDRgNC10LPRgNC10YHQuNGY0LAuDQoNCiMjIyAoYikNCg0K0KDQtdGH0LjRgdC4INC1INGB0LjQs9GD0YDQvdC+INC00LXQutCwINC70LjQvdC10LDRgNC90LDRgtCwINGA0LXQs9GA0LXRgdC40ZjQsCDRnNC1INCx0LjQtNC1INC/0L7QtNC+0LHRgNCwINC90LAg0YLQtdGB0YLQuNGA0LDRh9C60L7RgtC+INC80L3QvtC20LXRgdGC0LLQvi4NCg0KIyMjIChjKQ0KDQrQndC1INC80L7QttC10LzQtSDQtNCwINC30L3QsNC10LzQtS4g0JzQvdC+0LPRgyDQt9Cw0LLQuNGB0Lgg0L7QtCDQs9C+0LvQtdC80LjQvdCw0YLQsCDQvdCwINC/0L7QtNCw0YLQvtGH0L3QvtGC0L4g0LzQvdC+0LbQtdGB0YLQstC+ICjQvNCw0LvQviDQv9C+0LTQsNGC0L7Rh9C90L4g0LzQvdC+0LbQtdGB0YLQstC+INC80L7QttC1INC00LAg0LUg0LzQvdC+0LPRgyDQv9C+0LLQtdGc0LUgb3ZlcmZpdC3QvdCw0YLQviksINC+0LQg0YLQvtCwINC60L7Qu9C60YMg0LUg0L3QtdC70LjQvdC10LDRgNC90LAg0LLRgNGB0LrQsNGC0LAg0Lgg0YHQuy4NCg0KIyMjIChkKQ0KDQrQktC10YDQvtGY0LDRgtC90L4g0LUg0LTQtdC60LAg0L3QsCDRgtGA0LXQvdC40YDQsNGH0LrQvtGC0L4g0LzQvdC+0LbQtdGB0YLQstC+LCDQutGD0LHQvdCw0YLQsCDRgNC10LPRgNC10YHQuNGY0LAg0ZzQtSDQsdC40LTQtSDQtNC10LvRg9C80L3QviDQv9C+0LTQvtCx0YDQsC4g0JzQvtC20LUg0LTQsCDRgdC1INGB0LvRg9GH0Lgg0Lgg0LTQsCDQtSDQvNC90L7Qs9GDINC/0L7QtNC+0LHRgNCwLCDQt9Cw0LLQuNGB0L3QviDQvtC0INGC0L7QsCDQutC+0LvQutGDINC1INCy0LjRgdC+0Log0YHRgtC10L/QtdC90L7RgiDQvdCwINC90LXQu9C40L3QtdCw0YDQvdC+0YHRgtCwLg0KDQojINCX0LDQtNCw0YfQsCA1DQoNCiQkDQpcaGF0e3lfaX09DQp4X2lcaGF0e1xiZXRhfT0NCnhfaVsoXHN1bV97aj0xfV57bn0geF97an15X3tqfSkvKFxzdW1fe2o9MX1ee259IHhfe2p9XjIpXT0NClxzdW1fe2o9MX1ee259IFxmcmFje3hfaXhfan17XHN1bV97az0xfV57bn0geF97a31eMn15X2o9DQpcc3VtX3tqPTF9XntufSBhX2p5X2oNCiQkDQokJA0KYV9qPVxmcmFje3hfaXhfan17XHN1bV97az0xfV57bn0geF97a31eMn0NCiQkDQoNCiMg0JfQsNC00LDRh9CwIDYNCg0KJCQNCmYoXGJhcnt4fSkgPSBcYmV0YV8wK1xiZXRhXzFcYmFye3h9PVxiYXJ7eX0tXGJldGFfMVxiYXJ7eH0rXGJldGFfMVxiYXJ7eH09XGJhcnt5fQ0KJCQNCg0KIyDQl9Cw0LTQsNGH0LAgNw0KDQrQndC1INGB0YPQvCDQvdCw0ZjRgdC40LPRg9GA0LXQvSDQutCw0LrQviDQtNCwINGB0LUg0LjQt9Cz0YPQsdC4INCy0YLQvtGA0LjQvtGCINGH0LvQtdC9INCy0L4g0LHRgNC+0LjRgtC10LvQvtGCLg0KDQokJA0KUl4yPTEtXGZyYWN7UlNTfXtUU1N9PTEtXGZyYWN7XHN1bV97aT0xfV5uKHlfaS1caGF0e3lfaX0pXjJ9e1xzdW1fe2k9MX1ebih5X2ktXGJhcnt5X2l9KV4yfT1cZnJhY3tcc3VtX3tpPTF9Xm4oeV9pLVxiYXJ7eV9pfSleMiArXHN1bV97aT0xfV5uKHlfaS1caGF0e3lfaX0pXjJ9e1xzdW1fe2k9MX1ebih5X2ktXGJhcnt5X2l9KV4yfT1cXA0KXGZyYWN7XHN1bV97aT0xfV5uKHhfaS1cYmFye3hfaX0pXjJcc3VtX3tpPTF9Xm4oeV9pLVxiYXJ7eV9pfSleMiArXHN1bV97aT0xfV5uKHhfaS1cYmFye3hfaX0pXjJcc3VtX3tpPTF9Xm4oeV9pLVxoYXR7eV9pfSleMn17XHN1bV97aT0xfV5uKHhfaS1cYmFye3hfaX0pXjJcc3VtX3tpPTF9Xm4oeV9pLVxiYXJ7eV9pfSleMn0NCiQkDQoNCiMg0JfQsNC00LDRh9CwIDEwDQoNCiMjIyAo0LApDQoNCmBgYHtyfQ0KbG0uZml0ID0gbG0oU2FsZXMgfiBQcmljZSArIFVyYmFuICsgVVMsIGRhdGE9Q2Fyc2VhdHMpDQpzdW1tYXJ5KGxtLmZpdCkNCmBgYA0KIyMjIChiKQ0KDQpQcmljZSDQstC70LjRmNCw0LUg0L7QsdGA0LDRgtC90L4t0L/RgNC+0L/QvtGA0YbQuNC+0L3QsNC70L3QviDQvdCwINC/0YDQvtC00LDQttCx0LjRgtC1LiDQntGH0LXQutGD0LLQsNC90L4g0LUg0LfQsCDRgdC10LrQvtGY0LAg0LXQtNC40L3QuNGG0LAg0L/QvtC60LDRh9GD0LLQsNGa0LUg0L3QsCDRhtC10L3QsNGC0LAsINC/0YDQvtC00LDQttCx0LjRgtC1INC00LAg0L/QsNC00L3QsNGCINC30LAgJDAuMDUkLiDQmNC70LgsINCw0LrQviDRhtC10L3QsNGC0LAg0YHQtSDQutCw0YfQuCDQt9CwIDIwINC10LTQuNC90LjRhtC4LCDRnNC1INGB0LUg0L/RgNC+0LTQsNC00LUg0LXQtNC90L4g0YHQtdC00LjRiNGC0LUg0L/QvtC80LDQu9GG0LUuDQoNCtCa0L7QtdGE0LjRhtC40LXQvdGC0L7RgiDQvdCwIFVyYmFuWWVzINC40LzQsCDQv9GA0LXQs9C+0LvQtdC80LAg0YHRgtCw0L3QtNCw0YDQtNC90LAg0LPRgNC10YjQutCwINC30LAg0LTQsCDRgdC1INGD0YLQstGA0LTQuCDQstC70LjRmNCw0L3QuNC10YLQviDQvdCwIFVyYmFuINGB0L4g0YHQuNCz0YPRgNC90L7RgdGCLiDQlNC+0L/QvtC70L3QuNGC0LXQu9C90L4sINCw0LrQviDRgdC1INC/0L7Qs9C70LXQtNC90LUgcC3QstGA0LXQtNC90L7RgdGC0LAsINGB0YLQsNC90YPQstCwINGY0LDRgdC90L4g0LTQtdC60LAgVXJiYW4g0L3QtSDRgtGA0LXQsdCwINC90Lgg0LTQsCDQsdC40LTQtSDQstC60LvRg9GH0LXQvSDQstC+INC80L7QtNC10LvQvtGCLiDQnNC+0LbQtdC80LUg0Lgg0LTQsCDQs9C+INCy0LjQtNC40LzQtSA5NSUg0LjQvdGC0LXRgNCy0LDQuyDQvdCwINC00L7QstC10YDQsdCwINC90LAg0L7QstC+0Zgg0L/QsNGA0LDQvNC10YLQsNGALCDQutC+0ZggMC3RgtCwINGY0LAg0YHQvtC00YDQttC4INGA0LXRh9C40YHQuCDQstC+INGB0YDQtdC00LjQvdCw0YLQsC4NCg0KYGBge3J9DQpjb25maW50KGxtLmZpdCkNCmBgYA0KDQrQndCw0YHRgtGA0LDQvdCwINCy0LDQttC90L7RgdGC0LAg0L3QsCBVcmJhblllcywg0LTQstC10YLQtSDQutCw0YLQtdCz0L7RgNC40YHQutC4INC/0YDQvtC80LXQvdC70LjQstC4INC80L7QttC10LzQtSDQtNCwINCz0Lgg0LjQvdGC0LXRgNC/0YDQtdGC0LjRgNCw0LzQtSDQvdCwINGB0LvQtdC00L3QuNC+0LIg0L3QsNGH0LjQvTogJDEzLjA0IC0gMC4wNSAqIFByaWNlJCBlINC/0YDQvtGB0LXRh9C90LDRgtCwINC/0YDQvtC00LDQttCx0LAg0L3QsCDRgdC10LTQuNGI0YLQsNGC0LAg0LrQvtC4INGH0LjQvdCw0YIgJFByaWNlJCwg0LrQvtC4INC90LUg0YHQtSDRg9GA0LHQsNC90Lgg0Lgg0L3QtSDRgdC1INC+0LQg0KHQkNCULiDQktC+INC/0YDQvtGB0LXQuiDRgdC1INC/0YDQvtC00LDQsNGCICQwLjAyJCDRgdC10LTQuNGI0YLQsCDQv9C+0LzQsNC70LrRgyDQtNC+0LrQvtC70LrRgyDRgdC1INGD0YDQsdCw0L3QuCwg0LAgJDEuMiQg0YHQtdC00LjRiNGC0LAg0L/QvtCy0LXRnNC1INC00L7QutC+0LvQutGDINGB0LUg0L7QtCDQodCQ0JQuDQoNCtCY0L3RgtC10YDQv9GA0LXRgtCw0YbQuNGY0LDRgtCwINC90LAgSW50ZXJjZXB0LdC+0YIg0LfQstGD0YfQuCDQvNCw0LvQutGDINC/0L7QvdC10LvQvtCz0LjRh9C90L4uINCe0LQg0L3QtdCz0L4g0LzQvtC20LXQvNC1INC00LAg0LfQsNC60LvRg9GH0LjQvNC1INC00LXQutCwINC/0YDQvtGB0LXRh9C90LDRgtCwINC/0YDQvtC00LDQttCx0LAg0L3QsCDQsdC10YHQv9C70LDRgtC90Lgg0YHQtdC00LjRiNGC0LAg0LrQvtC4INC90LUg0YHQtSDRg9GA0LHQsNC90Lgg0Lgg0L3QtSDRgdC1INC+0LQg0KHQkNCUINC40LfQvdC10YHRldCy0LAgJDEzLjA0JC4NCg0KIyMjIChjKQ0KDQokJA0KU2FsZXMgPSANCjEzLjA0IC0gMC4wNSAqIFByaWNlIC0gMC4wMiAqIFVyYmFuWWVzICsgMS4yICogVVNZZXMNCiQkDQokJA0KU2FsZXMgPSANCjEzLjA0IC0gMC4wNSAqIFByaWNlICsgDQpcYmVnaW57Y2FzZXN9IA0KMS4yIC0gMC4wMiAmXG1ib3h70LDQutC+INGB0LXQtNC40YjRgtC10YLQviDQtSDQvtC0INCh0JDQlCDQuCDQtSDRg9GA0LHQsNC90L59XFwgDQoxLjIgJlxtYm94e9Cw0LrQviDRgdC10LTQuNGI0YLQtdGC0L4g0LUg0L7QtCDQodCQ0JQg0Lgg0L3QtSDQtSDRg9GA0LHQsNC90L59XFwgDQotMC4wMiAmXG1ib3h70LDQutC+INGB0LXQtNC40YjRgtC10YLQviDQvdC1INC1INC+0LQg0KHQkNCUINC4INC1INGD0YDQsdCw0L3Qvn1cXCANCjAgJlxtYm94e9Cw0LrQviDRgdC10LTQuNGI0YLQtdGC0L4g0L3QtSDQtSDQvtC0INCh0JDQlCDQuCDQvdC1INC1INGD0YDQsdCw0L3Qvn0NClxlbmR7Y2FzZXN9DQokJA0KDQojIyMgKGQpDQoNClVyYmFuWWVzINC80L7QttC1INC00LAg0YHQtSDQvtGC0YHRgtGA0LDQvdC4Lg0KDQojIyMgKGUpDQoNCmBgYHtyfQ0KbG0uZml0ID0gbG0oU2FsZXMgfiBQcmljZSArIFVTLCBkYXRhPUNhcnNlYXRzKQ0Kc3VtbWFyeShsbS5maXQpDQpgYGANCg0KIyMjIChmKQ0KDQrQodC+INC+0LPQu9C10LQg0L3QsCDRgtC+0LAg0YjRgtC+IFItc3F1YXJlZCDQstGA0LXQtNC90L7RgdGC0LAg0LLQviDQtNCy0LDRgtCwINGB0LvRg9GH0LDQuCDQtSDQvdC40YHQutCwLCDQuNC80LAg0LfQvdCw0YfQuNGC0LXQu9C10L0g0L/RgNC+0YHRgtC+0YAg0LfQsCDQv9C+0LTQvtCx0YDRg9Cy0LDRmtC1Lg0KDQojIyMgKGcpDQoNCmBgYHtyfQ0KY29uZmludChsbS5maXQpDQpgYGANCg0KIyMjIChoKQ0KDQpgYGB7cn0NCnBsb3QocHJlZGljdChsbS5maXQpLCByZXNpZHVhbHMobG0uZml0KSkNCnBsb3QocHJlZGljdChsbS5maXQpLCByc3R1ZGVudChsbS5maXQpKQ0KYGBgDQoNCtCe0LQg0LPRgNCw0YTQuNGG0LjRgtC1INC80L7QtdC20LXQvNC1INC00LAg0LfQtdCx0LXQu9C10LbQuNC80LUg0LTQtdC60LAg0L3QtdC80LAg0L3QtdC60L7QuCDQvtGH0LjQs9C70LXQtNC90Lggb3V0bGllcnMuDQoNCmBgYHtyfQ0KcGxvdChoYXR2YWx1ZXMobG0uZml0KSkNCmBgYA0KDQrQntC0INCz0YDQsNGE0LjQutC+0YIg0LzQvtC20LXQvNC1INC00LAg0LfQsNCx0LXQu9C10LbQuNC80LUg0LTQtdC60LAg0LXQtNC10L0g0L7QtCDQv9GA0LjQvNC10YDQvtGG0LjRgtC1INC40LzQsCDQt9C90LDRh9C40YLQtdC70LXQvSBsZXZlcmFnZS4gDQoNCmBgYHtyfQ0KQ2Fyc2VhdHNbd2hpY2gubWF4KGhhdHZhbHVlcyhsbS5maXQpKSxdDQpgYGANCg0KIyDQl9Cw0LTQsNGH0LAgMTUNCg0KIyMjIChhKQ0KDQpgYGB7cn0NCmNvbHVtbnMgPSBuYW1lcyhCb3N0b24pWzI6bGVuZ3RoKG5hbWVzKEJvc3RvbikpXQ0KcF92YWx1ZXMgPSBjKCkNCnJfc3F1YXJlZCA9IGMoKQ0KdW5pX2NvZWZmaWNpZW50cyA9IGMoKQ0KZm9yIChpIGluIDE6bGVuZ3RoKGNvbHVtbnMpKSB7DQogIGxtLmZpdCA9IGxtKGFzLmZvcm11bGEocGFzdGUoImNyaW0gfiIsIGNvbHVtbnNbaV0pKSwgZGF0YT1Cb3N0b24pDQogIHBfdmFsdWVzW2ldID0gc3VtbWFyeShsbS5maXQpJGNvZWZmaWNpZW50c1sxLCA0XQ0KICByX3NxdWFyZWRbaV0gPSBzdW1tYXJ5KGxtLmZpdCkkci5zcXVhcmVkDQogIHVuaV9jb2VmZmljaWVudHNbaV0gPSBsbS5maXQkY29lZmZpY2llbnRzWzJdDQp9DQpwbG90KHBfdmFsdWVzKQ0KcGxvdChyX3NxdWFyZWQpDQpgYGANCg0K0JDQutC+INGB0LUg0LfQtdC80LDRgiDQv9GA0LXQtNCy0LjQtCDQs9GA0LDRhNC40YbQuNGC0LUsINC/0YDQvtC80LXQvdC70LjQstCw0YLQsCByYWQg0LjQvNCwINC30L3QsNGH0LjRgtC10LvQvdCwINC/0L7QstGA0LfQsNC90L7RgdGCINGB0L4g0YLQsNGA0LPQtdGCINC/0YDQvtC80LXQvdC70LjQstCw0YLQsC4g0KLQvtCwINC80L7QttC1INC00LAg0YHQtSDQt9Cw0LrQu9GD0YfQuCDQvtC0INC90LjRgdC60LDRgtCwIHAt0LLRgNC10LTQvdC+0YHRgiDQuCDQstC40YHQvtC60LjQvtGCIHIyLg0KDQojIyMgKGIpDQoNCmBgYHtyfQ0KbG0uZml0ID0gbG0oY3JpbSB+IC4sIGRhdGE9Qm9zdG9uKQ0Kc3VtbWFyeShsbS5maXQpDQpgYGANCg0K0J3Rg9C70YLQsNGC0LAg0YXQuNC/0L7RgtC10LfQsCDQvNC+0LbQtSDQtNCwINGB0LUg0L7RgtGE0YDQu9C4INC30LAg0L/RgNC10LTQuNGF0YLQvtGA0LjRgtC1IGRpcywgcmFkINC4IG1lZHYsINCwINC80L7QttC10LHQuCDQuCDQt9CwIGJsYWNrLCBpbmR1cyDQuCBjaGFzLg0KDQojIyMgKGMpDQoNCmBgYHtyfQ0KbXVsdGlfY29lZmZpY2llbnRzID0gYygpDQpmb3IgKGkgaW4gIDE6bGVuZ3RoKGNvbHVtbnMpKSB7DQogIG11bHRpX2NvZWZmaWNpZW50c1tpXSA9IGxtLmZpdCRjb2VmZmljaWVudHNbY29sdW1uc1tpXV0NCn0NCnBsb3QodW5pX2NvZWZmaWNpZW50cywgbXVsdGlfY29lZmZpY2llbnRzKQ0KYGBgDQoNCiMjIyAoZCkNCg0KYGBge3J9DQpwb2x5X3Jfc3F1YXJlZCA9IGMoKQ0KZm9yIChpIGluIDE6bGVuZ3RoKGNvbHVtbnMpKSB7DQogIGlmIChjb2x1bW5zW2ldICE9ICJjaGFzIikgew0KICAgIGxtLmZpdCA9IGxtKGFzLmZvcm11bGEocGFzdGUoImNyaW0gfiBwb2x5KCIsIGNvbHVtbnNbaV0sICIsIDMpIiwgc2VwPSIiKSksIGRhdGE9Qm9zdG9uKQ0KICB9IGVsc2Ugew0KICAgIGxtLmZpdCA9IGxtKGFzLmZvcm11bGEocGFzdGUoImNyaW0gfiIsIGNvbHVtbnNbaV0pKSwgZGF0YT1Cb3N0b24pDQogIH0NCiAgcG9seV9yX3NxdWFyZWRbaV0gPSBzdW1tYXJ5KGxtLmZpdCkkci5zcXVhcmVkDQp9DQpzdW1tYXJ5KHJfc3F1YXJlZCkNCnN1bW1hcnkocG9seV9yX3NxdWFyZWQpDQpgYGANCg0K0J7QtCDQtNCy0LXRgtC1IHN1bW1hcmllcyDQvNC+0LbQtdC80LUg0LTQsCDQt9Cw0LHQtdC70LXQttC40LzQtSDQtNC10LrQsCDRgNC10LfRg9C70YLQsNGC0LjRgtC1INGB0LUg0L/QvtC00L7QsdGA0YPQstCw0LDRgiDQutC+0LPQsCDQutC+0YDQuNGB0YLQuNC80LUg0LrRg9Cx0L3QsCDRgNC10LPRgNC10YHQuNGY0LAuINCh0LjRgtC1INC60LLQsNGA0YLQuNC70Lgg0LjQvNCw0LDRgiDQt9Cz0L7Qu9C10LzQtdC90Lgg0YDQtdC30YPQu9GC0LDRgtC4LCDQutCw0LrQviDQuCDQv9GA0L7RgdC10LrQvtGCLg0K