Úvod do regresie

Práca s údajmi z Japonska za roky 2000-2015

V tejto práci sa budeme zaoberať prvými krokmi v odhade regresnej funkcie. Budeme využívať databázu [Life Expectancy (WHO) Fixed dataset] (https://www.kaggle.com/datasets/lashagoch/life-expectancy-who-updated), ktorá obsahuje ukazovatele na úrovni krajín, ako je priemerná dĺžka života, HDP, školské vzdelávanie a výdavky na zdravotníctvo. Vyberáme krajinu Japonsko.

Využívanie niektorých knižníc

rm(list=ls())
library(lmtest)   #  podpora regresie
library(outliers) # analyza odlahlych hodnot (outliers)
library(gptstudio)
library(kableExtra)
library(knitr)
library(dplyr)
library(broom)
library(corrplot)

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 už spomínané Japonsko:

# z databázy udaje_svet si vyberieme len tie pozorovania, ktoré sa týkajú Japonska 
udaje <- subset(udaje_svet, Country == "Japan")

Tabuľka uvedená nižšie nám poskytuje základné popisné štatistiky vybraných kvantitatívnych premenných. Vylúčená je Hepatitída B nakoľko údaj bol konštantný.

# niektoré štatistiky a ich prehľad v tabuľke KableExtra
library(kableExtra)
udaje %>%
  select(Adult_mortality,Alcohol_consumption,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 Measles BMI Polio Diphtheria GDP_per_capita Population_mln Life_expectancy Schooling
Min. :53.59 Min. :6.980 Min. :78.00 Min. :22.50 Min. :81.00 Min. :85.00 Min. :31416 Min. :126.8 Min. :81.10 Min. :10.70
1st Qu.:61.20 1st Qu.:7.638 1st Qu.:86.00 1st Qu.:22.57 1st Qu.:95.75 1st Qu.:96.00 1st Qu.:31785 1st Qu.:127.4 1st Qu.:81.88 1st Qu.:11.07
Median :64.70 Median :7.970 Median :88.00 Median :22.60 Median :97.50 Median :97.00 Median :33055 Median :127.7 Median :82.55 Median :11.35
Mean :64.52 Mean :7.932 Mean :88.81 Mean :22.62 Mean :96.00 Mean :96.25 Mean :32972 Mean :127.6 Mean :82.46 Mean :11.47
3rd Qu.:69.23 3rd Qu.:8.402 3rd Qu.:92.25 3rd Qu.:22.70 3rd Qu.:99.00 3rd Qu.:98.00 3rd Qu.:33666 3rd Qu.:127.9 3rd Qu.:82.95 3rd Qu.:11.85
Max. :72.95 Max. :8.650 Max. :97.00 Max. :22.70 Max. :99.00 Max. :99.00 Max. :34961 Max. :128.1 Max. :83.80 Max. :12.50

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,Measles,BMI,Polio,Diphtheria,GDP_per_capita,Population_mln,Life_expectancy,Schooling), use = "complete.obs")
corrplot(cor_matrix, method = "color", type = "upper", tl.col =
"darkblue", 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 zobrazení je uvedený graf vývoja očakávanej dĺžky dožitia v Japonsku v rokoch 2000-2015. Vidíme, že očakávaná dĺžka života sa zvyšovala od roku 2000 z 81 na 83 rokov v roku 2015, čo je pozitívny trend.

#  graf vývoja očakávanej dĺžky dožitia v Japonsku 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 Japonsku (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) -242.582 17.119 -14.170 0
Year 0.162 0.009 18.987 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.963 0.96 0.157 360.514 0 1 7.965 -9.93 -7.613 0.346 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 Japonsku sa zvyšovala v priebehu rokov 2000-2015. Jej priemerný ročný nárast dosahoval 0,162. Hodnota R-squared hodnota nám hovorí, že model vysvetľuje 96 % 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 = "green") +
  labs(title = "Vývoj očakávanej dĺžky dožitia v Japonsku (2000-2015) s regresnou priamkou",
       x = "Rok",
       y = "Očakávaná dĺžka dožitia") +
  theme_minimal()

###Vývoj spotreby alkoholu Teraz sa pozrieme, ako sa vyvýja konzumácia alkoholu v čase od roku 2000 do roku 2015 v Japonsku. Nakoľko alkohol je faktorom negatívne vplývajúcim na dĺžku dožitia.

model_alkohol <- lm(Alcohol_consumption ~ Year, data = udaje)
# kvalita regresie
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) -91.115 53.198 -1.713 0.109
Year 0.049 0.026 1.862 0.084

# a teraz model quality statistics R squared
r2<- summary(model_alkohol)$r.square
adj_r2 <-summary(model_alkohol)$adj.r.square
#printujeme koeficient determinancie a upravený koeficient determinancie
cat ("R-squared:",round (r2,3), "\n")
R-squared: 0.198 
cat ("Adjusted R-squared:",round (adj_r2,3), "\n")
Adjusted R-squared: 0.141 

Výsledky regresie ukazujú, že koeficient pre premennú rok je pozitívny, čo naznačuje mierny rast spotreby alkoholu v Japonsku v období rokov 2000 – 2015. Odhadovaný koeficient 0,049 znamená, že spotreba alkoholu sa v priemere zvyšovala približne o 0,049 jednotky ročne. Hodnota p-value (0,084) však naznačuje, že tento koeficient nie je štatisticky významný na hladine významnosti 5 %, preto nie je možné s dostatočnou istotou potvrdiť existenciu štatisticky významného trendu rastu spotreby alkoholu v sledovanom období.

#Obrázok o skutočných vyrovnaných hodnotách spotreby alkoholu

fitted_vals <- fitted(model_alkohol)
# vykreslenie skutočných a vyrovnaných hodnôt - Alcohol_consumption a fitted_values
ggplot(udaje, aes(x = Year)) +
  geom_line(aes(y = Alcohol_consumption), color = "darkblue", size = 1) +
  geom_line(aes(y = fitted_vals), color = "orange", size = 1, linetype = "dashed") +
  labs(title = "Skutočné vs. Vyrovnané hodnoty spotreby alkoholu v Japonsku (2000-2015)",
       x = "Rok",
       y = "Spotreba alkoholu") +
  theme_minimal() +
  scale_y_continuous(limits = c(0, max(udaje$Alcohol_consumption, fitted_vals) * 1.1)) +
  theme(legend.position = "none")

```

LS0tCnRpdGxlOiAiUHLDoWNhIHMgcmVncmVzaW91IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKYXV0aG9yOiBOYXTDoWxpYSBLdW5vdsOhCi0tLQojIyMgw5p2b2QgZG8gcmVncmVzaWUKUHLDoWNhIHMgw7pkYWptaSAgeiBKYXBvbnNrYSB6YSByb2t5IDIwMDAtMjAxNSAKCgpWIHRlanRvIHByw6FjaSBzYSBidWRlbWUgemFvYmVyYcWlIHBydsO9bWkga3Jva21pIHYgb2RoYWRlIHJlZ3Jlc25laiBmdW5rY2llLiBCdWRlbWUgdnl1xb7DrXZhxaUgZGF0YWLDoXp1IFtMaWZlIEV4cGVjdGFuY3kgKFdITykgRml4ZWQgZGF0YXNldF0KKGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vZGF0YXNldHMvbGFzaGFnb2NoL2xpZmUtZXhwZWN0YW5jeS13aG8tdXBkYXRlZCksIGt0b3LDoSBvYnNhaHVqZSB1a2F6b3ZhdGVsZSBuYSDDunJvdm5pIGtyYWrDrW4sIGFrbyBqZSBwcmllbWVybsOhIGTEusW+a2Egxb5pdm90YSwgSERQLCDFoWtvbHNrw6kgdnpkZWzDoXZhbmllIGEgdsO9ZGF2a3kgbmEgemRyYXZvdG7DrWN0dm8uIFZ5YmVyw6FtZSBrcmFqaW51IEphcG9uc2tvLgoKCiMjIFZ5dcW+w612YW5pZSBuaWVrdG9yw71jaCBrbmnFvm7DrWMKCmBgYHtyfQpybShsaXN0PWxzKCkpCmxpYnJhcnkobG10ZXN0KSAgICMgIHBvZHBvcmEgcmVncmVzaWUKbGlicmFyeShvdXRsaWVycykgIyBhbmFseXphIG9kbGFobHljaCBob2Rub3QgKG91dGxpZXJzKQpsaWJyYXJ5KGdwdHN0dWRpbykKbGlicmFyeShrYWJsZUV4dHJhKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KGNvcnJwbG90KQpgYGAKCgoKIyMgUHLDrXByYXZhIMO6ZGFqb3YgLSBpbXBvcnQgeiBjc3Ygc8O6Ym9ydQoKU8O6Ym9yIExpZmVfRXhwZWN0YW5jeV9EYXRhIG9ic2FodWplIGRhdGFiw6F6dSBkZXRlcm1pbmFudG92IG/EjWFrw6F2YW5laiBkxLrFvmt5IMW+aXZvdGEuIEltcG9ydCDDumRham92IHVyb2LDrW1lIG5hc2xlZG92bmU6CgpgYGB7cn0KIyBpbXBvcnQgdGhlIGRhdGFzZXQgYW5kIGNyZWF0ZSBhIGRhdGEuZnJhbWUgdWRhamUKdWRhamVfc3ZldCA8LSByZWFkLmNzdigidWRhamUvTGlmZS1FeHBlY3RhbmN5LURhdGEtVXBkYXRlZC5jc3YiLGhlYWRlcj1UUlVFLHNlcD0iLCIsZGVjPSIuIixjaGVjay5uYW1lcyA9IFRSVUUpCmhlYWQodWRhamVfc3ZldCkKYGBgCkRhdGFiw6F6YSBvYnNhaHVqZSDDumRhamUgbyAyOTM4IHBvem9yb3ZhbmlhY2ggYSAyMiBwcmVtZW5uw71jaC4gViB0ZWp0byBwcsOhY2kgc2EgYnVkZW1lIHphb2JlcmHFpSBsZW4gxI1hc8Wlb3UgeiBuaWNoLCBrb25rcsOpdG5lIHTDvW1pLCBrdG9yw6kgc8O6dmlzaWEgcyBkxLrFvmtvdSBkb8W+aXRpYS4gTmEgemHEjWlhdGt1IHNpIHZ5YmVyaWVtZSBrcmFqaW51LCBrdG9yZWogemRyYXZvdG7DvSBzdGF2IGNoY2VtZSBhbmFseXpvdmHFpS4gViB0b210byBwcsOtcGFkZSBpZGUgbyB1xb4gc3BvbcOtbmFuw6kgSmFwb25za286CgpgYGB7cn0KIyB6IGRhdGFiw6F6eSB1ZGFqZV9zdmV0IHNpIHZ5YmVyaWVtZSBsZW4gdGllIHBvem9yb3ZhbmlhLCBrdG9yw6kgc2EgdMO9a2Fqw7ogSmFwb25za2EgCnVkYWplIDwtIHN1YnNldCh1ZGFqZV9zdmV0LCBDb3VudHJ5ID09ICJKYXBhbiIpCmBgYAoKVGFidcS+a2EgdXZlZGVuw6EgbmnFvsWhaWUgbsOhbSBwb3NreXR1amUgesOha2xhZG7DqSBwb3Bpc27DqSDFoXRhdGlzdGlreSB2eWJyYW7DvWNoIGt2YW50aXRhdMOtdm55Y2ggcHJlbWVubsO9Y2guIFZ5bMO6xI1lbsOhIGplIEhlcGF0aXTDrWRhIEIgbmFrb8S+a28gw7pkYWogYm9sIGtvbsWhdGFudG7DvS4KCmBgYHtyfQojIG5pZWt0b3LDqSDFoXRhdGlzdGlreSBhIGljaCBwcmVoxL5hZCB2IHRhYnXEvmtlIEthYmxlRXh0cmEKbGlicmFyeShrYWJsZUV4dHJhKQp1ZGFqZSAlPiUKICBzZWxlY3QoQWR1bHRfbW9ydGFsaXR5LEFsY29ob2xfY29uc3VtcHRpb24sTWVhc2xlcyxCTUksUG9saW8sRGlwaHRoZXJpYSxHRFBfcGVyX2NhcGl0YSxQb3B1bGF0aW9uX21sbixMaWZlX2V4cGVjdGFuY3ksU2Nob29saW5nKSAlPiUKICBzdW1tYXJ5KCkgJT4lCiAga2FibGUoKSAlPiUKICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gRkFMU0UpCmBgYAoKVnnFocWhaWUgdXZlZGVuw6EgdGFidcS+a2EgbsOhbSBwb3NreXR1amUgcHJlaMS+YWQgbyB6w6FrbGFkbsO9Y2ggxaF0YXRpc3RpY2vDvWNoIGNoYXJha3RlcmlzdGlrw6FjaCB2eWJyYW7DvWNoIHByZW1lbm7DvWNoLCBha28gc8O6IHByaWVtZXJuw6kgaG9kbm90eSwgcm96cHR5bCwgbWluaW11bSBhIG1heGltdW0uIFRpZXRvIGluZm9ybcOhY2llIG7DoW0gcG9tw6FoYWrDuiBsZXDFoWllIHBvY2hvcGnFpSByb3pkZWxlbmllIGEgcm96c2FoIGhvZG7DtHQgdiBuYcWhaWNoIGTDoXRhY2guIE5hIGRydWhlaiBzdHJhbmUgamUgemF1asOtbWF2w6EgYWogaW5mb3Jtw6FjaWEgbyB2esOham9tbsO9Y2ggdnrFpWFob2NoIG1lZHppIHTDvW1pdG8gcHJlbWVubsO9bWksIMSNbyBtw7TFvmVtZSBtZXJhxaUgcG9tb2NvdSBrb3JlbGHEjW5laiBtYXRpY2UuCgpgYGB7cn0KIyBncmFmaWNrw70gcHJlaMS+YWQgbyBrb3JlbGHEjW7DvWNoIHZ6xaVhaG9jaCB2eWphZHJ1amUgbmFzbGVkb3Zuw70gb2Jyw6F6b2sKCmNvcl9tYXRyaXggPC0gY29yKHVkYWplICU+JSBzZWxlY3QoQWR1bHRfbW9ydGFsaXR5LEFsY29ob2xfY29uc3VtcHRpb24sTWVhc2xlcyxCTUksUG9saW8sRGlwaHRoZXJpYSxHRFBfcGVyX2NhcGl0YSxQb3B1bGF0aW9uX21sbixMaWZlX2V4cGVjdGFuY3ksU2Nob29saW5nKSwgdXNlID0gImNvbXBsZXRlLm9icyIpCmNvcnJwbG90KGNvcl9tYXRyaXgsIG1ldGhvZCA9ICJjb2xvciIsIHR5cGUgPSAidXBwZXIiLCB0bC5jb2wgPQoiZGFya2JsdWUiLCB0bC5zcnQgPSA0NSwgdGl0bGUgPSAiS29yZWxhxI1uw6EgbWF0aWNhIHZ5YnJhbsO9Y2ggcHJlbWVubsO9Y2giLCBtYXIgPSBjKDAsMCwxLDApKQoKYGBgClV2ZWRlbsO9IGdyYWYgbsOhbSBwb3NreXR1amUgdml6dcOhbG55IHByZWjEvmFkIG8ga29yZWxhxI1uw71jaCB2esWlYWhvY2ggbWVkemkgdnlicmFuw71taSBwcmVtZW5uw71taS4gRmFyYnkgYSBpbnRlbnppdGEgZmFyaWViIG7DoW0gdW1vxb7FiHVqw7ogcsO9Y2hsbyBpZGVudGlmaWtvdmHFpSBzaWxuw6kgcG96aXTDrXZuZSBhbGVibyBuZWdhdMOtdm5lIGtvcmVsw6FjaWUuIFVwb3pvcsWIdWplbWUsIMW+ZSBrb3JlbMOhY2lhIG5lem5hbWVuw6Ega2F1emFsaXR1LgoKCgogClYgbmFzbGVkb3Zub20gem9icmF6ZW7DrSBqZSB1dmVkZW7DvSBncmFmIHbDvXZvamEgb8SNYWvDoXZhbmVqIGTEusW+a3kgZG/Fvml0aWEgdiBKYXBvbnNrdSB2IHJva29jaCAyMDAwLTIwMTUuIFZpZMOtbWUsIMW+ZSBvxI1ha8OhdmFuw6EgZMS6xb5rYSDFvml2b3RhIHNhIHp2ecWhb3ZhbGEgIG9kIHJva3UgMjAwMCB6IDgxIG5hIDgzIHJva292IHYgcm9rdSAyMDE1LCDEjW8gamUgcG96aXTDrXZueSB0cmVuZC4KCmBgYHtyfQojICBncmFmIHbDvXZvamEgb8SNYWvDoXZhbmVqIGTEusW+a3kgZG/Fvml0aWEgdiBKYXBvbnNrdSB2IHJva29jaCAyMDAwLTIwMTUuCmxpYnJhcnkoZ2dwbG90MikKZ2dwbG90KHVkYWplLCBhZXMoeCA9IFllYXIsIHkgPSBMaWZlX2V4cGVjdGFuY3kpKSArCiAgZ2VvbV9saW5lKCkgKwogIGdlb21fcG9pbnQoKSArCiAgbGFicyh0aXRsZSA9ICJWw712b2ogb8SNYWvDoXZhbmVqIGTEusW+a3kgZG/Fvml0aWEgdiBKYXBvbnNrdSAoMjAwMC0yMDE1KSIsCiAgICAgICB4ID0gIlJvayIsCiAgICAgICB5ID0gIk/EjWFrw6F2YW7DoSBkxLrFvmthIGRvxb5pdGlhIikgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKCgpOYSB6YcSNaWF0a3Ugc2EgcG9rw7pzbWUgbyB2eXJvdm5hbmllIHByaWViZWh1IHRlanRvIHByZW1lbm5laiB2IMSNYXNlIHBvbW9jb3UgbGluZcOhcm5laiByZWdyZXNpZSwga2RlIG5lesOhdmlzbG91IHByZW1lbm5vdSBidWRlIHJvayBhIHrDoXZpc2xvdSBwcmVtZW5ub3UgYnVkZSBvxI1ha8OhdmFuw6EgZMS6xb5rYSBkb8W+aXRpYS4gT2RoYWRuZW1lIGtvZWZpY2llbnR5IHRlanRvIHJlZ3Jlc2llIGEgcG9zw7pkaW1lIGt2YWxpdHUgdnlyb3ZuYW5pYSBwb21vY291IHVrYXpvdmF0ZcS+b3YsIGFrbyBqZSBSLXNxdWFyZWQgYSBwLXZhbHVlLgoKYGBge3J9CiMgdnlyb3ZuYW5pZSBwcmllYmVodSBvxI1ha8OhdmFuZWogZMS6xb5reSBkb8W+aXRpYSB2IMSNYXNlCm1vZGVsIDwtIGxtKExpZmVfZXhwZWN0YW5jeSB+IFllYXIsIGRhdGEgPSB1ZGFqZSkKCmxpYnJhcnkoYnJvb20pCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKCiMga29lZmljaWVudHkgcmVncmVzaWUKdGlkeShtb2RlbCkgJT4lCiAga2FibGUoZGlnaXRzID0gMywgY2FwdGlvbiA9ICJPZGhhZG51dMOpIGtvZWZpY2llbnR5IHJlZ3Jlc2llIikgJT4lCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9ICJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IEZBTFNFKQoKIyBrdmFsaXRhIHZ5cm92bmFuaWEKZ2xhbmNlKG1vZGVsKSAlPiUKICBrYWJsZShkaWdpdHMgPSAzLCBjYXB0aW9uID0gIlVrYXpvdmF0ZWxlIGt2YWxpdHkgdnlyb3ZuYW5pYSIpICU+JQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSAic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGQUxTRSkKCmBgYAoKVsO9c2xlZGt5IHJlZ3Jlc2llIG7DoW0gdWthenVqw7osIMW+ZSBrb2VmaWNpZW50IHByZSByb2sgamUgcG96aXTDrXZueSBhIMWhdGF0aXN0aWNreSB2w716bmFtbsO9LCDEjW8gbmF6bmHEjXVqZSwgxb5lIG/EjWFrw6F2YW7DoSBkxLrFvmthIGRvxb5pdGlhIHYgSmFwb25za3Ugc2EgenZ5xaFvdmFsYSB2IHByaWViZWh1IHJva292IDIwMDAtMjAxNS4gSmVqIHByaWVtZXJuw70gcm/EjW7DvSBuw6FyYXN0IGRvc2Fob3ZhbCAwLDE2Mi4gSG9kbm90YSBSLXNxdWFyZWQgaG9kbm90YSBuw6FtIGhvdm9yw60sIMW+ZSBtb2RlbCB2eXN2ZXTEvnVqZSA5NiAlIHZhcmlhYmlsaXR5IG1vZGVsdS4gUG9kxL5hIGhvZG5vdHkgcC12YWx1ZSBtw7TFvmVtZSBwb3ZlZGHFpSwgxb5lIG1vZGVsIGFrbyBjZWxvayBqZSDFoXRhdGlzdGlja3kgdsO9em5hbW7DvS4KCmBgYHtyfQojIHRlcmF6IHZ5xaHFoWllIHV2ZWRlbsO9IG9icsOhem9rIGRvcGxuw61tZSBvIHJlZ3Jlc27DuiBwcmlhbWt1CmdncGxvdCh1ZGFqZSwgYWVzKHggPSBZZWFyLCB5ID0gTGlmZV9leHBlY3RhbmN5KSkgKwogIGdlb21fbGluZSgpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UsIGNvbG9yID0gImdyZWVuIikgKwogIGxhYnModGl0bGUgPSAiVsO9dm9qIG/EjWFrw6F2YW5laiBkxLrFvmt5IGRvxb5pdGlhIHYgSmFwb25za3UgKDIwMDAtMjAxNSkgcyByZWdyZXNub3UgcHJpYW1rb3UiLAogICAgICAgeCA9ICJSb2siLAogICAgICAgeSA9ICJPxI1ha8OhdmFuw6EgZMS6xb5rYSBkb8W+aXRpYSIpICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgoKIyMjVsO9dm9qIHNwb3RyZWJ5IGFsa29ob2x1ClRlcmF6IHNhIHBvenJpZW1lLCBha28gc2Egdnl2w71qYSBrb256dW3DoWNpYSBhbGtvaG9sdSB2IMSNYXNlIG9kIHJva3UgMjAwMCBkbyByb2t1IDIwMTUgdiBKYXBvbnNrdS4gTmFrb8S+a28gYWxrb2hvbCBqZSBmYWt0b3JvbSBuZWdhdMOtdm5lIHZwbMO9dmFqw7pjaW0gbmEgZMS6xb5rdSBkb8W+aXRpYS4KCgpgYGB7cn0KbW9kZWxfYWxrb2hvbCA8LSBsbShBbGNvaG9sX2NvbnN1bXB0aW9uIH4gWWVhciwgZGF0YSA9IHVkYWplKQojIGt2YWxpdGEgcmVncmVzaWUKdGlkeShtb2RlbF9hbGtvaG9sKSAlPiUKICBrYWJsZShkaWdpdHMgPSAzLCBjYXB0aW9uID0gIk9kaGFkbnV0w6kga29lZmljaWVudHkgcmVncmVzaWUgcHJlIHNwb3RyZWJ1IGFsa29ob2x1IikgJT4lCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9ICJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IEZBTFNFKQoKIyBhIHRlcmF6IG1vZGVsIHF1YWxpdHkgc3RhdGlzdGljcyBSIHNxdWFyZWQKcjI8LSBzdW1tYXJ5KG1vZGVsX2Fsa29ob2wpJHIuc3F1YXJlCmFkal9yMiA8LXN1bW1hcnkobW9kZWxfYWxrb2hvbCkkYWRqLnIuc3F1YXJlCiNwcmludHVqZW1lIGtvZWZpY2llbnQgZGV0ZXJtaW5hbmNpZSBhIHVwcmF2ZW7DvSBrb2VmaWNpZW50IGRldGVybWluYW5jaWUKY2F0ICgiUi1zcXVhcmVkOiIscm91bmQgKHIyLDMpLCAiXG4iKQpjYXQgKCJBZGp1c3RlZCBSLXNxdWFyZWQ6Iixyb3VuZCAoYWRqX3IyLDMpLCAiXG4iKQpgYGAKVsO9c2xlZGt5IHJlZ3Jlc2llIHVrYXp1asO6LCDFvmUga29lZmljaWVudCBwcmUgcHJlbWVubsO6IHJvayBqZSBwb3ppdMOtdm55LCDEjW8gbmF6bmHEjXVqZSBtaWVybnkgcmFzdCBzcG90cmVieSBhbGtvaG9sdSB2IEphcG9uc2t1IHYgb2Jkb2LDrSByb2tvdiAyMDAwIOKAkyAyMDE1LiBPZGhhZG92YW7DvSBrb2VmaWNpZW50IDAsMDQ5IHpuYW1lbsOhLCDFvmUgc3BvdHJlYmEgYWxrb2hvbHUgc2EgdiBwcmllbWVyZSB6dnnFoW92YWxhIHByaWJsacW+bmUgbyAwLDA0OSBqZWRub3RreSByb8SNbmUuIEhvZG5vdGEgcC12YWx1ZSAoMCwwODQpIHbFoWFrIG5hem5hxI11amUsIMW+ZSB0ZW50byBrb2VmaWNpZW50IG5pZSBqZSDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSBuYSBobGFkaW5lIHbDvXpuYW1ub3N0aSA1ICUsIHByZXRvIG5pZSBqZSBtb8W+bsOpIHMgZG9zdGF0b8SNbm91IGlzdG90b3UgcG90dnJkacWlIGV4aXN0ZW5jaXUgxaF0YXRpc3RpY2t5IHbDvXpuYW1uw6lobyB0cmVuZHUgcmFzdHUgc3BvdHJlYnkgYWxrb2hvbHUgdiBzbGVkb3Zhbm9tIG9iZG9iw60uCgoKI09icsOhem9rIG8gc2t1dG/EjW7DvWNoIHZ5cm92bmFuw71jaCBob2Rub3TDoWNoIHNwb3RyZWJ5IGFsa29ob2x1CiAgICAKYGBge3J9CmZpdHRlZF92YWxzIDwtIGZpdHRlZChtb2RlbF9hbGtvaG9sKQojIHZ5a3Jlc2xlbmllIHNrdXRvxI1uw71jaCBhIHZ5cm92bmFuw71jaCBob2Ruw7R0IC0gQWxjb2hvbF9jb25zdW1wdGlvbiBhIGZpdHRlZF92YWx1ZXMKZ2dwbG90KHVkYWplLCBhZXMoeCA9IFllYXIpKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gQWxjb2hvbF9jb25zdW1wdGlvbiksIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDEpICsKICBnZW9tX2xpbmUoYWVzKHkgPSBmaXR0ZWRfdmFscyksIGNvbG9yID0gIm9yYW5nZSIsIHNpemUgPSAxLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgbGFicyh0aXRsZSA9ICJTa3V0b8SNbsOpIHZzLiBWeXJvdm5hbsOpIGhvZG5vdHkgc3BvdHJlYnkgYWxrb2hvbHUgdiBKYXBvbnNrdSAoMjAwMC0yMDE1KSIsCiAgICAgICB4ID0gIlJvayIsCiAgICAgICB5ID0gIlNwb3RyZWJhIGFsa29ob2x1IikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgbWF4KHVkYWplJEFsY29ob2xfY29uc3VtcHRpb24sIGZpdHRlZF92YWxzKSAqIDEuMSkpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCmBgYApgYGA=