Collect data from World Bank and make a Bubble Plot

#=======================================================================================================
#  Reference: https://cran.r-project.org/web/packages/wbstats/vignettes/Using_the_wbstats_package.html
#             https://www.r-bloggers.com/life-expectancy-animated/
#=======================================================================================================

# Load wbstats package: 

library(wbstats)

# General information in list structure: 

general_information <-  wb_cachelist

# Show some basic information: 
str(general_information, max.level = 1)


#---------------------------------------------------------------------
# Extract data frame that contains general information for countries
#---------------------------------------------------------------------


df_countries <- general_information[[1]]


# Some insights, for example, income group: 

library(tidyverse)

df_countries %>% 
  group_by(income) %>% 
  count() %>% 
  ungroup()


#------------------------------
#  Indicators provided by WB
#------------------------------


df_indicators <- general_information[[2]]

# Number of indicators: 

dim(df_indicators)

# Description for indicators: 

df_indicators %>% 
  filter(str_detect(indicator, "gross domestic")) %>% 
  head() %>% 
  View()


df_indicators %>% 
  filter(str_detect(indicator, "capital")) %>% 
  head() %>% 
  View()


df_indicators %>% 
  filter(str_detect(indicator, "death")) %>% 
  head() %>% 
  View()

df_indicators %>% 
  filter(str_detect(indicator, "tax")) %>% 
  head() %>% 
  View()


df_indicators %>% 
  filter(str_detect(indicator, "Population")) %>% 
  head() %>% 
  View()

# A list of indicators: 

my_indicator <- c("SP.POP.TOTL", "SP.DYN.LE00.IN", "NY.GDP.PCAP.PP.CD")

df_indicators %>% 
  filter(indicatorID %in% my_indicator) %>% 
  select(1:2)


# Collect data for an indicator for all nations: 

educ_data <- wb(country = "all",
                indicator = "PRJ.POP.2024.3.MF",
                startdate = 2000,
                enddate = 2018)

# Collect data, an indicator for some nations: 

educ_data_3nations <- wb(country = c("AFG", "AGO", "VNM"),
                         indicator = "SH.TBS.MORT",
                         startdate = 2016,
                         enddate = 2017)

# Collect some indicators for some nations: 

educ_tuberculosis <- wb(country = c("AFG", "AGO", "VNM"),
                        indicator = c("SH.TBS.MORT", "PRJ.POP.2024.3.MF"), 
                        startdate = 2016,
                        enddate = 2017) # Example 1. 




mydf <- wb(country = "all",
           indicator = my_indicator, 
           startdate = 2016,
           enddate = 2017) # Example 2. 



# Rename some columns and filter data for year of 2016: 

mydf_small <- mydf %>% 
  filter(date == 2016) %>% 
  select(country, iso2c, indicatorID, value)


# Convert to wide form and rename for some columns: 

mydf_small %>% 
  ungroup() %>% 
  spread(key = "indicatorID", value = "value") %>% 
  na.omit() %>% 
  rename(pop = SP.POP.TOTL, life = SP.DYN.LE00.IN, gdp = NY.GDP.PCAP.PP.CD) -> mydf_small_wide


# Filter our data (remove Aggregates label): 

income_group <- df_countries %>% 
  mutate_if(is.factor, as.character) %>% 
  filter(income != "Aggregates") %>% 
  select(iso2c, region, income)


# Meger data sets and remove missing points: 

total_df <- right_join(mydf_small_wide, income_group, by = "iso2c") %>% na.omit()


#-------------------------------------------------------------------------------------------------------------
# Page 38 from A. Deaton's book (https://www.amazon.com/gp/product/0691165629/ref=dbs_a_def_rwt_bibl_vppi_i0)
#-------------------------------------------------------------------------------------------------------------

library(ggrepel)
library(scales)
library(ggsci)
library(extrafont)
my_font <- "Roboto Condensed"


my_country <- c("Vietnam", "China", "India", "Thailand", "Malaysia", "France", "Cambodia", 
                "Germany", "Japan", "Nigeria", "Indonesia", "Singapore", "Philippines") # Select some nations. 


total_df %>% 
  filter(gdp < 100000) %>% 
  ggplot(aes(gdp, life, size = pop, color = income)) + 
  geom_point(alpha = 0.5) + 
  geom_smooth(method = "lm", formula = y ~ log(x), color = "orange", alpha = 0.1, se = FALSE) + 
  geom_text_repel(data = total_df %>% filter(country %in% my_country), aes(label = country), color = "gray20", size = 5, force = 19, family = my_font) + 
  scale_x_continuous(breaks = seq(0, 100000, 10000), labels = dollar) + 
  scale_y_continuous(breaks = seq(50, 85, 5)) + 
  scale_size(range = c(1, 30)) + 
  scale_color_lancet(name = "Group:") + 
  guides(size = FALSE) + 
  labs(x = "GDP per capital", 
       y = "Life expectancy", 
       title = "The relationship between Life Expectancy and GDP per capital in 2016", 
       subtitle = "According to WHO definitions, Life Expectancy at reflects the overall mortality level of a population and it is defined as\nthe average number of years that a newborn is expected to live if current mortality rates continue to apply. ", 
       caption =  "Data Source: The World Bank") + 
  theme_minimal() + 
  theme(legend.position = c(0.83, 0.30)) + 
  theme(legend.title = element_text(size = 12, face = "bold", family = my_font)) + 
  theme(plot.margin = unit(c(1, 1, 1, 1), "cm")) + 
  theme(plot.title = element_text(family = my_font, size = 26, color = "gray10")) + 
  theme(plot.subtitle = element_text(family = my_font, size = 15, color = "gray40")) + 
  theme(plot.caption = element_text(family = my_font, size = 12, color = "gray40", face = "italic")) + 
  theme(axis.text = element_text(family = my_font, size = 14, color = "gray30")) + 
  theme(legend.text = element_text(family = my_font, size = 12, color = "grey30")) + 
  theme(legend.title = element_text(family = my_font, size = 12, color = "grey30")) + 
  theme(axis.title = element_text(family = my_font, size = 15)) + 
  # theme(axis.title.x = element_text(family = my_font, size = 15, hjust = 0)) + 
  # theme(axis.title.y = element_text(family = my_font, size = 15, hjust = 1)) + 
  theme(panel.grid.minor = element_blank()) +
  theme(plot.background = element_rect(fill = "seashell", color = NA))
LS0tDQp0aXRsZTogIndic3RhdHMgLSBSIFBhY2thZ2UgZm9yIENvbGxlY3RpbmcgRGF0YSBGcm9tIFdvcmxkIEJhbmsiDQphdXRob3I6ICJOZ3V5ZW4gQ2hpIER1bmciDQpzdWJ0aXRsZTogIkRhaWx5IEdyYXBoIFNlcmllcyINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBoaWdobGlnaHQ6IHplbmJ1cm4NCiAgICB0aGVtZTogZmxhdGx5DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQotLS0NCg0KYGBge3Igc2V0dXAsaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGZpZy5yZXRpbmE9MikNCmBgYA0KDQojIENvbGxlY3QgZGF0YSBmcm9tIFdvcmxkIEJhbmsgYW5kIG1ha2UgYSBCdWJibGUgUGxvdA0KDQohW10oQzpcXFVzZXJzXFxaYm9va1xcRGVza3RvcFxcRGVwb2Nlbl9Db3Vyc2VcXGIyLmpwZykNCg0KDQpgYGB7ciwgZXZhbD1GQUxTRX0NCiM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQojICBSZWZlcmVuY2U6IGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy93YnN0YXRzL3ZpZ25ldHRlcy9Vc2luZ190aGVfd2JzdGF0c19wYWNrYWdlLmh0bWwNCiMgICAgICAgICAgICAgaHR0cHM6Ly93d3cuci1ibG9nZ2Vycy5jb20vbGlmZS1leHBlY3RhbmN5LWFuaW1hdGVkLw0KIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KIyBMb2FkIHdic3RhdHMgcGFja2FnZTogDQoNCmxpYnJhcnkod2JzdGF0cykNCg0KIyBHZW5lcmFsIGluZm9ybWF0aW9uIGluIGxpc3Qgc3RydWN0dXJlOiANCg0KZ2VuZXJhbF9pbmZvcm1hdGlvbiA8LSAgd2JfY2FjaGVsaXN0DQoNCiMgU2hvdyBzb21lIGJhc2ljIGluZm9ybWF0aW9uOiANCnN0cihnZW5lcmFsX2luZm9ybWF0aW9uLCBtYXgubGV2ZWwgPSAxKQ0KDQoNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgRXh0cmFjdCBkYXRhIGZyYW1lIHRoYXQgY29udGFpbnMgZ2VuZXJhbCBpbmZvcm1hdGlvbiBmb3IgY291bnRyaWVzDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCg0KZGZfY291bnRyaWVzIDwtIGdlbmVyYWxfaW5mb3JtYXRpb25bWzFdXQ0KDQoNCiMgU29tZSBpbnNpZ2h0cywgZm9yIGV4YW1wbGUsIGluY29tZSBncm91cDogDQoNCmxpYnJhcnkodGlkeXZlcnNlKQ0KDQpkZl9jb3VudHJpZXMgJT4lIA0KICBncm91cF9ieShpbmNvbWUpICU+JSANCiAgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAoKQ0KDQoNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgIEluZGljYXRvcnMgcHJvdmlkZWQgYnkgV0INCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KDQpkZl9pbmRpY2F0b3JzIDwtIGdlbmVyYWxfaW5mb3JtYXRpb25bWzJdXQ0KDQojIE51bWJlciBvZiBpbmRpY2F0b3JzOiANCg0KZGltKGRmX2luZGljYXRvcnMpDQoNCiMgRGVzY3JpcHRpb24gZm9yIGluZGljYXRvcnM6IA0KDQpkZl9pbmRpY2F0b3JzICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yLCAiZ3Jvc3MgZG9tZXN0aWMiKSkgJT4lIA0KICBoZWFkKCkgJT4lIA0KICBWaWV3KCkNCg0KDQpkZl9pbmRpY2F0b3JzICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yLCAiY2FwaXRhbCIpKSAlPiUgDQogIGhlYWQoKSAlPiUgDQogIFZpZXcoKQ0KDQoNCmRmX2luZGljYXRvcnMgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3IsICJkZWF0aCIpKSAlPiUgDQogIGhlYWQoKSAlPiUgDQogIFZpZXcoKQ0KDQpkZl9pbmRpY2F0b3JzICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yLCAidGF4IikpICU+JSANCiAgaGVhZCgpICU+JSANCiAgVmlldygpDQoNCg0KZGZfaW5kaWNhdG9ycyAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvciwgIlBvcHVsYXRpb24iKSkgJT4lIA0KICBoZWFkKCkgJT4lIA0KICBWaWV3KCkNCg0KIyBBIGxpc3Qgb2YgaW5kaWNhdG9yczogDQoNCm15X2luZGljYXRvciA8LSBjKCJTUC5QT1AuVE9UTCIsICJTUC5EWU4uTEUwMC5JTiIsICJOWS5HRFAuUENBUC5QUC5DRCIpDQoNCmRmX2luZGljYXRvcnMgJT4lIA0KICBmaWx0ZXIoaW5kaWNhdG9ySUQgJWluJSBteV9pbmRpY2F0b3IpICU+JSANCiAgc2VsZWN0KDE6MikNCg0KDQojIENvbGxlY3QgZGF0YSBmb3IgYW4gaW5kaWNhdG9yIGZvciBhbGwgbmF0aW9uczogDQoNCmVkdWNfZGF0YSA8LSB3Yihjb3VudHJ5ID0gImFsbCIsDQogICAgICAgICAgICAgICAgaW5kaWNhdG9yID0gIlBSSi5QT1AuMjAyNC4zLk1GIiwNCiAgICAgICAgICAgICAgICBzdGFydGRhdGUgPSAyMDAwLA0KICAgICAgICAgICAgICAgIGVuZGRhdGUgPSAyMDE4KQ0KDQojIENvbGxlY3QgZGF0YSwgYW4gaW5kaWNhdG9yIGZvciBzb21lIG5hdGlvbnM6IA0KDQplZHVjX2RhdGFfM25hdGlvbnMgPC0gd2IoY291bnRyeSA9IGMoIkFGRyIsICJBR08iLCAiVk5NIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdG9yID0gIlNILlRCUy5NT1JUIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGRhdGUgPSAyMDE2LA0KICAgICAgICAgICAgICAgICAgICAgICAgIGVuZGRhdGUgPSAyMDE3KQ0KDQojIENvbGxlY3Qgc29tZSBpbmRpY2F0b3JzIGZvciBzb21lIG5hdGlvbnM6IA0KDQplZHVjX3R1YmVyY3Vsb3NpcyA8LSB3Yihjb3VudHJ5ID0gYygiQUZHIiwgIkFHTyIsICJWTk0iKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRvciA9IGMoIlNILlRCUy5NT1JUIiwgIlBSSi5QT1AuMjAyNC4zLk1GIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRkYXRlID0gMjAxNiwNCiAgICAgICAgICAgICAgICAgICAgICAgIGVuZGRhdGUgPSAyMDE3KSAjIEV4YW1wbGUgMS4gDQoNCg0KDQoNCm15ZGYgPC0gd2IoY291bnRyeSA9ICJhbGwiLA0KICAgICAgICAgICBpbmRpY2F0b3IgPSBteV9pbmRpY2F0b3IsIA0KICAgICAgICAgICBzdGFydGRhdGUgPSAyMDE2LA0KICAgICAgICAgICBlbmRkYXRlID0gMjAxNykgIyBFeGFtcGxlIDIuIA0KDQoNCg0KIyBSZW5hbWUgc29tZSBjb2x1bW5zIGFuZCBmaWx0ZXIgZGF0YSBmb3IgeWVhciBvZiAyMDE2OiANCg0KbXlkZl9zbWFsbCA8LSBteWRmICU+JSANCiAgZmlsdGVyKGRhdGUgPT0gMjAxNikgJT4lIA0KICBzZWxlY3QoY291bnRyeSwgaXNvMmMsIGluZGljYXRvcklELCB2YWx1ZSkNCg0KDQojIENvbnZlcnQgdG8gd2lkZSBmb3JtIGFuZCByZW5hbWUgZm9yIHNvbWUgY29sdW1uczogDQoNCm15ZGZfc21hbGwgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBzcHJlYWQoa2V5ID0gImluZGljYXRvcklEIiwgdmFsdWUgPSAidmFsdWUiKSAlPiUgDQogIG5hLm9taXQoKSAlPiUgDQogIHJlbmFtZShwb3AgPSBTUC5QT1AuVE9UTCwgbGlmZSA9IFNQLkRZTi5MRTAwLklOLCBnZHAgPSBOWS5HRFAuUENBUC5QUC5DRCkgLT4gbXlkZl9zbWFsbF93aWRlDQoNCg0KIyBGaWx0ZXIgb3VyIGRhdGEgKHJlbW92ZSBBZ2dyZWdhdGVzIGxhYmVsKTogDQoNCmluY29tZV9ncm91cCA8LSBkZl9jb3VudHJpZXMgJT4lIA0KICBtdXRhdGVfaWYoaXMuZmFjdG9yLCBhcy5jaGFyYWN0ZXIpICU+JSANCiAgZmlsdGVyKGluY29tZSAhPSAiQWdncmVnYXRlcyIpICU+JSANCiAgc2VsZWN0KGlzbzJjLCByZWdpb24sIGluY29tZSkNCg0KDQojIE1lZ2VyIGRhdGEgc2V0cyBhbmQgcmVtb3ZlIG1pc3NpbmcgcG9pbnRzOiANCg0KdG90YWxfZGYgPC0gcmlnaHRfam9pbihteWRmX3NtYWxsX3dpZGUsIGluY29tZV9ncm91cCwgYnkgPSAiaXNvMmMiKSAlPiUgbmEub21pdCgpDQoNCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgUGFnZSAzOCBmcm9tIEEuIERlYXRvbidzIGJvb2sgKGh0dHBzOi8vd3d3LmFtYXpvbi5jb20vZ3AvcHJvZHVjdC8wNjkxMTY1NjI5L3JlZj1kYnNfYV9kZWZfcnd0X2JpYmxfdnBwaV9pMCkNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmxpYnJhcnkoZ2dyZXBlbCkNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShnZ3NjaSkNCmxpYnJhcnkoZXh0cmFmb250KQ0KbXlfZm9udCA8LSAiUm9ib3RvIENvbmRlbnNlZCINCg0KDQpteV9jb3VudHJ5IDwtIGMoIlZpZXRuYW0iLCAiQ2hpbmEiLCAiSW5kaWEiLCAiVGhhaWxhbmQiLCAiTWFsYXlzaWEiLCAiRnJhbmNlIiwgIkNhbWJvZGlhIiwgDQogICAgICAgICAgICAgICAgIkdlcm1hbnkiLCAiSmFwYW4iLCAiTmlnZXJpYSIsICJJbmRvbmVzaWEiLCAiU2luZ2Fwb3JlIiwgIlBoaWxpcHBpbmVzIikgIyBTZWxlY3Qgc29tZSBuYXRpb25zLiANCg0KDQp0b3RhbF9kZiAlPiUgDQogIGZpbHRlcihnZHAgPCAxMDAwMDApICU+JSANCiAgZ2dwbG90KGFlcyhnZHAsIGxpZmUsIHNpemUgPSBwb3AsIGNvbG9yID0gaW5jb21lKSkgKyANCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNSkgKyANCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgZm9ybXVsYSA9IHkgfiBsb2coeCksIGNvbG9yID0gIm9yYW5nZSIsIGFscGhhID0gMC4xLCBzZSA9IEZBTFNFKSArIA0KICBnZW9tX3RleHRfcmVwZWwoZGF0YSA9IHRvdGFsX2RmICU+JSBmaWx0ZXIoY291bnRyeSAlaW4lIG15X2NvdW50cnkpLCBhZXMobGFiZWwgPSBjb3VudHJ5KSwgY29sb3IgPSAiZ3JheTIwIiwgc2l6ZSA9IDUsIGZvcmNlID0gMTksIGZhbWlseSA9IG15X2ZvbnQpICsgDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTAwMDAwLCAxMDAwMCksIGxhYmVscyA9IGRvbGxhcikgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSg1MCwgODUsIDUpKSArIA0KICBzY2FsZV9zaXplKHJhbmdlID0gYygxLCAzMCkpICsgDQogIHNjYWxlX2NvbG9yX2xhbmNldChuYW1lID0gIkdyb3VwOiIpICsgDQogIGd1aWRlcyhzaXplID0gRkFMU0UpICsgDQogIGxhYnMoeCA9ICJHRFAgcGVyIGNhcGl0YWwiLCANCiAgICAgICB5ID0gIkxpZmUgZXhwZWN0YW5jeSIsIA0KICAgICAgIHRpdGxlID0gIlRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBMaWZlIEV4cGVjdGFuY3kgYW5kIEdEUCBwZXIgY2FwaXRhbCBpbiAyMDE2IiwgDQogICAgICAgc3VidGl0bGUgPSAiQWNjb3JkaW5nIHRvIFdITyBkZWZpbml0aW9ucywgTGlmZSBFeHBlY3RhbmN5IGF0IHJlZmxlY3RzIHRoZSBvdmVyYWxsIG1vcnRhbGl0eSBsZXZlbCBvZiBhIHBvcHVsYXRpb24gYW5kIGl0IGlzIGRlZmluZWQgYXNcbnRoZSBhdmVyYWdlIG51bWJlciBvZiB5ZWFycyB0aGF0IGEgbmV3Ym9ybiBpcyBleHBlY3RlZCB0byBsaXZlIGlmIGN1cnJlbnQgbW9ydGFsaXR5IHJhdGVzIGNvbnRpbnVlIHRvIGFwcGx5LiAiLCANCiAgICAgICBjYXB0aW9uID0gICJEYXRhIFNvdXJjZTogVGhlIFdvcmxkIEJhbmsiKSArIA0KICB0aGVtZV9taW5pbWFsKCkgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gYygwLjgzLCAwLjMwKSkgKyANCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIiwgZmFtaWx5ID0gbXlfZm9udCkpICsgDQogIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKDEsIDEsIDEsIDEpLCAiY20iKSkgKyANCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBteV9mb250LCBzaXplID0gMjYsIGNvbG9yID0gImdyYXkxMCIpKSArIA0KICB0aGVtZShwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IG15X2ZvbnQsIHNpemUgPSAxNSwgY29sb3IgPSAiZ3JheTQwIikpICsgDQogIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBteV9mb250LCBzaXplID0gMTIsIGNvbG9yID0gImdyYXk0MCIsIGZhY2UgPSAiaXRhbGljIikpICsgDQogIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBteV9mb250LCBzaXplID0gMTQsIGNvbG9yID0gImdyYXkzMCIpKSArIA0KICB0aGVtZShsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBteV9mb250LCBzaXplID0gMTIsIGNvbG9yID0gImdyZXkzMCIpKSArIA0KICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gbXlfZm9udCwgc2l6ZSA9IDEyLCBjb2xvciA9ICJncmV5MzAiKSkgKyANCiAgdGhlbWUoYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBteV9mb250LCBzaXplID0gMTUpKSArIA0KICAjIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBteV9mb250LCBzaXplID0gMTUsIGhqdXN0ID0gMCkpICsgDQogICMgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IG15X2ZvbnQsIHNpemUgPSAxNSwgaGp1c3QgPSAxKSkgKyANCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICB0aGVtZShwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJzZWFzaGVsbCIsIGNvbG9yID0gTkEpKQ0KDQogIA0KYGBgDQoNCg==