Life expectancy at birth by gender
#==============================
# Collect and clean data
#==============================
# Load some packages:
library(tidyverse)
library(rvest)
# Extract data from link:
link <- "https://en.wikipedia.org/wiki/List_of_countries_by_life_expectancy?fbclid=IwAR0jRtf0RacPLxVPgcuu4zgYJl9HDk01cNy6u48vvyTuoK9CC1jZH8_pZPQ"
# Extract data:
link %>%
read_html() %>%
html_nodes(xpath = '//*[@id="mw-content-text"]/div/table[2]') %>%
html_table(fill = TRUE) %>%
.[[1]] -> data_raw
# Rename for columns:
names(data_raw) <- c("Rank", "Country", "Both", "Female", "Male")
# Remove the first row:
data_raw %>% filter(Rank != "Rank") -> data_raw
# Conver to numeric and remove missing data:
data_raw %>%
mutate(Country = factor(Country)) %>%
mutate_if(is.character, as.numeric) %>%
mutate(Country = as.character(Country)) %>%
mutate(Country = case_when(str_detect(Country, "Republic of China") ~ "China", TRUE ~ Country)) %>%
na.omit() -> df_life
# ASEAN country names:
asean_link <- "https://en.wikipedia.org/wiki/Association_of_Southeast_Asian_Nations"
asean_link %>%
read_html() %>%
html_nodes(xpath = '//*[@id="mw-content-text"]/div/table[2]') %>%
html_table(fill = TRUE) %>%
.[[1]] -> asean_names
# G7 Countries:
g7_link <- "https://en.wikipedia.org/wiki/Group_of_Seven"
g7_link %>%
read_html() %>%
html_nodes(xpath = '//*[@id="mw-content-text"]/div/table[5]') %>%
html_table(fill = TRUE) %>%
.[[1]] -> g7_names
# Filter data for ASEAN + G7 countries + China + India + South Korea:
df_life %>%
filter(Country %in% c(asean_names$Country, g7_names$Member, "China", "India", "South Korea")) %>%
mutate(text_color = case_when(Country == "Vietnam" ~ "firebrick", TRUE ~ "gray20")) -> df_mini
df_mini %>%
arrange(Male) %>%
mutate(Country = factor(Country, levels = Country)) -> aseanG7_life
#===========
# Plot 1
#===========
library(ggeconodist)
my_font <- "Ubuntu Condensed"
aseanG7_life %>%
ggplot(aes(x = Country)) +
geom_econodist(aes(ymin = Male, median = Both, ymax = Female), stat = "identity", show.legend = FALSE) +
scale_y_continuous(expand = c(0, 0), position = "right", limits = range(60, 90), breaks = seq(60, 90, 5)) +
coord_flip() +
theme_econodist() +
theme(plot.margin = unit(rep(1.3, 4), "cm")) +
theme(axis.text.y = element_text(color = aseanG7_life$text_color, size = 14, family = my_font)) +
theme(axis.text.x = element_text(size = 14, family = my_font)) +
theme(plot.title = element_text(size = 26, family = my_font)) +
theme(plot.caption = element_text(size = 10, face = "italic")) +
labs(x = NULL, y = NULL,
title = "Figure 1: Life expectancy at birth by gender, 2018",
caption = "Data Source: United Nations Development Programme") -> p
grid.newpage()
p %>%
left_align(c("title", "caption")) %>%
add_econodist_legend(
econodist_legend_grob(
tenth_lab = "Male",
ninetieth_lab = "Female",
med_lab = "Both",
family = my_font,
label_size = 14,
),
below = "title"
) %>%
grid.draw()

#==============
# Plot 2
#==============
df_mini %>%
arrange(Female) %>%
mutate(Country = factor(Country, levels = Country)) %>%
mutate(upperLabel = Female - 0.6, lowerLabel = Male + 0.6) -> dfPlot2
dfvietnam <- dfPlot2 %>% filter(Country == "Vietnam")
dfPlot2 %>%
ggplot(aes(x = Country)) +
geom_econodist(aes(ymin = Male, median = Both, ymax = Female), stat = "identity", show.legend = FALSE) +
scale_y_continuous(expand = c(0, 0), position = "right", limits = range(60, 90), breaks = seq(60, 90, 5)) +
geom_text(data = dfvietnam, aes(x = Country, y = upperLabel, label = Female), color = "gray30", size = 4.3, family = my_font) +
geom_text(data = dfvietnam, aes(x = Country, y = lowerLabel, label = Male), color = "gray30", size = 4.3, family = my_font) +
coord_flip() +
theme_econodist() +
theme(plot.margin = unit(rep(1.3, 4), "cm")) +
theme(axis.text.y = element_text(color = dfPlot2$text_color, size = 14, family = my_font)) +
theme(axis.text.x = element_text(size = 14, family = my_font)) +
theme(plot.title = element_text(size = 26, family = my_font)) +
theme(plot.caption = element_text(size = 10, face = "italic")) +
labs(x = NULL, y = NULL,
title = "Figure 2: Life expectancy at birth by Gender, 2018",
caption = "Data Source: United Nations Development Programme") -> p2
grid.newpage()
p2 %>%
left_align(c("title", "caption")) %>%
add_econodist_legend(
econodist_legend_grob(
tenth_lab = "Male",
ninetieth_lab = "Female",
med_lab = "Both",
family = my_font,
label_size = 14,
),
below = "title"
) %>%
grid.draw()

Countries have the biggest life expectancy gender gap
#===========
# Plot 3
#===========
n <- nrow(dfPlot2)
some_countries <- c("Vietnam", "Russia", "Syria", "Ukraine")
df_life %>%
filter(!Country %in% c("Kiribati", "Eswatini")) %>%
mutate(lifeGap = Female - Male) %>%
arrange(-lifeGap) %>%
slice(1:n) %>%
mutate(upperLabel = Female - 0.5, lowerLabel = Male + 0.5) %>%
mutate(text_color = case_when(Country %in% some_countries ~ "firebrick", TRUE ~ "gray20")) %>%
arrange(Male) %>%
mutate(Country = factor(Country, levels = Country)) -> dfPlot3
dfPlot3 %>% filter(Country %in% some_countries) -> df_someCon
dfPlot3 %>%
ggplot(aes(x = Country)) +
geom_econodist(aes(ymin = Male, median = Both, ymax = Female), stat = "identity", show.legend = FALSE) +
scale_y_continuous(expand = c(0, 0), position = "right", limits = range(65, 85), breaks = seq(60, 90, 5)) +
coord_flip() +
theme_econodist() +
theme(plot.margin = unit(rep(1.3, 4), "cm")) +
theme(axis.text.y = element_text(size = 14, family = my_font, color = dfPlot3$text_color)) +
theme(axis.text.x = element_text(size = 14, family = my_font)) +
theme(plot.title = element_text(size = 26, family = my_font)) +
theme(plot.caption = element_text(size = 10, face = "italic")) +
geom_text(data = df_someCon, aes(x = Country, y = upperLabel, label = Female), color = "gray30", size = 4.3, family = my_font) +
geom_text(data = df_someCon, aes(x = Country, y = lowerLabel, label = Male), color = "gray30", size = 4.3, family = my_font) +
labs(x = NULL, y = NULL,
title = "Figure 3: Life expectancy at birth by Gender, 2018",
caption = "Data Source: United Nations Development Programme") -> p3
grid.newpage()
p3 %>%
left_align(c("title", "caption")) %>%
add_econodist_legend(
econodist_legend_grob(
tenth_lab = "Male",
ninetieth_lab = "Female",
med_lab = "Both",
family = my_font,
label_size = 14,
),
below = "title"
) %>%
grid.draw()

LS0tCnRpdGxlOiAnTGlmZSBleHBlY3RhbmN5IGF0IGJpcnRoIGJ5IGdlbmRlciwgMjAxOCcKYXV0aG9yOiAnTmd1eWVuIENoaSBEdW5nJwpzdWJ0aXRsZTogIkRhaWx5IEdyYXBoIFNlcmllcyIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6IAogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBoaWdobGlnaHQ6IHplbmJ1cm4KICAgICMgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIHRoZW1lOiAiZmxhdGx5IgogICAgdG9jOiBUUlVFCiAgICB0b2NfZmxvYXQ6IFRSVUUKLS0tCgpgYGB7ciBzZXR1cCxpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFKQpgYGAKCgojIExpZmUgZXhwZWN0YW5jeSBhdCBiaXJ0aCBieSBnZW5kZXIKCmBgYHtyLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMH0KCiM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyAgIENvbGxlY3QgYW5kIGNsZWFuIGRhdGEKIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKIyBMb2FkIHNvbWUgcGFja2FnZXM6IApsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShydmVzdCkKCiMgRXh0cmFjdCBkYXRhIGZyb20gbGluazogCmxpbmsgPC0gImh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xpc3Rfb2ZfY291bnRyaWVzX2J5X2xpZmVfZXhwZWN0YW5jeT9mYmNsaWQ9SXdBUjBqUnRmMFJhY1BMeFZQZ2N1dTR6Z1lKbDlIRGswMWNOeTZ1NDh2dnlUdW9LOUNDMWpaSDhfcFpQUSIKCgojIEV4dHJhY3QgZGF0YTogCgpsaW5rICU+JSAKICByZWFkX2h0bWwoKSAlPiUgCiAgaHRtbF9ub2Rlcyh4cGF0aCA9ICcvLypbQGlkPSJtdy1jb250ZW50LXRleHQiXS9kaXYvdGFibGVbMl0nKSAlPiUgCiAgaHRtbF90YWJsZShmaWxsID0gVFJVRSkgJT4lIAogIC5bWzFdXSAtPiBkYXRhX3JhdwoKCiMgUmVuYW1lIGZvciBjb2x1bW5zOiAKbmFtZXMoZGF0YV9yYXcpIDwtIGMoIlJhbmsiLCAiQ291bnRyeSIsICJCb3RoIiwgIkZlbWFsZSIsICJNYWxlIikKCiMgUmVtb3ZlIHRoZSBmaXJzdCByb3c6IApkYXRhX3JhdyAlPiUgZmlsdGVyKFJhbmsgIT0gIlJhbmsiKSAtPiBkYXRhX3JhdwoKIyBDb252ZXIgdG8gbnVtZXJpYyBhbmQgcmVtb3ZlIG1pc3NpbmcgZGF0YTogCgpkYXRhX3JhdyAlPiUgCiAgbXV0YXRlKENvdW50cnkgPSBmYWN0b3IoQ291bnRyeSkpICU+JSAKICBtdXRhdGVfaWYoaXMuY2hhcmFjdGVyLCBhcy5udW1lcmljKSAlPiUgCiAgbXV0YXRlKENvdW50cnkgPSBhcy5jaGFyYWN0ZXIoQ291bnRyeSkpICU+JSAKICBtdXRhdGUoQ291bnRyeSA9IGNhc2Vfd2hlbihzdHJfZGV0ZWN0KENvdW50cnksICJSZXB1YmxpYyBvZiBDaGluYSIpIH4gIkNoaW5hIiwgVFJVRSB+IENvdW50cnkpKSAlPiUgCiAgbmEub21pdCgpIC0+IGRmX2xpZmUKCgojIEFTRUFOIGNvdW50cnkgbmFtZXM6IAphc2Vhbl9saW5rIDwtICJodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Bc3NvY2lhdGlvbl9vZl9Tb3V0aGVhc3RfQXNpYW5fTmF0aW9ucyIKCmFzZWFuX2xpbmsgJT4lIAogIHJlYWRfaHRtbCgpICU+JSAKICBodG1sX25vZGVzKHhwYXRoID0gJy8vKltAaWQ9Im13LWNvbnRlbnQtdGV4dCJdL2Rpdi90YWJsZVsyXScpICU+JSAKICBodG1sX3RhYmxlKGZpbGwgPSBUUlVFKSAlPiUgCiAgLltbMV1dIC0+IGFzZWFuX25hbWVzCgojIEc3IENvdW50cmllczogCmc3X2xpbmsgPC0gImh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0dyb3VwX29mX1NldmVuIgoKZzdfbGluayAlPiUgCiAgcmVhZF9odG1sKCkgJT4lIAogIGh0bWxfbm9kZXMoeHBhdGggPSAnLy8qW0BpZD0ibXctY29udGVudC10ZXh0Il0vZGl2L3RhYmxlWzVdJykgJT4lIAogIGh0bWxfdGFibGUoZmlsbCA9IFRSVUUpICU+JSAKICAuW1sxXV0gLT4gZzdfbmFtZXMKCiMgRmlsdGVyIGRhdGEgZm9yIEFTRUFOICsgRzcgY291bnRyaWVzICsgQ2hpbmEgKyBJbmRpYSArIFNvdXRoIEtvcmVhOiAKCmRmX2xpZmUgJT4lIAogIGZpbHRlcihDb3VudHJ5ICVpbiUgYyhhc2Vhbl9uYW1lcyRDb3VudHJ5LCBnN19uYW1lcyRNZW1iZXIsICJDaGluYSIsICJJbmRpYSIsICJTb3V0aCBLb3JlYSIpKSAlPiUgCiAgbXV0YXRlKHRleHRfY29sb3IgPSBjYXNlX3doZW4oQ291bnRyeSA9PSAiVmlldG5hbSIgfiAiZmlyZWJyaWNrIiwgVFJVRSB+ICJncmF5MjAiKSkgLT4gZGZfbWluaQoKZGZfbWluaSAlPiUgCiAgYXJyYW5nZShNYWxlKSAlPiUgCiAgbXV0YXRlKENvdW50cnkgPSBmYWN0b3IoQ291bnRyeSwgbGV2ZWxzID0gQ291bnRyeSkpIC0+IGFzZWFuRzdfbGlmZQoKIz09PT09PT09PT09CiMgIFBsb3QgMQojPT09PT09PT09PT0KCmxpYnJhcnkoZ2dlY29ub2Rpc3QpCm15X2ZvbnQgPC0gIlVidW50dSBDb25kZW5zZWQiCgphc2Vhbkc3X2xpZmUgJT4lIAogIGdncGxvdChhZXMoeCA9IENvdW50cnkpKSArIAogIGdlb21fZWNvbm9kaXN0KGFlcyh5bWluID0gTWFsZSwgbWVkaWFuID0gQm90aCwgeW1heCA9IEZlbWFsZSksIHN0YXQgPSAiaWRlbnRpdHkiLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIAogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApLCBwb3NpdGlvbiA9ICJyaWdodCIsIGxpbWl0cyA9IHJhbmdlKDYwLCA5MCksIGJyZWFrcyA9IHNlcSg2MCwgOTAsIDUpKSArCiAgY29vcmRfZmxpcCgpICsgCiAgdGhlbWVfZWNvbm9kaXN0KCkgKyAKICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQocmVwKDEuMywgNCksICJjbSIpKSArIAogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gYXNlYW5HN19saWZlJHRleHRfY29sb3IsIHNpemUgPSAxNCwgZmFtaWx5ID0gbXlfZm9udCkpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBmYW1pbHkgPSBteV9mb250KSkgKyAKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNiwgZmFtaWx5ID0gbXlfZm9udCkpICsgCiAgdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgZmFjZSA9ICJpdGFsaWMiKSkgKyAKICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCwgCiAgICAgICB0aXRsZSA9ICJGaWd1cmUgMTogTGlmZSBleHBlY3RhbmN5IGF0IGJpcnRoIGJ5IGdlbmRlciwgMjAxOCIsCiAgICAgICBjYXB0aW9uID0gIkRhdGEgU291cmNlOiBVbml0ZWQgTmF0aW9ucyBEZXZlbG9wbWVudCBQcm9ncmFtbWUiKSAtPiBwICAgCgoKZ3JpZC5uZXdwYWdlKCkKCnAgJT4lIAogIGxlZnRfYWxpZ24oYygidGl0bGUiLCAiY2FwdGlvbiIpKSAlPiUgCiAgYWRkX2Vjb25vZGlzdF9sZWdlbmQoCiAgICBlY29ub2Rpc3RfbGVnZW5kX2dyb2IoCiAgICAgIHRlbnRoX2xhYiA9ICJNYWxlIiwgCiAgICAgIG5pbmV0aWV0aF9sYWIgPSAiRmVtYWxlIiwgCiAgICAgIG1lZF9sYWIgPSAiQm90aCIsIAogICAgICBmYW1pbHkgPSBteV9mb250LCAKICAgICAgbGFiZWxfc2l6ZSA9IDE0LAogICAgICApLCAKICAgIGJlbG93ID0gInRpdGxlIgogICAgKSAlPiUgCiAgZ3JpZC5kcmF3KCkKCiM9PT09PT09PT09PT09PQojICAgUGxvdCAyCiM9PT09PT09PT09PT09PQoKZGZfbWluaSAlPiUgCiAgYXJyYW5nZShGZW1hbGUpICU+JSAKICBtdXRhdGUoQ291bnRyeSA9IGZhY3RvcihDb3VudHJ5LCBsZXZlbHMgPSBDb3VudHJ5KSkgJT4lIAogIG11dGF0ZSh1cHBlckxhYmVsID0gRmVtYWxlIC0gMC42LCBsb3dlckxhYmVsID0gTWFsZSArIDAuNikgLT4gZGZQbG90MiAKCmRmdmlldG5hbSA8LSBkZlBsb3QyICU+JSBmaWx0ZXIoQ291bnRyeSA9PSAiVmlldG5hbSIpCgpkZlBsb3QyICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBDb3VudHJ5KSkgKyAKICBnZW9tX2Vjb25vZGlzdChhZXMoeW1pbiA9IE1hbGUsIG1lZGlhbiA9IEJvdGgsIHltYXggPSBGZW1hbGUpLCBzdGF0ID0gImlkZW50aXR5Iiwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSwgcG9zaXRpb24gPSAicmlnaHQiLCBsaW1pdHMgPSByYW5nZSg2MCwgOTApLCBicmVha3MgPSBzZXEoNjAsIDkwLCA1KSkgKwogIGdlb21fdGV4dChkYXRhID0gZGZ2aWV0bmFtLCBhZXMoeCA9IENvdW50cnksIHkgPSB1cHBlckxhYmVsLCBsYWJlbCA9IEZlbWFsZSksIGNvbG9yID0gImdyYXkzMCIsIHNpemUgPSA0LjMsIGZhbWlseSA9IG15X2ZvbnQpICsgCiAgZ2VvbV90ZXh0KGRhdGEgPSBkZnZpZXRuYW0sIGFlcyh4ID0gQ291bnRyeSwgeSA9IGxvd2VyTGFiZWwsIGxhYmVsID0gTWFsZSksIGNvbG9yID0gImdyYXkzMCIsIHNpemUgPSA0LjMsIGZhbWlseSA9IG15X2ZvbnQpICsgCiAgY29vcmRfZmxpcCgpICsgCiAgdGhlbWVfZWNvbm9kaXN0KCkgKyAKICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQocmVwKDEuMywgNCksICJjbSIpKSArIAogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gZGZQbG90MiR0ZXh0X2NvbG9yLCBzaXplID0gMTQsIGZhbWlseSA9IG15X2ZvbnQpKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgZmFtaWx5ID0gbXlfZm9udCkpICsgCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjYsIGZhbWlseSA9IG15X2ZvbnQpKSArIAogIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGZhY2UgPSAiaXRhbGljIikpICsgCiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwsIAogICAgICAgdGl0bGUgPSAiRmlndXJlIDI6IExpZmUgZXhwZWN0YW5jeSBhdCBiaXJ0aCBieSBHZW5kZXIsIDIwMTgiLAogICAgICAgY2FwdGlvbiA9ICJEYXRhIFNvdXJjZTogVW5pdGVkIE5hdGlvbnMgRGV2ZWxvcG1lbnQgUHJvZ3JhbW1lIikgLT4gcDIgCgpncmlkLm5ld3BhZ2UoKQoKcDIgJT4lIAogIGxlZnRfYWxpZ24oYygidGl0bGUiLCAiY2FwdGlvbiIpKSAlPiUgCiAgYWRkX2Vjb25vZGlzdF9sZWdlbmQoCiAgICBlY29ub2Rpc3RfbGVnZW5kX2dyb2IoCiAgICAgIHRlbnRoX2xhYiA9ICJNYWxlIiwgCiAgICAgIG5pbmV0aWV0aF9sYWIgPSAiRmVtYWxlIiwgCiAgICAgIG1lZF9sYWIgPSAiQm90aCIsIAogICAgICBmYW1pbHkgPSBteV9mb250LCAKICAgICAgbGFiZWxfc2l6ZSA9IDE0LAogICAgKSwgCiAgICBiZWxvdyA9ICJ0aXRsZSIKICApICU+JSAKICBncmlkLmRyYXcoKQoKYGBgCgoKIyBDb3VudHJpZXMgaGF2ZSB0aGUgYmlnZ2VzdCBsaWZlIGV4cGVjdGFuY3kgZ2VuZGVyIGdhcAoKYGBge3IsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEwfQoKIz09PT09PT09PT09CiMgIFBsb3QgMwojPT09PT09PT09PT0KCm4gPC0gbnJvdyhkZlBsb3QyKQpzb21lX2NvdW50cmllcyA8LSBjKCJWaWV0bmFtIiwgIlJ1c3NpYSIsICJTeXJpYSIsICJVa3JhaW5lIikKCmRmX2xpZmUgJT4lIAogIGZpbHRlcighQ291bnRyeSAlaW4lIGMoIktpcmliYXRpIiwgIkVzd2F0aW5pIikpICU+JSAKICBtdXRhdGUobGlmZUdhcCA9IEZlbWFsZSAtIE1hbGUpICU+JSAKICBhcnJhbmdlKC1saWZlR2FwKSAlPiUgCiAgc2xpY2UoMTpuKSAlPiUgCiAgbXV0YXRlKHVwcGVyTGFiZWwgPSBGZW1hbGUgLSAwLjUsIGxvd2VyTGFiZWwgPSBNYWxlICsgMC41KSAlPiUgIAogIG11dGF0ZSh0ZXh0X2NvbG9yID0gY2FzZV93aGVuKENvdW50cnkgJWluJSBzb21lX2NvdW50cmllcyB+ICJmaXJlYnJpY2siLCBUUlVFIH4gImdyYXkyMCIpKSAlPiUgCiAgYXJyYW5nZShNYWxlKSAlPiUgCiAgbXV0YXRlKENvdW50cnkgPSBmYWN0b3IoQ291bnRyeSwgbGV2ZWxzID0gQ291bnRyeSkpIC0+IGRmUGxvdDMKCgpkZlBsb3QzICU+JSBmaWx0ZXIoQ291bnRyeSAlaW4lIHNvbWVfY291bnRyaWVzKSAtPiBkZl9zb21lQ29uCgoKZGZQbG90MyAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gQ291bnRyeSkpICsgCiAgZ2VvbV9lY29ub2Rpc3QoYWVzKHltaW4gPSBNYWxlLCBtZWRpYW4gPSBCb3RoLCB5bWF4ID0gRmVtYWxlKSwgc3RhdCA9ICJpZGVudGl0eSIsIHNob3cubGVnZW5kID0gRkFMU0UpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCksIHBvc2l0aW9uID0gInJpZ2h0IiwgbGltaXRzID0gcmFuZ2UoNjUsIDg1KSwgYnJlYWtzID0gc2VxKDYwLCA5MCwgNSkpICsKICBjb29yZF9mbGlwKCkgKyAKICB0aGVtZV9lY29ub2Rpc3QoKSArIAogIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChyZXAoMS4zLCA0KSwgImNtIikpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBmYW1pbHkgPSBteV9mb250LCBjb2xvciA9IGRmUGxvdDMkdGV4dF9jb2xvcikpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBmYW1pbHkgPSBteV9mb250KSkgKyAKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNiwgZmFtaWx5ID0gbXlfZm9udCkpICsgCiAgdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgZmFjZSA9ICJpdGFsaWMiKSkgKyAKICBnZW9tX3RleHQoZGF0YSA9IGRmX3NvbWVDb24sIGFlcyh4ID0gQ291bnRyeSwgeSA9IHVwcGVyTGFiZWwsIGxhYmVsID0gRmVtYWxlKSwgY29sb3IgPSAiZ3JheTMwIiwgc2l6ZSA9IDQuMywgZmFtaWx5ID0gbXlfZm9udCkgKyAKICBnZW9tX3RleHQoZGF0YSA9IGRmX3NvbWVDb24sIGFlcyh4ID0gQ291bnRyeSwgeSA9IGxvd2VyTGFiZWwsIGxhYmVsID0gTWFsZSksIGNvbG9yID0gImdyYXkzMCIsIHNpemUgPSA0LjMsIGZhbWlseSA9IG15X2ZvbnQpICsgCiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwsIAogICAgICAgdGl0bGUgPSAiRmlndXJlIDM6IExpZmUgZXhwZWN0YW5jeSBhdCBiaXJ0aCBieSBHZW5kZXIsIDIwMTgiLAogICAgICAgY2FwdGlvbiA9ICJEYXRhIFNvdXJjZTogVW5pdGVkIE5hdGlvbnMgRGV2ZWxvcG1lbnQgUHJvZ3JhbW1lIikgLT4gcDMKCmdyaWQubmV3cGFnZSgpCgpwMyAlPiUgCiAgbGVmdF9hbGlnbihjKCJ0aXRsZSIsICJjYXB0aW9uIikpICU+JSAKICBhZGRfZWNvbm9kaXN0X2xlZ2VuZCgKICAgIGVjb25vZGlzdF9sZWdlbmRfZ3JvYigKICAgICAgdGVudGhfbGFiID0gIk1hbGUiLCAKICAgICAgbmluZXRpZXRoX2xhYiA9ICJGZW1hbGUiLCAKICAgICAgbWVkX2xhYiA9ICJCb3RoIiwgCiAgICAgIGZhbWlseSA9IG15X2ZvbnQsIAogICAgICBsYWJlbF9zaXplID0gMTQsCiAgICApLCAKICAgIGJlbG93ID0gInRpdGxlIgogICkgJT4lIAogIGdyaWQuZHJhdygpCiAgICAKYGBgCgo=