S využitím databázy Global Economic Indicators (2010–2025)- World bank

Pri ďalšej práci budeme používať knižnice

library(zoo)
library(tseries)
library(lmtest)
library(sandwich)
library(car)
rm(list=ls())

1. Úvod a údaje

Údaje o makroekonomických premenných sú usporiadané v súbore csv, stĺpce sú oddelené znakom “;” a používajú desatinnú bodku.

Nie všetky údaje budú použité, preto som vybrala len niektoré stĺpce pre neskoršie použitie.

1.1 Úvod do problému, stanovenie hypotéz

Rozhodla som sa modelovať mieru inflácie Inflation_CPI v závislosti od troch vysvetľujúcich premenných, a to HDP v bežných cenách GDP_Current_USD, príjmy verejnej správy Tax_Revenue a verejný dlh Public_Debt.

Naša pracovná hypotéza hovorí o štatisticky významnom vplyve všetkých troch vysvetľujúcich premenných. Očakávame, že rast HDP bude spojený so znižovaním inflácie (negatívny koeficient), keďže vyšší ekonomický výkon tlmí cenové tlaky. Naopak, rast verejných príjmov môže súvisieť s pozitívnym vplyvom na infláciu (kladný koeficient) v dôsledku fiškálnych politík. Pri premennej Public_Debt predpokladáme pozitívny vplyv na infláciu (kladný koeficient), keďže vyšší dlh môže zvyšovať cenové tlaky a rizikovú prémia krajiny.

1.2 Príprava databázy, úprava údajov

udaje <- read.csv("data.csv",dec=".",sep=";",header = TRUE)
# vyberieme iba relevantné premenné
udajeSK <- udaje[, c("Inflation_CPI", 
                     "GDP_Current_USD", 
                     "Tax_Revenue", 
                     "Public_Debt", 
                     "year")]
# nastavíme rok ako názvy riadkov
rownames(udajeSK) <- udajeSK$year

# zoradíme podľa roku
udajeSK <- udajeSK[order(udajeSK$year), ]

udajeSK
NA

2. Lineárna regresia v základnom tvare

library(ggplot2)

# Lineárna regresia v základnom tvare
model <- lm(Inflation_CPI ~ GDP_Current_USD + Tax_Revenue + Public_Debt, data = udajeSK)
summary(model)

Call:
lm(formula = Inflation_CPI ~ GDP_Current_USD + Tax_Revenue + 
    Public_Debt, data = udajeSK)

Residuals:
    Min      1Q  Median      3Q     Max 
-2.1536 -1.8433 -0.2947  0.4521  4.9545 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)  
(Intercept)     -2.359e+01  9.930e+00  -2.376   0.0415 *
GDP_Current_USD  2.725e-10  9.430e-11   2.890   0.0179 *
Tax_Revenue      8.803e-01  8.310e-01   1.059   0.3170  
Public_Debt     -2.689e-01  1.235e-01  -2.177   0.0574 .
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2.494 on 9 degrees of freedom
Multiple R-squared:  0.5951,    Adjusted R-squared:  0.4601 
F-statistic: 4.409 on 3 and 9 DF,  p-value: 0.03615

Model je štatisticky významný (F-test p = 0.036) a vysvetľuje približne 60 % variability inflácie (R² = 0.595). Jedinou jasne významnou premennou je GDP_Current_USD, ktoré má pozitívny a štatisticky preukázateľný vplyv na infláciu (p = 0.0179). Premenná Public_Debt vykazuje slabú, hraničnú štatistickú významnosť (p ≈ 0.057) a jej odhadovaný účinok je negatívny. Premenná Tax_Revenue nie je štatisticky významná (p = 0.317). Konštanta je významná a negatívna. Model teda naznačuje, že inflácia na Slovensku bola v sledovanom období najviac ovplyvnená vývojom HDP, zatiaľ čo dlh a daňové príjmy zohrávali menšiu alebo nepreukázateľnú úlohu.

3 Autokorelácia rezíduí

V tejto časti sa pozrieme na ďalší dôležitý predpoklad klasického lineárneho regresného modelu – nezávislosť rezíduí. V časových radoch sa často stáva, že chyba v čase \(t\) je systematicky spätá s chybou v čase \(t-1\), čo nazývame autokoreláciou rezíduí.

library(ggplot2)

# add fitted values to the dataframe
udajeSK$fitted <- fitted(model)

# scatterplot + regression line + spline smoother
ggplot(udajeSK, aes(x = year, y = Inflation_CPI)) +
  geom_point(color = "steelblue", size = 2) +
  
  # regression fitted line
  geom_line(aes(y = fitted), color = "red", size = 1) +
  

  labs(
    title = "Inflácia na Slovensku: Empirical Data (blue) vs. Fitted Data (Red)",
    x = "Rok",
    y = "Inflation CPI"
  ) +
  theme_minimal()

Graf ukazuje porovnanie skutočnej inflácie so hodnotami predpovedanými regresným modelom. Model zachytáva základný trend – nízku infláciu v rokoch 2014–2016 a jej postupný nárast po roku 2017, no viditeľne nedokáže presne vystihnúť prudké výkyvy, najmä rýchle zrýchlenie inflácie v rokoch 2021–2022. To naznačuje, že lineárny model vysvetľuje časť variability, ale nezachytáva dynamické šoky a nelineárne zmeny v inflácii.


res <- residuals(model)

ACF graf (Autocorrelation Function)

Táto funkcia priradzuje odhad korelácie, ktorá je medzi jednotlivými rezíduami v aktuálnom období a období posunutom (Lag) o \(k\) období späť.

acf(res, lag.max = 4,main = "Autokorelačná funkcia rezíduí")

Na grafe je modrou prerušovanou čiarou zobrazený 95 % interval spoľahlivosti pre hodnoty autokorelačných koeficientov pri jednotlivých oneskoreniach (lagoch). Pokiaľ odhadnutý koeficient autokorelácie zostáva v rámci týchto hraníc, nepovažujeme ho za štatisticky významný.

Z grafu vidíme, že všetky hodnoty autokorelačných koeficientov pri posune lag ≥ 1 zostávajú v intervale spoľahlivosti. To znamená, že pre tieto oneskorenia neexistujú dôkazy o štatisticky významnej autokorelácii rezíduí.

Celkovo teda môžeme konštatovať, že reziduá modelu nevykazujú významnú autokoreláciu, čo je priaznivý výsledok a podporuje platnosť predpokladu nezávislosti chýb v klasickom lineárnom regresnom modeli.


Durbin–Watsonov test

library(lmtest)
dwtest(model)

    Durbin-Watson test

data:  model
DW = 1.8762, p-value = 0.1606
alternative hypothesis: true autocorrelation is greater than 0

Durbin–Watsonov test skúma, či sú reziduá lineárneho regresného modelu pozitívne autokorelované. Testovacou štatistikou je hodnota DW = 1.8762, ktorá sa nachádza blízko teoretickej hodnoty 2, čo predstavuje stav bez autokorelace.

Hodnota p-value = 0.1606 je vyššia než obvyklé hladiny významnosti (0.05 alebo 0.10). Preto nezamietame nulovú hypotézu o neprítomnosti pozitívnej autokorelácie rezíduí.


Breusch–Godfreyov test (BG test)

Hypotézy

Nulová hypotéza \(H_0\): žiadna sériová korelácia

Alternatívna hypotéza \(H_1\): sériová korelácia prítomná


bgtest(model, order = 1)

    Breusch-Godfrey test for serial correlation of
    order up to 1

data:  model
LM test = 0.86532, df = 1, p-value = 0.3523

Breusch–Godfreyho test bol použitý na overenie prítomnosti sériovej autokorelácie rezíduí prvého rádu. Výsledná hodnota testovacej štatistiky LM = 0.86532 je relatívne nízka a zodpovedá jej aj vysoká p-hodnota na úrovni 0.3523. Keďže p-hodnota výrazne prevyšuje bežnú hladinu významnosti 0.05, nulovú hypotézu o neprítomnosti autokorelácie rezíduí nezamietame. Test teda neposkytuje dôkazy o tom, že by reziduá vykazovali sériovú autokoreláciu. Tento výsledok podporuje platnosť predpokladu nezávislosti chýb v rámci odhadovaného regresného modelu.

Ako riešiť autokoreláciu

Odstraňovanie problému autokorelácie rezíduí

Odhad Koyckovho modelu v R


library(dplyr)

udajeSK <- udajeSK %>%
  arrange(year) %>%
  mutate(
    Inflation_CPI_lag1 = lag(Inflation_CPI)
  )

model_koyck <- lm(Inflation_CPI ~ GDP_Current_USD + Tax_Revenue + Public_Debt +  Inflation_CPI_lag1, 
                  data = udajeSK)

summary(model_koyck)

Call:
lm(formula = Inflation_CPI ~ GDP_Current_USD + Tax_Revenue + 
    Public_Debt + Inflation_CPI_lag1, data = udajeSK)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.6521 -1.2398  0.4219  0.7437  3.5313 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)
(Intercept)        -2.395e+01  1.075e+01  -2.228   0.0611
GDP_Current_USD     1.395e-10  1.179e-10   1.183   0.2755
Tax_Revenue         1.801e+00  9.921e-01   1.815   0.1124
Public_Debt        -3.356e-01  1.224e-01  -2.742   0.0288
Inflation_CPI_lag1  1.143e+00  6.559e-01   1.743   0.1249
                    
(Intercept)        .
GDP_Current_USD     
Tax_Revenue         
Public_Debt        *
Inflation_CPI_lag1  
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2.304 on 7 degrees of freedom
  (1 observation deleted due to missingness)
Multiple R-squared:  0.7256,    Adjusted R-squared:  0.5688 
F-statistic: 4.627 on 4 and 7 DF,  p-value: 0.03831
dwtest(model_koyck)

    Durbin-Watson test

data:  model_koyck
DW = 1.4671, p-value = 0.0415
alternative hypothesis: true autocorrelation is greater than 0

Dynamizovaný model neidentifikuje väčšinu regresorov ako štatisticky významných; výnimkou je len premenná Public_Debt, ktorá zostáva významná na hladine 5 %. Koeficient pri oneskorenej inflácii Inflation_CPI_lag1 je kladný a väčší ako 1, čo naznačuje silný a potenciálne nestabilný zotrvačný efekt inflácie z predchádzajúceho obdobia. Z porovnania Adjusted R-squared vyplýva, že dynamizovaný model má nižšiu vysvetľovaciu schopnosť než pôvodná špecifikácia, a teda neprináša zlepšenie.

Durbin–Watsonov test s hodnotou DW = 1.4671 a p-hodnotou 0.0415 signalizuje štatisticky významnú pozitívnu autokoreláciu rezíduí. Dynamizácia modelu preto neodstránila problém autokorelácie a model ostáva štatisticky nedostatočný.

Newey–West robustné štandardné chyby

library(sandwich)
library(lmtest)

coeftest(model, vcov = NeweyWest(model, lag = 1))
Error in solve.default(diag(ncol(umat)) - apply(var.fit$ar, 2:3, sum)) : 
  system is computationally singular: reciprocal condition number = 4.59827e-24

Chyba vzniká preto, že model je odhadnutý na veľmi krátkom časovom rade a niektoré vysvetľujúce premenné sú silno korelované. V takých podmienkach je Newey–Westova korekcia numericky nestabilná a kovariancia-matrica sa stane singulárnou, takže ju nie je možné invertovať.

Odporúčaný spôsob robustného odhadu pre krátky časový rad

Pre krátky časový rad (10–12 pozorovaní) je Newey–West nevhodný – je numericky nestabilný a často skolabuje, ako v našom prípade. Pre takto malú vzorku sa odporúča použiť heteroskedasticity-consistent (HC) robustné štandardné chyby, najmä:

HC3 – najstabilnejší v malých vzorkách

HC1 – Vo všeobecnosti bezpečný (ako Whiteova korekcia)

library(lmtest)
library(sandwich)

# HC3 robustné štandardné chyby – najlepšie pre malé vzorky
coeftest(model, vcov = vcovHC(model, type = "HC3"))

t test of coefficients:

                   Estimate  Std. Error t value Pr(>|t|)  
(Intercept)     -2.3592e+01  2.2585e+01 -1.0446  0.32346  
GDP_Current_USD  2.7252e-10  1.3541e-10  2.0126  0.07502 .
Tax_Revenue      8.8033e-01  1.5140e+00  0.5815  0.57520  
Public_Debt     -2.6889e-01  2.2292e-01 -1.2063  0.25847  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Robustný odhad ukazuje, že žiadna premenná nie je štatisticky významná na 5 % hladine. Premenná GDP_Current_USD má síce pozitívny koeficient a slabú hraničnú významnosť (p ≈ 0.075), no stále nejde o preukázaný efekt. Tax_Revenue ani Public_Debt nevykazujú významný vplyv na infláciu a ich odhady sú neisté. Intercept je taktiež nevýznamný. Celkovo robustné štandardné chyby naznačujú, že pri malej veľkosti vzorky sú odhady málo presné a model neposkytuje silné dôkazy o vplyve vysvetľujúcich premenných na infláciu.

4. Záver

Modelovanie inflácie na Slovensku ukázalo, že aj keď sa podarilo zachytiť základné trendy vo vývoji inflácie, krátky časový rad a silná korelácia medzi makroekonomickými premennými obmedzili štatistickú presnosť odhadov. Z hlavných vysvetľujúcich premenných mal HDP najsilnejší a pozitívny vzťah k inflácii, avšak tento efekt nebol pri robustnom odhade jednoznačne preukázaný. Verejné príjmy ani verejný dlh sa neukázali ako štatisticky významné determinanty inflácie. Celkovo výsledky naznačujú, že infláciu v sledovanom období ovplyvňovali aj iné faktory mimo rozsahu modelu a že pre spoľahlivejšie závery by bol potrebný dlhší časový rad alebo rozšírený model.

LS0tCnRpdGxlOiAiRWNvbm9tZXRyaWNzIGluIFIgLSBjdmnEjWVuaWUgOSIKb3V0cHV0OiBodG1sX25vdGVib29rCmF1dGhvcjogQmVhdHJpeCBUw7N0aG92w6EgYSBDaGF0R1BUCi0tLQoKUyB2eXXFvml0w61tIGRhdGFiw6F6eSBbR2xvYmFsIEVjb25vbWljIEluZGljYXRvcnMgKDIwMTDigJMyMDI1KS0gV29ybGQgYmFua10oaHR0cHM6Ly93d3cua2FnZ2xlLmNvbS9kYXRhc2V0cy90YW5pc2hrc2hhcm1hOTkwNS9nbG9iYWwtZWNvbm9taWMtaW5kaWNhdG9ycy0yMDEwMjAyNSkKClByaSDEj2FsxaFlaiBwcsOhY2kgYnVkZW1lIHBvdcW+w612YcWlIGtuacW+bmljZQoKYGBge3J9CmxpYnJhcnkoem9vKQpsaWJyYXJ5KHRzZXJpZXMpCmxpYnJhcnkobG10ZXN0KQpsaWJyYXJ5KHNhbmR3aWNoKQpsaWJyYXJ5KGNhcikKcm0obGlzdD1scygpKQpgYGAKCiMjIDEuIMOadm9kIGEgw7pkYWplCgrDmmRhamUgbyBtYWtyb2Vrb25vbWlja8O9Y2ggcHJlbWVubsO9Y2ggc8O6IHVzcG9yaWFkYW7DqSB2IHPDumJvcmUgKmNzdiosIHN0xLpwY2Ugc8O6IG9kZGVsZW7DqSB6bmFrb20gIjsiIGEgcG91xb7DrXZhasO6IGRlc2F0aW5uw7ogYm9ka3UuIAoKTmllIHbFoWV0a3kgw7pkYWplIGJ1ZMO6IHBvdcW+aXTDqSwgcHJldG8gc29tIHZ5YnJhbGEgbGVuIG5pZWt0b3LDqSBzdMS6cGNlIHByZSBuZXNrb3LFoWllIHBvdcW+aXRpZS4KCiMjIyAxLjEgw5p2b2QgZG8gcHJvYmzDqW11LCBzdGFub3ZlbmllIGh5cG90w6l6IAoKUm96aG9kbGEgc29tIHNhIG1vZGVsb3ZhxaUgbWllcnUgaW5mbMOhY2llICpJbmZsYXRpb25fQ1BJKiB2IHrDoXZpc2xvc3RpIG9kIHRyb2NoIHZ5c3ZldMS+dWrDumNpY2ggcHJlbWVubsO9Y2gsIGEgdG8gSERQIHYgYmXFvm7DvWNoIGNlbsOhY2ggKkdEUF9DdXJyZW50X1VTRCosIHByw61qbXkgdmVyZWpuZWogc3Byw6F2eSAqVGF4X1JldmVudWUqIGEgdmVyZWpuw70gZGxoICpQdWJsaWNfRGVidCouCgpOYcWhYSBwcmFjb3Zuw6EgaHlwb3TDqXphIGhvdm9yw60gbyDFoXRhdGlzdGlja3kgdsO9em5hbW5vbSB2cGx5dmUgdsWhZXRrw71jaCB0cm9jaCB2eXN2ZXTEvnVqw7pjaWNoIHByZW1lbm7DvWNoLgpPxI1ha8OhdmFtZSwgxb5lIHJhc3QgSERQIGJ1ZGUgc3BvamVuw70gc28gem5pxb5vdmFuw61tIGluZmzDoWNpZSAobmVnYXTDrXZueSBrb2VmaWNpZW50KSwga2XEj8W+ZSB2ecWhxaHDrSBla29ub21pY2vDvSB2w71rb24gdGxtw60gY2Vub3bDqSB0bGFreS4KTmFvcGFrLCByYXN0IHZlcmVqbsO9Y2ggcHLDrWptb3YgbcO0xb5lIHPDunZpc2llxaUgcyBwb3ppdMOtdm55bSB2cGx5dm9tIG5hIGluZmzDoWNpdSAoa2xhZG7DvSBrb2VmaWNpZW50KSB2IGTDtHNsZWRrdSBmacWha8OhbG55Y2ggcG9saXTDrWsuClByaSBwcmVtZW5uZWogUHVibGljX0RlYnQgcHJlZHBva2xhZMOhbWUgcG96aXTDrXZueSB2cGx5diBuYSBpbmZsw6FjaXUgKGtsYWRuw70ga29lZmljaWVudCksIGtlxI/FvmUgdnnFocWhw60gZGxoIG3DtMW+ZSB6dnnFoW92YcWlIGNlbm92w6kgdGxha3kgYSByaXppa292w7ogcHLDqW1pYSBrcmFqaW55LgoKCiMjIyAxLjIgUHLDrXByYXZhIGRhdGFiw6F6eSwgw7pwcmF2YSDDumRham92CgpgYGB7cn0KdWRhamUgPC0gcmVhZC5jc3YoImRhdGEuY3N2IixkZWM9Ii4iLHNlcD0iOyIsaGVhZGVyID0gVFJVRSkKIyB2eWJlcmllbWUgaWJhIHJlbGV2YW50bsOpIHByZW1lbm7DqQp1ZGFqZVNLIDwtIHVkYWplWywgYygiSW5mbGF0aW9uX0NQSSIsIAogICAgICAgICAgICAgICAgICAgICAiR0RQX0N1cnJlbnRfVVNEIiwgCiAgICAgICAgICAgICAgICAgICAgICJUYXhfUmV2ZW51ZSIsIAogICAgICAgICAgICAgICAgICAgICAiUHVibGljX0RlYnQiLCAKICAgICAgICAgICAgICAgICAgICAgInllYXIiKV0KIyBuYXN0YXbDrW1lIHJvayBha28gbsOhenZ5IHJpYWRrb3YKcm93bmFtZXModWRhamVTSykgPC0gdWRhamVTSyR5ZWFyCgojIHpvcmFkw61tZSBwb2TEvmEgcm9rdQp1ZGFqZVNLIDwtIHVkYWplU0tbb3JkZXIodWRhamVTSyR5ZWFyKSwgXQoKdWRhamVTSwoKYGBgCgoKIyMgMi4gTGluZcOhcm5hIHJlZ3Jlc2lhIHYgesOha2xhZG5vbSB0dmFyZQoKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKCiMgTGluZcOhcm5hIHJlZ3Jlc2lhIHYgesOha2xhZG5vbSB0dmFyZQptb2RlbCA8LSBsbShJbmZsYXRpb25fQ1BJIH4gR0RQX0N1cnJlbnRfVVNEICsgVGF4X1JldmVudWUgKyBQdWJsaWNfRGVidCwgZGF0YSA9IHVkYWplU0spCnN1bW1hcnkobW9kZWwpCmBgYApNb2RlbCBqZSDFoXRhdGlzdGlja3kgdsO9em5hbW55zIEgKEYtdGVzdCBwID0gMC4wMzYpIGEgdnlzdmV0xL51amUgcHJpYmxpxb5uZSA2MCAlIHZhcmlhYmlsaXR5IGluZmzDoWNpZSAoUsKyID0gMC41OTUpLiBKZWRpbm91IGphc25lIHbDvXpuYW1ub3UgcHJlbWVubm91IGplIEdEUF9DdXJyZW50X1VTRCwga3RvcsOpIG3DoSBwb3ppdMOtdm55IGEgxaF0YXRpc3RpY2t5IHByZXVrw6F6YXRlxL5uw70gdnBseXYgbmEgaW5mbMOhY2l1IChwID0gMC4wMTc5KS4gUHJlbWVubsOhIFB1YmxpY19EZWJ0IHZ5a2F6dWplIHNsYWLDuiwgaHJhbmnEjW7DuiDFoXRhdGlzdGlja8O6IHbDvXpuYW1ub3PFpSAocCDiiYggMC4wNTcpIGEgamVqIG9kaGFkb3ZhbsO9IMO6xI1pbm9rIGplIG5lZ2F0w612bnkuIFByZW1lbm7DoSBUYXhfUmV2ZW51ZSBuaWUgamUgxaF0YXRpc3RpY2t5IHbDvXpuYW1uw6EgKHAgPSAwLjMxNykuIEtvbsWhdGFudGEgamUgdsO9em5hbW7DoSBhIG5lZ2F0w612bmEuIE1vZGVsIHRlZGEgbmF6bmHEjXVqZSwgxb5lIGluZmzDoWNpYSBuYSBTbG92ZW5za3UgYm9sYSB2IHNsZWRvdmFub20gb2Jkb2LDrSBuYWp2aWFjIG92cGx5dm5lbsOhIHbDvXZvam9tIEhEUCwgemF0aWHEviDEjW8gZGxoIGEgZGHFiG92w6kgcHLDrWpteSB6b2hyw6F2YWxpIG1lbsWhaXUgYWxlYm8gbmVwcmV1a8OhemF0ZcS+bsO6IMO6bG9odS4KCiMjIDMgQXV0b2tvcmVsw6FjaWEgcmV6w61kdcOtCgpWIHRlanRvIMSNYXN0aSBzYSBwb3pyaWVtZSBuYSDEj2FsxaHDrSBkw7RsZcW+aXTDvSBwcmVkcG9rbGFkIGtsYXNpY2vDqWhvIGxpbmXDoXJuZWhvCnJlZ3Jlc27DqWhvIG1vZGVsdSDigJMgKipuZXrDoXZpc2xvc8WlIHJlesOtZHXDrSoqLiBWIMSNYXNvdsO9Y2ggcmFkb2NoIHNhIMSNYXN0byBzdMOhdmEsCsW+ZSBjaHliYSB2IMSNYXNlIFwodFwpIGplIHN5c3RlbWF0aWNreSBzcMOkdMOhIHMgY2h5Ym91IHYgxI1hc2UgXCh0LTFcKSwgxI1vIG5hesO9dmFtZQoqKmF1dG9rb3JlbMOhY2lvdSByZXrDrWR1w60qKi4KCgpgYGB7cn0KbGlicmFyeShnZ3Bsb3QyKQoKIyBhZGQgZml0dGVkIHZhbHVlcyB0byB0aGUgZGF0YWZyYW1lCnVkYWplU0skZml0dGVkIDwtIGZpdHRlZChtb2RlbCkKCiMgc2NhdHRlcnBsb3QgKyByZWdyZXNzaW9uIGxpbmUgKyBzcGxpbmUgc21vb3RoZXIKZ2dwbG90KHVkYWplU0ssIGFlcyh4ID0geWVhciwgeSA9IEluZmxhdGlvbl9DUEkpKSArCiAgZ2VvbV9wb2ludChjb2xvciA9ICJzdGVlbGJsdWUiLCBzaXplID0gMikgKwogIAogICMgcmVncmVzc2lvbiBmaXR0ZWQgbGluZQogIGdlb21fbGluZShhZXMoeSA9IGZpdHRlZCksIGNvbG9yID0gInJlZCIsIHNpemUgPSAxKSArCiAgCgogIGxhYnMoCiAgICB0aXRsZSA9ICJJbmZsw6FjaWEgbmEgU2xvdmVuc2t1OiBFbXBpcmljYWwgRGF0YSAoYmx1ZSkgdnMuIEZpdHRlZCBEYXRhIChSZWQpIiwKICAgIHggPSAiUm9rIiwKICAgIHkgPSAiSW5mbGF0aW9uIENQSSIKICApICsKICB0aGVtZV9taW5pbWFsKCkKCmBgYAoKR3JhZiB1a2F6dWplIHBvcm92bmFuaWUgc2t1dG/EjW5laiBpbmZsw6FjaWUgc28gaG9kbm90YW1pIHByZWRwb3ZlZGFuw71taSByZWdyZXNuw71tIG1vZGVsb20uIE1vZGVsIHphY2h5dMOhdmEgesOha2xhZG7DvSB0cmVuZCDigJMgbsOtemt1IGluZmzDoWNpdSB2IHJva29jaCAyMDE04oCTMjAxNiBhIGplaiBwb3N0dXBuw70gbsOhcmFzdCBwbyByb2t1IDIwMTcsIG5vIHZpZGl0ZcS+bmUgbmVkb2vDocW+ZSBwcmVzbmUgdnlzdGlobsO6xaUgcHJ1ZGvDqSB2w71reXZ5LCBuYWptw6QgcsO9Y2hsZSB6csO9Y2hsZW5pZSBpbmZsw6FjaWUgdiByb2tvY2ggMjAyMeKAkzIwMjIuIFRvIG5hem5hxI11amUsIMW+ZSBsaW5lw6FybnkgbW9kZWwgdnlzdmV0xL51amUgxI1hc8WlIHZhcmlhYmlsaXR5LCBhbGUgbmV6YWNoeXTDoXZhIGR5bmFtaWNrw6kgxaFva3kgYSBuZWxpbmXDoXJuZSB6bWVueSB2IGluZmzDoWNpaS4KCgpgYGB7cn0KCnJlcyA8LSByZXNpZHVhbHMobW9kZWwpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMjIyBBQ0YgZ3JhZiAoQXV0b2NvcnJlbGF0aW9uIEZ1bmN0aW9uKQoKVMOhdG8gZnVua2NpYSBwcmlyYWR6dWplIG9kaGFkIGtvcmVsw6FjaWUsIGt0b3LDoSBqZSBtZWR6aSBqZWRub3RsaXbDvW1pIHJlesOtZHVhbWkgdiBha3R1w6Fsbm9tIG9iZG9iw60gYSBvYmRvYsOtIHBvc3VudXRvbSAoTGFnKSBvICRrJCBvYmRvYsOtIHNww6TFpS4KCmBgYHtyfQphY2YocmVzLCBsYWcubWF4ID0gNCxtYWluID0gIkF1dG9rb3JlbGHEjW7DoSBmdW5rY2lhIHJlesOtZHXDrSIpCmBgYApOYSBncmFmZSBqZSBtb2Ryb3UgcHJlcnXFoW92YW5vdSDEjWlhcm91IHpvYnJhemVuw70gOTUgJSBpbnRlcnZhbCBzcG/EvmFobGl2b3N0aSBwcmUgaG9kbm90eSBhdXRva29yZWxhxI1uw71jaCBrb2VmaWNpZW50b3YgcHJpIGplZG5vdGxpdsO9Y2ggb25lc2tvcmVuaWFjaCAobGFnb2NoKS4gUG9raWHEviBvZGhhZG51dMO9IGtvZWZpY2llbnQgYXV0b2tvcmVsw6FjaWUgem9zdMOhdmEgdiByw6FtY2kgdMO9Y2h0byBocmFuw61jLCBuZXBvdmHFvnVqZW1lIGhvIHphIMWhdGF0aXN0aWNreSB2w716bmFtbsO9LgoKWiBncmFmdSB2aWTDrW1lLCDFvmUgdsWhZXRreSBob2Rub3R5IGF1dG9rb3JlbGHEjW7DvWNoIGtvZWZpY2llbnRvdiBwcmkgcG9zdW5lIGxhZyDiiaUgMSB6b3N0w6F2YWrDuiB2IGludGVydmFsZSBzcG/EvmFobGl2b3N0aS4gVG8gem5hbWVuw6EsIMW+ZSBwcmUgdGlldG8gb25lc2tvcmVuaWEgbmVleGlzdHVqw7ogZMO0a2F6eSBvIMWhdGF0aXN0aWNreSB2w716bmFtbmVqIGF1dG9rb3JlbMOhY2lpIHJlesOtZHXDrS4KCkNlbGtvdm8gdGVkYSBtw7TFvmVtZSBrb27FoXRhdG92YcWlLCDFvmUgcmV6aWR1w6EgbW9kZWx1IG5ldnlrYXp1asO6IHbDvXpuYW1uw7ogYXV0b2tvcmVsw6FjaXUsIMSNbyBqZSBwcmlhem5pdsO9IHbDvXNsZWRvayBhIHBvZHBvcnVqZSBwbGF0bm9zxaUgcHJlZHBva2xhZHUgbmV6w6F2aXNsb3N0aSBjaMO9YiB2IGtsYXNpY2tvbSBsaW5lw6Fybm9tIHJlZ3Jlc25vbSBtb2RlbGkuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyMjIER1cmJpbuKAk1dhdHNvbm92IHRlc3QKCmBgYHtyfQpsaWJyYXJ5KGxtdGVzdCkKZHd0ZXN0KG1vZGVsKQpgYGAKRHVyYmlu4oCTV2F0c29ub3YgdGVzdCBza8O6bWEsIMSNaSBzw7ogcmV6aWR1w6EgbGluZcOhcm5laG8gcmVncmVzbsOpaG8gbW9kZWx1IHBveml0w612bmUgYXV0b2tvcmVsb3ZhbsOpLgpUZXN0b3ZhY291IMWhdGF0aXN0aWtvdSBqZSBob2Rub3RhIERXID0gMS44NzYyLCBrdG9yw6Egc2EgbmFjaMOhZHphIGJsw616a28gdGVvcmV0aWNrZWogaG9kbm90eSAyLCDEjW8gcHJlZHN0YXZ1amUgc3RhdiBiZXogYXV0b2tvcmVsYWNlLgoKSG9kbm90YSBwLXZhbHVlID0gMC4xNjA2IGplIHZ5xaHFoWlhIG5lxb4gb2J2eWtsw6kgaGxhZGlueSB2w716bmFtbm9zdGkgKDAuMDUgYWxlYm8gMC4xMCkuIFByZXRvIG5lemFtaWV0YW1lIG51bG92w7ogaHlwb3TDqXp1IG8gbmVwcsOtdG9tbm9zdGkgcG96aXTDrXZuZWogYXV0b2tvcmVsw6FjaWUgcmV6w61kdcOtLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMjIyBCcmV1c2No4oCTR29kZnJleW92IHRlc3QgKEJHIHRlc3QpCgojIyMjIyBIeXBvdMOpenkKCioqTnVsb3bDoSBoeXBvdMOpemEgXChIXzBcKTogxb5pYWRuYSBzw6lyaW92w6Ega29yZWzDoWNpYSoqCgoqKkFsdGVybmF0w612bmEgaHlwb3TDqXphIFwoSF8xXCk6IHPDqXJpb3bDoSBrb3JlbMOhY2lhIHByw610b21uw6EqKgoKLS0tCgoKYGBge3J9CmJndGVzdChtb2RlbCwgb3JkZXIgPSAxKQpgYGAKQnJldXNjaOKAk0dvZGZyZXlobyB0ZXN0IGJvbCBwb3XFvml0w70gbmEgb3ZlcmVuaWUgcHLDrXRvbW5vc3RpIHPDqXJpb3ZlaiBhdXRva29yZWzDoWNpZSByZXrDrWR1w60gcHJ2w6lobyByw6FkdS4gVsO9c2xlZG7DoSBob2Rub3RhIHRlc3RvdmFjZWogxaF0YXRpc3Rpa3kgTE0gPSAwLjg2NTMyIGplIHJlbGF0w612bmUgbsOtemthIGEgem9kcG92ZWTDoSBqZWogYWogdnlzb2vDoSBwLWhvZG5vdGEgbmEgw7pyb3ZuaSAwLjM1MjMuIEtlxI/FvmUgcC1ob2Rub3RhIHbDvXJhem5lIHByZXZ5xaF1amUgYmXFvm7DuiBobGFkaW51IHbDvXpuYW1ub3N0aSAwLjA1LCBudWxvdsO6IGh5cG90w6l6dSBvIG5lcHLDrXRvbW5vc3RpIGF1dG9rb3JlbMOhY2llIHJlesOtZHXDrSBuZXphbWlldGFtZS4gVGVzdCB0ZWRhIG5lcG9za3l0dWplIGTDtGthenkgbyB0b20sIMW+ZSBieSByZXppZHXDoSB2eWthem92YWxpIHPDqXJpb3bDuiBhdXRva29yZWzDoWNpdS4gVGVudG8gdsO9c2xlZG9rIHBvZHBvcnVqZSBwbGF0bm9zxaUgcHJlZHBva2xhZHUgbmV6w6F2aXNsb3N0aSBjaMO9YiB2IHLDoW1jaSBvZGhhZG92YW7DqWhvIHJlZ3Jlc27DqWhvIG1vZGVsdS4KCiMjIEFrbyByaWXFoWnFpSBhdXRva29yZWzDoWNpdQoKIyMjIE9kc3RyYcWIb3ZhbmllIHByb2Jsw6ltdSBhdXRva29yZWzDoWNpZSByZXrDrWR1w60KCiMjIyMgT2RoYWQgS295Y2tvdmhvIG1vZGVsdSB2IFIKCmBgYHtyfQoKbGlicmFyeShkcGx5cikKCnVkYWplU0sgPC0gdWRhamVTSyAlPiUKICBhcnJhbmdlKHllYXIpICU+JQogIG11dGF0ZSgKICAgIEluZmxhdGlvbl9DUElfbGFnMSA9IGxhZyhJbmZsYXRpb25fQ1BJKQogICkKCm1vZGVsX2tveWNrIDwtIGxtKEluZmxhdGlvbl9DUEkgfiBHRFBfQ3VycmVudF9VU0QgKyBUYXhfUmV2ZW51ZSArIFB1YmxpY19EZWJ0ICsgIEluZmxhdGlvbl9DUElfbGFnMSwgCiAgICAgICAgICAgICAgICAgIGRhdGEgPSB1ZGFqZVNLKQoKc3VtbWFyeShtb2RlbF9rb3ljaykKCmBgYApgYGB7cn0KZHd0ZXN0KG1vZGVsX2tveWNrKQpgYGAKCkR5bmFtaXpvdmFuw70gbW9kZWwgbmVpZGVudGlmaWt1amUgdsOkxI3FoWludSByZWdyZXNvcm92IGFrbyDFoXRhdGlzdGlja3kgdsO9em5hbW7DvWNoOyB2w71uaW1rb3UgamUgbGVuIHByZW1lbm7DoSBQdWJsaWNfRGVidCwga3RvcsOhIHpvc3TDoXZhIHbDvXpuYW1uw6EgbmEgaGxhZGluZSA1ICUuIEtvZWZpY2llbnQgcHJpIG9uZXNrb3JlbmVqIGluZmzDoWNpaSBJbmZsYXRpb25fQ1BJX2xhZzEgamUga2xhZG7DvSBhIHbDpMSNxaHDrSBha28gMSwgxI1vIG5hem5hxI11amUgc2lsbsO9IGEgcG90ZW5jacOhbG5lIG5lc3RhYmlsbsO9IHpvdHJ2YcSNbsO9IGVmZWt0IGluZmzDoWNpZSB6IHByZWRjaMOhZHphasO6Y2VobyBvYmRvYmlhLiBaIHBvcm92bmFuaWEgQWRqdXN0ZWQgUi1zcXVhcmVkIHZ5cGzDvXZhLCDFvmUgZHluYW1pem92YW7DvSBtb2RlbCBtw6EgbmnFvsWhaXUgdnlzdmV0xL5vdmFjaXUgc2Nob3Bub3PFpSBuZcW+IHDDtHZvZG7DoSDFoXBlY2lmaWvDoWNpYSwgYSB0ZWRhIG5lcHJpbsOhxaFhIHpsZXDFoWVuaWUuCgpEdXJiaW7igJNXYXRzb25vdiB0ZXN0IHMgaG9kbm90b3UgRFcgPSAxLjQ2NzEgYSBwLWhvZG5vdG91IDAuMDQxNSBzaWduYWxpenVqZSDFoXRhdGlzdGlja3kgdsO9em5hbW7DuiBwb3ppdMOtdm51IGF1dG9rb3JlbMOhY2l1IHJlesOtZHXDrS4gRHluYW1pesOhY2lhIG1vZGVsdSBwcmV0byBuZW9kc3Ryw6FuaWxhIHByb2Jsw6ltIGF1dG9rb3JlbMOhY2llIGEgbW9kZWwgb3N0w6F2YSDFoXRhdGlzdGlja3kgbmVkb3N0YXRvxI1uw70uCgoKIyMjIyBOZXdleeKAk1dlc3Qgcm9idXN0bsOpIMWhdGFuZGFyZG7DqSBjaHlieQoKYGBge3J9CmxpYnJhcnkoc2FuZHdpY2gpCmxpYnJhcnkobG10ZXN0KQoKY29lZnRlc3QobW9kZWwsIHZjb3YgPSBOZXdleVdlc3QobW9kZWwsIGxhZyA9IDEpKQpgYGAKQ2h5YmEgdnpuaWvDoSBwcmV0bywgxb5lIG1vZGVsIGplIG9kaGFkbnV0w70gbmEgdmXEvm1pIGtyw6F0a29tIMSNYXNvdm9tIHJhZGUgYSBuaWVrdG9yw6kgdnlzdmV0xL51asO6Y2UgcHJlbWVubsOpIHPDuiBzaWxubyBrb3JlbG92YW7DqS4gViB0YWvDvWNoIHBvZG1pZW5rYWNoIGplIE5ld2V54oCTV2VzdG92YSBrb3Jla2NpYSBudW1lcmlja3kgbmVzdGFiaWxuw6EgYSBrb3ZhcmlhbmNpYS1tYXRyaWNhIHNhIHN0YW5lIHNpbmd1bMOhcm5vdSwgdGFrxb5lIGp1IG5pZSBqZSBtb8W+bsOpIGludmVydG92YcWlLgoKIyMjIyBPZHBvcsO6xI1hbsO9IHNww7Rzb2Igcm9idXN0bsOpaG8gb2RoYWR1IHByZSBrcsOhdGt5IMSNYXNvdsO9IHJhZAoKUHJlIGtyw6F0a3kgxI1hc292w70gcmFkICgxMOKAkzEyIHBvem9yb3ZhbsOtKSBqZSBOZXdleeKAk1dlc3QgbmV2aG9kbsO9IOKAkyBqZSBudW1lcmlja3kgbmVzdGFiaWxuw70gYSDEjWFzdG8gc2tvbGFidWplLCBha28gdiBuYcWhb20gcHLDrXBhZGUuClByZSB0YWt0byBtYWzDuiB2em9ya3Ugc2Egb2Rwb3LDusSNYSBwb3XFvmnFpSBoZXRlcm9za2VkYXN0aWNpdHktY29uc2lzdGVudCAoSEMpIHJvYnVzdG7DqSDFoXRhbmRhcmRuw6kgY2h5YnksIG5ham3DpDoKCkhDMyDigJMgbmFqc3RhYmlsbmVqxaHDrSB2IG1hbMO9Y2ggdnpvcmvDoWNoCgpIQzEg4oCTIFZvIHbFoWVvYmVjbm9zdGkgYmV6cGXEjW7DvSAoYWtvIFdoaXRlb3ZhIGtvcmVrY2lhKQoKYGBge3J9CmxpYnJhcnkobG10ZXN0KQpsaWJyYXJ5KHNhbmR3aWNoKQoKIyBIQzMgcm9idXN0bsOpIMWhdGFuZGFyZG7DqSBjaHlieSDigJMgbmFqbGVwxaFpZSBwcmUgbWFsw6kgdnpvcmt5CmNvZWZ0ZXN0KG1vZGVsLCB2Y292ID0gdmNvdkhDKG1vZGVsLCB0eXBlID0gIkhDMyIpKQpgYGAKUm9idXN0bsO9IG9kaGFkIHVrYXp1amUsIMW+ZSDFvmlhZG5hIHByZW1lbm7DoSBuaWUgamUgxaF0YXRpc3RpY2t5IHbDvXpuYW1uw6EgbmEgNSAlIGhsYWRpbmUuIFByZW1lbm7DoSBHRFBfQ3VycmVudF9VU0QgbcOhIHPDrWNlIHBveml0w612bnkga29lZmljaWVudCBhIHNsYWLDuiBocmFuacSNbsO6IHbDvXpuYW1ub3PFpSAocCDiiYggMC4wNzUpLCBubyBzdMOhbGUgbmVqZGUgbyBwcmV1a8OhemFuw70gZWZla3QuIFRheF9SZXZlbnVlIGFuaSBQdWJsaWNfRGVidCBuZXZ5a2F6dWrDuiB2w716bmFtbsO9IHZwbHl2IG5hIGluZmzDoWNpdSBhIGljaCBvZGhhZHkgc8O6IG5laXN0w6kuIEludGVyY2VwdCBqZSB0YWt0aWXFviBuZXbDvXpuYW1uw70uIENlbGtvdm8gcm9idXN0bsOpIMWhdGFuZGFyZG7DqSBjaHlieSBuYXpuYcSNdWrDuiwgxb5lIHByaSBtYWxlaiB2ZcS+a29zdGkgdnpvcmt5IHPDuiBvZGhhZHkgbcOhbG8gcHJlc27DqSBhIG1vZGVsIG5lcG9za3l0dWplIHNpbG7DqSBkw7RrYXp5IG8gdnBseXZlIHZ5c3ZldMS+dWrDumNpY2ggcHJlbWVubsO9Y2ggbmEgaW5mbMOhY2l1LgoKIyMgNC4gWsOhdmVyCgpNb2RlbG92YW5pZSBpbmZsw6FjaWUgbmEgU2xvdmVuc2t1IHVrw6F6YWxvLCDFvmUgYWoga2XEjyBzYSBwb2RhcmlsbyB6YWNoeXRpxaUgesOha2xhZG7DqSB0cmVuZHkgdm8gdsO9dm9qaSBpbmZsw6FjaWUsIGtyw6F0a3kgxI1hc292w70gcmFkIGEgc2lsbsOhIGtvcmVsw6FjaWEgbWVkemkgbWFrcm9la29ub21pY2vDvW1pIHByZW1lbm7DvW1pIG9ibWVkemlsaSDFoXRhdGlzdGlja8O6IHByZXNub3PFpSBvZGhhZG92LiBaIGhsYXZuw71jaCB2eXN2ZXTEvnVqw7pjaWNoIHByZW1lbm7DvWNoIG1hbCBIRFAgbmFqc2lsbmVqxaHDrSBhIHBveml0w612bnkgdnrFpWFoIGsgaW5mbMOhY2lpLCBhdsWhYWsgdGVudG8gZWZla3QgbmVib2wgcHJpIHJvYnVzdG5vbSBvZGhhZGUgamVkbm96bmHEjW5lIHByZXVrw6F6YW7DvS4gVmVyZWpuw6kgcHLDrWpteSBhbmkgdmVyZWpuw70gZGxoIHNhIG5ldWvDoXphbGkgYWtvIMWhdGF0aXN0aWNreSB2w716bmFtbsOpIGRldGVybWluYW50eSBpbmZsw6FjaWUuIENlbGtvdm8gdsO9c2xlZGt5IG5hem5hxI11asO6LCDFvmUgaW5mbMOhY2l1IHYgc2xlZG92YW5vbSBvYmRvYsOtIG92cGx5dsWIb3ZhbGkgYWogaW7DqSBmYWt0b3J5IG1pbW8gcm96c2FodSBtb2RlbHUgYSDFvmUgcHJlIHNwb8S+YWhsaXZlasWhaWUgesOhdmVyeSBieSBib2wgcG90cmVibsO9IGRsaMWhw60gxI1hc292w70gcmFkIGFsZWJvIHJvesWhw61yZW7DvSBtb2RlbC4K