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