knitr::opts_chunk$set(
echo = TRUE,
message = FALSE,
warning = FALSE
)
#jednoduchá tabulka Meno <- c(“Jana”, “Jozef”, “Mária”) Vek <-
c(10, 11, 9) Body <- c(85, 92, 78) udaje <- data.frame(Meno, Vek,
Body) udaje udaje\(Vek
mean(udaje\)Vek) udaje[Meno == “Jozef”,] udaje[3,] udaje[, 2:3]
udaje[1, 1] summary(udaje) MaAuto <- c(TRUE, FALSE, TRUE) udaje <-
cbind(udaje, MaAuto) udaje novy.riadok <- data.frame(Meno = “Diana”,
Vek = 22.485, Body = 42, MaAuto = FALSE) udaje <- rbind(udaje,
novy.riadok) udaje
#Tabuľky – kableExtra library(knitr) library(kableExtra)
kable( udaje, digits = 2, align = c(“l”,“c”,“l”,“r”), caption = “Toto
je tabuľka” ) %>% kable_styling( bootstrap_options =
c(“striped”,“hover”,“condensed”,“responsive”), full_width = FALSE,
position = “center” )
#Tidyverse – moderná práca s údajmi library(tidyverse)
#Výber a triedenie udaje %>% filter(Body > 50) %>%
arrange(desc(Body)) %>% kable() %>% kable_styling(full_width =
FALSE)
#Zoskupovanie a sumarizácia udaje %>% group_by(MaAuto) %>%
summarise( Priemer = mean(Body), Pocet = n(), .groups = “drop” ) %>%
kable( caption = “Priemerné Body podľa premennej MaAuto”, col.names =
c(“Má auto”,“Priemer Body”,“Počet”) ) %>% kable_styling(full_width =
FALSE)
#Vytvorenie novej premennej udaje %>% mutate( grade = case_when(
Body >= 90 ~ “A”, Body >= 80 ~ “B”, Body >= 70 ~ “C”, TRUE ~
“D” ), VekPoPlnoletosti = round(Vek - 18) ) %>% kable() %>%
kable_styling(full_width = FALSE)
#Databázy v R library(datasets)
ds_datasets <- as.data.frame(utils::data(package =
“datasets”)$results)[, c(“Item”,“Title”)] kable(head(ds_datasets, 20),
col.names = c(“Dataset”,“Title”))
head(CO2) # install.packages(“wooldridge”) # odkomentovať pri prvej
inštalácii
library(wooldridge)
ds_wool <- as.data.frame(utils::data(package =
“wooldridge”)$results)[, c(“Item”,“Title”)] kable(head(ds_wool, 20),
col.names = c(“Dataset”,“Title”)) %>% kable_styling(
bootstrap_options = c(“striped”,“hover”,“condensed”,“responsive”),
full_width = FALSE, position = “center” )
#Moja databáza – WDI (krajiny V4) Import WDI dát #
install.packages(“WDI”) # ak treba
library(WDI) library(dplyr)
countries <- c(“SVK”,“CZE”,“POL”,“HUN”)
indicators <- c( GDP.PCAP = “NY.GDP.PCAP.KD”, INFLATION =
“FP.CPI.TOTL.ZG”, UNEMP = “SL.UEM.TOTL.ZS”, EXPORTS = “NE.EXP.GNFS.ZS”
)
mojedata <- WDI( country = countries, indicator = indicators,
start = 2000, end = 2023 )
mojedata <- mojedata %>% rename(COUNTRY = country, YEAR = year)
%>% arrange(COUNTRY, YEAR)
head(mojedata)
#Export a opätovný import CSV write.csv2(mojedata,
“mojedata_WDI_V4.csv”, row.names = FALSE)
mojedata_csv <- read.csv2( “mojedata_WDI_V4.csv”, header = TRUE,
sep = “;”, dec = “.” )
head(mojedata_csv) colnames(mojedata_csv)
#Grafy na dátach WDI Podmnožina pre rok 2015 mojedata_2015 <-
mojedata %>% filter(YEAR == 2015) %>% select(COUNTRY, GDP.PCAP,
INFLATION, UNEMP, EXPORTS)
mojedata_2015
#Scatter plot: HDP vs. exporty library(ggplot2)
ggplot(mojedata_2015, aes(x = EXPORTS, y = GDP.PCAP, color =
COUNTRY)) + geom_point(size = 3) + theme_minimal() + labs( title = “HDP
na obyvateľa vs. exporty (% HDP), rok 2015”, x = “Exporty (% HDP)”, y =
“HDP na obyvateľa (konštantné USD)”, color = “Krajina” )
#Boxplot: HDP podľa krajiny ggplot(mojedata_2015, aes(x = COUNTRY, y
= GDP.PCAP)) + geom_boxplot(fill = “lightblue”, color = “darkblue”) +
theme_minimal() + labs( title = “Rozdelenie HDP na obyvateľa podľa
krajiny (2015)”, x = “Krajina”, y = “HDP na obyvateľa (konštantné USD)”
)
#Základné štatistiky – HDP na obyvateľa library(knitr)
wdi.stats <- mojedata %>% filter(YEAR %in% 2010:2020) %>%
group_by(YEAR) %>% summarise( n = n(), mean = mean(GDP.PCAP, na.rm =
TRUE), sd = sd(GDP.PCAP, na.rm = TRUE), min = min(GDP.PCAP, na.rm =
TRUE), q25 = quantile(GDP.PCAP, 0.25, na.rm = TRUE), median =
median(GDP.PCAP, na.rm = TRUE), q75 = quantile(GDP.PCAP, 0.75, na.rm =
TRUE), max = max(GDP.PCAP, na.rm = TRUE), .groups = “drop” )
kable(wdi.stats, digits = 2, caption = “Základné štatistiky HDP na
obyvateľa (2010–2020, krajiny V4)”)
#kableExtra – krajšia tabuľka library(kableExtra)
wdi.stats %>% kable( digits = 2, caption = “Základné štatistiky
HDP na obyvateľa (2010–2020, krajiny V4)” ) %>% kable_styling(
full_width = FALSE, bootstrap_options = c(“striped”,“hover”,“condensed”)
) %>% column_spec(1, bold = TRUE) %>% row_spec(0, bold = TRUE,
background = “#f2f2f2”) %>% add_header_above(c(” ” = 2, “HDP
štatistiky” = 7))
#t-test: Porovnanie HDP v rokoch 2005 a 2015 t.test( mojedata\(GDP.PCAP[mojedata\)YEAR == 2005],
mojedata\(GDP.PCAP[mojedata\)YEAR ==
2015] )
#ANOVA: Porovnanie HDP medzi krajinami (2015) anova.result <-
aov(GDP.PCAP ~ COUNTRY, data = mojedata_2015) summary(anova.result)
#Lineárna regresia: HDP ~ inflácia + nezamestnanosť + exporty wdi_reg
<- mojedata %>% filter(YEAR == 2015) %>% select(GDP.PCAP,
INFLATION, UNEMP, EXPORTS) %>% na.omit()
model <- lm(GDP.PCAP ~ INFLATION + UNEMP + EXPORTS, data =
wdi_reg) summary(model)
#Regresné koeficienty – broom + kableExtra #
install.packages(c(“broom”,“stringr”)) # ak treba
library(broom) library(stringr)
coef.tbl <- tidy(model, conf.int = TRUE) %>% mutate( term =
recode(term, “(Intercept)” = “Intercept”, “INFLATION” = “Inflácia”,
“UNEMP” = “Nezamestnanosť”, “EXPORTS” = “Exporty (% HDP)” ), stars =
case_when( p.value < 0.001 ~ “”, p.value < 0.01 ~
””, p.value < 0.05 ~ ””, p.value < 0.1 ~ “·”, TRUE ~
“” ) ) %>% transmute( Term = term, Estimate = estimate,
Std. Error= std.error, t value = statistic,
p value = p.value, 95% CI = str_c(“[”,
round(conf.low,3), ”, ”, round(conf.high,3), ”]”), Sig = stars )
coef.tbl %>% kable( digits = 3, caption = “OLS koeficienty (HDP na
obyvateľa ~ inflácia + nezamestnanosť + exporty)” ) %>%
kable_styling( full_width = FALSE, bootstrap_options =
c(“striped”,“hover”,“condensed”) ) %>% column_spec(1, bold = TRUE)
%>% row_spec(0, bold = TRUE, background = “#f2f2f2”) %>% footnote(
general = “Signif. codes: *** p<0.001, ** p<0.01, * p<0.05, ·
p<0.1.”, threeparttable = TRUE )
#Model Fit Statistics fit.tbl <- glance(model) %>% transmute(
R-squared = r.squared, Adj. R-squared =
adj.r.squared, F-statistic = statistic,
F p-value = p.value, AIC = AIC,
BIC = BIC, Num. obs. = nobs )
fit.tbl %>% kable(digits = 3, caption = “Model Fit Statistics”)
%>% kable_styling( full_width = FALSE, bootstrap_options =
c(“condensed”) )
LS0tCnRpdGxlOiAiUHLDoWNhIHMgZGF0YWLDoXpvdSDigJMgV0RJIChWNCBrcmFqaW55KSIKYXV0aG9yOiAiTmF0w6FsaWEgU29saWdvdsOhICA8YnI+CihzIHZ5dcW+aXTDrW0gdmVyZWpuZSBkb3N0dXBuw71jaCBrw7Nkb3YpIgpkYXRlOiAiU2VwdGVtYmVyIDIwMjUiCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICB0aGVtZTogdW5pdGVkCiAgICBoaWdobGlnaHQ6IHRhbmdvCmVkaXRvcl9vcHRpb25zOiAKICBtYXJrZG93bjogCiAgICB3cmFwOiA3MgotLS0KCmBgYHtyfQprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgICBlY2hvID0gVFJVRSwKICAgIG1lc3NhZ2UgPSBGQUxTRSwKICAgIHdhcm5pbmcgPSBGQUxTRQopCmBgYAoKI2plZG5vZHVjaMOhIHRhYnVsa2EKTWVubyA8LSBjKCJKYW5hIiwgIkpvemVmIiwgIk3DoXJpYSIpClZlayAgPC0gYygxMCwgMTEsIDkpCkJvZHkgPC0gYyg4NSwgOTIsIDc4KQp1ZGFqZSA8LSBkYXRhLmZyYW1lKE1lbm8sIFZlaywgQm9keSkKdWRhamUKdWRhamUkVmVrCm1lYW4odWRhamUkVmVrKQp1ZGFqZVtNZW5vID09ICJKb3plZiIsXQp1ZGFqZVszLF0KdWRhamVbLCAyOjNdCnVkYWplWzEsIDFdCnN1bW1hcnkodWRhamUpCk1hQXV0byA8LSBjKFRSVUUsIEZBTFNFLCBUUlVFKQp1ZGFqZSAgPC0gY2JpbmQodWRhamUsIE1hQXV0bykKdWRhamUKbm92eS5yaWFkb2sgPC0gZGF0YS5mcmFtZShNZW5vID0gIkRpYW5hIiwgVmVrID0gMjIuNDg1LCBCb2R5ID0gNDIsIE1hQXV0byA9IEZBTFNFKQp1ZGFqZSA8LSByYmluZCh1ZGFqZSwgbm92eS5yaWFkb2spCnVkYWplCgojVGFidcS+a3kg4oCTIGthYmxlRXh0cmEKbGlicmFyeShrbml0cikKbGlicmFyeShrYWJsZUV4dHJhKQoKa2FibGUoCnVkYWplLApkaWdpdHMgID0gMiwKYWxpZ24gICA9IGMoImwiLCJjIiwibCIsInIiKSwKY2FwdGlvbiA9ICJUb3RvIGplIHRhYnXEvmthIgopICU+JQprYWJsZV9zdHlsaW5nKApib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCJob3ZlciIsImNvbmRlbnNlZCIsInJlc3BvbnNpdmUiKSwKZnVsbF93aWR0aCAgICAgICAgPSBGQUxTRSwKcG9zaXRpb24gICAgICAgICAgPSAiY2VudGVyIgopCgojVGlkeXZlcnNlIOKAkyBtb2Rlcm7DoSBwcsOhY2EgcyDDumRham1pCmxpYnJhcnkodGlkeXZlcnNlKQoKI1bDvWJlciBhIHRyaWVkZW5pZQp1ZGFqZSAlPiUKZmlsdGVyKEJvZHkgPiA1MCkgJT4lCmFycmFuZ2UoZGVzYyhCb2R5KSkgJT4lCmthYmxlKCkgJT4lCmthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFKQoKI1pvc2t1cG92YW5pZSBhIHN1bWFyaXrDoWNpYQp1ZGFqZSAlPiUKZ3JvdXBfYnkoTWFBdXRvKSAlPiUKc3VtbWFyaXNlKApQcmllbWVyID0gbWVhbihCb2R5KSwKUG9jZXQgICA9IG4oKSwKLmdyb3VwcyA9ICJkcm9wIgopICU+JQprYWJsZSgKY2FwdGlvbiAgID0gIlByaWVtZXJuw6kgQm9keSBwb2TEvmEgcHJlbWVubmVqIE1hQXV0byIsCmNvbC5uYW1lcyA9IGMoIk3DoSBhdXRvIiwiUHJpZW1lciBCb2R5IiwiUG/EjWV0IikKKSAlPiUKa2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UpCgojVnl0dm9yZW5pZSBub3ZlaiBwcmVtZW5uZWoKdWRhamUgJT4lCm11dGF0ZSgKZ3JhZGUgPSBjYXNlX3doZW4oCkJvZHkgPj0gOTAgfiAiQSIsCkJvZHkgPj0gODAgfiAiQiIsCkJvZHkgPj0gNzAgfiAiQyIsClRSVUUgICAgICAgfiAiRCIKKSwKVmVrUG9QbG5vbGV0b3N0aSA9IHJvdW5kKFZlayAtIDE4KQopICU+JQprYWJsZSgpICU+JQprYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSkKCiNEYXRhYsOhenkgdiBSCmxpYnJhcnkoZGF0YXNldHMpCgpkc19kYXRhc2V0cyA8LSBhcy5kYXRhLmZyYW1lKHV0aWxzOjpkYXRhKHBhY2thZ2UgPSAiZGF0YXNldHMiKSRyZXN1bHRzKVssIGMoIkl0ZW0iLCJUaXRsZSIpXQprYWJsZShoZWFkKGRzX2RhdGFzZXRzLCAyMCksIGNvbC5uYW1lcyA9IGMoIkRhdGFzZXQiLCJUaXRsZSIpKQoKaGVhZChDTzIpCiMgaW5zdGFsbC5wYWNrYWdlcygid29vbGRyaWRnZSIpICAjIG9ka29tZW50b3ZhxaUgcHJpIHBydmVqIGluxaF0YWzDoWNpaQoKbGlicmFyeSh3b29sZHJpZGdlKQoKZHNfd29vbCA8LSBhcy5kYXRhLmZyYW1lKHV0aWxzOjpkYXRhKHBhY2thZ2UgPSAid29vbGRyaWRnZSIpJHJlc3VsdHMpWywgYygiSXRlbSIsIlRpdGxlIildCmthYmxlKGhlYWQoZHNfd29vbCwgMjApLCBjb2wubmFtZXMgPSBjKCJEYXRhc2V0IiwiVGl0bGUiKSkgJT4lCmthYmxlX3N0eWxpbmcoCmJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsImhvdmVyIiwiY29uZGVuc2VkIiwicmVzcG9uc2l2ZSIpLApmdWxsX3dpZHRoICAgICAgICA9IEZBTFNFLApwb3NpdGlvbiAgICAgICAgICA9ICJjZW50ZXIiCikKCiNNb2phIGRhdGFiw6F6YSDigJMgV0RJIChrcmFqaW55IFY0KSBJbXBvcnQgV0RJIGTDoXQKIyBpbnN0YWxsLnBhY2thZ2VzKCJXREkiKSAgIyBhayB0cmViYQoKbGlicmFyeShXREkpCmxpYnJhcnkoZHBseXIpCgpjb3VudHJpZXMgPC0gYygiU1ZLIiwiQ1pFIiwiUE9MIiwiSFVOIikKCmluZGljYXRvcnMgPC0gYygKR0RQLlBDQVAgID0gIk5ZLkdEUC5QQ0FQLktEIiwKSU5GTEFUSU9OID0gIkZQLkNQSS5UT1RMLlpHIiwKVU5FTVAgICAgID0gIlNMLlVFTS5UT1RMLlpTIiwKRVhQT1JUUyAgID0gIk5FLkVYUC5HTkZTLlpTIgopCgptb2plZGF0YSA8LSBXREkoCmNvdW50cnkgICA9IGNvdW50cmllcywKaW5kaWNhdG9yID0gaW5kaWNhdG9ycywKc3RhcnQgICAgID0gMjAwMCwKZW5kICAgICAgID0gMjAyMwopCgptb2plZGF0YSA8LSBtb2plZGF0YSAlPiUKcmVuYW1lKENPVU5UUlkgPSBjb3VudHJ5LCBZRUFSID0geWVhcikgJT4lCmFycmFuZ2UoQ09VTlRSWSwgWUVBUikKCmhlYWQobW9qZWRhdGEpCgojRXhwb3J0IGEgb3DDpHRvdm7DvSBpbXBvcnQgQ1NWCndyaXRlLmNzdjIobW9qZWRhdGEsICJtb2plZGF0YV9XRElfVjQuY3N2Iiwgcm93Lm5hbWVzID0gRkFMU0UpCgptb2plZGF0YV9jc3YgPC0gcmVhZC5jc3YyKAoibW9qZWRhdGFfV0RJX1Y0LmNzdiIsCmhlYWRlciA9IFRSVUUsCnNlcCAgICA9ICI7IiwKZGVjICAgID0gIi4iCikKCmhlYWQobW9qZWRhdGFfY3N2KQpjb2xuYW1lcyhtb2plZGF0YV9jc3YpCgojR3JhZnkgbmEgZMOhdGFjaCBXREkgUG9kbW5vxb5pbmEgcHJlIHJvayAyMDE1Cm1vamVkYXRhXzIwMTUgPC0gbW9qZWRhdGEgJT4lCmZpbHRlcihZRUFSID09IDIwMTUpICU+JQpzZWxlY3QoQ09VTlRSWSwgR0RQLlBDQVAsIElORkxBVElPTiwgVU5FTVAsIEVYUE9SVFMpCgptb2plZGF0YV8yMDE1CgojU2NhdHRlciBwbG90OiBIRFAgdnMuIGV4cG9ydHkKbGlicmFyeShnZ3Bsb3QyKQoKZ2dwbG90KG1vamVkYXRhXzIwMTUsIGFlcyh4ID0gRVhQT1JUUywgeSA9IEdEUC5QQ0FQLCBjb2xvciA9IENPVU5UUlkpKSArCmdlb21fcG9pbnQoc2l6ZSA9IDMpICsKdGhlbWVfbWluaW1hbCgpICsKbGFicygKdGl0bGUgPSAiSERQIG5hIG9ieXZhdGXEvmEgdnMuIGV4cG9ydHkgKCUgSERQKSwgcm9rIDIwMTUiLAp4ICAgICA9ICJFeHBvcnR5ICglIEhEUCkiLAp5ICAgICA9ICJIRFAgbmEgb2J5dmF0ZcS+YSAoa29uxaF0YW50bsOpIFVTRCkiLApjb2xvciA9ICJLcmFqaW5hIgopCgojQm94cGxvdDogSERQIHBvZMS+YSBrcmFqaW55CmdncGxvdChtb2plZGF0YV8yMDE1LCBhZXMoeCA9IENPVU5UUlksIHkgPSBHRFAuUENBUCkpICsKZ2VvbV9ib3hwbG90KGZpbGwgPSAibGlnaHRibHVlIiwgY29sb3IgPSAiZGFya2JsdWUiKSArCnRoZW1lX21pbmltYWwoKSArCmxhYnMoCnRpdGxlID0gIlJvemRlbGVuaWUgSERQIG5hIG9ieXZhdGXEvmEgcG9kxL5hIGtyYWppbnkgKDIwMTUpIiwKeCAgICAgPSAiS3JhamluYSIsCnkgICAgID0gIkhEUCBuYSBvYnl2YXRlxL5hIChrb27FoXRhbnRuw6kgVVNEKSIKKQoKI1rDoWtsYWRuw6kgxaF0YXRpc3Rpa3kg4oCTIEhEUCBuYSBvYnl2YXRlxL5hCmxpYnJhcnkoa25pdHIpCgp3ZGkuc3RhdHMgPC0gbW9qZWRhdGEgJT4lCmZpbHRlcihZRUFSICVpbiUgMjAxMDoyMDIwKSAlPiUKZ3JvdXBfYnkoWUVBUikgJT4lCnN1bW1hcmlzZSgKbiAgICAgID0gbigpLAptZWFuICAgPSBtZWFuKEdEUC5QQ0FQLCBuYS5ybSA9IFRSVUUpLApzZCAgICAgPSBzZChHRFAuUENBUCwgbmEucm0gPSBUUlVFKSwKbWluICAgID0gbWluKEdEUC5QQ0FQLCBuYS5ybSA9IFRSVUUpLApxMjUgICAgPSBxdWFudGlsZShHRFAuUENBUCwgMC4yNSwgbmEucm0gPSBUUlVFKSwKbWVkaWFuID0gbWVkaWFuKEdEUC5QQ0FQLCBuYS5ybSA9IFRSVUUpLApxNzUgICAgPSBxdWFudGlsZShHRFAuUENBUCwgMC43NSwgbmEucm0gPSBUUlVFKSwKbWF4ICAgID0gbWF4KEdEUC5QQ0FQLCBuYS5ybSA9IFRSVUUpLAouZ3JvdXBzID0gImRyb3AiCikKCmthYmxlKHdkaS5zdGF0cywgZGlnaXRzID0gMiwKY2FwdGlvbiA9ICJaw6FrbGFkbsOpIMWhdGF0aXN0aWt5IEhEUCBuYSBvYnl2YXRlxL5hICgyMDEw4oCTMjAyMCwga3JhamlueSBWNCkiKQoKI2thYmxlRXh0cmEg4oCTIGtyYWrFoWlhIHRhYnXEvmthCmxpYnJhcnkoa2FibGVFeHRyYSkKCndkaS5zdGF0cyAlPiUKa2FibGUoCmRpZ2l0cyAgPSAyLApjYXB0aW9uID0gIlrDoWtsYWRuw6kgxaF0YXRpc3Rpa3kgSERQIG5hIG9ieXZhdGXEvmEgKDIwMTDigJMyMDIwLCBrcmFqaW55IFY0KSIKKSAlPiUKa2FibGVfc3R5bGluZygKZnVsbF93aWR0aCAgICAgICAgPSBGQUxTRSwKYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwiaG92ZXIiLCJjb25kZW5zZWQiKQopICU+JQpjb2x1bW5fc3BlYygxLCBib2xkID0gVFJVRSkgJT4lCnJvd19zcGVjKDAsIGJvbGQgPSBUUlVFLCBiYWNrZ3JvdW5kID0gIiNmMmYyZjIiKSAlPiUKYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDIsICJIRFAgxaF0YXRpc3Rpa3kiID0gNykpCgojdC10ZXN0OiBQb3Jvdm5hbmllIEhEUCB2IHJva29jaCAyMDA1IGEgMjAxNQp0LnRlc3QoCm1vamVkYXRhJEdEUC5QQ0FQW21vamVkYXRhJFlFQVIgPT0gMjAwNV0sCm1vamVkYXRhJEdEUC5QQ0FQW21vamVkYXRhJFlFQVIgPT0gMjAxNV0KKQoKI0FOT1ZBOiBQb3Jvdm5hbmllIEhEUCBtZWR6aSBrcmFqaW5hbWkgKDIwMTUpCmFub3ZhLnJlc3VsdCA8LSBhb3YoR0RQLlBDQVAgfiBDT1VOVFJZLCBkYXRhID0gbW9qZWRhdGFfMjAxNSkKc3VtbWFyeShhbm92YS5yZXN1bHQpCgojTGluZcOhcm5hIHJlZ3Jlc2lhOiBIRFAgfiBpbmZsw6FjaWEgKyBuZXphbWVzdG5hbm9zxaUgKyBleHBvcnR5CndkaV9yZWcgPC0gbW9qZWRhdGEgJT4lCmZpbHRlcihZRUFSID09IDIwMTUpICU+JQpzZWxlY3QoR0RQLlBDQVAsIElORkxBVElPTiwgVU5FTVAsIEVYUE9SVFMpICU+JQpuYS5vbWl0KCkKCm1vZGVsIDwtIGxtKEdEUC5QQ0FQIH4gSU5GTEFUSU9OICsgVU5FTVAgKyBFWFBPUlRTLCBkYXRhID0gd2RpX3JlZykKc3VtbWFyeShtb2RlbCkKCiNSZWdyZXNuw6kga29lZmljaWVudHkg4oCTIGJyb29tICsga2FibGVFeHRyYQojIGluc3RhbGwucGFja2FnZXMoYygiYnJvb20iLCJzdHJpbmdyIikpICAjIGFrIHRyZWJhCgpsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KHN0cmluZ3IpCgpjb2VmLnRibCA8LSB0aWR5KG1vZGVsLCBjb25mLmludCA9IFRSVUUpICU+JQptdXRhdGUoCnRlcm0gPSByZWNvZGUodGVybSwKIihJbnRlcmNlcHQpIiA9ICJJbnRlcmNlcHQiLAoiSU5GTEFUSU9OIiAgID0gIkluZmzDoWNpYSIsCiJVTkVNUCIgICAgICAgPSAiTmV6YW1lc3RuYW5vc8WlIiwKIkVYUE9SVFMiICAgICA9ICJFeHBvcnR5ICglIEhEUCkiCiksCnN0YXJzID0gY2FzZV93aGVuKApwLnZhbHVlIDwgMC4wMDEgfiAiKioqIiwKcC52YWx1ZSA8IDAuMDEgIH4gIioqIiwKcC52YWx1ZSA8IDAuMDUgIH4gIioiLApwLnZhbHVlIDwgMC4xICAgfiAiwrciLApUUlVFICAgICAgICAgICAgfiAiIgopCikgJT4lCnRyYW5zbXV0ZSgKVGVybSAgICAgICAgPSB0ZXJtLApFc3RpbWF0ZSAgICA9IGVzdGltYXRlLApgU3RkLiBFcnJvcmA9IHN0ZC5lcnJvciwKYHQgdmFsdWVgICAgPSBzdGF0aXN0aWMsCmBwIHZhbHVlYCAgID0gcC52YWx1ZSwKYDk1JSBDSWAgICAgPSBzdHJfYygiWyIsIHJvdW5kKGNvbmYubG93LDMpLCAiLCAiLCByb3VuZChjb25mLmhpZ2gsMyksICJdIiksClNpZyAgICAgICAgID0gc3RhcnMKKQoKY29lZi50YmwgJT4lCmthYmxlKApkaWdpdHMgID0gMywKY2FwdGlvbiA9ICJPTFMga29lZmljaWVudHkgKEhEUCBuYSBvYnl2YXRlxL5hIH4gaW5mbMOhY2lhICsgbmV6YW1lc3RuYW5vc8WlICsgZXhwb3J0eSkiCikgJT4lCmthYmxlX3N0eWxpbmcoCmZ1bGxfd2lkdGggICAgICAgID0gRkFMU0UsCmJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsImhvdmVyIiwiY29uZGVuc2VkIikKKSAlPiUKY29sdW1uX3NwZWMoMSwgYm9sZCA9IFRSVUUpICU+JQpyb3dfc3BlYygwLCBib2xkID0gVFJVRSwgYmFja2dyb3VuZCA9ICIjZjJmMmYyIikgJT4lCmZvb3Rub3RlKApnZW5lcmFsID0gIlNpZ25pZi4gY29kZXM6ICoqKiBwPDAuMDAxLCAqKiBwPDAuMDEsICogcDwwLjA1LCDCtyBwPDAuMS4iLAp0aHJlZXBhcnR0YWJsZSA9IFRSVUUKKQoKI01vZGVsIEZpdCBTdGF0aXN0aWNzCmZpdC50YmwgPC0gZ2xhbmNlKG1vZGVsKSAlPiUKdHJhbnNtdXRlKApgUi1zcXVhcmVkYCAgICAgID0gci5zcXVhcmVkLApgQWRqLiBSLXNxdWFyZWRgID0gYWRqLnIuc3F1YXJlZCwKYEYtc3RhdGlzdGljYCAgICA9IHN0YXRpc3RpYywKYEYgcC12YWx1ZWAgICAgICA9IHAudmFsdWUsCmBBSUNgICAgICAgICAgICAgPSBBSUMsCmBCSUNgICAgICAgICAgICAgPSBCSUMsCmBOdW0uIG9icy5gICAgICAgPSBub2JzCikKCmZpdC50YmwgJT4lCmthYmxlKGRpZ2l0cyA9IDMsIGNhcHRpb24gPSAiTW9kZWwgRml0IFN0YXRpc3RpY3MiKSAlPiUKa2FibGVfc3R5bGluZygKZnVsbF93aWR0aCAgICAgICAgPSBGQUxTRSwKYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJjb25kZW5zZWQiKQop