Determinar e interpretar las diferentes medidas descriptivas locales de las variables Lung Rate (tasa de cáncer de pulmón), PM2.5 (material particulado, tamaño 2.5 micrómetros), pov (pobreza) que se encuentran en la base de datos espaciales.
# Librerias
library(GWmodel)
Desarrollo
El primer paso de esta tarea, consiste en leer el archivo COUNTY_ATLANTIC.shp, conociendo este formato (shp), deducimos automáticamente que es un archivo informático propio de datos espaciales. Para ello utilizamos la función readShapeSpatial y escogemos el archivo en el directorio.
COUNTY_ATLANTIC.shp: Este archivo contiene 666 datos y 12 variables. De las cuales reconocemos las coordenadas (\(x\), \(y\)) correspondientes a las 13 colonias que tenía Reino Unido en la costa este de América del Norte. Para estas coordenadas se incluyen su perteneciente:
REGION: Sur ó noreste.
DIVISION: Atlántico medio o Atlántico sur.
STATE: 11 Estados. (Thirteen Colonies)
COUNTY: 521 condados.
Condado = readShapeSpatial(file.choose())
Luego, leemos el archivo de datos espaciales STATE_ATLANTIC.shp.
STATE_ATLANTIC.shp: Este archivo contiene 11 datos y 9 variables. De las cuales reconocemos:
REGION: Sur ó noreste.
DIVISION: Atlántico medio o Atlántico sur.
STATE: 11 Estados. (Thirteen Colonies)
STATE_AB: 11 abreviaciones de los estados.
Estado = readShapeSpatial(file.choose())
Leemos la base de datos data_atlantic_1998_2012.csv, mediante la función read.csv, y escogemos el archivo en el directorio.
data_atlantic_1998_2012.csv: Este archivo contiene 666 datos y 9 variables. De las cuales reconocemos las coordenadas (\(x\), \(y\)) con la siguiente información:
Rate: Tasa de cáncer de pulmón.
POV: Pobreza
PM25: Indicador de la contaminación urbana.
NO2: El dióxido de nitrógeno como consecuencia del tráfico rodado.
SO2: El dióxido de azufre como gas contaminante del aire.
Datos = read.csv(file.choose(), header=T)
Unimos los DataFrames: Condado y Datos y lo guardamos en la variable SPDF. Utilizamos la función merge para ello uniendo por la columna “FIPS” de estos datos.
Nota: El FIPS: Federal Information Processing Standard Publication (Publicación estándar de procesamiento de información federal) era un código de estándares de procesamiento de información federal de cinco dígitos que identificaba de manera única a los condados.
SPDF = merge(Condado, Datos, by = "FIPS")
names (SPDF) #nombres del objeto SPDF
[1] "FIPS" "ID" "x.x" "y.x"
[5] "REGION_ID" "DIVISION_I" "STATE_ID" "COUNTY_ID"
[9] "REGION" "DIVISION" "STATE" "COUNTY"
[13] "x.y" "y.y" "Rate" "POV"
[17] "SMOK" "PM25" "NO2" "SO2"
- Calculamos medidas estadísticas descriptivas del conjunto de datos geográficamente ponderadas mediante la función gwss. Esto incluye para cada variable: Rate, PM2.5, pov, la media, desviación estándar, varianza, asimetría, coeficiente de variación, covarianza y correlación entre las mismas, locales.
Estadisticos = gwss(SPDF,
vars = c("Rate", "PM25", "POV"),
kernel = "bisquare", # Funcion kernel
adaptive = TRUE, # Bw es adaptativo (variable)
bw = 48) # Ancho de banda
Estadisticos
***********************************************************************
* Package GWmodel *
***********************************************************************
***********************Calibration information*************************
Local summary statistics calculated for variables:
Rate PM25 POV
Number of summary points: 666
Kernel function: bisquare
Summary points: the same locations as observations are used.
Adaptive bandwidth: 48 (number of nearest neighbours)
Distance metric: Euclidean distance metric is used.
************************Local Summary Statistics:**********************
Summary information for Local means:
Min. 1st Qu. Median 3rd Qu. Max.
Rate_LM 60.719 66.421 70.614 72.207 76.842
PM25_LM 10.165 11.186 11.489 11.864 12.427
POV_LM 10.779 12.453 15.266 16.509 20.584
Summary information for local standard deviation :
Min. 1st Qu. Median 3rd Qu. Max.
Rate_LSD 9.05700 10.64575 11.07438 11.73020 15.2284
PM25_LSD 0.54993 0.94388 1.12628 1.23341 1.6819
POV_LSD 3.73408 4.73953 5.12185 5.39749 5.8609
Summary information for local variance :
Min. 1st Qu. Median 3rd Qu. Max.
Rate_LVar 82.02917 113.33210 122.64193 137.59767 231.9056
PM25_LVar 0.30243 0.89091 1.26851 1.52131 2.8288
POV_LVar 13.94337 22.46319 26.23332 29.13289 34.3497
Summary information for Local skewness:
Min. 1st Qu. Median 3rd Qu. Max.
Rate_LSKe -0.071523 0.216442 0.386823 0.598824 0.8325
PM25_LSKe -1.456352 -0.890750 -0.410189 -0.102092 0.4324
POV_LSKe -0.434795 0.205608 0.400079 0.584543 0.9860
Summary information for localized coefficient of variation:
Min. 1st Qu. Median 3rd Qu. Max.
Rate_LCV 0.135837 0.149828 0.159503 0.173521 0.2031
PM25_LCV 0.044980 0.080001 0.098187 0.110133 0.1637
POV_LCV 0.255187 0.304386 0.331298 0.379579 0.4472
Summary information for localized Covariance and Correlation between these variables:
Min. 1st Qu. Median
Cov_Rate.PM25 -3.1528683 -1.1347505 -0.6292969
Cov_Rate.POV 8.6548252 18.7118199 22.1321511
Cov_PM25.POV -2.0831025 -1.2793668 -0.8609368
Corr_Rate.PM25 -0.2213778 -0.1009946 -0.0569110
Corr_Rate.POV 0.1752022 0.3354824 0.3999972
Corr_PM25.POV -0.3563237 -0.2314432 -0.1609050
Spearman_rho_Rate.PM25 -0.2001301 -0.0743685 -0.0125142
Spearman_rho_Rate.POV 0.2501326 0.3686766 0.4001836
Spearman_rho_PM25.POV -0.3639950 -0.2338469 -0.1655752
3rd Qu. Max.
Cov_Rate.PM25 -0.0801118 0.8349
Cov_Rate.POV 26.0467903 47.7038
Cov_PM25.POV -0.4255488 0.2914
Corr_Rate.PM25 -0.0064755 0.0680
Corr_Rate.POV 0.4623835 0.6018
Corr_PM25.POV -0.0810170 0.0495
Spearman_rho_Rate.PM25 0.0456275 0.1341
Spearman_rho_Rate.POV 0.4476783 0.5721
Spearman_rho_PM25.POV -0.0897677 0.0403
************************************************************************
- A continuación se definen diferentes características para generar una función que grafique cada estadístico para cada variable.
# Atributo que dibuja las delimitaciones de los estados.
polys = list("sp.lines",
as(Estado, "SpatialLines"),
col = "black", lwd=1, lty=2)
# Creando una paleta de colores.
col.palette = colorRampPalette(
c("blue", "sky blue", "green", "yellow", "red"),
space = "rgb",
interpolate = "linear")
# Funcion que grafica las variables
grafica <- function(vble, title) {
spplot(Estadisticos$SDF,
vble,
main = title,
sp.layout = polys,
col = "transparent",
col.regions = col.palette(100))
}
Desviación estándar local
x=grafica("Rate_LSD","Tasa de cancer DeL")
y=grafica("PM25_LSD","PM2.5 DeL")
z=grafica("POV_LSD","Pobreza DeL")
grid.arrange(x,y,z, nrow=1, ncol=3)

Análisis:
La primera gráfica indica que en el centro, al oeste, hubo mayor dispersión en la tasa de cáncer, es decir, la tasa de cáncer varió mucho en esa zona. Mietras que en los lugares donde se ve azul, hubo menor dispersión, es decir, que la tasa de cáncer fue similar.
Para la segunda gráfica, hubo mayor dispersión en el norte del mapa, es decir que el diámetro de la materia particulada 2.5 varió mucho, mientras que en el sur fue más similar.
Y en la gráfica de la pobreza, se observa que hubo mayor dispersión en el sur, eso indica que es probable que exista mayor desigualdad económica que en el norte del mapa, que es donde se presenta el menor valor de dispersión y por ende mayor similaridad.
Coeficiente de variación local
library(gridExtra)
x=grafica("Rate_LCV","Tasa de cancer CvL")
y=grafica("PM25_LCV","PM2.5 CvL")
z=grafica("POV_LCV","Pobreza CvL")
grid.arrange(x,y,z, nrow=1, ncol=3)

En estadística, mientras mayor sea el valor del coeficiente de variación hay mayor heterogeneidad de los valores de la variable; y a menor C.V., mayor homogeneidad en los valores de la variable. La interpretación puede ser similar a la de la desviación estándar, solo que aquí se puede explicar con cantidades cuán dispersos realmente son los datos, por ejemplo, en la gráfica de la pobreza, se puede decir que en el sureste dónde se presenta la mayor dispersión con un coeficiente de variación aproximadamente de 0.45 indica una cantidad considerable de que realmente hay desigualdad económica o simplemente no se tomó una muestra significativa en esa zona.
También, por ejemplo, el PM2.5, la zona más alta presenta un coeficiente de variación de 0.16, y esto indica que a pesar de tener una alta dispersión en los datos, el comportamiento de la concentración de este material puede seguir comportándose de forma similar.
Correlación geográficamente ponderada entre la tasa de cáncer y el PM2.5
x=grafica("Corr_Rate.PM25","Corr Tasa de cáncer y PM2.5")
y=grafica("Corr_Rate.POV","Corr Tasa de cáncer y Pobreza")
grid.arrange(x,y, nrow=1, ncol=2)

Según la primera gráfica, dado que el mayor valor es 0.05 y este se aproxima a cero, prácticamente no existe una relación entre estas dos variables en las zonas dónde los colores varían de rojo a verde, mientras que el menor valor es -0.2 y esto indica que es posible que exista una relación inversa, es decir, donde mayor tasa de cáncer hay, menor concentración de PM2.5, pero igualmente, el coeficiente de correlación sigue siento bajo y por ende, una relación muy débil. En general, se puede concluir que no hay relación entre estas dos variables.
En la segunda gráfica, todos los números son positivos por lo que puede existir una relación directa entre la pobreza y la tasa de cáncer, de modo que a mayor tasa de cáncer, mayor es la pobreza que se puede presentar en la zona y viceversa. Dado que, el mayor valor es aproximadamente 0.6, existe una relación fuerte de estas variables en la zona centro-oeste, mientras que la relación es prácticamente nula donde el color es azul, es decir, al sur y al noreste del mapa.
Significancia de los valores de la correlación:
Esta función implementa pruebas de Monte Carlo (aleatorización) para las estadísticas de resumen de GW que se encuentran en gwss.
DM<-gw.dist(dp.locat=coordinates(SPDF))
test<-gwss.montecarlo(data=SPDF,
vars=c("Rate","PM25", "POV"), bw=48,
kernel ="bisquare", dMat=DM,
nsim=99, adaptive = TRUE)
t <- as.data.frame(test)
Estadisticos$SDF$test.Corr_Rate.PM25 = t$Corr_Rate.PM25
Estadisticos$SDF$test.Corr_Rate.POV = t$Corr_Rate.POV
A continuación se muestra la significancia de la correlación entre la tasa de cáncer y la pobreza.
Nota: La función gwss.montecarlo arroja la probabilidad de las estadísticas de prueba geográficamente ponderadas, para este caso la correlación. Luego, si p<0.025 o si p>0.975, entonces se puede decir que la verdadera correlación local es significativamente diferente (en el nivel de 0.95) a la correlación local encontrada por casualidad.
Esto indica que en las zonas azules de las siguientes gráficas, la correlación local encontrada es significativamente diferente a la correlación verdadera local.


LS0tDQp0aXRsZTogIjMuIFRhcmVhIEdXU1MiDQphdXRob3I6ICJFaWxpbiBMdW5hIE0uIg0KZGF0ZTogIjIwIGRlIGZlYnJlcm8gZGUgMjAyMSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCkRldGVybWluYXIgZSBpbnRlcnByZXRhciBsYXMgZGlmZXJlbnRlcyBtZWRpZGFzIGRlc2NyaXB0aXZhcyBsb2NhbGVzIGRlIGxhcyB2YXJpYWJsZXMgTHVuZyBSYXRlICh0YXNhIGRlIGPDoW5jZXIgZGUgcHVsbcOzbiksIFBNMi41IChtYXRlcmlhbCBwYXJ0aWN1bGFkbywgdGFtYcOxbyAyLjUgbWljcsOzbWV0cm9zKSwgcG92IChwb2JyZXphKSBxdWUgc2UgZW5jdWVudHJhbiBlbiBsYSBiYXNlIGRlIGRhdG9zIGVzcGFjaWFsZXMuDQoNCmBgYHtyfQ0KIyBMaWJyZXJpYXMNCmxpYnJhcnkoR1dtb2RlbCkNCmBgYA0KDQotLS0NCg0KIyMjIERlc2Fycm9sbG8gDQoNCi0tLQ0KDQoxLiBFbCBwcmltZXIgcGFzbyBkZSBlc3RhIHRhcmVhLCBjb25zaXN0ZSBlbiBsZWVyIGVsIGFyY2hpdm8gYENPVU5UWV9BVExBTlRJQy5zaHBgLCBjb25vY2llbmRvIGVzdGUgZm9ybWF0byAoc2hwKSwgZGVkdWNpbW9zIGF1dG9tw6F0aWNhbWVudGUgcXVlIGVzIHVuIGFyY2hpdm8gaW5mb3Jtw6F0aWNvIHByb3BpbyBkZSBkYXRvcyBlc3BhY2lhbGVzLiBQYXJhIGVsbG8gdXRpbGl6YW1vcyBsYSBmdW5jacOzbiBgcmVhZFNoYXBlU3BhdGlhbGAgeSBlc2NvZ2Vtb3MgZWwgYXJjaGl2byBlbiBlbCBkaXJlY3RvcmlvLiAgDQoNCiAgIGBDT1VOVFlfQVRMQU5USUMuc2hwYDogRXN0ZSBhcmNoaXZvIGNvbnRpZW5lIDY2NiBkYXRvcyB5IDEyIHZhcmlhYmxlcy4gRGUgbGFzIGN1YWxlcyByZWNvbm9jZW1vcyBsYXMgY29vcmRlbmFkYXMgKCR4JCwgJHkkKSBjb3JyZXNwb25kaWVudGVzIGEgbGFzIDEzIGNvbG9uaWFzIHF1ZSB0ZW7DrWEgUmVpbm8gVW5pZG8gZW4gbGEgY29zdGEgZXN0ZSBkZSBBbcOpcmljYSBkZWwgTm9ydGUuIFBhcmEgZXN0YXMgY29vcmRlbmFkYXMgc2UgaW5jbHV5ZW4gc3UgcGVydGVuZWNpZW50ZToNCiAgICsgYFJFR0lPTmA6IFN1ciDDsyBub3Jlc3RlLg0KICAgKyBgRElWSVNJT05gOiBBdGzDoW50aWNvIG1lZGlvIG8gQXRsw6FudGljbyBzdXIuDQogICArIGBTVEFURWA6IDExIEVzdGFkb3MuIChbVGhpcnRlZW4gQ29sb25pZXNdKGh0dHBzOi8vd3d3LndvcmxkYXRsYXMuY29tL3dlYmltYWdlL2NvdW50cnlzL25hbWVyaWNhL3Vzc3RhdGVzL2NvbG9uaWVzLmh0bSkpDQogICArIGBDT1VOVFlgOiA1MjEgY29uZGFkb3MuDQogICANCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQ0KQ29uZGFkbyA9IHJlYWRTaGFwZVNwYXRpYWwoZmlsZS5jaG9vc2UoKSkgDQpgYGANCg0KLS0tDQoNCjIuIEx1ZWdvLCBsZWVtb3MgZWwgYXJjaGl2byBkZSBkYXRvcyBlc3BhY2lhbGVzIGBTVEFURV9BVExBTlRJQy5zaHBgLg0KDQogICBgU1RBVEVfQVRMQU5USUMuc2hwYDogRXN0ZSBhcmNoaXZvIGNvbnRpZW5lIDExIGRhdG9zIHkgOSB2YXJpYWJsZXMuIERlIGxhcyBjdWFsZXMgcmVjb25vY2Vtb3M6ICANCiAgICsgYFJFR0lPTmA6IFN1ciDDsyBub3Jlc3RlLiAgDQogICArIGBESVZJU0lPTmA6IEF0bMOhbnRpY28gbWVkaW8gbyBBdGzDoW50aWNvIHN1ci4gIA0KICAgKyBgU1RBVEVgOiAxMSBFc3RhZG9zLiAoW1RoaXJ0ZWVuIENvbG9uaWVzXShodHRwczovL3d3dy53b3JsZGF0bGFzLmNvbS93ZWJpbWFnZS9jb3VudHJ5cy9uYW1lcmljYS91c3N0YXRlcy9jb2xvbmllcy5odG0pKSAgDQogICArIGBTVEFURV9BQmA6IDExIGFicmV2aWFjaW9uZXMgZGUgbG9zIGVzdGFkb3MuICANCiAgIA0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9DQpFc3RhZG8gPSByZWFkU2hhcGVTcGF0aWFsKGZpbGUuY2hvb3NlKCkpDQpgYGANCg0KLS0tDQoNCjMuIExlZW1vcyBsYSBiYXNlIGRlIGRhdG9zIGBkYXRhX2F0bGFudGljXzE5OThfMjAxMi5jc3ZgLCBtZWRpYW50ZSBsYSBmdW5jacOzbiBgcmVhZC5jc3ZgLCB5IGVzY29nZW1vcyBlbCBhcmNoaXZvIGVuIGVsIGRpcmVjdG9yaW8uDQoNCiAgIGBkYXRhX2F0bGFudGljXzE5OThfMjAxMi5jc3ZgOiBFc3RlIGFyY2hpdm8gY29udGllbmUgNjY2IGRhdG9zIHkgOSB2YXJpYWJsZXMuIERlIGxhcyBjdWFsZXMgcmVjb25vY2Vtb3MgbGFzIGNvb3JkZW5hZGFzICgkeCQsICR5JCkgY29uIGxhIHNpZ3VpZW50ZSBpbmZvcm1hY2nDs246DQogICArIGBSYXRlYDogVGFzYSBkZSBjw6FuY2VyIGRlIHB1bG3Ds24uDQogICArIGBQT1ZgOiBQb2JyZXphDQogICArIGBQTTI1YDogSW5kaWNhZG9yIGRlIGxhIGNvbnRhbWluYWNpw7NuIHVyYmFuYS4gDQogICArIGBOTzJgOiBFbCBkacOzeGlkbyBkZSBuaXRyw7NnZW5vIGNvbW8gY29uc2VjdWVuY2lhIGRlbCB0csOhZmljbyByb2RhZG8uDQogICArIGBTTzJgOiBFbCBkacOzeGlkbyBkZSBhenVmcmUgY29tbyBnYXMgY29udGFtaW5hbnRlIGRlbCBhaXJlLg0KDQoNCmBgYHtyfQ0KRGF0b3MgPSByZWFkLmNzdihmaWxlLmNob29zZSgpLCBoZWFkZXI9VCkgDQpgYGANCg0KLS0tDQoNCjQuIFVuaW1vcyBsb3MgRGF0YUZyYW1lczogQ29uZGFkbyB5IERhdG9zIHkgbG8gZ3VhcmRhbW9zIGVuIGxhIHZhcmlhYmxlIFNQREYuIFV0aWxpemFtb3MgbGEgZnVuY2nDs24gYG1lcmdlYCBwYXJhIGVsbG8gdW5pZW5kbyBwb3IgbGEgY29sdW1uYSAiKkZJUFMqIiBkZSBlc3RvcyBkYXRvcy4gDQoNCiAgICBOb3RhOiBFbCBgRklQUzogRmVkZXJhbCBJbmZvcm1hdGlvbiBQcm9jZXNzaW5nIFN0YW5kYXJkIFB1YmxpY2F0aW9uYCAoUHVibGljYWNpw7NuIGVzdMOhbmRhciBkZSBwcm9jZXNhbWllbnRvIGRlIGluZm9ybWFjacOzbiBmZWRlcmFsKSBlcmEgdW4gY8OzZGlnbyBkZSBlc3TDoW5kYXJlcyBkZSBwcm9jZXNhbWllbnRvIGRlIGluZm9ybWFjacOzbiBmZWRlcmFsIGRlIGNpbmNvIGTDrWdpdG9zIHF1ZSBpZGVudGlmaWNhYmEgZGUgbWFuZXJhIMO6bmljYSBhIGxvcyBjb25kYWRvcy4NCg0KDQpgYGB7cn0NClNQREYgPSBtZXJnZShDb25kYWRvLCBEYXRvcywgYnkgPSAiRklQUyIpIA0KbmFtZXMgKFNQREYpICNub21icmVzIGRlbCBvYmpldG8gU1BERg0KYGBgDQoNCi0tLQ0KDQo1LiBDYWxjdWxhbW9zIG1lZGlkYXMgZXN0YWTDrXN0aWNhcyBkZXNjcmlwdGl2YXMgZGVsIGNvbmp1bnRvIGRlIGRhdG9zIGdlb2dyw6FmaWNhbWVudGUgcG9uZGVyYWRhcyBtZWRpYW50ZSBsYSBmdW5jacOzbiBnd3NzLiBFc3RvIGluY2x1eWUgcGFyYSBjYWRhIHZhcmlhYmxlOiAqUmF0ZSosICpQTTIuNSosICpwb3YqLCBsYSBtZWRpYSwgZGVzdmlhY2nDs24gZXN0w6FuZGFyLCB2YXJpYW56YSwgYXNpbWV0csOtYSwgY29lZmljaWVudGUgZGUgdmFyaWFjacOzbiwgY292YXJpYW56YSB5IGNvcnJlbGFjacOzbiBlbnRyZSBsYXMgbWlzbWFzLCBsb2NhbGVzLg0KDQpgYGB7cn0NCkVzdGFkaXN0aWNvcyA9IGd3c3MoU1BERiwNCiAgICAgICAgICAgICAgICAgICAgdmFycyA9IGMoIlJhdGUiLCAiUE0yNSIsICJQT1YiKSwgDQogICAgICAgICAgICAgICAgICAgIGtlcm5lbCA9ICJiaXNxdWFyZSIsICMgRnVuY2lvbiBrZXJuZWwNCiAgICAgICAgICAgICAgICAgICAgYWRhcHRpdmUgPSBUUlVFLCAjIEJ3IGVzIGFkYXB0YXRpdm8gKHZhcmlhYmxlKQ0KICAgICAgICAgICAgICAgICAgICBidyA9IDQ4KSAjIEFuY2hvIGRlIGJhbmRhDQpFc3RhZGlzdGljb3MNCmBgYA0KDQotLS0NCg0KNi4gQSBjb250aW51YWNpw7NuIHNlIGRlZmluZW4gZGlmZXJlbnRlcyBjYXJhY3RlcsOtc3RpY2FzIHBhcmEgZ2VuZXJhciB1bmEgZnVuY2nDs24gcXVlIGdyYWZpcXVlIGNhZGEgZXN0YWTDrXN0aWNvIHBhcmEgY2FkYSB2YXJpYWJsZS4NCg0KYGBge3J9DQoNCiMgQXRyaWJ1dG8gcXVlIGRpYnVqYSBsYXMgZGVsaW1pdGFjaW9uZXMgZGUgbG9zIGVzdGFkb3MuDQpwb2x5cyA9IGxpc3QoInNwLmxpbmVzIiwgDQogICAgICAgICAgICAgYXMoRXN0YWRvLCAiU3BhdGlhbExpbmVzIiksIA0KICAgICAgICAgICAgIGNvbCA9ICJibGFjayIsIGx3ZD0xLCBsdHk9MikNCg0KIyBDcmVhbmRvIHVuYSBwYWxldGEgZGUgY29sb3Jlcy4NCmNvbC5wYWxldHRlID0gY29sb3JSYW1wUGFsZXR0ZSgNCiAgYygiYmx1ZSIsICJza3kgYmx1ZSIsICJncmVlbiIsICJ5ZWxsb3ciLCAicmVkIiksDQogIHNwYWNlID0gInJnYiIsIA0KICBpbnRlcnBvbGF0ZSA9ICJsaW5lYXIiKQ0KDQojIEZ1bmNpb24gcXVlIGdyYWZpY2EgbGFzIHZhcmlhYmxlcw0KZ3JhZmljYSA8LSBmdW5jdGlvbih2YmxlLCB0aXRsZSkgew0KICAgc3BwbG90KEVzdGFkaXN0aWNvcyRTREYsIA0KICAgICAgIHZibGUsIA0KICAgICAgIG1haW4gPSB0aXRsZSwgDQogICAgICAgc3AubGF5b3V0ID0gcG9seXMsIA0KICAgICAgIGNvbCA9ICJ0cmFuc3BhcmVudCIsIA0KICAgICAgIGNvbC5yZWdpb25zID0gY29sLnBhbGV0dGUoMTAwKSkNCn0NCmBgYA0KDQojIyBNZWRpYSBsb2NhbA0KDQpgYGB7ciBlY2hvPVRSVUV9DQpsaWJyYXJ5KGdyaWRFeHRyYSkNCng9Z3JhZmljYSgiUmF0ZV9MTSIsIlRhc2EgZGUgY2FuY2VyIE1MIikNCnk9Z3JhZmljYSgiUE0yNV9MTSIsIlBNMi41IE1MIikNCno9Z3JhZmljYSgiUE9WX0xNIiwiUG9icmV6YSBNTCIpDQpncmlkLmFycmFuZ2UoeCx5LHosIG5yb3c9MSwgbmNvbD0zKQ0KYGBgDQoNCioqQW7DoWxpc2lzOioqICANClBvZGVtb3Mgbm90YXIgcXVlIGxhcyB0cmVzIHZhcmlhYmxlcyB0aWVuZW4gY29tcG9ydGFtaWVudG9zIGFsZ28gc2ltaWxhcmVzLiBQdWVzIGRvbmRlIHNlIHByZXNlbnRhbiBtYXlvciBjb25jZW50cmFjacOzbiBwYXJhIGxhcyB0cmVzIHZhcmlhYmxlcywgZXMgZW4gZWwgc3VyIGRlbCBtYXBhLCBhdW5xdWUgbGEgbWF0ZXJpYSBwYXJ0aWN1bGFkYSAoUE0yLjUpIHRpZW5kZSB1biBwb2NvIG3DoXMgYWwgc3Vyb2VzdGUuIElndWFsbWVudGUsIGxhIG1lbm9yIGNvbmNlbnRyYWNpw7NuIHBhcmEgbGFzIHZhcmlhYmxlcyBlcyBlbiBlbCBub3J0ZSBkZWwgbWFwYS4NCg0KIyMgRGVzdmlhY2nDs24gZXN0w6FuZGFyIGxvY2FsDQoNCmBgYHtyfQ0KeD1ncmFmaWNhKCJSYXRlX0xTRCIsIlRhc2EgZGUgY2FuY2VyIERlTCIpDQp5PWdyYWZpY2EoIlBNMjVfTFNEIiwiUE0yLjUgRGVMIikNCno9Z3JhZmljYSgiUE9WX0xTRCIsIlBvYnJlemEgRGVMIikNCmdyaWQuYXJyYW5nZSh4LHkseiwgbnJvdz0xLCBuY29sPTMpDQpgYGANCg0KKipBbsOhbGlzaXM6KiogIA0KTGEgcHJpbWVyYSBncsOhZmljYSBpbmRpY2EgcXVlIGVuIGVsIGNlbnRybywgYWwgb2VzdGUsIGh1Ym8gbWF5b3IgZGlzcGVyc2nDs24gZW4gbGEgdGFzYSBkZSBjw6FuY2VyLCBlcyBkZWNpciwgbGEgdGFzYSBkZSBjw6FuY2VyIHZhcmnDsyBtdWNobyBlbiBlc2Egem9uYS4gTWlldHJhcyBxdWUgZW4gbG9zIGx1Z2FyZXMgZG9uZGUgc2UgdmUgYXp1bCwgaHVibyBtZW5vciBkaXNwZXJzacOzbiwgZXMgZGVjaXIsIHF1ZSBsYSB0YXNhIGRlIGPDoW5jZXIgZnVlIHNpbWlsYXIuDQoNClBhcmEgbGEgc2VndW5kYSBncsOhZmljYSwgaHVibyBtYXlvciBkaXNwZXJzacOzbiBlbiBlbCBub3J0ZSBkZWwgbWFwYSwgZXMgZGVjaXIgcXVlIGVsIGRpw6FtZXRybyBkZSBsYSBtYXRlcmlhIHBhcnRpY3VsYWRhIDIuNSB2YXJpw7MgbXVjaG8sIG1pZW50cmFzIHF1ZSBlbiBlbCBzdXIgZnVlIG3DoXMgc2ltaWxhci4NCg0KWSBlbiBsYSBncsOhZmljYSBkZSBsYSBwb2JyZXphLCBzZSBvYnNlcnZhIHF1ZSBodWJvIG1heW9yIGRpc3BlcnNpw7NuIGVuIGVsIHN1ciwgZXNvIGluZGljYSBxdWUgZXMgcHJvYmFibGUgcXVlIGV4aXN0YSBtYXlvciBkZXNpZ3VhbGRhZCBlY29uw7NtaWNhIHF1ZSBlbiBlbCBub3J0ZSBkZWwgbWFwYSwgcXVlIGVzIGRvbmRlIHNlIHByZXNlbnRhIGVsIG1lbm9yIHZhbG9yIGRlIGRpc3BlcnNpw7NuIHkgcG9yIGVuZGUgbWF5b3Igc2ltaWxhcmlkYWQuDQoNCiMjIENvZWZpY2llbnRlIGRlIHZhcmlhY2nDs24gbG9jYWwNCg0KYGBge3J9DQpsaWJyYXJ5KGdyaWRFeHRyYSkNCng9Z3JhZmljYSgiUmF0ZV9MQ1YiLCJUYXNhIGRlIGNhbmNlciBDdkwiKQ0KeT1ncmFmaWNhKCJQTTI1X0xDViIsIlBNMi41IEN2TCIpDQp6PWdyYWZpY2EoIlBPVl9MQ1YiLCJQb2JyZXphIEN2TCIpDQpncmlkLmFycmFuZ2UoeCx5LHosIG5yb3c9MSwgbmNvbD0zKQ0KYGBgDQpFbiBlc3RhZMOtc3RpY2EsIG1pZW50cmFzIG1heW9yIHNlYSBlbCB2YWxvciBkZWwgY29lZmljaWVudGUgZGUgdmFyaWFjacOzbiBoYXkgbWF5b3IgaGV0ZXJvZ2VuZWlkYWQgZGUgbG9zIHZhbG9yZXMgZGUgbGEgdmFyaWFibGU7IHkgYSBtZW5vciBDLlYuLCBtYXlvciBob21vZ2VuZWlkYWQgZW4gbG9zIHZhbG9yZXMgZGUgbGEgdmFyaWFibGUuIExhIGludGVycHJldGFjacOzbiBwdWVkZSBzZXIgc2ltaWxhciBhIGxhIGRlIGxhIGRlc3ZpYWNpw7NuIGVzdMOhbmRhciwgc29sbyBxdWUgYXF1w60gc2UgcHVlZGUgZXhwbGljYXIgY29uIGNhbnRpZGFkZXMgY3XDoW4gZGlzcGVyc29zIHJlYWxtZW50ZSBzb24gbG9zIGRhdG9zLCBwb3IgZWplbXBsbywgZW4gbGEgZ3LDoWZpY2EgZGUgbGEgcG9icmV6YSwgc2UgcHVlZGUgZGVjaXIgcXVlIGVuIGVsIHN1cmVzdGUgZMOzbmRlIHNlIHByZXNlbnRhIGxhIG1heW9yIGRpc3BlcnNpw7NuIGNvbiB1biBjb2VmaWNpZW50ZSBkZSB2YXJpYWNpw7NuIGFwcm94aW1hZGFtZW50ZSBkZSAwLjQ1IGluZGljYSB1bmEgY2FudGlkYWQgY29uc2lkZXJhYmxlIGRlIHF1ZSByZWFsbWVudGUgaGF5IGRlc2lndWFsZGFkIGVjb27Ds21pY2EgbyBzaW1wbGVtZW50ZSBubyBzZSB0b23DsyB1bmEgbXVlc3RyYSBzaWduaWZpY2F0aXZhIGVuIGVzYSB6b25hLiANCg0KVGFtYmnDqW4sIHBvciBlamVtcGxvLCBlbCBQTTIuNSwgbGEgem9uYSBtw6FzIGFsdGEgcHJlc2VudGEgdW4gY29lZmljaWVudGUgZGUgdmFyaWFjacOzbiBkZSAwLjE2LCB5IGVzdG8gaW5kaWNhIHF1ZSBhIHBlc2FyIGRlIHRlbmVyIHVuYSBhbHRhIGRpc3BlcnNpw7NuIGVuIGxvcyBkYXRvcywgZWwgY29tcG9ydGFtaWVudG8gZGUgbGEgY29uY2VudHJhY2nDs24gZGUgZXN0ZSBtYXRlcmlhbCBwdWVkZSBzZWd1aXIgY29tcG9ydMOhbmRvc2UgZGUgZm9ybWEgc2ltaWxhci4NCg0KIyMgQ29ycmVsYWNpw7NuIGdlb2dyw6FmaWNhbWVudGUgcG9uZGVyYWRhIGVudHJlIGxhIHRhc2EgZGUgY8OhbmNlciB5IGVsIFBNMi41DQoNCmBgYHtyfQ0KeD1ncmFmaWNhKCJDb3JyX1JhdGUuUE0yNSIsIkNvcnIgVGFzYSBkZSBjw6FuY2VyIHkgUE0yLjUiKQ0KeT1ncmFmaWNhKCJDb3JyX1JhdGUuUE9WIiwiQ29yciBUYXNhIGRlIGPDoW5jZXIgeSBQb2JyZXphIikNCmdyaWQuYXJyYW5nZSh4LHksIG5yb3c9MSwgbmNvbD0yKQ0KYGBgDQoNClNlZ8O6biBsYSBwcmltZXJhIGdyw6FmaWNhLCBkYWRvIHF1ZSBlbCBtYXlvciB2YWxvciBlcyAwLjA1IHkgZXN0ZSBzZSBhcHJveGltYSBhIGNlcm8sIHByw6FjdGljYW1lbnRlIG5vIGV4aXN0ZSB1bmEgcmVsYWNpw7NuIGVudHJlIGVzdGFzIGRvcyB2YXJpYWJsZXMgZW4gbGFzIHpvbmFzIGTDs25kZSBsb3MgY29sb3JlcyB2YXLDrWFuIGRlIHJvam8gYSB2ZXJkZSwgbWllbnRyYXMgcXVlIGVsIG1lbm9yIHZhbG9yIGVzIC0wLjIgeSBlc3RvIGluZGljYSBxdWUgZXMgcG9zaWJsZSBxdWUgZXhpc3RhIHVuYSByZWxhY2nDs24gaW52ZXJzYSwgZXMgZGVjaXIsIGRvbmRlIG1heW9yIHRhc2EgZGUgY8OhbmNlciBoYXksIG1lbm9yIGNvbmNlbnRyYWNpw7NuIGRlIFBNMi41LCBwZXJvIGlndWFsbWVudGUsIGVsIGNvZWZpY2llbnRlIGRlIGNvcnJlbGFjacOzbiBzaWd1ZSBzaWVudG8gYmFqbyB5IHBvciBlbmRlLCB1bmEgcmVsYWNpw7NuIG11eSBkw6liaWwuIEVuIGdlbmVyYWwsIHNlIHB1ZWRlIGNvbmNsdWlyIHF1ZSBubyBoYXkgcmVsYWNpw7NuIGVudHJlIGVzdGFzIGRvcyB2YXJpYWJsZXMuDQoNCkVuIGxhIHNlZ3VuZGEgZ3LDoWZpY2EsIHRvZG9zIGxvcyBuw7ptZXJvcyBzb24gcG9zaXRpdm9zIHBvciBsbyBxdWUgcHVlZGUgZXhpc3RpciB1bmEgcmVsYWNpw7NuIGRpcmVjdGEgZW50cmUgbGEgcG9icmV6YSB5IGxhIHRhc2EgZGUgY8OhbmNlciwgZGUgbW9kbyBxdWUgYSBtYXlvciB0YXNhIGRlIGPDoW5jZXIsIG1heW9yIGVzIGxhIHBvYnJlemEgcXVlIHNlIHB1ZWRlIHByZXNlbnRhciBlbiBsYSB6b25hIHkgdmljZXZlcnNhLiBEYWRvIHF1ZSwgZWwgbWF5b3IgdmFsb3IgZXMgYXByb3hpbWFkYW1lbnRlIDAuNiwgZXhpc3RlIHVuYSByZWxhY2nDs24gZnVlcnRlIGRlIGVzdGFzIHZhcmlhYmxlcyBlbiBsYSB6b25hIGNlbnRyby1vZXN0ZSwgbWllbnRyYXMgcXVlIGxhIHJlbGFjacOzbiBlcyBwcsOhY3RpY2FtZW50ZSBudWxhIGRvbmRlIGVsIGNvbG9yIGVzIGF6dWwsIGVzIGRlY2lyLCBhbCBzdXIgeSBhbCBub3Jlc3RlIGRlbCBtYXBhLg0KDQojIyBTaWduaWZpY2FuY2lhIGRlIGxvcyB2YWxvcmVzIGRlIGxhIGNvcnJlbGFjacOzbjoNCg0KRXN0YSBmdW5jacOzbiBpbXBsZW1lbnRhIHBydWViYXMgZGUgTW9udGUgQ2FybG8gKGFsZWF0b3JpemFjacOzbikgcGFyYSBsYXMgZXN0YWTDrXN0aWNhcyBkZSByZXN1bWVuIGRlIEdXIHF1ZSBzZSBlbmN1ZW50cmFuIGVuIGd3c3MuDQoNCmBgYHtyfQ0KRE08LWd3LmRpc3QoZHAubG9jYXQ9Y29vcmRpbmF0ZXMoU1BERikpDQoNCnRlc3Q8LWd3c3MubW9udGVjYXJsbyhkYXRhPVNQREYsIA0KICAgICAgICAgICAgICAgICAgICAgIHZhcnM9YygiUmF0ZSIsIlBNMjUiLCAiUE9WIiksIGJ3PTQ4LA0KICAgICAgICAgICAgICAgICAgICAgIGtlcm5lbCA9ImJpc3F1YXJlIiwgZE1hdD1ETSwNCiAgICAgICAgICAgICAgICAgICAgICBuc2ltPTk5LCBhZGFwdGl2ZSA9IFRSVUUpDQoNCnQgPC0gYXMuZGF0YS5mcmFtZSh0ZXN0KQ0KRXN0YWRpc3RpY29zJFNERiR0ZXN0LkNvcnJfUmF0ZS5QTTI1ID0gdCRDb3JyX1JhdGUuUE0yNQ0KRXN0YWRpc3RpY29zJFNERiR0ZXN0LkNvcnJfUmF0ZS5QT1YgPSB0JENvcnJfUmF0ZS5QT1YNCmBgYA0KDQpBIGNvbnRpbnVhY2nDs24gc2UgbXVlc3RyYSBsYSBzaWduaWZpY2FuY2lhIGRlIGxhIGNvcnJlbGFjacOzbiBlbnRyZSBsYSB0YXNhIGRlIGPDoW5jZXIgeSBsYSBwb2JyZXphLg0KDQoqKk5vdGE6KioNCkxhIGZ1bmNpw7NuIGBnd3NzLm1vbnRlY2FybG9gIGFycm9qYSBsYSBwcm9iYWJpbGlkYWQgZGUgbGFzIGVzdGFkw61zdGljYXMgZGUgcHJ1ZWJhIGdlb2dyw6FmaWNhbWVudGUgcG9uZGVyYWRhcywgcGFyYSBlc3RlIGNhc28gbGEgY29ycmVsYWNpw7NuLiBMdWVnbywgc2kgcDwwLjAyNSBvIHNpIHA+MC45NzUsIGVudG9uY2VzIHNlIHB1ZWRlIGRlY2lyIHF1ZSBsYSB2ZXJkYWRlcmEgY29ycmVsYWNpw7NuIGxvY2FsIGVzIHNpZ25pZmljYXRpdmFtZW50ZSBkaWZlcmVudGUgKGVuIGVsIG5pdmVsIGRlIDAuOTUpIGEgbGEgY29ycmVsYWNpw7NuIGxvY2FsIGVuY29udHJhZGEgcG9yIGNhc3VhbGlkYWQuDQoNCkVzdG8gaW5kaWNhIHF1ZSBlbiBsYXMgem9uYXMgYXp1bGVzIGRlIGxhcyBzaWd1aWVudGVzIGdyw6FmaWNhcywgbGEgY29ycmVsYWNpw7NuIGxvY2FsICBlbmNvbnRyYWRhIGVzIHNpZ25pZmljYXRpdmFtZW50ZSBkaWZlcmVudGUgYSBsYSBjb3JyZWxhY2nDs24gdmVyZGFkZXJhIGxvY2FsLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeSgiUkNvbG9yQnJld2VyIikgDQpteS5wYWxldHRlIDwtIGMoIiMyQzdGQjgiLCIjRURGOEIxIikNCg0KeD1zcHBsb3QoRXN0YWRpc3RpY29zJFNERiwgDQogICAgICAgIkNvcnJfUmF0ZS5QTTI1IiwgDQogICAgICAgbWFpbiA9ICJDb3JyZWxhY2nDs25cbiBUYXNhIGRlIGPDoW5jZXIgeSBQbTI1IiwgDQogICAgICAgc3AubGF5b3V0ID0gcG9seXMsIA0KICAgICAgIGNvbCA9ICJ0cmFuc3BhcmVudCIsIA0KICAgICAgIGNvbC5yZWdpb25zID0gY29sLnBhbGV0dGUoMTAwKSkNCg0KeT1zcHBsb3QoRXN0YWRpc3RpY29zJFNERiwNCiAgICAgICAidGVzdC5Db3JyX1JhdGUuUE0yNSIsIA0KICAgICAgIGNvbC5yZWdpb25zID0gbXkucGFsZXR0ZSwNCiAgICAgICBhdCA9IGMoMC4wLCAwLjAyNSwgMC45NzUsIDEpLA0KICAgICAgIG1haW4gPSAiU2lnbmlmaWNhbmNpYSBDb3JyZWxhY2nDs25cbiBUYXNhIGRlIGPDoW5jZXIgeSBQbTI1IiwNCiAgICAgICBzcC5sYXlvdXQgPSBwb2x5cykNCg0KZ3JpZC5hcnJhbmdlKHgseSwgbnJvdz0xLCBuY29sPTIpDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRX0NCng9c3BwbG90KEVzdGFkaXN0aWNvcyRTREYsIA0KICAgICAgICJDb3JyX1JhdGUuUE9WIiwgDQogICAgICAgbWFpbiA9ICJDb3JyZWxhY2nDs25cbiBUYXNhIGRlIGPDoW5jZXIgeSBQb2JyZXphIiwgDQogICAgICAgc3AubGF5b3V0ID0gcG9seXMsIA0KICAgICAgIGNvbCA9ICJ0cmFuc3BhcmVudCIsIA0KICAgICAgIGNvbC5yZWdpb25zID0gY29sLnBhbGV0dGUoMTAwKSkNCg0KeT1zcHBsb3QoRXN0YWRpc3RpY29zJFNERiwNCiAgICAgICAidGVzdC5Db3JyX1JhdGUuUE9WIiwgDQogICAgICAgY29sLnJlZ2lvbnMgPSBteS5wYWxldHRlLA0KICAgICAgIGF0ID0gYygwLjAsIDAuMDI1LCAwLjk3NSwgMSksDQogICAgICAgbWFpbiA9ICJTaWduaWZpY2FuY2lhIENvcnJlbGFjacOzblxuIFRhc2EgZGUgY8OhbmNlciB5IFBvYnJlemEiLA0KICAgICAgIHNwLmxheW91dCA9IHBvbHlzKQ0KDQpncmlkLmFycmFuZ2UoeCx5LCBucm93PTEsIG5jb2w9MikNCmBgYA0KDQoNCg==