7. Факторный анализ
Глушков Егор Александрович, гр. 20.М04-мм
Вариант 4
- Непараметрические коэффициенты корреляции. Значимость частных коэффициентов регрессии
Данные addicts.xls. Переменные (вариант 4):
- \(X_1\) – sstati – оценка уровня тревожности
- \(X_2\) – asi1_med – индекс зависимости тяжести медицинского статуса
- \(X_3\) – asi2_emp – индекс зависимости тяжести социального статуса (занятость, заработок)
- \(X_4\) – asid3_dyr – длительность героиновой зависимости
- \(Y\) – asi7_psy – индекс зависимости тяжести психиатрического статуса
Построить корреляционную матрицу по метрическим переменным \(X_1, ... , X_4\) и выделить наиболее значимую корреляцию. Для этого случая построить двумерную диаграмму.
Применить модель множественной регресссии для зависимой переменной \(Y\) и для независимых переменных \(X_1, ... , X_4\). Определить значимость прогноза и указать наиболее значимые переменные.
Вычислить частный коэффициент корреляции \(\rho_{YX_1 \cdot X_2 X_3 X_4}\).
Корреляционная матрица, значимые корреляции
library(readxl)
addicts <- read_excel("addicts.xlsx")
# View(addicts)
Исследуем переменные на наличие пропусков. Выделим нужные переменные
data <- na.omit(addicts[ , c("sstati", "asi1_med", "asi2_emp", "asid3_dyr", "asi7_psy")])
summary(data)
sstati asi1_med asi2_emp asid3_dyr asi7_psy
Min. :23.00 Min. :0.0000 Min. :0.0000 Min. : 0.500 Min. :0.00
1st Qu.:43.00 1st Qu.:0.0000 1st Qu.:0.6900 1st Qu.: 2.000 1st Qu.:0.12
Median :48.00 Median :0.1900 Median :0.9100 Median : 3.000 Median :0.24
Mean :48.52 Mean :0.2447 Mean :0.7834 Mean : 3.605 Mean :0.26
3rd Qu.:54.00 3rd Qu.:0.4200 3rd Qu.:1.0000 3rd Qu.: 4.000 3rd Qu.:0.36
Max. :72.00 Max. :1.0000 Max. :1.0000 Max. :24.000 Max. :0.87
Проверяем данные на нормальность
lshap <- lapply(data, shapiro.test)
lres <- sapply(lshap, `[`, c("statistic","p.value")); lres
sstati asi1_med asi2_emp asid3_dyr asi7_psy
statistic 0.9929767 0.8394149 0.7918929 0.7567038 0.9517803
p.value 0.2184984 2.858381e-16 1.639616e-18 6.13559e-20 6.385948e-08
Лишь p.value, соответствующий переменной sstati, больше уровня значимости 0.05, что говорит о том, что распределение этих данных незначимо отличается от нормального. Другими словами, можно предположить их нормальность. Для других переменных гипотеза о нормальности отвергается, вследствие чего следует предпочесть непараметрические коэффициенты корреляции (Спирмена, Кендалла), чем более привычный коэффициент корреляции Пирсона.
cor(data, method="pearson")
sstati asi1_med asi2_emp asid3_dyr asi7_psy
sstati 1.000000000 0.21570052 0.004541223 0.12211473 0.1947717
asi1_med 0.215700516 1.00000000 -0.031071218 0.09333766 0.1346685
asi2_emp 0.004541223 -0.03107122 1.000000000 0.11027514 0.1899920
asid3_dyr 0.122114730 0.09333766 0.110275143 1.00000000 0.1402910
asi7_psy 0.194771680 0.13466846 0.189992031 0.14029098 1.0000000
ms <- cor(data, method="spearman"); ms
sstati asi1_med asi2_emp asid3_dyr asi7_psy
sstati 1.000000000 0.160604387 0.009650113 0.09534054 0.21629588
asi1_med 0.160604387 1.000000000 -0.009739093 0.05920707 0.06179187
asi2_emp 0.009650113 -0.009739093 1.000000000 0.09440814 0.17970881
asid3_dyr 0.095340538 0.059207069 0.094408140 1.00000000 0.12806424
asi7_psy 0.216295882 0.061791868 0.179708808 0.12806424 1.00000000
cor(data, method="kendall")
sstati asi1_med asi2_emp asid3_dyr asi7_psy
sstati 1.000000000 0.116505322 0.006477093 0.06777330 0.15059703
asi1_med 0.116505322 1.000000000 -0.005463709 0.04544845 0.04726184
asi2_emp 0.006477093 -0.005463709 1.000000000 0.07372656 0.13120600
asid3_dyr 0.067773302 0.045448452 0.073726560 1.00000000 0.09631333
asi7_psy 0.150597034 0.047261842 0.131206003 0.09631333 1.00000000
show_cor_test <- function(x1, x2) {
sp <- cor.test(x1, x2, method="spearman", exact=FALSE)
k <- cor.test(x1, x2, method="kendall", exact=FALSE)
df <- data.frame(cbind(c(sp$estimate, sp$p.value), c(k$estimate, k$p.value)),
row.names=c("corr coeff (rho | tau resp)", "p.value"))
colnames(df)<-c('spearman', 'kendall')
df
}
Выделим наиболее значимые корреляции: уровень тревожности и психиатрический статус
show_cor_test(data$sstati, data$asi7_psy)
Как видно, \(\rho\) и \(\tau\) не так высоки (0.216 и 0.15), однако с учетом соответствующих p.value можно принять гипотезы о том, что данные коэффициенты корреляции Спирмена и Кендалла ненулевые.
Аналогично с уровнем тревожности и медицинским статусом
show_cor_test(data$sstati, data$asi1_med)
Коэффициенты корреляции не высоки, однако p.value говорят о том, что коэффициенты не равны нулю
Такая же ситуация с психиатрическим и социальным статусами
show_cor_test(data$asi7_psy, data$asi2_emp)
Построим heatmap с соответствующими коэффициентами корреляции Спирмена:
library(GGally)
ggcorr(data, method=c("pairwise", "spearman"), label=TRUE)

Двумерная диаграмма для уровня тревожности и психиатрического статуса:
str <- paste("r", round(cor(data$sstati, data$asi7_psy, method='spearman'), 3), sep="=")
qplot(sstati, asi7_psy, data = data, geom = c("point", "smooth"), method = "lm") + labs(title=str) + theme(plot.title = element_text(hjust = 0.5))

Двумерная диаграмма для уровня тревожности и медицинского статуса:
str <- paste("r", round(cor(data$sstati, data$asi1_med, method='spearman'), 3), sep="=")
qplot(sstati, asi1_med, data = data, geom = c("point", "smooth"), method = "lm") + labs(title=str) + theme(plot.title = element_text(hjust = 0.5))

Двумерная диаграмма для социального и психиатрического статусов:
str <- paste("r", round(cor(data$asi2_emp, data$asi7_psy, method='spearman'), 3), sep="=")
qplot(asi2_emp, asi7_psy, data = data, geom = c("point", "smooth"), method = "lm") + labs(title=str) + theme(plot.title = element_text(hjust = 0.5))

Можно заметить, что имеющаяся линейная связь между этими парами переменных весьма слабая (тем не менее, значима)
Модель множественной регресссии
Применим модель множественной регрессии с asi7_psy как зависимой переменной
mreg <- lm(asi7_psy ~ sstati + asi1_med + asi2_emp + asid3_dyr, data=data)
summary(mreg)
Call:
lm(formula = asi7_psy ~ sstati + asi1_med + asi2_emp + asid3_dyr,
data = data)
Residuals:
Min 1Q Median 3Q Max
-0.36262 -0.13077 -0.02225 0.10122 0.62899
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.043488 0.067113 -0.648 0.51754
sstati 0.003371 0.001239 2.721 0.00693 **
asi1_med 0.066214 0.040571 1.632 0.10383
asi2_emp 0.124408 0.039730 3.131 0.00193 **
asid3_dyr 0.007287 0.004683 1.556 0.12085
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.1764 on 272 degrees of freedom
Multiple R-squared: 0.09201, Adjusted R-squared: 0.07866
F-statistic: 6.891 on 4 and 272 DF, p-value: 2.689e-05
Согласно \(p.value < 0.05\) (а именно согласно значимости прогноза 2.689e-05 < 0.05) отвергается гипотеза о том, что данная модель не зависит от предикторов. Значимыми (ненулевыми) коэффициентами с уровнем 0.05 являются значения при переменных sstati и asi2_emp, чего и следовало ожидать из проведенного выше корреляционного анализа (именно коэффициенты корреляции этих пар переменных были наибольними).
Проверим некоррелированность остатков [практически равны 0]
c(cor(mreg$residuals, data$sstati), cor(mreg$residuals, data$asi1_med ), cor(mreg$residuals, data$asi2_emp ), cor(mreg$residuals, data$asid3_dyr))
[1] -1.888976e-16 9.887577e-20 -1.548208e-16 2.494561e-17
Частный коэффициент корреляции \(\rho_{YX_1 \cdot X_2 X_3 X_4}\)
library(matlib)
ms
sstati asi1_med asi2_emp asid3_dyr asi7_psy
sstati 1.000000000 0.160604387 0.009650113 0.09534054 0.21629588
asi1_med 0.160604387 1.000000000 -0.009739093 0.05920707 0.06179187
asi2_emp 0.009650113 -0.009739093 1.000000000 0.09440814 0.17970881
asid3_dyr 0.095340538 0.059207069 0.094408140 1.00000000 0.12806424
asi7_psy 0.216295882 0.061791868 0.179708808 0.12806424 1.00000000
\[ \rho_{YX_1 \cdot X_2 X_3 X_4} = - \frac{\Lambda_{Y X_1}}{\sqrt{\Lambda_{Y Y} \Lambda_{1 1}}}\] где \(\Lambda_{ij}\) – алгебраическое дополнение элемента \(\lambda_{ij}\) корреляционной матрицы \(\Lambda\)
rho <- - cofactor(ms, 5, 1) / sqrt(cofactor(ms, 5, 5) * cofactor(ms, 1, 1))
c(r.yx1=ms[1, 5], rho=rho)
r.yx1 rho
0.2162959 0.2034030
\(r_{Y X_1} > \rho_{YX_1 \cdot X_2 X_3 X_4}\), то факторы \(X_2, X_3, X4\) [немного] искажают взаимосвязь между \(Y\) и \(X_1\) в сторону её увеличения
- Факторный анализ
Задание.
Построить матрицу факторных нагрузок. Проинтерпретировать главные компоненты, определить вклад первых двух в общую дисперсию и построить двумерную диаграмму первых двух факторов.
Вклад главных компонент в общую дисперсию
pc <- princomp(scale(data))
summary(pc)
Importance of components:
Comp.1 Comp.2 Comp.3 Comp.4 Comp.5
Standard deviation 1.2207259 1.0501082 0.9385849 0.8843622 0.8520637
Proportion of Variance 0.2991142 0.2213445 0.1768267 0.1569860 0.1457286
Cumulative Proportion 0.2991142 0.5204587 0.6972854 0.8542714 1.0000000
Первые две компоненты дают 52.04587%
Факторные нагрузки
pc$loadings[, seq(5)]
Comp.1 Comp.2 Comp.3 Comp.4 Comp.5
sstati 0.5088674 0.3666091 0.13377642 0.58353704 0.49823700
asi1_med 0.4316568 0.5052637 0.07655432 -0.74242863 0.03633432
asi2_emp 0.2806453 -0.7246625 0.22612083 -0.28145720 0.51551306
asid3_dyr 0.4233503 -0.1845726 -0.88210384 0.02520452 -0.08924714
asi7_psy 0.5447377 -0.2260610 0.38341295 0.16861444 -0.69044981
Первая компонента отвечает за “медицинские” факторы: тревожность, медицинский и психиатрический статус, длительность героиновой зависимости, притом везде связь прямо пропорциональна.
Вторая компонента связана с понижением социального статуса и повышением медицинского статуса.
Третья – с понижением длительности героиновой зависимости.
Четвертая – с понижением медицинского статуса и повышением уровня тревожности.
Пятая компонента говорит о повышении уровня тревожности и социального статуса вместе с понижением психиатрического статуса.
Проверка [совпадают с точностью до перестановки знаков для, например, первого фактора]:
ei <- eigen(cor(data))
A <- ei$vectors
Y <- as.matrix(scale(data)) %*% A
cbind(Y[seq(10), seq(3)], pc$scores[seq(10),seq(3)])
Comp.1 Comp.2 Comp.3
[1,] -0.1983072 0.72089292 0.19465100 0.1983072 0.72089292 0.19465100
[2,] 1.4273690 2.44695870 0.06755617 -1.4273690 2.44695870 0.06755617
[3,] -1.0878609 0.12771542 -0.30632264 1.0878609 0.12771542 -0.30632264
[4,] 0.2421745 0.06698835 0.61873096 -0.2421745 0.06698835 0.61873096
[5,] -1.2291057 -0.43829516 0.62489850 1.2291057 -0.43829516 0.62489850
[6,] -1.8404684 1.85516675 0.84688457 1.8404684 1.85516675 0.84688457
[7,] -0.5164741 -0.90396856 0.22615760 0.5164741 -0.90396856 0.22615760
[8,] 0.6092661 1.22103938 0.14656096 -0.6092661 1.22103938 0.14656096
[9,] 0.5496977 -0.84859723 0.39636680 -0.5496977 -0.84859723 0.39636680
[10,] -1.4000370 -0.80176615 0.17534824 1.4000370 -0.80176615 0.17534824
plot(pc$scores, type="n")
text(pc$scores, row.names(data), cex=0.6)

Заметим выброс в виде пациента №166: для него характерно большое значение Comp.1 – повышенные “медицинские” факторы – при достаточно низком Comp.2
LS0tDQp0aXRsZTogIiINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMjIyMg0J/RgNCw0LrRgtC40YfQtdGB0LrQsNGPINGA0LDQsdC+0YLQsCDihJY1DQojIyMgNi4g0J3QtdC/0LDRgNCw0LzQtdGC0YDQuNGH0LXRgdC60LjQtSDQutC+0Y3RhNGE0LjRhtC40LXQvdGC0Ysg0LrQvtGA0YDQtdC70Y/RhtC40LguINCX0L3QsNGH0LjQvNC+0YHRgtGMINGH0LDRgdGC0L3Ri9GFINC60L7RjdGE0YTQuNGG0LjQtdC90YLQvtCyINGA0LXQs9GA0LXRgdGB0LjQuA0KIyMjIDcuINCk0LDQutGC0L7RgNC90YvQuSDQsNC90LDQu9C40LcNCg0KPiDQk9C70YPRiNC60L7QsiDQldCz0L7RgCDQkNC70LXQutGB0LDQvdC00YDQvtCy0LjRhywg0LPRgC4gMjAu0JwwNC3QvNC8ICANCj4g0JLQsNGA0LjQsNC90YIgNA0KDQotLS0NCg0KPiA2LiDQndC10L/QsNGA0LDQvNC10YLRgNC40YfQtdGB0LrQuNC1INC60L7RjdGE0YTQuNGG0LjQtdC90YLRiyDQutC+0YDRgNC10LvRj9GG0LjQuC4g0JfQvdCw0YfQuNC80L7RgdGC0Ywg0YfQsNGB0YLQvdGL0YUg0LrQvtGN0YTRhNC40YbQuNC10L3RgtC+0LIg0YDQtdCz0YDQtdGB0YHQuNC4DQoNCtCU0LDQvdC90YvQtSBhZGRpY3RzLnhscy4g0J/QtdGA0LXQvNC10L3QvdGL0LUgKNCy0LDRgNC40LDQvdGCIDQpOg0KDQorICRYXzEkICAtLSAqc3N0YXRpKiAtLSDQvtGG0LXQvdC60LAg0YPRgNC+0LLQvdGPINGC0YDQtdCy0L7QttC90L7RgdGC0LgNCisgJFhfMiQgLS0gKmFzaTFfbWVkKiAtLSDQuNC90LTQtdC60YEg0LfQsNCy0LjRgdC40LzQvtGB0YLQuCDRgtGP0LbQtdGB0YLQuCDQvNC10LTQuNGG0LjQvdGB0LrQvtCz0L4g0YHRgtCw0YLRg9GB0LANCisgJFhfMyQgLS0gKmFzaTJfZW1wKiAtLSDQuNC90LTQtdC60YEg0LfQsNCy0LjRgdC40LzQvtGB0YLQuCDRgtGP0LbQtdGB0YLQuCDRgdC+0YbQuNCw0LvRjNC90L7Qs9C+INGB0YLQsNGC0YPRgdCwICjQt9Cw0L3Rj9GC0L7RgdGC0YwsINC30LDRgNCw0LHQvtGC0L7QuikNCisgJFhfNCQgLS0gKmFzaWQzX2R5ciogLS0g0LTQu9C40YLQtdC70YzQvdC+0YHRgtGMINCz0LXRgNC+0LjQvdC+0LLQvtC5INC30LDQstC40YHQuNC80L7RgdGC0LggIA0KKyAkWSQgLS0gKmFzaTdfcHN5KiAtLSDQuNC90LTQtdC60YEg0LfQsNCy0LjRgdC40LzQvtGB0YLQuCDRgtGP0LbQtdGB0YLQuCDQv9GB0LjRhdC40LDRgtGA0LjRh9C10YHQutC+0LPQviDRgdGC0LDRgtGD0YHQsCAgDQoNCg0KMS4g0J/QvtGB0YLRgNC+0LjRgtGMINC60L7RgNGA0LXQu9GP0YbQuNC+0L3QvdGD0Y4g0LzQsNGC0YDQuNGG0YMg0L/QviDQvNC10YLRgNC40YfQtdGB0LrQuNC8INC/0LXRgNC10LzQtdC90L3Ri9C8ICRYXzEsIC4uLiAsIFhfNCQg0Lgg0LLRi9C00LXQu9C40YLRjCDQvdCw0LjQsdC+0LvQtdC1INC30L3QsNGH0LjQvNGD0Y4g0LrQvtGA0YDQtdC70Y/RhtC40Y4uINCU0LvRjyDRjdGC0L7Qs9C+INGB0LvRg9GH0LDRjyDQv9C+0YHRgtGA0L7QuNGC0Ywg0LTQstGD0LzQtdGA0L3Rg9GOINC00LjQsNCz0YDQsNC80LzRgy4NCg0KMi4g0J/RgNC40LzQtdC90LjRgtGMINC80L7QtNC10LvRjCDQvNC90L7QttC10YHRgtCy0LXQvdC90L7QuSDRgNC10LPRgNC10YHRgdGB0LjQuCDQtNC70Y8g0LfQsNCy0LjRgdC40LzQvtC5INC/0LXRgNC10LzQtdC90L3QvtC5ICRZJCDQuCDQtNC70Y8g0L3QtdC30LDQstC40YHQuNC80YvRhSDQv9C10YDQtdC80LXQvdC90YvRhSAkWF8xLCAuLi4gLCBYXzQkLiDQntC/0YDQtdC00LXQu9C40YLRjCDQt9C90LDRh9C40LzQvtGB0YLRjCDQv9GA0L7Qs9C90L7Qt9CwINC4INGD0LrQsNC30LDRgtGMINC90LDQuNCx0L7Qu9C10LUg0LfQvdCw0YfQuNC80YvQtSDQv9C10YDQtdC80LXQvdC90YvQtS4NCg0KMy4g0JLRi9GH0LjRgdC70LjRgtGMINGH0LDRgdGC0L3Ri9C5INC60L7RjdGE0YTQuNGG0LjQtdC90YIg0LrQvtGA0YDQtdC70Y/RhtC40LggJFxyaG9fe1lYXzEgXGNkb3QgWF8yIFhfMyBYXzR9JC4NCg0KLS0tDQoNCj4g0JrQvtGA0YDQtdC70Y/RhtC40L7QvdC90LDRjyDQvNCw0YLRgNC40YbQsCwg0LfQvdCw0YfQuNC80YvQtSDQutC+0YDRgNC10LvRj9GG0LjQuA0KDQpgYGB7cn0NCmxpYnJhcnkocmVhZHhsKQ0KYWRkaWN0cyA8LSByZWFkX2V4Y2VsKCJhZGRpY3RzLnhsc3giKQ0KIyBWaWV3KGFkZGljdHMpDQpgYGANCg0K0JjRgdGB0LvQtdC00YPQtdC8INC/0LXRgNC10LzQtdC90L3Ri9C1INC90LAg0L3QsNC70LjRh9C40LUg0L/RgNC+0L/Rg9GB0LrQvtCyLiDQktGL0LTQtdC70LjQvCDQvdGD0LbQvdGL0LUg0L/QtdGA0LXQvNC10L3QvdGL0LUgDQpgYGB7cn0NCmRhdGEgPC0gbmEub21pdChhZGRpY3RzWyAsIGMoInNzdGF0aSIsICJhc2kxX21lZCIsICJhc2kyX2VtcCIsICJhc2lkM19keXIiLCAiYXNpN19wc3kiKV0pDQpzdW1tYXJ5KGRhdGEpDQpgYGANCtCf0YDQvtCy0LXRgNGP0LXQvCDQtNCw0L3QvdGL0LUg0L3QsCDQvdC+0YDQvNCw0LvRjNC90L7RgdGC0YwNCmBgYHtyfQ0KbHNoYXAgPC0gbGFwcGx5KGRhdGEsIHNoYXBpcm8udGVzdCkNCmxyZXMgPC0gc2FwcGx5KGxzaGFwLCBgW2AsIGMoInN0YXRpc3RpYyIsInAudmFsdWUiKSk7IGxyZXMNCmBgYA0K0JvQuNGI0YwgcC52YWx1ZSwg0YHQvtC+0YLQstC10YLRgdGC0LLRg9GO0YnQuNC5INC/0LXRgNC10LzQtdC90L3QvtC5ICpzc3RhdGkqLCDQsdC+0LvRjNGI0LUg0YPRgNC+0LLQvdGPINC30L3QsNGH0LjQvNC+0YHRgtC4IDAuMDUsINGH0YLQviDQs9C+0LLQvtGA0LjRgiDQviDRgtC+0LwsINGH0YLQviDRgNCw0YHQv9GA0LXQtNC10LvQtdC90LjQtSDRjdGC0LjRhSDQtNCw0L3QvdGL0YUg0L3QtdC30L3QsNGH0LjQvNC+INC+0YLQu9C40YfQsNC10YLRgdGPINC+0YIg0L3QvtGA0LzQsNC70YzQvdC+0LPQvi4g0JTRgNGD0LPQuNC80Lgg0YHQu9C+0LLQsNC80LgsINC80L7QttC90L4g0L/RgNC10LTQv9C+0LvQvtC20LjRgtGMINC40YUg0L3QvtGA0LzQsNC70YzQvdC+0YHRgtGMLiDQlNC70Y8g0LTRgNGD0LPQuNGFINC/0LXRgNC10LzQtdC90L3Ri9GFINCz0LjQv9C+0YLQtdC30LAg0L4g0L3QvtGA0LzQsNC70YzQvdC+0YHRgtC4INC+0YLQstC10YDQs9Cw0LXRgtGB0Y8sINCy0YHQu9C10LTRgdGC0LLQuNC1INGH0LXQs9C+INGB0LvQtdC00YPQtdGCINC/0YDQtdC00L/QvtGH0LXRgdGC0Ywg0L3QtdC/0LDRgNCw0LzQtdGC0YDQuNGH0LXRgdC60LjQtSDQutC+0Y3RhNGE0LjRhtC40LXQvdGC0Ysg0LrQvtGA0YDQtdC70Y/RhtC40LggKNCh0L/QuNGA0LzQtdC90LAsINCa0LXQvdC00LDQu9C70LApLCDRh9C10Lwg0LHQvtC70LXQtSDQv9GA0LjQstGL0YfQvdGL0Lkg0LrQvtGN0YTRhNC40YbQuNC10L3RgiDQutC+0YDRgNC10LvRj9GG0LjQuCDQn9C40YDRgdC+0L3QsC4NCg0KYGBge3J9DQpjb3IoZGF0YSwgbWV0aG9kPSJwZWFyc29uIikNCm1zIDwtIGNvcihkYXRhLCBtZXRob2Q9InNwZWFybWFuIik7IG1zDQpjb3IoZGF0YSwgbWV0aG9kPSJrZW5kYWxsIikNCmBgYA0KDQoNCmBgYHtyfQ0Kc2hvd19jb3JfdGVzdCA8LSBmdW5jdGlvbih4MSwgeDIpIHsNCiAgc3AgPC0gY29yLnRlc3QoeDEsIHgyLCBtZXRob2Q9InNwZWFybWFuIiwgZXhhY3Q9RkFMU0UpDQogIGsgPC0gY29yLnRlc3QoeDEsIHgyLCBtZXRob2Q9ImtlbmRhbGwiLCBleGFjdD1GQUxTRSkNCiAgZGYgPC0gZGF0YS5mcmFtZShjYmluZChjKHNwJGVzdGltYXRlLCBzcCRwLnZhbHVlKSwgYyhrJGVzdGltYXRlLCBrJHAudmFsdWUpKSwgDQogICAgICAgICAgICAgICAgICAgcm93Lm5hbWVzPWMoImNvcnIgY29lZmYgKHJobyB8IHRhdSByZXNwKSIsICJwLnZhbHVlIikpDQogIGNvbG5hbWVzKGRmKTwtYygnc3BlYXJtYW4nLCAna2VuZGFsbCcpDQogIGRmDQp9DQpgYGANCg0KDQrQktGL0LTQtdC70LjQvCDQvdCw0LjQsdC+0LvQtdC1INC30L3QsNGH0LjQvNGL0LUg0LrQvtGA0YDQtdC70Y/RhtC40Lg6INGD0YDQvtCy0LXQvdGMINGC0YDQtdCy0L7QttC90L7RgdGC0Lgg0Lgg0L/RgdC40YXQuNCw0YLRgNC40YfQtdGB0LrQuNC5INGB0YLQsNGC0YPRgQ0KYGBge3J9DQpzaG93X2Nvcl90ZXN0KGRhdGEkc3N0YXRpLCBkYXRhJGFzaTdfcHN5KQ0KYGBgDQrQmtCw0Log0LLQuNC00L3QviwgJFxyaG8kINC4ICRcdGF1JCDQvdC1INGC0LDQuiDQstGL0YHQvtC60LggKDAuMjE2INC4IDAuMTUpLCDQvtC00L3QsNC60L4g0YEg0YPRh9C10YLQvtC8INGB0L7QvtGC0LLQtdGC0YHRgtCy0YPRjtGJ0LjRhSAqcC52YWx1ZSog0LzQvtC20L3QviDQv9GA0LjQvdGP0YLRjCDQs9C40L/QvtGC0LXQt9GLINC+INGC0L7QvCwg0YfRgtC+INC00LDQvdC90YvQtSDQutC+0Y3RhNGE0LjRhtC40LXQvdGC0Ysg0LrQvtGA0YDQtdC70Y/RhtC40Lgg0KHQv9C40YDQvNC10L3QsCDQuCDQmtC10L3QtNCw0LvQu9CwINC90LXQvdGD0LvQtdCy0YvQtS4gIA0KICANCtCQ0L3QsNC70L7Qs9C40YfQvdC+INGBINGD0YDQvtCy0L3QtdC8INGC0YDQtdCy0L7QttC90L7RgdGC0Lgg0Lgg0LzQtdC00LjRhtC40L3RgdC60LjQvCDRgdGC0LDRgtGD0YHQvtC8DQpgYGB7cn0NCnNob3dfY29yX3Rlc3QoZGF0YSRzc3RhdGksIGRhdGEkYXNpMV9tZWQpDQpgYGANCtCa0L7RjdGE0YTQuNGG0LjQtdC90YLRiyDQutC+0YDRgNC10LvRj9GG0LjQuCDQvdC1INCy0YvRgdC+0LrQuCwg0L7QtNC90LDQutC+IHAudmFsdWUg0LPQvtCy0L7RgNGP0YIg0L4g0YLQvtC8LCDRh9GC0L4g0LrQvtGN0YTRhNC40YbQuNC10L3RgtGLINC90LUg0YDQsNCy0L3RiyDQvdGD0LvRjg0KDQrQotCw0LrQsNGPINC20LUg0YHQuNGC0YPQsNGG0LjRjyDRgSDQv9GB0LjRhdC40LDRgtGA0LjRh9C10YHQutC40Lwg0Lgg0YHQvtGG0LjQsNC70YzQvdGL0Lwg0YHRgtCw0YLRg9GB0LDQvNC4IA0KYGBge3J9DQpzaG93X2Nvcl90ZXN0KGRhdGEkYXNpN19wc3ksIGRhdGEkYXNpMl9lbXApDQpgYGANCg0K0J/QvtGB0YLRgNC+0LjQvCBoZWF0bWFwINGBINGB0L7QvtGC0LLQtdGC0YHRgtCy0YPRjtGJ0LjQvNC4INC60L7RjdGE0YTQuNGG0LjQtdC90YLQsNC80Lgg0LrQvtGA0YDQtdC70Y/RhtC40Lgg0KHQv9C40YDQvNC10L3QsDoNCmBgYHtyfQ0KbGlicmFyeShHR2FsbHkpDQpnZ2NvcnIoZGF0YSwgbWV0aG9kPWMoInBhaXJ3aXNlIiwgInNwZWFybWFuIiksIGxhYmVsPVRSVUUpDQpgYGANCg0K0JTQstGD0LzQtdGA0L3QsNGPINC00LjQsNCz0YDQsNC80LzQsCDQtNC70Y8g0YPRgNC+0LLQvdGPINGC0YDQtdCy0L7QttC90L7RgdGC0Lgg0Lgg0L/RgdC40YXQuNCw0YLRgNC40YfQtdGB0LrQvtCz0L4g0YHRgtCw0YLRg9GB0LA6DQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0Kc3RyIDwtIHBhc3RlKCJyIiwgcm91bmQoY29yKGRhdGEkc3N0YXRpLCBkYXRhJGFzaTdfcHN5LCBtZXRob2Q9J3NwZWFybWFuJyksIDMpLCBzZXA9Ij0iKQ0KcXBsb3Qoc3N0YXRpLCBhc2k3X3BzeSwgZGF0YSA9IGRhdGEsIGdlb20gPSBjKCJwb2ludCIsICJzbW9vdGgiKSwgbWV0aG9kID0gImxtIikgKyBsYWJzKHRpdGxlPXN0cikgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCmBgYA0KDQrQlNCy0YPQvNC10YDQvdCw0Y8g0LTQuNCw0LPRgNCw0LzQvNCwINC00LvRjyDRg9GA0L7QstC90Y8g0YLRgNC10LLQvtC20L3QvtGB0YLQuCDQuCDQvNC10LTQuNGG0LjQvdGB0LrQvtCz0L4g0YHRgtCw0YLRg9GB0LA6DQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0Kc3RyIDwtIHBhc3RlKCJyIiwgcm91bmQoY29yKGRhdGEkc3N0YXRpLCBkYXRhJGFzaTFfbWVkLCBtZXRob2Q9J3NwZWFybWFuJyksIDMpLCBzZXA9Ij0iKQ0KcXBsb3Qoc3N0YXRpLCBhc2kxX21lZCwgZGF0YSA9IGRhdGEsIGdlb20gPSBjKCJwb2ludCIsICJzbW9vdGgiKSwgbWV0aG9kID0gImxtIikgKyBsYWJzKHRpdGxlPXN0cikgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCmBgYA0KDQrQlNCy0YPQvNC10YDQvdCw0Y8g0LTQuNCw0LPRgNCw0LzQvNCwINC00LvRjyDRgdC+0YbQuNCw0LvRjNC90L7Qs9C+INC4INC/0YHQuNGF0LjQsNGC0YDQuNGH0LXRgdC60L7Qs9C+INGB0YLQsNGC0YPRgdC+0LI6DQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0Kc3RyIDwtIHBhc3RlKCJyIiwgcm91bmQoY29yKGRhdGEkYXNpMl9lbXAsIGRhdGEkYXNpN19wc3ksIG1ldGhvZD0nc3BlYXJtYW4nKSwgMyksIHNlcD0iPSIpDQpxcGxvdChhc2kyX2VtcCwgYXNpN19wc3ksIGRhdGEgPSBkYXRhLCBnZW9tID0gYygicG9pbnQiLCAic21vb3RoIiksIG1ldGhvZCA9ICJsbSIpICsgbGFicyh0aXRsZT1zdHIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpgYGANCtCc0L7QttC90L4g0LfQsNC80LXRgtC40YLRjCwg0YfRgtC+INC40LzQtdGO0YnQsNGP0YHRjyDQu9C40L3QtdC50L3QsNGPINGB0LLRj9C30Ywg0LzQtdC20LTRgyDRjdGC0LjQvNC4INC/0LDRgNCw0LzQuCDQv9C10YDQtdC80LXQvdC90YvRhSDQstC10YHRjNC80LAg0YHQu9Cw0LHQsNGPICjRgtC10Lwg0L3QtSDQvNC10L3QtdC1LCDQt9C90LDRh9C40LzQsCkNCg0KPiDQnNC+0LTQtdC70Ywg0LzQvdC+0LbQtdGB0YLQstC10L3QvdC+0Lkg0YDQtdCz0YDQtdGB0YHRgdC40LgNCg0K0J/RgNC40LzQtdC90LjQvCDQvNC+0LTQtdC70Ywg0LzQvdC+0LbQtdGB0YLQstC10L3QvdC+0Lkg0YDQtdCz0YDQtdGB0YHQuNC4INGBIGFzaTdfcHN5INC60LDQuiDQt9Cw0LLQuNGB0LjQvNC+0Lkg0L/QtdGA0LXQvNC10L3QvdC+0LkNCmBgYHtyfQ0KbXJlZyA8LSBsbShhc2k3X3BzeSB+IHNzdGF0aSArIGFzaTFfbWVkICsgYXNpMl9lbXAgKyBhc2lkM19keXIsIGRhdGE9ZGF0YSkNCnN1bW1hcnkobXJlZykNCmBgYA0K0KHQvtCz0LvQsNGB0L3QviAkcC52YWx1ZSA8IDAuMDUkICjQsCDQuNC80LXQvdC90L4g0YHQvtCz0LvQsNGB0L3QviDQt9C90LDRh9C40LzQvtGB0YLQuCDQv9GA0L7Qs9C90L7Qt9CwICoyLjY4OWUtMDUgPCAwLjA1Kikg0L7RgtCy0LXRgNCz0LDQtdGC0YHRjyDQs9C40L/QvtGC0LXQt9CwINC+INGC0L7QvCwg0YfRgtC+INC00LDQvdC90LDRjyDQvNC+0LTQtdC70Ywg0L3QtSDQt9Cw0LLQuNGB0LjRgiDQvtGCINC/0YDQtdC00LjQutGC0L7RgNC+0LIuINCX0L3QsNGH0LjQvNGL0LzQuCAo0L3QtdC90YPQu9C10LLRi9C80LgpINC60L7RjdGE0YTQuNGG0LjQtdC90YLQsNC80Lgg0YEg0YPRgNC+0LLQvdC10LwgMC4wNSDRj9Cy0LvRj9GO0YLRgdGPINC30L3QsNGH0LXQvdC40Y8g0L/RgNC4INC/0LXRgNC10LzQtdC90L3Ri9GFICpzc3RhdGkqINC4ICphc2kyX2VtcCosINGH0LXQs9C+INC4INGB0LvQtdC00L7QstCw0LvQviDQvtC20LjQtNCw0YLRjCDQuNC3INC/0YDQvtCy0LXQtNC10L3QvdC+0LPQviDQstGL0YjQtSDQutC+0YDRgNC10LvRj9GG0LjQvtC90L3QvtCz0L4g0LDQvdCw0LvQuNC30LAgKNC40LzQtdC90L3QviDQutC+0Y3RhNGE0LjRhtC40LXQvdGC0Ysg0LrQvtGA0YDQtdC70Y/RhtC40Lgg0Y3RgtC40YUg0L/QsNGAINC/0LXRgNC10LzQtdC90L3Ri9GFINCx0YvQu9C4INC90LDQuNCx0L7Qu9GM0L3QuNC80LgpLg0KDQoNCtCf0YDQvtCy0LXRgNC40Lwg0L3QtdC60L7RgNGA0LXQu9C40YDQvtCy0LDQvdC90L7RgdGC0Ywg0L7RgdGC0LDRgtC60L7QsiBb0L/RgNCw0LrRgtC40YfQtdGB0LrQuCDRgNCw0LLQvdGLIDBdDQpgYGB7cn0NCmMoY29yKG1yZWckcmVzaWR1YWxzLCBkYXRhJHNzdGF0aSksIGNvcihtcmVnJHJlc2lkdWFscywgZGF0YSRhc2kxX21lZCApLCBjb3IobXJlZyRyZXNpZHVhbHMsIGRhdGEkYXNpMl9lbXAgKSwgY29yKG1yZWckcmVzaWR1YWxzLCBkYXRhJGFzaWQzX2R5cikpDQpgYGANCg0KPiDQp9Cw0YHRgtC90YvQuSDQutC+0Y3RhNGE0LjRhtC40LXQvdGCINC60L7RgNGA0LXQu9GP0YbQuNC4ICRccmhvX3tZWF8xIFxjZG90IFhfMiBYXzMgWF80fSQNCg0KYGBge3J9DQpsaWJyYXJ5KG1hdGxpYikNCm1zDQpgYGANCiQkIFxyaG9fe1lYXzEgXGNkb3QgWF8yIFhfMyBYXzR9ID0gLSBcZnJhY3tcTGFtYmRhX3tZIFhfMX19e1xzcXJ0e1xMYW1iZGFfe1kgWX0gXExhbWJkYV97MSAxfX19JCQgDQrQs9C00LUgJFxMYW1iZGFfe2lqfSQgLS0g0LDQu9Cz0LXQsdGA0LDQuNGH0LXRgdC60L7QtSDQtNC+0L/QvtC70L3QtdC90LjQtSDRjdC70LXQvNC10L3RgtCwICRcbGFtYmRhX3tpan0kINC60L7RgNGA0LXQu9GP0YbQuNC+0L3QvdC+0Lkg0LzQsNGC0YDQuNGG0YsgJFxMYW1iZGEkDQoNCmBgYHtyfQ0KcmhvIDwtIC0gY29mYWN0b3IobXMsIDUsIDEpIC8gc3FydChjb2ZhY3RvcihtcywgNSwgNSkgKiBjb2ZhY3RvcihtcywgMSwgMSkpDQpjKHIueXgxPW1zWzEsIDVdLCByaG89cmhvKQ0KYGBgDQoNCiRyX3tZIFhfMX0gPiBccmhvX3tZWF8xIFxjZG90IFhfMiBYXzMgWF80fSQsINGC0L4g0YTQsNC60YLQvtGA0YsgJFhfMiwgWF8zLCBYNCQgW9C90LXQvNC90L7Qs9C+XSDQuNGB0LrQsNC20LDRjtGCINCy0LfQsNC40LzQvtGB0LLRj9C30Ywg0LzQtdC20LTRgyAkWSQg0LggJFhfMSQg0LIg0YHRgtC+0YDQvtC90YMg0LXRkSDRg9Cy0LXQu9C40YfQtdC90LjRjw0KDQotLS0NCg0KPiA3LiDQpNCw0LrRgtC+0YDQvdGL0Lkg0LDQvdCw0LvQuNC3DQoNCtCX0LDQtNCw0L3QuNC1LiAgDQrQn9C+0YHRgtGA0L7QuNGC0Ywg0LzQsNGC0YDQuNGG0YMg0YTQsNC60YLQvtGA0L3Ri9GFINC90LDQs9GA0YPQt9C+0LouINCf0YDQvtC40L3RgtC10YDQv9GA0LXRgtC40YDQvtCy0LDRgtGMINCz0LvQsNCy0L3Ri9C1INC60L7QvNC/0L7QvdC10L3RgtGLLCDQvtC/0YDQtdC00LXQu9C40YLRjCDQstC60LvQsNC0INC/0LXRgNCy0YvRhSDQtNCy0YPRhSDQsiDQvtCx0YnRg9GOINC00LjRgdC/0LXRgNGB0LjRjiDQuCDQv9C+0YHRgtGA0L7QuNGC0Ywg0LTQstGD0LzQtdGA0L3Rg9GOINC00LjQsNCz0YDQsNC80LzRgyDQv9C10YDQstGL0YUg0LTQstGD0YUg0YTQsNC60YLQvtGA0L7Qsi4NCg0KLS0tDQoNCtCS0LrQu9Cw0LQg0LPQu9Cw0LLQvdGL0YUg0LrQvtC80L/QvtC90LXQvdGCINCyINC+0LHRidGD0Y4g0LTQuNGB0L/QtdGA0YHQuNGODQpgYGB7cn0NCnBjIDwtIHByaW5jb21wKHNjYWxlKGRhdGEpKQ0Kc3VtbWFyeShwYykNCmBgYA0K0J/QtdGA0LLRi9C1INC00LLQtSDQutC+0LzQv9C+0L3QtdC90YLRiyDQtNCw0Y7RgiBgciAwLjUyMDQ1ODcgKiAxMDBgJQ0KDQoNCtCk0LDQutGC0L7RgNC90YvQtSDQvdCw0LPRgNGD0LfQutC4DQpgYGB7cn0NCnBjJGxvYWRpbmdzWywgc2VxKDUpXQ0KYGBgDQrQn9C10YDQstCw0Y8g0LrQvtC80L/QvtC90LXQvdGC0LAg0L7RgtCy0LXRh9Cw0LXRgiDQt9CwICLQvNC10LTQuNGG0LjQvdGB0LrQuNC1IiDRhNCw0LrRgtC+0YDRizog0YLRgNC10LLQvtC20L3QvtGB0YLRjCwg0LzQtdC00LjRhtC40L3RgdC60LjQuSDQuCDQv9GB0LjRhdC40LDRgtGA0LjRh9C10YHQutC40Lkg0YHRgtCw0YLRg9GBLCDQtNC70LjRgtC10LvRjNC90L7RgdGC0Ywg0LPQtdGA0L7QuNC90L7QstC+0Lkg0LfQsNCy0LjRgdC40LzQvtGB0YLQuCwg0L/RgNC40YLQvtC8INCy0LXQt9C00LUg0YHQstGP0LfRjCDQv9GA0Y/QvNC+INC/0YDQvtC/0L7RgNGG0LjQvtC90LDQu9GM0L3QsC4gIA0K0JLRgtC+0YDQsNGPINC60L7QvNC/0L7QvdC10L3RgtCwINGB0LLRj9C30LDQvdCwINGBINC/0L7QvdC40LbQtdC90LjQtdC8INGB0L7RhtC40LDQu9GM0L3QvtCz0L4g0YHRgtCw0YLRg9GB0LAg0Lgg0L/QvtCy0YvRiNC10L3QuNC10Lwg0LzQtdC00LjRhtC40L3RgdC60L7Qs9C+INGB0YLQsNGC0YPRgdCwLiAgDQrQotGA0LXRgtGM0Y8gLS0g0YEg0L/QvtC90LjQttC10L3QuNC10Lwg0LTQu9C40YLQtdC70YzQvdC+0YHRgtC4INCz0LXRgNC+0LjQvdC+0LLQvtC5INC30LDQstC40YHQuNC80L7RgdGC0LguICANCtCn0LXRgtCy0LXRgNGC0LDRjyAtLSDRgSDQv9C+0L3QuNC20LXQvdC40LXQvCDQvNC10LTQuNGG0LjQvdGB0LrQvtCz0L4g0YHRgtCw0YLRg9GB0LAg0Lgg0L/QvtCy0YvRiNC10L3QuNC10Lwg0YPRgNC+0LLQvdGPINGC0YDQtdCy0L7QttC90L7RgdGC0LguICANCtCf0Y/RgtCw0Y8g0LrQvtC80L/QvtC90LXQvdGC0LAg0LPQvtCy0L7RgNC40YIg0L4g0L/QvtCy0YvRiNC10L3QuNC4INGD0YDQvtCy0L3RjyDRgtGA0LXQstC+0LbQvdC+0YHRgtC4INC4INGB0L7RhtC40LDQu9GM0L3QvtCz0L4g0YHRgtCw0YLRg9GB0LAg0LLQvNC10YHRgtC1INGBINC/0L7QvdC40LbQtdC90LjQtdC8INC/0YHQuNGF0LjQsNGC0YDQuNGH0LXRgdC60L7Qs9C+INGB0YLQsNGC0YPRgdCwLiAgDQoNCtCf0YDQvtCy0LXRgNC60LAgW9GB0L7QstC/0LDQtNCw0Y7RgiDRgSDRgtC+0YfQvdC+0YHRgtGM0Y4g0LTQviDQv9C10YDQtdGB0YLQsNC90L7QstC60Lgg0LfQvdCw0LrQvtCyINC00LvRjywg0L3QsNC/0YDQuNC80LXRgCwg0L/QtdGA0LLQvtCz0L4g0YTQsNC60YLQvtGA0LBdOg0KYGBge3J9DQplaSA8LSBlaWdlbihjb3IoZGF0YSkpDQoNCkEgPC0gZWkkdmVjdG9ycw0KWSA8LSBhcy5tYXRyaXgoc2NhbGUoZGF0YSkpICUqJSBBDQoNCmNiaW5kKFlbc2VxKDEwKSwgc2VxKDMpXSwgcGMkc2NvcmVzW3NlcSgxMCksc2VxKDMpXSkNCmBgYA0KDQoNCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpiaXBsb3QocGMsIGNleD0wLjUpDQpgYGANCg0KYGBge3J9DQpwbG90KHBjJHNjb3JlcywgdHlwZT0ibiIpDQp0ZXh0KHBjJHNjb3Jlcywgcm93Lm5hbWVzKGRhdGEpLCBjZXg9MC42KQ0KYGBgDQrQl9Cw0LzQtdGC0LjQvCDQstGL0LHRgNC+0YEg0LIg0LLQuNC00LUg0L/QsNGG0LjQtdC90YLQsCDihJYxNjY6INC00LvRjyDQvdC10LPQviDRhdCw0YDQsNC60YLQtdGA0L3QviDQsdC+0LvRjNGI0L7QtSDQt9C90LDRh9C10L3QuNC1IENvbXAuMSAtLSDQv9C+0LLRi9GI0LXQvdC90YvQtSAi0LzQtdC00LjRhtC40L3RgdC60LjQtSIg0YTQsNC60YLQvtGA0YsgLS0g0L/RgNC4INC00L7RgdGC0LDRgtC+0YfQvdC+INC90LjQt9C60L7QvCBDb21wLjINCg==