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

1. Načítanie dát a predspracovanie

eco <- read.csv("economics.csv", stringsAsFactors = FALSE)
eco$date <- as.Date(eco$date)
str(eco)
'data.frame':   574 obs. of  7 variables:
 $ X       : int  1 2 3 4 5 6 7 8 9 10 ...
 $ date    : Date, format: "1967-07-01" "1967-08-01" "1967-09-01" ...
 $ pce     : num  507 510 516 512 517 ...
 $ pop     : num  198712 198911 199113 199311 199498 ...
 $ psavert : num  12.6 12.6 11.9 12.9 12.8 11.8 11.7 12.3 11.7 12.3 ...
 $ uempmed : num  4.5 4.7 4.6 4.9 4.7 4.8 5.1 4.5 4.1 4.6 ...
 $ unemploy: int  2944 2945 2958 3143 3066 3018 2878 3001 2877 2709 ...
summary(eco)
       X              date                 pce               pop            psavert      
 Min.   :  1.0   Min.   :1967-07-01   Min.   :  506.7   Min.   :198712   Min.   : 2.200  
 1st Qu.:144.2   1st Qu.:1979-06-08   1st Qu.: 1578.3   1st Qu.:224896   1st Qu.: 6.400  
 Median :287.5   Median :1991-05-16   Median : 3936.8   Median :253060   Median : 8.400  
 Mean   :287.5   Mean   :1991-05-17   Mean   : 4820.1   Mean   :257160   Mean   : 8.567  
 3rd Qu.:430.8   3rd Qu.:2003-04-23   3rd Qu.: 7626.3   3rd Qu.:290291   3rd Qu.:11.100  
 Max.   :574.0   Max.   :2015-04-01   Max.   :12193.8   Max.   :320402   Max.   :17.300  
    uempmed          unemploy    
 Min.   : 4.000   Min.   : 2685  
 1st Qu.: 6.000   1st Qu.: 6284  
 Median : 7.500   Median : 7494  
 Mean   : 8.609   Mean   : 7771  
 3rd Qu.: 9.100   3rd Qu.: 8686  
 Max.   :25.200   Max.   :15352  
pce_ts <- ts(eco$pce, start = c(as.numeric(format(min(eco$date), "%Y")), as.numeric(format(min(eco$date), "%m"))), frequency = 12)


plot(pce_ts, main = "PCE (Personal Consumption Expenditures) - časová rada", ylab = "pce")

2. Jednoduchá lineárna regresia

Ako príklad odhadnem model, kde závislá premenná je pce a vysvetľujúce premenné sú unemploy (počet nezamestnaných) a psavert (osobná miera úspor):

model <- lm(pce ~ unemploy + psavert, data = eco)
summary(model)

Call:
lm(formula = pce ~ unemploy + psavert, data = eco)

Residuals:
    Min      1Q  Median      3Q     Max 
-4908.2 -1051.0  -307.4   951.0  6577.6 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) 7400.27144  353.89141   20.91   <2e-16 ***
unemploy       0.54969    0.02783   19.75   <2e-16 ***
psavert     -799.79277   24.80336  -32.24   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1674 on 571 degrees of freedom
Multiple R-squared:  0.7794,    Adjusted R-squared:  0.7786 
F-statistic:  1009 on 2 and 571 DF,  p-value: < 2.2e-16
# uložím rezidua
res <- residuals(model)


# graf rezíduí
ts.plot(res, main = "Rezíduá z lineárneho modelu", ylab = "rezíduá")

3. Diagnostika rezíduí — autokorelácia

par(mfrow = c(1,2))
acf(res, main = "ACF rezíduí")
pacf(res, main = "PACF rezíduí")
par(mfrow = c(1,1))

Ljung–Box test

# test na náhodnosť rezíduí (Ljung-Box)
Box.test(res, lag = 12, type = "Ljung-Box")

    Box-Ljung test

data:  res
X-squared = 4038.3, df = 12, p-value < 2.2e-16

Durbin–Watson test (prvá kontrola autokorelácie)

library(lmtest)
dwtest(model)

    Durbin-Watson test

data:  model
DW = 0.12773, p-value < 2.2e-16
alternative hypothesis: true autocorrelation is greater than 0

Breusch–Godfrey test (viacnásobná autokorelácia)

# bgtest z balíka lmtest - test na autokorelaciu rádov 1..p
bgtest(model, order = 12) # testujeme autokoreláciu až do 12 periód

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

data:  model
LM test = 509.81, df = 12, p-value < 2.2e-16

4. Robustné štandardné chyby — Newey–West

library(sandwich)
library(lmtest)
coeftest(model, vcov = NeweyWest(model, lag = 12, prewhite = FALSE))

t test of coefficients:

               Estimate  Std. Error  t value  Pr(>|t|)    
(Intercept) 7400.271439  906.339604   8.1650 2.068e-15 ***
unemploy       0.549694    0.093081   5.9056 6.038e-09 ***
psavert     -799.792766   57.529831 -13.9022 < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

5. Alternatíva: dynamický model (lagy závislej premennej)

# pridám lag 1 z pce
eco$pce_lag1 <- dplyr::lag(eco$pce, 1)
# odstránime prvé NA pozorovanie
eco_dyn <- na.omit(eco[, c("date", "pce", "pce_lag1", "unemploy", "psavert")])


model_dyn <- lm(pce ~ pce_lag1 + unemploy + psavert, data = eco_dyn)
summary(model_dyn)

Call:
lm(formula = pce ~ pce_lag1 + unemploy + psavert, data = eco_dyn)

Residuals:
     Min       1Q   Median       3Q      Max 
-169.204   -7.954    0.067    9.415  159.690 

Coefficients:
              Estimate Std. Error  t value Pr(>|t|)    
(Intercept) 39.8107519  6.8857547    5.782 1.22e-08 ***
pce_lag1     1.0004423  0.0006150 1626.833  < 2e-16 ***
unemploy     0.0003373  0.0005312    0.635    0.526    
psavert     -2.8229677  0.6108563   -4.621 4.72e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 24.56 on 569 degrees of freedom
Multiple R-squared:      1, Adjusted R-squared:      1 
F-statistic: 3.995e+06 on 3 and 569 DF,  p-value: < 2.2e-16
# test autokorelácie rezíduí modelu_dyn
res_dyn <- residuals(model_dyn)
acf(res_dyn, main = "ACF rezíduí - dynamický model")

Box.test(res_dyn, lag = 12, type = "Ljung-Box")

    Box-Ljung test

data:  res_dyn
X-squared = 32.551, df = 12, p-value = 0.001137
dwtest(model_dyn)

    Durbin-Watson test

data:  model_dyn
DW = 2.0407, p-value = 0.6428
alternative hypothesis: true autocorrelation is greater than 0

6. Záver a komentár

V modeli, kde bola závislou premennou spotreba pce a vysvetľujúcimi premennými unemploy a psavert, sme dostali veľmi vysokú štatistickú významnosť oboch koeficientov a relatívne vysoké R² (≈ 0.78). Samotné odhady však nie je možné považovať za spoľahlivé, pretože diagnostika rezíduí jednoznačne odhalila silnú pozitívnu autokoreláciu:

Autokorelácia rezíduí znamená, že OLS odhady síce zostávajú neskreslené, ale ich štandardné chyby sú podhodnotené, čo môže viesť k mylným záverom o štatistickej významnosti koeficientov.

Robustné štandardné chyby – Newey–West

Po aplikácii Newey–West korekcie došlo k výraznému zvýšeniu štandardných chýb pri všetkých koeficientoch, čo je očakávané pri súčasnej autokorelácii aj heteroskedasticite.

  • premenná unemploy zostala štatisticky významná, ale jej t-hodnota sa znížila,
  • premenná psavert zostala vysoko významná,

To znamená, že model je aj po korekcii štatisticky silný, ale pôvodný bol príliš „optimistický“.

Dynamický model

Po pridaní jedného oneskorenia závislej premennej (pce_lag1) sa situácia zásadne zmenila:

  • koeficient pri pce_lag1 ≈ 1.0004 → spotreba je silne autoregresívna,
  • koeficient pri unemploy už nie je štatisticky významný (p = 0.526),
  • psavert zostáva významná, ale jej efekt je menší než v prvom modeli,
  • rezíduá sú dramaticky menšie (štandardná chyba prudko klesla z 1674 → 24.56).

Diagnostika rezíduí dynamického modelu:

  • ACF ukazuje už len mierne korelácie,
  • Ljung–Box test (p = 0.0011) naznačuje slabú autokoreláciu,
  • Durbin–Watson (≈ 2.04, p = 0.64).

To znamená, že dynamický model veľmi dobre odstránil autokoreláciu.

Interpretácia výsledkov

  • Pôvodný statický model bol síce štatisticky významný, ale trpel veľmi silnou autokoreláciou rezíduí, čo spôsobovalo skreslené závery.
  • Newey–West korekcia poskytla realistickejšie štandardné chyby.
  • Dynamický model s oneskorenou premennou pce_lag1:
    • výrazne zlepšil kvalitu modelu,
    • odstránil väčšinu autokorelácie,
    • ukázal, že spotreba má takmer jednotkovú autoregresiu,
    • zmenil významnosť premenných (unemploy prestal byť významný).

Z ekonomického hľadiska to znamená, že minulá spotreba je dominantným prediktorom dnešnej spotreby, čo je typické pre makroekonomické časové rady.

Zhrnutie

Autokorelácia bola v pôvodnom modeli extrémne silná, čo potvrdili všetky testy. Po dynamizácii modelu sa autokorelácia odstránila a nový model poskytuje spoľahlivejšie výsledky. Najlepší a najstabilnejší model je preto dynamický model s pce_lag1.

LS0tCnRpdGxlOiAiQXV0b2tvcmVsw6FjaWEgcmV6w61kdcOtIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKYXV0aG9yOiBCYy4gQWxpY2EgVHZyZMOhCi0tLQoKPHN0eWxlPgovKiBSdcW+b3bDqSBwb3phZGllIHByZSBjZWzDvSBkb2t1bWVudCAqLwpib2R5IHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmU2ZjA7CiAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7CiAgICBsaW5lLWhlaWdodDogMS42Owp9CgovKiBSdcW+b3bDqSBuYWRwaXN5ICovCmgxLCBoMiwgaDMsIGg0IHsKICAgIGNvbG9yOiAjZmY2OWI0Owp9CgovKiBDaXTDoXR5ICovCmJsb2NrcXVvdGUgewogICAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCAjZmY2OWI0OwogICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjBmNTsKICAgIHBhZGRpbmc6IDEwcHggMTVweDsKICAgIG1hcmdpbjogMTBweCAwOwogICAgZm9udC1zdHlsZTogaXRhbGljOwp9CgovKiBadsO9cmF6bmVuaWUga8S+w7rEjW92w71jaCBzbG92ICovCnNwYW4uaGlnaGxpZ2h0IHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmI2YzE7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIHBhZGRpbmc6IDJweCA0cHg7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7Cn0KPC9zdHlsZT4KCmBgYHtyfQpsaWJyYXJ5KHpvbykKbGlicmFyeSh0c2VyaWVzKQpsaWJyYXJ5KGxtdGVzdCkKbGlicmFyeShzYW5kd2ljaCkKbGlicmFyeShjYXIpCnJtKGxpc3Q9bHMoKSkKYGBgCgojIDEuIE5hxI3DrXRhbmllIGTDoXQgYSBwcmVkc3ByYWNvdmFuaWUKCmBgYHtyfQplY28gPC0gcmVhZC5jc3YoImVjb25vbWljcy5jc3YiLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCmVjbyRkYXRlIDwtIGFzLkRhdGUoZWNvJGRhdGUpCnN0cihlY28pCnN1bW1hcnkoZWNvKQoKcGNlX3RzIDwtIHRzKGVjbyRwY2UsIHN0YXJ0ID0gYyhhcy5udW1lcmljKGZvcm1hdChtaW4oZWNvJGRhdGUpLCAiJVkiKSksIGFzLm51bWVyaWMoZm9ybWF0KG1pbihlY28kZGF0ZSksICIlbSIpKSksIGZyZXF1ZW5jeSA9IDEyKQoKCnBsb3QocGNlX3RzLCBtYWluID0gIlBDRSAoUGVyc29uYWwgQ29uc3VtcHRpb24gRXhwZW5kaXR1cmVzKSAtIMSNYXNvdsOhIHJhZGEiLCB5bGFiID0gInBjZSIpCmBgYAojIDIuIEplZG5vZHVjaMOhIGxpbmXDoXJuYSByZWdyZXNpYQoKQWtvIHByw61rbGFkIG9kaGFkbmVtIG1vZGVsLCBrZGUgesOhdmlzbMOhIHByZW1lbm7DoSBqZSBwY2UgYSB2eXN2ZXTEvnVqw7pjZSBwcmVtZW5uw6kgc8O6IHVuZW1wbG95IChwb8SNZXQgbmV6YW1lc3RuYW7DvWNoKSBhIHBzYXZlcnQgKG9zb2Juw6EgbWllcmEgw7pzcG9yKToKCmBgYHtyfQptb2RlbCA8LSBsbShwY2UgfiB1bmVtcGxveSArIHBzYXZlcnQsIGRhdGEgPSBlY28pCnN1bW1hcnkobW9kZWwpCgpyZXMgPC0gcmVzaWR1YWxzKG1vZGVsKQoKdHMucGxvdChyZXMsIG1haW4gPSAiUmV6w61kdcOhIHogbGluZcOhcm5laG8gbW9kZWx1IiwgeWxhYiA9ICJyZXrDrWR1w6EiKQpgYGAKCiMgMy4gRGlhZ25vc3Rpa2EgcmV6w61kdcOtIOKAlCBhdXRva29yZWzDoWNpYQoKYGBge3J9CnBhcihtZnJvdyA9IGMoMSwyKSkKYWNmKHJlcywgbWFpbiA9ICJBQ0YgcmV6w61kdcOtIikKcGFjZihyZXMsIG1haW4gPSAiUEFDRiByZXrDrWR1w60iKQpwYXIobWZyb3cgPSBjKDEsMSkpCmBgYAojIyMgTGp1bmfigJNCb3ggdGVzdAoKYGBge3J9CkJveC50ZXN0KHJlcywgbGFnID0gMTIsIHR5cGUgPSAiTGp1bmctQm94IikKYGBgCgojIyMgRHVyYmlu4oCTV2F0c29uIHRlc3QgKHBydsOhIGtvbnRyb2xhIGF1dG9rb3JlbMOhY2llKQoKYGBge3J9CmxpYnJhcnkobG10ZXN0KQpkd3Rlc3QobW9kZWwpCmBgYAojIyMgQnJldXNjaOKAk0dvZGZyZXkgdGVzdCAodmlhY27DoXNvYm7DoSBhdXRva29yZWzDoWNpYSkKCmBgYHtyfQpiZ3Rlc3QobW9kZWwsIG9yZGVyID0gMTIpICMgdGVzdHVqZW1lIGF1dG9rb3JlbMOhY2l1IGHFviBkbyAxMiBwZXJpw7NkCmBgYAojIDQuIFJvYnVzdG7DqSDFoXRhbmRhcmRuw6kgY2h5Ynkg4oCUIE5ld2V54oCTV2VzdAoKYGBge3J9CmxpYnJhcnkoc2FuZHdpY2gpCmxpYnJhcnkobG10ZXN0KQpjb2VmdGVzdChtb2RlbCwgdmNvdiA9IE5ld2V5V2VzdChtb2RlbCwgbGFnID0gMTIsIHByZXdoaXRlID0gRkFMU0UpKQpgYGAKCiMgNS4gQWx0ZXJuYXTDrXZhOiBkeW5hbWlja8O9IG1vZGVsIChsYWd5IHrDoXZpc2xlaiBwcmVtZW5uZWopCgpgYGB7cn0KZWNvJHBjZV9sYWcxIDwtIGRwbHlyOjpsYWcoZWNvJHBjZSwgMSkKZWNvX2R5biA8LSBuYS5vbWl0KGVjb1ssIGMoImRhdGUiLCAicGNlIiwgInBjZV9sYWcxIiwgInVuZW1wbG95IiwgInBzYXZlcnQiKV0pCgoKbW9kZWxfZHluIDwtIGxtKHBjZSB+IHBjZV9sYWcxICsgdW5lbXBsb3kgKyBwc2F2ZXJ0LCBkYXRhID0gZWNvX2R5bikKc3VtbWFyeShtb2RlbF9keW4pCgoKcmVzX2R5biA8LSByZXNpZHVhbHMobW9kZWxfZHluKQphY2YocmVzX2R5biwgbWFpbiA9ICJBQ0YgcmV6w61kdcOtIC0gZHluYW1pY2vDvSBtb2RlbCIpCkJveC50ZXN0KHJlc19keW4sIGxhZyA9IDEyLCB0eXBlID0gIkxqdW5nLUJveCIpCmR3dGVzdChtb2RlbF9keW4pCmBgYAojIDYuIFrDoXZlciBhIGtvbWVudMOhcgpWIG1vZGVsaSwga2RlIGJvbGEgesOhdmlzbG91IHByZW1lbm5vdSBzcG90cmViYSAqKnBjZSoqIGEgdnlzdmV0xL51asO6Y2ltaSBwcmVtZW5uw71taSAqKnVuZW1wbG95KiogYSAqKnBzYXZlcnQqKiwgc21lIGRvc3RhbGkgdmXEvm1pIHZ5c29rw7ogxaF0YXRpc3RpY2vDuiB2w716bmFtbm9zxaUgb2JvY2gga29lZmljaWVudG92IGEgcmVsYXTDrXZuZSB2eXNva8OpIFLCsiAo4omIIDAuNzgpLiBTYW1vdG7DqSBvZGhhZHkgdsWhYWsgbmllIGplIG1vxb5uw6kgcG92YcW+b3ZhxaUgemEgc3BvxL5haGxpdsOpLCBwcmV0b8W+ZSBkaWFnbm9zdGlrYSByZXrDrWR1w60gamVkbm96bmHEjW5lIG9kaGFsaWxhICoqc2lsbsO6IHBveml0w612bnUgYXV0b2tvcmVsw6FjaXUqKjoKCi0gQUNGIGFqIFBBQ0YgZ3JhZnkgcmV6w61kdcOtIHVrw6F6YWxpIGRsaMO6IHBvbWFsw7ogZGVjYXkgKHR5cGlja8O9IHByZWphdiB0cmVuZG92ZWogxI1hc292ZWogcmFkeSkKLSBManVuZ+KAk0JveCB0ZXN0IChwIDwgMi4yZS0xNikgYXV0b2tvcmVsw6FjaXUgcG90dnJkaWwKLSBEdXJiaW7igJNXYXRzb24gxaF0YXRpc3Rpa2EgKERXID0gMC4xMjc3KSBqZSBleHRyw6ltbmUgdnpkaWFsZW7DoSBvZCAyIOKGkiB2w71yYXpuw6EgcG96aXTDrXZuYSBhdXRva29yZWzDoWNpYQotIEJyZXVzY2jigJNHb2RmcmV5IHRlc3QgcHJlIDEyIHBlcmnDs2QgdGFrdGllxb4gemFtaWV0b2wgbmV6w6F2aXNsb3PFpSByZXrDrWR1w60gKHAgPCAyLjJlLTE2KQoKQXV0b2tvcmVsw6FjaWEgcmV6w61kdcOtIHpuYW1lbsOhLCDFvmUgT0xTIG9kaGFkeSBzw61jZSB6b3N0w6F2YWrDuiBuZXNrcmVzbGVuw6ksIGFsZSBpY2ggxaF0YW5kYXJkbsOpIGNoeWJ5IHPDuiBwb2Rob2Rub3RlbsOpLCDEjW8gbcO0xb5lIHZpZXPFpSBrIG15bG7DvW0gesOhdmVyb20gbyDFoXRhdGlzdGlja2VqIHbDvXpuYW1ub3N0aSBrb2VmaWNpZW50b3YuCgojIyMgUm9idXN0bsOpIMWhdGFuZGFyZG7DqSBjaHlieSDigJMgTmV3ZXnigJNXZXN0CgpQbyBhcGxpa8OhY2lpIE5ld2V54oCTV2VzdCBrb3Jla2NpZSBkb8WhbG8gayB2w71yYXpuw6ltdSB6dsO9xaFlbml1IMWhdGFuZGFyZG7DvWNoIGNow71iIHByaSB2xaFldGvDvWNoIGtvZWZpY2llbnRvY2gsIMSNbyBqZSBvxI1ha8OhdmFuw6kgcHJpIHPDusSNYXNuZWogYXV0b2tvcmVsw6FjaWkgYWogaGV0ZXJvc2tlZGFzdGljaXRlLgoKLSBwcmVtZW5uw6EgKip1bmVtcGxveSoqIHpvc3RhbGEgxaF0YXRpc3RpY2t5IHbDvXpuYW1uw6EsIGFsZSBqZWogdC1ob2Rub3RhIHNhIHpuw63FvmlsYSwKLSBwcmVtZW5uw6EgKipwc2F2ZXJ0Kiogem9zdGFsYSB2eXNva28gdsO9em5hbW7DoSwKClRvIHpuYW1lbsOhLCDFvmUgbW9kZWwgamUgYWogcG8ga29yZWtjaWkgxaF0YXRpc3RpY2t5IHNpbG7DvSwgYWxlIHDDtHZvZG7DvSBib2wgcHLDrWxpxaEg4oCeb3B0aW1pc3RpY2vDveKAnC4KCiMjIyBEeW5hbWlja8O9IG1vZGVsCgpQbyBwcmlkYW7DrSBqZWRuw6lobyBvbmVza29yZW5pYSB6w6F2aXNsZWogcHJlbWVubmVqICgqKnBjZV9sYWcxKiopIHNhIHNpdHXDoWNpYSB6w6FzYWRuZSB6bWVuaWxhOgoKLSBrb2VmaWNpZW50IHByaSBwY2VfbGFnMSDiiYggKioxLjAwMDQqKiDihpIgc3BvdHJlYmEgamUgc2lsbmUgYXV0b3JlZ3Jlc8Otdm5hLAotIGtvZWZpY2llbnQgcHJpIHVuZW1wbG95IHXFviAqKm5pZSBqZSDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSoqIChwID0gMC41MjYpLAotIHBzYXZlcnQgem9zdMOhdmEgdsO9em5hbW7DoSwgYWxlIGplaiBlZmVrdCBqZSBtZW7FocOtIG5lxb4gdiBwcnZvbSBtb2RlbGksCi0gcmV6w61kdcOhIHPDuiBkcmFtYXRpY2t5IG1lbsWhaWUgKMWhdGFuZGFyZG7DoSBjaHliYSBwcnVka28ga2xlc2xhIHogMTY3NCDihpIgMjQuNTYpLgoKIyMjIyBEaWFnbm9zdGlrYSByZXrDrWR1w60gZHluYW1pY2vDqWhvIG1vZGVsdToKLSBBQ0YgdWthenVqZSB1xb4gbGVuIG1pZXJuZSBrb3JlbMOhY2llLAotIExqdW5n4oCTQm94IHRlc3QgKHAgPSAwLjAwMTEpIG5hem5hxI11amUgc2xhYsO6IGF1dG9rb3JlbMOhY2l1LAotIER1cmJpbuKAk1dhdHNvbiAo4omIIDIuMDQsIHAgPSAwLjY0KS4KClRvIHpuYW1lbsOhLCDFvmUgZHluYW1pY2vDvSBtb2RlbCAqKnZlxL5taSBkb2JyZSBvZHN0csOhbmlsIGF1dG9rb3JlbMOhY2l1KiouCgojIyMgSW50ZXJwcmV0w6FjaWEgdsO9c2xlZGtvdgoKLSBQw7R2b2Ruw70gc3RhdGlja8O9IG1vZGVsIGJvbCBzw61jZSDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSwgYWxlIHRycGVsIHZlxL5taSBzaWxub3UgYXV0b2tvcmVsw6FjaW91IHJlesOtZHXDrSwgxI1vIHNww7Rzb2JvdmFsbyBza3Jlc2xlbsOpIHrDoXZlcnkuCi0gTmV3ZXnigJNXZXN0IGtvcmVrY2lhIHBvc2t5dGxhIHJlYWxpc3RpY2tlasWhaWUgxaF0YW5kYXJkbsOpIGNoeWJ5LgotIER5bmFtaWNrw70gbW9kZWwgcyBvbmVza29yZW5vdSBwcmVtZW5ub3UgKipwY2VfbGFnMSoqOgogIC0gdsO9cmF6bmUgemxlcMWhaWwga3ZhbGl0dSBtb2RlbHUsCiAgLSBvZHN0csOhbmlsIHbDpMSNxaFpbnUgYXV0b2tvcmVsw6FjaWUsCiAgLSB1a8OhemFsLCDFvmUgc3BvdHJlYmEgbcOhIHRha21lciBqZWRub3Rrb3bDuiBhdXRvcmVncmVzaXUsCiAgLSB6bWVuaWwgdsO9em5hbW5vc8WlIHByZW1lbm7DvWNoICh1bmVtcGxveSBwcmVzdGFsIGJ5xaUgdsO9em5hbW7DvSkuCgpaIGVrb25vbWlja8OpaG8gaMS+YWRpc2thIHRvIHpuYW1lbsOhLCDFvmUgKiptaW51bMOhIHNwb3RyZWJhIGplIGRvbWluYW50bsO9bSBwcmVkaWt0b3JvbSBkbmXFoW5laiBzcG90cmVieSoqLCDEjW8gamUgdHlwaWNrw6kgcHJlIG1ha3JvZWtvbm9taWNrw6kgxI1hc292w6kgcmFkeS4KCiMjIyBaaHJudXRpZQoKQXV0b2tvcmVsw6FjaWEgYm9sYSB2IHDDtHZvZG5vbSBtb2RlbGkgZXh0csOpbW5lIHNpbG7DoSwgxI1vIHBvdHZyZGlsaSB2xaFldGt5IHRlc3R5LiBQbyBkeW5hbWl6w6FjaWkgbW9kZWx1IHNhIGF1dG9rb3JlbMOhY2lhIG9kc3Ryw6FuaWxhIGEgbm92w70gbW9kZWwgcG9za3l0dWplIHNwb8S+YWhsaXZlasWhaWUgdsO9c2xlZGt5LiBOYWpsZXDFocOtIGEgbmFqc3RhYmlsbmVqxaHDrSBtb2RlbCBqZSBwcmV0byAqKmR5bmFtaWNrw70gbW9kZWwgcyBwY2VfbGFnMSoqLgoK