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==