Trabajo elaborado para la asignatura “Programación y manejo de datos en la era del Big Data” de la Universitat de València durante el curso 2021-2022. El repo del trabajo está aquí.

La página web de la asignatura y los trabajos de mis compañeros pueden verse aquí.


1. Introducción

Sudáfrica es uno de los países más desarrollados de todo el continente africano. Su PIB representa el 25% de todo el continente y su evolución desde el siglo pasado ha sido notable, pero ¿a qué se debe este crecimiento? ¿Podemos poner a Sudáfrica a la altura de países desarrollados o en desarrollo? ¿Está más cerca Sudáfrica de China o de los países de su entorno?

Todas estas preguntas son las que espero dar respuesta en este análisis, para ello nos centraremos en diferentes variables que yo considero esenciales para entender el crecimiento de un país. Estas serán el PIB per cápita, donde centraré la mayor parte de los esfuerzos; también analizaré la esperanza de vida, los sectores de crecimiento, la desigualdad y la pobreza, así como el comercio exterior.

2. Datos

Encontrar los datos y arreglarlos no ha sido una tarea demasiado complicada, con únicamente 2 fuentes de datos extraídas directamente del Banco Mundial y del Madison Project database tenemos suficiente para analizar lo que necesitamos. Además, desde el paquete tmap podemos utilizar los datos de World, para ayudarnos en la separación por continentes, regiones y coordenadas.

No tengo los links de donde extraje los datos ya que los saqué hace tiempo y no los apunté, de todas maneras están sacados directamente de la web sin ninguna modificación por lo que el link se puede encontrar. El problema es que, por ejemplo, en los datos del Banco Mundial, para sacar exactamente el excel que yo he utilizado es necesario filtrar alguna serie de cosas en la propia web.

mpd2020 <- read_excel("datos/mpd2020.xlsx", sheet = "Full data")

data(World) 
world<- World %>%
  rename(countrycode = iso_a3) %>%
  select(countrycode, continent)

banco_mundial <- read_excel("./datos/banco_mundial.xlsx")
banco_mundial[, c(5:65)] <- sapply(banco_mundial[, c(5:65)], as.numeric)
banco_mundial <-banco_mundial%>%
  pivot_longer(cols = c(5:65), values_to = "series", names_to = "year" )


banco_mundial_1 <- banco_mundial %>% select(year, series, 'Series Name', 'Country Name', `Country Code`) %>%
  pivot_wider(names_from = 'Series Name', values_from = series, values_fn = sum)

2.1 Procesando los datos

Lo más difícil en la extracción de datos se da cuando tratamos de importar el excel del Banco Mundial, puesto que los datos salen al revés de como nos gustaría manejarlos, pero con un pivot longer podemos trabajar mucho mejor. El problema es que así tampoco se queda como queremos, antes estaban las fechas en las columnas, es decir, cada columna era una fecha, ahora eso está bien pero las variables no son una columna cada una. Por lo tanto hay que hacer un pivot wider más pero hay que aladir la función values_fn = sum porque sino no coloca los datos correctamente.

Sin duda está fue la parte más complicada de arreglar, aunque de nuevo teníamos un problema que no pude solucionar hasta más tarde, cuando ya había algún gráfico hecho. Las fechas no son númericas puesto que vienen con el formato “2108[YR2018]” por lo que a la hora de hacer gráficos es un problema grande. Para ello tuvimos que crear la variable date y añadirla manualmente al df, pero lo iré haciendo en cada gráfico porque, como digo, es un problema que solucioné tarde.

3. Trabajos en los que te has basado

No me he basado en ningún trabajo en particular, he buscado información en infinidad de sitios y, en cuanto al contenido, me he centrado principalmente en las indicaciones de mi asignatura “crecimiento y desarrollo económico en la historia”, donde analizamos la evolución de los diferentes territorios del mundo a lo largo de la historia y podemos hacernos una idea del por qué de su evolución según los principales factores.

4. PIB per cápita

4.1 Evolución

Aquí podemos apreciar como a partir de la década de los 40 el crecimiento sudafricano comienza a ser notable, es cuando las élites blancas del país comienzan a ser más autosuficientes y a controlar cada vez más riqueza gracias al crecimiento de sus minas y sus empresas. En estos años llegó la independencia de Reino Unido, el apartheid, el boicot internacional y, en la década de los 90, la democracia, donde vemos el mayor crecimiento.

En el gráfico podemos apreciar, además de la evolución del PPC, los años durante los cuales Sudáfrica fue una colonia, primero de Países Bajos y más tarde de Reino Unido.

En dólares de 2010

mpd2020_1 <- mpd2020 %>% 
  filter(countrycode == "ZAF")
sudaf <- readJPEG("./datos/sudaf.jpg")
sudaf <- rasterGrob(sudaf, width=unit(1,"npc"), height=unit(1,"npc"), interpolate=TRUE) 
bri <- readJPEG("./datos/uk.jpg")
bri <- rasterGrob(bri, width=unit(1,"npc"), height=unit(1,"npc"), interpolate=TRUE) 
ned <- readJPEG("./datos/paisesbajos.jpg")
ned <- rasterGrob(ned, width=unit(1,"npc"), height=unit(1,"npc"), interpolate=TRUE) 
g1 <-   ggplot(mpd2020_1, aes(x=year, y=gdppc)) +
  annotation_custom(ned, xmin = -Inf, xmax = 1800, ymin = 0, ymax = 13000)+
  annotation_custom(bri, xmin = 1800, xmax = 1950, ymin = 0, ymax = 13000)+
  annotation_custom(sudaf, xmin = 1950, xmax = +Inf, ymin = 0, ymax = 13000)+
  geom_line( color="grey") +
  geom_point(shape=21, color="black", fill="#69b3a2", size=1) +
  theme_ipsum() +
  ggtitle("PIB PER CÁPITA SUDÁFRICA") +
  scale_x_continuous("Año", breaks = seq(1700,2020,20) ,limits = c(1700, 2020)) + 
  scale_y_continuous("PIB per cáptita", labels = scales::dollar) +
  labs(caption = "Elaboración propia con datos del Madison Project Database") +
  theme(axis.text.x = element_text(angle=45)) 
g1 

En logaritmos

Si lo analizamos en logaritmos apreciamos como los años de colonización no fueron precisamente buenos para los sudafricanos, que cuando lograron la independencia fue cuando experimentaron el mayor crecimiento.

glog <-  ggplot(mpd2020_1, aes(x=year, y=gdppc)) +
  scale_y_log10("Logaritmo PPC", NULL)+
  annotation_custom(ned, xmin = -Inf, xmax = 1800, ymin = 2.9, ymax = 4.2)+
  annotation_custom(bri, xmin = 1800, xmax = 1950, ymin = 2.9, ymax = 4.2)+
  annotation_custom(sudaf, xmin = 1950, xmax = +Inf, ymin = 2.9, ymax = 4.2)+ 
  geom_line( color="grey") +
  geom_point(shape=21, color="black", fill="#69b3a2", size=1) +
  theme_ipsum() +
  ggtitle("PIB PER CÁPITA SUDÁFRICA") +
  scale_x_continuous("Año", breaks = seq(1700,2020,20) ,limits = c(1700, 2020))  +
  labs(caption = "Elaboración propia con datos del Madison Project Database") +
  theme(axis.text.x = element_text(angle=45)) 
glog


4.2 Comparación con el resto de África

Desde 1960 el crecimiento sudafricano fue notable, ¿pero podemos distinguir una gran evolución si lo comparamos con el resto de países del entorno?

4.2.1 Comparación en mapas

Con estos dos mapas (uno hasta el año 1995 y otro posterior) apreciamos como realmente Sudáfrica ya era uno de los países africanos más ricos en 1960 y fue algo que se mantuvo durante todo el periodo, pese al fuerte crecimiento de otros países.

1960 - 1995

df1 <- inner_join(mpd2020, world) %>%
  filter(continent == "Africa")
df2 <- df1 %>% filter(year >= 1960) %>% filter(year <= 1995)

mapa <- ggplot() +
  geom_sf(data = df2, aes(geometry = geometry, fill = gdppc)) +
  theme_void()   +
  scale_fill_continuous(breaks = seq(1000, 15000, 1000),low="#baf0ff",high="#022129") + 
   transition_manual(year) +
  labs(title = "PIB per cápita en África año {current_frame}",
       caption = "Fuente: Elaboración propia con datos del Madison Project Database",
       fill = "En dólares") +
  guides(fill = guide_colorbar(barheight = unit(10, "cm")))
mapa

PD: Nótese que sudáfrica es el país situado más al sur de África

1995 - 2018

df3 <- df1 %>% filter(year >=1996)
mapa96 <- ggplot() +
  geom_sf(data = df3, aes(geometry = geometry, fill = gdppc)) +
  theme_void() +
  scale_fill_continuous(breaks = seq(1000, 50000, 5000),low="#baf0ff",high="#022129") + 
  transition_manual(year) +
  labs(title = "PIB per cápita en África año {current_frame}",
       caption = "Fuente: Elaboración propia con datos del Madison Project Database",
       fill = "En dólares") +
  guides(fill = guide_colorbar(barheight = unit(10, "cm")))
mapa96


4.2.2 Comparación en gráfico y en tabla

Aquí podemos apreciar lo mismo que anteriormente. Nótese el elevado crecimiento de países como Gabón, Guinea Ecuatorial o Lybia, aunque el de Sudáfrica no podemos decir que esté mal.

Gráfico

df4<- df1 %>% filter(year >= 1950)
df5 <- df4 %>% mutate(paises = country)
df6 <- df5 %>%
  filter(country == 'South Africa')
g2 <- ggplot(df6, aes(x=year, y=gdppc)) +
  geom_line(data=df5 %>% dplyr::select(-country), aes(group=paises), color="grey", size=0.5, alpha=1) +
  geom_line( aes(fill = country),color = "#2d7d3e",  size=1.2 )+
  scale_color_viridis_d() +
  theme_ipsum() +
  theme(
    legend.position = "left",
    plot.title = element_text(size=14),
    panel.grid = element_blank()) +
  labs(title = "PIB per cápita países africanos", caption = "Elaboración propia con datos del Madison Project Database") + 
  ylab(NULL) + xlab(NULL) +
  scale_y_continuous(breaks = seq(0, 25000, 5000), limits = c(0, 25000))
ggplotly(g2)  

Tabla

DT::datatable(df5)


4.2.3 Todo mucho más compacto

En este gráfico podemos apreciar la evolución del PPC sudafricano en comparación con la media del África subsahariana (zona a la que pertenece Sudáfrica), la media general de todo el continente y el país que más PPC ha tenido cada año (excluyendo Guinea Ecuatorial Y Lybia con índices muy elevados).

Es interesante ver como siempre ha sido mucho más rica que la media del continente y más aún que los países de su alrededor. además, durante los años 50 y 60 era el país más rico de África.

dfsubsaharian <- df5 %>% filter(country %in% c("Angola", "Sudáfrica", "Burundi", "Cabo Verde", "República Centroafricana", "República Democrática del Congo", "República del Congo", "Côte d'Ivoire", "Eritrea", "Etiopía", "Guinea", "Kenya", "Lesotho", "Liberia", "Madagascar", "Mauritania", "Mozambique", "Sierra Leona", "Somalia", "Sudán", "Botswana", "Tanzania", "Uganda", "Zimbabwe")) %>% 
  group_by(year) %>% summarise(media_africa_subsahariana = mean(gdppc))
dfresto <- df5 %>% filter(!country %in% c("Angola", "Sudáfrica", "Burundi", "Cabo Verde", "República Centroafricana", "República Democrática del Congo", "República del Congo", "Côte d'Ivoire", "Eritrea", "Etiopía", "Guinea", "Kenya", "Lesotho", "Liberia", "Madagascar", "Mauritania", "Mozambique", "Sierra Leona", "Somalia", "Sudán", "Botswana", "Tanzania", "Uganda", "Zimbabwe")) %>%
  group_by(year) %>% summarise(media_resto_africa = mean(gdppc))
dfafrica <- df5 %>% group_by(year) %>% summarise(media_todo_africa = mean(gdppc))
dfmax <- df5 %>% filter(!country %in% c('Equatorial Guinea', 'Libya'))%>%
  group_by(year) %>% slice_max(gdppc, n=1)
#tenemos que excluir Guinea Ecuatorial y Libia porque tiene valores demasiado altos y no se vería bien
g3 <- ggplot() +
  geom_line(data = df6, aes(year, gdppc), color="#2d7d3e", size=1.2 ) +
  geom_line(data = dfsubsaharian, aes(year, media_africa_subsahariana), color="grey", size=0.5 ) +
  geom_line(data = dfafrica, aes(year, media_todo_africa), color="grey", size=0.5 ) +
  geom_line(data = dfresto, aes(year, media_resto_africa), color="grey", size=0.5 ) +
  geom_line(data = dfmax, aes(year, gdppc), color="grey", size=0.5 ) +
  geom_point(data = dfmax, aes(year, gdppc, text = country), colour = "grey", size =  0.5,alpha = 1/2) +
  theme_ipsum() +
  labs(title = "Comparación PIB per cápita", 
       subtitle =  "Elaboración propia con datos del Madison Project Database") + 
  ylab("PIB per cápita") + xlab("Año") +
  scale_y_continuous(breaks = seq(0, 18000, 2000), limits = c(0, 20000), labels = scales::dollar) +
  scale_x_continuous(breaks = seq(1950, 2020, 10)) +
  annotate(geom = "text", x= 2013, y = 18700,label = "Mayor PIB per cápita de África",size = 2.5,  color = "black") + 
  annotate(geom = "text", x= 2018, y = 13000,label = "Sudáfrica",size = 2.5,  color = "#2d7d3e") + 
  annotate(geom = "text", x= 2010, y = 7000,label = "Resto de África (no subsahariana)",size = 2.5,  color = "black") + 
  annotate(geom = "text", x= 2016, y = 5400,label = "Continente africano",size = 2.5,  color = "black") + 
  annotate(geom = "text", x= 2016, y = 4100,label = "África Subsahariana",size = 2.5,  color = "black") 
ggplotly(g3)


4.3 Comparación con los BRICS

Desde 2011, Sudáfrica fue nombrada integrante de los BRICS como países de alto crecimiento económico. En este selecto grupo se encontraba también Brasil, Rusia, China, India. He añadido a España también en la comparación para hacernos una idea más real.

1700 - 1900

Podemos apreciar como en el siglo XIX Sudáfrica era un país mucho más rico que el resto y cómo los 2 siglos de colonización empobrecieron al país. Aún así, si no contamos a España (país donde el crecimiento moderno llegó antes), sí que vemos que Sudáfrica era el más rico de todos, ya que estos tampoco crecen en estos siglos. Revolución muy tardía para los BRICS

df9 <- mpd2020 %>% filter(country %in% c("Spain", "Brazil", "India", "China", "South Africa")) %>% filter(year %in% c("1700", "1850", "1900")) %>% drop_na(gdppc)
dfspain <- mpd2020 %>% filter(country == "Spain") %>% filter(year == 1705) %>% 
  rename(date = year) %>%
  mutate(year = date - 5) %>% select(-date)
df9 <- rbind(df9, dfspain)
g4 <- ggplot(df9, aes(country, gdppc)) + 
  geom_bar(stat="identity") + 
  theme_classic() + 
  geom_text(aes(y = gdppc, label = gdppc), 
            position = position_dodge(width = 0.9), size=3,
            vjust=-0.1, hjust=0.5 ,col="black", fontface = "bold") +
  labs(title = "Comparación con los BRICS + España",
       subtitle = "(PIB per cápita)",
       x = "Países",
       y = "PIB per cápita", 
       caption = "Elaboración propia con datos del Madison Project Database") + 
  theme(plot.title = element_text(size = 20, face = "bold", 
                                  hjust = 0.5), 
        plot.subtitle = element_text(size = 20, hjust = 0.5)) +
  facet_wrap(vars(year), nrow = 1) +
  scale_x_discrete(labels=c("Brasil","China","India",
                            "Sudáfrica", "España")) +
  scale_y_continuous(limits = c(0, 3000)) + theme(axis.text.x = element_text(angle=90))
g4

De algunos países no había datos en algunas fechas, he cogido el dato más cercano. Salvo de Brasil En 1700 donde no tenía nada ni cerca.

Todo mucho más compacto

A partir de 1950, los BRICS comenzaron a crecer, aunque el crecimiento más alto y por el que adquirieron esta etiqueta fue a partir de los 90. Podemos apreciar la fuerte ventaja que obtiene España en 1995, este crecimiento moderno llegaría más tarde para los BRICS.

df10 <- mpd2020 %>% filter(country %in% c("Spain", "Brazil", "India", "China", "Russian Federation", "South Africa")) %>% filter(year %in% c("1950", "1995", "2018")) %>% drop_na(gdppc)
dfrusia <- mpd2020 %>% filter(country == "Russian Federation") %>% filter(year == 1960) %>% 
  rename(date = year) %>%
  mutate(year = date - 10) %>% select(-date)
df10 <- rbind(df10, dfrusia)
g5 <- ggplot(df10, aes(country, gdppc)) + 
    geom_bar(stat="identity") + 
  theme_classic() + 
  geom_text(aes(y = gdppc, label = gdppc), 
            position = position_dodge(width = 0.9), size=3,
            vjust=-0.1, hjust=0.5 ,col="black", fontface = "bold") +
  labs(title = "Comparación con los BRICS + España",
       subtitle = "(PIB per cápita)",
       x = "Países",
       y = "PIB per cápita", 
       caption = "Elaboración propia con datos del Madison Project Database") + 
  theme(plot.title = element_text(size = 15, face = "bold", 
                                  hjust = 0.5), 
        plot.subtitle = element_text(size = 10, hjust = 0.5)) +
  facet_wrap(vars(year), nrow = 1) +
  scale_x_discrete(labels=c("Brasil","China","India",
                            "Rusia", "Sudáfrica", "España")) +
  scale_y_continuous(limits = c(0, 32000)) + theme(axis.text.x = element_text(angle=90))
g5


5. Esperanza de vida

5.1 Comparación con el mundo

Si comparamos uno de los indicadores más importantes, la esperanza de vida, vemos como la evolución en Sudáfrica es realmente sorprendente. Después del continuo crecimiento durante los años del apartheid, con la llegada de la democracia la esperanza de vida cae considerablemente, aunque a partir de 2005 vuelve a recuperarse.

Relativamente Sudáfrica ha empeorado bastante su esperanza de vida, de estar muy por encima de la media africana y muy cerca del resto del mundo (relativamente al menos) a situarse muy cerca de su propio continente.

esp <- banco_mundial_1 %>% select(year, 'Country Name', 'Esperanza de vida al nacer, total (años)')
esp <- janitor::clean_names(esp)
date <- c(1960:2020)
esp <- cbind(esp, date)
esp_1 <- esp %>% filter(country_name == "Sudáfrica")

africa <- world %>% filter(continent == "Africa") %>% select(countrycode)
africa <- banco_mundial_1 %>% filter(`Country Code` %in% africa$countrycode)
asia <- world %>% filter(continent == "Asia") %>% select(countrycode)
asia <- banco_mundial_1 %>% filter(`Country Code` %in% asia$countrycode)
europa <- world %>% filter(continent == "Europe") %>% select(countrycode)
europa <- banco_mundial_1 %>% filter(`Country Code` %in% europa$countrycode)
america <- world %>% filter(continent %in% c("North America", "South America")) %>% select(countrycode)
america <- banco_mundial_1 %>% filter(`Country Code` %in% america$countrycode)
oceania <- world %>% filter(continent == "Oceania") %>% select(countrycode)
oceania <- banco_mundial_1 %>% filter(`Country Code` %in% oceania$countrycode)

esp_africa <- africa %>% select(year, 'Country Name', 'Esperanza de vida al nacer, total (años)')
esp_africa <- janitor::clean_names(esp_africa)
esp_africa <- cbind(esp_africa, date)
esperanza_media_africa <- esp_africa %>% 
  group_by(date) %>% drop_na() %>% summarise(esperanza_de_vida_media_africa = mean(esperanza_de_vida_al_nacer_total_anos))
esp_asia <- asia %>% select(year, 'Country Name', 'Esperanza de vida al nacer, total (años)')
esp_asia <- janitor::clean_names(esp_asia)
esp_asia <- cbind(esp_asia, date)
esperanza_media_asia <- esp_asia %>% 
  group_by(date) %>% drop_na() %>% summarise(esperanza_de_vida_media_asia = mean(esperanza_de_vida_al_nacer_total_anos))
esp_europa <- europa %>% select(year, 'Country Name', 'Esperanza de vida al nacer, total (años)')
esp_europa <- janitor::clean_names(esp_europa)
esp_europa <- cbind(esp_europa, date)
esperanza_media_europa <- esp_europa %>% 
  group_by(date) %>% drop_na() %>% summarise(esperanza_de_vida_media_europa = mean(esperanza_de_vida_al_nacer_total_anos))
esp_america <- america %>% select(year, 'Country Name', 'Esperanza de vida al nacer, total (años)')
esp_america <- janitor::clean_names(esp_america)
esp_america <- cbind(esp_america, date)
esperanza_media_america <- esp_america %>% 
  group_by(date) %>% drop_na() %>% summarise(esperanza_de_vida_media_america = mean(esperanza_de_vida_al_nacer_total_anos))
esp_oceania <-oceania %>% select(year, 'Country Name', 'Esperanza de vida al nacer, total (años)')
esp_oceania <- janitor::clean_names(esp_oceania)
esp_oceania <- cbind(esp_oceania, date)
esperanza_media_oceania <- esp_oceania %>% 
  group_by(date) %>% drop_na() %>% summarise(esperanza_de_vida_media_oceania = mean(esperanza_de_vida_al_nacer_total_anos))

g6 <- ggplot() +
  geom_line(data = esp_1, aes(date, esperanza_de_vida_al_nacer_total_anos), color="#2d7d3e", size=1.2 ) +
  geom_line(data = esperanza_media_africa, aes(date, esperanza_de_vida_media_africa), color="grey", size=0.5 ) +
  geom_line(data = esperanza_media_america, aes(date, esperanza_de_vida_media_america), color="grey", size=0.5 ) +
  geom_line(data = esperanza_media_asia, aes(date, esperanza_de_vida_media_asia), color="grey", size=0.5 ) +
  geom_line(data = esperanza_media_europa, aes(date, esperanza_de_vida_media_europa), color="grey", size=0.5 ) +
  geom_line(data = esperanza_media_oceania, aes(date, esperanza_de_vida_media_oceania), color="grey", size=0.5 ) +
  theme_ipsum() +
  labs(title = "Esperanza de vida media por continentes", 
       subtitle =  "Elaboración propia con datos del Banco Mundial") + 
  ylab("PIB per cápita") + xlab("Año") +
  scale_y_continuous(breaks = seq(35, 85, 5), limits = c(40, 80)) +
  scale_x_continuous(breaks = seq(1950, 2020, 5)) +
  annotate(geom = "text", x= 1999, y = 62, label = "Sudáfrica", size = 3, color = "#2d7d3e") +
  annotate(geom = "text", x= 2020, y = 80,label = "Europa",size = 3,  color = "black") + 
  annotate(geom = "text", x= 2020, y = 74.5,label = "Asia",size = 3,  color = "black") + 
  annotate(geom = "text", x= 2019, y = 77,label = "América",size = 3,  color = "black") + 
  annotate(geom = "text", x= 2007, y = 69,label = "Oceanía",size = 3,  color = "black") + 
  annotate(geom = "text", x= 2020, y = 62.5,label = "África",size = 3,  color = "black") 
g6 


5.2 Comparación con los BRICS + España

De nuevo apreciamos el mismo problema, la tendencia hasta los 90 era similar al resto, aunque siendo de los peores, pero a partir de los 90 el bajón deja al país en una muy mala situación. En ningún momento superó a la media global.

esperanza_media <- esp %>% 
  group_by(date) %>% drop_na() %>% summarise(esperanza_de_vida_media_mundo = mean(esperanza_de_vida_al_nacer_total_anos))


esp_2 <- esp %>% mutate(paises = country_name) %>% filter(country_name %in% c("Brasil", "Federación de Rusia", "India", "China", "España")) 


g7 <- ggplot(esp_1, aes(x=date, y=esperanza_de_vida_al_nacer_total_anos )) +
  geom_line(data=esp_2 %>% dplyr::select(-country_name), aes(group=paises), color="grey", size=0.5, alpha=1) +
  geom_line( aes(group=country_name), color="#2d7d3e", size=1.2 ) +
  scale_color_viridis(discrete = TRUE) +
  theme_ipsum() +
  theme(
    legend.position = "left",
    plot.title = element_text(size=14),
    panel.grid = element_blank()) +
  labs(title = "Esperanza de vida en los BRICS + España", caption = "Elaboración propia con datos del Banco Mundial") + 
  ylab(NULL) + xlab(NULL) +
  scale_y_continuous(breaks = seq(10, 90, 5), limits = c(40,85)) + 
  scale_x_continuous( breaks = seq(1960, 2020, 5))+ 
  theme(axis.text.x = element_text(angle=45)) +
  annotate(geom = "text", x= 2018, y = 66,label = "Sudáfrica",size = 3,  color = "black") + annotate(geom = "text", x= 2018, y = 71,label = "India",size = 3,  color = "black") + annotate(geom = "text", x= 2018, y = 85,label = "España",size = 3,  color = "black") + annotate(geom = "text", x= 2018, y = 79,label = "China",size = 3,  color = "black") + annotate(geom = "text", x= 2018, y = 76,label = "Brasil",size = 3,  color = "black") + annotate(geom = "text", x= 2018, y = 74,label = "Rusia",size = 3,  color = "black")

g7 + geom_line(data = esperanza_media, aes(date, esperanza_de_vida_media_mundo), color = "#a62d2d") +
  annotate(geom = "text", x= 2003, y = 69,label = "Media mundo",size = 3,  color = "#a62d2d")


6. Sectores de crecimiento

La evolución en este sentido ha sido más que correcta. Normalmente, en los países desarrollados, el Valor Añadido Bruto se compone por una gran cantidad de servicios, mientras que la industria y, sobre todo la agricultura comienza a perder peso. Los servicios son el sector dominante en la actualidad en lo que a VAB se refiere, una economía con un peso demasiado alto de cualquiera de los otros 2 sectores es muy poco probable que sea una economía desarrollada. Sudáfrica, en este sentido, está a la altura de países desarrollados.

1960

df_sector <- banco_mundial_1 %>% select(year, `Country Name`, `Agricultura, valor agregado (% del PIB)`, `Industria, valor agregado (% del PIB)`) 
df_sector <- janitor::clean_names(df_sector)
df_sector <- df_sector %>% filter(country_name == 'Sudáfrica') %>% 
  mutate(servicios = 100 - (agricultura_valor_agregado_percent_del_pib + industria_valor_agregado_percent_del_pib))
df_sector <- cbind(df_sector, date)
df_sector1 <- df_sector %>%
  filter(date %in% c(1960, 1995, 2020)) %>% select(-c(year, country_name))
s1960 <- df_sector1 %>% filter(date == 1960) %>% select(-date)  
s1960 <- s1960 %>% pivot_longer(cols = 1:3 ,values_to = "s1960", names_to = "sectores" ) %>% 
  select(s1960)
s1995 <- df_sector1 %>% filter(date == 1995) %>% select(-date)  
s1995 <- s1995 %>% pivot_longer(cols = 1:3 ,values_to = "s1995", names_to = "sectores" ) %>% 
  select(s1995)
s2020 <- df_sector1 %>% filter(date == 2020) %>% select(-date) %>% pivot_longer(cols = 1:3 ,values_to = "s2020", names_to = "sectores" ) %>% 
  select(s2020)


etiqueta60 <- paste0(round(s1960$s1960, 2), "%")
pie(s1960$s1960, labels = etiqueta60)
legend("topleft", legend = c("Agricultura", "Industria", "Servicios"),
       fill =  c("white", "lightblue", "mistyrose"))
title("Peso de los sectores en el VAB en 1960")

1995

etiqueta95 <- paste0(round(s1995$s1995, 2), "%")
pie(s1995$s1995, labels = etiqueta95)
legend("topleft", legend = c("Agricultura", "Industria", "Servicios"),
       fill =  c("white", "lightblue", "mistyrose"))
title("Peso de los sectores en el VAB en 1995")

2020

etiqueta20 <- paste0(round(s2020$s2020, 2), "%")
pie(s2020$s2020, labels = etiqueta20)
legend("topleft", legend = c("Agricultura", "Industria", "Servicios"),
       fill =  c("white", "lightblue", "mistyrose"))
title("Peso de los sectores en el VAB en 2020")


7. Comercio

7.1 Tasa de apertura

La tasa de apertura se define como las exportaciones más las importaciones dividido entre el PIB de un país. No podemos decir que esta sea una gran cifra para Sudáfrica, que ya vemos que no supera en prácticamente ningún año a los países de su entorno. Aún así, tampoco son malos datos, ya que, más o menos, se ha mantenido rondano el 50% del PIB.

df_comercio <- banco_mundial_1 %>% select(year, `Country Name`, `Exportaciones de bienes y servicios (% del PIB)`, `Importaciones de bienes y servicios (% del PIB)`) %>% 
  filter(`Country Name` == 'Sudáfrica')
df_comercio <- df_comercio %>% mutate(tasa_apertura = `Exportaciones de bienes y servicios (% del PIB)`+ `Importaciones de bienes y servicios (% del PIB)`) %>%
  mutate(tasa_cobertura = `Exportaciones de bienes y servicios (% del PIB)`/`Importaciones de bienes y servicios (% del PIB)`)

df_comercio<-cbind(df_comercio, date)


df_comercio <- df_comercio%>% select(-year)

df_comercio2 <- banco_mundial_1 %>% select(year, `Country Name`, `Exportaciones de bienes y servicios (% del PIB)`, `Importaciones de bienes y servicios (% del PIB)`)          
df_comercio2 <- janitor::clean_names(df_comercio2)
df_comercio2<-cbind(df_comercio2, date)
df_comercio2 <- df_comercio2%>% select(-year)
df_comercio3 <- df_comercio2 %>%
  filter(country_name %in% c("Angola", "Sudáfrica", "Burundi", "Cabo Verde", "República Centroafricana", "República Democrática del Congo", "República del Congo", "Côte d'Ivoire", "Eritrea", "Etiopía", "Guinea", "Kenya", "Lesotho", "Liberia", "Madagascar", "Mauritania", "Mozambique", "Sierra Leona", "Somalia", "Sudán", "Botswana", "Tanzania", "Uganda", "Zimbabwe"))
df_comercio3 <- df_comercio3 %>% mutate(tasa_apertura = exportaciones_de_bienes_y_servicios_percent_del_pib + importaciones_de_bienes_y_servicios_percent_del_pib) %>%
  mutate(tasa_cobertura = (exportaciones_de_bienes_y_servicios_percent_del_pib/importaciones_de_bienes_y_servicios_percent_del_pib)*100) %>%
  group_by(date) %>% drop_na(tasa_apertura) %>% 
  mutate(media = mean(tasa_apertura))
df_comercio4 <- df_comercio3 %>% filter(country_name == 'Sudáfrica')
comercio2 <-   ggplot(df_comercio4, aes(x=date, y=tasa_apertura)) +
  geom_line(data = df_comercio4, aes(date, tasa_apertura), color="grey") +
  geom_point(shape=21, color="black", fill="#69b3a2", size=1) +
  theme_ipsum() +
  labs(title = "Tasa de apertura (en %)", caption = "Elaboración propia con datos del Banco Mundial")  + ylab(NULL) + xlab("Año") +
  scale_y_continuous(breaks = seq(20, 100, 10), limits = c(20, 100)) + 
  scale_x_continuous(breaks = seq(1960,2020, 20))
comercio2 + geom_line(data = df_comercio3, aes(date, media), color="grey") +
  geom_point(data = df_comercio3, aes(date, media),  shape=21, color="green", fill="#69b3a2", size=1) +  annotate(geom = "text", x= 2020, y = 48,label = "Sudáfrica",size = 3,  color = "darkgrey") + annotate(geom = "text", x= 2016, y = 78,label = "África subsahariana",size = 3,  color = "green")

7.2 Tasa de cobertura

Lo bueno de lo anterior es que, la mayor parte del comercio exterior, aunque no sea super abundante, son exportaciones. Así se aprecia en la tasa de cobertura (exportaciones/importaciones), donde casi siempre se ha encontrado por encima del 100%. Esto indica que Sudáfrica es un país exportador, lo cual es positivo para la balanza de capitales.

Aún así, lo cierto es que tampoco apreciamos ninguna evolución en ninguna de las dos tasas a lo largo de los años.

df_comercio3 <- df_comercio3 %>% select(-media) %>%
  mutate(media = mean(tasa_cobertura))
df_comercio4 <- df_comercio3 %>% filter(country_name == 'Sudáfrica')
comercio3 <-   ggplot(df_comercio4, aes(x=date, y=tasa_cobertura)) +
  geom_line(data = df_comercio4, aes(date, tasa_cobertura), color="grey") +
  geom_point(shape=21, color="black", fill="#69b3a2", size=1) +
  theme_ipsum() +
  labs(title = "Tasa de cobertura (en %)", caption = "Elaboración propia con datos del Banco Mundial")  + ylab(NULL) + xlab("Año") +
  scale_y_continuous(breaks = seq(50, 150, 10), limits = c(50, 150)) + 
  scale_x_continuous(breaks = seq(1960,2020, 20))
comercio3 + geom_line(data = df_comercio3, aes(date, media), color="grey") +
  geom_point(data = df_comercio3, aes(date, media),  shape=21, color="green", fill="#69b3a2", size=1) +  annotate(geom = "text", x= 2020, y = 124,label = "Sudáfrica",size = 3,  color = "darkgrey") + annotate(geom = "text", x= 2016, y = 80,label = "África subsahariana",size = 3,  color = "green")

7.3 Inversión extranjera directa

Como podemos observar, la IED de Sudáfrica ha crecido considerablemente en el tiempo aunque de manera más que irregular. Sí que podemos hablar de que Sudáfrica ha participado en la gloalización y se ha aprovechado de ella.

En Sudáfrica

ied <- banco_mundial_1 %>% select(year, 'Country Name', `Inversión extranjera directa, entrada neta de capital (balanza de pagos, US$ a precios actuales)`, 'Country Code')
ied <- janitor::clean_names(ied)
ied<-cbind(ied, date)
ied <- ied%>% select(-year)
ied <- ied %>% rename(IED = inversion_extranjera_directa_entrada_neta_de_capital_balanza_de_pagos_us_a_precios_actuales)
ied <- ied %>% mutate(IED = IED/1000000)
ied <- ied%>% drop_na()
iedsud <- ied %>% filter(country_name == "Sudáfrica")
gied <-   ggplot(iedsud, aes(x=date, y=IED)) +
  geom_line(data = iedsud, aes(date, IED), color="grey") +
  geom_point(shape=21, color="black", fill="#69b3a2", size=1) +
  theme_ipsum() +
  labs(title = "Inversión extranjera directa, entrada neta de capital ", subtitle = "Balanza de pagos, millones de US$ a precios actuales", caption = "Elaboración propia con datos del Banco Mundial")  + ylab(NULL) + xlab("Año") +
  scale_y_continuous(NULL, labels = scales::dollar) 
gied

En el mundo

continents <- World %>% rename(country_code = iso_a3) %>% select(country_code, continent)
ied_cont <- inner_join(ied, continents)
ied_cont2 <- ied_cont %>% group_by(continent, date) %>% summarise(total_IED = sum(IED)) %>% 
  ungroup()%>%
  group_by(date) %>%
  mutate(world_IED = sum(total_IED)) %>%
  ungroup() %>%
  group_by(date) %>%
  mutate(porcentaje_IED = (total_IED/world_IED)*100) %>% 
  filter(date %in% c(1970,1980,1990,2000,2010,2019))


g8 <- ggplot(ied_cont2, aes(x=date, y=world_IED)) +
  geom_bar(aes(fill= continent, label = porcentaje_IED) , stat="identity") +
  theme_classic()  +
  labs(title = "Inversión extranjera directa, entrada neta de capital ", 
       fill = "% de población")  + ylab(NULL) + xlab("Año")+
  scale_y_continuous(NULL, labels = scales::dollar) 
ggplotly(g8)


8. Pobreza y tecnología

8.1 Pobreza

En estos 2 mapas se aprecia como Sudáfrica cuenta con uno de los porcentajes de población pobre más altos del mundo, aunque de los más bajos de África. Aquí podemos ver la media del porcentaje de población entre los años 60 y 95, y después entre los años 95 y 2020.

Pre-1995

data(World) 
world <- World %>%
  rename(countrycode = iso_a3) %>%
  select(countrycode, continent)
world2 <- world  %>% rename(country_code = countrycode )
banco_mundial_1 <- banco_mundial_1 %>%
  rename(country_code = `Country Code`)
df_pobreza <-banco_mundial_1 %>% select(country_code, `Country Name`, year, `Tasa de incidencia de la pobreza, sobre la base de $1,90 por día (2011 PPA) (% de la población)`)
world3 <- world2 %>% select(country_code)
df_pobreza2 <- inner_join(world3, df_pobreza)
df_pobreza2<-cbind(df_pobreza2, date)
df_pobreza3 <- df_pobreza2 %>% filter(date <= 1995) %>% drop_na(Tasa.de.incidencia.de.la.pobreza..sobre.la.base.de..1.90.por.día..2011.PPA.....de.la.población.)
df_pobreza3 <- df_pobreza3 %>% group_by(Country.Name) %>% summarise(media = mean(Tasa.de.incidencia.de.la.pobreza..sobre.la.base.de..1.90.por.día..2011.PPA.....de.la.población.))


mapa2 <- ggplot() +
  geom_sf(data = df_pobreza3, aes(geometry = geometry, fill = media)) +
  theme_void()  +
  theme(plot.subtitle = element_text(family = "serif", face = "italic"),
        plot.title = element_text(family = "serif", face =  "italic")) +
  labs(title = "Tasa de incidencia de la pobreza sobre la base de 1.90$ por día (2011 PPA)", 
       subtitle = "Media entre 1960 - 1995 " , 
       caption = "Fuente: Elaboración propia con datos del Madison Project Database",
       fill = "% de población")  +
  scale_fill_continuous(low="#fffcbf",high="#3e9851") + 
  theme(plot.title = element_text(hjust = 20), plot.subtitle = element_text(hjust = 0.3), 
        plot.caption = element_text(hjust = 1.5))

mapa2 

Post-1995

df_pobreza4 <- df_pobreza2 %>% filter(date >= 1995) %>% drop_na(Tasa.de.incidencia.de.la.pobreza..sobre.la.base.de..1.90.por.día..2011.PPA.....de.la.población.)
df_pobreza4 <- df_pobreza4 %>% group_by(Country.Name) %>% summarise(media = mean(Tasa.de.incidencia.de.la.pobreza..sobre.la.base.de..1.90.por.día..2011.PPA.....de.la.población.))
mapa3 <- ggplot() +
  geom_sf(data = df_pobreza4, aes(geometry = geometry, fill = media)) +
  theme_void()  +
  theme(plot.subtitle = element_text(family = "serif", face = "italic"),
        plot.title = element_text(family = "serif", face =  "italic")) +
  labs(title = "Tasa de incidencia de la pobreza sobre la base de 1.90$ por día (2011 PPA)", 
       subtitle = "Media entre 1995 - 2020 " , 
       caption = "Fuente: Elaboración propia con datos del Madison Project Database",
       fill = "% de población")  +
  scale_fill_continuous(low="#fffcbf",high="#3e9851") + 
  theme(plot.title = element_text(hjust = 20), plot.subtitle = element_text(hjust = 0.3), 
        plot.caption = element_text(hjust = 1.5))

mapa3 


8.2 Tecnología

Para ilustrar el acceso a la tecnología tenemos un gráfico con el crecimiento en el uso de teléfonos móviles año a año. Podemos apreciar como, en los 90, el crecimiento en Sudáfrica fue enorme, aunque este lleg´con retraso con respecto a los continentes más desarrollados. Aún así, casi siempre está por encima de la media del continente africano.

dfmobil <- banco_mundial_1 %>% select(year, `Suscripciones a telefonía celular móvil (por cada 100 personas)`, `Country Name`, country_code) %>% rename(moviles = `Suscripciones a telefonía celular móvil (por cada 100 personas)`)

dfmobil<- janitor::clean_names(dfmobil) 

dfmobil <- cbind(date, dfmobil) 

dfmobil <- dfmobil %>% select(-year) %>% filter(date >= 1975) %>%
  arrange(date)
dfmobil[is.na(dfmobil)] <- 0
dfmobil <- dfmobil %>%  group_by(country_name) %>%
  mutate(crecimiento_anual = ((moviles - lag(moviles))/lag(moviles))*100)
dfmobil[is.na(dfmobil)] <- 0
#tenemos problemas cuando pasa de 0 a un número, ya que al dividir entre 0 da infinito, lo que queremos es que en lugar de infinito ponga 100 ya que crece un 100 %. 
dfmobil <- dfmobil %>% mutate(crecimiento = case_when(
  crecimiento_anual > 1000 ~ 100, 
  crecimiento_anual < 1000  ~ crecimiento_anual
)) %>% select(-crecimiento_anual)
africa_mobiles <- dfmobil %>%  filter(country_code %in% africa$`Country Code`)

africa_mobiles <- africa_mobiles %>% group_by(date)%>%
  summarise(media_africa = mean(crecimiento))
asia_mobiles <- dfmobil %>%  filter(country_code %in% asia$`Country Code`) %>% 
  group_by(date) %>%
  summarise(media_asia = mean(crecimiento))
america_mobiles <- dfmobil %>%  filter(country_code %in% america$`Country Code`)%>% 
  group_by(date) %>%
  summarise(media_america = mean(crecimiento))
europa_mobiles <- dfmobil %>%  filter(country_code %in% europa$`Country Code`) %>% 
  group_by(date) %>%
  summarise(media_europa = mean(crecimiento))
oceania_mobiles <- dfmobil %>%  filter(country_code %in% oceania$`Country Code`) %>% 
  group_by(date) %>%
  summarise(media_oceania = mean(crecimiento))
sudafrica_mobiles <- dfmobil %>% filter(country_code == "ZAF") %>%
  select(date, crecimiento)
df12 <- inner_join(oceania_mobiles, europa_mobiles)
df13 <- inner_join(africa_mobiles, asia_mobiles)
df14 <- inner_join(df12, df13)
df15 <- inner_join(df14, america_mobiles)
df16 <- inner_join(df15, sudafrica_mobiles) %>% select(-country_name) %>% 
  pivot_longer(cols = (2:7) ,values_to = "crecimiento_anual", names_to = "region")


g9 <- ggplot(df16, aes(x= date, y= crecimiento_anual)) + 
  labs(title = "Evolución uso de redes móbiles en el mundo",
       x= "Año",
       y= "Crecimiento anual",
       color = "Regiones") +
  geom_point(aes(color= region), size= 3) +
  geom_line(aes(color= region), size= 1.5) + 
  scale_color_manual(values= c("red", "blue", "green", "black",
                               "yellow", "orange", "midnightblue"),
                     labels = c("Sudáfrica",
                                "África",
                                "América",
                                "Asia",
                                "Europa",
                                "Oceanía"
                                ))+
  theme_minimal() +
  theme(plot.title = element_text(size = 20, face = "bold",
                                  hjust = 0.5),
        axis.title.x = element_text(size = 13, hjust = 1,
                                    vjust = 0),
        axis.title.y = element_text(size = 13, hjust = 1, vjust = 1),
        legend.title = element_text(face = "bold")) +
  transition_reveal(date) + 
  view_follow()
g9





Información de mi R-sesión:

─ Session info ───────────────────────────────────────────────────────────────
 setting  value                       
 version  R version 4.1.1 (2021-08-10)
 os       macOS Big Sur 10.16         
 system   x86_64, darwin17.0          
 ui       X11                         
 language (EN)                        
 collate  es_ES.UTF-8                 
 ctype    es_ES.UTF-8                 
 tz       Europe/Madrid               
 date     2022-01-07                  

─ Packages ───────────────────────────────────────────────────────────────────
 package           * version    date       lib
 abind               1.4-5      2016-07-21 [1]
 assertthat          0.2.1      2019-03-21 [1]
 backports           1.4.0      2021-11-23 [1]
 base64enc           0.1-3      2015-07-28 [1]
 broom               0.7.10     2021-10-31 [1]
 bslib               0.3.0      2021-09-02 [1]
 cellranger          1.1.0      2016-07-27 [1]
 class               7.3-19     2021-05-03 [1]
 classInt            0.4-3      2020-04-07 [1]
 cli                 3.1.0      2021-10-27 [1]
 clipr               0.7.1      2020-10-08 [1]
 codetools           0.2-18     2020-11-04 [1]
 colorspace          2.0-2      2021-06-24 [1]
 crayon              1.4.2      2021-10-29 [1]
 crosstalk           1.1.1      2021-01-12 [1]
 curl                4.3.2      2021-06-23 [1]
 data.table          1.14.2     2021-09-27 [1]
 DBI                 1.1.1      2021-01-15 [1]
 dbplyr              2.1.1      2021-04-06 [1]
 DEoptimR            1.0-9      2021-05-24 [1]
 desc                1.3.0      2021-03-05 [1]
 details             0.2.1      2020-01-12 [1]
 dichromat           2.0-0      2013-01-24 [1]
 digest              0.6.28     2021-09-23 [1]
 dplyr             * 1.0.7      2021-06-18 [1]
 DT                * 0.19       2021-09-02 [1]
 e1071               1.7-8      2021-07-28 [1]
 ellipse             0.4.2      2020-05-27 [1]
 ellipsis            0.3.2      2021-04-29 [1]
 evaluate            0.14       2019-05-28 [1]
 extrafont           0.17       2014-12-08 [1]
 extrafontdb         1.0        2012-06-11 [1]
 fansi               0.5.0      2021-05-25 [1]
 farver              2.1.0      2021-02-28 [1]
 fastmap             1.1.0      2021-01-25 [1]
 forcats           * 0.5.1      2021-01-27 [1]
 fs                  1.5.0      2020-07-31 [1]
 gdtools             0.2.3      2021-01-06 [1]
 generics            0.1.1      2021-10-25 [1]
 gganimate         * 1.0.7      2020-10-15 [1]
 ggplot2           * 3.3.5      2021-06-25 [1]
 ggrepel           * 0.9.1      2021-01-15 [1]
 ggspatial         * 1.1.5      2021-01-04 [1]
 ggthemes          * 4.2.4      2021-01-20 [1]
 gifski            * 1.4.3-1    2021-05-02 [1]
 glue                1.5.1      2021-11-30 [1]
 gridExtra           2.3        2017-09-09 [1]
 gt                * 0.3.1      2021-09-15 [1]
 gtable              0.3.0      2019-03-25 [1]
 haven               2.4.3      2021-08-04 [1]
 highr               0.9        2021-04-16 [1]
 hms                 1.1.0      2021-05-17 [1]
 hrbrthemes        * 0.8.0      2020-03-06 [1]
 htmltools           0.5.2      2021-08-25 [1]
 htmlwidgets         1.5.4      2021-09-08 [1]
 httr                1.4.2      2020-07-20 [1]
 janitor             2.1.0      2021-01-05 [1]
 jpeg              * 0.1-9      2021-07-24 [1]
 jquerylib           0.1.4      2021-04-26 [1]
 jsonlite            1.7.2      2020-12-09 [1]
 kableExtra        * 1.3.4      2021-02-20 [1]
 KernSmooth          2.23-20    2021-05-03 [1]
 klippy            * 0.0.0.9500 2021-11-19 [1]
 knitr             * 1.36       2021-09-29 [1]
 labeling            0.4.2      2020-10-20 [1]
 lattice             0.20-44    2021-05-02 [1]
 latticeExtra        0.6-29     2019-12-19 [1]
 lazyeval            0.2.2      2019-03-15 [1]
 leafem            * 0.1.6      2021-05-24 [1]
 leaflet           * 2.0.4.1    2021-01-07 [1]
 leaflet.providers   1.9.0      2019-11-09 [1]
 leafsync            0.1.0      2019-03-05 [1]
 leaps               3.1        2020-01-16 [1]
 lessR             * 4.1.4      2021-12-14 [1]
 lifecycle           1.0.1      2021-09-24 [1]
 lubridate           1.8.0      2021-10-07 [1]
 lwgeom              0.2-7      2021-07-28 [1]
 magrittr            2.0.1      2020-11-17 [1]
 modelr              0.1.8      2020-05-19 [1]
 munsell             0.5.0      2018-06-12 [1]
 openxlsx            4.2.4      2021-06-16 [1]
 patchwork         * 1.1.1      2020-12-17 [1]
 pillar              1.6.4      2021-10-18 [1]
 pjpv2020.01       * 0.0.0.9000 2021-09-15 [1]
 pkgconfig           2.0.3      2019-09-22 [1]
 plotly            * 4.9.4.1    2021-06-18 [1]
 plyr                1.8.6      2020-03-03 [1]
 png                 0.1-7      2013-12-03 [1]
 prettyunits         1.1.1      2020-01-24 [1]
 progress            1.2.2      2019-05-16 [1]
 proxy               0.4-26     2021-06-07 [1]
 purrr             * 0.3.4      2020-04-17 [1]
 R6                  2.5.1      2021-08-19 [1]
 raster              3.4-13     2021-06-18 [1]
 RColorBrewer        1.1-2      2014-12-07 [1]
 Rcpp                1.0.7      2021-07-07 [1]
 readr             * 2.0.1      2021-08-10 [1]
 readxl            * 1.3.1      2019-03-13 [1]
 remotes             2.4.0      2021-06-02 [1]
 reprex              2.0.1      2021-08-05 [1]
 rlang               0.4.12     2021-10-18 [1]
 rmarkdown           2.11       2021-09-14 [1]
 rnaturalearth     * 0.1.0      2017-03-21 [1]
 rnaturalearthdata * 0.1.0      2017-02-21 [1]
 robustbase          0.93-9     2021-09-27 [1]
 rprojroot           2.0.2      2020-11-15 [1]
 rstudioapi          0.13       2020-11-12 [1]
 Rttf2pt1            1.3.9      2021-07-22 [1]
 rvest               1.0.1      2021-07-26 [1]
 s2                  1.0.6      2021-06-17 [1]
 sass                0.4.0      2021-05-12 [1]
 scales              1.1.1      2020-05-11 [1]
 sessioninfo         1.1.1      2018-11-05 [1]
 sf                * 1.0-2      2021-07-26 [1]
 snakecase           0.11.0     2019-05-25 [1]
 sp                  1.4-5      2021-01-10 [1]
 stars               0.5-3      2021-06-08 [1]
 stringi             1.7.5      2021-10-04 [1]
 stringr           * 1.4.0      2019-02-10 [1]
 svglite             2.0.0      2021-02-20 [1]
 systemfonts         1.0.2      2021-05-11 [1]
 tibble            * 3.1.6      2021-11-07 [1]
 tidyr             * 1.1.4      2021-09-27 [1]
 tidyselect          1.1.1      2021-04-30 [1]
 tidyverse         * 1.3.1      2021-04-15 [1]
 tmap              * 3.3-2      2021-06-16 [1]
 tmaptools           3.1-1      2021-01-19 [1]
 tweenr              1.0.2      2021-03-23 [1]
 tzdb                0.1.2      2021-07-20 [1]
 units               0.7-2      2021-06-08 [1]
 usethis             2.0.1      2021-02-10 [1]
 utf8                1.2.2      2021-07-24 [1]
 vctrs               0.3.8      2021-04-29 [1]
 vembedr           * 0.1.4      2020-10-10 [1]
 viridis           * 0.6.1      2021-05-11 [1]
 viridisLite       * 0.4.0      2021-04-13 [1]
 webshot             0.5.2      2019-11-22 [1]
 withr               2.4.3      2021-11-30 [1]
 wk                  0.5.0      2021-07-13 [1]
 xfun                0.28       2021-11-04 [1]
 XML                 3.99-0.8   2021-09-17 [1]
 xml2                1.3.2      2020-04-23 [1]
 yaml                2.2.1      2020-02-01 [1]
 zip                 2.2.0      2021-05-31 [1]
 source                               
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.1)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.1)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.1)                       
 CRAN (R 4.1.0)                       
 Github (rstudio/gt@df86e0c)          
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.1)                       
 Github (rlesur/klippy@378c247)       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.1)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 Github (perezp44/pjpv2020.01@6c6065f)
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.1)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.1)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       
 CRAN (R 4.1.0)                       

[1] /Library/Frameworks/R.framework/Versions/4.1/Resources/library






LS0tCnRpdGxlOiAiSGlzdG9yaWEgZWNvbsOzbWljYSBkZSBTdWTDoWZyaWNhIgpzdWJ0aXRsZTogIk1hcmlvIEdhcmPDrWEgWmFtb3JhKG1hZ2FyemEyQGFsdW1uaS51di5lcykiICMtIHBvbmdvIHTDuiBub21icmUgYWjDrSBwYXJhIHEgYXBhcmV6Y2EgbcOhcyBncmFuZGUgcSBlbCBkZSBsYSBVVgphdXRob3I6ICJVbml2ZXJzaXRhdCBkZSBWYWzDqG5jaWEiCmRhdGU6ICJEaWNpZW1icmUgZGUgMjAyMSAoYWN0dWFsaXphZG8gZWwgYHIgZm9ybWF0KFN5cy50aW1lKCksICclZC0lbS0lWScpYCkiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OiAKICAgIHRoZW1lOiBzaW1wbGV4CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IHllcwogICAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMKICAgIGRmX3ByaW50OiBrYWJsZQogICAgY29kZV9kb3dubG9hZDogeWVzCiAgICBjb2RlX2ZvbGRpbmc6ICJoaWRlIgplZGl0b3Jfb3B0aW9uczogCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGNvbnNvbGUKICB0aGVtZTogdGFjdGlsZQotLS0KCmBgYHtyIHBhY2thZ2VzLXNldHVwLCBpbmNsdWRlID0gRkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGtsaXBweSkgIApyZW1vdGVzOjppbnN0YWxsX2dpdGh1Yigicmxlc3VyL2tsaXBweSIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkodGliYmxlKQpsaWJyYXJ5KGdndGhlbWVzKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkocGF0Y2h3b3JrKQpsaWJyYXJ5KGdncmVwZWwpCmxpYnJhcnkoc2YpCmxpYnJhcnkoZ2dzcGF0aWFsKQpsaWJyYXJ5KHJuYXR1cmFsZWFydGgpCmxpYnJhcnkocm5hdHVyYWxlYXJ0aGRhdGEpCmxpYnJhcnkocGpwdjIwMjAuMDEpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KGdnYW5pbWF0ZSkKbGlicmFyeSAoZ2lmc2tpKQpsaWJyYXJ5KGd0KQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkoRFQpCmxpYnJhcnkobGVhZmxldCkgCmxpYnJhcnkobGVhZmVtKSAKbGlicmFyeShEVCkKbGlicmFyeSh0bWFwKQpsaWJyYXJ5KGxlYWZsZXQpCmxpYnJhcnkodmVtYmVkcikKbGlicmFyeShocmJydGhlbWVzKQpsaWJyYXJ5KHJlYWR4bCkKbGlicmFyeSh2aXJpZGlzKQpsaWJyYXJ5KGZvcmNhdHMpCmxpYnJhcnkobGVzc1IpCnJlcXVpcmUoImpwZWciKQpyZXF1aXJlKCJncmlkIikKYGBgCgpgYGB7ciBjaHVuay1zZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIGV2YWwgPSBUUlVFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgCiAgICAgICAgICAgICAgICAgICAgICAjcmVzdWx0cyA9ICJob2xkIiwKICAgICAgICAgICAgICAgICAgICAgIGNhY2hlID0gRkFMU0UsIGNhY2hlLnBhdGggPSAiL2NhY2hlcy8iLCBjb21tZW50ID0gIiM+IiwKICAgICAgICAgICAgICAgICAgICAgICNmaWcud2lkdGggPSA3LCAjZmlnLmhlaWdodD0gNywgICAKICAgICAgICAgICAgICAgICAgICAgICNvdXQud2lkdGggPSA3LCBvdXQuaGVpZ2h0ID0gNywKICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlID0gVFJVRSwgIGZpZy5zaG93ID0gImhvbGQiLAogICAgICAgICAgICAgICAgICAgICAgZmlnLmFzcCA9IDAuNjI4LCBvdXQud2lkdGggPSAiNzUlIiwgZmlnLmFsaWduID0gImNlbnRlciIpCmtuaXRyOjpvcHRzX2NodW5rJHNldChkZXYgPSAicG5nIiwgZGV2LmFyZ3MgPSBsaXN0KHR5cGUgPSAiY2Fpcm8tcG5nIikpCmBgYAoKCmBgYHtyIG9wdGlvbnMtc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0Kb3B0aW9ucyhzY2lwZW4gPSA5OTkpICMtIHBhcmEgcXVpdGFyIGxhIG5vdGFjacOzbiBjaWVudMOtZmljYQpvcHRpb25zKCJ5YW1sLmV2YWwuZXhwciIgPSBUUlVFKSAKYGBgCgoKYGBge3Iga2xpcHB5LCBlY2hvID0gRkFMU0V9CmtsaXBweTo6a2xpcHB5KHBvc2l0aW9uID0gYygidG9wIiwgInJpZ2h0IikpICMtIHJlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJybGVzdXIva2xpcHB5IikKYGBgCjxociBjbGFzcz0ibGluZWEtYmxhY2siPgoKPCEtLSBFbCBww6FycmFmbyBkZSBhYmFqbyBoYXMgZGUgZGVqYXJsbyBjYXNpIGlndWFsLCBzb2xvIEhBUyBkZSBTVVNUSVRVSVIgInBlcmV6cDQ0IiBwb3IgdHUgdXN1YXJpbyBkZSBHaXRodWItLT4KVHJhYmFqbyBlbGFib3JhZG8gcGFyYSBsYSBhc2lnbmF0dXJhICJQcm9ncmFtYWNpw7NuIHkgbWFuZWpvIGRlIGRhdG9zIGVuIGxhIGVyYSBkZWwgQmlnIERhdGEiIGRlIGxhIFVuaXZlcnNpdGF0IGRlIFZhbMOobmNpYSBkdXJhbnRlIGVsIGN1cnNvIDIwMjEtMjAyMi4gRWwgcmVwbyBkZWwgdHJhYmFqbyBlc3TDoSBbYXF1w61dKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJldGVnei90cmFiYWpvX0JpZ0RhdGEpe3RhcmdldD0iX2JsYW5rIn0uIAoKPCEtLSBFbCBww6FycmFmbyBkZSBhYmFqbyBoYXMgZGUgZGVqYXJsbyBleGFjdGFtZW50ZSBpZ3VhbCwgTk8gSEFTIERFIENBTUJJQVIgTkFEQS0tPgoKTGEgcMOhZ2luYSB3ZWIgZGUgbGEgYXNpZ25hdHVyYSB5IGxvcyB0cmFiYWpvcyBkZSBtaXMgY29tcGHDsWVyb3MgcHVlZGVuIHZlcnNlIFthcXXDrV0oaHR0cHM6Ly9wZXJlenA0NC5naXRodWIuaW8vaW50cm8tZHMtMjEtMjItd2ViLzA3LXRyYWJham9zLmh0bWwpe3RhcmdldD0iX2JsYW5rIn0uCgoKPGhyIGNsYXNzPSJsaW5lYS1yZWQiPgoKIyA8Rk9OVCBDT0xPUj0iIzJiMzA4ZiI+ICoqMS4gSW50cm9kdWNjacOzbioqIDwvRk9OVD4KPEZPTlQgQ09MT1I9IiM4ZjJiMzAiPgpTdWTDoWZyaWNhIGVzIHVubyBkZSBsb3MgcGHDrXNlcyBtw6FzIGRlc2Fycm9sbGFkb3MgZGUgdG9kbyBlbCBjb250aW5lbnRlIGFmcmljYW5vLiBTdSBQSUIgcmVwcmVzZW50YSBlbCAyNSUgZGUgdG9kbyBlbCBjb250aW5lbnRlIHkgc3UgZXZvbHVjacOzbiBkZXNkZSBlbCBzaWdsbyBwYXNhZG8gaGEgc2lkbyBub3RhYmxlLCBwZXJvIMK/YSBxdcOpIHNlIGRlYmUgZXN0ZSBjcmVjaW1pZW50bz8gwr9Qb2RlbW9zIHBvbmVyIGEgU3Vkw6FmcmljYSBhIGxhIGFsdHVyYSBkZSBwYcOtc2VzIGRlc2Fycm9sbGFkb3MgbyBlbiBkZXNhcnJvbGxvPyDCv0VzdMOhIG3DoXMgY2VyY2EgU3Vkw6FmcmljYSBkZSBDaGluYSBvIGRlIGxvcyBwYcOtc2VzIGRlIHN1IGVudG9ybm8/CgpUb2RhcyBlc3RhcyBwcmVndW50YXMgc29uIGxhcyBxdWUgZXNwZXJvIGRhciByZXNwdWVzdGEgZW4gZXN0ZSBhbsOhbGlzaXMsIHBhcmEgZWxsbyBub3MgY2VudHJhcmVtb3MgZW4gZGlmZXJlbnRlcyB2YXJpYWJsZXMgcXVlIHlvIGNvbnNpZGVybyBlc2VuY2lhbGVzIHBhcmEgZW50ZW5kZXIgZWwgY3JlY2ltaWVudG8gZGUgdW4gcGHDrXMuIEVzdGFzIHNlcsOhbiBlbCBQSUIgcGVyIGPDoXBpdGEsIGRvbmRlIGNlbnRyYXLDqSBsYSBtYXlvciBwYXJ0ZSBkZSBsb3MgZXNmdWVyem9zOyB0YW1iacOpbiBhbmFsaXphcsOpIGxhIGVzcGVyYW56YSBkZSB2aWRhLCBsb3Mgc2VjdG9yZXMgZGUgY3JlY2ltaWVudG8sIGxhIGRlc2lndWFsZGFkIHkgbGEgcG9icmV6YSwgYXPDrSBjb21vIGVsIGNvbWVyY2lvIGV4dGVyaW9yLiAKPC9GT05UPgoKCgoKYGBge3IsIGV2YWwgPSBUUlVFfQoKCmBgYAoKCgojIDxGT05UIENPTE9SPSIjMmIzMDhmIj4gKioyLiBEYXRvcyoqIDwvRk9OVD4KPEZPTlQgQ09MT1I9IiM4ZjJiMzAiPgpFbmNvbnRyYXIgbG9zIGRhdG9zIHkgYXJyZWdsYXJsb3Mgbm8gaGEgc2lkbyB1bmEgdGFyZWEgZGVtYXNpYWRvIGNvbXBsaWNhZGEsIGNvbiDDum5pY2FtZW50ZSAyIGZ1ZW50ZXMgZGUgZGF0b3MgZXh0cmHDrWRhcyBkaXJlY3RhbWVudGUgZGVsIEJhbmNvIE11bmRpYWwgeSBkZWwgTWFkaXNvbiBQcm9qZWN0IGRhdGFiYXNlIHRlbmVtb3Mgc3VmaWNpZW50ZSBwYXJhIGFuYWxpemFyIGxvIHF1ZSBuZWNlc2l0YW1vcy4gQWRlbcOhcywgZGVzZGUgZWwgcGFxdWV0ZSB0bWFwIHBvZGVtb3MgdXRpbGl6YXIgbG9zIGRhdG9zIGRlIFdvcmxkLCBwYXJhIGF5dWRhcm5vcyBlbiBsYSBzZXBhcmFjacOzbiBwb3IgY29udGluZW50ZXMsIHJlZ2lvbmVzIHkgY29vcmRlbmFkYXMuCgpObyB0ZW5nbyBsb3MgbGlua3MgZGUgZG9uZGUgZXh0cmFqZSBsb3MgZGF0b3MgeWEgcXVlIGxvcyBzYXF1w6kgaGFjZSB0aWVtcG8geSBubyBsb3MgYXB1bnTDqSwgZGUgdG9kYXMgbWFuZXJhcyBlc3TDoW4gc2FjYWRvcyBkaXJlY3RhbWVudGUgZGUgbGEgd2ViIHNpbiBuaW5ndW5hIG1vZGlmaWNhY2nDs24gcG9yIGxvIHF1ZSBlbCBsaW5rIHNlIHB1ZWRlIGVuY29udHJhci4gRWwgcHJvYmxlbWEgZXMgcXVlLCBwb3IgZWplbXBsbywgZW4gbG9zIGRhdG9zIGRlbCBCYW5jbyBNdW5kaWFsLCBwYXJhIHNhY2FyIGV4YWN0YW1lbnRlIGVsIGV4Y2VsIHF1ZSB5byBoZSB1dGlsaXphZG8gZXMgbmVjZXNhcmlvIGZpbHRyYXIgYWxndW5hIHNlcmllIGRlIGNvc2FzIGVuIGxhIHByb3BpYSB3ZWIuCjwvRk9OVD4KCgpgYGB7ciwgZXZhbCA9IFRSVUV9Cm1wZDIwMjAgPC0gcmVhZF9leGNlbCgiZGF0b3MvbXBkMjAyMC54bHN4Iiwgc2hlZXQgPSAiRnVsbCBkYXRhIikKCmRhdGEoV29ybGQpIAp3b3JsZDwtIFdvcmxkICU+JQogIHJlbmFtZShjb3VudHJ5Y29kZSA9IGlzb19hMykgJT4lCiAgc2VsZWN0KGNvdW50cnljb2RlLCBjb250aW5lbnQpCgpiYW5jb19tdW5kaWFsIDwtIHJlYWRfZXhjZWwoIi4vZGF0b3MvYmFuY29fbXVuZGlhbC54bHN4IikKYmFuY29fbXVuZGlhbFssIGMoNTo2NSldIDwtIHNhcHBseShiYW5jb19tdW5kaWFsWywgYyg1OjY1KV0sIGFzLm51bWVyaWMpCmJhbmNvX211bmRpYWwgPC1iYW5jb19tdW5kaWFsJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKDU6NjUpLCB2YWx1ZXNfdG8gPSAic2VyaWVzIiwgbmFtZXNfdG8gPSAieWVhciIgKQoKCmJhbmNvX211bmRpYWxfMSA8LSBiYW5jb19tdW5kaWFsICU+JSBzZWxlY3QoeWVhciwgc2VyaWVzLCAnU2VyaWVzIE5hbWUnLCAnQ291bnRyeSBOYW1lJywgYENvdW50cnkgQ29kZWApICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSAnU2VyaWVzIE5hbWUnLCB2YWx1ZXNfZnJvbSA9IHNlcmllcywgdmFsdWVzX2ZuID0gc3VtKQpgYGAKCgojIyA8Rk9OVCBDT0xPUj0iIzEyNTIyZiI+IDIuMSBQcm9jZXNhbmRvIGxvcyBkYXRvcyA8L0ZPTlQ+CjxGT05UIENPTE9SPSIjOGYyYjMwIj4KTG8gbcOhcyBkaWbDrWNpbCBlbiBsYSBleHRyYWNjacOzbiBkZSBkYXRvcyBzZSBkYSBjdWFuZG8gdHJhdGFtb3MgZGUgaW1wb3J0YXIgZWwgZXhjZWwgZGVsIEJhbmNvIE11bmRpYWwsIHB1ZXN0byBxdWUgbG9zIGRhdG9zIHNhbGVuIGFsIHJldsOpcyBkZSBjb21vIG5vcyBndXN0YXLDrWEgbWFuZWphcmxvcywgcGVybyBjb24gdW4gcGl2b3QgbG9uZ2VyIHBvZGVtb3MgdHJhYmFqYXIgbXVjaG8gbWVqb3IuIEVsIHByb2JsZW1hIGVzIHF1ZSBhc8OtIHRhbXBvY28gc2UgcXVlZGEgY29tbyBxdWVyZW1vcywgYW50ZXMgZXN0YWJhbiBsYXMgZmVjaGFzIGVuIGxhcyBjb2x1bW5hcywgZXMgZGVjaXIsIGNhZGEgY29sdW1uYSBlcmEgdW5hIGZlY2hhLCBhaG9yYSBlc28gZXN0w6EgYmllbiBwZXJvIGxhcyB2YXJpYWJsZXMgbm8gc29uIHVuYSBjb2x1bW5hIGNhZGEgdW5hLiBQb3IgbG8gdGFudG8gaGF5IHF1ZSBoYWNlciB1biBwaXZvdCB3aWRlciBtw6FzIHBlcm8gaGF5IHF1ZSBhbGFkaXIgbGEgZnVuY2nDs24gdmFsdWVzX2ZuID0gc3VtIHBvcnF1ZSBzaW5vIG5vIGNvbG9jYSBsb3MgZGF0b3MgY29ycmVjdGFtZW50ZS4KClNpbiBkdWRhIGVzdMOhIGZ1ZSBsYSBwYXJ0ZSBtw6FzIGNvbXBsaWNhZGEgZGUgYXJyZWdsYXIsIGF1bnF1ZSBkZSBudWV2byB0ZW7DrWFtb3MgdW4gcHJvYmxlbWEgcXVlIG5vIHB1ZGUgc29sdWNpb25hciBoYXN0YSBtw6FzIHRhcmRlLCBjdWFuZG8geWEgaGFiw61hIGFsZ8O6biBncsOhZmljbyBoZWNoby4gTGFzIGZlY2hhcyBubyBzb24gbsO6bWVyaWNhcyBwdWVzdG8gcXVlIHZpZW5lbiBjb24gZWwgZm9ybWF0byAiMjEwOFtZUjIwMThdIiBwb3IgbG8gcXVlIGEgbGEgaG9yYSBkZSBoYWNlciBncsOhZmljb3MgZXMgdW4gcHJvYmxlbWEgZ3JhbmRlLiBQYXJhIGVsbG8gdHV2aW1vcyBxdWUgY3JlYXIgbGEgdmFyaWFibGUgZGF0ZSB5IGHDsWFkaXJsYSBtYW51YWxtZW50ZSBhbCBkZiwgcGVybyBsbyBpcsOpIGhhY2llbmRvIGVuIGNhZGEgZ3LDoWZpY28gcG9ycXVlLCBjb21vIGRpZ28sIGVzIHVuIHByb2JsZW1hIHF1ZSBzb2x1Y2lvbsOpIHRhcmRlLgoKPC9GT05UPgoKIyA8Rk9OVCBDT0xPUj0iIzJiMzA4ZiI+ICoqMy4gVHJhYmFqb3MgZW4gbG9zIHF1ZSB0ZSBoYXMgYmFzYWRvKiogPC9GT05UPgo8Rk9OVCBDT0xPUj0iIzhmMmIzMCI+Ck5vIG1lIGhlIGJhc2FkbyBlbiBuaW5nw7puIHRyYWJham8gZW4gcGFydGljdWxhciwgaGUgYnVzY2FkbyBpbmZvcm1hY2nDs24gZW4gaW5maW5pZGFkIGRlIHNpdGlvcyB5LCBlbiBjdWFudG8gYWwgY29udGVuaWRvLCBtZSBoZSBjZW50cmFkbyBwcmluY2lwYWxtZW50ZSBlbiBsYXMgaW5kaWNhY2lvbmVzIGRlIG1pIGFzaWduYXR1cmEgImNyZWNpbWllbnRvIHkgZGVzYXJyb2xsbyBlY29uw7NtaWNvIGVuIGxhIGhpc3RvcmlhIiwgZG9uZGUgYW5hbGl6YW1vcyBsYSBldm9sdWNpw7NuIGRlIGxvcyBkaWZlcmVudGVzIHRlcnJpdG9yaW9zIGRlbCBtdW5kbyBhIGxvIGxhcmdvIGRlIGxhIGhpc3RvcmlhIHkgcG9kZW1vcyBoYWNlcm5vcyB1bmEgaWRlYSBkZWwgcG9yIHF1w6kgZGUgc3UgZXZvbHVjacOzbiBzZWfDum4gbG9zIHByaW5jaXBhbGVzIGZhY3RvcmVzLgoKPC9GT05UPgoKIyA8Rk9OVCBDT0xPUj0iIzJiMzA4ZiI+ICoqNC4gUElCIHBlciBjw6FwaXRhKiogPC9GT05UPgoKCgojIyA8Rk9OVCBDT0xPUj0iIzEyNTIyZiI+IDQuMSBFdm9sdWNpw7NuIDwvRk9OVD4gey50YWJzZXQgLnRhYnNldC1waWxsc30KCgoKPEZPTlQgQ09MT1I9IiM4ZjJiMzAiPgpBcXXDrSBwb2RlbW9zIGFwcmVjaWFyIGNvbW8gYSBwYXJ0aXIgZGUgbGEgZMOpY2FkYSBkZSBsb3MgNDAgZWwgY3JlY2ltaWVudG8gc3VkYWZyaWNhbm8gY29taWVuemEgYSBzZXIgbm90YWJsZSwgZXMgY3VhbmRvIGxhcyDDqWxpdGVzIGJsYW5jYXMgZGVsIHBhw61zIGNvbWllbnphbiBhIHNlciBtw6FzIGF1dG9zdWZpY2llbnRlcyB5IGEgY29udHJvbGFyIGNhZGEgdmV6IG3DoXMgcmlxdWV6YSBncmFjaWFzIGFsIGNyZWNpbWllbnRvIGRlIHN1cyBtaW5hcyB5IHN1cyBlbXByZXNhcy4gRW4gZXN0b3MgYcOxb3MgbGxlZ8OzIGxhIGluZGVwZW5kZW5jaWEgZGUgUmVpbm8gVW5pZG8sIGVsIGFwYXJ0aGVpZCwgZWwgYm9pY290IGludGVybmFjaW9uYWwgeSwgZW4gbGEgZMOpY2FkYSBkZSBsb3MgOTAsIGxhIGRlbW9jcmFjaWEsIGRvbmRlIHZlbW9zIGVsIG1heW9yIGNyZWNpbWllbnRvLgoKRW4gZWwgZ3LDoWZpY28gcG9kZW1vcyBhcHJlY2lhciwgYWRlbcOhcyBkZSBsYSBldm9sdWNpw7NuIGRlbCBQUEMsIGxvcyBhw7FvcyBkdXJhbnRlIGxvcyBjdWFsZXMgU3Vkw6FmcmljYSBmdWUgdW5hIGNvbG9uaWEsIHByaW1lcm8gZGUgUGHDrXNlcyBCYWpvcyB5IG3DoXMgdGFyZGUgZGUgUmVpbm8gVW5pZG8uCgoKPC9GT05UPgoKCiMjIyA8Rk9OVCBDT0xPUj0iIzhmMmIzMCI+ICoqRW4gZMOzbGFyZXMgZGUgMjAxMCoqIDwvRk9OVD4KCgpgYGB7ciwgZXZhbCA9IFRSVUUsIGVjaG8gPSBUUlVFfQptcGQyMDIwXzEgPC0gbXBkMjAyMCAlPiUgCiAgZmlsdGVyKGNvdW50cnljb2RlID09ICJaQUYiKQpzdWRhZiA8LSByZWFkSlBFRygiLi9kYXRvcy9zdWRhZi5qcGciKQpzdWRhZiA8LSByYXN0ZXJHcm9iKHN1ZGFmLCB3aWR0aD11bml0KDEsIm5wYyIpLCBoZWlnaHQ9dW5pdCgxLCJucGMiKSwgaW50ZXJwb2xhdGU9VFJVRSkgCmJyaSA8LSByZWFkSlBFRygiLi9kYXRvcy91ay5qcGciKQpicmkgPC0gcmFzdGVyR3JvYihicmksIHdpZHRoPXVuaXQoMSwibnBjIiksIGhlaWdodD11bml0KDEsIm5wYyIpLCBpbnRlcnBvbGF0ZT1UUlVFKSAKbmVkIDwtIHJlYWRKUEVHKCIuL2RhdG9zL3BhaXNlc2Jham9zLmpwZyIpCm5lZCA8LSByYXN0ZXJHcm9iKG5lZCwgd2lkdGg9dW5pdCgxLCJucGMiKSwgaGVpZ2h0PXVuaXQoMSwibnBjIiksIGludGVycG9sYXRlPVRSVUUpIApnMSA8LSAgIGdncGxvdChtcGQyMDIwXzEsIGFlcyh4PXllYXIsIHk9Z2RwcGMpKSArCiAgYW5ub3RhdGlvbl9jdXN0b20obmVkLCB4bWluID0gLUluZiwgeG1heCA9IDE4MDAsIHltaW4gPSAwLCB5bWF4ID0gMTMwMDApKwogIGFubm90YXRpb25fY3VzdG9tKGJyaSwgeG1pbiA9IDE4MDAsIHhtYXggPSAxOTUwLCB5bWluID0gMCwgeW1heCA9IDEzMDAwKSsKICBhbm5vdGF0aW9uX2N1c3RvbShzdWRhZiwgeG1pbiA9IDE5NTAsIHhtYXggPSArSW5mLCB5bWluID0gMCwgeW1heCA9IDEzMDAwKSsKICBnZW9tX2xpbmUoIGNvbG9yPSJncmV5IikgKwogIGdlb21fcG9pbnQoc2hhcGU9MjEsIGNvbG9yPSJibGFjayIsIGZpbGw9IiM2OWIzYTIiLCBzaXplPTEpICsKICB0aGVtZV9pcHN1bSgpICsKICBnZ3RpdGxlKCJQSUIgUEVSIEPDgVBJVEEgU1VEw4FGUklDQSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoIkHDsW8iLCBicmVha3MgPSBzZXEoMTcwMCwyMDIwLDIwKSAsbGltaXRzID0gYygxNzAwLCAyMDIwKSkgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMoIlBJQiBwZXIgY8OhcHRpdGEiLCBsYWJlbHMgPSBzY2FsZXM6OmRvbGxhcikgKwogIGxhYnMoY2FwdGlvbiA9ICJFbGFib3JhY2nDs24gcHJvcGlhIGNvbiBkYXRvcyBkZWwgTWFkaXNvbiBQcm9qZWN0IERhdGFiYXNlIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTQ1KSkgCmcxIApgYGAKCgoKIyMjIDxGT05UIENPTE9SPSIjOGYyYjMwIj4gKipFbiBsb2dhcml0bW9zKiogPC9GT05UPgoKCjxGT05UIENPTE9SPSIjOGYyYjMwIj4KU2kgbG8gYW5hbGl6YW1vcyBlbiBsb2dhcml0bW9zIGFwcmVjaWFtb3MgY29tbyBsb3MgYcOxb3MgZGUgY29sb25pemFjacOzbiBubyBmdWVyb24gcHJlY2lzYW1lbnRlIGJ1ZW5vcyBwYXJhIGxvcyBzdWRhZnJpY2Fub3MsIHF1ZSBjdWFuZG8gbG9ncmFyb24gbGEgaW5kZXBlbmRlbmNpYSBmdWUgY3VhbmRvIGV4cGVyaW1lbnRhcm9uIGVsIG1heW9yIGNyZWNpbWllbnRvLgo8L0ZPTlQ+CgpgYGB7ciwgZXZhbCA9IFRSVUUsIGVjaG8gPSBUUlVFfQpnbG9nIDwtICBnZ3Bsb3QobXBkMjAyMF8xLCBhZXMoeD15ZWFyLCB5PWdkcHBjKSkgKwogIHNjYWxlX3lfbG9nMTAoIkxvZ2FyaXRtbyBQUEMiLCBOVUxMKSsKICBhbm5vdGF0aW9uX2N1c3RvbShuZWQsIHhtaW4gPSAtSW5mLCB4bWF4ID0gMTgwMCwgeW1pbiA9IDIuOSwgeW1heCA9IDQuMikrCiAgYW5ub3RhdGlvbl9jdXN0b20oYnJpLCB4bWluID0gMTgwMCwgeG1heCA9IDE5NTAsIHltaW4gPSAyLjksIHltYXggPSA0LjIpKwogIGFubm90YXRpb25fY3VzdG9tKHN1ZGFmLCB4bWluID0gMTk1MCwgeG1heCA9ICtJbmYsIHltaW4gPSAyLjksIHltYXggPSA0LjIpKyAKICBnZW9tX2xpbmUoIGNvbG9yPSJncmV5IikgKwogIGdlb21fcG9pbnQoc2hhcGU9MjEsIGNvbG9yPSJibGFjayIsIGZpbGw9IiM2OWIzYTIiLCBzaXplPTEpICsKICB0aGVtZV9pcHN1bSgpICsKICBnZ3RpdGxlKCJQSUIgUEVSIEPDgVBJVEEgU1VEw4FGUklDQSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoIkHDsW8iLCBicmVha3MgPSBzZXEoMTcwMCwyMDIwLDIwKSAsbGltaXRzID0gYygxNzAwLCAyMDIwKSkgICsKICBsYWJzKGNhcHRpb24gPSAiRWxhYm9yYWNpw7NuIHByb3BpYSBjb24gZGF0b3MgZGVsIE1hZGlzb24gUHJvamVjdCBEYXRhYmFzZSIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT00NSkpIApnbG9nCmBgYAoKCgo8YnI+CgoKCiMjIDxGT05UIENPTE9SPSIjMTI1MjJmIj4gNC4yIENvbXBhcmFjacOzbiBjb24gZWwgcmVzdG8gZGUgw4FmcmljYSA8L0ZPTlQ+CjxGT05UIENPTE9SPSIjOGYyYjMwIj4KRGVzZGUgMTk2MCBlbCBjcmVjaW1pZW50byBzdWRhZnJpY2FubyBmdWUgbm90YWJsZSwgwr9wZXJvIHBvZGVtb3MgZGlzdGluZ3VpciB1bmEgZ3JhbiBldm9sdWNpw7NuIHNpIGxvIGNvbXBhcmFtb3MgY29uIGVsIHJlc3RvIGRlIHBhw61zZXMgZGVsIGVudG9ybm8/IAoKCiMjIyA8Rk9OVCBDT0xPUj0iIzhmMmIzMCI+IDQuMi4xIENvbXBhcmFjacOzbiBlbiBtYXBhcyA8L0ZPTlQ+ey50YWJzZXQgLnRhYnNldC1waWxsc30KCgoKPEZPTlQgQ09MT1I9IiM4ZjJiMzAiPgpDb24gZXN0b3MgZG9zIG1hcGFzICh1bm8gaGFzdGEgZWwgYcOxbyAxOTk1IHkgb3RybyBwb3N0ZXJpb3IpIGFwcmVjaWFtb3MgY29tbyByZWFsbWVudGUgU3Vkw6FmcmljYSB5YSBlcmEgdW5vIGRlIGxvcyBwYcOtc2VzIGFmcmljYW5vcyBtw6FzIHJpY29zIGVuIDE5NjAgeSBmdWUgYWxnbyBxdWUgc2UgbWFudHV2byBkdXJhbnRlIHRvZG8gZWwgcGVyaW9kbywgcGVzZSBhbCBmdWVydGUgY3JlY2ltaWVudG8gZGUgb3Ryb3MgcGHDrXNlcy4KPC9GT05UPgoKCgojIyMjIDxGT05UIENPTE9SPSIjOGYyYjMwIj4gKioxOTYwIC0gMTk5NSoqIDwvRk9OVD4KCgoKCgpgYGB7ciwgZXZhbCA9IFRSVUUsIGVjaG8gPSBUUlVFfQpkZjEgPC0gaW5uZXJfam9pbihtcGQyMDIwLCB3b3JsZCkgJT4lCiAgZmlsdGVyKGNvbnRpbmVudCA9PSAiQWZyaWNhIikKZGYyIDwtIGRmMSAlPiUgZmlsdGVyKHllYXIgPj0gMTk2MCkgJT4lIGZpbHRlcih5ZWFyIDw9IDE5OTUpCgptYXBhIDwtIGdncGxvdCgpICsKICBnZW9tX3NmKGRhdGEgPSBkZjIsIGFlcyhnZW9tZXRyeSA9IGdlb21ldHJ5LCBmaWxsID0gZ2RwcGMpKSArCiAgdGhlbWVfdm9pZCgpICAgKwogIHNjYWxlX2ZpbGxfY29udGludW91cyhicmVha3MgPSBzZXEoMTAwMCwgMTUwMDAsIDEwMDApLGxvdz0iI2JhZjBmZiIsaGlnaD0iIzAyMjEyOSIpICsgCiAgIHRyYW5zaXRpb25fbWFudWFsKHllYXIpICsKICBsYWJzKHRpdGxlID0gIlBJQiBwZXIgY8OhcGl0YSBlbiDDgWZyaWNhIGHDsW8ge2N1cnJlbnRfZnJhbWV9IiwKICAgICAgIGNhcHRpb24gPSAiRnVlbnRlOiBFbGFib3JhY2nDs24gcHJvcGlhIGNvbiBkYXRvcyBkZWwgTWFkaXNvbiBQcm9qZWN0IERhdGFiYXNlIiwKICAgICAgIGZpbGwgPSAiRW4gZMOzbGFyZXMiKSArCiAgZ3VpZGVzKGZpbGwgPSBndWlkZV9jb2xvcmJhcihiYXJoZWlnaHQgPSB1bml0KDEwLCAiY20iKSkpCm1hcGEKYGBgCjxGT05UIENPTE9SPSIjOGYyYjMwIj4KUEQ6IE7Ds3Rlc2UgcXVlIHN1ZMOhZnJpY2EgZXMgZWwgcGHDrXMgc2l0dWFkbyBtw6FzIGFsIHN1ciBkZSDDgWZyaWNhCgoKCiMjIyMgPEZPTlQgQ09MT1I9IiM4ZjJiMzAiPiAqKjE5OTUgLSAyMDE4KiogPC9GT05UPgoKYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gVFJVRX0KZGYzIDwtIGRmMSAlPiUgZmlsdGVyKHllYXIgPj0xOTk2KQptYXBhOTYgPC0gZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IGRmMywgYWVzKGdlb21ldHJ5ID0gZ2VvbWV0cnksIGZpbGwgPSBnZHBwYykpICsKICB0aGVtZV92b2lkKCkgKwogIHNjYWxlX2ZpbGxfY29udGludW91cyhicmVha3MgPSBzZXEoMTAwMCwgNTAwMDAsIDUwMDApLGxvdz0iI2JhZjBmZiIsaGlnaD0iIzAyMjEyOSIpICsgCiAgdHJhbnNpdGlvbl9tYW51YWwoeWVhcikgKwogIGxhYnModGl0bGUgPSAiUElCIHBlciBjw6FwaXRhIGVuIMOBZnJpY2EgYcOxbyB7Y3VycmVudF9mcmFtZX0iLAogICAgICAgY2FwdGlvbiA9ICJGdWVudGU6IEVsYWJvcmFjacOzbiBwcm9waWEgY29uIGRhdG9zIGRlbCBNYWRpc29uIFByb2plY3QgRGF0YWJhc2UiLAogICAgICAgZmlsbCA9ICJFbiBkw7NsYXJlcyIpICsKICBndWlkZXMoZmlsbCA9IGd1aWRlX2NvbG9yYmFyKGJhcmhlaWdodCA9IHVuaXQoMTAsICJjbSIpKSkKbWFwYTk2CmBgYAoKCgo8YnI+CgoKCiMjIyA8Rk9OVCBDT0xPUj0iIzhmMmIzMCI+IDQuMi4yIENvbXBhcmFjacOzbiBlbiBncsOhZmljbyB5IGVuIHRhYmxhIDwvRk9OVD57LnRhYnNldCAudGFic2V0LXBpbGxzfQoKPEZPTlQgQ09MT1I9IiM4ZjJiMzAiPgpBcXXDrSBwb2RlbW9zIGFwcmVjaWFyIGxvIG1pc21vIHF1ZSBhbnRlcmlvcm1lbnRlLiBOw7N0ZXNlIGVsIGVsZXZhZG8gY3JlY2ltaWVudG8gZGUgcGHDrXNlcyBjb21vIEdhYsOzbiwgR3VpbmVhIEVjdWF0b3JpYWwgbyBMeWJpYSwgYXVucXVlIGVsIGRlIFN1ZMOhZnJpY2Egbm8gcG9kZW1vcyBkZWNpciBxdWUgZXN0w6kgbWFsLgo8L0ZPTlQ+CgoKCiMjIyMgPEZPTlQgQ09MT1I9IiM4ZjJiMzAiPiAqKkdyw6FmaWNvKiogPC9GT05UPgpgYGB7ciwgZXZhbCA9IFRSVUUsIGVjaG8gPSBUUlVFfQpkZjQ8LSBkZjEgJT4lIGZpbHRlcih5ZWFyID49IDE5NTApCmRmNSA8LSBkZjQgJT4lIG11dGF0ZShwYWlzZXMgPSBjb3VudHJ5KQpkZjYgPC0gZGY1ICU+JQogIGZpbHRlcihjb3VudHJ5ID09ICdTb3V0aCBBZnJpY2EnKQpnMiA8LSBnZ3Bsb3QoZGY2LCBhZXMoeD15ZWFyLCB5PWdkcHBjKSkgKwogIGdlb21fbGluZShkYXRhPWRmNSAlPiUgZHBseXI6OnNlbGVjdCgtY291bnRyeSksIGFlcyhncm91cD1wYWlzZXMpLCBjb2xvcj0iZ3JleSIsIHNpemU9MC41LCBhbHBoYT0xKSArCiAgZ2VvbV9saW5lKCBhZXMoZmlsbCA9IGNvdW50cnkpLGNvbG9yID0gIiMyZDdkM2UiLCAgc2l6ZT0xLjIgKSsKICBzY2FsZV9jb2xvcl92aXJpZGlzX2QoKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb24gPSAibGVmdCIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTQpLAogICAgcGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGxhYnModGl0bGUgPSAiUElCIHBlciBjw6FwaXRhIHBhw61zZXMgYWZyaWNhbm9zIiwgY2FwdGlvbiA9ICJFbGFib3JhY2nDs24gcHJvcGlhIGNvbiBkYXRvcyBkZWwgTWFkaXNvbiBQcm9qZWN0IERhdGFiYXNlIikgKyAKICB5bGFiKE5VTEwpICsgeGxhYihOVUxMKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAyNTAwMCwgNTAwMCksIGxpbWl0cyA9IGMoMCwgMjUwMDApKQpnZ3Bsb3RseShnMikgIApgYGAKCiMjIyMgPEZPTlQgQ09MT1I9IiM4ZjJiMzAiPiAqKlRhYmxhKiogPC9GT05UPgpgYGB7ciwgZXZhbCA9IFRSVUUsIGVjaG8gPSBUUlVFfQpEVDo6ZGF0YXRhYmxlKGRmNSkKYGBgCgoKCjxicj4KCgoKIyMjIDxGT05UIENPTE9SPSIjOGYyYjMwIj4gNC4yLjMgVG9kbyBtdWNobyBtw6FzIGNvbXBhY3RvIDwvRk9OVD4KCgo8Rk9OVCBDT0xPUj0iIzhmMmIzMCI+CkVuIGVzdGUgZ3LDoWZpY28gcG9kZW1vcyBhcHJlY2lhciBsYSBldm9sdWNpw7NuIGRlbCBQUEMgc3VkYWZyaWNhbm8gZW4gY29tcGFyYWNpw7NuIGNvbiBsYSBtZWRpYSBkZWwgw4FmcmljYSBzdWJzYWhhcmlhbmEgKHpvbmEgYSBsYSBxdWUgcGVydGVuZWNlIFN1ZMOhZnJpY2EpLCBsYSBtZWRpYSBnZW5lcmFsIGRlIHRvZG8gZWwgY29udGluZW50ZSB5IGVsIHBhw61zIHF1ZSBtw6FzIFBQQyBoYSB0ZW5pZG8gY2FkYSBhw7FvIChleGNsdXllbmRvIEd1aW5lYSBFY3VhdG9yaWFsIFkgTHliaWEgY29uIMOtbmRpY2VzIG11eSBlbGV2YWRvcykuIAoKRXMgaW50ZXJlc2FudGUgdmVyIGNvbW8gc2llbXByZSBoYSBzaWRvIG11Y2hvIG3DoXMgcmljYSBxdWUgbGEgbWVkaWEgZGVsIGNvbnRpbmVudGUgeSBtw6FzIGHDum4gcXVlIGxvcyBwYcOtc2VzIGRlIHN1IGFscmVkZWRvci4gYWRlbcOhcywgZHVyYW50ZSBsb3MgYcOxb3MgNTAgeSA2MCBlcmEgZWwgcGHDrXMgbcOhcyByaWNvIGRlIMOBZnJpY2EuCjwvRk9OVD4KYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gVFJVRX0KZGZzdWJzYWhhcmlhbiA8LSBkZjUgJT4lIGZpbHRlcihjb3VudHJ5ICVpbiUgYygiQW5nb2xhIiwgIlN1ZMOhZnJpY2EiLCAiQnVydW5kaSIsICJDYWJvIFZlcmRlIiwgIlJlcMO6YmxpY2EgQ2VudHJvYWZyaWNhbmEiLCAiUmVww7pibGljYSBEZW1vY3LDoXRpY2EgZGVsIENvbmdvIiwgIlJlcMO6YmxpY2EgZGVsIENvbmdvIiwgIkPDtHRlIGQnSXZvaXJlIiwgIkVyaXRyZWEiLCAiRXRpb3DDrWEiLCAiR3VpbmVhIiwgIktlbnlhIiwgIkxlc290aG8iLCAiTGliZXJpYSIsICJNYWRhZ2FzY2FyIiwgIk1hdXJpdGFuaWEiLCAiTW96YW1iaXF1ZSIsICJTaWVycmEgTGVvbmEiLCAiU29tYWxpYSIsICJTdWTDoW4iLCAiQm90c3dhbmEiLCAiVGFuemFuaWEiLCAiVWdhbmRhIiwgIlppbWJhYndlIikpICU+JSAKICBncm91cF9ieSh5ZWFyKSAlPiUgc3VtbWFyaXNlKG1lZGlhX2FmcmljYV9zdWJzYWhhcmlhbmEgPSBtZWFuKGdkcHBjKSkKZGZyZXN0byA8LSBkZjUgJT4lIGZpbHRlcighY291bnRyeSAlaW4lIGMoIkFuZ29sYSIsICJTdWTDoWZyaWNhIiwgIkJ1cnVuZGkiLCAiQ2FibyBWZXJkZSIsICJSZXDDumJsaWNhIENlbnRyb2FmcmljYW5hIiwgIlJlcMO6YmxpY2EgRGVtb2Nyw6F0aWNhIGRlbCBDb25nbyIsICJSZXDDumJsaWNhIGRlbCBDb25nbyIsICJDw7R0ZSBkJ0l2b2lyZSIsICJFcml0cmVhIiwgIkV0aW9ww61hIiwgIkd1aW5lYSIsICJLZW55YSIsICJMZXNvdGhvIiwgIkxpYmVyaWEiLCAiTWFkYWdhc2NhciIsICJNYXVyaXRhbmlhIiwgIk1vemFtYmlxdWUiLCAiU2llcnJhIExlb25hIiwgIlNvbWFsaWEiLCAiU3Vkw6FuIiwgIkJvdHN3YW5hIiwgIlRhbnphbmlhIiwgIlVnYW5kYSIsICJaaW1iYWJ3ZSIpKSAlPiUKICBncm91cF9ieSh5ZWFyKSAlPiUgc3VtbWFyaXNlKG1lZGlhX3Jlc3RvX2FmcmljYSA9IG1lYW4oZ2RwcGMpKQpkZmFmcmljYSA8LSBkZjUgJT4lIGdyb3VwX2J5KHllYXIpICU+JSBzdW1tYXJpc2UobWVkaWFfdG9kb19hZnJpY2EgPSBtZWFuKGdkcHBjKSkKZGZtYXggPC0gZGY1ICU+JSBmaWx0ZXIoIWNvdW50cnkgJWluJSBjKCdFcXVhdG9yaWFsIEd1aW5lYScsICdMaWJ5YScpKSU+JQogIGdyb3VwX2J5KHllYXIpICU+JSBzbGljZV9tYXgoZ2RwcGMsIG49MSkKI3RlbmVtb3MgcXVlIGV4Y2x1aXIgR3VpbmVhIEVjdWF0b3JpYWwgeSBMaWJpYSBwb3JxdWUgdGllbmUgdmFsb3JlcyBkZW1hc2lhZG8gYWx0b3MgeSBubyBzZSB2ZXLDrWEgYmllbgpnMyA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBkZjYsIGFlcyh5ZWFyLCBnZHBwYyksIGNvbG9yPSIjMmQ3ZDNlIiwgc2l6ZT0xLjIgKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBkZnN1YnNhaGFyaWFuLCBhZXMoeWVhciwgbWVkaWFfYWZyaWNhX3N1YnNhaGFyaWFuYSksIGNvbG9yPSJncmV5Iiwgc2l6ZT0wLjUgKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBkZmFmcmljYSwgYWVzKHllYXIsIG1lZGlhX3RvZG9fYWZyaWNhKSwgY29sb3I9ImdyZXkiLCBzaXplPTAuNSApICsKICBnZW9tX2xpbmUoZGF0YSA9IGRmcmVzdG8sIGFlcyh5ZWFyLCBtZWRpYV9yZXN0b19hZnJpY2EpLCBjb2xvcj0iZ3JleSIsIHNpemU9MC41ICkgKwogIGdlb21fbGluZShkYXRhID0gZGZtYXgsIGFlcyh5ZWFyLCBnZHBwYyksIGNvbG9yPSJncmV5Iiwgc2l6ZT0wLjUgKSArCiAgZ2VvbV9wb2ludChkYXRhID0gZGZtYXgsIGFlcyh5ZWFyLCBnZHBwYywgdGV4dCA9IGNvdW50cnkpLCBjb2xvdXIgPSAiZ3JleSIsIHNpemUgPSAgMC41LGFscGhhID0gMS8yKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgbGFicyh0aXRsZSA9ICJDb21wYXJhY2nDs24gUElCIHBlciBjw6FwaXRhIiwgCiAgICAgICBzdWJ0aXRsZSA9ICAiRWxhYm9yYWNpw7NuIHByb3BpYSBjb24gZGF0b3MgZGVsIE1hZGlzb24gUHJvamVjdCBEYXRhYmFzZSIpICsgCiAgeWxhYigiUElCIHBlciBjw6FwaXRhIikgKyB4bGFiKCJBw7FvIikgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTgwMDAsIDIwMDApLCBsaW1pdHMgPSBjKDAsIDIwMDAwKSwgbGFiZWxzID0gc2NhbGVzOjpkb2xsYXIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDE5NTAsIDIwMjAsIDEwKSkgKwogIGFubm90YXRlKGdlb20gPSAidGV4dCIsIHg9IDIwMTMsIHkgPSAxODcwMCxsYWJlbCA9ICJNYXlvciBQSUIgcGVyIGPDoXBpdGEgZGUgw4FmcmljYSIsc2l6ZSA9IDIuNSwgIGNvbG9yID0gImJsYWNrIikgKyAKICBhbm5vdGF0ZShnZW9tID0gInRleHQiLCB4PSAyMDE4LCB5ID0gMTMwMDAsbGFiZWwgPSAiU3Vkw6FmcmljYSIsc2l6ZSA9IDIuNSwgIGNvbG9yID0gIiMyZDdkM2UiKSArIAogIGFubm90YXRlKGdlb20gPSAidGV4dCIsIHg9IDIwMTAsIHkgPSA3MDAwLGxhYmVsID0gIlJlc3RvIGRlIMOBZnJpY2EgKG5vIHN1YnNhaGFyaWFuYSkiLHNpemUgPSAyLjUsICBjb2xvciA9ICJibGFjayIpICsgCiAgYW5ub3RhdGUoZ2VvbSA9ICJ0ZXh0IiwgeD0gMjAxNiwgeSA9IDU0MDAsbGFiZWwgPSAiQ29udGluZW50ZSBhZnJpY2FubyIsc2l6ZSA9IDIuNSwgIGNvbG9yID0gImJsYWNrIikgKyAKICBhbm5vdGF0ZShnZW9tID0gInRleHQiLCB4PSAyMDE2LCB5ID0gNDEwMCxsYWJlbCA9ICLDgWZyaWNhIFN1YnNhaGFyaWFuYSIsc2l6ZSA9IDIuNSwgIGNvbG9yID0gImJsYWNrIikgCmdncGxvdGx5KGczKQpgYGAKCgoKPGJyPgoKCgojIyA8Rk9OVCBDT0xPUj0iIzEyNTIyZiI+IDQuMyBDb21wYXJhY2nDs24gY29uIGxvcyBCUklDUyA8L0ZPTlQ+ey50YWJzZXQgLnRhYnNldC1waWxsc30KCgoKPEZPTlQgQ09MT1I9IiM4ZjJiMzAiPgpEZXNkZSAyMDExLCBTdWTDoWZyaWNhIGZ1ZSBub21icmFkYSBpbnRlZ3JhbnRlIGRlIGxvcyBCUklDUyBjb21vIHBhw61zZXMgZGUgYWx0byBjcmVjaW1pZW50byBlY29uw7NtaWNvLiBFbiBlc3RlIHNlbGVjdG8gZ3J1cG8gc2UgZW5jb250cmFiYSB0YW1iacOpbiBCcmFzaWwsIFJ1c2lhLCBDaGluYSwgSW5kaWEuIEhlIGHDsWFkaWRvIGEgRXNwYcOxYSB0YW1iacOpbiBlbiBsYSBjb21wYXJhY2nDs24gcGFyYSBoYWNlcm5vcyB1bmEgaWRlYSBtw6FzIHJlYWwuIAo8L0ZPTlQ+CgoKCiMjIyA8Rk9OVCBDT0xPUj0iIzhmMmIzMCI+IDE3MDAgLSAxOTAwIDwvRk9OVD4KCgo8Rk9OVCBDT0xPUj0iIzhmMmIzMCI+ClBvZGVtb3MgYXByZWNpYXIgY29tbyBlbiBlbCBzaWdsbyBYSVggU3Vkw6FmcmljYSBlcmEgdW4gcGHDrXMgbXVjaG8gbcOhcyByaWNvIHF1ZSBlbCByZXN0byB5IGPDs21vIGxvcyAyIHNpZ2xvcyBkZSBjb2xvbml6YWNpw7NuIGVtcG9icmVjaWVyb24gYWwgcGHDrXMuIEHDum4gYXPDrSwgc2kgbm8gY29udGFtb3MgYSBFc3Bhw7FhIChwYcOtcyBkb25kZSBlbCBjcmVjaW1pZW50byBtb2Rlcm5vIGxsZWfDsyBhbnRlcyksIHPDrSBxdWUgdmVtb3MgcXVlIFN1ZMOhZnJpY2EgZXJhIGVsIG3DoXMgcmljbyBkZSB0b2RvcywgeWEgcXVlIGVzdG9zIHRhbXBvY28gY3JlY2VuIGVuIGVzdG9zIHNpZ2xvcy4gUmV2b2x1Y2nDs24gbXV5IHRhcmTDrWEgcGFyYSBsb3MgQlJJQ1MKPC9GT05UPgoKCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IFRSVUV9CmRmOSA8LSBtcGQyMDIwICU+JSBmaWx0ZXIoY291bnRyeSAlaW4lIGMoIlNwYWluIiwgIkJyYXppbCIsICJJbmRpYSIsICJDaGluYSIsICJTb3V0aCBBZnJpY2EiKSkgJT4lIGZpbHRlcih5ZWFyICVpbiUgYygiMTcwMCIsICIxODUwIiwgIjE5MDAiKSkgJT4lIGRyb3BfbmEoZ2RwcGMpCmRmc3BhaW4gPC0gbXBkMjAyMCAlPiUgZmlsdGVyKGNvdW50cnkgPT0gIlNwYWluIikgJT4lIGZpbHRlcih5ZWFyID09IDE3MDUpICU+JSAKICByZW5hbWUoZGF0ZSA9IHllYXIpICU+JQogIG11dGF0ZSh5ZWFyID0gZGF0ZSAtIDUpICU+JSBzZWxlY3QoLWRhdGUpCmRmOSA8LSByYmluZChkZjksIGRmc3BhaW4pCmc0IDwtIGdncGxvdChkZjksIGFlcyhjb3VudHJ5LCBnZHBwYykpICsgCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSArIAogIHRoZW1lX2NsYXNzaWMoKSArIAogIGdlb21fdGV4dChhZXMoeSA9IGdkcHBjLCBsYWJlbCA9IGdkcHBjKSwgCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpLCBzaXplPTMsCiAgICAgICAgICAgIHZqdXN0PS0wLjEsIGhqdXN0PTAuNSAsY29sPSJibGFjayIsIGZvbnRmYWNlID0gImJvbGQiKSArCiAgbGFicyh0aXRsZSA9ICJDb21wYXJhY2nDs24gY29uIGxvcyBCUklDUyArIEVzcGHDsWEiLAogICAgICAgc3VidGl0bGUgPSAiKFBJQiBwZXIgY8OhcGl0YSkiLAogICAgICAgeCA9ICJQYcOtc2VzIiwKICAgICAgIHkgPSAiUElCIHBlciBjw6FwaXRhIiwgCiAgICAgICBjYXB0aW9uID0gIkVsYWJvcmFjacOzbiBwcm9waWEgY29uIGRhdG9zIGRlbCBNYWRpc29uIFByb2plY3QgRGF0YWJhc2UiKSArIAogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwLCBmYWNlID0gImJvbGQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMC41KSwgCiAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjAsIGhqdXN0ID0gMC41KSkgKwogIGZhY2V0X3dyYXAodmFycyh5ZWFyKSwgbnJvdyA9IDEpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJCcmFzaWwiLCJDaGluYSIsIkluZGlhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdWTDoWZyaWNhIiwgIkVzcGHDsWEiKSkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDMwMDApKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkKZzQKYGBgCgoKPEZPTlQgQ09MT1I9IiM4ZjJiMzAiPgpEZSBhbGd1bm9zIHBhw61zZXMgbm8gaGFiw61hIGRhdG9zIGVuIGFsZ3VuYXMgZmVjaGFzLCBoZSBjb2dpZG8gZWwgZGF0byBtw6FzIGNlcmNhbm8uIFNhbHZvIGRlIEJyYXNpbCBFbiAxNzAwIGRvbmRlIG5vIHRlbsOtYSBuYWRhIG5pIGNlcmNhLgo8L0ZPTlQ+CgoKCiMjIyA8Rk9OVCBDT0xPUj0iIzhmMmIzMCI+IFRvZG8gbXVjaG8gbcOhcyBjb21wYWN0byA8L0ZPTlQ+CgoKPEZPTlQgQ09MT1I9IiM4ZjJiMzAiPgpBIHBhcnRpciBkZSAxOTUwLCBsb3MgQlJJQ1MgY29tZW56YXJvbiBhIGNyZWNlciwgYXVucXVlIGVsIGNyZWNpbWllbnRvIG3DoXMgYWx0byB5IHBvciBlbCBxdWUgYWRxdWlyaWVyb24gZXN0YSBldGlxdWV0YSBmdWUgYSBwYXJ0aXIgZGUgbG9zIDkwLiBQb2RlbW9zIGFwcmVjaWFyIGxhIGZ1ZXJ0ZSB2ZW50YWphIHF1ZSBvYnRpZW5lIEVzcGHDsWEgZW4gMTk5NSwgZXN0ZSBjcmVjaW1pZW50byBtb2Rlcm5vIGxsZWdhcsOtYSBtw6FzIHRhcmRlIHBhcmEgbG9zIEJSSUNTLgo8L0ZPTlQ+CgoKYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gVFJVRX0KZGYxMCA8LSBtcGQyMDIwICU+JSBmaWx0ZXIoY291bnRyeSAlaW4lIGMoIlNwYWluIiwgIkJyYXppbCIsICJJbmRpYSIsICJDaGluYSIsICJSdXNzaWFuIEZlZGVyYXRpb24iLCAiU291dGggQWZyaWNhIikpICU+JSBmaWx0ZXIoeWVhciAlaW4lIGMoIjE5NTAiLCAiMTk5NSIsICIyMDE4IikpICU+JSBkcm9wX25hKGdkcHBjKQpkZnJ1c2lhIDwtIG1wZDIwMjAgJT4lIGZpbHRlcihjb3VudHJ5ID09ICJSdXNzaWFuIEZlZGVyYXRpb24iKSAlPiUgZmlsdGVyKHllYXIgPT0gMTk2MCkgJT4lIAogIHJlbmFtZShkYXRlID0geWVhcikgJT4lCiAgbXV0YXRlKHllYXIgPSBkYXRlIC0gMTApICU+JSBzZWxlY3QoLWRhdGUpCmRmMTAgPC0gcmJpbmQoZGYxMCwgZGZydXNpYSkKZzUgPC0gZ2dwbG90KGRmMTAsIGFlcyhjb3VudHJ5LCBnZHBwYykpICsgCiAgICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpICsgCiAgdGhlbWVfY2xhc3NpYygpICsgCiAgZ2VvbV90ZXh0KGFlcyh5ID0gZ2RwcGMsIGxhYmVsID0gZ2RwcGMpLCAKICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOSksIHNpemU9MywKICAgICAgICAgICAgdmp1c3Q9LTAuMSwgaGp1c3Q9MC41ICxjb2w9ImJsYWNrIiwgZm9udGZhY2UgPSAiYm9sZCIpICsKICBsYWJzKHRpdGxlID0gIkNvbXBhcmFjacOzbiBjb24gbG9zIEJSSUNTICsgRXNwYcOxYSIsCiAgICAgICBzdWJ0aXRsZSA9ICIoUElCIHBlciBjw6FwaXRhKSIsCiAgICAgICB4ID0gIlBhw61zZXMiLAogICAgICAgeSA9ICJQSUIgcGVyIGPDoXBpdGEiLCAKICAgICAgIGNhcHRpb24gPSAiRWxhYm9yYWNpw7NuIHByb3BpYSBjb24gZGF0b3MgZGVsIE1hZGlzb24gUHJvamVjdCBEYXRhYmFzZSIpICsgCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUsIGZhY2UgPSAiYm9sZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAwLjUpLCAKICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgaGp1c3QgPSAwLjUpKSArCiAgZmFjZXRfd3JhcCh2YXJzKHllYXIpLCBucm93ID0gMSkgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIkJyYXNpbCIsIkNoaW5hIiwiSW5kaWEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJ1c2lhIiwgIlN1ZMOhZnJpY2EiLCAiRXNwYcOxYSIpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMzIwMDApKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkKZzUKYGBgCgoKCjxicj4KCgoKIyA8Rk9OVCBDT0xPUj0iIzJiMzA4ZiI+ICoqNS4gRXNwZXJhbnphIGRlIHZpZGEqKiA8L0ZPTlQ+CgoKIyMgPEZPTlQgQ09MT1I9IiMxMjUyMmYiPiA1LjEgQ29tcGFyYWNpw7NuIGNvbiBlbCBtdW5kbyA8L0ZPTlQ+CgoKPEZPTlQgQ09MT1I9IiM4ZjJiMzAiPgpTaSBjb21wYXJhbW9zIHVubyBkZSBsb3MgaW5kaWNhZG9yZXMgbcOhcyBpbXBvcnRhbnRlcywgbGEgZXNwZXJhbnphIGRlIHZpZGEsIHZlbW9zIGNvbW8gbGEgZXZvbHVjacOzbiBlbiBTdWTDoWZyaWNhIGVzIHJlYWxtZW50ZSBzb3JwcmVuZGVudGUuIERlc3B1w6lzIGRlbCBjb250aW51byBjcmVjaW1pZW50byBkdXJhbnRlIGxvcyBhw7FvcyBkZWwgYXBhcnRoZWlkLCBjb24gbGEgbGxlZ2FkYSBkZSBsYSBkZW1vY3JhY2lhIGxhIGVzcGVyYW56YSBkZSB2aWRhIGNhZSBjb25zaWRlcmFibGVtZW50ZSwgYXVucXVlIGEgcGFydGlyIGRlIDIwMDUgdnVlbHZlIGEgcmVjdXBlcmFyc2UuIAoKUmVsYXRpdmFtZW50ZSBTdWTDoWZyaWNhIGhhIGVtcGVvcmFkbyBiYXN0YW50ZSBzdSBlc3BlcmFuemEgZGUgdmlkYSwgZGUgZXN0YXIgbXV5IHBvciBlbmNpbWEgZGUgbGEgbWVkaWEgYWZyaWNhbmEgeSBtdXkgY2VyY2EgZGVsIHJlc3RvIGRlbCBtdW5kbyAocmVsYXRpdmFtZW50ZSBhbCBtZW5vcykgYSBzaXR1YXJzZSBtdXkgY2VyY2EgZGUgc3UgcHJvcGlvIGNvbnRpbmVudGUuIAo8L0ZPTlQ+CmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IFRSVUV9CmVzcCA8LSBiYW5jb19tdW5kaWFsXzEgJT4lIHNlbGVjdCh5ZWFyLCAnQ291bnRyeSBOYW1lJywgJ0VzcGVyYW56YSBkZSB2aWRhIGFsIG5hY2VyLCB0b3RhbCAoYcOxb3MpJykKZXNwIDwtIGphbml0b3I6OmNsZWFuX25hbWVzKGVzcCkKZGF0ZSA8LSBjKDE5NjA6MjAyMCkKZXNwIDwtIGNiaW5kKGVzcCwgZGF0ZSkKZXNwXzEgPC0gZXNwICU+JSBmaWx0ZXIoY291bnRyeV9uYW1lID09ICJTdWTDoWZyaWNhIikKCmFmcmljYSA8LSB3b3JsZCAlPiUgZmlsdGVyKGNvbnRpbmVudCA9PSAiQWZyaWNhIikgJT4lIHNlbGVjdChjb3VudHJ5Y29kZSkKYWZyaWNhIDwtIGJhbmNvX211bmRpYWxfMSAlPiUgZmlsdGVyKGBDb3VudHJ5IENvZGVgICVpbiUgYWZyaWNhJGNvdW50cnljb2RlKQphc2lhIDwtIHdvcmxkICU+JSBmaWx0ZXIoY29udGluZW50ID09ICJBc2lhIikgJT4lIHNlbGVjdChjb3VudHJ5Y29kZSkKYXNpYSA8LSBiYW5jb19tdW5kaWFsXzEgJT4lIGZpbHRlcihgQ291bnRyeSBDb2RlYCAlaW4lIGFzaWEkY291bnRyeWNvZGUpCmV1cm9wYSA8LSB3b3JsZCAlPiUgZmlsdGVyKGNvbnRpbmVudCA9PSAiRXVyb3BlIikgJT4lIHNlbGVjdChjb3VudHJ5Y29kZSkKZXVyb3BhIDwtIGJhbmNvX211bmRpYWxfMSAlPiUgZmlsdGVyKGBDb3VudHJ5IENvZGVgICVpbiUgZXVyb3BhJGNvdW50cnljb2RlKQphbWVyaWNhIDwtIHdvcmxkICU+JSBmaWx0ZXIoY29udGluZW50ICVpbiUgYygiTm9ydGggQW1lcmljYSIsICJTb3V0aCBBbWVyaWNhIikpICU+JSBzZWxlY3QoY291bnRyeWNvZGUpCmFtZXJpY2EgPC0gYmFuY29fbXVuZGlhbF8xICU+JSBmaWx0ZXIoYENvdW50cnkgQ29kZWAgJWluJSBhbWVyaWNhJGNvdW50cnljb2RlKQpvY2VhbmlhIDwtIHdvcmxkICU+JSBmaWx0ZXIoY29udGluZW50ID09ICJPY2VhbmlhIikgJT4lIHNlbGVjdChjb3VudHJ5Y29kZSkKb2NlYW5pYSA8LSBiYW5jb19tdW5kaWFsXzEgJT4lIGZpbHRlcihgQ291bnRyeSBDb2RlYCAlaW4lIG9jZWFuaWEkY291bnRyeWNvZGUpCgplc3BfYWZyaWNhIDwtIGFmcmljYSAlPiUgc2VsZWN0KHllYXIsICdDb3VudHJ5IE5hbWUnLCAnRXNwZXJhbnphIGRlIHZpZGEgYWwgbmFjZXIsIHRvdGFsIChhw7FvcyknKQplc3BfYWZyaWNhIDwtIGphbml0b3I6OmNsZWFuX25hbWVzKGVzcF9hZnJpY2EpCmVzcF9hZnJpY2EgPC0gY2JpbmQoZXNwX2FmcmljYSwgZGF0ZSkKZXNwZXJhbnphX21lZGlhX2FmcmljYSA8LSBlc3BfYWZyaWNhICU+JSAKICBncm91cF9ieShkYXRlKSAlPiUgZHJvcF9uYSgpICU+JSBzdW1tYXJpc2UoZXNwZXJhbnphX2RlX3ZpZGFfbWVkaWFfYWZyaWNhID0gbWVhbihlc3BlcmFuemFfZGVfdmlkYV9hbF9uYWNlcl90b3RhbF9hbm9zKSkKZXNwX2FzaWEgPC0gYXNpYSAlPiUgc2VsZWN0KHllYXIsICdDb3VudHJ5IE5hbWUnLCAnRXNwZXJhbnphIGRlIHZpZGEgYWwgbmFjZXIsIHRvdGFsIChhw7FvcyknKQplc3BfYXNpYSA8LSBqYW5pdG9yOjpjbGVhbl9uYW1lcyhlc3BfYXNpYSkKZXNwX2FzaWEgPC0gY2JpbmQoZXNwX2FzaWEsIGRhdGUpCmVzcGVyYW56YV9tZWRpYV9hc2lhIDwtIGVzcF9hc2lhICU+JSAKICBncm91cF9ieShkYXRlKSAlPiUgZHJvcF9uYSgpICU+JSBzdW1tYXJpc2UoZXNwZXJhbnphX2RlX3ZpZGFfbWVkaWFfYXNpYSA9IG1lYW4oZXNwZXJhbnphX2RlX3ZpZGFfYWxfbmFjZXJfdG90YWxfYW5vcykpCmVzcF9ldXJvcGEgPC0gZXVyb3BhICU+JSBzZWxlY3QoeWVhciwgJ0NvdW50cnkgTmFtZScsICdFc3BlcmFuemEgZGUgdmlkYSBhbCBuYWNlciwgdG90YWwgKGHDsW9zKScpCmVzcF9ldXJvcGEgPC0gamFuaXRvcjo6Y2xlYW5fbmFtZXMoZXNwX2V1cm9wYSkKZXNwX2V1cm9wYSA8LSBjYmluZChlc3BfZXVyb3BhLCBkYXRlKQplc3BlcmFuemFfbWVkaWFfZXVyb3BhIDwtIGVzcF9ldXJvcGEgJT4lIAogIGdyb3VwX2J5KGRhdGUpICU+JSBkcm9wX25hKCkgJT4lIHN1bW1hcmlzZShlc3BlcmFuemFfZGVfdmlkYV9tZWRpYV9ldXJvcGEgPSBtZWFuKGVzcGVyYW56YV9kZV92aWRhX2FsX25hY2VyX3RvdGFsX2Fub3MpKQplc3BfYW1lcmljYSA8LSBhbWVyaWNhICU+JSBzZWxlY3QoeWVhciwgJ0NvdW50cnkgTmFtZScsICdFc3BlcmFuemEgZGUgdmlkYSBhbCBuYWNlciwgdG90YWwgKGHDsW9zKScpCmVzcF9hbWVyaWNhIDwtIGphbml0b3I6OmNsZWFuX25hbWVzKGVzcF9hbWVyaWNhKQplc3BfYW1lcmljYSA8LSBjYmluZChlc3BfYW1lcmljYSwgZGF0ZSkKZXNwZXJhbnphX21lZGlhX2FtZXJpY2EgPC0gZXNwX2FtZXJpY2EgJT4lIAogIGdyb3VwX2J5KGRhdGUpICU+JSBkcm9wX25hKCkgJT4lIHN1bW1hcmlzZShlc3BlcmFuemFfZGVfdmlkYV9tZWRpYV9hbWVyaWNhID0gbWVhbihlc3BlcmFuemFfZGVfdmlkYV9hbF9uYWNlcl90b3RhbF9hbm9zKSkKZXNwX29jZWFuaWEgPC1vY2VhbmlhICU+JSBzZWxlY3QoeWVhciwgJ0NvdW50cnkgTmFtZScsICdFc3BlcmFuemEgZGUgdmlkYSBhbCBuYWNlciwgdG90YWwgKGHDsW9zKScpCmVzcF9vY2VhbmlhIDwtIGphbml0b3I6OmNsZWFuX25hbWVzKGVzcF9vY2VhbmlhKQplc3Bfb2NlYW5pYSA8LSBjYmluZChlc3Bfb2NlYW5pYSwgZGF0ZSkKZXNwZXJhbnphX21lZGlhX29jZWFuaWEgPC0gZXNwX29jZWFuaWEgJT4lIAogIGdyb3VwX2J5KGRhdGUpICU+JSBkcm9wX25hKCkgJT4lIHN1bW1hcmlzZShlc3BlcmFuemFfZGVfdmlkYV9tZWRpYV9vY2VhbmlhID0gbWVhbihlc3BlcmFuemFfZGVfdmlkYV9hbF9uYWNlcl90b3RhbF9hbm9zKSkKCmc2IDwtIGdncGxvdCgpICsKICBnZW9tX2xpbmUoZGF0YSA9IGVzcF8xLCBhZXMoZGF0ZSwgZXNwZXJhbnphX2RlX3ZpZGFfYWxfbmFjZXJfdG90YWxfYW5vcyksIGNvbG9yPSIjMmQ3ZDNlIiwgc2l6ZT0xLjIgKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBlc3BlcmFuemFfbWVkaWFfYWZyaWNhLCBhZXMoZGF0ZSwgZXNwZXJhbnphX2RlX3ZpZGFfbWVkaWFfYWZyaWNhKSwgY29sb3I9ImdyZXkiLCBzaXplPTAuNSApICsKICBnZW9tX2xpbmUoZGF0YSA9IGVzcGVyYW56YV9tZWRpYV9hbWVyaWNhLCBhZXMoZGF0ZSwgZXNwZXJhbnphX2RlX3ZpZGFfbWVkaWFfYW1lcmljYSksIGNvbG9yPSJncmV5Iiwgc2l6ZT0wLjUgKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBlc3BlcmFuemFfbWVkaWFfYXNpYSwgYWVzKGRhdGUsIGVzcGVyYW56YV9kZV92aWRhX21lZGlhX2FzaWEpLCBjb2xvcj0iZ3JleSIsIHNpemU9MC41ICkgKwogIGdlb21fbGluZShkYXRhID0gZXNwZXJhbnphX21lZGlhX2V1cm9wYSwgYWVzKGRhdGUsIGVzcGVyYW56YV9kZV92aWRhX21lZGlhX2V1cm9wYSksIGNvbG9yPSJncmV5Iiwgc2l6ZT0wLjUgKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBlc3BlcmFuemFfbWVkaWFfb2NlYW5pYSwgYWVzKGRhdGUsIGVzcGVyYW56YV9kZV92aWRhX21lZGlhX29jZWFuaWEpLCBjb2xvcj0iZ3JleSIsIHNpemU9MC41ICkgKwogIHRoZW1lX2lwc3VtKCkgKwogIGxhYnModGl0bGUgPSAiRXNwZXJhbnphIGRlIHZpZGEgbWVkaWEgcG9yIGNvbnRpbmVudGVzIiwgCiAgICAgICBzdWJ0aXRsZSA9ICAiRWxhYm9yYWNpw7NuIHByb3BpYSBjb24gZGF0b3MgZGVsIEJhbmNvIE11bmRpYWwiKSArIAogIHlsYWIoIlBJQiBwZXIgY8OhcGl0YSIpICsgeGxhYigiQcOxbyIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDM1LCA4NSwgNSksIGxpbWl0cyA9IGMoNDAsIDgwKSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMTk1MCwgMjAyMCwgNSkpICsKICBhbm5vdGF0ZShnZW9tID0gInRleHQiLCB4PSAxOTk5LCB5ID0gNjIsIGxhYmVsID0gIlN1ZMOhZnJpY2EiLCBzaXplID0gMywgY29sb3IgPSAiIzJkN2QzZSIpICsKICBhbm5vdGF0ZShnZW9tID0gInRleHQiLCB4PSAyMDIwLCB5ID0gODAsbGFiZWwgPSAiRXVyb3BhIixzaXplID0gMywgIGNvbG9yID0gImJsYWNrIikgKyAKICBhbm5vdGF0ZShnZW9tID0gInRleHQiLCB4PSAyMDIwLCB5ID0gNzQuNSxsYWJlbCA9ICJBc2lhIixzaXplID0gMywgIGNvbG9yID0gImJsYWNrIikgKyAKICBhbm5vdGF0ZShnZW9tID0gInRleHQiLCB4PSAyMDE5LCB5ID0gNzcsbGFiZWwgPSAiQW3DqXJpY2EiLHNpemUgPSAzLCAgY29sb3IgPSAiYmxhY2siKSArIAogIGFubm90YXRlKGdlb20gPSAidGV4dCIsIHg9IDIwMDcsIHkgPSA2OSxsYWJlbCA9ICJPY2VhbsOtYSIsc2l6ZSA9IDMsICBjb2xvciA9ICJibGFjayIpICsgCiAgYW5ub3RhdGUoZ2VvbSA9ICJ0ZXh0IiwgeD0gMjAyMCwgeSA9IDYyLjUsbGFiZWwgPSAiw4FmcmljYSIsc2l6ZSA9IDMsICBjb2xvciA9ICJibGFjayIpIApnNiAKCmBgYAoKCgo8YnI+CgoKIyMgPEZPTlQgQ09MT1I9IiMxMjUyMmYiPiA1LjIgQ29tcGFyYWNpw7NuIGNvbiBsb3MgQlJJQ1MgKyBFc3Bhw7FhIDwvRk9OVD4KCjxGT05UIENPTE9SPSIjOGYyYjMwIj4KRGUgbnVldm8gYXByZWNpYW1vcyBlbCBtaXNtbyBwcm9ibGVtYSwgbGEgdGVuZGVuY2lhIGhhc3RhIGxvcyA5MCBlcmEgc2ltaWxhciBhbCByZXN0bywgYXVucXVlIHNpZW5kbyBkZSBsb3MgcGVvcmVzLCBwZXJvIGEgcGFydGlyIGRlIGxvcyA5MCBlbCBiYWrDs24gZGVqYSBhbCBwYcOtcyBlbiB1bmEgbXV5IG1hbGEgc2l0dWFjacOzbi4gRW4gbmluZ8O6biBtb21lbnRvIHN1cGVyw7MgYSBsYSBtZWRpYSBnbG9iYWwuCjwvRk9OVD4KYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gVFJVRX0KZXNwZXJhbnphX21lZGlhIDwtIGVzcCAlPiUgCiAgZ3JvdXBfYnkoZGF0ZSkgJT4lIGRyb3BfbmEoKSAlPiUgc3VtbWFyaXNlKGVzcGVyYW56YV9kZV92aWRhX21lZGlhX211bmRvID0gbWVhbihlc3BlcmFuemFfZGVfdmlkYV9hbF9uYWNlcl90b3RhbF9hbm9zKSkKCgplc3BfMiA8LSBlc3AgJT4lIG11dGF0ZShwYWlzZXMgPSBjb3VudHJ5X25hbWUpICU+JSBmaWx0ZXIoY291bnRyeV9uYW1lICVpbiUgYygiQnJhc2lsIiwgIkZlZGVyYWNpw7NuIGRlIFJ1c2lhIiwgIkluZGlhIiwgIkNoaW5hIiwgIkVzcGHDsWEiKSkgCgoKZzcgPC0gZ2dwbG90KGVzcF8xLCBhZXMoeD1kYXRlLCB5PWVzcGVyYW56YV9kZV92aWRhX2FsX25hY2VyX3RvdGFsX2Fub3MgKSkgKwogIGdlb21fbGluZShkYXRhPWVzcF8yICU+JSBkcGx5cjo6c2VsZWN0KC1jb3VudHJ5X25hbWUpLCBhZXMoZ3JvdXA9cGFpc2VzKSwgY29sb3I9ImdyZXkiLCBzaXplPTAuNSwgYWxwaGE9MSkgKwogIGdlb21fbGluZSggYWVzKGdyb3VwPWNvdW50cnlfbmFtZSksIGNvbG9yPSIjMmQ3ZDNlIiwgc2l6ZT0xLjIgKSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xNCksCiAgICBwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKSArCiAgbGFicyh0aXRsZSA9ICJFc3BlcmFuemEgZGUgdmlkYSBlbiBsb3MgQlJJQ1MgKyBFc3Bhw7FhIiwgY2FwdGlvbiA9ICJFbGFib3JhY2nDs24gcHJvcGlhIGNvbiBkYXRvcyBkZWwgQmFuY28gTXVuZGlhbCIpICsgCiAgeWxhYihOVUxMKSArIHhsYWIoTlVMTCkgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMTAsIDkwLCA1KSwgbGltaXRzID0gYyg0MCw4NSkpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKCBicmVha3MgPSBzZXEoMTk2MCwgMjAyMCwgNSkpKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT00NSkpICsKICBhbm5vdGF0ZShnZW9tID0gInRleHQiLCB4PSAyMDE4LCB5ID0gNjYsbGFiZWwgPSAiU3Vkw6FmcmljYSIsc2l6ZSA9IDMsICBjb2xvciA9ICJibGFjayIpICsgYW5ub3RhdGUoZ2VvbSA9ICJ0ZXh0IiwgeD0gMjAxOCwgeSA9IDcxLGxhYmVsID0gIkluZGlhIixzaXplID0gMywgIGNvbG9yID0gImJsYWNrIikgKyBhbm5vdGF0ZShnZW9tID0gInRleHQiLCB4PSAyMDE4LCB5ID0gODUsbGFiZWwgPSAiRXNwYcOxYSIsc2l6ZSA9IDMsICBjb2xvciA9ICJibGFjayIpICsgYW5ub3RhdGUoZ2VvbSA9ICJ0ZXh0IiwgeD0gMjAxOCwgeSA9IDc5LGxhYmVsID0gIkNoaW5hIixzaXplID0gMywgIGNvbG9yID0gImJsYWNrIikgKyBhbm5vdGF0ZShnZW9tID0gInRleHQiLCB4PSAyMDE4LCB5ID0gNzYsbGFiZWwgPSAiQnJhc2lsIixzaXplID0gMywgIGNvbG9yID0gImJsYWNrIikgKyBhbm5vdGF0ZShnZW9tID0gInRleHQiLCB4PSAyMDE4LCB5ID0gNzQsbGFiZWwgPSAiUnVzaWEiLHNpemUgPSAzLCAgY29sb3IgPSAiYmxhY2siKQoKZzcgKyBnZW9tX2xpbmUoZGF0YSA9IGVzcGVyYW56YV9tZWRpYSwgYWVzKGRhdGUsIGVzcGVyYW56YV9kZV92aWRhX21lZGlhX211bmRvKSwgY29sb3IgPSAiI2E2MmQyZCIpICsKICBhbm5vdGF0ZShnZW9tID0gInRleHQiLCB4PSAyMDAzLCB5ID0gNjksbGFiZWwgPSAiTWVkaWEgbXVuZG8iLHNpemUgPSAzLCAgY29sb3IgPSAiI2E2MmQyZCIpCgpgYGAKCgoKPGJyPgoKCgojIDxGT05UIENPTE9SPSIjMmIzMDhmIj4gKio2LiBTZWN0b3JlcyBkZSBjcmVjaW1pZW50byoqIDwvRk9OVD4gey50YWJzZXQgLnRhYnNldC1waWxsc30KCgoKCjxGT05UIENPTE9SPSIjOGYyYjMwIj4KTGEgZXZvbHVjacOzbiBlbiBlc3RlIHNlbnRpZG8gaGEgc2lkbyBtw6FzIHF1ZSBjb3JyZWN0YS4gTm9ybWFsbWVudGUsIGVuIGxvcyBwYcOtc2VzIGRlc2Fycm9sbGFkb3MsIGVsIFZhbG9yIEHDsWFkaWRvIEJydXRvIHNlIGNvbXBvbmUgcG9yIHVuYSBncmFuIGNhbnRpZGFkIGRlIHNlcnZpY2lvcywgbWllbnRyYXMgcXVlIGxhIGluZHVzdHJpYSB5LCBzb2JyZSB0b2RvIGxhIGFncmljdWx0dXJhIGNvbWllbnphIGEgcGVyZGVyIHBlc28uIExvcyBzZXJ2aWNpb3Mgc29uIGVsIHNlY3RvciBkb21pbmFudGUgZW4gbGEgYWN0dWFsaWRhZCBlbiBsbyBxdWUgYSBWQUIgc2UgcmVmaWVyZSwgdW5hIGVjb25vbcOtYSBjb24gdW4gcGVzbyBkZW1hc2lhZG8gYWx0byBkZSBjdWFscXVpZXJhIGRlIGxvcyBvdHJvcyAyIHNlY3RvcmVzIGVzIG11eSBwb2NvIHByb2JhYmxlIHF1ZSBzZWEgdW5hIGVjb25vbcOtYSBkZXNhcnJvbGxhZGEuIFN1ZMOhZnJpY2EsIGVuIGVzdGUgc2VudGlkbywgZXN0w6EgYSBsYSBhbHR1cmEgZGUgcGHDrXNlcyBkZXNhcnJvbGxhZG9zLgo8L0ZPTlQ+CgoKIyMgPEZPTlQgQ09MT1I9IiMxMjUyMmYiPiAxOTYwPC9GT05UPgoKCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IFRSVUV9CmRmX3NlY3RvciA8LSBiYW5jb19tdW5kaWFsXzEgJT4lIHNlbGVjdCh5ZWFyLCBgQ291bnRyeSBOYW1lYCwgYEFncmljdWx0dXJhLCB2YWxvciBhZ3JlZ2FkbyAoJSBkZWwgUElCKWAsIGBJbmR1c3RyaWEsIHZhbG9yIGFncmVnYWRvICglIGRlbCBQSUIpYCkgCmRmX3NlY3RvciA8LSBqYW5pdG9yOjpjbGVhbl9uYW1lcyhkZl9zZWN0b3IpCmRmX3NlY3RvciA8LSBkZl9zZWN0b3IgJT4lIGZpbHRlcihjb3VudHJ5X25hbWUgPT0gJ1N1ZMOhZnJpY2EnKSAlPiUgCiAgbXV0YXRlKHNlcnZpY2lvcyA9IDEwMCAtIChhZ3JpY3VsdHVyYV92YWxvcl9hZ3JlZ2Fkb19wZXJjZW50X2RlbF9waWIgKyBpbmR1c3RyaWFfdmFsb3JfYWdyZWdhZG9fcGVyY2VudF9kZWxfcGliKSkKZGZfc2VjdG9yIDwtIGNiaW5kKGRmX3NlY3RvciwgZGF0ZSkKZGZfc2VjdG9yMSA8LSBkZl9zZWN0b3IgJT4lCiAgZmlsdGVyKGRhdGUgJWluJSBjKDE5NjAsIDE5OTUsIDIwMjApKSAlPiUgc2VsZWN0KC1jKHllYXIsIGNvdW50cnlfbmFtZSkpCnMxOTYwIDwtIGRmX3NlY3RvcjEgJT4lIGZpbHRlcihkYXRlID09IDE5NjApICU+JSBzZWxlY3QoLWRhdGUpICAKczE5NjAgPC0gczE5NjAgJT4lIHBpdm90X2xvbmdlcihjb2xzID0gMTozICx2YWx1ZXNfdG8gPSAiczE5NjAiLCBuYW1lc190byA9ICJzZWN0b3JlcyIgKSAlPiUgCiAgc2VsZWN0KHMxOTYwKQpzMTk5NSA8LSBkZl9zZWN0b3IxICU+JSBmaWx0ZXIoZGF0ZSA9PSAxOTk1KSAlPiUgc2VsZWN0KC1kYXRlKSAgCnMxOTk1IDwtIHMxOTk1ICU+JSBwaXZvdF9sb25nZXIoY29scyA9IDE6MyAsdmFsdWVzX3RvID0gInMxOTk1IiwgbmFtZXNfdG8gPSAic2VjdG9yZXMiICkgJT4lIAogIHNlbGVjdChzMTk5NSkKczIwMjAgPC0gZGZfc2VjdG9yMSAlPiUgZmlsdGVyKGRhdGUgPT0gMjAyMCkgJT4lIHNlbGVjdCgtZGF0ZSkgJT4lIHBpdm90X2xvbmdlcihjb2xzID0gMTozICx2YWx1ZXNfdG8gPSAiczIwMjAiLCBuYW1lc190byA9ICJzZWN0b3JlcyIgKSAlPiUgCiAgc2VsZWN0KHMyMDIwKQoKCmV0aXF1ZXRhNjAgPC0gcGFzdGUwKHJvdW5kKHMxOTYwJHMxOTYwLCAyKSwgIiUiKQpwaWUoczE5NjAkczE5NjAsIGxhYmVscyA9IGV0aXF1ZXRhNjApCmxlZ2VuZCgidG9wbGVmdCIsIGxlZ2VuZCA9IGMoIkFncmljdWx0dXJhIiwgIkluZHVzdHJpYSIsICJTZXJ2aWNpb3MiKSwKICAgICAgIGZpbGwgPSAgYygid2hpdGUiLCAibGlnaHRibHVlIiwgIm1pc3R5cm9zZSIpKQp0aXRsZSgiUGVzbyBkZSBsb3Mgc2VjdG9yZXMgZW4gZWwgVkFCIGVuIDE5NjAiKQpgYGAKCgoKIyMgPEZPTlQgQ09MT1I9IiMxMjUyMmYiPiAxOTk1PC9GT05UPgoKCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IFRSVUV9CmV0aXF1ZXRhOTUgPC0gcGFzdGUwKHJvdW5kKHMxOTk1JHMxOTk1LCAyKSwgIiUiKQpwaWUoczE5OTUkczE5OTUsIGxhYmVscyA9IGV0aXF1ZXRhOTUpCmxlZ2VuZCgidG9wbGVmdCIsIGxlZ2VuZCA9IGMoIkFncmljdWx0dXJhIiwgIkluZHVzdHJpYSIsICJTZXJ2aWNpb3MiKSwKICAgICAgIGZpbGwgPSAgYygid2hpdGUiLCAibGlnaHRibHVlIiwgIm1pc3R5cm9zZSIpKQp0aXRsZSgiUGVzbyBkZSBsb3Mgc2VjdG9yZXMgZW4gZWwgVkFCIGVuIDE5OTUiKQoKYGBgCgoKCiMjIDxGT05UIENPTE9SPSIjMTI1MjJmIj4gMjAyMCA8L0ZPTlQ+CgoKCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IFRSVUV9CmV0aXF1ZXRhMjAgPC0gcGFzdGUwKHJvdW5kKHMyMDIwJHMyMDIwLCAyKSwgIiUiKQpwaWUoczIwMjAkczIwMjAsIGxhYmVscyA9IGV0aXF1ZXRhMjApCmxlZ2VuZCgidG9wbGVmdCIsIGxlZ2VuZCA9IGMoIkFncmljdWx0dXJhIiwgIkluZHVzdHJpYSIsICJTZXJ2aWNpb3MiKSwKICAgICAgIGZpbGwgPSAgYygid2hpdGUiLCAibGlnaHRibHVlIiwgIm1pc3R5cm9zZSIpKQp0aXRsZSgiUGVzbyBkZSBsb3Mgc2VjdG9yZXMgZW4gZWwgVkFCIGVuIDIwMjAiKQpgYGAKCgoKPGJyPgoKCiMgPEZPTlQgQ09MT1I9IiMyYjMwOGYiPiAqKjcuIENvbWVyY2lvKiogPC9GT05UPgoKCiMjIDxGT05UIENPTE9SPSIjMTI1MjJmIj4gNy4xIFRhc2EgZGUgYXBlcnR1cmEgPC9GT05UPgoKCjxGT05UIENPTE9SPSIjOGYyYjMwIj4KTGEgdGFzYSBkZSBhcGVydHVyYSBzZSBkZWZpbmUgY29tbyBsYXMgZXhwb3J0YWNpb25lcyBtw6FzIGxhcyBpbXBvcnRhY2lvbmVzIGRpdmlkaWRvIGVudHJlIGVsIFBJQiBkZSB1biBwYcOtcy4gTm8gcG9kZW1vcyBkZWNpciBxdWUgZXN0YSBzZWEgdW5hIGdyYW4gY2lmcmEgcGFyYSBTdWTDoWZyaWNhLCBxdWUgeWEgdmVtb3MgcXVlIG5vIHN1cGVyYSBlbiBwcsOhY3RpY2FtZW50ZSBuaW5nw7puIGHDsW8gYSBsb3MgcGHDrXNlcyBkZSBzdSBlbnRvcm5vLiBBw7puIGFzw60sIHRhbXBvY28gc29uIG1hbG9zIGRhdG9zLCB5YSBxdWUsIG3DoXMgbyBtZW5vcywgc2UgaGEgbWFudGVuaWRvIHJvbmRhbm8gZWwgNTAlIGRlbCBQSUIuCjwvRk9OVD4KCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IFRSVUV9CmRmX2NvbWVyY2lvIDwtIGJhbmNvX211bmRpYWxfMSAlPiUgc2VsZWN0KHllYXIsIGBDb3VudHJ5IE5hbWVgLCBgRXhwb3J0YWNpb25lcyBkZSBiaWVuZXMgeSBzZXJ2aWNpb3MgKCUgZGVsIFBJQilgLCBgSW1wb3J0YWNpb25lcyBkZSBiaWVuZXMgeSBzZXJ2aWNpb3MgKCUgZGVsIFBJQilgKSAlPiUgCiAgZmlsdGVyKGBDb3VudHJ5IE5hbWVgID09ICdTdWTDoWZyaWNhJykKZGZfY29tZXJjaW8gPC0gZGZfY29tZXJjaW8gJT4lIG11dGF0ZSh0YXNhX2FwZXJ0dXJhID0gYEV4cG9ydGFjaW9uZXMgZGUgYmllbmVzIHkgc2VydmljaW9zICglIGRlbCBQSUIpYCsgYEltcG9ydGFjaW9uZXMgZGUgYmllbmVzIHkgc2VydmljaW9zICglIGRlbCBQSUIpYCkgJT4lCiAgbXV0YXRlKHRhc2FfY29iZXJ0dXJhID0gYEV4cG9ydGFjaW9uZXMgZGUgYmllbmVzIHkgc2VydmljaW9zICglIGRlbCBQSUIpYC9gSW1wb3J0YWNpb25lcyBkZSBiaWVuZXMgeSBzZXJ2aWNpb3MgKCUgZGVsIFBJQilgKQoKZGZfY29tZXJjaW88LWNiaW5kKGRmX2NvbWVyY2lvLCBkYXRlKQoKCmRmX2NvbWVyY2lvIDwtIGRmX2NvbWVyY2lvJT4lIHNlbGVjdCgteWVhcikKCmRmX2NvbWVyY2lvMiA8LSBiYW5jb19tdW5kaWFsXzEgJT4lIHNlbGVjdCh5ZWFyLCBgQ291bnRyeSBOYW1lYCwgYEV4cG9ydGFjaW9uZXMgZGUgYmllbmVzIHkgc2VydmljaW9zICglIGRlbCBQSUIpYCwgYEltcG9ydGFjaW9uZXMgZGUgYmllbmVzIHkgc2VydmljaW9zICglIGRlbCBQSUIpYCkgICAgICAgICAgCmRmX2NvbWVyY2lvMiA8LSBqYW5pdG9yOjpjbGVhbl9uYW1lcyhkZl9jb21lcmNpbzIpCmRmX2NvbWVyY2lvMjwtY2JpbmQoZGZfY29tZXJjaW8yLCBkYXRlKQpkZl9jb21lcmNpbzIgPC0gZGZfY29tZXJjaW8yJT4lIHNlbGVjdCgteWVhcikKZGZfY29tZXJjaW8zIDwtIGRmX2NvbWVyY2lvMiAlPiUKICBmaWx0ZXIoY291bnRyeV9uYW1lICVpbiUgYygiQW5nb2xhIiwgIlN1ZMOhZnJpY2EiLCAiQnVydW5kaSIsICJDYWJvIFZlcmRlIiwgIlJlcMO6YmxpY2EgQ2VudHJvYWZyaWNhbmEiLCAiUmVww7pibGljYSBEZW1vY3LDoXRpY2EgZGVsIENvbmdvIiwgIlJlcMO6YmxpY2EgZGVsIENvbmdvIiwgIkPDtHRlIGQnSXZvaXJlIiwgIkVyaXRyZWEiLCAiRXRpb3DDrWEiLCAiR3VpbmVhIiwgIktlbnlhIiwgIkxlc290aG8iLCAiTGliZXJpYSIsICJNYWRhZ2FzY2FyIiwgIk1hdXJpdGFuaWEiLCAiTW96YW1iaXF1ZSIsICJTaWVycmEgTGVvbmEiLCAiU29tYWxpYSIsICJTdWTDoW4iLCAiQm90c3dhbmEiLCAiVGFuemFuaWEiLCAiVWdhbmRhIiwgIlppbWJhYndlIikpCmRmX2NvbWVyY2lvMyA8LSBkZl9jb21lcmNpbzMgJT4lIG11dGF0ZSh0YXNhX2FwZXJ0dXJhID0gZXhwb3J0YWNpb25lc19kZV9iaWVuZXNfeV9zZXJ2aWNpb3NfcGVyY2VudF9kZWxfcGliICsgaW1wb3J0YWNpb25lc19kZV9iaWVuZXNfeV9zZXJ2aWNpb3NfcGVyY2VudF9kZWxfcGliKSAlPiUKICBtdXRhdGUodGFzYV9jb2JlcnR1cmEgPSAoZXhwb3J0YWNpb25lc19kZV9iaWVuZXNfeV9zZXJ2aWNpb3NfcGVyY2VudF9kZWxfcGliL2ltcG9ydGFjaW9uZXNfZGVfYmllbmVzX3lfc2VydmljaW9zX3BlcmNlbnRfZGVsX3BpYikqMTAwKSAlPiUKICBncm91cF9ieShkYXRlKSAlPiUgZHJvcF9uYSh0YXNhX2FwZXJ0dXJhKSAlPiUgCiAgbXV0YXRlKG1lZGlhID0gbWVhbih0YXNhX2FwZXJ0dXJhKSkKZGZfY29tZXJjaW80IDwtIGRmX2NvbWVyY2lvMyAlPiUgZmlsdGVyKGNvdW50cnlfbmFtZSA9PSAnU3Vkw6FmcmljYScpCmNvbWVyY2lvMiA8LSAgIGdncGxvdChkZl9jb21lcmNpbzQsIGFlcyh4PWRhdGUsIHk9dGFzYV9hcGVydHVyYSkpICsKICBnZW9tX2xpbmUoZGF0YSA9IGRmX2NvbWVyY2lvNCwgYWVzKGRhdGUsIHRhc2FfYXBlcnR1cmEpLCBjb2xvcj0iZ3JleSIpICsKICBnZW9tX3BvaW50KHNoYXBlPTIxLCBjb2xvcj0iYmxhY2siLCBmaWxsPSIjNjliM2EyIiwgc2l6ZT0xKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgbGFicyh0aXRsZSA9ICJUYXNhIGRlIGFwZXJ0dXJhIChlbiAlKSIsIGNhcHRpb24gPSAiRWxhYm9yYWNpw7NuIHByb3BpYSBjb24gZGF0b3MgZGVsIEJhbmNvIE11bmRpYWwiKSAgKyB5bGFiKE5VTEwpICsgeGxhYigiQcOxbyIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwLCAxMDAsIDEwKSwgbGltaXRzID0gYygyMCwgMTAwKSkgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDE5NjAsMjAyMCwgMjApKQpjb21lcmNpbzIgKyBnZW9tX2xpbmUoZGF0YSA9IGRmX2NvbWVyY2lvMywgYWVzKGRhdGUsIG1lZGlhKSwgY29sb3I9ImdyZXkiKSArCiAgZ2VvbV9wb2ludChkYXRhID0gZGZfY29tZXJjaW8zLCBhZXMoZGF0ZSwgbWVkaWEpLCAgc2hhcGU9MjEsIGNvbG9yPSJncmVlbiIsIGZpbGw9IiM2OWIzYTIiLCBzaXplPTEpICsgIGFubm90YXRlKGdlb20gPSAidGV4dCIsIHg9IDIwMjAsIHkgPSA0OCxsYWJlbCA9ICJTdWTDoWZyaWNhIixzaXplID0gMywgIGNvbG9yID0gImRhcmtncmV5IikgKyBhbm5vdGF0ZShnZW9tID0gInRleHQiLCB4PSAyMDE2LCB5ID0gNzgsbGFiZWwgPSAiw4FmcmljYSBzdWJzYWhhcmlhbmEiLHNpemUgPSAzLCAgY29sb3IgPSAiZ3JlZW4iKQpgYGAKCgojIyA8Rk9OVCBDT0xPUj0iIzEyNTIyZiI+IDcuMiBUYXNhIGRlIGNvYmVydHVyYSA8L0ZPTlQ+CgoKPEZPTlQgQ09MT1I9IiM4ZjJiMzAiPgpMbyBidWVubyBkZSBsbyBhbnRlcmlvciBlcyBxdWUsIGxhIG1heW9yIHBhcnRlIGRlbCBjb21lcmNpbyBleHRlcmlvciwgYXVucXVlIG5vIHNlYSBzdXBlciBhYnVuZGFudGUsIHNvbiBleHBvcnRhY2lvbmVzLiBBc8OtIHNlIGFwcmVjaWEgZW4gbGEgdGFzYSBkZSBjb2JlcnR1cmEgKGV4cG9ydGFjaW9uZXMvaW1wb3J0YWNpb25lcyksIGRvbmRlIGNhc2kgc2llbXByZSBzZSBoYSBlbmNvbnRyYWRvIHBvciBlbmNpbWEgZGVsIDEwMCUuIEVzdG8gaW5kaWNhIHF1ZSBTdWTDoWZyaWNhIGVzIHVuIHBhw61zIGV4cG9ydGFkb3IsIGxvIGN1YWwgZXMgcG9zaXRpdm8gcGFyYSBsYSBiYWxhbnphIGRlIGNhcGl0YWxlcy4gCgpBw7puIGFzw60sIGxvIGNpZXJ0byBlcyBxdWUgdGFtcG9jbyBhcHJlY2lhbW9zIG5pbmd1bmEgZXZvbHVjacOzbiBlbiBuaW5ndW5hIGRlIGxhcyBkb3MgdGFzYXMgYSBsbyBsYXJnbyBkZSBsb3MgYcOxb3MuCjwvRk9OVD4KYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gVFJVRX0KZGZfY29tZXJjaW8zIDwtIGRmX2NvbWVyY2lvMyAlPiUgc2VsZWN0KC1tZWRpYSkgJT4lCiAgbXV0YXRlKG1lZGlhID0gbWVhbih0YXNhX2NvYmVydHVyYSkpCmRmX2NvbWVyY2lvNCA8LSBkZl9jb21lcmNpbzMgJT4lIGZpbHRlcihjb3VudHJ5X25hbWUgPT0gJ1N1ZMOhZnJpY2EnKQpjb21lcmNpbzMgPC0gICBnZ3Bsb3QoZGZfY29tZXJjaW80LCBhZXMoeD1kYXRlLCB5PXRhc2FfY29iZXJ0dXJhKSkgKwogIGdlb21fbGluZShkYXRhID0gZGZfY29tZXJjaW80LCBhZXMoZGF0ZSwgdGFzYV9jb2JlcnR1cmEpLCBjb2xvcj0iZ3JleSIpICsKICBnZW9tX3BvaW50KHNoYXBlPTIxLCBjb2xvcj0iYmxhY2siLCBmaWxsPSIjNjliM2EyIiwgc2l6ZT0xKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgbGFicyh0aXRsZSA9ICJUYXNhIGRlIGNvYmVydHVyYSAoZW4gJSkiLCBjYXB0aW9uID0gIkVsYWJvcmFjacOzbiBwcm9waWEgY29uIGRhdG9zIGRlbCBCYW5jbyBNdW5kaWFsIikgICsgeWxhYihOVUxMKSArIHhsYWIoIkHDsW8iKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSg1MCwgMTUwLCAxMCksIGxpbWl0cyA9IGMoNTAsIDE1MCkpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxOTYwLDIwMjAsIDIwKSkKY29tZXJjaW8zICsgZ2VvbV9saW5lKGRhdGEgPSBkZl9jb21lcmNpbzMsIGFlcyhkYXRlLCBtZWRpYSksIGNvbG9yPSJncmV5IikgKwogIGdlb21fcG9pbnQoZGF0YSA9IGRmX2NvbWVyY2lvMywgYWVzKGRhdGUsIG1lZGlhKSwgIHNoYXBlPTIxLCBjb2xvcj0iZ3JlZW4iLCBmaWxsPSIjNjliM2EyIiwgc2l6ZT0xKSArICBhbm5vdGF0ZShnZW9tID0gInRleHQiLCB4PSAyMDIwLCB5ID0gMTI0LGxhYmVsID0gIlN1ZMOhZnJpY2EiLHNpemUgPSAzLCAgY29sb3IgPSAiZGFya2dyZXkiKSArIGFubm90YXRlKGdlb20gPSAidGV4dCIsIHg9IDIwMTYsIHkgPSA4MCxsYWJlbCA9ICLDgWZyaWNhIHN1YnNhaGFyaWFuYSIsc2l6ZSA9IDMsICBjb2xvciA9ICJncmVlbiIpCmBgYAoKCgojIyA8Rk9OVCBDT0xPUj0iIzEyNTIyZiI+IDcuMyBJbnZlcnNpw7NuIGV4dHJhbmplcmEgZGlyZWN0YSA8L0ZPTlQ+ey50YWJzZXQgLnRhYnNldC1waWxsc30KCgoKPEZPTlQgQ09MT1I9IiM4ZjJiMzAiPgpDb21vIHBvZGVtb3Mgb2JzZXJ2YXIsIGxhIElFRCBkZSBTdWTDoWZyaWNhIGhhIGNyZWNpZG8gY29uc2lkZXJhYmxlbWVudGUgZW4gZWwgdGllbXBvIGF1bnF1ZSBkZSBtYW5lcmEgbcOhcyBxdWUgaXJyZWd1bGFyLiBTw60gcXVlIHBvZGVtb3MgaGFibGFyIGRlIHF1ZSBTdWTDoWZyaWNhIGhhIHBhcnRpY2lwYWRvIGVuIGxhIGdsb2FsaXphY2nDs24geSBzZSBoYSBhcHJvdmVjaGFkbyBkZSBlbGxhLgo8L0ZPTlQ+CgoKCiMjIyA8Rk9OVCBDT0xPUj0iIzhmMmIzMCI+ICoqRW4gU3Vkw6FmcmljYSoqIDwvRk9OVD4KCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IFRSVUV9CmllZCA8LSBiYW5jb19tdW5kaWFsXzEgJT4lIHNlbGVjdCh5ZWFyLCAnQ291bnRyeSBOYW1lJywgYEludmVyc2nDs24gZXh0cmFuamVyYSBkaXJlY3RhLCBlbnRyYWRhIG5ldGEgZGUgY2FwaXRhbCAoYmFsYW56YSBkZSBwYWdvcywgVVMkIGEgcHJlY2lvcyBhY3R1YWxlcylgLCAnQ291bnRyeSBDb2RlJykKaWVkIDwtIGphbml0b3I6OmNsZWFuX25hbWVzKGllZCkKaWVkPC1jYmluZChpZWQsIGRhdGUpCmllZCA8LSBpZWQlPiUgc2VsZWN0KC15ZWFyKQppZWQgPC0gaWVkICU+JSByZW5hbWUoSUVEID0gaW52ZXJzaW9uX2V4dHJhbmplcmFfZGlyZWN0YV9lbnRyYWRhX25ldGFfZGVfY2FwaXRhbF9iYWxhbnphX2RlX3BhZ29zX3VzX2FfcHJlY2lvc19hY3R1YWxlcykKaWVkIDwtIGllZCAlPiUgbXV0YXRlKElFRCA9IElFRC8xMDAwMDAwKQppZWQgPC0gaWVkJT4lIGRyb3BfbmEoKQppZWRzdWQgPC0gaWVkICU+JSBmaWx0ZXIoY291bnRyeV9uYW1lID09ICJTdWTDoWZyaWNhIikKZ2llZCA8LSAgIGdncGxvdChpZWRzdWQsIGFlcyh4PWRhdGUsIHk9SUVEKSkgKwogIGdlb21fbGluZShkYXRhID0gaWVkc3VkLCBhZXMoZGF0ZSwgSUVEKSwgY29sb3I9ImdyZXkiKSArCiAgZ2VvbV9wb2ludChzaGFwZT0yMSwgY29sb3I9ImJsYWNrIiwgZmlsbD0iIzY5YjNhMiIsIHNpemU9MSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIGxhYnModGl0bGUgPSAiSW52ZXJzacOzbiBleHRyYW5qZXJhIGRpcmVjdGEsIGVudHJhZGEgbmV0YSBkZSBjYXBpdGFsICIsIHN1YnRpdGxlID0gIkJhbGFuemEgZGUgcGFnb3MsIG1pbGxvbmVzIGRlIFVTJCBhIHByZWNpb3MgYWN0dWFsZXMiLCBjYXB0aW9uID0gIkVsYWJvcmFjacOzbiBwcm9waWEgY29uIGRhdG9zIGRlbCBCYW5jbyBNdW5kaWFsIikgICsgeWxhYihOVUxMKSArIHhsYWIoIkHDsW8iKSArCiAgc2NhbGVfeV9jb250aW51b3VzKE5VTEwsIGxhYmVscyA9IHNjYWxlczo6ZG9sbGFyKSAKZ2llZAoKYGBgCgoKCiMjIyA8Rk9OVCBDT0xPUj0iIzhmMmIzMCI+ICoqRW4gZWwgbXVuZG8qKiA8L0ZPTlQ+CgpgYGB7ciwgZXZhbCA9IFRSVUUsIGVjaG8gPSBUUlVFfQpjb250aW5lbnRzIDwtIFdvcmxkICU+JSByZW5hbWUoY291bnRyeV9jb2RlID0gaXNvX2EzKSAlPiUgc2VsZWN0KGNvdW50cnlfY29kZSwgY29udGluZW50KQppZWRfY29udCA8LSBpbm5lcl9qb2luKGllZCwgY29udGluZW50cykKaWVkX2NvbnQyIDwtIGllZF9jb250ICU+JSBncm91cF9ieShjb250aW5lbnQsIGRhdGUpICU+JSBzdW1tYXJpc2UodG90YWxfSUVEID0gc3VtKElFRCkpICU+JSAKICB1bmdyb3VwKCklPiUKICBncm91cF9ieShkYXRlKSAlPiUKICBtdXRhdGUod29ybGRfSUVEID0gc3VtKHRvdGFsX0lFRCkpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBncm91cF9ieShkYXRlKSAlPiUKICBtdXRhdGUocG9yY2VudGFqZV9JRUQgPSAodG90YWxfSUVEL3dvcmxkX0lFRCkqMTAwKSAlPiUgCiAgZmlsdGVyKGRhdGUgJWluJSBjKDE5NzAsMTk4MCwxOTkwLDIwMDAsMjAxMCwyMDE5KSkKCgpnOCA8LSBnZ3Bsb3QoaWVkX2NvbnQyLCBhZXMoeD1kYXRlLCB5PXdvcmxkX0lFRCkpICsKICBnZW9tX2JhcihhZXMoZmlsbD0gY29udGluZW50LCBsYWJlbCA9IHBvcmNlbnRhamVfSUVEKSAsIHN0YXQ9ImlkZW50aXR5IikgKwogIHRoZW1lX2NsYXNzaWMoKSAgKwogIGxhYnModGl0bGUgPSAiSW52ZXJzacOzbiBleHRyYW5qZXJhIGRpcmVjdGEsIGVudHJhZGEgbmV0YSBkZSBjYXBpdGFsICIsIAogICAgICAgZmlsbCA9ICIlIGRlIHBvYmxhY2nDs24iKSAgKyB5bGFiKE5VTEwpICsgeGxhYigiQcOxbyIpKwogIHNjYWxlX3lfY29udGludW91cyhOVUxMLCBsYWJlbHMgPSBzY2FsZXM6OmRvbGxhcikgCmdncGxvdGx5KGc4KQpgYGAKCgoKPGJyPgoKCgojIDxGT05UIENPTE9SPSIjMmIzMDhmIj4gKio4LiBQb2JyZXphIHkgdGVjbm9sb2fDrWEqKiA8L0ZPTlQ+CgoKIyMgPEZPTlQgQ09MT1I9IiMxMjUyMmYiPiA4LjEgUG9icmV6YSA8L0ZPTlQ+IHsudGFic2V0IC50YWJzZXQtcGlsbHN9CgoKCjxGT05UIENPTE9SPSIjOGYyYjMwIj4KRW4gZXN0b3MgMiBtYXBhcyBzZSBhcHJlY2lhIGNvbW8gU3Vkw6FmcmljYSBjdWVudGEgY29uIHVubyBkZSBsb3MgcG9yY2VudGFqZXMgZGUgcG9ibGFjacOzbiBwb2JyZSBtw6FzIGFsdG9zIGRlbCBtdW5kbywgYXVucXVlIGRlIGxvcyBtw6FzIGJham9zIGRlIMOBZnJpY2EuIEFxdcOtIHBvZGVtb3MgdmVyIGxhIG1lZGlhIGRlbCBwb3JjZW50YWplIGRlIHBvYmxhY2nDs24gZW50cmUgbG9zIGHDsW9zIDYwIHkgOTUsIHkgZGVzcHXDqXMgZW50cmUgbG9zIGHDsW9zIDk1IHkgMjAyMC4gCjwvRk9OVD4KCgojIyMgPEZPTlQgQ09MT1I9IiM4ZjJiMzAiPiAqKlByZS0xOTk1KiogPC9GT05UPgpgYGB7ciwgZXZhbCA9IFRSVUUsIGVjaG8gPSBUUlVFfQpkYXRhKFdvcmxkKSAKd29ybGQgPC0gV29ybGQgJT4lCiAgcmVuYW1lKGNvdW50cnljb2RlID0gaXNvX2EzKSAlPiUKICBzZWxlY3QoY291bnRyeWNvZGUsIGNvbnRpbmVudCkKd29ybGQyIDwtIHdvcmxkICAlPiUgcmVuYW1lKGNvdW50cnlfY29kZSA9IGNvdW50cnljb2RlICkKYmFuY29fbXVuZGlhbF8xIDwtIGJhbmNvX211bmRpYWxfMSAlPiUKICByZW5hbWUoY291bnRyeV9jb2RlID0gYENvdW50cnkgQ29kZWApCmRmX3BvYnJlemEgPC1iYW5jb19tdW5kaWFsXzEgJT4lIHNlbGVjdChjb3VudHJ5X2NvZGUsIGBDb3VudHJ5IE5hbWVgLCB5ZWFyLCBgVGFzYSBkZSBpbmNpZGVuY2lhIGRlIGxhIHBvYnJlemEsIHNvYnJlIGxhIGJhc2UgZGUgJDEsOTAgcG9yIGTDrWEgKDIwMTEgUFBBKSAoJSBkZSBsYSBwb2JsYWNpw7NuKWApCndvcmxkMyA8LSB3b3JsZDIgJT4lIHNlbGVjdChjb3VudHJ5X2NvZGUpCmRmX3BvYnJlemEyIDwtIGlubmVyX2pvaW4od29ybGQzLCBkZl9wb2JyZXphKQpkZl9wb2JyZXphMjwtY2JpbmQoZGZfcG9icmV6YTIsIGRhdGUpCmRmX3BvYnJlemEzIDwtIGRmX3BvYnJlemEyICU+JSBmaWx0ZXIoZGF0ZSA8PSAxOTk1KSAlPiUgZHJvcF9uYShUYXNhLmRlLmluY2lkZW5jaWEuZGUubGEucG9icmV6YS4uc29icmUubGEuYmFzZS5kZS4uMS45MC5wb3IuZMOtYS4uMjAxMS5QUEEuLi4uLmRlLmxhLnBvYmxhY2nDs24uKQpkZl9wb2JyZXphMyA8LSBkZl9wb2JyZXphMyAlPiUgZ3JvdXBfYnkoQ291bnRyeS5OYW1lKSAlPiUgc3VtbWFyaXNlKG1lZGlhID0gbWVhbihUYXNhLmRlLmluY2lkZW5jaWEuZGUubGEucG9icmV6YS4uc29icmUubGEuYmFzZS5kZS4uMS45MC5wb3IuZMOtYS4uMjAxMS5QUEEuLi4uLmRlLmxhLnBvYmxhY2nDs24uKSkKCgptYXBhMiA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9zZihkYXRhID0gZGZfcG9icmV6YTMsIGFlcyhnZW9tZXRyeSA9IGdlb21ldHJ5LCBmaWxsID0gbWVkaWEpKSArCiAgdGhlbWVfdm9pZCgpICArCiAgdGhlbWUocGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAic2VyaWYiLCBmYWNlID0gIml0YWxpYyIpLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gInNlcmlmIiwgZmFjZSA9ICAiaXRhbGljIikpICsKICBsYWJzKHRpdGxlID0gIlRhc2EgZGUgaW5jaWRlbmNpYSBkZSBsYSBwb2JyZXphIHNvYnJlIGxhIGJhc2UgZGUgMS45MCQgcG9yIGTDrWEgKDIwMTEgUFBBKSIsIAogICAgICAgc3VidGl0bGUgPSAiTWVkaWEgZW50cmUgMTk2MCAtIDE5OTUgIiAsIAogICAgICAgY2FwdGlvbiA9ICJGdWVudGU6IEVsYWJvcmFjacOzbiBwcm9waWEgY29uIGRhdG9zIGRlbCBNYWRpc29uIFByb2plY3QgRGF0YWJhc2UiLAogICAgICAgZmlsbCA9ICIlIGRlIHBvYmxhY2nDs24iKSAgKwogIHNjYWxlX2ZpbGxfY29udGludW91cyhsb3c9IiNmZmZjYmYiLGhpZ2g9IiMzZTk4NTEiKSArIAogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAyMCksIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjMpLCAKICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAxLjUpKQoKbWFwYTIgCmBgYAoKIyMjIDxGT05UIENPTE9SPSIjOGYyYjMwIj4gKipQb3N0LTE5OTUqKiA8L0ZPTlQ+CgpgYGB7ciwgZXZhbCA9IFRSVUUsIGVjaG8gPSBUUlVFfQpkZl9wb2JyZXphNCA8LSBkZl9wb2JyZXphMiAlPiUgZmlsdGVyKGRhdGUgPj0gMTk5NSkgJT4lIGRyb3BfbmEoVGFzYS5kZS5pbmNpZGVuY2lhLmRlLmxhLnBvYnJlemEuLnNvYnJlLmxhLmJhc2UuZGUuLjEuOTAucG9yLmTDrWEuLjIwMTEuUFBBLi4uLi5kZS5sYS5wb2JsYWNpw7NuLikKZGZfcG9icmV6YTQgPC0gZGZfcG9icmV6YTQgJT4lIGdyb3VwX2J5KENvdW50cnkuTmFtZSkgJT4lIHN1bW1hcmlzZShtZWRpYSA9IG1lYW4oVGFzYS5kZS5pbmNpZGVuY2lhLmRlLmxhLnBvYnJlemEuLnNvYnJlLmxhLmJhc2UuZGUuLjEuOTAucG9yLmTDrWEuLjIwMTEuUFBBLi4uLi5kZS5sYS5wb2JsYWNpw7NuLikpCm1hcGEzIDwtIGdncGxvdCgpICsKICBnZW9tX3NmKGRhdGEgPSBkZl9wb2JyZXphNCwgYWVzKGdlb21ldHJ5ID0gZ2VvbWV0cnksIGZpbGwgPSBtZWRpYSkpICsKICB0aGVtZV92b2lkKCkgICsKICB0aGVtZShwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJzZXJpZiIsIGZhY2UgPSAiaXRhbGljIiksCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAic2VyaWYiLCBmYWNlID0gICJpdGFsaWMiKSkgKwogIGxhYnModGl0bGUgPSAiVGFzYSBkZSBpbmNpZGVuY2lhIGRlIGxhIHBvYnJlemEgc29icmUgbGEgYmFzZSBkZSAxLjkwJCBwb3IgZMOtYSAoMjAxMSBQUEEpIiwgCiAgICAgICBzdWJ0aXRsZSA9ICJNZWRpYSBlbnRyZSAxOTk1IC0gMjAyMCAiICwgCiAgICAgICBjYXB0aW9uID0gIkZ1ZW50ZTogRWxhYm9yYWNpw7NuIHByb3BpYSBjb24gZGF0b3MgZGVsIE1hZGlzb24gUHJvamVjdCBEYXRhYmFzZSIsCiAgICAgICBmaWxsID0gIiUgZGUgcG9ibGFjacOzbiIpICArCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKGxvdz0iI2ZmZmNiZiIsaGlnaD0iIzNlOTg1MSIpICsgCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDIwKSwgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuMyksIAogICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDEuNSkpCgptYXBhMyAKYGBgCgoKPGJyPgoKCiMjIDxGT05UIENPTE9SPSIjMTI1MjJmIj4gOC4yIFRlY25vbG9nw61hIDwvRk9OVD4KPEZPTlQgQ09MT1I9IiM4ZjJiMzAiPgpQYXJhIGlsdXN0cmFyIGVsIGFjY2VzbyBhIGxhIHRlY25vbG9nw61hIHRlbmVtb3MgdW4gZ3LDoWZpY28gY29uIGVsIGNyZWNpbWllbnRvIGVuIGVsIHVzbyBkZSB0ZWzDqWZvbm9zIG3Ds3ZpbGVzIGHDsW8gYSBhw7FvLiBQb2RlbW9zIGFwcmVjaWFyIGNvbW8sIGVuIGxvcyA5MCwgZWwgY3JlY2ltaWVudG8gZW4gU3Vkw6FmcmljYSBmdWUgZW5vcm1lLCBhdW5xdWUgZXN0ZSBsbGVnwrRjb24gcmV0cmFzbyBjb24gcmVzcGVjdG8gYSBsb3MgY29udGluZW50ZXMgbcOhcyBkZXNhcnJvbGxhZG9zLiBBw7puIGFzw60sIGNhc2kgc2llbXByZSBlc3TDoSBwb3IgZW5jaW1hIGRlIGxhIG1lZGlhIGRlbCBjb250aW5lbnRlIGFmcmljYW5vLiAKPC9GT05UPgpgYGB7ciwgZXZhbCA9IFRSVUUsIGVjaG8gPSBUUlVFfQpkZm1vYmlsIDwtIGJhbmNvX211bmRpYWxfMSAlPiUgc2VsZWN0KHllYXIsIGBTdXNjcmlwY2lvbmVzIGEgdGVsZWZvbsOtYSBjZWx1bGFyIG3Ds3ZpbCAocG9yIGNhZGEgMTAwwqBwZXJzb25hcylgLCBgQ291bnRyeSBOYW1lYCwgY291bnRyeV9jb2RlKSAlPiUgcmVuYW1lKG1vdmlsZXMgPSBgU3VzY3JpcGNpb25lcyBhIHRlbGVmb27DrWEgY2VsdWxhciBtw7N2aWwgKHBvciBjYWRhIDEwMMKgcGVyc29uYXMpYCkKCmRmbW9iaWw8LSBqYW5pdG9yOjpjbGVhbl9uYW1lcyhkZm1vYmlsKSAKCmRmbW9iaWwgPC0gY2JpbmQoZGF0ZSwgZGZtb2JpbCkgCgpkZm1vYmlsIDwtIGRmbW9iaWwgJT4lIHNlbGVjdCgteWVhcikgJT4lIGZpbHRlcihkYXRlID49IDE5NzUpICU+JQogIGFycmFuZ2UoZGF0ZSkKZGZtb2JpbFtpcy5uYShkZm1vYmlsKV0gPC0gMApkZm1vYmlsIDwtIGRmbW9iaWwgJT4lICBncm91cF9ieShjb3VudHJ5X25hbWUpICU+JQogIG11dGF0ZShjcmVjaW1pZW50b19hbnVhbCA9ICgobW92aWxlcyAtIGxhZyhtb3ZpbGVzKSkvbGFnKG1vdmlsZXMpKSoxMDApCmRmbW9iaWxbaXMubmEoZGZtb2JpbCldIDwtIDAKI3RlbmVtb3MgcHJvYmxlbWFzIGN1YW5kbyBwYXNhIGRlIDAgYSB1biBuw7ptZXJvLCB5YSBxdWUgYWwgZGl2aWRpciBlbnRyZSAwIGRhIGluZmluaXRvLCBsbyBxdWUgcXVlcmVtb3MgZXMgcXVlIGVuIGx1Z2FyIGRlIGluZmluaXRvIHBvbmdhIDEwMCB5YSBxdWUgY3JlY2UgdW4gMTAwICUuIApkZm1vYmlsIDwtIGRmbW9iaWwgJT4lIG11dGF0ZShjcmVjaW1pZW50byA9IGNhc2Vfd2hlbigKICBjcmVjaW1pZW50b19hbnVhbCA+IDEwMDAgfiAxMDAsIAogIGNyZWNpbWllbnRvX2FudWFsIDwgMTAwMCAgfiBjcmVjaW1pZW50b19hbnVhbAopKSAlPiUgc2VsZWN0KC1jcmVjaW1pZW50b19hbnVhbCkKYWZyaWNhX21vYmlsZXMgPC0gZGZtb2JpbCAlPiUgIGZpbHRlcihjb3VudHJ5X2NvZGUgJWluJSBhZnJpY2EkYENvdW50cnkgQ29kZWApCgphZnJpY2FfbW9iaWxlcyA8LSBhZnJpY2FfbW9iaWxlcyAlPiUgZ3JvdXBfYnkoZGF0ZSklPiUKICBzdW1tYXJpc2UobWVkaWFfYWZyaWNhID0gbWVhbihjcmVjaW1pZW50bykpCmFzaWFfbW9iaWxlcyA8LSBkZm1vYmlsICU+JSAgZmlsdGVyKGNvdW50cnlfY29kZSAlaW4lIGFzaWEkYENvdW50cnkgQ29kZWApICU+JSAKICBncm91cF9ieShkYXRlKSAlPiUKICBzdW1tYXJpc2UobWVkaWFfYXNpYSA9IG1lYW4oY3JlY2ltaWVudG8pKQphbWVyaWNhX21vYmlsZXMgPC0gZGZtb2JpbCAlPiUgIGZpbHRlcihjb3VudHJ5X2NvZGUgJWluJSBhbWVyaWNhJGBDb3VudHJ5IENvZGVgKSU+JSAKICBncm91cF9ieShkYXRlKSAlPiUKICBzdW1tYXJpc2UobWVkaWFfYW1lcmljYSA9IG1lYW4oY3JlY2ltaWVudG8pKQpldXJvcGFfbW9iaWxlcyA8LSBkZm1vYmlsICU+JSAgZmlsdGVyKGNvdW50cnlfY29kZSAlaW4lIGV1cm9wYSRgQ291bnRyeSBDb2RlYCkgJT4lIAogIGdyb3VwX2J5KGRhdGUpICU+JQogIHN1bW1hcmlzZShtZWRpYV9ldXJvcGEgPSBtZWFuKGNyZWNpbWllbnRvKSkKb2NlYW5pYV9tb2JpbGVzIDwtIGRmbW9iaWwgJT4lICBmaWx0ZXIoY291bnRyeV9jb2RlICVpbiUgb2NlYW5pYSRgQ291bnRyeSBDb2RlYCkgJT4lIAogIGdyb3VwX2J5KGRhdGUpICU+JQogIHN1bW1hcmlzZShtZWRpYV9vY2VhbmlhID0gbWVhbihjcmVjaW1pZW50bykpCnN1ZGFmcmljYV9tb2JpbGVzIDwtIGRmbW9iaWwgJT4lIGZpbHRlcihjb3VudHJ5X2NvZGUgPT0gIlpBRiIpICU+JQogIHNlbGVjdChkYXRlLCBjcmVjaW1pZW50bykKZGYxMiA8LSBpbm5lcl9qb2luKG9jZWFuaWFfbW9iaWxlcywgZXVyb3BhX21vYmlsZXMpCmRmMTMgPC0gaW5uZXJfam9pbihhZnJpY2FfbW9iaWxlcywgYXNpYV9tb2JpbGVzKQpkZjE0IDwtIGlubmVyX2pvaW4oZGYxMiwgZGYxMykKZGYxNSA8LSBpbm5lcl9qb2luKGRmMTQsIGFtZXJpY2FfbW9iaWxlcykKZGYxNiA8LSBpbm5lcl9qb2luKGRmMTUsIHN1ZGFmcmljYV9tb2JpbGVzKSAlPiUgc2VsZWN0KC1jb3VudHJ5X25hbWUpICU+JSAKICBwaXZvdF9sb25nZXIoY29scyA9ICgyOjcpICx2YWx1ZXNfdG8gPSAiY3JlY2ltaWVudG9fYW51YWwiLCBuYW1lc190byA9ICJyZWdpb24iKQoKCmc5IDwtIGdncGxvdChkZjE2LCBhZXMoeD0gZGF0ZSwgeT0gY3JlY2ltaWVudG9fYW51YWwpKSArIAogIGxhYnModGl0bGUgPSAiRXZvbHVjacOzbiB1c28gZGUgcmVkZXMgbcOzYmlsZXMgZW4gZWwgbXVuZG8iLAogICAgICAgeD0gIkHDsW8iLAogICAgICAgeT0gIkNyZWNpbWllbnRvIGFudWFsIiwKICAgICAgIGNvbG9yID0gIlJlZ2lvbmVzIikgKwogIGdlb21fcG9pbnQoYWVzKGNvbG9yPSByZWdpb24pLCBzaXplPSAzKSArCiAgZ2VvbV9saW5lKGFlcyhjb2xvcj0gcmVnaW9uKSwgc2l6ZT0gMS41KSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9IGMoInJlZCIsICJibHVlIiwgImdyZWVuIiwgImJsYWNrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ5ZWxsb3ciLCAib3JhbmdlIiwgIm1pZG5pZ2h0Ymx1ZSIpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJTdWTDoWZyaWNhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiw4FmcmljYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFtw6lyaWNhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXNpYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV1cm9wYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9jZWFuw61hIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjAsIGZhY2UgPSAiYm9sZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDAuNSksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMywgaGp1c3QgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDApLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSwKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIikpICsKICB0cmFuc2l0aW9uX3JldmVhbChkYXRlKSArIAogIHZpZXdfZm9sbG93KCkKZzkKYGBgCgoKCjxicj48YnI+Cgo8aHIgY2xhc3M9ImxpbmVhLXJlZCI+CjxociBjbGFzcz0ibGluZWEtcmVkIj4KCgpgYGB7ciwgZWNobyA9IEZBTFNFfQpzZXNzaW9uaW5mbzo6c2Vzc2lvbl9pbmZvKCkgJT4lIGRldGFpbHM6OmRldGFpbHMoc3VtbWFyeSA9ICdJbmZvcm1hY2nDs24gZGUgbWkgUi1zZXNpw7NuOicpIApgYGAKCgo8YnI+PGJyPgoKPGRpdiBjbGFzcz0idG9jaWZ5LWV4dGVuZC1wYWdlIiBkYXRhLXVuaXF1ZT0idG9jaWZ5LWV4dGVuZC1wYWdlIiBzdHlsZT0iaGVpZ2h0OiAwOyI+PC9kaXY+Cjxicj48YnI+Cgo8ZGl2IGNsYXNzPSJ0b2NpZnktZXh0ZW5kLXBhZ2UiIGRhdGEtdW5pcXVlPSJ0b2NpZnktZXh0ZW5kLXBhZ2UiIHN0eWxlPSJoZWlnaHQ6IDA7Ij48L2Rpdj4K