V tejto práci sa budeme zaoberať prvými krokmi v odhade regresnej
funkcie. Budeme využívať databázu Life
Expectancy (WHO) Fixed dataset, ktorá obsahuje ukazovatele na úrovni
krajín, ako je priemerná dĺžka života, HDP, školské vzdelávanie a
výdavky na zdravotníctvo.
Príprava údajov - import z csv súboru
Súbor Life_Expectancy_Data obsahuje databázu determinantov očakávanej
dĺžky života. Import údajov urobíme nasledovne
# import the dataset and create a data.frame udaje
#
udaje_svet <- read.csv("udaje/Life-Expectancy-Data-Updated.csv",header=TRUE,sep=",",dec=".",check.names = TRUE)
head(udaje_svet)
#
Databáza obsahuje údaje o 2938 pozorovaniach a 22 premenných. V tejto
práci sa budeme zaoberať len časťou z nich, konkrétne tými, ktoré
súvisia s dĺžkou dožitia. Na zažiatku si vyberieme krajinu, ktorej
zdravotný stav chceme analyzovať. V tomto prípade ide o Rakúsko
(Slovensko v databáze nemá zastúpenie):
# z databázy udaje_svet si vyberieme len tie pozorovania, ktoré sa týkajú Rakuska
udaje <- subset(udaje_svet, Country == "Austria")
Tabuľka uvedená nižšie nám poskuytuje základné popisné štatistiky
vybraných kvantitatívnych premenných.
# niektoré štatistiky a ich prehľad v tabuľke KableExtra
library(kableExtra)
udaje %>%
select(Adult_mortality,Alcohol_consumption, Hepatitis_B, Measles, BMI,Polio,Diphtheria,GDP_per_capita,Population_mln,Life_expectancy,Schooling) %>%
summary() %>%
kable() %>%
kable_styling(bootstrap_options = "striped", full_width = FALSE)
| |
Adult_mortality |
Alcohol_consumption |
Hepatitis_B |
Measles |
BMI |
Polio |
Diphtheria |
GDP_per_capita |
Population_mln |
Life_expectancy |
Schooling |
| |
Min. :64.69 |
Min. :11.60 |
Min. :33.00 |
Min. :34.00 |
Min. :25.00 |
Min. :71.00 |
Min. :81.00 |
Min. :38843 |
Min. :8.010 |
Min. :78.10 |
Min. : 9.00 |
| |
1st Qu.:71.15 |
1st Qu.:12.07 |
1st Qu.:83.00 |
1st Qu.:46.75 |
1st Qu.:25.18 |
1st Qu.:83.00 |
1st Qu.:83.00 |
1st Qu.:40442 |
1st Qu.:8.158 |
1st Qu.:79.08 |
1st Qu.: 9.75 |
| |
Median :77.31 |
Median :12.12 |
Median :84.00 |
Median :61.50 |
Median :25.30 |
Median :84.50 |
Median :84.50 |
Median :42995 |
Median :8.310 |
Median :80.25 |
Median :11.55 |
| |
Mean :78.31 |
Mean :12.23 |
Mean :81.06 |
Mean :60.94 |
Mean :25.29 |
Mean :86.00 |
Mean :86.75 |
Mean :42376 |
Mean :8.296 |
Mean :79.97 |
Mean :10.83 |
| |
3rd Qu.:85.53 |
3rd Qu.:12.36 |
3rd Qu.:89.75 |
3rd Qu.:74.25 |
3rd Qu.:25.43 |
3rd Qu.:89.75 |
3rd Qu.:89.75 |
3rd Qu.:44258 |
3rd Qu.:8.400 |
3rd Qu.:80.92 |
3rd Qu.:11.80 |
| |
Max. :94.88 |
Max. :13.35 |
Max. :98.00 |
Max. :88.00 |
Max. :25.50 |
Max. :98.00 |
Max. :98.00 |
Max. :44550 |
Max. :8.640 |
Max. :81.50 |
Max. :12.10 |
Vyššie uvedená tabuľka nám poskytuje prehľad o základných
štatistických charakteristikách vybraných premenných, ako sú priemerné
hodnoty, rozptyl, minimum a maximum. Tieto informácie nám pomáhajú
lepšie pochopiť rozdelenie a rozsah hodnôt v našich dátach. Na druhej
strane je zaujímavá aj informácia o vzájomných vzťahoch medzi týmito
premennými, čo môžeme merať pomocou korelačnej matice.
# grafický prehľad o korelačných vzťahoch vyjadruje nasledovný obrázok
cor_matrix <- cor(udaje %>% select(Adult_mortality,Alcohol_consumption
,Hepatitis_B, Measles, BMI,Polio,Diphtheria,GDP_per_capita,Population_mln,Life_expectancy,Schooling), use = "complete.obs")
corrplot(cor_matrix, method = "color", type = "upper", tl.col =
"black", tl.srt = 45, title = "Korelačná matica vybraných premenných", mar = c(0,0,1,0))

Uvedený graf nám poskytuje vizuálny prehľad o korelačných vzťahoch
medzi vybranými premennými. Farby a intenzita farieb nám umožňujú rýchlo
identifikovať silné pozitívne alebo negatívne korelácie. Upozorňujeme,
že korelácia neznamená kauzalitu.
V nasledovnom je uvedený graf vývoja očakávanej dĺžky dožitia v
Rakúsku v rokoch 2000-2015. Vidíme, že očakávaná dĺžka života sa
zvyšovala, čo je pozitívny trend.
# graf vývoja očakávanej dĺžky dožitia v Rakúsku v rokoch 2000-2015.
library(ggplot2)
ggplot(udaje, aes(x = Year, y = Life_expectancy)) +
geom_line() +
geom_point() +
labs(title = "Vývoj očakávanej dĺžky dožitia v Rakúsku (2000-2015)",
x = "Rok",
y = "Očakávaná dĺžka dožitia") +
theme_minimal()

Na začiatku sa pokúsme o vyrovnanie priebehu tejto premennej v čase
pomocou lineárnej regresie, kde nezávislou premennou bude rok a závislou
premennou bude očakávaná dĺžka dožitia. Odhadneme koeficienty tejto
regresie a posúdime kvalitu vyrovnania pomocou ukazovateľov, ako je
R-squared a p-value.
# vyrovnanie priebehu očakávanej dĺžky dožitia v čase
model <- lm(Life_expectancy ~ Year, data = udaje)
library(broom)
library(knitr)
library(kableExtra)
# koeficienty regresie
tidy(model) %>%
kable(digits = 3, caption = "Odhadnuté koeficienty regresie") %>%
kable_styling(bootstrap_options = "striped", full_width = FALSE)
Odhadnuté koeficienty regresie
| term |
estimate |
std.error |
statistic |
p.value |
| (Intercept) |
-368.170 |
25.474 |
-14.453 |
0 |
| Year |
0.223 |
0.013 |
17.592 |
0 |
# kvalita vyrovnania
glance(model) %>%
kable(digits = 3, caption = "Ukazovatele kvality vyrovnania") %>%
kable_styling(bootstrap_options = "striped", full_width = FALSE)
Ukazovatele kvality vyrovnania
| r.squared |
adj.r.squared |
sigma |
statistic |
p.value |
df |
logLik |
AIC |
BIC |
deviance |
df.residual |
nobs |
| 0.957 |
0.954 |
0.234 |
309.495 |
0 |
1 |
1.606 |
2.789 |
5.106 |
0.766 |
14 |
16 |
NA
Výsledky regresie nám ukazujú, že koeficient pre rok je pozitívny a
štatisticky významný, čo naznačuje, že očakávaná dĺžka dožitia v Rakúsku
sa zvyšovala v priebehu rokov 2000-2015. Jej priemerný ročný nárast
dosahoval až takmer štvrť roka. Hodnota R-squared hodnota nám hovorí, že
model vysvetľuje 95 % variability modelu. Podľa hodnoty p-value môžeme
povedať, že model ako celok je štatisticky významný.
# teraz vyššie uvedený obrázok doplníme o regresnú priamku
ggplot(udaje, aes(x = Year, y = Life_expectancy)) +
geom_line() +
geom_point() +
geom_smooth(method = "lm", se = FALSE, color = "red") +
labs(title = "Vývoj očakávanej dĺžky dožitia v Rakúsku (2000-2015) s regresnou priamkou",
x = "Rok",
y = "Očakávaná dĺžka dožitia") +
theme_minimal()

Vývoj spotreby alkoholu
Alkohol je predpokladaný negatívz faktor….
model_alkohol <-lm(Alcohol_consumption ~ Year, data = udaje)
tidy(model_alkohol) %>%
kable(digits = 3, caption = "Odhadnuté koeficienty regresie pre spotrebu alkoholu") %>%
kable_styling(bootstrap_options = "striped", full_width = FALSE)
Odhadnuté koeficienty regresie pre spotrebu alkoholu
| term |
estimate |
std.error |
statistic |
p.value |
| (Intercept) |
107.022 |
35.895 |
2.982 |
0.010 |
| Year |
-0.047 |
0.018 |
-2.641 |
0.019 |
# and now the model quality statistics - just R sqared
r2 <- summary(model_alkohol)$r.squared
adj_r2 <- summary(model_alkohol)$adj.r.squared
# printujeme koeficient determinácie a upravený koeficient determinácie
cat("R-squared:", round(r2, 3), "\n")
R-squared: 0.333
cat("Adjusted R-squared:", round(adj_r2, 3), "\n")
Adjusted R-squared: 0.285
LS0tCnRpdGxlOiAiUHLDoWNhIHMgcmVncmVzaW91IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKYXV0aG9yOiBWbGFkaW3DrXIgR2F6ZGEgKHMgcG9tb2NvdSB2eWJyYW7DvWNoIHpkcm9qb3YpCi0tLQoKViB0ZWp0byBwcsOhY2kgc2EgYnVkZW1lIHphb2JlcmHFpSBwcnbDvW1pIGtyb2ttaSB2IG9kaGFkZSByZWdyZXNuZWogZnVua2NpZS4gQnVkZW1lIHZ5dcW+w612YcWlIGRhdGFiw6F6dSAKW0xpZmUgRXhwZWN0YW5jeSAoV0hPKSBGaXhlZCBkYXRhc2V0XShodHRwczovL3d3dy5rYWdnbGUuY29tL2RhdGFzZXRzL2xhc2hhZ29jaC9saWZlLWV4cGVjdGFuY3ktd2hvLXVwZGF0ZWQpLAprdG9yw6Egb2JzYWh1amUgdWthem92YXRlbGUgbmEgw7pyb3ZuaSBrcmFqw61uLCBha28gamUgcHJpZW1lcm7DoSBkxLrFvmthIMW+aXZvdGEsIEhEUCwgxaFrb2xza8OpIHZ6ZGVsw6F2YW5pZSBhIHbDvWRhdmt5IG5hIHpkcmF2b3Ruw61jdHZvLgoKCiMjIFZ5dcW+w612YW5pZSBuaWVrdG9yw71jaCBrbmnFvm7DrWMKCmBgYHtyfQpybShsaXN0PWxzKCkpCmxpYnJhcnkobG10ZXN0KSAgICMgIHBvZHBvcmEgcmVncmVzaWUKbGlicmFyeShvdXRsaWVycykgIyBhbmFseXphIG9kbGFobHljaCBob2Rub3QgKG91dGxpZXJzKQpsaWJyYXJ5KGdwdHN0dWRpbykKbGlicmFyeShrYWJsZUV4dHJhKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KGNvcnJwbG90KQpgYGAKCgoKIyMgUHLDrXByYXZhIMO6ZGFqb3YgLSBpbXBvcnQgeiBjc3Ygc8O6Ym9ydQoKU8O6Ym9yIExpZmVfRXhwZWN0YW5jeV9EYXRhIG9ic2FodWplIGRhdGFiw6F6dSBkZXRlcm1pbmFudG92IG/EjWFrw6F2YW5laiBkxLrFvmt5IMW+aXZvdGEuIEltcG9ydCDDumRham92IHVyb2LDrW1lIG5hc2xlZG92bmUKCmBgYHtyfQojIGltcG9ydCB0aGUgZGF0YXNldCBhbmQgY3JlYXRlIGEgZGF0YS5mcmFtZSB1ZGFqZQojCnVkYWplX3N2ZXQgPC0gcmVhZC5jc3YoInVkYWplL0xpZmUtRXhwZWN0YW5jeS1EYXRhLVVwZGF0ZWQuY3N2IixoZWFkZXI9VFJVRSxzZXA9IiwiLGRlYz0iLiIsY2hlY2submFtZXMgPSBUUlVFKQpoZWFkKHVkYWplX3N2ZXQpCiMKYGBgCgpEYXRhYsOhemEgb2JzYWh1amUgw7pkYWplIG8gMjkzOCBwb3pvcm92YW5pYWNoIGEgMjIgcHJlbWVubsO9Y2guIFYgdGVqdG8gcHLDoWNpIHNhIGJ1ZGVtZSB6YW9iZXJhxaUgbGVuIMSNYXPFpW91IHogbmljaCwga29ua3LDqXRuZSB0w71taSwga3RvcsOpIHPDunZpc2lhIHMgZMS6xb5rb3UgZG/Fvml0aWEuIE5hIHphxb5pYXRrdSBzaSB2eWJlcmllbWUga3JhamludSwga3RvcmVqIHpkcmF2b3Ruw70gc3RhdiBjaGNlbWUgYW5hbHl6b3ZhxaUuIFYgdG9tdG8gcHLDrXBhZGUgaWRlIG8gUmFrw7pza28gKFNsb3ZlbnNrbyB2IGRhdGFiw6F6ZSBuZW3DoSB6YXN0w7pwZW5pZSk6CgpgYGB7cn0KIyB6IGRhdGFiw6F6eSB1ZGFqZV9zdmV0IHNpIHZ5YmVyaWVtZSBsZW4gdGllIHBvem9yb3ZhbmlhLCBrdG9yw6kgc2EgdMO9a2Fqw7ogUmFrdXNrYSAKdWRhamUgPC0gc3Vic2V0KHVkYWplX3N2ZXQsIENvdW50cnkgPT0gIkF1c3RyaWEiKQpgYGAKClRhYnXEvmthIHV2ZWRlbsOhIG5pxb7FoWllIG7DoW0gcG9za3V5dHVqZSB6w6FrbGFkbsOpIHBvcGlzbsOpIMWhdGF0aXN0aWt5IHZ5YnJhbsO9Y2gga3ZhbnRpdGF0w612bnljaCBwcmVtZW5uw71jaC4KCmBgYHtyfQojIG5pZWt0b3LDqSDFoXRhdGlzdGlreSBhIGljaCBwcmVoxL5hZCB2IHRhYnXEvmtlIEthYmxlRXh0cmEKbGlicmFyeShrYWJsZUV4dHJhKQp1ZGFqZSAlPiUKICBzZWxlY3QoQWR1bHRfbW9ydGFsaXR5LEFsY29ob2xfY29uc3VtcHRpb24sIEhlcGF0aXRpc19CLCBNZWFzbGVzLCBCTUksUG9saW8sRGlwaHRoZXJpYSxHRFBfcGVyX2NhcGl0YSxQb3B1bGF0aW9uX21sbixMaWZlX2V4cGVjdGFuY3ksU2Nob29saW5nKSAlPiUKICBzdW1tYXJ5KCkgJT4lCiAga2FibGUoKSAlPiUKICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gRkFMU0UpCmBgYAoKVnnFocWhaWUgdXZlZGVuw6EgdGFidcS+a2EgbsOhbSBwb3NreXR1amUgcHJlaMS+YWQgbyB6w6FrbGFkbsO9Y2ggxaF0YXRpc3RpY2vDvWNoIGNoYXJha3RlcmlzdGlrw6FjaCB2eWJyYW7DvWNoIHByZW1lbm7DvWNoLCBha28gc8O6IHByaWVtZXJuw6kgaG9kbm90eSwgcm96cHR5bCwgbWluaW11bSBhIG1heGltdW0uIFRpZXRvIGluZm9ybcOhY2llIG7DoW0gcG9tw6FoYWrDuiBsZXDFoWllIHBvY2hvcGnFpSByb3pkZWxlbmllIGEgcm96c2FoIGhvZG7DtHQgdiBuYcWhaWNoIGTDoXRhY2guIE5hIGRydWhlaiBzdHJhbmUgamUgemF1asOtbWF2w6EgYWogaW5mb3Jtw6FjaWEgbyB2esOham9tbsO9Y2ggdnrFpWFob2NoIG1lZHppIHTDvW1pdG8gcHJlbWVubsO9bWksIMSNbyBtw7TFvmVtZSBtZXJhxaUgcG9tb2NvdSBrb3JlbGHEjW5laiBtYXRpY2UuCgpgYGB7cn0KIyBncmFmaWNrw70gcHJlaMS+YWQgbyBrb3JlbGHEjW7DvWNoIHZ6xaVhaG9jaCB2eWphZHJ1amUgbmFzbGVkb3Zuw70gb2Jyw6F6b2sKCmNvcl9tYXRyaXggPC0gY29yKHVkYWplICU+JSBzZWxlY3QoQWR1bHRfbW9ydGFsaXR5LEFsY29ob2xfY29uc3VtcHRpb24KLEhlcGF0aXRpc19CLCBNZWFzbGVzLCBCTUksUG9saW8sRGlwaHRoZXJpYSxHRFBfcGVyX2NhcGl0YSxQb3B1bGF0aW9uX21sbixMaWZlX2V4cGVjdGFuY3ksU2Nob29saW5nKSwgdXNlID0gImNvbXBsZXRlLm9icyIpCmNvcnJwbG90KGNvcl9tYXRyaXgsIG1ldGhvZCA9ICJjb2xvciIsIHR5cGUgPSAidXBwZXIiLCB0bC5jb2wgPQoiYmxhY2siLCB0bC5zcnQgPSA0NSwgdGl0bGUgPSAiS29yZWxhxI1uw6EgbWF0aWNhIHZ5YnJhbsO9Y2ggcHJlbWVubsO9Y2giLCBtYXIgPSBjKDAsMCwxLDApKQoKYGBgClV2ZWRlbsO9IGdyYWYgbsOhbSBwb3NreXR1amUgdml6dcOhbG55IHByZWjEvmFkIG8ga29yZWxhxI1uw71jaCB2esWlYWhvY2ggbWVkemkgdnlicmFuw71taSBwcmVtZW5uw71taS4gRmFyYnkgYSBpbnRlbnppdGEgZmFyaWViIG7DoW0gdW1vxb7FiHVqw7ogcsO9Y2hsbyBpZGVudGlmaWtvdmHFpSBzaWxuw6kgcG96aXTDrXZuZSBhbGVibyBuZWdhdMOtdm5lIGtvcmVsw6FjaWUuIFVwb3pvcsWIdWplbWUsIMW+ZSBrb3JlbMOhY2lhIG5lem5hbWVuw6Ega2F1emFsaXR1LgoKCgoKIApWIG5hc2xlZG92bm9tIGplIHV2ZWRlbsO9IGdyYWYgdsO9dm9qYSBvxI1ha8OhdmFuZWogZMS6xb5reSBkb8W+aXRpYSB2IFJha8O6c2t1IHYgcm9rb2NoIDIwMDAtMjAxNS4gVmlkw61tZSwgxb5lIG/EjWFrw6F2YW7DoSBkxLrFvmthIMW+aXZvdGEgc2EgenZ5xaFvdmFsYSwgxI1vIGplIHBveml0w612bnkgdHJlbmQuCgpgYGB7cn0KIyAgZ3JhZiB2w712b2phIG/EjWFrw6F2YW5laiBkxLrFvmt5IGRvxb5pdGlhIHYgUmFrw7pza3UgdiByb2tvY2ggMjAwMC0yMDE1LgpsaWJyYXJ5KGdncGxvdDIpCmdncGxvdCh1ZGFqZSwgYWVzKHggPSBZZWFyLCB5ID0gTGlmZV9leHBlY3RhbmN5KSkgKwogIGdlb21fbGluZSgpICsKICBnZW9tX3BvaW50KCkgKwogIGxhYnModGl0bGUgPSAiVsO9dm9qIG/EjWFrw6F2YW5laiBkxLrFvmt5IGRvxb5pdGlhIHYgUmFrw7pza3UgKDIwMDAtMjAxNSkiLAogICAgICAgeCA9ICJSb2siLAogICAgICAgeSA9ICJPxI1ha8OhdmFuw6EgZMS6xb5rYSBkb8W+aXRpYSIpICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgoKTmEgemHEjWlhdGt1IHNhIHBva8O6c21lIG8gdnlyb3ZuYW5pZSBwcmllYmVodSB0ZWp0byBwcmVtZW5uZWogdiDEjWFzZSBwb21vY291IGxpbmXDoXJuZWogcmVncmVzaWUsIGtkZSBuZXrDoXZpc2xvdSBwcmVtZW5ub3UgYnVkZSByb2sgYSB6w6F2aXNsb3UgcHJlbWVubm91IGJ1ZGUgb8SNYWvDoXZhbsOhIGTEusW+a2EgZG/Fvml0aWEuIE9kaGFkbmVtZSBrb2VmaWNpZW50eSB0ZWp0byByZWdyZXNpZSBhIHBvc8O6ZGltZSBrdmFsaXR1IHZ5cm92bmFuaWEgcG9tb2NvdSB1a2F6b3ZhdGXEvm92LCBha28gamUgUi1zcXVhcmVkIGEgcC12YWx1ZS4KCmBgYHtyfQojIHZ5cm92bmFuaWUgcHJpZWJlaHUgb8SNYWvDoXZhbmVqIGTEusW+a3kgZG/Fvml0aWEgdiDEjWFzZQptb2RlbCA8LSBsbShMaWZlX2V4cGVjdGFuY3kgfiBZZWFyLCBkYXRhID0gdWRhamUpCgpsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCgojIGtvZWZpY2llbnR5IHJlZ3Jlc2llCnRpZHkobW9kZWwpICU+JQogIGthYmxlKGRpZ2l0cyA9IDMsIGNhcHRpb24gPSAiT2RoYWRudXTDqSBrb2VmaWNpZW50eSByZWdyZXNpZSIpICU+JQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSAic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGQUxTRSkKCiMga3ZhbGl0YSB2eXJvdm5hbmlhCmdsYW5jZShtb2RlbCkgJT4lCiAga2FibGUoZGlnaXRzID0gMywgY2FwdGlvbiA9ICJVa2F6b3ZhdGVsZSBrdmFsaXR5IHZ5cm92bmFuaWEiKSAlPiUKICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gRkFMU0UpCgpgYGAKClbDvXNsZWRreSByZWdyZXNpZSBuw6FtIHVrYXp1asO6LCDFvmUga29lZmljaWVudCBwcmUgcm9rIGplIHBveml0w612bnkgYSDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSwgxI1vIG5hem5hxI11amUsIMW+ZSBvxI1ha8OhdmFuw6EgZMS6xb5rYSBkb8W+aXRpYSB2IFJha8O6c2t1IHNhIHp2ecWhb3ZhbGEgdiBwcmllYmVodSByb2tvdiAyMDAwLTIwMTUuIEplaiBwcmllbWVybsO9IHJvxI1uw70gbsOhcmFzdCBkb3NhaG92YWwgYcW+IHRha21lciDFoXR2csWlIHJva2EuIEhvZG5vdGEgUi1zcXVhcmVkIGhvZG5vdGEgbsOhbSBob3ZvcsOtLCDFvmUgbW9kZWwgdnlzdmV0xL51amUgOTUgXCUgdmFyaWFiaWxpdHkgbW9kZWx1LiBQb2TEvmEgaG9kbm90eSBwLXZhbHVlIG3DtMW+ZW1lIHBvdmVkYcWlLCDFvmUgbW9kZWwgYWtvIGNlbG9rIGplIMWhdGF0aXN0aWNreSB2w716bmFtbsO9LgoKYGBge3J9CiMgdGVyYXogdnnFocWhaWUgdXZlZGVuw70gb2Jyw6F6b2sgZG9wbG7DrW1lIG8gcmVncmVzbsO6IHByaWFta3UKZ2dwbG90KHVkYWplLCBhZXMoeCA9IFllYXIsIHkgPSBMaWZlX2V4cGVjdGFuY3kpKSArCiAgZ2VvbV9saW5lKCkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSwgY29sb3IgPSAicmVkIikgKwogIGxhYnModGl0bGUgPSAiVsO9dm9qIG/EjWFrw6F2YW5laiBkxLrFvmt5IGRvxb5pdGlhIHYgUmFrw7pza3UgKDIwMDAtMjAxNSkgcyByZWdyZXNub3UgcHJpYW1rb3UiLAogICAgICAgeCA9ICJSb2siLAogICAgICAgeSA9ICJPxI1ha8OhdmFuw6EgZMS6xb5rYSBkb8W+aXRpYSIpICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgojIyMgVsO9dm9qIHNwb3RyZWJ5IGFsa29ob2x1CgpBbGtvaG9sIGplIHByZWRwb2tsYWRhbsO9IG5lZ2F0w612eiBmYWt0b3IuLi4uCgpgYGB7cn0KbW9kZWxfYWxrb2hvbCA8LWxtKEFsY29ob2xfY29uc3VtcHRpb24gfiBZZWFyLCBkYXRhID0gdWRhamUpCnRpZHkobW9kZWxfYWxrb2hvbCkgJT4lCiAga2FibGUoZGlnaXRzID0gMywgY2FwdGlvbiA9ICJPZGhhZG51dMOpIGtvZWZpY2llbnR5IHJlZ3Jlc2llIHByZSBzcG90cmVidSBhbGtvaG9sdSIpICU+JQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSAic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGQUxTRSkKIyBhbmQgbm93IHRoZSBtb2RlbCBxdWFsaXR5IHN0YXRpc3RpY3MgLSBqdXN0IFIgc3FhcmVkCnIyIDwtIHN1bW1hcnkobW9kZWxfYWxrb2hvbCkkci5zcXVhcmVkCmFkal9yMiA8LSBzdW1tYXJ5KG1vZGVsX2Fsa29ob2wpJGFkai5yLnNxdWFyZWQKIyBwcmludHVqZW1lIGtvZWZpY2llbnQgZGV0ZXJtaW7DoWNpZSBhIHVwcmF2ZW7DvSBrb2VmaWNpZW50IGRldGVybWluw6FjaWUKY2F0KCJSLXNxdWFyZWQ6Iiwgcm91bmQocjIsIDMpLCAiXG4iKQpjYXQoIkFkanVzdGVkIFItc3F1YXJlZDoiLCByb3VuZChhZGpfcjIsIDMpLCAiXG4iKQpgYGAKCiMgT2Jyw6F6b2sgbyBza3V0b8SNbsO9Y2ggdnlyb3ZuYW7DvWNoIGhvZG5vdMOhY2ggc3BvdHJlYnkgYWxrb2hvbHUgICAgIApgYGB7cn0KZml0dGVkX3ZhbHMgPC0gZml0dGVkKG1vZGVsX2Fsa29ob2wpCiMgdnlrcmVzbGVuaWUgc2t1dG/EjW7DvWNoIGEgdnlyb3ZuYW7DvWNoIGhvZG7DtHQgLSBBbGNvaG9sX2NvbnN1bXB0aW9uIGEgZml0dGVkX3ZhbHVlcwpnZ3Bsb3QodWRhamUsIGFlcyh4ID0gWWVhcikpICsKICBnZW9tX2xpbmUoYWVzKHkgPSBBbGNvaG9sX2NvbnN1bXB0aW9uKSwgY29sb3IgPSAiYmx1ZSIsIHNpemUgPSAxKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gZml0dGVkX3ZhbHMpLCBjb2xvciA9ICJyZWQiLCBzaXplID0gMSwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGxhYnModGl0bGUgPSAiU2t1dG/EjW7DqSB2cy4gVnlyb3ZuYW7DqSBob2Rub3R5IHNwb3RyZWJ5IGFsa29ob2x1IHYgUmFrw7pza3UgKDIwMDAtMjAxNSkiLAogICAgICAgeCA9ICJSb2siLAogICAgICAgeSA9ICJTcG90cmViYSBhbGtvaG9sdSIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIG1heCh1ZGFqZSRBbGNvaG9sX2NvbnN1bXB0aW9uLCBmaXR0ZWRfdmFscykgKiAxLjEpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpgYGA=