Príprava databázy, čistenie a úprava údajov
Na začiatok si stiahneme naše dáta a z nich vypočítame logaritmické
výnosnosti, s ktorými následne budeme pracovať.
tickers <- c("AAPL", "GLD", "XLE", "SPY") # Apple, Gold ETF, Energy ETF, S&P500 ETF
getSymbols(tickers, from = "2024-01-01", to = "2025-01-01")
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)
Boxploty zobrazené na obrázku znázorňujú rozdelenie denných
logaritmických výnosov štyroch finančných aktív – akcie spoločnosti
Apple (AAPL), zlatého ETF fondu (GLD), energetického sektora (XLE) a
trhového indexu S&P 500 (SPY) – v období od januára 2024 do januára
2025. Tieto grafy boli vytvorené s cieľom vizuálne preskúmať základné
štatistické charakteristiky dát, identifikovať možné odľahlé hodnoty a
overiť, či sú dáta vhodné na následnú regresnú analýzu.
num_plots <- length(names(ret_df))
op <- par(mfrow = c(2, 2), mar = c(4, 4, 2, 1))
for (col in names(ret_df)) {
boxplot(ret_df[[col]], main = col, xlab = "Value", col = "lightblue")
}
par(op)
Z grafov možno pozorovať, že výnosy všetkých štyroch aktív sa
koncentrujú v blízkosti nuly, čo je typické pre denné finančné výnosy.
Rozpätie medzi horným a dolným kvartilom (interkvartilové rozpätie) je
pomerne úzke, čo naznačuje relatívne nízku volatilitu vo vybranom
období. Na každom grafe sa zároveň objavujú jednotlivé body nad a pod
boxom, ktoré predstavujú odľahlé hodnoty – dni s výraznejším rastom
alebo poklesom cien, spôsobeným trhovými výkyvmi či ekonomickými
udalosťami.
Celkovo možno konštatovať, že rozdelenia všetkých sledovaných
premenných sú približne symetrické a neobsahujú systematické odchýlky.
Dáta preto považujeme za čisté a vhodné na ďalšie spracovanie v rámci
regresnej analýzy, pričom prítomnosť niekoľkých extrémnych hodnôt
nepredstavuje významnú prekážku pre pokračovanie v modelovaní.
Lineárna regresia
model <- lm(AAPL_ret ~ GLD_ret + XLE_ret + SPY_ret, data = ret_df)
cat("\nSúhrn modelu (model):\n")
print(summary(model))
Model ako celok je štatisticky významny (p-hodnota < 0,001), čo
potvrdzuje, že aspoň jedna z vysvetľujúcich premenných významne
ovplyvňuje výnosy akcie AAPL. Hodnota koeficientu determinácie R^2=0,312
znamená, že približne 31,2 % variability výnosov akcie Apple možno
vysvetliť zmenami vo výnosoch uvedených troch aktív.
Z hľadiska jednotlivých premenných sa ukázalo, že najvýznamnejším
faktorom je vývoj trhu reprezentovaný indexom SPY, ktorého koeficient
(1,0396) je pozitívny a vysoko štatisticky významný (p < 0,001).
Tento výsledok potvrdzuje, že akcie Apple sa pohybujú v súlade s
celkovým trhovým trendom a rast trhu vedie k rastu výnosu akcie
AAPL.
Premenná XLE (energetický sektor) má záporný a štatisticky významný
koeficient (-0,1954; p = 0,0061). To naznačuje, že v sledovanom období
existoval mierne negatívny vzťah medzi výnosmi energetického sektora a
výnosmi spoločnosti Apple. Inými slovami, rast cien energetických
spoločností bol spojený s miernym poklesom akcií Apple, čo možno
vysvetliť tým, že rast cien energií zvyšuje náklady technologických
firiem.
Naopak, výnos zlata (GLD) sa v modeli neukázal ako štatisticky
významný (p = 0,9722), čo naznačuje, že pohyb cien zlata nemal v tomto
období relevantný lineárny vplyv na výnosy Apple.
Celkovo možno konštatovať, že výnos akcie Apple je silno ovplyvnený
vývojom celkového trhu (SPY), zatiaľ čo vplyv energetického sektora je
slabší a opačného smeru. Vplyv zlata je zanedbateľný. Model má primeranú
vysvetľovaciu schopnosť a spĺňa predpoklady pre ďalšie overovanie
prostredníctvom diagnostických testov.
op <- par(mfrow = c(2, 2))
plot(model)
par(op)
Na obrázku sú zobrazené diagnostické grafy regresného modelu, ktoré
slúžia na overenie splnenia základných predpokladov lineárnej regresie.
Ich cieľom je posúdiť, či sú reziduá náhodne rozdelené, majú konštantnú
varianciu, nevykazujú systematické vzory a či neexistujú odľahlé alebo
vplyvné pozorovania, ktoré by mohli skresliť výsledky modelu.
Prvý graf Residuals vs Fitted zobrazuje vzťah medzi vypočítanými
(predikovanými) hodnotami a reziduami. Väčšina bodov sa nachádza v okolí
horizontálnej osi a červená vyhladzovacia čiara je relatívne rovná, čo
naznačuje, že reziduá sú približne rovnomerne rozložené a model nemá
výrazné systematické skreslenie. Malé odchýlky od nuly naznačujú, že
model je dobre špecifikovaný a že neexistuje závažný problém
heteroskedasticity.
Druhý graf Q-Q Residuals (kvantil-kvantilový graf) porovnáva
rozdelenie štandardizovaných reziduí s teoretickým normálnym rozdelením.
Väčšina bodov sa nachádza blízko diagonálnej čiary, čo znamená, že
predpoklad normality reziduí je v zásade splnený. Odchýlky na oboch
koncoch (napr. dátumy 2024-05-03 a 2024-06-11) však poukazujú na
prítomnosť niekoľkých extrémnych hodnôt, ktoré môžu predstavovať dni s
neštandardným trhovým správaním.
Tretí graf Scale-Location (alebo Spread-Location plot) skúma, či má
rozptyl reziduí tendenciu meniť sa so zmenou predikovaných hodnôt.
Väčšina bodov je rozptýlená rovnomerne okolo červenej čiary, ktorá je
takmer vodorovná, čo naznačuje, že predpoklad homoskedasticity
(konštantnej variability chýb) je vo všeobecnosti splnený.
Posledný graf Residuals vs Leverage slúži na identifikáciu vplyvných
pozorovaní, ktoré majú potenciál výrazne ovplyvniť odhad regresných
koeficientov. Väčšina pozorovaní má nízku hodnotu pákového efektu
(leverage), pričom iba niekoľko bodov (napr. 2024-05-03, 2024-08-05 a
2024-11-06) sa nachádza bližšie k vonkajším obrysom Cookovej
vzdialenosti. Tieto body možno považovať za mierne vplyvné, no ich počet
a rozsah neohrozujú stabilitu modelu.
Celkovo možno konštatovať, že diagnostické grafy potvrdzujú vhodnosť
zvoleného modelu. Reziduá nevykazujú systematické odchýlky, majú
približne konštantný rozptyl a ich rozdelenie je blízke normálnemu.
Model preto spĺňa základné predpoklady lineárnej regresie a možno ho
považovať za štatisticky spoľahlivý.
residuals_vec <- residuals(model)
cat("\nJarque–Bera test normality (model):\n")
print(tseries::jarque.bera.test(residuals_vec))
cat("\nOutlier test (Bonferroni p-value) – car::outlierTest (model):\n")
print(car::outlierTest(model))
Výsledky testu odľahlých hodnôt (outlier test) ukazujú, že dni
2024-06-11, 2024-05-03 a 2024-03-21 predstavujú štatisticky významné
odľahlé pozorovania, ktoré mali najväčší vplyv na odhady regresného
modelu.
model2 <- lm(AAPL_ret ~ I(log(1 + SPY_ret)) + XLE_ret, data = ret_df)
cat("\nSúhrn modelu (model2):\n")
print(summary(model2))
Výsledky druhého regresného modelu (model2) predstavujú upravenú
verziu pôvodného modelu, v ktorej bola premená SPY_ret logaritmicky
transformovaná a premenná GLD_ret vylúčená z analýzy, pretože sa v
predchádzajúcom modeli ukázala ako štatisticky nevýznamná. Cieľom tejto
úpravy bolo zlepšiť interpretovateľnosť modelu a eliminovať vplyv
odľahlých hodnôt. Model ako celok je vysoko štatisticky významný (p <
0,001), čo potvrdzuje, že vysvetľujúce premenné majú významný vplyv na
výnos akcie Apple. Hodnota koeficientu determinácie R2=0,313R^2 =
0,313R2=0,313 znamená, že približne 31,3 % variability výnosov AAPL
možno vysvetliť zmenami v trhovom indexe SPY a v energetickom sektore
XLE, čo je porovnateľné s pôvodným modelom. Premenná I(log(1 + SPY_ret))
má pozitívny a vysoko štatisticky významný vplyv (koeficient 1,04; p
< 0,001), čo znamená, že výnosy akcie Apple rastú v súlade s rastom
celkového trhu reprezentovaného indexom S&P 500. Tento výsledok
potvrdzuje silnú väzbu medzi akciou Apple a trhovým indexom, čo je
typické pre technologické spoločnosti s vysokou trhovou kapitalizáciou.
Premenná XLE_ret má záporný a štatisticky významný koeficient (-0,1954;
p = 0,0054), čo naznačuje mierne negatívny vzťah medzi výnosmi
energetického sektora a výnosmi akcie Apple. Tento vzťah možno
interpretovať tak, že rast cien energií a energetických spoločností býva
sprevádzaný poklesom výnosov technologických akcií, ktoré sú citlivé na
rast nákladov a pokles spotrebiteľského dopytu. Konštanta modelu
(Intercept) nie je štatisticky významná, čo znamená, že pri nulových
výnosoch vysvetľujúcich premenných je očakávaný výnos akcie AAPL
zanedbateľný. Celkovo možno konštatovať, že druhý model potvrdil
robustnosť vzťahu medzi akciou Apple a trhovým indexom SPY, pričom
negatívny vplyv energetického sektora ostal zachovaný. Model spĺňa
požadované štatistické predpoklady a poskytuje interpretovateľné a
stabilné výsledky.
op <- par(mfrow = c(2, 2))
plot(model2)
par(op)
Diagnostické grafy pre druhý model potvrdzujú, že predpoklady
lineárnej regresie sú vo všeobecnosti splnené. Reziduá sú rovnomerne
rozložené okolo nuly a neprejavuje sa žiadny systematický vzor, čo
naznačuje správnu špecifikáciu modelu. Q-Q graf ukazuje, že rozdelenie
reziduí je blízke normálnemu, pričom malé odchýlky na koncoch (najmä
dátumy 2024-05-03 a 2024-06-11) poukazujú na prítomnosť niekoľkých
extrémnych pozorovaní. Scale-Location graf naznačuje približne
konštantný rozptyl reziduí, čo znamená, že nedochádza k výraznej
heteroskedasticite. Graf Residuals vs Leverage identifikuje len niekoľko
mierne vplyvných bodov, ktoré však neohrozujú stabilitu modelu. Celkovo
možno konštatovať, že model je dobre špecifikovaný a spĺňa požiadavky na
spoľahlivú regresnú analýzu.
residuals2 <- residuals(model2)
cat("\nJarque–Bera test normality (model2):\n")
print(tseries::jarque.bera.test(residuals2))
cat("\nOutlier test (Bonferroni p-value) – car::outlierTest (model2):\n")
print(car::outlierTest(model2))
Test odľahlých hodnôt potvrdil, že pozorovania z 11. júna 2024, 3.
mája 2024 a 21. marca 2024 sú štatisticky významné odľahlé body, ktoré
môžu mať mierny vplyv na presnosť modelu.
cat("\nBreusch–Pagan test heteroskedasticity (model2):\n")
print(lmtest::bptest(model2))
Výsledky Breusch–Paganovho testu heteroskedasticity (p = 0,7845)
ukazujú, že nezamietame nulovú hypotézu o konštantnom rozptyle reziduí,
čo znamená, že v modeli sa nepreukázala prítomnosť heteroskedasticity a
rozptyl chýb je približne rovnaký pre všetky pozorovania.
cat("\nDurbin–Watson test autokorelácie (model2):\n")
print(lmtest::dwtest(model2))
Hodnota Durbin–Watsonovho testu (DW = 2,04; p = 0,6239) naznačuje, že
medzi reziduami modelu neexistuje autokorelácia, čo znamená, že chyby sú
navzájom nezávislé a model spĺňa predpoklad nezávislosti reziduí.
cat("\nRESET test nelinearity (model2):\n")
print(lmtest::resettest(model2, power = 2:3, type = "fitted"))
Výsledky RESET testu (p = 0,2701) naznačujú, že nezamietame nulovú
hypotézu o správnej špecifikácii modelu, čo znamená, že v modeli sa
nepreukázala prítomnosť nelinearity a jeho funkčná forma je zvolená
vhodne.
cat("\nKoeficienty s robustnými smerodajnými chybami (HC1) (model2):\n")
print(lmtest::coeftest(model2, vcov = sandwich::vcovHC(model2, type = "HC1")))
Výsledky regresie s robustnými smerodajnými chybami (HC1) potvrdzujú
stabilitu a spoľahlivosť odhadnutých koeficientov. Premenná I(log(1 +
SPY_ret)) zostáva vysoko štatisticky významná (p < 0,001), čo
opätovne potvrdzuje silný pozitívny vplyv trhového indexu S&P 500 na
výnosy akcie Apple. Premenná XLE_ret si zachováva štatistickú významnosť
(p = 0,0013) aj po zohľadnení robustných smerodajných chýb, čo
potvrdzuje negatívny vzťah medzi výnosmi energetického sektora a akciou
Apple. Konštanta modelu (Intercept) nie je štatisticky významná, a preto
nemá praktický vplyv na interpretáciu výsledkov. Celkovo možno
konštatovať, že aj po úprave o heteroskedasticitu zostávajú hlavné
závery modelu nezmenené a štatisticky silné.
cat("\nVIF (multikolinearita) (model2):\n")
print(car::vif(model2))
Hodnoty faktora inflácie rozptylu (VIF) sú nízke a pohybujú sa okolo
1,1, čo znamená, že medzi vysvetľujúcimi premennými I(log(1 + SPY_ret))
a XLE_ret neexistuje multikolinearita. Premenné teda nie sú navzájom
silne korelované a model je z tohto hľadiska stabilný a spoľahlivý.
LS0tCnRpdGxlOiAiUGlhdGEgw7psb2hhIgphdXRob3I6ICcgTWlyb3NsYXZhIE1lZHZlY2vDoSAgPGJyPicKZGF0ZTogIlNlcHRlbWJlciAyMDI1IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICB0aGVtZTogdW5pdGVkCiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZQogICAgZGZfcHJpbnQ6IHBhZ2VkCmVkaXRvcl9vcHRpb25zOgogIG1hcmtkb3duOgogICAgd3JhcDogNzIKLS0tCiMgw5p2b2QgZG8gcHJvYmzDqW11LCBzdGFub3ZlbmllIGh5cG90w6l6ClYgdGVqdG8gw7psb2hlIHNrw7ptYW1lIGFrbyBzYSBsb2dhcml0bWlja8OpIHbDvW5vc25vc3RpIGFrY2llIEFwcGxlIChBUFBMKSBtZW5pYSB2IHrDoXZpc2xvc3RpIG9kIGxvZ2FyaXRtaWNrw71jaCB2w71ub3Nub3N0w60gdHJvY2ggdnlicmFuw71jaCBha3TDrXYsIEdMRCwgWExFIGEgU1BZLiAgICAgIAoqKkjigoE6KiogTG9nLXbDvW5vcyBha2NpZSAqQUFQTCogesOhdmlzw60gxaF0YXRpc3RpY2t5IHbDvXpuYW1uZSBvZCBsb2ctdsO9bm9zb3YgKkdMRCosICpYTEUqIGEgKlNQWSouICAgICAgIAoqKkjigoA6KiogTWVkemkgbG9nLXbDvW5vc29tICpBQVBMKiBhIHbDvW5vc21pIHTDvWNodG8gYWt0w612IG5lZXhpc3R1amUgxaF0YXRpc3RpY2t5IHbDvXpuYW1uw70gdnrFpWFoLgogICAgIApgYGB7cn0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KAogICAgZWNobyA9IFRSVUUsCiAgICBtZXNzYWdlID0gRkFMU0UsCiAgICB3YXJuaW5nID0gRkFMU0UKKQpgYGAKCgo8c3R5bGU+Ci8qIENlbGtvdsOpIHBvemFkaWUgKi8KYm9keSB7CiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgI2U5ZjdlYywgI2QxZjdkMiwgI2JkZWNiNik7CiAgZm9udC1mYW1pbHk6ICdIZWx2ZXRpY2EgTmV1ZScsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7CiAgY29sb3I6ICMxYjQzMzI7CiAgbGluZS1oZWlnaHQ6IDEuNzsKICBwYWRkaW5nOiAyNXB4Owp9CgovKiBIbGF2bsOpIG5hZHBpc3kg4oCTICovCmgxLCBoMiwgaDMgewogIGZvbnQtZmFtaWx5OiAnSGVsdmV0aWNhIE5ldWUnLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOwogIGxldHRlci1zcGFjaW5nOiAwLjVweDsKICBjb2xvcjogIzE0NWEzMjsKICB0ZXh0LXNoYWRvdzogMHB4IDFweCAycHggI2ZiY2ZlODsKfQo8L3N0eWxlPgoKCmBgYHtyfQpsaWJyYXJ5KHpvbykKbGlicmFyeSh0c2VyaWVzKQpsaWJyYXJ5KGxtdGVzdCkKbGlicmFyeShzYW5kd2ljaCkKbGlicmFyeShjYXIpCmxpYnJhcnkocXVhbnRtb2QpCgpgYGAKCiAgICAgICAgICAKIyBQcsOtcHJhdmEgZGF0YWLDoXp5LCDEjWlzdGVuaWUgYSDDunByYXZhIMO6ZGFqb3YgICAgICAgICAgCk5hIHphxI1pYXRvayBzaSBzdGlhaG5lbWUgbmHFoWUgZMOhdGEgYSB6IG5pY2ggdnlwb8SNw610YW1lIGxvZ2FyaXRtaWNrw6kgdsO9bm9zbm9zdGksIHMga3RvcsO9bWkgbsOhc2xlZG5lIGJ1ZGVtZSBwcmFjb3ZhxaUuIApgYGB7cn0KCnRpY2tlcnMgPC0gYygiQUFQTCIsICJHTEQiLCAiWExFIiwgIlNQWSIpICAgIyBBcHBsZSwgR29sZCBFVEYsIEVuZXJneSBFVEYsIFMmUDUwMCBFVEYKZ2V0U3ltYm9scyh0aWNrZXJzLCBmcm9tID0gIjIwMjQtMDEtMDEiLCB0byA9ICIyMDI1LTAxLTAxIikKCmRhdGEgPC0gbWVyZ2UoQ2woQUFQTCksIENsKEdMRCksIENsKFhMRSksIENsKFNQWSkpCmNvbG5hbWVzKGRhdGEpIDwtIHRpY2tlcnMKCnJldCA8LSBuYS5vbWl0KGRpZmYobG9nKGRhdGEpKSkKY29sbmFtZXMocmV0KSA8LSBwYXN0ZTAoY29sbmFtZXMocmV0KSwgIl9yZXQiKQoKcmV0X2RmIDwtIG5hLm9taXQoYXMuZGF0YS5mcmFtZShyZXQpKQpoZWFkKHJldF9kZikKYGBgCiAgICAgCkJveHBsb3R5IHpvYnJhemVuw6kgbmEgb2Jyw6F6a3Ugem7DoXpvcsWIdWrDuiByb3pkZWxlbmllIGRlbm7DvWNoIGxvZ2FyaXRtaWNrw71jaCB2w71ub3NvdiDFoXR5cm9jaCBmaW5hbsSNbsO9Y2ggYWt0w612IOKAkyBha2NpZSBzcG9sb8SNbm9zdGkgQXBwbGUgKEFBUEwpLCB6bGF0w6lobyBFVEYgZm9uZHUgKEdMRCksIGVuZXJnZXRpY2vDqWhvIHNla3RvcmEgKFhMRSkgYSB0cmhvdsOpaG8gaW5kZXh1IFMmUCA1MDAgKFNQWSkg4oCTIHYgb2Jkb2LDrSBvZCBqYW51w6FyYSAyMDI0IGRvIGphbnXDoXJhIDIwMjUuIFRpZXRvIGdyYWZ5IGJvbGkgdnl0dm9yZW7DqSBzIGNpZcS+b20gdml6dcOhbG5lIHByZXNrw7ptYcWlIHrDoWtsYWRuw6kgxaF0YXRpc3RpY2vDqSBjaGFyYWt0ZXJpc3Rpa3kgZMOhdCwgaWRlbnRpZmlrb3ZhxaUgbW/Fvm7DqSBvZMS+YWhsw6kgaG9kbm90eSBhIG92ZXJpxaUsIMSNaSBzw7ogZMOhdGEgdmhvZG7DqSBuYSBuw6FzbGVkbsO6IHJlZ3Jlc27DuiBhbmFsw716dS4gICAgIAoKYGBge3J9Cm51bV9wbG90cyA8LSBsZW5ndGgobmFtZXMocmV0X2RmKSkKb3AgPC0gcGFyKG1mcm93ID0gYygyLCAyKSwgbWFyID0gYyg0LCA0LCAyLCAxKSkKZm9yIChjb2wgaW4gbmFtZXMocmV0X2RmKSkgewogIGJveHBsb3QocmV0X2RmW1tjb2xdXSwgbWFpbiA9IGNvbCwgeGxhYiA9ICJWYWx1ZSIsIGNvbCA9ICJsaWdodGJsdWUiKQp9CnBhcihvcCkKYGBgCgpaIGdyYWZvdiBtb8W+bm8gcG96b3JvdmHFpSwgxb5lIHbDvW5vc3kgdsWhZXRrw71jaCDFoXR5cm9jaCBha3TDrXYgc2Ega29uY2VudHJ1asO6IHYgYmzDrXprb3N0aSBudWx5LCDEjW8gamUgdHlwaWNrw6kgcHJlIGRlbm7DqSBmaW5hbsSNbsOpIHbDvW5vc3kuIFJvenDDpHRpZSBtZWR6aSBob3Juw71tIGEgZG9sbsO9bSBrdmFydGlsb20gKGludGVya3ZhcnRpbG92w6kgcm96cMOkdGllKSBqZSBwb21lcm5lIMO6emtlLCDEjW8gbmF6bmHEjXVqZSByZWxhdMOtdm5lIG7DrXprdSB2b2xhdGlsaXR1IHZvIHZ5YnJhbm9tIG9iZG9iw60uIE5hIGthxb5kb20gZ3JhZmUgc2EgesOhcm92ZcWIIG9iamF2dWrDuiBqZWRub3RsaXbDqSBib2R5IG5hZCBhIHBvZCBib3hvbSwga3RvcsOpIHByZWRzdGF2dWrDuiBvZMS+YWhsw6kgaG9kbm90eSDigJMgZG5pIHMgdsO9cmF6bmVqxaHDrW0gcmFzdG9tIGFsZWJvIHBva2xlc29tIGNpZW4sIHNww7Rzb2JlbsO9bSB0cmhvdsO9bWkgdsO9a3l2bWkgxI1pIGVrb25vbWlja8O9bWkgdWRhbG9zxaVhbWkuCiAgICAgCkNlbGtvdm8gbW/Fvm5vIGtvbsWhdGF0b3ZhxaUsIMW+ZSByb3pkZWxlbmlhIHbFoWV0a8O9Y2ggc2xlZG92YW7DvWNoIHByZW1lbm7DvWNoIHPDuiBwcmlibGnFvm5lIHN5bWV0cmlja8OpIGEgbmVvYnNhaHVqw7ogc3lzdGVtYXRpY2vDqSBvZGNow71sa3kuIETDoXRhIHByZXRvIHBvdmHFvnVqZW1lIHphIMSNaXN0w6kgYSB2aG9kbsOpIG5hIMSPYWzFoWllIHNwcmFjb3ZhbmllIHYgcsOhbWNpIHJlZ3Jlc25laiBhbmFsw716eSwgcHJpxI1vbSBwcsOtdG9tbm9zxaUgbmlla2/EvmvDvWNoIGV4dHLDqW1ueWNoIGhvZG7DtHQgbmVwcmVkc3RhdnVqZSB2w716bmFtbsO6IHByZWvDocW+a3UgcHJlIHBva3JhxI1vdmFuaWUgdiBtb2RlbG92YW7DrS4KICAgICAgICAKIyBMaW5lw6FybmEgcmVncmVzaWEgCiAgICAgCmBgYHtyfQptb2RlbCA8LSBsbShBQVBMX3JldCB+IEdMRF9yZXQgKyBYTEVfcmV0ICsgU1BZX3JldCwgZGF0YSA9IHJldF9kZikKCmNhdCgiXG5Tw7pocm4gbW9kZWx1IChtb2RlbCk6XG4iKQpwcmludChzdW1tYXJ5KG1vZGVsKSkKYGBgCgpNb2RlbCBha28gY2Vsb2sgamUgxaF0YXRpc3RpY2t5IHbDvXpuYW1ueSAocC1ob2Rub3RhIDwgMCwwMDEpLCDEjW8gcG90dnJkenVqZSwgxb5lIGFzcG/FiCBqZWRuYSB6IHZ5c3ZldMS+dWrDumNpY2ggcHJlbWVubsO9Y2ggdsO9em5hbW5lIG92cGx5dsWIdWplIHbDvW5vc3kgYWtjaWUgQUFQTC4gSG9kbm90YSBrb2VmaWNpZW50dSBkZXRlcm1pbsOhY2llIFJeMj0wLDMxMiB6bmFtZW7DoSwgxb5lIHByaWJsacW+bmUgMzEsMiAlIHZhcmlhYmlsaXR5IHbDvW5vc292IGFrY2llIEFwcGxlIG1vxb5ubyB2eXN2ZXRsacWlIHptZW5hbWkgdm8gdsO9bm9zb2NoIHV2ZWRlbsO9Y2ggdHJvY2ggYWt0w612LgogICAgIApaIGjEvmFkaXNrYSBqZWRub3RsaXbDvWNoIHByZW1lbm7DvWNoIHNhIHVrw6F6YWxvLCDFvmUgbmFqdsO9em5hbW5lasWhw61tIGZha3Rvcm9tIGplIHbDvXZvaiB0cmh1IHJlcHJlemVudG92YW7DvSBpbmRleG9tIFNQWSwga3RvcsOpaG8ga29lZmljaWVudCAoMSwwMzk2KSBqZSBwb3ppdMOtdm55IGEgdnlzb2tvIMWhdGF0aXN0aWNreSB2w716bmFtbsO9IChwIDwgMCwwMDEpLiBUZW50byB2w71zbGVkb2sgcG90dnJkenVqZSwgxb5lIGFrY2llIEFwcGxlIHNhIHBvaHlidWrDuiB2IHPDumxhZGUgcyBjZWxrb3bDvW0gdHJob3bDvW0gdHJlbmRvbSBhIHJhc3QgdHJodSB2ZWRpZSBrIHJhc3R1IHbDvW5vc3UgYWtjaWUgQUFQTC4KICAgICAKUHJlbWVubsOhIFhMRSAoZW5lcmdldGlja8O9IHNla3RvcikgbcOhIHrDoXBvcm7DvSBhIMWhdGF0aXN0aWNreSB2w716bmFtbsO9IGtvZWZpY2llbnQgKC0wLDE5NTQ7IHAgPSAwLDAwNjEpLiBUbyBuYXpuYcSNdWplLCDFvmUgdiBzbGVkb3Zhbm9tIG9iZG9iw60gZXhpc3RvdmFsIG1pZXJuZSBuZWdhdMOtdm55IHZ6xaVhaCBtZWR6aSB2w71ub3NtaSBlbmVyZ2V0aWNrw6lobyBzZWt0b3JhIGEgdsO9bm9zbWkgc3BvbG/EjW5vc3RpIEFwcGxlLiBJbsO9bWkgc2xvdmFtaSwgcmFzdCBjaWVuIGVuZXJnZXRpY2vDvWNoIHNwb2xvxI1ub3N0w60gYm9sIHNwb2plbsO9IHMgbWllcm55bSBwb2tsZXNvbSBha2Npw60gQXBwbGUsIMSNbyBtb8W+bm8gdnlzdmV0bGnFpSB0w71tLCDFvmUgcmFzdCBjaWVuIGVuZXJnacOtIHp2ecWhdWplIG7DoWtsYWR5IHRlY2hub2xvZ2lja8O9Y2ggZmlyaWVtLgogICAgCk5hb3BhaywgdsO9bm9zIHpsYXRhIChHTEQpIHNhIHYgbW9kZWxpIG5ldWvDoXphbCBha28gxaF0YXRpc3RpY2t5IHbDvXpuYW1uw70gKHAgPSAwLDk3MjIpLCDEjW8gbmF6bmHEjXVqZSwgxb5lIHBvaHliIGNpZW4gemxhdGEgbmVtYWwgdiB0b210byBvYmRvYsOtIHJlbGV2YW50bsO9IGxpbmXDoXJueSB2cGx5diBuYSB2w71ub3N5IEFwcGxlLgogICAgIApDZWxrb3ZvIG1vxb5ubyBrb27FoXRhdG92YcWlLCDFvmUgdsO9bm9zIGFrY2llIEFwcGxlIGplIHNpbG5vIG92cGx5dm5lbsO9IHbDvXZvam9tIGNlbGtvdsOpaG8gdHJodSAoU1BZKSwgemF0aWHEviDEjW8gdnBseXYgZW5lcmdldGlja8OpaG8gc2VrdG9yYSBqZSBzbGFixaHDrSBhIG9wYcSNbsOpaG8gc21lcnUuIFZwbHl2IHpsYXRhIGplIHphbmVkYmF0ZcS+bsO9LiBNb2RlbCBtw6EgcHJpbWVyYW7DuiB2eXN2ZXTEvm92YWNpdSBzY2hvcG5vc8WlIGEgc3DEusWIYSBwcmVkcG9rbGFkeSBwcmUgxI9hbMWhaWUgb3Zlcm92YW5pZSBwcm9zdHJlZG7DrWN0dm9tIGRpYWdub3N0aWNrw71jaCB0ZXN0b3YuCiAgICAgCmBgYHtyfQpvcCA8LSBwYXIobWZyb3cgPSBjKDIsIDIpKQpwbG90KG1vZGVsKQpwYXIob3ApCmBgYAogICAgIApOYSBvYnLDoXprdSBzw7ogem9icmF6ZW7DqSBkaWFnbm9zdGlja8OpIGdyYWZ5IHJlZ3Jlc27DqWhvIG1vZGVsdSwga3RvcsOpIHNsw7rFvmlhIG5hIG92ZXJlbmllIHNwbG5lbmlhIHrDoWtsYWRuw71jaCBwcmVkcG9rbGFkb3YgbGluZcOhcm5laiByZWdyZXNpZS4gSWNoIGNpZcS+b20gamUgcG9zw7pkacWlLCDEjWkgc8O6IHJlemlkdcOhIG7DoWhvZG5lIHJvemRlbGVuw6ksIG1hasO6IGtvbsWhdGFudG7DuiB2YXJpYW5jaXUsIG5ldnlrYXp1asO6IHN5c3RlbWF0aWNrw6kgdnpvcnkgYSDEjWkgbmVleGlzdHVqw7ogb2TEvmFobMOpIGFsZWJvIHZwbHl2bsOpIHBvem9yb3ZhbmlhLCBrdG9yw6kgYnkgbW9obGkgc2tyZXNsacWlIHbDvXNsZWRreSBtb2RlbHUuCgpQcnbDvSBncmFmIFJlc2lkdWFscyB2cyBGaXR0ZWQgem9icmF6dWplIHZ6xaVhaCBtZWR6aSB2eXBvxI3DrXRhbsO9bWkgKHByZWRpa292YW7DvW1pKSBob2Rub3RhbWkgYSByZXppZHVhbWkuIFbDpMSNxaFpbmEgYm9kb3Ygc2EgbmFjaMOhZHphIHYgb2tvbMOtIGhvcml6b250w6FsbmVqIG9zaSBhIMSNZXJ2ZW7DoSB2eWhsYWR6b3ZhY2lhIMSNaWFyYSBqZSByZWxhdMOtdm5lIHJvdm7DoSwgxI1vIG5hem5hxI11amUsIMW+ZSByZXppZHXDoSBzw7ogcHJpYmxpxb5uZSByb3Zub21lcm5lIHJvemxvxb5lbsOpIGEgbW9kZWwgbmVtw6EgdsO9cmF6bsOpIHN5c3RlbWF0aWNrw6kgc2tyZXNsZW5pZS4gTWFsw6kgb2RjaMO9bGt5IG9kIG51bHkgbmF6bmHEjXVqw7osIMW+ZSBtb2RlbCBqZSBkb2JyZSDFoXBlY2lmaWtvdmFuw70gYSDFvmUgbmVleGlzdHVqZSB6w6F2YcW+bsO9IHByb2Jsw6ltIGhldGVyb3NrZWRhc3RpY2l0eS4KCkRydWjDvSBncmFmIFEtUSBSZXNpZHVhbHMgKGt2YW50aWwta3ZhbnRpbG92w70gZ3JhZikgcG9yb3Zuw6F2YSByb3pkZWxlbmllIMWhdGFuZGFyZGl6b3ZhbsO9Y2ggcmV6aWR1w60gcyB0ZW9yZXRpY2vDvW0gbm9ybcOhbG55bSByb3pkZWxlbsOtbS4gVsOkxI3FoWluYSBib2RvdiBzYSBuYWNow6FkemEgYmzDrXprbyBkaWFnb27DoWxuZWogxI1pYXJ5LCDEjW8gem5hbWVuw6EsIMW+ZSBwcmVkcG9rbGFkIG5vcm1hbGl0eSByZXppZHXDrSBqZSB2IHrDoXNhZGUgc3BsbmVuw70uIE9kY2jDvWxreSBuYSBvYm9jaCBrb25jb2NoIChuYXByLiBkw6F0dW15IDIwMjQtMDUtMDMgYSAyMDI0LTA2LTExKSB2xaFhayBwb3VrYXp1asO6IG5hIHByw610b21ub3PFpSBuaWVrb8S+a8O9Y2ggZXh0csOpbW55Y2ggaG9kbsO0dCwga3RvcsOpIG3DtMW+dSBwcmVkc3Rhdm92YcWlIGRuaSBzIG5lxaF0YW5kYXJkbsO9bSB0cmhvdsO9bSBzcHLDoXZhbsOtbS4KClRyZXTDrSBncmFmIFNjYWxlLUxvY2F0aW9uIChhbGVibyBTcHJlYWQtTG9jYXRpb24gcGxvdCkgc2vDum1hLCDEjWkgbcOhIHJvenB0eWwgcmV6aWR1w60gdGVuZGVuY2l1IG1lbmnFpSBzYSBzbyB6bWVub3UgcHJlZGlrb3ZhbsO9Y2ggaG9kbsO0dC4gVsOkxI3FoWluYSBib2RvdiBqZSByb3pwdMO9bGVuw6Egcm92bm9tZXJuZSBva29sbyDEjWVydmVuZWogxI1pYXJ5LCBrdG9yw6EgamUgdGFrbWVyIHZvZG9yb3Zuw6EsIMSNbyBuYXpuYcSNdWplLCDFvmUgcHJlZHBva2xhZCBob21vc2tlZGFzdGljaXR5IChrb27FoXRhbnRuZWogdmFyaWFiaWxpdHkgY2jDvWIpIGplIHZvIHbFoWVvYmVjbm9zdGkgc3BsbmVuw70uCgpQb3NsZWRuw70gZ3JhZiBSZXNpZHVhbHMgdnMgTGV2ZXJhZ2Ugc2zDusW+aSBuYSBpZGVudGlmaWvDoWNpdSB2cGx5dm7DvWNoIHBvem9yb3ZhbsOtLCBrdG9yw6kgbWFqw7ogcG90ZW5jacOhbCB2w71yYXpuZSBvdnBseXZuacWlIG9kaGFkIHJlZ3Jlc27DvWNoIGtvZWZpY2llbnRvdi4gVsOkxI3FoWluYSBwb3pvcm92YW7DrSBtw6EgbsOtemt1IGhvZG5vdHUgcMOha292w6lobyBlZmVrdHUgKGxldmVyYWdlKSwgcHJpxI1vbSBpYmEgbmlla2/EvmtvIGJvZG92IChuYXByLiAyMDI0LTA1LTAzLCAyMDI0LTA4LTA1IGEgMjAyNC0xMS0wNikgc2EgbmFjaMOhZHphIGJsacW+xaFpZSBrIHZvbmthasWhw61tIG9icnlzb20gQ29va292ZWogdnpkaWFsZW5vc3RpLiBUaWV0byBib2R5IG1vxb5ubyBwb3Zhxb5vdmHFpSB6YSBtaWVybmUgdnBseXZuw6ksIG5vIGljaCBwb8SNZXQgYSByb3pzYWggbmVvaHJvenVqw7ogc3RhYmlsaXR1IG1vZGVsdS4KCkNlbGtvdm8gbW/Fvm5vIGtvbsWhdGF0b3ZhxaUsIMW+ZSBkaWFnbm9zdGlja8OpIGdyYWZ5IHBvdHZyZHp1asO6IHZob2Rub3PFpSB6dm9sZW7DqWhvIG1vZGVsdS4gUmV6aWR1w6EgbmV2eWthenVqw7ogc3lzdGVtYXRpY2vDqSBvZGNow71sa3ksIG1hasO6IHByaWJsacW+bmUga29uxaF0YW50bsO9IHJvenB0eWwgYSBpY2ggcm96ZGVsZW5pZSBqZSBibMOtemtlIG5vcm3DoWxuZW11LiBNb2RlbCBwcmV0byBzcMS6xYhhIHrDoWtsYWRuw6kgcHJlZHBva2xhZHkgbGluZcOhcm5laiByZWdyZXNpZSBhIG1vxb5ubyBobyBwb3Zhxb5vdmHFpSB6YSDFoXRhdGlzdGlja3kgc3BvxL5haGxpdsO9LiAgICAgCgpgYGB7cn0KcmVzaWR1YWxzX3ZlYyA8LSByZXNpZHVhbHMobW9kZWwpCgpjYXQoIlxuSmFycXVl4oCTQmVyYSB0ZXN0IG5vcm1hbGl0eSAobW9kZWwpOlxuIikKcHJpbnQodHNlcmllczo6amFycXVlLmJlcmEudGVzdChyZXNpZHVhbHNfdmVjKSkKCmNhdCgiXG5PdXRsaWVyIHRlc3QgKEJvbmZlcnJvbmkgcC12YWx1ZSkg4oCTIGNhcjo6b3V0bGllclRlc3QgKG1vZGVsKTpcbiIpCnByaW50KGNhcjo6b3V0bGllclRlc3QobW9kZWwpKQpgYGAKICAgICAKVsO9c2xlZGt5IHRlc3R1IG9kxL5haGzDvWNoIGhvZG7DtHQgKG91dGxpZXIgdGVzdCkgdWthenVqw7osIMW+ZSBkbmkgMjAyNC0wNi0xMSwgMjAyNC0wNS0wMyBhIDIwMjQtMDMtMjEgcHJlZHN0YXZ1asO6IMWhdGF0aXN0aWNreSB2w716bmFtbsOpIG9kxL5haGzDqSBwb3pvcm92YW5pYSwga3RvcsOpIG1hbGkgbmFqdsOkxI3FocOtIHZwbHl2IG5hIG9kaGFkeSByZWdyZXNuw6lobyBtb2RlbHUuCiAgICAgCmBgYHtyfQptb2RlbDIgPC0gbG0oQUFQTF9yZXQgfiBJKGxvZygxICsgU1BZX3JldCkpICsgWExFX3JldCwgZGF0YSA9IHJldF9kZikKCmNhdCgiXG5Tw7pocm4gbW9kZWx1IChtb2RlbDIpOlxuIikKcHJpbnQoc3VtbWFyeShtb2RlbDIpKQpgYGAKCiAgICAKVsO9c2xlZGt5IGRydWjDqWhvIHJlZ3Jlc27DqWhvIG1vZGVsdSAobW9kZWwyKSBwcmVkc3RhdnVqw7ogdXByYXZlbsO6IHZlcnppdSBww7R2b2Ruw6lobyBtb2RlbHUsIHYga3RvcmVqIGJvbGEgcHJlbWVuw6EgU1BZX3JldCBsb2dhcml0bWlja3kgdHJhbnNmb3Jtb3ZhbsOhIGEgcHJlbWVubsOhIEdMRF9yZXQgdnlsw7rEjWVuw6EgeiBhbmFsw716eSwgcHJldG/FvmUgc2EgdiBwcmVkY2jDoWR6YWrDumNvbSBtb2RlbGkgdWvDoXphbGEgYWtvIMWhdGF0aXN0aWNreSBuZXbDvXpuYW1uw6EuIENpZcS+b20gdGVqdG8gw7pwcmF2eSBib2xvIHpsZXDFoWnFpSBpbnRlcnByZXRvdmF0ZcS+bm9zxaUgbW9kZWx1IGEgZWxpbWlub3ZhxaUgdnBseXYgb2TEvmFobMO9Y2ggaG9kbsO0dC4KTW9kZWwgYWtvIGNlbG9rIGplIHZ5c29rbyDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSAocCA8IDAsMDAxKSwgxI1vIHBvdHZyZHp1amUsIMW+ZSB2eXN2ZXTEvnVqw7pjZSBwcmVtZW5uw6kgbWFqw7ogdsO9em5hbW7DvSB2cGx5diBuYSB2w71ub3MgYWtjaWUgQXBwbGUuIEhvZG5vdGEga29lZmljaWVudHUgZGV0ZXJtaW7DoWNpZSBSMj0wLDMxM1JeMiA9IDAsMzEzUjI9MCwzMTMgem5hbWVuw6EsIMW+ZSBwcmlibGnFvm5lIDMxLDMgJSB2YXJpYWJpbGl0eSB2w71ub3NvdiBBQVBMIG1vxb5ubyB2eXN2ZXRsacWlIHptZW5hbWkgdiB0cmhvdm9tIGluZGV4ZSBTUFkgYSB2IGVuZXJnZXRpY2tvbSBzZWt0b3JlIFhMRSwgxI1vIGplIHBvcm92bmF0ZcS+bsOpIHMgcMO0dm9kbsO9bSBtb2RlbG9tLgpQcmVtZW5uw6EgSShsb2coMSArIFNQWV9yZXQpKSBtw6EgcG96aXTDrXZueSBhIHZ5c29rbyDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSB2cGx5diAoa29lZmljaWVudCAxLDA0OyBwIDwgMCwwMDEpLCDEjW8gem5hbWVuw6EsIMW+ZSB2w71ub3N5IGFrY2llIEFwcGxlIHJhc3TDuiB2IHPDumxhZGUgcyByYXN0b20gY2Vsa292w6lobyB0cmh1IHJlcHJlemVudG92YW7DqWhvIGluZGV4b20gUyZQIDUwMC4gVGVudG8gdsO9c2xlZG9rIHBvdHZyZHp1amUgc2lsbsO6IHbDpHpidSBtZWR6aSBha2Npb3UgQXBwbGUgYSB0cmhvdsO9bSBpbmRleG9tLCDEjW8gamUgdHlwaWNrw6kgcHJlIHRlY2hub2xvZ2lja8OpIHNwb2xvxI1ub3N0aSBzIHZ5c29rb3UgdHJob3ZvdSBrYXBpdGFsaXrDoWNpb3UuClByZW1lbm7DoSBYTEVfcmV0IG3DoSB6w6Fwb3Juw70gYSDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSBrb2VmaWNpZW50ICgtMCwxOTU0OyBwID0gMCwwMDU0KSwgxI1vIG5hem5hxI11amUgbWllcm5lIG5lZ2F0w612bnkgdnrFpWFoIG1lZHppIHbDvW5vc21pIGVuZXJnZXRpY2vDqWhvIHNla3RvcmEgYSB2w71ub3NtaSBha2NpZSBBcHBsZS4gVGVudG8gdnrFpWFoIG1vxb5ubyBpbnRlcnByZXRvdmHFpSB0YWssIMW+ZSByYXN0IGNpZW4gZW5lcmdpw60gYSBlbmVyZ2V0aWNrw71jaCBzcG9sb8SNbm9zdMOtIGLDvXZhIHNwcmV2w6FkemFuw70gcG9rbGVzb20gdsO9bm9zb3YgdGVjaG5vbG9naWNrw71jaCBha2Npw60sIGt0b3LDqSBzw7ogY2l0bGl2w6kgbmEgcmFzdCBuw6FrbGFkb3YgYSBwb2tsZXMgc3BvdHJlYml0ZcS+c2vDqWhvIGRvcHl0dS4KS29uxaF0YW50YSBtb2RlbHUgKEludGVyY2VwdCkgbmllIGplIMWhdGF0aXN0aWNreSB2w716bmFtbsOhLCDEjW8gem5hbWVuw6EsIMW+ZSBwcmkgbnVsb3bDvWNoIHbDvW5vc29jaCB2eXN2ZXTEvnVqw7pjaWNoIHByZW1lbm7DvWNoIGplIG/EjWFrw6F2YW7DvSB2w71ub3MgYWtjaWUgQUFQTCB6YW5lZGJhdGXEvm7DvS4gQ2Vsa292byBtb8W+bm8ga29uxaF0YXRvdmHFpSwgxb5lIGRydWjDvSBtb2RlbCBwb3R2cmRpbCByb2J1c3Rub3PFpSB2esWlYWh1IG1lZHppIGFrY2lvdSBBcHBsZSBhIHRyaG92w71tIGluZGV4b20gU1BZLCBwcmnEjW9tIG5lZ2F0w612bnkgdnBseXYgZW5lcmdldGlja8OpaG8gc2VrdG9yYSBvc3RhbCB6YWNob3ZhbsO9LiBNb2RlbCBzcMS6xYhhIHBvxb5hZG92YW7DqSDFoXRhdGlzdGlja8OpIHByZWRwb2tsYWR5IGEgcG9za3l0dWplIGludGVycHJldG92YXRlxL5uw6kgYSBzdGFiaWxuw6kgdsO9c2xlZGt5LgogICAgIApgYGB7cn0Kb3AgPC0gcGFyKG1mcm93ID0gYygyLCAyKSkKcGxvdChtb2RlbDIpCnBhcihvcCkKYGBgCiAgICAgCkRpYWdub3N0aWNrw6kgZ3JhZnkgcHJlIGRydWjDvSBtb2RlbCBwb3R2cmR6dWrDuiwgxb5lIHByZWRwb2tsYWR5IGxpbmXDoXJuZWogcmVncmVzaWUgc8O6IHZvIHbFoWVvYmVjbm9zdGkgc3BsbmVuw6kuIFJlemlkdcOhIHPDuiByb3Zub21lcm5lIHJvemxvxb5lbsOpIG9rb2xvIG51bHkgYSBuZXByZWphdnVqZSBzYSDFvmlhZG55IHN5c3RlbWF0aWNrw70gdnpvciwgxI1vIG5hem5hxI11amUgc3Byw6F2bnUgxaFwZWNpZmlrw6FjaXUgbW9kZWx1LiBRLVEgZ3JhZiB1a2F6dWplLCDFvmUgcm96ZGVsZW5pZSByZXppZHXDrSBqZSBibMOtemtlIG5vcm3DoWxuZW11LCBwcmnEjW9tIG1hbMOpIG9kY2jDvWxreSBuYSBrb25jb2NoIChuYWptw6QgZMOhdHVteSAyMDI0LTA1LTAzIGEgMjAyNC0wNi0xMSkgcG91a2F6dWrDuiBuYSBwcsOtdG9tbm9zxaUgbmlla2/EvmvDvWNoIGV4dHLDqW1ueWNoIHBvem9yb3ZhbsOtLiBTY2FsZS1Mb2NhdGlvbiBncmFmIG5hem5hxI11amUgcHJpYmxpxb5uZSBrb27FoXRhbnRuw70gcm96cHR5bCByZXppZHXDrSwgxI1vIHpuYW1lbsOhLCDFvmUgbmVkb2Now6FkemEgayB2w71yYXpuZWogaGV0ZXJvc2tlZGFzdGljaXRlLiBHcmFmIFJlc2lkdWFscyB2cyBMZXZlcmFnZSBpZGVudGlmaWt1amUgbGVuIG5pZWtvxL5rbyBtaWVybmUgdnBseXZuw71jaCBib2Rvdiwga3RvcsOpIHbFoWFrIG5lb2hyb3p1asO6IHN0YWJpbGl0dSBtb2RlbHUuIENlbGtvdm8gbW/Fvm5vIGtvbsWhdGF0b3ZhxaUsIMW+ZSBtb2RlbCBqZSBkb2JyZSDFoXBlY2lmaWtvdmFuw70gYSBzcMS6xYhhIHBvxb5pYWRhdmt5IG5hIHNwb8S+YWhsaXbDuiByZWdyZXNuw7ogYW5hbMO9enUuCmBgYHtyfQpyZXNpZHVhbHMyIDwtIHJlc2lkdWFscyhtb2RlbDIpCgpjYXQoIlxuSmFycXVl4oCTQmVyYSB0ZXN0IG5vcm1hbGl0eSAobW9kZWwyKTpcbiIpCnByaW50KHRzZXJpZXM6OmphcnF1ZS5iZXJhLnRlc3QocmVzaWR1YWxzMikpCgpjYXQoIlxuT3V0bGllciB0ZXN0IChCb25mZXJyb25pIHAtdmFsdWUpIOKAkyBjYXI6Om91dGxpZXJUZXN0IChtb2RlbDIpOlxuIikKcHJpbnQoY2FyOjpvdXRsaWVyVGVzdChtb2RlbDIpKQpgYGAKICAgICAKVGVzdCBvZMS+YWhsw71jaCBob2Ruw7R0IHBvdHZyZGlsLCDFvmUgcG96b3JvdmFuaWEgeiAxMS4gasO6bmEgMjAyNCwgMy4gbcOhamEgMjAyNCBhIDIxLiBtYXJjYSAyMDI0IHPDuiDFoXRhdGlzdGlja3kgdsO9em5hbW7DqSBvZMS+YWhsw6kgYm9keSwga3RvcsOpIG3DtMW+dSBtYcWlIG1pZXJueSB2cGx5diBuYSBwcmVzbm9zxaUgbW9kZWx1LgogICAgIApgYGB7cn0KY2F0KCJcbkJyZXVzY2jigJNQYWdhbiB0ZXN0IGhldGVyb3NrZWRhc3RpY2l0eSAobW9kZWwyKTpcbiIpCnByaW50KGxtdGVzdDo6YnB0ZXN0KG1vZGVsMikpCmBgYAoKVsO9c2xlZGt5IEJyZXVzY2jigJNQYWdhbm92aG8gdGVzdHUgaGV0ZXJvc2tlZGFzdGljaXR5IChwID0gMCw3ODQ1KSB1a2F6dWrDuiwgxb5lIG5lemFtaWV0YW1lIG51bG92w7ogaHlwb3TDqXp1IG8ga29uxaF0YW50bm9tIHJvenB0eWxlIHJlemlkdcOtLCDEjW8gem5hbWVuw6EsIMW+ZSB2IG1vZGVsaSBzYSBuZXByZXVrw6F6YWxhIHByw610b21ub3PFpSBoZXRlcm9za2VkYXN0aWNpdHkgYSByb3pwdHlsIGNow71iIGplIHByaWJsacW+bmUgcm92bmFrw70gcHJlIHbFoWV0a3kgcG96b3JvdmFuaWEuCiAgICAgCmBgYHtyfQpjYXQoIlxuRHVyYmlu4oCTV2F0c29uIHRlc3QgYXV0b2tvcmVsw6FjaWUgKG1vZGVsMik6XG4iKQpwcmludChsbXRlc3Q6OmR3dGVzdChtb2RlbDIpKQpgYGAKCkhvZG5vdGEgRHVyYmlu4oCTV2F0c29ub3ZobyB0ZXN0dSAoRFcgPSAyLDA0OyBwID0gMCw2MjM5KSBuYXpuYcSNdWplLCDFvmUgbWVkemkgcmV6aWR1YW1pIG1vZGVsdSBuZWV4aXN0dWplIGF1dG9rb3JlbMOhY2lhLCDEjW8gem5hbWVuw6EsIMW+ZSBjaHlieSBzw7ogbmF2esOham9tIG5lesOhdmlzbMOpIGEgbW9kZWwgc3DEusWIYSBwcmVkcG9rbGFkIG5lesOhdmlzbG9zdGkgcmV6aWR1w60uCiAgICAgCmBgYHtyfQpjYXQoIlxuUkVTRVQgdGVzdCBuZWxpbmVhcml0eSAobW9kZWwyKTpcbiIpCnByaW50KGxtdGVzdDo6cmVzZXR0ZXN0KG1vZGVsMiwgcG93ZXIgPSAyOjMsIHR5cGUgPSAiZml0dGVkIikpCmBgYAoKVsO9c2xlZGt5IFJFU0VUIHRlc3R1IChwID0gMCwyNzAxKSBuYXpuYcSNdWrDuiwgxb5lIG5lemFtaWV0YW1lIG51bG92w7ogaHlwb3TDqXp1IG8gc3Byw6F2bmVqIMWhcGVjaWZpa8OhY2lpIG1vZGVsdSwgxI1vIHpuYW1lbsOhLCDFvmUgdiBtb2RlbGkgc2EgbmVwcmV1a8OhemFsYSBwcsOtdG9tbm9zxaUgbmVsaW5lYXJpdHkgYSBqZWhvIGZ1bmvEjW7DoSBmb3JtYSBqZSB6dm9sZW7DoSB2aG9kbmUuICAgICAKCgpgYGB7cn0KY2F0KCJcbktvZWZpY2llbnR5IHMgcm9idXN0bsO9bWkgc21lcm9kYWpuw71taSBjaHliYW1pIChIQzEpIChtb2RlbDIpOlxuIikKcHJpbnQobG10ZXN0Ojpjb2VmdGVzdChtb2RlbDIsIHZjb3YgPSBzYW5kd2ljaDo6dmNvdkhDKG1vZGVsMiwgdHlwZSA9ICJIQzEiKSkpCmBgYAoKVsO9c2xlZGt5IHJlZ3Jlc2llIHMgcm9idXN0bsO9bWkgc21lcm9kYWpuw71taSBjaHliYW1pIChIQzEpIHBvdHZyZHp1asO6IHN0YWJpbGl0dSBhIHNwb8S+YWhsaXZvc8WlIG9kaGFkbnV0w71jaCBrb2VmaWNpZW50b3YuIFByZW1lbm7DoSBJKGxvZygxICsgU1BZX3JldCkpIHpvc3TDoXZhIHZ5c29rbyDFoXRhdGlzdGlja3kgdsO9em5hbW7DoSAocCA8IDAsMDAxKSwgxI1vIG9ww6R0b3ZuZSBwb3R2cmR6dWplIHNpbG7DvSBwb3ppdMOtdm55IHZwbHl2IHRyaG92w6lobyBpbmRleHUgUyZQIDUwMCBuYSB2w71ub3N5IGFrY2llIEFwcGxlLiBQcmVtZW5uw6EgWExFX3JldCBzaSB6YWNob3bDoXZhIMWhdGF0aXN0aWNrw7ogdsO9em5hbW5vc8WlIChwID0gMCwwMDEzKSBhaiBwbyB6b2jEvmFkbmVuw60gcm9idXN0bsO9Y2ggc21lcm9kYWpuw71jaCBjaMO9YiwgxI1vIHBvdHZyZHp1amUgbmVnYXTDrXZueSB2esWlYWggbWVkemkgdsO9bm9zbWkgZW5lcmdldGlja8OpaG8gc2VrdG9yYSBhIGFrY2lvdSBBcHBsZS4gS29uxaF0YW50YSBtb2RlbHUgKEludGVyY2VwdCkgbmllIGplIMWhdGF0aXN0aWNreSB2w716bmFtbsOhLCBhIHByZXRvIG5lbcOhIHByYWt0aWNrw70gdnBseXYgbmEgaW50ZXJwcmV0w6FjaXUgdsO9c2xlZGtvdi4gQ2Vsa292byBtb8W+bm8ga29uxaF0YXRvdmHFpSwgxb5lIGFqIHBvIMO6cHJhdmUgbyBoZXRlcm9za2VkYXN0aWNpdHUgem9zdMOhdmFqw7ogaGxhdm7DqSB6w6F2ZXJ5IG1vZGVsdSBuZXptZW5lbsOpIGEgxaF0YXRpc3RpY2t5IHNpbG7DqS4KICAgIApgYGB7cn0KY2F0KCJcblZJRiAobXVsdGlrb2xpbmVhcml0YSkgKG1vZGVsMik6XG4iKQpwcmludChjYXI6OnZpZihtb2RlbDIpKQpgYGAKCkhvZG5vdHkgZmFrdG9yYSBpbmZsw6FjaWUgcm96cHR5bHUgKFZJRikgc8O6IG7DrXprZSBhIHBvaHlidWrDuiBzYSBva29sbyAxLDEsIMSNbyB6bmFtZW7DoSwgxb5lIG1lZHppIHZ5c3ZldMS+dWrDumNpbWkgcHJlbWVubsO9bWkgSShsb2coMSArIFNQWV9yZXQpKSBhIFhMRV9yZXQgbmVleGlzdHVqZSBtdWx0aWtvbGluZWFyaXRhLiBQcmVtZW5uw6kgdGVkYSBuaWUgc8O6IG5hdnrDoWpvbSBzaWxuZSBrb3JlbG92YW7DqSBhIG1vZGVsIGplIHogdG9odG8gaMS+YWRpc2thIHN0YWJpbG7DvSBhIHNwb8S+YWhsaXbDvS4KICAgIAogICAgCiMgQm9udXMtIENBUE0gCkFrbyBkb3Bsbm9rIGsgdmlhY27DoXNvYm5laiByZWdyZXNpaSBvZGhhZHVqZW1lIENBUE0gKG1hcmtldCBtb2RlbCksIHYga3Rvcm9tIGplIGxvZ2FyaXRtaWNrw6EgdsO9bm9zbm9zxaUgYWtjaWUgQXBwbGUgdnlzdmV0bGVuw6EgdsO9bm9zbm9zxaVvdSB0cmhvdsOpaG8gaW5kZXh1IFMmUCA1MDAgKFNQWSkuCiAgICAKYGBge3J9CiMgPT09PT09IENBUE0gLyBNYXJrZXQgbW9kZWw6IEFBUEwgdnMuIFNQWSA9PT09PT0KIyBBQVBMX3JldCA9IGFscGhhICsgYmV0YSAqIFNQWV9yZXQgKyB1X3QKCmNhcG0gPC0gbG0oQUFQTF9yZXQgfiBTUFlfcmV0LCBkYXRhID0gcmV0X2RmKQpzdW1tYXJ5KGNhcG0pCgojIHJvYnVzdG7DqSBzbWVyb2Rham7DqSBjaHlieSAoSEMxKQpsbXRlc3Q6OmNvZWZ0ZXN0KGNhcG0sIHZjb3YgPSBzYW5kd2ljaDo6dmNvdkhDKGNhcG0sIHR5cGUgPSAiSEMxIikpCgojIDk1ICUgaW50ZXJ2YWwgc3BvxL5haGxpdm9zdGkgcHJlIGJldGEKY29uZmludChjYXBtLCAiU1BZX3JldCIsIGxldmVsID0gMC45NSkKCiMgdcW+aXRvxI1uw6kgdmVsacSNaW55CmFscGhhX2NhcG0gPC0gY29lZihjYXBtKVsxXQpiZXRhX2NhcG0gIDwtIGNvZWYoY2FwbSlbMl0KcjJfY2FwbSAgICA8LSBzdW1tYXJ5KGNhcG0pJHIuc3F1YXJlZApjKGFscGhhX2NhcG0gPSBhbHBoYV9jYXBtLCBiZXRhX2NhcG0gPSBiZXRhX2NhcG0sIHIyID0gcjJfY2FwbSkKCmBgYAogICAgIApWw71zbGVka3kgbW9kZWx1IENBUE0gcG90dnJkenVqw7ogc2lsbsO6IHbDpHpidSBtZWR6aSB2w71ub3NtaSBha2NpZSBBcHBsZSAoQUFQTCkgYSB2w712b2pvbSBjZWxrb3bDqWhvIHRyaHUsIGt0b3LDvSByZXByZXplbnR1amUgaW5kZXggUyZQIDUwMCAoU1BZKS4gT2RoYWRudXTDvSBrb2VmaWNpZW50IM6yPTAsOTUgbmF6bmHEjXVqZSwgxb5lIGFrY2llIEFwcGxlIHJlYWd1asO6IHZlxL5taSBwb2RvYm5lIGFrbyBzYW1vdG7DvSB0cmgg4oCTIGFrIHRyaCBzdMO6cG5lIG8gMSAlLCB2w71ub3MgQXBwbGUgc2EgdiBwcmllbWVyZSB6dsO9xaFpIHByaWJsacW+bmUgbyAwLDk1ICUuIElkZSB0ZWRhIG8gdGl0dWwgcyB0YWttZXIgcHJpZW1lcm7DvW0gdHJob3bDvW0gcml6aWtvbSwgxI1vIGplIHByZSB2ZcS+a8O6IGEgc3RhYmlsbsO6IHRlY2hub2xvZ2lja8O6IHNwb2xvxI1ub3PFpSB0eXBpY2vDqS4KCktvZWZpY2llbnQgzrEgKGludGVyY2VwdCkgbmllIGplIMWhdGF0aXN0aWNreSB2w716bmFtbsO9LCDEjW8gem5hbWVuw6EsIMW+ZSBha2NpZSBBcHBsZSB2IHNsZWRvdmFub20gb2Jkb2LDrSBuZWRvc2Fob3ZhbGkgc3lzdGVtYXRpY2t5IHZ5xaHFoWllIGFuaSBuacW+xaFpZSB2w71ub3N5IG9wcm90aSBvxI1ha8OhdmFuaWFtIG5hIHrDoWtsYWRlIHRyaG92w6lobyB2w712b2phLiBIb2Rub3RhIFJeMj0wLDI5IHVrYXp1amUsIMW+ZSBwcmlibGnFvm5lIDI5ICUgdmFyaWFiaWxpdHkgdsO9bm9zb3YgYWtjaWUgQXBwbGUgbW/Fvm5vIHZ5c3ZldGxpxaUgcG9oeWJvbSB0cmh1LCB6dnnFoW9rIHrDoXZpc8OtIG9kIGZha3Rvcm92IMWhcGVjaWZpY2vDvWNoIHByZSBzYW1vdG7DuiBmaXJtdSBhbGVibyB0ZWNobm9sb2dpY2vDvSBzZWt0b3IuCgpaw6F2ZXJvbSBtb8W+bm8gcG92ZWRhxaUsIMW+ZSBtb2RlbCBDQVBNIHBvdHZyZHp1amUgb8SNYWvDoXZhbmllLCDFvmUgbmFqc2lsbmVqxaFpYSB6w6F2aXNsb3PFpSB2w71ub3NvdiBBcHBsZSBqZSBvZCBjZWxrb3bDqWhvIHRyaG92w6lobyB2w712b2phIChTUFkpLiBUbyB6bmFtZW7DoSwgxb5lIHbDvWtvbm5vc8WlIGFrY2llIGplIMO6emtvIHByZXBvamVuw6EgcyBuw6FsYWRvdSBuYSBmaW5hbsSNbsO9Y2ggdHJob2NoIGEgem1lbmFtaSB2IMWhaXLFoW9tIGVrb25vbWlja29tIHByb3N0cmVkw60u