1. Introducción

Este es el cuaderno de cuatro que los estudiantes de Geomatica Basica deben escribir para comenzar con R & RStudio. Su objetivo es aprender a unir atributos no espaciales con datos geoespaciales. Ilustraremos el tema uniendo una característica espacial que representa a los municipios de Valle del Cauca (es decir, un shapefile proporcionado por DANE, 2017) y un marco de datos no espaciales con estadísticas agrícolas (es decir, un csv proporcionado por el Ministerio de Agricultura y Desarrollo Rural, 2020). .

2. Carga de las bibliotecas necesarias

Comencemos a cargar varias bibliotecas, en particular dplyr:

library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
-- Attaching packages ---------------------------------- tidyverse 1.3.0 --
v ggplot2 3.3.3     v purrr   0.3.4
v tibble  3.0.6     v dplyr   1.0.5
v tidyr   1.1.3     v stringr 1.4.0
v readr   1.4.0     v forcats 0.5.1
-- Conflicts ------------------------------------- tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
library(dplyr)
library(ggplot2)
library(sf)
Linking to GEOS 3.8.0, GDAL 3.0.4, PROJ 6.3.1

3. Leer una tabla con las estadísticas agrícolas

Empezamos leyendo un archivo con estadísticas de EVA para Valle del Cauca .

eva_valle <- read_csv2(file = "C:/Users/LUISA CARRION/Documents/EVA_final.csv")
i Using ',' as decimal and '.' as grouping mark. Use `read_delim()` for more control.

-- Column specification ---------------------------------------------------
cols(
  COD_DEPTO = col_double(),
  DEPTO = col_character(),
  COD_MUN = col_double(),
  MUNICIPIO = col_character(),
  GRUPO = col_character(),
  SUBGRUPO = col_character(),
  CULTIVO = col_character(),
  DESAGRE = col_character(),
  YEAR = col_double(),
  PERIODO = col_character(),
  Ha_Siembra = col_double(),
  Ha_cosecha = col_double(),
  ton_Prod = col_double(),
  RENDIM = col_double(),
  CICLO = col_character()
)
eva_valle

4. Lectura de un shapefile con los municipios de Valle del Cauca

Utilizaremos el shapefile correspondiente a Marco Geoestadistico Departamental que se encuentra disponible en DANE Geoportal.

Comencemos a leer los datos usando la biblioteca sf:

mun_valle <- sf::st_read("C:/Users/LUISA CARRION/Downloads/76_VALLE_DEL_CAUCA/ADMINISTRATIVO/MGN_MPIO_POLITICO.shp")
Reading layer `MGN_MPIO_POLITICO' from data source `C:\Users\LUISA CARRION\Downloads\76_VALLE_DEL_CAUCA\ADMINISTRATIVO\MGN_MPIO_POLITICO.shp' using driver `ESRI Shapefile'
Simple feature collection with 42 features and 9 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: -77.54977 ymin: 3.091239 xmax: -75.70724 ymax: 5.047394
geographic CRS: WGS 84
mun_valle
Simple feature collection with 42 features and 9 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: -77.54977 ymin: 3.091239 xmax: -75.70724 ymax: 5.047394
geographic CRS: WGS 84
First 10 features:
   DPTO_CCDGO MPIO_CCDGO   MPIO_CNMBR                           MPIO_CRSLC
1          76      76001         CALI                                 1536
2          76      76036    ANDALUCÍA     Ordenanza 38 de Abril 25 de 1921
3          76      76041 ANSERMANUEVO                 Ordenanza 29 de 1925
4          76      76054      ARGELIA                 Ordenanza 15 de 1956
5          76      76111         BUGA                                 1555
6          76      76113 BUGALAGRANDE                                 1791
7          76      76122   CAICEDONIA Ordenanza 21 del 20 de Abril de 1923
8          76      76126       CALIMA     Ordenanza 49 de Junio 23 de 1939
9          76      76130   CANDELARIA                                 1797
10         76      76147      CARTAGO                                 1863
   MPIO_NAREA MPIO_NANO      DPTO_CNMBR Shape_Leng  Shape_Area
1   563.04276      2017 VALLE DEL CAUCA  1.1636697 0.045733211
2   110.46042      2017 VALLE DEL CAUCA  0.6651004 0.008984851
3   305.45118      2017 VALLE DEL CAUCA  0.9460442 0.024871077
4    90.79604      2017 VALLE DEL CAUCA  0.4538261 0.007391017
5   825.86513      2017 VALLE DEL CAUCA  2.0063716 0.067157337
6   396.78132      2017 VALLE DEL CAUCA  1.0336063 0.032279294
7   166.98369      2017 VALLE DEL CAUCA  0.6465900 0.013590500
8   793.49323      2017 VALLE DEL CAUCA  1.5441977 0.064484981
9   296.46056      2017 VALLE DEL CAUCA  0.8709866 0.024086066
10  248.16005      2017 VALLE DEL CAUCA  0.8955580 0.020211481
                         geometry
1  MULTIPOLYGON (((-76.59175 3...
2  MULTIPOLYGON (((-76.22406 4...
3  MULTIPOLYGON (((-76.01558 4...
4  MULTIPOLYGON (((-76.14316 4...
5  MULTIPOLYGON (((-76.31608 3...
6  MULTIPOLYGON (((-76.15131 4...
7  MULTIPOLYGON (((-75.8539 4....
8  MULTIPOLYGON (((-76.51747 4...
9  MULTIPOLYGON (((-76.30455 3...
10 MULTIPOLYGON (((-75.94518 4...

Calculemos el área de cada municipio:

mun_valle$KM2 <- st_area(st_transform(mun_valle, 3116))/1E6
mun_valle$KM2 <- as.numeric(mun_valle$KM2)
mun_valle$KM2 <- round(mun_valle$KM2,3)
min(mun_valle$KM2)
[1] 41.861
max(mun_valle$KM2)
[1] 6292.414

Hagamos un mapa de municipios:

library(leaflet)
bins <- c(0, 150, 300, 450, 600, 750, 900, 1200, 1600)
pal <- colorBin("RdYlGn", domain = mun_valle$KM2, bins = bins)

  mapa <- leaflet(data = mun_valle) %>%
  addTiles() %>%
  addPolygons(label = ~KM2,
              popup = ~MPIO_CNMBR,
              fillColor = ~pal(KM2),
              color = "#444444",
              weight = 1,
              smoothFactor = 0.5,
              opacity = 1.0,
              fillOpacity = 0.5,
              highlightOptions = highlightOptions(color = "white", weight = 2, bringToFront = TRUE)
              ) %>%
  addProviderTiles(providers$OpenStreetMap) %>%
  addLegend("bottomright", pal = pal, values = ~KM2,
    title = "Municipalities extent [Km2] (DANE, 2018)",
    opacity = 1
  )
Some values were outside the color scale and will be treated as NA
mapa

5. Unir atributos al objeto espacial

####5.1 La tarea de unión

Podemos usar la función left_join, proporcionada por el paquete dplyr, para unir los municipios y las estadísticas agrícolas.

Necesitamos un atributo común (o variable compartida) en el que basar la unión izquierda. El mejor atributo es una identificación. En mun_valle, el atributo MPIO_CCDGO parece estar bien. En eva_valle, el atributo correspondiente es COD_MUN.

Sin embargo, el atributo MPIO_CCDGO es una cadena:

class(mun_valle$MPIO_CCDGO)
[1] "character"

Y el atributo COD_MUN es numérico:

class(eva_valle$COD_MUN)
[1] "numeric"

Para poder hacer la unión, necesitamos cambiar tanto el tipo de datos como el contenido del código que identifica a cada municipio. Para esta tarea, es una buena idea crear una copia de los datos estadísticos originales. Con este enfoque, cualquier movimiento en falso no estropeará los datos originales.

5.2 Editar tareas

Procedamos paso a paso:

mun_valle$COD_MUN <-  as.double(mun_valle$MPIO_CCDGO)
class(mun_valle$COD_MUN)
[1] "numeric"

5.3 Seleccionar, filtrar y escribir estadísticas:

Vimos en un cuaderno anterior varias funciones para “editar” un tibble. Filtremos el tibble EVA por tipo de cultivo. Además, seleccionaremos varias columnas.

cafe_valle <- eva_valle %>%  filter(CULTIVO == "CAFE")  %>%  dplyr::select(MUNICIPIO, COD_MUN, YEAR, PERIODO, ton_Prod, RENDIM) 
cafe_valle
head(cafe_valle)
tail(cafe_valle)
unique(cafe_valle$YEAR)
 [1] 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018
unique(cafe_valle$PERIODO)
 [1] "2007" "2008" "2009" "2010" "2011" "2012" "2013" "2014" "2015" "2016"
[11] "2017" "2018"
cafe_valle %>% 
  gather("YEAR", "PERIODO", "ton_Prod", "RENDIM" , key = variable, value = number)
head(cafe_valle)
tail(cafe_valle)
summary(cafe_valle)
  MUNICIPIO            COD_MUN           YEAR        PERIODO         
 Length:468         Min.   :  761   Min.   :2007   Length:468        
 Class :character   1st Qu.:76041   1st Qu.:2010   Class :character  
 Mode  :character   Median :76248   Median :2012   Mode  :character  
                    Mean   :63721   Mean   :2012                     
                    3rd Qu.:76616   3rd Qu.:2015                     
                    Max.   :76892   Max.   :2018                     
    ton_Prod           RENDIM      
 Min.   :   14.0   Min.   :0.2000  
 1st Qu.:  346.0   1st Qu.:0.7000  
 Median :  659.5   Median :0.8800  
 Mean   : 1407.0   Mean   :0.8841  
 3rd Qu.: 1544.8   3rd Qu.:1.0500  
 Max.   :10154.0   Max.   :1.8700  

5.4 Conversión de formato largo a formato ancho

Antes de continuar, revisemos varias funciones proporcionadas por el paquete tidyr: - recopilar () hace que los datos “amplios” sean más largos - spread () hace que los datos “largos” sean más amplios - separar () divide una sola columna en varias columnas - unite () combina varias columnas en una sola columna

cafe_valle %>% replace(is.na(.), 0) -> cafe_valle2
cafe_valle %>% group_by(MUNICIPIO, COD_MUN, YEAR) %>%
   summarize(ton_Prod=sum(ton_Prod)) -> cafe_valle2
`summarise()` has grouped output by 'MUNICIPIO', 'COD_MUN'. You can override using the `.groups` argument.
head(cafe_valle2)
tail(cafe_valle2)
cafe_valle2 %>% 
  group_by(COD_MUN) %>% 
  gather("ton_Prod", key = variable, value = number)   %>% 
  unite(combi, variable, YEAR) %>%
  pivot_wider(names_from = combi, values_from = number, values_fill = 0) ->                                                                    cafe_valle3
head(cafe_valle3)
tail(cafe_valle3)

5.5 Unir atributos al objeto espacial

Ahora, podemos unir los atributos no espaciales al objeto de característica espacial simple:

mun_valle_cafe = left_join(mun_valle, cafe_valle3, by="COD_MUN")
summary(mun_valle_cafe)
  DPTO_CCDGO         MPIO_CCDGO         MPIO_CNMBR       
 Length:42          Length:42          Length:42         
 Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character  
                                                         
                                                         
                                                         
                                                         
  MPIO_CRSLC          MPIO_NAREA        MPIO_NANO     DPTO_CNMBR       
 Length:42          Min.   :  41.86   Min.   :2017   Length:42         
 Class :character   1st Qu.: 191.01   1st Qu.:2017   Class :character  
 Mode  :character   Median : 266.71   Median :2017   Mode  :character  
                    Mean   : 492.04   Mean   :2017                     
                    3rd Qu.: 431.81   3rd Qu.:2017                     
                    Max.   :6292.50   Max.   :2017                     
                                                                       
   Shape_Leng       Shape_Area            KM2             COD_MUN     
 Min.   :0.4538   Min.   :0.003409   Min.   :  41.86   Min.   :76001  
 1st Qu.:0.7223   1st Qu.:0.015552   1st Qu.: 191.01   1st Qu.:76127  
 Median :0.9059   Median :0.021696   Median : 266.72   Median :76341  
 Mean   :1.1602   Mean   :0.039988   Mean   : 492.04   Mean   :76413  
 3rd Qu.:1.3207   3rd Qu.:0.035099   3rd Qu.: 431.81   3rd Qu.:76658  
 Max.   :6.5953   Max.   :0.510779   Max.   :6292.41   Max.   :76895  
                                                                      
  MUNICIPIO         ton_Prod_2007    ton_Prod_2008    ton_Prod_2009   
 Length:42          Min.   :  36.0   Min.   :  85.0   Min.   :  42.0  
 Class :character   1st Qu.: 215.2   1st Qu.: 365.5   1st Qu.: 297.2  
 Mode  :character   Median : 573.0   Median : 610.5   Median : 746.0  
                    Mean   :1346.8   Mean   :1736.4   Mean   :1655.5  
                    3rd Qu.: 974.8   3rd Qu.:2106.8   3rd Qu.:1819.2  
                    Max.   :8284.0   Max.   :8284.0   Max.   :8764.0  
                    NA's   :10       NA's   :10       NA's   :10      
 ton_Prod_2010     ton_Prod_2011    ton_Prod_2012    ton_Prod_2013   
 Min.   :   90.0   Min.   :  86.0   Min.   :  14.0   Min.   :  75.0  
 1st Qu.:  452.5   1st Qu.: 450.2   1st Qu.: 433.2   1st Qu.: 351.0  
 Median :  869.5   Median : 987.0   Median : 772.0   Median : 548.5  
 Mean   : 1984.4   Mean   :1816.9   Mean   :1697.7   Mean   :1231.0  
 3rd Qu.: 2488.5   3rd Qu.:2137.0   3rd Qu.:2241.0   3rd Qu.:1457.2  
 Max.   :10154.0   Max.   :8377.0   Max.   :8587.0   Max.   :5161.0  
 NA's   :10        NA's   :10       NA's   :10       NA's   :10      
 ton_Prod_2014    ton_Prod_2015    ton_Prod_2016    ton_Prod_2017   
 Min.   : 100.0   Min.   : 138.0   Min.   : 162.0   Min.   : 142.0  
 1st Qu.: 382.2   1st Qu.: 463.5   1st Qu.: 482.0   1st Qu.: 419.8  
 Median : 614.0   Median : 750.5   Median : 786.5   Median : 668.0  
 Mean   :1395.6   Mean   :1587.9   Mean   :1611.5   Mean   :1402.8  
 3rd Qu.:1630.8   3rd Qu.:2210.2   3rd Qu.:2160.2   3rd Qu.:1928.2  
 Max.   :5757.0   Max.   :6108.0   Max.   :5895.0   Max.   :6212.0  
 NA's   :10       NA's   :10       NA's   :10       NA's   :10      
 ton_Prod_2018             geometry 
 Min.   : 139.0   MULTIPOLYGON :42  
 1st Qu.: 438.0   epsg:4326    : 0  
 Median : 737.5   +proj=long...: 0  
 Mean   :1386.5                     
 3rd Qu.:1855.5                     
 Max.   :5906.0                     
 NA's   :10                         
head(mun_valle_cafe[,1:10])
Simple feature collection with 6 features and 10 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: -76.70708 ymin: 3.273407 xmax: -75.8498 ymax: 4.888
geographic CRS: WGS 84
  DPTO_CCDGO MPIO_CCDGO   MPIO_CNMBR                       MPIO_CRSLC
1         76      76001         CALI                             1536
2         76      76036    ANDALUCÍA Ordenanza 38 de Abril 25 de 1921
3         76      76041 ANSERMANUEVO             Ordenanza 29 de 1925
4         76      76054      ARGELIA             Ordenanza 15 de 1956
5         76      76111         BUGA                             1555
6         76      76113 BUGALAGRANDE                             1791
  MPIO_NAREA MPIO_NANO      DPTO_CNMBR Shape_Leng  Shape_Area     KM2
1  563.04276      2017 VALLE DEL CAUCA  1.1636697 0.045733211 563.044
2  110.46042      2017 VALLE DEL CAUCA  0.6651004 0.008984851 110.460
3  305.45118      2017 VALLE DEL CAUCA  0.9460442 0.024871077 305.451
4   90.79604      2017 VALLE DEL CAUCA  0.4538261 0.007391017  90.796
5  825.86513      2017 VALLE DEL CAUCA  2.0063716 0.067157337 825.865
6  396.78132      2017 VALLE DEL CAUCA  1.0336063 0.032279294 396.781
                        geometry
1 MULTIPOLYGON (((-76.59175 3...
2 MULTIPOLYGON (((-76.22406 4...
3 MULTIPOLYGON (((-76.01558 4...
4 MULTIPOLYGON (((-76.14316 4...
5 MULTIPOLYGON (((-76.31608 3...
6 MULTIPOLYGON (((-76.15131 4...
tail(mun_valle_cafe[,1:10])
Simple feature collection with 6 features and 10 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: -77.54977 ymin: 3.091239 xmax: -76.03081 ymax: 4.59646
geographic CRS: WGS 84
   DPTO_CCDGO MPIO_CCDGO   MPIO_CNMBR           MPIO_CRSLC MPIO_NAREA
37         76      76400     LA UNIÓN Ordenanza 15 de 1890   120.8565
38         76      76377    LA CUMBRE                 1913   255.4149
39         76      76364      JAMUNDÍ                 1536   628.9328
40         76      76100      BOLÍVAR  Ordenanza 2 de 1884   743.5721
41         76      76233        DAGUA Ordenanza 23 de 1918   916.3248
42         76      76109 BUENAVENTURA                 1872  6292.5008
   MPIO_NANO      DPTO_CNMBR Shape_Leng  Shape_Area      KM2
37      2017 VALLE DEL CAUCA  0.5389192 0.009837728  120.875
38      2017 VALLE DEL CAUCA  1.0352627 0.020752137  255.415
39      2017 VALLE DEL CAUCA  1.6698163 0.051071669  628.933
40      2017 VALLE DEL CAUCA  1.5372119 0.060482648  743.572
41      2017 VALLE DEL CAUCA  1.7089016 0.074431347  916.325
42      2017 VALLE DEL CAUCA  6.5952727 0.510778519 6292.414
                         geometry
37 MULTIPOLYGON (((-76.06523 4...
38 MULTIPOLYGON (((-76.57613 3...
39 MULTIPOLYGON (((-76.70091 3...
40 MULTIPOLYGON (((-76.27584 4...
41 MULTIPOLYGON (((-76.79765 3...
42 MULTIPOLYGON (((-77.23178 4...

6. Mapa de la producción de café en los municipios de Valle del Cauca

Carguemos las bibliotecas necesarias para hacer el mapa:

library(RColorBrewer)
library(leaflet)

Hagamos un mapa de la producción total de café en 2018:

bins <- c(0, 100, 300, 1000, 3000, 3500, 4000, 4500, 5000, 5500, 6000)
pal <- colorBin("PiYG", domain = mun_valle_cafe$ton_Prod_2018, bins = bins)

  mapa2 <- leaflet(data = mun_valle_cafe) %>%
  addTiles() %>%
  addPolygons(label = ~ton_Prod_2018,
              popup = ~MPIO_CNMBR,
              fillColor = ~pal(ton_Prod_2018),
              color = "#444444",
              weight = 1,
              smoothFactor = 0.5,
              opacity = 1.0,
              fillOpacity = 0.5,
              highlightOptions = highlightOptions(color = "white", weight = 2, bringToFront = TRUE)
              ) %>%
  addProviderTiles(providers$OpenStreetMap) %>%
  addLegend("bottomright", pal = pal, values = ~ton_Prod_2018,
    title = "Producción de café en Valle del Cauca [Ton] (2018)",
    opacity = 1
  )
mapa2

7. Mapa del área cosechada de café en los municipios de Valle del Cauca

Ahora vamos a repetir el proceso para hacer un mapa diferente, en este caso el área cosechada de cultivo de café en cada municipio.

Recordemos los nombres de las variables EVA:

summary(eva_valle)
   COD_DEPTO     DEPTO              COD_MUN       MUNICIPIO        
 Min.   :76   Length:15774       Min.   :  761   Length:15774      
 1st Qu.:76   Class :character   1st Qu.:76041   Class :character  
 Median :76   Mode  :character   Median :76275   Mode  :character  
 Mean   :76                      Mean   :62048                     
 3rd Qu.:76                      3rd Qu.:76622                     
 Max.   :76                      Max.   :76895                     
                                                                   
    GRUPO             SUBGRUPO           CULTIVO         
 Length:15774       Length:15774       Length:15774      
 Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character  
                                                         
                                                         
                                                         
                                                         
   DESAGRE               YEAR        PERIODO            Ha_Siembra    
 Length:15774       Min.   :2006   Length:15774       Min.   :   0.0  
 Class :character   1st Qu.:2009   Class :character   1st Qu.:   6.0  
 Mode  :character   Median :2012   Mode  :character   Median :  16.0  
                    Mean   :2012                      Mean   : 102.7  
                    3rd Qu.:2015                      3rd Qu.:  50.0  
                    Max.   :2018                      Max.   :8781.0  
                                                                      
   Ha_cosecha         ton_Prod           RENDIM            CICLO          
 Min.   :    0.0   Min.   :      0   Min.   :    0.05   Length:15774      
 1st Qu.:    6.0   1st Qu.:     32   1st Qu.:    3.56   Class :character  
 Median :   16.0   Median :    112   Median :    8.39   Mode  :character  
 Mean   :  200.3   Mean   :  13686   Mean   :   20.87                     
 3rd Qu.:   55.0   3rd Qu.:    360   3rd Qu.:   15.00                     
 Max.   :32932.0   Max.   :4546116   Max.   :92010.00                     
                                     NA's   :141                          

Ahora, aplique las funciones de filtro y selección para obtener el área cosechada en café:

cafe_valle <- eva_valle %>%  filter(CULTIVO == "CAFE")  %>%  dplyr::select(MUNICIPIO, COD_MUN, YEAR, PERIODO, Ha_cosecha) 

Luego, agreguemos los valores PERIODO en YEAR:

cafe_valle %>% group_by(MUNICIPIO, COD_MUN, YEAR) %>%
   summarize(Ha_cosecha=sum(Ha_cosecha)) -> cafe_valle2
`summarise()` has grouped output by 'MUNICIPIO', 'COD_MUN'. You can override using the `.groups` argument.

Luego, cambiemos el formato de las estadísticas a un formato más amplio:

cafe_valle2 %>% 
  group_by(COD_MUN) %>% 
  gather("Ha_cosecha", key = variable, value = number)   %>% 
  unite(combi, variable, YEAR) %>%
  pivot_wider(names_from = combi, values_from = number, values_fill = 0) ->                                                                    cafe_valle3

Ahora es el momento de hacer el join:

mun_cafe_valle = left_join(mun_valle, cafe_valle3, by="COD_MUN")

Revisemos el resultado:

mun_cafe_valle
Simple feature collection with 42 features and 24 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: -77.54977 ymin: 3.091239 xmax: -75.70724 ymax: 5.047394
geographic CRS: WGS 84
First 10 features:
   DPTO_CCDGO MPIO_CCDGO   MPIO_CNMBR                           MPIO_CRSLC
1          76      76001         CALI                                 1536
2          76      76036    ANDALUCÍA     Ordenanza 38 de Abril 25 de 1921
3          76      76041 ANSERMANUEVO                 Ordenanza 29 de 1925
4          76      76054      ARGELIA                 Ordenanza 15 de 1956
5          76      76111         BUGA                                 1555
6          76      76113 BUGALAGRANDE                                 1791
7          76      76122   CAICEDONIA Ordenanza 21 del 20 de Abril de 1923
8          76      76126       CALIMA     Ordenanza 49 de Junio 23 de 1939
9          76      76130   CANDELARIA                                 1797
10         76      76147      CARTAGO                                 1863
   MPIO_NAREA MPIO_NANO      DPTO_CNMBR Shape_Leng  Shape_Area     KM2
1   563.04276      2017 VALLE DEL CAUCA  1.1636697 0.045733211 563.044
2   110.46042      2017 VALLE DEL CAUCA  0.6651004 0.008984851 110.460
3   305.45118      2017 VALLE DEL CAUCA  0.9460442 0.024871077 305.451
4    90.79604      2017 VALLE DEL CAUCA  0.4538261 0.007391017  90.796
5   825.86513      2017 VALLE DEL CAUCA  2.0063716 0.067157337 825.865
6   396.78132      2017 VALLE DEL CAUCA  1.0336063 0.032279294 396.781
7   166.98369      2017 VALLE DEL CAUCA  0.6465900 0.013590500 166.984
8   793.49323      2017 VALLE DEL CAUCA  1.5441977 0.064484981 793.497
9   296.46056      2017 VALLE DEL CAUCA  0.8709866 0.024086066 296.456
10  248.16005      2017 VALLE DEL CAUCA  0.8955580 0.020211481 248.224
   COD_MUN        MUNICIPIO Ha_cosecha_2007 Ha_cosecha_2008
1    76001             CALI             460             400
2    76036        ANDALUCIA             265             219
3    76041     ANSERMANUEVO            5992            5694
4    76054          ARGELIA            3365            2252
5    76111             BUGA             470             492
6    76113     BUGALAGRANDE            2323              23
7    76122       CAICEDONIA            5933            6119
8    76126 CALIMA EL DARIEN             600             633
9    76130             <NA>              NA              NA
10   76147          CARTAGO             695             495
   Ha_cosecha_2009 Ha_cosecha_2010 Ha_cosecha_2011 Ha_cosecha_2012
1              414             424             544             505
2              174             184             231             231
3             5254            5366            5434            4633
4             1983            2103            1983            2022
5              489             493             530             530
6             2219            2219             248             248
7             4774            4854            4615            4549
8              577             597             895             760
9               NA              NA              NA              NA
10             451             458             399             411
   Ha_cosecha_2013 Ha_cosecha_2014 Ha_cosecha_2015 Ha_cosecha_2016
1              514             606             606             590
2              257             243             210             195
3              427            4249            4125            3961
4             2107            2143            2109            1995
5              422             453             451             435
6              159            1566            1586            1557
7             3846            3722            3578            3421
8              356             399             385             367
9               NA              NA              NA              NA
10             289             339             343             308
   Ha_cosecha_2017 Ha_cosecha_2018                       geometry
1              616             614 MULTIPOLYGON (((-76.59175 3...
2              210             201 MULTIPOLYGON (((-76.22406 4...
3             3793            3283 MULTIPOLYGON (((-76.01558 4...
4             1931            1248 MULTIPOLYGON (((-76.14316 4...
5              430             415 MULTIPOLYGON (((-76.31608 3...
6             1535            1574 MULTIPOLYGON (((-76.15131 4...
7             3235            3174 MULTIPOLYGON (((-75.8539 4....
8              350             351 MULTIPOLYGON (((-76.51747 4...
9               NA              NA MULTIPOLYGON (((-76.30455 3...
10             279             294 MULTIPOLYGON (((-75.94518 4...

Finalmente, se hace el mapa:

bins <- c(0, 100, 500, 1000, 1500, 2000, 2500, 3000, 3500, 4000, 4500, 5000)
pal <- colorBin("Paired", domain = mun_cafe_valle$Ha_cosecha_2018, bins = bins)

  mapa3 <- leaflet(data = mun_cafe_valle) %>%
  addTiles() %>%
  addPolygons(label = ~Ha_cosecha_2018,
              popup = ~MPIO_CNMBR,
              fillColor = ~pal(Ha_cosecha_2018),
              color = "#444444",
              weight = 1,
              smoothFactor = 0.5,
              opacity = 1.0,
              fillOpacity = 0.5,
              highlightOptions = highlightOptions(color = "white", weight = 2, bringToFront = TRUE)
              ) %>%
  addProviderTiles(providers$OpenStreetMap) %>%
  addLegend("bottomright", pal = pal, values = ~Ha_cosecha_2018,
    title = "Área cosechada de café en Valle del Cauca [Ha] (2018)",
    opacity = 1
  )
mapa3
LS0tDQp0aXRsZTogIk1pIGN1YXJ0byBSIE5vdGVib29rOiBVbmllbmRvIGRhdG9zIGdlb2VzcGFjaWFsZXMgeSBhdHJpYnV0b3Mgbm8gZXNwYWNpYWxlcyBQYXJ0ZSAxIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQphdXRob3I6IEx1aXNhIEZlcm5hbmRhIENhcnJpw7NuIFJhbcOtcmV6IHkgTWlndWVsIFNhbnRpYWdvIE1vcmFsZXMgUnXDrXoNCi0tLQ0KDQojIyMgMS4gSW50cm9kdWNjacOzbg0KDQpFc3RlIGVzIGVsIGN1YWRlcm5vIGRlIGN1YXRybyBxdWUgbG9zIGVzdHVkaWFudGVzIGRlIEdlb21hdGljYSBCYXNpY2EgZGViZW4gZXNjcmliaXIgcGFyYSBjb21lbnphciBjb24gUiAmIFJTdHVkaW8uIFN1IG9iamV0aXZvIGVzIGFwcmVuZGVyIGEgdW5pciBhdHJpYnV0b3Mgbm8gZXNwYWNpYWxlcyBjb24gZGF0b3MgZ2VvZXNwYWNpYWxlcy4gSWx1c3RyYXJlbW9zIGVsIHRlbWEgdW5pZW5kbyB1bmEgY2FyYWN0ZXLDrXN0aWNhIGVzcGFjaWFsIHF1ZSByZXByZXNlbnRhIGEgbG9zIG11bmljaXBpb3MgZGUgVmFsbGUgZGVsIENhdWNhIChlcyBkZWNpciwgdW4gc2hhcGVmaWxlIHByb3BvcmNpb25hZG8gcG9yIERBTkUsIDIwMTcpIHkgdW4gbWFyY28gZGUgZGF0b3Mgbm8gZXNwYWNpYWxlcyBjb24gZXN0YWTDrXN0aWNhcyBhZ3LDrWNvbGFzIChlcyBkZWNpciwgdW4gY3N2IHByb3BvcmNpb25hZG8gcG9yIGVsIE1pbmlzdGVyaW8gZGUgQWdyaWN1bHR1cmEgeSBEZXNhcnJvbGxvIFJ1cmFsLCAyMDIwKS4gLg0KDQojIyMgMi4gQ2FyZ2EgZGUgbGFzIGJpYmxpb3RlY2FzIG5lY2VzYXJpYXMNCg0KQ29tZW5jZW1vcyBhIGNhcmdhciB2YXJpYXMgYmlibGlvdGVjYXMsIGVuIHBhcnRpY3VsYXIgZHBseXI6DQoNCmBgYHtyfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShzZikNCmBgYA0KDQojIyMgMy4gTGVlciB1bmEgdGFibGEgY29uIGxhcyBlc3RhZMOtc3RpY2FzIGFncsOtY29sYXMNCg0KRW1wZXphbW9zIGxleWVuZG8gdW4gYXJjaGl2byBjb24gZXN0YWTDrXN0aWNhcyBkZSBFVkEgcGFyYSBWYWxsZSBkZWwgQ2F1Y2ENCi4NCmBgYHtyfQ0KZXZhX3ZhbGxlIDwtIHJlYWRfY3N2MihmaWxlID0gIkM6L1VzZXJzL0xVSVNBIENBUlJJT04vRG9jdW1lbnRzL0VWQV9maW5hbC5jc3YiKQ0KYGBgDQpgYGB7cn0NCmV2YV92YWxsZQ0KYGBgDQoNCiMjIyA0LiBMZWN0dXJhIGRlIHVuIHNoYXBlZmlsZSBjb24gbG9zIG11bmljaXBpb3MgZGUgVmFsbGUgZGVsIENhdWNhDQoNClV0aWxpemFyZW1vcyBlbCBzaGFwZWZpbGUgY29ycmVzcG9uZGllbnRlIGEgTWFyY28gR2VvZXN0YWRpc3RpY28gRGVwYXJ0YW1lbnRhbCBxdWUgc2UgZW5jdWVudHJhIGRpc3BvbmlibGUgZW4gREFORSBHZW9wb3J0YWwuDQoNCkNvbWVuY2Vtb3MgYSBsZWVyIGxvcyBkYXRvcyB1c2FuZG8gbGEgYmlibGlvdGVjYSBzZjoNCg0KYGBge3J9DQptdW5fdmFsbGUgPC0gc2Y6OnN0X3JlYWQoIkM6L1VzZXJzL0xVSVNBIENBUlJJT04vRG93bmxvYWRzLzc2X1ZBTExFX0RFTF9DQVVDQS9BRE1JTklTVFJBVElWTy9NR05fTVBJT19QT0xJVElDTy5zaHAiKQ0KYGBgDQoNCmBgYHtyfQ0KbXVuX3ZhbGxlDQpgYGANCkNhbGN1bGVtb3MgZWwgw6FyZWEgZGUgY2FkYSBtdW5pY2lwaW86DQoNCmBgYHtyfQ0KbXVuX3ZhbGxlJEtNMiA8LSBzdF9hcmVhKHN0X3RyYW5zZm9ybShtdW5fdmFsbGUsIDMxMTYpKS8xRTYNCmBgYA0KDQpgYGB7cn0NCm11bl92YWxsZSRLTTIgPC0gYXMubnVtZXJpYyhtdW5fdmFsbGUkS00yKQ0KYGBgDQoNCmBgYHtyfQ0KbXVuX3ZhbGxlJEtNMiA8LSByb3VuZChtdW5fdmFsbGUkS00yLDMpDQpgYGANCg0KYGBge3J9DQptaW4obXVuX3ZhbGxlJEtNMikNCmBgYA0KDQpgYGB7cn0NCm1heChtdW5fdmFsbGUkS00yKQ0KYGBgDQpIYWdhbW9zIHVuIG1hcGEgZGUgbXVuaWNpcGlvczoNCg0KYGBge3J9DQpsaWJyYXJ5KGxlYWZsZXQpDQpiaW5zIDwtIGMoMCwgMTUwLCAzMDAsIDQ1MCwgNjAwLCA3NTAsIDkwMCwgMTIwMCwgMTYwMCkNCnBhbCA8LSBjb2xvckJpbigiUmRZbEduIiwgZG9tYWluID0gbXVuX3ZhbGxlJEtNMiwgYmlucyA9IGJpbnMpDQoNCiAgbWFwYSA8LSBsZWFmbGV0KGRhdGEgPSBtdW5fdmFsbGUpICU+JQ0KICBhZGRUaWxlcygpICU+JQ0KICBhZGRQb2x5Z29ucyhsYWJlbCA9IH5LTTIsDQogICAgICAgICAgICAgIHBvcHVwID0gfk1QSU9fQ05NQlIsDQogICAgICAgICAgICAgIGZpbGxDb2xvciA9IH5wYWwoS00yKSwNCiAgICAgICAgICAgICAgY29sb3IgPSAiIzQ0NDQ0NCIsDQogICAgICAgICAgICAgIHdlaWdodCA9IDEsDQogICAgICAgICAgICAgIHNtb290aEZhY3RvciA9IDAuNSwNCiAgICAgICAgICAgICAgb3BhY2l0eSA9IDEuMCwNCiAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAwLjUsDQogICAgICAgICAgICAgIGhpZ2hsaWdodE9wdGlvbnMgPSBoaWdobGlnaHRPcHRpb25zKGNvbG9yID0gIndoaXRlIiwgd2VpZ2h0ID0gMiwgYnJpbmdUb0Zyb250ID0gVFJVRSkNCiAgICAgICAgICAgICAgKSAlPiUNCiAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkT3BlblN0cmVldE1hcCkgJT4lDQogIGFkZExlZ2VuZCgiYm90dG9tcmlnaHQiLCBwYWwgPSBwYWwsIHZhbHVlcyA9IH5LTTIsDQogICAgdGl0bGUgPSAiTXVuaWNpcGFsaXRpZXMgZXh0ZW50IFtLbTJdIChEQU5FLCAyMDE4KSIsDQogICAgb3BhY2l0eSA9IDENCiAgKQ0KYGBgDQoNCmBgYHtyfQ0KbWFwYQ0KYGBgDQoNCiMjIyA1LiBVbmlyIGF0cmlidXRvcyBhbCBvYmpldG8gZXNwYWNpYWwNCg0KIyMjIzUuMSBMYSB0YXJlYSBkZSB1bmnDs24NCg0KUG9kZW1vcyB1c2FyIGxhIGZ1bmNpw7NuIGxlZnRfam9pbiwgcHJvcG9yY2lvbmFkYSBwb3IgZWwgcGFxdWV0ZSBkcGx5ciwgcGFyYSB1bmlyIGxvcyBtdW5pY2lwaW9zIHkgbGFzIGVzdGFkw61zdGljYXMgYWdyw61jb2xhcy4NCg0KTmVjZXNpdGFtb3MgdW4gYXRyaWJ1dG8gY29tw7puIChvIHZhcmlhYmxlIGNvbXBhcnRpZGEpIGVuIGVsIHF1ZSBiYXNhciBsYSB1bmnDs24gaXpxdWllcmRhLiBFbCBtZWpvciBhdHJpYnV0byBlcyB1bmEgaWRlbnRpZmljYWNpw7NuLiBFbiBtdW5fdmFsbGUsIGVsIGF0cmlidXRvIE1QSU9fQ0NER08gcGFyZWNlIGVzdGFyIGJpZW4uIEVuIGV2YV92YWxsZSwgZWwgYXRyaWJ1dG8gY29ycmVzcG9uZGllbnRlIGVzIENPRF9NVU4uDQoNClNpbiBlbWJhcmdvLCBlbCBhdHJpYnV0byBNUElPX0NDREdPIGVzIHVuYSBjYWRlbmE6DQoNCmBgYHtyfQ0KY2xhc3MobXVuX3ZhbGxlJE1QSU9fQ0NER08pDQpgYGANClkgZWwgYXRyaWJ1dG8gQ09EX01VTiBlcyBudW3DqXJpY286DQoNCmBgYHtyfQ0KY2xhc3MoZXZhX3ZhbGxlJENPRF9NVU4pDQpgYGANClBhcmEgcG9kZXIgaGFjZXIgbGEgdW5pw7NuLCBuZWNlc2l0YW1vcyBjYW1iaWFyIHRhbnRvIGVsIHRpcG8gZGUgZGF0b3MgY29tbyBlbCBjb250ZW5pZG8gZGVsIGPDs2RpZ28gcXVlIGlkZW50aWZpY2EgYSBjYWRhIG11bmljaXBpby4gUGFyYSBlc3RhIHRhcmVhLCBlcyB1bmEgYnVlbmEgaWRlYSBjcmVhciB1bmEgY29waWEgZGUgbG9zIGRhdG9zIGVzdGFkw61zdGljb3Mgb3JpZ2luYWxlcy4gQ29uIGVzdGUgZW5mb3F1ZSwgY3VhbHF1aWVyIG1vdmltaWVudG8gZW4gZmFsc28gbm8gZXN0cm9wZWFyw6EgbG9zIGRhdG9zIG9yaWdpbmFsZXMuDQoNCiMjIyMgNS4yIEVkaXRhciB0YXJlYXMNCg0KUHJvY2VkYW1vcyBwYXNvIGEgcGFzbzoNCg0KYGBge3J9DQptdW5fdmFsbGUkQ09EX01VTiA8LSAgYXMuZG91YmxlKG11bl92YWxsZSRNUElPX0NDREdPKQ0KYGBgDQoNCmBgYHtyfQ0KY2xhc3MobXVuX3ZhbGxlJENPRF9NVU4pDQpgYGANCiMjIyMgNS4zIFNlbGVjY2lvbmFyLCBmaWx0cmFyIHkgZXNjcmliaXIgZXN0YWTDrXN0aWNhczoNCg0KVmltb3MgZW4gdW4gY3VhZGVybm8gYW50ZXJpb3IgdmFyaWFzIGZ1bmNpb25lcyBwYXJhIOKAnGVkaXRhcuKAnSB1biB0aWJibGUuIEZpbHRyZW1vcyBlbCB0aWJibGUgRVZBIHBvciB0aXBvIGRlIGN1bHRpdm8uIEFkZW3DoXMsIHNlbGVjY2lvbmFyZW1vcyB2YXJpYXMgY29sdW1uYXMuDQpgYGB7cn0NCmNhZmVfdmFsbGUgPC0gZXZhX3ZhbGxlICU+JSAgZmlsdGVyKENVTFRJVk8gPT0gIkNBRkUiKSAgJT4lICBkcGx5cjo6c2VsZWN0KE1VTklDSVBJTywgQ09EX01VTiwgWUVBUiwgUEVSSU9ETywgdG9uX1Byb2QsIFJFTkRJTSkgDQpgYGANCg0KYGBge3J9DQpjYWZlX3ZhbGxlDQpgYGANCg0KYGBge3J9DQpoZWFkKGNhZmVfdmFsbGUpDQpgYGANCg0KYGBge3J9DQp0YWlsKGNhZmVfdmFsbGUpDQpgYGANCg0KYGBge3J9DQp1bmlxdWUoY2FmZV92YWxsZSRZRUFSKQ0KYGBgDQoNCmBgYHtyfQ0KdW5pcXVlKGNhZmVfdmFsbGUkUEVSSU9ETykNCmBgYA0KDQpgYGB7cn0NCmNhZmVfdmFsbGUgJT4lIA0KICBnYXRoZXIoIllFQVIiLCAiUEVSSU9ETyIsICJ0b25fUHJvZCIsICJSRU5ESU0iICwga2V5ID0gdmFyaWFibGUsIHZhbHVlID0gbnVtYmVyKQ0KYGBgDQoNCmBgYHtyfQ0KaGVhZChjYWZlX3ZhbGxlKQ0KYGBgDQoNCmBgYHtyfQ0KdGFpbChjYWZlX3ZhbGxlKQ0KYGBgDQoNCmBgYHtyfQ0Kc3VtbWFyeShjYWZlX3ZhbGxlKQ0KYGBgDQoNCiMjIyMgNS40IENvbnZlcnNpw7NuIGRlIGZvcm1hdG8gbGFyZ28gYSBmb3JtYXRvIGFuY2hvDQoNCkFudGVzIGRlIGNvbnRpbnVhciwgcmV2aXNlbW9zIHZhcmlhcyBmdW5jaW9uZXMgcHJvcG9yY2lvbmFkYXMgcG9yIGVsIHBhcXVldGUgdGlkeXI6IC0gcmVjb3BpbGFyICgpIGhhY2UgcXVlIGxvcyBkYXRvcyAiYW1wbGlvcyIgc2VhbiBtw6FzIGxhcmdvcyAtIHNwcmVhZCAoKSBoYWNlIHF1ZSBsb3MgZGF0b3MgImxhcmdvcyIgc2VhbiBtw6FzIGFtcGxpb3MgLSBzZXBhcmFyICgpIGRpdmlkZSB1bmEgc29sYSBjb2x1bW5hIGVuIHZhcmlhcyBjb2x1bW5hcyAtIHVuaXRlICgpIGNvbWJpbmEgdmFyaWFzIGNvbHVtbmFzIGVuIHVuYSBzb2xhIGNvbHVtbmENCg0KYGBge3J9DQpjYWZlX3ZhbGxlICU+JSByZXBsYWNlKGlzLm5hKC4pLCAwKSAtPiBjYWZlX3ZhbGxlMg0KYGBgDQoNCmBgYHtyfQ0KY2FmZV92YWxsZSAlPiUgZ3JvdXBfYnkoTVVOSUNJUElPLCBDT0RfTVVOLCBZRUFSKSAlPiUNCiAgIHN1bW1hcml6ZSh0b25fUHJvZD1zdW0odG9uX1Byb2QpKSAtPiBjYWZlX3ZhbGxlMg0KYGBgDQoNCmBgYHtyfQ0KaGVhZChjYWZlX3ZhbGxlMikNCmBgYA0KDQpgYGB7cn0NCnRhaWwoY2FmZV92YWxsZTIpDQpgYGANCg0KYGBge3J9DQpjYWZlX3ZhbGxlMiAlPiUgDQogIGdyb3VwX2J5KENPRF9NVU4pICU+JSANCiAgZ2F0aGVyKCJ0b25fUHJvZCIsIGtleSA9IHZhcmlhYmxlLCB2YWx1ZSA9IG51bWJlcikgICAlPiUgDQogIHVuaXRlKGNvbWJpLCB2YXJpYWJsZSwgWUVBUikgJT4lDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBjb21iaSwgdmFsdWVzX2Zyb20gPSBudW1iZXIsIHZhbHVlc19maWxsID0gMCkgLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhZmVfdmFsbGUzDQpgYGANCg0KYGBge3J9DQpoZWFkKGNhZmVfdmFsbGUzKQ0KYGBgDQoNCmBgYHtyfQ0KdGFpbChjYWZlX3ZhbGxlMykNCmBgYA0KDQojIyMjIDUuNSBVbmlyIGF0cmlidXRvcyBhbCBvYmpldG8gZXNwYWNpYWwNCg0KQWhvcmEsIHBvZGVtb3MgdW5pciBsb3MgYXRyaWJ1dG9zIG5vIGVzcGFjaWFsZXMgYWwgb2JqZXRvIGRlIGNhcmFjdGVyw61zdGljYSBlc3BhY2lhbCBzaW1wbGU6DQoNCmBgYHtyfQ0KbXVuX3ZhbGxlX2NhZmUgPSBsZWZ0X2pvaW4obXVuX3ZhbGxlLCBjYWZlX3ZhbGxlMywgYnk9IkNPRF9NVU4iKQ0KYGBgDQoNCmBgYHtyfQ0Kc3VtbWFyeShtdW5fdmFsbGVfY2FmZSkNCmBgYA0KDQpgYGB7cn0NCmhlYWQobXVuX3ZhbGxlX2NhZmVbLDE6MTBdKQ0KYGBgDQoNCg0KYGBge3J9DQp0YWlsKG11bl92YWxsZV9jYWZlWywxOjEwXSkNCmBgYA0KDQojIyMgNi4gTWFwYSBkZSBsYSBwcm9kdWNjacOzbiBkZSBjYWbDqSBlbiBsb3MgbXVuaWNpcGlvcyBkZSBWYWxsZSBkZWwgQ2F1Y2ENCg0KQ2FyZ3VlbW9zIGxhcyBiaWJsaW90ZWNhcyBuZWNlc2FyaWFzIHBhcmEgaGFjZXIgZWwgbWFwYToNCg0KYGBge3J9DQpsaWJyYXJ5KFJDb2xvckJyZXdlcikNCmxpYnJhcnkobGVhZmxldCkNCmBgYA0KDQpIYWdhbW9zIHVuIG1hcGEgZGUgbGEgcHJvZHVjY2nDs24gdG90YWwgZGUgY2Fmw6kgZW4gMjAxODoNCg0KYGBge3J9DQpiaW5zIDwtIGMoMCwgMTAwLCAzMDAsIDEwMDAsIDMwMDAsIDM1MDAsIDQwMDAsIDQ1MDAsIDUwMDAsIDU1MDAsIDYwMDApDQpwYWwgPC0gY29sb3JCaW4oIlBpWUciLCBkb21haW4gPSBtdW5fdmFsbGVfY2FmZSR0b25fUHJvZF8yMDE4LCBiaW5zID0gYmlucykNCg0KICBtYXBhMiA8LSBsZWFmbGV0KGRhdGEgPSBtdW5fdmFsbGVfY2FmZSkgJT4lDQogIGFkZFRpbGVzKCkgJT4lDQogIGFkZFBvbHlnb25zKGxhYmVsID0gfnRvbl9Qcm9kXzIwMTgsDQogICAgICAgICAgICAgIHBvcHVwID0gfk1QSU9fQ05NQlIsDQogICAgICAgICAgICAgIGZpbGxDb2xvciA9IH5wYWwodG9uX1Byb2RfMjAxOCksDQogICAgICAgICAgICAgIGNvbG9yID0gIiM0NDQ0NDQiLA0KICAgICAgICAgICAgICB3ZWlnaHQgPSAxLA0KICAgICAgICAgICAgICBzbW9vdGhGYWN0b3IgPSAwLjUsDQogICAgICAgICAgICAgIG9wYWNpdHkgPSAxLjAsDQogICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gMC41LA0KICAgICAgICAgICAgICBoaWdobGlnaHRPcHRpb25zID0gaGlnaGxpZ2h0T3B0aW9ucyhjb2xvciA9ICJ3aGl0ZSIsIHdlaWdodCA9IDIsIGJyaW5nVG9Gcm9udCA9IFRSVUUpDQogICAgICAgICAgICAgICkgJT4lDQogIGFkZFByb3ZpZGVyVGlsZXMocHJvdmlkZXJzJE9wZW5TdHJlZXRNYXApICU+JQ0KICBhZGRMZWdlbmQoImJvdHRvbXJpZ2h0IiwgcGFsID0gcGFsLCB2YWx1ZXMgPSB+dG9uX1Byb2RfMjAxOCwNCiAgICB0aXRsZSA9ICJQcm9kdWNjacOzbiBkZSBjYWbDqSBlbiBWYWxsZSBkZWwgQ2F1Y2EgW1Rvbl0gKDIwMTgpIiwNCiAgICBvcGFjaXR5ID0gMQ0KICApDQpgYGANCg0KYGBge3J9DQptYXBhMg0KYGBgDQoNCiMjIyA3LiBNYXBhIGRlbCDDoXJlYSBjb3NlY2hhZGEgZGUgY2Fmw6kgZW4gbG9zIG11bmljaXBpb3MgZGUgVmFsbGUgZGVsIENhdWNhDQoNCkFob3JhIHZhbW9zIGEgcmVwZXRpciBlbCBwcm9jZXNvIHBhcmEgaGFjZXIgdW4gbWFwYSBkaWZlcmVudGUsIGVuIGVzdGUgY2FzbyBlbCDDoXJlYSBjb3NlY2hhZGEgZGUgY3VsdGl2byBkZSBjYWbDqSBlbiBjYWRhIG11bmljaXBpby4NCg0KUmVjb3JkZW1vcyBsb3Mgbm9tYnJlcyBkZSBsYXMgdmFyaWFibGVzIEVWQToNCg0KYGBge3J9DQpzdW1tYXJ5KGV2YV92YWxsZSkNCmBgYA0KQWhvcmEsIGFwbGlxdWUgbGFzIGZ1bmNpb25lcyBkZSBmaWx0cm8geSBzZWxlY2Npw7NuIHBhcmEgb2J0ZW5lciBlbCDDoXJlYSBjb3NlY2hhZGEgZW4gY2Fmw6k6DQoNCmBgYHtyfQ0KY2FmZV92YWxsZSA8LSBldmFfdmFsbGUgJT4lICBmaWx0ZXIoQ1VMVElWTyA9PSAiQ0FGRSIpICAlPiUgIGRwbHlyOjpzZWxlY3QoTVVOSUNJUElPLCBDT0RfTVVOLCBZRUFSLCBQRVJJT0RPLCBIYV9jb3NlY2hhKSANCmBgYA0KDQpMdWVnbywgYWdyZWd1ZW1vcyBsb3MgdmFsb3JlcyBQRVJJT0RPIGVuIFlFQVI6DQoNCmBgYHtyfQ0KY2FmZV92YWxsZSAlPiUgZ3JvdXBfYnkoTVVOSUNJUElPLCBDT0RfTVVOLCBZRUFSKSAlPiUNCiAgIHN1bW1hcml6ZShIYV9jb3NlY2hhPXN1bShIYV9jb3NlY2hhKSkgLT4gY2FmZV92YWxsZTINCmBgYA0KTHVlZ28sIGNhbWJpZW1vcyBlbCBmb3JtYXRvIGRlIGxhcyBlc3RhZMOtc3RpY2FzIGEgdW4gZm9ybWF0byBtw6FzIGFtcGxpbzoNCg0KYGBge3J9DQpjYWZlX3ZhbGxlMiAlPiUgDQogIGdyb3VwX2J5KENPRF9NVU4pICU+JSANCiAgZ2F0aGVyKCJIYV9jb3NlY2hhIiwga2V5ID0gdmFyaWFibGUsIHZhbHVlID0gbnVtYmVyKSAgICU+JSANCiAgdW5pdGUoY29tYmksIHZhcmlhYmxlLCBZRUFSKSAlPiUNCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGNvbWJpLCB2YWx1ZXNfZnJvbSA9IG51bWJlciwgdmFsdWVzX2ZpbGwgPSAwKSAtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FmZV92YWxsZTMNCmBgYA0KDQpBaG9yYSBlcyBlbCBtb21lbnRvIGRlIGhhY2VyIGVsIGpvaW46DQpgYGB7cn0NCm11bl9jYWZlX3ZhbGxlID0gbGVmdF9qb2luKG11bl92YWxsZSwgY2FmZV92YWxsZTMsIGJ5PSJDT0RfTVVOIikNCmBgYA0KDQpSZXZpc2Vtb3MgZWwgcmVzdWx0YWRvOg0KDQpgYGB7cn0NCm11bl9jYWZlX3ZhbGxlDQpgYGANCg0KRmluYWxtZW50ZSwgc2UgaGFjZSBlbCBtYXBhOg0KDQpgYGB7cn0NCmJpbnMgPC0gYygwLCAxMDAsIDUwMCwgMTAwMCwgMTUwMCwgMjAwMCwgMjUwMCwgMzAwMCwgMzUwMCwgNDAwMCwgNDUwMCwgNTAwMCkNCnBhbCA8LSBjb2xvckJpbigiUGFpcmVkIiwgZG9tYWluID0gbXVuX2NhZmVfdmFsbGUkSGFfY29zZWNoYV8yMDE4LCBiaW5zID0gYmlucykNCg0KICBtYXBhMyA8LSBsZWFmbGV0KGRhdGEgPSBtdW5fY2FmZV92YWxsZSkgJT4lDQogIGFkZFRpbGVzKCkgJT4lDQogIGFkZFBvbHlnb25zKGxhYmVsID0gfkhhX2Nvc2VjaGFfMjAxOCwNCiAgICAgICAgICAgICAgcG9wdXAgPSB+TVBJT19DTk1CUiwNCiAgICAgICAgICAgICAgZmlsbENvbG9yID0gfnBhbChIYV9jb3NlY2hhXzIwMTgpLA0KICAgICAgICAgICAgICBjb2xvciA9ICIjNDQ0NDQ0IiwNCiAgICAgICAgICAgICAgd2VpZ2h0ID0gMSwNCiAgICAgICAgICAgICAgc21vb3RoRmFjdG9yID0gMC41LA0KICAgICAgICAgICAgICBvcGFjaXR5ID0gMS4wLA0KICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDAuNSwNCiAgICAgICAgICAgICAgaGlnaGxpZ2h0T3B0aW9ucyA9IGhpZ2hsaWdodE9wdGlvbnMoY29sb3IgPSAid2hpdGUiLCB3ZWlnaHQgPSAyLCBicmluZ1RvRnJvbnQgPSBUUlVFKQ0KICAgICAgICAgICAgICApICU+JQ0KICBhZGRQcm92aWRlclRpbGVzKHByb3ZpZGVycyRPcGVuU3RyZWV0TWFwKSAlPiUNCiAgYWRkTGVnZW5kKCJib3R0b21yaWdodCIsIHBhbCA9IHBhbCwgdmFsdWVzID0gfkhhX2Nvc2VjaGFfMjAxOCwNCiAgICB0aXRsZSA9ICLDgXJlYSBjb3NlY2hhZGEgZGUgY2Fmw6kgZW4gVmFsbGUgZGVsIENhdWNhIFtIYV0gKDIwMTgpIiwNCiAgICBvcGFjaXR5ID0gMQ0KICApDQpgYGANCg0KYGBge3J9DQptYXBhMw0KYGBgDQoNCg0KDQoNCg0K