Načítanie dát:

library(dplyr)

udaje <- read.csv("World Happiness Report 2005-2021.csv",
                  sep = ",", header = TRUE)

# vyberieme Krajinu, Rok a 4 premenné
cluster_data <- udaje %>%
  select(
    Country.name,
    Year,
    Life.Ladder,
    Log.GDP.per.capita,
    Social.support,
    Freedom.to.make.life.choices
  ) %>%
  na.omit()

# vytvoríme ID "Krajina_Rok" – bude slúžiť ako názov riadku
labels_id <- paste(cluster_data$Country.name, cluster_data$Year, sep = "_")

# dátový rámec len s numerickými premennými
X <- cluster_data %>%
  select(Life.Ladder,
         Log.GDP.per.capita,
         Social.support,
         Freedom.to.make.life.choices)

rownames(X) <- labels_id

# škálovanie
udaje_scaled <- scale(X)

Boxploty všetkých škálovaných premenných:

num_vars  <- as.data.frame(udaje_scaled)
num_plots <- ncol(num_vars)

par(mfrow = c(2, 2))
par(mar = c(4,4,2,1))

for (col in names(num_vars)) {
  boxplot(num_vars[[col]],
          main = col,
          col = "lightblue",
          horizontal = TRUE)
}

mtext("Boxploty numerických premenných (všetky roky WHR)",
      outer = TRUE, cex = 1.2, font = 2)

Korelačná matica:

cor_mat <- round(cor(udaje_scaled), 2)
cor_mat
                             Life.Ladder Log.GDP.per.capita Social.support
Life.Ladder                         1.00               0.78           0.71
Log.GDP.per.capita                  0.78               1.00           0.69
Social.support                      0.71               0.69           1.00
Freedom.to.make.life.choices        0.53               0.36           0.41
                             Freedom.to.make.life.choices
Life.Ladder                                          0.53
Log.GDP.per.capita                                   0.36
Social.support                                       0.41
Freedom.to.make.life.choices                         1.00

Korelačná matica ukazuje, že medzi všetkými premennými existujú pozitívne a štatisticky významné vzťahy, čo je v súlade s teóriou World Happiness Report. Najsilnejšia korelácia je medzi Life Ladder a Log GDP per capita (r = 0.78), čo naznačuje, že vyšší ekonomický rozvoj je spojený s vyššou spokojnosťou so životom. Rovnako silná je aj väzba medzi Life Ladder a Social support (r = 0.71), čo potvrdzuje, že sociálne väzby predstavujú kľúčový faktor šťastia. Premenná Freedom to make life choices vykazuje strednú koreláciu so všetkými ukazovateľmi (0.36–0.53), čo znamená, že prispieva k celkovej spokojnosti, no menej než ekonomické a sociálne faktory. Keďže žiadna korelácia nepresahuje hodnotu 0.90, nevzniká problém multikolinearity a žiadnu z premenných nie je potrebné vylúčiť.

Matica vzdialenosti nedávala zmysel.

Preto pokračujeme s hierarchickým zhlukovaním a dendrogramom

hc <- hclust(dist_mat, method = "ward.D2")

plot(hc,
     labels = FALSE,   # žiadne mená
     hang   = -1,
     main   = "Hierarchical clustering (Ward.D2) – všetky roky",
     xlab   = "",
     sub    = "")

k <- 3
h_cut <- hc$height[length(hc$height) - (k - 1)]
abline(h = h_cut, col = "red", lwd = 2, lty = 2)

Na grafe je zobrazený dendrogram vytvorený pomocou aglomeratívnej hierarchickej metódy zhlukovania (Ward.D2). Na vertikálnej osi je znázornená tzv. výška (Height), ktorá reprezentuje mieru nehomogenity vznikajúcu pri spájaní jednotlivých objektov do väčších celkov. Čím je výška spojenia vyššia, tým sú zlučované zhluky od seba odlišnejšie.

Dendrogram ukazuje typickú hierarchickú štruktúru – na spodnej úrovni sa nachádzajú jednotlivé pozorovania (krajina v konkrétnom roku), ktoré sa postupne zlučujú na základe ich podobnosti vo štyroch sledovaných premenných: Life Ladder, Log GDP per capita, Social support a Freedom to make life choices.

Červená prerušovaná čiara predstavuje rez dendrogramu, ktorý určuje počet výsledných klastrov. V našom prípade bola zvolená hodnota rezu približne na úrovni Height ≈ 40, čo prirodzene rozdeľuje celý súbor pozorovaní do troch výrazných klastrov. Tento počet je v súlade aj s rozptylom medzi-klastrovej variability (BSS) a s interpretáciou centroidov.

Pri danom reze je dobre viditeľné, že:

prvý, najrozsiahlejší klaster pozostáva z pozorovaní s nižšou úrovňou šťastia a ekonomického rozvoja,

druhý klaster tvorí stredne rozvinuté krajiny,

tretí klaster združuje najvyspelejšie a najšťastnejšie krajiny sveta.

Dendrogram tak poskytuje vizuálne potvrdenie výsledkov numerickej analýzy – zhlukovanie prebieha stabilne, klastre sú pomerne dobre oddelené a hierarchická štruktúra odráža prirodzené rozdiely medzi krajinami v úrovni ekonomického a sociálneho rozvoja.

Zoznam krajín v klastri:

klastre <- data.frame(
  ID      = labels_id,
  Country = cluster_data$Country.name,
  Year    = cluster_data$Year,
  Cluster = factor(klaster_membership)
)

klastre
NA

TSS–WSS–BSS variability

ssq <- function(x, m) sum((x - m)^2)
var_names <- colnames(udaje_scaled)

# Total sum of squares
TSS <- sapply(var_names, function(v)
  ssq(udaje_scaled[, v], mean(udaje_scaled[, v]))
)

# Within-cluster sum of squares
WSS <- sapply(var_names, function(v) {
  x <- udaje_scaled[, v]
  tapply(x, klaster_membership,
         function(z) ssq(z, mean(z))) |> sum()
})

# Between-cluster sum of squares
BSS <- TSS - WSS

ss_table <- data.frame(
  Variable     = var_names,
  TSS          = TSS,
  WSS          = WSS,
  BSS          = BSS,
  Prop_Between = BSS / TSS
)

ss_table
NA

Na základe tabuľky TSS, WSS a BSS možno konštatovať, že najvyšší podiel medzi-klastrovej variability dosahuje premenná Life.Ladder, ktorá je zároveň najlepším separátorom zhlukov. Nasleduje premenná Log.GDP.per.capita, čo naznačuje, že ekonomická úroveň krajín významne ovplyvňuje ich zaradenie do klastrov. Strednú separačnú silu vykazuje premenná Social.support, zatiaľ čo premenná Freedom.to.make.life.choices disponuje najnižším podielom medzi-klastrovej variability. Táto premenná teda neprispieva k tvorbe zhlukov tak výrazne a jej prípadné odstránenie by štruktúru klasifikácie pravdepodobne podstatne nezmenilo.

Centroidy:

centroidy <- data.frame(
  X,
  Cluster = factor(klaster_membership)
) %>%
  group_by(Cluster) %>%
  summarise(
    across(
      .cols  = where(is.numeric),
      .fns   = list(mean = ~ mean(.x)),
      .names = "{.col}_{.fn}"
    )
  )

centroidy
NA

Zhluková analýza na základe centroidov identifikovala tri výrazne odlišné skupiny krajín. Prvý klaster združuje krajiny s nízkym HDP, slabou sociálnou oporou a najnižšou mierou životnej spokojnosti. Druhý klaster tvoria stredne rozvinuté krajiny, ktoré dosahujú priemerné hodnoty vo všetkých ukazovateľoch. Tretí klaster zahŕňa najvyspelejšie ekonomiky s najvyššími hodnotami Life Ladder, silnou sociálnou oporou a vysokou mierou slobody rozhodovania. Tieto výsledky potvrdzujú, že ekonomický rozvoj a sociálne inštitúcie významne súvisia so subjektívnym hodnotením spokojnosti so životom.

LS0tCnRpdGxlOiAiWmhsdWtvdsOhIGFuYWzDvXphIgphdXRob3I6ICJJZ29yIFplbGVuYXkgKHphIHBvbW9jaSBDaGF0R1BUKSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCk5hxI3DrXRhbmllIGTDoXQ6CmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQoKdWRhamUgPC0gcmVhZC5jc3YoIldvcmxkIEhhcHBpbmVzcyBSZXBvcnQgMjAwNS0yMDIxLmNzdiIsCiAgICAgICAgICAgICAgICAgIHNlcCA9ICIsIiwgaGVhZGVyID0gVFJVRSkKCiMgdnliZXJpZW1lIEtyYWppbnUsIFJvayBhIDQgcHJlbWVubsOpCmNsdXN0ZXJfZGF0YSA8LSB1ZGFqZSAlPiUKICBzZWxlY3QoCiAgICBDb3VudHJ5Lm5hbWUsCiAgICBZZWFyLAogICAgTGlmZS5MYWRkZXIsCiAgICBMb2cuR0RQLnBlci5jYXBpdGEsCiAgICBTb2NpYWwuc3VwcG9ydCwKICAgIEZyZWVkb20udG8ubWFrZS5saWZlLmNob2ljZXMKICApICU+JQogIG5hLm9taXQoKQoKIyB2eXR2b3LDrW1lIElEICJLcmFqaW5hX1JvayIg4oCTIGJ1ZGUgc2zDusW+acWlIGFrbyBuw6F6b3YgcmlhZGt1CmxhYmVsc19pZCA8LSBwYXN0ZShjbHVzdGVyX2RhdGEkQ291bnRyeS5uYW1lLCBjbHVzdGVyX2RhdGEkWWVhciwgc2VwID0gIl8iKQoKIyBkw6F0b3bDvSByw6FtZWMgbGVuIHMgbnVtZXJpY2vDvW1pIHByZW1lbm7DvW1pClggPC0gY2x1c3Rlcl9kYXRhICU+JQogIHNlbGVjdChMaWZlLkxhZGRlciwKICAgICAgICAgTG9nLkdEUC5wZXIuY2FwaXRhLAogICAgICAgICBTb2NpYWwuc3VwcG9ydCwKICAgICAgICAgRnJlZWRvbS50by5tYWtlLmxpZmUuY2hvaWNlcykKCnJvd25hbWVzKFgpIDwtIGxhYmVsc19pZAoKIyDFoWvDoWxvdmFuaWUKdWRhamVfc2NhbGVkIDwtIHNjYWxlKFgpCmBgYApCb3hwbG90eSB2xaFldGvDvWNoIMWha8OhbG92YW7DvWNoIHByZW1lbm7DvWNoOgpgYGB7cn0KbnVtX3ZhcnMgIDwtIGFzLmRhdGEuZnJhbWUodWRhamVfc2NhbGVkKQpudW1fcGxvdHMgPC0gbmNvbChudW1fdmFycykKCnBhcihtZnJvdyA9IGMoMiwgMikpCnBhcihtYXIgPSBjKDQsNCwyLDEpKQoKZm9yIChjb2wgaW4gbmFtZXMobnVtX3ZhcnMpKSB7CiAgYm94cGxvdChudW1fdmFyc1tbY29sXV0sCiAgICAgICAgICBtYWluID0gY29sLAogICAgICAgICAgY29sID0gImxpZ2h0Ymx1ZSIsCiAgICAgICAgICBob3Jpem9udGFsID0gVFJVRSkKfQoKbXRleHQoIkJveHBsb3R5IG51bWVyaWNrw71jaCBwcmVtZW5uw71jaCAodsWhZXRreSByb2t5IFdIUikiLAogICAgICBvdXRlciA9IFRSVUUsIGNleCA9IDEuMiwgZm9udCA9IDIpCgpgYGAKS29yZWxhxI1uw6EgbWF0aWNhOgpgYGB7cn0KY29yX21hdCA8LSByb3VuZChjb3IodWRhamVfc2NhbGVkKSwgMikKY29yX21hdApgYGAKS29yZWxhxI1uw6EgbWF0aWNhIHVrYXp1amUsIMW+ZSBtZWR6aSB2xaFldGvDvW1pIHByZW1lbm7DvW1pIGV4aXN0dWrDuiBwb3ppdMOtdm5lIGEgxaF0YXRpc3RpY2t5IHbDvXpuYW1uw6kgdnrFpWFoeSwgxI1vIGplIHYgc8O6bGFkZSBzIHRlw7NyaW91IFdvcmxkIEhhcHBpbmVzcyBSZXBvcnQuIE5hanNpbG5lasWhaWEga29yZWzDoWNpYSBqZSBtZWR6aSBMaWZlIExhZGRlciBhIExvZyBHRFAgcGVyIGNhcGl0YSAociA9IDAuNzgpLCDEjW8gbmF6bmHEjXVqZSwgxb5lIHZ5xaHFocOtIGVrb25vbWlja8O9IHJvenZvaiBqZSBzcG9qZW7DvSBzIHZ5xaHFoW91IHNwb2tvam5vc8Wlb3Ugc28gxb5pdm90b20uIFJvdm5ha28gc2lsbsOhIGplIGFqIHbDpHpiYSBtZWR6aSBMaWZlIExhZGRlciBhIFNvY2lhbCBzdXBwb3J0IChyID0gMC43MSksIMSNbyBwb3R2cmR6dWplLCDFvmUgc29jacOhbG5lIHbDpHpieSBwcmVkc3RhdnVqw7oga8S+w7rEjW92w70gZmFrdG9yIMWhxaVhc3RpYS4gUHJlbWVubsOhIEZyZWVkb20gdG8gbWFrZSBsaWZlIGNob2ljZXMgdnlrYXp1amUgc3RyZWRuw7oga29yZWzDoWNpdSBzbyB2xaFldGvDvW1pIHVrYXpvdmF0ZcS+bWkgKDAuMzbigJMwLjUzKSwgxI1vIHpuYW1lbsOhLCDFvmUgcHJpc3BpZXZhIGsgY2Vsa292ZWogc3Bva29qbm9zdGksIG5vIG1lbmVqIG5lxb4gZWtvbm9taWNrw6kgYSBzb2Npw6FsbmUgZmFrdG9yeS4gS2XEj8W+ZSDFvmlhZG5hIGtvcmVsw6FjaWEgbmVwcmVzYWh1amUgaG9kbm90dSAwLjkwLCBuZXZ6bmlrw6EgcHJvYmzDqW0gbXVsdGlrb2xpbmVhcml0eSBhIMW+aWFkbnUgeiBwcmVtZW5uw71jaCBuaWUgamUgcG90cmVibsOpIHZ5bMO6xI1pxaUuCgpNYXRpY2EgdnpkaWFsZW5vc3RpIG5lZMOhdmFsYSB6bXlzZWwuCgpQcmV0byBwb2tyYcSNdWplbWUgcyBoaWVyYXJjaGlja8O9bSB6aGx1a292YW7DrW0gYSBkZW5kcm9ncmFtb20KYGBge3J9CmhjIDwtIGhjbHVzdChkaXN0X21hdCwgbWV0aG9kID0gIndhcmQuRDIiKQoKcGxvdChoYywKICAgICBsYWJlbHMgPSBGQUxTRSwgICAjIMW+aWFkbmUgbWVuw6EKICAgICBoYW5nICAgPSAtMSwKICAgICBtYWluICAgPSAiSGllcmFyY2hpY2FsIGNsdXN0ZXJpbmcgKFdhcmQuRDIpIOKAkyB2xaFldGt5IHJva3kiLAogICAgIHhsYWIgICA9ICIiLAogICAgIHN1YiAgICA9ICIiKQoKayA8LSAzCmhfY3V0IDwtIGhjJGhlaWdodFtsZW5ndGgoaGMkaGVpZ2h0KSAtIChrIC0gMSldCmFibGluZShoID0gaF9jdXQsIGNvbCA9ICJyZWQiLCBsd2QgPSAyLCBsdHkgPSAyKQpgYGAKCk5hIGdyYWZlIGplIHpvYnJhemVuw70gZGVuZHJvZ3JhbSB2eXR2b3JlbsO9IHBvbW9jb3UgYWdsb21lcmF0w612bmVqIGhpZXJhcmNoaWNrZWogbWV0w7NkeSB6aGx1a292YW5pYSAoV2FyZC5EMikuIE5hIHZlcnRpa8OhbG5laiBvc2kgamUgem7DoXpvcm5lbsOhIHR6di4gdsO9xaFrYSAoSGVpZ2h0KSwga3RvcsOhIHJlcHJlemVudHVqZSBtaWVydSBuZWhvbW9nZW5pdHkgdnpuaWthasO6Y3UgcHJpIHNww6FqYW7DrSBqZWRub3RsaXbDvWNoIG9iamVrdG92IGRvIHbDpMSNxaHDrWNoIGNlbGtvdi4gxIzDrW0gamUgdsO9xaFrYSBzcG9qZW5pYSB2ecWhxaFpYSwgdMO9bSBzw7ogemx1xI1vdmFuw6kgemhsdWt5IG9kIHNlYmEgb2RsacWhbmVqxaFpZS4KCkRlbmRyb2dyYW0gdWthenVqZSB0eXBpY2vDuiBoaWVyYXJjaGlja8O6IMWhdHJ1a3TDunJ1IOKAkyBuYSBzcG9kbmVqIMO6cm92bmkgc2EgbmFjaMOhZHphasO6IGplZG5vdGxpdsOpIHBvem9yb3ZhbmlhIChrcmFqaW5hIHYga29ua3LDqXRub20gcm9rdSksIGt0b3LDqSBzYSBwb3N0dXBuZSB6bHXEjXVqw7ogbmEgesOha2xhZGUgaWNoIHBvZG9ibm9zdGkgdm8gxaF0eXJvY2ggc2xlZG92YW7DvWNoIHByZW1lbm7DvWNoOiBMaWZlIExhZGRlciwgTG9nIEdEUCBwZXIgY2FwaXRhLCBTb2NpYWwgc3VwcG9ydCBhIEZyZWVkb20gdG8gbWFrZSBsaWZlIGNob2ljZXMuCgrEjGVydmVuw6EgcHJlcnXFoW92YW7DoSDEjWlhcmEgcHJlZHN0YXZ1amUgcmV6IGRlbmRyb2dyYW11LCBrdG9yw70gdXLEjXVqZSBwb8SNZXQgdsO9c2xlZG7DvWNoIGtsYXN0cm92LiBWIG5hxaFvbSBwcsOtcGFkZSBib2xhIHp2b2xlbsOhIGhvZG5vdGEgcmV6dSBwcmlibGnFvm5lIG5hIMO6cm92bmkgSGVpZ2h0IOKJiCA0MCwgxI1vIHByaXJvZHplbmUgcm96ZGXEvnVqZSBjZWzDvSBzw7pib3IgcG96b3JvdmFuw60gZG8gdHJvY2ggdsO9cmF6bsO9Y2gga2xhc3Ryb3YuIFRlbnRvIHBvxI1ldCBqZSB2IHPDumxhZGUgYWogcyByb3pwdHlsb20gbWVkemkta2xhc3Ryb3ZlaiB2YXJpYWJpbGl0eSAoQlNTKSBhIHMgaW50ZXJwcmV0w6FjaW91IGNlbnRyb2lkb3YuCgpQcmkgZGFub20gcmV6ZSBqZSBkb2JyZSB2aWRpdGXEvm7DqSwgxb5lOgoKcHJ2w70sIG5hanJvenNpYWhsZWrFocOtIGtsYXN0ZXIgcG96b3N0w6F2YSB6IHBvem9yb3ZhbsOtIHMgbmnFvsWhb3Ugw7pyb3bFiG91IMWhxaVhc3RpYSBhIGVrb25vbWlja8OpaG8gcm96dm9qYSwKCmRydWjDvSBrbGFzdGVyIHR2b3LDrSBzdHJlZG5lIHJvenZpbnV0w6kga3JhamlueSwKCnRyZXTDrSBrbGFzdGVyIHpkcnXFvnVqZSBuYWp2eXNwZWxlasWhaWUgYSBuYWrFocWlYXN0bmVqxaFpZSBrcmFqaW55IHN2ZXRhLgoKRGVuZHJvZ3JhbSB0YWsgcG9za3l0dWplIHZpenXDoWxuZSBwb3R2cmRlbmllIHbDvXNsZWRrb3YgbnVtZXJpY2tlaiBhbmFsw716eSDigJMgemhsdWtvdmFuaWUgcHJlYmllaGEgc3RhYmlsbmUsIGtsYXN0cmUgc8O6IHBvbWVybmUgZG9icmUgb2RkZWxlbsOpIGEgaGllcmFyY2hpY2vDoSDFoXRydWt0w7pyYSBvZHLDocW+YSBwcmlyb2R6ZW7DqSByb3pkaWVseSBtZWR6aSBrcmFqaW5hbWkgdiDDunJvdm5pIGVrb25vbWlja8OpaG8gYSBzb2Npw6FsbmVobyByb3p2b2phLgoKClpvem5hbSBrcmFqw61uIHYga2xhc3RyaToKYGBge3J9CmtsYXN0cmUgPC0gZGF0YS5mcmFtZSgKICBJRCAgICAgID0gbGFiZWxzX2lkLAogIENvdW50cnkgPSBjbHVzdGVyX2RhdGEkQ291bnRyeS5uYW1lLAogIFllYXIgICAgPSBjbHVzdGVyX2RhdGEkWWVhciwKICBDbHVzdGVyID0gZmFjdG9yKGtsYXN0ZXJfbWVtYmVyc2hpcCkKKQoKa2xhc3RyZQpgYGAKVFNT4oCTV1NT4oCTQlNTIHZhcmlhYmlsaXR5CmBgYHtyfQpzc3EgPC0gZnVuY3Rpb24oeCwgbSkgc3VtKCh4IC0gbSleMikKdmFyX25hbWVzIDwtIGNvbG5hbWVzKHVkYWplX3NjYWxlZCkKCiMgVG90YWwgc3VtIG9mIHNxdWFyZXMKVFNTIDwtIHNhcHBseSh2YXJfbmFtZXMsIGZ1bmN0aW9uKHYpCiAgc3NxKHVkYWplX3NjYWxlZFssIHZdLCBtZWFuKHVkYWplX3NjYWxlZFssIHZdKSkKKQoKIyBXaXRoaW4tY2x1c3RlciBzdW0gb2Ygc3F1YXJlcwpXU1MgPC0gc2FwcGx5KHZhcl9uYW1lcywgZnVuY3Rpb24odikgewogIHggPC0gdWRhamVfc2NhbGVkWywgdl0KICB0YXBwbHkoeCwga2xhc3Rlcl9tZW1iZXJzaGlwLAogICAgICAgICBmdW5jdGlvbih6KSBzc3EoeiwgbWVhbih6KSkpIHw+IHN1bSgpCn0pCgojIEJldHdlZW4tY2x1c3RlciBzdW0gb2Ygc3F1YXJlcwpCU1MgPC0gVFNTIC0gV1NTCgpzc190YWJsZSA8LSBkYXRhLmZyYW1lKAogIFZhcmlhYmxlICAgICA9IHZhcl9uYW1lcywKICBUU1MgICAgICAgICAgPSBUU1MsCiAgV1NTICAgICAgICAgID0gV1NTLAogIEJTUyAgICAgICAgICA9IEJTUywKICBQcm9wX0JldHdlZW4gPSBCU1MgLyBUU1MKKQoKc3NfdGFibGUKYGBgCk5hIHrDoWtsYWRlIHRhYnXEvmt5IFRTUywgV1NTIGEgQlNTIG1vxb5ubyBrb27FoXRhdG92YcWlLCDFvmUgbmFqdnnFocWhw60gcG9kaWVsIG1lZHppLWtsYXN0cm92ZWogdmFyaWFiaWxpdHkgZG9zYWh1amUgcHJlbWVubsOhIExpZmUuTGFkZGVyLCBrdG9yw6EgamUgesOhcm92ZcWIIG5hamxlcMWhw61tIHNlcGFyw6F0b3JvbSB6aGx1a292LiBOYXNsZWR1amUgcHJlbWVubsOhIExvZy5HRFAucGVyLmNhcGl0YSwgxI1vIG5hem5hxI11amUsIMW+ZSBla29ub21pY2vDoSDDunJvdmXFiCBrcmFqw61uIHbDvXpuYW1uZSBvdnBseXbFiHVqZSBpY2ggemFyYWRlbmllIGRvIGtsYXN0cm92LiBTdHJlZG7DuiBzZXBhcmHEjW7DuiBzaWx1IHZ5a2F6dWplIHByZW1lbm7DoSBTb2NpYWwuc3VwcG9ydCwgemF0aWHEviDEjW8gcHJlbWVubsOhIEZyZWVkb20udG8ubWFrZS5saWZlLmNob2ljZXMgZGlzcG9udWplIG5ham5pxb7FocOtbSBwb2RpZWxvbSBtZWR6aS1rbGFzdHJvdmVqIHZhcmlhYmlsaXR5LiBUw6F0byBwcmVtZW5uw6EgdGVkYSBuZXByaXNwaWV2YSBrIHR2b3JiZSB6aGx1a292IHRhayB2w71yYXpuZSBhIGplaiBwcsOtcGFkbsOpIG9kc3Ryw6FuZW5pZSBieSDFoXRydWt0w7pydSBrbGFzaWZpa8OhY2llIHByYXZkZXBvZG9ibmUgcG9kc3RhdG5lIG5lem1lbmlsby4KCkNlbnRyb2lkeToKYGBge3J9CmNlbnRyb2lkeSA8LSBkYXRhLmZyYW1lKAogIFgsCiAgQ2x1c3RlciA9IGZhY3RvcihrbGFzdGVyX21lbWJlcnNoaXApCikgJT4lCiAgZ3JvdXBfYnkoQ2x1c3RlcikgJT4lCiAgc3VtbWFyaXNlKAogICAgYWNyb3NzKAogICAgICAuY29scyAgPSB3aGVyZShpcy5udW1lcmljKSwKICAgICAgLmZucyAgID0gbGlzdChtZWFuID0gfiBtZWFuKC54KSksCiAgICAgIC5uYW1lcyA9ICJ7LmNvbH1fey5mbn0iCiAgICApCiAgKQpgYGAKWmhsdWtvdsOhIGFuYWzDvXphIG5hIHrDoWtsYWRlIGNlbnRyb2lkb3YgaWRlbnRpZmlrb3ZhbGEgdHJpIHbDvXJhem5lIG9kbGnFoW7DqSBza3VwaW55IGtyYWrDrW4uIFBydsO9IGtsYXN0ZXIgemRydcW+dWplIGtyYWppbnkgcyBuw616a3ltIEhEUCwgc2xhYm91IHNvY2nDoWxub3Ugb3Bvcm91IGEgbmFqbmnFvsWhb3UgbWllcm91IMW+aXZvdG5laiBzcG9rb2pub3N0aS4gRHJ1aMO9IGtsYXN0ZXIgdHZvcmlhIHN0cmVkbmUgcm96dmludXTDqSBrcmFqaW55LCBrdG9yw6kgZG9zYWh1asO6IHByaWVtZXJuw6kgaG9kbm90eSB2byB2xaFldGvDvWNoIHVrYXpvdmF0ZcS+b2NoLiBUcmV0w60ga2xhc3RlciB6YWjFlcWIYSBuYWp2eXNwZWxlasWhaWUgZWtvbm9taWt5IHMgbmFqdnnFocWhw61taSBob2Rub3RhbWkgTGlmZSBMYWRkZXIsIHNpbG5vdSBzb2Npw6Fsbm91IG9wb3JvdSBhIHZ5c29rb3UgbWllcm91IHNsb2JvZHkgcm96aG9kb3ZhbmlhLiBUaWV0byB2w71zbGVka3kgcG90dnJkenVqw7osIMW+ZSBla29ub21pY2vDvSByb3p2b2ogYSBzb2Npw6FsbmUgaW7FoXRpdMO6Y2llIHbDvXpuYW1uZSBzw7p2aXNpYSBzbyBzdWJqZWt0w612bnltIGhvZG5vdGVuw61tIHNwb2tvam5vc3RpIHNvIMW+aXZvdG9tLgo=