1. Introducción
Por medio de este cuaderno se ilustra como se obtienen estadisticas
multianuales para un grupo determinado de cultivos del departamento
seleccionado (Boyacá). La fuente principal de los datos son las
Evaluaciones Agropecuarias Municipales (EVA), un conjunto de datos
agrícolas de 2007-2018 proporcionado por el Ministerio de Agricultura y
Desarrollo Rural.
2. Setup
Como primer paso, vamos a instalar y cargar las librerias necesarias
de R para que se puedan desarrollar todas las funciones requeridas.
En la seccion “consola” se instalan los siguientes paquetes:
#install.packages('dplyr')
#install.packages('readxl')
#install.packages('sf')
Con los paquetes instalados, se procede a cargar las librerias:
library(tidyverse)
library(dplyr)
library(readr)
library(ggplot2)
3. Para el Departamento seleccionado se desacarga el conjunto de
datos EVA que tenga un registro de varios años
Nos dirigimos a la página:
https://www.datos.gov.co/Agricultura-y-Desarrollo-Rural/Evaluaciones-Agropecuarias-Municipales-EVA/2pnw-mmge/data
Allí encontraremos el conjunto de Datos necesario.
La pagina tiene un sitio Web vinculado que se conoce como: (i.e
datos.gov.co). Allí podemos visualizar los datos y tambnien aplicar el
filtro necesario para solo obtenerv los datos de nuedstro interes
correspondientes al departamento de Boyacá.
Cuando se tengan los datos de interes se exportan en formato
.csv.
El Archivo aparecera en descargar como
Evaluaciones_Agropecuarias_Municipales_EVA.csv. Y sera necesario moverlo
directorio de trabajo.
3.1 Lectura del conjunto de Datos EVA
list.files()
[1] "Cuaderno2.knit.md"
[2] "Cuaderno2.nb.html"
[3] "Cuaderno2.Rmd"
[4] "Eva_Boyaca.csv"
[5] "pandoca6c3d16567e.nb.html"
Ahora, procedamos a leer el conjunto de datos EVA 2007-2018:
# adjust the filepath acording to your data
(eva = read_csv("EVA_Boyaca.csv", col_names = TRUE,
show_col_types = FALSE))
Vea la tabla y confirme que contenga estadísticas agrícolas para
diferentes años. ¿Puedes decir cuál es el período de tiempo para estos
datos?
Es muy importante saber cuáles son los nombres que “ve” el software.
Puede ser diferente de lo que vemos. Averigüemoslo:
names(eva)
[1] "CÓD. \nDEP."
[2] "DEPARTAMENTO"
[3] "CÓD. MUN."
[4] "MUNICIPIO"
[5] "GRUPO \nDE CULTIVO"
[6] "SUBGRUPO \nDE CULTIVO"
[7] "CULTIVO"
[8] "DESAGREGACIÓN REGIONAL Y/O SISTEMA PRODUCTIVO"
[9] "AÑO"
[10] "PERIODO"
[11] "Área Sembrada\n(ha)"
[12] "Área Cosechada\n(ha)"
[13] "Producción\n(t)"
[14] "Rendimiento\n(t/ha)"
[15] "ESTADO FISICO PRODUCCION"
[16] "NOMBRE \nCIENTIFICO"
[17] "CICLO DE CULTIVO"
4.Limpieza del conjunto de Datos EVA.
Se seleccionan algunos de los atributos para la limpieza del conjunto
de Datos EVA.
# comprobar la salida del objeto en el último fragmento
# cambiar los nombres de los atributos según sus propios datos
eva %>% dplyr::select('CÓD. MUN.':'ESTADO FISICO PRODUCCION') -> eva.tmp
eva.tmp
Se verifica el resultado y tambien que solo se seleccionaron las
columnas relevantes.
Ahora, se cambian los nombres de varias columnas que contengan
caracteres vacíos o caracteres “noisy”:
# asegúrese de utilizar los nombres de las columnas que están en su objeto eva.tmp
eva.tmp %>% dplyr::rename('Cod_Mun' = 'CÓD. MUN.',
'Grupo' = 'GRUPO \nDE CULTIVO',
'Subgrupo' = 'SUBGRUPO \nDE CULTIVO',
'Year' = 'AÑO',
'AreaSembrada' = 'Área Sembrada\n(ha)',
'AreaCosechada' = 'Área Sembrada\n(ha)',
'Produccion' = 'Producción\n(t)', 'Rendimiento' = 'Rendimiento\n(t/ha)',
'Sistema' = 'DESAGREGACIÓN REGIONAL Y/O SISTEMA PRODUCTIVO',
'Estado' = 'ESTADO FISICO PRODUCCION') -> new_eva
Ahora se comprueba el resultado:
new_eva
Se revisa y verifica que en la anterior tabla los atributos
cuantitativos se almacenen como tipos de datos numéricos (no como tipos
de datos de cadena).
5. Análisis de los datos
Muchas tareas de análisis de datos se pueden abordar utilizando el
paradigma dividir-aplicar-combinar. Que basicamente consiste en: dividir
los datos en grupos, aplicar algún análisis a cada grupo y luego
combinar los resultados.
La biblioteca dplyr hace que esto sea muy fácil por medio de el uso
de la función group_by(), que divide los datos en grupos. Cuando los
datos se agrupan de esta manera, se puede utilizar resume() para
colapsar cada grupo en un resumen de una sola fila. resume() hace esto
posible por medio de una función de agregación o resumen a cada
grupo.
5.1 Los cultivos más importantes entre 2007 y 2018.
Por ejemplo, si se quiere saber la producción total por grupo de
cultivos, tecleamos:
new_eva %>%
##filtro(Produccion > 0) %>%
group_by(Grupo) %>%
summarize(total_produccion = sum(Produccion)) %>%
arrange(desc(total_produccion))
la producción total esta compuesta de la suma de la producción de
cada grupo de cultivos entre 2007 y 2018. En Boyacá, los dos cultivos de
mayor producción fueron “Tubérculos y Plátanos” y “Hortalizas”.
Para guardar la producción total como un objeto, se procede a:
new_eva %>%
group_by(Grupo) %>%
summarize(total_produccion = sum(Produccion)) -> PT
Para filtarar los cultivos mas importantes:
PT %>%
filter(total_produccion > 1000000) -> main.groups
Para conocer la producción total de los principales grupos de
cultivos:
(value = sum(main.groups$total_produccion))
[1] 19212405
Para agregar un nuevo atributo con porcentaje de la producción
total:
main.groups$percent = main.groups$total_produccion/value
Para crear un gráfico circular de la producción total de los grupos
principales:
library(ggplot2)
# Barplot
bp<- ggplot(main.groups, aes(x="", y=percent, fill=Grupo))+
geom_bar(width = 1, stat = "identity")
# Piechart
pie <- bp + coord_polar("y", start=0)
pie

5.2 Municipios con mayor producción para cada grupo de
cultivos:
Para conocer los municipios que lideraron la producción de cada
cultivo de 2007 a 2018 en el departamento de Boyacá:
new_eva %>%
group_by(Grupo, MUNICIPIO) %>%
summarize(total_prod = sum(Produccion, na.rm = TRUE)) %>%
slice(which.max(total_prod)) %>%
arrange(desc(total_prod))
`summarise()` has grouped output by 'Grupo'. You can override using the `.groups` argument.
Para guardar dicho objeto:
new_eva %>%
group_by(Grupo, MUNICIPIO) %>%
summarize(total_prod = sum(Produccion, na.rm = TRUE)) %>%
slice(which.max(total_prod)) -> leaders
`summarise()` has grouped output by 'Grupo'. You can override using the `.groups` argument.
leaders
Para filtrar los municipios más importantes desde el punto de vista
agrícola:
leaders %>%
filter(total_prod > 50000) -> main.leaders
Ahora graficamos los “leaders” filtrados:
# Basic barplot
p<-ggplot(data=main.leaders, aes(x=MUNICIPIO, y=total_prod)) +
geom_bar(stat="identity")
p

5.3 Dinámica del cultivo de tomate entre 2009 y 2015, en el
departamento de Boyacá.
Aunque en municipio de mayor producción en el departamento de Boyaca
es Aquitania, el cultivo de interes escogido que es “Tomate” no se
produce alli debido a condiciones como la altura y el clima. Por ello,
para el analisis del cultivo de tomate en el departamento de Boyaca se
toma como municipio de mayor produccion el municipio de Sutamarchan.
Donde el tomate es parte de la identidad de un símbolo del municipio
debido a su extensa produccion. En sutamarchan el la buena calidad en el
acceso a recursos a recursos agricolas, las condiciones climaticas
favorable teniendo en cuenta que la temperatura que puede variar de los
9°C a los 22°C y una altura de 1800 msnm. Estas características han dado
paso para que diferentes variedades de tomate se puedan pruducir, que el
tomate encuentre un lugar de gran demanda en el mercado gracias a su
poca distancia con el centro del pais y que el tomate se vuelva parte de
las tradiciones agricolas de cada uno de los productores de las
diferentes zonas de Sutamarchan.
new_eva %>%
filter(MUNICIPIO=="SUTAMARCHAN" & CULTIVO=="TOMATE") %>%
group_by(Year, CULTIVO) %>%
select(MUNICIPIO, CULTIVO, Produccion, Year) -> sutamarchan_tomatoe
Ahora se comprueba el resultado:
sutamarchan_tomatoe
Con la información obtenida. Se hace un grafico de la la producción
de tomate en Sutamarchan durante los años 2009 y 2015 para ilustrar
mejor los datos:
g <- ggplot(aes(x=Year, y=Produccion/1000), data = sutamarchan_tomatoe) + geom_bar(stat='identity') + labs(y='Produccion de Tomate [Ton x 1000]')
Por ultimo se le añade un titulo y se visualiza:
g + ggtitle("Evolucion del cultivo de Tomate en Sutamarchan desde el año 2009 hasta el 2015") + labs(caption= "Basado en datos de EVA (Minagricultura, 2020)")

6.Otros analisis
6.1. Analisis del rendimiento
Teniendo en cuenta que Sutamarchan Boyaca es un municipio que
principalmente tiene su vocacion agricola relacionada con el tomate,
saber el rendimiento de los cultivos de tomate que se desarrollan es
importante para llegar a tomar y establecer desiciones relacionadas con:
Las variedades sembradas, los tiempos de siembra y el calendario
climatico. Para contratastar el rendimiento del tomate sembrado en
sutamarchan boyaca es necesario que:
new_eva %>%
filter(MUNICIPIO=="SUTAMARCHAN" & CULTIVO=="TOMATE") %>%
group_by(Year, CULTIVO) %>%
select(MUNICIPIO, CULTIVO, Rendimiento, Year) -> sutamarchan_tomatoeR
Que teiene como Resultado:
sutamarchan_tomatoeR
Con la información obtenida. Se hace un grafico del rendimiento de
tomate en el periodo que comprende desde 2009 hasta el año 2015 para
ilustrar mejor los datos:
r <- ggplot(aes(x=Year, y=Rendimiento/1000), data = sutamarchan_tomatoeR) + geom_bar(stat='identity') + labs(y='Rendimiento de Tomate [Ton x ha]')
Por ultimo se le añade un titulo y se visualiza:
r + ggtitle("Cambios en el rendimiento del cultivo de tomate del año 2009 hasta el año 2015") + labs(caption= "Basado en datos de EVA (Minagricultura, 2020)")

6.2 Analisis del area Cosechada
Tener en cuenta el area cosechada del cultivo de tomate en
Sutamarchan, es un factor importante que permite establecer el Municipio
de Sutamarchan como el mayor productor de Tomate en el departamento de
Boyacá. Y es que al conocer a Sutamarchan como un municipio con una
vocacion agricola tomatera. Tambien influyen en factores como la
planificacion del cultivo, la relacion con la estimacion de producción y
la estimacion de rendimiento, el monitoreo y control de plagas y
enfermedades. Para contratastar el area sembrada en sutamarchan boyaca
es necesario que:
new_eva %>%
filter(MUNICIPIO=="SUTAMARCHAN" & CULTIVO=="TOMATE") %>%
group_by(Year, CULTIVO) %>%
select(MUNICIPIO, CULTIVO, AreaCosechada, Year) -> sutamarchan_tomatoeAc
Que tiene como Resultado:
sutamarchan_tomatoeAc
Con la información obtenida. Se hace un grafico con relacion al area
en la cual se obtuvo cosecha de tomate en el periodo comprendido entre
el año 2009 y 2015:
Ac <- ggplot(aes(x=Year, y=AreaCosechada), data = sutamarchan_tomatoeAs) + geom_bar(stat='identity') + labs(y='Area cosechada [ha]')
Por ultimo se le añade un titulo y se visualiza:
Ac + ggtitle ("Cambios en el area cosechada de tomate del año 2009 hasta el año 2015") + labs(caption= "Basado en datos de EVA (Minagricultura, 2020)")

7. Bibliografia
(1). Lizarazo, I., 2022. Understanding dynamic productivity of crops.
Available at https://rpubs.com/ials2un/production_dyn_v1.
(2).
sessionInfo()
R version 4.3.1 (2023-06-16 ucrt)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 11 x64 (build 22621)
Matrix products: default
locale:
[1] LC_COLLATE=Spanish_Colombia.utf8
[2] LC_CTYPE=Spanish_Colombia.utf8
[3] LC_MONETARY=Spanish_Colombia.utf8
[4] LC_NUMERIC=C
[5] LC_TIME=Spanish_Colombia.utf8
time zone: America/Bogota
tzcode source: internal
attached base packages:
[1] stats graphics grDevices utils
[5] datasets methods base
other attached packages:
[1] lubridate_1.9.2 forcats_1.0.0
[3] stringr_1.5.0 dplyr_1.1.3
[5] purrr_1.0.2 readr_2.1.4
[7] tidyr_1.3.0 tibble_3.2.1
[9] ggplot2_3.4.3 tidyverse_2.0.0
loaded via a namespace (and not attached):
[1] sass_0.4.7 utf8_1.2.3
[3] generics_0.1.3 stringi_1.7.12
[5] hms_1.1.3 digest_0.6.33
[7] magrittr_2.0.3 evaluate_0.21
[9] grid_4.3.1 timechange_0.2.0
[11] fastmap_1.1.1 jsonlite_1.8.7
[13] fansi_1.0.4 scales_1.2.1
[15] jquerylib_0.1.4 cli_3.6.1
[17] rlang_1.1.1 crayon_1.5.2
[19] bit64_4.0.5 munsell_0.5.0
[21] cachem_1.0.8 withr_2.5.0
[23] yaml_2.3.7 tools_4.3.1
[25] parallel_4.3.1 tzdb_0.4.0
[27] colorspace_2.1-0 vctrs_0.6.3
[29] R6_2.5.1 lifecycle_1.0.3
[31] bit_4.0.5 vroom_1.6.3
[33] pkgconfig_2.0.3 pillar_1.9.0
[35] bslib_0.5.1 gtable_0.3.3
[37] rsconnect_1.1.0 glue_1.6.2
[39] xfun_0.40 tidyselect_1.2.0
[41] rstudioapi_0.15.0 knitr_1.43
[43] farver_2.1.1 htmltools_0.5.6
[45] rmarkdown_2.24 labeling_0.4.2
[47] compiler_4.3.1
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQphdXRob3I6IEdhYnJpZWwgQW5kcmVzIEd1dGllcnJleiBHb21leg0KZGF0ZTogMTQvMDkvMjMNCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQojIyAxLiBJbnRyb2R1Y2Npw7NuDQoNClBvciBtZWRpbyBkZSBlc3RlIGN1YWRlcm5vIHNlIGlsdXN0cmEgY29tbyBzZSBvYnRpZW5lbiBlc3RhZGlzdGljYXMgbXVsdGlhbnVhbGVzIHBhcmEgdW4gZ3J1cG8gZGV0ZXJtaW5hZG8gZGUgY3VsdGl2b3MgZGVsIGRlcGFydGFtZW50byBzZWxlY2Npb25hZG8gKEJveWFjw6EpLiBMYSBmdWVudGUgcHJpbmNpcGFsIGRlIGxvcyBkYXRvcyBzb24gbGFzIEV2YWx1YWNpb25lcyBBZ3JvcGVjdWFyaWFzIE11bmljaXBhbGVzIChFVkEpLCB1biBjb25qdW50byBkZSBkYXRvcyBhZ3LDrWNvbGFzIGRlIDIwMDctMjAxOCBwcm9wb3JjaW9uYWRvIHBvciBlbCBNaW5pc3RlcmlvIGRlIEFncmljdWx0dXJhIHkgRGVzYXJyb2xsbyBSdXJhbC4NCg0KIyMgMi4gU2V0dXANCg0KQ29tbyBwcmltZXIgcGFzbywgdmFtb3MgYSBpbnN0YWxhciB5IGNhcmdhciBsYXMgbGlicmVyaWFzIG5lY2VzYXJpYXMgZGUgUiBwYXJhIHF1ZSBzZSBwdWVkYW4gZGVzYXJyb2xsYXIgdG9kYXMgbGFzIGZ1bmNpb25lcyByZXF1ZXJpZGFzLg0KDQpFbiBsYSBzZWNjaW9uICJjb25zb2xhIiBzZSBpbnN0YWxhbiBsb3Mgc2lndWllbnRlcyBwYXF1ZXRlczoNCg0KYGBge3J9DQoNCiNpbnN0YWxsLnBhY2thZ2VzKCdkcGx5cicpDQojaW5zdGFsbC5wYWNrYWdlcygncmVhZHhsJykNCiNpbnN0YWxsLnBhY2thZ2VzKCdzZicpDQoNCmBgYA0KDQpDb24gbG9zIHBhcXVldGVzIGluc3RhbGFkb3MsIHNlIHByb2NlZGUgYSBjYXJnYXIgbGFzIGxpYnJlcmlhczogDQoNCmBgYHtyfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkoZ2dwbG90MikNCmBgYA0KDQojIyAzLiBQYXJhIGVsIERlcGFydGFtZW50byBzZWxlY2Npb25hZG8gc2UgZGVzYWNhcmdhIGVsIGNvbmp1bnRvIGRlIGRhdG9zIEVWQSBxdWUgdGVuZ2EgdW4gcmVnaXN0cm8gZGUgdmFyaW9zIGHDsW9zDQoNCk5vcyBkaXJpZ2ltb3MgYSBsYSBww6FnaW5hOg0KDQpodHRwczovL3d3dy5kYXRvcy5nb3YuY28vQWdyaWN1bHR1cmEteS1EZXNhcnJvbGxvLVJ1cmFsL0V2YWx1YWNpb25lcy1BZ3JvcGVjdWFyaWFzLU11bmljaXBhbGVzLUVWQS8ycG53LW1tZ2UvZGF0YSAgDQpBbGzDrSBlbmNvbnRyYXJlbW9zIGVsIGNvbmp1bnRvIGRlIERhdG9zIG5lY2VzYXJpby4NCg0KTGEgcGFnaW5hIHRpZW5lIHVuIHNpdGlvIFdlYiB2aW5jdWxhZG8gcXVlIHNlIGNvbm9jZSBjb21vOiAoaS5lIGRhdG9zLmdvdi5jbykuIEFsbMOtIHBvZGVtb3MgdmlzdWFsaXphciBsb3MgZGF0b3MgeSB0YW1ibmllbiBhcGxpY2FyIGVsIGZpbHRybyBuZWNlc2FyaW8gcGFyYSBzb2xvIG9idGVuZXJ2IGxvcyBkYXRvcyBkZSBudWVkc3RybyBpbnRlcmVzIGNvcnJlc3BvbmRpZW50ZXMgYWwgZGVwYXJ0YW1lbnRvIGRlIEJveWFjw6EuDQoNCkN1YW5kbyBzZSB0ZW5nYW4gbG9zIGRhdG9zIGRlIGludGVyZXMgc2UgZXhwb3J0YW4gZW4gZm9ybWF0byAuY3N2Lg0KDQpFbCBBcmNoaXZvIGFwYXJlY2VyYSBlbiBkZXNjYXJnYXIgY29tbyBFdmFsdWFjaW9uZXNfQWdyb3BlY3Vhcmlhc19NdW5pY2lwYWxlc19FVkEuY3N2LiBZIHNlcmEgbmVjZXNhcmlvIG1vdmVybG8gZGlyZWN0b3JpbyBkZSB0cmFiYWpvLg0KDQojIyAzLjEgTGVjdHVyYSBkZWwgY29uanVudG8gZGUgRGF0b3MgRVZBDQoNCmBgYHtyfQ0KbGlzdC5maWxlcygpDQpgYGANCkFob3JhLCBwcm9jZWRhbW9zIGEgbGVlciBlbCBjb25qdW50byBkZSBkYXRvcyBFVkEgMjAwNy0yMDE4Og0KDQpgYGB7cn0NCiMgYWRqdXN0IHRoZSBmaWxlcGF0aCBhY29yZGluZyB0byB5b3VyIGRhdGENCihldmEgPSByZWFkX2NzdigiRVZBX0JveWFjYS5jc3YiLCBjb2xfbmFtZXMgPSBUUlVFLA0KICAgICAgICAgICAgICAgIHNob3dfY29sX3R5cGVzID0gRkFMU0UpKQ0KYGBgDQoNClZlYSBsYSB0YWJsYSB5IGNvbmZpcm1lIHF1ZSBjb250ZW5nYSBlc3RhZMOtc3RpY2FzIGFncsOtY29sYXMgcGFyYSBkaWZlcmVudGVzIGHDsW9zLiDCv1B1ZWRlcyBkZWNpciBjdcOhbCBlcyBlbCBwZXLDrW9kbyBkZSB0aWVtcG8gcGFyYSBlc3RvcyBkYXRvcz8NCg0KRXMgbXV5IGltcG9ydGFudGUgc2FiZXIgY3XDoWxlcyBzb24gbG9zIG5vbWJyZXMgcXVlIOKAnHZl4oCdIGVsIHNvZnR3YXJlLiBQdWVkZSBzZXIgZGlmZXJlbnRlIGRlIGxvIHF1ZSB2ZW1vcy4gQXZlcmlnw7xlbW9zbG86DQoNCmBgYHtyfQ0KbmFtZXMoZXZhKQ0KYGBgDQojIyA0LkxpbXBpZXphIGRlbCBjb25qdW50byBkZSBEYXRvcyBFVkEuDQpTZSBzZWxlY2Npb25hbiBhbGd1bm9zIGRlIGxvcyBhdHJpYnV0b3MgcGFyYSBsYSBsaW1waWV6YSBkZWwgY29uanVudG8gZGUgRGF0b3MgRVZBLg0KDQpgYGB7cn0NCiMgY29tcHJvYmFyIGxhIHNhbGlkYSBkZWwgb2JqZXRvIGVuIGVsIMO6bHRpbW8gZnJhZ21lbnRvIA0KIyBjYW1iaWFyIGxvcyBub21icmVzIGRlIGxvcyBhdHJpYnV0b3Mgc2Vnw7puIHN1cyBwcm9waW9zIGRhdG9zDQpldmEgJT4lIGRwbHlyOjpzZWxlY3QoJ0PDk0QuIE1VTi4nOidFU1RBRE8gRklTSUNPIFBST0RVQ0NJT04nKSAtPiBldmEudG1wDQpgYGANCg0KYGBge3J9DQpldmEudG1wDQpgYGANCg0KU2UgdmVyaWZpY2EgZWwgcmVzdWx0YWRvIHkgdGFtYmllbiBxdWUgc29sbyBzZSBzZWxlY2Npb25hcm9uIGxhcyBjb2x1bW5hcyByZWxldmFudGVzLg0KDQpBaG9yYSwgc2UgY2FtYmlhbiBsb3Mgbm9tYnJlcyBkZSB2YXJpYXMgY29sdW1uYXMgcXVlIGNvbnRlbmdhbiBjYXJhY3RlcmVzIHZhY8Otb3MgbyBjYXJhY3RlcmVzICJub2lzeSI6DQoNCmBgYHtyfQ0KIyBhc2Vnw7pyZXNlIGRlIHV0aWxpemFyIGxvcyBub21icmVzIGRlIGxhcyBjb2x1bW5hcyBxdWUgZXN0w6FuIGVuIHN1IG9iamV0byBldmEudG1wDQpldmEudG1wICU+JSAgZHBseXI6OnJlbmFtZSgnQ29kX011bicgPSAnQ8OTRC4gTVVOLicsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICdHcnVwbycgPSAnR1JVUE8gXG5ERSBDVUxUSVZPJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAnU3ViZ3J1cG8nID0gJ1NVQkdSVVBPIFxuREUgQ1VMVElWTycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICdZZWFyJyA9ICdBw5FPJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAnQXJlYVNlbWJyYWRhJyA9ICfDgXJlYSBTZW1icmFkYVxuKGhhKScsDQogICAgICAgICAgICAgICAgICAgICAgICAgJ0FyZWFDb3NlY2hhZGEnID0gJ8OBcmVhIFNlbWJyYWRhXG4oaGEpJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAnUHJvZHVjY2lvbicgPSAnUHJvZHVjY2nDs25cbih0KScsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUmVuZGltaWVudG8nID0gICdSZW5kaW1pZW50b1xuKHQvaGEpJywgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAnU2lzdGVtYScgPSAnREVTQUdSRUdBQ0nDk04gUkVHSU9OQUwgWS9PIFNJU1RFTUEgUFJPRFVDVElWTycsDQogICAgICAgICAgICAgICAgICAgICAgICAgJ0VzdGFkbycgPSAnRVNUQURPIEZJU0lDTyBQUk9EVUNDSU9OJykgLT4gbmV3X2V2YQ0KDQpgYGANCg0KQWhvcmEgc2UgY29tcHJ1ZWJhIGVsIHJlc3VsdGFkbzoNCg0KYGBge3J9DQpuZXdfZXZhDQpgYGANCg0KU2UgcmV2aXNhIHkgdmVyaWZpY2EgcXVlIGVuIGxhIGFudGVyaW9yIHRhYmxhIGxvcyBhdHJpYnV0b3MgY3VhbnRpdGF0aXZvcyBzZSBhbG1hY2VuZW4gY29tbyB0aXBvcyBkZSBkYXRvcyBudW3DqXJpY29zIChubyBjb21vIHRpcG9zIGRlIGRhdG9zIGRlIGNhZGVuYSkuDQoNCiMjIDUuIEFuw6FsaXNpcyBkZSBsb3MgZGF0b3MNCk11Y2hhcyB0YXJlYXMgZGUgYW7DoWxpc2lzIGRlIGRhdG9zIHNlIHB1ZWRlbiBhYm9yZGFyIHV0aWxpemFuZG8gZWwgcGFyYWRpZ21hIGRpdmlkaXItYXBsaWNhci1jb21iaW5hci4NClF1ZSBiYXNpY2FtZW50ZSBjb25zaXN0ZSBlbjogZGl2aWRpciBsb3MgZGF0b3MgZW4gZ3J1cG9zLCBhcGxpY2FyIGFsZ8O6biBhbsOhbGlzaXMgYSBjYWRhIGdydXBvIHkgbHVlZ28gY29tYmluYXIgbG9zIHJlc3VsdGFkb3MuDQoNCkxhIGJpYmxpb3RlY2EgZHBseXIgaGFjZSBxdWUgZXN0byBzZWEgbXV5IGbDoWNpbCBwb3IgbWVkaW8gZGUgZWwgdXNvIGRlIGxhIGZ1bmNpw7NuIGdyb3VwX2J5KCksIHF1ZSBkaXZpZGUgbG9zIGRhdG9zIGVuIGdydXBvcy4gQ3VhbmRvIGxvcyBkYXRvcyBzZSBhZ3J1cGFuIGRlIGVzdGEgbWFuZXJhLCBzZSBwdWVkZSB1dGlsaXphciByZXN1bWUoKSBwYXJhIGNvbGFwc2FyIGNhZGEgZ3J1cG8gZW4gdW4gcmVzdW1lbiBkZSB1bmEgc29sYSBmaWxhLiByZXN1bWUoKSBoYWNlIGVzdG8gcG9zaWJsZSBwb3IgbWVkaW8gZGUgdW5hIGZ1bmNpw7NuIGRlIGFncmVnYWNpw7NuIG8gcmVzdW1lbiBhIGNhZGEgZ3J1cG8uDQoNCiMjIDUuMSBMb3MgY3VsdGl2b3MgbcOhcyBpbXBvcnRhbnRlcyBlbnRyZSAyMDA3IHkgMjAxOC4NClBvciBlamVtcGxvLCBzaSBzZSBxdWllcmUgc2FiZXIgbGEgcHJvZHVjY2nDs24gdG90YWwgcG9yIGdydXBvIGRlIGN1bHRpdm9zLCB0ZWNsZWFtb3M6DQpgYGB7cn0NCm5ld19ldmEgJT4lDQogICMjZmlsdHJvKFByb2R1Y2Npb24gPiAwKSAlPiUNCiAgZ3JvdXBfYnkoR3J1cG8pICU+JQ0KICBzdW1tYXJpemUodG90YWxfcHJvZHVjY2lvbiA9IHN1bShQcm9kdWNjaW9uKSkgJT4lIA0KICBhcnJhbmdlKGRlc2ModG90YWxfcHJvZHVjY2lvbikpIA0KYGBgDQpsYSBwcm9kdWNjacOzbiB0b3RhbCBlc3RhIGNvbXB1ZXN0YSBkZSBsYSBzdW1hIGRlIGxhIHByb2R1Y2Npw7NuIGRlIGNhZGEgZ3J1cG8gZGUgY3VsdGl2b3MgZW50cmUgMjAwNyB5IDIwMTguIEVuIEJveWFjw6EsIGxvcyBkb3MgY3VsdGl2b3MgZGUgbWF5b3IgcHJvZHVjY2nDs24gZnVlcm9uIOKAnFR1YsOpcmN1bG9zIHkgUGzDoXRhbm9z4oCdIHkgIkhvcnRhbGl6YXMiLg0KDQpQYXJhIGd1YXJkYXIgbGEgcHJvZHVjY2nDs24gdG90YWwgY29tbyB1biBvYmpldG8sIHNlIHByb2NlZGUgYToNCg0KYGBge3J9DQpuZXdfZXZhICU+JQ0KICBncm91cF9ieShHcnVwbykgJT4lDQogIHN1bW1hcml6ZSh0b3RhbF9wcm9kdWNjaW9uID0gc3VtKFByb2R1Y2Npb24pKSAtPiBQVCANCmBgYA0KDQpQYXJhIGZpbHRhcmFyIGxvcyBjdWx0aXZvcyBtYXMgaW1wb3J0YW50ZXM6DQoNCmBgYHtyfQ0KUFQgJT4lIA0KICBmaWx0ZXIodG90YWxfcHJvZHVjY2lvbiA+IDEwMDAwMDApIC0+IG1haW4uZ3JvdXBzDQpgYGANCg0KUGFyYSBjb25vY2VyIGxhIHByb2R1Y2Npw7NuIHRvdGFsIGRlIGxvcyBwcmluY2lwYWxlcyBncnVwb3MgZGUgY3VsdGl2b3M6DQoNCmBgYHtyfQ0KKHZhbHVlID0gc3VtKG1haW4uZ3JvdXBzJHRvdGFsX3Byb2R1Y2Npb24pKQ0KYGBgDQoNClBhcmEgYWdyZWdhciB1biBudWV2byBhdHJpYnV0byBjb24gcG9yY2VudGFqZSBkZSBsYSBwcm9kdWNjacOzbiB0b3RhbDoNCg0KYGBge3J9DQptYWluLmdyb3VwcyRwZXJjZW50ID0gbWFpbi5ncm91cHMkdG90YWxfcHJvZHVjY2lvbi92YWx1ZQ0KYGBgDQoNClBhcmEgY3JlYXIgdW4gZ3LDoWZpY28gY2lyY3VsYXIgZGUgbGEgcHJvZHVjY2nDs24gdG90YWwgZGUgbG9zIGdydXBvcyBwcmluY2lwYWxlczoNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQojIEJhcnBsb3QNCmJwPC0gZ2dwbG90KG1haW4uZ3JvdXBzLCBhZXMoeD0iIiwgeT1wZXJjZW50LCBmaWxsPUdydXBvKSkrDQpnZW9tX2Jhcih3aWR0aCA9IDEsIHN0YXQgPSAiaWRlbnRpdHkiKQ0KIyBQaWVjaGFydA0KcGllIDwtIGJwICsgY29vcmRfcG9sYXIoInkiLCBzdGFydD0wKQ0KcGllDQpgYGANCg0KIyMgNS4yIE11bmljaXBpb3MgY29uIG1heW9yIHByb2R1Y2Npw7NuIHBhcmEgY2FkYSBncnVwbyBkZSBjdWx0aXZvczoNClBhcmEgY29ub2NlciBsb3MgbXVuaWNpcGlvcyBxdWUgbGlkZXJhcm9uIGxhIHByb2R1Y2Npw7NuIGRlIGNhZGEgY3VsdGl2byBkZSAyMDA3IGEgMjAxOCBlbiBlbCBkZXBhcnRhbWVudG8gZGUgQm95YWPDoToNCg0KYGBge3J9DQpuZXdfZXZhICU+JQ0KICBncm91cF9ieShHcnVwbywgTVVOSUNJUElPKSAlPiUNCiAgc3VtbWFyaXplKHRvdGFsX3Byb2QgPSBzdW0oUHJvZHVjY2lvbiwgbmEucm0gPSBUUlVFKSkgJT4lDQogIHNsaWNlKHdoaWNoLm1heCh0b3RhbF9wcm9kKSkgICU+JQ0KICBhcnJhbmdlKGRlc2ModG90YWxfcHJvZCkpDQpgYGANCg0KUGFyYSBndWFyZGFyIGRpY2hvIG9iamV0bzoNCg0KYGBge3J9DQpuZXdfZXZhICU+JQ0KICBncm91cF9ieShHcnVwbywgTVVOSUNJUElPKSAlPiUNCiAgc3VtbWFyaXplKHRvdGFsX3Byb2QgPSBzdW0oUHJvZHVjY2lvbiwgbmEucm0gPSBUUlVFKSkgJT4lDQogIHNsaWNlKHdoaWNoLm1heCh0b3RhbF9wcm9kKSkgIC0+IGxlYWRlcnMNCmBgYA0KDQpgYGB7cn0NCmxlYWRlcnMNCmBgYA0KDQpQYXJhIGZpbHRyYXIgbG9zIG11bmljaXBpb3MgbcOhcyBpbXBvcnRhbnRlcyBkZXNkZSBlbCBwdW50byBkZSB2aXN0YSBhZ3LDrWNvbGE6DQoNCmBgYHtyfQ0KbGVhZGVycyAlPiUgDQogIGZpbHRlcih0b3RhbF9wcm9kID4gNTAwMDApIC0+IG1haW4ubGVhZGVycw0KYGBgDQoNCkFob3JhIGdyYWZpY2Ftb3MgbG9zICJsZWFkZXJzIiBmaWx0cmFkb3M6DQoNCmBgYHtyfQ0KIyBCYXNpYyBiYXJwbG90DQpwPC1nZ3Bsb3QoZGF0YT1tYWluLmxlYWRlcnMsIGFlcyh4PU1VTklDSVBJTywgeT10b3RhbF9wcm9kKSkgKw0KICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpDQpwDQpgYGANCg0KIyMgNS4zIERpbsOhbWljYSBkZWwgY3VsdGl2byBkZSB0b21hdGUgZW50cmUgMjAwOSB5IDIwMTUsIGVuIGVsIGRlcGFydGFtZW50byBkZSBCb3lhY8OhLg0KDQpBdW5xdWUgZW4gbXVuaWNpcGlvIGRlIG1heW9yIHByb2R1Y2Npw7NuIGVuIGVsIGRlcGFydGFtZW50byBkZSBCb3lhY2EgZXMgQXF1aXRhbmlhLCBlbCBjdWx0aXZvIGRlIGludGVyZXMgZXNjb2dpZG8gcXVlIGVzICJUb21hdGUiIG5vIHNlIHByb2R1Y2UgYWxsaSBkZWJpZG8gYSBjb25kaWNpb25lcyBjb21vIGxhIGFsdHVyYSB5IGVsIGNsaW1hLg0KUG9yIGVsbG8sIHBhcmEgZWwgYW5hbGlzaXMgZGVsIGN1bHRpdm8gZGUgdG9tYXRlIGVuIGVsIGRlcGFydGFtZW50byBkZSBCb3lhY2Egc2UgdG9tYSBjb21vIG11bmljaXBpbyBkZSBtYXlvciBwcm9kdWNjaW9uIGVsIG11bmljaXBpbyBkZSBTdXRhbWFyY2hhbi4gRG9uZGUgZWwgdG9tYXRlIGVzIHBhcnRlIGRlIGxhIGlkZW50aWRhZCBkZSB1biBzw61tYm9sbyBkZWwgbXVuaWNpcGlvIGRlYmlkbyBhIHN1IGV4dGVuc2EgcHJvZHVjY2lvbi4gDQpFbiBzdXRhbWFyY2hhbiBlbCBsYSBidWVuYSBjYWxpZGFkIGVuIGVsIGFjY2VzbyBhIHJlY3Vyc29zIGEgcmVjdXJzb3MgYWdyaWNvbGFzLCBsYXMgY29uZGljaW9uZXMgY2xpbWF0aWNhcyBmYXZvcmFibGUgdGVuaWVuZG8gZW4gY3VlbnRhIHF1ZSBsYSB0ZW1wZXJhdHVyYSBxdWUgcHVlZGUgdmFyaWFyIGRlIGxvcyA5wrBDIGEgbG9zIDIywrBDIHkgdW5hIGFsdHVyYSBkZSAxODAwIG1zbm0uIEVzdGFzIGNhcmFjdGVyw61zdGljYXMgaGFuIGRhZG8gcGFzbyBwYXJhIHF1ZSBkaWZlcmVudGVzIHZhcmllZGFkZXMgZGUgdG9tYXRlIHNlIHB1ZWRhbiBwcnVkdWNpciwgcXVlIGVsIHRvbWF0ZSBlbmN1ZW50cmUgdW4gbHVnYXIgZGUgZ3JhbiBkZW1hbmRhIGVuIGVsIG1lcmNhZG8gZ3JhY2lhcyBhIHN1IHBvY2EgZGlzdGFuY2lhIGNvbiBlbCBjZW50cm8gZGVsIHBhaXMgeSBxdWUgZWwgdG9tYXRlIHNlIHZ1ZWx2YSBwYXJ0ZSBkZSBsYXMgdHJhZGljaW9uZXMgYWdyaWNvbGFzIGRlIGNhZGEgdW5vIGRlIGxvcyBwcm9kdWN0b3JlcyBkZSBsYXMgZGlmZXJlbnRlcyB6b25hcyBkZSBTdXRhbWFyY2hhbi4NCg0KYGBge3J9DQpuZXdfZXZhICU+JSANCiAgZmlsdGVyKE1VTklDSVBJTz09IlNVVEFNQVJDSEFOIiAmIENVTFRJVk89PSJUT01BVEUiKSAlPiUgDQogIGdyb3VwX2J5KFllYXIsIENVTFRJVk8pICU+JQ0KICBzZWxlY3QoTVVOSUNJUElPLCBDVUxUSVZPLCBQcm9kdWNjaW9uLCBZZWFyKSAtPiAgc3V0YW1hcmNoYW5fdG9tYXRvZQ0KYGBgDQpBaG9yYSBzZSBjb21wcnVlYmEgZWwgcmVzdWx0YWRvOg0KYGBge3J9DQogc3V0YW1hcmNoYW5fdG9tYXRvZQ0KYGBgDQpDb24gbGEgaW5mb3JtYWNpw7NuIG9idGVuaWRhLiBTZSBoYWNlIHVuIGdyYWZpY28gZGUgbGEgbGEgcHJvZHVjY2nDs24gZGUgdG9tYXRlIGVuIFN1dGFtYXJjaGFuIGR1cmFudGUgbG9zIGHDsW9zIDIwMDkgeSAyMDE1IHBhcmEgaWx1c3RyYXIgbWVqb3IgbG9zIGRhdG9zOg0KDQpgYGB7cn0NCmcgPC0gZ2dwbG90KGFlcyh4PVllYXIsIHk9UHJvZHVjY2lvbi8xMDAwKSwgZGF0YSA9IHN1dGFtYXJjaGFuX3RvbWF0b2UpICsgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknKSArIGxhYnMoeT0nUHJvZHVjY2lvbiBkZSBUb21hdGUgW1RvbiB4IDEwMDBdJykNCmBgYA0KDQpQb3IgdWx0aW1vIHNlIGxlIGHDsWFkZSB1biB0aXR1bG8geSBzZSB2aXN1YWxpemE6DQoNCmBgYHtyfQ0KZyArIGdndGl0bGUoIkV2b2x1Y2lvbiBkZWwgY3VsdGl2byBkZSBUb21hdGUgZW4gU3V0YW1hcmNoYW4gZGVzZGUgZWwgYcOxbyAyMDA5IGhhc3RhIGVsIDIwMTUiKSArIGxhYnMoY2FwdGlvbj0gIkJhc2FkbyBlbiBkYXRvcyBkZSBFVkEgKE1pbmFncmljdWx0dXJhLCAyMDIwKSIpDQpgYGANCg0KIyMgNi5PdHJvcyBhbmFsaXNpcw0KDQojIyA2LjEuIEFuYWxpc2lzIGRlbCByZW5kaW1pZW50bw0KVGVuaWVuZG8gZW4gY3VlbnRhIHF1ZSBTdXRhbWFyY2hhbiBCb3lhY2EgZXMgdW4gbXVuaWNpcGlvIHF1ZSBwcmluY2lwYWxtZW50ZSB0aWVuZSBzdSB2b2NhY2lvbiBhZ3JpY29sYSByZWxhY2lvbmFkYSBjb24gZWwgdG9tYXRlLCBzYWJlciBlbCByZW5kaW1pZW50byBkZSBsb3MgY3VsdGl2b3MgZGUgdG9tYXRlIHF1ZSBzZSBkZXNhcnJvbGxhbiBlcyBpbXBvcnRhbnRlIHBhcmEgbGxlZ2FyIGEgdG9tYXIgeSBlc3RhYmxlY2VyIGRlc2ljaW9uZXMgcmVsYWNpb25hZGFzIGNvbjogTGFzIHZhcmllZGFkZXMgc2VtYnJhZGFzLCBsb3MgdGllbXBvcyBkZSBzaWVtYnJhIHkgZWwgY2FsZW5kYXJpbyBjbGltYXRpY28uDQpQYXJhIGNvbnRyYXRhc3RhciBlbCByZW5kaW1pZW50byBkZWwgdG9tYXRlIHNlbWJyYWRvIGVuIHN1dGFtYXJjaGFuIGJveWFjYSBlcyBuZWNlc2FyaW8gcXVlOg0KDQpgYGB7cn0NCm5ld19ldmEgJT4lIA0KICBmaWx0ZXIoTVVOSUNJUElPPT0iU1VUQU1BUkNIQU4iICYgQ1VMVElWTz09IlRPTUFURSIpICU+JSANCiAgZ3JvdXBfYnkoWWVhciwgQ1VMVElWTykgJT4lDQogIHNlbGVjdChNVU5JQ0lQSU8sIENVTFRJVk8sIFJlbmRpbWllbnRvLCBZZWFyKSAtPiAgc3V0YW1hcmNoYW5fdG9tYXRvZVINCmBgYA0KDQpRdWUgdGVpZW5lIGNvbW8gUmVzdWx0YWRvOg0KDQpgYGB7cn0NCnN1dGFtYXJjaGFuX3RvbWF0b2VSDQpgYGANCg0KQ29uIGxhIGluZm9ybWFjacOzbiBvYnRlbmlkYS4gU2UgaGFjZSB1biBncmFmaWNvIGRlbCByZW5kaW1pZW50byBkZSB0b21hdGUgZW4gZWwgcGVyaW9kbyBxdWUgY29tcHJlbmRlIGRlc2RlIDIwMDkgaGFzdGEgZWwgYcOxbyAyMDE1IHBhcmEgaWx1c3RyYXIgbWVqb3IgbG9zIGRhdG9zOg0KDQpgYGB7cn0NCnIgPC0gZ2dwbG90KGFlcyh4PVllYXIsIHk9UmVuZGltaWVudG8vMTAwMCksIGRhdGEgPSBzdXRhbWFyY2hhbl90b21hdG9lUikgKyBnZW9tX2JhcihzdGF0PSdpZGVudGl0eScpICsgbGFicyh5PSdSZW5kaW1pZW50byBkZSBUb21hdGUgW1RvbiB4IGhhXScpDQpgYGANCg0KUG9yIHVsdGltbyBzZSBsZSBhw7FhZGUgdW4gdGl0dWxvIHkgc2UgdmlzdWFsaXphOg0KDQpgYGB7cn0NCnIgKyBnZ3RpdGxlKCJDYW1iaW9zIGVuICBlbCByZW5kaW1pZW50byBkZWwgY3VsdGl2byBkZSB0b21hdGUgZGVsIGHDsW8gMjAwOSBoYXN0YSBlbCBhw7FvIDIwMTUiKSArIGxhYnMoY2FwdGlvbj0gIkJhc2FkbyBlbiBkYXRvcyBkZSBFVkEgKE1pbmFncmljdWx0dXJhLCAyMDIwKSIpDQpgYGANCg0KIyMgNi4yIEFuYWxpc2lzIGRlbCBhcmVhIENvc2VjaGFkYQ0KVGVuZXIgZW4gY3VlbnRhIGVsIGFyZWEgY29zZWNoYWRhIGRlbCBjdWx0aXZvIGRlIHRvbWF0ZSBlbiBTdXRhbWFyY2hhbiwgZXMgdW4gZmFjdG9yIGltcG9ydGFudGUgcXVlIHBlcm1pdGUgZXN0YWJsZWNlciBlbCBNdW5pY2lwaW8gZGUgU3V0YW1hcmNoYW4gY29tbyBlbCBtYXlvciBwcm9kdWN0b3IgZGUgVG9tYXRlIGVuIGVsIGRlcGFydGFtZW50byBkZSBCb3lhY8OhLiBZIGVzIHF1ZSBhbCBjb25vY2VyIGEgU3V0YW1hcmNoYW4gY29tbyB1biBtdW5pY2lwaW8gY29uIHVuYSB2b2NhY2lvbiBhZ3JpY29sYSB0b21hdGVyYS4gVGFtYmllbiBpbmZsdXllbiBlbiBmYWN0b3JlcyBjb21vIGxhIHBsYW5pZmljYWNpb24gZGVsIGN1bHRpdm8sIGxhIHJlbGFjaW9uIGNvbiBsYSBlc3RpbWFjaW9uIGRlIHByb2R1Y2Npw7NuIHkgbGEgZXN0aW1hY2lvbiBkZSByZW5kaW1pZW50bywgZWwgbW9uaXRvcmVvIHkgY29udHJvbCBkZSBwbGFnYXMgeSBlbmZlcm1lZGFkZXMuDQpQYXJhIGNvbnRyYXRhc3RhciBlbCBhcmVhIHNlbWJyYWRhIGVuIHN1dGFtYXJjaGFuIGJveWFjYSBlcyBuZWNlc2FyaW8gcXVlOg0KDQpgYGB7cn0NCm5ld19ldmEgJT4lIA0KICBmaWx0ZXIoTVVOSUNJUElPPT0iU1VUQU1BUkNIQU4iICYgQ1VMVElWTz09IlRPTUFURSIpICU+JSANCiAgZ3JvdXBfYnkoWWVhciwgQ1VMVElWTykgJT4lDQogIHNlbGVjdChNVU5JQ0lQSU8sIENVTFRJVk8sIEFyZWFDb3NlY2hhZGEsIFllYXIpIC0+ICBzdXRhbWFyY2hhbl90b21hdG9lQWMNCmBgYA0KDQpRdWUgdGllbmUgY29tbyBSZXN1bHRhZG86DQoNCmBgYHtyfQ0Kc3V0YW1hcmNoYW5fdG9tYXRvZUFjDQpgYGANCg0KQ29uIGxhIGluZm9ybWFjacOzbiBvYnRlbmlkYS4gU2UgaGFjZSB1biBncmFmaWNvIGNvbiByZWxhY2lvbiBhbCBhcmVhIGVuIGxhIGN1YWwgc2Ugb2J0dXZvIGNvc2VjaGEgZGUgdG9tYXRlIGVuIGVsIHBlcmlvZG8gY29tcHJlbmRpZG8gZW50cmUgZWwgYcOxbyAyMDA5IHkgMjAxNToNCg0KYGBge3J9DQpBYyA8LSBnZ3Bsb3QoYWVzKHg9WWVhciwgeT1BcmVhQ29zZWNoYWRhKSwgZGF0YSA9IHN1dGFtYXJjaGFuX3RvbWF0b2VBcykgKyBnZW9tX2JhcihzdGF0PSdpZGVudGl0eScpICsgbGFicyh5PSdBcmVhIGNvc2VjaGFkYSBbaGFdJykNCmBgYA0KDQpQb3IgdWx0aW1vIHNlIGxlIGHDsWFkZSB1biB0aXR1bG8geSBzZSB2aXN1YWxpemE6DQoNCmBgYHtyfQ0KQWMgKyBnZ3RpdGxlICgiQ2FtYmlvcyBlbiBlbCBhcmVhIGNvc2VjaGFkYSBkZSB0b21hdGUgZGVsIGHDsW8gMjAwOSBoYXN0YSBlbCBhw7FvIDIwMTUiKSArIGxhYnMoY2FwdGlvbj0gIkJhc2FkbyBlbiBkYXRvcyBkZSBFVkEgKE1pbmFncmljdWx0dXJhLCAyMDIwKSIpDQpgYGANCg0KIyMgNy4gQmlibGlvZ3JhZmlhDQooMSkuIExpemFyYXpvLCBJLiwgMjAyMi4gVW5kZXJzdGFuZGluZyBkeW5hbWljIHByb2R1Y3Rpdml0eSBvZiBjcm9wcy4gQXZhaWxhYmxlIGF0IGh0dHBzOi8vcnB1YnMuY29tL2lhbHMydW4vcHJvZHVjdGlvbl9keW5fdjEuDQoNCigyKS4NCmBgYHtyfQ0Kc2Vzc2lvbkluZm8oKQ0KYGBgDQoNCg==