Resumen

Para iniciar la práctica del curso, llevada a cabo en las salas de informática de la Universidad Nacional de Colombia, se realizaron una serie de mapas con los departamentos y municipios de Colombia.

Una vez instaladas las librerias en Rstudio para llevar a cabo la elaboración de los mapas y el cuaderno, se llaman de la siguiente manera:

library(tidyverse)
library(sf)
library(GADMTools)

Obtener datos administrativos de un país

Cada país posee un código de tres letras en la base de datos de Rstudio, en nuestro caso usaremos COL para llamar a Colombia, y al nombre del vector se le asignará el mismo nombre.

Para el primer gráfico se ejecutará el siguiente código, siendo el level=0 el llamado al país en su totalidad, sin ningún tipo de división politíca.

Colombia<-gadm_sf_loadCountries(c("COL"), level=0, basefile="./")          
Colombia
$basename
[1] "./"

$sf
Simple feature collection with 1 feature and 2 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: -81.84153 ymin: -4.228429 xmax: -66.87033 ymax: 15.91247
epsg (SRID):    4326
proj4string:    +proj=longlat +datum=WGS84 +no_defs
  ISO   NAME_0                       geometry
1 COL Colombia MULTIPOLYGON (((-78.97958 1...

$level
[1] 0

$hasBGND
[1] FALSE

attr(,"class")
[1] "gadm_sf"

Ahora vamos a visualizar el mapa de Colombia—>

gadm_plot(Colombia)     

Para el segundo gráfico el nombre de la variable será Departamentos, y se escribirá el mismo código a excepción de que level=1 corresponde al llamado de la división del país en departamentos. Y al igual que el anterior, se visualizará.

Departamentos<-gadm_sf_loadCountries(c("COL"), level=1, basefile="./")    
trying URL 'https://biogeo.ucdavis.edu/data/gadm3.6/Rsf/gadm36_COL_1_sf.rds'
Content type '' length 782954 bytes (764 KB)
downloaded 764 KB
gadm_plot(Departamentos)

Conociendo los códigos anteriores, se hace el mismo proceso con los Municipios (level=2).

Municipios<-gadm_sf_loadCountries(c("COL"), level=2, basefile="./")    
trying URL 'https://biogeo.ucdavis.edu/data/gadm3.6/Rsf/gadm36_COL_2_sf.rds'
Content type '' length 1092557 bytes (1.0 MB)
downloaded 1.0 MB
gadm_plot(Municipios)

Ahora que ya sabemos los conceptos básicos respecto a datos espaciales en Rstudio, se toman tres departamentos de Colombia, asignados previamente en clase, y se les aplica lo aprendido con un toque de estética.

Se eligieron los departamentos pertenecientes al Eje Cafetero (Quindío, Risaralda y Caldas). Donde el departamento más pequeño corresponde al Quindío, y el más grande a Caldas.

Eje_Cafetero <-gadm_subset(Departamentos, level=1, regions=(c("Quindío", "Risaralda", "Caldas")))
gadm_plot(Eje_Cafetero) %>% gadm_showNorth("tl") %>% gadm_showScale('bl')

Si no se conocen los nombres de todos departamentos de Colombia, se puede crear una lista para visualizarlos.

listNames(Departamentos, 1)
 [1] "Amazonas"                 "Antioquia"               
 [3] "Arauca"                   "Atlántico"               
 [5] "Bolívar"                  "Boyacá"                  
 [7] "Caldas"                   "Caquetá"                 
 [9] "Casanare"                 "Cauca"                   
[11] "Cesar"                    "Chocó"                   
[13] "Córdoba"                  "Cundinamarca"            
[15] "Guainía"                  "Guaviare"                
[17] "Huila"                    "La Guajira"              
[19] "Magdalena"                "Meta"                    
[21] "Nariño"                   "Norte de Santander"      
[23] "Putumayo"                 "Quindío"                 
[25] "Risaralda"                "San Andrés y Providencia"
[27] "Santander"                "Sucre"                   
[29] "Tolima"                   "Valle del Cauca"         
[31] "Vaupés"                   "Vichada"                 

Para un mayor entendimiento de los gráficos, la estética es vital:

  1. Hallar límites.
(sbox<- gadm_getBbox(Eje_Cafetero))    
      xmin       ymin       xmax       ymax 
-76.359497   4.135801 -74.648903   5.762600 
  1. Mostrar el mapa en estructura de caja, para visualizar sus departamentos vecinos.
str(sbox)                 
 'bbox' Named num [1:4] -76.36 4.14 -74.65 5.76
 - attr(*, "names")= chr [1:4] "xmin" "ymin" "xmax" "ymax"
 - attr(*, "crs")=List of 2
  ..$ epsg       : int 4326
  ..$ proj4string: chr "+proj=longlat +datum=WGS84 +no_defs"
  ..- attr(*, "class")= chr "crs"
  1. Teniendo de referencia los límites, y para que la estructura de caja no recorte el mapa, se agrandan sus dimensiones (x,y), y se visualiza el mapa en caja.
(AREA_ESTUDIO<- gadm_crop(Departamentos, xmin= -76.40, ymin= 4.10, xmax= -74.60, ymax= 5.84))
although coordinates are longitude/latitude, st_intersection assumes that they are planar
attribute variables are assumed to be spatially constant throughout all geometries
$basename
[1] "./"

$sf
Simple feature collection with 9 features and 5 fields
geometry type:  POLYGON
dimension:      XY
bbox:           xmin: -76.4 ymin: 4.1 xmax: -74.6 ymax: 5.84
epsg (SRID):    4326
proj4string:    +proj=longlat +datum=WGS84 +no_defs
   ISO   NAME_0          NAME_1       TYPE_1  ENGTYPE_1
12 COL Colombia       Antioquia Departamento Department
29 COL Colombia          Boyacá Departamento Department
30 COL Colombia          Caldas Departamento Department
4  COL Colombia           Chocó Departamento Department
6  COL Colombia    Cundinamarca Departamento Department
17 COL Colombia         Quindío Departamento Department
18 COL Colombia       Risaralda Departamento Department
22 COL Colombia          Tolima Departamento Department
24 COL Colombia Valle del Cauca Departamento Department
                         geometry
12 POLYGON ((-75.6143 5.515099...
29 POLYGON ((-74.6 5.74204, -7...
30 POLYGON ((-75.3569 4.890801...
4  POLYGON ((-76.15588 5.84, -...
6  POLYGON ((-74.6 4.2511, -74...
17 POLYGON ((-75.6632 4.241701...
18 POLYGON ((-75.7459 4.7087, ...
22 POLYGON ((-75.7288 4.1, -75...
24 POLYGON ((-76.4 4.71447, -7...

$level
[1] 1

$hasBGND
[1] FALSE

attr(,"class")
[1] "gadm_sf"
gadm_plot(AREA_ESTUDIO)

Obtención de un simple feature (“sf”) —> Nos proporciona información con respecto a los datos espaciales de la zona estudiada, en nuestro caso Colombia.

Departamentos$sf
Simple feature collection with 32 features and 5 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: -81.84153 ymin: -4.228429 xmax: -66.87033 ymax: 15.91247
epsg (SRID):    4326
proj4string:    +proj=longlat +datum=WGS84 +no_defs
First 10 features:
   ISO   NAME_0    NAME_1       TYPE_1   ENGTYPE_1
1  COL Colombia  Amazonas    Comisaría Commissiary
12 COL Colombia Antioquia Departamento  Department
23 COL Colombia    Arauca  Intendencia  Intendancy
27 COL Colombia Atlántico Departamento  Department
28 COL Colombia   Bolívar Departamento  Department
29 COL Colombia    Boyacá Departamento  Department
30 COL Colombia    Caldas Departamento  Department
31 COL Colombia   Caquetá  Intendencia  Intendancy
32 COL Colombia  Casanare  Intendencia  Intendancy
2  COL Colombia     Cauca Departamento  Department
                         geometry
1  MULTIPOLYGON (((-69.43138 -...
12 MULTIPOLYGON (((-76.99986 8...
23 MULTIPOLYGON (((-69.92316 6...
27 MULTIPOLYGON (((-74.8816 10...
28 MULTIPOLYGON (((-75.79681 1...
29 MULTIPOLYGON (((-74.2158 5....
30 MULTIPOLYGON (((-75.3569 4....
31 MULTIPOLYGON (((-73.88365 -...
32 MULTIPOLYGON (((-72.6363 4....
2  MULTIPOLYGON (((-77.97681 2...
  1. Instalar y llamar el paquete de código mapview, para personalizar los mapas.
#install.packages("mapview")
library(mapview)

-Aplicar color y leyendas al mapa de Colombia con los departamentos, al mismo tiempo que se genera un mapa dinámico (suprimir los mensajes del paquete mapview para mayor comodidad).

suppressPackageStartupMessages(library(mapview))
Departamentos$sf %>% mapview(zcol= "NAME_1", legend= TRUE, col.regions=sf.colors)

Ahora realizar el mismo proceso con los Municipios:

Municipios$sf
Simple feature collection with 1065 features and 6 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: -81.84153 ymin: -4.228429 xmax: -66.87033 ymax: 15.91247
epsg (SRID):    4326
proj4string:    +proj=longlat +datum=WGS84 +no_defs
First 10 features:
      ISO   NAME_0    NAME_1           NAME_2
15629 COL Colombia  Amazonas       El Encanto
15634 COL Colombia  Amazonas      La Chorrera
15699 COL Colombia  Amazonas       La Pedrera
16578 COL Colombia  Amazonas          Leticia
15505 COL Colombia  Amazonas    Mirití-Paraná
16577 COL Colombia  Amazonas    Puerto Nariño
15494 COL Colombia  Amazonas Puerto Santander
16055 COL Colombia  Amazonas         Tarapacá
14570 COL Colombia Antioquia        Abejorral
14343 COL Colombia Antioquia         Abriaquí
                          TYPE_2                  ENGTYPE_2
15629 Corregimiento Departamento Corregimiento Departamento
15634 Corregimiento Departamento Corregimiento Departamento
15699 Corregimiento Departamento Corregimiento Departamento
16578                  Municipio               Municipality
15505 Corregimiento Departamento Corregimiento Departamento
16577                  Municipio               Municipality
15494 Corregimiento Departamento Corregimiento Departamento
16055 Corregimiento Departamento Corregimiento Departamento
14570                  Municipio               Municipality
14343                  Municipio               Municipality
                            geometry
15629 MULTIPOLYGON (((-73.43552 -...
15634 MULTIPOLYGON (((-71.9802 -1...
15699 MULTIPOLYGON (((-72.61586 -...
16578 MULTIPOLYGON (((-70.0579 -4...
15505 MULTIPOLYGON (((-70.2188 -0...
16577 MULTIPOLYGON (((-70.28952 -...
15494 MULTIPOLYGON (((-71.4002 -0...
16055 MULTIPOLYGON (((-70.1296 -3...
14570 MULTIPOLYGON (((-75.5753 5....
14343 MULTIPOLYGON (((-76.0697 6....
Municipios$sf %>% mapview(zcol= "NAME_2", legend= TRUE, col.regions=sf.colors)

Ahora se juntarán lo aprendido hasta el momento, y se aplicará a los departamentos elegidos.

Eje_cafetero_mun <-gadm_subset(Municipios, level=1, regions=(c("Quindío", "Risaralda", "Caldas")))
gadm_plot(Eje_cafetero_mun) %>% gadm_showNorth("tl") %>% gadm_showScale('bl')

El gráfico en caja de los mucicipios completos de cada departamento, no nos proporciona mucha información, debido a que no se diferencian los límites entre departamentos como se muestra a continuación:

(AREA_ESTUDIO<- gadm_crop(Municipios, xmin= -76.40, ymin= 4.10, xmax= -74.60, ymax= 5.84))
although coordinates are longitude/latitude, st_intersection assumes that they are planar
attribute variables are assumed to be spatially constant throughout all geometries
$basename
[1] "./"

$sf
Simple feature collection with 156 features and 6 fields
geometry type:  GEOMETRY
dimension:      XY
bbox:           xmin: -76.4 ymin: 4.1 xmax: -74.6 ymax: 5.84
epsg (SRID):    4326
proj4string:    +proj=longlat +datum=WGS84 +no_defs
First 10 features:
      ISO   NAME_0    NAME_1               NAME_2    TYPE_2
14570 COL Colombia Antioquia            Abejorral Municipio
14637 COL Colombia Antioquia                Andes Municipio
14638 COL Colombia Antioquia              Argelia Municipio
14626 COL Colombia Antioquia              Betania Municipio
14566 COL Colombia Antioquia              Bolívar Municipio
14687 COL Colombia Antioquia            Caramanta Municipio
14506 COL Colombia Antioquia El Carmen de Viboral Municipio
14554 COL Colombia Antioquia             Fredonia Municipio
14613 COL Colombia Antioquia             Hispania Municipio
14663 COL Colombia Antioquia               Jardín Municipio
         ENGTYPE_2                       geometry
14570 Municipality POLYGON ((-75.5753 5.717701...
14637 Municipality POLYGON ((-75.8312 5.6518, ...
14638 Municipality POLYGON ((-75.0945 5.653901...
14626 Municipality POLYGON ((-76.1327 5.650701...
14566 Municipality POLYGON ((-76.1292 5.7408, ...
14687 Municipality POLYGON ((-75.6143 5.515099...
14506 Municipality POLYGON ((-75.23257 5.84, -...
14554 Municipality POLYGON ((-75.6716 5.793199...
14613 Municipality POLYGON ((-75.9829 5.787, -...
14663 Municipality POLYGON ((-75.8312 5.6518, ...

$level
[1] 2

$hasBGND
[1] FALSE

attr(,"class")
[1] "gadm_sf"
gadm_plot(AREA_ESTUDIO)

Se realiza el simple feature con el vector creado de los municipios del eje cafetero.

Eje_cafetero_mun$sf
Simple feature collection with 51 features and 6 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: -76.3595 ymin: 4.135801 xmax: -74.6489 ymax: 5.7626
epsg (SRID):    4326
proj4string:    +proj=longlat +datum=WGS84 +no_defs
First 10 features:
      ISO   NAME_0 NAME_1     NAME_2    TYPE_2    ENGTYPE_2
14649 COL Colombia Caldas    Aguadas Municipio Municipality
14773 COL Colombia Caldas    Anserma Municipio Municipality
14761 COL Colombia Caldas   Aranzazú Municipio Municipality
14833 COL Colombia Caldas Belalcázar Municipio Municipality
14834 COL Colombia Caldas  Chinchiná Municipio Municipality
14750 COL Colombia Caldas Filadelfia Municipio Municipality
14634 COL Colombia Caldas  La Dorada Municipio Municipality
14731 COL Colombia Caldas  La Merced Municipio Municipality
14805 COL Colombia Caldas  Manizales Municipio Municipality
14766 COL Colombia Caldas Manzanares Municipio Municipality
                            geometry
14649 MULTIPOLYGON (((-75.3399 5....
14773 MULTIPOLYGON (((-75.6908 5....
14761 MULTIPOLYGON (((-75.3997 5....
14833 MULTIPOLYGON (((-75.7841 5....
14834 MULTIPOLYGON (((-75.6204 4....
14750 MULTIPOLYGON (((-75.5888 5....
14634 MULTIPOLYGON (((-74.8504 5....
14731 MULTIPOLYGON (((-75.6437 5....
14805 MULTIPOLYGON (((-75.636 5.0...
14766 MULTIPOLYGON (((-75.1662 5....

Luego se grafica, dando a conocer un mapa mucho más informativo de nuestros departamentos (Quíndio, Risaralda y Caldas), con la mayoría de sus municipios.

Eje_cafetero_mun$sf %>% mapview(zcol= "NAME_2", legend= TRUE, col.regions=sf.colors)
class(Eje_cafetero_mun)
[1] "gadm_sf"

Por último, para guardar los municipios en extensión .shp en el mismo directorio donde se está trabajando el Notebook se usa el siguiente código:

Eje_cafetero_mun<-st_write(Eje_cafetero_mun$sf,"Eje_cafetero_mun.shp")
Writing layer `Eje_cafetero_mun' to data source `Eje_cafetero_mun.shp' using driver `ESRI Shapefile'
Writing 51 features with 6 fields and geometry type Multi Polygon.

Seguir con el siguiente cuaderno Explorando atributos, para darle uso al archivo shapefile.

LS0tDQp0aXRsZTogIkNvbWVuemFuZG8gY29uIGxvcyBkYXRvcyBlc3BhY2lhbGVzIg0Kc3VidGl0bGU6ICJDdXJzbyBkZSBHZW9tw6F0aWNhIELDoXNpY2EiDQphdXRob3I6ICJTb2bDrWEgTcOhcnF1ZXoiDQpvdXRwdXQ6IA0KICBodG1sX25vdGVib29rOg0KICAgICB0aGVtZTogZGFya2x5DQotLS0gDQoNCioqUmVzdW1lbioqDQoNClBhcmEgaW5pY2lhciBsYSBwcsOhY3RpY2EgZGVsIGN1cnNvLCBsbGV2YWRhIGEgY2FibyBlbiBsYXMgc2FsYXMgZGUgaW5mb3Jtw6F0aWNhIGRlIGxhIFtVbml2ZXJzaWRhZCBOYWNpb25hbCBkZSBDb2xvbWJpYV0oaHR0cDovL3VuYWwuZWR1LmNvKSwgc2UgcmVhbGl6YXJvbiB1bmEgc2VyaWUgZGUgbWFwYXMgY29uIGxvcyBkZXBhcnRhbWVudG9zIHkgbXVuaWNpcGlvcyBkZSBDb2xvbWJpYS4NCg0KVW5hIHZleiBpbnN0YWxhZGFzIGxhcyBsaWJyZXJpYXMgZW4gUnN0dWRpbyBwYXJhIGxsZXZhciBhIGNhYm8gbGEgZWxhYm9yYWNpw7NuIGRlIGxvcyBtYXBhcyB5IGVsIGN1YWRlcm5vLCBzZSBsbGFtYW4gZGUgbGEgc2lndWllbnRlIG1hbmVyYToNCmBgYHtyfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShHQURNVG9vbHMpDQpgYGANCg0KKipPYnRlbmVyIGRhdG9zIGFkbWluaXN0cmF0aXZvcyBkZSB1biBwYcOtcyoqDQogDQogQ2FkYSBwYcOtcyBwb3NlZSB1biBjw7NkaWdvIGRlIHRyZXMgbGV0cmFzIGVuIGxhIGJhc2UgZGUgZGF0b3MgZGUgUnN0dWRpbywgZW4gbnVlc3RybyBjYXNvIHVzYXJlbW9zICoqQ09MKiogcGFyYSBsbGFtYXIgYSAqQ29sb21iaWEqLCB5IGFsIG5vbWJyZSBkZWwgdmVjdG9yIHNlIGxlIGFzaWduYXLDoSBlbCBtaXNtbyBub21icmUuDQoNClBhcmEgZWwgcHJpbWVyIGdyw6FmaWNvIHNlIGVqZWN1dGFyw6EgZWwgc2lndWllbnRlIGPDs2RpZ28sIHNpZW5kbyBlbCAqbGV2ZWw9MCogZWwgbGxhbWFkbyBhbCBwYcOtcyBlbiBzdSB0b3RhbGlkYWQsIHNpbiBuaW5nw7puIHRpcG8gZGUgZGl2aXNpw7NuIHBvbGl0w61jYS4NCg0KYGBge3J9DQpDb2xvbWJpYTwtZ2FkbV9zZl9sb2FkQ291bnRyaWVzKGMoIkNPTCIpLCBsZXZlbD0wLCBiYXNlZmlsZT0iLi8iKSAgICAgICAgICANCkNvbG9tYmlhDQpgYGANCg0KQWhvcmEgdmFtb3MgYSB2aXN1YWxpemFyIGVsIG1hcGEgZGUgQ29sb21iaWEtLS0+DQpgYGB7cn0NCmdhZG1fcGxvdChDb2xvbWJpYSkgICAgIA0KYGBgDQoNClBhcmEgZWwgc2VndW5kbyBncsOhZmljbyBlbCBub21icmUgZGUgbGEgdmFyaWFibGUgc2Vyw6EgKkRlcGFydGFtZW50b3MqLCB5IHNlIGVzY3JpYmlyw6EgZWwgbWlzbW8gY8OzZGlnbyBhIGV4Y2VwY2nDs24gZGUgcXVlICpsZXZlbD0xKiBjb3JyZXNwb25kZSBhbCBsbGFtYWRvIGRlIGxhIGRpdmlzacOzbiBkZWwgcGHDrXMgZW4gZGVwYXJ0YW1lbnRvcy4gWSBhbCBpZ3VhbCBxdWUgZWwgYW50ZXJpb3IsIHNlIHZpc3VhbGl6YXLDoS4NCmBgYHtyfQ0KRGVwYXJ0YW1lbnRvczwtZ2FkbV9zZl9sb2FkQ291bnRyaWVzKGMoIkNPTCIpLCBsZXZlbD0xLCBiYXNlZmlsZT0iLi8iKSAgICANCmdhZG1fcGxvdChEZXBhcnRhbWVudG9zKQ0KYGBgDQpDb25vY2llbmRvIGxvcyBjw7NkaWdvcyBhbnRlcmlvcmVzLCBzZSBoYWNlIGVsIG1pc21vIHByb2Nlc28gY29uIGxvcyBNdW5pY2lwaW9zICgqbGV2ZWw9MiopLg0KYGBge3J9DQpNdW5pY2lwaW9zPC1nYWRtX3NmX2xvYWRDb3VudHJpZXMoYygiQ09MIiksIGxldmVsPTIsIGJhc2VmaWxlPSIuLyIpICAgIA0KZ2FkbV9wbG90KE11bmljaXBpb3MpDQpgYGANCg0KQWhvcmEgcXVlIHlhIHNhYmVtb3MgbG9zIGNvbmNlcHRvcyBiw6FzaWNvcyByZXNwZWN0byBhIGRhdG9zIGVzcGFjaWFsZXMgZW4gUnN0dWRpbywgc2UgdG9tYW4gdHJlcyBkZXBhcnRhbWVudG9zIGRlIENvbG9tYmlhLCBhc2lnbmFkb3MgcHJldmlhbWVudGUgZW4gY2xhc2UsIHkgc2UgbGVzIGFwbGljYSBsbyBhcHJlbmRpZG8gY29uIHVuIHRvcXVlIGRlIGVzdMOpdGljYS4NCg0KU2UgZWxpZ2llcm9uIGxvcyBkZXBhcnRhbWVudG9zIHBlcnRlbmVjaWVudGVzIGFsICpFamUgQ2FmZXRlcm8qIChRdWluZMOtbywgUmlzYXJhbGRhIHkgQ2FsZGFzKS4gRG9uZGUgZWwgZGVwYXJ0YW1lbnRvIG3DoXMgcGVxdWXDsW8gY29ycmVzcG9uZGUgYWwgUXVpbmTDrW8sIHkgZWwgbcOhcyBncmFuZGUgYSBDYWxkYXMuDQpgYGB7cn0NCkVqZV9DYWZldGVybyA8LWdhZG1fc3Vic2V0KERlcGFydGFtZW50b3MsIGxldmVsPTEsIHJlZ2lvbnM9KGMoIlF1aW5kw61vIiwgIlJpc2FyYWxkYSIsICJDYWxkYXMiKSkpDQpnYWRtX3Bsb3QoRWplX0NhZmV0ZXJvKSAlPiUgZ2FkbV9zaG93Tm9ydGgoInRsIikgJT4lIGdhZG1fc2hvd1NjYWxlKCdibCcpDQpgYGANCipTaSBubyBzZSBjb25vY2VuIGxvcyBub21icmVzIGRlIHRvZG9zIGRlcGFydGFtZW50b3MgZGUgQ29sb21iaWEsIHNlIHB1ZWRlIGNyZWFyIHVuYSBsaXN0YSBwYXJhIHZpc3VhbGl6YXJsb3MuKg0KYGBge3J9DQpsaXN0TmFtZXMoRGVwYXJ0YW1lbnRvcywgMSkNCmBgYA0KDQpQYXJhIHVuIG1heW9yIGVudGVuZGltaWVudG8gZGUgbG9zIGdyw6FmaWNvcywgbGEgZXN0w6l0aWNhIGVzIHZpdGFsOg0KDQoxLiBIYWxsYXIgbMOtbWl0ZXMuDQpgYGB7cn0NCihzYm94PC0gZ2FkbV9nZXRCYm94KEVqZV9DYWZldGVybykpICAgIA0KYGBgDQoyLiBNb3N0cmFyIGVsIG1hcGEgZW4gZXN0cnVjdHVyYSBkZSBjYWphLCBwYXJhIHZpc3VhbGl6YXIgc3VzIGRlcGFydGFtZW50b3MgdmVjaW5vcy4NCmBgYHtyfQ0Kc3RyKHNib3gpICAgICAgICAgICAgICAgICANCmBgYA0KMy4gVGVuaWVuZG8gZGUgcmVmZXJlbmNpYSBsb3MgbMOtbWl0ZXMsIHkgcGFyYSBxdWUgbGEgZXN0cnVjdHVyYSBkZSBjYWphIG5vIHJlY29ydGUgZWwgbWFwYSwgc2UgYWdyYW5kYW4gc3VzIGRpbWVuc2lvbmVzICh4LHkpLCB5IHNlIHZpc3VhbGl6YSBlbCBtYXBhIGVuIGNhamEuIA0KYGBge3J9DQooQVJFQV9FU1RVRElPPC0gZ2FkbV9jcm9wKERlcGFydGFtZW50b3MsIHhtaW49IC03Ni40MCwgeW1pbj0gNC4xMCwgeG1heD0gLTc0LjYwLCB5bWF4PSA1Ljg0KSkNCmdhZG1fcGxvdChBUkVBX0VTVFVESU8pDQpgYGANCioqT2J0ZW5jacOzbiBkZSB1biBzaW1wbGUgZmVhdHVyZSAoInNmIikqKiAtLS0+IE5vcyBwcm9wb3JjaW9uYSBpbmZvcm1hY2nDs24gY29uIHJlc3BlY3RvIGEgbG9zIGRhdG9zIGVzcGFjaWFsZXMgZGUgbGEgem9uYSBlc3R1ZGlhZGEsIGVuIG51ZXN0cm8gY2FzbyAqQ29sb21iaWEqLg0KYGBge3J9DQpEZXBhcnRhbWVudG9zJHNmDQpgYGANCg0KDQo0LiBJbnN0YWxhciB5IGxsYW1hciBlbCBwYXF1ZXRlIGRlIGPDs2RpZ28gKiptYXB2aWV3KiosIHBhcmEgcGVyc29uYWxpemFyIGxvcyBtYXBhcy4NCmBgYHtyfQ0KI2luc3RhbGwucGFja2FnZXMoIm1hcHZpZXciKQ0KbGlicmFyeShtYXB2aWV3KQ0KYGBgDQoNCiAgIC1BcGxpY2FyIGNvbG9yIHkgbGV5ZW5kYXMgYWwgbWFwYSBkZSBDb2xvbWJpYSBjb24gbG9zIGRlcGFydGFtZW50b3MsIGFsIG1pc21vIHRpZW1wbyBxdWUgc2UgZ2VuZXJhIHVuIG1hcGEgZGluw6FtaWNvIChzdXByaW1pciBsb3MgbWVuc2FqZXMgZGVsIHBhcXVldGUgKm1hcHZpZXcqIHBhcmEgbWF5b3IgY29tb2RpZGFkKS4NCmBgYHtyfQ0Kc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzKGxpYnJhcnkobWFwdmlldykpDQpEZXBhcnRhbWVudG9zJHNmICU+JSBtYXB2aWV3KHpjb2w9ICJOQU1FXzEiLCBsZWdlbmQ9IFRSVUUsIGNvbC5yZWdpb25zPXNmLmNvbG9ycykNCmBgYA0KDQpBaG9yYSByZWFsaXphciBlbCBtaXNtbyBwcm9jZXNvIGNvbiBsb3MgKipNdW5pY2lwaW9zKio6DQoNCiAgIC0gQ29tbyBzZSBwdWVkZSBvYnNlcnZhciBlbiBlbCBzaW1wbGUgZmVhdHVyZSAoKiJzZiIqKSwgQ29sb21iaWEgcG9zZWUgMTA2NSBtdW5pY2lwaW9zLCBzaW4gY29udGFyIGNvcnJlZ2ltaWVudG9zIHkgZGVtw6FzLg0KYGBge3J9DQpNdW5pY2lwaW9zJHNmDQpgYGANCg0KYGBge3J9DQpNdW5pY2lwaW9zJHNmICU+JSBtYXB2aWV3KHpjb2w9ICJOQU1FXzIiLCBsZWdlbmQ9IFRSVUUsIGNvbC5yZWdpb25zPXNmLmNvbG9ycykNCmBgYA0KDQpBaG9yYSBzZSBqdW50YXLDoW4gbG8gYXByZW5kaWRvIGhhc3RhIGVsIG1vbWVudG8sIHkgc2UgYXBsaWNhcsOhIGEgbG9zIGRlcGFydGFtZW50b3MgZWxlZ2lkb3MuDQoNCmBgYHtyfQ0KRWplX2NhZmV0ZXJvX211biA8LWdhZG1fc3Vic2V0KE11bmljaXBpb3MsIGxldmVsPTEsIHJlZ2lvbnM9KGMoIlF1aW5kw61vIiwgIlJpc2FyYWxkYSIsICJDYWxkYXMiKSkpDQpnYWRtX3Bsb3QoRWplX2NhZmV0ZXJvX211bikgJT4lIGdhZG1fc2hvd05vcnRoKCJ0bCIpICU+JSBnYWRtX3Nob3dTY2FsZSgnYmwnKQ0KYGBgDQoNCkVsIGdyw6FmaWNvIGVuIGNhamEgZGUgbG9zIG11Y2ljaXBpb3MgY29tcGxldG9zIGRlIGNhZGEgZGVwYXJ0YW1lbnRvLCBubyBub3MgcHJvcG9yY2lvbmEgbXVjaGEgaW5mb3JtYWNpw7NuLCBkZWJpZG8gYSBxdWUgbm8gc2UgZGlmZXJlbmNpYW4gbG9zIGzDrW1pdGVzIGVudHJlIGRlcGFydGFtZW50b3MgY29tbyBzZSBtdWVzdHJhIGEgY29udGludWFjacOzbjoNCg0KYGBge3J9DQooQVJFQV9FU1RVRElPPC0gZ2FkbV9jcm9wKE11bmljaXBpb3MsIHhtaW49IC03Ni40MCwgeW1pbj0gNC4xMCwgeG1heD0gLTc0LjYwLCB5bWF4PSA1Ljg0KSkNCmdhZG1fcGxvdChBUkVBX0VTVFVESU8pDQpgYGANClNlIHJlYWxpemEgZWwgc2ltcGxlIGZlYXR1cmUgY29uIGVsIHZlY3RvciBjcmVhZG8gZGUgbG9zIG11bmljaXBpb3MgZGVsIGVqZSBjYWZldGVyby4NCg0KYGBge3J9DQpFamVfY2FmZXRlcm9fbXVuJHNmDQpgYGANCg0KTHVlZ28gc2UgZ3JhZmljYSwgZGFuZG8gYSBjb25vY2VyIHVuIG1hcGEgbXVjaG8gbcOhcyBpbmZvcm1hdGl2byBkZSBudWVzdHJvcyBkZXBhcnRhbWVudG9zIChRdcOtbmRpbywgUmlzYXJhbGRhIHkgQ2FsZGFzKSwgY29uIGxhIG1heW9yw61hIGRlIHN1cyBtdW5pY2lwaW9zLg0KYGBge3J9DQpFamVfY2FmZXRlcm9fbXVuJHNmICU+JSBtYXB2aWV3KHpjb2w9ICJOQU1FXzIiLCBsZWdlbmQ9IFRSVUUsIGNvbC5yZWdpb25zPXNmLmNvbG9ycykNCmBgYA0KDQpgYGB7cn0NCmNsYXNzKEVqZV9jYWZldGVyb19tdW4pDQpgYGANCg0KUG9yIMO6bHRpbW8sIHBhcmEgZ3VhcmRhciBsb3MgbXVuaWNpcGlvcyBlbiBleHRlbnNpw7NuIC5zaHAgZW4gZWwgbWlzbW8gZGlyZWN0b3JpbyBkb25kZSBzZSBlc3TDoSB0cmFiYWphbmRvIGVsIE5vdGVib29rIHNlIHVzYSBlbCBzaWd1aWVudGUgY8OzZGlnbzogIA0KYGBge3J9DQpzdF93cml0ZShFamVfY2FmZXRlcm9fbXVuJHNmLCJFamVfY2FmZXRlcm9fbXVuLnNocCIpDQpgYGANCg0KU2VndWlyIGNvbiBlbCBzaWd1aWVudGUgY3VhZGVybm8gW0V4cGxvcmFuZG8gYXRyaWJ1dG9zXShodHRwOi8vcnB1YnMuY29tL3NvZmlhcG0yMS81Mzg4NTcpLCBwYXJhIGRhcmxlIHVzbyBhbCBhcmNoaXZvIHNoYXBlZmlsZS4NCg0K