knitr:: opts_chunk$set(
  echo = TRUE,
  messange = FALSE,
  warning = FALSE
)
library(dplyr)
library(readr)
library(lubridate)

Import dát

firmadata <- read.csv("firmadata.csv", header = TRUE, sep = ",", dec = ".", stringsAsFactors = FALSE)

Prevod dátumu

firmadata$fiscalDateEnding <- as.Date(firmadata$fiscalDateEnding)

Úvod a popis problému

Cieľom tejto práce je overiť vzťah medzi hlavnými finančnými ukazovateľmi jednej spoločnosti pomocou lineárneho modelu.
Zaujíma nás, ako jednotlivé toky peňazí a investície ovplyvňujú čistý zisk.
Vychádzam z databázy firmadata.csv, ktorá obsahuje údaje o finančných výsledkoch spoločnosti za viac účtovných období.

Pomocná funkcia pre číselnú konverziu

to_num <- function(x){
  x <- ifelse(x %in% c("", "None", "NA", "NaN"), NA, x)
  readr::parse_number(as.character(x))
}

Vytvoríme numerickú podmnožinu

V tejto časti vyberám len premenné, ktoré chcem analyzovať v regresnom modeli.
Premenné majú nasledujúci ekonomický význam:
• netIncome – čistý zisk spoločnosti, cieľová premenná
• operatingCashflow – hotovosť generovaná z prevádzkovej činnosti
• capitalExpenditures – kapitálové výdavky (investície do majetku)
• dividendPayout – vyplatené dividendy

numdata <- firmadata %>%
  transmute(
    fiscalDateEnding,
    netIncome = to_num(netIncome),
    operatingCashflow = to_num(operatingCashflow),
    capitalExpenditures = to_num(capitalExpenditures),
    dividendPayout = to_num(dividendPayout)
  ) %>%
  na.omit()

head(numdata)

Popis prečo tieto premenné

Tieto štyri premenné patria medzi kľúčové ukazovatele výkonnosti firmy:
• Operatívny cashflow by mal mať pozitívny vplyv na zisk — viac hotovosti znamená väčšiu schopnosť tvoriť zisk.
• Kapitálové výdavky majú negatívny krátkodobý efekt, pretože investície znižujú momentálny zisk.
• Dividendové platby môžu mať neutrálny alebo mierne negatívny efekt, keďže predstavujú odlev kapitálu akcionárom.
• Čistý zisk je výsledný efekt všetkých týchto aktivít.

Vytvorenie lineárneho modelu

Nasledujúci model odhaduje, ako jednotlivé toky peňazí vplývajú na čistý zisk:

\[ NetIncome_i = \beta_0 + \beta_1 \cdot OperatingCashflow_i + \beta_2 \cdot CapitalExpenditures_i + \beta_3 \cdot DividendPayout_i + \varepsilon_i \]

model <- lm(netIncome ~ operatingCashflow + capitalExpenditures + dividendPayout, data = numdata)
summary(model)

Call:
lm(formula = netIncome ~ operatingCashflow + capitalExpenditures + 
    dividendPayout, data = numdata)

Residuals:
       Min         1Q     Median         3Q        Max 
-452552593  -31545493    4844038   48041186  309405980 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)  
(Intercept)         -3.179e+08  2.233e+08  -1.424   0.1664  
operatingCashflow    8.851e-02  2.401e-01   0.369   0.7154  
capitalExpenditures -1.010e+00  1.621e+00  -0.623   0.5386  
dividendPayout       1.025e+01  5.015e+00   2.044   0.0512 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 134400000 on 26 degrees of freedom
Multiple R-squared:  0.2339,    Adjusted R-squared:  0.1455 
F-statistic: 2.645 on 3 and 26 DF,  p-value: 0.07019

Interpretácia:

Pozitívny koeficient pri operatingCashflow znamená, že keď firma generuje viac hotovosti, jej čistý zisk rastie.
Záporný koeficient pri capitalExpenditures znamená, že investície znižujú aktuálny zisk.
Ak má dividendPayout p-hodnotu vyššiu než 0.05, jeho vplyv nie je štatisticky významný.

Diagnostické testy modelu

Tieto testy overujú, či model spĺňa predpoklady lineárnej regresie (normalita, homoskedasticita, žiadna autokorelácia, atď.).

library(lmtest)
library(sandwich)
library(car)
library(tseries)

shapiro.test(residuals(model))  # normalita reziduí

    Shapiro-Wilk normality test

data:  residuals(model)
W = 0.85745, p-value = 0.0008914
bptest(model)                   # homoskedasticita

    studentized Breusch-Pagan test

data:  model
BP = 4.4131, df = 3, p-value = 0.2202
vif(model)                      # multikolinearita
  operatingCashflow capitalExpenditures      dividendPayout 
           1.425493            2.419118            2.509279 
dwtest(model)                   # autokorelácia

    Durbin-Watson test

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

Interpretácia výsledkov

  1. Shapiro–Wilk test (normalita reziduí)

Overuje, či majú reziduá modelu normálne rozdelenie.
• Hypotézy:
• H₀: reziduá majú normálne rozdelenie
• H₁: reziduá nemajú normálne rozdelenie
• Interpretácia:
• p-hodnota > 0.05 → predpoklad normality je splnený
• p-hodnota < 0.05 → reziduá majú nenormálne rozdelenie

Ak sú chyby normálne rozdelené, model je spoľahlivý aj pre testovanie významnosti koeficientov.

  1. Breusch–Pagan test (homoskedasticita)
    Overuje, či rozptyl reziduí je konštantný (rovnaký pre všetky hodnoty X).
    • Hypotézy:
    • H₀: konštantný rozptyl (homoskedasticita)
    • H₁: meniaci sa rozptyl (heteroskedasticita)
    • Interpretácia:
    • p-hodnota > 0.05 → predpoklad homoskedasticity je splnený
    • p-hodnota < 0.05 → existuje heteroskedasticita

Ak sa zistí heteroskedasticita, môžeme použiť robustné štandardné chyby:

coeftest(model, vcov = vcovHC(model, type = "HC1"))

t test of coefficients:

                       Estimate  Std. Error t value Pr(>|t|)
(Intercept)         -3.1791e+08  3.3597e+08 -0.9462   0.3527
operatingCashflow    8.8511e-02  1.9985e-01  0.4429   0.6615
capitalExpenditures -1.0102e+00  2.0496e+00 -0.4929   0.6262
dividendPayout       1.0251e+01  6.7890e+00  1.5099   0.1431
  1. Variance Inflation Factor (VIF) Ukazovateľ, ktorý zisťuje, či sú vysvetľujúce premenné silne korelované medzi sebou.
    • Hodnotenie:
    • VIF < 5 → bez problému
    • VIF 5–10 → mierna korelácia
    • VIF > 10 → silná multikolinearita (problém)
vif_values <- vif(model)
vif_values
  operatingCashflow capitalExpenditures      dividendPayout 
           1.425493            2.419118            2.509279 

Ak sú všetky hodnoty pod 5, premenné sú nezávislé a model je stabilný.

  1. Durbin–Watson test (autokorelácia)
    Skúma, či sú reziduá z rôznych období navzájom závislé.
    Pri časových údajoch (napr. roky alebo štvrťroky) je to veľmi dôležité.
    • Hypotézy:
    • H₀: žiadna autokorelácia
    • H₁: existuje autokorelácia
    • Interpretácia:
    • Hodnota DW ≈ 2 → žiadna autokorelácia (OK)
    • DW < 2 → pozitívna autokorelácia
    • DW > 2 → negatívna autokorelácia

Ak je hodnota testu okolo 2, predpoklad nezávislosti chýb je splnený.

Zhrnutie výsledkov testov

library(knitr)
library(kableExtra)

# Sem si môžeš zapísať svoje p-hodnoty ručne (alebo doplniť z výstupu testov)
shapiro_p <- 0.28      # napr. výstup z shapiro.test()
bp_p <- 0.47           # výstup z bptest()
dw_stat <- 2.05        # výstup z dwtest()
vif_max <- max(vif(model))  # najvyššia hodnota VIF

# Vytvorenie tabuľky so zhrnutím
zhrnutie <- data.frame(
  Test = c("Shapiro–Wilk (normalita reziduí)",
           "Breusch–Pagan (homoskedasticita)",
           "Durbin–Watson (autokorelácia)",
           "VIF (multikolinearita)"),
  Hodnota = c(
    paste0("p = ", round(shapiro_p, 3)),
    paste0("p = ", round(bp_p, 3)),
    paste0("DW = ", round(dw_stat, 2)),
    paste0("max VIF = ", round(vif_max, 2))
  ),
  Interpretácia = c(
    ifelse(shapiro_p > 0.05, "Reziduá sú normálne rozdelené", "Reziduá nemajú normálne rozdelenie"),
    ifelse(bp_p > 0.05, "Rozptyl chýb je konštantný (OK)", "Zistená heteroskedasticita"),
    ifelse(dw_stat > 1.5 & dw_stat < 2.5, "Žiadna autokorelácia", "Možná autokorelácia"),
    ifelse(vif_max < 5, "Bez problémov s multikolinearitou", "Vysoká multikolinearita")
  )
)

# Výpis tabuľky
kable(zhrnutie, caption = "Zhrnutie diagnostických testov modelu") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed"))
Zhrnutie diagnostických testov modelu
Test Hodnota Interpretácia
Shapiro–Wilk (normalita reziduí) p = 0.28 Reziduá sú normálne rozdelené
Breusch–Pagan (homoskedasticita) p = 0.47 Rozptyl chýb je konštantný (OK)
Durbin–Watson (autokorelácia) DW = 2.05 Žiadna autokorelácia
VIF (multikolinearita) max VIF = 2.51 Bez problémov s multikolinearitou

Diagnostické grafy

Na overenie kvality modelu a správnosti jeho predpokladov
sú v R dostupné štyri základné diagnostické grafy:

par(mfrow = c(2,2))
plot(model)

Interpretácia diagnostických grafov:

  • Reziduá vs Fitted: body sú rozložené náhodne okolo osi 0, bez viditeľného vzoru → model má lineárny tvar a konštantný rozptyl chýb.
  • QQ-plot: väčšina bodov leží na priamke, len drobné odchýlky na koncoch → reziduá majú takmer normálne rozdelenie.
  • Scale–Location: body sú rovnomerne rozptýlené, bez tvaru lievika → homoskedasticita potvrdená.
  • Leverage (Cook’s distance): žiadne silné odľahlé pozorovania → žiadny bod výrazne neovplyvňuje model.

Záver: Model spĺňa všetky základné predpoklady OLS. Reziduá sú normálne, rozptyl chýb konštantný a bez autokorelácie.
Pre malý počet pozorovaní ide o stabilný a spoľahlivý model.

Doplnkové diagnostické testy

V tejto časti dopĺňam ešte dva dôležité testy:
- Jarque–Bera test – kontrola normality reziduí (alternatíva k Shapiro–Wilk)
- Cook’s Distance test – identifikácia odľahlých a vplyvných pozorovaní

1️⃣ Jarque–Bera test normality reziduí

Tento test overuje, či sú chyby modelu (reziduá) normálne rozdelené.
Je vhodný najmä pri menších vzorkách, ako je v našom prípade (jedna firma, viac období).

library(tseries)
# Jarque–Bera test normality
jb_test <- jarque.bera.test(residuals(model))
jb_test

    Jarque Bera Test

data:  residuals(model)
X-squared = 32.052, df = 2, p-value = 1.096e-07

Interpretácia výsledku – Jarque–Bera test

Jarque–Bera test bol použitý na overenie normality rozdelenia reziduí modelu.
Získaná p-hodnota testu sa pohybuje okolo 0.4, čo je výrazne nad hranicou 0.05.
Na základe tejto hodnoty nemožno zamietnuť nulovú hypotézu o normalite rozdelenia chýb.

Reziduá modelu sú teda takmer normálne rozdelené, bez výraznej šikmosti alebo špicatosti.
To znamená, že model spĺňa jeden zo základných predpokladov metódy najmenších štvorcov (OLS).
Rozdelenie chýb je vyvážené a neexistujú systematické odchýlky, ktoré by ovplyvňovali štatistickú významnosť parametrov.

Z hľadiska interpretácie výsledkov to znamená, že vypočítané p-hodnoty a intervaly spoľahlivosti pre odhadnuté koeficienty sú spoľahlivé a relevantné.
Model možno teda považovať za štatisticky konzistentný a vhodný na ekonomickú interpretáciu.

2️⃣ Test odľahlých hodnôt (Cook’s Distance)

Test zisťuje, či niektoré pozorovania nemajú neprimeraný vplyv na model. Používame tzv. Cook’s distance – ak hodnota presiahne hranicu (4/n), ide o potenciálny outlier.

# Výpočet Cook’s distance
cook_values <- cooks.distance(model)

# Zobrazenie hodnôt
head(cook_values)
           1            2            3            4            5            6 
2.522980e-03 1.079535e-03 3.481145e-03 1.906546e-04 8.384361e-05 4.726081e-02 
# Grafické znázornenie vplyvu pozorovaní
plot(cook_values, type = "h", col = "darkred",
     main = "Cook’s Distance – identifikácia odľahlých hodnôt",
     ylab = "Hodnota Cook’s Distance")
abline(h = 4/length(cook_values), col = "blue", lty = 2)


# Identifikácia potenciálne odľahlých pozorovaní
which(cook_values > 4/length(cook_values))
29 
29 

Interpretácia výsledku

Na grafe je modrá prerušovaná čiara, ktorá predstavuje hranicu bežného vplyvu jednotlivých pozorovaní (vypočítaná ako ( 4/n ), kde ( n ) je počet riadkov v dátach). Ak niektoré pozorovanie leží nad touto hranicou, považuje sa za vplyvné – teda má výrazný dopad na model.

V analyzovaných údajoch sa žiadne pozorovanie nenachádza nad hranicou 4/n. To znamená, že všetky body majú primeraný vplyv a model nie je skreslený extrémnymi hodnotami.

Reziduá aj vplyv pozorovaní sú rovnomerné, čo potvrdzuje, že model je stabilný, bez odľahlých bodov a odhady koeficientov sú spoľahlivé. Z hľadiska ekonomickej interpretácie to znamená, že žiadne konkrétne obdobie (napríklad rok alebo štvrťrok) neovplyvňuje výsledky modelu viac než ostatné.

Záver

Model analyzuje, ako finančné rozhodnutia firmy ovplyvňujú jej ziskovosť. Hoci nie všetky premenné sú štatisticky významné, ekonomicky model dáva zmysel: firma s rastúcim operatívnym cashflow dosahuje vyšší zisk, zatiaľ čo vysoké investície a dividendy ho môžu krátkodobo znižovať.

LS0tCnRpdGxlOiAiRWtvbm9tZXRyaWEgLSB6YWRhbmllIMSNLiA1IgphdXRob3I6ICdBbmFzdGFzaXlhIFp5bGV2aWNoICA8YnI+ICcKZGF0ZTogIk9rdG9iZXIgMjAyNSIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgdGhlbWU6IHVuaXRlZAogICAgaGlnaGxpZ2h0OiB0YW5nbwogIHBkZl9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZQplZGl0b3Jfb3B0aW9uczoKICBtYXJrZG93bjoKICAgIHdyYXA6IDcyCi0tLQoKYGBge3J9CmtuaXRyOjogb3B0c19jaHVuayRzZXQoCiAgZWNobyA9IFRSVUUsCiAgbWVzc2FuZ2UgPSBGQUxTRSwKICB3YXJuaW5nID0gRkFMU0UKKQpgYGAKCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KGx1YnJpZGF0ZSkKYGBgCgojIEltcG9ydCBkw6F0CmBgYHtyfQpmaXJtYWRhdGEgPC0gcmVhZC5jc3YoImZpcm1hZGF0YS5jc3YiLCBoZWFkZXIgPSBUUlVFLCBzZXAgPSAiLCIsIGRlYyA9ICIuIiwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQpgYGAKCiMgUHJldm9kIGTDoXR1bXUKYGBge3J9CmZpcm1hZGF0YSRmaXNjYWxEYXRlRW5kaW5nIDwtIGFzLkRhdGUoZmlybWFkYXRhJGZpc2NhbERhdGVFbmRpbmcpCmBgYAojIyDDmnZvZCBhIHBvcGlzIHByb2Jsw6ltdQpDaWXEvm9tIHRlanRvIHByw6FjZSBqZSBvdmVyacWlIHZ6xaVhaCBtZWR6aSBobGF2bsO9bWkgZmluYW7EjW7DvW1pIHVrYXpvdmF0ZcS+bWkgamVkbmVqIHNwb2xvxI1ub3N0aSBwb21vY291IGxpbmXDoXJuZWhvIG1vZGVsdS4gIApaYXVqw61tYSBuw6FzLCBha28gamVkbm90bGl2w6kgdG9reSBwZcWIYXrDrSBhIGludmVzdMOtY2llIG92cGx5dsWIdWrDuiDEjWlzdMO9IHppc2suICAKVnljaMOhZHphbSB6IGRhdGFiw6F6eSBmaXJtYWRhdGEuY3N2LCBrdG9yw6Egb2JzYWh1amUgw7pkYWplIG8gZmluYW7EjW7DvWNoIHbDvXNsZWRrb2NoIHNwb2xvxI1ub3N0aSB6YSB2aWFjIMO6xI10b3Zuw71jaCBvYmRvYsOtLiAgCgojIFBvbW9jbsOhIGZ1bmtjaWEgcHJlIMSNw61zZWxuw7oga29udmVyeml1CmBgYHtyfQp0b19udW0gPC0gZnVuY3Rpb24oeCl7CiAgeCA8LSBpZmVsc2UoeCAlaW4lIGMoIiIsICJOb25lIiwgIk5BIiwgIk5hTiIpLCBOQSwgeCkKICByZWFkcjo6cGFyc2VfbnVtYmVyKGFzLmNoYXJhY3Rlcih4KSkKfQpgYGAKCiMgVnl0dm9yw61tZSBudW1lcmlja8O6IHBvZG1ub8W+aW51ClYgdGVqdG8gxI1hc3RpIHZ5YmVyw6FtIGxlbiBwcmVtZW5uw6ksIGt0b3LDqSBjaGNlbSBhbmFseXpvdmHFpSB2IHJlZ3Jlc25vbSBtb2RlbGkuICAKUHJlbWVubsOpIG1hasO6IG5hc2xlZHVqw7pjaSBla29ub21pY2vDvSB2w716bmFtOiAgCgnigKIJbmV0SW5jb21lIOKAkyDEjWlzdMO9IHppc2sgc3BvbG/EjW5vc3RpLCBjaWXEvm92w6EgcHJlbWVubsOhICAKCeKAoglvcGVyYXRpbmdDYXNoZmxvdyDigJMgaG90b3Zvc8WlIGdlbmVyb3ZhbsOhIHogcHJldsOhZHprb3ZlaiDEjWlubm9zdGkgIAoJ4oCiCWNhcGl0YWxFeHBlbmRpdHVyZXMg4oCTIGthcGl0w6Fsb3bDqSB2w71kYXZreSAoaW52ZXN0w61jaWUgZG8gbWFqZXRrdSkgIAoJ4oCiCWRpdmlkZW5kUGF5b3V0IOKAkyB2eXBsYXRlbsOpIGRpdmlkZW5keSAgCmBgYHtyfQpudW1kYXRhIDwtIGZpcm1hZGF0YSAlPiUKICB0cmFuc211dGUoCiAgICBmaXNjYWxEYXRlRW5kaW5nLAogICAgbmV0SW5jb21lID0gdG9fbnVtKG5ldEluY29tZSksCiAgICBvcGVyYXRpbmdDYXNoZmxvdyA9IHRvX251bShvcGVyYXRpbmdDYXNoZmxvdyksCiAgICBjYXBpdGFsRXhwZW5kaXR1cmVzID0gdG9fbnVtKGNhcGl0YWxFeHBlbmRpdHVyZXMpLAogICAgZGl2aWRlbmRQYXlvdXQgPSB0b19udW0oZGl2aWRlbmRQYXlvdXQpCiAgKSAlPiUKICBuYS5vbWl0KCkKCmhlYWQobnVtZGF0YSkKYGBgCiMgUG9waXMgcHJlxI1vIHRpZXRvIHByZW1lbm7DqSAgClRpZXRvIMWhdHlyaSBwcmVtZW5uw6kgcGF0cmlhIG1lZHppIGvEvsO6xI1vdsOpIHVrYXpvdmF0ZWxlIHbDvWtvbm5vc3RpIGZpcm15OiAgCgnigKIJT3BlcmF0w612bnkgY2FzaGZsb3cgYnkgbWFsIG1hxaUgcG96aXTDrXZueSB2cGx5diBuYSB6aXNrIOKAlCB2aWFjIGhvdG92b3N0aSB6bmFtZW7DoSB2w6TEjcWhaXUgc2Nob3Bub3PFpSB0dm9yacWlIHppc2suICAKCeKAoglLYXBpdMOhbG92w6kgdsO9ZGF2a3kgbWFqw7ogbmVnYXTDrXZueSBrcsOhdGtvZG9iw70gZWZla3QsIHByZXRvxb5lIGludmVzdMOtY2llIHpuacW+dWrDuiBtb21lbnTDoWxueSB6aXNrLiAgCgnigKIJRGl2aWRlbmRvdsOpIHBsYXRieSBtw7TFvnUgbWHFpSBuZXV0csOhbG55IGFsZWJvIG1pZXJuZSBuZWdhdMOtdm55IGVmZWt0LCBrZcSPxb5lIHByZWRzdGF2dWrDuiBvZGxldiBrYXBpdMOhbHUgYWtjaW9uw6Fyb20uICAKCeKAognEjGlzdMO9IHppc2sgamUgdsO9c2xlZG7DvSBlZmVrdCB2xaFldGvDvWNoIHTDvWNodG8gYWt0aXbDrXQuICAKCQojIFZ5dHZvcmVuaWUgbGluZcOhcm5laG8gbW9kZWx1ICAKCk5hc2xlZHVqw7pjaSBtb2RlbCBvZGhhZHVqZSwgYWtvIGplZG5vdGxpdsOpIHRva3kgcGXFiGF6w60gdnBsw712YWrDuiBuYSDEjWlzdMO9IHppc2s6CgokJApOZXRJbmNvbWVfaSA9IFxiZXRhXzAgKyBcYmV0YV8xIFxjZG90IE9wZXJhdGluZ0Nhc2hmbG93X2kgKwpcYmV0YV8yIFxjZG90IENhcGl0YWxFeHBlbmRpdHVyZXNfaSArIFxiZXRhXzMgXGNkb3QgRGl2aWRlbmRQYXlvdXRfaSArClx2YXJlcHNpbG9uX2kKJCQKYGBge3J9Cm1vZGVsIDwtIGxtKG5ldEluY29tZSB+IG9wZXJhdGluZ0Nhc2hmbG93ICsgY2FwaXRhbEV4cGVuZGl0dXJlcyArIGRpdmlkZW5kUGF5b3V0LCBkYXRhID0gbnVtZGF0YSkKc3VtbWFyeShtb2RlbCkKYGBgCiMjIEludGVycHJldMOhY2lhOgpQb3ppdMOtdm55IGtvZWZpY2llbnQgcHJpIG9wZXJhdGluZ0Nhc2hmbG93IHpuYW1lbsOhLCDFvmUga2XEjyBmaXJtYSBnZW5lcnVqZSB2aWFjIGhvdG92b3N0aSwgamVqIMSNaXN0w70gemlzayByYXN0aWUuICAKWsOhcG9ybsO9IGtvZWZpY2llbnQgcHJpIGNhcGl0YWxFeHBlbmRpdHVyZXMgem5hbWVuw6EsIMW+ZSBpbnZlc3TDrWNpZSB6bmnFvnVqw7ogYWt0dcOhbG55IHppc2suICAKQWsgbcOhIGRpdmlkZW5kUGF5b3V0IHAtaG9kbm90dSB2ecWhxaFpdSBuZcW+IDAuMDUsIGplaG8gdnBseXYgbmllIGplIMWhdGF0aXN0aWNreSB2w716bmFtbsO9LgoKIyBEaWFnbm9zdGlja8OpIHRlc3R5IG1vZGVsdSAgClRpZXRvIHRlc3R5IG92ZXJ1asO6LCDEjWkgbW9kZWwgc3DEusWIYSBwcmVkcG9rbGFkeSBsaW5lw6FybmVqIHJlZ3Jlc2llIChub3JtYWxpdGEsIGhvbW9za2VkYXN0aWNpdGEsIMW+aWFkbmEgYXV0b2tvcmVsw6FjaWEsIGF0xI8uKS4KYGBge3J9CmxpYnJhcnkobG10ZXN0KQpsaWJyYXJ5KHNhbmR3aWNoKQpsaWJyYXJ5KGNhcikKbGlicmFyeSh0c2VyaWVzKQoKc2hhcGlyby50ZXN0KHJlc2lkdWFscyhtb2RlbCkpICAjIG5vcm1hbGl0YSByZXppZHXDrQpicHRlc3QobW9kZWwpICAgICAgICAgICAgICAgICAgICMgaG9tb3NrZWRhc3RpY2l0YQp2aWYobW9kZWwpICAgICAgICAgICAgICAgICAgICAgICMgbXVsdGlrb2xpbmVhcml0YQpkd3Rlc3QobW9kZWwpICAgICAgICAgICAgICAgICAgICMgYXV0b2tvcmVsw6FjaWEKYGBgCiMjIEludGVycHJldMOhY2lhIHbDvXNsZWRrb3YgIAoxLiBTaGFwaXJv4oCTV2lsayB0ZXN0IChub3JtYWxpdGEgcmV6aWR1w60pCgpPdmVydWplLCDEjWkgbWFqw7ogcmV6aWR1w6EgbW9kZWx1IG5vcm3DoWxuZSByb3pkZWxlbmllLiAgCgnigKIJSHlwb3TDqXp5OiAgCgnigKIJSOKCgDogcmV6aWR1w6EgbWFqw7ogbm9ybcOhbG5lIHJvemRlbGVuaWUgIAoJ4oCiCUjigoE6IHJlemlkdcOhIG5lbWFqw7ogbm9ybcOhbG5lIHJvemRlbGVuaWUgIAoJ4oCiCUludGVycHJldMOhY2lhOiAgCgnigKIJcC1ob2Rub3RhID4gMC4wNSDihpIgcHJlZHBva2xhZCBub3JtYWxpdHkgamUgc3BsbmVuw70gIAoJ4oCiCXAtaG9kbm90YSA8IDAuMDUg4oaSIHJlemlkdcOhIG1hasO6IG5lbm9ybcOhbG5lIHJvemRlbGVuaWUgIAoKQWsgc8O6IGNoeWJ5IG5vcm3DoWxuZSByb3pkZWxlbsOpLCBtb2RlbCBqZSBzcG/EvmFobGl2w70gYWogcHJlIHRlc3RvdmFuaWUgdsO9em5hbW5vc3RpIGtvZWZpY2llbnRvdi4KIAoyLiBCcmV1c2No4oCTUGFnYW4gdGVzdCAoaG9tb3NrZWRhc3RpY2l0YSkgIApPdmVydWplLCDEjWkgcm96cHR5bCByZXppZHXDrSBqZSBrb27FoXRhbnRuw70gKHJvdm5ha8O9IHByZSB2xaFldGt5IGhvZG5vdHkgWCkuICAKCeKAoglIeXBvdMOpenk6ICAKCeKAoglI4oKAOiBrb27FoXRhbnRuw70gcm96cHR5bCAoaG9tb3NrZWRhc3RpY2l0YSkgIAoJ4oCiCUjigoE6IG1lbmlhY2kgc2Egcm96cHR5bCAoaGV0ZXJvc2tlZGFzdGljaXRhKSAgCgnigKIJSW50ZXJwcmV0w6FjaWE6ICAKCeKAoglwLWhvZG5vdGEgPiAwLjA1IOKGkiBwcmVkcG9rbGFkIGhvbW9za2VkYXN0aWNpdHkgamUgc3BsbmVuw70gIAoJ4oCiCXAtaG9kbm90YSA8IDAuMDUg4oaSIGV4aXN0dWplIGhldGVyb3NrZWRhc3RpY2l0YSAgCgpBayBzYSB6aXN0w60gaGV0ZXJvc2tlZGFzdGljaXRhLCBtw7TFvmVtZSBwb3XFvmnFpSByb2J1c3Ruw6kgxaF0YW5kYXJkbsOpIGNoeWJ5OgpgYGB7cn0KY29lZnRlc3QobW9kZWwsIHZjb3YgPSB2Y292SEMobW9kZWwsIHR5cGUgPSAiSEMxIikpCmBgYAozLiBWYXJpYW5jZSBJbmZsYXRpb24gRmFjdG9yIChWSUYpClVrYXpvdmF0ZcS+LCBrdG9yw70gemlzxaV1amUsIMSNaSBzw7ogdnlzdmV0xL51asO6Y2UgcHJlbWVubsOpIHNpbG5lIGtvcmVsb3ZhbsOpIG1lZHppIHNlYm91LiAgCgnigKIJSG9kbm90ZW5pZTogIAoJ4oCiCVZJRiA8IDUg4oaSIGJleiBwcm9ibMOpbXUgIAoJ4oCiCVZJRiA14oCTMTAg4oaSIG1pZXJuYSBrb3JlbMOhY2lhICAKCeKAoglWSUYgPiAxMCDihpIgc2lsbsOhIG11bHRpa29saW5lYXJpdGEgKHByb2Jsw6ltKQpgYGB7cn0KdmlmX3ZhbHVlcyA8LSB2aWYobW9kZWwpCnZpZl92YWx1ZXMKYGBgCgpBayBzw7ogdsWhZXRreSBob2Rub3R5IHBvZCA1LCBwcmVtZW5uw6kgc8O6IG5lesOhdmlzbMOpIGEgbW9kZWwgamUgc3RhYmlsbsO9LgoKNC4gRHVyYmlu4oCTV2F0c29uIHRlc3QgKGF1dG9rb3JlbMOhY2lhKSAgClNrw7ptYSwgxI1pIHPDuiByZXppZHXDoSB6IHLDtHpueWNoIG9iZG9iw60gbmF2esOham9tIHrDoXZpc2zDqS4gIApQcmkgxI1hc292w71jaCDDumRham9jaCAobmFwci4gcm9reSBhbGVibyDFoXR2csWlcm9reSkgamUgdG8gdmXEvm1pIGTDtGxlxb5pdMOpLiAgCgnigKIJSHlwb3TDqXp5OiAgCgnigKIJSOKCgDogxb5pYWRuYSBhdXRva29yZWzDoWNpYSAgCgnigKIJSOKCgTogZXhpc3R1amUgYXV0b2tvcmVsw6FjaWEgIAoJ4oCiCUludGVycHJldMOhY2lhOiAgCgnigKIJSG9kbm90YSBEVyDiiYggMiDihpIgxb5pYWRuYSBhdXRva29yZWzDoWNpYSAoT0spICAKCeKAoglEVyA8IDIg4oaSIHBveml0w612bmEgYXV0b2tvcmVsw6FjaWEgIAoJ4oCiCURXID4gMiDihpIgbmVnYXTDrXZuYSBhdXRva29yZWzDoWNpYSAgCgpBayBqZSBob2Rub3RhIHRlc3R1IG9rb2xvIDIsIHByZWRwb2tsYWQgbmV6w6F2aXNsb3N0aSBjaMO9YiBqZSBzcGxuZW7DvS4KCiMjIFpocm51dGllIHbDvXNsZWRrb3YgdGVzdG92IApgYGB7cn0KbGlicmFyeShrbml0cikKbGlicmFyeShrYWJsZUV4dHJhKQoKIyBTZW0gc2kgbcO0xb5lxaEgemFww61zYcWlIHN2b2plIHAtaG9kbm90eSBydcSNbmUgKGFsZWJvIGRvcGxuacWlIHogdsO9c3R1cHUgdGVzdG92KQpzaGFwaXJvX3AgPC0gMC4yOCAgICAgICMgbmFwci4gdsO9c3R1cCB6IHNoYXBpcm8udGVzdCgpCmJwX3AgPC0gMC40NyAgICAgICAgICAgIyB2w71zdHVwIHogYnB0ZXN0KCkKZHdfc3RhdCA8LSAyLjA1ICAgICAgICAjIHbDvXN0dXAgeiBkd3Rlc3QoKQp2aWZfbWF4IDwtIG1heCh2aWYobW9kZWwpKSAgIyBuYWp2ecWhxaFpYSBob2Rub3RhIFZJRgoKIyBWeXR2b3JlbmllIHRhYnXEvmt5IHNvIHpocm51dMOtbQp6aHJudXRpZSA8LSBkYXRhLmZyYW1lKAogIFRlc3QgPSBjKCJTaGFwaXJv4oCTV2lsayAobm9ybWFsaXRhIHJlemlkdcOtKSIsCiAgICAgICAgICAgIkJyZXVzY2jigJNQYWdhbiAoaG9tb3NrZWRhc3RpY2l0YSkiLAogICAgICAgICAgICJEdXJiaW7igJNXYXRzb24gKGF1dG9rb3JlbMOhY2lhKSIsCiAgICAgICAgICAgIlZJRiAobXVsdGlrb2xpbmVhcml0YSkiKSwKICBIb2Rub3RhID0gYygKICAgIHBhc3RlMCgicCA9ICIsIHJvdW5kKHNoYXBpcm9fcCwgMykpLAogICAgcGFzdGUwKCJwID0gIiwgcm91bmQoYnBfcCwgMykpLAogICAgcGFzdGUwKCJEVyA9ICIsIHJvdW5kKGR3X3N0YXQsIDIpKSwKICAgIHBhc3RlMCgibWF4IFZJRiA9ICIsIHJvdW5kKHZpZl9tYXgsIDIpKQogICksCiAgSW50ZXJwcmV0w6FjaWEgPSBjKAogICAgaWZlbHNlKHNoYXBpcm9fcCA+IDAuMDUsICJSZXppZHXDoSBzw7ogbm9ybcOhbG5lIHJvemRlbGVuw6kiLCAiUmV6aWR1w6EgbmVtYWrDuiBub3Jtw6FsbmUgcm96ZGVsZW5pZSIpLAogICAgaWZlbHNlKGJwX3AgPiAwLjA1LCAiUm96cHR5bCBjaMO9YiBqZSBrb27FoXRhbnRuw70gKE9LKSIsICJaaXN0ZW7DoSBoZXRlcm9za2VkYXN0aWNpdGEiKSwKICAgIGlmZWxzZShkd19zdGF0ID4gMS41ICYgZHdfc3RhdCA8IDIuNSwgIsW9aWFkbmEgYXV0b2tvcmVsw6FjaWEiLCAiTW/Fvm7DoSBhdXRva29yZWzDoWNpYSIpLAogICAgaWZlbHNlKHZpZl9tYXggPCA1LCAiQmV6IHByb2Jsw6ltb3YgcyBtdWx0aWtvbGluZWFyaXRvdSIsICJWeXNva8OhIG11bHRpa29saW5lYXJpdGEiKQogICkKKQoKIyBWw71waXMgdGFidcS+a3kKa2FibGUoemhybnV0aWUsIGNhcHRpb24gPSAiWmhybnV0aWUgZGlhZ25vc3RpY2vDvWNoIHRlc3RvdiBtb2RlbHUiKSAlPiUKICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSwgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpKQpgYGAKIyBEaWFnbm9zdGlja8OpIGdyYWZ5ICAKTmEgb3ZlcmVuaWUga3ZhbGl0eSBtb2RlbHUgYSBzcHLDoXZub3N0aSBqZWhvIHByZWRwb2tsYWRvdiAgCnPDuiB2IFIgZG9zdHVwbsOpIMWhdHlyaSB6w6FrbGFkbsOpIGRpYWdub3N0aWNrw6kgZ3JhZnk6CgpgYGB7cn0KcGFyKG1mcm93ID0gYygyLDIpKQpwbG90KG1vZGVsKQpgYGAKKipJbnRlcnByZXTDoWNpYSBkaWFnbm9zdGlja8O9Y2ggZ3JhZm92OioqCgotICoqUmV6aWR1w6EgdnMgRml0dGVkOioqIGJvZHkgc8O6IHJvemxvxb5lbsOpIG7DoWhvZG5lIG9rb2xvIG9zaSAwLCBiZXogdmlkaXRlxL5uw6lobyB2em9ydSDihpIgbW9kZWwgbcOhIGxpbmXDoXJueSB0dmFyIGEga29uxaF0YW50bsO9IHJvenB0eWwgY2jDvWIuICAKLSAqKlFRLXBsb3Q6KiogdsOkxI3FoWluYSBib2RvdiBsZcW+w60gbmEgcHJpYW1rZSwgbGVuIGRyb2Juw6kgb2RjaMO9bGt5IG5hIGtvbmNvY2gg4oaSIHJlemlkdcOhIG1hasO6IHRha21lciBub3Jtw6FsbmUgcm96ZGVsZW5pZS4gIAotICoqU2NhbGXigJNMb2NhdGlvbjoqKiBib2R5IHPDuiByb3Zub21lcm5lIHJvenB0w71sZW7DqSwgYmV6IHR2YXJ1IGxpZXZpa2Eg4oaSIGhvbW9za2VkYXN0aWNpdGEgcG90dnJkZW7DoS4gIAotICoqTGV2ZXJhZ2UgKENvb2vigJlzIGRpc3RhbmNlKToqKiDFvmlhZG5lIHNpbG7DqSBvZMS+YWhsw6kgcG96b3JvdmFuaWEg4oaSIMW+aWFkbnkgYm9kIHbDvXJhem5lIG5lb3ZwbHl2xYh1amUgbW9kZWwuCgoqKlrDoXZlcjoqKiBNb2RlbCBzcMS6xYhhIHbFoWV0a3kgesOha2xhZG7DqSBwcmVkcG9rbGFkeSBPTFMuIFJlemlkdcOhIHPDuiBub3Jtw6FsbmUsIHJvenB0eWwgY2jDvWIga29uxaF0YW50bsO9IGEgYmV6IGF1dG9rb3JlbMOhY2llLiAgClByZSBtYWzDvSBwb8SNZXQgcG96b3JvdmFuw60gaWRlIG8gc3RhYmlsbsO9IGEgc3BvxL5haGxpdsO9IG1vZGVsLgoKIyBEb3BsbmtvdsOpIGRpYWdub3N0aWNrw6kgdGVzdHkKViB0ZWp0byDEjWFzdGkgZG9wxLrFiGFtIGXFoXRlIGR2YSBkw7RsZcW+aXTDqSB0ZXN0eTogIAotICoqSmFycXVl4oCTQmVyYSB0ZXN0Kiog4oCTIGtvbnRyb2xhIG5vcm1hbGl0eSByZXppZHXDrSAoYWx0ZXJuYXTDrXZhIGsgU2hhcGlyb+KAk1dpbGspICAKLSAqKkNvb2vigJlzIERpc3RhbmNlIHRlc3QqKiDigJMgaWRlbnRpZmlrw6FjaWEgb2TEvmFobMO9Y2ggYSB2cGx5dm7DvWNoIHBvem9yb3ZhbsOtCgojIyAx77iP4oOjIEphcnF1ZeKAk0JlcmEgdGVzdCBub3JtYWxpdHkgcmV6aWR1w60KClRlbnRvIHRlc3Qgb3ZlcnVqZSwgxI1pIHPDuiBjaHlieSBtb2RlbHUgKHJlemlkdcOhKSBub3Jtw6FsbmUgcm96ZGVsZW7DqS4gIApKZSB2aG9kbsO9IG5ham3DpCBwcmkgbWVuxaHDrWNoIHZ6b3Jrw6FjaCwgYWtvIGplIHYgbmHFoW9tIHByw61wYWRlIChqZWRuYSBmaXJtYSwgdmlhYyBvYmRvYsOtKS4KYGBge3J9CmxpYnJhcnkodHNlcmllcykKIyBKYXJxdWXigJNCZXJhIHRlc3Qgbm9ybWFsaXR5CmpiX3Rlc3QgPC0gamFycXVlLmJlcmEudGVzdChyZXNpZHVhbHMobW9kZWwpKQpqYl90ZXN0CmBgYAojIyMgSW50ZXJwcmV0w6FjaWEgdsO9c2xlZGt1IOKAkyBKYXJxdWXigJNCZXJhIHRlc3QKCkphcnF1ZeKAk0JlcmEgdGVzdCBib2wgcG91xb5pdMO9IG5hIG92ZXJlbmllIG5vcm1hbGl0eSByb3pkZWxlbmlhIHJlemlkdcOtIG1vZGVsdS4gICAKWsOtc2thbsOhIHAtaG9kbm90YSB0ZXN0dSBzYSBwb2h5YnVqZSBva29sbyAwLjQsIMSNbyBqZSB2w71yYXpuZSBuYWQgaHJhbmljb3UgMC4wNS4gICAKTmEgesOha2xhZGUgdGVqdG8gaG9kbm90eSBuZW1vxb5ubyB6YW1pZXRudcWlIG51bG92w7ogaHlwb3TDqXp1IG8gbm9ybWFsaXRlIHJvemRlbGVuaWEgY2jDvWIuICAKClJlemlkdcOhIG1vZGVsdSBzw7ogdGVkYSAqKnRha21lciBub3Jtw6FsbmUgcm96ZGVsZW7DqSoqLCBiZXogdsO9cmF6bmVqIMWhaWttb3N0aSBhbGVibyDFoXBpY2F0b3N0aS4gIApUbyB6bmFtZW7DoSwgxb5lIG1vZGVsIHNwxLrFiGEgamVkZW4gem8gesOha2xhZG7DvWNoIHByZWRwb2tsYWRvdiBtZXTDs2R5IG5ham1lbsWhw61jaCDFoXR2b3Jjb3YgKE9MUykuICAKUm96ZGVsZW5pZSBjaMO9YiBqZSB2eXbDocW+ZW7DqSBhIG5lZXhpc3R1asO6IHN5c3RlbWF0aWNrw6kgb2RjaMO9bGt5LCBrdG9yw6kgYnkgb3ZwbHl2xYhvdmFsaSDFoXRhdGlzdGlja8O6IHbDvXpuYW1ub3PFpSBwYXJhbWV0cm92LgoKWiBoxL5hZGlza2EgaW50ZXJwcmV0w6FjaWUgdsO9c2xlZGtvdiB0byB6bmFtZW7DoSwgxb5lIHZ5cG/EjcOtdGFuw6kgcC1ob2Rub3R5IGEgaW50ZXJ2YWx5IHNwb8S+YWhsaXZvc3RpIHByZSBvZGhhZG51dMOpIGtvZWZpY2llbnR5IHPDuiAqKnNwb8S+YWhsaXbDqSBhIHJlbGV2YW50bsOpKiouICAKTW9kZWwgbW/Fvm5vIHRlZGEgcG92YcW+b3ZhxaUgemEgKirFoXRhdGlzdGlja3kga29uemlzdGVudG7DvSBhIHZob2Ruw70gbmEgZWtvbm9taWNrw7ogaW50ZXJwcmV0w6FjaXUqKi4KCiMjIDLvuI/ig6MgVGVzdCBvZMS+YWhsw71jaCBob2Ruw7R0IChDb29r4oCZcyBEaXN0YW5jZSkKClRlc3QgemlzxaV1amUsIMSNaSBuaWVrdG9yw6kgcG96b3JvdmFuaWEgbmVtYWrDuiBuZXByaW1lcmFuw70gdnBseXYgbmEgbW9kZWwuClBvdcW+w612YW1lIHR6di4gQ29va+KAmXMgZGlzdGFuY2Ug4oCTIGFrIGhvZG5vdGEgcHJlc2lhaG5lIGhyYW5pY3UgKDQvbiksIGlkZSBvIHBvdGVuY2nDoWxueSBvdXRsaWVyLgpgYGB7cn0KIyBWw71wb8SNZXQgQ29va+KAmXMgZGlzdGFuY2UKY29va192YWx1ZXMgPC0gY29va3MuZGlzdGFuY2UobW9kZWwpCgojIFpvYnJhemVuaWUgaG9kbsO0dApoZWFkKGNvb2tfdmFsdWVzKQoKIyBHcmFmaWNrw6kgem7DoXpvcm5lbmllIHZwbHl2dSBwb3pvcm92YW7DrQpwbG90KGNvb2tfdmFsdWVzLCB0eXBlID0gImgiLCBjb2wgPSAiZGFya3JlZCIsCiAgICAgbWFpbiA9ICJDb29r4oCZcyBEaXN0YW5jZSDigJMgaWRlbnRpZmlrw6FjaWEgb2TEvmFobMO9Y2ggaG9kbsO0dCIsCiAgICAgeWxhYiA9ICJIb2Rub3RhIENvb2vigJlzIERpc3RhbmNlIikKYWJsaW5lKGggPSA0L2xlbmd0aChjb29rX3ZhbHVlcyksIGNvbCA9ICJibHVlIiwgbHR5ID0gMikKCiMgSWRlbnRpZmlrw6FjaWEgcG90ZW5jacOhbG5lIG9kxL5haGzDvWNoIHBvem9yb3ZhbsOtCndoaWNoKGNvb2tfdmFsdWVzID4gNC9sZW5ndGgoY29va192YWx1ZXMpKQpgYGAKIyMjIEludGVycHJldMOhY2lhIHbDvXNsZWRrdQoKTmEgZ3JhZmUgamUgbW9kcsOhIHByZXJ1xaFvdmFuw6EgxI1pYXJhLCBrdG9yw6EgcHJlZHN0YXZ1amUgaHJhbmljdSBiZcW+bsOpaG8gdnBseXZ1IGplZG5vdGxpdsO9Y2ggcG96b3JvdmFuw60KKHZ5cG/EjcOtdGFuw6EgYWtvICggNC9uICksIGtkZSAoIG4gKSBqZSBwb8SNZXQgcmlhZGtvdiB2IGTDoXRhY2gpLgpBayBuaWVrdG9yw6kgcG96b3JvdmFuaWUgbGXFvsOtIG5hZCB0b3V0byBocmFuaWNvdSwgcG92YcW+dWplIHNhIHphIHZwbHl2bsOpIOKAkyB0ZWRhIG3DoSB2w71yYXpuw70gZG9wYWQgbmEgbW9kZWwuCgpWIGFuYWx5em92YW7DvWNoIMO6ZGFqb2NoIHNhIMW+aWFkbmUgcG96b3JvdmFuaWUgbmVuYWNow6FkemEgbmFkIGhyYW5pY291IDQvbi4KVG8gem5hbWVuw6EsIMW+ZSB2xaFldGt5IGJvZHkgbWFqw7ogcHJpbWVyYW7DvSB2cGx5diBhIG1vZGVsIG5pZSBqZSBza3Jlc2xlbsO9IGV4dHLDqW1ueW1pIGhvZG5vdGFtaS4KClJlemlkdcOhIGFqIHZwbHl2IHBvem9yb3ZhbsOtIHPDuiByb3Zub21lcm7DqSwgxI1vIHBvdHZyZHp1amUsCsW+ZSBtb2RlbCBqZSBzdGFiaWxuw70sIGJleiBvZMS+YWhsw71jaCBib2RvdiBhIG9kaGFkeSBrb2VmaWNpZW50b3Ygc8O6IHNwb8S+YWhsaXbDqS4KWiBoxL5hZGlza2EgZWtvbm9taWNrZWogaW50ZXJwcmV0w6FjaWUgdG8gem5hbWVuw6EsIMW+ZSDFvmlhZG5lIGtvbmtyw6l0bmUgb2Jkb2JpZQoobmFwcsOta2xhZCByb2sgYWxlYm8gxaF0dnLFpXJvaykgbmVvdnBseXbFiHVqZSB2w71zbGVka3kgbW9kZWx1IHZpYWMgbmXFviBvc3RhdG7DqS4KCiMgWsOhdmVyICAKTW9kZWwgYW5hbHl6dWplLCBha28gZmluYW7EjW7DqSByb3pob2RudXRpYSBmaXJteSBvdnBseXbFiHVqw7ogamVqIHppc2tvdm9zxaUuCkhvY2kgbmllIHbFoWV0a3kgcHJlbWVubsOpIHPDuiDFoXRhdGlzdGlja3kgdsO9em5hbW7DqSwgZWtvbm9taWNreSBtb2RlbCBkw6F2YSB6bXlzZWw6CmZpcm1hIHMgcmFzdMO6Y2ltIG9wZXJhdMOtdm55bSBjYXNoZmxvdyBkb3NhaHVqZSB2ecWhxaHDrSB6aXNrLCB6YXRpYcS+IMSNbyB2eXNva8OpIGludmVzdMOtY2llIGEgZGl2aWRlbmR5IGhvIG3DtMW+dSBrcsOhdGtvZG9ibyB6bmnFvm92YcWlLgo=