knitr::opts_chunk$set(
echo = TRUE,
message = FALSE,
warning = FALSE
)
library(zoo)
library(tseries)
library(lmtest)
library(sandwich)
library(car)
rm(list=ls())
library(quantmod)
Import údajov
Na začiatok si importujeme údaje. Vybrala som si dáta o cene akcií
spoločnosti Apple a ETF’s, ktoré opisujú vývoj trhu zlata (GLD),
energetického sektora (XLE) a (SPY), ktoré kopíruje trh S&P 500.
Dáta sú za obdobie 1.1.2024-1.1.2025. Údaje sú stiahnuté priamo z
internetu, z databázy YahooFinance. Tieto hodnoty predstavujú vývoj
cien, na ktorom budeme následne analyzovať výnosnosti a vzájomné vzťahy
medzi výnosnosťami daných aktív.
tickers <- c("AAPL", "GLD", "XLE", "SPY") # Apple, Gold ETF, Energy ETF, S&P500 ETF
getSymbols(tickers, from = "2024-01-01", to = "2025-01-01")
[1] "AAPL" "GLD" "XLE" "SPY"
data <- merge(Cl(AAPL), Cl(GLD), Cl(XLE), Cl(SPY))
colnames(data) <- tickers
ret <- na.omit(diff(log(data)))
colnames(ret) <- paste0(colnames(ret), "_ret")
ret_df <- na.omit(as.data.frame(ret))
head(ret_df)
Deskriptívna štatistika
V nasledujúcej časti vykonávame deskriptívnu štatistiku denných
logaritmických výnosov štyroch finančných aktív, aby sme získali
základný prehľad o ich rozdelení a volatilite.
AAPL_ret GLD_ret XLE_ret SPY_ret
Min. :-0.049366 Min. :-0.0363355 Min. :-3.276e-02 Min. :-0.030257
1st Qu.:-0.006736 1st Qu.:-0.0042584 1st Qu.:-6.372e-03 1st Qu.:-0.003000
Median : 0.001595 Median : 0.0016010 Median : 1.543e-03 Median : 0.001093
Mean : 0.001193 Mean : 0.0009509 Mean : 4.302e-05 Mean : 0.000857
3rd Qu.: 0.009288 3rd Qu.: 0.0073401 3rd Qu.: 6.793e-03 3rd Qu.: 0.005756
Max. : 0.070131 Max. : 0.0221408 Max. : 3.691e-02 Max. : 0.024561
Apple
Rozpätie výnosov sa pohybuje od –4,94 % po +7,01 %, čo z aktív robí
najvolatilnejšie. Priemerný denný výnos (0,12 %) aj medián (0,16 %) sú
pozitívne a naznačujú mierny rastový trend, zatiaľ čo bežné denné pohyby
(IQR) sa pohybujú do ±1 %.
Gold
Výnosy zlata kolíšu medzi –3,63 % a +2,21 %, čo je menej ako pri
AAPL. Priemer (0,095 %) aj medián (0,16 %) sú mierne pozitívne. Nižší
IQR potvrdzuje stabilnejší charakter zlata ako defenzívneho aktíva.
XLE
Rozpätie od –3,28 % do +3,69 % naznačuje výraznejšiu volatilitu
typickú pre energetický sektor. Priemerný výnos je takmer nulový, čo
odráža neutrálne dlhodobé smerovanie. Medián (0,15 %) je pozitívny, no
variabilita je vyššia ako pri SPY či GLD.
SPY
S&P 500 má najnižšie rozpätie výnosov (–3,02 % až +2,45 %) aj
najmenšie medzikvartilové rozpätie, čo potvrdzuje jeho stabilitu.
Priemerný denný výnos (0,085 %) aj medián (0,11 %) zostávajú pozitívne a
zodpovedajú širokému diverzifikovanému portfóliu.
Testovanie hypotézy
Budeme testovať hypotézu
\(H_0:\) model je správne
špecifikovaný (\(\gamma_2 = \gamma_3 =
0\))
oproti
\(H_1:\) model je nesprávne
špecifikovaný (\(\gamma_2 \ne 0 \quad
\text{alebo} \quad \gamma_3 \ne 0\))
RESET test
Tvar môjho pôvodného regresného modelu bol:
\[AAPL\_ret = \beta_0 + \beta_1 \cdot
GLD\_ret + \beta_2 \cdot XLE\_ret + \beta_3 \cdot SPY\_ret +
u\]
Tento model opisuje vzťah medzi dennými logaritmickými výnosmi akcie
Apple a výnosmi zlata (GLD), energetického sektora (XLE) a indexu
S&P 500 (SPY). Koeficienty pri jednotlivých premenných zachytávajú,
ako citlivo reaguje výnos Apple na pohyby týchto trhových faktorov.
Rozšírený model použitý v RESET teste má tvar:
\[
AAPL\_ret = \beta_0 + \beta_1 GLD\_ret + \beta_2 XLE\_ret + \beta_3
SPY\_ret + \gamma_2 AAPL\_ret^2 + \gamma_3 AAPL\_ret^3 + u
\]
RESET test rozširuje pôvodný regresný model o druhú a tretiu mocninu
odhadnutých hodnôt závislej premennej. Tieto dodatočné členy testujú, či
pôvodná špecifikácia modelu nezanedbala nelineárne vzťahy alebo
interakcie, ktoré by mohli zlepšiť jeho vysvetľovaciu schopnosť. Ak sú
koeficienty \(\gamma_2\) a \(\gamma_3\) štatisticky významné, znamená
to, že pôvodný model bol nesprávne špecifikovaný.
# Lineárny model:
model <- lm(AAPL_ret ~ GLD_ret + XLE_ret + SPY_ret, data = ret_df)
summary(model)
Call:
lm(formula = AAPL_ret ~ GLD_ret + XLE_ret + SPY_ret, data = ret_df)
Residuals:
Min 1Q Median 3Q Max
-0.044288 -0.006673 -0.000362 0.005717 0.066928
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.0003073 0.0007477 0.411 0.6814
GLD_ret 0.0028525 0.0818840 0.035 0.9722
XLE_ret -0.1950403 0.0705065 -2.766 0.0061 **
SPY_ret 1.0396059 0.1007431 10.319 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.01173 on 247 degrees of freedom
Multiple R-squared: 0.3122, Adjusted R-squared: 0.3038
F-statistic: 37.37 on 3 and 247 DF, p-value: < 2.2e-16
# RESET test:
library(lmtest)
resettest(model, power = 2:3, type = "regressor")
RESET test
data: model
RESET = 1.1337, df1 = 6, df2 = 241, p-value = 0.3433
Interpretácia regresného modelu
Konštanta modelu nie je štatisticky významná, čo znamená, že pri
nulových hodnotách všetkých vysvetľujúcich premenných sa očakávanýá
výnosnosť akcie Apple výrazne nelíši od nuly.
Premenná GLD_ret nevykazuje štatisticky významný vplyv (p = 0.9722),
čo naznačuje, že denné pohyby ceny zlata nie sú systematicky prepojené s
výnosnosťami akcie Apple.
Premenná XLE_ret je štatisticky významná na 1% hladine (p = 0.0061) a
jej koeficient je negatívny. To znamená, že rast energetického sektora
je spojený s poklesom výnosností Apple, čo môže naznačovať sektorové
presuny kapitálu alebo cyklické efekty v ekonomike.
Najvýraznejší vplyv má premenná SPY_ret, ktorá je vysoko štatisticky
významná (p < 2e-16). Jej koeficient (1.0396) naznačuje, že Apple sa
správa veľmi podobne ako širší trh reprezentovaný indexom S&P 500.
To je konzistentné s tým, že Apple je veľkou súčasťou tohto trhu a jeho
vývoj je s indexom úzko spätý.
Hodnota R² = 0.3122 a Adjusted R² = 0.3038 znamená, že model
vysvetľuje približne 31 % variability denných výnosov Apple. V kontexte
finančných časových radov, ktoré sú prirodzene veľmi volatilné a
ovplyvnené veľkým množstvom náhodných faktorov, ide o bežnú a
akceptovateľnú úroveň vysvetlenia.
Model ako celok je štatisticky významný (F-statistic = 37.37; p <
2.2e-16), čo znamená, že vysvetľujúce premenné spoločně významne
ovplyvňujú výnosnosť Apple.
Interpretácia RESET testu
Cieľom RESET testu je overiť správnu špecifikáciu modelu, teda
posúdiť, či pôvodný model nezanedbáva nelineárne vzťahy alebo iné
dôležité funkčné väzby.
Výsledok testu je:
RESET = 1.1337
p-hodnota = 0.3433
Keďže p-hodnota je výrazne vyššia ako bežne používaná hladina
významnosti 0.05, nezamietame nulovú hypotézu správnej špecifikácie
modelu. To znamená, že nie je dôkaz o tom, že by model trpel závažnou
chybnou špecifikáciou a jeho funkčná forma sa javí ako vhodná.
Grafická analýza
Graf Residuals vs. Fitted
Grafická analýza vzťahu medzi vyrovnanými hodnotami náhodnej
premennej a rezíduami:

Graf Residuals vs. Fitted zobrazuje vzťah medzi vyrovnanými hodnotami
modelu a jeho rezíduami. Body sú rozmiestnené relatívne náhodne okolo
horizontálnej osi, čo naznačuje, že model nespôsobuje systematické chyby
vo vysvetľovaní variácie výnosov Apple. Trendová čiara (červená) je
takmer vodorovná, čo podporuje predpoklad, že vzťah medzi premennými je
približne lineárny.
Viditeľné sú však jednotlivé odľahlé pozorovania (napr. 2024-05-03,
2024-06-11 či 2024-03-21), ktoré majú väčšie rezíduá než priemer. Tieto
body môžu znižovať presnosť modelu, ale nepredstavujú jasný vzor, ktorý
by naznačoval porušenie linearity alebo heteroskedasticitu. Celkovo graf
nepreukazuje výrazne systematické problémy v špecifikácii modelu.
Grafy C+R
Táto analýza nám umožňuje preskúmať, či je vzťah medzi jednotlivými
vysvetľujúcimi premennými a závislou premennou skutočne lineárny.
Vychádzame z pôvodného modelu \[AAPL\_ret =
\beta_0 + \beta_1 \cdot GLD\_ret + \beta_2 \cdot XLE\_ret + \beta_3
\cdot SPY\_ret + u\] Po odhadnutí tohto modelu vykresľujeme
component + residual plots (C+R grafy), v ktorých sa na zvislej osi
nachádza výraz \[
\hat{\beta}_i x_i + e
\] a na vodorovnej osi hodnoty premenných x_i. Tieto grafy slúžia
na identifikáciu prípadných nelineárnych vzťahov medzi závislou
premennou a jednotlivými regresormi.

Gold
Krivka (ružová) je takmer vodorovná a drží sa veľmi blízko priamky
lineárneho vzťahu (modrá čiara). Body sú rozptýlené náhodne a bez
výrazného zakrivenia. To naznačuje, že medzi výnosmi Apple a cenou zlata
neexistuje nelineárny vzťah a lineárna špecifikácia je postačujúca.
XLE
Pri tejto premennej sa nachádza najmiernejší náznak zakrivenia –
krivka má jemný konkávny tvar. Tento odklon však nie je výrazný a je
spôsobený najmä väčšou variabilitou rezíduí pri vyšších hodnotách
XLE_ret. Aj napriek tomu krivka neukazuje na potrebu transformácie,
keďže celkový priebeh zostáva z veľkej časti lineárny.
SPY
V tomto prípade pozorujeme jednoznačne najsilnejší lineárny vzťah.
Obidve krivky sa nachádzajú takmer presne na sebe a majú stúpajúci tvar,
čo potvrdzuje silnú lineárnu väzbu medzi výnosmi Apple a výnosmi
širokého trhu reprezentovaného indexom S&P 500. Neexistuje dôvod na
uvažovanie o transformácii tejto premennej.
C+R grafy nepreukazujú prítomnosť výraznej nelinearity v prípade
žiadnej zo sledovaných premenných. Mierny náznak zakrivenia pri XLE_ret
nie je dostatočne výrazný na to, aby odôvodnil transformáciu. Pre naše
dáta je preto lineárna špecifikácia modelu adekvátna a transformácie
premenných nie sú potrebné.
Nelineárna špecifikácia
Hoci v našom prípade component + residual grafy ani RESET test
nenaznačili prítomnosť výrazných nelineárnych vzťahov medzi
vysvetľujúcimi premennými a výnosmi akcie Apple, pre účely pochopenia
metodiky a jej praktického precvičenia sa v nasledujúcej časti pokúsime
aplikovať rovnaké postupy, aké boli uvedené vo vzorovom príklade.
Cieľom teda nie je korigovať skutočnú chybu v špecifikácii modelu
(keďže základný lineárny model vyhovuje), ale demonštrovať, ako možno
pri potrebe nelineárne upraviť pôvodnú regresnú rovnicu, zavádzať
kvadratické členy, dummy premenné či lineárne lomené funkcie a
porovnávať modely pomocou ANOVA a RESET testov.
V našom prípade by rozšírený model mohol mať tvar: \[ AAPL\_ret = \beta_0 + \beta_1 GLD\_ret + \beta_2
XLE\_ret + \beta_3 SPY\_ret + \gamma_1 GLD\_ret^{2} + \gamma_2
XLE\_ret^{2} + \gamma_3 SPY\_ret^{2} + u \] Tento tvar modelu sme
zvolili preto, aby sme umožnili zachytiť prípadné nelineárne vzťahy
medzi výnosom akcie Apple a jednotlivými vysvetľujúcimi premennými.
Zaradenie kvadratických členov rozširuje pôvodnú rovnicu o možnosť, že
účinok premenných sa môže pri rôznych úrovniach ich hodnôt meniť a
nemusí mať striktne lineárny priebeh. Vďaka tomu môžeme preskúmať, či
takáto úprava vedie k zlepšeniu štatistických vlastností modelu.
Porovnanie základného a modifikovaného modelu
V nadväznosti na uvedenú nelineárnu špecifikáciu sme rozšírili
pôvodný lineárny model o kvadratické členy všetkých vysvetľujúcich
premenných. Takto upravený model umožňuje preskúmať, či výkon regresie
zlepší doplnenie nelineárnych efektov.
model_zakladny <- lm(AAPL_ret ~ GLD_ret + XLE_ret + SPY_ret,
data = ret_df)
model_kvadr <- lm(AAPL_ret ~ GLD_ret + XLE_ret + SPY_ret +
I(GLD_ret^2) + I(XLE_ret^2) + I(SPY_ret^2),
data = ret_df)
summary(model_kvadr)
Call:
lm(formula = AAPL_ret ~ GLD_ret + XLE_ret + SPY_ret + I(GLD_ret^2) +
I(XLE_ret^2) + I(SPY_ret^2), data = ret_df)
Residuals:
Min 1Q Median 3Q Max
-0.045105 -0.007012 -0.000015 0.005256 0.065866
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.0015526 0.0009993 1.554 0.12155
GLD_ret -0.0289654 0.0848839 -0.341 0.73322
XLE_ret -0.2145706 0.0717309 -2.991 0.00306 **
SPY_ret 1.0150168 0.1018409 9.967 < 2e-16 ***
I(GLD_ret^2) -0.6260170 5.1560194 -0.121 0.90346
I(XLE_ret^2) -4.8924614 4.1630691 -1.175 0.24106
I(SPY_ret^2) -8.2685599 6.8904579 -1.200 0.23130
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.0117 on 244 degrees of freedom
Multiple R-squared: 0.3248, Adjusted R-squared: 0.3082
F-statistic: 19.56 on 6 and 244 DF, p-value: < 2.2e-16
anova(model_zakladny, model_kvadr)
Analysis of Variance Table
Model 1: AAPL_ret ~ GLD_ret + XLE_ret + SPY_ret
Model 2: AAPL_ret ~ GLD_ret + XLE_ret + SPY_ret + I(GLD_ret^2) + I(XLE_ret^2) +
I(SPY_ret^2)
Res.Df RSS Df Sum of Sq F Pr(>F)
1 247 0.034014
2 244 0.033390 3 0.00062431 1.5207 0.2097
RESET test
data: model_kvadr
RESET = 0.054828, df1 = 2, df2 = 242, p-value = 0.9467
Po rozšírení základného modelu o kvadratické členy sa ukázalo, že
žiadny z nich nie je štatisticky významný. Lineárne koeficienty si
pritom zachovali rovnaké vlastnosti ako v pôvodnom modeli – najvyššiu
významnosť má trhový faktor, kým ostatné premenné sa zásadne
nemenia.
Upravený koeficient determinácie sa po pridaní kvadratických členov
zvýšil len minimálne (zhruba o 0.004), čo predstavuje veľmi malý posun.
ANOVA test naznačil, že rozdiel medzi modelmi nie je štatisticky
významný, takže rozšírenie neprinieslo citeľné zlepšenie.
RESET test modifikovaného modelu má vysokú p-hodnotu, čo opäť
potvrdzuje, že model neobsahuje chybnú špecifikáciu. Kvadratické členy
teda nezachytili žiadnu dodatočnú nelinearitu, ktorá by bola z hľadiska
týchto dát relevantná.
Transformácia pomocou dummy premennej a lineárnej lomenej
funkcie
V ďalšom kroku sme sa pokúsili zachytiť prípadnú zmenu správania
modelu pri odlišných podmienkach na trhu. Na to sme zaviedli jednoduchú
dummy premennú, ktorá odlišuje dni s výraznejším pohybom trhu od bežných
dní. Táto premenná nám umožňuje testovať, či sa vývoj závislej premennej
líši medzi dvoma skupinami pozorovaní – buď posunom v autonómnom
členovi, alebo zmenou sklonu pri jednej z vysvetľujúcich premenných.
Odhadli sme preto dva modely: jeden s možným posunom celej rovnice a
druhý s možnou zmenou sklonu. Nasledujúce výsledky ukazujú, či tieto
úpravy prinášajú zlepšenie oproti pôvodnému lineárnemu modelu.
Model so zlomom v autonómnom člene
Tento model umožňuje, aby sa celý vzťah posunul nahor alebo nadol v
dňoch, keď dummy premenná nadobúda hodnotu 1. Ide teda o test, či sa
úroveň závislej premennej líši medzi dvoma skupinami pozorovaní.
\[
AAPL\_ret = \beta_0 + \beta_D DUM + \beta_1 GLD\_ret
+ \beta_2 XLE\_ret + \beta_3 SPY\_ret + u
\]
Model so zlomom v sklone
V tomto prípade sa skúma, či je sklon regresnej priamky rozdielny v
závislosti od hodnoty dummy premennej. Koeficient pri interakčnom
členovi určuje, či sa reakcia závislej premennej na danej vysvetľujúcej
premennnej mení medzi dvoma sledovanými stavmi. \[
AAPL\_ret = \beta_0 + \beta_1 GLD\_ret + \beta_2 XLE\_ret
+ \beta_3 SPY\_ret + \beta_{D} (DUM \cdot SPY\_ret) + u
\]
Príklad zavedenia dummy premennej podľa veľkosti trhového pohybu
(napr. SPY_ret väčší ako 1 %):
ret_df$DUM <- ifelse(ret_df$SPY_ret > 0.01, 1, 0)
modelD_auto <- lm(AAPL_ret ~ DUM + GLD_ret + XLE_ret + SPY_ret,
data = ret_df)
summary(modelD_auto)
Call:
lm(formula = AAPL_ret ~ DUM + GLD_ret + XLE_ret + SPY_ret, data = ret_df)
Residuals:
Min 1Q Median 3Q Max
-0.044874 -0.006895 0.000012 0.005504 0.066427
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.0006296 0.0007856 0.801 0.42370
DUM -0.0038638 0.0029317 -1.318 0.18874
GLD_ret -0.0045309 0.0819538 -0.055 0.95596
XLE_ret -0.1971241 0.0704193 -2.799 0.00553 **
SPY_ret 1.1209476 0.1180172 9.498 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.01172 on 246 degrees of freedom
Multiple R-squared: 0.317, Adjusted R-squared: 0.3059
F-statistic: 28.54 on 4 and 246 DF, p-value: < 2.2e-16
modelD_sklon <- lm(AAPL_ret ~ GLD_ret + XLE_ret +
SPY_ret + I(DUM * SPY_ret),
data = ret_df)
summary(modelD_sklon)
Call:
lm(formula = AAPL_ret ~ GLD_ret + XLE_ret + SPY_ret + I(DUM *
SPY_ret), data = ret_df)
Residuals:
Min 1Q Median 3Q Max
-0.044954 -0.006976 0.000349 0.005471 0.066416
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.0006418 0.0007833 0.819 0.41336
GLD_ret -0.0106854 0.0822896 -0.130 0.89679
XLE_ret -0.1926553 0.0703886 -2.737 0.00665 **
SPY_ret 1.1314720 0.1199475 9.433 < 2e-16 ***
I(DUM * SPY_ret) -0.2954226 0.2103348 -1.405 0.16142
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.01171 on 246 degrees of freedom
Multiple R-squared: 0.3177, Adjusted R-squared: 0.3066
F-statistic: 28.63 on 4 and 246 DF, p-value: < 2.2e-16
anova(model_zakladny, modelD_sklon)
Analysis of Variance Table
Model 1: AAPL_ret ~ GLD_ret + XLE_ret + SPY_ret
Model 2: AAPL_ret ~ GLD_ret + XLE_ret + SPY_ret + I(DUM * SPY_ret)
Res.Df RSS Df Sum of Sq F Pr(>F)
1 247 0.034014
2 246 0.033743 1 0.00027059 1.9727 0.1614
RESET test
data: modelD_sklon
RESET = 0.73388, df1 = 2, df2 = 244, p-value = 0.4811
Interpretácia modelu so zlomom v autonómnom člene
Po doplnení dummy premennej (DUM), ktorá oddeľuje dni s vyšším
pohybom trhu od ostatných, sa ukázalo, že tento dodatočný člen nie je
štatisticky významný. Jeho koeficient má pomerne vysokú p-hodnotu, takže
nemožno tvrdiť, že by sa vývoj závislej premennej významne líšil medzi
dvoma skupinami pozorovaní. Ostatné premenné si zachovali správanie
podobné pôvodnému modelu – najvýraznejší vplyv má trhový faktor, kým
ostatné zostávajú slabšie alebo nevýznamné. Hodnota upraveného
koeficientu determinácie sa takmer nezmenila, čo naznačuje, že posun
celej rovnice nepriniesol zlepšenie.
Interpretácia modelu so zlomom v sklone
V druhom kroku sme skúmali, či sa môže meniť sklon regresnej priamky
v závislosti od dummy premennej. Interakčný člen, ktorý by mal
zachytávať rozdielne správanie v dňoch s vyšším trhovým pohybom, však
nie je štatisticky významný. Samotné koeficienty základných premenných
sa oproti prvému modelu takmer nezmenili a vysvetľovacia schopnosť
modelu sa zvýšila len minimálne.
ANOVA porovnanie základného a rozšíreného modelu opäť nepreukázalo
štatisticky významné zlepšenie. To znamená, že doplnenie tejto
interakcie modelu nepomohlo zachytiť žiadny dôležitý dodatočný
vzťah.
RESET test
RESET test pre rozšírený model má vysokú p-hodnotu. Znamená to, že
model neobsahuje chybnú špecifikáciu a doplnenie zlomu v sklone nie je
potrebné. Výsledok je konzistentný s predchádzajúcimi zisteniami –
lineárny model v našom prípade postačuje.
LS0tCnRpdGxlOiAiU2llZG1hIMO6bG9oYSIKYXV0aG9yOiAnIE1pcm9zbGF2YSBNZWR2ZWNrw6EgIDxicj4nCmRhdGU6ICJTZXB0ZW1iZXIgMjAyNSIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgdGhlbWU6IHVuaXRlZAogICAgaGlnaGxpZ2h0OiB0YW5nbwogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHRydWUKICAgIGRmX3ByaW50OiBwYWdlZAplZGl0b3Jfb3B0aW9uczoKICBtYXJrZG93bjoKICAgIHdyYXA6IDcyCi0tLQoKYGBge3J9CmtuaXRyOjpvcHRzX2NodW5rJHNldCgKICAgIGVjaG8gPSBUUlVFLAogICAgbWVzc2FnZSA9IEZBTFNFLAogICAgd2FybmluZyA9IEZBTFNFCikKYGBgCgo8c3R5bGU+Ci8qIENlbGtvdsOpIHBvemFkaWUgKi8KYm9keSB7CiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgI2YzZThmZiwgI2U5ZDVmZiwgI2VkZTlmZSk7CiAgZm9udC1mYW1pbHk6ICdIZWx2ZXRpY2EgTmV1ZScsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7CiAgY29sb3I6ICMyZTA4NTQ7CiAgbGluZS1oZWlnaHQ6IDEuNzsKICBwYWRkaW5nOiAyNXB4Owp9CgovKiBIbGF2bsOpIG5hZHBpc3kgKi8KaDEsIGgyLCBoMyB7CiAgZm9udC1mYW1pbHk6ICdIZWx2ZXRpY2EgTmV1ZScsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7CiAgbGV0dGVyLXNwYWNpbmc6IDAuNXB4OwogIGNvbG9yOiAjNGIwMDgyOyAvKiB0bWF2b2ZpYWxvdsOhICovCiAgdGV4dC1zaGFkb3c6IDBweCAxcHggMnB4ICNlOWQ1ZmY7Cn0KPC9zdHlsZT4KCmBgYHtyfQpsaWJyYXJ5KHpvbykKbGlicmFyeSh0c2VyaWVzKQpsaWJyYXJ5KGxtdGVzdCkKbGlicmFyeShzYW5kd2ljaCkKbGlicmFyeShjYXIpCnJtKGxpc3Q9bHMoKSkKbGlicmFyeShxdWFudG1vZCkKYGBgCgojIyBJbXBvcnQgw7pkYWpvdiAgICAgIApOYSB6YcSNaWF0b2sgc2kgaW1wb3J0dWplbWUgw7pkYWplLiBWeWJyYWxhIHNvbSBzaSBkw6F0YSBvIGNlbmUgYWtjacOtIHNwb2xvxI1ub3N0aSBBcHBsZSBhIEVURidzLCBrdG9yw6kgb3Bpc3Vqw7ogdsO9dm9qIHRyaHUgemxhdGEgKEdMRCksIGVuZXJnZXRpY2vDqWhvIHNla3RvcmEgKFhMRSkgYSAoU1BZKSwga3RvcsOpIGtvcMOtcnVqZSB0cmggUyZQIDUwMC4gRMOhdGEgc8O6IHphIG9iZG9iaWUgMS4xLjIwMjQtMS4xLjIwMjUuIMOaZGFqZSBzw7ogc3RpYWhudXTDqSBwcmlhbW8geiBpbnRlcm5ldHUsIHogZGF0YWLDoXp5IFlhaG9vRmluYW5jZS4gVGlldG8gaG9kbm90eSBwcmVkc3RhdnVqw7ogdsO9dm9qIGNpZW4sIG5hIGt0b3JvbSBidWRlbWUgbsOhc2xlZG5lIGFuYWx5em92YcWlIHbDvW5vc25vc3RpIGEgdnrDoWpvbW7DqSB2esWlYWh5IG1lZHppIHbDvW5vc25vc8WlYW1pIGRhbsO9Y2ggYWt0w612LgpgYGB7cn0KdGlja2VycyA8LSBjKCJBQVBMIiwgIkdMRCIsICJYTEUiLCAiU1BZIikgICAjIEFwcGxlLCBHb2xkIEVURiwgRW5lcmd5IEVURiwgUyZQNTAwIEVURgpnZXRTeW1ib2xzKHRpY2tlcnMsIGZyb20gPSAiMjAyNC0wMS0wMSIsIHRvID0gIjIwMjUtMDEtMDEiKQoKZGF0YSA8LSBtZXJnZShDbChBQVBMKSwgQ2woR0xEKSwgQ2woWExFKSwgQ2woU1BZKSkKY29sbmFtZXMoZGF0YSkgPC0gdGlja2VycwoKcmV0IDwtIG5hLm9taXQoZGlmZihsb2coZGF0YSkpKQpjb2xuYW1lcyhyZXQpIDwtIHBhc3RlMChjb2xuYW1lcyhyZXQpLCAiX3JldCIpCgpyZXRfZGYgPC0gbmEub21pdChhcy5kYXRhLmZyYW1lKHJldCkpCmhlYWQocmV0X2RmKQpgYGAKIyMjIERlc2tyaXB0w612bmEgxaF0YXRpc3Rpa2EgICAgIApWIG5hc2xlZHVqw7pjZWogxI1hc3RpIHZ5a29uw6F2YW1lIGRlc2tyaXB0w612bnUgxaF0YXRpc3Rpa3UgZGVubsO9Y2ggbG9nYXJpdG1pY2vDvWNoIHbDvW5vc292IMWhdHlyb2NoIGZpbmFuxI1uw71jaCBha3TDrXYsIGFieSBzbWUgesOtc2thbGkgesOha2xhZG7DvSBwcmVoxL5hZCBvIGljaCByb3pkZWxlbsOtIGEgdm9sYXRpbGl0ZS4KICAgICAKYGBge3J9CnN1bW1hcnkocmV0X2RmKQpgYGAKIyMjICpBcHBsZSogICAgClJvenDDpHRpZSB2w71ub3NvdiBzYSBwb2h5YnVqZSBvZCDigJM0LDk0ICUgcG8gKzcsMDEgJSwgxI1vIHogYWt0w612IHJvYsOtIG5hanZvbGF0aWxuZWrFoWllLiBQcmllbWVybsO9IGRlbm7DvSB2w71ub3MgKDAsMTIgJSkgYWogbWVkacOhbiAoMCwxNiAlKSBzw7ogcG96aXTDrXZuZSBhIG5hem5hxI11asO6IG1pZXJueSByYXN0b3bDvSB0cmVuZCwgemF0aWHEviDEjW8gYmXFvm7DqSBkZW5uw6kgcG9oeWJ5IChJUVIpIHNhIHBvaHlidWrDuiBkbyDCsTEgJS4gIAoKIyMjICpHb2xkKiAgICAgClbDvW5vc3kgemxhdGEga29sw63FoXUgbWVkemkg4oCTMyw2MyAlIGEgKzIsMjEgJSwgxI1vIGplIG1lbmVqIGFrbyBwcmkgQUFQTC4gUHJpZW1lciAoMCwwOTUgJSkgYWogbWVkacOhbiAoMCwxNiAlKSBzw7ogbWllcm5lIHBveml0w612bmUuIE5pxb7FocOtIElRUiBwb3R2cmR6dWplIHN0YWJpbG5lasWhw60gY2hhcmFrdGVyIHpsYXRhIGFrbyBkZWZlbnrDrXZuZWhvIGFrdMOtdmEuICAgICAKCiMjIyAqWExFKiAgICAgClJvenDDpHRpZSBvZCDigJMzLDI4ICUgZG8gKzMsNjkgJSBuYXpuYcSNdWplIHbDvXJhem5lasWhaXUgdm9sYXRpbGl0dSB0eXBpY2vDuiBwcmUgZW5lcmdldGlja8O9IHNla3Rvci4gUHJpZW1lcm7DvSB2w71ub3MgamUgdGFrbWVyIG51bG92w70sIMSNbyBvZHLDocW+YSBuZXV0csOhbG5lIGRsaG9kb2LDqSBzbWVyb3ZhbmllLiBNZWRpw6FuICgwLDE1ICUpIGplIHBveml0w612bnksIG5vIHZhcmlhYmlsaXRhIGplIHZ5xaHFoWlhIGFrbyBwcmkgU1BZIMSNaSBHTEQuICAgCgojIyMgKlNQWSogICAgIApTJlAgNTAwIG3DoSBuYWpuacW+xaFpZSByb3pww6R0aWUgdsO9bm9zb3YgKOKAkzMsMDIgJSBhxb4gKzIsNDUgJSkgYWogbmFqbWVuxaFpZSBtZWR6aWt2YXJ0aWxvdsOpIHJvenDDpHRpZSwgxI1vIHBvdHZyZHp1amUgamVobyBzdGFiaWxpdHUuIFByaWVtZXJuw70gZGVubsO9IHbDvW5vcyAoMCwwODUgJSkgYWogbWVkacOhbiAoMCwxMSAlKSB6b3N0w6F2YWrDuiBwb3ppdMOtdm5lIGEgem9kcG92ZWRhasO6IMWhaXJva8OpbXUgZGl2ZXJ6aWZpa292YW7DqW11IHBvcnRmw7NsaXUuICAgICAKCiMjIFRlc3RvdmFuaWUgaHlwb3TDqXp5ICAgICAKQnVkZW1lIHRlc3RvdmHFpSBoeXBvdMOpenUgCgokSF8wOiQgbW9kZWwgamUgc3Byw6F2bmUgxaFwZWNpZmlrb3ZhbsO9ICgkXGdhbW1hXzIgPSBcZ2FtbWFfMyA9IDAkKQoKb3Byb3RpCgokSF8xOiQgbW9kZWwgamUgbmVzcHLDoXZuZSDFoXBlY2lmaWtvdmFuw70gKCRcZ2FtbWFfMiBcbmUgMCAgXHF1YWQgXHRleHR7YWxlYm99ICBccXVhZCBcZ2FtbWFfMyBcbmUgMCQpCgojIyBSRVNFVCB0ZXN0IApUdmFyIG3DtGpobyBww7R2b2Ruw6lobyByZWdyZXNuw6lobyBtb2RlbHUgYm9sOgoKXFtBQVBMXF9yZXQgPSBcYmV0YV8wICsgXGJldGFfMSBcY2RvdCBHTERcX3JldCArIFxiZXRhXzIgXGNkb3QgWExFXF9yZXQgKyBcYmV0YV8zIFxjZG90IFNQWVxfcmV0ICsgdVxdCgpUZW50byBtb2RlbCBvcGlzdWplIHZ6xaVhaCBtZWR6aSBkZW5uw71taSBsb2dhcml0bWlja8O9bWkgdsO9bm9zbWkgYWtjaWUgQXBwbGUgYSB2w71ub3NtaSB6bGF0YSAoR0xEKSwgZW5lcmdldGlja8OpaG8gc2VrdG9yYSAoWExFKSBhIGluZGV4dSBTJlAgNTAwIChTUFkpLiBLb2VmaWNpZW50eSBwcmkgamVkbm90bGl2w71jaCBwcmVtZW5uw71jaCB6YWNoeXTDoXZhasO6LCBha28gY2l0bGl2byByZWFndWplIHbDvW5vcyBBcHBsZSBuYSBwb2h5YnkgdMO9Y2h0byB0cmhvdsO9Y2ggZmFrdG9yb3YuICAgIAoKUm96xaHDrXJlbsO9IG1vZGVsIHBvdcW+aXTDvSB2IFJFU0VUIHRlc3RlIG3DoSB0dmFyOgoKJCQKQUFQTFxfcmV0ID0gXGJldGFfMCArIFxiZXRhXzEgR0xEXF9yZXQgKyBcYmV0YV8yIFhMRVxfcmV0ICsgXGJldGFfMyBTUFlcX3JldCArIFxnYW1tYV8yIEFBUExcX3JldF4yICsgXGdhbW1hXzMgQUFQTFxfcmV0XjMgKyB1CiQkCgoKICAgIAoKUkVTRVQgdGVzdCByb3rFoWlydWplIHDDtHZvZG7DvSByZWdyZXNuw70gbW9kZWwgbyBkcnVow7ogYSB0cmV0aXUgbW9jbmludSBvZGhhZG51dMO9Y2ggaG9kbsO0dCB6w6F2aXNsZWogcHJlbWVubmVqLiBUaWV0byBkb2RhdG/EjW7DqSDEjWxlbnkgdGVzdHVqw7osIMSNaSBww7R2b2Ruw6EgxaFwZWNpZmlrw6FjaWEgbW9kZWx1IG5lemFuZWRiYWxhIG5lbGluZcOhcm5lIHZ6xaVhaHkgYWxlYm8gaW50ZXJha2NpZSwga3RvcsOpIGJ5IG1vaGxpIHpsZXDFoWnFpSBqZWhvIHZ5c3ZldMS+b3ZhY2l1IHNjaG9wbm9zxaUuIEFrIHPDuiBrb2VmaWNpZW50eSBcKFxnYW1tYV8yXCkgYSBcKFxnYW1tYV8zXCkgxaF0YXRpc3RpY2t5IHbDvXpuYW1uw6ksIHpuYW1lbsOhIHRvLCDFvmUgcMO0dm9kbsO9IG1vZGVsIGJvbCBuZXNwcsOhdm5lIMWhcGVjaWZpa292YW7DvS4gICAgIAoKYGBge3J9CiMgTGluZcOhcm55IG1vZGVsOgptb2RlbCA8LSBsbShBQVBMX3JldCB+IEdMRF9yZXQgKyBYTEVfcmV0ICsgU1BZX3JldCwgZGF0YSA9IHJldF9kZikKc3VtbWFyeShtb2RlbCkKCiMgUkVTRVQgdGVzdDoKbGlicmFyeShsbXRlc3QpCnJlc2V0dGVzdChtb2RlbCwgcG93ZXIgPSAyOjMsIHR5cGUgPSAicmVncmVzc29yIikKCmBgYAojIyMgKkludGVycHJldMOhY2lhIHJlZ3Jlc27DqWhvIG1vZGVsdSogICAgCgpLb27FoXRhbnRhIG1vZGVsdSBuaWUgamUgxaF0YXRpc3RpY2t5IHbDvXpuYW1uw6EsIMSNbyB6bmFtZW7DoSwgxb5lIHByaSBudWxvdsO9Y2ggaG9kbm90w6FjaCB2xaFldGvDvWNoIHZ5c3ZldMS+dWrDumNpY2ggcHJlbWVubsO9Y2ggc2Egb8SNYWvDoXZhbsO9w6EgdsO9bm9zbm9zxaUgYWtjaWUgQXBwbGUgdsO9cmF6bmUgbmVsw63FoWkgb2QgbnVseS4KClByZW1lbm7DoSBHTERfcmV0IG5ldnlrYXp1amUgxaF0YXRpc3RpY2t5IHbDvXpuYW1uw70gdnBseXYgKHAgPSAwLjk3MjIpLCDEjW8gbmF6bmHEjXVqZSwgxb5lIGRlbm7DqSBwb2h5YnkgY2VueSB6bGF0YSBuaWUgc8O6IHN5c3RlbWF0aWNreSBwcmVwb2plbsOpIHMgdsO9bm9zbm9zxaVhbWkgYWtjaWUgQXBwbGUuCgpQcmVtZW5uw6EgWExFX3JldCBqZSDFoXRhdGlzdGlja3kgdsO9em5hbW7DoSBuYSAxJSBobGFkaW5lIChwID0gMC4wMDYxKSBhIGplaiBrb2VmaWNpZW50IGplIG5lZ2F0w612bnkuIFRvIHpuYW1lbsOhLCDFvmUgcmFzdCBlbmVyZ2V0aWNrw6lobyBzZWt0b3JhIGplIHNwb2plbsO9IHMgcG9rbGVzb20gdsO9bm9zbm9zdMOtIEFwcGxlLCDEjW8gbcO0xb5lIG5hem5hxI1vdmHFpSBzZWt0b3JvdsOpIHByZXN1bnkga2FwaXTDoWx1IGFsZWJvIGN5a2xpY2vDqSBlZmVrdHkgdiBla29ub21pa2UuCgpOYWp2w71yYXpuZWrFocOtIHZwbHl2IG3DoSBwcmVtZW5uw6EgU1BZX3JldCwga3RvcsOhIGplIHZ5c29rbyDFoXRhdGlzdGlja3kgdsO9em5hbW7DoSAocCA8IDJlLTE2KS4gSmVqIGtvZWZpY2llbnQgKDEuMDM5NikgbmF6bmHEjXVqZSwgxb5lIEFwcGxlIHNhIHNwcsOhdmEgdmXEvm1pIHBvZG9ibmUgYWtvIMWhaXLFocOtIHRyaCByZXByZXplbnRvdmFuw70gaW5kZXhvbSBTJlAgNTAwLiBUbyBqZSBrb256aXN0ZW50bsOpIHMgdMO9bSwgxb5lIEFwcGxlIGplIHZlxL5rb3Ugc8O6xI1hc8Wlb3UgdG9odG8gdHJodSBhIGplaG8gdsO9dm9qIGplIHMgaW5kZXhvbSDDunprbyBzcMOkdMO9LgoKSG9kbm90YSBSwrIgPSAwLjMxMjIgYSBBZGp1c3RlZCBSwrIgPSAwLjMwMzggem5hbWVuw6EsIMW+ZSBtb2RlbCB2eXN2ZXTEvnVqZSBwcmlibGnFvm5lIDMxICUgdmFyaWFiaWxpdHkgZGVubsO9Y2ggdsO9bm9zb3YgQXBwbGUuIFYga29udGV4dGUgZmluYW7EjW7DvWNoIMSNYXNvdsO9Y2ggcmFkb3YsIGt0b3LDqSBzw7ogcHJpcm9kemVuZSB2ZcS+bWkgdm9sYXRpbG7DqSBhIG92cGx5dm5lbsOpIHZlxL5rw71tIG1ub8W+c3R2b20gbsOhaG9kbsO9Y2ggZmFrdG9yb3YsIGlkZSBvIGJlxb5uw7ogYSBha2NlcHRvdmF0ZcS+bsO6IMO6cm92ZcWIIHZ5c3ZldGxlbmlhLgoKTW9kZWwgYWtvIGNlbG9rIGplIMWhdGF0aXN0aWNreSB2w716bmFtbsO9IChGLXN0YXRpc3RpYyA9IDM3LjM3OyBwIDwgMi4yZS0xNiksIMSNbyB6bmFtZW7DoSwgxb5lIHZ5c3ZldMS+dWrDumNlIHByZW1lbm7DqSBzcG9sb8SNbsSbIHbDvXpuYW1uZSBvdnBseXbFiHVqw7ogdsO9bm9zbm9zxaUgQXBwbGUuCiAgICAgCiMjIyAqSW50ZXJwcmV0w6FjaWEgUkVTRVQgdGVzdHUqICAgICAKQ2llxL5vbSBSRVNFVCB0ZXN0dSBqZSBvdmVyacWlIHNwcsOhdm51IMWhcGVjaWZpa8OhY2l1IG1vZGVsdSwgdGVkYSBwb3PDumRpxaUsIMSNaSBww7R2b2Ruw70gbW9kZWwgbmV6YW5lZGLDoXZhIG5lbGluZcOhcm5lIHZ6xaVhaHkgYWxlYm8gaW7DqSBkw7RsZcW+aXTDqSBmdW5rxI1uw6kgdsOkemJ5LgoKVsO9c2xlZG9rIHRlc3R1IGplOgoKUkVTRVQgPSAxLjEzMzcKCnAtaG9kbm90YSA9IDAuMzQzMwoKS2XEj8W+ZSBwLWhvZG5vdGEgamUgdsO9cmF6bmUgdnnFocWhaWEgYWtvIGJlxb5uZSBwb3XFvsOtdmFuw6EgaGxhZGluYSB2w716bmFtbm9zdGkgMC4wNSwgbmV6YW1pZXRhbWUgbnVsb3bDuiBoeXBvdMOpenUgc3Byw6F2bmVqIMWhcGVjaWZpa8OhY2llIG1vZGVsdS4gVG8gem5hbWVuw6EsIMW+ZSBuaWUgamUgZMO0a2F6IG8gdG9tLCDFvmUgYnkgbW9kZWwgdHJwZWwgesOhdmHFvm5vdSBjaHlibm91IMWhcGVjaWZpa8OhY2lvdSBhIGplaG8gZnVua8SNbsOhIGZvcm1hIHNhIGphdsOtIGFrbyB2aG9kbsOhLgoKIyMgR3JhZmlja8OhIGFuYWzDvXphCgojIyMgR3JhZiAqUmVzaWR1YWxzIHZzLiBGaXR0ZWQqCgpHcmFmaWNrw6EgYW5hbMO9emEgdnrFpWFodSBtZWR6aSB2eXJvdm5hbsO9bWkgaG9kbm90YW1pIG7DoWhvZG5laiBwcmVtZW5uZWogYSByZXrDrWR1YW1pOgoKYGBge3J9CnBsb3QobW9kZWwsIHdoaWNoID0gMSkKYGBgCkdyYWYgUmVzaWR1YWxzIHZzLiBGaXR0ZWQgem9icmF6dWplIHZ6xaVhaCBtZWR6aSB2eXJvdm5hbsO9bWkgaG9kbm90YW1pIG1vZGVsdSBhIGplaG8gcmV6w61kdWFtaS4gQm9keSBzw7ogcm96bWllc3RuZW7DqSByZWxhdMOtdm5lIG7DoWhvZG5lIG9rb2xvIGhvcml6b250w6FsbmVqIG9zaSwgxI1vIG5hem5hxI11amUsIMW+ZSBtb2RlbCBuZXNww7Rzb2J1amUgc3lzdGVtYXRpY2vDqSBjaHlieSB2byB2eXN2ZXTEvm92YW7DrSB2YXJpw6FjaWUgdsO9bm9zb3YgQXBwbGUuIFRyZW5kb3bDoSDEjWlhcmEgKMSNZXJ2ZW7DoSkgamUgdGFrbWVyIHZvZG9yb3Zuw6EsIMSNbyBwb2Rwb3J1amUgcHJlZHBva2xhZCwgxb5lIHZ6xaVhaCBtZWR6aSBwcmVtZW5uw71taSBqZSBwcmlibGnFvm5lIGxpbmXDoXJueS4KClZpZGl0ZcS+bsOpIHPDuiB2xaFhayBqZWRub3RsaXbDqSBvZMS+YWhsw6kgcG96b3JvdmFuaWEgKG5hcHIuIDIwMjQtMDUtMDMsIDIwMjQtMDYtMTEgxI1pIDIwMjQtMDMtMjEpLCBrdG9yw6kgbWFqw7ogdsOkxI3FoWllIHJlesOtZHXDoSBuZcW+IHByaWVtZXIuIFRpZXRvIGJvZHkgbcO0xb51IHpuacW+b3ZhxaUgcHJlc25vc8WlIG1vZGVsdSwgYWxlIG5lcHJlZHN0YXZ1asO6IGphc27DvSB2em9yLCBrdG9yw70gYnkgbmF6bmHEjW92YWwgcG9ydcWhZW5pZSBsaW5lYXJpdHkgYWxlYm8gaGV0ZXJvc2tlZGFzdGljaXR1LiBDZWxrb3ZvIGdyYWYgbmVwcmV1a2F6dWplIHbDvXJhem5lIHN5c3RlbWF0aWNrw6kgcHJvYmzDqW15IHYgxaFwZWNpZmlrw6FjaWkgbW9kZWx1LgoKIyMjIEdyYWZ5ICpDK1IqICAKVMOhdG8gYW5hbMO9emEgbsOhbSB1bW/FvsWIdWplIHByZXNrw7ptYcWlLCDEjWkgamUgdnrFpWFoIG1lZHppIGplZG5vdGxpdsO9bWkgdnlzdmV0xL51asO6Y2ltaSBwcmVtZW5uw71taSBhIHrDoXZpc2xvdSBwcmVtZW5ub3Ugc2t1dG/EjW5lIGxpbmXDoXJueS4gVnljaMOhZHphbWUgeiBww7R2b2Ruw6lobyBtb2RlbHUKXFtBQVBMXF9yZXQgPSBcYmV0YV8wICsgXGJldGFfMSBcY2RvdCBHTERcX3JldCArIFxiZXRhXzIgXGNkb3QgWExFXF9yZXQgKyBcYmV0YV8zIFxjZG90IFNQWVxfcmV0ICsgdVxdClBvIG9kaGFkbnV0w60gdG9odG8gbW9kZWx1IHZ5a3Jlc8S+dWplbWUgY29tcG9uZW50ICsgcmVzaWR1YWwgcGxvdHMgKEMrUiBncmFmeSksIHYga3RvcsO9Y2ggc2EgbmEgenZpc2xlaiBvc2kgbmFjaMOhZHphIHbDvXJheiAKJCQKXGhhdHtcYmV0YX1faSB4X2kgKyBlCiQkCmEgbmEgdm9kb3Jvdm5laiBvc2kgaG9kbm90eSBwcmVtZW5uw71jaCB4X2kuIFRpZXRvIGdyYWZ5IHNsw7rFvmlhIG5hIGlkZW50aWZpa8OhY2l1IHByw61wYWRuw71jaCBuZWxpbmXDoXJueWNoIHZ6xaVhaG92IG1lZHppIHrDoXZpc2xvdSBwcmVtZW5ub3UgYSBqZWRub3RsaXbDvW1pIHJlZ3Jlc29ybWkuCmBgYHtyfQpjYXI6OmNyUGxvdHMobW9kZWwpCgpgYGAKCiMjIyMgKkdvbGQqICAgICAKS3JpdmthIChydcW+b3bDoSkgamUgdGFrbWVyIHZvZG9yb3Zuw6EgYSBkcsW+w60gc2EgdmXEvm1pIGJsw616a28gcHJpYW1reSBsaW5lw6FybmVobyB2esWlYWh1IChtb2Ryw6EgxI1pYXJhKS4gQm9keSBzw7ogcm96cHTDvWxlbsOpIG7DoWhvZG5lIGEgYmV6IHbDvXJhem7DqWhvIHpha3JpdmVuaWEuIFRvIG5hem5hxI11amUsIMW+ZSBtZWR6aSB2w71ub3NtaSBBcHBsZSBhIGNlbm91IHpsYXRhIG5lZXhpc3R1amUgbmVsaW5lw6FybnkgdnrFpWFoIGEgbGluZcOhcm5hIMWhcGVjaWZpa8OhY2lhIGplIHBvc3RhxI11asO6Y2EuCgojIyMjICpYTEUqIApQcmkgdGVqdG8gcHJlbWVubmVqIHNhIG5hY2jDoWR6YSBuYWptaWVybmVqxaHDrSBuw6F6bmFrIHpha3JpdmVuaWEg4oCTIGtyaXZrYSBtw6EgamVtbsO9IGtvbmvDoXZueSB0dmFyLiBUZW50byBvZGtsb24gdsWhYWsgbmllIGplIHbDvXJhem7DvSBhIGplIHNww7Rzb2JlbsO9IG5ham3DpCB2w6TEjcWhb3UgdmFyaWFiaWxpdG91IHJlesOtZHXDrSBwcmkgdnnFocWhw61jaCBob2Rub3TDoWNoIFhMRV9yZXQuIEFqIG5hcHJpZWsgdG9tdSBrcml2a2EgbmV1a2F6dWplIG5hIHBvdHJlYnUgdHJhbnNmb3Jtw6FjaWUsIGtlxI/FvmUgY2Vsa292w70gcHJpZWJlaCB6b3N0w6F2YSB6IHZlxL5rZWogxI1hc3RpIGxpbmXDoXJueS4KCiMjIyMgKlNQWSogClYgdG9tdG8gcHLDrXBhZGUgcG96b3J1amVtZSBqZWRub3puYcSNbmUgbmFqc2lsbmVqxaHDrSBsaW5lw6FybnkgdnrFpWFoLiBPYmlkdmUga3Jpdmt5IHNhIG5hY2jDoWR6YWrDuiB0YWttZXIgcHJlc25lIG5hIHNlYmUgYSBtYWrDuiBzdMO6cGFqw7pjaSB0dmFyLCDEjW8gcG90dnJkenVqZSBzaWxuw7ogbGluZcOhcm51IHbDpHpidSBtZWR6aSB2w71ub3NtaSBBcHBsZSBhIHbDvW5vc21pIMWhaXJva8OpaG8gdHJodSByZXByZXplbnRvdmFuw6lobyBpbmRleG9tIFMmUCA1MDAuIE5lZXhpc3R1amUgZMO0dm9kIG5hIHV2YcW+b3ZhbmllIG8gdHJhbnNmb3Jtw6FjaWkgdGVqdG8gcHJlbWVubmVqLgoKQytSIGdyYWZ5IG5lcHJldWthenVqw7ogcHLDrXRvbW5vc8WlIHbDvXJhem5laiBuZWxpbmVhcml0eSB2IHByw61wYWRlIMW+aWFkbmVqIHpvIHNsZWRvdmFuw71jaCBwcmVtZW5uw71jaC4gTWllcm55IG7DoXpuYWsgemFrcml2ZW5pYSBwcmkgWExFX3JldCBuaWUgamUgZG9zdGF0b8SNbmUgdsO9cmF6bsO9IG5hIHRvLCBhYnkgb2TDtHZvZG5pbCB0cmFuc2Zvcm3DoWNpdS4gUHJlIG5hxaFlIGTDoXRhIGplIHByZXRvIGxpbmXDoXJuYSDFoXBlY2lmaWvDoWNpYSBtb2RlbHUgYWRla3bDoXRuYSBhIHRyYW5zZm9ybcOhY2llIHByZW1lbm7DvWNoIG5pZSBzw7ogcG90cmVibsOpLgoKIyMgTmVsaW5lw6FybmEgxaFwZWNpZmlrw6FjaWEgCkhvY2kgdiBuYcWhb20gcHLDrXBhZGUgY29tcG9uZW50ICsgcmVzaWR1YWwgZ3JhZnkgYW5pIFJFU0VUIHRlc3QgbmVuYXpuYcSNaWxpIHByw610b21ub3PFpSB2w71yYXpuw71jaCBuZWxpbmXDoXJueWNoIHZ6xaVhaG92IG1lZHppIHZ5c3ZldMS+dWrDumNpbWkgcHJlbWVubsO9bWkgYSB2w71ub3NtaSBha2NpZSBBcHBsZSwgcHJlIMO6xI1lbHkgcG9jaG9wZW5pYSBtZXRvZGlreSBhIGplaiBwcmFrdGlja8OpaG8gcHJlY3ZpxI1lbmlhIHNhIHYgbmFzbGVkdWrDumNlaiDEjWFzdGkgcG9rw7pzaW1lIGFwbGlrb3ZhxaUgcm92bmFrw6kgcG9zdHVweSwgYWvDqSBib2xpIHV2ZWRlbsOpIHZvIHZ6b3Jvdm9tIHByw61rbGFkZS4KCkNpZcS+b20gdGVkYSBuaWUgamUga29yaWdvdmHFpSBza3V0b8SNbsO6IGNoeWJ1IHYgxaFwZWNpZmlrw6FjaWkgbW9kZWx1IChrZcSPxb5lIHrDoWtsYWRuw70gbGluZcOhcm55IG1vZGVsIHZ5aG92dWplKSwgYWxlIGRlbW9uxaF0cm92YcWlLCBha28gbW/Fvm5vIHByaSBwb3RyZWJlIG5lbGluZcOhcm5lIHVwcmF2acWlIHDDtHZvZG7DuiByZWdyZXNuw7ogcm92bmljdSwgemF2w6FkemHFpSBrdmFkcmF0aWNrw6kgxI1sZW55LCBkdW1teSBwcmVtZW5uw6kgxI1pIGxpbmXDoXJuZSBsb21lbsOpIGZ1bmtjaWUgYSBwb3Jvdm7DoXZhxaUgbW9kZWx5IHBvbW9jb3UgQU5PVkEgYSBSRVNFVCB0ZXN0b3YuCgpWIG5hxaFvbSBwcsOtcGFkZSBieSByb3rFocOtcmVuw70gbW9kZWwgbW9ob2wgbWHFpSB0dmFyOgokJCBBQVBMXF9yZXQgPSBcYmV0YV8wICsgXGJldGFfMSBHTERcX3JldCArIFxiZXRhXzIgWExFXF9yZXQgKyBcYmV0YV8zIFNQWVxfcmV0ICsgXGdhbW1hXzEgR0xEXF9yZXReezJ9ICsgXGdhbW1hXzIgWExFXF9yZXReezJ9ICsgXGdhbW1hXzMgU1BZXF9yZXReezJ9ICsgdSAkJApUZW50byB0dmFyIG1vZGVsdSBzbWUgenZvbGlsaSBwcmV0bywgYWJ5IHNtZSB1bW/Fvm5pbGkgemFjaHl0acWlIHByw61wYWRuw6kgbmVsaW5lw6FybmUgdnrFpWFoeSBtZWR6aSB2w71ub3NvbSBha2NpZSBBcHBsZSBhIGplZG5vdGxpdsO9bWkgdnlzdmV0xL51asO6Y2ltaSBwcmVtZW5uw71taS4gWmFyYWRlbmllIGt2YWRyYXRpY2vDvWNoIMSNbGVub3Ygcm96xaFpcnVqZSBww7R2b2Ruw7ogcm92bmljdSBvIG1vxb5ub3PFpSwgxb5lIMO6xI1pbm9rIHByZW1lbm7DvWNoIHNhIG3DtMW+ZSBwcmkgcsO0em55Y2ggw7pyb3ZuaWFjaCBpY2ggaG9kbsO0dCBtZW5pxaUgYSBuZW11c8OtIG1hxaUgc3RyaWt0bmUgbGluZcOhcm55IHByaWViZWguIFbEj2FrYSB0b211IG3DtMW+ZW1lIHByZXNrw7ptYcWlLCDEjWkgdGFrw6F0byDDunByYXZhIHZlZGllIGsgemxlcMWhZW5pdSDFoXRhdGlzdGlja8O9Y2ggdmxhc3Rub3N0w60gbW9kZWx1LgoKIyMjIFBvcm92bmFuaWUgesOha2xhZG7DqWhvIGEgbW9kaWZpa292YW7DqWhvIG1vZGVsdQpWIG5hZHbDpHpub3N0aSBuYSB1dmVkZW7DuiBuZWxpbmXDoXJudSDFoXBlY2lmaWvDoWNpdSBzbWUgcm96xaHDrXJpbGkgcMO0dm9kbsO9IGxpbmXDoXJueSBtb2RlbCBvIGt2YWRyYXRpY2vDqSDEjWxlbnkgdsWhZXRrw71jaCB2eXN2ZXTEvnVqw7pjaWNoIHByZW1lbm7DvWNoLiBUYWt0byB1cHJhdmVuw70gbW9kZWwgdW1vxb7FiHVqZSBwcmVza8O6bWHFpSwgxI1pIHbDvWtvbiByZWdyZXNpZSB6bGVwxaHDrSBkb3BsbmVuaWUgbmVsaW5lw6FybnljaCBlZmVrdG92LiAKYGBge3J9Cm1vZGVsX3pha2xhZG55IDwtIGxtKEFBUExfcmV0IH4gR0xEX3JldCArIFhMRV9yZXQgKyBTUFlfcmV0LAogICAgICAgICAgICAgICAgICAgICBkYXRhID0gcmV0X2RmKQoKbW9kZWxfa3ZhZHIgPC0gbG0oQUFQTF9yZXQgfiBHTERfcmV0ICsgWExFX3JldCArIFNQWV9yZXQgKwogICAgICAgICAgICAgICAgICAgICBJKEdMRF9yZXReMikgKyBJKFhMRV9yZXReMikgKyBJKFNQWV9yZXReMiksCiAgICAgICAgICAgICAgICAgICBkYXRhID0gcmV0X2RmKQoKc3VtbWFyeShtb2RlbF9rdmFkcikKYW5vdmEobW9kZWxfemFrbGFkbnksIG1vZGVsX2t2YWRyKQpyZXNldHRlc3QobW9kZWxfa3ZhZHIpCgpgYGAKUG8gcm96xaHDrXJlbsOtIHrDoWtsYWRuw6lobyBtb2RlbHUgbyBrdmFkcmF0aWNrw6kgxI1sZW55IHNhIHVrw6F6YWxvLCDFvmUgxb5pYWRueSB6IG5pY2ggbmllIGplIMWhdGF0aXN0aWNreSB2w716bmFtbsO9LiBMaW5lw6FybmUga29lZmljaWVudHkgc2kgcHJpdG9tIHphY2hvdmFsaSByb3ZuYWvDqSB2bGFzdG5vc3RpIGFrbyB2IHDDtHZvZG5vbSBtb2RlbGkg4oCTIG5hanZ5xaHFoWl1IHbDvXpuYW1ub3PFpSBtw6EgdHJob3bDvSBmYWt0b3IsIGvDvW0gb3N0YXRuw6kgcHJlbWVubsOpIHNhIHrDoXNhZG5lIG5lbWVuaWEuCgpVcHJhdmVuw70ga29lZmljaWVudCBkZXRlcm1pbsOhY2llIHNhIHBvIHByaWRhbsOtIGt2YWRyYXRpY2vDvWNoIMSNbGVub3YgenbDvcWhaWwgbGVuIG1pbmltw6FsbmUgKHpocnViYSBvIDAuMDA0KSwgxI1vIHByZWRzdGF2dWplIHZlxL5taSBtYWzDvSBwb3N1bi4gQU5PVkEgdGVzdCBuYXpuYcSNaWwsIMW+ZSByb3pkaWVsIG1lZHppIG1vZGVsbWkgbmllIGplIMWhdGF0aXN0aWNreSB2w716bmFtbsO9LCB0YWvFvmUgcm96xaHDrXJlbmllIG5lcHJpbmllc2xvIGNpdGXEvm7DqSB6bGVwxaFlbmllLgoKUkVTRVQgdGVzdCBtb2RpZmlrb3ZhbsOpaG8gbW9kZWx1IG3DoSB2eXNva8O6IHAtaG9kbm90dSwgxI1vIG9ww6TFpSBwb3R2cmR6dWplLCDFvmUgbW9kZWwgbmVvYnNhaHVqZSBjaHlibsO6IMWhcGVjaWZpa8OhY2l1LiBLdmFkcmF0aWNrw6kgxI1sZW55IHRlZGEgbmV6YWNoeXRpbGkgxb5pYWRudSBkb2RhdG/EjW7DuiBuZWxpbmVhcml0dSwga3RvcsOhIGJ5IGJvbGEgeiBoxL5hZGlza2EgdMO9Y2h0byBkw6F0IHJlbGV2YW50bsOhLgoKIyMjIFRyYW5zZm9ybcOhY2lhIHBvbW9jb3UgZHVtbXkgcHJlbWVubmVqIGEgbGluZcOhcm5laiBsb21lbmVqIGZ1bmtjaWUKViDEj2FsxaFvbSBrcm9rdSBzbWUgc2EgcG9rw7pzaWxpIHphY2h5dGnFpSBwcsOtcGFkbsO6IHptZW51IHNwcsOhdmFuaWEgbW9kZWx1IHByaSBvZGxpxaFuw71jaCBwb2RtaWVua2FjaCBuYSB0cmh1LiBOYSB0byBzbWUgemF2aWVkbGkgamVkbm9kdWNow7ogZHVtbXkgcHJlbWVubsO6LCBrdG9yw6Egb2RsacWhdWplIGRuaSBzIHbDvXJhem5lasWhw61tIHBvaHlib20gdHJodSBvZCBiZcW+bsO9Y2ggZG7DrS4gVMOhdG8gcHJlbWVubsOhIG7DoW0gdW1vxb7FiHVqZSB0ZXN0b3ZhxaUsIMSNaSBzYSB2w712b2ogesOhdmlzbGVqIHByZW1lbm5laiBsw63FoWkgbWVkemkgZHZvbWEgc2t1cGluYW1pIHBvem9yb3ZhbsOtIOKAkyBidcSPIHBvc3Vub20gdiBhdXRvbsOzbW5vbSDEjWxlbm92aSwgYWxlYm8gem1lbm91IHNrbG9udSBwcmkgamVkbmVqIHogdnlzdmV0xL51asO6Y2ljaCBwcmVtZW5uw71jaC4gT2RoYWRsaSBzbWUgcHJldG8gZHZhIG1vZGVseTogamVkZW4gcyBtb8W+bsO9bSBwb3N1bm9tIGNlbGVqIHJvdm5pY2UgYSBkcnVow70gcyBtb8W+bm91IHptZW5vdSBza2xvbnUuIE5hc2xlZHVqw7pjZSB2w71zbGVka3kgdWthenVqw7osIMSNaSB0aWV0byDDunByYXZ5IHByaW7DocWhYWrDuiB6bGVwxaFlbmllIG9wcm90aSBww7R2b2Ruw6ltdSBsaW5lw6FybmVtdSBtb2RlbHUuCgojIyMjICpNb2RlbCBzbyB6bG9tb20gdiBhdXRvbsOzbW5vbSDEjWxlbmUqIApUZW50byBtb2RlbCB1bW/FvsWIdWplLCBhYnkgc2EgY2Vsw70gdnrFpWFoIHBvc3VudWwgbmFob3IgYWxlYm8gbmFkb2wgdiBkxYhvY2gsIGtlxI8gZHVtbXkgcHJlbWVubsOhIG5hZG9iw7pkYSBob2Rub3R1IDEuIElkZSB0ZWRhIG8gdGVzdCwgxI1pIHNhIMO6cm92ZcWIIHrDoXZpc2xlaiBwcmVtZW5uZWogbMOtxaFpIG1lZHppIGR2b21hIHNrdXBpbmFtaSBwb3pvcm92YW7DrS4KCiQkCkFBUExcX3JldCA9IFxiZXRhXzAgKyBcYmV0YV9EIERVTSArIFxiZXRhXzEgR0xEXF9yZXQKKyBcYmV0YV8yIFhMRVxfcmV0ICsgXGJldGFfMyBTUFlcX3JldCArIHUKJCQKCiMjIyMgKk1vZGVsIHNvIHpsb21vbSB2IHNrbG9uZSoKViB0b210byBwcsOtcGFkZSBzYSBza8O6bWEsIMSNaSBqZSBza2xvbiByZWdyZXNuZWogcHJpYW1reSByb3pkaWVsbnkgdiB6w6F2aXNsb3N0aSBvZCBob2Rub3R5IGR1bW15IHByZW1lbm5lai4gS29lZmljaWVudCBwcmkgaW50ZXJha8SNbm9tIMSNbGVub3ZpIHVyxI11amUsIMSNaSBzYSByZWFrY2lhIHrDoXZpc2xlaiBwcmVtZW5uZWogbmEgZGFuZWogdnlzdmV0xL51asO6Y2VqIHByZW1lbm5uZWogbWVuw60gbWVkemkgZHZvbWEgc2xlZG92YW7DvW1pIHN0YXZtaS4KJCQKQUFQTFxfcmV0ID0gXGJldGFfMCArIFxiZXRhXzEgR0xEXF9yZXQgKyBcYmV0YV8yIFhMRVxfcmV0CisgXGJldGFfMyBTUFlcX3JldCArIFxiZXRhX3tEfSAoRFVNIFxjZG90IFNQWVxfcmV0KSArIHUKJCQKClByw61rbGFkIHphdmVkZW5pYSBkdW1teSBwcmVtZW5uZWogcG9kxL5hIHZlxL5rb3N0aSB0cmhvdsOpaG8gcG9oeWJ1IChuYXByLiBTUFlfcmV0IHbDpMSNxaHDrSBha28gMSAlKToKCmBgYHtyfQpyZXRfZGYkRFVNIDwtIGlmZWxzZShyZXRfZGYkU1BZX3JldCA+IDAuMDEsIDEsIDApCgptb2RlbERfYXV0byA8LSBsbShBQVBMX3JldCB+IERVTSArIEdMRF9yZXQgKyBYTEVfcmV0ICsgU1BZX3JldCwKICAgICAgICAgICAgICAgICAgZGF0YSA9IHJldF9kZikKc3VtbWFyeShtb2RlbERfYXV0bykKCm1vZGVsRF9za2xvbiA8LSBsbShBQVBMX3JldCB+IEdMRF9yZXQgKyBYTEVfcmV0ICsKICAgICAgICAgICAgICAgICAgICAgU1BZX3JldCArIEkoRFVNICogU1BZX3JldCksCiAgICAgICAgICAgICAgICAgICBkYXRhID0gcmV0X2RmKQpzdW1tYXJ5KG1vZGVsRF9za2xvbikKCmFub3ZhKG1vZGVsX3pha2xhZG55LCBtb2RlbERfc2tsb24pCnJlc2V0dGVzdChtb2RlbERfc2tsb24pCgpgYGAKIyMjIyAqSW50ZXJwcmV0w6FjaWEgbW9kZWx1IHNvIHpsb21vbSB2IGF1dG9uw7Ntbm9tIMSNbGVuZSoKUG8gZG9wbG5lbsOtIGR1bW15IHByZW1lbm5laiAoRFVNKSwga3RvcsOhIG9kZGXEvnVqZSBkbmkgcyB2ecWhxaHDrW0gcG9oeWJvbSB0cmh1IG9kIG9zdGF0bsO9Y2gsIHNhIHVrw6F6YWxvLCDFvmUgdGVudG8gZG9kYXRvxI1uw70gxI1sZW4gbmllIGplIMWhdGF0aXN0aWNreSB2w716bmFtbsO9LiBKZWhvIGtvZWZpY2llbnQgbcOhIHBvbWVybmUgdnlzb2vDuiBwLWhvZG5vdHUsIHRha8W+ZSBuZW1vxb5ubyB0dnJkacWlLCDFvmUgYnkgc2EgdsO9dm9qIHrDoXZpc2xlaiBwcmVtZW5uZWogdsO9em5hbW5lIGzDrcWhaWwgbWVkemkgZHZvbWEgc2t1cGluYW1pIHBvem9yb3ZhbsOtLiBPc3RhdG7DqSBwcmVtZW5uw6kgc2kgemFjaG92YWxpIHNwcsOhdmFuaWUgcG9kb2Juw6kgcMO0dm9kbsOpbXUgbW9kZWx1IOKAkyBuYWp2w71yYXpuZWrFocOtIHZwbHl2IG3DoSB0cmhvdsO9IGZha3Rvciwga8O9bSBvc3RhdG7DqSB6b3N0w6F2YWrDuiBzbGFixaFpZSBhbGVibyBuZXbDvXpuYW1uw6kuIEhvZG5vdGEgdXByYXZlbsOpaG8ga29lZmljaWVudHUgZGV0ZXJtaW7DoWNpZSBzYSB0YWttZXIgbmV6bWVuaWxhLCDEjW8gbmF6bmHEjXVqZSwgxb5lIHBvc3VuIGNlbGVqIHJvdm5pY2UgbmVwcmluaWVzb2wgemxlcMWhZW5pZS4KCiMjIyMgKkludGVycHJldMOhY2lhIG1vZGVsdSBzbyB6bG9tb20gdiBza2xvbmUqClYgZHJ1aG9tIGtyb2t1IHNtZSBza8O6bWFsaSwgxI1pIHNhIG3DtMW+ZSBtZW5pxaUgc2tsb24gcmVncmVzbmVqIHByaWFta3kgdiB6w6F2aXNsb3N0aSBvZCBkdW1teSBwcmVtZW5uZWouIEludGVyYWvEjW7DvSDEjWxlbiwga3RvcsO9IGJ5IG1hbCB6YWNoeXTDoXZhxaUgcm96ZGllbG5lIHNwcsOhdmFuaWUgdiBkxYhvY2ggcyB2ecWhxaHDrW0gdHJob3bDvW0gcG9oeWJvbSwgdsWhYWsgbmllIGplIMWhdGF0aXN0aWNreSB2w716bmFtbsO9LiBTYW1vdG7DqSBrb2VmaWNpZW50eSB6w6FrbGFkbsO9Y2ggcHJlbWVubsO9Y2ggc2Egb3Byb3RpIHBydsOpbXUgbW9kZWx1IHRha21lciBuZXptZW5pbGkgYSB2eXN2ZXTEvm92YWNpYSBzY2hvcG5vc8WlIG1vZGVsdSBzYSB6dsO9xaFpbGEgbGVuIG1pbmltw6FsbmUuCgpBTk9WQSBwb3Jvdm5hbmllIHrDoWtsYWRuw6lobyBhIHJvesWhw61yZW7DqWhvIG1vZGVsdSBvcMOkxaUgbmVwcmV1a8OhemFsbyDFoXRhdGlzdGlja3kgdsO9em5hbW7DqSB6bGVwxaFlbmllLiBUbyB6bmFtZW7DoSwgxb5lIGRvcGxuZW5pZSB0ZWp0byBpbnRlcmFrY2llIG1vZGVsdSBuZXBvbW9obG8gemFjaHl0acWlIMW+aWFkbnkgZMO0bGXFvml0w70gZG9kYXRvxI1uw70gdnrFpWFoLgoKIyMjIyAqUkVTRVQgdGVzdCoKUkVTRVQgdGVzdCBwcmUgcm96xaHDrXJlbsO9IG1vZGVsIG3DoSB2eXNva8O6IHAtaG9kbm90dS4gWm5hbWVuw6EgdG8sIMW+ZSBtb2RlbCBuZW9ic2FodWplIGNoeWJuw7ogxaFwZWNpZmlrw6FjaXUgYSBkb3BsbmVuaWUgemxvbXUgdiBza2xvbmUgbmllIGplIHBvdHJlYm7DqS4gVsO9c2xlZG9rIGplIGtvbnppc3RlbnRuw70gcyBwcmVkY2jDoWR6YWrDumNpbWkgemlzdGVuaWFtaSDigJMgbGluZcOhcm55IG1vZGVsIHYgbmHFoW9tIHByw61wYWRlIHBvc3RhxI11amUuCg==