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
Hoy en día, los problemas medioambientales son cada vez mayores y es imposible que pasen desapercibidos. En este trabajo, centramos el análisis en las emisiones contaminantes provenientes de la agricultura, sacando así varias conclusiones, y relacionándolas con el total de emisiones contaminantes existentes, en los países europeos. Además, hacemos un pequeño hincapié acerca de la importancia del combustible en la producción agrícola.
2. Proceso de los datos
Primeros pasos
Primero, cargamos todos los paquetes que vamos a utilizar. Los datos los hemos descargado desde Eurostat y pasado a la carpeta datos en formato xlsx (excel). Finalmente, importamos los datos a R.
Los datos extraídos, tanto las emisiones totales como las agrícolas, están expresadas en miles de toneladas de CO2.
agricultura_emisiones <- rio::import(here::here("datos", "emisiones_agricultura.xlsx"))
total_emisiones <- rio::import(here::here("datos", "emisiones_totales.xlsx"))
combustible_emisiones <- rio::import(here::here("datos", "combustibles_agricultura.xlsx"))
#Pasamos los datos a formato largo y renombramos la variable “GEO/TIME” por la variable “País”
df_agri <- agricultura_emisiones %>% pivot_longer(cols = 2:31, names_to = "year", values_to = "emisiones_agri") %>% rename (pais = "GEO/TIME")
df_emi <- total_emisiones %>% pivot_longer(cols = 2:31, names_to = "year", values_to = "emisiones_totales") %>% rename (pais = "GEO/TIME")
df_comb <- combustible_emisiones %>% pivot_longer(cols = 2:31, names_to = "year", values_to = "emisiones_comb") %>% rename (pais = "GEO/TIME")
#Cambios los nombres de algunos países que nos dificultan el análisis
df_emi$pais <- recode(df_emi$pais,
"Germany (until 1990 former territory of the FRG)" = "Germany",
"United Kingdom" = "UK")
df_agri$pais <- recode(df_agri$pais,
"Germany (until 1990 former territory of the FRG)" = "Germany",
"United Kingdom" = "UK")
df_comb$pais <- recode(df_comb$pais,
"Germany (until 1990 former territory of the FRG)" = "Germany",
"United Kingdom" = "UK")
#Ponemos la variable “year” como numérica
df_agri <- transform(df_agri, year = as.numeric(year))
df_emi <- transform(df_emi, year = as.numeric(year))
df_comb <- transform(df_comb, year = as.numeric(year))
#Eliminamos los data frames que están en formato ancho
rm(agricultura_emisiones, combustible_emisiones, total_emisiones)
3. Totalidad de emisiones de gases efecto invernadero
La consecuencias de la producción agrícola pueden ser varias: la erosión del suelo, sobreexplotación, el uso excesivo de químicos, el agotamiento de los acuíferos o bien la reducción de la biodiversidad.
La reducción de dichos efectos se puede llevar a cabo mediante la rotación y diversidad de cultivos, la siembra directa, la apuesta por las energías renovables que son respetuosas con el medio ambiente y una buena gestíón del agua ya que es muy importante para la supervivencia de los seres vivos. Nos hemos centrado, por tanto, en las emisiones agrícolas.
En el gráfico animado, vemos que las emisiones totales han disminuido en más de un millón de toneladas, con una fuerte bajada en 2008 por la crisis financiera.
Mediante la tabla realizada, podemos observar que los 5 países que más emisiones de CO2 han lanzado a la atmósfera desde 1990 son Alemania, Reino Unido, Italia, Francia y Polonia. Son los grandes paises industriales en productos de media y alta tecnología de Europa e incluso del mundo y este sector es el más contaminante de todos.
Gráfico
Código
#Gráfico animado
df_totales <- df_emi %>%
group_by(year) %>%
summarise(emisiones_totales = sum(emisiones_totales))
dd <- ggplot(df_totales, aes(y = emisiones_totales,
x = year)) +
geom_line() +
geom_point() +
scale_x_continuous(breaks = seq(1990, 2020, 10), limits = c(1990, 2020)) +
theme(panel.background = element_rect(fill = "gray100"),
plot.background = element_rect(fill = "antiquewhite")) +
labs(title = "Emisiones totales por año",
x = "Años", y = "Emisiones ", subtitle = "en millones de toneladas de co2",
caption = "Fuente: Eurostat") +
transition_reveal(year)
#- anim_save("./imagenes/emi_totales.gif", dd)
dd
Tabla
Paises |
Emisiones totales |
Germany |
29910183 |
UK |
19839560 |
Italy |
14627706 |
France |
14590586 |
Poland |
11557085 |
Fuente: EUROSTAT |
4. Análisis de las emisiones agrícolas
Las emisiones agrícolas son aquellas procedentes de la producción agropecuaria.
Gracias a nuestros cálculos, podemos afirmar que, en el año 1990, los cinco países (en orden descendente) que más emisiones agrícolas lanzaban a la atmósfera eran: Francia, Alemania, Polonia, Reino Unido y Turquía y, en cambio, en el 2019 fueron: Francia, Turquía, Alemania, Reino Unido pero también España se posiciona como quinta en el ránking. Estos países son grandes y disponen de amplias superficies cultivables y cercanas al mar. Sustentan una gran parte de la producción agropecuaria europea. Es por ello que las emisiones tendrán más peso. Por tanto, los países más contaminantes en la agricultura han sido prácticamente los mismos, lo que ha variado ha sido su posición.
También, podemos sacar conclusiones sobre los países que menos emisiones agrícolas han lanzado a la atmósfera. Los 5 que menos en 1990, han sido: Malta, Chipre, Islandia, Luxemburgo y Eslovenia y en 2019 Estonia sustituye a Eslovenia. Esto se debe al tamaño del territorio, ya que su reducida extensión provoca que las superficies cultivables sean muy reducidas y prioricen llevar a cabo otro tipo de actividades, como industria o servicios, entre otros.
Todo esto aparece plasmado en las tablas siguientes.
Tabla 1
Países |
Emisiones agrícolas |
1990 |
France |
81391.82 |
Germany |
76509.49 |
Poland |
49424.87 |
UK |
47858.52 |
Turkey |
46053.68 |
2019 |
France |
73189.89 |
Turkey |
68023.70 |
Germany |
61838.92 |
UK |
41814.95 |
Spain |
37794.46 |
Fuente: EUROSTAT |
Tabla 2
Países |
Emisiones agrícolas |
1990 |
Malta |
101.06 |
Cyprus |
471.41 |
Iceland |
656.76 |
Luxembourg |
711.34 |
Slovenia |
1854.90 |
2019 |
Malta |
76.34 |
Cyprus |
512.25 |
Iceland |
618.85 |
Luxembourg |
712.35 |
Estonia |
1496.87 |
Fuente: EUROSTAT |
La variación de las emisiones agrícolas entre 1990 y 2019
Además, calculamos la variación de las emisiones agrícolas, entre los años 1990 y 2019 y hemos obtenido que los 5 países que más han aumentado las emisiones agrícolas desde el primer año hasta el último han sido: Turquía, Irlanda, Chipre, España y Luxemburgo.
En cambio, los que mas han reducido sus emisiones son: Latvia, Eslovaquia, Lituania, Bulgaria y Czechia. En los últimos años han reducido el peso del sector agrícola con respecto al total y han aumentado el peso de la industria y del sector servicios. Esto les permite diversificar su estructura productiva para fomentar el desarrollo económico sostenido y crear productos de mayor valor añadido que puedan competir internacionalmente.
En el primer gráfico animado, hemos seleccionado ciertos países que consideramos relevantes para nuestro análisis. Portugal ha mantenido práctimente sus emisiones, España las ha incrementado ligeramente y Francia, Alemania y R. Unido las han disminuido.
En el segundo gráfico animado se puede observar la evolución de las emisiones agrícolas totales, desde 1990 hasta 2019. Se pueden diferenciar tres grandes etapas:
En primer lugar, 1990-2005, se produce un fuerte descenso y después vuelven a aumentar. En segundo lugar, 2005-2015, las emisiones aumentan pero después siguen disminuyendo. Y finalmente, 2015-2019, que sufren un fuerte incremento.
Tabla 3
Países |
Años |
Emisiones agrícolas |
Variación de las emisiones |
Variación porcentual |
Turkey |
2019 |
68023.70 |
21970.02 |
47.7052431 |
Ireland |
2019 |
20479.70 |
1964.29 |
10.6089468 |
Cyprus |
2019 |
512.25 |
40.84 |
8.6633716 |
Spain |
2019 |
37794.46 |
2803.71 |
8.0127176 |
Luxembourg |
2019 |
712.35 |
1.01 |
0.1419855 |
Fuente: EUROSTAT |
Tabla 4
Países |
Años |
Emisiones agrícolas |
Variación de las emisiones |
Variación porcentual |
Latvia |
2019 |
2202.37 |
-2782.46 |
-55.81855 |
Slovakia |
2019 |
2774.77 |
-3224.11 |
-53.74520 |
Lithuania |
2019 |
4245.50 |
-4441.93 |
-51.13054 |
Bulgaria |
2019 |
6249.25 |
-6058.40 |
-49.22467 |
Czechia |
2019 |
8198.66 |
-7513.72 |
-47.82038 |
Fuente: EUROSTAT |
Mapa de coropletas
En el siguiente mapa múltiple se puede observar, en los años 1990, 2000, 2010 y 2019, como van creciendo o disminuyendo las emisiones agrícolas en los distintos países europeos gracias al cambio de color que se observa en ellos.
Gráfico
Esto mismo, se puede visualizar mediante el siguiente gráfico y además, destacamos en un color distinto, España.
Gráficos animados
Código
#Calculamos las emisiones agrícolas totales por año
df_agri_totales <- df_agri %>%
group_by(year) %>%
summarise(emisiones_agri_totales = sum(emisiones_agri))
gg <- ggplot(df_agri_totales, aes(y = emisiones_agri_totales,
x = year)) +
geom_line() +
geom_point() +
scale_x_continuous(breaks = seq(1990, 2020, 10), limits = c(1990, 2020)) +
theme(panel.background = element_rect(fill = "gray100"),
plot.background = element_rect(fill = "antiquewhite")) +
labs(title = "Emisiones totales agrícolas, por año",
x = "Años", y = "Emisiones ", subtitle = "en miles de toneladas de co2",
caption = "Fuente: Eurostat") +
transition_reveal(year)
#- anim_save("./imagenes/gg.gif", gg)
gg
#Gráfico animado
df_agri_x <- df_agri %>%
filter(pais %in% c("Germany", "France", "Spain", "United Kingdom", "Portugal"))
anim_2 <- df_agri_x %>%
ggplot(aes(x = year, y = emisiones_agri, group = pais, color = pais)) +
geom_line() +
geom_point() +
theme(panel.background = element_rect(fill = "gray100")) +
labs(title = "Emisiones agricolas, por país",
x = "Años", y = "Emisiones", subtitle = "en miles de toneladas de co2", caption = "Fuente: Eurostat") +
transition_reveal (year)
#- anim_save("./imagenes/anim.gif", anim_2)
anim_2
5. Profundizamos el análisis en España
Ahora, pasamos a realizar un análisis más exhaustivo de nuestro país.
En primer lugar, hemos querido destacar los 5 años que más emisiones agrícolas han habido y los 5 que menos.
Los 5 años que más emisiones agrícolas se han lanzado han sido del 2000 hasta el 2005 y en cambio, los que menos, 1991-1994 y después, en el 2012. Por tanto, podemos afirmar que España no ha seguido la tendencia de la suma de todos los países europeos, durante los años 2000-2005, analizada en el apartado anterior.
Todo esto se puede visualizar en la tabla realizada.
Y, en el gráfico de debajo, se puede observar la evolución de las emisiones agrícolas españolas durante todos los años. Durante el período estudiado, España ha aumentado sus emisiones. Esto es debido a la influencia de las políticas PAC, que han fomentado la actividad agrícola y por tanto las emisiones.
Tabla 1
País |
Años |
Emisiones agrícolas |
Spain |
2000 |
41773.52 |
Spain |
2003 |
41761.69 |
Spain |
2004 |
41083.96 |
Spain |
2001 |
41008.39 |
Spain |
2002 |
40317.59 |
Fuente: EUROSTAT |
Tabla 2
País |
Años |
Emisiones agrícolas |
Spain |
1993 |
32279.93 |
Spain |
1992 |
33482.31 |
Spain |
1991 |
33668.09 |
Spain |
1994 |
34123.64 |
Spain |
2012 |
34290.96 |
Fuente: EUROSTAT |
Gráfico
En este gráfico, se observa la evolución de las emisiones agrícolas en España desde 1990 hasta 2019.
La variación de las emisiones agrícolas, entre 1990 y 2019
La variación que ha sufrido España en cuanto a las emisiones agrícolas entre los años 1990 y 2019 ha sido de aproximadamente de 8,01 %, como se puede observar en la tabla de abajo.
Tabla 3
País |
Años |
Emisiones agrícolas |
Variación de las emisiones |
Variación porcentual |
Spain |
1990 |
34990.75 |
0.00 |
0.000000 |
Spain |
2019 |
37794.46 |
2803.71 |
8.012718 |
Fuente: EUROSTAT |
6. Emisiones agrícolas vs Emisiones totales
En este apartado, pretendemos llevar a cabo una comparación de las emisiones agrícolas con la totalidad de emisiones existentes.
Gráfico
Y, mediante este gráfico se puede observar dicha comparación, para el año 2019. Vemos que representan un porcentaje muy bajo.
En nuestro gráfico, la A representa las emisiones agrícolas (11,70%) y la letra B representa las emisones totales.
Las actividades agrícolas representan alrededor de un 2% del PIB. Es por ello que las emisiones tienen un papel reducido sobre el cómputo global.
Tabla 1
En esta tabla intentamos plasmar los 5 países que mayor impacto de las emisiones agrícolas tienen sobre el total; éstos han sido: Francia, Turquía, Alemania, Reino Unido y España.
Paises |
Años |
Emisiones agrícolas |
Emisiones totales |
% sobre el total |
Variación porcentual |
France |
2019 |
73189.89 |
4327981 |
1.6910861 |
0.27244714 |
Turkey |
2019 |
68023.70 |
4327981 |
1.5717189 |
0.76901485 |
Germany |
2019 |
61838.92 |
4327981 |
1.4288167 |
0.09527554 |
United Kingdom |
2019 |
41814.95 |
4327981 |
0.9661537 |
0.13199170 |
Spain |
2019 |
37794.46 |
4327981 |
0.8732584 |
0.26337842 |
Fuente: EUROSTAT |
Tabla 2
De forma análoga, los que menos han sido: Malta, Chipre, Islandia, Luxemburgo y Estonia. Esto se debe a que estos paises pequeños donde la superficie cultivable es escasa y el sector agrícola es mínimo.
Paises |
Años |
Emisiones agrícolas |
Emisiones totales |
% sobre el total |
Variación porcentual |
Malta |
2019 |
76.34 |
4327981 |
0.001763871 |
0.000002420444 |
Cyprus |
2019 |
512.25 |
4327981 |
0.011835772 |
0.003619214308 |
Iceland |
2019 |
618.85 |
4327981 |
0.014298814 |
0.002851652457 |
Luxembourg |
2019 |
712.35 |
4327981 |
0.016459175 |
0.004060697336 |
Estonia |
2019 |
1496.87 |
4327981 |
0.034585871 |
-0.012411704020 |
Fuente: EUROSTAT |
7. La importancia del combustible en la agricultura
Uno de los principales gases de efecto invernadero es el dióxido de carbono (CO2), entre otros como el óxido nitroso (N2O) y el metano (CH4).
Debido a la acción del hombre, a sus sistemas de producción y de consumo de energía a partir de la Revolución Industrial, la concentración de esos gases en la atmósfera está creciendo de forma constante. Y, a más concentración de CO2, más calor se queda atrapado dentro de la atmósfera terrestre. El mayor impulsor de ese calentamiento global es el CO2 y está ligado fundamentalmente a la quema de combustibles fósiles: el carbón, el petróleo y el gas.
Hace solo una década que la producción de biocombustibles a partir de plantas se acogió como una alternativa ecológica a los combustibles fósiles. Recientemente, se ha observado que es una solución que compite con la producción de alimentos y que no siempre resulta efectiva en la reducción de emisiones de gases de efecto invernadero o contaminantes atmosféricos.
Tabla 1
Los 5 países europeos con mayor impacto del combustible en la agricultura en el año 1990 fueron: Francia, Alemania, Netherlands, Polonia e Itália. En cambio, en el 2019 Polonia, España, Francia, Turquía y Netherlands.
Paises |
Emisiones de combustible |
1990 |
France |
12156.39 |
Germany |
10509.96 |
Netherlands |
9925.20 |
Poland |
9261.58 |
Italy |
9133.25 |
2019 |
Poland |
11994.05 |
Spain |
11913.71 |
France |
10867.73 |
Turkey |
10862.08 |
Netherlands |
10292.33 |
Fuente: EUROSTAT |
Tabla 2
Mediante esta tabla, se puede visualizar las emisiones del combustible que tienen efecto sobre la producción agrícola durante los años de 1990, 2000, 2010 y 2019, es decir, cada 10 años aproximadamente.
Hay países como Autria que han sufrido una dismunución desde el primer año al último, pero otros como Cypre, las han aumentado.
Emisiones de combustible que afectan a la agricultura: 1990-2000-2010-2019
pais
|
1990
|
2000
|
2010
|
2019
|
Austria
|
1.372,82
|
1.181,06
|
980,47
|
979,18
|
Belgium
|
3.086,85
|
2.568,60
|
2.264,64
|
2.465,76
|
Bulgaria
|
1.827,82
|
951,15
|
502,85
|
494,11
|
Croatia
|
921,55
|
916,90
|
771,29
|
714,51
|
Cyprus
|
55,80
|
106,43
|
76,79
|
85,17
|
Czechia
|
3.831,13
|
1.743,16
|
1.271,16
|
1.280,89
|
Denmark
|
2.654,18
|
2.630,58
|
2.048,23
|
1.459,28
|
Estonia
|
650,25
|
110,17
|
241,89
|
322,12
|
Finland
|
1.887,68
|
1.678,30
|
1.580,74
|
1.336,20
|
France
|
12.156,39
|
13.148,94
|
12.214,56
|
10.867,73
|
Germany
|
10.509,96
|
6.203,53
|
5.811,70
|
6.097,30
|
Greece
|
3.208,03
|
2.896,15
|
1.876,41
|
497,34
|
Hungary
|
2.689,18
|
1.642,17
|
1.157,49
|
1.576,49
|
Iceland
|
746,40
|
896,85
|
729,89
|
548,63
|
Ireland
|
818,47
|
1.023,00
|
829,67
|
668,81
|
Italy
|
9.133,25
|
8.908,83
|
8.071,46
|
8.329,58
|
Latvia
|
1.655,35
|
342,99
|
431,11
|
524,96
|
Lithuania
|
1.622,14
|
193,05
|
229,23
|
234,05
|
Luxembourg
|
36,86
|
27,77
|
28,81
|
23,91
|
Malta
|
3,96
|
11,95
|
22,23
|
19,77
|
Netherlands
|
9.925,20
|
10.080,72
|
12.368,04
|
10.292,33
|
Norway
|
1.300,01
|
1.429,55
|
1.106,01
|
848,31
|
Poland
|
9.261,58
|
14.243,61
|
11.869,67
|
11.994,05
|
Portugal
|
1.164,65
|
1.311,70
|
1.193,32
|
1.247,52
|
Romania
|
2.004,97
|
940,28
|
997,58
|
1.587,14
|
Slovakia
|
156,69
|
374,63
|
409,92
|
329,67
|
Slovenia
|
184,87
|
261,48
|
236,07
|
239,69
|
Spain
|
8.781,24
|
10.191,66
|
10.615,10
|
11.913,71
|
Sweden
|
1.723,17
|
1.562,82
|
1.644,55
|
1.227,28
|
Switzerland
|
825,51
|
813,49
|
706,49
|
599,13
|
Turkey
|
6.458,27
|
9.516,16
|
14.495,81
|
10.862,08
|
UK
|
6.060,73
|
5.414,75
|
4.646,71
|
5.014,03
|
Gráfico
En este gráfico circular, la letra A las emisiones procedentes del combustible (18,70%) y la letra B son las emisiones totales agrícolas.
Código
#Tabla 1
impact_comb <- df_comb %>%
filter(year %in% c(1990, 2019)) %>%
group_by(year) %>%
select(pais, year, emisiones_comb) %>%
slice_max(emisiones_comb, n = 5) %>%
rename("Paises" = pais, "Años" = year, "Emisiones de combustible" = emisiones_comb)
gt_comb <- gt(impact_comb) %>%
tab_header(title = md("**Los 5 paises con mayor impacto del combustible sobre la agricultura**"),
subtitle = "entre 1990 y 2019") %>%
tab_source_note(md("Fuente: [EUROSTAT](https://appsso.eurostat.ec.europa.eu/nui/show.do?dataset=env_air_gge&lang=en)"))
gt_comb
#Tabla 2
total_comb <- df_comb %>%
filter(year %in% c(1990, 2000, 2010, 2019)) %>%
group_by(year, pais) %>%
slice_max(emisiones_comb, n = 5)
data_wide2 <- total_comb %>%
tidyr::pivot_wider(names_from = year,
values_from = emisiones_comb)
knitr::kable(data_wide2,
align = "c",
caption = "Emisiones de combustible que afectan a la agricultura: 1990-2000-2010-2019",
digits = 2,
format.args = list(decimal.mark = ",", big.mark = ".")) %>%
kableExtra::kable_styling(fixed_thead = list(enabled = T,
background = "lightgreen")) %>%
column_spec(1, background = "lightgreen")
#Gráfico
data_comb <- data.frame(
group = LETTERS[1:2],
value = c(Emisiones_combustible = 94680.73, Emisiones_agrícolas = 506550.8))
data_comb <- data_comb %>%
arrange(desc(group)) %>%
mutate(prop = value / sum(data_comb$value) * 100) %>%
mutate(ypos = cumsum(prop)- 0.5*prop )
p1 <- ggplot(data_comb, aes(x ="", y = prop, fill = group)) +
geom_bar(stat = "identity", width = 1, color = "black") +
coord_polar("y", start=0) +
theme_void() +
theme(legend.position="none") +
geom_text(aes(y = ypos, label = group), color = "black", size=6) +
scale_fill_brewer(palette = "Set6")
p1 + labs(title = "Emisiones del combustible sobre las emisiones agrícolas",
subtitle = "para el año 2019",
caption = "Fuente: Eurostat" )
8. Conclusiones
Mediante este trabajo hemos intentado hacer un exhaustivo análisis de las emisiones agrícolas, haciendo hincapié en la totalidad de emisiones co2 y también la importancia del combustible en la agricultura.
Hemos podido observar la evolución completa de dichas variables ya que hemos realizado análisis tanto por años como por países intentando sacar conclusiones. Muchas veces, resaltamos 5 años o 5 países para poder así comparar de manera más sencilla.
Para hacer frente a las emisiones agrícolas pensamos que es importante apostar por la innovación del sector agrícola, ya que ha sido un sector históricamente atrasado. Por lo que, es necesario que dicho sector se adapte a las nuevas técnicas de cultivo existentes y su apuesta por las energías renovables.
9. Bibliografía
Eurostat (2021): Greenhouse gas emissions by source sector (source: EEA)
Tutoriales de la asignatura
Para llevar a cabo el trabajo, nos ha servido de gran ayuda los trabajos del año anterior colgados en la página web del curso, sobre todo, el de “Análisis del impacto ecológico” debido a la similitud del tema elegido. Se puede ver aquí
Bon nadal, MIAU!!
Información de mi R-sesión:
- Session info ---------------------------------------------------------------
setting value
version R version 4.1.1 (2021-08-10)
os Windows 10 x64
system x86_64, mingw32
ui RTerm
language (EN)
collate Spanish_Spain.1252
ctype Spanish_Spain.1252
tz Europe/Paris
date 2021-12-16
- Packages -------------------------------------------------------------------
package * version date lib source
assertthat 0.2.1 2019-03-21 [1] CRAN (R 4.1.1)
backports 1.2.1 2020-12-09 [1] CRAN (R 4.1.1)
broom 0.7.9 2021-07-27 [1] CRAN (R 4.1.1)
bslib 0.3.0 2021-09-02 [1] CRAN (R 4.1.1)
cellranger 1.1.0 2016-07-27 [1] CRAN (R 4.1.1)
checkmate 2.0.0 2020-02-06 [1] CRAN (R 4.1.1)
class 7.3-19 2021-05-03 [2] CRAN (R 4.1.1)
classInt 0.4-3 2020-04-07 [1] CRAN (R 4.1.1)
cli 3.0.1 2021-07-17 [1] CRAN (R 4.1.1)
clipr 0.7.1 2020-10-08 [1] CRAN (R 4.1.1)
colorspace 2.0-2 2021-06-24 [1] CRAN (R 4.1.1)
commonmark 1.7 2018-12-01 [1] CRAN (R 4.1.1)
crayon 1.4.2 2021-10-29 [1] CRAN (R 4.1.1)
curl 4.3.2 2021-06-23 [1] CRAN (R 4.1.1)
data.table 1.14.0 2021-02-21 [1] CRAN (R 4.1.1)
DBI 1.1.1 2021-01-15 [1] CRAN (R 4.1.1)
dbplyr 2.1.1 2021-04-06 [1] CRAN (R 4.1.1)
desc 1.3.0 2021-03-05 [1] CRAN (R 4.1.1)
details 0.2.1 2020-01-12 [1] CRAN (R 4.1.1)
digest 0.6.27 2020-10-24 [1] CRAN (R 4.1.1)
dplyr * 1.0.7 2021-06-18 [1] CRAN (R 4.1.1)
e1071 1.7-8 2021-07-28 [1] CRAN (R 4.1.1)
ellipsis 0.3.2 2021-04-29 [1] CRAN (R 4.1.1)
evaluate 0.14 2019-05-28 [1] CRAN (R 4.1.1)
fansi 0.5.0 2021-05-25 [1] CRAN (R 4.1.1)
farver 2.1.0 2021-02-28 [1] CRAN (R 4.1.1)
fastmap 1.1.0 2021-01-25 [1] CRAN (R 4.1.1)
forcats * 0.5.1 2021-01-27 [1] CRAN (R 4.1.1)
foreign 0.8-81 2020-12-22 [2] CRAN (R 4.1.1)
formatR 1.11 2021-06-01 [1] CRAN (R 4.1.1)
fs 1.5.0 2020-07-31 [1] CRAN (R 4.1.1)
generics 0.1.1 2021-10-25 [1] CRAN (R 4.1.1)
gganimate * 1.0.7 2020-10-15 [1] CRAN (R 4.1.1)
ggfittext 0.9.1 2021-01-30 [1] CRAN (R 4.1.2)
ggplot2 * 3.3.5 2021-06-25 [1] CRAN (R 4.1.1)
ggThemeAssist * 0.1.5 2016-08-13 [1] CRAN (R 4.1.1)
gifski 1.4.3-1 2021-05-02 [1] CRAN (R 4.1.1)
glue 1.4.2 2020-08-27 [1] CRAN (R 4.1.1)
gridBase 0.4-7 2014-02-24 [1] CRAN (R 4.1.1)
gt * 0.3.1 2021-08-07 [1] CRAN (R 4.1.1)
gtable 0.3.0 2019-03-25 [1] CRAN (R 4.1.1)
haven 2.4.3 2021-08-04 [1] CRAN (R 4.1.1)
here 1.0.1 2020-12-13 [1] CRAN (R 4.1.1)
highr 0.9 2021-04-16 [1] CRAN (R 4.1.1)
hms 1.1.0 2021-05-17 [1] CRAN (R 4.1.1)
htmltools 0.5.2 2021-08-25 [1] CRAN (R 4.1.1)
htmlwidgets 1.5.4 2021-09-08 [1] CRAN (R 4.1.1)
httpuv 1.6.3 2021-09-09 [1] CRAN (R 4.1.1)
httr 1.4.2 2020-07-20 [1] CRAN (R 4.1.1)
igraph 1.2.7 2021-10-15 [1] CRAN (R 4.1.1)
jquerylib 0.1.4 2021-04-26 [1] CRAN (R 4.1.1)
jsonlite 1.7.2 2020-12-09 [1] CRAN (R 4.1.1)
kableExtra * 1.3.4 2021-02-20 [1] CRAN (R 4.1.1)
KernSmooth 2.23-20 2021-05-03 [2] CRAN (R 4.1.1)
klippy * 0.0.0.9500 2021-11-17 [1] Github (rlesur/klippy@378c247)
knitr * 1.34 2021-09-09 [1] CRAN (R 4.1.1)
labeling 0.4.2 2020-10-20 [1] CRAN (R 4.1.1)
later 1.3.0 2021-08-18 [1] CRAN (R 4.1.1)
lattice 0.20-44 2021-05-02 [2] CRAN (R 4.1.1)
lazyeval 0.2.2 2019-03-15 [1] CRAN (R 4.1.1)
lifecycle 1.0.1 2021-09-24 [1] CRAN (R 4.1.1)
lubridate 1.7.10 2021-02-26 [1] CRAN (R 4.1.1)
magrittr 2.0.1 2020-11-17 [1] CRAN (R 4.1.1)
mime 0.11 2021-06-23 [1] CRAN (R 4.1.1)
miniUI 0.1.1.1 2018-05-18 [1] CRAN (R 4.1.1)
modelr 0.1.8 2020-05-19 [1] CRAN (R 4.1.1)
munsell 0.5.0 2018-06-12 [1] CRAN (R 4.1.1)
openxlsx 4.2.4 2021-06-16 [1] CRAN (R 4.1.1)
pillar 1.6.4 2021-10-18 [1] CRAN (R 4.1.1)
pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 4.1.1)
plotly * 4.9.4.1 2021-06-18 [1] CRAN (R 4.1.1)
png 0.1-7 2013-12-03 [1] CRAN (R 4.1.1)
prettyunits 1.1.1 2020-01-24 [1] CRAN (R 4.1.1)
progress 1.2.2 2019-05-16 [1] CRAN (R 4.1.1)
promises 1.2.0.1 2021-02-11 [1] CRAN (R 4.1.1)
proxy 0.4-26 2021-06-07 [1] CRAN (R 4.1.1)
purrr * 0.3.4 2020-04-17 [1] CRAN (R 4.1.1)
R6 2.5.1 2021-08-19 [1] CRAN (R 4.1.1)
RColorBrewer 1.1-2 2014-12-07 [1] CRAN (R 4.1.1)
Rcpp 1.0.7 2021-07-07 [1] CRAN (R 4.1.1)
readr * 2.0.1 2021-08-10 [1] CRAN (R 4.1.1)
readxl 1.3.1 2019-03-13 [1] CRAN (R 4.1.1)
reprex 2.0.1 2021-08-05 [1] CRAN (R 4.1.1)
rgeos 0.5-8 2021-09-22 [1] CRAN (R 4.1.1)
rio * 0.5.27 2021-06-21 [1] CRAN (R 4.1.1)
rlang 0.4.11 2021-04-30 [1] CRAN (R 4.1.1)
rmarkdown 2.11 2021-09-14 [1] CRAN (R 4.1.1)
rnaturalearth * 0.1.0 2017-03-21 [1] CRAN (R 4.1.1)
rnaturalearthdata 0.1.0 2017-02-21 [1] CRAN (R 4.1.1)
rprojroot 2.0.2 2020-11-15 [1] CRAN (R 4.1.1)
rstudioapi 0.13 2020-11-12 [1] CRAN (R 4.1.1)
rvest 1.0.1 2021-07-26 [1] CRAN (R 4.1.1)
sass 0.4.0 2021-05-12 [1] CRAN (R 4.1.1)
scales 1.1.1 2020-05-11 [1] CRAN (R 4.1.1)
sessioninfo 1.1.1 2018-11-05 [1] CRAN (R 4.1.1)
sf * 1.0-2 2021-07-26 [1] CRAN (R 4.1.1)
shiny 1.7.0 2021-09-22 [1] CRAN (R 4.1.1)
sp 1.4-5 2021-01-10 [1] CRAN (R 4.1.1)
stringi 1.7.5 2021-10-04 [1] CRAN (R 4.1.1)
stringr * 1.4.0 2019-02-10 [1] CRAN (R 4.1.1)
svglite 2.0.0 2021-02-20 [1] CRAN (R 4.1.1)
systemfonts 1.0.3 2021-10-13 [1] CRAN (R 4.1.1)
tibble * 3.1.4 2021-08-25 [1] CRAN (R 4.1.1)
tidyr * 1.1.3 2021-03-03 [1] CRAN (R 4.1.1)
tidyselect 1.1.1 2021-04-30 [1] CRAN (R 4.1.1)
tidyverse * 1.3.1 2021-04-15 [1] CRAN (R 4.1.1)
treemap * 2.4-3 2021-08-22 [1] CRAN (R 4.1.1)
treemapify * 2.5.5 2021-01-08 [1] CRAN (R 4.1.2)
tweenr 1.0.2 2021-03-23 [1] CRAN (R 4.1.1)
tzdb 0.1.2 2021-07-20 [1] CRAN (R 4.1.1)
units 0.7-2 2021-06-08 [1] CRAN (R 4.1.1)
utf8 1.2.2 2021-07-24 [1] CRAN (R 4.1.1)
vctrs 0.3.8 2021-04-29 [1] CRAN (R 4.1.1)
viridisLite 0.4.0 2021-04-13 [1] CRAN (R 4.1.1)
webshot 0.5.2 2019-11-22 [1] CRAN (R 4.1.1)
withr 2.4.2 2021-04-18 [1] CRAN (R 4.1.1)
wordcloud2 * 0.2.1 2018-01-03 [1] CRAN (R 4.1.2)
xfun 0.25 2021-08-06 [1] CRAN (R 4.1.1)
xml2 1.3.2 2020-04-23 [1] CRAN (R 4.1.1)
xtable 1.8-4 2019-04-21 [1] CRAN (R 4.1.1)
yaml 2.2.1 2020-02-01 [1] CRAN (R 4.1.1)
zip 2.2.0 2021-05-31 [1] CRAN (R 4.1.1)
[1] C:/Users/MAYTE/Documents/R/win-library/4.1
[2] C:/Program Files/R/R-4.1.1/library
LS0tDQp0aXRsZTogIkFuw6FsaXNpcyBkZWwgaW1wYWN0byBtZWRpb2FtYmllbnRhbCBkZSBsYSBwcm9kdWNjacOzbiBhZ3LDrWNvbGEgZW4gRXVyb3BhIg0KYXV0aG9yOiAiRGFtacOhbiBQw6lyZXogU29sZXIocGVzb2RhQGFsdW1uaS51di5lcykgIFxuXG4gR2FsaW5hIE1hcsOtYSBMb3BleiBaaW5jaHVrIChnYWxvemluQGFsdW1uaS51di5lcykgIFxuIFxuIEbDoXRpbWEgTWFrcm91ZCBTYWlkaShtYWtyYXpAYWx1bW5pLnV2LmVzKS4gXG5cbiBVbml2ZXJzaXRhdCBkZSBWYWzDqG5jaWEiDQpkYXRlOiAiRGljaWVtYnJlIGRlIDIwMjEgKGFjdHVhbGl6YWRvIGVsIGByIGZvcm1hdChTeXMudGltZSgpLCAnJWQtJW0tJVknKWApIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNzczogIi4vYXNzZXRzL2Nzc19pbmRleC5jc3MiDQogICAgdGhlbWU6IHBhcGVyDQogICAgaGlnaGxpZ2h0OiB0ZXh0bWF0ZSANCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDMgDQogICAgdG9jX2Zsb2F0OiANCiAgICAgIGNvbGxhcHNlZDogdHJ1ZQ0KICAgICAgc21vb3RoX3Njcm9sbDogdHJ1ZQ0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQ0KICAgIGRmX3ByaW50OiBrYWJsZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCmVkaXRvcl9vcHRpb25zOiANCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGNvbnNvbGUNCi0tLQ0KDQpgYGB7ciBjaHVuay1zZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBldmFsID0gVFJVRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgICAgICAgICNyZXN1bHRzID0gImhvbGQiLA0KICAgICAgICAgICAgICAgICAgICAgIGNhY2hlID0gRkFMU0UsIGNhY2hlLnBhdGggPSAiL2NhY2hlcy8iLCBjb21tZW50ID0gIiM+IiwNCiAgICAgICAgICAgICAgICAgICAgICAjZmlnLndpZHRoID0gNywgI2ZpZy5oZWlnaHQ9IDcsICAgDQogICAgICAgICAgICAgICAgICAgICAgI291dC53aWR0aCA9IDcsIG91dC5oZWlnaHQgPSA3LA0KICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlID0gVFJVRSwgIGZpZy5zaG93ID0gImhvbGQiLA0KICAgICAgICAgICAgICAgICAgICAgIGZpZy5hc3AgPSAwLjYyOCwgb3V0LndpZHRoID0gIjc1JSIsIGZpZy5hbGlnbiA9ICJjZW50ZXIiKQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGRldiA9ICJwbmciLCBkZXYuYXJncyA9IGxpc3QodHlwZSA9ICJjYWlyby1wbmciKSkNCg0KYGBgDQoNCmBgYHtyIG9wdGlvbnMtc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0NCm9wdGlvbnMoc2NpcGVuID0gOTk5KSAjLSBwYXJhIHF1aXRhciBsYSBub3RhY2nDs24gY2llbnTDrWZpY2ENCm9wdGlvbnMoInlhbWwuZXZhbC5leHByIiA9IFRSVUUpIA0KDQpgYGANCg0KYGBge3Iga2xpcHB5LCBlY2hvID0gRkFMU0V9DQprbGlwcHk6OmtsaXBweShwb3NpdGlvbiA9IGMoInRvcCIsICJyaWdodCIpKSAjLSByZW1vdGVzOjppbnN0YWxsX2dpdGh1Yigicmxlc3VyL2tsaXBweSIpDQoNCmBgYA0KDQo8aHIgY2xhc3M9ImxpbmVhLWJsYWNrIj4NCg0KDQpUcmFiYWpvIGVsYWJvcmFkbyBwYXJhIGxhIGFzaWduYXR1cmEgIlByb2dyYW1hY2nDs24geSBtYW5lam8gZGUgZGF0b3MgZW4gbGEgZXJhIGRlbCBCaWcgRGF0YSIgZGUgbGEgVW5pdmVyc2l0YXQgZGUgVmFsw6huY2lhIGR1cmFudGUgZWwgY3Vyc28gMjAyMS0yMDIyLiBFbCByZXBvIGRlbCB0cmFiYWpvIGVzdMOhIFthcXXDrV0oaHR0cHM6Ly9naXRodWIuY29tL2RhbWlhbnBzMTQvdHJhYmFqb19CaWdEYXRhX2VxdWlwbyl7dGFyZ2V0PSJfYmxhbmsifS4gDQoNCg0KDQpMYSBww6FnaW5hIHdlYiBkZSBsYSBhc2lnbmF0dXJhIHkgbG9zIHRyYWJham9zIGRlIG1pcyBjb21wYcOxZXJvcyBwdWVkZW4gdmVyc2UgW2FxdcOtXShodHRwczovL3BlcmV6cDQ0LmdpdGh1Yi5pby9pbnRyby1kcy0yMS0yMi13ZWIvMDctdHJhYmFqb3MuaHRtbCl7dGFyZ2V0PSJfYmxhbmsifS4NCg0KPGhyIGNsYXNzPSJsaW5lYS1yZWQiPg0KDQojIDEuIEludHJvZHVjY2nDs24gDQoNCmBgYHtyLCBlY2hvID0gRkFMU0UsIGV2YWwgPSBUUlVFfQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1hZ2VuZXMiLCAiaW1hZ2VuLmpwZyIpKSANCg0KYGBgDQoNCkhveSBlbiBkw61hLCBsb3MgcHJvYmxlbWFzIG1lZGlvYW1iaWVudGFsZXMgc29uIGNhZGEgdmV6IG1heW9yZXMgeSBlcyBpbXBvc2libGUgcXVlIHBhc2VuIGRlc2FwZXJjaWJpZG9zLiBFbiBlc3RlIHRyYWJham8sIGNlbnRyYW1vcyBlbCBhbsOhbGlzaXMgZW4gbGFzIGVtaXNpb25lcyBjb250YW1pbmFudGVzIHByb3ZlbmllbnRlcyBkZSBsYSBhZ3JpY3VsdHVyYSwgc2FjYW5kbyBhc8OtIHZhcmlhcyBjb25jbHVzaW9uZXMsIHkgcmVsYWNpb27DoW5kb2xhcyBjb24gZWwgdG90YWwgZGUgZW1pc2lvbmVzIGNvbnRhbWluYW50ZXMgZXhpc3RlbnRlcywgZW4gbG9zIHBhw61zZXMgZXVyb3Blb3MuIEFkZW3DoXMsIGhhY2Vtb3MgdW4gcGVxdWXDsW8gaGluY2FwacOpIGFjZXJjYSBkZSBsYSBpbXBvcnRhbmNpYSBkZWwgY29tYnVzdGlibGUgZW4gbGEgcHJvZHVjY2nDs24gYWdyw61jb2xhLg0KDQojIDIuIFByb2Nlc28gZGUgbG9zIGRhdG9zIA0KDQojIyBQcmltZXJvcyBwYXNvcw0KDQpQcmltZXJvLCBjYXJnYW1vcyB0b2RvcyBsb3MgcGFxdWV0ZXMgcXVlIHZhbW9zIGEgdXRpbGl6YXIuIExvcyBkYXRvcyBsb3MgaGVtb3MgZGVzY2FyZ2FkbyBkZXNkZSBbRXVyb3N0YXRdKGh0dHBzOi8vYXBwc3NvLmV1cm9zdGF0LmVjLmV1cm9wYS5ldS9udWkvc2hvdy5kbz9kYXRhc2V0PWVudl9haXJfZ2dlJmxhbmc9ZW4pIHkgcGFzYWRvIGEgbGEgY2FycGV0YSBkYXRvcyBlbiBmb3JtYXRvIHhsc3ggKGV4Y2VsKS4gRmluYWxtZW50ZSwgaW1wb3J0YW1vcyBsb3MgZGF0b3MgYSBSLg0KDQpMb3MgZGF0b3MgZXh0cmHDrWRvcywgdGFudG8gbGFzIGVtaXNpb25lcyB0b3RhbGVzIGNvbW8gbGFzIGFncsOtY29sYXMsIGVzdMOhbiBleHByZXNhZGFzIGVuIG1pbGVzIGRlIHRvbmVsYWRhcyBkZSBDTzIuIA0KDQpgYGB7ciBwYWNrYWdlcy1zZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGtsaXBweSkgIy1yZW1vdGVzOjppbnN0YWxsX2dpdGh1Yigicmxlc3VyL2tsaXBweSIpDQpsaWJyYXJ5KHJpbykNCmxpYnJhcnkoZ2dhbmltYXRlKQ0KbGlicmFyeShzZikNCmxpYnJhcnkocm5hdHVyYWxlYXJ0aCkNCmxpYnJhcnkoZ3QpICNpbnN0YWxsLnBhY2thZ2VzKCJndCIpDQpsaWJyYXJ5KHdvcmRjbG91ZDIpICNpbnN0YWxsLnBhY2thZ2VzKCJ3b3JkY2xvdWQyIikNCmxpYnJhcnkoZ2dUaGVtZUFzc2lzdCkNCmxpYnJhcnkodHJlZW1hcCkNCmxpYnJhcnkodHJlZW1hcGlmeSkgI2luc3RhbGwucGFja2FnZXMo4oCcdHJlZW1hcGlmeeKAnSkNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0KYGBgDQoNCmBgYHtyLCBldmFsID0gVFJVRX0NCmFncmljdWx0dXJhX2VtaXNpb25lcyA8LSByaW86OmltcG9ydChoZXJlOjpoZXJlKCJkYXRvcyIsICJlbWlzaW9uZXNfYWdyaWN1bHR1cmEueGxzeCIpKQ0KdG90YWxfZW1pc2lvbmVzIDwtIHJpbzo6aW1wb3J0KGhlcmU6OmhlcmUoImRhdG9zIiwgImVtaXNpb25lc190b3RhbGVzLnhsc3giKSkNCmNvbWJ1c3RpYmxlX2VtaXNpb25lcyA8LSByaW86OmltcG9ydChoZXJlOjpoZXJlKCJkYXRvcyIsICJjb21idXN0aWJsZXNfYWdyaWN1bHR1cmEueGxzeCIpKQ0KDQpgYGANCg0KYGBge3IsIGV2YWwgPSBUUlVFfQ0KI1Bhc2Ftb3MgbG9zIGRhdG9zIGEgZm9ybWF0byBsYXJnbyB5IHJlbm9tYnJhbW9zIGxhIHZhcmlhYmxlIOKAnEdFTy9USU1F4oCdIHBvciBsYSB2YXJpYWJsZSDigJxQYcOtc+KAnQ0KDQpkZl9hZ3JpIDwtIGFncmljdWx0dXJhX2VtaXNpb25lcyAlPiUgcGl2b3RfbG9uZ2VyKGNvbHMgPSAyOjMxLCBuYW1lc190byA9ICJ5ZWFyIiwgdmFsdWVzX3RvID0gImVtaXNpb25lc19hZ3JpIikgJT4lIHJlbmFtZSAocGFpcyA9ICJHRU8vVElNRSIpIA0KZGZfZW1pIDwtIHRvdGFsX2VtaXNpb25lcyAlPiUgcGl2b3RfbG9uZ2VyKGNvbHMgPSAyOjMxLCBuYW1lc190byA9ICJ5ZWFyIiwgdmFsdWVzX3RvID0gImVtaXNpb25lc190b3RhbGVzIikgJT4lIHJlbmFtZSAocGFpcyA9ICJHRU8vVElNRSIpDQpkZl9jb21iIDwtIGNvbWJ1c3RpYmxlX2VtaXNpb25lcyAlPiUgcGl2b3RfbG9uZ2VyKGNvbHMgPSAyOjMxLCBuYW1lc190byA9ICJ5ZWFyIiwgdmFsdWVzX3RvID0gImVtaXNpb25lc19jb21iIikgJT4lIHJlbmFtZSAocGFpcyA9ICJHRU8vVElNRSIpDQoNCiNDYW1iaW9zIGxvcyBub21icmVzIGRlIGFsZ3Vub3MgcGHDrXNlcyBxdWUgbm9zIGRpZmljdWx0YW4gZWwgYW7DoWxpc2lzDQoNCmRmX2VtaSRwYWlzIDwtIHJlY29kZShkZl9lbWkkcGFpcywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICJHZXJtYW55ICh1bnRpbCAxOTkwIGZvcm1lciB0ZXJyaXRvcnkgb2YgdGhlIEZSRykiID0gIkdlcm1hbnkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5pdGVkIEtpbmdkb20iID0gIlVLIikNCmRmX2FncmkkcGFpcyA8LSByZWNvZGUoZGZfYWdyaSRwYWlzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkdlcm1hbnkgKHVudGlsIDE5OTAgZm9ybWVyIHRlcnJpdG9yeSBvZiB0aGUgRlJHKSIgPSAiR2VybWFueSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJVbml0ZWQgS2luZ2RvbSIgPSAiVUsiKQ0KZGZfY29tYiRwYWlzIDwtIHJlY29kZShkZl9jb21iJHBhaXMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiR2VybWFueSAodW50aWwgMTk5MCBmb3JtZXIgdGVycml0b3J5IG9mIHRoZSBGUkcpIiA9ICJHZXJtYW55IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuaXRlZCBLaW5nZG9tIiA9ICJVSyIpDQoNCiNQb25lbW9zIGxhIHZhcmlhYmxlIOKAnHllYXLigJ0gY29tbyBudW3DqXJpY2ENCg0KZGZfYWdyaSA8LSB0cmFuc2Zvcm0oZGZfYWdyaSwgeWVhciA9IGFzLm51bWVyaWMoeWVhcikpDQpkZl9lbWkgPC0gIHRyYW5zZm9ybShkZl9lbWksIHllYXIgPSBhcy5udW1lcmljKHllYXIpKQ0KZGZfY29tYiA8LSB0cmFuc2Zvcm0oZGZfY29tYiwgeWVhciA9IGFzLm51bWVyaWMoeWVhcikpDQoNCiNFbGltaW5hbW9zIGxvcyBkYXRhIGZyYW1lcyBxdWUgZXN0w6FuIGVuIGZvcm1hdG8gYW5jaG8NCg0Kcm0oYWdyaWN1bHR1cmFfZW1pc2lvbmVzLCBjb21idXN0aWJsZV9lbWlzaW9uZXMsIHRvdGFsX2VtaXNpb25lcykNCg0KYGBgDQoNCiMgMy4gVG90YWxpZGFkIGRlIGVtaXNpb25lcyBkZSBnYXNlcyBlZmVjdG8gaW52ZXJuYWRlcm8gey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KTGEgY29uc2VjdWVuY2lhcyBkZSBsYSBwcm9kdWNjacOzbiBhZ3LDrWNvbGEgcHVlZGVuIHNlciB2YXJpYXM6IGxhIGVyb3Npw7NuIGRlbCBzdWVsbywgc29icmVleHBsb3RhY2nDs24sIGVsIHVzbyBleGNlc2l2byBkZSBxdcOtbWljb3MsIGVsIGFnb3RhbWllbnRvIGRlIGxvcyBhY3XDrWZlcm9zIG8gYmllbiBsYSByZWR1Y2Npw7NuIGRlIGxhIGJpb2RpdmVyc2lkYWQuDQoNCkxhIHJlZHVjY2nDs24gZGUgZGljaG9zIGVmZWN0b3Mgc2UgcHVlZGUgbGxldmFyIGEgY2FibyBtZWRpYW50ZSBsYSByb3RhY2nDs24geSBkaXZlcnNpZGFkIGRlIGN1bHRpdm9zLCBsYSBzaWVtYnJhIGRpcmVjdGEsIGxhIGFwdWVzdGEgcG9yIGxhcyBlbmVyZ8OtYXMgcmVub3ZhYmxlcyBxdWUgc29uIHJlc3BldHVvc2FzIGNvbiBlbCBtZWRpbyBhbWJpZW50ZSB5IHVuYSBidWVuYSBnZXN0w63Ds24gZGVsIGFndWEgeWEgcXVlIGVzIG11eSBpbXBvcnRhbnRlIHBhcmEgbGEgc3VwZXJ2aXZlbmNpYSBkZSBsb3Mgc2VyZXMgdml2b3MuIA0KTm9zIGhlbW9zIGNlbnRyYWRvLCBwb3IgdGFudG8sIGVuIGxhcyBlbWlzaW9uZXMgYWdyw61jb2xhcy4NCg0KRW4gZWwgZ3LDoWZpY28gYW5pbWFkbywgdmVtb3MgcXVlIGxhcyBlbWlzaW9uZXMgdG90YWxlcyBoYW4gZGlzbWludWlkbyBlbiBtw6FzIGRlIHVuIG1pbGzDs24gZGUgdG9uZWxhZGFzLCBjb24gdW5hIGZ1ZXJ0ZSBiYWphZGEgZW4gMjAwOCBwb3IgbGEgY3Jpc2lzIGZpbmFuY2llcmEuDQoNCk1lZGlhbnRlIGxhIHRhYmxhIHJlYWxpemFkYSwgcG9kZW1vcyBvYnNlcnZhciBxdWUgbG9zIDUgcGHDrXNlcyBxdWUgbcOhcyBlbWlzaW9uZXMgZGUgQ08yIGhhbiBsYW56YWRvIGEgbGEgYXRtw7NzZmVyYSBkZXNkZSAxOTkwIHNvbiBBbGVtYW5pYSwgUmVpbm8gVW5pZG8sIEl0YWxpYSwgRnJhbmNpYSB5IFBvbG9uaWEuIFNvbiBsb3MgZ3JhbmRlcyBwYWlzZXMgaW5kdXN0cmlhbGVzIGVuIHByb2R1Y3RvcyBkZSBtZWRpYSB5IGFsdGEgdGVjbm9sb2fDrWEgZGUgRXVyb3BhIGUgaW5jbHVzbyBkZWwgbXVuZG8geSBlc3RlIHNlY3RvciBlcyBlbCBtw6FzIGNvbnRhbWluYW50ZSBkZSB0b2Rvcy4NCg0KIyMgR3LDoWZpY28NCg0KIVtdKC4vaW1hZ2VuZXMvZW1pX3RvdGFsZXMuZ2lmKQ0KDQojIyBDw7NkaWdvDQoNCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZXZhbCA9IEZBTFNFLCBmaWcuYWxpZ24gPSAiY2VudGVyIn0NCiNHcsOhZmljbyBhbmltYWRvDQoNCmRmX3RvdGFsZXMgPC0gZGZfZW1pICU+JQ0KICBncm91cF9ieSh5ZWFyKSAlPiUNCiAgc3VtbWFyaXNlKGVtaXNpb25lc190b3RhbGVzID0gc3VtKGVtaXNpb25lc190b3RhbGVzKSkNCg0KZGQgPC0gZ2dwbG90KGRmX3RvdGFsZXMsIGFlcyh5ID0gZW1pc2lvbmVzX3RvdGFsZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0geWVhcikpICsNCiAgZ2VvbV9saW5lKCkgKw0KICBnZW9tX3BvaW50KCkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDE5OTAsIDIwMjAsIDEwKSwgbGltaXRzID0gYygxOTkwLCAyMDIwKSkgKyANCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gImdyYXkxMDAiKSwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiYW50aXF1ZXdoaXRlIikpICsNCiAgbGFicyh0aXRsZSA9ICJFbWlzaW9uZXMgdG90YWxlcyBwb3IgYcOxbyIsDQogICAgeCA9ICJBw7FvcyIsIHkgPSAiRW1pc2lvbmVzICIsIHN1YnRpdGxlID0gImVuIG1pbGxvbmVzIGRlIHRvbmVsYWRhcyBkZSBjbzIiLA0KICAgIGNhcHRpb24gPSAiRnVlbnRlOiBFdXJvc3RhdCIpICsNCiAgdHJhbnNpdGlvbl9yZXZlYWwoeWVhcikNCiMtIGFuaW1fc2F2ZSgiLi9pbWFnZW5lcy9lbWlfdG90YWxlcy5naWYiLCBkZCkNCg0KZGQNCg0KYGBgDQoNCiMjIFRhYmxhDQoNCmBgYHtyLCBlY2hvID0gRkFMU0UsIGV2YWwgPSBUUlVFLCByZXN1bHRzID0gVFJVRX0NCmRmX2VtaV9ub21icmVzIDwtIGRmX2VtaSAlPiUgDQogIGdyb3VwX2J5KHBhaXMpICU+JSANCiAgc3VtbWFyaXNlKGVtaXNpb25lc190b3RhbGVzID0gc3VtKGVtaXNpb25lc190b3RhbGVzKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBzbGljZV9tYXgoZW1pc2lvbmVzX3RvdGFsZXMsIG4gPSA1KSAlPiUNCiAgYXJyYW5nZShkZXNjKGVtaXNpb25lc190b3RhbGVzKSkgJT4lDQogIHJlbmFtZSgiUGFpc2VzIiA9IHBhaXMsICJFbWlzaW9uZXMgdG90YWxlcyIgPSBlbWlzaW9uZXNfdG90YWxlcykNCg0KZ3QoZGZfZW1pX25vbWJyZXMpICU+JSANCiAgdGFiX2hlYWRlcih0aXRsZSA9IG1kKCIqKlN1bWF0b3JpbyBkZSBlbWlzaW9uZXMgdG90YWxlcyBkZXNkZSAxOTkwKioiKSwNCiAgICAgICAgICAgICBzdWJ0aXRsZSA9ICJMb3MgNSBwYWlzZXMgbcOhcyBjb250YW1pbmFudGVzIikgJT4lDQogIHRhYl9zb3VyY2Vfbm90ZShtZCgiRnVlbnRlOiBbRVVST1NUQVRdKGh0dHBzOi8vYXBwc3NvLmV1cm9zdGF0LmVjLmV1cm9wYS5ldS9udWkvc2hvdy5kbz9kYXRhc2V0PWVudl9haXJfZ2dlJmxhbmc9ZW4pIikpDQoNCmBgYA0KDQojIyBPdHJhIGZvcm1hIGRlIHZpc3VhbGl6YXIgbG9zIGRhdG9zIA0KDQpZIHBhcmEgbW9zdHJhciBsb3MgZGF0b3MgZGUgbWFuZXJhIG3DoXMgdmlzdWFsLCBoZW1vcyByZWFsaXphZG8gbG8gc2lndWllbnRlLg0KDQpgYGB7ciwgZmlnLmhlaWdodCA9IDIsIGZpZy53aWR0aCA9IDUgLGRwaSA9IDE1MCxmaWcuYWxpZ24gPSAiY2VudGVyIiwgZXZhbD0gVFJVRSwgZWNobz0gRkFMU0V9DQpkZl9lbWlfbm9tYnJlcyA8LSBkZl9lbWkgJT4lIA0KICBncm91cF9ieShwYWlzKSAlPiUgDQogIHN1bW1hcmlzZShlbWlzaW9uZXNfdG90YWxlcyA9IHN1bShlbWlzaW9uZXNfdG90YWxlcykpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgYXJyYW5nZShkZXNjKGVtaXNpb25lc190b3RhbGVzKSkNCiAgDQogIHdvcmRjbG91ZDIoZGF0YSA9IGRmX2VtaV9ub21icmVzLCBzaXplID0gMC41KQ0KICANCmBgYA0KDQojIDQuIEFuw6FsaXNpcyBkZSBsYXMgZW1pc2lvbmVzIGFncsOtY29sYXMgey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KTGFzIGVtaXNpb25lcyBhZ3LDrWNvbGFzIHNvbiBhcXVlbGxhcyBwcm9jZWRlbnRlcyBkZSBsYSBwcm9kdWNjacOzbiBhZ3JvcGVjdWFyaWEuDQoNCkdyYWNpYXMgYSBudWVzdHJvcyBjw6FsY3Vsb3MsIHBvZGVtb3MgYWZpcm1hciBxdWUsIGVuIGVsIGHDsW8gMTk5MCwgbG9zIGNpbmNvIHBhw61zZXMgKGVuIG9yZGVuIGRlc2NlbmRlbnRlKSBxdWUgbcOhcyBlbWlzaW9uZXMgYWdyw61jb2xhcyBsYW56YWJhbiBhIGxhIGF0bcOzc2ZlcmEgZXJhbjogRnJhbmNpYSwgQWxlbWFuaWEsIFBvbG9uaWEsIFJlaW5vIFVuaWRvIHkgVHVycXXDrWEgeSwgZW4gY2FtYmlvLCBlbiBlbCAyMDE5IGZ1ZXJvbjogRnJhbmNpYSwgVHVycXXDrWEsIEFsZW1hbmlhLCBSZWlubyBVbmlkbyBwZXJvIHRhbWJpw6luIEVzcGHDsWEgc2UgcG9zaWNpb25hIGNvbW8gcXVpbnRhIGVuIGVsIHLDoW5raW5nLiANCkVzdG9zIHBhw61zZXMgc29uIGdyYW5kZXMgeSBkaXNwb25lbiBkZSBhbXBsaWFzIHN1cGVyZmljaWVzIGN1bHRpdmFibGVzIHkgY2VyY2FuYXMgYWwgbWFyLiBTdXN0ZW50YW4gdW5hIGdyYW4gcGFydGUgZGUgbGEgcHJvZHVjY2nDs24gYWdyb3BlY3VhcmlhIGV1cm9wZWEuIEVzIHBvciBlbGxvIHF1ZSBsYXMgZW1pc2lvbmVzIHRlbmRyw6FuIG3DoXMgcGVzby4NClBvciB0YW50bywgbG9zIHBhw61zZXMgbcOhcyBjb250YW1pbmFudGVzIGVuIGxhIGFncmljdWx0dXJhIGhhbiBzaWRvIHByw6FjdGljYW1lbnRlIGxvcyBtaXNtb3MsIGxvIHF1ZSBoYSB2YXJpYWRvIGhhIHNpZG8gc3UgcG9zaWNpw7NuLiANCg0KVGFtYmnDqW4sIHBvZGVtb3Mgc2FjYXIgY29uY2x1c2lvbmVzIHNvYnJlIGxvcyBwYcOtc2VzIHF1ZSBtZW5vcyBlbWlzaW9uZXMgYWdyw61jb2xhcyBoYW4gbGFuemFkbyBhIGxhIGF0bcOzc2ZlcmEuIExvcyA1IHF1ZSBtZW5vcyBlbiAxOTkwLCBoYW4gc2lkbzogTWFsdGEsIENoaXByZSwgSXNsYW5kaWEsIEx1eGVtYnVyZ28geSBFc2xvdmVuaWEgeSBlbiAyMDE5IEVzdG9uaWEgc3VzdGl0dXllIGEgRXNsb3ZlbmlhLg0KRXN0byBzZSBkZWJlIGFsIHRhbWHDsW8gZGVsIHRlcnJpdG9yaW8sIHlhIHF1ZSBzdSByZWR1Y2lkYSBleHRlbnNpw7NuIHByb3ZvY2EgcXVlIGxhcyBzdXBlcmZpY2llcyBjdWx0aXZhYmxlcyBzZWFuIG11eSByZWR1Y2lkYXMgeSBwcmlvcmljZW4gbGxldmFyIGEgY2FibyBvdHJvIHRpcG8gZGUgYWN0aXZpZGFkZXMsIGNvbW8gaW5kdXN0cmlhIG8gc2VydmljaW9zLCBlbnRyZSBvdHJvcy4NCg0KVG9kbyBlc3RvIGFwYXJlY2UgcGxhc21hZG8gZW4gbGFzIHRhYmxhcyBzaWd1aWVudGVzLg0KDQojIyBUYWJsYSAxDQoNCmBgYHtyLCBlY2hvID0gRkFMU0UsIGV2YWwgPSBUUlVFfQ0KaW1wYWN0X21heCA8LSBkZl9hZ3JpICU+JSANCiAgZmlsdGVyKHllYXIgJWluJSBjKDE5OTAsIDIwMTkpKSAlPiUNCiAgZ3JvdXBfYnkoeWVhcikgJT4lIA0KICBzZWxlY3QocGFpcywgeWVhciwgZW1pc2lvbmVzX2FncmkpICU+JSANCiAgc2xpY2VfbWF4KGVtaXNpb25lc19hZ3JpLCBuID0gNSkgJT4lDQogIHJlbmFtZSgiUGHDrXNlcyIgPSBwYWlzLCAiQcOxb3MiID0geWVhciwgIkVtaXNpb25lcyBhZ3LDrWNvbGFzIiA9IGVtaXNpb25lc19hZ3JpKQ0KZ3RfZXUgPC0gZ3QoaW1wYWN0X21heCkgJT4lIA0KICB0YWJfaGVhZGVyKHRpdGxlID0gbWQoIioqTG9zIDUgcGHDrXNlcyBjb24gbcOhcyBlbWlzaW9uZXMgYWdyw61jb2xhcyoqIiksDQogICAgICAgICAgICAgc3VidGl0bGUgPSAiZW50cmUgMTk5MCB5IDIwMTkiKSAlPiUNCiAgdGFiX3NvdXJjZV9ub3RlKG1kKCJGdWVudGU6IFtFVVJPU1RBVF0oaHR0cHM6Ly9hcHBzc28uZXVyb3N0YXQuZWMuZXVyb3BhLmV1L251aS9zaG93LmRvP2RhdGFzZXQ9ZW52X2Fpcl9nZ2UmbGFuZz1lbikiKSkNCg0KZ3RfZXUNCg0KYGBgDQoNCiMjIFRhYmxhIDINCg0KYGBge3IsICBlY2hvID0gRkFMU0UsIGV2YWwgPSBUUlVFfQ0KaW1wYWN0X21pbiA8LSAgZGZfYWdyaSAlPiUNCiAgZmlsdGVyKHllYXIgJWluJSBjKDE5OTAsIDIwMTkpKSAlPiUNCiAgZ3JvdXBfYnkoeWVhcikgJT4lIA0KICBzZWxlY3QocGFpcywgeWVhciwgZW1pc2lvbmVzX2FncmkpICU+JQ0KICBzbGljZV9taW4oZW1pc2lvbmVzX2FncmksIG4gPSA1KSAlPiUNCiAgcmVuYW1lKCJQYcOtc2VzIiA9IHBhaXMsICJBw7FvcyIgPSB5ZWFyLCAiRW1pc2lvbmVzIGFncsOtY29sYXMiID0gZW1pc2lvbmVzX2FncmkpDQoNCmd0X2V1IDwtIGd0KGltcGFjdF9taW4pICU+JSANCiAgdGFiX2hlYWRlcih0aXRsZSA9IG1kKCIqKkxvcyA1IHBhw61zZXMgY29uIG1lbm9zIGVtaXNpb25lcyBhZ3LDrWNvbGFzKioiKSwNCiAgICAgICAgICAgICBzdWJ0aXRsZSA9ICJlbnRyZSAxOTkwIHkgMjAxOSIpICU+JQ0KICB0YWJfc291cmNlX25vdGUobWQoIkZ1ZW50ZTogW0VVUk9TVEFUXShodHRwczovL2FwcHNzby5ldXJvc3RhdC5lYy5ldXJvcGEuZXUvbnVpL3Nob3cuZG8/ZGF0YXNldD1lbnZfYWlyX2dnZSZsYW5nPWVuKSIpKQ0KDQpndF9ldQ0KDQpgYGANCg0KIyMgTGEgdmFyaWFjacOzbiBkZSBsYXMgZW1pc2lvbmVzIGFncsOtY29sYXMgZW50cmUgMTk5MCB5IDIwMTkgey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KQWRlbcOhcywgY2FsY3VsYW1vcyBsYSB2YXJpYWNpw7NuIGRlIGxhcyBlbWlzaW9uZXMgYWdyw61jb2xhcywgZW50cmUgbG9zIGHDsW9zIDE5OTAgeSAyMDE5IHkgaGVtb3Mgb2J0ZW5pZG8gcXVlIGxvcyA1IHBhw61zZXMgcXVlIG3DoXMgaGFuIGF1bWVudGFkbyBsYXMgZW1pc2lvbmVzIGFncsOtY29sYXMgZGVzZGUgZWwgcHJpbWVyIGHDsW8gaGFzdGEgZWwgw7psdGltbyBoYW4gc2lkbzogVHVycXXDrWEsIElybGFuZGEsIENoaXByZSwgRXNwYcOxYSB5IEx1eGVtYnVyZ28uIA0KDQpFbiBjYW1iaW8sIGxvcyBxdWUgbWFzIGhhbiByZWR1Y2lkbyBzdXMgZW1pc2lvbmVzIHNvbjogTGF0dmlhLCBFc2xvdmFxdWlhLCBMaXR1YW5pYSwgQnVsZ2FyaWEgeSBDemVjaGlhLiBFbiBsb3Mgw7psdGltb3MgYcOxb3MgaGFuIHJlZHVjaWRvIGVsIHBlc28gZGVsIHNlY3RvciBhZ3LDrWNvbGEgY29uIHJlc3BlY3RvIGFsIHRvdGFsIHkgaGFuIGF1bWVudGFkbyBlbCBwZXNvIGRlIGxhIGluZHVzdHJpYSB5IGRlbCBzZWN0b3Igc2VydmljaW9zLiBFc3RvIGxlcyBwZXJtaXRlIGRpdmVyc2lmaWNhciBzdSBlc3RydWN0dXJhIHByb2R1Y3RpdmEgcGFyYSBmb21lbnRhciBlbCBkZXNhcnJvbGxvIGVjb27Ds21pY28gc29zdGVuaWRvIHkgY3JlYXIgcHJvZHVjdG9zIGRlIG1heW9yIHZhbG9yIGHDsWFkaWRvIHF1ZSBwdWVkYW4gY29tcGV0aXIgaW50ZXJuYWNpb25hbG1lbnRlLg0KDQpFbiBlbCBwcmltZXIgZ3LDoWZpY28gYW5pbWFkbywgaGVtb3Mgc2VsZWNjaW9uYWRvIGNpZXJ0b3MgcGHDrXNlcyBxdWUgY29uc2lkZXJhbW9zIHJlbGV2YW50ZXMgcGFyYSBudWVzdHJvIGFuw6FsaXNpcy4gUG9ydHVnYWwgaGEgbWFudGVuaWRvIHByw6FjdGltZW50ZSBzdXMgZW1pc2lvbmVzLCBFc3Bhw7FhIGxhcyBoYSBpbmNyZW1lbnRhZG8gbGlnZXJhbWVudGUgeSBGcmFuY2lhLCBBbGVtYW5pYSB5IFIuIFVuaWRvIGxhcyBoYW4gZGlzbWludWlkby4NCg0KRW4gZWwgc2VndW5kbyBncsOhZmljbyBhbmltYWRvIHNlIHB1ZWRlIG9ic2VydmFyIGxhIGV2b2x1Y2nDs24gZGUgbGFzIGVtaXNpb25lcyBhZ3LDrWNvbGFzIHRvdGFsZXMsIGRlc2RlIDE5OTAgaGFzdGEgMjAxOS4gU2UgcHVlZGVuIGRpZmVyZW5jaWFyIHRyZXMgZ3JhbmRlcyBldGFwYXM6DQoNCkVuIHByaW1lciBsdWdhciwgMTk5MC0yMDA1LCBzZSBwcm9kdWNlIHVuIGZ1ZXJ0ZSBkZXNjZW5zbyB5IGRlc3B1w6lzIHZ1ZWx2ZW4gYSBhdW1lbnRhci4gRW4gc2VndW5kbyBsdWdhciwgMjAwNS0yMDE1LCBsYXMgZW1pc2lvbmVzIGF1bWVudGFuIHBlcm8gZGVzcHXDqXMgc2lndWVuIGRpc21pbnV5ZW5kby4gWSBmaW5hbG1lbnRlLCAyMDE1LTIwMTksIHF1ZSBzdWZyZW4gdW4gZnVlcnRlIGluY3JlbWVudG8uDQoNCmBgYHtyLCAgZWNobyA9IEZBTFNFLCBldmFsID0gVFJVRX0NCmNyZWNfcGVyY2VudCA8LSBkZl9hZ3JpICU+JSANCiAgZmlsdGVyKHllYXIgJWluJSBjKDE5OTAsMjAxOSkpICU+JSANCiAgZ3JvdXBfYnkocGFpcykgJT4lIA0KICBtdXRhdGUoY3JlY19lbWlzaW9uZXMgPSBlbWlzaW9uZXNfYWdyaSAtIGZpcnN0KGVtaXNpb25lc19hZ3JpKSkgJT4lIA0KICBtdXRhdGUoY3JlY19lbWlzaW9uZXNfcGVyY2VudCA9IGNyZWNfZW1pc2lvbmVzIC8gZmlyc3QoZW1pc2lvbmVzX2FncmkpICogMTAwKQ0KDQpgYGANCg0KIyMjIFRhYmxhIDMNCg0KYGBge3IsICBlY2hvPUZBTFNFLCBldmFsPVRSVUV9DQptYXhfY3JlY19wZXJjIDwtIGNyZWNfcGVyY2VudCAlPiUgDQogIGZpbHRlciAoeWVhciA9PSAyMDE5KSAlPiUgDQogIGFycmFuZ2UoY3JlY19lbWlzaW9uZXNfcGVyY2VudCkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgc2xpY2VfbWF4KGNyZWNfZW1pc2lvbmVzX3BlcmNlbnQsIG4gPSA1KSAlPiUNCiAgcmVuYW1lKCJQYcOtc2VzIiA9IHBhaXMsICJBw7FvcyIgPSB5ZWFyLCAiRW1pc2lvbmVzIGFncsOtY29sYXMiID0gZW1pc2lvbmVzX2FncmksICJWYXJpYWNpw7NuIGRlIGxhcyBlbWlzaW9uZXMiID0gY3JlY19lbWlzaW9uZXMsICJWYXJpYWNpw7NuIHBvcmNlbnR1YWwiID0gY3JlY19lbWlzaW9uZXNfcGVyY2VudCkgDQoNCmd0X2V1IDwtIGd0KG1heF9jcmVjX3BlcmMpICU+JSANCiAgdGFiX2hlYWRlcih0aXRsZSA9IG1kKCIqKkxvcyA1IHBhw61zZXMgcXVlIG3DoXMgaGFuIGF1bWVudGFkbyBzdXMgZW1pc2lvbmVzIGFncsOtY29sYXMqKiIpLA0KICAgICAgICAgICAgIHN1YnRpdGxlID0gImVudHJlIDE5OTAgeSAyMDE5IikgJT4lDQogIHRhYl9zb3VyY2Vfbm90ZShtZCgiRnVlbnRlOiBbRVVST1NUQVRdKGh0dHBzOi8vYXBwc3NvLmV1cm9zdGF0LmVjLmV1cm9wYS5ldS9udWkvc2hvdy5kbz9kYXRhc2V0PWVudl9haXJfZ2dlJmxhbmc9ZW4pIikpDQoNCmd0X2V1DQoNCmBgYA0KDQojIyMgVGFibGEgNA0KDQpgYGB7ciwgIGVjaG89RkFMU0UsIGV2YWw9VFJVRX0NCm1pbl9jcmVjX3BlcmMgPC0gY3JlY19wZXJjZW50ICU+JSANCiAgZmlsdGVyICh5ZWFyID09IDIwMTkpICU+JSANCiAgYXJyYW5nZShjcmVjX2VtaXNpb25lc19wZXJjZW50KSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBzbGljZV9taW4oY3JlY19lbWlzaW9uZXNfcGVyY2VudCwgbiA9IDUpICU+JQ0KICByZW5hbWUoIlBhw61zZXMiID0gcGFpcywgIkHDsW9zIiA9IHllYXIsICJFbWlzaW9uZXMgYWdyw61jb2xhcyIgPSBlbWlzaW9uZXNfYWdyaSwgIlZhcmlhY2nDs24gZGUgbGFzIGVtaXNpb25lcyIgPSBjcmVjX2VtaXNpb25lcywgIlZhcmlhY2nDs24gcG9yY2VudHVhbCIgPSBjcmVjX2VtaXNpb25lc19wZXJjZW50KSANCg0KZ3RfZXUgPC0gZ3QobWluX2NyZWNfcGVyYykgJT4lIA0KICB0YWJfaGVhZGVyKHRpdGxlID0gbWQoIioqTG9zIDUgcGHDrXNlcyBxdWUgbcOhcyBoYW4gcmVkdWNpZG8gc3VzIGVtaXNpb25lcyBhZ3LDrWNvbGFzKioiKSwNCiAgICAgICAgICAgICBzdWJ0aXRsZSA9ICJlbnRyZSAxOTkwIHkgMjAxOSIpICU+JQ0KICB0YWJfc291cmNlX25vdGUobWQoIkZ1ZW50ZTogW0VVUk9TVEFUXShodHRwczovL2FwcHNzby5ldXJvc3RhdC5lYy5ldXJvcGEuZXUvbnVpL3Nob3cuZG8/ZGF0YXNldD1lbnZfYWlyX2dnZSZsYW5nPWVuKSIpKQ0KDQpndF9ldQ0KDQpgYGANCg0KIyMjIE1hcGEgZGUgY29yb3BsZXRhcw0KDQpFbiBlbCBzaWd1aWVudGUgbWFwYSBtw7psdGlwbGUgc2UgcHVlZGUgb2JzZXJ2YXIsIGVuIGxvcyBhw7FvcyAxOTkwLCAyMDAwLCAyMDEwIHkgMjAxOSwgY29tbyB2YW4gY3JlY2llbmRvIG8gZGlzbWludXllbmRvIGxhcyBlbWlzaW9uZXMgYWdyw61jb2xhcyBlbiBsb3MgZGlzdGludG9zIHBhw61zZXMgZXVyb3Blb3MgZ3JhY2lhcyBhbCBjYW1iaW8gZGUgY29sb3IgcXVlIHNlIG9ic2VydmEgZW4gZWxsb3MuDQoNCmBgYHtyLCBlY2hvID0gRkFMU0UsIGV2YWwgPSBUUlVFfQ0Kd29ybGQgPC0gbmVfY291bnRyaWVzKHNjYWxlID0gIm1lZGl1bSIsIHJldHVybmNsYXNzID0gInNmIikNCndvcmxkIDwtIHdvcmxkICU+JSBmaWx0ZXIoc3VicmVnaW9uICE9ICJBbnRhcmN0aWNhIikgJT4lIGZpbHRlcihhZG1pbiAhPSAiR3JlZW5sYW5kIikNCndvcmxkIDwtIHdvcmxkICU+JSBzZWxlY3QobmFtZSwgaXNvX2EzLCBnZW9tZXRyeSkNCg0KDQojSGFjZW1vcyBjb2luY2lkaXIgbG9zIG5vbWJyZXMgY29uIGVsIGRmIGRlIHdvcmxkDQoNCmRmX2FncmkkcGFpcyA8LSByZWNvZGUoZGZfYWdyaSRwYWlzLCAiQ3plY2hpYSIgPSAiQ3plY2ggUmVwLiIsDQogICAgICAgICAgICAgICAgICAgICAgICJVSyIgPSAiVW5pdGVkIEtpbmdkb20iKQ0KI1VuaW1vcyBjb24gd29ybGQNCg0KZGZfam9pbiA8LSBsZWZ0X2pvaW4gKGRmX2FncmksIHdvcmxkLCBieSA9IGMoInBhaXMiID0gIm5hbWUiKSkNCg0KZGZfZXUgPC0gZGZfam9pbiAlPiUNCiAgZmlsdGVyKHllYXIgJWluJSBjKCIxOTkwIiwgIjIwMDAiLCAiMjAxMCIsICIyMDE5IikpICU+JQ0KICBtdXRhdGUoZW1pc2lvbmVzXzQgPSBudGlsZShlbWlzaW9uZXNfYWdyaSwgNCkpDQoNCnBfZXUgPC0gZ2dwbG90KGRmX2V1LCBhZXMoZmlsbCA9IGVtaXNpb25lc180LCBnZW9tZXRyeSA9IGdlb21ldHJ5KSkgKw0KICBnZW9tX3NmKCkgKw0KICBsYWJzKHRpdGxlID0gIkVtaXNpb25lcyBhZ3LDrWNvbGFzIHBvciBwYWlzIiwNCiAgICAgICBmaWxsID0gIkVtaXNpb25lcyIpICsgDQogIGNvb3JkX3NmKHhsaW0gPSBjKC0xNS4wMCwgNDIuMDApLCB5bGltID0gYygzNS42MCwgNzEsMTApLCBleHBhbmQgPSBUUlVFKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnQoIkVtaXNpb25lcyBhZ3LDrWNvbGFzIiwgaGlnaCA9ICJncmVlbiIsIGxvdyA9ICJ3aGl0ZSIpICsgDQogIGZhY2V0X2dyaWQoeWVhciB+IC4pDQoNCnBfZXUNCg0KYGBgDQoNCiMjIyBHcsOhZmljbw0KDQpFc3RvIG1pc21vLCBzZSBwdWVkZSB2aXN1YWxpemFyIG1lZGlhbnRlIGVsIHNpZ3VpZW50ZSBncsOhZmljbyB5IGFkZW3DoXMsIGRlc3RhY2Ftb3MgZW4gdW4gY29sb3IgZGlzdGludG8sIEVzcGHDsWEuDQoNCmBgYHtyLCAgbWVzc2FnZSA9IEZBTFNFLCAgd2FybmluZyA9IEZBTFNFLCAgcmVzdWx0cyA9IFRSVUUsIGVjaG8gPSBGQUxTRSAsIGV2YWwgPSBUUlVFfQ0KZGZfYWdyaTIgPC0gZGZfYWdyaSAlPiUNCiAgZmlsdGVyKHllYXIgJWluJSBjKCIxOTkwIiwgIjIwMDAiLCAiMjAxMCIsICIyMDE5IikpICU+JQ0KICBtdXRhdGUoZW1pc2lvbmVzX2FncmkgPSBlbWlzaW9uZXNfYWdyaS8xMDAwKQ0KDQpnMSA8LSBnZ3Bsb3QoZGZfYWdyaTIsICBhZXMoeCA9IHBhaXMsIHkgPSBlbWlzaW9uZXNfYWdyaSkpICsgDQogICAgICAgIGdlb21fY29sKGZpbGwgPSAic3RlZWxibHVlIikgKw0KICBnZW9tX2NvbChkYXRhID0gZmlsdGVyKGRmX2FncmkyLCBwYWlzID09ICJTcGFpbiIpLCBmaWxsID0gIm9yYW5nZSIpICsgDQogIGNvb3JkX2ZsaXAoKSArDQogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoeWVhcikpICsgDQogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJncmF5MTAwIikpICsNCiAgbGFicyh0aXRsZSA9ICJFbWlzaW9uZXMgYWdyw61jb2xhcywgcG9yIHBhaXNlcyIsDQogICAgICAgeCA9ICJQYcOtcyIsIHkgPSAiRW1pc2lvbmVzIiwgc3VidGl0bGUgPSAiZW4gbWlsZXMgZGUgdG9uZWxhZGFzIGRlIGNvMiIpDQoNCmcxDQoNCmBgYA0KDQojIyMgT3RyYSBmb3JtYSBkZSB2aXN1YWxpemFyIGxvcyBkYXRvcw0KDQpZIGRlIGVzdGEgbWFuZXJhIHRhbiB2aXN1YWwsIHBvZGVtb3Mgb2JzZXJ2YXIgYXF1ZWxsb3MgcGHDrXNlcyBxdWUgbcOhcyBlbWlzaW9uZXMgYWdyw61jb2xhcyB0b3RhbGVzLCBkZXNkZSAxOTkwLCBoYW4gbGFuemFkbyBhIGxhIGF0bcOzc2ZlcmEuDQoNCkNvbiBlbGxvLCBzZSBhZmlybWEgcXVlIGhhbiBzaWRvIEZyYW5jaWEsIEFsZW1hbmlhLCBUdXJxdcOtYSwgUmVpbm8gVW5pZG8geSBFc3Bhw7FhIGxvcyBxdWUgaGFuIGxhbnphZG8gbcOhcyBlbWlzaW9uZXMgYWdyw61jb2xhcyB5YSBxdWUgc3Ugbm9tYnJlIGFwYXJlY2UgZW4gdW5hIGxldHJhIG3DoXMgZ3JhbmRlLiANCg0KYGBge3IsIGV2YWw9IFRSVUUsIGVjaG89IEZBTFNFfQ0KI1N1bWFtb3MgbGEgdG90YWxpZGFkIGRlIGxhcyBlbWlzaW9uZXMgYWdyw61jb2xhcyBwb3IgcGHDrXMgZW50cmUgbG9zIGHDsW9zIDE5OTAgeSAyMDE5DQoNCmRmX2Fncmlfbm9tYnJlcyA8LSBkZl9hZ3JpICU+JSANCiAgZ3JvdXBfYnkocGFpcykgJT4lIA0KICBzdW1tYXJpc2UoZW1pc2lvbmVzX2FncmkgPSBzdW0oZW1pc2lvbmVzX2FncmkpKSAlPiUNCiAgbXV0YXRlKGVtaXNpb25lc19hZ3JpID0gZW1pc2lvbmVzX2FncmkvMTAwMDAwMCkgJT4lDQogIHVuZ3JvdXAoKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhlbWlzaW9uZXNfYWdyaSkpDQoNCmdncGxvdChkZl9hZ3JpX25vbWJyZXMsIGFlcyhhcmVhID0gZW1pc2lvbmVzX2FncmksIGZpbGwgPSBlbWlzaW9uZXNfYWdyaSwgbGFiZWwgPSBwYWlzICkpICsNCiAgZ2VvbV90cmVlbWFwKCkgKw0KICBnZW9tX3RyZWVtYXBfdGV4dChjb2xvdXIgPSAid2hpdGUiLCBwbGFjZSA9ICJjZW50cmUiLA0KICAgICAgICAgICAgICAgICAgICBncm93ID0gRkFMU0UpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Mob3B0aW9uID0gIkQiICwgbmFtZSA9ICIiLCBhbHBoYSA9IDAuOCwgYmVnaW4gPSAwLjMsIGVuZCA9IDAuNywgZGlyZWN0aW9uID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhciggdGl0bGUgPSAiQ2FudGlkYWQgZGUgZW1pc2lvbmVzLCBlbiBtaWxsb25lcyBkZSB0b25lbGFkYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsIGJhcmhlaWdodCA9IHVuaXQoMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzID0gIm1tIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhcndpZHRoID0gdW5pdCg1MCwgdW5pdHMgPSAibW0iKSwgZHJhdy51bGltID0gRiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUucG9zaXRpb24gPSAndG9wJywgdGl0bGUuaGp1c3QgPSAwLjUsIGxhYmVsLmhqdXN0ID0gMC41KSkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzPWZ1bmN0aW9uKHZhbHVlKXtmb3JtYXQodmFsdWUsIHNjaWVudGlmaWMgPSBGQUxTRSl9KSArDQogIGxhYnModGl0bGUgPSAiRW1pc2lvbmVzIGFncsOtY29sYXMgcG9yIHBhw61zIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJlbnRyZSAxOTkwIHkgMjAxOSIpICsgDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArDQogIHRoZW1lKHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KDQpgYGANCg0KIyMjIEdyw6FmaWNvcyBhbmltYWRvcw0KDQoNCiFbXSguL2ltYWdlbmVzL2FuaW0uZ2lmKQ0KDQoNCiFbXSguL2ltYWdlbmVzL2dnLmdpZikNCg0KIyMjIEPDs2RpZ28NCg0KYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBldmFsID0gRkFMU0UsIGZpZy5hbGlnbiA9ICJjZW50ZXIifQ0KI0NhbGN1bGFtb3MgbGFzIGVtaXNpb25lcyBhZ3LDrWNvbGFzIHRvdGFsZXMgcG9yIGHDsW8NCg0KZGZfYWdyaV90b3RhbGVzIDwtIGRmX2FncmkgJT4lDQogIGdyb3VwX2J5KHllYXIpICU+JQ0KICBzdW1tYXJpc2UoZW1pc2lvbmVzX2FncmlfdG90YWxlcyA9IHN1bShlbWlzaW9uZXNfYWdyaSkpDQoNCmdnIDwtIGdncGxvdChkZl9hZ3JpX3RvdGFsZXMsIGFlcyh5ID0gZW1pc2lvbmVzX2FncmlfdG90YWxlcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSB5ZWFyKSkgKw0KICBnZW9tX2xpbmUoKSArDQogIGdlb21fcG9pbnQoKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMTk5MCwgMjAyMCwgMTApLCBsaW1pdHMgPSBjKDE5OTAsIDIwMjApKSArIA0KICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JheTEwMCIpLA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJhbnRpcXVld2hpdGUiKSkgKw0KICBsYWJzKHRpdGxlID0gIkVtaXNpb25lcyB0b3RhbGVzIGFncsOtY29sYXMsIHBvciBhw7FvIiwNCiAgICB4ID0gIkHDsW9zIiwgeSA9ICJFbWlzaW9uZXMgIiwgc3VidGl0bGUgPSAiZW4gbWlsZXMgZGUgdG9uZWxhZGFzIGRlIGNvMiIsDQogICAgY2FwdGlvbiA9ICJGdWVudGU6IEV1cm9zdGF0IikgKw0KICB0cmFuc2l0aW9uX3JldmVhbCh5ZWFyKQ0KIy0gYW5pbV9zYXZlKCIuL2ltYWdlbmVzL2dnLmdpZiIsIGdnKQ0KDQpnZw0KDQojR3LDoWZpY28gYW5pbWFkbw0KDQpkZl9hZ3JpX3ggPC0gZGZfYWdyaSAlPiUNCiAgZmlsdGVyKHBhaXMgJWluJSBjKCJHZXJtYW55IiwgIkZyYW5jZSIsICJTcGFpbiIsICJVbml0ZWQgS2luZ2RvbSIsICJQb3J0dWdhbCIpKQ0KDQphbmltXzIgPC0gZGZfYWdyaV94ICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gZW1pc2lvbmVzX2FncmksIGdyb3VwID0gcGFpcywgY29sb3IgPSBwYWlzKSkgKw0KICAgIGdlb21fbGluZSgpICsNCiAgICBnZW9tX3BvaW50KCkgKyANCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gImdyYXkxMDAiKSkgKyANCiAgbGFicyh0aXRsZSA9ICJFbWlzaW9uZXMgYWdyaWNvbGFzLCBwb3IgcGHDrXMiLA0KICAgICAgIHggPSAiQcOxb3MiLCB5ID0gIkVtaXNpb25lcyIsIHN1YnRpdGxlID0gImVuIG1pbGVzIGRlIHRvbmVsYWRhcyBkZSBjbzIiLCBjYXB0aW9uID0gIkZ1ZW50ZTogRXVyb3N0YXQiKSArDQogIHRyYW5zaXRpb25fcmV2ZWFsICh5ZWFyKSANCg0KIy0gYW5pbV9zYXZlKCIuL2ltYWdlbmVzL2FuaW0uZ2lmIiwgYW5pbV8yKQ0KDQphbmltXzINCg0KYGBgDQoNCiMgNS4gUHJvZnVuZGl6YW1vcyBlbCBhbsOhbGlzaXMgZW4gRXNwYcOxYSB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQpBaG9yYSwgcGFzYW1vcyBhIHJlYWxpemFyIHVuIGFuw6FsaXNpcyBtw6FzIGV4aGF1c3Rpdm8gZGUgbnVlc3RybyBwYcOtcy4NCg0KRW4gcHJpbWVyIGx1Z2FyLCBoZW1vcyBxdWVyaWRvIGRlc3RhY2FyIGxvcyA1IGHDsW9zIHF1ZSBtw6FzIGVtaXNpb25lcyBhZ3LDrWNvbGFzIGhhbiBoYWJpZG8geSBsb3MgNSBxdWUgbWVub3MuDQoNCkxvcyA1IGHDsW9zIHF1ZSBtw6FzIGVtaXNpb25lcyBhZ3LDrWNvbGFzIHNlIGhhbiBsYW56YWRvIGhhbiBzaWRvIGRlbCAyMDAwIGhhc3RhIGVsIDIwMDUgeSBlbiBjYW1iaW8sIGxvcyBxdWUgbWVub3MsIDE5OTEtMTk5NCB5IGRlc3B1w6lzLCBlbiBlbCAyMDEyLg0KUG9yIHRhbnRvLCBwb2RlbW9zIGFmaXJtYXIgcXVlIEVzcGHDsWEgbm8gaGEgc2VndWlkbyBsYSB0ZW5kZW5jaWEgZGUgbGEgc3VtYSBkZSB0b2RvcyBsb3MgcGHDrXNlcyBldXJvcGVvcywgZHVyYW50ZSBsb3MgYcOxb3MgMjAwMC0yMDA1LCBhbmFsaXphZGEgZW4gZWwgYXBhcnRhZG8gYW50ZXJpb3IuIA0KDQpUb2RvIGVzdG8gc2UgcHVlZGUgdmlzdWFsaXphciBlbiBsYSB0YWJsYSByZWFsaXphZGEuDQoNClksIGVuIGVsIGdyw6FmaWNvIGRlIGRlYmFqbywgc2UgcHVlZGUgb2JzZXJ2YXIgbGEgZXZvbHVjacOzbiBkZSBsYXMgZW1pc2lvbmVzIGFncsOtY29sYXMgZXNwYcOxb2xhcyBkdXJhbnRlIHRvZG9zIGxvcyBhw7Fvcy4gRHVyYW50ZSBlbCBwZXLDrW9kbyBlc3R1ZGlhZG8sIEVzcGHDsWEgaGEgYXVtZW50YWRvIHN1cyBlbWlzaW9uZXMuIEVzdG8gZXMgZGViaWRvIGEgbGEgaW5mbHVlbmNpYSBkZSBsYXMgcG9sw610aWNhcyBQQUMsIHF1ZSBoYW4gZm9tZW50YWRvIGxhIGFjdGl2aWRhZCBhZ3LDrWNvbGEgeSBwb3IgdGFudG8gbGFzIGVtaXNpb25lcy4NCg0KIyMgVGFibGEgMSANCg0KYGBge3IsIGVjaG8gPSBGQUxTRSwgZXZhbCA9IFRSVUV9DQppbXBhY3RfbWF4X2VzcCA8LSAgZGZfYWdyaSAlPiUNCiAgZmlsdGVyKHBhaXMgPT0gIlNwYWluIikgJT4lDQogIHNsaWNlX21heChlbWlzaW9uZXNfYWdyaSwgbiA9IDUpICU+JQ0KICByZW5hbWUoIlBhw61zIiA9IHBhaXMsICJBw7FvcyIgPSB5ZWFyLCAiRW1pc2lvbmVzIGFncsOtY29sYXMiID0gZW1pc2lvbmVzX2FncmkpDQoNCmd0X2VzcDEgPC0gZ3QoaW1wYWN0X21heF9lc3ApICU+JSANCiAgdGFiX2hlYWRlcih0aXRsZSA9IG1kKCIqKkxvcyA1IGHDsW9zIHF1ZSBtw6FzIGVtaXNpb25lcyBoYSBsYW56YWRvIEVzcGHDsWEqKiIpLA0KICAgICAgICAgICAgIHN1YnRpdGxlID0gImVudHJlIDE5OTAgeSAyMDE5IikgJT4lDQogIHRhYl9zb3VyY2Vfbm90ZShtZCgiRnVlbnRlOiBbRVVST1NUQVRdKGh0dHBzOi8vYXBwc3NvLmV1cm9zdGF0LmVjLmV1cm9wYS5ldS9udWkvc2hvdy5kbz9kYXRhc2V0PWVudl9haXJfZ2dlJmxhbmc9ZW4pIikpIA0KDQpndF9lc3AxDQoNCmBgYA0KDQojIyBUYWJsYSAyDQoNCmBgYHtyLCBlY2hvID0gRkFMU0UsIGV2YWwgPSBUUlVFfQ0KaW1wYWN0X21pbl9lc3AgPC0gIGRmX2FncmkgJT4lIA0KICBmaWx0ZXIocGFpcyA9PSAiU3BhaW4iKSAlPiUNCiAgc2xpY2VfbWluKGVtaXNpb25lc19hZ3JpLCBuID0gNSkgJT4lDQogIHJlbmFtZSgiUGHDrXMiID0gcGFpcywgIkHDsW9zIiA9IHllYXIsICJFbWlzaW9uZXMgYWdyw61jb2xhcyIgPSBlbWlzaW9uZXNfYWdyaSkNCg0KZ3RfZXNwMiA8LSBndChpbXBhY3RfbWluX2VzcCkgJT4lIA0KICB0YWJfaGVhZGVyKHRpdGxlID0gbWQoIioqTG9zIDUgYcOxb3MgcXVlIG1lbm9zIGVtaXNpb25lcyBoYSBsYW56YWRvIEVzcGHDsWEqKiIpLA0KICAgICAgICAgICAgIHN1YnRpdGxlID0gImVudHJlIDE5OTAgeSAyMDE5IikgJT4lDQogIHRhYl9zb3VyY2Vfbm90ZShtZCgiRnVlbnRlOiBbRVVST1NUQVRdKGh0dHBzOi8vYXBwc3NvLmV1cm9zdGF0LmVjLmV1cm9wYS5ldS9udWkvc2hvdy5kbz9kYXRhc2V0PWVudl9haXJfZ2dlJmxhbmc9ZW4pIikpDQoNCmd0X2VzcDINCg0KYGBgDQoNCiMjIEdyw6FmaWNvDQoNCkVuIGVzdGUgZ3LDoWZpY28sIHNlIG9ic2VydmEgbGEgZXZvbHVjacOzbiBkZSBsYXMgZW1pc2lvbmVzIGFncsOtY29sYXMgZW4gRXNwYcOxYSBkZXNkZSAxOTkwIGhhc3RhIDIwMTkuDQoNCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgcmVzdWx0cyA9IFRSVUUsZWNobyA9IEZBTFNFICwgZXZhbCA9IFRSVUV9DQpkZl9lc3AgPC0gZGZfYWdyaSAlPiUNCiAgZmlsdGVyIChwYWlzID09ICJTcGFpbiIpDQoNCmczIDwtIGdncGxvdChkZl9lc3AsICBhZXMoeCA9IHllYXIsIHkgPSBlbWlzaW9uZXNfYWdyaSkpICsgDQogICAgICAgIGdlb21fY29sKGZpbGwgPSAibGlnaHRncmVlbiIpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxOTkwLCAyMDIwLCAxMCksIGxpbWl0cyA9IGMoMTk5MCwgMjAyMCkpICsgDQogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0aGlzdGxlMSIpKSArDQogIGxhYnModGl0bGUgPSAiRW1pc2lvbmVzIGFncsOtY29sYXMgZW4gRXNwYcOxYSIsDQogICAgeCA9ICJBw7FvcyIsIHkgPSAiRW1pc2lvbmVzIGFncsOtY29sYXMiLA0KICAgIHN1YnRpdGxlID0gImVuIG1pbGVzIGRlIHRvbmVsYWRhcyBkZSBDTzIiKQ0KDQpnMyArIGxhYnMgKGNhcHRpb24gPSAiRnVlbnRlOiBFdXJvc3RhdCIpDQoNCmBgYA0KDQojIyBMYSB2YXJpYWNpw7NuIGRlIGxhcyBlbWlzaW9uZXMgYWdyw61jb2xhcywgZW50cmUgMTk5MCB5IDIwMTkgey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KTGEgdmFyaWFjacOzbiBxdWUgaGEgc3VmcmlkbyBFc3Bhw7FhIGVuIGN1YW50byBhIGxhcyBlbWlzaW9uZXMgYWdyw61jb2xhcyBlbnRyZSBsb3MgYcOxb3MgMTk5MCB5IDIwMTkgaGEgc2lkbyBkZSBhcHJveGltYWRhbWVudGUgZGUgOCwwMSAlLCBjb21vIHNlIHB1ZWRlIG9ic2VydmFyIGVuIGxhIHRhYmxhIGRlIGFiYWpvLg0KDQpgYGB7ciwgZWNobyA9IEZBTFNFLCBldmFsID0gVFJVRX0NCmNyZWNfcGVyY2VudF9lc3AgPC0gZGZfYWdyaSAlPiUgDQogIGZpbHRlcih5ZWFyICVpbiUgYygxOTkwLDIwMTkpLCBwYWlzID09ICJTcGFpbiIpICU+JSANCiAgbXV0YXRlKGNyZWNfZW1pc2lvbmVzID0gZW1pc2lvbmVzX2FncmkgLSBmaXJzdChlbWlzaW9uZXNfYWdyaSkpICU+JSANCiAgbXV0YXRlKGNyZWNfZW1pc2lvbmVzX3BlcmNlbnQgPSBjcmVjX2VtaXNpb25lcyAvIGZpcnN0KGVtaXNpb25lc19hZ3JpKSAqMTAwKQ0KDQpgYGANCg0KIyMjIFRhYmxhIDMNCg0KYGBge3IsIGVjaG8gPSBGQUxTRSwgZXZhbCA9IFRSVUUsIHJlc3VsdHMgPSBUUlVFfQ0KY3JlY19wZXJjZW50X2VzcCA8LSBjcmVjX3BlcmNlbnRfZXNwICU+JQ0KICByZW5hbWUoIlBhw61zIiA9IHBhaXMsICJBw7FvcyIgPSB5ZWFyLCAiRW1pc2lvbmVzIGFncsOtY29sYXMiID0gZW1pc2lvbmVzX2FncmksICJWYXJpYWNpw7NuIGRlIGxhcyBlbWlzaW9uZXMiID0gY3JlY19lbWlzaW9uZXMsICJWYXJpYWNpw7NuIHBvcmNlbnR1YWwiID0gY3JlY19lbWlzaW9uZXNfcGVyY2VudCkNCg0KZ3RfZXNwIDwtIGd0KGNyZWNfcGVyY2VudF9lc3ApICU+JSANCiAgdGFiX2hlYWRlcih0aXRsZSA9IG1kKCIqKlZhcmlhY2nDs24gZGUgbGFzIGVtaXNpb25lcyBhZ3LDrWNvbGFzIGVuIEVzcGHDsWEqKiIpLA0KICAgICAgICAgICAgIHN1YnRpdGxlID0gImVudHJlIDE5OTAgeSAyMDE5IikgJT4lDQogIHRhYl9zb3VyY2Vfbm90ZShtZCgiRnVlbnRlOiBbRVVST1NUQVRdKGh0dHBzOi8vYXBwc3NvLmV1cm9zdGF0LmVjLmV1cm9wYS5ldS9udWkvc2hvdy5kbz9kYXRhc2V0PWVudl9haXJfZ2dlJmxhbmc9ZW4pIikpDQoNCmd0X2VzcA0KDQpgYGANCg0KIyA2LiBFbWlzaW9uZXMgYWdyw61jb2xhcyB2cyBFbWlzaW9uZXMgdG90YWxlcyB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQpFbiBlc3RlIGFwYXJ0YWRvLCBwcmV0ZW5kZW1vcyBsbGV2YXIgYSBjYWJvIHVuYSBjb21wYXJhY2nDs24gZGUgbGFzIGVtaXNpb25lcyBhZ3LDrWNvbGFzIGNvbiBsYSB0b3RhbGlkYWQgZGUgZW1pc2lvbmVzIGV4aXN0ZW50ZXMuDQoNCmBgYHtyLCBlY2hvID0gRkFMU0UsIGV2YWwgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQojSnVudGFtb3MgbG9zIGRvcyBkZiBwYXJhIHBvZGVyIHRyYWJhamFyIG1lam9yIGVuIG51ZXN0cm9zIGFuw6FsaXNpcyANCg0KZGZfdG90YWxlcyA8LSBkZl9lbWkgJT4lDQogIGdyb3VwX2J5KHllYXIpICU+JQ0KICBzdW1tYXJpc2UoZW1pc2lvbmVzX3RvdGFsZXMgPSBzdW0oZW1pc2lvbmVzX3RvdGFsZXMpKQ0KDQpkZl9sZWZ0X2pvaW4gPC0gbGVmdF9qb2luKGRmX2FncmksIGRmX3RvdGFsZXMsIGJ5ID0gInllYXIiKQ0KDQojI1BvcmNlbnRhamUgZGUgZW1pc2lvbmVzIGFncsOtY29sYXMgc29icmUgZWwgdG90YWwgZGUgZW1pc2lvbmVzIHBhcmEgY2FkYSBwYcOtcw0KDQojUGFyYSBjYWRhIGHDsW8NCg0KZGZfY29tcGFyYWNpb25fMSA8LSBkZl9sZWZ0X2pvaW4gJT4lDQogIGdyb3VwX2J5KHBhaXMpICU+JQ0KICBtdXRhdGUocG9yY2VudF9zb2JyZV90b3RhbCA9IGVtaXNpb25lc19hZ3JpL2VtaXNpb25lc190b3RhbGVzICogMTAwKSAlPiUNCiAgbXV0YXRlKHZhcl9wb3JjZW50ID0gcG9yY2VudF9zb2JyZV90b3RhbCAtIGxhZyhwb3JjZW50X3NvYnJlX3RvdGFsKSkgDQoNCiNFbnRyZSAxOTkwIHkgMjAxOQ0KDQpkZl9jb21wYXJhY2lvbl8yIDwtIGRmX2xlZnRfam9pbiAlPiUNCiAgZmlsdGVyKHllYXIgJWluJSBjKDE5OTAsMjAxOSkpICU+JQ0KICBncm91cF9ieShwYWlzKSAlPiUNCiAgbXV0YXRlKHBvcmNlbnRfc29icmVfdG90YWwgPSBlbWlzaW9uZXNfYWdyaS9lbWlzaW9uZXNfdG90YWxlcyAqIDEwMCkgJT4lDQogIG11dGF0ZSh2YXJfcG9yY2VudCA9IHBvcmNlbnRfc29icmVfdG90YWwgLSBmaXJzdChwb3JjZW50X3NvYnJlX3RvdGFsKSkgDQoNCmBgYA0KDQojIyBHcsOhZmljbw0KDQpZLCBtZWRpYW50ZSBlc3RlIGdyw6FmaWNvIHNlIHB1ZWRlIG9ic2VydmFyIGRpY2hhIGNvbXBhcmFjacOzbiwgcGFyYSBlbCBhw7FvIDIwMTkuDQpWZW1vcyBxdWUgcmVwcmVzZW50YW4gdW4gcG9yY2VudGFqZSBtdXkgYmFqby4gDQoNCkVuIG51ZXN0cm8gZ3LDoWZpY28sIGxhIEEgcmVwcmVzZW50YSBsYXMgZW1pc2lvbmVzIGFncsOtY29sYXMgKDExLDcwJSkgeSBsYSBsZXRyYSBCIHJlcHJlc2VudGEgbGFzIGVtaXNvbmVzIHRvdGFsZXMuDQoNCkxhcyBhY3RpdmlkYWRlcyBhZ3LDrWNvbGFzIHJlcHJlc2VudGFuIGFscmVkZWRvciBkZSB1biAyJSBkZWwgUElCLiBFcyBwb3IgZWxsbyBxdWUgbGFzIGVtaXNpb25lcyB0aWVuZW4gdW4gcGFwZWwgcmVkdWNpZG8gc29icmUgZWwgY8OzbXB1dG8gZ2xvYmFsLg0KDQpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIHJlc3VsdHMgPSBUUlVFLGVjaG8gPSBGQUxTRSAsIGV2YWwgPSBUUlVFfQ0KZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBncm91cCA9IExFVFRFUlNbMToyXSwNCiAgdmFsdWUgPSBjKDUwNjU1MC44LCA0MzI3OTgxKSkNCg0KZGF0YSA8LSBkYXRhICU+JSANCiAgYXJyYW5nZShkZXNjKGdyb3VwKSkgJT4lDQogIG11dGF0ZShwcm9wID0gdmFsdWUgLyBzdW0oZGF0YSR2YWx1ZSkgKiAxMDApICU+JQ0KICBtdXRhdGUoeXBvcyA9IGN1bXN1bShwcm9wKS0gMC41KnByb3AgKQ0KDQpwIDwtIGdncGxvdChkYXRhLCBhZXMoeD0iIiwgeSA9IHByb3AsIGZpbGwgPSBncm91cCkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHdpZHRoID0gMSwgY29sb3IgPSAiYmxhY2siKSArDQogIGNvb3JkX3BvbGFyKCJ5Iiwgc3RhcnQgPSAwKSArDQogIHRoZW1lX3ZvaWQoKSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgZ2VvbV90ZXh0KGFlcyh5ID0geXBvcywgbGFiZWwgPSBncm91cCksIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDYpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iU2V0NSIpDQoNCnAgKyBsYWJzKHRpdGxlID0gIkVtaXNpb25lcyBhZ3LDrWNvbGFzIHNvYnJlIGxhcyBlbWlzaW9uZXMgdG90YWxlcyIsDQogICAgIHN1YnRpdGxlID0gInBhcmEgZWwgYcOxbyAyMDE5IiwNCiAgICAgY2FwdGlvbiA9ICJGdWVudGU6IEV1cm9zdGF0IikNCg0KYGBgDQoNCiMjIFRhYmxhIDENCg0KRW4gZXN0YSB0YWJsYSBpbnRlbnRhbW9zIHBsYXNtYXIgbG9zIDUgcGHDrXNlcyBxdWUgbWF5b3IgaW1wYWN0byBkZSBsYXMgZW1pc2lvbmVzIGFncsOtY29sYXMgdGllbmVuIHNvYnJlIGVsIHRvdGFsOyDDqXN0b3MgaGFuIHNpZG86IEZyYW5jaWEsIFR1cnF1w61hLCBBbGVtYW5pYSwgUmVpbm8gVW5pZG8geSBFc3Bhw7FhLg0KDQpgYGB7ciwgZWNobyA9IEZBTFNFLCBldmFsID0gVFJVRSwgcmVzdWx0cyA9IFRSVUV9DQojRWxlZ2ltb3MgbG9zIDUgcGHDrXNlcyBjb24gbWF5b3IgcG9yY2VudGFqZSBkZSBlbWlzaW9uZXMgYWdyw61jb2xhcyBzb2JyZSBlbCB0b3RhbCBwYXJhIGhhY2VyIGxhIHRhYmxhDQoNCmRmX3RvdGFsZXMgPC0gZGZfZW1pICU+JQ0KICBncm91cF9ieSh5ZWFyKSAlPiUNCiAgc3VtbWFyaXNlKGVtaXNpb25lc190b3RhbGVzID0gc3VtKGVtaXNpb25lc190b3RhbGVzKSkNCg0KZGZfbGVmdF9qb2luIDwtIGxlZnRfam9pbihkZl9hZ3JpLCBkZl90b3RhbGVzLCBieSA9ICJ5ZWFyIikNCg0KZGZfY29tcGFyYWNpb25fMiA8LSBkZl9sZWZ0X2pvaW4gJT4lDQogIGZpbHRlcih5ZWFyICVpbiUgYygxOTkwLDIwMTkpKSAlPiUNCiAgZ3JvdXBfYnkocGFpcykgJT4lDQogIG11dGF0ZShwb3JjZW50X3NvYnJlX3RvdGFsID0gZW1pc2lvbmVzX2FncmkvZW1pc2lvbmVzX3RvdGFsZXMgKiAxMDApICU+JQ0KICBtdXRhdGUodmFyX3BvcmNlbnQgPSBwb3JjZW50X3NvYnJlX3RvdGFsIC0gZmlyc3QocG9yY2VudF9zb2JyZV90b3RhbCkpIA0KDQpkZl9tYXhfY29tcCA8LSBkZl9jb21wYXJhY2lvbl8yICU+JQ0KICBmaWx0ZXIoeWVhciA9PSAyMDE5KSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBzbGljZV9tYXgocG9yY2VudF9zb2JyZV90b3RhbCwgbiA9IDUpICU+JQ0KICByZW5hbWUoIlBhaXNlcyIgPSBwYWlzLCAiQcOxb3MiID0geWVhciwgIkVtaXNpb25lcyBhZ3LDrWNvbGFzIiA9IGVtaXNpb25lc19hZ3JpLCAiRW1pc2lvbmVzIHRvdGFsZXMiID0gZW1pc2lvbmVzX3RvdGFsZXMsICIlIHNvYnJlIGVsIHRvdGFsIiA9IHBvcmNlbnRfc29icmVfdG90YWwsICJWYXJpYWNpw7NuIHBvcmNlbnR1YWwiID0gdmFyX3BvcmNlbnQpDQoNCmd0X21heCA8LSBndChkZl9tYXhfY29tcCkgJT4lIA0KICB0YWJfaGVhZGVyKHRpdGxlID0gbWQoIioqTG9zIDUgcGFpc2VzIGNvbiBtYXlvciBwb3JjZW50YWplIGRlIGVtaXNpb25lcyBhZ3LDrWNvbGFzIHNvYnJlIGVsIHRvdGFsKioiKSwNCiAgICAgICAgICAgICBzdWJ0aXRsZSA9ICJlbnRyZSAxOTkwIHkgMjAxOSIpICU+JQ0KICB0YWJfc291cmNlX25vdGUobWQoIkZ1ZW50ZTogW0VVUk9TVEFUXShodHRwczovL2FwcHNzby5ldXJvc3RhdC5lYy5ldXJvcGEuZXUvbnVpL3Nob3cuZG8/ZGF0YXNldD1lbnZfYWlyX2dnZSZsYW5nPWVuKSIpKSANCg0KZ3RfbWF4DQoNCmBgYA0KDQojIyBUYWJsYSAyDQoNCkRlIGZvcm1hIGFuw6Fsb2dhLCBsb3MgcXVlIG1lbm9zIGhhbiBzaWRvOiBNYWx0YSwgQ2hpcHJlLCBJc2xhbmRpYSwgTHV4ZW1idXJnbyB5IEVzdG9uaWEuIEVzdG8gc2UgZGViZSBhIHF1ZSBlc3RvcyBwYWlzZXMgcGVxdWXDsW9zIGRvbmRlIGxhIHN1cGVyZmljaWUgY3VsdGl2YWJsZSBlcyBlc2Nhc2EgeSBlbCBzZWN0b3IgYWdyw61jb2xhIGVzIG3DrW5pbW8uDQoNCmBgYHtyLCBlY2hvID0gRkFMU0UsIGV2YWwgPSBUUlVFfQ0KZGZfdG90YWxlcyA8LSBkZl9lbWkgJT4lDQogIGdyb3VwX2J5KHllYXIpICU+JQ0KICBzdW1tYXJpc2UoZW1pc2lvbmVzX3RvdGFsZXMgPSBzdW0oZW1pc2lvbmVzX3RvdGFsZXMpKQ0KDQpkZl9sZWZ0X2pvaW4gPC0gbGVmdF9qb2luKGRmX2FncmksIGRmX3RvdGFsZXMsIGJ5ID0gInllYXIiKQ0KDQpkZl9jb21wYXJhY2lvbl8yIDwtIGRmX2xlZnRfam9pbiAlPiUNCiAgZmlsdGVyKHllYXIgJWluJSBjKDE5OTAsMjAxOSkpICU+JQ0KICBncm91cF9ieShwYWlzKSAlPiUNCiAgbXV0YXRlKHBvcmNlbnRfc29icmVfdG90YWwgPSBlbWlzaW9uZXNfYWdyaS9lbWlzaW9uZXNfdG90YWxlcyAqIDEwMCkgJT4lDQogIG11dGF0ZSh2YXJfcG9yY2VudCA9IHBvcmNlbnRfc29icmVfdG90YWwgLSBmaXJzdChwb3JjZW50X3NvYnJlX3RvdGFsKSkgDQoNCmRmX21pbl9jb21wIDwtIGRmX2NvbXBhcmFjaW9uXzIgJT4lDQogIGZpbHRlcih5ZWFyID09IDIwMTkpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHNsaWNlX21pbihwb3JjZW50X3NvYnJlX3RvdGFsLCBuID0gNSkgJT4lDQogIHJlbmFtZSgiUGFpc2VzIiA9IHBhaXMsICJBw7FvcyIgPSB5ZWFyLCAiRW1pc2lvbmVzIGFncsOtY29sYXMiID0gZW1pc2lvbmVzX2FncmksICJFbWlzaW9uZXMgdG90YWxlcyIgPSBlbWlzaW9uZXNfdG90YWxlcywgIiUgc29icmUgZWwgdG90YWwiID0gcG9yY2VudF9zb2JyZV90b3RhbCwgIlZhcmlhY2nDs24gcG9yY2VudHVhbCIgPSB2YXJfcG9yY2VudCkNCg0KZ3RfbWluIDwtIGd0KGRmX21pbl9jb21wKSAlPiUgDQogIHRhYl9oZWFkZXIodGl0bGUgPSBtZCgiKipMb3MgNSBwYWlzZXMgY29uIG1lbm9yIHBvcmNlbnRhamUgZGUgZW1pc2lvbmVzIGFncsOtY29sYXMgc29icmUgZWwgdG90YWwqKiIpLA0KICAgICAgICAgICAgIHN1YnRpdGxlID0gImVudHJlIDE5OTAgeSAyMDE5IikgJT4lDQogIHRhYl9zb3VyY2Vfbm90ZShtZCgiRnVlbnRlOiBbRVVST1NUQVRdKGh0dHBzOi8vYXBwc3NvLmV1cm9zdGF0LmVjLmV1cm9wYS5ldS9udWkvc2hvdy5kbz9kYXRhc2V0PWVudl9haXJfZ2dlJmxhbmc9ZW4pIikpIA0KDQpndF9taW4NCg0KYGBgDQoNCiMgNy4gTGEgaW1wb3J0YW5jaWEgZGVsIGNvbWJ1c3RpYmxlIGVuIGxhIGFncmljdWx0dXJhIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNClVubyBkZSBsb3MgcHJpbmNpcGFsZXMgZ2FzZXMgZGUgZWZlY3RvIGludmVybmFkZXJvIGVzIGVsIGRpw7N4aWRvIGRlIGNhcmJvbm8gKENPMiksIGVudHJlIG90cm9zIGNvbW8gZWwgw7N4aWRvIG5pdHJvc28gKE4yTykgeSBlbCBtZXRhbm8gKENINCkuDQoNCkRlYmlkbyBhIGxhIGFjY2nDs24gZGVsIGhvbWJyZSwgYSBzdXMgc2lzdGVtYXMgZGUgcHJvZHVjY2nDs24geSBkZSBjb25zdW1vIGRlIGVuZXJnw61hIGEgcGFydGlyIGRlIGxhIFJldm9sdWNpw7NuIEluZHVzdHJpYWwsIGxhIGNvbmNlbnRyYWNpw7NuIGRlIGVzb3MgZ2FzZXMgZW4gbGEgYXRtw7NzZmVyYSBlc3TDoSBjcmVjaWVuZG8gZGUgZm9ybWEgY29uc3RhbnRlLiBZLCBhIG3DoXMgY29uY2VudHJhY2nDs24gZGUgQ08yLCBtw6FzIGNhbG9yIHNlIHF1ZWRhIGF0cmFwYWRvIGRlbnRybyBkZSBsYSBhdG3Ds3NmZXJhIHRlcnJlc3RyZS4gRWwgbWF5b3IgaW1wdWxzb3IgZGUgZXNlIGNhbGVudGFtaWVudG8gZ2xvYmFsIGVzIGVsIENPMiB5IGVzdMOhIGxpZ2FkbyBmdW5kYW1lbnRhbG1lbnRlIGEgbGEgcXVlbWEgZGUgY29tYnVzdGlibGVzIGbDs3NpbGVzOiBlbCBjYXJiw7NuLCBlbCBwZXRyw7NsZW8geSBlbCBnYXMuDQoNCkhhY2Ugc29sbyB1bmEgZMOpY2FkYSBxdWUgbGEgcHJvZHVjY2nDs24gZGUgYmlvY29tYnVzdGlibGVzIGEgcGFydGlyIGRlIHBsYW50YXMgc2UgYWNvZ2nDsyBjb21vIHVuYSBhbHRlcm5hdGl2YSBlY29sw7NnaWNhIGEgbG9zIGNvbWJ1c3RpYmxlcyBmw7NzaWxlcy4gUmVjaWVudGVtZW50ZSwgc2UgaGEgb2JzZXJ2YWRvIHF1ZSBlcyB1bmEgc29sdWNpw7NuIHF1ZSBjb21waXRlIGNvbiBsYSBwcm9kdWNjacOzbiBkZSBhbGltZW50b3MgeSBxdWUgbm8gc2llbXByZSByZXN1bHRhIGVmZWN0aXZhIGVuIGxhIHJlZHVjY2nDs24gZGUgZW1pc2lvbmVzIGRlIGdhc2VzIGRlIGVmZWN0byBpbnZlcm5hZGVybyBvIGNvbnRhbWluYW50ZXMgYXRtb3Nmw6lyaWNvcy4NCg0KDQojIyBUYWJsYSAxDQoNCkxvcyA1IHBhw61zZXMgZXVyb3Blb3MgY29uIG1heW9yIGltcGFjdG8gZGVsIGNvbWJ1c3RpYmxlIGVuIGxhIGFncmljdWx0dXJhIGVuIGVsIGHDsW8gMTk5MCBmdWVyb246IEZyYW5jaWEsIEFsZW1hbmlhLCBOZXRoZXJsYW5kcywgUG9sb25pYSBlIEl0w6FsaWEuIEVuIGNhbWJpbywgZW4gZWwgMjAxOSBQb2xvbmlhLCBFc3Bhw7FhLCBGcmFuY2lhLCBUdXJxdcOtYSB5IE5ldGhlcmxhbmRzLiANCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgZXZhbD1UUlVFfQ0KaW1wYWN0X2NvbWIgPC0gZGZfY29tYiAlPiUNCiAgZmlsdGVyKHllYXIgJWluJSBjKDE5OTAsIDIwMTkpKSAlPiUNCiAgZ3JvdXBfYnkoeWVhcikgJT4lIA0KICBzZWxlY3QocGFpcywgeWVhciwgZW1pc2lvbmVzX2NvbWIpICU+JSANCiAgc2xpY2VfbWF4KGVtaXNpb25lc19jb21iLCBuID0gNSkgJT4lDQogIHJlbmFtZSgiUGFpc2VzIiA9IHBhaXMsICJBw7FvcyIgPSB5ZWFyLCAiRW1pc2lvbmVzIGRlIGNvbWJ1c3RpYmxlIiA9IGVtaXNpb25lc19jb21iKQ0KDQpndF9jb21iIDwtIGd0KGltcGFjdF9jb21iKSAlPiUgDQogIHRhYl9oZWFkZXIodGl0bGUgPSBtZCgiKipMb3MgNSBwYWlzZXMgY29uIG1heW9yIGltcGFjdG8gZGVsIGNvbWJ1c3RpYmxlIHNvYnJlIGxhIGFncmljdWx0dXJhKioiKSwNCiAgICAgICAgICAgICBzdWJ0aXRsZSA9ICJlbnRyZSAxOTkwIHkgMjAxOSIpICU+JQ0KICB0YWJfc291cmNlX25vdGUobWQoIkZ1ZW50ZTogW0VVUk9TVEFUXShodHRwczovL2FwcHNzby5ldXJvc3RhdC5lYy5ldXJvcGEuZXUvbnVpL3Nob3cuZG8/ZGF0YXNldD1lbnZfYWlyX2dnZSZsYW5nPWVuKSIpKSANCg0KZ3RfY29tYg0KDQpgYGANCg0KIyMgVGFibGEgMg0KDQpNZWRpYW50ZSBlc3RhIHRhYmxhLCBzZSBwdWVkZSB2aXN1YWxpemFyIGxhcyBlbWlzaW9uZXMgZGVsIGNvbWJ1c3RpYmxlIHF1ZSB0aWVuZW4gZWZlY3RvIHNvYnJlIGxhIHByb2R1Y2Npw7NuIGFncsOtY29sYSBkdXJhbnRlIGxvcyBhw7FvcyBkZSAxOTkwLCAyMDAwLCAyMDEwIHkgMjAxOSwgZXMgZGVjaXIsIGNhZGEgMTAgYcOxb3MgYXByb3hpbWFkYW1lbnRlLiANCg0KSGF5IHBhw61zZXMgY29tbyBBdXRyaWEgcXVlIGhhbiBzdWZyaWRvIHVuYSBkaXNtdW51Y2nDs24gZGVzZGUgZWwgcHJpbWVyIGHDsW8gYWwgw7psdGltbywgcGVybyBvdHJvcyBjb21vIEN5cHJlLCBsYXMgaGFuIGF1bWVudGFkby4gDQoNCmBgYHtyLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2VzID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgZXZhbCA9IFRSVUV9DQoNCnRvdGFsX2NvbWIgPC0gZGZfY29tYiAlPiUgDQogIGZpbHRlcih5ZWFyICVpbiUgYygxOTkwLCAyMDAwLCAyMDEwLCAyMDE5KSkgJT4lIA0KICBncm91cF9ieSh5ZWFyLCBwYWlzKSAlPiUgDQogIHNsaWNlX21heChlbWlzaW9uZXNfY29tYiwgbiA9IDUpIA0KDQpkYXRhX3dpZGUyIDwtIHRvdGFsX2NvbWIgJT4lIA0KICAgICAgICAgICAgICB0aWR5cjo6cGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IHllYXIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSBlbWlzaW9uZXNfY29tYikNCg0Ka25pdHI6OmthYmxlKGRhdGFfd2lkZTIsIA0KICAgICAgICAgICAgIGFsaWduID0gImMiLCANCiAgICAgICAgICAgICBjYXB0aW9uID0gIkVtaXNpb25lcyBkZSBjb21idXN0aWJsZSBxdWUgYWZlY3RhbiBhIGxhIGFncmljdWx0dXJhOiAgICAgMTk5MC0yMDAwLTIwMTAtMjAxOSIsDQogICAgICAgICAgICAgZGlnaXRzID0gMiwgDQogICAgICAgICAgICAgZm9ybWF0LmFyZ3MgPSBsaXN0KGRlY2ltYWwubWFyayA9ICIsIiwgYmlnLm1hcmsgPSAiLiIpKSAlPiUNCiAga2FibGVFeHRyYTo6a2FibGVfc3R5bGluZyhmaXhlZF90aGVhZCA9IGxpc3QoZW5hYmxlZCA9IFQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kID0gImxpZ2h0Z3JlZW4iKSkgJT4lDQogIGNvbHVtbl9zcGVjKDEsIGJhY2tncm91bmQgPSAibGlnaHRncmVlbiIpDQogDQpgYGANCg0KIyMgR3LDoWZpY28NCg0KRW4gZXN0ZSBncsOhZmljbyBjaXJjdWxhciwgbGEgbGV0cmEgQSBsYXMgZW1pc2lvbmVzIHByb2NlZGVudGVzIGRlbCBjb21idXN0aWJsZSAoMTgsNzAlKSB5IGxhIGxldHJhIEIgc29uIGxhcyBlbWlzaW9uZXMgdG90YWxlcyBhZ3LDrWNvbGFzLg0KDQpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIHJlc3VsdHMgPSBUUlVFLGVjaG8gPSBGQUxTRSAsIGV2YWwgPSBUUlVFfQ0KZGF0YV9jb21iIDwtIGRhdGEuZnJhbWUoDQogIGdyb3VwID0gTEVUVEVSU1sxOjJdLA0KICB2YWx1ZSA9IGMoRW1pc2lvbmVzX2NvbWJ1c3RpYmxlID0gOTQ2ODAuNzMsIEVtaXNpb25lc19hZ3LDrWNvbGFzID0gNTA2NTUwLjgpKQ0KDQpkYXRhX2NvbWIgPC0gZGF0YV9jb21iICU+JSANCiAgYXJyYW5nZShkZXNjKGdyb3VwKSkgJT4lDQogIG11dGF0ZShwcm9wID0gdmFsdWUgLyBzdW0oZGF0YV9jb21iJHZhbHVlKSAqIDEwMCkgJT4lDQogIG11dGF0ZSh5cG9zID0gY3Vtc3VtKHByb3ApLSAwLjUqcHJvcCApDQoNCnAxIDwtIGdncGxvdChkYXRhX2NvbWIsIGFlcyh4ID0iIiwgeSA9IHByb3AsIGZpbGwgPSBncm91cCkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHdpZHRoID0gMSwgY29sb3IgPSAiYmxhY2siKSArDQogIGNvb3JkX3BvbGFyKCJ5Iiwgc3RhcnQ9MCkgKw0KICB0aGVtZV92b2lkKCkgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKw0KICBnZW9tX3RleHQoYWVzKHkgPSB5cG9zLCBsYWJlbCA9IGdyb3VwKSwgY29sb3IgPSAiYmxhY2siLCBzaXplPTYpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQ2IikNCg0KcDEgKyBsYWJzKHRpdGxlID0gIkVtaXNpb25lcyBkZWwgY29tYnVzdGlibGUgc29icmUgbGFzIGVtaXNpb25lcyBhZ3LDrWNvbGFzIiwNCiAgICAgc3VidGl0bGUgPSAicGFyYSBlbCBhw7FvIDIwMTkiLA0KICAgICBjYXB0aW9uID0gIkZ1ZW50ZTogRXVyb3N0YXQiICkNCg0KYGBgDQoNCiMjIEPDs2RpZ28NCg0KYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBldmFsID0gRkFMU0UsIGZpZy5hbGlnbiA9ICJjZW50ZXIifQ0KI1RhYmxhIDENCg0KaW1wYWN0X2NvbWIgPC0gZGZfY29tYiAlPiUNCiAgZmlsdGVyKHllYXIgJWluJSBjKDE5OTAsIDIwMTkpKSAlPiUNCiAgZ3JvdXBfYnkoeWVhcikgJT4lIA0KICBzZWxlY3QocGFpcywgeWVhciwgZW1pc2lvbmVzX2NvbWIpICU+JSANCiAgc2xpY2VfbWF4KGVtaXNpb25lc19jb21iLCBuID0gNSkgJT4lDQogIHJlbmFtZSgiUGFpc2VzIiA9IHBhaXMsICJBw7FvcyIgPSB5ZWFyLCAiRW1pc2lvbmVzIGRlIGNvbWJ1c3RpYmxlIiA9IGVtaXNpb25lc19jb21iKQ0KDQpndF9jb21iIDwtIGd0KGltcGFjdF9jb21iKSAlPiUgDQogIHRhYl9oZWFkZXIodGl0bGUgPSBtZCgiKipMb3MgNSBwYWlzZXMgY29uIG1heW9yIGltcGFjdG8gZGVsIGNvbWJ1c3RpYmxlIHNvYnJlIGxhIGFncmljdWx0dXJhKioiKSwNCiAgICAgICAgICAgICBzdWJ0aXRsZSA9ICJlbnRyZSAxOTkwIHkgMjAxOSIpICU+JQ0KICB0YWJfc291cmNlX25vdGUobWQoIkZ1ZW50ZTogW0VVUk9TVEFUXShodHRwczovL2FwcHNzby5ldXJvc3RhdC5lYy5ldXJvcGEuZXUvbnVpL3Nob3cuZG8/ZGF0YXNldD1lbnZfYWlyX2dnZSZsYW5nPWVuKSIpKSANCg0KZ3RfY29tYg0KDQojVGFibGEgMg0KDQp0b3RhbF9jb21iIDwtIGRmX2NvbWIgJT4lIA0KICBmaWx0ZXIoeWVhciAlaW4lIGMoMTk5MCwgMjAwMCwgMjAxMCwgMjAxOSkpICU+JSANCiAgZ3JvdXBfYnkoeWVhciwgcGFpcykgJT4lIA0KICBzbGljZV9tYXgoZW1pc2lvbmVzX2NvbWIsIG4gPSA1KSANCg0KZGF0YV93aWRlMiA8LSB0b3RhbF9jb21iICU+JSANCiAgICAgICAgICAgICAgdGlkeXI6OnBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSB5ZWFyLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc19mcm9tID0gZW1pc2lvbmVzX2NvbWIpDQoNCmtuaXRyOjprYWJsZShkYXRhX3dpZGUyLCANCiAgICAgICAgICAgICBhbGlnbiA9ICJjIiwgDQogICAgICAgICAgICAgY2FwdGlvbiA9ICJFbWlzaW9uZXMgZGUgY29tYnVzdGlibGUgcXVlIGFmZWN0YW4gYSBsYSBhZ3JpY3VsdHVyYTogICAgIDE5OTAtMjAwMC0yMDEwLTIwMTkiLA0KICAgICAgICAgICAgIGRpZ2l0cyA9IDIsIA0KICAgICAgICAgICAgIGZvcm1hdC5hcmdzID0gbGlzdChkZWNpbWFsLm1hcmsgPSAiLCIsIGJpZy5tYXJrID0gIi4iKSkgJT4lDQogIGthYmxlRXh0cmE6OmthYmxlX3N0eWxpbmcoZml4ZWRfdGhlYWQgPSBsaXN0KGVuYWJsZWQgPSBULCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZCA9ICJsaWdodGdyZWVuIikpICU+JQ0KICBjb2x1bW5fc3BlYygxLCBiYWNrZ3JvdW5kID0gImxpZ2h0Z3JlZW4iKQ0KDQojR3LDoWZpY28NCg0KZGF0YV9jb21iIDwtIGRhdGEuZnJhbWUoDQogIGdyb3VwID0gTEVUVEVSU1sxOjJdLA0KICB2YWx1ZSA9IGMoRW1pc2lvbmVzX2NvbWJ1c3RpYmxlID0gOTQ2ODAuNzMsIEVtaXNpb25lc19hZ3LDrWNvbGFzID0gNTA2NTUwLjgpKQ0KDQpkYXRhX2NvbWIgPC0gZGF0YV9jb21iICU+JSANCiAgYXJyYW5nZShkZXNjKGdyb3VwKSkgJT4lDQogIG11dGF0ZShwcm9wID0gdmFsdWUgLyBzdW0oZGF0YV9jb21iJHZhbHVlKSAqIDEwMCkgJT4lDQogIG11dGF0ZSh5cG9zID0gY3Vtc3VtKHByb3ApLSAwLjUqcHJvcCApDQpwMSA8LSBnZ3Bsb3QoZGF0YV9jb21iLCBhZXMoeCA9IiIsIHkgPSBwcm9wLCBmaWxsID0gZ3JvdXApKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCB3aWR0aCA9IDEsIGNvbG9yID0gImJsYWNrIikgKw0KICBjb29yZF9wb2xhcigieSIsIHN0YXJ0PTApICsNCiAgdGhlbWVfdm9pZCgpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsNCiAgZ2VvbV90ZXh0KGFlcyh5ID0geXBvcywgbGFiZWwgPSBncm91cCksIGNvbG9yID0gImJsYWNrIiwgc2l6ZT02KSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0NiIpDQoNCnAxICsgbGFicyh0aXRsZSA9ICJFbWlzaW9uZXMgZGVsIGNvbWJ1c3RpYmxlIHNvYnJlIGxhcyBlbWlzaW9uZXMgYWdyw61jb2xhcyIsDQogICAgIHN1YnRpdGxlID0gInBhcmEgZWwgYcOxbyAyMDE5IiwNCiAgICAgY2FwdGlvbiA9ICJGdWVudGU6IEV1cm9zdGF0IiApDQoNCiANCmBgYA0KDQoNCiMgOC4gQ29uY2x1c2lvbmVzDQoNCk1lZGlhbnRlIGVzdGUgdHJhYmFqbyBoZW1vcyBpbnRlbnRhZG8gaGFjZXIgdW4gZXhoYXVzdGl2byBhbsOhbGlzaXMgZGUgbGFzIGVtaXNpb25lcyBhZ3LDrWNvbGFzLCBoYWNpZW5kbyBoaW5jYXBpw6kgZW4gbGEgdG90YWxpZGFkIGRlIGVtaXNpb25lcyBjbzIgeSB0YW1iacOpbiBsYSBpbXBvcnRhbmNpYSBkZWwgY29tYnVzdGlibGUgZW4gbGEgYWdyaWN1bHR1cmEuDQoNCkhlbW9zIHBvZGlkbyBvYnNlcnZhciBsYSBldm9sdWNpw7NuIGNvbXBsZXRhIGRlIGRpY2hhcyB2YXJpYWJsZXMgeWEgcXVlIGhlbW9zIHJlYWxpemFkbyBhbsOhbGlzaXMgdGFudG8gcG9yIGHDsW9zIGNvbW8gcG9yIHBhw61zZXMgaW50ZW50YW5kbyBzYWNhciBjb25jbHVzaW9uZXMuDQpNdWNoYXMgdmVjZXMsIHJlc2FsdGFtb3MgNSBhw7FvcyBvIDUgcGHDrXNlcyBwYXJhIHBvZGVyIGFzw60gY29tcGFyYXIgZGUgbWFuZXJhIG3DoXMgc2VuY2lsbGEuDQoNClBhcmEgaGFjZXIgZnJlbnRlIGEgbGFzIGVtaXNpb25lcyBhZ3LDrWNvbGFzIHBlbnNhbW9zIHF1ZSBlcyBpbXBvcnRhbnRlIGFwb3N0YXIgcG9yIGxhIGlubm92YWNpw7NuIGRlbCBzZWN0b3IgYWdyw61jb2xhLCB5YSBxdWUgaGEgc2lkbyB1biBzZWN0b3IgaGlzdMOzcmljYW1lbnRlIGF0cmFzYWRvLg0KUG9yIGxvIHF1ZSwgZXMgbmVjZXNhcmlvIHF1ZSBkaWNobyBzZWN0b3Igc2UgYWRhcHRlIGEgbGFzIG51ZXZhcyB0w6ljbmljYXMgZGUgY3VsdGl2byBleGlzdGVudGVzIHkgc3UgYXB1ZXN0YSBwb3IgbGFzIGVuZXJnw61hcyByZW5vdmFibGVzLg0KDQojIDkuIEJpYmxpb2dyYWbDrWENCg0KW0V1cm9zdGF0ICgyMDIxKTogR3JlZW5ob3VzZSBnYXMgZW1pc3Npb25zIGJ5IHNvdXJjZSBzZWN0b3IgKHNvdXJjZTogRUVBKV0oaHR0cHM6Ly9hcHBzc28uZXVyb3N0YXQuZWMuZXVyb3BhLmV1L251aS9zaG93LmRvP2RhdGFzZXQ9ZW52X2Fpcl9nZ2UmbGFuZz1lbikNCg0KW1R1dG9yaWFsZXMgZGUgbGEgYXNpZ25hdHVyYV0oaHR0cHM6Ly9wZXJlenA0NC5naXRodWIuaW8vaW50cm8tZHMtMjEtMjItd2ViLzA0LXR1dG9yaWFsZXMuaHRtbCkNCg0KUGFyYSBsbGV2YXIgYSBjYWJvIGVsIHRyYWJham8sIG5vcyBoYSBzZXJ2aWRvIGRlIGdyYW4gYXl1ZGEgbG9zIHRyYWJham9zIGRlbCBhw7FvIGFudGVyaW9yIGNvbGdhZG9zIGVuIGxhIHDDoWdpbmEgd2ViIGRlbCBjdXJzbywgc29icmUgdG9kbywgZWwgZGUgIkFuw6FsaXNpcyBkZWwgaW1wYWN0byBlY29sw7NnaWNvIiBkZWJpZG8gYSBsYSBzaW1pbGl0dWQgZGVsIHRlbWEgZWxlZ2lkby4gU2UgcHVlZGUgdmVyIFthcXXDrV0oaHR0cHM6Ly9yb2RyaTQ1bC5naXRodWIuaW8vdHJhYmFqb19CaWdEYXRhX2VxdWlwby8pDQoNCjxicj48YnI+DQoNCkJvbiBuYWRhbCwgTUlBVSEhDQoNCmBgYHtyLCBlY2hvID0gRkFMU0UsIGV2YWwgPSBUUlVFfQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1hZ2VuZXMiLCAiZ2F0by1mZWxpei1uYXZpZGFkLmdpZiIpICkNCmBgYA0KDQo8aHIgY2xhc3M9ImxpbmVhLXJlZCI+DQo8aHIgY2xhc3M9ImxpbmVhLXJlZCI+DQoNCmBgYHtyLCBlY2hvID0gRkFMU0V9DQpzZXNzaW9uaW5mbzo6c2Vzc2lvbl9pbmZvKCkgJT4lIGRldGFpbHM6OmRldGFpbHMoc3VtbWFyeSA9ICdJbmZvcm1hY2nDs24gZGUgbWkgUi1zZXNpw7NuOicpIA0KYGBgDQoNCjxicj48YnI+DQoNCjxkaXYgY2xhc3M9InRvY2lmeS1leHRlbmQtcGFnZSIgZGF0YS11bmlxdWU9InRvY2lmeS1leHRlbmQtcGFnZSIgc3R5bGU9ImhlaWdodDogMDsiPjwvZGl2Pg0K