Módulo 1 - Actividad 1

Equipo 2

2024-04-04

Librerias

library(foreign)
library(dplyr)
library(spdep)
library(tigris)
library(rgeoda)
library(RColorBrewer)
library(viridis)
library(ggplot2)
library(tmap)
library(sf)
library(sp)
library(readxl)
library(tidyr)

Situación Problema A

El nearshoring “relocalización de proyectos de negocios”, “se refiere a una estrategia en que las empresas buscan reconfigurar sus cadenas de valor, haciéndolas más cortas y acercando los centros de producción con los mercados finales”. Con base en dicha definición, la localización geográfica y cercanía con el mercado de Estados Unidos representa para México una ventaja estratégica para la atracción de proyectos de inversión nearshoring. ¿Cuál es la tendencia actual del nearshoring para el caso de México? ¿Cómo es la distribución de flujos de inversión extranjera directa (IED) entre los estados de México? ¿Existen un patrón espacial y/o regional de la distribución de la IED durante los últimos años? ¿Qué tipo de características de los estados serían atractivas para la atracción de IED? ¿Se justifica el uso de un análisis espacial de datos para la predicción del nearshoring?

1) Brevemente, describir con sus propias palabras qué es un ESDA y cuál es su principal propósito en el proceso de analítica de datos.

El ESDA (Exploratory Spatial Data Analysis) es un tipo de análisis exploratorio, primero definamos el concepto base : EDA. El Análisis Exploratorio de Datos (EDA) es un proceso fundamental en la analítica de datos. Su principal propósito es comprender la naturaleza de los datos, identificar patrones, valores atípicos y relaciones antes de realizar un análisis más profundo.Este proceso implica inspeccionar, limpiar, transformar y modelar bases de datos. Su principal objetivo es descubrir información útil, llegar a conclusiones y respaldar la toma de decisiones.

Ahora bien, un ESDA es una técnica basada en la ciencia de la información geográfica (GIS) que permite describir y visualizar distribuciones espaciales. Su objetivo principal es dentificar ubicaciones atípicas o valores extremos en el espacio así como descubrir patrones de asociación espacial, agrupamientos o hot spots que puedan ser representados de manera numérica y visual a través de varios métodos.

2) Brevemente, describir con sus propias palabras el concepto de autocorrelación espacial así como 1-2 ejemplos relacionados con dicho concepto.

La autocorrelación es una característica de los datos que muestra el grado de similitud entre los valores de las mismas variables en intervalos de tiempo sucesivos. En contraste, la autocorrelación espacial se refiere a la similitud espacial entre los valores de una variable en un conjunto de datos geográfico. En otras palabras, busca patrones de dependencia espacial. Si los valores similares tienden a agruparse o dispersarse en el espacio, estamos hablando de autocorrelación espacial.

Esta característica se mide a través del Índice de Moran (I de Moran).

Si el índice es cercano a +1, hay autocorrelación espacial positiva:

  • Los valores similares se agrupan en el espacio.

  • Ejemplo: Temperaturas altas cerca de otras temperaturas altas.

Si el índice es cercano a -1, hay autocorrelación espacial negativa:

  • Los valores disímiles se agrupan.

  • Ejemplo: Áreas densamente pobladas rodeadas de áreas poco pobladas.

Este fenómeno se puede apreciar en la siguiente imágen:

Tipos de autocorrelación espacial -Fuente: Garza (2014)
Tipos de autocorrelación espacial -Fuente: Garza (2014)

3) Con base en el archivo de datos asignado realizar selección de variables y elaborar ESDA que incluye:

Importing dataset

covid <- read_excel("cross_sectional_dataset.xlsx") 
covid[sapply(covid, is.numeric)] <- lapply(covid[sapply(covid, is.numeric)], function(x) ifelse(is.na(x), mean(x, na.rm = TRUE), x))

Importing shapefile

# Mexico's states (32) 
mx_state_map <- st_read("C:/Users/maxca/Documents/Planación estratégica/Modulo 1/Actividades/mx_maps/mx_states/mexlatlong.shp")
## Reading layer `mexlatlong' from data source 
##   `C:\Users\maxca\Documents\Planación estratégica\Modulo 1\Actividades\mx_maps\mx_states\mexlatlong.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 32 features and 19 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -118.4042 ymin: 14.55055 xmax: -86.73862 ymax: 32.71846
## Geodetic CRS:  WGS 84
# Mexico's Municipios (2,457)
mx_mpio_map <- st_read("C:/Users/maxca/Documents/Planación estratégica/Modulo 1/Actividades/mx_maps/mx_mpios/Mexican Municipalities.shp")
## Reading layer `Mexican Municipalities' from data source 
##   `C:\Users\maxca\Documents\Planación estratégica\Modulo 1\Actividades\mx_maps\mx_mpios\Mexican Municipalities.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 2456 features and 3 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -118.4076 ymin: 14.5321 xmax: -86.71041 ymax: 32.71865
## Geodetic CRS:  WGS 84
# merging dataset 

#mpio_geodata  <- geo_join(mx_mpio_map,covid,'IDUNICO','clave_municipio',how='inner')

mpio_geodata <- inner_join(mx_mpio_map, covid, by = c("IDUNICO" = "clave_municipio"))

a. Estadísticos Descripitvos (Global y Regional). Incluir elementos gráficos (histogramas, gráfico de barras, etc.).

str(covid[,4:21])
## tibble [2,457 × 18] (S3: tbl_df/tbl/data.frame)
##  $ numero_hospitales             : num [1:2457] 1289 22 50 8 60 ...
##  $ poblacion_2022                : num [1:2457] 961977 50864 60760 16918 130184 ...
##  $ hogrem2015                    : num [1:2457] 4.82 12.87 25.85 14.29 5.72 ...
##  $ hogremjefmuj2015              : num [1:2457] 27.8 22.1 25.6 21.2 19.9 ...
##  $ popnoafmed2015                : num [1:2457] 14.34 5.77 9.97 5.28 14.02 ...
##  $ gini2015                      : num [1:2457] 0.392 0.37 0.375 0.37 0.402 0.389 0.396 0.418 0.371 0.37 ...
##  $ popden2020                    : num [1:2457] 812 94.1 62.5 131.9 260.3 ...
##  $ crimen_2018                   : num [1:2457] 7.36 7.81 8.4 17.86 5.14 ...
##  $ crimen_2019                   : num [1:2457] 8.15 5.78 8.31 0 10.98 ...
##  $ inclusion_fin_2019            : num [1:2457] 1.78 0 1.16 0 0.36 1.2 1.03 0 0 0 ...
##  $ porcentaje_pob_pobreza        : num [1:2457] 23.7 40.1 45.8 37 26.3 ...
##  $ porcentaje_pob_pobreza_ext    : num [1:2457] 1.97 4.14 4.5 3.38 3.29 2.88 5.56 2.32 3.15 4.81 ...
##  $ porcentaje_pob_servicios_salud: num [1:2457] 20 16.5 21 17.6 21.1 ...
##  $ porcentaje_pob_acceso_ss      : num [1:2457] 37.8 62.1 76.2 47.5 41.9 ...
##  $ pob_6-14_no_edu               : num [1:2457] 4.6 6.29 6.95 5.7 5.88 4.44 4.38 5.74 5.37 4.4 ...
##  $ rezago_social                 : num [1:2457] -1.32 -0.86 -0.92 -1 -1.17 -1.17 -1.07 -0.96 -0.9 -0.83 ...
##  $ grado_rs                      : chr [1:2457] "Muy bajo" "Muy bajo" "Muy bajo" "Muy bajo" ...
##  $ feb_2020                      : num [1:2457] 0 0 0 0 0 0 0 0 0 0 ...
summary(covid[,4:21])
##  numero_hospitales poblacion_2022      hogrem2015     hogremjefmuj2015
##  Min.   :   1.00   Min.   :     95   Min.   : 0.000   Min.   : 0.00   
##  1st Qu.:   3.00   1st Qu.:   4546   1st Qu.: 2.296   1st Qu.:22.15   
##  Median :   8.00   Median :  14240   Median : 5.357   Median :26.02   
##  Mean   :  47.34   Mean   :  52158   Mean   : 8.562   Mean   :25.86   
##  3rd Qu.:  24.00   3rd Qu.:  37628   3rd Qu.:11.934   3rd Qu.:29.51   
##  Max.   :2744.00   Max.   :1815551   Max.   :52.027   Max.   :48.24   
##  popnoafmed2015      gini2015        popden2020        crimen_2018    
##  Min.   : 1.124   Min.   :0.3030   Min.   :    0.16   Min.   :  0.00  
##  1st Qu.: 9.746   1st Qu.:0.3690   1st Qu.:   17.79   1st Qu.:  0.00  
##  Median :13.702   Median :0.3870   Median :   52.85   Median :  9.77  
##  Mean   :14.938   Mean   :0.3916   Mean   :  313.09   Mean   : 19.03  
##  3rd Qu.:19.224   3rd Qu.:0.4100   3rd Qu.:  145.07   3rd Qu.: 25.61  
##  Max.   :62.101   Max.   :0.6400   Max.   :56489.74   Max.   :719.42  
##   crimen_2019     inclusion_fin_2019 porcentaje_pob_pobreza
##  Min.   :  0.00   Min.   : 0.0000    Min.   : 5.45         
##  1st Qu.:  0.00   1st Qu.: 0.0000    1st Qu.:45.61         
##  Median : 11.54   Median : 0.0000    Median :62.43         
##  Mean   : 20.34   Mean   : 0.4892    Mean   :61.91         
##  3rd Qu.: 26.89   3rd Qu.: 0.8500    3rd Qu.:80.13         
##  Max.   :551.82   Max.   :10.6800    Max.   :99.65         
##  porcentaje_pob_pobreza_ext porcentaje_pob_servicios_salud
##  Min.   : 0.00              Min.   : 1.05                 
##  1st Qu.: 5.36              1st Qu.:16.10                 
##  Median :12.52              Median :23.30                 
##  Mean   :17.14              Mean   :25.10                 
##  3rd Qu.:24.06              3rd Qu.:32.81                 
##  Max.   :84.45              Max.   :83.86                 
##  porcentaje_pob_acceso_ss pob_6-14_no_edu  rezago_social      
##  Min.   :22.03            Min.   : 0.000   Min.   :-1.550000  
##  1st Qu.:64.45            1st Qu.: 4.170   1st Qu.:-0.760000  
##  Median :76.39            Median : 5.730   Median :-0.220000  
##  Mean   :72.37            Mean   : 6.301   Mean   :-0.004418  
##  3rd Qu.:83.43            3rd Qu.: 7.770   3rd Qu.: 0.460000  
##  Max.   :96.99            Max.   :38.560   Max.   : 6.830000  
##    grado_rs            feb_2020       
##  Length:2457        Min.   :0.000000  
##  Class :character   1st Qu.:0.000000  
##  Mode  :character   Median :0.000000  
##                     Mean   :0.003267  
##                     3rd Qu.:0.000000  
##                     Max.   :1.000000
hist(covid$numero_hospitales,main = 'Número de hospitales')

hist(covid$poblacion_2022,main = 'Población 2022')

hist(covid$gini2015,main = 'Coeficiente de desigualdad del ingreso')

hist(covid$crimen_2019 ,main = 'Crimen 2019')

# Gráfico de barras de la tasa de COVID19
ggplot(data = covid, aes(x = entidad, y = tasa_covid)) +
  geom_bar(stat = "identity", fill = "skyblue") +
  labs(title = "Tasa de COVID19 por Entidad",
       x = "Entidad",
       y = "Tasa de COVID19") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

# Gráfico de barras de población 2022
ggplot(data = covid, aes(x = reorder(entidad, -poblacion_2022), y = poblacion_2022)) +
  geom_bar(stat = "identity", fill = "lightgreen") +
  labs(title = "Población por Entidad en 2022",
       x = "Entidad",
       y = "Población") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

# Calcular estadísticos descriptivos por municipio
municipio_stats <- covid %>%
  group_by(mpio) %>%
  summarise(
    promedio_hospitales = mean(numero_hospitales, na.rm = TRUE),
    promedio_poblacion = mean(poblacion_2022, na.rm = TRUE),
    total_casos = sum(total_casos, na.rm = TRUE),
    tasa_covid = mean(tasa_covid, na.rm = TRUE)
  )

# Mostrar los primeros registros de estadísticos por municipio
head(municipio_stats)
## # A tibble: 6 × 5
##   mpio       promedio_hospitales promedio_poblacion total_casos tasa_covid
##   <chr>                    <dbl>              <dbl>       <dbl>      <dbl>
## 1 Abala                      2                7035           75      107. 
## 2 Abasolo                   16.2             28099.        1193      141. 
## 3 Abejones                   2                1033           21      203. 
## 4 Acacoyagua                10               19856           26       13.1
## 5 Acajete                   30               39104.         335       43.7
## 6 Acala                     20               34494           47       13.6
# Mapa básico de municipios

tm_shape(mx_mpio_map) +
  tm_polygons(col = "black") +
  tm_compass(position=c("left","bottom")) +
  tm_layout(main.title = "Mexico's Municipios")

b. Estadísticos de Dispersión (Global y Regional). Incluir elementos gráficos (box plots, qq plots, etc.).

# Gráfico de dispersión de población y tasa de COVID19
ggplot(data = municipio_stats, aes(x = promedio_poblacion, y = tasa_covid)) +
  geom_point(color = "red") +
  labs(title = "Relación entre Población y Tasa de COVID19 por Municipio",
       x = "Población",
       y = "Tasa de COVID19")

qqplot(covid$numero_hospitales,covid$total_casos,main = "Número de hospitales")

qqplot(covid$poblacion_2022,covid$total_casos, main = "Población 2022")

qqplot(covid$gini2015,covid$total_casos, main = "Coeficiente de Desigualdad de Género")

qqplot(covid$crimen_2019,covid$total_casos, main = "Tasa de crimen por cada 100 mil habitantes")

c. Visualizar la distribución espacial de las variables seleccionadas usando mapas.

tm_shape(mpio_geodata) + 
  tm_polygons(col = "tasa_covid", palette="-cividis", style="quantile", n=8, title="Tasa Covid") +
  tm_layout(main.title= 'Tasa Covid por Municipios',  title.position = c('right', 'top'), legend.position= c("left", "bottom"), title.size = 1)

tm_shape(mpio_geodata) + 
  tm_polygons(col = "total_casos", palette = "OrRd", style="quantile", n=8, title="Total de casos") +
  tm_layout(main.title= 'Total de casos por municipio',  title.position = c('right', 'top'), legend.position= c("left", "bottom"), title.size = 1)

tm_shape(mpio_geodata) + 
  tm_polygons(col = "numero_hospitales", palette="Purples", style="quantile", n=8, title="Tasa Covid") +
  tm_layout(main.title= 'Número de Hospitales por municipio',  title.position = c('right', 'top'), legend.position= c("left", "bottom"), title.size = 1)

tm_shape(mpio_geodata) + 
  tm_polygons(col = "poblacion_2022", palette="Greens", style="quantile", n=8, title="Tasa Covid") +
  tm_layout(main.title= 'Población por municipio',  title.position = c('right', 'top'), legend.position= c("left", "bottom"), title.size = 1)

tm_shape(mpio_geodata) + 
  tm_polygons(col = "gini2015", palette="inferno", style="quantile", n=8, title="Tasa Covid") +
  tm_layout(main.title= 'Coeficiente de desigualdad del ingreso',  title.position = c('right', 'top'), legend.position= c("left", "bottom"), title.size = 1)

tm_shape(mpio_geodata) + 
  tm_polygons(col = "crimen_2019", palette="viridis", style="quantile", n=8, title="Tasa Covid") +
  tm_layout(main.title= 'Tasa de Crimen por Municipio',  title.position = c('right', 'top'), legend.position= c("left", "bottom"), title.size = 1)

# Municipios de México - Graficación de variables

hospitales <- tm_shape(mpio_geodata) + 
  tm_polygons(col = "numero_hospitales", palette="Blues", style="quantile", n=8, title="Numero de Hospitales") +
  tm_layout(main.title= 'Número de hospitales',  title.position = c('right', 'top'), legend.position= c("left", "bottom"), title.size = 1)
## tm_polygons: Deprecated tmap v3 code detected. Code translated to v4
## Warning: The 'main.title' argument of 'tm_layout()' is deprecated as of tmap
## 4.0. Please use 'tm_title()' instead.
tasa_covid <- tm_shape(mpio_geodata) + 
  tm_polygons(col = "tasa_covid", palette="BuGn", style="quantile", n=8, title="Tasa Covid") +
  tm_layout(main.title= 'Tasa Covid',  title.position = c('right', 'top'), legend.position= c("left", "bottom"), title.size = 1)
## tm_polygons: Deprecated tmap v3 code detected. Code translated to v4
## Warning: The 'main.title' argument of 'tm_layout()' is deprecated as of tmap
## 4.0. Please use 'tm_title()' instead.
gini <- tm_shape(mpio_geodata) + 
  tm_polygons(col = "gini2015", palette="OrRd", style="quantile", n=8, title="gini2015") +
  tm_layout(main.title= 'Gini 2015',  title.position = c('right', 'top'), legend.position= c("left", "bottom"), title.size = 1)
## tm_polygons: Deprecated tmap v3 code detected. Code translated to v4
## Warning: The 'main.title' argument of 'tm_layout()' is deprecated as of tmap
## 4.0. Please use 'tm_title()' instead.
pop <- tm_shape(mpio_geodata) + 
  tm_polygons(col = "poblacion_2022", palette="-viridis", style="quantile", n=8, title="poblacion_2022") +
  tm_layout(main.title= 'poblacion_2022',  title.position = c('right', 'top'), legend.position= c("left", "bottom"), title.size = 1)
## tm_polygons: Deprecated tmap v3 code detected. Code translated to v4
## Warning: The 'main.title' argument of 'tm_layout()' is deprecated as of tmap
## 4.0. Please use 'tm_title()' instead.
# Panel of Maps 
tmap_arrange(hospitales,tasa_covid,gini,pop, ncol = 2)

d. Elaborar y visualizar 1 – 2 matrices de connectividad para estados / municipios de México.

Spatial Connectivity Matrix

swm  <- poly2nb(mx_mpio_map, queen=T)
summary(swm) # The average number of neighbors is 4.31
## Neighbour list object:
## Number of regions: 2456 
## Number of nonzero links: 14392 
## Percentage nonzero weights: 0.2385967 
## Average number of links: 5.859935 
## Link number distribution:
## 
##   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  19  20  22 
##   8  63 202 393 515 467 317 233 143  52  27  15   5   4   3   3   1   1   1   3 
## 8 least connected regions:
## 300 355 668 859 931 1244 1462 2235 with 1 link
## 3 most connected regions:
## 967 1059 1174 with 22 links

Queen Matrix

sswm <- nb2listw(swm, style="W", zero.policy = TRUE)

mx_mpio_map_a <- as(mx_mpio_map, "Spatial")
mx_mpio_map_centroid <- coordinates(mx_mpio_map_a) 
plot(mx_mpio_map_a,border="blue",axes=FALSE,las=1, main="Mexico's Municipality Queen SWM")
plot(mx_mpio_map_a,col="grey",border=grey(0.9),axes=T,add=T) 
plot(sswm,coords=mx_mpio_map_centroid,pch=19,cex=0.1,col="red",add=T) 

e. Detectar la presencia de autocorrelación espacial global para cada una de las variables seleccionadas.

f. Detectar la presencia de autocorrelación espacial local para cada una de las variables seleccionadas.

### Spatial Autocorrelation 

# Global Moran's I 
moran.test(mpio_geodata$numero_hospitales, sswm)            
## 
##  Moran I test under randomisation
## 
## data:  mpio_geodata$numero_hospitales  
## weights: sswm    
## 
## Moran I statistic standard deviate = 15.167, p-value < 2.2e-16
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic       Expectation          Variance 
##      0.1810738904     -0.0004073320      0.0001431794
moran.test(mpio_geodata$total_casos, sswm)                  
## 
##  Moran I test under randomisation
## 
## data:  mpio_geodata$total_casos  
## weights: sswm    
## 
## Moran I statistic standard deviate = 35.138, p-value < 2.2e-16
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic       Expectation          Variance 
##      0.4143086184     -0.0004073320      0.0001392969
moran.test(mpio_geodata$crimen_2019, sswm)      
## 
##  Moran I test under randomisation
## 
## data:  mpio_geodata$crimen_2019  
## weights: sswm    
## 
## Moran I statistic standard deviate = 20.352, p-value < 2.2e-16
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic       Expectation          Variance 
##      0.2447673979     -0.0004073320      0.0001451252
moran.test(mpio_geodata$gini2015, sswm)       
## 
##  Moran I test under randomisation
## 
## data:  mpio_geodata$gini2015  
## weights: sswm    
## 
## Moran I statistic standard deviate = 24.283, p-value < 2.2e-16
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic       Expectation          Variance 
##      0.2954305305     -0.0004073320      0.0001484178
moran.test(mpio_geodata$poblacion_2022, sswm) 
## 
##  Moran I test under randomisation
## 
## data:  mpio_geodata$poblacion_2022  
## weights: sswm    
## 
## Moran I statistic standard deviate = 26.255, p-value < 2.2e-16
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic       Expectation          Variance 
##      0.3159585568     -0.0004073320      0.0001451961
table <- data.frame(Variable = c("numero_hospitales", "total_casos", "crimen_2019","gini_2015","poblacion_2022"), GM = c(0.18, 0.41, 0.24,0.29,0.31), Significance = c("*","***","**","**","***"))
table
##            Variable   GM Significance
## 1 numero_hospitales 0.18            *
## 2       total_casos 0.41          ***
## 3       crimen_2019 0.24           **
## 4         gini_2015 0.29           **
## 5    poblacion_2022 0.31          ***
mpio_geodata$sp_lag_numero_hospitales <- lag.listw(sswm, mpio_geodata$numero_hospitales, zero.policy=TRUE) 
mpio_geodata$sp_lag_tasa_covid <- lag.listw(sswm, mpio_geodata$total_casos, zero.policy=TRUE)
mpio_geodata$sp_lag_crimen_2019 <- lag.listw(sswm, mpio_geodata$crimen_2019, zero.policy=TRUE)
mpio_geodata$sp_lag_gini2015 <- lag.listw(sswm, mpio_geodata$gini2015, zero.policy=TRUE)
mpio_geodata$sp_lag_poblacion_2022 <- lag.listw(sswm, mpio_geodata$poblacion_2022, zero.policy=TRUE)

g. Identificar la posible presencia de clústers locales / regionales para cada una de las variables de seleccionadas. ¿Cuáles son algunas de las características socioeconómicas y/o económicas de los estados / municipios que componen los clústers identificados?

newhosp_lag <- tm_shape(mpio_geodata) + 
  tm_polygons(col = "sp_lag_numero_hospitales", palette="Purples", style="quantile", n=5, title="Número de Hospitales") +
  tm_layout(main.title= 'Clusters de Hospitales',  title.position = c('right', 'top'), legend.position= c("left", "bottom"), title.size = 1)
## tm_polygons: Deprecated tmap v3 code detected. Code translated to v4
## Warning: The 'main.title' argument of 'tm_layout()' is deprecated as of tmap
## 4.0. Please use 'tm_title()' instead.
newhosp_lag

newcrime_lag <- tm_shape(mpio_geodata) + 
  tm_polygons(col = "sp_lag_crimen_2019", palette="Reds", style="quantile", n=10, title="Número de Crimen") +
  tm_layout(main.title= 'Clusters de Crimen',  title.position = c('right', 'top'), legend.position= c("left", "bottom"), title.size = 1)
## tm_polygons: Deprecated tmap v3 code detected. Code translated to v4
## Warning: The 'main.title' argument of 'tm_layout()' is deprecated as of tmap
## 4.0. Please use 'tm_title()' instead.
newcrime_lag

newgini_lag <- tm_shape(mpio_geodata) + 
  tm_polygons(col = "sp_lag_gini2015", palette="Blues", style="quantile", n=5, title="Desigualdad de ingreso") +
  tm_layout(main.title= 'Clusters de Desigualdad de ingreso',  title.position = c('right', 'top'), legend.position= c("left", "bottom"), title.size = 1)
## tm_polygons: Deprecated tmap v3 code detected. Code translated to v4
## Warning: The 'main.title' argument of 'tm_layout()' is deprecated as of tmap
## 4.0. Please use 'tm_title()' instead.
newgini_lag

newpob_lag <- tm_shape(mpio_geodata) + 
  tm_polygons(col = "sp_lag_poblacion_2022", palette="PuOr", style="quantile", n=5, title="Densidad Poblacional") +
  tm_layout(main.title= 'Clusters de Población',  title.position = c('right', 'top'), legend.position= c("left", "bottom"), title.size = 1)
## tm_polygons: Deprecated tmap v3 code detected. Code translated to v4
## Warning: The 'main.title' argument of 'tm_layout()' is deprecated as of tmap
## 4.0. Please use 'tm_title()' instead.
newpob_lag

4) Considerando el contexto de la situación problema, describir los principales 6 - 8 hallazgos encontrados a partir del ESDA.

5) Citar referencias y/o otras fuentes consideradas para el desarrollo de la actividad

Actividad Extra

LS0tDQp0aXRsZTogIk3Ds2R1bG8gMSAtIEFjdGl2aWRhZCAxIg0KYXV0aG9yOiAiRXF1aXBvIDIiDQpkYXRlOiAiMjAyNC0wNC0wNCINCm91dHB1dDoNCiAgcm1kZm9ybWF0czo6ZG93bmN1dGU6DQogICAgZGVmYXVsdF9zdHlsZTogImRhcmsiDQogICAgZG93bmN1dGVfdGhlbWU6ICJkZWZhdWx0Ig0KICAgIGNvZGVfZG93bmxvYWQgOiB0cnVlDQogICAgbGliX2RpcjogbGlicw0KICAgIHNlbGZfY29udGFpbmVkOiBmYWxzZQ0KICBodG1sX2RvY3VtZW50Og0KICAgIGRmX3ByaW50OiBwYWdlZA0KLS0tDQoNCmBgYHs9aHRtbH0NCjxzdHlsZT4NCmJvZHkgew0KdGV4dC1hbGlnbjoganVzdGlmeX0NCjwvc3R5bGU+DQpgYGANCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCiMjIExpYnJlcmlhcw0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShmb3JlaWduKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoc3BkZXApDQpsaWJyYXJ5KHRpZ3JpcykNCmxpYnJhcnkocmdlb2RhKQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQpsaWJyYXJ5KHZpcmlkaXMpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHRtYXApDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShzcCkNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeSh0aWR5cikNCmBgYA0KDQojIyBTaXR1YWNpw7NuIFByb2JsZW1hIEENCg0KRWwgbmVhcnNob3Jpbmcg4oCccmVsb2NhbGl6YWNpw7NuIGRlIHByb3llY3RvcyBkZSBuZWdvY2lvc+KAnSwg4oCcc2UgcmVmaWVyZSBhIHVuYSBlc3RyYXRlZ2lhIGVuIHF1ZSBsYXMgZW1wcmVzYXMgYnVzY2FuIHJlY29uZmlndXJhciBzdXMgY2FkZW5hcyBkZSB2YWxvciwgaGFjacOpbmRvbGFzIG3DoXMgY29ydGFzIHkgYWNlcmNhbmRvIGxvcyBjZW50cm9zIGRlIHByb2R1Y2Npw7NuIGNvbiBsb3MgbWVyY2Fkb3MgZmluYWxlc+KAnS4gQ29uIGJhc2UgZW4gZGljaGEgZGVmaW5pY2nDs24sIGxhIGxvY2FsaXphY2nDs24gZ2VvZ3LDoWZpY2EgeSBjZXJjYW7DrWEgY29uIGVsIG1lcmNhZG8gZGUgRXN0YWRvcyBVbmlkb3MgcmVwcmVzZW50YSBwYXJhIE3DqXhpY28gdW5hIHZlbnRhamEgZXN0cmF0w6lnaWNhIHBhcmEgbGEgYXRyYWNjacOzbiBkZSBwcm95ZWN0b3MgZGUgaW52ZXJzacOzbiBuZWFyc2hvcmluZy4gwr9DdcOhbCBlcyBsYSB0ZW5kZW5jaWEgYWN0dWFsIGRlbCBuZWFyc2hvcmluZyBwYXJhIGVsIGNhc28gZGUgTcOpeGljbz8gwr9Dw7NtbyBlcyBsYSBkaXN0cmlidWNpw7NuIGRlIGZsdWpvcyBkZSBpbnZlcnNpw7NuIGV4dHJhbmplcmEgZGlyZWN0YSAoSUVEKSBlbnRyZSBsb3MgZXN0YWRvcyBkZSBNw6l4aWNvPyDCv0V4aXN0ZW4gdW4gcGF0csOzbiBlc3BhY2lhbCB5L28gcmVnaW9uYWwgZGUgbGEgZGlzdHJpYnVjacOzbiBkZSBsYSBJRUQgZHVyYW50ZSBsb3Mgw7psdGltb3MgYcOxb3M/IMK/UXXDqSB0aXBvIGRlIGNhcmFjdGVyw61zdGljYXMgZGUgbG9zIGVzdGFkb3Mgc2Vyw61hbiBhdHJhY3RpdmFzIHBhcmEgbGEgYXRyYWNjacOzbiBkZSBJRUQ/IMK/U2UganVzdGlmaWNhIGVsIHVzbyBkZSB1biBhbsOhbGlzaXMgZXNwYWNpYWwgZGUgZGF0b3MgcGFyYSBsYSBwcmVkaWNjacOzbiBkZWwgbmVhcnNob3Jpbmc/DQoNCiMjIDEpIEJyZXZlbWVudGUsIGRlc2NyaWJpciBjb24gc3VzIHByb3BpYXMgcGFsYWJyYXMgcXXDqSBlcyB1biBFU0RBIHkgY3XDoWwgZXMgc3UgcHJpbmNpcGFsIHByb3DDs3NpdG8gZW4gZWwgcHJvY2VzbyBkZSBhbmFsw610aWNhIGRlIGRhdG9zLg0KDQpFbCBFU0RBIChFeHBsb3JhdG9yeSBTcGF0aWFsIERhdGEgQW5hbHlzaXMpIGVzIHVuIHRpcG8gZGUgYW7DoWxpc2lzIGV4cGxvcmF0b3JpbywgcHJpbWVybyBkZWZpbmFtb3MgZWwgY29uY2VwdG8gYmFzZSA6IEVEQS4gRWwgQW7DoWxpc2lzIEV4cGxvcmF0b3JpbyBkZSBEYXRvcyAoRURBKSBlcyB1biBwcm9jZXNvIGZ1bmRhbWVudGFsIGVuIGxhIGFuYWzDrXRpY2EgZGUgZGF0b3MuIFN1IHByaW5jaXBhbCBwcm9ww7NzaXRvIGVzIGNvbXByZW5kZXIgbGEgbmF0dXJhbGV6YSBkZSBsb3MgZGF0b3MsIGlkZW50aWZpY2FyIHBhdHJvbmVzLCB2YWxvcmVzIGF0w61waWNvcyB5IHJlbGFjaW9uZXMgYW50ZXMgZGUgcmVhbGl6YXIgdW4gYW7DoWxpc2lzIG3DoXMgcHJvZnVuZG8uRXN0ZSBwcm9jZXNvIGltcGxpY2EgaW5zcGVjY2lvbmFyLCBsaW1waWFyLCB0cmFuc2Zvcm1hciB5IG1vZGVsYXIgYmFzZXMgZGUgZGF0b3MuIFN1IHByaW5jaXBhbCBvYmpldGl2byBlcyBkZXNjdWJyaXIgaW5mb3JtYWNpw7NuIMO6dGlsLCBsbGVnYXIgYSBjb25jbHVzaW9uZXMgeSByZXNwYWxkYXIgbGEgdG9tYSBkZSBkZWNpc2lvbmVzLg0KDQpBaG9yYSBiaWVuLCB1biBFU0RBIGVzIHVuYSB0w6ljbmljYSBiYXNhZGEgZW4gbGEgY2llbmNpYSBkZSBsYSBpbmZvcm1hY2nDs24gZ2VvZ3LDoWZpY2EgKEdJUykgcXVlIHBlcm1pdGUgZGVzY3JpYmlyIHkgdmlzdWFsaXphciBkaXN0cmlidWNpb25lcyBlc3BhY2lhbGVzLiBTdSBvYmpldGl2byBwcmluY2lwYWwgZXMgZGVudGlmaWNhciB1YmljYWNpb25lcyBhdMOtcGljYXMgbyB2YWxvcmVzIGV4dHJlbW9zIGVuIGVsIGVzcGFjaW8gYXPDrSBjb21vIGRlc2N1YnJpciBwYXRyb25lcyBkZSBhc29jaWFjacOzbiBlc3BhY2lhbCwgYWdydXBhbWllbnRvcyBvIGhvdCBzcG90cyBxdWUgcHVlZGFuIHNlciByZXByZXNlbnRhZG9zIGRlIG1hbmVyYSBudW3DqXJpY2EgeSB2aXN1YWwgYSB0cmF2w6lzIGRlIHZhcmlvcyBtw6l0b2Rvcy4NCg0KIyMgMikgQnJldmVtZW50ZSwgZGVzY3JpYmlyIGNvbiBzdXMgcHJvcGlhcyBwYWxhYnJhcyBlbCBjb25jZXB0byBkZSBhdXRvY29ycmVsYWNpw7NuIGVzcGFjaWFsIGFzw60gY29tbyAxLTIgZWplbXBsb3MgcmVsYWNpb25hZG9zIGNvbiBkaWNobyBjb25jZXB0by4NCg0KTGEgYXV0b2NvcnJlbGFjacOzbiBlcyB1bmEgY2FyYWN0ZXLDrXN0aWNhIGRlIGxvcyBkYXRvcyBxdWUgbXVlc3RyYSBlbCBncmFkbyBkZSBzaW1pbGl0dWQgZW50cmUgbG9zIHZhbG9yZXMgZGUgbGFzIG1pc21hcyB2YXJpYWJsZXMgZW4gaW50ZXJ2YWxvcyBkZSB0aWVtcG8gc3VjZXNpdm9zLiBFbiBjb250cmFzdGUsIGxhIGF1dG9jb3JyZWxhY2nDs24gZXNwYWNpYWwgc2UgcmVmaWVyZSBhIGxhIHNpbWlsaXR1ZCBlc3BhY2lhbCBlbnRyZSBsb3MgdmFsb3JlcyBkZSB1bmEgdmFyaWFibGUgZW4gdW4gY29uanVudG8gZGUgZGF0b3MgZ2VvZ3LDoWZpY28uIEVuIG90cmFzIHBhbGFicmFzLCBidXNjYSBwYXRyb25lcyBkZSBkZXBlbmRlbmNpYSBlc3BhY2lhbC4gU2kgbG9zIHZhbG9yZXMgc2ltaWxhcmVzIHRpZW5kZW4gYSBhZ3J1cGFyc2UgbyBkaXNwZXJzYXJzZSBlbiBlbCBlc3BhY2lvLCBlc3RhbW9zIGhhYmxhbmRvIGRlIGF1dG9jb3JyZWxhY2nDs24gZXNwYWNpYWwuDQoNCkVzdGEgY2FyYWN0ZXLDrXN0aWNhIHNlIG1pZGUgYSB0cmF2w6lzIGRlbCDDjW5kaWNlIGRlIE1vcmFuIChJIGRlIE1vcmFuKS4NCg0KU2kgZWwgw61uZGljZSBlcyBjZXJjYW5vIGEgKzEsIGhheSBhdXRvY29ycmVsYWNpw7NuIGVzcGFjaWFsIHBvc2l0aXZhOg0KDQotICAgTG9zIHZhbG9yZXMgc2ltaWxhcmVzIHNlIGFncnVwYW4gZW4gZWwgZXNwYWNpby4NCg0KLSAgIEVqZW1wbG86IFRlbXBlcmF0dXJhcyBhbHRhcyBjZXJjYSBkZSBvdHJhcyB0ZW1wZXJhdHVyYXMgYWx0YXMuDQoNClNpIGVsIMOtbmRpY2UgZXMgY2VyY2FubyBhIC0xLCBoYXkgYXV0b2NvcnJlbGFjacOzbiBlc3BhY2lhbCBuZWdhdGl2YToNCg0KLSAgIExvcyB2YWxvcmVzIGRpc8OtbWlsZXMgc2UgYWdydXBhbi4NCg0KLSAgIEVqZW1wbG86IMOBcmVhcyBkZW5zYW1lbnRlIHBvYmxhZGFzIHJvZGVhZGFzIGRlIMOhcmVhcyBwb2NvIHBvYmxhZGFzLg0KDQpFc3RlIGZlbsOzbWVubyBzZSBwdWVkZSBhcHJlY2lhciBlbiBsYSBzaWd1aWVudGUgaW3DoWdlbjoNCg0KIVtUaXBvcyBkZSBhdXRvY29ycmVsYWNpw7NuIGVzcGFjaWFsIC1GdWVudGU6IEdhcnphICgyMDE0KV0oYXV0b2NvcnJlbGFjacOzbi5wbmcpDQoNCiMjIDMpIENvbiBiYXNlIGVuIGVsIGFyY2hpdm8gZGUgZGF0b3MgYXNpZ25hZG8gcmVhbGl6YXIgc2VsZWNjacOzbiBkZSB2YXJpYWJsZXMgeSBlbGFib3JhciBFU0RBIHF1ZSBpbmNsdXllOg0KDQojIyMgSW1wb3J0aW5nIGRhdGFzZXQNCg0KYGBge3J9DQpjb3ZpZCA8LSByZWFkX2V4Y2VsKCJjcm9zc19zZWN0aW9uYWxfZGF0YXNldC54bHN4IikgDQpjb3ZpZFtzYXBwbHkoY292aWQsIGlzLm51bWVyaWMpXSA8LSBsYXBwbHkoY292aWRbc2FwcGx5KGNvdmlkLCBpcy5udW1lcmljKV0sIGZ1bmN0aW9uKHgpIGlmZWxzZShpcy5uYSh4KSwgbWVhbih4LCBuYS5ybSA9IFRSVUUpLCB4KSkNCmBgYA0KDQojIyMgSW1wb3J0aW5nIHNoYXBlZmlsZQ0KDQpgYGB7cn0NCiMgTWV4aWNvJ3Mgc3RhdGVzICgzMikgDQpteF9zdGF0ZV9tYXAgPC0gc3RfcmVhZCgiQzovVXNlcnMvbWF4Y2EvRG9jdW1lbnRzL1BsYW5hY2nDs24gZXN0cmF0w6lnaWNhL01vZHVsbyAxL0FjdGl2aWRhZGVzL214X21hcHMvbXhfc3RhdGVzL21leGxhdGxvbmcuc2hwIikNCg0KIyBNZXhpY28ncyBNdW5pY2lwaW9zICgyLDQ1NykNCm14X21waW9fbWFwIDwtIHN0X3JlYWQoIkM6L1VzZXJzL21heGNhL0RvY3VtZW50cy9QbGFuYWNpw7NuIGVzdHJhdMOpZ2ljYS9Nb2R1bG8gMS9BY3RpdmlkYWRlcy9teF9tYXBzL214X21waW9zL01leGljYW4gTXVuaWNpcGFsaXRpZXMuc2hwIikNCg0KIyBtZXJnaW5nIGRhdGFzZXQgDQoNCiNtcGlvX2dlb2RhdGEgIDwtIGdlb19qb2luKG14X21waW9fbWFwLGNvdmlkLCdJRFVOSUNPJywnY2xhdmVfbXVuaWNpcGlvJyxob3c9J2lubmVyJykNCg0KbXBpb19nZW9kYXRhIDwtIGlubmVyX2pvaW4obXhfbXBpb19tYXAsIGNvdmlkLCBieSA9IGMoIklEVU5JQ08iID0gImNsYXZlX211bmljaXBpbyIpKQ0KYGBgDQoNCiMjIyBhLiBFc3RhZMOtc3RpY29zIERlc2NyaXBpdHZvcyAoR2xvYmFsIHkgUmVnaW9uYWwpLiBJbmNsdWlyIGVsZW1lbnRvcyBncsOhZmljb3MgKGhpc3RvZ3JhbWFzLCBncsOhZmljbyBkZSBiYXJyYXMsIGV0Yy4pLg0KDQpgYGB7cn0NCnN0cihjb3ZpZFssNDoyMV0pDQpgYGANCg0KYGBge3J9DQpzdW1tYXJ5KGNvdmlkWyw0OjIxXSkNCmBgYA0KDQpgYGB7cn0NCmhpc3QoY292aWQkbnVtZXJvX2hvc3BpdGFsZXMsbWFpbiA9ICdOw7ptZXJvIGRlIGhvc3BpdGFsZXMnKQ0KaGlzdChjb3ZpZCRwb2JsYWNpb25fMjAyMixtYWluID0gJ1BvYmxhY2nDs24gMjAyMicpDQpoaXN0KGNvdmlkJGdpbmkyMDE1LG1haW4gPSAnQ29lZmljaWVudGUgZGUgZGVzaWd1YWxkYWQgZGVsIGluZ3Jlc28nKQ0KaGlzdChjb3ZpZCRjcmltZW5fMjAxOSAsbWFpbiA9ICdDcmltZW4gMjAxOScpDQpgYGANCg0KYGBge3J9DQojIEdyw6FmaWNvIGRlIGJhcnJhcyBkZSBsYSB0YXNhIGRlIENPVklEMTkNCmdncGxvdChkYXRhID0gY292aWQsIGFlcyh4ID0gZW50aWRhZCwgeSA9IHRhc2FfY292aWQpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsID0gInNreWJsdWUiKSArDQogIGxhYnModGl0bGUgPSAiVGFzYSBkZSBDT1ZJRDE5IHBvciBFbnRpZGFkIiwNCiAgICAgICB4ID0gIkVudGlkYWQiLA0KICAgICAgIHkgPSAiVGFzYSBkZSBDT1ZJRDE5IikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKQ0KYGBgDQoNCmBgYHtyfQ0KIyBHcsOhZmljbyBkZSBiYXJyYXMgZGUgcG9ibGFjacOzbiAyMDIyDQpnZ3Bsb3QoZGF0YSA9IGNvdmlkLCBhZXMoeCA9IHJlb3JkZXIoZW50aWRhZCwgLXBvYmxhY2lvbl8yMDIyKSwgeSA9IHBvYmxhY2lvbl8yMDIyKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICJsaWdodGdyZWVuIikgKw0KICBsYWJzKHRpdGxlID0gIlBvYmxhY2nDs24gcG9yIEVudGlkYWQgZW4gMjAyMiIsDQogICAgICAgeCA9ICJFbnRpZGFkIiwNCiAgICAgICB5ID0gIlBvYmxhY2nDs24iKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSkpDQpgYGANCg0KYGBge3J9DQojIENhbGN1bGFyIGVzdGFkw61zdGljb3MgZGVzY3JpcHRpdm9zIHBvciBtdW5pY2lwaW8NCm11bmljaXBpb19zdGF0cyA8LSBjb3ZpZCAlPiUNCiAgZ3JvdXBfYnkobXBpbykgJT4lDQogIHN1bW1hcmlzZSgNCiAgICBwcm9tZWRpb19ob3NwaXRhbGVzID0gbWVhbihudW1lcm9faG9zcGl0YWxlcywgbmEucm0gPSBUUlVFKSwNCiAgICBwcm9tZWRpb19wb2JsYWNpb24gPSBtZWFuKHBvYmxhY2lvbl8yMDIyLCBuYS5ybSA9IFRSVUUpLA0KICAgIHRvdGFsX2Nhc29zID0gc3VtKHRvdGFsX2Nhc29zLCBuYS5ybSA9IFRSVUUpLA0KICAgIHRhc2FfY292aWQgPSBtZWFuKHRhc2FfY292aWQsIG5hLnJtID0gVFJVRSkNCiAgKQ0KDQojIE1vc3RyYXIgbG9zIHByaW1lcm9zIHJlZ2lzdHJvcyBkZSBlc3RhZMOtc3RpY29zIHBvciBtdW5pY2lwaW8NCmhlYWQobXVuaWNpcGlvX3N0YXRzKQ0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIE1hcGEgYsOhc2ljbyBkZSBtdW5pY2lwaW9zDQoNCnRtX3NoYXBlKG14X21waW9fbWFwKSArDQogIHRtX3BvbHlnb25zKGNvbCA9ICJibGFjayIpICsNCiAgdG1fY29tcGFzcyhwb3NpdGlvbj1jKCJsZWZ0IiwiYm90dG9tIikpICsNCiAgdG1fbGF5b3V0KG1haW4udGl0bGUgPSAiTWV4aWNvJ3MgTXVuaWNpcGlvcyIpDQpgYGANCg0KIyMjIGIuIEVzdGFkw61zdGljb3MgZGUgRGlzcGVyc2nDs24gKEdsb2JhbCB5IFJlZ2lvbmFsKS4gSW5jbHVpciBlbGVtZW50b3MgZ3LDoWZpY29zIChib3ggcGxvdHMsIHFxIHBsb3RzLCBldGMuKS4NCg0KYGBge3J9DQojIEdyw6FmaWNvIGRlIGRpc3BlcnNpw7NuIGRlIHBvYmxhY2nDs24geSB0YXNhIGRlIENPVklEMTkNCmdncGxvdChkYXRhID0gbXVuaWNpcGlvX3N0YXRzLCBhZXMoeCA9IHByb21lZGlvX3BvYmxhY2lvbiwgeSA9IHRhc2FfY292aWQpKSArDQogIGdlb21fcG9pbnQoY29sb3IgPSAicmVkIikgKw0KICBsYWJzKHRpdGxlID0gIlJlbGFjacOzbiBlbnRyZSBQb2JsYWNpw7NuIHkgVGFzYSBkZSBDT1ZJRDE5IHBvciBNdW5pY2lwaW8iLA0KICAgICAgIHggPSAiUG9ibGFjacOzbiIsDQogICAgICAgeSA9ICJUYXNhIGRlIENPVklEMTkiKQ0KYGBgDQoNCmBgYHtyfQ0KcXFwbG90KGNvdmlkJG51bWVyb19ob3NwaXRhbGVzLGNvdmlkJHRvdGFsX2Nhc29zLG1haW4gPSAiTsO6bWVybyBkZSBob3NwaXRhbGVzIikNCnFxcGxvdChjb3ZpZCRwb2JsYWNpb25fMjAyMixjb3ZpZCR0b3RhbF9jYXNvcywgbWFpbiA9ICJQb2JsYWNpw7NuIDIwMjIiKQ0KcXFwbG90KGNvdmlkJGdpbmkyMDE1LGNvdmlkJHRvdGFsX2Nhc29zLCBtYWluID0gIkNvZWZpY2llbnRlIGRlIERlc2lndWFsZGFkIGRlIEfDqW5lcm8iKQ0KcXFwbG90KGNvdmlkJGNyaW1lbl8yMDE5LGNvdmlkJHRvdGFsX2Nhc29zLCBtYWluID0gIlRhc2EgZGUgY3JpbWVuIHBvciBjYWRhIDEwMCBtaWwgaGFiaXRhbnRlcyIpDQpgYGANCg0KIyMjIGMuIFZpc3VhbGl6YXIgbGEgZGlzdHJpYnVjacOzbiBlc3BhY2lhbCBkZSBsYXMgdmFyaWFibGVzIHNlbGVjY2lvbmFkYXMgdXNhbmRvIG1hcGFzLg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KdG1fc2hhcGUobXBpb19nZW9kYXRhKSArIA0KICB0bV9wb2x5Z29ucyhjb2wgPSAidGFzYV9jb3ZpZCIsIHBhbGV0dGU9Ii1jaXZpZGlzIiwgc3R5bGU9InF1YW50aWxlIiwgbj04LCB0aXRsZT0iVGFzYSBDb3ZpZCIpICsNCiAgdG1fbGF5b3V0KG1haW4udGl0bGU9ICdUYXNhIENvdmlkIHBvciBNdW5pY2lwaW9zJywgIHRpdGxlLnBvc2l0aW9uID0gYygncmlnaHQnLCAndG9wJyksIGxlZ2VuZC5wb3NpdGlvbj0gYygibGVmdCIsICJib3R0b20iKSwgdGl0bGUuc2l6ZSA9IDEpDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnRtX3NoYXBlKG1waW9fZ2VvZGF0YSkgKyANCiAgdG1fcG9seWdvbnMoY29sID0gInRvdGFsX2Nhc29zIiwgcGFsZXR0ZSA9ICJPclJkIiwgc3R5bGU9InF1YW50aWxlIiwgbj04LCB0aXRsZT0iVG90YWwgZGUgY2Fzb3MiKSArDQogIHRtX2xheW91dChtYWluLnRpdGxlPSAnVG90YWwgZGUgY2Fzb3MgcG9yIG11bmljaXBpbycsICB0aXRsZS5wb3NpdGlvbiA9IGMoJ3JpZ2h0JywgJ3RvcCcpLCBsZWdlbmQucG9zaXRpb249IGMoImxlZnQiLCAiYm90dG9tIiksIHRpdGxlLnNpemUgPSAxKQ0KDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnRtX3NoYXBlKG1waW9fZ2VvZGF0YSkgKyANCiAgdG1fcG9seWdvbnMoY29sID0gIm51bWVyb19ob3NwaXRhbGVzIiwgcGFsZXR0ZT0iUHVycGxlcyIsIHN0eWxlPSJxdWFudGlsZSIsIG49OCwgdGl0bGU9IlRhc2EgQ292aWQiKSArDQogIHRtX2xheW91dChtYWluLnRpdGxlPSAnTsO6bWVybyBkZSBIb3NwaXRhbGVzIHBvciBtdW5pY2lwaW8nLCAgdGl0bGUucG9zaXRpb24gPSBjKCdyaWdodCcsICd0b3AnKSwgbGVnZW5kLnBvc2l0aW9uPSBjKCJsZWZ0IiwgImJvdHRvbSIpLCB0aXRsZS5zaXplID0gMSkNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KdG1fc2hhcGUobXBpb19nZW9kYXRhKSArIA0KICB0bV9wb2x5Z29ucyhjb2wgPSAicG9ibGFjaW9uXzIwMjIiLCBwYWxldHRlPSJHcmVlbnMiLCBzdHlsZT0icXVhbnRpbGUiLCBuPTgsIHRpdGxlPSJUYXNhIENvdmlkIikgKw0KICB0bV9sYXlvdXQobWFpbi50aXRsZT0gJ1BvYmxhY2nDs24gcG9yIG11bmljaXBpbycsICB0aXRsZS5wb3NpdGlvbiA9IGMoJ3JpZ2h0JywgJ3RvcCcpLCBsZWdlbmQucG9zaXRpb249IGMoImxlZnQiLCAiYm90dG9tIiksIHRpdGxlLnNpemUgPSAxKQ0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQp0bV9zaGFwZShtcGlvX2dlb2RhdGEpICsgDQogIHRtX3BvbHlnb25zKGNvbCA9ICJnaW5pMjAxNSIsIHBhbGV0dGU9ImluZmVybm8iLCBzdHlsZT0icXVhbnRpbGUiLCBuPTgsIHRpdGxlPSJUYXNhIENvdmlkIikgKw0KICB0bV9sYXlvdXQobWFpbi50aXRsZT0gJ0NvZWZpY2llbnRlIGRlIGRlc2lndWFsZGFkIGRlbCBpbmdyZXNvJywgIHRpdGxlLnBvc2l0aW9uID0gYygncmlnaHQnLCAndG9wJyksIGxlZ2VuZC5wb3NpdGlvbj0gYygibGVmdCIsICJib3R0b20iKSwgdGl0bGUuc2l6ZSA9IDEpDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnRtX3NoYXBlKG1waW9fZ2VvZGF0YSkgKyANCiAgdG1fcG9seWdvbnMoY29sID0gImNyaW1lbl8yMDE5IiwgcGFsZXR0ZT0idmlyaWRpcyIsIHN0eWxlPSJxdWFudGlsZSIsIG49OCwgdGl0bGU9IlRhc2EgQ292aWQiKSArDQogIHRtX2xheW91dChtYWluLnRpdGxlPSAnVGFzYSBkZSBDcmltZW4gcG9yIE11bmljaXBpbycsICB0aXRsZS5wb3NpdGlvbiA9IGMoJ3JpZ2h0JywgJ3RvcCcpLCBsZWdlbmQucG9zaXRpb249IGMoImxlZnQiLCAiYm90dG9tIiksIHRpdGxlLnNpemUgPSAxKQ0KYGBgDQoNCmBgYHtyfQ0KIyBNdW5pY2lwaW9zIGRlIE3DqXhpY28gLSBHcmFmaWNhY2nDs24gZGUgdmFyaWFibGVzDQoNCmhvc3BpdGFsZXMgPC0gdG1fc2hhcGUobXBpb19nZW9kYXRhKSArIA0KICB0bV9wb2x5Z29ucyhjb2wgPSAibnVtZXJvX2hvc3BpdGFsZXMiLCBwYWxldHRlPSJCbHVlcyIsIHN0eWxlPSJxdWFudGlsZSIsIG49OCwgdGl0bGU9Ik51bWVybyBkZSBIb3NwaXRhbGVzIikgKw0KICB0bV9sYXlvdXQobWFpbi50aXRsZT0gJ07Dum1lcm8gZGUgaG9zcGl0YWxlcycsICB0aXRsZS5wb3NpdGlvbiA9IGMoJ3JpZ2h0JywgJ3RvcCcpLCBsZWdlbmQucG9zaXRpb249IGMoImxlZnQiLCAiYm90dG9tIiksIHRpdGxlLnNpemUgPSAxKQ0KDQp0YXNhX2NvdmlkIDwtIHRtX3NoYXBlKG1waW9fZ2VvZGF0YSkgKyANCiAgdG1fcG9seWdvbnMoY29sID0gInRhc2FfY292aWQiLCBwYWxldHRlPSJCdUduIiwgc3R5bGU9InF1YW50aWxlIiwgbj04LCB0aXRsZT0iVGFzYSBDb3ZpZCIpICsNCiAgdG1fbGF5b3V0KG1haW4udGl0bGU9ICdUYXNhIENvdmlkJywgIHRpdGxlLnBvc2l0aW9uID0gYygncmlnaHQnLCAndG9wJyksIGxlZ2VuZC5wb3NpdGlvbj0gYygibGVmdCIsICJib3R0b20iKSwgdGl0bGUuc2l6ZSA9IDEpDQoNCmdpbmkgPC0gdG1fc2hhcGUobXBpb19nZW9kYXRhKSArIA0KICB0bV9wb2x5Z29ucyhjb2wgPSAiZ2luaTIwMTUiLCBwYWxldHRlPSJPclJkIiwgc3R5bGU9InF1YW50aWxlIiwgbj04LCB0aXRsZT0iZ2luaTIwMTUiKSArDQogIHRtX2xheW91dChtYWluLnRpdGxlPSAnR2luaSAyMDE1JywgIHRpdGxlLnBvc2l0aW9uID0gYygncmlnaHQnLCAndG9wJyksIGxlZ2VuZC5wb3NpdGlvbj0gYygibGVmdCIsICJib3R0b20iKSwgdGl0bGUuc2l6ZSA9IDEpDQoNCnBvcCA8LSB0bV9zaGFwZShtcGlvX2dlb2RhdGEpICsgDQogIHRtX3BvbHlnb25zKGNvbCA9ICJwb2JsYWNpb25fMjAyMiIsIHBhbGV0dGU9Ii12aXJpZGlzIiwgc3R5bGU9InF1YW50aWxlIiwgbj04LCB0aXRsZT0icG9ibGFjaW9uXzIwMjIiKSArDQogIHRtX2xheW91dChtYWluLnRpdGxlPSAncG9ibGFjaW9uXzIwMjInLCAgdGl0bGUucG9zaXRpb24gPSBjKCdyaWdodCcsICd0b3AnKSwgbGVnZW5kLnBvc2l0aW9uPSBjKCJsZWZ0IiwgImJvdHRvbSIpLCB0aXRsZS5zaXplID0gMSkNCg0KIyBQYW5lbCBvZiBNYXBzIA0KdG1hcF9hcnJhbmdlKGhvc3BpdGFsZXMsdGFzYV9jb3ZpZCxnaW5pLHBvcCwgbmNvbCA9IDIpDQpgYGANCg0KIyMjIGQuIEVsYWJvcmFyIHkgdmlzdWFsaXphciAxIOKAkyAyIG1hdHJpY2VzIGRlIGNvbm5lY3RpdmlkYWQgcGFyYSBlc3RhZG9zIC8gbXVuaWNpcGlvcyBkZSBNw6l4aWNvLg0KDQojIyMjIFNwYXRpYWwgQ29ubmVjdGl2aXR5IE1hdHJpeA0KDQpgYGB7cn0NCnN3bSAgPC0gcG9seTJuYihteF9tcGlvX21hcCwgcXVlZW49VCkNCnN1bW1hcnkoc3dtKSAjIFRoZSBhdmVyYWdlIG51bWJlciBvZiBuZWlnaGJvcnMgaXMgNC4zMQ0KDQpgYGANCiMjIyMgUXVlZW4gTWF0cml4DQpgYGB7cn0NCnNzd20gPC0gbmIybGlzdHcoc3dtLCBzdHlsZT0iVyIsIHplcm8ucG9saWN5ID0gVFJVRSkNCg0KbXhfbXBpb19tYXBfYSA8LSBhcyhteF9tcGlvX21hcCwgIlNwYXRpYWwiKQ0KbXhfbXBpb19tYXBfY2VudHJvaWQgPC0gY29vcmRpbmF0ZXMobXhfbXBpb19tYXBfYSkgDQpwbG90KG14X21waW9fbWFwX2EsYm9yZGVyPSJibHVlIixheGVzPUZBTFNFLGxhcz0xLCBtYWluPSJNZXhpY28ncyBNdW5pY2lwYWxpdHkgUXVlZW4gU1dNIikNCnBsb3QobXhfbXBpb19tYXBfYSxjb2w9ImdyZXkiLGJvcmRlcj1ncmV5KDAuOSksYXhlcz1ULGFkZD1UKSANCnBsb3Qoc3N3bSxjb29yZHM9bXhfbXBpb19tYXBfY2VudHJvaWQscGNoPTE5LGNleD0wLjEsY29sPSJyZWQiLGFkZD1UKSANCmBgYA0KDQojIyMgZS4gRGV0ZWN0YXIgbGEgcHJlc2VuY2lhIGRlIGF1dG9jb3JyZWxhY2nDs24gZXNwYWNpYWwgZ2xvYmFsIHBhcmEgY2FkYSB1bmEgZGUgbGFzIHZhcmlhYmxlcyBzZWxlY2Npb25hZGFzLg0KDQojIyMgZi4gRGV0ZWN0YXIgbGEgcHJlc2VuY2lhIGRlIGF1dG9jb3JyZWxhY2nDs24gZXNwYWNpYWwgbG9jYWwgcGFyYSBjYWRhIHVuYSBkZSBsYXMgdmFyaWFibGVzIHNlbGVjY2lvbmFkYXMuDQoNCmBgYHtyfQ0KIyMjIFNwYXRpYWwgQXV0b2NvcnJlbGF0aW9uIA0KDQojIEdsb2JhbCBNb3JhbidzIEkgDQptb3Jhbi50ZXN0KG1waW9fZ2VvZGF0YSRudW1lcm9faG9zcGl0YWxlcywgc3N3bSkgICAgICAgICAgICANCm1vcmFuLnRlc3QobXBpb19nZW9kYXRhJHRvdGFsX2Nhc29zLCBzc3dtKSAgICAgICAgICAgICAgICAgIA0KbW9yYW4udGVzdChtcGlvX2dlb2RhdGEkY3JpbWVuXzIwMTksIHNzd20pICAgICAgDQptb3Jhbi50ZXN0KG1waW9fZ2VvZGF0YSRnaW5pMjAxNSwgc3N3bSkgICAgICAgDQptb3Jhbi50ZXN0KG1waW9fZ2VvZGF0YSRwb2JsYWNpb25fMjAyMiwgc3N3bSkgDQoNCnRhYmxlIDwtIGRhdGEuZnJhbWUoVmFyaWFibGUgPSBjKCJudW1lcm9faG9zcGl0YWxlcyIsICJ0b3RhbF9jYXNvcyIsICJjcmltZW5fMjAxOSIsImdpbmlfMjAxNSIsInBvYmxhY2lvbl8yMDIyIiksIEdNID0gYygwLjE4LCAwLjQxLCAwLjI0LDAuMjksMC4zMSksIFNpZ25pZmljYW5jZSA9IGMoIioiLCIqKioiLCIqKiIsIioqIiwiKioqIikpDQp0YWJsZQ0KYGBgDQoNCmBgYHtyfQ0KbXBpb19nZW9kYXRhJHNwX2xhZ19udW1lcm9faG9zcGl0YWxlcyA8LSBsYWcubGlzdHcoc3N3bSwgbXBpb19nZW9kYXRhJG51bWVyb19ob3NwaXRhbGVzLCB6ZXJvLnBvbGljeT1UUlVFKSANCm1waW9fZ2VvZGF0YSRzcF9sYWdfdGFzYV9jb3ZpZCA8LSBsYWcubGlzdHcoc3N3bSwgbXBpb19nZW9kYXRhJHRvdGFsX2Nhc29zLCB6ZXJvLnBvbGljeT1UUlVFKQ0KbXBpb19nZW9kYXRhJHNwX2xhZ19jcmltZW5fMjAxOSA8LSBsYWcubGlzdHcoc3N3bSwgbXBpb19nZW9kYXRhJGNyaW1lbl8yMDE5LCB6ZXJvLnBvbGljeT1UUlVFKQ0KbXBpb19nZW9kYXRhJHNwX2xhZ19naW5pMjAxNSA8LSBsYWcubGlzdHcoc3N3bSwgbXBpb19nZW9kYXRhJGdpbmkyMDE1LCB6ZXJvLnBvbGljeT1UUlVFKQ0KbXBpb19nZW9kYXRhJHNwX2xhZ19wb2JsYWNpb25fMjAyMiA8LSBsYWcubGlzdHcoc3N3bSwgbXBpb19nZW9kYXRhJHBvYmxhY2lvbl8yMDIyLCB6ZXJvLnBvbGljeT1UUlVFKQ0KDQpgYGANCg0KIyMjIGcuIElkZW50aWZpY2FyIGxhIHBvc2libGUgcHJlc2VuY2lhIGRlIGNsw7pzdGVycyBsb2NhbGVzIC8gcmVnaW9uYWxlcyBwYXJhIGNhZGEgdW5hIGRlIGxhcyB2YXJpYWJsZXMgZGUgc2VsZWNjaW9uYWRhcy4gwr9DdcOhbGVzIHNvbiBhbGd1bmFzIGRlIGxhcyBjYXJhY3RlcsOtc3RpY2FzIHNvY2lvZWNvbsOzbWljYXMgeS9vIGVjb27Ds21pY2FzIGRlIGxvcyBlc3RhZG9zIC8gbXVuaWNpcGlvcyBxdWUgY29tcG9uZW4gbG9zIGNsw7pzdGVycyBpZGVudGlmaWNhZG9zPw0KDQpgYGB7cn0NCm5ld2hvc3BfbGFnIDwtIHRtX3NoYXBlKG1waW9fZ2VvZGF0YSkgKyANCiAgdG1fcG9seWdvbnMoY29sID0gInNwX2xhZ19udW1lcm9faG9zcGl0YWxlcyIsIHBhbGV0dGU9IlB1cnBsZXMiLCBzdHlsZT0icXVhbnRpbGUiLCBuPTUsIHRpdGxlPSJOw7ptZXJvIGRlIEhvc3BpdGFsZXMiKSArDQogIHRtX2xheW91dChtYWluLnRpdGxlPSAnQ2x1c3RlcnMgZGUgSG9zcGl0YWxlcycsICB0aXRsZS5wb3NpdGlvbiA9IGMoJ3JpZ2h0JywgJ3RvcCcpLCBsZWdlbmQucG9zaXRpb249IGMoImxlZnQiLCAiYm90dG9tIiksIHRpdGxlLnNpemUgPSAxKQ0KbmV3aG9zcF9sYWcNCmBgYA0KDQpgYGB7cn0NCm5ld2NyaW1lX2xhZyA8LSB0bV9zaGFwZShtcGlvX2dlb2RhdGEpICsgDQogIHRtX3BvbHlnb25zKGNvbCA9ICJzcF9sYWdfY3JpbWVuXzIwMTkiLCBwYWxldHRlPSJSZWRzIiwgc3R5bGU9InF1YW50aWxlIiwgbj0xMCwgdGl0bGU9Ik7Dum1lcm8gZGUgQ3JpbWVuIikgKw0KICB0bV9sYXlvdXQobWFpbi50aXRsZT0gJ0NsdXN0ZXJzIGRlIENyaW1lbicsICB0aXRsZS5wb3NpdGlvbiA9IGMoJ3JpZ2h0JywgJ3RvcCcpLCBsZWdlbmQucG9zaXRpb249IGMoImxlZnQiLCAiYm90dG9tIiksIHRpdGxlLnNpemUgPSAxKQ0KbmV3Y3JpbWVfbGFnDQpgYGANCg0KYGBge3J9DQpuZXdnaW5pX2xhZyA8LSB0bV9zaGFwZShtcGlvX2dlb2RhdGEpICsgDQogIHRtX3BvbHlnb25zKGNvbCA9ICJzcF9sYWdfZ2luaTIwMTUiLCBwYWxldHRlPSJCbHVlcyIsIHN0eWxlPSJxdWFudGlsZSIsIG49NSwgdGl0bGU9IkRlc2lndWFsZGFkIGRlIGluZ3Jlc28iKSArDQogIHRtX2xheW91dChtYWluLnRpdGxlPSAnQ2x1c3RlcnMgZGUgRGVzaWd1YWxkYWQgZGUgaW5ncmVzbycsICB0aXRsZS5wb3NpdGlvbiA9IGMoJ3JpZ2h0JywgJ3RvcCcpLCBsZWdlbmQucG9zaXRpb249IGMoImxlZnQiLCAiYm90dG9tIiksIHRpdGxlLnNpemUgPSAxKQ0KbmV3Z2luaV9sYWcNCmBgYA0KDQpgYGB7cn0NCm5ld3BvYl9sYWcgPC0gdG1fc2hhcGUobXBpb19nZW9kYXRhKSArIA0KICB0bV9wb2x5Z29ucyhjb2wgPSAic3BfbGFnX3BvYmxhY2lvbl8yMDIyIiwgcGFsZXR0ZT0iUHVPciIsIHN0eWxlPSJxdWFudGlsZSIsIG49NSwgdGl0bGU9IkRlbnNpZGFkIFBvYmxhY2lvbmFsIikgKw0KICB0bV9sYXlvdXQobWFpbi50aXRsZT0gJ0NsdXN0ZXJzIGRlIFBvYmxhY2nDs24nLCAgdGl0bGUucG9zaXRpb24gPSBjKCdyaWdodCcsICd0b3AnKSwgbGVnZW5kLnBvc2l0aW9uPSBjKCJsZWZ0IiwgImJvdHRvbSIpLCB0aXRsZS5zaXplID0gMSkNCm5ld3BvYl9sYWcNCmBgYA0KDQojIyA0KSBDb25zaWRlcmFuZG8gZWwgY29udGV4dG8gZGUgbGEgc2l0dWFjacOzbiBwcm9ibGVtYSwgZGVzY3JpYmlyIGxvcyBwcmluY2lwYWxlcyA2IC0gOCBoYWxsYXpnb3MgZW5jb250cmFkb3MgYSBwYXJ0aXIgZGVsIEVTREEuDQoNCjEuIA0KMi4gDQozLiANCjQuIA0KNS4gDQo2LiANCg0KIyMgNSkgQ2l0YXIgcmVmZXJlbmNpYXMgeS9vIG90cmFzIGZ1ZW50ZXMgY29uc2lkZXJhZGFzIHBhcmEgZWwgZGVzYXJyb2xsbyBkZSBsYSBhY3RpdmlkYWQNCg0KDQojIEFjdGl2aWRhZCBFeHRyYQ0KDQo=