Global Terrorism Dataset

First, I had a look at the dataset that Dr. Martinez Machain suggested in her email, the Global Terrorism Dataset.

If we sum the number of total terrorist acts per country per year, we see that the top three countries are Iraq, Pakistan and Afghanistan.

Source: https://www.start.umd.edu/data-tools/global-terrorism-database-gtd

The Global Terrorism Database (GTD) is an open-source database including information on terrorist events around the world since 1970 (currently updated through 2018). Unlike many other event databases, the GTD includes systematic data on international as well as domestic terrorist incidents that have occurred during this time period and now includes over 190,000 cases.

LaFree, G., & Dugan, L. (2007). Introducing the global terrorism database. Terrorism and political violence, 19(2), 181-204.

Total terrorist attacks

Total terrorist attacks between 1970 and 2019

gtd %>% 
  group_by(country_txt, region_txt) %>% 
  summarise(sum = n()) %>% 
  ungroup() %>% 
  filter(sum > 4000) %>% 
  ggplot(aes(x = reorder(country_txt, sum), 
             y = sum, 
             fill = as.factor(region_txt))) + 
    scale_fill_manual(values = c("#001219","#005f73","#0a9396","#94d2bd",
                                 "#ee9b00","#ca6702","#bb3e03","#ae2012","#9b2226")) + 
  coord_flip() +
  geom_bar(stat = "identity") + 
  ggthemes::theme_pander() +
  theme(legend.position = "bottom", 
        legend.title = element_blank()) + 
  ggtitle("Total terrorist attacks 1970 - 2019")
## `summarise()` has grouped output by 'country_txt'. You can override using the `.groups` argument.

Suicide attacks

If we look only at suicide attack, the countries are still Iraq, Afghanistan and Pakistan.

There does not appear to be a variable to indicate if the terrorist attack was related explicitly to Islamic Fundamentalism.

Suicide terrorist attacks between 1970 and 2019

gtd %>% 
  filter(suicide == 1 ) %>% 
  group_by(country_txt, region_txt) %>% 
  summarise(suicide_sum = n()) %>% 
  ungroup() %>% 
  filter(suicide_sum > 50) %>% 
  ggplot(aes(x = reorder(country_txt, suicide_sum), 
             y = suicide_sum, 
             fill = as.factor(region_txt))) + 
  scale_fill_manual(values = c("#001219", "#0a9396", "#ee9b00", "#ca6702","#bb3e03",
                               "#005f73", "#94d2bd", "#ae2012", "#9b2226")) +
  coord_flip() +
  geom_bar(stat = "identity") + 
  ggthemes::theme_pander() +
  theme(legend.position = "bottom", legend.title = element_blank()) +
  ggtitle("Suicide terrorist attacks 1970 - 2019")
## `summarise()` has grouped output by 'country_txt'. You can override using the `.groups` argument.

Look only at 2019

gtd %>% 
  filter(suicide == 1 ) %>% 
    filter(iyear == 2019) %>% 
  group_by(country_txt, iyear, region_txt) %>% 
  select(year = iyear, everything()) %>% 
  summarise(suicide_sum = n()) %>% 
  arrange(desc(suicide_sum)) %>% 
  head(20) %>% 
  ungroup()  %>% 
  ggplot(aes(x = reorder(country_txt, suicide_sum), 
             y = suicide_sum, 
             fill = as.factor(region_txt))) + 
  scale_fill_manual(values = c("#001219", "#0a9396",
                               "#ca6702","#9b2226",
                               "#94d2bd","#ee9b00")) +
  coord_flip() +
  geom_bar(stat = "identity") + facet_wrap(~year) +
  ggthemes::theme_pander() +
  theme(legend.position = "bottom", legend.title = element_blank()) +
  ggtitle("Total suicide terrorist attacks per country in 2019")
## `summarise()` has grouped output by 'country_txt', 'year'. You can override using the `.groups` argument.

So for the dataset, we can add a variable with number of terrorist attacks per country per year or we can create a binary variable with a cut-off point.

We can also look at number of terrorist attacks per capita per year and run a scatter plot with PD budgets to see if there is a linear relationship

## `summarise()` has grouped output by 'cow_code', 'year'. You can override using the `.groups` argument.
## `summarise()` has grouped output by 'cow_code'. You can override using the `.groups` argument.
## `summarise()` has grouped output by 'cow_code'. You can override using the `.groups` argument.
## `summarise()` has grouped output by 'cow_code', 'year'. You can override using the `.groups` argument.

A tibble: 173 x 2

country avg_suicide 1 Afghanistan 4.17 2 Iraq 1.67 3 Somalia 1.06 4 Nigeria 1
5 Pakistan 0.833 6 Egypt 0.5
7 Niger 0.444 8 Sri Lanka 0.389 9 Philippines 0.333 10 Mali 0.278 # … with 163 more rows

Scatterplot comparing all types of terrorist attacks per capita vs PD budgets per capita

the_df %>%
  mutate(attacks_pc = sum_attacks / pop, na.rm = TRUE) %>% 
  ggplot(aes(y = log(budget_pc), x = log(attacks_pc))) +
      geom_smooth(method = "lm", color = "#9d0208") +
  geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) +
  facet_wrap(~year) +
  scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"), name = NULL) +
  scale_shape_manual(values = c(15,16,17,18,19,10), name = NULL) +
  xlab("Logged number of terrorist attacks per capita") +
  ylab("Logged PD budget per capita") +
  theme(legend.position = "left") +
  ggthemes::theme_pander() + 
  ggtitle("Total terrorist attacks per capita vs PD budgets per capita")
## `geom_smooth()` using formula 'y ~ x'

Scatterplot comparing suicide terrorist attacks per capita vs PD budgets per capita

the_df %>%
  mutate(attacks_pc = sum_suicides / pop, na.rm = TRUE) %>% 
  ggplot(aes(y = log(budget_pc), x = log(attacks_pc))) +
  geom_smooth(method = "lm", color = "#9d0208") +
  geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) +
  facet_wrap(~year) +
  scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", 
                                "#6d597a", "#e63946", "#f4a261"), name = NULL) +
  scale_shape_manual(values = c(15,16,17,18,19,10), name = NULL) +
  xlab("Logged number of terrorist attacks per capita") +
  ylab("Logged PD budget per capita") +
  theme(legend.position = "left") +
  ggthemes::theme_pander() + 
  ggtitle("Suicide attacks per capita vs PD budgets per capita")
## `geom_smooth()` using formula 'y ~ x'

the_df %>%
  
  
  ggplot(aes(y = log(budget_pc), x = log(sum_suicides))) +
  geom_smooth(method = "lm", color = "#9d0208") +
  geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) +
  facet_wrap(~year) +
  scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", 
                                "#6d597a", "#e63946", "#f4a261"), name = NULL) +
  scale_shape_manual(values = c(15,16,17,18,19,10), name = NULL) +
  xlab("Logged number of terrorist attacks per capita") +
  ylab("Logged PD budget per capita") +
  theme(legend.position = "left") +
  ggthemes::theme_pander() + 
  ggtitle("Suicide attacks per capita vs PD budgets per capita")
## `geom_smooth()` using formula 'y ~ x'

Only looking at terrorist attacks in 2019

the_df %>%
  filter(year == 2019) %>% 
  mutate(attacks_pc = sum_attacks / pop, na.rm = TRUE) %>% 
  ggplot(aes(y = log(budget), x = log(sum_attacks), group = as.factor(region_6))) + 
  geom_smooth(method = "lm", color = "#9d0208", alpha = 0.5) +
  geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) + 
  facet_wrap(~region_6) + 
  scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"),
                   name = NULL) +
  scale_shape_manual(values = c(15,16,17,18,19,10),
                     name = NULL) +
  xlab("Logged number of terrorist attacks per capita") +
  ylab("Logged PD budget per capita") +
  theme(legend.position = "left") +
  ggthemes::theme_pander() + 
  ggtitle("Total terrorist attacks per capita vs PD budgets per capita in 2019")
## `geom_smooth()` using formula 'y ~ x'

Suicide attacks per capita vs PD budgets per capita since 2013

the_df %>%
  filter(year > 2012) %>% 
  mutate(attacks_pc = sum_suicides / pop, na.rm = TRUE) %>% 
  ggplot(aes(y = log(budget_pc), x = log(attacks_pc))) +
  geom_smooth(method = "lm", color = "#9d0208") +
  geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) +
  facet_wrap(~region_6) +
  scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"), name = NULL) +
  scale_shape_manual(values = c(15,16,17,18,19,10), name = NULL) +
  xlab("Logged number of terrorist attacks per capita") +
  ylab("Logged PD budget per capita") +
  theme(legend.position = "left") +
  ggthemes::theme_pander() + 
  ggtitle("Suicide attacks per capita vs PD budgets per capita since 2013")
## `geom_smooth()` using formula 'y ~ x'

Chinese aid dataset

Next we can decide which countries are in China’s sphere of influence.

Source: https://www.aiddata.org/data/chinese-global-official-finance-dataset

This dataset tracks the known universe of overseas Chinese official finance between 2000-2014, capturing 4,373 records totaling $354.4 billion. The data includes both Chinese aid and non-concessional official financing.

Bluhm, R., Dreher, A., Fuchs, A., Parks, B. C., Strange, A., & Tierney, M.J. (2018). Connective Financing: Chinese Infrastructure Projects and the Diffusion of Economic Activity in Developing Countries. AidData Working Paper

Looking at the total aid from China between 2000 to 2014

china_aid %>% 
  filter(!is.na(region_name)) %>% 
  group_by(country, region_name) %>% 
  filter(!grepl("regional", country)) %>% 
  summarise(sum_aid = sum(chn_aid, na.rm = TRUE)) %>% 
  ungroup() %>% 
  top_n(30) %>% 
  ggplot(aes(x= reorder(country, sum_aid), 
             y = sum_aid, 
             fill = as.factor(region_name))) + 
  geom_bar(stat = "identity") + 
  coord_flip() + 
  scale_fill_manual(values = c("#005f73","#0a9396","#94d2bd","#ee9b00",
                               "#ca6702","#bb3e03","#ae2012","#9b2226"), 
                    name = NULL) +
  theme(axis.text.y = element_text(size = 10),
        axis.title.y = element_blank(), 
        legend.position = "bottom") + 
  xlab("country") +
  ylab("Total aid from China") +
  ggthemes::theme_pander() + 
  ggtitle("Total aid from China betweem 2000 - 2014") 
## `summarise()` has grouped output by 'country'. You can override using the `.groups` argument.
## Selecting by sum_aid

china_aid %>% 
  filter(!is.na(region_name)) %>% 
  group_by(country, region_name) %>% 
  filter(!grepl("regional", country)) %>% 
  summarise(sum_aid = sum(chn_aid, na.rm = TRUE)) %>% 
  ungroup() %>% 
  top_n(20) %>% pull(country) -> top_china_aid_vector
## `summarise()` has grouped output by 'country'. You can override using the `.groups` argument.
## Selecting by sum_aid
top_china_aid_vector

[1] “Angola” “Argentina” “Belarus” “Brazil” “Ecuador”
[6] “Ethiopia” “Ghana” “India” “Indonesia” “Iran”
[11] “Kazakhstan” “Laos” “Nigeria” “Pakistan” “Philippines” [16] “Russia” “Sri Lanka” “Sudan” “Venezuela” “Viet Nam”

china_aid %>% 
  filter(!is.na(region_name)) %>% 
  group_by(country, region_name) %>% 
  filter(!grepl("regional", country)) %>% 
  mutate(chn_aid_pc = chn_aid / population, na.rm = TRUE) %>% 
  summarise(sum_aid_pc = sum(chn_aid_pc, na.rm = TRUE)) %>% 
  ungroup() %>% 
  top_n(20) %>% pull(country) -> top_china_aid_pc_vector
## `summarise()` has grouped output by 'country'. You can override using the `.groups` argument.
## Selecting by sum_aid_pc
top_china_aid_pc_vector

[1] “Albania” “Antigua & Barbuda” “Bahamas”
[4] “Belarus” “Bosnia-Herzegovina” “Cyprus”
[7] “Dominica” “Equatorial Guinea” “Fiji”
[10] “Grenada” “Laos” “Maldives”
[13] “Mauritius” “Mongolia” “Samoa”
[16] “Sao Tome & Principe” “Seychelles” “Tonga”
[19] “Turkmenistan” “Venezuela”

Chinese FDI in Africa

Source: https://www.aiddata.org/data/aiddatas-chinese-official-finance-to-africa-dataset-version-1-1-1

This is a dataset of Chinese official finance activities that spans 50 African countries over the 2000-2012 period. It includes 1,952 Chinese development finance projects across 3,545 physical locations.

Dreher, A., Fuchs, A., Hodler, R., Parks, B. C., Raschky, P. A., & Tierney, M.J. (2019). African Leaders and the Geography of China’s Foreign Assistance. Journal of Development Economics, 140, 44-71.

Total development finance investment to Africa from China 2000 to 2012

fdi_af %>% 
    top_n(25) %>% 
  ggplot(aes(x = reorder(country, sum_fdi), y = sum_fdi, fill = country)) + 
  geom_bar(stat = "identity") + 
  coord_flip() + ggthemes::theme_pander() +
  theme(axis.text.y = element_text(size = 10),
        axis.title.y = element_blank(), 
        legend.position = "none") + ggthemes::theme_pander() +
  xlab("Total development finance costs") +
  ylab("Country") +
  ggthemes::theme_pander() + theme(legend.position = "none") +
  ggtitle("Total development finance investment from China 2000 to 2012 ") 
## Selecting by cow_code

Looking at the financial development investment per capita to Africa 2000 to 2102

the_df <-merge(the_df, fdi_af, by = c("cow_code"), all.x = TRUE)

the_df %>% 
  filter(sum_fdi > 10000) %>% 
  mutate(fdi_pc = sum_fdi / pop, na.rm = TRUE) %>% 
  ggplot(aes(x = reorder(country.x, fdi_pc), y = fdi_pc, fill = country.x)) + 
  geom_bar(stat = "identity") + 
  coord_flip() + ggthemes::theme_pander() +
  theme(axis.text.y = element_text(size = 10),
        axis.title.y = element_blank(), 
        legend.position = "none") + ggthemes::theme_pander() +
  xlab("Total finance costs per capita") +
  ylab("Country") +
  ggthemes::theme_pander() + theme(legend.position = "none") +
  ggtitle("Total finance per capita from China 2000 to 2012 ") 

Russia’s Sphere of Influence

Russia’s sphere contains all post-soviet countries and all countries that are contiguous to Russia

China’s Sphere of Influence

China’s spehere contains top 20 aid recipients per capita and top financial recipients per capita from XXX YYY years/

It also contains all countries contiguous to China.

Average voting similarity to China in the UN

Source: https://dataverse.harvard.edu/dataset.xhtml?persistentId=doi:10.7910/DVN/5GQIVU

Rodrigues Vieira, V. (2018). Who joins counter-hegemonic IGOs? Early and late members of the China-led Asian Infrastructure Investment Bank. Research & Politics, 5(2)

China Alignment correspond to the average ideal point scale (ranging from 0 to 100) of Bailey et al. (2015) for a state’s vote with Chinese positions in the United Nations General Assembly between 1990 and 2009, a period during which US leadership in world affairs seemed robust. This measures the strength of international ties with China in political terms

aiib <- read_dta("C:/Users/Paula/Desktop/AIIB-ForResubmission.dta")
  
aiib %>% 
  select(country, chinaalignment) %>%
  arrange(desc(chinaalignment)) %>% 
  filter(chinaalignment > 9000) %>% 
  kbl() %>%
  kable_paper("striped",
              full_width = F)
country chinaalignment
Vietnam 9407.000
Myanmar 9340.000
Korea, Dem. Rep.  9259.000
Lao PDR 9223.000
Cuba 9175.999
Zimbabwe 9109.000
Syrian Arab Republic 9096.000
Libya 9086.000
Iran, Islamic Rep.  9086.000
Yemen, Rep.  9070.000
Sudan 9061.000
Oman 9027.000
Egypt, Arab Rep.  9019.000
Qatar 9016.000
Iraq 9008.000
aiib %>% 
    filter(chinaalignment > 8800) %>% 
  ggplot(aes(x = reorder(country, chinaalignment), y = chinaalignment, fill = country)) + 
  geom_bar(stat = "identity") + 
  coord_flip() + ggthemes::theme_pander() +
  theme(axis.text.y = element_text(size = 10),
        axis.title.y = element_blank(), 
        legend.position = "none") + ggthemes::theme_pander() +
  ylab("Voting similarity to China (average)") +
  xlab("Country") +
  ggthemes::theme_pander() + theme(legend.position = "none") +
  ggtitle("Top aligned to Chinese UN voting 2000 - 2014")  

aiib %>% 
    filter(chinaalignment < 5500) %>% 
  ggplot(aes(x = reorder(country, chinaalignment), y = chinaalignment, fill = country)) + 
  geom_bar(stat = "identity") + 
  coord_flip() + ggthemes::theme_pander() +
  theme(axis.text.y = element_text(size = 10),
        axis.title.y = element_blank(), 
        legend.position = "none") + ggthemes::theme_pander() +
  ylab("Voting similarity to China (average)") +
  xlab("Country") +
  ggthemes::theme_pander() + theme(legend.position = "none") +
  ggtitle("Least aligned to Chinese UN voting 2000 - 2014") 

map <- ne_countries(scale = "medium", returnclass = "sf")

aiib$iso3c <- countrycode(aiib$country, "cown","iso3c")

map_aiib <- merge(map, aiib, by.x = "adm0_a3", by.y = "wbcode", all.x = TRUE)

View(map)

coord <- read_html("https://developers.google.com/public-data/docs/canonical/countries_csv")
coord_tables <- coord %>% html_table(header = TRUE, fill = TRUE)
coordy <- coord_tables[[1]]
col_map <- merge(map_aiib, coordy, by.x= "iso_a2", by.y = "country", all.y = TRUE)

map_aiib %>%
  # filter(geounit != "Siachen Glacier") %>%
  filter(subregion == "Eastern Asia" | subregion == "South-Eastern Asia" | subregion == "Southern Asia") %>%
  ggplot() +
  geom_sf(aes(fill = chinaalignment),
           position = "identity") +
  labs(fill='Russian Sphere') +
  # geom_label(aes(longitude+1, latitude+1, label = factor(geounit)), size = 3) +
  ggthemes::theme_map() +
  theme(legend.position = "blank") +
  scale_fill_distiller(palette = "RdBu")

col_map %>%
filter(continent == "Africa") %>%   ggplot() +
  geom_sf(aes(fill = chinaalignment),
           position = "identity") +
  labs(fill='Russian Sphere') +
  geom_label(aes(longitude+1, latitude+1, label = factor(geounit)), size = 3) +
  ggthemes::theme_map() +
  theme(legend.position = "blank") +
  scale_fill_distiller(palette = "RdBu")

plyr::count(map_aiib$subregion)
                       x freq

1 Antarctica 1 2 Australia and New Zealand 4 3 Caribbean 25 4 Central America 8 5 Central Asia 5 6 Eastern Africa 19 7 Eastern Asia 8 8 Eastern Europe 10 9 Melanesia 5 10 Micronesia 7 11 Middle Africa 9 12 Northern Africa 7 13 Northern America 5 14 Northern Europe 15 15 Polynesia 8 16 Seven seas (open ocean) 5 17 South-Eastern Asia 11 18 South America 13 19 Southern Africa 5 20 Southern Asia 10 21 Southern Europe 16 22 Western Africa 17 23 Western Asia 19 24 Western Europe 9

europe_cropped <- st_crop(map_aiib, xmin = -20, xmax = 45,
                                    ymin = 30, ymax = 73)
## although coordinates are longitude/latitude, st_intersection assumes that they are planar
europe_cropped %>%
  filter(subregion == "Eastern Europe" | subregion == "Northern Europe" | subregion == "Southern Europe" | subregion == "Western Europe") %>%
  ggplot() +
  geom_sf(aes(fill = chinaalignment),
           position = "identity") +
  labs(fill='Russian Sphere') +
  # geom_label(aes(longitude+1, latitude+1, label = factor(geounit)), size = 3) +
  ggthemes::theme_map() +
  theme(legend.position = "blank") +
  scale_fill_distiller(palette = "RdBu")

aiib %>% 
  filter(aiibmember == 1) %>% 
  select(country) %>% 
  kbl() %>%
  kable_paper("striped",
              full_width = F)
country
Brazil
United Kingdom
Netherlands
Luxembourg
France
Switzerland
Spain
Portugal
Germany
Poland
Austria
Italy
Malta
Russian Federation
Georgia
Azerbaijan
Finland
Sweden
Norway
Denmark
Iceland
South Africa
Iran, Islamic Rep. 
Turkey
Egypt, Arab Rep. 
Jordan
Israel
Saudi Arabia
Kuwait
Qatar
United Arab Emirates
Oman
Tajikistan
Kyrgyz Republic
Uzbekistan
Kazakhstan
Mongolia
Korea, Rep. 
India
Pakistan
Bangladesh
Myanmar
Sri Lanka
Maldives
Nepal
Thailand
Cambodia
Lao PDR
Vietnam
Malaysia
Singapore
Philippines
Indonesia
Australia
New Zealand

Chinese Public Diplomacy Efforts and Activities

soviet_iron_curtain_vector <- c("Albania",
                                "Bulgaria",
                                "Czech Republic", 
                                "Poland", 
                                "Kosovo", 
                                "Romania", 
                                "Hungary",
                                "Slovakia", 
                                "Bosnia and Herzegovina",
                                "Croatia",
                                "Macedonia", 
                                "Montenegro", 
                                "Serbia")

soviet_republics_vector <- c("Russia", "Lithuania", "Georgia",
                             "Estonia"  ,
                             "Latvia"   ,
                             "Ukraine"  ,
                             "Belarus"  ,
                             "Moldova"  ,
                             "Kyrgyzstan",  
                             "Uzbekistan",  
                             "Tajikistan",  
                             "Armenia"  ,
                             "Azerbaijan",  
                             "Turkmenistan",    
                             "Russia"   ,
                             "Kazakhstan")

the_df %<>%
  dplyr::mutate(soviet_iron_curtain = ifelse(country.x %in% soviet_iron_curtain_vector, 1, 0)) 

the_df %<>%
  dplyr::mutate(soviet_republics = ifelse(country.x %in% soviet_republics_vector, 1, 0)) 


the_df %<>% mutate(rus_influence = ifelse(country.x == "Russia", 1, 
                                              ifelse(soviet_republics == 1, 1,
                                                ifelse(soviet_iron_curtain == 1, 1, 0))))

eurasian_dev_bank <- c("Russia", "Armenia", "Belarus", "Kazakhstan", "Kyrgystan", "Tajikistan")

brics <- c("Brazil", "Russia", "India", "China", "South Africa")

qccm <- c("China", "Afhganistan", "Pakistan", "Tajikistan")

forum_china_africa_coop <- c("China", "Algeria", "Angola", "Benin", "Botswana", "Burkina Faso")

Making variables

Trade openness formula:

total exports and total imports / total GDP

US dependence formula:

exports to US and imports from US / total exports and total imports

the_df$country <- the_df$country.x
the_df$country.y <- NULL

the_df %>% 
  mutate(budget_pc = budget / pop, na.rm = TRUE) %>%
  mutate(exports_pc = exports_bop / pop, na.rm = TRUE) %>% 
  mutate(balance_trade = exports_bop + imports_bop, na.rm = TRUE) %>% 
  mutate(trade_openess = balance_trade / gdp_const, na.rm = TRUE) %>% 
  mutate(us_balance_trade = us_exports_to_country + us_imports_from_country, na.rm = TRUE) %>% 
  mutate(us_trade_dependence = us_balance_trade / balance_trade, na.rm = TRUE) %>% 
  mutate(us_exports_pc = us_exports_to_country / pop, na.rm = TRUE) %>% 
  mutate(muslim_percent = percent_muslim_jitter / pop, na.rm = TRUE) %>% 
  mutate(us_imports_pc = us_imports_from_country / pop, na.rm = TRUE) -> the_df

US Trade Dependence

the_df %>% 
  select(country, year, us_trade_dependence) %>% 
  filter(us_trade_dependence > 0.1) %>% 
  arrange(desc(us_trade_dependence)) %>%
  filter(year == 2019) %>% 
  filter(us_trade_dependence > 0.3) %>% 
  kbl() %>%
  kable_paper("striped",
              full_width = F)
country year us_trade_dependence
Mexico 2019 0.6193343
Honduras 2019 0.5459561
Canada 2019 0.5366950
Nicaragua 2019 0.4553335
Bahamas, The 2019 0.3743550
Trinidad and Tobago 2019 0.3496008
Haiti 2019 0.3317885
Dominican Republic 2019 0.3269815
Guatemala 2019 0.3067713
the_df %>% 
  filter(gdp_const > 500000000000) %>% 
  select(country, year, us_trade_dependence) %>% 
  arrange(desc(us_trade_dependence)) %>%
  # filter(us_trade_dependence > 0.2) %>% 
  ggplot(aes(y = us_trade_dependence,
             x = reorder(country, us_trade_dependence), fill = country)) +
  coord_flip() +
  geom_histogram(stat = "identity") + ggthemes::theme_pander() +
  facet_grid(~year, scales = "free") + theme(legend.position = "none") + 
  ggtitle("Level of trade dependence in countries over 500 million GDP") + xlab("") + ylab("Percentage of total trade that is with US")

Divide budget by cost of living

url <- "https://www.numbeo.com/cost-of-living/rankings_by_country.jsp?title=2019"


# Countries with no INDEX



col_url <- read_html(url)
col_table <- col_url %>% html_table(header = TRUE, fill = TRUE)
col_19 <- col_table[[2]]

col_19$year <- replicate(119, 2019)
col_19$rank <- NULL
col_19 %<>% 
  clean_names()

col_19$cow_code <- countrycode(col_19$country, "country.name", "cown")

col_19 %<>% dplyr::mutate(cow_code = ifelse(country == "Palestine", 6666, 
                                              ifelse(country == "Serbia", 345, 
                                                ifelse(country == "Hong Kong", 997, cow_code))))

col_19 %>% 
  arrange(desc(cost_of_living_index)) %>% 
  filter(cost_of_living_index > 65) %>% 
  head() %>% 
  kbl() %>%
  kable_paper("striped",
              full_width = F)
rank country cost_of_living_index rent_index cost_of_living_plus_rent_index groceries_index restaurant_price_index local_purchasing_power_index year cow_code
NA Switzerland 121.16 50.25 87.11 120.81 123.09 129.70 2019 225
NA Iceland 101.86 48.28 76.13 92.10 111.85 91.80 2019 395
NA Norway 100.99 37.28 70.40 92.67 111.53 103.61 2019 385
NA Bahamas 92.40 33.49 64.11 76.97 99.92 57.01 2019 31
NA Luxembourg 86.09 55.64 71.47 75.10 96.08 106.26 2019 212
NA Japan 83.33 27.97 56.75 83.58 48.75 103.12 2019 740

Examining 2019 cost of living adjustment

# df_19 <- the_df %>% 
#   filter(year == 2019)
# 
# 
# df_19 <- merge(df_19, col_19, by = c("cow_code"), all.x = TRUE)
# 
# options(scipen = 999)
# 
# 
# 
# df_19 %>%  
#   # mutate(cost_living_percent = cost_of_living_index / 100, na.rm = TRUE) %>% 
#   mutate(adj_budget = budget / cost_of_living_index) %>% 
#   select(country = country.x, adj_budget, budget) %>% 
#   arrange(desc(adj_budget)) -> t1
# 
# df_19 %>%  
#   # mutate(cost_living_percent = cost_of_living_index / 100, na.rm = TRUE) %>% 
#   mutate(adj_budget = budget / cost_of_living_index) %>% 
#   select(country = country.x, budget, adj_budget) %>% 
#   arrange(desc(budget)) -> t2
# 
# kbl(list(t1, t2), digits = 0, caption = "Arranged By Adjusted Budget LEFT and By Raw Budget RIGHT") %>%
#    kable_paper("striped",
#                full_width = T)

Purchase Power Parity

Source: https://data.worldbank.org/indicator/PA.NUS.PPPC.RF

Price level ratio is the ratio of a purchasing power parity (PPP) conversion factor to an exchange rate. It provides a measure of the differences in price levels between countries by indicating the number of units of the common currency needed to buy the same volume of the aggregation level in each country.

Indicator source: International Comparison Program, World Bank

# 
# library(WDI)
# 
# ppp = WDI(indicator='PA.NUS.PPPC.RF', country="all", start=2019, end=2019)
# ppp$ppp <- ppp$PA.NUS.PPPC.RF
# ppp$PA.NUS.PPPC.RF <- NULL
# 
# View(ppp)
# 
# ppp$cow_code <- countrycode(ppp$iso2c, "iso2c", "cown")
# 
# ppp %<>% 
# dplyr::mutate(cow_code = ifelse(country == "West Bank and Gaza", 6666, 
#                                 ifelse(country == "Serbia", 345, 
#                                        ifelse(country == "Hong Kong SAR, China", 997, cow_code))))
# 
# ppp$country <- NULL
# 
# 
# try %<>%  
#   filter(!is.na(cow_code)) %>% 
#   mutate(ppp_budget_div = budget / ppp) %>% 
#   mutate(ppp_budget_mul = budget * ppp) %>% 
#   filter(country.x != "Kosovo") %>% 
#   select(country.x, budget, ppp, cow_code, ppp_budget_div,ppp_budget_mul ) -> hi
# 
# View(hi)
# 
# try %>% 
#   group_by(country.x) %>% 
#   mutate(ppp_budget = budget / ppp) %>% 
#   select(country = country.x, ppp_budget, raw_budget = budget) %>% 
#   arrange(desc(ppp_budget)) -> t3 
# 
# try %>% 
#   group_by(country.x) %>% 
#   mutate(ppp_budget = budget / ppp) %>% 
#   select(country.x, raw_budget = budget, ppp_budget) %>% 
#   arrange(desc(raw_budget)) -> t4
# 
# kbl(list(t3, t4), digits = 0, caption = "Arranged By PPP Adjusted Budget LEFT and By PPP Raw Budget RIGHT") %>%
#    kable_paper("striped",
#                full_width = T)
# col %<>% 
#   select(cow_code, year, everything()) 
# 
# 
# url <- "https://www.numbeo.com/cost-of-living/rankings_by_country.jsp?title=2018"
# 
# col_url <- read_html(url)
# col_table <- col_url %>% html_table(header = TRUE, fill = TRUE)
# col_18 <- col_table[[2]]
# 
# col_18$year <- replicate(115, 2018)
# 
# col_18 %<>% 
#   clean_names()
# 
# col_18$cow_code <- countrycode(col_18$country, "country.name", "cown")
# # Some values were not matched unambiguously: Bermuda, Hong Kong, Jersey, Macao, Palestine, Puerto Rico, Serbia
# 
# col_18 %<>% dplyr::mutate(cow_code = ifelse(country == "Palestine", 6666, 
#                                               ifelse(country == "Serbia", 345, 
#                                                 ifelse(country == "Hong Kong", 997, cow_code))))
# col %<>% 
#   select(cow_code, year, everything()) 

Adjust prices to 2014 prices

country <- "United States"
countries_dataframe <- show_countries()

Generating URL to request all 299 results

inflation_dataframe <- retrieve_inflation_data(country, countries_dataframe)

Retrieving inflation data for US Generating URL to request all 61 results

# Provide a World Bank API URL and `url_all_results` will convert it into one with all results for that indicator
original_url <- "http://api.worldbank.org/v2/country" 

# "http://api.worldbank.org/v2/country?format=json&per_page=304"
url_all_results(original_url)

Generating URL to request all 299 results [1] “http://api.worldbank.org/v2/country?format=json&per_page=299

the_df$budget_const <- adjust_for_inflation(the_df$budget, 
                                                the_df$year, 
                                                country, 
                                                to_date = 2014,
                                                inflation_dataframe = inflation_dataframe,
                                                countries_dataframe = countries_dataframe)

the_df$budget_pc_const <- adjust_for_inflation(the_df$budget_pc, 
                                              the_df$year, 
                                                   country, 
                                                   to_date = 2014,
                                                   inflation_dataframe = inflation_dataframe,
                                                   countries_dataframe = countries_dataframe)

Economic factors

PD Budget per capita and US exports per capita to the country

Across the years

the_df %>%
  # filter(pop > 1000000) %>% 
  ggplot(aes(y = log(budget_const), x = log(us_exports_pc))) + 
    geom_smooth(method = "lm", color = "#9d0208", se = FALSE) +
  geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) + facet_wrap(~year) + 
  scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"),
                   name = NULL) +
  scale_shape_manual(values = c(15,16,17,18,19,10),
                     name = NULL) +
  ggtitle("Exports from US per capita vs PD budget per capita") + 
  xlab("Logged US exports per capita") +
  ylab("Logged PD budget per capita") + 
  theme(legend.position = "left") + ggthemes::theme_pander()
## `geom_smooth()` using formula 'y ~ x'

Only for 2019

the_df %>%
  # filter(pop > 1000000) %>% 
  filter(year == 2018) %>% 
  ggplot(aes(y = log(budget_const), x = log(us_exports_pc), group = as.factor(region_6))) + 
  geom_smooth(method = "lm", color = "#9d0208", se = FALSE) +
  geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) + 
  facet_wrap(~region_6) + 
  scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"),
                   name = NULL) +
  scale_shape_manual(values = c(15,16,17,18,19,10),
                     name = NULL) +
  ggtitle("Exports per capita vs PD budget per capita in 2019") + 
  xlab("Logged US exports per capita") +
  ylab("Logged PD budget per capita") + 
  theme(legend.position = "left") + ggthemes::theme_pander()
## `geom_smooth()` using formula 'y ~ x'

Trade openness

Total export and total imports divided by total GDP

Across the years

the_df %>%
  # filter(pop > 1000000) %>% 
  ggplot(aes(y = log(budget_const), x =log(trade_openess))) + 
  geom_smooth(method = "lm", color = "#9d0208", se = FALSE) +
  geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) + facet_wrap(~year) + 
  scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"),
                   name = NULL) +
  scale_shape_manual(values = c(15,16,17,18,19,10),
                     name = NULL) +
  ggtitle("Trade openess vs PD budget per capita") + 
  xlab("Trade openess") +
  ylab("Logged PD budget per capita") + 
  theme(legend.position = "left") + 
  ggthemes::theme_pander()
## `geom_smooth()` using formula 'y ~ x'

Only for 2019

the_df %>%
  filter(year == 2019) %>% 
  ggplot(aes(y = log(budget_const), x = log(trade_openess))) +
  geom_smooth(method = "lm", color = "#9d0208", se = FALSE) +
  # geom_text(aes(label = country, color = as.factor(region_6)), size = 3) +
  geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) + 
  scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"),
                   name = NULL) +
  scale_shape_manual(values = c(15,16,17,18,19,10),
                     name = NULL) +
  ggtitle("Trade openess vs PD budget per capita in 2019") +
  facet_wrap(~region_6) + 
  xlab("Trade openness") +
  ylab("Logged PD budget per capita") + 
  theme(legend.position = "left") + ggthemes::theme_pander()
## `geom_smooth()` using formula 'y ~ x'

Infant mortality

Infant mortality is a proxy for poverty levels: number of infant deaths per thousand live births

Across the years

the_df %>%
  # filter(pop > 1000000) %>% 
  filter(year < 2018) %>% 
  ggplot(aes(y = log(budget_const), x = log(infant_mort), group = as.factor(region_6))) + 
  geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) + facet_wrap(~year) + 
  scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"),
                   name = NULL) +
  scale_shape_manual(values = c(15,16,17,18,19,10),
                     name = NULL) +
  ggtitle("Infant mortality age vs PD budget per capita") + 
  xlab("Deaths per thousand under 5") +
  ylab("Logged PD budget per capita") + 
  theme(legend.position = "left") + ggthemes::theme_pander()

Only for 2019

the_df %>%
  filter(year == 2015) %>% 
  ggplot(aes(y = log(budget_const), x = infant_mort, group = as.factor(region_6))) + 
  geom_smooth(method = "lm", color = "#9d0208", se = FALSE) +
  geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) +
  facet_wrap(~region_6) + 
  scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"),
                   name = NULL) +
  scale_shape_manual(values = c(15,16,17,18,19,10),
                     name = NULL) +
  ggtitle("Infant mortality vs PD budget per capita in 2019") + 
  xlab("Infant mortality") +
  ylab("Logged PD budget per capita") + 
  theme(legend.position = "left") + ggthemes::theme_pander()
## `geom_smooth()` using formula 'y ~ x'

GDP per capita

Across the years

the_df %>%
  ggplot(aes(y = log(budget_const), x = log(gdp_pc_const), group = as.factor(region_6))) + 
  geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) + facet_wrap(~year) + 
  scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"),
                   name = NULL) +
  scale_shape_manual(values = c(15,16,17,18,19,10),
                     name = NULL) +
  ggtitle("Logged GDP per capita and logged PD budget per capita") + 
  xlab("Logged GDP per capita") +
  ylab("Logged PD budget per capita") + 
  theme(legend.position = "left") + ggthemes::theme_pander()

Only for 2019

the_df %>%
  filter(year == 2019) %>% 
  ggplot(aes(y = log(budget_const), x = log(gdp_pc_const), group = as.factor(region_6))) + 
  geom_smooth(method = "lm", color = "#9d0208", se = FALSE) +
  geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) + 
  facet_wrap(~region_6) + 
scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"),
                   name = NULL) +
  scale_shape_manual(values = c(15,16,17,18,19,10),
                     name = NULL) +
  ggtitle("GDP per capita vs PD budget per capita in 2019") + 
  ylab("Logged GDP per capita") +
  xlab("Logged PD budget per capita") + 
  theme(legend.position = "left") + ggthemes::theme_pander()
## `geom_smooth()` using formula 'y ~ x'

Polity Index

Across the years

Evidence of a U shaped relationship? More pronounced as years go on.

the_df %>%
  filter(pop > 1000000) %>% 
  ggplot(aes(y = log(budget_pc), x = electoral_demo)) + 
    geom_smooth(method = "lm", color = "#9d0208") +
  geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) +
  facet_wrap(~year) + 
  scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"),
                   name = NULL) +
  scale_shape_manual(values = c(15,16,17,18,19,10),
                     name = NULL) +
  ggtitle("Polity Score vs PD budget per capita") + 
  xlab("Polity Score") +
  ylab("Logged PD budget per capita") + 
  theme(legend.position = "left") + ggthemes::theme_pander()
## `geom_smooth()` using formula 'y ~ x'

Only for 2019

the_df %>%
  filter(year == 2019) %>% 
  ggplot(aes(y = log(budget_pc), x = electoral_demo, group = as.factor(region_6))) + 
  geom_smooth(method = "loess", color = "#9d0208", se = FALSE) +
  geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) + 
  facet_wrap(~region_6) + 
scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"),
                   name = NULL) +
  scale_shape_manual(values = c(15,16,17,18,19,10),
                     name = NULL) +
  ggtitle("Polity Score vs PD budget per capita in 2019") + 
  xlab("Polity Score (-10 to 10)") +
  ylab("Logged budget") +
  theme(legend.position = "left") + ggthemes::theme_pander()
## `geom_smooth()` using formula 'y ~ x'

Percentage of population that follows Muslim faith

Across the years

the_df %>%
  mutate(muslim_pc = percent_muslim_jitter / pop, na.rm = TRUE) %>% 
  ggplot(aes(y = log(budget_const), x = muslim_pc)) + 
  geom_smooth(method = "loess", color = "#9d0208") +
  geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) +
  facet_wrap(~year) + 
  scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"),
                   name = NULL) +
  scale_shape_manual(values = c(15,16,17,18,19,10),
                     name = NULL) +
  ggtitle("Muslim population % vs PD budget per capita") + 
  xlab("Percentage of population Muslim") +
  ylab("Logged PD budget per capita") + 
  theme(legend.position = "left") + ggthemes::theme_pander()
## `geom_smooth()` using formula 'y ~ x'

Only for 2019

the_df %>%
  mutate(muslim_pc = percent_muslim_jitter / pop, na.rm = TRUE) %>% 
  filter(year == 2019) %>% 
  ggplot(aes(y = log(budget_const), x = muslim_pc, group = as.factor(region_6))) + 
  # geom_smooth(method = "loess", color = "#9d0208") +
  geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) + 
  facet_wrap(~region_6) + 
  scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"),
                   name = NULL) +
  scale_shape_manual(values = c(15,16,17,18,19,10),
                     name = NULL) +
  ggtitle("Muslim population % vs PD budget per capita in 2019") + 
  xlab("Percentage of population Muslim") +
  ylab("Logged PD budget per capita") + 
  theme(legend.position = "left") + ggthemes::theme_pander()

Government censorship of media

Level of government censorship of the national media (from V-DEM dataset)

Higher scores indicate more freedeom from government censorship in the national media

Across the years

the_df %>%
  ggplot(aes(y = log(budget_const), x = gov_censor_media.x, group = as.factor(region_6))) + 
  geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) + 
  facet_wrap(~year) + 
  scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"), name = NULL) +
  scale_shape_manual(values = c(15,16,17,18,19,10),name = NULL) +
  ggtitle("Government media censorship score vs PD budget per capita") + 
  xlab("Government media") +
  ylab("Logged PD budget per capita") + 
  theme(legend.position = "left") +
  ggthemes::theme_pander()

Only for 2019

the_df %>%
  filter(year == 2019) %>% 
  ggplot(aes(y = log(budget_const), x = gov_censor_media.x)) + 
  geom_smooth(method = "lm", color = "#9d0208") +
  geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) +
  facet_wrap(~region_6) +
  scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"), name = NULL) +
  scale_shape_manual(values = c(15,16,17,18,19,10), name = NULL) +
  ggtitle("Government media censorship score vs PD budget per capita in 2019") + 
  xlab("Freedeom from government censorship in the media") +
  ylab("Logged PD budget per capita") + 
  theme(legend.position = "left") +
  ggthemes::theme_pander()
## `geom_smooth()` using formula 'y ~ x'

Similar UN voting

It reflects states’ UN voting positions in relation to the US-led liberal order (calculated on a single dimension).

Source: https://dataverse.harvard.edu/dataset.xhtml?persistentId=doi:10.7910/DVN/LEJUQZ

Bailey, M.A., Strezhnev, A., and Voeten, E (2017). Estimating dynamic state preferences from United Nations voting data. Journal of Conflict Resolution 61.2: 430-456.

Across the years

the_df %>%
  filter(year == 2014) %>% 
  ggplot(aes(y = log(budget), x = ideal_point_distance)) +
  geom_smooth(method = "lm", color = "#9d0208", alpha = 0.5) +
  geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) +
  # facet_wrap(~year) +
  scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"), name = NULL) +
  scale_shape_manual(values = c(15,16,17,18,19,10), name = NULL) +
  ggtitle("UN voting similarity vs PD budget per capita") +
  xlab("Distance from US ideal score") +
  ylab("Logged PD budget per capita") +
  theme(legend.position = "left") +
  ggthemes::theme_pander()
## `geom_smooth()` using formula 'y ~ x'

We can see two clusters appear!

Only for 2019

the_df %>%
  filter(year == 2019) %>%
  ggplot(aes(y = log(budget_const), x = ideal_point_distance, group = as.factor(region_6))) +
  geom_smooth(method = "lm", color = "#9d0208", se = FALSE) +
  geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) +
  facet_wrap(~region_6) +
  scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"),
                   name = NULL) +
  scale_shape_manual(values = c(15,16,17,18,19,10),
                     name = NULL) +
  ggtitle("UN voting similarity vs PD budget per capita") +
  xlab("Distance from US ideal score") +
  ylab("Logged PD budget per capita") +
  theme(legend.position = "left") + 
  ggthemes::theme_pander()
## `geom_smooth()` using formula 'y ~ x'

Important US votes

Source: Erik Voeten “Data and Analyses of Voting in the UN General Assembly” Routledge Handbook of International Organization, edited by Bob Reinalda (published May 27, 2013)

Important votes determined by the US State Department: Whether the vote was classified as important by the U.S. State Department report “Voting Practices in the United Nations”. These classifications began with session 39

# library(unvotes)
# library(lubridate)
# 
# count(un_roll_call_issues, issue, sort = TRUE)
# 
# joined <- un_votes %>%
#   inner_join(un_roll_calls, by = "rcid") %>% 
#   inner_join(un_roll_call_issues, by = "rcid") %>% 
#   ungroup()
# 
# important <- joined %>% 
#   filter(importantvote == 1) %>% 
#   select(rcid, country, vote, session, date)
# 
# important %>%
#   mutate(vote_fac = as.factor(vote)) %>% 
#   mutate(vote_num = as.numeric(vote_fac)) %>% 
#   distinct(session, country, rcid, vote_num, .keep_all = "TRUE") -> temp2
# 
# temp2 %>% 
#   select(rcid, country, vote_num, session) %>% 
#   pivot_wider(names_from = country, values_from = "vote_num" ) -> imp_wide
# 
# temp2 %>% 
#   group_by(country_name)
#   mutate(country = if_else(Response == Correct_answer, 1, 0))
# 

Level of domestic autonomy

Measures the extent to which the country’s govt have full sovereign control over the territory.

Higher scores indicate more control

Across all years

the_df %>%
  ggplot(aes(y = log(budget_pc_const), x = intl_autonomy)) +
  geom_smooth(method = "lm", color = "#9d0208") +
  geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) +
  facet_wrap(~year) +
  scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"), name = NULL) +
  scale_shape_manual(values = c(15,16,17,18,19,10), name = NULL) +
  ggtitle("Domestic autonomy vs PD budget per capita") +
  xlab("Domestic autonomy") +
  ylab("Logged PD budget per capita") +
  theme(legend.position = "left") +
  ggthemes::theme_pander()
## `geom_smooth()` using formula 'y ~ x'

Only for 2019

the_df %>%
  filter(year == 2013) %>%
  ggplot(aes(y = log(budget_pc_const), x = intl_autonomy, group = as.factor(region_6))) +
  geom_smooth(method = "lm", color = "#9d0208", se = FALSE) +
  geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) +
  facet_wrap(~region_6) +
 scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"),
                   name = NULL) +
  scale_shape_manual(values = c(15,16,17,18,19,10),
                     name = NULL) +
  ggtitle("Domestic autonomy vs PD budget per capita") +
  xlab("Domestic autonomy") +
  ylab("Logged PD budget per capita") +
  theme(legend.position = "left") + ggthemes::theme_pander()
## `geom_smooth()` using formula 'y ~ x'

US diplomatic visits

Number of visits by heads of state to the US

## `summarise()` has grouped output by 'cow_code'. You can override using the `.groups` argument.
From year n
Israel 2000 5
United Kingdom 1990 5
Germany, Federal Republic of 1990 4
Iraq 2004 4
Ireland 1996 4
Israel 1978 4
Israel 1993 4
Israel 1995 4
Israel 1996 4
Israel 2001 4
Israel 2002 4
Israel 2009 4
Italy 1990 4
Japan 1990 4
Jordan 2002 4
Peru 2006 4
Australia 2009 3
Bosnia-Herzegovina 1994 3
Canada 1983 3
Canada 1989 3
Canada 1990 3
Canada 1993 3
Canada 2008 3
Canada 2011 3
Canada 2012 3
Colombia 1990 3
Colombia 2002 3
Ecuador 1992 3
Egypt 1978 3
Germany 2007 3
Germany 2009 3
Germany, Federal Republic of 1963 3
Germany, Federal Republic of 1982 3
Germany, Federal Republic of 1983 3
Iraq 2007 3
Iraq 2008 3
Iraq 2009 3
Israel 1973 3
Israel 1977 3
Israel 1983 3
Israel 1987 3
Israel 1994 3
Israel 1997 3
Israel 1998 3
Israel 2010 3
Israel 2011 3
Israel 2014 3
Italy 1983 3
Italy 1999 3
Italy 2003 3
Italy 2004 3
Italy 2012 3
Italy 2016 3
Japan 1983 3
Japan 1993 3
Japan 2001 3
Japan 2009 3
Japan 2016 3
Jordan 1994 3
Jordan 1996 3
Jordan 1998 3
Jordan 1999 3
Jordan 2000 3
Jordan 2004 3
Jordan 2014 3
Jordan 2016 3
Mexico 1992 3
Mexico 2008 3
Pakistan 2003 3
Pakistan 2006 3
Singapore 2016 3
Slovak Republic 1999 3
Spain 2003 3
Spain 2004 3
United Kingdom 1960 3
United Kingdom 1970 3
United Kingdom 1978 3
United Kingdom 1983 3
United Kingdom 1992 3
United Kingdom 2001 3
United Kingdom 2003 3
United Kingdom 2004 3
United Kingdom 2006 3
United Kingdom 2007 3
United Kingdom 2008 3
United Kingdom 2009 3
United Kingdom 2012 3
Afghanistan 2003 2
Afghanistan 2004 2
Afghanistan 2007 2
Albania 1999 2
Algeria 2001 2
Antigua and Barbuda 1994 2
Argentina 1961 2
Argentina 1994 2
Argentina 1999 2
Argentina 2001 2
Australia 1952 2
Australia 1956 2
Australia 1962 2
Australia 1965 2
Australia 1966 2
Australia 1993 2
Australia 2003 2
Australia 2008 2
Australia 2011 2
Australia 2016 2
Barbados 1994 2
Belgium 1948 2
Belgium 1969 2
Bosnian Federation 1996 2
Brazil 1990 2
Brazil 1991 2
Brazil 2001 2
Brazil 2009 2
Bulgaria 1998 2
Bulgaria 2012 2
Cameroon 2003 2
Canada 1947 2
Canada 1960 2
Canada 1961 2
Canada 1963 2
Canada 1964 2
Canada 1965 2
Canada 1976 2
Canada 1977 2
Canada 1981 2
Canada 1992 2
Canada 1997 2
Canada 2000 2
Canada 2001 2
Canada 2002 2
Canada 2004 2
Canada 2009 2
Canada 2016 2
Chile 1994 2
China, People’s Republic of 2009 2
China, People’s Republic of 2010 2
China, People’s Republic of 2011 2
China, People’s Republic of 2016 2
Colombia 1998 2
Colombia 2001 2
Colombia 2003 2
Colombia 2006 2
Colombia 2008 2
Colombia 2009 2
Costa Rica 1982 2
Croatia 1995 2
Croatia 1996 2
Czech Republic 1995 2
Czech Republic 1999 2
Czechoslovakia 1990 2
Democratic Republic of the Congo (Zaire) 1989 2
Democratic Republic of the Congo (Zaire) 2003 2
Denmark 1967 2
Denmark 1970 2
Denmark 1978 2
Denmark 2012 2
Denmark 2016 2
Djibouti 2014 2
Dominica 1984 2
Dominica 1994 2
Egypt 1979 2
Egypt 1983 2
Egypt 1985 2
Egypt 1989 2
Egypt 1993 2
Egypt 1995 2
Egypt 2002 2
Egypt 2014 2
El Salvador 1984 2
El Salvador 1985 2
El Salvador 1990 2
El Salvador 1991 2
El Salvador 2004 2
El Salvador 2005 2
El Salvador 2006 2
El Salvador 2007 2
El Salvador 2008 2
Ethiopia 1963 2
Ethiopia 2014 2
Finland 1970 2
Finland 1999 2
Finland 2002 2
Finland 2016 2
France 1951 2
France 1976 2
France 1990 2
France 1993 2
France 1999 2
France 2000 2
France 2001 2
France 2007 2
France 2008 2
France 2010 2
France 2011 2
France 2012 2
Gabon 1977 2
Georgia 1999 2
Georgia 2012 2
Germany 1991 2
Germany 1992 2
Germany 1993 2
Germany 1997 2
Germany 1999 2
Germany 2001 2
Germany 2004 2
Germany 2006 2
Germany 2012 2
Germany 2015 2
Germany, Federal Republic of 1961 2
Germany, Federal Republic of 1965 2
Germany, Federal Republic of 1969 2
Germany, Federal Republic of 1971 2
Germany, Federal Republic of 1973 2
Germany, Federal Republic of 1975 2
Germany, Federal Republic of 1976 2
Germany, Federal Republic of 1980 2
Germany, Federal Republic of 1984 2
Germany, Federal Republic of 1988 2
Ghana 2005 2
Greece 1996 2
Guatemala 1989 2
Guatemala 2008 2
Haiti 1993 2
Haiti 1994 2
Honduras 2006 2
Hungary 1990 2
Hungary 1991 2
Hungary 1998 2
Hungary 1999 2
Iceland 1988 2
Iceland 1991 2
India 1985 2
India 2008 2
India 2009 2
India 2016 2
Indonesia 1961 2
Iran 1968 2
Iran 1969 2
Iraq 2005 2
Iraq 2006 2
Iraq 2015 2
Ireland 1963 2
Ireland 1993 2
Ireland 1997 2
Ireland 1998 2
Ireland 2000 2
Ireland 2001 2
Ireland 2004 2
Ireland 2008 2
Israel 1970 2
Israel 1975 2
Israel 1979 2
Israel 1980 2
Israel 1982 2
Israel 1986 2
Israel 1989 2
Israel 1992 2
Israel 1999 2
Israel 2005 2
Israel 2006 2
Israel 2007 2
Israel 2008 2
Israel 2012 2
Israel 2015 2
Italy 1967 2
Italy 1976 2
Italy 1982 2
Italy 1985 2
Italy 1987 2
Italy 1988 2
Italy 1996 2
Italy 1998 2
Italy 2008 2
Italy 2009 2
Italy 2010 2
Jamaica 1970 2
Jamaica 1983 2
Japan 1972 2
Japan 1975 2
Japan 1976 2
Japan 1985 2
Japan 1989 2
Japan 1991 2
Japan 1992 2
Japan 1994 2
Japan 1996 2
Japan 1997 2
Japan 2004 2
Japan 2007 2
Japan 2010 2
Japan 2011 2
Japan 2012 2
Jordan 1967 2
Jordan 1974 2
Jordan 1985 2
Jordan 1995 2
Jordan 1997 2
Jordan 2001 2
Jordan 2003 2
Jordan 2005 2
Jordan 2006 2
Jordan 2007 2
Jordan 2008 2
Jordan 2010 2
Kazakhstan 1999 2
Korea 1969 2
Korea 2009 2
Kuwait 1988 2
Lebanon 1983 2
Lebanon 1996 2
Lebanon 2002 2
Liberia 2007 2
Liberia 2015 2
Luxembourg 2005 2
Macedonia, Former Yugoslav Republic of 1999 2
Marshall Islands 1990 2
Mexico 1964 2
Mexico 1970 2
Mexico 1981 2
Mexico 1990 2
Mexico 1991 2
Mexico 1994 2
Mexico 2000 2
Mexico 2001 2
Mexico 2009 2
Mexico 2010 2
Mexico 2012 2
Mexico 2016 2
Micronesia 1990 2
Morocco 1970 2
Morocco 1982 2
Nepal 1960 2
Netherlands 1952 2
Netherlands 1995 2
Netherlands 1999 2
Netherlands 2008 2
Netherlands 2009 2
New Zealand 2014 2
Nigeria 1999 2
Nigeria 2001 2
Nigeria 2004 2
Norway 1979 2
Norway 1989 2
Norway 1995 2
Norway 1999 2
Norway 2016 2
Pakistan 1998 2
Pakistan 2002 2
Pakistan 2004 2
Pakistan 2008 2
Pakistan 2009 2
Panama 1977 2
Panama 2008 2
Papua New Guinea 1990 2
Paraguay 2008 2
Peru 2011 2
Poland 1990 2
Poland 1991 2
Poland 2002 2
Poland 2003 2
Poland 2004 2
Poland 2005 2
Portugal 1990 2
Portugal 1992 2
Qatar 2015 2
Romania 2004 2
Russia 1992 2
Russia 1997 2
Russia 2009 2
Russia 2010 2
Senegal 2004 2
South Africa 2001 2
South Korea 2008 2
South Korea 2011 2
Spain 1980 2
Spain 1993 2
Spain 1999 2
Spain 2001 2
Spain 2002 2
Spain 2009 2
Spain 2010 2
Sweden 2009 2
Tanzania 2008 2
Thailand 2016 2
Tunisia 2014 2
Turkey 1954 2
Turkey 1992 2
Turkey 1993 2
Turkey 1995 2
Turkey 1999 2
Turkey 2004 2
Turkey 2008 2
Turkey 2009 2
Turkey 2012 2
Uganda 2003 2
Ukraine 1994 2
Ukraine 1999 2
Ukraine 2014 2
United Kingdom 1957 2
United Kingdom 1959 2
United Kingdom 1961 2
United Kingdom 1964 2
United Kingdom 1975 2
United Kingdom 1976 2
United Kingdom 1985 2
United Kingdom 1991 2
United Kingdom 1998 2
United Kingdom 2002 2
United Kingdom 2005 2
Uruguay 1990 2
Uruguay 1994 2
Venezuela 1977 2
Venezuela 1989 2
Venezuela 1990 2
Venezuela 1991 2
Venezuela 1999 2
From n
Israel 113
United Kingdom 99
Japan 80
Canada 76
Jordan 76
Italy 75
Australia 55
Mexico 55
Germany, Federal Republic of 53
France 52
Ireland 50
Pakistan 41
Turkey 41

US trips

Trips by US President / Secretaries of State abroad

travels %>% 
  group_by(cow_code, year) %>% 
  filter(Pres == 1) %>% 
  summarise(sum_pres_travels = n()) %>% 
  ungroup() -> pres_travel
## `summarise()` has grouped output by 'cow_code'. You can override using the `.groups` argument.
travels %>% 
  group_by(cow_code, year) %>% 
  summarise(sum_all_travels = n()) %>% 
  ungroup() -> all_travel
## `summarise()` has grouped output by 'cow_code'. You can override using the `.groups` argument.
travels %>% 
  group_by(cow_code, year) %>% 
  summarise(sum_index_travels = sum(dashindex)) %>% 
  ungroup() -> score_travel
## `summarise()` has grouped output by 'cow_code'. You can override using the `.groups` argument.
the_df <- merge(the_df, pres_travel, by = c("cow_code", "year"), all.x = TRUE) 
the_df <- merge(the_df, head_visits, by = c("cow_code", "year"), all.x = TRUE) 
the_df <- merge(the_df, all_travel, by = c("cow_code", "year"), all.x = TRUE) 
the_df <- merge(the_df, score_travel, by = c("cow_code", "year"), all.x = TRUE) 
### Across the years

library(tidyr)


the_df %>%
  filter(year < 2017) %>% 
  mutate(all_travel = coalesce(sum_all_travels, 0)) %>% 
  ggplot(aes(y = log(budget_pc_const), x = all_travel)) +
  geom_smooth(method = "lm", color = "#9d0208", alpha = 0.5) +
  geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) +
  facet_wrap(~year)+
  scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"), name = NULL) +
  scale_shape_manual(values = c(15,16,17,18,19,10), name = NULL) +
  ggtitle("UN voting similarity vs PD budget per capita") +
  xlab("Distance from US ideal score") +
  ylab("Logged PD budget per capita") +
  theme(legend.position = "left") +
  ggthemes::theme_pander()
## `geom_smooth()` using formula 'y ~ x'

the_df %>%
  filter(year < 2017) %>% 
  # mutate(score_travel = coalesce(sum_index_travels, 0)) %>% 
  ggplot(aes(y = log(budget_pc_const), x = sum_index_travels)) +
  geom_smooth(method = "lm", color = "#9d0208", alpha = 0.5) +
  geom_text(aes(label = country, color = as.factor(region_6))) +
  # geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) +
  facet_wrap(~year)+
  scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"), name = NULL) +
  scale_shape_manual(values = c(15,16,17,18,19,10), name = NULL) +
  ggtitle("High level visits DASH score vs PD budget per capita") +
  xlab("High level visits DASH score") +
  ylab("Logged PD budget per capita") +
  theme(legend.position = "left") +
  ggthemes::theme_pander()
## `geom_smooth()` using formula 'y ~ x'

Only for 2016

the_df %>%
  filter(year == 2016) %>%
  mutate(all_travel = coalesce(sum_all_travels, 0)) %>% 
  ggplot(aes(y = log(budget_pc_const), x = all_travel)) +
  geom_smooth(method = "lm", color = "#9d0208", se = FALSE) +
  geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) +
  facet_wrap(~region_6) +
  scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"),
                   name = NULL) +
  scale_shape_manual(values = c(15,16,17,18,19,10),
                     name = NULL) +
  ggtitle("high level visits vs PD budget per capita") +
  xlab("Number of high level visits") +
  ylab("Logged PD budget per capita") +
  theme(legend.position = "left") + 
  ggthemes::theme_pander()
## `geom_smooth()` using formula 'y ~ x'

travels %>% 
  filter(Pres == 1) %>% 
  group_by(Country, year) %>% 
  count() %>% 
  arrange(desc(n)) %>% 
  kbl() %>%
  kable_paper("striped",
              full_width = F) 
Country year n
Germany 2015 5
Germany 2016 3
Italy 1999 3
Japan 2016 3
Afghanistan 2010 2
Belgium 1989 2
Belgium 2014 2
Canada 1981 2
Canada 1991 2
Canada 1995 2
Denmark 2009 2
Egypt 1979 2
Egypt 2000 2
Egypt 2008 2
France 1959 2
France 1974 2
France 1982 2
France 1989 2
France 1991 2
France 2009 2
France 2011 2
Germany 1999 2
Germany 2009 2
Germany 2014 2
Germany, Federal Republic of 1978 2
Germany, Federal Republic of 1985 2
Israel 2008 2
Italy 1994 2
Japan 2000 2
Mexico 1966 2
Mexico 1981 2
Mexico 2002 2
Mexico 2009 2
Russia 2002 2
Russia 2006 2
Saudi Arabia 2008 2
Senegal 2013 2
South Africa 2013 2
Switzerland 2000 2
U.S.S.R. 1974 2
United Kingdom 1959 2
United Kingdom 1961 2
United Kingdom 1969 2
United Kingdom 1990 2
United Kingdom 1991 2
United Kingdom 1994 2
United Kingdom 1998 2
United Kingdom 2003 2
Afghanistan 1959 1
Afghanistan 2006 1
Afghanistan 2008 1
Afghanistan 2012 1
Afghanistan 2014 1
Albania 2007 1
Argentina 1960 1
Argentina 1990 1
Argentina 1997 1
Argentina 2005 1
Argentina 2016 1
Australia 1966 1
Australia 1967 1
Australia 1992 1
Australia 1996 1
Australia 2003 1
Australia 2007 1
Australia 2011 1
Australia 2014 1
Austria 1961 1
Austria 1972 1
Austria 1974 1
Austria 1975 1
Austria 1979 1
Austria 2006 1
Bahrain 2008 1
Bangladesh 2000 1
Barbados 1982 1
Barbados 1997 1
Belarus 1994 1
Belgium 1945 1
Belgium 1969 1
Belgium 1974 1
Belgium 1975 1
Belgium 1978 1
Belgium 1985 1
Belgium 1988 1
Belgium 1994 1
Belgium 1999 1
Belgium 2001 1
Belgium 2005 1
Benin 2008 1
Bosnia-Herzegovina 1996 1
Bosnia-Herzegovina 1997 1
Bosnia-Herzegovina 1999 1
Botswana 1998 1
Botswana 2003 1
Brazil 1947 1
Brazil 1960 1
Brazil 1978 1
Brazil 1982 1
Brazil 1990 1
Brazil 1992 1
Brazil 1997 1
Brazil 2005 1
Brazil 2007 1
Brazil 2011 1
Brunei Darussalam 2000 1
Bulgaria 1999 1
Bulgaria 2007 1
Burma 2012 1
Burma 2014 1
Cambodia 2012 1
Canada 1947 1
Canada 1953 1
Canada 1958 1
Canada 1959 1
Canada 1961 1
Canada 1964 1
Canada 1966 1
Canada 1967 1
Canada 1972 1
Canada 1985 1
Canada 1987 1
Canada 1988 1
Canada 1989 1
Canada 1990 1
Canada 1993 1
Canada 1997 1
Canada 1999 1
Canada 2001 1
Canada 2002 1
Canada 2004 1
Canada 2007 1
Canada 2009 1
Canada 2010 1
Canada 2016 1
Chile 1960 1
Chile 1990 1
Chile 1998 1
Chile 2004 1
Chile 2011 1
China 2001 1
China 2002 1
China 2005 1
China 2008 1
China, People’s Republic of 1972 1
China, People’s Republic of 1975 1
China, People�s Republic of 1984 1
China, People�s Republic of 1989 1
China, People�s Republic of 1998 1
China, People�s Republic of 2009 1
China, People�s Republic of 2014 1
China, People�s Republic of 2016 1
Colombia 1961 1
Colombia 1982 1
Colombia 1990 1
Colombia 2000 1
Colombia 2004 1
Colombia 2007 1
Colombia 2012 1
Costa Rica 1963 1
Costa Rica 1968 1
Costa Rica 1982 1
Costa Rica 1989 1
Costa Rica 1997 1
Costa Rica 2013 1
Croatia 1996 1
Croatia 2008 1
Cuba 2016 1
Czech Republic 1994 1
Czech Republic 2002 1
Czech Republic 2007 1
Czech Republic 2009 1
Czech Republic 2010 1
Czechoslovakia 1990 1
Denmark 1997 1
Denmark 2005 1
Egypt 1974 1
Egypt 1978 1
Egypt 1990 1
Egypt 1994 1
Egypt 1996 1
Egypt 2003 1
Egypt 2009 1
El Salvador 1968 1
El Salvador 1999 1
El Salvador 2002 1
El Salvador 2011 1
Estonia 2006 1
Estonia 2014 1
Ethiopia 2015 1
Finland 1975 1
Finland 1988 1
Finland 1990 1
Finland 1992 1
Finland 1997 1
France 1957 1
France 1960 1
France 1961 1
France 1969 1
France 1970 1
France 1975 1
France 1978 1
France 1979 1
France 1984 1
France 1985 1
France 1990 1
France 1993 1
France 1994 1
France 1995 1
France 1996 1
France 1997 1
France 1999 1
France 2002 1
France 2003 1
France 2004 1
France 2008 1
France 2014 1
France 2015 1
Georgia 2005 1
Germany 1945 1
Germany 1963 1
Germany 1967 1
Germany 1969 1
Germany 1978 1
Germany 1982 1
Germany 1987 1
Germany 1990 1
Germany 1992 1
Germany 1994 1
Germany 1995 1
Germany 1998 1
Germany 2000 1
Germany 2002 1
Germany 2005 1
Germany 2006 1
Germany 2007 1
Germany 2008 1
Germany 2013 1
Germany, Federal Republic of 1959 1
Germany, Federal Republic of 1963 1
Germany, Federal Republic of 1975 1
Germany, Federal Republic of 1982 1
Germany, Federal Republic of 1987 1
Germany, Federal Republic of 1989 1
Ghana 1998 1
Ghana 2008 1
Ghana 2009 1
Greece 1959 1
Greece 1991 1
Greece 1999 1
Greece 2016 1
Grenada 1986 1
Guatemala 1968 1
Guatemala 1999 1
Guatemala 2007 1
Haiti 1995 1
Honduras 1968 1
Honduras 1982 1
Honduras 1999 1
Hungary 1989 1
Hungary 1994 1
Hungary 1996 1
Hungary 2006 1
Iceland 1973 1
Iceland 1986 1
India 1959 1
India 1969 1
India 1978 1
India 2000 1
India 2006 1
India 2010 1
India 2015 1
Indonesia 1969 1
Indonesia 1975 1
Indonesia 1986 1
Indonesia 1994 1
Indonesia 2003 1
Indonesia 2006 1
Indonesia 2010 1
Indonesia 2011 1
Iran 1959 1
Iran 1972 1
Iran 1978 1
Iraq 2003 1
Iraq 2006 1
Iraq 2007 1
Iraq 2008 1
Iraq 2009 1
Ireland 1963 1
Ireland 1970 1
Ireland 1984 1
Ireland 1995 1
Ireland 1998 1
Ireland 2000 1
Ireland 2004 1
Ireland 2006 1
Ireland 2011 1
Israel 1974 1
Israel 1979 1
Israel 1994 1
Israel 1995 1
Israel 1996 1
Israel 1998 1
Israel 2013 1
Israel 2016 1
Italy 1959 1
Italy 1963 1
Italy 1967 1
Italy 1969 1
Italy 1970 1
Italy 1975 1
Italy 1980 1
Italy 1982 1
Italy 1987 1
Italy 1989 1
Italy 1991 1
Italy 1996 1
Italy 1997 1
Italy 2000 1
Italy 2001 1
Italy 2002 1
Italy 2004 1
Italy 2005 1
Italy 2007 1
Italy 2008 1
Italy 2009 1
Italy 2014 1
Jamaica 1982 1
Jamaica 2015 1
Japan 1974 1
Japan 1979 1
Japan 1980 1
Japan 1983 1
Japan 1986 1
Japan 1989 1
Japan 1992 1
Japan 1993 1
Japan 1996 1
Japan 1998 1
Japan 2002 1
Japan 2003 1
Japan 2005 1
Japan 2008 1
Japan 2009 1
Japan 2010 1
Japan 2014 1
Jordan 1974 1
Jordan 1994 1
Jordan 1999 1
Jordan 2003 1
Jordan 2006 1
Jordan 2013 1
Kenya 2015 1
Korea, Republic of 1952 1
Korea, Republic of 1960 1
Korea, Republic of 1966 1
Korea, Republic of 1974 1
Korea, Republic of 1979 1
Korea, Republic of 1983 1
Korea, Republic of 1989 1
Korea, Republic of 1992 1
Korea, Republic of 1993 1
Korea, Republic of 1996 1
Korea, Republic of 1998 1
Korea, Republic of 2002 1
Korea, Republic of 2005 1
Korea, Republic of 2008 1
Korea, Republic of 2009 1
Korea, Republic of 2010 1
Korea, Republic of 2012 1
Korea, Republic of 2014 1
Kuwait 1994 1
Kuwait 2008 1
Laos 2016 1
Latvia 1994 1
Latvia 2005 1
Latvia 2006 1
Liberia 1978 1
Liberia 2008 1
Lithuania 2002 1
Macedonia, Former Yugoslav Republic of 1999 1
Malaysia 1966 1
Malaysia 2014 1
Malaysia 2015 1
Malta 1989 1
Mexico 1947 1
Mexico 1953 1
Mexico 1959 1
Mexico 1960 1
Mexico 1962 1
Mexico 1967 1
Mexico 1969 1
Mexico 1970 1
Mexico 1974 1
Mexico 1979 1
Mexico 1982 1
Mexico 1983 1
Mexico 1986 1
Mexico 1988 1
Mexico 1990 1
Mexico 1997 1
Mexico 1999 1
Mexico 2001 1
Mexico 2004 1
Mexico 2006 1
Mexico 2007 1
Mexico 2012 1
Mexico 2013 1
Mexico 2014 1
Mongolia 2005 1
Morocco 1959 1
Morocco 1999 1
Netherlands 1989 1
Netherlands 1991 1
Netherlands 1997 1
Netherlands 2005 1
Netherlands 2014 1
New Zealand 1966 1
New Zealand 1999 1
Nicaragua 1968 1
Nicaragua 1999 1
Nigeria 1978 1
Nigeria 2000 1
Nigeria 2003 1
Norway 1999 1
Norway 2009 1
Oman 2000 1
Pakistan 1959 1
Pakistan 1967 1
Pakistan 1969 1
Pakistan 2000 1
Pakistan 2006 1
Palestinian Authority 1998 1
Palestinian Authority 2008 1
Palestinian Authority 2013 1
Panama 1956 1
Panama 1978 1
Panama 1992 1
Panama 2005 1
Panama 2015 1
Peru 2002 1
Peru 2008 1
Peru 2016 1
Philippines 1960 1
Philippines 1966 1
Philippines 1969 1
Philippines 1975 1
Philippines 1994 1
Philippines 1996 1
Philippines 2003 1
Philippines 2014 1
Philippines 2015 1
Poland 1972 1
Poland 1975 1
Poland 1977 1
Poland 1989 1
Poland 1992 1
Poland 1994 1
Poland 1997 1
Poland 2001 1
Poland 2003 1
Poland 2007 1
Poland 2011 1
Poland 2014 1
Poland 2016 1
Portugal 1960 1
Portugal 1971 1
Portugal 1974 1
Portugal 1980 1
Portugal 1985 1
Portugal 2000 1
Portugal 2003 1
Portugal 2010 1
Qatar 2003 1
Republic of China 1960 1
Romania 1969 1
Romania 1975 1
Romania 1997 1
Romania 2002 1
Romania 2008 1
Russia 1993 1
Russia 1994 1
Russia 1995 1
Russia 1996 1
Russia 1998 1
Russia 2000 1
Russia 2003 1
Russia 2005 1
Russia 2008 1
Russia 2009 1
Russia 2013 1
Rwanda 1998 1
Rwanda 2008 1
Saudi Arabia 1974 1
Saudi Arabia 1978 1
Saudi Arabia 1990 1
Saudi Arabia 1992 1
Saudi Arabia 1994 1
Saudi Arabia 2009 1
Saudi Arabia 2014 1
Saudi Arabia 2015 1
Saudi Arabia 2016 1
Senegal 1998 1
Senegal 2003 1
Serbia-Montenegro (Kosovo) 1999 1
Singapore 1992 1
Singapore 2003 1
Singapore 2006 1
Singapore 2009 1
Slovakia 2005 1
Slovenia 1999 1
Slovenia 2001 1
Slovenia 2008 1
Somalia 1993 1
South Africa 1998 1
South Africa 2003 1
Spain 1959 1
Spain 1970 1
Spain 1975 1
Spain 1980 1
Spain 1985 1
Spain 1991 1
Spain 1995 1
Spain 1997 1
Spain 2001 1
Spain 2016 1
Suriname 1967 1
Sweden 2001 1
Sweden 2013 1
Switzerland 1955 1
Switzerland 1977 1
Switzerland 1985 1
Switzerland 1990 1
Switzerland 1994 1
Switzerland 1998 1
Switzerland 1999 1
Syria 1974 1
Syria 1994 1
Tanzania 2000 1
Tanzania 2008 1
Tanzania 2013 1
Thailand 1966 1
Thailand 1967 1
Thailand 1969 1
Thailand 1996 1
Thailand 2003 1
Thailand 2008 1
Thailand 2012 1
Trinidad and Tobago 2009 1
Tunisia 1959 1
Turkey 1959 1
Turkey 1991 1
Turkey 1999 1
Turkey 2004 1
Turkey 2009 1
Turkey 2015 1
U.S.S.R. 1972 1
U.S.S.R. 1988 1
U.S.S.R. 1991 1
Uganda 1998 1
Uganda 2003 1
Ukraine 1994 1
Ukraine 1995 1
Ukraine 2000 1
Ukraine 2008 1
United Arab Emirates 2008 1
United Kingdom 1945 1
United Kingdom 1946 1
United Kingdom 1953 1
United Kingdom 1957 1
United Kingdom 1962 1
United Kingdom 1963 1
United Kingdom 1970 1
United Kingdom 1971 1
United Kingdom 1977 1
United Kingdom 1982 1
United Kingdom 1984 1
United Kingdom 1988 1
United Kingdom 1989 1
United Kingdom 1995 1
United Kingdom 1997 1
United Kingdom 2000 1
United Kingdom 2001 1
United Kingdom 2005 1
United Kingdom 2008 1
United Kingdom 2009 1
United Kingdom 2011 1
United Kingdom 2016 1
United Kingdom (Northern Ireland) 2013 1
United Kingdom (Wales) 2014 1
Uruguay 1960 1
Uruguay 1967 1
Uruguay 1990 1
Uruguay 2007 1
Vatican City 1959 1
Vatican City 1963 1
Vatican City 1967 1
Vatican City 1969 1
Vatican City 1970 1
Vatican City 1975 1
Vatican City 1980 1
Vatican City 1982 1
Vatican City 1987 1
Vatican City 1989 1
Vatican City 1991 1
Vatican City 1994 1
Vatican City 2002 1
Vatican City 2004 1
Vatican City 2005 1
Vatican City 2007 1
Vatican City 2008 1
Vatican City 2009 1
Vatican City 2014 1
Venezuela 1961 1
Venezuela 1978 1
Venezuela 1990 1
Venezuela 1997 1
Vietnam 1966 1
Vietnam 1967 1
Vietnam 1969 1
Vietnam 2000 1
Vietnam 2006 1
Vietnam 2016 1
Yugoslavia 1970 1
Yugoslavia 1975 1
Yugoslavia 1980 1
Yugoslavia (Kosovo) 2001 1

Trips by US presidents and Secretaries of State

Total number of trips by US presidents and Secretaries of State between 1945 to 2017

travels %>% 
  group_by(Country) %>% 
  count() %>% 
  filter(n > 50) %>% 
  arrange(desc(n)) %>% 
  ggplot(aes(y = n,
             x = reorder(Country, n), fill = Country)) +
  coord_flip() +
  geom_histogram(stat = "identity") + ggthemes::theme_pander() +
  theme(legend.position = "none") + 
  ggtitle("Trips by US Presidents & State Secretaries 1945-2017") + 
  xlab("Country") +
  ylab("Number Trips by US President & Secretaries of State")

Country n
United Kingdom 221
France 210
Israel 158
Belgium 135
Egypt 126
Germany 106
Italy 94
Canada 86
Switzerland 86
Mexico 85
Saudi Arabia 84
Japan 81
Jordan 81
Syria 75
Palestinian Authority 63
Korea, Republic of 60
Germany, Federal Republic of 58
Russia 54

US troop levels

troops <- read.csv("C:/Users/Paula/Desktop/troops and military spending.csv", header = TRUE)

troops %>% 
  filter(year > 1950) %>%  
  group_by(country) %>% 
  summarise(sum_troops = sum(troops)) %>%
  filter(sum_troops > 50000) %>% 
  arrange(desc(sum_troops)) %>% 
  kbl() %>%
  kable_paper("striped",
              full_width = F) 
country sum_troops
Germany 9854626
Japan 3827418
Korea, Republic of 3528080
South Vietnam 2636065
United Kingdom 1331832
France 684654
Philippines 663660
Italy 645229
Panama 474807
Iraq 420463
Thailand 381483
Spain 374901
Turkey 293246
Canada 251386
Cuba / Guantanamo 172792
Iceland 160254
Kuwait 154330
Taiwan 152322
Greece 144344
Saudi Arabia 101200
Portugal 94018
Morocco 92359
Netherlands 84441
Belgium 83230
Libya 76543
Afghanistan 56699
Bosnia and Herzegovina 52056
troops %>% 
  group_by(ccode) %>% 
  summarise(sum_troops = sum(troops)) %>% 
  ungroup() -> troop_levels

the_df <- merge(the_df, troop_levels, by.x = "cow_code", by.y = "ccode", all.x = TRUE)
library(stargazer)

the_df$sum_pres_travels[is.na(the_df$sum_pres_travels)] <- 0
the_df$sum_head_vists[is.na(the_df$sum_head_vists)] <- 0
the_df$sum_troops[is.na(the_df$sum_troops)] <- 0
the_df %>%
  filter(sum_troops > 1) %>% 
  filter(year == 2019) %>% 
  ggplot(aes(y = log(budget_pc), x = log(sum_troops + 1), group = as.factor(region_6))) +
  # geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) +
  geom_smooth(method = "lm", se = FALSE, aes(color = as.factor(region_6))) + 
  geom_text(aes(label = country, color = region_6), size = 4) +
  facet_wrap(~region_6) +
  scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"),
                   name = NULL) +
  scale_shape_manual(values = c(15,16,17,18,19,10),
                     name = NULL) +
  ggtitle("UN voting similarity vs PD budget per capita") +
  xlab("Distance from US ideal score") +
  ylab("Logged PD budget per capita") +
  theme(legend.position = "left") + ggthemes::theme_pander()
## `geom_smooth()` using formula 'y ~ x'

the_df %>%
  # filter(sum_troops > 1) %>% 
  ggplot(aes(y = log(budget_pc), x = log(sum_troops + 1), group = as.factor(region_6)), alpha = 0.5) +
  geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) +
  geom_smooth(method = "lm", se = FALSE, aes(color = as.factor(region_6))) + 
  # geom_text(aes(label = country, color = region_6), size = 4) +
  facet_wrap(~year) + 
  scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"),
                   name = NULL) +
  scale_shape_manual(values = c(15,16,17,18,19,10),
                     name = NULL) +
  ggtitle("UN voting similarity vs PD budget per capita") +
  xlab("Distance from US ideal score") +
  ylab("Logged PD budget per capita") +
  theme(legend.position = "left") + ggthemes::theme_pander()
## `geom_smooth()` using formula 'y ~ x'

Overseas Military Bases in China, Russia and the US

Source: https://en.wikipedia.org/wiki/List_of_countries_with_overseas_military_bases

US bases and “lily pads”

Source: https://github.com/meflynn/troopdata

Troop deployment data were initially compiled by Tim Kane using information obtained from the U.S. Department of Defense’s Defense Manpower Data Center (DMDC). The original data ended in 2005 and we have updated it to run through 2020

library(troopdata)

troops_us <- get_troopdata(startyear = 2013, endyear = 2020)
us_base_df <-read.csv("C:/Users/Paula/Desktop/PD_original_datasets/Bases.csv") 
  
us_base_df %>% 
  filter(base == 1) %>%
  group_by(Country.Name) %>% 
  count() %>% 
  arrange(desc(n)) %>% 
  filter(n > 2) %>% 
  kbl() %>%
  kable_paper("striped",
              full_width = F)
Country.Name n
Japan 42
Germany 40
Korea, South 30
Puerto Rico 19
United Kingdom 16
Italy 14
Afghanistan 9
Kuwait 9
Marshall Islands 6
Oman 6
Turkey 6
Belgium 5
Qatar 5
Bahrain 4
Australia 3
Guam 3
Northern Mariana Islands 3
Romania 3
United Arab Emirates 3
  us_base_df %>% 
  filter(lilypad == 1) %>%
  group_by(Country.Name) %>% 
  count() %>% 
  arrange(desc(n)) %>% 
  filter(n > 2) %>% 
  kbl() %>%
  kable_paper("striped",
              full_width = F)
Country.Name n
Saudi Arabia 9
Syria 8
Israel 6
Pakistan 6
Philippines 6
Colombia 4
Germany 4
Netherlands 4
Bulgaria 3
Cameroon 3
Peru 3
  us_base_df %>% 
  group_by(Country.Name) %>% 
  count() %>% 
  arrange(desc(n)) %>% 
  filter(n > 5) %>% 
  kbl() %>%
  kable_paper("striped",
              full_width = F)
Country.Name n
Germany 44
Japan 42
Korea, South 32
Puerto Rico 19
United Kingdom 16
Italy 15
Syria 10
Afghanistan 9
Honduras 9
Kuwait 9
Saudi Arabia 9
Belize 8
Guatemala 7
Belgium 6
Israel 6
Marshall Islands 6
Netherlands 6
Oman 6
Pakistan 6
Panama 6
Philippines 6
Turkey 6
# war_on_terror <- c("Afghanistan", "Yemen", "Syria", "Iraq", "Pakistan")
# 
# my_pd9 %<>%
#   dplyr::mutate(war_on_terror = ifelse(country_name %in% war_on_terror, 1, 0)) 

UN VOTING TWO CLUSTERS

# the_df %>% 
#    filter(year == 2014) %>% 
#    select(country, ideal_point_distance) %>% 
#    arrange(desc(ideal_point_distance))
# 

# 
# 
# names(the_df)
# 
# low_model  <- plm(lead(log(budget_pc)) ~ log(gdp_pc_const) + 
#                               log(pop) + 
#                               log(us_exports_pc) +
#                               civ_lib_fh +
#                               relig_frac +
#                               rule_law_fh,
#                               data = low_un,
#                               model = "within", effect = "time",
#                               index = c("cow_code", "year"))
# 
# 
# high_model  <- plm(lead(log(budget_pc)) ~ log(gdp_pc_const) + 
#                               log(pop) + 
#                               log(us_exports_pc) +
#                               civ_lib_fh +
#                               relig_frac +
#                               rule_law_fh,
#                               data = high_un,
#                               model = "within", effect = "time",
#                               index = c("cow_code", "year"))
# 
# stargazer(low_model, high_model, column.labels = c("Low", "High"),
#           type = "text")

Five year averages of dependent variables

# the_df$period <- cut(the_df$year, seq(2013, 2018, 1)) 
# 
# pwt.ma <- ddply(pwt, .(country, period), numcolwise(mean))
# 
# pwt.ma
# 
# 
excluding_countries <- c("Cuba", "Syria", "Yemen", "Libya")


the_df %<>%
  mutate(muslim_percent = percent_muslim_jitter / pop, na.rm = TRUE) %>%
  filter(!is.na(cow_code))

asia_df <- the_df %>%
  filter(region_6 == "Asia")
africa_df <- the_df %>%
  filter(region_6 == "Africa")
mena_df <- the_df %>%
  filter(region_6 == "MENA")
west_df <- the_df %>%
  filter(region_6 == "West")
latin_df <- the_df %>%
  filter(region_6 == "Latin")
soviet_df <- the_df %>%
  filter(region_6 == "Post Soviet")

dv <- "log(budget)"



ivs <- c("electoral_demo",
         "log(gdp_pc_const)",
         "log(pop)",
         "muslim_percent")




form_1 <- as.formula(paste(dv, paste(ivs, collapse = " + "), sep = " ~ "))
LS0tDQp0aXRsZTogIlNjYXR0ZXJwbG90cyBhbmQgYmFyY2hhcnRzIg0KYXV0aG9yOiAiUGF1bGEiDQpkYXRlOiAiOC8xOS8yMDIxIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRoZW1lOiBmbGF0bHkNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgdG9jX2RlcHRoOiA1DQogICAgDQotLS0NCg0KYGBge2NzcywgZWNobyA9IEZBTFNFfQ0KDQp0Ym9keSB0cjpudGgtY2hpbGQob2RkKSB7YmFja2dyb3VuZDogI2VlZTt9DQogICAgDQpoMSwgaDIsIGgzIHt0ZXh0LWFsaWduOiBjZW50ZXI7fQ0KDQpgYGANCg0KYGBge3Igc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0NCg0KbGlicmFyeShwbG0pDQpsaWJyYXJ5KHN0YXJnYXplcikNCmxpYnJhcnkobG10ZXN0KQ0KbGlicmFyeShzYW5kd2ljaCkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShtYWdyaXR0cikNCmxpYnJhcnkod2VzYW5kZXJzb24pDQpsaWJyYXJ5KGNvdW50cnljb2RlKQ0KbGlicmFyeShza2ltcikNCmxpYnJhcnkocHJpY2VSKQ0KbGlicmFyeShrbml0cikgDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkocmVzaGFwZTIpDQpsaWJyYXJ5KGphbml0b3IpDQpsaWJyYXJ5KHJuYXR1cmFsZWFydGgpDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShydmVzdCkNCmxpYnJhcnkoaGF2ZW4pDQpsaWJyYXJ5KFJDb2xvckJyZXdlcikNCmxpYnJhcnkoanNvbmxpdGUpDQpsaWJyYXJ5KHByaWNlUikNCg0KDQp0aGVfZGYgPC0gcmVhZC5jc3YoIkM6L1VzZXJzL1BhdWxhL0Rlc2t0b3AvUERfb3JpZ2luYWxfZGF0YXNldHMvcHJvdG8yLmNzdiIpDQoNCg0KdGhlX2RmJFguMSA8LSBOVUxMDQoNCnRoZV9kZiAlPD4lIA0KICBtdXRhdGUoY291bnRyeSA9IGlmZWxzZShjb3VudHJ5ID09ICJUcmluaWRhZCBBbmQgVG9iYWdvIiwgIlRyaW5pZGFkIGFuZCBUb2JhZ28iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoY291bnRyeSA9PSAiQm9zbmlhIEFuZCBIZXJ6ZWdvdmluYSIsICJCb3NuaWEgYW5kIEhlcnplZ292aW5hIiwgY291bnRyeSkpKSAlPiUgDQogIG11dGF0ZShjb3dfY29kZSA9IGlmZWxzZShjb3VudHJ5ID09ICJUYWl3YW4iLCA3MTMsIGNvd19jb2RlKSkNCg0KZ3RkIDwtIHJlYWQuY3N2KCJDOi9Vc2Vycy9QYXVsYS9EZXNrdG9wL1BEX29yaWdpbmFsX2RhdGFzZXRzL2d0ZC5jc3YiKQ0KDQoNCnRoZV9kZiRyZWdpb25fNiA8LSByZWNvZGVfZmFjdG9yKHRoZV9kZiRyZWdpb25fNiwgIkFzaWEgYW5kIFBhY2lmaWMiID0gIkFzaWEiLA0KICAgICAgICAgICAgICAgICJMYXRpbiBBbWVyaWNhIENhcmliYmVhbiIgPSAiTGF0aW4iLA0KICAgICAgICAgICAgICAgICJTdWItU2FoYXJhIiA9ICJBZnJpY2EiKQ0KDQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIHdhcm5pbmcgPSBGQUxTRSwgcmVzdWx0cyA9ICJhc2lzIiwgb3V0LndpZHRoID0gIjQwMCUiKQ0KDQpgYGANCg0KDQojIEdsb2JhbCBUZXJyb3Jpc20gRGF0YXNldA0KDQpGaXJzdCwgSSBoYWQgYSBsb29rIGF0IHRoZSBkYXRhc2V0IHRoYXQgRHIuIE1hcnRpbmV6IE1hY2hhaW4gc3VnZ2VzdGVkIGluIGhlciBlbWFpbCwgdGhlIEdsb2JhbCBUZXJyb3Jpc20gRGF0YXNldC4NCg0KSWYgd2Ugc3VtIHRoZSBudW1iZXIgb2YgdG90YWwgdGVycm9yaXN0IGFjdHMgcGVyIGNvdW50cnkgcGVyIHllYXIsIHdlIHNlZSB0aGF0IHRoZSB0b3AgdGhyZWUgY291bnRyaWVzIGFyZSBJcmFxLCBQYWtpc3RhbiBhbmQgQWZnaGFuaXN0YW4uDQoNClNvdXJjZTogaHR0cHM6Ly93d3cuc3RhcnQudW1kLmVkdS9kYXRhLXRvb2xzL2dsb2JhbC10ZXJyb3Jpc20tZGF0YWJhc2UtZ3RkDQoNClRoZSBHbG9iYWwgVGVycm9yaXNtIERhdGFiYXNlIChHVEQpIGlzIGFuIG9wZW4tc291cmNlIGRhdGFiYXNlIGluY2x1ZGluZyBpbmZvcm1hdGlvbiBvbiB0ZXJyb3Jpc3QgZXZlbnRzIGFyb3VuZCB0aGUgd29ybGQgc2luY2UgMTk3MCAoY3VycmVudGx5IHVwZGF0ZWQgdGhyb3VnaCAyMDE4KS4gVW5saWtlIG1hbnkgb3RoZXIgZXZlbnQgZGF0YWJhc2VzLCB0aGUgR1REIGluY2x1ZGVzIHN5c3RlbWF0aWMgZGF0YSBvbiBpbnRlcm5hdGlvbmFsIGFzIHdlbGwgYXMgZG9tZXN0aWMgdGVycm9yaXN0IGluY2lkZW50cyB0aGF0IGhhdmUgb2NjdXJyZWQgZHVyaW5nIHRoaXMgdGltZSBwZXJpb2QgYW5kIG5vdyBpbmNsdWRlcyBvdmVyIDE5MCwwMDAgY2FzZXMuDQoNCkxhRnJlZSwgRy4sICYgRHVnYW4sIEwuICgyMDA3KS4gSW50cm9kdWNpbmcgdGhlIGdsb2JhbCB0ZXJyb3Jpc20gZGF0YWJhc2UuIFRlcnJvcmlzbSBhbmQgcG9saXRpY2FsIHZpb2xlbmNlLCAxOSgyKSwgMTgxLTIwNC4NCg0KIyBUb3RhbCB0ZXJyb3Jpc3QgYXR0YWNrcyANCg0KIyMjIFRvdGFsIHRlcnJvcmlzdCBhdHRhY2tzIGJldHdlZW4gMTk3MCBhbmQgMjAxOQ0KDQpgYGB7ciBndGRfYXR0YWNrc30NCg0KZ3RkICU+JSANCiAgZ3JvdXBfYnkoY291bnRyeV90eHQsIHJlZ2lvbl90eHQpICU+JSANCiAgc3VtbWFyaXNlKHN1bSA9IG4oKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBmaWx0ZXIoc3VtID4gNDAwMCkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKGNvdW50cnlfdHh0LCBzdW0pLCANCiAgICAgICAgICAgICB5ID0gc3VtLCANCiAgICAgICAgICAgICBmaWxsID0gYXMuZmFjdG9yKHJlZ2lvbl90eHQpKSkgKyANCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjMDAxMjE5IiwiIzAwNWY3MyIsIiMwYTkzOTYiLCIjOTRkMmJkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjZWU5YjAwIiwiI2NhNjcwMiIsIiNiYjNlMDMiLCIjYWUyMDEyIiwiIzliMjIyNiIpKSArIA0KICBjb29yZF9mbGlwKCkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKyANCiAgZ2d0aGVtZXM6OnRoZW1lX3BhbmRlcigpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpICsgDQogIGdndGl0bGUoIlRvdGFsIHRlcnJvcmlzdCBhdHRhY2tzIDE5NzAgLSAyMDE5IikNCg0KYGBgDQoNCiMgU3VpY2lkZSBhdHRhY2tzIA0KDQpJZiB3ZSBsb29rIG9ubHkgYXQgc3VpY2lkZSBhdHRhY2ssIHRoZSBjb3VudHJpZXMgYXJlIHN0aWxsIElyYXEsIEFmZ2hhbmlzdGFuIGFuZCBQYWtpc3Rhbi4NCg0KVGhlcmUgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGEgdmFyaWFibGUgdG8gaW5kaWNhdGUgaWYgdGhlIHRlcnJvcmlzdCBhdHRhY2sgd2FzIHJlbGF0ZWQgZXhwbGljaXRseSB0byBJc2xhbWljIEZ1bmRhbWVudGFsaXNtLiANCg0KIyMjIFN1aWNpZGUgdGVycm9yaXN0IGF0dGFja3MgYmV0d2VlbiAxOTcwIGFuZCAyMDE5DQoNCmBgYHtyIGd0ZF9zdWljaWRlfQ0KDQpndGQgJT4lIA0KICBmaWx0ZXIoc3VpY2lkZSA9PSAxICkgJT4lIA0KICBncm91cF9ieShjb3VudHJ5X3R4dCwgcmVnaW9uX3R4dCkgJT4lIA0KICBzdW1tYXJpc2Uoc3VpY2lkZV9zdW0gPSBuKCkpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgZmlsdGVyKHN1aWNpZGVfc3VtID4gNTApICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihjb3VudHJ5X3R4dCwgc3VpY2lkZV9zdW0pLCANCiAgICAgICAgICAgICB5ID0gc3VpY2lkZV9zdW0sIA0KICAgICAgICAgICAgIGZpbGwgPSBhcy5mYWN0b3IocmVnaW9uX3R4dCkpKSArIA0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjMDAxMjE5IiwgIiMwYTkzOTYiLCAiI2VlOWIwMCIsICIjY2E2NzAyIiwiI2JiM2UwMyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiMwMDVmNzMiLCAiIzk0ZDJiZCIsICIjYWUyMDEyIiwgIiM5YjIyMjYiKSkgKw0KICBjb29yZF9mbGlwKCkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKyANCiAgZ2d0aGVtZXM6OnRoZW1lX3BhbmRlcigpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICBnZ3RpdGxlKCJTdWljaWRlIHRlcnJvcmlzdCBhdHRhY2tzIDE5NzAgLSAyMDE5IikNCg0KYGBgDQoNCiMjIyBMb29rIG9ubHkgYXQgMjAxOQ0KDQpgYGB7ciBndGRfc3VpY2lkZV8yMDE5fQ0KDQpndGQgJT4lIA0KICBmaWx0ZXIoc3VpY2lkZSA9PSAxICkgJT4lIA0KICAgIGZpbHRlcihpeWVhciA9PSAyMDE5KSAlPiUgDQogIGdyb3VwX2J5KGNvdW50cnlfdHh0LCBpeWVhciwgcmVnaW9uX3R4dCkgJT4lIA0KICBzZWxlY3QoeWVhciA9IGl5ZWFyLCBldmVyeXRoaW5nKCkpICU+JSANCiAgc3VtbWFyaXNlKHN1aWNpZGVfc3VtID0gbigpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhzdWljaWRlX3N1bSkpICU+JSANCiAgaGVhZCgyMCkgJT4lIA0KICB1bmdyb3VwKCkgICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihjb3VudHJ5X3R4dCwgc3VpY2lkZV9zdW0pLCANCiAgICAgICAgICAgICB5ID0gc3VpY2lkZV9zdW0sIA0KICAgICAgICAgICAgIGZpbGwgPSBhcy5mYWN0b3IocmVnaW9uX3R4dCkpKSArIA0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjMDAxMjE5IiwgIiMwYTkzOTYiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjY2E2NzAyIiwiIzliMjIyNiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiM5NGQyYmQiLCIjZWU5YjAwIikpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsgZmFjZXRfd3JhcCh+eWVhcikgKw0KICBnZ3RoZW1lczo6dGhlbWVfcGFuZGVyKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSArDQogIGdndGl0bGUoIlRvdGFsIHN1aWNpZGUgdGVycm9yaXN0IGF0dGFja3MgcGVyIGNvdW50cnkgaW4gMjAxOSIpDQoNCg0KYGBgDQoNCg0KU28gZm9yIHRoZSBkYXRhc2V0LCB3ZSBjYW4gYWRkIGEgdmFyaWFibGUgd2l0aCBudW1iZXIgb2YgdGVycm9yaXN0IGF0dGFja3MgcGVyIGNvdW50cnkgcGVyIHllYXIgb3Igd2UgY2FuIGNyZWF0ZSBhIGJpbmFyeSB2YXJpYWJsZSB3aXRoIGEgY3V0LW9mZiBwb2ludC4gDQoNCldlIGNhbiBhbHNvIGxvb2sgYXQgbnVtYmVyIG9mIHRlcnJvcmlzdCBhdHRhY2tzIHBlciBjYXBpdGEgcGVyIHllYXIgYW5kIHJ1biBhIHNjYXR0ZXIgcGxvdCB3aXRoIFBEIGJ1ZGdldHMgdG8gc2VlIGlmIHRoZXJlIGlzIGEgbGluZWFyIHJlbGF0aW9uc2hpcA0KDQpgYGB7ciwgZWNobyA9IEZBTFNFfQ0KDQpndGQkY293X2NvZGUgPC0gY291bnRyeWNvZGUoZ3RkJGNvdW50cnlfdHh0LCAiY291bnRyeS5uYW1lIiwgImNvd24iKQ0KDQpndGQgJTw+JSANCiAgIG11dGF0ZShjb3dfY29kZSA9IGlmZWxzZShjb3VudHJ5X3R4dCA9PSAiV2VzdCBCYW5rIGFuZCBHYXphIFN0cmlwIiwgNjY2NiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoY291bnRyeV90eHQgPT0gIlNlcmJpYSIsIDM0NSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoY291bnRyeV90eHQgPT0gIkhvbmcgS29uZyIsIDk5NywgY293X2NvZGUpKSkpDQoNCmd0ZCAlPiUgDQogIGdyb3VwX2J5KGNvd19jb2RlLCBpeWVhciwgcmVnaW9uX3R4dCkgJT4lIA0KICBzZWxlY3QoeWVhciA9IGl5ZWFyLCBldmVyeXRoaW5nKCkpICU+JSANCiAgc3VtbWFyaXNlKHN1bV9hdHRhY2tzID0gbigpKSAlPiUgDQogIHVuZ3JvdXAoKSAtPiBndGRfYW5udWFsX3N1bQ0KDQpndGQgJT4lIA0KICBncm91cF9ieShjb3dfY29kZSwgaXllYXIpICU+JSANCiAgc2VsZWN0KHllYXIgPSBpeWVhciwgZXZlcnl0aGluZygpKSAlPiUgDQogIGZpbHRlcihzdWljaWRlID09IDEpICU+JSANCiAgc3VtbWFyaXNlKHN1bV9zdWljaWRlcyA9IG4oKSkgJT4lIA0KICB1bmdyb3VwKCkgLT4gZ3RkX2FubnVhbF9zdWljaWRlDQoNCmd0ZCAlPiUgDQogIGdyb3VwX2J5KGNvd19jb2RlLCBpeWVhcikgJT4lIA0KICBzZWxlY3QoeWVhciA9IGl5ZWFyLCBldmVyeXRoaW5nKCkpICU+JSANCiAgZmlsdGVyKHN1aWNpZGUgPT0gMSkgJT4lIA0KICBzdW1tYXJpc2Uoc3VtX2FsbF95ZWFyX3N1aWNpZGVzID0gbigpKSAlPiUgDQogIHVuZ3JvdXAoKSAtPiBndGRfdG90YWxfc3VpY2lkZQ0KDQpndGQgJT4lIA0KICBncm91cF9ieShjb3dfY29kZSwgaXllYXIsIHJlZ2lvbl90eHQpICU+JSANCiAgc2VsZWN0KHllYXIgPSBpeWVhciwgZXZlcnl0aGluZygpKSAlPiUgDQogIHN1bW1hcmlzZShzdW1fYWxsX3llYXJfYXR0YWNrcyA9IG4oKSkgJT4lIA0KICB1bmdyb3VwKCkgLT4gZ3RkX3RvdGFsX3N1bQ0KDQp0aGVfZGYgPC0gbWVyZ2UodGhlX2RmLCBndGRfYW5udWFsX3N1bSwgYnkgPSBjKCJjb3dfY29kZSIsICJ5ZWFyIiksIGFsbC54ID0gVFJVRSkNCnRoZV9kZiA8LSBtZXJnZSh0aGVfZGYsIGd0ZF9hbm51YWxfc3VpY2lkZSwgYnkgPSBjKCJjb3dfY29kZSIsICJ5ZWFyIiksIGFsbC54ID0gVFJVRSkNCg0KdGhlX2RmIDwtIG1lcmdlKHRoZV9kZiwgZ3RkX3RvdGFsX3N1aWNpZGUsIGJ5ID0gYygiY293X2NvZGUiLCAieWVhciIpLCBhbGwueCA9IFRSVUUpDQp0aGVfZGYgPC0gbWVyZ2UodGhlX2RmLCBndGRfdG90YWxfc3VtLCBieSA9IGMoImNvd19jb2RlIiwgInllYXIiKSwgYWxsLnggPSBUUlVFKQ0KDQp0aGVfZGYgJT4lIA0KICBncm91cF9ieShjb3dfY29kZSkgJT4lIA0KICBtdXRhdGUoYXZnX3N1aWNpZGUgPSBzdW1fYWxsX3llYXJfc3VpY2lkZXMgLyAxOCkgJT4lDQogIHVuZ3JvdXAoKSAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMTkpICU+JSANCiAgc2VsZWN0KGNvdW50cnksIGF2Z19zdWljaWRlKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhhdmdfc3VpY2lkZSkpDQoNCnRoZV9kZiAlPiUgDQogIGdyb3VwX2J5KGNvd19jb2RlKSAlPiUgDQogIG11dGF0ZShhdmdfYXR0YWNrcyA9IHJvdW5kKG1lYW4oc3VtX2FsbF95ZWFyX2F0dGFja3MsIG5hLnJtID0gVFJVRSkpLCAwKSAlPiUNCiAgdW5ncm91cCgpICU+JSANCiAgZmlsdGVyKHllYXIgPT0gMjAxOSkgJT4lIA0KICBzZWxlY3QoY291bnRyeSwgYXZnX2F0dGFja3MpICU+JSANCiAgYXJyYW5nZShkZXNjKGF2Z19hdHRhY2tzKSkgLT4gaG8NCg0KVmlldyhobykNCg0KYGBgDQoNCg0KU2NhdHRlcnBsb3QgY29tcGFyaW5nIGFsbCB0eXBlcyBvZiB0ZXJyb3Jpc3QgYXR0YWNrcyBwZXIgY2FwaXRhIHZzIFBEIGJ1ZGdldHMgcGVyIGNhcGl0YQ0KDQpgYGB7ciAgYXR0YWNrX3NjYXR0ZXJ9DQoNCnRoZV9kZiAlPiUNCiAgbXV0YXRlKGF0dGFja3NfcGMgPSBzdW1fYXR0YWNrcyAvIHBvcCwgbmEucm0gPSBUUlVFKSAlPiUgDQogIGdncGxvdChhZXMoeSA9IGxvZyhidWRnZXRfcGMpLCB4ID0gbG9nKGF0dGFja3NfcGMpKSkgKw0KICAgICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAiIzlkMDIwOCIpICsNCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBhcy5mYWN0b3IocmVnaW9uXzYpLCBzaGFwZSA9IGFzLmZhY3RvcihyZWdpb25fNikpKSArDQogIGZhY2V0X3dyYXAofnllYXIpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiMyMTllYmMiLCAiIzI2NDY1MyIsICIjNDNhYThiIiwgIiM2ZDU5N2EiLCAiI2U2Mzk0NiIsICIjZjRhMjYxIiksIG5hbWUgPSBOVUxMKSArDQogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE1LDE2LDE3LDE4LDE5LDEwKSwgbmFtZSA9IE5VTEwpICsNCiAgeGxhYigiTG9nZ2VkIG51bWJlciBvZiB0ZXJyb3Jpc3QgYXR0YWNrcyBwZXIgY2FwaXRhIikgKw0KICB5bGFiKCJMb2dnZWQgUEQgYnVkZ2V0IHBlciBjYXBpdGEiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJsZWZ0IikgKw0KICBnZ3RoZW1lczo6dGhlbWVfcGFuZGVyKCkgKyANCiAgZ2d0aXRsZSgiVG90YWwgdGVycm9yaXN0IGF0dGFja3MgcGVyIGNhcGl0YSB2cyBQRCBidWRnZXRzIHBlciBjYXBpdGEiKQ0KDQpgYGANCg0KU2NhdHRlcnBsb3QgY29tcGFyaW5nIHN1aWNpZGUgdGVycm9yaXN0IGF0dGFja3MgcGVyIGNhcGl0YSB2cyBQRCBidWRnZXRzIHBlciBjYXBpdGENCg0KDQpgYGB7ciBzdWljaWRlX2Jhcn0NCg0KdGhlX2RmICU+JQ0KICBtdXRhdGUoYXR0YWNrc19wYyA9IHN1bV9zdWljaWRlcyAvIHBvcCwgbmEucm0gPSBUUlVFKSAlPiUgDQogIGdncGxvdChhZXMoeSA9IGxvZyhidWRnZXRfcGMpLCB4ID0gbG9nKGF0dGFja3NfcGMpKSkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2xvciA9ICIjOWQwMjA4IikgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGFzLmZhY3RvcihyZWdpb25fNiksIHNoYXBlID0gYXMuZmFjdG9yKHJlZ2lvbl82KSkpICsNCiAgZmFjZXRfd3JhcCh+eWVhcikgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiIzIxOWViYyIsICIjMjY0NjUzIiwgIiM0M2FhOGIiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiM2ZDU5N2EiLCAiI2U2Mzk0NiIsICIjZjRhMjYxIiksIG5hbWUgPSBOVUxMKSArDQogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE1LDE2LDE3LDE4LDE5LDEwKSwgbmFtZSA9IE5VTEwpICsNCiAgeGxhYigiTG9nZ2VkIG51bWJlciBvZiB0ZXJyb3Jpc3QgYXR0YWNrcyBwZXIgY2FwaXRhIikgKw0KICB5bGFiKCJMb2dnZWQgUEQgYnVkZ2V0IHBlciBjYXBpdGEiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJsZWZ0IikgKw0KICBnZ3RoZW1lczo6dGhlbWVfcGFuZGVyKCkgKyANCiAgZ2d0aXRsZSgiU3VpY2lkZSBhdHRhY2tzIHBlciBjYXBpdGEgdnMgUEQgYnVkZ2V0cyBwZXIgY2FwaXRhIikNCg0KYGBgDQoNCmBgYHtyIHN1aWNpZGVfdG90YWxfc2NhdHRlcn0NCg0KdGhlX2RmICU+JQ0KICANCiAgDQogIGdncGxvdChhZXMoeSA9IGxvZyhidWRnZXRfcGMpLCB4ID0gbG9nKHN1bV9zdWljaWRlcykpKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gIiM5ZDAyMDgiKSArDQogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gYXMuZmFjdG9yKHJlZ2lvbl82KSwgc2hhcGUgPSBhcy5mYWN0b3IocmVnaW9uXzYpKSkgKw0KICBmYWNldF93cmFwKH55ZWFyKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjMjE5ZWJjIiwgIiMyNjQ2NTMiLCAiIzQzYWE4YiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIzZkNTk3YSIsICIjZTYzOTQ2IiwgIiNmNGEyNjEiKSwgbmFtZSA9IE5VTEwpICsNCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTUsMTYsMTcsMTgsMTksMTApLCBuYW1lID0gTlVMTCkgKw0KICB4bGFiKCJMb2dnZWQgbnVtYmVyIG9mIHRlcnJvcmlzdCBhdHRhY2tzIHBlciBjYXBpdGEiKSArDQogIHlsYWIoIkxvZ2dlZCBQRCBidWRnZXQgcGVyIGNhcGl0YSIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImxlZnQiKSArDQogIGdndGhlbWVzOjp0aGVtZV9wYW5kZXIoKSArIA0KICBnZ3RpdGxlKCJTdWljaWRlIGF0dGFja3MgcGVyIGNhcGl0YSB2cyBQRCBidWRnZXRzIHBlciBjYXBpdGEiKQ0KDQpgYGANCg0KIyMgT25seSBsb29raW5nIGF0IHRlcnJvcmlzdCBhdHRhY2tzIGluIDIwMTkNCg0KYGBge3Igc3VpY2lkZV9iYXJfMTl9DQoNCnRoZV9kZiAlPiUNCiAgZmlsdGVyKHllYXIgPT0gMjAxOSkgJT4lIA0KICBtdXRhdGUoYXR0YWNrc19wYyA9IHN1bV9hdHRhY2tzIC8gcG9wLCBuYS5ybSA9IFRSVUUpICU+JSANCiAgZ2dwbG90KGFlcyh5ID0gbG9nKGJ1ZGdldCksIHggPSBsb2coc3VtX2F0dGFja3MpLCBncm91cCA9IGFzLmZhY3RvcihyZWdpb25fNikpKSArIA0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2xvciA9ICIjOWQwMjA4IiwgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBhcy5mYWN0b3IocmVnaW9uXzYpLCBzaGFwZSA9IGFzLmZhY3RvcihyZWdpb25fNikpKSArIA0KICBmYWNldF93cmFwKH5yZWdpb25fNikgKyANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiMyMTllYmMiLCAiIzI2NDY1MyIsICIjNDNhYThiIiwgIiM2ZDU5N2EiLCAiI2U2Mzk0NiIsICIjZjRhMjYxIiksDQogICAgICAgICAgICAgICAgICAgbmFtZSA9IE5VTEwpICsNCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTUsMTYsMTcsMTgsMTksMTApLA0KICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IE5VTEwpICsNCiAgeGxhYigiTG9nZ2VkIG51bWJlciBvZiB0ZXJyb3Jpc3QgYXR0YWNrcyBwZXIgY2FwaXRhIikgKw0KICB5bGFiKCJMb2dnZWQgUEQgYnVkZ2V0IHBlciBjYXBpdGEiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJsZWZ0IikgKw0KICBnZ3RoZW1lczo6dGhlbWVfcGFuZGVyKCkgKyANCiAgZ2d0aXRsZSgiVG90YWwgdGVycm9yaXN0IGF0dGFja3MgcGVyIGNhcGl0YSB2cyBQRCBidWRnZXRzIHBlciBjYXBpdGEgaW4gMjAxOSIpDQoNCmBgYA0KDQoNCiMjIFN1aWNpZGUgYXR0YWNrcyBwZXIgY2FwaXRhIHZzIFBEIGJ1ZGdldHMgcGVyIGNhcGl0YSBzaW5jZSAyMDEzDQoNCmBgYHtyIHN1aWNpZGVfc2NhdHRlcn0NCg0KdGhlX2RmICU+JQ0KICBmaWx0ZXIoeWVhciA+IDIwMTIpICU+JSANCiAgbXV0YXRlKGF0dGFja3NfcGMgPSBzdW1fc3VpY2lkZXMgLyBwb3AsIG5hLnJtID0gVFJVRSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHkgPSBsb2coYnVkZ2V0X3BjKSwgeCA9IGxvZyhhdHRhY2tzX3BjKSkpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAiIzlkMDIwOCIpICsNCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBhcy5mYWN0b3IocmVnaW9uXzYpLCBzaGFwZSA9IGFzLmZhY3RvcihyZWdpb25fNikpKSArDQogIGZhY2V0X3dyYXAofnJlZ2lvbl82KSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjMjE5ZWJjIiwgIiMyNjQ2NTMiLCAiIzQzYWE4YiIsICIjNmQ1OTdhIiwgIiNlNjM5NDYiLCAiI2Y0YTI2MSIpLCBuYW1lID0gTlVMTCkgKw0KICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxNSwxNiwxNywxOCwxOSwxMCksIG5hbWUgPSBOVUxMKSArDQogIHhsYWIoIkxvZ2dlZCBudW1iZXIgb2YgdGVycm9yaXN0IGF0dGFja3MgcGVyIGNhcGl0YSIpICsNCiAgeWxhYigiTG9nZ2VkIFBEIGJ1ZGdldCBwZXIgY2FwaXRhIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibGVmdCIpICsNCiAgZ2d0aGVtZXM6OnRoZW1lX3BhbmRlcigpICsgDQogIGdndGl0bGUoIlN1aWNpZGUgYXR0YWNrcyBwZXIgY2FwaXRhIHZzIFBEIGJ1ZGdldHMgcGVyIGNhcGl0YSBzaW5jZSAyMDEzIikNCg0KYGBgDQoNCg0KDQoNCiMgQ2hpbmVzZSBhaWQgZGF0YXNldA0KDQpOZXh0IHdlIGNhbiBkZWNpZGUgd2hpY2ggY291bnRyaWVzIGFyZSBpbiBDaGluYSdzIHNwaGVyZSBvZiBpbmZsdWVuY2UuDQoNCg0KYGBge3IgY2hpbmFfYWlkX2luc3RhbGwsIGVjaG8gPSBGQUxTRX0NCg0KbGlicmFyeShmb3JlaWduKQ0KbGlicmFyeShyZWFkeGwpDQoNCm1hc3RlciA8LSAgcmVhZC5jc3YoIkM6L1VzZXJzL1BhdWxhL0Rlc2t0b3AvbWFzdGVyX2NvcHlfMTk0OF8yMDE5LmNzdiIpDQoNCmNoaW5hX29yaWcgPC0gcmVhZF9leGNlbCgiQzovVXNlcnMvUGF1bGEvRGVza3RvcC9HbG9iYWxDaGluZXNlT2ZmaWNpYWxGaW5hbmNlRGF0YXNldF92MS4wLnhsc3giKQ0KDQoNCmNoaW5hX29yaWcgJT4lIA0KICBkcGx5cjo6c2VsZWN0KGNvdW50cnkgPSByZWNpcGllbnRfY29uZGVuc2VkLCB5ZWFyLCANCiAgICAgICAgICAgICAgICBjaG5fYWlkID0gdXNkX2RlZmxfMjAxNCkgLT4gY2hpbmFfYWlkDQoNCmNoaW5hX2FpZCRjb3dfY29kZSA8LSBjb3VudHJ5Y29kZShjaGluYV9haWQkY291bnRyeSwgImNvdW50cnkubmFtZSIsICJjb3duIikNCg0KY2hpbmFfYWlkIDwtIG1lcmdlKGNoaW5hX2FpZCwgbWFzdGVyLCBieSA9IGMoImNvd19jb2RlIiwgInllYXIiKSwgYWxsLnggPSBUUlVFKQ0KDQpgYGANCg0KU291cmNlOiAgaHR0cHM6Ly93d3cuYWlkZGF0YS5vcmcvZGF0YS9jaGluZXNlLWdsb2JhbC1vZmZpY2lhbC1maW5hbmNlLWRhdGFzZXQNCg0KVGhpcyBkYXRhc2V0IHRyYWNrcyB0aGUga25vd24gdW5pdmVyc2Ugb2Ygb3ZlcnNlYXMgQ2hpbmVzZSBvZmZpY2lhbCBmaW5hbmNlIGJldHdlZW4gMjAwMC0yMDE0LCBjYXB0dXJpbmcgNCwzNzMgcmVjb3JkcyB0b3RhbGluZyAkMzU0LjQgYmlsbGlvbi4gVGhlIGRhdGEgaW5jbHVkZXMgYm90aCBDaGluZXNlIGFpZCBhbmQgbm9uLWNvbmNlc3Npb25hbCBvZmZpY2lhbCBmaW5hbmNpbmcuDQoNCkJsdWhtLCBSLiwgRHJlaGVyLCBBLiwgRnVjaHMsIEEuLCBQYXJrcywgQi4gQy4sIFN0cmFuZ2UsIEEuLCAmIFRpZXJuZXksIE0uSi4gKDIwMTgpLiBDb25uZWN0aXZlIEZpbmFuY2luZzogQ2hpbmVzZSBJbmZyYXN0cnVjdHVyZSBQcm9qZWN0cyBhbmQgdGhlIERpZmZ1c2lvbiBvZiBFY29ub21pYyBBY3Rpdml0eSBpbiBEZXZlbG9waW5nIENvdW50cmllcy4gQWlkRGF0YSBXb3JraW5nIFBhcGVyDQoNCiMjIyBMb29raW5nIGF0IHRoZSB0b3RhbCBhaWQgZnJvbSBDaGluYSBiZXR3ZWVuIDIwMDAgdG8gMjAxNA0KDQpgYGB7ciBhaWRfY2hpbmFfMDBfMTR9DQoNCmNoaW5hX2FpZCAlPiUgDQogIGZpbHRlcighaXMubmEocmVnaW9uX25hbWUpKSAlPiUgDQogIGdyb3VwX2J5KGNvdW50cnksIHJlZ2lvbl9uYW1lKSAlPiUgDQogIGZpbHRlcighZ3JlcGwoInJlZ2lvbmFsIiwgY291bnRyeSkpICU+JSANCiAgc3VtbWFyaXNlKHN1bV9haWQgPSBzdW0oY2huX2FpZCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICB0b3BfbigzMCkgJT4lIA0KICBnZ3Bsb3QoYWVzKHg9IHJlb3JkZXIoY291bnRyeSwgc3VtX2FpZCksIA0KICAgICAgICAgICAgIHkgPSBzdW1fYWlkLCANCiAgICAgICAgICAgICBmaWxsID0gYXMuZmFjdG9yKHJlZ2lvbl9uYW1lKSkpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArIA0KICBjb29yZF9mbGlwKCkgKyANCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzAwNWY3MyIsIiMwYTkzOTYiLCIjOTRkMmJkIiwiI2VlOWIwMCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiNjYTY3MDIiLCIjYmIzZTAzIiwiI2FlMjAxMiIsIiM5YjIyMjYiKSwgDQogICAgICAgICAgICAgICAgICAgIG5hbWUgPSBOVUxMKSArDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwgDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArIA0KICB4bGFiKCJjb3VudHJ5IikgKw0KICB5bGFiKCJUb3RhbCBhaWQgZnJvbSBDaGluYSIpICsNCiAgZ2d0aGVtZXM6OnRoZW1lX3BhbmRlcigpICsgDQogIGdndGl0bGUoIlRvdGFsIGFpZCBmcm9tIENoaW5hIGJldHdlZW0gMjAwMCAtIDIwMTQiKSANCg0KY2hpbmFfYWlkICU+JSANCiAgZmlsdGVyKCFpcy5uYShyZWdpb25fbmFtZSkpICU+JSANCiAgZ3JvdXBfYnkoY291bnRyeSwgcmVnaW9uX25hbWUpICU+JSANCiAgZmlsdGVyKCFncmVwbCgicmVnaW9uYWwiLCBjb3VudHJ5KSkgJT4lIA0KICBzdW1tYXJpc2Uoc3VtX2FpZCA9IHN1bShjaG5fYWlkLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIHRvcF9uKDIwKSAlPiUgcHVsbChjb3VudHJ5KSAtPiB0b3BfY2hpbmFfYWlkX3ZlY3Rvcg0KDQp0b3BfY2hpbmFfYWlkX3ZlY3Rvcg0KDQoNCmNoaW5hX2FpZCAlPiUgDQogIGZpbHRlcighaXMubmEocmVnaW9uX25hbWUpKSAlPiUgDQogIGdyb3VwX2J5KGNvdW50cnksIHJlZ2lvbl9uYW1lKSAlPiUgDQogIGZpbHRlcighZ3JlcGwoInJlZ2lvbmFsIiwgY291bnRyeSkpICU+JSANCiAgbXV0YXRlKGNobl9haWRfcGMgPSBjaG5fYWlkIC8gcG9wdWxhdGlvbiwgbmEucm0gPSBUUlVFKSAlPiUgDQogIHN1bW1hcmlzZShzdW1fYWlkX3BjID0gc3VtKGNobl9haWRfcGMsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgdG9wX24oMjApICU+JSBwdWxsKGNvdW50cnkpIC0+IHRvcF9jaGluYV9haWRfcGNfdmVjdG9yDQoNCnRvcF9jaGluYV9haWRfcGNfdmVjdG9yDQogIA0KDQpgYGANCg0KIyMgQ2hpbmVzZSBGREkgaW4gQWZyaWNhDQoNClNvdXJjZTogaHR0cHM6Ly93d3cuYWlkZGF0YS5vcmcvZGF0YS9haWRkYXRhcy1jaGluZXNlLW9mZmljaWFsLWZpbmFuY2UtdG8tYWZyaWNhLWRhdGFzZXQtdmVyc2lvbi0xLTEtMQ0KDQpUaGlzIGlzIGEgZGF0YXNldCBvZiBDaGluZXNlIG9mZmljaWFsIGZpbmFuY2UgYWN0aXZpdGllcyB0aGF0IHNwYW5zIDUwIEFmcmljYW4gY291bnRyaWVzIG92ZXIgdGhlIDIwMDAtMjAxMiBwZXJpb2QuIEl0IGluY2x1ZGVzIDEsOTUyIENoaW5lc2UgZGV2ZWxvcG1lbnQgZmluYW5jZSBwcm9qZWN0cyBhY3Jvc3MgMyw1NDUgcGh5c2ljYWwgbG9jYXRpb25zLg0KDQpEcmVoZXIsIEEuLCBGdWNocywgQS4sIEhvZGxlciwgUi4sIFBhcmtzLCBCLiBDLiwgUmFzY2hreSwgUC4gQS4sICYgVGllcm5leSwgTS5KLiAoMjAxOSkuIEFmcmljYW4gTGVhZGVycyBhbmQgdGhlIEdlb2dyYXBoeSBvZiBDaGluYSdzIEZvcmVpZ24gQXNzaXN0YW5jZS4gSm91cm5hbCBvZiBEZXZlbG9wbWVudCBFY29ub21pY3MsIDE0MCwgNDQtNzEuDQoNCmBgYHtyIGNoaW5hX2ZkaSwgZWNobyA9IEZBTFNFfQ0KDQphZnJpY2FfZmRpIDwtIHJlYWQuY3N2KCJDOi9Vc2Vycy9QYXVsYS9EZXNrdG9wL2NoaW5hX2ZkaS5jc3YiKQ0KbmFtZXMoYWZyaWNhX2ZkaSkgPC0gYWZyaWNhX2ZkaVsxLF0NCmFmcmljYV9mZGkgPC0gYWZyaWNhX2ZkaVstMSxdDQoNCmFmcmljYV9mZGkgJTw+JSANCiAgc2VsZWN0KHllYXIgPSAiVVMkIG1uLCB1bmFkanVzdGVkIiwgZXZlcnl0aGluZygpKSANCg0KYWZyaWNhX2ZkaTIgPC0gYWZyaWNhX2ZkaVstYygxOjEzKSwgXSANCmFmcmljYV9mZGkzIDwtIGFmcmljYV9mZGkyWy1jKDE4OjIyKSwgXSAgDQoNCg0Kd2lkZV9mZGkgPC0gbWVsdChhZnJpY2FfZmRpMywNCiAgICAgICAgICAgICAgICAgICBpZC52YXJzID0gYygieWVhciIpLA0KICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLm5hbWUgPSAiY291bnRyeSIsDQogICAgICAgICAgICAgICAgICAgdmFsdWUubmFtZSA9ICJmZGkiKQ0KDQp3aWRlX2ZkaSAlPiUNCiAgZmlsdGVyKGNvdW50cnkgIT0gInRvdGFsX3VzX21uIikgJT4lIA0KICBtdXRhdGUoZmRpX2Ftb3VudCA9IGFzLm51bWVyaWMoZmRpKSkgJT4lIA0KICBmaWx0ZXIoIWdyZXBsKCJUb3RhbCIsIGNvdW50cnkpKSAlPiUgDQogIGZpbHRlcighaXMubmEoY291bnRyeSkpICU+JSANCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lIA0KICBzdW1tYXJpc2Uoc3VtX2ZkaSA9IHN1bShmZGlfYW1vdW50LCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgdW5ncm91cCgpIC0+IGZkaV9hZiANCg0KZmRpX2FmJGNvd19jb2RlIDwtIGNvdW50cnljb2RlKGZkaV9hZiRjb3VudHJ5LCAiY291bnRyeS5uYW1lIiwgImNvd24iKQ0KDQpgYGANCg0KDQojIyBUb3RhbCBkZXZlbG9wbWVudCBmaW5hbmNlIGludmVzdG1lbnQgdG8gQWZyaWNhIGZyb20gQ2hpbmEgMjAwMCB0byAyMDEyDQoNCmBgYHtyIGNoaW5hX2Rldl9maW59DQoNCmZkaV9hZiAlPiUgDQogICAgdG9wX24oMjUpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihjb3VudHJ5LCBzdW1fZmRpKSwgeSA9IHN1bV9mZGksIGZpbGwgPSBjb3VudHJ5KSkgKyANCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsgDQogIGNvb3JkX2ZsaXAoKSArIGdndGhlbWVzOjp0aGVtZV9wYW5kZXIoKSArDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwgDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyBnZ3RoZW1lczo6dGhlbWVfcGFuZGVyKCkgKw0KICB4bGFiKCJUb3RhbCBkZXZlbG9wbWVudCBmaW5hbmNlIGNvc3RzIikgKw0KICB5bGFiKCJDb3VudHJ5IikgKw0KICBnZ3RoZW1lczo6dGhlbWVfcGFuZGVyKCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgZ2d0aXRsZSgiVG90YWwgZGV2ZWxvcG1lbnQgZmluYW5jZSBpbnZlc3RtZW50IGZyb20gQ2hpbmEgMjAwMCB0byAyMDEyICIpIA0KDQoNCmBgYA0KDQojIyBMb29raW5nIGF0IHRoZSBmaW5hbmNpYWwgZGV2ZWxvcG1lbnQgaW52ZXN0bWVudCBwZXIgY2FwaXRhIHRvIEFmcmljYSAyMDAwIHRvIDIxMDINCg0KYGBge3IgY2hpbmFfZGV2X2Zpbl9wY30NCg0KdGhlX2RmIDwtbWVyZ2UodGhlX2RmLCBmZGlfYWYsIGJ5ID0gYygiY293X2NvZGUiKSwgYWxsLnggPSBUUlVFKQ0KDQp0aGVfZGYgJT4lIA0KICBmaWx0ZXIoc3VtX2ZkaSA+IDEwMDAwKSAlPiUgDQogIG11dGF0ZShmZGlfcGMgPSBzdW1fZmRpIC8gcG9wLCBuYS5ybSA9IFRSVUUpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihjb3VudHJ5LngsIGZkaV9wYyksIHkgPSBmZGlfcGMsIGZpbGwgPSBjb3VudHJ5LngpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKyANCiAgY29vcmRfZmxpcCgpICsgZ2d0aGVtZXM6OnRoZW1lX3BhbmRlcigpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLCANCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArIGdndGhlbWVzOjp0aGVtZV9wYW5kZXIoKSArDQogIHhsYWIoIlRvdGFsIGZpbmFuY2UgY29zdHMgcGVyIGNhcGl0YSIpICsNCiAgeWxhYigiQ291bnRyeSIpICsNCiAgZ2d0aGVtZXM6OnRoZW1lX3BhbmRlcigpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIGdndGl0bGUoIlRvdGFsIGZpbmFuY2UgcGVyIGNhcGl0YSBmcm9tIENoaW5hIDIwMDAgdG8gMjAxMiAiKSANCg0KYGBgDQoNCg0KIyBSdXNzaWEncyBTcGhlcmUgb2YgSW5mbHVlbmNlIA0KDQpSdXNzaWEncyBzcGhlcmUgY29udGFpbnMgYWxsIHBvc3Qtc292aWV0IGNvdW50cmllcyBhbmQgYWxsIGNvdW50cmllcyB0aGF0IGFyZSBjb250aWd1b3VzIHRvIFJ1c3NpYQ0KDQpgYGB7ciwgZWNobyA9IEZBTFNFfQ0KDQpydXNzaWFfZHlhZCA8LSByZWFkLmNzdigiQzovVXNlcnMvUGF1bGEvRGVza3RvcC9QRF9vcmlnaW5hbF9kYXRhc2V0cy9ydXNzaWFfZHlhZC5jc3YiKQ0KDQp0aGVfZGYgPC0gbWVyZ2UodGhlX2RmLCBydXNzaWFfZHlhZCwgYnkgPSBjKCJjb3dfY29kZSIsICJ5ZWFyIiksIGFsbC54ID0gVFJVRSkNCg0KYGBgDQoNCg0KIyBDaGluYSdzIFNwaGVyZSBvZiBJbmZsdWVuY2UNCg0KQ2hpbmEncyBzcGVoZXJlIGNvbnRhaW5zIHRvcCAyMCBhaWQgcmVjaXBpZW50cyBwZXIgY2FwaXRhIGFuZCB0b3AgZmluYW5jaWFsIHJlY2lwaWVudHMgcGVyIGNhcGl0YSBmcm9tIFhYWCBZWVkgeWVhcnMvDQoNCkl0IGFsc28gY29udGFpbnMgYWxsIGNvdW50cmllcyBjb250aWd1b3VzIHRvIENoaW5hLg0KDQojIEF2ZXJhZ2Ugdm90aW5nIHNpbWlsYXJpdHkgdG8gQ2hpbmEgaW4gdGhlIFVODQoNClNvdXJjZTogaHR0cHM6Ly9kYXRhdmVyc2UuaGFydmFyZC5lZHUvZGF0YXNldC54aHRtbD9wZXJzaXN0ZW50SWQ9ZG9pOjEwLjc5MTAvRFZOLzVHUUlWVQ0KDQpSb2RyaWd1ZXMgVmllaXJhLCBWLiAoMjAxOCkuIFdobyBqb2lucyBjb3VudGVyLWhlZ2Vtb25pYyBJR09zPyBFYXJseSBhbmQgbGF0ZSBtZW1iZXJzIG9mIHRoZSBDaGluYS1sZWQgQXNpYW4gSW5mcmFzdHJ1Y3R1cmUgSW52ZXN0bWVudCBCYW5rLiBSZXNlYXJjaCAmIFBvbGl0aWNzLCA1KDIpDQoNCkNoaW5hIEFsaWdubWVudCBjb3JyZXNwb25kIHRvIHRoZSBhdmVyYWdlIGlkZWFsIHBvaW50IHNjYWxlIChyYW5naW5nIGZyb20gMCB0byAxMDApIG9mIEJhaWxleSBldCBhbC4gKDIwMTUpIGZvciBhIHN0YXRl4oCZcyB2b3RlIHdpdGggQ2hpbmVzZSBwb3NpdGlvbnMgaW4gdGhlIFVuaXRlZCBOYXRpb25zIEdlbmVyYWwgQXNzZW1ibHkgYmV0d2VlbiAxOTkwIGFuZCAyMDA5LCBhIHBlcmlvZCBkdXJpbmcgd2hpY2ggVVMgbGVhZGVyc2hpcCBpbiB3b3JsZCBhZmZhaXJzIHNlZW1lZCByb2J1c3QuIFRoaXMgbWVhc3VyZXMgdGhlIHN0cmVuZ3RoIG9mIGludGVybmF0aW9uYWwgdGllcyB3aXRoIENoaW5hIGluIHBvbGl0aWNhbCB0ZXJtcw0KDQpgYGB7ciBhaWlifQ0KDQphaWliIDwtIHJlYWRfZHRhKCJDOi9Vc2Vycy9QYXVsYS9EZXNrdG9wL0FJSUItRm9yUmVzdWJtaXNzaW9uLmR0YSIpDQogIA0KYWlpYiAlPiUgDQogIHNlbGVjdChjb3VudHJ5LCBjaGluYWFsaWdubWVudCkgJT4lDQogIGFycmFuZ2UoZGVzYyhjaGluYWFsaWdubWVudCkpICU+JSANCiAgZmlsdGVyKGNoaW5hYWxpZ25tZW50ID4gOTAwMCkgJT4lIA0KICBrYmwoKSAlPiUNCiAga2FibGVfcGFwZXIoInN0cmlwZWQiLA0KICAgICAgICAgICAgICBmdWxsX3dpZHRoID0gRikNCg0KYWlpYiAlPiUgDQogICAgZmlsdGVyKGNoaW5hYWxpZ25tZW50ID4gODgwMCkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKGNvdW50cnksIGNoaW5hYWxpZ25tZW50KSwgeSA9IGNoaW5hYWxpZ25tZW50LCBmaWxsID0gY291bnRyeSkpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArIA0KICBjb29yZF9mbGlwKCkgKyBnZ3RoZW1lczo6dGhlbWVfcGFuZGVyKCkgKw0KICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksIA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsgZ2d0aGVtZXM6OnRoZW1lX3BhbmRlcigpICsNCiAgeWxhYigiVm90aW5nIHNpbWlsYXJpdHkgdG8gQ2hpbmEgKGF2ZXJhZ2UpIikgKw0KICB4bGFiKCJDb3VudHJ5IikgKw0KICBnZ3RoZW1lczo6dGhlbWVfcGFuZGVyKCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgZ2d0aXRsZSgiVG9wIGFsaWduZWQgdG8gQ2hpbmVzZSBVTiB2b3RpbmcgMjAwMCAtIDIwMTQiKSAgDQoNCmFpaWIgJT4lIA0KICAgIGZpbHRlcihjaGluYWFsaWdubWVudCA8IDU1MDApICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihjb3VudHJ5LCBjaGluYWFsaWdubWVudCksIHkgPSBjaGluYWFsaWdubWVudCwgZmlsbCA9IGNvdW50cnkpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKyANCiAgY29vcmRfZmxpcCgpICsgZ2d0aGVtZXM6OnRoZW1lX3BhbmRlcigpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLCANCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArIGdndGhlbWVzOjp0aGVtZV9wYW5kZXIoKSArDQogIHlsYWIoIlZvdGluZyBzaW1pbGFyaXR5IHRvIENoaW5hIChhdmVyYWdlKSIpICsNCiAgeGxhYigiQ291bnRyeSIpICsNCiAgZ2d0aGVtZXM6OnRoZW1lX3BhbmRlcigpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIGdndGl0bGUoIkxlYXN0IGFsaWduZWQgdG8gQ2hpbmVzZSBVTiB2b3RpbmcgMjAwMCAtIDIwMTQiKSANCg0KYGBgDQoNCmBgYHtyfQ0KDQptYXAgPC0gbmVfY291bnRyaWVzKHNjYWxlID0gIm1lZGl1bSIsIHJldHVybmNsYXNzID0gInNmIikNCg0KYWlpYiRpc28zYyA8LSBjb3VudHJ5Y29kZShhaWliJGNvdW50cnksICJjb3duIiwiaXNvM2MiKQ0KDQptYXBfYWlpYiA8LSBtZXJnZShtYXAsIGFpaWIsIGJ5LnggPSAiYWRtMF9hMyIsIGJ5LnkgPSAid2Jjb2RlIiwgYWxsLnggPSBUUlVFKQ0KDQpWaWV3KG1hcCkNCg0KY29vcmQgPC0gcmVhZF9odG1sKCJodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wdWJsaWMtZGF0YS9kb2NzL2Nhbm9uaWNhbC9jb3VudHJpZXNfY3N2IikNCmNvb3JkX3RhYmxlcyA8LSBjb29yZCAlPiUgaHRtbF90YWJsZShoZWFkZXIgPSBUUlVFLCBmaWxsID0gVFJVRSkNCmNvb3JkeSA8LSBjb29yZF90YWJsZXNbWzFdXQ0KY29sX21hcCA8LSBtZXJnZShtYXBfYWlpYiwgY29vcmR5LCBieS54PSAiaXNvX2EyIiwgYnkueSA9ICJjb3VudHJ5IiwgYWxsLnkgPSBUUlVFKQ0KDQptYXBfYWlpYiAlPiUNCiAgIyBmaWx0ZXIoZ2VvdW5pdCAhPSAiU2lhY2hlbiBHbGFjaWVyIikgJT4lDQogIGZpbHRlcihzdWJyZWdpb24gPT0gIkVhc3Rlcm4gQXNpYSIgfCBzdWJyZWdpb24gPT0gIlNvdXRoLUVhc3Rlcm4gQXNpYSIgfCBzdWJyZWdpb24gPT0gIlNvdXRoZXJuIEFzaWEiKSAlPiUNCiAgZ2dwbG90KCkgKw0KICBnZW9tX3NmKGFlcyhmaWxsID0gY2hpbmFhbGlnbm1lbnQpLA0KICAgICAgICAgICBwb3NpdGlvbiA9ICJpZGVudGl0eSIpICsNCiAgbGFicyhmaWxsPSdSdXNzaWFuIFNwaGVyZScpICsNCiAgIyBnZW9tX2xhYmVsKGFlcyhsb25naXR1ZGUrMSwgbGF0aXR1ZGUrMSwgbGFiZWwgPSBmYWN0b3IoZ2VvdW5pdCkpLCBzaXplID0gMykgKw0KICBnZ3RoZW1lczo6dGhlbWVfbWFwKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYmxhbmsiKSArDQogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiUmRCdSIpDQoNCmNvbF9tYXAgJT4lDQpmaWx0ZXIoY29udGluZW50ID09ICJBZnJpY2EiKSAlPiUgICBnZ3Bsb3QoKSArDQogIGdlb21fc2YoYWVzKGZpbGwgPSBjaGluYWFsaWdubWVudCksDQogICAgICAgICAgIHBvc2l0aW9uID0gImlkZW50aXR5IikgKw0KICBsYWJzKGZpbGw9J1J1c3NpYW4gU3BoZXJlJykgKw0KICBnZW9tX2xhYmVsKGFlcyhsb25naXR1ZGUrMSwgbGF0aXR1ZGUrMSwgbGFiZWwgPSBmYWN0b3IoZ2VvdW5pdCkpLCBzaXplID0gMykgKw0KICBnZ3RoZW1lczo6dGhlbWVfbWFwKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYmxhbmsiKSArDQogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiUmRCdSIpDQoNCnBseXI6OmNvdW50KG1hcF9haWliJHN1YnJlZ2lvbikNCg0KZXVyb3BlX2Nyb3BwZWQgPC0gc3RfY3JvcChtYXBfYWlpYiwgeG1pbiA9IC0yMCwgeG1heCA9IDQ1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW1pbiA9IDMwLCB5bWF4ID0gNzMpDQoNCmV1cm9wZV9jcm9wcGVkICU+JQ0KICBmaWx0ZXIoc3VicmVnaW9uID09ICJFYXN0ZXJuIEV1cm9wZSIgfCBzdWJyZWdpb24gPT0gIk5vcnRoZXJuIEV1cm9wZSIgfCBzdWJyZWdpb24gPT0gIlNvdXRoZXJuIEV1cm9wZSIgfCBzdWJyZWdpb24gPT0gIldlc3Rlcm4gRXVyb3BlIikgJT4lDQogIGdncGxvdCgpICsNCiAgZ2VvbV9zZihhZXMoZmlsbCA9IGNoaW5hYWxpZ25tZW50KSwNCiAgICAgICAgICAgcG9zaXRpb24gPSAiaWRlbnRpdHkiKSArDQogIGxhYnMoZmlsbD0nUnVzc2lhbiBTcGhlcmUnKSArDQogICMgZ2VvbV9sYWJlbChhZXMobG9uZ2l0dWRlKzEsIGxhdGl0dWRlKzEsIGxhYmVsID0gZmFjdG9yKGdlb3VuaXQpKSwgc2l6ZSA9IDMpICsNCiAgZ2d0aGVtZXM6OnRoZW1lX21hcCgpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJsYW5rIikgKw0KICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIlJkQnUiKQ0KDQoNCmBgYA0KDQoNCmBgYHtyfQ0KDQphaWliICU+JSANCiAgZmlsdGVyKGFpaWJtZW1iZXIgPT0gMSkgJT4lIA0KICBzZWxlY3QoY291bnRyeSkgJT4lIA0KICBrYmwoKSAlPiUNCiAga2FibGVfcGFwZXIoInN0cmlwZWQiLA0KICAgICAgICAgICAgICBmdWxsX3dpZHRoID0gRikNCg0KYGBgDQoNCg0KIyBDaGluZXNlIFB1YmxpYyBEaXBsb21hY3kgRWZmb3J0cyBhbmQgQWN0aXZpdGllcw0KDQoNCmBgYHtyIGVjaG8gPSBGQUxTRX0NCg0KY2hpbmFfcGQgPC0gcmVhZC5jc3YoIkM6L1VzZXJzL1BhdWxhL0Rlc2t0b3AvQ2hpbmVzZVB1YmxpY0RpcGxvbWFjeS5jc3YiKQ0KDQpgYGANCg0KDQpgYGB7cn0NCg0Kc292aWV0X2lyb25fY3VydGFpbl92ZWN0b3IgPC0gYygiQWxiYW5pYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCdWxnYXJpYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDemVjaCBSZXB1YmxpYyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG9sYW5kIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLb3Nvdm8iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJvbWFuaWEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkh1bmdhcnkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2xvdmFraWEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJvc25pYSBhbmQgSGVyemVnb3ZpbmEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ3JvYXRpYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYWNlZG9uaWEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1vbnRlbmVncm8iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlcmJpYSIpDQoNCnNvdmlldF9yZXB1YmxpY3NfdmVjdG9yIDwtIGMoIlJ1c3NpYSIsICJMaXRodWFuaWEiLCAiR2VvcmdpYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFc3RvbmlhIgksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMYXR2aWEiCSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVrcmFpbmUiCSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJlbGFydXMiCSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1vbGRvdmEiCSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkt5cmd5enN0YW4iLAkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlV6YmVraXN0YW4iLAkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRhamlraXN0YW4iLAkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFybWVuaWEiCSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF6ZXJiYWlqYW4iLAkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlR1cmttZW5pc3RhbiIsCQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUnVzc2lhIgksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLYXpha2hzdGFuIikNCg0KdGhlX2RmICU8PiUNCiAgZHBseXI6Om11dGF0ZShzb3ZpZXRfaXJvbl9jdXJ0YWluID0gaWZlbHNlKGNvdW50cnkueCAlaW4lIHNvdmlldF9pcm9uX2N1cnRhaW5fdmVjdG9yLCAxLCAwKSkgDQoNCnRoZV9kZiAlPD4lDQogIGRwbHlyOjptdXRhdGUoc292aWV0X3JlcHVibGljcyA9IGlmZWxzZShjb3VudHJ5LnggJWluJSBzb3ZpZXRfcmVwdWJsaWNzX3ZlY3RvciwgMSwgMCkpIA0KDQoNCnRoZV9kZiAlPD4lIG11dGF0ZShydXNfaW5mbHVlbmNlID0gaWZlbHNlKGNvdW50cnkueCA9PSAiUnVzc2lhIiwgMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHNvdmlldF9yZXB1YmxpY3MgPT0gMSwgMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzb3ZpZXRfaXJvbl9jdXJ0YWluID09IDEsIDEsIDApKSkpDQoNCmV1cmFzaWFuX2Rldl9iYW5rIDwtIGMoIlJ1c3NpYSIsICJBcm1lbmlhIiwgIkJlbGFydXMiLCAiS2F6YWtoc3RhbiIsICJLeXJneXN0YW4iLCAiVGFqaWtpc3RhbiIpDQoNCmJyaWNzIDwtIGMoIkJyYXppbCIsICJSdXNzaWEiLCAiSW5kaWEiLCAiQ2hpbmEiLCAiU291dGggQWZyaWNhIikNCg0KcWNjbSA8LSBjKCJDaGluYSIsICJBZmhnYW5pc3RhbiIsICJQYWtpc3RhbiIsICJUYWppa2lzdGFuIikNCg0KZm9ydW1fY2hpbmFfYWZyaWNhX2Nvb3AgPC0gYygiQ2hpbmEiLCAiQWxnZXJpYSIsICJBbmdvbGEiLCAiQmVuaW4iLCAiQm90c3dhbmEiLCAiQnVya2luYSBGYXNvIikNCg0KDQpgYGANCg0KDQpgYGB7ciwgZWNobyA9IEZBTFNFfQ0KIyANCiMgbWFwIDwtIG5lX2NvdW50cmllcyhzY2FsZSA9ICJtZWRpdW0iLCByZXR1cm5jbGFzcyA9ICJzZiIpDQojIA0KIyBtaW5pMTUgPC0gdGhlX2RmW3doaWNoKHRoZV9kZiR5ZWFyID09IDIwMTUpLF0NCiMgDQojIG1hcCRjb3dfY29kZSA8LSBjb3VudHJ5Y29kZShtYXAkbmFtZV9sb25nLCAiY291bnRyeS5uYW1lIiwgImNvd24iKQ0KIyAgDQojIG1hcDE1IDwtIG1lcmdlKG1hcCwgbWluaTE1LCBieSA9ICJjb3dfY29kZSIsIGFsbC54ID0gVFJVRSkNCiMgDQojIHJ1c3NpYV9jcm9wcGVkIDwtIHN0X2Nyb3AobWFwMTUsIHhtaW4gPSAtMjAsIHhtYXggPSAyMDAsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHltaW4gPSAxMCwgeW1heCA9IDE1MCkNCiMgDQojIHJ1c3NpYV9jcm9wcGVkICU+JSANCiMgICBnZ3Bsb3QoKSArDQojICAgZ2VvbV9zZihhZXMoZmlsbCA9IGFzLmZhY3RvcihydXNfaW5mbHVlbmNlKSksIA0KIyAgICAgICAgICAgIHBvc2l0aW9uID0gImlkZW50aXR5IikgKyANCiMgICAgbGFicyhmaWxsPSdSdXNzaWFuIFNwaGVyZScpICsgZ2d0aGVtZXM6OnRoZW1lX21hcCgpICsgDQojICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJsYW5rIikNCg0KbWFwICU+JSANCiAgc2VsZWN0KG5hbWUsIGlzbzNjID0gYnJrX2EzLCBjb250aW5lbnQsIHJlZ2lvbl93YiwgcmVnaW9uX3VuLCBzdWJ1bml0LCBpbmNvbWVfZ3JwLCBnZW9tZXRyeSkgLT4gbXlfbWFwDQoNCg0KDQpgYGANCg0KIyMgTWFraW5nIHZhcmlhYmxlcw0KDQojIyMjIFRyYWRlIG9wZW5uZXNzIGZvcm11bGE6DQoNCnRvdGFsIGV4cG9ydHMgYW5kIHRvdGFsIGltcG9ydHMgLyB0b3RhbCBHRFANCg0KDQojIyMjIFVTIGRlcGVuZGVuY2UgZm9ybXVsYToNCg0KZXhwb3J0cyB0byBVUyBhbmQgaW1wb3J0cyBmcm9tIFVTIC8gdG90YWwgZXhwb3J0cyBhbmQgdG90YWwgaW1wb3J0cw0KDQoNCmBgYHtyIHBlcl9jYXBpdGFfdmFyaWFibGVzfQ0KDQp0aGVfZGYkY291bnRyeSA8LSB0aGVfZGYkY291bnRyeS54DQp0aGVfZGYkY291bnRyeS55IDwtIE5VTEwNCg0KdGhlX2RmICU+JSANCiAgbXV0YXRlKGJ1ZGdldF9wYyA9IGJ1ZGdldCAvIHBvcCwgbmEucm0gPSBUUlVFKSAlPiUNCiAgbXV0YXRlKGV4cG9ydHNfcGMgPSBleHBvcnRzX2JvcCAvIHBvcCwgbmEucm0gPSBUUlVFKSAlPiUgDQogIG11dGF0ZShiYWxhbmNlX3RyYWRlID0gZXhwb3J0c19ib3AgKyBpbXBvcnRzX2JvcCwgbmEucm0gPSBUUlVFKSAlPiUgDQogIG11dGF0ZSh0cmFkZV9vcGVuZXNzID0gYmFsYW5jZV90cmFkZSAvIGdkcF9jb25zdCwgbmEucm0gPSBUUlVFKSAlPiUgDQogIG11dGF0ZSh1c19iYWxhbmNlX3RyYWRlID0gdXNfZXhwb3J0c190b19jb3VudHJ5ICsgdXNfaW1wb3J0c19mcm9tX2NvdW50cnksIG5hLnJtID0gVFJVRSkgJT4lIA0KICBtdXRhdGUodXNfdHJhZGVfZGVwZW5kZW5jZSA9IHVzX2JhbGFuY2VfdHJhZGUgLyBiYWxhbmNlX3RyYWRlLCBuYS5ybSA9IFRSVUUpICU+JSANCiAgbXV0YXRlKHVzX2V4cG9ydHNfcGMgPSB1c19leHBvcnRzX3RvX2NvdW50cnkgLyBwb3AsIG5hLnJtID0gVFJVRSkgJT4lIA0KICBtdXRhdGUobXVzbGltX3BlcmNlbnQgPSBwZXJjZW50X211c2xpbV9qaXR0ZXIgLyBwb3AsIG5hLnJtID0gVFJVRSkgJT4lIA0KICBtdXRhdGUodXNfaW1wb3J0c19wYyA9IHVzX2ltcG9ydHNfZnJvbV9jb3VudHJ5IC8gcG9wLCBuYS5ybSA9IFRSVUUpIC0+IHRoZV9kZg0KDQoNCmBgYA0KDQoNCiMjIFVTIFRyYWRlIERlcGVuZGVuY2UNCg0KYGBge3J9DQoNCnRoZV9kZiAlPiUgDQogIHNlbGVjdChjb3VudHJ5LCB5ZWFyLCB1c190cmFkZV9kZXBlbmRlbmNlKSAlPiUgDQogIGZpbHRlcih1c190cmFkZV9kZXBlbmRlbmNlID4gMC4xKSAlPiUgDQogIGFycmFuZ2UoZGVzYyh1c190cmFkZV9kZXBlbmRlbmNlKSkgJT4lDQogIGZpbHRlcih5ZWFyID09IDIwMTkpICU+JSANCiAgZmlsdGVyKHVzX3RyYWRlX2RlcGVuZGVuY2UgPiAwLjMpICU+JSANCiAga2JsKCkgJT4lDQogIGthYmxlX3BhcGVyKCJzdHJpcGVkIiwNCiAgICAgICAgICAgICAgZnVsbF93aWR0aCA9IEYpDQoNCnRoZV9kZiAlPiUgDQogIGZpbHRlcihnZHBfY29uc3QgPiA1MDAwMDAwMDAwMDApICU+JSANCiAgc2VsZWN0KGNvdW50cnksIHllYXIsIHVzX3RyYWRlX2RlcGVuZGVuY2UpICU+JSANCiAgYXJyYW5nZShkZXNjKHVzX3RyYWRlX2RlcGVuZGVuY2UpKSAlPiUNCiAgIyBmaWx0ZXIodXNfdHJhZGVfZGVwZW5kZW5jZSA+IDAuMikgJT4lIA0KICBnZ3Bsb3QoYWVzKHkgPSB1c190cmFkZV9kZXBlbmRlbmNlLA0KICAgICAgICAgICAgIHggPSByZW9yZGVyKGNvdW50cnksIHVzX3RyYWRlX2RlcGVuZGVuY2UpLCBmaWxsID0gY291bnRyeSkpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgZ2VvbV9oaXN0b2dyYW0oc3RhdCA9ICJpZGVudGl0eSIpICsgZ2d0aGVtZXM6OnRoZW1lX3BhbmRlcigpICsNCiAgZmFjZXRfZ3JpZCh+eWVhciwgc2NhbGVzID0gImZyZWUiKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyANCiAgZ2d0aXRsZSgiTGV2ZWwgb2YgdHJhZGUgZGVwZW5kZW5jZSBpbiBjb3VudHJpZXMgb3ZlciA1MDAgbWlsbGlvbiBHRFAiKSArIHhsYWIoIiIpICsgeWxhYigiUGVyY2VudGFnZSBvZiB0b3RhbCB0cmFkZSB0aGF0IGlzIHdpdGggVVMiKQ0KDQpgYGANCg0KIyMgRGl2aWRlIGJ1ZGdldCBieSBjb3N0IG9mIGxpdmluZw0KDQpgYGB7cn0NCnVybCA8LSAiaHR0cHM6Ly93d3cubnVtYmVvLmNvbS9jb3N0LW9mLWxpdmluZy9yYW5raW5nc19ieV9jb3VudHJ5LmpzcD90aXRsZT0yMDE5Ig0KDQoNCiMgQ291bnRyaWVzIHdpdGggbm8gSU5ERVgNCg0KDQoNCmNvbF91cmwgPC0gcmVhZF9odG1sKHVybCkNCmNvbF90YWJsZSA8LSBjb2xfdXJsICU+JSBodG1sX3RhYmxlKGhlYWRlciA9IFRSVUUsIGZpbGwgPSBUUlVFKQ0KY29sXzE5IDwtIGNvbF90YWJsZVtbMl1dDQoNCmNvbF8xOSR5ZWFyIDwtIHJlcGxpY2F0ZSgxMTksIDIwMTkpDQpjb2xfMTkkcmFuayA8LSBOVUxMDQpjb2xfMTkgJTw+JSANCiAgY2xlYW5fbmFtZXMoKQ0KDQpjb2xfMTkkY293X2NvZGUgPC0gY291bnRyeWNvZGUoY29sXzE5JGNvdW50cnksICJjb3VudHJ5Lm5hbWUiLCAiY293biIpDQoNCmNvbF8xOSAlPD4lIGRwbHlyOjptdXRhdGUoY293X2NvZGUgPSBpZmVsc2UoY291bnRyeSA9PSAiUGFsZXN0aW5lIiwgNjY2NiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGNvdW50cnkgPT0gIlNlcmJpYSIsIDM0NSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoY291bnRyeSA9PSAiSG9uZyBLb25nIiwgOTk3LCBjb3dfY29kZSkpKSkNCg0KY29sXzE5ICU+JSANCiAgYXJyYW5nZShkZXNjKGNvc3Rfb2ZfbGl2aW5nX2luZGV4KSkgJT4lIA0KICBmaWx0ZXIoY29zdF9vZl9saXZpbmdfaW5kZXggPiA2NSkgJT4lIA0KICBoZWFkKCkgJT4lIA0KICBrYmwoKSAlPiUNCiAga2FibGVfcGFwZXIoInN0cmlwZWQiLA0KICAgICAgICAgICAgICBmdWxsX3dpZHRoID0gRikNCg0KDQpgYGANCg0KDQojIEV4YW1pbmluZyAyMDE5IGNvc3Qgb2YgbGl2aW5nIGFkanVzdG1lbnQNCg0KYGBge3J9DQoNCiMgZGZfMTkgPC0gdGhlX2RmICU+JSANCiMgICBmaWx0ZXIoeWVhciA9PSAyMDE5KQ0KIyANCiMgDQojIGRmXzE5IDwtIG1lcmdlKGRmXzE5LCBjb2xfMTksIGJ5ID0gYygiY293X2NvZGUiKSwgYWxsLnggPSBUUlVFKQ0KIyANCiMgb3B0aW9ucyhzY2lwZW4gPSA5OTkpDQojIA0KIyANCiMgDQojIGRmXzE5ICU+JSAgDQojICAgIyBtdXRhdGUoY29zdF9saXZpbmdfcGVyY2VudCA9IGNvc3Rfb2ZfbGl2aW5nX2luZGV4IC8gMTAwLCBuYS5ybSA9IFRSVUUpICU+JSANCiMgICBtdXRhdGUoYWRqX2J1ZGdldCA9IGJ1ZGdldCAvIGNvc3Rfb2ZfbGl2aW5nX2luZGV4KSAlPiUgDQojICAgc2VsZWN0KGNvdW50cnkgPSBjb3VudHJ5LngsIGFkal9idWRnZXQsIGJ1ZGdldCkgJT4lIA0KIyAgIGFycmFuZ2UoZGVzYyhhZGpfYnVkZ2V0KSkgLT4gdDENCiMgDQojIGRmXzE5ICU+JSAgDQojICAgIyBtdXRhdGUoY29zdF9saXZpbmdfcGVyY2VudCA9IGNvc3Rfb2ZfbGl2aW5nX2luZGV4IC8gMTAwLCBuYS5ybSA9IFRSVUUpICU+JSANCiMgICBtdXRhdGUoYWRqX2J1ZGdldCA9IGJ1ZGdldCAvIGNvc3Rfb2ZfbGl2aW5nX2luZGV4KSAlPiUgDQojICAgc2VsZWN0KGNvdW50cnkgPSBjb3VudHJ5LngsIGJ1ZGdldCwgYWRqX2J1ZGdldCkgJT4lIA0KIyAgIGFycmFuZ2UoZGVzYyhidWRnZXQpKSAtPiB0Mg0KIyANCiMga2JsKGxpc3QodDEsIHQyKSwgZGlnaXRzID0gMCwgY2FwdGlvbiA9ICJBcnJhbmdlZCBCeSBBZGp1c3RlZCBCdWRnZXQgTEVGVCBhbmQgQnkgUmF3IEJ1ZGdldCBSSUdIVCIpICU+JQ0KIyAgICBrYWJsZV9wYXBlcigic3RyaXBlZCIsDQojICAgICAgICAgICAgICAgIGZ1bGxfd2lkdGggPSBUKQ0KDQpgYGANCg0KIyBQdXJjaGFzZSBQb3dlciBQYXJpdHkNCiANClNvdXJjZTogaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1BBLk5VUy5QUFBDLlJGDQoNClByaWNlIGxldmVsIHJhdGlvIGlzIHRoZSByYXRpbyBvZiBhIHB1cmNoYXNpbmcgcG93ZXIgcGFyaXR5IChQUFApIGNvbnZlcnNpb24gZmFjdG9yIHRvIGFuIGV4Y2hhbmdlIHJhdGUuIEl0IHByb3ZpZGVzIGEgbWVhc3VyZSBvZiB0aGUgZGlmZmVyZW5jZXMgaW4gcHJpY2UgbGV2ZWxzIGJldHdlZW4gY291bnRyaWVzIGJ5IGluZGljYXRpbmcgdGhlIG51bWJlciBvZiB1bml0cyBvZiB0aGUgY29tbW9uIGN1cnJlbmN5IG5lZWRlZCB0byBidXkgdGhlIHNhbWUgdm9sdW1lIG9mIHRoZSBhZ2dyZWdhdGlvbiBsZXZlbCBpbiBlYWNoIGNvdW50cnkuDQoNCkluZGljYXRvciBzb3VyY2U6IA0KSW50ZXJuYXRpb25hbCBDb21wYXJpc29uIFByb2dyYW0sIFdvcmxkIEJhbmsNCg0KDQpgYGB7cn0NCiMgDQojIGxpYnJhcnkoV0RJKQ0KIyANCiMgcHBwID0gV0RJKGluZGljYXRvcj0nUEEuTlVTLlBQUEMuUkYnLCBjb3VudHJ5PSJhbGwiLCBzdGFydD0yMDE5LCBlbmQ9MjAxOSkNCiMgcHBwJHBwcCA8LSBwcHAkUEEuTlVTLlBQUEMuUkYNCiMgcHBwJFBBLk5VUy5QUFBDLlJGIDwtIE5VTEwNCiMgDQojIFZpZXcocHBwKQ0KIyANCiMgcHBwJGNvd19jb2RlIDwtIGNvdW50cnljb2RlKHBwcCRpc28yYywgImlzbzJjIiwgImNvd24iKQ0KIyANCiMgcHBwICU8PiUgDQojIGRwbHlyOjptdXRhdGUoY293X2NvZGUgPSBpZmVsc2UoY291bnRyeSA9PSAiV2VzdCBCYW5rIGFuZCBHYXphIiwgNjY2NiwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGNvdW50cnkgPT0gIlNlcmJpYSIsIDM0NSwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShjb3VudHJ5ID09ICJIb25nIEtvbmcgU0FSLCBDaGluYSIsIDk5NywgY293X2NvZGUpKSkpDQojIA0KIyBwcHAkY291bnRyeSA8LSBOVUxMDQojIA0KIyANCiMgdHJ5ICU8PiUgIA0KIyAgIGZpbHRlcighaXMubmEoY293X2NvZGUpKSAlPiUgDQojICAgbXV0YXRlKHBwcF9idWRnZXRfZGl2ID0gYnVkZ2V0IC8gcHBwKSAlPiUgDQojICAgbXV0YXRlKHBwcF9idWRnZXRfbXVsID0gYnVkZ2V0ICogcHBwKSAlPiUgDQojICAgZmlsdGVyKGNvdW50cnkueCAhPSAiS29zb3ZvIikgJT4lIA0KIyAgIHNlbGVjdChjb3VudHJ5LngsIGJ1ZGdldCwgcHBwLCBjb3dfY29kZSwgcHBwX2J1ZGdldF9kaXYscHBwX2J1ZGdldF9tdWwgKSAtPiBoaQ0KIyANCiMgVmlldyhoaSkNCiMgDQojIHRyeSAlPiUgDQojICAgZ3JvdXBfYnkoY291bnRyeS54KSAlPiUgDQojICAgbXV0YXRlKHBwcF9idWRnZXQgPSBidWRnZXQgLyBwcHApICU+JSANCiMgICBzZWxlY3QoY291bnRyeSA9IGNvdW50cnkueCwgcHBwX2J1ZGdldCwgcmF3X2J1ZGdldCA9IGJ1ZGdldCkgJT4lIA0KIyAgIGFycmFuZ2UoZGVzYyhwcHBfYnVkZ2V0KSkgLT4gdDMgDQojIA0KIyB0cnkgJT4lIA0KIyAgIGdyb3VwX2J5KGNvdW50cnkueCkgJT4lIA0KIyAgIG11dGF0ZShwcHBfYnVkZ2V0ID0gYnVkZ2V0IC8gcHBwKSAlPiUgDQojICAgc2VsZWN0KGNvdW50cnkueCwgcmF3X2J1ZGdldCA9IGJ1ZGdldCwgcHBwX2J1ZGdldCkgJT4lIA0KIyAgIGFycmFuZ2UoZGVzYyhyYXdfYnVkZ2V0KSkgLT4gdDQNCiMgDQojIGtibChsaXN0KHQzLCB0NCksIGRpZ2l0cyA9IDAsIGNhcHRpb24gPSAiQXJyYW5nZWQgQnkgUFBQIEFkanVzdGVkIEJ1ZGdldCBMRUZUIGFuZCBCeSBQUFAgUmF3IEJ1ZGdldCBSSUdIVCIpICU+JQ0KIyAgICBrYWJsZV9wYXBlcigic3RyaXBlZCIsDQojICAgICAgICAgICAgICAgIGZ1bGxfd2lkdGggPSBUKQ0KDQpgYGANCg0KYGBge3J9DQoNCiMgY29sICU8PiUgDQojICAgc2VsZWN0KGNvd19jb2RlLCB5ZWFyLCBldmVyeXRoaW5nKCkpIA0KIyANCiMgDQojIHVybCA8LSAiaHR0cHM6Ly93d3cubnVtYmVvLmNvbS9jb3N0LW9mLWxpdmluZy9yYW5raW5nc19ieV9jb3VudHJ5LmpzcD90aXRsZT0yMDE4Ig0KIyANCiMgY29sX3VybCA8LSByZWFkX2h0bWwodXJsKQ0KIyBjb2xfdGFibGUgPC0gY29sX3VybCAlPiUgaHRtbF90YWJsZShoZWFkZXIgPSBUUlVFLCBmaWxsID0gVFJVRSkNCiMgY29sXzE4IDwtIGNvbF90YWJsZVtbMl1dDQojIA0KIyBjb2xfMTgkeWVhciA8LSByZXBsaWNhdGUoMTE1LCAyMDE4KQ0KIyANCiMgY29sXzE4ICU8PiUgDQojICAgY2xlYW5fbmFtZXMoKQ0KIyANCiMgY29sXzE4JGNvd19jb2RlIDwtIGNvdW50cnljb2RlKGNvbF8xOCRjb3VudHJ5LCAiY291bnRyeS5uYW1lIiwgImNvd24iKQ0KIyAjIFNvbWUgdmFsdWVzIHdlcmUgbm90IG1hdGNoZWQgdW5hbWJpZ3VvdXNseTogQmVybXVkYSwgSG9uZyBLb25nLCBKZXJzZXksIE1hY2FvLCBQYWxlc3RpbmUsIFB1ZXJ0byBSaWNvLCBTZXJiaWENCiMgDQojIGNvbF8xOCAlPD4lIGRwbHlyOjptdXRhdGUoY293X2NvZGUgPSBpZmVsc2UoY291bnRyeSA9PSAiUGFsZXN0aW5lIiwgNjY2NiwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoY291bnRyeSA9PSAiU2VyYmlhIiwgMzQ1LCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGNvdW50cnkgPT0gIkhvbmcgS29uZyIsIDk5NywgY293X2NvZGUpKSkpDQojIGNvbCAlPD4lIA0KIyAgIHNlbGVjdChjb3dfY29kZSwgeWVhciwgZXZlcnl0aGluZygpKSANCg0KYGBgDQoNCg0KDQojIyBBZGp1c3QgcHJpY2VzIHRvIDIwMTQgcHJpY2VzDQoNCmBgYHtyIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQ0KDQpjb3VudHJ5IDwtICJVbml0ZWQgU3RhdGVzIg0KY291bnRyaWVzX2RhdGFmcmFtZSA8LSBzaG93X2NvdW50cmllcygpDQppbmZsYXRpb25fZGF0YWZyYW1lIDwtIHJldHJpZXZlX2luZmxhdGlvbl9kYXRhKGNvdW50cnksIGNvdW50cmllc19kYXRhZnJhbWUpDQoNCiMgUHJvdmlkZSBhIFdvcmxkIEJhbmsgQVBJIFVSTCBhbmQgYHVybF9hbGxfcmVzdWx0c2Agd2lsbCBjb252ZXJ0IGl0IGludG8gb25lIHdpdGggYWxsIHJlc3VsdHMgZm9yIHRoYXQgaW5kaWNhdG9yDQpvcmlnaW5hbF91cmwgPC0gImh0dHA6Ly9hcGkud29ybGRiYW5rLm9yZy92Mi9jb3VudHJ5IiANCg0KIyAiaHR0cDovL2FwaS53b3JsZGJhbmsub3JnL3YyL2NvdW50cnk/Zm9ybWF0PWpzb24mcGVyX3BhZ2U9MzA0Ig0KdXJsX2FsbF9yZXN1bHRzKG9yaWdpbmFsX3VybCkNCg0KdGhlX2RmJGJ1ZGdldF9jb25zdCA8LSBhZGp1c3RfZm9yX2luZmxhdGlvbih0aGVfZGYkYnVkZ2V0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZV9kZiR5ZWFyLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9fZGF0ZSA9IDIwMTQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZsYXRpb25fZGF0YWZyYW1lID0gaW5mbGF0aW9uX2RhdGFmcmFtZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cmllc19kYXRhZnJhbWUgPSBjb3VudHJpZXNfZGF0YWZyYW1lKQ0KDQp0aGVfZGYkYnVkZ2V0X3BjX2NvbnN0IDwtIGFkanVzdF9mb3JfaW5mbGF0aW9uKHRoZV9kZiRidWRnZXRfcGMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZV9kZiR5ZWFyLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9fZGF0ZSA9IDIwMTQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZsYXRpb25fZGF0YWZyYW1lID0gaW5mbGF0aW9uX2RhdGFmcmFtZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cmllc19kYXRhZnJhbWUgPSBjb3VudHJpZXNfZGF0YWZyYW1lKQ0KDQoNCmBgYA0KDQojIyBFY29ub21pYyBmYWN0b3JzIA0KDQojIyMgUEQgQnVkZ2V0IHBlciBjYXBpdGEgYW5kIFVTIGV4cG9ydHMgcGVyIGNhcGl0YSB0byB0aGUgY291bnRyeQ0KDQojIyMjIEFjcm9zcyB0aGUgeWVhcnMNCg0KYGBge3J9DQoNCnRoZV9kZiAlPiUNCiAgIyBmaWx0ZXIocG9wID4gMTAwMDAwMCkgJT4lIA0KICBnZ3Bsb3QoYWVzKHkgPSBsb2coYnVkZ2V0X2NvbnN0KSwgeCA9IGxvZyh1c19leHBvcnRzX3BjKSkpICsgDQogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAiIzlkMDIwOCIsIHNlID0gRkFMU0UpICsNCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBhcy5mYWN0b3IocmVnaW9uXzYpLCBzaGFwZSA9IGFzLmZhY3RvcihyZWdpb25fNikpKSArIGZhY2V0X3dyYXAofnllYXIpICsgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjMjE5ZWJjIiwgIiMyNjQ2NTMiLCAiIzQzYWE4YiIsICIjNmQ1OTdhIiwgIiNlNjM5NDYiLCAiI2Y0YTI2MSIpLA0KICAgICAgICAgICAgICAgICAgIG5hbWUgPSBOVUxMKSArDQogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE1LDE2LDE3LDE4LDE5LDEwKSwNCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBOVUxMKSArDQogIGdndGl0bGUoIkV4cG9ydHMgZnJvbSBVUyBwZXIgY2FwaXRhIHZzIFBEIGJ1ZGdldCBwZXIgY2FwaXRhIikgKyANCiAgeGxhYigiTG9nZ2VkIFVTIGV4cG9ydHMgcGVyIGNhcGl0YSIpICsNCiAgeWxhYigiTG9nZ2VkIFBEIGJ1ZGdldCBwZXIgY2FwaXRhIikgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImxlZnQiKSArIGdndGhlbWVzOjp0aGVtZV9wYW5kZXIoKQ0KDQpgYGANCg0KDQoNCiMjIyMgT25seSBmb3IgMjAxOQ0KDQpgYGB7cn0NCg0KdGhlX2RmICU+JQ0KICAjIGZpbHRlcihwb3AgPiAxMDAwMDAwKSAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMTgpICU+JSANCiAgZ2dwbG90KGFlcyh5ID0gbG9nKGJ1ZGdldF9jb25zdCksIHggPSBsb2codXNfZXhwb3J0c19wYyksIGdyb3VwID0gYXMuZmFjdG9yKHJlZ2lvbl82KSkpICsgDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gIiM5ZDAyMDgiLCBzZSA9IEZBTFNFKSArDQogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gYXMuZmFjdG9yKHJlZ2lvbl82KSwgc2hhcGUgPSBhcy5mYWN0b3IocmVnaW9uXzYpKSkgKyANCiAgZmFjZXRfd3JhcCh+cmVnaW9uXzYpICsgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjMjE5ZWJjIiwgIiMyNjQ2NTMiLCAiIzQzYWE4YiIsICIjNmQ1OTdhIiwgIiNlNjM5NDYiLCAiI2Y0YTI2MSIpLA0KICAgICAgICAgICAgICAgICAgIG5hbWUgPSBOVUxMKSArDQogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE1LDE2LDE3LDE4LDE5LDEwKSwNCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBOVUxMKSArDQogIGdndGl0bGUoIkV4cG9ydHMgcGVyIGNhcGl0YSB2cyBQRCBidWRnZXQgcGVyIGNhcGl0YSBpbiAyMDE5IikgKyANCiAgeGxhYigiTG9nZ2VkIFVTIGV4cG9ydHMgcGVyIGNhcGl0YSIpICsNCiAgeWxhYigiTG9nZ2VkIFBEIGJ1ZGdldCBwZXIgY2FwaXRhIikgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImxlZnQiKSArIGdndGhlbWVzOjp0aGVtZV9wYW5kZXIoKQ0KDQpgYGANCg0KIyBUcmFkZSBvcGVubmVzcw0KDQpUb3RhbCBleHBvcnQgYW5kIHRvdGFsIGltcG9ydHMgZGl2aWRlZCBieSB0b3RhbCBHRFANCg0KIyMgQWNyb3NzIHRoZSB5ZWFycw0KDQpgYGB7cn0NCg0KdGhlX2RmICU+JQ0KICAjIGZpbHRlcihwb3AgPiAxMDAwMDAwKSAlPiUgDQogIGdncGxvdChhZXMoeSA9IGxvZyhidWRnZXRfY29uc3QpLCB4ID1sb2codHJhZGVfb3BlbmVzcykpKSArIA0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2xvciA9ICIjOWQwMjA4Iiwgc2UgPSBGQUxTRSkgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGFzLmZhY3RvcihyZWdpb25fNiksIHNoYXBlID0gYXMuZmFjdG9yKHJlZ2lvbl82KSkpICsgZmFjZXRfd3JhcCh+eWVhcikgKyANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiMyMTllYmMiLCAiIzI2NDY1MyIsICIjNDNhYThiIiwgIiM2ZDU5N2EiLCAiI2U2Mzk0NiIsICIjZjRhMjYxIiksDQogICAgICAgICAgICAgICAgICAgbmFtZSA9IE5VTEwpICsNCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTUsMTYsMTcsMTgsMTksMTApLA0KICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IE5VTEwpICsNCiAgZ2d0aXRsZSgiVHJhZGUgb3BlbmVzcyB2cyBQRCBidWRnZXQgcGVyIGNhcGl0YSIpICsgDQogIHhsYWIoIlRyYWRlIG9wZW5lc3MiKSArDQogIHlsYWIoIkxvZ2dlZCBQRCBidWRnZXQgcGVyIGNhcGl0YSIpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJsZWZ0IikgKyANCiAgZ2d0aGVtZXM6OnRoZW1lX3BhbmRlcigpDQoNCmBgYA0KDQojIyMgT25seSBmb3IgMjAxOQ0KDQpgYGB7cn0NCg0KdGhlX2RmICU+JQ0KICBmaWx0ZXIoeWVhciA9PSAyMDE5KSAlPiUgDQogIGdncGxvdChhZXMoeSA9IGxvZyhidWRnZXRfY29uc3QpLCB4ID0gbG9nKHRyYWRlX29wZW5lc3MpKSkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2xvciA9ICIjOWQwMjA4Iiwgc2UgPSBGQUxTRSkgKw0KICAjIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb3VudHJ5LCBjb2xvciA9IGFzLmZhY3RvcihyZWdpb25fNikpLCBzaXplID0gMykgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGFzLmZhY3RvcihyZWdpb25fNiksIHNoYXBlID0gYXMuZmFjdG9yKHJlZ2lvbl82KSkpICsgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjMjE5ZWJjIiwgIiMyNjQ2NTMiLCAiIzQzYWE4YiIsICIjNmQ1OTdhIiwgIiNlNjM5NDYiLCAiI2Y0YTI2MSIpLA0KICAgICAgICAgICAgICAgICAgIG5hbWUgPSBOVUxMKSArDQogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE1LDE2LDE3LDE4LDE5LDEwKSwNCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBOVUxMKSArDQogIGdndGl0bGUoIlRyYWRlIG9wZW5lc3MgdnMgUEQgYnVkZ2V0IHBlciBjYXBpdGEgaW4gMjAxOSIpICsNCiAgZmFjZXRfd3JhcCh+cmVnaW9uXzYpICsgDQogIHhsYWIoIlRyYWRlIG9wZW5uZXNzIikgKw0KICB5bGFiKCJMb2dnZWQgUEQgYnVkZ2V0IHBlciBjYXBpdGEiKSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibGVmdCIpICsgZ2d0aGVtZXM6OnRoZW1lX3BhbmRlcigpDQoNCmBgYA0KDQoNCiMgSW5mYW50IG1vcnRhbGl0eQ0KDQpJbmZhbnQgbW9ydGFsaXR5IGlzIGEgcHJveHkgZm9yIHBvdmVydHkgbGV2ZWxzOiBudW1iZXIgb2YgaW5mYW50IGRlYXRocyBwZXIgdGhvdXNhbmQgbGl2ZSBiaXJ0aHMNCg0KIyMjIEFjcm9zcyB0aGUgeWVhcnMNCg0KYGBge3J9DQoNCnRoZV9kZiAlPiUNCiAgIyBmaWx0ZXIocG9wID4gMTAwMDAwMCkgJT4lIA0KICBmaWx0ZXIoeWVhciA8IDIwMTgpICU+JSANCiAgZ2dwbG90KGFlcyh5ID0gbG9nKGJ1ZGdldF9jb25zdCksIHggPSBsb2coaW5mYW50X21vcnQpLCBncm91cCA9IGFzLmZhY3RvcihyZWdpb25fNikpKSArIA0KICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGFzLmZhY3RvcihyZWdpb25fNiksIHNoYXBlID0gYXMuZmFjdG9yKHJlZ2lvbl82KSkpICsgZmFjZXRfd3JhcCh+eWVhcikgKyANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiMyMTllYmMiLCAiIzI2NDY1MyIsICIjNDNhYThiIiwgIiM2ZDU5N2EiLCAiI2U2Mzk0NiIsICIjZjRhMjYxIiksDQogICAgICAgICAgICAgICAgICAgbmFtZSA9IE5VTEwpICsNCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTUsMTYsMTcsMTgsMTksMTApLA0KICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IE5VTEwpICsNCiAgZ2d0aXRsZSgiSW5mYW50IG1vcnRhbGl0eSBhZ2UgdnMgUEQgYnVkZ2V0IHBlciBjYXBpdGEiKSArIA0KICB4bGFiKCJEZWF0aHMgcGVyIHRob3VzYW5kIHVuZGVyIDUiKSArDQogIHlsYWIoIkxvZ2dlZCBQRCBidWRnZXQgcGVyIGNhcGl0YSIpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJsZWZ0IikgKyBnZ3RoZW1lczo6dGhlbWVfcGFuZGVyKCkNCg0KYGBgDQoNCiMjIyBPbmx5IGZvciAyMDE5DQoNCmBgYHtyfQ0KDQp0aGVfZGYgJT4lDQogIGZpbHRlcih5ZWFyID09IDIwMTUpICU+JSANCiAgZ2dwbG90KGFlcyh5ID0gbG9nKGJ1ZGdldF9jb25zdCksIHggPSBpbmZhbnRfbW9ydCwgZ3JvdXAgPSBhcy5mYWN0b3IocmVnaW9uXzYpKSkgKyANCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAiIzlkMDIwOCIsIHNlID0gRkFMU0UpICsNCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBhcy5mYWN0b3IocmVnaW9uXzYpLCBzaGFwZSA9IGFzLmZhY3RvcihyZWdpb25fNikpKSArDQogIGZhY2V0X3dyYXAofnJlZ2lvbl82KSArIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiIzIxOWViYyIsICIjMjY0NjUzIiwgIiM0M2FhOGIiLCAiIzZkNTk3YSIsICIjZTYzOTQ2IiwgIiNmNGEyNjEiKSwNCiAgICAgICAgICAgICAgICAgICBuYW1lID0gTlVMTCkgKw0KICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxNSwxNiwxNywxOCwxOSwxMCksDQogICAgICAgICAgICAgICAgICAgICBuYW1lID0gTlVMTCkgKw0KICBnZ3RpdGxlKCJJbmZhbnQgbW9ydGFsaXR5IHZzIFBEIGJ1ZGdldCBwZXIgY2FwaXRhIGluIDIwMTkiKSArIA0KICB4bGFiKCJJbmZhbnQgbW9ydGFsaXR5IikgKw0KICB5bGFiKCJMb2dnZWQgUEQgYnVkZ2V0IHBlciBjYXBpdGEiKSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibGVmdCIpICsgZ2d0aGVtZXM6OnRoZW1lX3BhbmRlcigpDQoNCmBgYA0KDQoNCg0KIyBHRFAgcGVyIGNhcGl0YQ0KDQojIyMgQWNyb3NzIHRoZSB5ZWFycw0KDQpgYGB7cn0NCg0KdGhlX2RmICU+JQ0KICBnZ3Bsb3QoYWVzKHkgPSBsb2coYnVkZ2V0X2NvbnN0KSwgeCA9IGxvZyhnZHBfcGNfY29uc3QpLCBncm91cCA9IGFzLmZhY3RvcihyZWdpb25fNikpKSArIA0KICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGFzLmZhY3RvcihyZWdpb25fNiksIHNoYXBlID0gYXMuZmFjdG9yKHJlZ2lvbl82KSkpICsgZmFjZXRfd3JhcCh+eWVhcikgKyANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiMyMTllYmMiLCAiIzI2NDY1MyIsICIjNDNhYThiIiwgIiM2ZDU5N2EiLCAiI2U2Mzk0NiIsICIjZjRhMjYxIiksDQogICAgICAgICAgICAgICAgICAgbmFtZSA9IE5VTEwpICsNCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTUsMTYsMTcsMTgsMTksMTApLA0KICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IE5VTEwpICsNCiAgZ2d0aXRsZSgiTG9nZ2VkIEdEUCBwZXIgY2FwaXRhIGFuZCBsb2dnZWQgUEQgYnVkZ2V0IHBlciBjYXBpdGEiKSArIA0KICB4bGFiKCJMb2dnZWQgR0RQIHBlciBjYXBpdGEiKSArDQogIHlsYWIoIkxvZ2dlZCBQRCBidWRnZXQgcGVyIGNhcGl0YSIpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJsZWZ0IikgKyBnZ3RoZW1lczo6dGhlbWVfcGFuZGVyKCkNCg0KYGBgDQoNCiMjIyBPbmx5IGZvciAyMDE5DQoNCmBgYHtyfQ0KDQp0aGVfZGYgJT4lDQogIGZpbHRlcih5ZWFyID09IDIwMTkpICU+JSANCiAgZ2dwbG90KGFlcyh5ID0gbG9nKGJ1ZGdldF9jb25zdCksIHggPSBsb2coZ2RwX3BjX2NvbnN0KSwgZ3JvdXAgPSBhcy5mYWN0b3IocmVnaW9uXzYpKSkgKyANCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAiIzlkMDIwOCIsIHNlID0gRkFMU0UpICsNCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBhcy5mYWN0b3IocmVnaW9uXzYpLCBzaGFwZSA9IGFzLmZhY3RvcihyZWdpb25fNikpKSArIA0KICBmYWNldF93cmFwKH5yZWdpb25fNikgKyANCnNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjMjE5ZWJjIiwgIiMyNjQ2NTMiLCAiIzQzYWE4YiIsICIjNmQ1OTdhIiwgIiNlNjM5NDYiLCAiI2Y0YTI2MSIpLA0KICAgICAgICAgICAgICAgICAgIG5hbWUgPSBOVUxMKSArDQogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE1LDE2LDE3LDE4LDE5LDEwKSwNCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBOVUxMKSArDQogIGdndGl0bGUoIkdEUCBwZXIgY2FwaXRhIHZzIFBEIGJ1ZGdldCBwZXIgY2FwaXRhIGluIDIwMTkiKSArIA0KICB5bGFiKCJMb2dnZWQgR0RQIHBlciBjYXBpdGEiKSArDQogIHhsYWIoIkxvZ2dlZCBQRCBidWRnZXQgcGVyIGNhcGl0YSIpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJsZWZ0IikgKyBnZ3RoZW1lczo6dGhlbWVfcGFuZGVyKCkNCg0KYGBgDQoNCg0KIyBQb2xpdHkgSW5kZXgNCg0KIyMjIEFjcm9zcyB0aGUgeWVhcnMNCg0KRXZpZGVuY2Ugb2YgYSBVIHNoYXBlZCByZWxhdGlvbnNoaXA/IE1vcmUgcHJvbm91bmNlZCBhcyB5ZWFycyBnbyBvbi4NCg0KYGBge3J9DQoNCnRoZV9kZiAlPiUNCiAgZmlsdGVyKHBvcCA+IDEwMDAwMDApICU+JSANCiAgZ2dwbG90KGFlcyh5ID0gbG9nKGJ1ZGdldF9wYyksIHggPSBlbGVjdG9yYWxfZGVtbykpICsgDQogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAiIzlkMDIwOCIpICsNCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBhcy5mYWN0b3IocmVnaW9uXzYpLCBzaGFwZSA9IGFzLmZhY3RvcihyZWdpb25fNikpKSArDQogIGZhY2V0X3dyYXAofnllYXIpICsgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjMjE5ZWJjIiwgIiMyNjQ2NTMiLCAiIzQzYWE4YiIsICIjNmQ1OTdhIiwgIiNlNjM5NDYiLCAiI2Y0YTI2MSIpLA0KICAgICAgICAgICAgICAgICAgIG5hbWUgPSBOVUxMKSArDQogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE1LDE2LDE3LDE4LDE5LDEwKSwNCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBOVUxMKSArDQogIGdndGl0bGUoIlBvbGl0eSBTY29yZSB2cyBQRCBidWRnZXQgcGVyIGNhcGl0YSIpICsgDQogIHhsYWIoIlBvbGl0eSBTY29yZSIpICsNCiAgeWxhYigiTG9nZ2VkIFBEIGJ1ZGdldCBwZXIgY2FwaXRhIikgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImxlZnQiKSArIGdndGhlbWVzOjp0aGVtZV9wYW5kZXIoKQ0KDQpgYGANCg0KIyMjIE9ubHkgZm9yIDIwMTkNCg0KYGBge3J9DQoNCnRoZV9kZiAlPiUNCiAgZmlsdGVyKHllYXIgPT0gMjAxOSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHkgPSBsb2coYnVkZ2V0X3BjKSwgeCA9IGVsZWN0b3JhbF9kZW1vLCBncm91cCA9IGFzLmZhY3RvcihyZWdpb25fNikpKSArIA0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG9lc3MiLCBjb2xvciA9ICIjOWQwMjA4Iiwgc2UgPSBGQUxTRSkgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGFzLmZhY3RvcihyZWdpb25fNiksIHNoYXBlID0gYXMuZmFjdG9yKHJlZ2lvbl82KSkpICsgDQogIGZhY2V0X3dyYXAofnJlZ2lvbl82KSArIA0Kc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiMyMTllYmMiLCAiIzI2NDY1MyIsICIjNDNhYThiIiwgIiM2ZDU5N2EiLCAiI2U2Mzk0NiIsICIjZjRhMjYxIiksDQogICAgICAgICAgICAgICAgICAgbmFtZSA9IE5VTEwpICsNCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTUsMTYsMTcsMTgsMTksMTApLA0KICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IE5VTEwpICsNCiAgZ2d0aXRsZSgiUG9saXR5IFNjb3JlIHZzIFBEIGJ1ZGdldCBwZXIgY2FwaXRhIGluIDIwMTkiKSArIA0KICB4bGFiKCJQb2xpdHkgU2NvcmUgKC0xMCB0byAxMCkiKSArDQogIHlsYWIoIkxvZ2dlZCBidWRnZXQiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJsZWZ0IikgKyBnZ3RoZW1lczo6dGhlbWVfcGFuZGVyKCkNCg0KYGBgDQoNCg0KIyBQZXJjZW50YWdlIG9mIHBvcHVsYXRpb24gdGhhdCBmb2xsb3dzIE11c2xpbSBmYWl0aA0KDQojIyMgQWNyb3NzIHRoZSB5ZWFycw0KDQpgYGB7cn0NCg0KdGhlX2RmICU+JQ0KICBtdXRhdGUobXVzbGltX3BjID0gcGVyY2VudF9tdXNsaW1faml0dGVyIC8gcG9wLCBuYS5ybSA9IFRSVUUpICU+JSANCiAgZ2dwbG90KGFlcyh5ID0gbG9nKGJ1ZGdldF9jb25zdCksIHggPSBtdXNsaW1fcGMpKSArIA0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG9lc3MiLCBjb2xvciA9ICIjOWQwMjA4IikgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGFzLmZhY3RvcihyZWdpb25fNiksIHNoYXBlID0gYXMuZmFjdG9yKHJlZ2lvbl82KSkpICsNCiAgZmFjZXRfd3JhcCh+eWVhcikgKyANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiMyMTllYmMiLCAiIzI2NDY1MyIsICIjNDNhYThiIiwgIiM2ZDU5N2EiLCAiI2U2Mzk0NiIsICIjZjRhMjYxIiksDQogICAgICAgICAgICAgICAgICAgbmFtZSA9IE5VTEwpICsNCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTUsMTYsMTcsMTgsMTksMTApLA0KICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IE5VTEwpICsNCiAgZ2d0aXRsZSgiTXVzbGltIHBvcHVsYXRpb24gJSB2cyBQRCBidWRnZXQgcGVyIGNhcGl0YSIpICsgDQogIHhsYWIoIlBlcmNlbnRhZ2Ugb2YgcG9wdWxhdGlvbiBNdXNsaW0iKSArDQogIHlsYWIoIkxvZ2dlZCBQRCBidWRnZXQgcGVyIGNhcGl0YSIpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJsZWZ0IikgKyBnZ3RoZW1lczo6dGhlbWVfcGFuZGVyKCkNCg0KYGBgDQoNCiMjIyBPbmx5IGZvciAyMDE5DQoNCmBgYHtyfQ0KDQp0aGVfZGYgJT4lDQogIG11dGF0ZShtdXNsaW1fcGMgPSBwZXJjZW50X211c2xpbV9qaXR0ZXIgLyBwb3AsIG5hLnJtID0gVFJVRSkgJT4lIA0KICBmaWx0ZXIoeWVhciA9PSAyMDE5KSAlPiUgDQogIGdncGxvdChhZXMoeSA9IGxvZyhidWRnZXRfY29uc3QpLCB4ID0gbXVzbGltX3BjLCBncm91cCA9IGFzLmZhY3RvcihyZWdpb25fNikpKSArIA0KICAjIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsb2VzcyIsIGNvbG9yID0gIiM5ZDAyMDgiKSArDQogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gYXMuZmFjdG9yKHJlZ2lvbl82KSwgc2hhcGUgPSBhcy5mYWN0b3IocmVnaW9uXzYpKSkgKyANCiAgZmFjZXRfd3JhcCh+cmVnaW9uXzYpICsgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjMjE5ZWJjIiwgIiMyNjQ2NTMiLCAiIzQzYWE4YiIsICIjNmQ1OTdhIiwgIiNlNjM5NDYiLCAiI2Y0YTI2MSIpLA0KICAgICAgICAgICAgICAgICAgIG5hbWUgPSBOVUxMKSArDQogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE1LDE2LDE3LDE4LDE5LDEwKSwNCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBOVUxMKSArDQogIGdndGl0bGUoIk11c2xpbSBwb3B1bGF0aW9uICUgdnMgUEQgYnVkZ2V0IHBlciBjYXBpdGEgaW4gMjAxOSIpICsgDQogIHhsYWIoIlBlcmNlbnRhZ2Ugb2YgcG9wdWxhdGlvbiBNdXNsaW0iKSArDQogIHlsYWIoIkxvZ2dlZCBQRCBidWRnZXQgcGVyIGNhcGl0YSIpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJsZWZ0IikgKyBnZ3RoZW1lczo6dGhlbWVfcGFuZGVyKCkNCg0KYGBgDQoNCg0KIyBHb3Zlcm5tZW50IGNlbnNvcnNoaXAgb2YgbWVkaWENCg0KTGV2ZWwgb2YgZ292ZXJubWVudCBjZW5zb3JzaGlwIG9mIHRoZSBuYXRpb25hbCBtZWRpYSAoZnJvbSBWLURFTSBkYXRhc2V0KQ0KDQpIaWdoZXIgc2NvcmVzIGluZGljYXRlIG1vcmUgZnJlZWRlb20gZnJvbSBnb3Zlcm5tZW50IGNlbnNvcnNoaXAgaW4gdGhlIG5hdGlvbmFsIG1lZGlhDQoNCiMjIyBBY3Jvc3MgdGhlIHllYXJzDQoNCmBgYHtyfQ0KDQp0aGVfZGYgJT4lDQogIGdncGxvdChhZXMoeSA9IGxvZyhidWRnZXRfY29uc3QpLCB4ID0gZ292X2NlbnNvcl9tZWRpYS54LCBncm91cCA9IGFzLmZhY3RvcihyZWdpb25fNikpKSArIA0KICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGFzLmZhY3RvcihyZWdpb25fNiksIHNoYXBlID0gYXMuZmFjdG9yKHJlZ2lvbl82KSkpICsgDQogIGZhY2V0X3dyYXAofnllYXIpICsgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjMjE5ZWJjIiwgIiMyNjQ2NTMiLCAiIzQzYWE4YiIsICIjNmQ1OTdhIiwgIiNlNjM5NDYiLCAiI2Y0YTI2MSIpLCBuYW1lID0gTlVMTCkgKw0KICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxNSwxNiwxNywxOCwxOSwxMCksbmFtZSA9IE5VTEwpICsNCiAgZ2d0aXRsZSgiR292ZXJubWVudCBtZWRpYSBjZW5zb3JzaGlwIHNjb3JlIHZzIFBEIGJ1ZGdldCBwZXIgY2FwaXRhIikgKyANCiAgeGxhYigiR292ZXJubWVudCBtZWRpYSIpICsNCiAgeWxhYigiTG9nZ2VkIFBEIGJ1ZGdldCBwZXIgY2FwaXRhIikgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImxlZnQiKSArDQogIGdndGhlbWVzOjp0aGVtZV9wYW5kZXIoKQ0KDQpgYGANCg0KIyMjIE9ubHkgZm9yIDIwMTkNCg0KYGBge3J9DQoNCnRoZV9kZiAlPiUNCiAgZmlsdGVyKHllYXIgPT0gMjAxOSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHkgPSBsb2coYnVkZ2V0X2NvbnN0KSwgeCA9IGdvdl9jZW5zb3JfbWVkaWEueCkpICsgDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gIiM5ZDAyMDgiKSArDQogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gYXMuZmFjdG9yKHJlZ2lvbl82KSwgc2hhcGUgPSBhcy5mYWN0b3IocmVnaW9uXzYpKSkgKw0KICBmYWNldF93cmFwKH5yZWdpb25fNikgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiIzIxOWViYyIsICIjMjY0NjUzIiwgIiM0M2FhOGIiLCAiIzZkNTk3YSIsICIjZTYzOTQ2IiwgIiNmNGEyNjEiKSwgbmFtZSA9IE5VTEwpICsNCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTUsMTYsMTcsMTgsMTksMTApLCBuYW1lID0gTlVMTCkgKw0KICBnZ3RpdGxlKCJHb3Zlcm5tZW50IG1lZGlhIGNlbnNvcnNoaXAgc2NvcmUgdnMgUEQgYnVkZ2V0IHBlciBjYXBpdGEgaW4gMjAxOSIpICsgDQogIHhsYWIoIkZyZWVkZW9tIGZyb20gZ292ZXJubWVudCBjZW5zb3JzaGlwIGluIHRoZSBtZWRpYSIpICsNCiAgeWxhYigiTG9nZ2VkIFBEIGJ1ZGdldCBwZXIgY2FwaXRhIikgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImxlZnQiKSArDQogIGdndGhlbWVzOjp0aGVtZV9wYW5kZXIoKQ0KDQpgYGANCg0KDQojIFNpbWlsYXIgVU4gdm90aW5nDQoNCkl0IHJlZmxlY3RzIHN0YXRlcycgVU4gdm90aW5nIHBvc2l0aW9ucyBpbiByZWxhdGlvbiB0byB0aGUgVVMtbGVkIGxpYmVyYWwgb3JkZXIgKGNhbGN1bGF0ZWQgb24gYSBzaW5nbGUgZGltZW5zaW9uKS4NCg0KU291cmNlOiBodHRwczovL2RhdGF2ZXJzZS5oYXJ2YXJkLmVkdS9kYXRhc2V0LnhodG1sP3BlcnNpc3RlbnRJZD1kb2k6MTAuNzkxMC9EVk4vTEVKVVFaIA0KDQpCYWlsZXksIE0uQS4sIFN0cmV6aG5ldiwgQS4sIGFuZCBWb2V0ZW4sIEUgKDIwMTcpLiBFc3RpbWF0aW5nIGR5bmFtaWMgc3RhdGUgcHJlZmVyZW5jZXMgZnJvbSBVbml0ZWQgTmF0aW9ucyB2b3RpbmcgZGF0YS4gSm91cm5hbCBvZiBDb25mbGljdCBSZXNvbHV0aW9uIDYxLjI6IDQzMC00NTYuIA0KDQojIyMgQWNyb3NzIHRoZSB5ZWFycw0KDQpgYGB7cn0NCg0KdGhlX2RmICU+JQ0KICBmaWx0ZXIoeWVhciA9PSAyMDE0KSAlPiUgDQogIGdncGxvdChhZXMoeSA9IGxvZyhidWRnZXQpLCB4ID0gaWRlYWxfcG9pbnRfZGlzdGFuY2UpKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gIiM5ZDAyMDgiLCBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGFzLmZhY3RvcihyZWdpb25fNiksIHNoYXBlID0gYXMuZmFjdG9yKHJlZ2lvbl82KSkpICsNCiAgIyBmYWNldF93cmFwKH55ZWFyKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjMjE5ZWJjIiwgIiMyNjQ2NTMiLCAiIzQzYWE4YiIsICIjNmQ1OTdhIiwgIiNlNjM5NDYiLCAiI2Y0YTI2MSIpLCBuYW1lID0gTlVMTCkgKw0KICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxNSwxNiwxNywxOCwxOSwxMCksIG5hbWUgPSBOVUxMKSArDQogIGdndGl0bGUoIlVOIHZvdGluZyBzaW1pbGFyaXR5IHZzIFBEIGJ1ZGdldCBwZXIgY2FwaXRhIikgKw0KICB4bGFiKCJEaXN0YW5jZSBmcm9tIFVTIGlkZWFsIHNjb3JlIikgKw0KICB5bGFiKCJMb2dnZWQgUEQgYnVkZ2V0IHBlciBjYXBpdGEiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJsZWZ0IikgKw0KICBnZ3RoZW1lczo6dGhlbWVfcGFuZGVyKCkNCg0KYGBgDQoNCldlIGNhbiBzZWUgdHdvIGNsdXN0ZXJzIGFwcGVhciENCg0KIyMjIyBPbmx5IGZvciAyMDE5DQoNCmBgYHtyfQ0KdGhlX2RmICU+JQ0KICBmaWx0ZXIoeWVhciA9PSAyMDE5KSAlPiUNCiAgZ2dwbG90KGFlcyh5ID0gbG9nKGJ1ZGdldF9jb25zdCksIHggPSBpZGVhbF9wb2ludF9kaXN0YW5jZSwgZ3JvdXAgPSBhcy5mYWN0b3IocmVnaW9uXzYpKSkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2xvciA9ICIjOWQwMjA4Iiwgc2UgPSBGQUxTRSkgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGFzLmZhY3RvcihyZWdpb25fNiksIHNoYXBlID0gYXMuZmFjdG9yKHJlZ2lvbl82KSkpICsNCiAgZmFjZXRfd3JhcCh+cmVnaW9uXzYpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiMyMTllYmMiLCAiIzI2NDY1MyIsICIjNDNhYThiIiwgIiM2ZDU5N2EiLCAiI2U2Mzk0NiIsICIjZjRhMjYxIiksDQogICAgICAgICAgICAgICAgICAgbmFtZSA9IE5VTEwpICsNCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTUsMTYsMTcsMTgsMTksMTApLA0KICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IE5VTEwpICsNCiAgZ2d0aXRsZSgiVU4gdm90aW5nIHNpbWlsYXJpdHkgdnMgUEQgYnVkZ2V0IHBlciBjYXBpdGEiKSArDQogIHhsYWIoIkRpc3RhbmNlIGZyb20gVVMgaWRlYWwgc2NvcmUiKSArDQogIHlsYWIoIkxvZ2dlZCBQRCBidWRnZXQgcGVyIGNhcGl0YSIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImxlZnQiKSArIA0KICBnZ3RoZW1lczo6dGhlbWVfcGFuZGVyKCkNCg0KYGBgDQoNCiMgSW1wb3J0YW50IFVTIHZvdGVzDQoNClNvdXJjZTogRXJpayBWb2V0ZW4gIkRhdGEgYW5kIEFuYWx5c2VzIG9mIFZvdGluZyBpbiB0aGUgVU4gR2VuZXJhbCBBc3NlbWJseSIgUm91dGxlZGdlIEhhbmRib29rIG9mIEludGVybmF0aW9uYWwgT3JnYW5pemF0aW9uLCBlZGl0ZWQgYnkgQm9iIFJlaW5hbGRhIChwdWJsaXNoZWQgTWF5IDI3LCAyMDEzKQ0KDQpJbXBvcnRhbnQgdm90ZXMgZGV0ZXJtaW5lZCBieSB0aGUgVVMgU3RhdGUgRGVwYXJ0bWVudDogV2hldGhlciB0aGUgdm90ZSB3YXMgY2xhc3NpZmllZCBhcyBpbXBvcnRhbnQgYnkgdGhlIFUuUy4gU3RhdGUgRGVwYXJ0bWVudCByZXBvcnQNCiJWb3RpbmcgUHJhY3RpY2VzIGluIHRoZSBVbml0ZWQgTmF0aW9ucyIuIFRoZXNlIGNsYXNzaWZpY2F0aW9ucyBiZWdhbiB3aXRoIHNlc3Npb24gMzkNCg0KDQpgYGB7cn0NCg0KIyBsaWJyYXJ5KHVudm90ZXMpDQojIGxpYnJhcnkobHVicmlkYXRlKQ0KIyANCiMgY291bnQodW5fcm9sbF9jYWxsX2lzc3VlcywgaXNzdWUsIHNvcnQgPSBUUlVFKQ0KIyANCiMgam9pbmVkIDwtIHVuX3ZvdGVzICU+JQ0KIyAgIGlubmVyX2pvaW4odW5fcm9sbF9jYWxscywgYnkgPSAicmNpZCIpICU+JSANCiMgICBpbm5lcl9qb2luKHVuX3JvbGxfY2FsbF9pc3N1ZXMsIGJ5ID0gInJjaWQiKSAlPiUgDQojICAgdW5ncm91cCgpDQojIA0KIyBpbXBvcnRhbnQgPC0gam9pbmVkICU+JSANCiMgICBmaWx0ZXIoaW1wb3J0YW50dm90ZSA9PSAxKSAlPiUgDQojICAgc2VsZWN0KHJjaWQsIGNvdW50cnksIHZvdGUsIHNlc3Npb24sIGRhdGUpDQojIA0KIyBpbXBvcnRhbnQgJT4lDQojICAgbXV0YXRlKHZvdGVfZmFjID0gYXMuZmFjdG9yKHZvdGUpKSAlPiUgDQojICAgbXV0YXRlKHZvdGVfbnVtID0gYXMubnVtZXJpYyh2b3RlX2ZhYykpICU+JSANCiMgICBkaXN0aW5jdChzZXNzaW9uLCBjb3VudHJ5LCByY2lkLCB2b3RlX251bSwgLmtlZXBfYWxsID0gIlRSVUUiKSAtPiB0ZW1wMg0KIyANCiMgdGVtcDIgJT4lIA0KIyAgIHNlbGVjdChyY2lkLCBjb3VudHJ5LCB2b3RlX251bSwgc2Vzc2lvbikgJT4lIA0KIyAgIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBjb3VudHJ5LCB2YWx1ZXNfZnJvbSA9ICJ2b3RlX251bSIgKSAtPiBpbXBfd2lkZQ0KIyANCiMgdGVtcDIgJT4lIA0KIyAgIGdyb3VwX2J5KGNvdW50cnlfbmFtZSkNCiMgICBtdXRhdGUoY291bnRyeSA9IGlmX2Vsc2UoUmVzcG9uc2UgPT0gQ29ycmVjdF9hbnN3ZXIsIDEsIDApKQ0KIyANCg0KDQpgYGANCg0KDQoNCiMgTGV2ZWwgb2YgZG9tZXN0aWMgYXV0b25vbXkgDQoNCk1lYXN1cmVzIHRoZSBleHRlbnQgdG8gd2hpY2ggdGhlIGNvdW50cnkncyBnb3Z0IGhhdmUgZnVsbCBzb3ZlcmVpZ24gY29udHJvbCBvdmVyIHRoZSB0ZXJyaXRvcnkuDQoNCkhpZ2hlciBzY29yZXMgaW5kaWNhdGUgbW9yZSBjb250cm9sDQoNCiMjIyMgQWNyb3NzIGFsbCB5ZWFycw0KDQpgYGB7cn0NCg0KdGhlX2RmICU+JQ0KICBnZ3Bsb3QoYWVzKHkgPSBsb2coYnVkZ2V0X3BjX2NvbnN0KSwgeCA9IGludGxfYXV0b25vbXkpKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gIiM5ZDAyMDgiKSArDQogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gYXMuZmFjdG9yKHJlZ2lvbl82KSwgc2hhcGUgPSBhcy5mYWN0b3IocmVnaW9uXzYpKSkgKw0KICBmYWNldF93cmFwKH55ZWFyKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjMjE5ZWJjIiwgIiMyNjQ2NTMiLCAiIzQzYWE4YiIsICIjNmQ1OTdhIiwgIiNlNjM5NDYiLCAiI2Y0YTI2MSIpLCBuYW1lID0gTlVMTCkgKw0KICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxNSwxNiwxNywxOCwxOSwxMCksIG5hbWUgPSBOVUxMKSArDQogIGdndGl0bGUoIkRvbWVzdGljIGF1dG9ub215IHZzIFBEIGJ1ZGdldCBwZXIgY2FwaXRhIikgKw0KICB4bGFiKCJEb21lc3RpYyBhdXRvbm9teSIpICsNCiAgeWxhYigiTG9nZ2VkIFBEIGJ1ZGdldCBwZXIgY2FwaXRhIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibGVmdCIpICsNCiAgZ2d0aGVtZXM6OnRoZW1lX3BhbmRlcigpDQoNCmBgYA0KDQojIyMjIE9ubHkgZm9yIDIwMTkNCg0KYGBge3J9DQoNCnRoZV9kZiAlPiUNCiAgZmlsdGVyKHllYXIgPT0gMjAxMykgJT4lDQogIGdncGxvdChhZXMoeSA9IGxvZyhidWRnZXRfcGNfY29uc3QpLCB4ID0gaW50bF9hdXRvbm9teSwgZ3JvdXAgPSBhcy5mYWN0b3IocmVnaW9uXzYpKSkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2xvciA9ICIjOWQwMjA4Iiwgc2UgPSBGQUxTRSkgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGFzLmZhY3RvcihyZWdpb25fNiksIHNoYXBlID0gYXMuZmFjdG9yKHJlZ2lvbl82KSkpICsNCiAgZmFjZXRfd3JhcCh+cmVnaW9uXzYpICsNCiBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiIzIxOWViYyIsICIjMjY0NjUzIiwgIiM0M2FhOGIiLCAiIzZkNTk3YSIsICIjZTYzOTQ2IiwgIiNmNGEyNjEiKSwNCiAgICAgICAgICAgICAgICAgICBuYW1lID0gTlVMTCkgKw0KICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxNSwxNiwxNywxOCwxOSwxMCksDQogICAgICAgICAgICAgICAgICAgICBuYW1lID0gTlVMTCkgKw0KICBnZ3RpdGxlKCJEb21lc3RpYyBhdXRvbm9teSB2cyBQRCBidWRnZXQgcGVyIGNhcGl0YSIpICsNCiAgeGxhYigiRG9tZXN0aWMgYXV0b25vbXkiKSArDQogIHlsYWIoIkxvZ2dlZCBQRCBidWRnZXQgcGVyIGNhcGl0YSIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImxlZnQiKSArIGdndGhlbWVzOjp0aGVtZV9wYW5kZXIoKQ0KDQpgYGANCg0KDQojIFVTIGRpcGxvbWF0aWMgdmlzaXRzIA0KDQpOdW1iZXIgb2YgdmlzaXRzIGJ5IGhlYWRzIG9mIHN0YXRlIHRvIHRoZSBVUyANCg0KYGBge3IgdmlzaXRzLCBlY2hvID0gRkFMU0V9DQoNCnZpc2l0cyA8LSByZWFkLmNzdigiQzovVXNlcnMvUGF1bGEvRGVza3RvcC9kaXBsb21hdGljX3Zpc2l0cy5jc3YiKQ0KDQp2aXNpdHMkeWVhciA8LSBhcy5pbnRlZ2VyKHN0cl9zdWIodmlzaXRzJERhdGUsIC00LCAtMSkpDQoNCnZpc2l0cyRjb3dfY29kZSA8LSBjb3VudHJ5Y29kZSh2aXNpdHMkRnJvbSwgImNvdW50cnkubmFtZSIsICJjb3duIikNCg0KdmlzaXRzICU8PiUgDQogIHNlbGVjdChjb3dfY29kZSwgRnJvbSwgZXZlcnl0aGluZygpKQ0KDQp2aXNpdHMgJTw+JSANCiAgZHBseXI6Om11dGF0ZShjb3dfY29kZSA9IGlmZWxzZShGcm9tID09ICJVLlMuUy5SLiIsIDM2NSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKEZyb20gPT0gIlBhbGVzdGluaWFuIEF1dGhvcml0eSIsIDY2NjYsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRnJvbSA9PSAiU2VyYmlhIGFuZCBNb250ZW5lZ3JvIiwgMzQ1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShGcm9tID09ICJTZXJiaWEiLDM0NSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKEZyb20gPT0gIll1Z29zbGF2aWEgKEtvc292bykiLCAzNDcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRnJvbSA9PSAiTWljcm9uZXNpYSIsIDk4NywgY293X2NvZGUpKSkpKSkpDQoNCnZpc2l0cyAlPiUgDQogIGdyb3VwX2J5KGNvd19jb2RlLCB5ZWFyKSAlPiUgDQogIHN1bW1hcmlzZShzdW1faGVhZF92aXN0cyA9IG4oKSkgJT4lIA0KICB1bmdyb3VwKCkgLT4gaGVhZF92aXNpdHMNCg0KdmlzaXRzICU+JSANCiAgZ3JvdXBfYnkoRnJvbSwgeWVhcikgJT4lIA0KICBjb3VudCgpICU+JSANCiAgZmlsdGVyKG4gPiAxKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhuKSkgJT4lIA0KICBrYmwoKSAlPiUNCiAga2FibGVfcGFwZXIoInN0cmlwZWQiLA0KICAgICAgICAgICAgICBmdWxsX3dpZHRoID0gRikgDQoNCnZpc2l0cyAlPiUgDQogIGdyb3VwX2J5KEZyb20pICU+JSANCiAgY291bnQoKSAlPiUgDQogIGZpbHRlcihuID4gNDApICU+JSANCiAgYXJyYW5nZShkZXNjKG4pKSAlPiUgDQogIGtibCgpICU+JQ0KICBrYWJsZV9wYXBlcigic3RyaXBlZCIsDQogICAgICAgICAgICAgIGZ1bGxfd2lkdGggPSBGKSANCg0KYGBgDQoNCiMgVVMgdHJpcHMNCg0KVHJpcHMgYnkgVVMgUHJlc2lkZW50IC8gU2VjcmV0YXJpZXMgb2YgU3RhdGUgYWJyb2FkDQoNCmBgYHtyIHRyaXBzLCBlY2hvID0gRkFMU0V9DQoNCnRyYXZlbHMgPC0gcmVhZC5jc3YoIkM6L1VzZXJzL1BhdWxhL0Rlc2t0b3AvZGlwbG9tYXRpY190cmF2ZWxzLmNzdiIpDQoNCnRyYXZlbHMkeWVhciA8LSBhcy5pbnRlZ2VyKHN0cl9zdWIodHJhdmVscyREYXRlLCAtNCwgLTEpKQ0KDQp0cmF2ZWxzJGNvd19jb2RlIDwtIGNvdW50cnljb2RlKHRyYXZlbHMkQ291bnRyeSwgImNvdW50cnkubmFtZSIsICJjb3duIikNCg0KdHJhdmVscyAlPD4lIA0KICBzZWxlY3QoY293X2NvZGUsIENvdW50cnksIGV2ZXJ5dGhpbmcoKSkNCg0KdHJhdmVscyAlPD4lIA0KICBkcGx5cjo6bXV0YXRlKGNvd19jb2RlID0gaWZlbHNlKENvdW50cnkgPT0gIlUuUy5TLlIuIiwgMzY1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoQ291bnRyeSA9PSAiUGFsZXN0aW5pYW4gQXV0aG9yaXR5IiwgNjY2NiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShDb3VudHJ5ID09ICJTZXJiaWEgYW5kIE1vbnRlbmVncm8iLCAzNDUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKENvdW50cnkgPT0gIlNlcmJpYSIsMzQ1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoQ291bnRyeSA9PSAiWXVnb3NsYXZpYSAoS29zb3ZvKSIsIDM0NywgY293X2NvZGUpKSkpKSkNCg0KYGBgDQoNCg0KYGBge3J9DQp0cmF2ZWxzICU+JSANCiAgZ3JvdXBfYnkoY293X2NvZGUsIHllYXIpICU+JSANCiAgZmlsdGVyKFByZXMgPT0gMSkgJT4lIA0KICBzdW1tYXJpc2Uoc3VtX3ByZXNfdHJhdmVscyA9IG4oKSkgJT4lIA0KICB1bmdyb3VwKCkgLT4gcHJlc190cmF2ZWwNCg0KdHJhdmVscyAlPiUgDQogIGdyb3VwX2J5KGNvd19jb2RlLCB5ZWFyKSAlPiUgDQogIHN1bW1hcmlzZShzdW1fYWxsX3RyYXZlbHMgPSBuKCkpICU+JSANCiAgdW5ncm91cCgpIC0+IGFsbF90cmF2ZWwNCg0KdHJhdmVscyAlPiUgDQogIGdyb3VwX2J5KGNvd19jb2RlLCB5ZWFyKSAlPiUgDQogIHN1bW1hcmlzZShzdW1faW5kZXhfdHJhdmVscyA9IHN1bShkYXNoaW5kZXgpKSAlPiUgDQogIHVuZ3JvdXAoKSAtPiBzY29yZV90cmF2ZWwNCg0KdGhlX2RmIDwtIG1lcmdlKHRoZV9kZiwgcHJlc190cmF2ZWwsIGJ5ID0gYygiY293X2NvZGUiLCAieWVhciIpLCBhbGwueCA9IFRSVUUpIA0KdGhlX2RmIDwtIG1lcmdlKHRoZV9kZiwgaGVhZF92aXNpdHMsIGJ5ID0gYygiY293X2NvZGUiLCAieWVhciIpLCBhbGwueCA9IFRSVUUpIA0KdGhlX2RmIDwtIG1lcmdlKHRoZV9kZiwgYWxsX3RyYXZlbCwgYnkgPSBjKCJjb3dfY29kZSIsICJ5ZWFyIiksIGFsbC54ID0gVFJVRSkgDQp0aGVfZGYgPC0gbWVyZ2UodGhlX2RmLCBzY29yZV90cmF2ZWwsIGJ5ID0gYygiY293X2NvZGUiLCAieWVhciIpLCBhbGwueCA9IFRSVUUpIA0KDQpgYGANCg0KYGBge3J9DQojIyMgQWNyb3NzIHRoZSB5ZWFycw0KDQpsaWJyYXJ5KHRpZHlyKQ0KDQoNCnRoZV9kZiAlPiUNCiAgZmlsdGVyKHllYXIgPCAyMDE3KSAlPiUgDQogIG11dGF0ZShhbGxfdHJhdmVsID0gY29hbGVzY2Uoc3VtX2FsbF90cmF2ZWxzLCAwKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHkgPSBsb2coYnVkZ2V0X3BjX2NvbnN0KSwgeCA9IGFsbF90cmF2ZWwpKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gIiM5ZDAyMDgiLCBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGFzLmZhY3RvcihyZWdpb25fNiksIHNoYXBlID0gYXMuZmFjdG9yKHJlZ2lvbl82KSkpICsNCiAgZmFjZXRfd3JhcCh+eWVhcikrDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjMjE5ZWJjIiwgIiMyNjQ2NTMiLCAiIzQzYWE4YiIsICIjNmQ1OTdhIiwgIiNlNjM5NDYiLCAiI2Y0YTI2MSIpLCBuYW1lID0gTlVMTCkgKw0KICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxNSwxNiwxNywxOCwxOSwxMCksIG5hbWUgPSBOVUxMKSArDQogIGdndGl0bGUoIlVOIHZvdGluZyBzaW1pbGFyaXR5IHZzIFBEIGJ1ZGdldCBwZXIgY2FwaXRhIikgKw0KICB4bGFiKCJEaXN0YW5jZSBmcm9tIFVTIGlkZWFsIHNjb3JlIikgKw0KICB5bGFiKCJMb2dnZWQgUEQgYnVkZ2V0IHBlciBjYXBpdGEiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJsZWZ0IikgKw0KICBnZ3RoZW1lczo6dGhlbWVfcGFuZGVyKCkNCg0KDQpgYGANCg0KYGBge3J9DQoNCg0KdGhlX2RmICU+JQ0KICBmaWx0ZXIoeWVhciA8IDIwMTcpICU+JSANCiAgIyBtdXRhdGUoc2NvcmVfdHJhdmVsID0gY29hbGVzY2Uoc3VtX2luZGV4X3RyYXZlbHMsIDApKSAlPiUgDQogIGdncGxvdChhZXMoeSA9IGxvZyhidWRnZXRfcGNfY29uc3QpLCB4ID0gc3VtX2luZGV4X3RyYXZlbHMpKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gIiM5ZDAyMDgiLCBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY291bnRyeSwgY29sb3IgPSBhcy5mYWN0b3IocmVnaW9uXzYpKSkgKw0KICAjIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gYXMuZmFjdG9yKHJlZ2lvbl82KSwgc2hhcGUgPSBhcy5mYWN0b3IocmVnaW9uXzYpKSkgKw0KICBmYWNldF93cmFwKH55ZWFyKSsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiMyMTllYmMiLCAiIzI2NDY1MyIsICIjNDNhYThiIiwgIiM2ZDU5N2EiLCAiI2U2Mzk0NiIsICIjZjRhMjYxIiksIG5hbWUgPSBOVUxMKSArDQogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE1LDE2LDE3LDE4LDE5LDEwKSwgbmFtZSA9IE5VTEwpICsNCiAgZ2d0aXRsZSgiSGlnaCBsZXZlbCB2aXNpdHMgREFTSCBzY29yZSB2cyBQRCBidWRnZXQgcGVyIGNhcGl0YSIpICsNCiAgeGxhYigiSGlnaCBsZXZlbCB2aXNpdHMgREFTSCBzY29yZSIpICsNCiAgeWxhYigiTG9nZ2VkIFBEIGJ1ZGdldCBwZXIgY2FwaXRhIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibGVmdCIpICsNCiAgZ2d0aGVtZXM6OnRoZW1lX3BhbmRlcigpDQoNCmBgYA0KDQoNCiMjIyMgT25seSBmb3IgMjAxNg0KDQpgYGB7cn0NCnRoZV9kZiAlPiUNCiAgZmlsdGVyKHllYXIgPT0gMjAxNikgJT4lDQogIG11dGF0ZShhbGxfdHJhdmVsID0gY29hbGVzY2Uoc3VtX2FsbF90cmF2ZWxzLCAwKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHkgPSBsb2coYnVkZ2V0X3BjX2NvbnN0KSwgeCA9IGFsbF90cmF2ZWwpKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gIiM5ZDAyMDgiLCBzZSA9IEZBTFNFKSArDQogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gYXMuZmFjdG9yKHJlZ2lvbl82KSwgc2hhcGUgPSBhcy5mYWN0b3IocmVnaW9uXzYpKSkgKw0KICBmYWNldF93cmFwKH5yZWdpb25fNikgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiIzIxOWViYyIsICIjMjY0NjUzIiwgIiM0M2FhOGIiLCAiIzZkNTk3YSIsICIjZTYzOTQ2IiwgIiNmNGEyNjEiKSwNCiAgICAgICAgICAgICAgICAgICBuYW1lID0gTlVMTCkgKw0KICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxNSwxNiwxNywxOCwxOSwxMCksDQogICAgICAgICAgICAgICAgICAgICBuYW1lID0gTlVMTCkgKw0KICBnZ3RpdGxlKCJoaWdoIGxldmVsIHZpc2l0cyB2cyBQRCBidWRnZXQgcGVyIGNhcGl0YSIpICsNCiAgeGxhYigiTnVtYmVyIG9mIGhpZ2ggbGV2ZWwgdmlzaXRzIikgKw0KICB5bGFiKCJMb2dnZWQgUEQgYnVkZ2V0IHBlciBjYXBpdGEiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJsZWZ0IikgKyANCiAgZ2d0aGVtZXM6OnRoZW1lX3BhbmRlcigpDQoNCmBgYA0KDQoNCg0KYGBge3J9DQoNCnRyYXZlbHMgJT4lIA0KICBmaWx0ZXIoUHJlcyA9PSAxKSAlPiUgDQogIGdyb3VwX2J5KENvdW50cnksIHllYXIpICU+JSANCiAgY291bnQoKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhuKSkgJT4lIA0KICBrYmwoKSAlPiUNCiAga2FibGVfcGFwZXIoInN0cmlwZWQiLA0KICAgICAgICAgICAgICBmdWxsX3dpZHRoID0gRikgDQoNCmBgYA0KDQojIFRyaXBzIGJ5IFVTIHByZXNpZGVudHMgYW5kIFNlY3JldGFyaWVzIG9mIFN0YXRlIA0KDQojIyMgVG90YWwgbnVtYmVyIG9mIHRyaXBzIGJ5IFVTIHByZXNpZGVudHMgYW5kIFNlY3JldGFyaWVzIG9mIFN0YXRlIGJldHdlZW4gMTk0NSB0byAyMDE3DQoNCmBgYHtyfQ0KDQp0cmF2ZWxzICU+JSANCiAgZ3JvdXBfYnkoQ291bnRyeSkgJT4lIA0KICBjb3VudCgpICU+JSANCiAgZmlsdGVyKG4gPiA1MCkgJT4lIA0KICBhcnJhbmdlKGRlc2MobikpICU+JSANCiAgZ2dwbG90KGFlcyh5ID0gbiwNCiAgICAgICAgICAgICB4ID0gcmVvcmRlcihDb3VudHJ5LCBuKSwgZmlsbCA9IENvdW50cnkpKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIGdlb21faGlzdG9ncmFtKHN0YXQgPSAiaWRlbnRpdHkiKSArIGdndGhlbWVzOjp0aGVtZV9wYW5kZXIoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyANCiAgZ2d0aXRsZSgiVHJpcHMgYnkgVVMgUHJlc2lkZW50cyAmIFN0YXRlIFNlY3JldGFyaWVzIDE5NDUtMjAxNyIpICsgDQogIHhsYWIoIkNvdW50cnkiKSArDQogIHlsYWIoIk51bWJlciBUcmlwcyBieSBVUyBQcmVzaWRlbnQgJiBTZWNyZXRhcmllcyBvZiBTdGF0ZSIpDQoNCmBgYA0KDQpgYGB7ciwgZWNobyA9IEZBTFNFfQ0KDQp0cmF2ZWxzICU+JSANCiAgZ3JvdXBfYnkoQ291bnRyeSkgJT4lIA0KICBjb3VudCgpICU+JSANCiAgYXJyYW5nZShkZXNjKG4pKSAlPiUgDQogIGZpbHRlcihuID4gNTApICU+JSANCiAga2JsKCkgJT4lDQogIGthYmxlX3BhcGVyKCJzdHJpcGVkIiwNCiAgICAgICAgICAgICAgZnVsbF93aWR0aCA9IEYpIA0KDQpgYGANCg0KIyBVUyB0cm9vcCBsZXZlbHMNCg0KYGBge3J9DQoNCnRyb29wcyA8LSByZWFkLmNzdigiQzovVXNlcnMvUGF1bGEvRGVza3RvcC90cm9vcHMgYW5kIG1pbGl0YXJ5IHNwZW5kaW5nLmNzdiIsIGhlYWRlciA9IFRSVUUpDQoNCnRyb29wcyAlPiUgDQogIGZpbHRlcih5ZWFyID4gMTk1MCkgJT4lICANCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lIA0KICBzdW1tYXJpc2Uoc3VtX3Ryb29wcyA9IHN1bSh0cm9vcHMpKSAlPiUNCiAgZmlsdGVyKHN1bV90cm9vcHMgPiA1MDAwMCkgJT4lIA0KICBhcnJhbmdlKGRlc2Moc3VtX3Ryb29wcykpICU+JSANCiAga2JsKCkgJT4lDQogIGthYmxlX3BhcGVyKCJzdHJpcGVkIiwNCiAgICAgICAgICAgICAgZnVsbF93aWR0aCA9IEYpIA0KDQpgYGANCg0KYGBge3J9DQoNCnRyb29wcyAlPiUgDQogIGdyb3VwX2J5KGNjb2RlKSAlPiUgDQogIHN1bW1hcmlzZShzdW1fdHJvb3BzID0gc3VtKHRyb29wcykpICU+JSANCiAgdW5ncm91cCgpIC0+IHRyb29wX2xldmVscw0KDQp0aGVfZGYgPC0gbWVyZ2UodGhlX2RmLCB0cm9vcF9sZXZlbHMsIGJ5LnggPSAiY293X2NvZGUiLCBieS55ID0gImNjb2RlIiwgYWxsLnggPSBUUlVFKQ0KDQpgYGANCg0KDQpgYGB7cn0NCg0KbGlicmFyeShzdGFyZ2F6ZXIpDQoNCnRoZV9kZiRzdW1fcHJlc190cmF2ZWxzW2lzLm5hKHRoZV9kZiRzdW1fcHJlc190cmF2ZWxzKV0gPC0gMA0KdGhlX2RmJHN1bV9oZWFkX3Zpc3RzW2lzLm5hKHRoZV9kZiRzdW1faGVhZF92aXN0cyldIDwtIDANCnRoZV9kZiRzdW1fdHJvb3BzW2lzLm5hKHRoZV9kZiRzdW1fdHJvb3BzKV0gPC0gMA0KDQpgYGANCg0KYGBge3J9DQoNCnRoZV9kZiAlPiUNCiAgZmlsdGVyKHN1bV90cm9vcHMgPiAxKSAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMTkpICU+JSANCiAgZ2dwbG90KGFlcyh5ID0gbG9nKGJ1ZGdldF9wYyksIHggPSBsb2coc3VtX3Ryb29wcyArIDEpLCBncm91cCA9IGFzLmZhY3RvcihyZWdpb25fNikpKSArDQogICMgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBhcy5mYWN0b3IocmVnaW9uXzYpLCBzaGFwZSA9IGFzLmZhY3RvcihyZWdpb25fNikpKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UsIGFlcyhjb2xvciA9IGFzLmZhY3RvcihyZWdpb25fNikpKSArIA0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY291bnRyeSwgY29sb3IgPSByZWdpb25fNiksIHNpemUgPSA0KSArDQogIGZhY2V0X3dyYXAofnJlZ2lvbl82KSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjMjE5ZWJjIiwgIiMyNjQ2NTMiLCAiIzQzYWE4YiIsICIjNmQ1OTdhIiwgIiNlNjM5NDYiLCAiI2Y0YTI2MSIpLA0KICAgICAgICAgICAgICAgICAgIG5hbWUgPSBOVUxMKSArDQogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE1LDE2LDE3LDE4LDE5LDEwKSwNCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBOVUxMKSArDQogIGdndGl0bGUoIlVOIHZvdGluZyBzaW1pbGFyaXR5IHZzIFBEIGJ1ZGdldCBwZXIgY2FwaXRhIikgKw0KICB4bGFiKCJEaXN0YW5jZSBmcm9tIFVTIGlkZWFsIHNjb3JlIikgKw0KICB5bGFiKCJMb2dnZWQgUEQgYnVkZ2V0IHBlciBjYXBpdGEiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJsZWZ0IikgKyBnZ3RoZW1lczo6dGhlbWVfcGFuZGVyKCkNCg0KYGBgDQoNCg0KYGBge3J9DQoNCnRoZV9kZiAlPiUNCiAgIyBmaWx0ZXIoc3VtX3Ryb29wcyA+IDEpICU+JSANCiAgZ2dwbG90KGFlcyh5ID0gbG9nKGJ1ZGdldF9wYyksIHggPSBsb2coc3VtX3Ryb29wcyArIDEpLCBncm91cCA9IGFzLmZhY3RvcihyZWdpb25fNikpLCBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGFzLmZhY3RvcihyZWdpb25fNiksIHNoYXBlID0gYXMuZmFjdG9yKHJlZ2lvbl82KSkpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSwgYWVzKGNvbG9yID0gYXMuZmFjdG9yKHJlZ2lvbl82KSkpICsgDQogICMgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvdW50cnksIGNvbG9yID0gcmVnaW9uXzYpLCBzaXplID0gNCkgKw0KICBmYWNldF93cmFwKH55ZWFyKSArIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiIzIxOWViYyIsICIjMjY0NjUzIiwgIiM0M2FhOGIiLCAiIzZkNTk3YSIsICIjZTYzOTQ2IiwgIiNmNGEyNjEiKSwNCiAgICAgICAgICAgICAgICAgICBuYW1lID0gTlVMTCkgKw0KICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxNSwxNiwxNywxOCwxOSwxMCksDQogICAgICAgICAgICAgICAgICAgICBuYW1lID0gTlVMTCkgKw0KICBnZ3RpdGxlKCJVTiB2b3Rpbmcgc2ltaWxhcml0eSB2cyBQRCBidWRnZXQgcGVyIGNhcGl0YSIpICsNCiAgeGxhYigiRGlzdGFuY2UgZnJvbSBVUyBpZGVhbCBzY29yZSIpICsNCiAgeWxhYigiTG9nZ2VkIFBEIGJ1ZGdldCBwZXIgY2FwaXRhIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibGVmdCIpICsgZ2d0aGVtZXM6OnRoZW1lX3BhbmRlcigpDQoNCmBgYA0KDQoNCiMgT3ZlcnNlYXMgTWlsaXRhcnkgQmFzZXMgaW4gQ2hpbmEsIFJ1c3NpYSBhbmQgdGhlIFVTDQoNClNvdXJjZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGlzdF9vZl9jb3VudHJpZXNfd2l0aF9vdmVyc2Vhc19taWxpdGFyeV9iYXNlcw0KDQoNCg0KYGBge3J9DQogIA0KDQpgYGANCg0KIyBVUyBiYXNlcyBhbmQgImxpbHkgcGFkcyINCg0KU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL21lZmx5bm4vdHJvb3BkYXRhDQoNClRyb29wIGRlcGxveW1lbnQgZGF0YSB3ZXJlIGluaXRpYWxseSBjb21waWxlZCBieSBUaW0gS2FuZSB1c2luZyBpbmZvcm1hdGlvbiBvYnRhaW5lZCBmcm9tIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRGVmZW5zZeKAmXMgRGVmZW5zZSBNYW5wb3dlciBEYXRhIENlbnRlciAoRE1EQykuIFRoZSBvcmlnaW5hbCBkYXRhIGVuZGVkIGluIDIwMDUgYW5kIHdlIGhhdmUgdXBkYXRlZCBpdCB0byBydW4gdGhyb3VnaCAyMDIwDQoNCmBgYHtyfQ0KbGlicmFyeSh0cm9vcGRhdGEpDQoNCnRyb29wc191cyA8LSBnZXRfdHJvb3BkYXRhKHN0YXJ0eWVhciA9IDIwMTMsIGVuZHllYXIgPSAyMDIwKQ0KDQpgYGANCg0KDQoNCmBgYHtyfQ0KDQp1c19iYXNlX2RmIDwtcmVhZC5jc3YoIkM6L1VzZXJzL1BhdWxhL0Rlc2t0b3AvUERfb3JpZ2luYWxfZGF0YXNldHMvQmFzZXMuY3N2IikgDQogIA0KdXNfYmFzZV9kZiAlPiUgDQogIGZpbHRlcihiYXNlID09IDEpICU+JQ0KICBncm91cF9ieShDb3VudHJ5Lk5hbWUpICU+JSANCiAgY291bnQoKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhuKSkgJT4lIA0KICBmaWx0ZXIobiA+IDIpICU+JSANCiAga2JsKCkgJT4lDQogIGthYmxlX3BhcGVyKCJzdHJpcGVkIiwNCiAgICAgICAgICAgICAgZnVsbF93aWR0aCA9IEYpDQoNCiAgdXNfYmFzZV9kZiAlPiUgDQogIGZpbHRlcihsaWx5cGFkID09IDEpICU+JQ0KICBncm91cF9ieShDb3VudHJ5Lk5hbWUpICU+JSANCiAgY291bnQoKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhuKSkgJT4lIA0KICBmaWx0ZXIobiA+IDIpICU+JSANCiAga2JsKCkgJT4lDQogIGthYmxlX3BhcGVyKCJzdHJpcGVkIiwNCiAgICAgICAgICAgICAgZnVsbF93aWR0aCA9IEYpDQoNCiAgdXNfYmFzZV9kZiAlPiUgDQogIGdyb3VwX2J5KENvdW50cnkuTmFtZSkgJT4lIA0KICBjb3VudCgpICU+JSANCiAgYXJyYW5nZShkZXNjKG4pKSAlPiUgDQogIGZpbHRlcihuID4gNSkgJT4lIA0KICBrYmwoKSAlPiUNCiAga2FibGVfcGFwZXIoInN0cmlwZWQiLA0KICAgICAgICAgICAgICBmdWxsX3dpZHRoID0gRikNCiAgDQojIHdhcl9vbl90ZXJyb3IgPC0gYygiQWZnaGFuaXN0YW4iLCAiWWVtZW4iLCAiU3lyaWEiLCAiSXJhcSIsICJQYWtpc3RhbiIpDQojIA0KIyBteV9wZDkgJTw+JQ0KIyAgIGRwbHlyOjptdXRhdGUod2FyX29uX3RlcnJvciA9IGlmZWxzZShjb3VudHJ5X25hbWUgJWluJSB3YXJfb25fdGVycm9yLCAxLCAwKSkgDQoNCiAgDQpgYGANCg0KDQoNCg0KIyBVTiBWT1RJTkcgVFdPIENMVVNURVJTIA0KDQoNCmBgYHtyIHVuX2NsdXN0ZXJzfQ0KDQojIHRoZV9kZiAlPiUgDQojICAgIGZpbHRlcih5ZWFyID09IDIwMTQpICU+JSANCiMgICAgc2VsZWN0KGNvdW50cnksIGlkZWFsX3BvaW50X2Rpc3RhbmNlKSAlPiUgDQojICAgIGFycmFuZ2UoZGVzYyhpZGVhbF9wb2ludF9kaXN0YW5jZSkpDQojIA0KDQojIA0KIyANCiMgbmFtZXModGhlX2RmKQ0KIyANCiMgbG93X21vZGVsICA8LSBwbG0obGVhZChsb2coYnVkZ2V0X3BjKSkgfiBsb2coZ2RwX3BjX2NvbnN0KSArIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wKSArIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2codXNfZXhwb3J0c19wYykgKw0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaXZfbGliX2ZoICsNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsaWdfZnJhYyArDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVfbGF3X2ZoLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbG93X3VuLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCA9ICJ3aXRoaW4iLCBlZmZlY3QgPSAidGltZSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gYygiY293X2NvZGUiLCAieWVhciIpKQ0KIyANCiMgDQojIGhpZ2hfbW9kZWwgIDwtIHBsbShsZWFkKGxvZyhidWRnZXRfcGMpKSB+IGxvZyhnZHBfcGNfY29uc3QpICsgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3ApICsgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyh1c19leHBvcnRzX3BjKSArDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpdl9saWJfZmggKw0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxpZ19mcmFjICsNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZV9sYXdfZmgsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBoaWdoX3VuLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCA9ICJ3aXRoaW4iLCBlZmZlY3QgPSAidGltZSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gYygiY293X2NvZGUiLCAieWVhciIpKQ0KIyANCiMgc3RhcmdhemVyKGxvd19tb2RlbCwgaGlnaF9tb2RlbCwgY29sdW1uLmxhYmVscyA9IGMoIkxvdyIsICJIaWdoIiksDQojICAgICAgICAgICB0eXBlID0gInRleHQiKQ0KDQoNCmBgYA0KIA0KDQoNCiMgRml2ZSB5ZWFyIGF2ZXJhZ2VzIG9mIGRlcGVuZGVudCB2YXJpYWJsZXMNCg0KYGBge3J9DQoNCiMgdGhlX2RmJHBlcmlvZCA8LSBjdXQodGhlX2RmJHllYXIsIHNlcSgyMDEzLCAyMDE4LCAxKSkgDQojIA0KIyBwd3QubWEgPC0gZGRwbHkocHd0LCAuKGNvdW50cnksIHBlcmlvZCksIG51bWNvbHdpc2UobWVhbikpDQojIA0KIyBwd3QubWENCiMgDQojIA0KYGBgDQoNCg0KYGBge3J9DQoNCg0KZXhjbHVkaW5nX2NvdW50cmllcyA8LSBjKCJDdWJhIiwgIlN5cmlhIiwgIlllbWVuIiwgIkxpYnlhIikNCg0KDQp0aGVfZGYgJTw+JQ0KICBtdXRhdGUobXVzbGltX3BlcmNlbnQgPSBwZXJjZW50X211c2xpbV9qaXR0ZXIgLyBwb3AsIG5hLnJtID0gVFJVRSkgJT4lDQogIGZpbHRlcighaXMubmEoY293X2NvZGUpKQ0KDQphc2lhX2RmIDwtIHRoZV9kZiAlPiUNCiAgZmlsdGVyKHJlZ2lvbl82ID09ICJBc2lhIikNCmFmcmljYV9kZiA8LSB0aGVfZGYgJT4lDQogIGZpbHRlcihyZWdpb25fNiA9PSAiQWZyaWNhIikNCm1lbmFfZGYgPC0gdGhlX2RmICU+JQ0KICBmaWx0ZXIocmVnaW9uXzYgPT0gIk1FTkEiKQ0Kd2VzdF9kZiA8LSB0aGVfZGYgJT4lDQogIGZpbHRlcihyZWdpb25fNiA9PSAiV2VzdCIpDQpsYXRpbl9kZiA8LSB0aGVfZGYgJT4lDQogIGZpbHRlcihyZWdpb25fNiA9PSAiTGF0aW4iKQ0Kc292aWV0X2RmIDwtIHRoZV9kZiAlPiUNCiAgZmlsdGVyKHJlZ2lvbl82ID09ICJQb3N0IFNvdmlldCIpDQoNCmR2IDwtICJsb2coYnVkZ2V0KSINCg0KDQoNCml2cyA8LSBjKCJlbGVjdG9yYWxfZGVtbyIsDQogICAgICAgICAibG9nKGdkcF9wY19jb25zdCkiLA0KICAgICAgICAgImxvZyhwb3ApIiwNCiAgICAgICAgICJtdXNsaW1fcGVyY2VudCIpDQoNCg0KDQoNCmZvcm1fMSA8LSBhcy5mb3JtdWxhKHBhc3RlKGR2LCBwYXN0ZShpdnMsIGNvbGxhcHNlID0gIiArICIpLCBzZXAgPSAiIH4gIikpDQoNCg0KYGBgDQo=