library(rasterVis)
library(raster)
library(rgl)
library(rgdal)
library(elevatr)
library(sf)
library(tidyverse)
library(mapview)
munic <- sf::st_read("C:/Users/hinca/Documents/(A) Hinca/UNAL/Semestre 5/GeomƔtica/05_ANTIOQUIA/ADMINISTRATIVO/MGN_MPIO_POLITICO.shp")
Reading layer `MGN_MPIO_POLITICO' from data source 
  `C:\Users\hinca\Documents\(A) Hinca\UNAL\Semestre 5\GeomÔtica\05_ANTIOQUIA\ADMINISTRATIVO\MGN_MPIO_POLITICO.shp' 
  using driver `ESRI Shapefile'
Simple feature collection with 125 features and 9 fields
Geometry type: POLYGON
Dimension:     XY
Bounding box:  xmin: -77.12783 ymin: 5.418558 xmax: -73.88128 ymax: 8.873974
Geodetic CRS:  WGS 84
elevation <- get_elev_raster(munic, z = 10)

 Accessing raster elevation [-------------------------]   0%
 Accessing raster elevation [-------------------------]   1%
 Accessing raster elevation [-------------------------]   2%
 Accessing raster elevation [>------------------------]   2%
 Accessing raster elevation [>------------------------]   3%
 Accessing raster elevation [>------------------------]   4%
 Accessing raster elevation [>------------------------]   5%
Error in curl::curl_fetch_disk(url, x$path, handle = handle) : 
  Operation was aborted by an application callback
NA
if (require(rgdal)) {
 rf <- writeRaster(elevation, filename=file.path("C:/Users/hinca/Documents/(A) Hinca/UNAL/Semestre 5/GeomƔtica/antioquia_dem_z10.tif"), format="GTiff", overwrite=TRUE)
}
elevation <-  raster("C:/Users/hinca/Documents/(A) Hinca/UNAL/Semestre 5/GeomƔtica/antioquia_dem_z10.tif")
elevation
class      : RasterLayer 
dimensions : 6134, 5667, 34761378  (nrow, ncol, ncell)
resolution : 0.0006824976, 0.0006824976  (x, y)
extent     : -77.34375, -73.47604, 4.915657, 9.102097  (xmin, xmax, ymin, ymax)
crs        : +proj=longlat +datum=WGS84 +no_defs 
source     : antioquia_dem_z10.tif 
names      : antioquia_dem_z10 
values     : -1934, 4758  (min, max)
munic_sp <- as(munic, "Spatial")
plot(elevation, main="Datos de DEM descargados sin tratamiento [meters]")
plot(munic_sp,col="NA",border="black", add=TRUE)
text(coordinates(munic_sp), labels=as.character(munic$MPIO_CNMBR), 
     col="black", cex=0.20)

elev_crop = crop(elevation, munic_sp)
plot(elev_crop, main="DEM Recortado para Antioquia")
plot(munic_sp, add=TRUE)
text(coordinates(munic_sp), labels=as.character(munic_sp$MPIO_CNMBR), cex=0.2)

elev_crop
class      : RasterLayer 
dimensions : 5063, 4757, 24084691  (nrow, ncol, ncell)
resolution : 0.0006824976, 0.0006824976  (x, y)
extent     : -77.12808, -73.88144, 5.418657, 8.874143  (xmin, xmax, ymin, ymax)
crs        : +proj=longlat +datum=WGS84 +no_defs 
source     : memory
names      : antioquia_dem_z10 
values     : -1609, 4758  (min, max)
library(sp)
spatialref <- CRS(SRS_string="EPSG:32618")
pr3 <- projectExtent(elev_crop, crs=spatialref)
res(pr3) <- 180
rep_elev <- projectRaster(elev_crop, pr3)
rep_elev
class      : RasterLayer 
dimensions : 2126, 1998, 4247748  (nrow, ncol, ncell)
resolution : 180, 180  (x, y)
extent     : 264195.4, 623835.4, 598928.5, 981608.5  (xmin, xmax, ymin, ymax)
crs        : +proj=utm +zone=18 +datum=WGS84 +units=m +no_defs 
source     : memory
names      : antioquia_dem_z10 
values     : -692.154, 4490.655  (min, max)
(rep_munic = spTransform(munic_sp,spatialref))
class       : SpatialPolygonsDataFrame 
features    : 125 
extent      : 265363.8, 623567.1, 598938.4, 981215  (xmin, xmax, ymin, ymax)
crs         : +proj=utm +zone=18 +datum=WGS84 +units=m +no_defs 
variables   : 9
names       : DPTO_CCDGO, MPIO_CCDGO, MPIO_CNMBR,                          MPIO_CRSLC,    MPIO_NAREA, MPIO_NANO, DPTO_CNMBR,     Shape_Leng,      Shape_Area 
min values  :         05,      05001,  ABEJORRAL,                                1541,   15.83597275,      2017,  ANTIOQUIA, 0.172962481259, 0.0012928296672 
max values  :         05,      05895,   ZARAGOZA, Ordenanza 9 de Diciembre 15 de 1983, 2959.36315089,      2017,  ANTIOQUIA,  6.61177822771,   0.23894871119 
plot(rep_elev, main="Reprojected digital elevation model")
plot(rep_munic, lwd=0.5, add=TRUE)
text(coordinates(rep_munic), labels=as.character(rep_munic$MPIO_CNMBR), cex=0.2)

writeRaster(rep_elev, filename="C:/Users/hinca/Documents/(A) Hinca/UNAL/Semestre 5/GeomƔtica/rep_boyaca_dem.tif", datatype='INT4S', overwrite=TRUE)
hist(rep_elev)

promedio <- cellStats(rep_elev, 'mean')
minimo <- cellStats(rep_elev, 'min')
maximo <- cellStats(rep_elev, 'max')
desviacion  <- cellStats(rep_elev, 'sd')
metricas <- c('mean', 'min', 'max', 'std')
valores <- c(promedio, minimo, maximo, desviacion)
(df_estadisticas <- data.frame(metricas, valores))
slope = terrain(rep_elev,opt='slope', unit='degrees')
aspect = terrain(rep_elev,opt='aspect',unit='degrees')
hill = hillShade(slope,aspect,40,315)
plot(rep_elev,main="DEM for Antioquia municipalities [meters]", col=terrain.colors(25,alpha=0.8))
plot(rep_munic, add=TRUE, lwd=0.5)
text(coordinates(rep_munic), labels=as.character(rep_munic$MPIO_CNMBR), cex=0.2)

plot(slope,main="Slope for Antioquia municipalities [degrees]", col=topo.colors(6,alpha=0.6))
plot(rep_munic, add=TRUE, lwd=0.5)
text(coordinates(rep_munic), labels=as.character(rep_munic$MPIO_CNMBR), cex=0.2)

plot(aspect,main="Aspect for several municipalities [degrees]", col=rainbow(10,alpha=0.7))
plot(rep_munic, add=TRUE, lwd=0.5)
text(coordinates(rep_munic), labels=as.character(rep_munic$MPIO_CNMBR), cex=0.2)

plot(hill,
        col=grey(1:100/100),  
        legend=FALSE,         
        main="DEM for Antioquia municipalities [m]",
        axes=FALSE)           

plot(rep_elev, 
        axes=FALSE,
        col=terrain.colors(12, alpha=0.6), add=TRUE)
plot(rep_munic, add=TRUE, lwd=0.5)
text(coordinates(rep_munic), labels=as.character(rep_munic$MPIO_CNMBR), cex=0.2)

elmat %>%
  sphere_shade(texture = "desert") %>%
  add_water(detect_water(elmat), color = "desert") %>%
  add_shadow(ray_shade(elmat), 0.5) %>%
  add_shadow(ambient_shade(elmat), 0) %>%
  plot_map()
Error in hillshade[, , 1] * scales::rescale(shadowmap, c(max_darken, 1)) : 
  non-conformable arrays
lista <- list("MUTATƁ" , "CHIGORODƓ" , "CAREPA" , "APARTADƓ" , "TURBO" , "NECOCLƍ" , "ARBOLETES" , "SAN JUAN DE URABƁ")
(algunosmunicipios <- munic %>% filter(MPIO_CNMBR %in% unlist(lista)))
Simple feature collection with 8 features and 9 fields
Geometry type: POLYGON
Dimension:     XY
Bounding box:  xmin: -77.12783 ymin: 7.132796 xmax: -76.21803 ymax: 8.873974
Geodetic CRS:  WGS 84
  DPTO_CCDGO MPIO_CCDGO        MPIO_CNMBR
1         05      05051         ARBOLETES
2         05      05045          APARTADƓ
3         05      05837             TURBO
4         05      05172         CHIGORODƓ
5         05      05147            CAREPA
6         05      05659 SAN JUAN DE URABƁ
7         05      05490           NECOCLƍ
8         05      05480            MUTATƁ
                                           MPIO_CRSLC
1 Decreto departamental 340 del 30 de Agosto  de 1958
2                 Ordenanza 7 de Noviembre 30 de 1967
3                                                1840
4                Ordenanza 52 del 27 de Abril de 1915
5                 Ordenanza 7 de Diciembre 15 de 1983
6                     Ordenanza 58 de Marzo 3 de 1986
7                Ordenanza 23 de Noviembre 28 de 1977
8                                                1951
  MPIO_NAREA MPIO_NANO DPTO_CNMBR Shape_Leng
1   754.2525      2017  ANTIOQUIA  1.8586821
2   535.1801      2017  ANTIOQUIA  1.2876523
3  2959.3632      2017  ANTIOQUIA  6.6117782
4   721.6826      2017  ANTIOQUIA  1.6103856
5   387.2706      2017  ANTIOQUIA  1.3099406
6   251.9969      2017  ANTIOQUIA  0.8078772
7  1255.5439      2017  ANTIOQUIA  2.4147100
8  1198.2352      2017  ANTIOQUIA  1.6610843
  Shape_Area                       geometry
1 0.06185481 POLYGON ((-76.41355 8.87382...
2 0.04380111 POLYGON ((-76.42487 8.07299...
3 0.23894871 POLYGON ((-76.40525 8.47647...
4 0.05902320 POLYGON ((-76.80956 7.77069...
5 0.03168377 POLYGON ((-76.76941 7.87896...
6 0.02066743 POLYGON ((-76.47999 8.81150...
7 0.10289352 POLYGON ((-76.62422 8.70221...
8 0.08789726 POLYGON ((-76.49619 7.55139...
algunosmunicipios <- as(algunosmunicipios, "Spatial")
elev_cropA = crop(elevation, algunosmunicipios)
elev_cropA = mask(elev_cropA, algunosmunicipios)
plot(elev_cropA, main=" DEM UrabĆ” de Antioquia ")
plot(algunosmunicipios, add=TRUE)
text(coordinates(algunosmunicipios), labels=as.character(algunosmunicipios$MPIO_CNMBR), cex=0.3)

slopeA = terrain(elev_cropA, opt='slope', unit='degrees')
aspectA = terrain(elev_cropA, opt='aspect',unit='degrees')
hillM = hillShade(slopeA, aspectA, 40, 315)
plot(slopeA,main="Pendiente UrabĆ” de Antioquia [grados]", col=topo.colors(6,alpha=0.6))
plot(algunosmunicipios, add=TRUE, lwd=0.5)
text(coordinates(algunosmunicipios), labels=as.character(algunosmunicipios$MPIO_CNMBR), cex=0.3)

plot(aspectA,main="Aspecto UrabĆ” de Antioquia", col=rainbow(10,alpha=0.7))
plot(algunosmunicipios, add=TRUE, lwd=0.5)
text(coordinates(algunosmunicipios), labels=as.character(algunosmunicipios$MPIO_CNMBR), cex=0.3)

lista <- list("RIONEGRO" , "PEƑOL" , "GUARNE" , "SANTUARIO" , "MARINILLA" , "SAN VICENTE" , "GRANADA" , "CONCEPCIƓN" , "BARBOSA")
(algunosmunicipiosm <- munic %>% filter(MPIO_CNMBR %in% unlist(lista)))
Simple feature collection with 9 features and 9 fields
Geometry type: POLYGON
Dimension:     XY
Bounding box:  xmin: -75.50126 ymin: 6.018431 xmax: -75.05946 ymax: 6.513189
Geodetic CRS:  WGS 84
  DPTO_CCDGO MPIO_CCDGO  MPIO_CNMBR MPIO_CRSLC
1         05      05079     BARBOSA       1812
2         05      05697   SANTUARIO       1838
3         05      05206  CONCEPCIƓN       1773
4         05      05674 SAN VICENTE       1814
5         05      05615    RIONEGRO       1783
6         05      05541       PEƑOL       1774
7         05      05440   MARINILLA       1787
8         05      05318      GUARNE       1817
9         05      05313     GRANADA       1817
  MPIO_NAREA MPIO_NANO DPTO_CNMBR Shape_Leng
1  205.66617      2017  ANTIOQUIA  0.7700180
2   83.45109      2017  ANTIOQUIA  0.6097303
3  202.05449      2017  ANTIOQUIA  0.7150559
4  230.49117      2017  ANTIOQUIA  0.7710366
5  195.94020      2017  ANTIOQUIA  0.8907217
6  118.31435      2017  ANTIOQUIA  0.6187559
7  114.87120      2017  ANTIOQUIA  0.6129668
8  151.81382      2017  ANTIOQUIA  0.7063743
9  190.22512      2017  ANTIOQUIA  0.7639613
   Shape_Area                       geometry
1 0.016803898 POLYGON ((-75.32148 6.51265...
2 0.006814663 POLYGON ((-75.24933 6.17184...
3 0.016508022 POLYGON ((-75.21393 6.45258...
4 0.018827491 POLYGON ((-75.33483 6.39938...
5 0.015999436 POLYGON ((-75.37699 6.23349...
6 0.009663738 POLYGON ((-75.23488 6.32415...
7 0.009381138 POLYGON ((-75.29652 6.26197...
8 0.012398701 POLYGON ((-75.40888 6.34896...
9 0.015535174 POLYGON ((-75.122 6.22429, ...
algunosmunicipiosm <- as(algunosmunicipiosm, "Spatial")
elev_cropM = crop(elevation, algunosmunicipiosm)
elev_cropM = mask(elev_cropM, algunosmunicipiosm)
plot(elev_cropM, main=" DEM Zona MontaƱosa de Antioquia ")
plot(algunosmunicipiosm, add=TRUE)
text(coordinates(algunosmunicipiosm), labels=as.character(algunosmunicipiosm$MPIO_CNMBR), cex=0.3)

slopeM = terrain(elev_cropM, opt='slope', unit='degrees')
aspectM = terrain(elev_cropM, opt='aspect',unit='degrees')
hillM = hillShade(slopeM, aspectM, 40, 315)
plot(slopeM,main="Pendiente Zona MontaƱosa Antioquia [grados]", col=topo.colors(6,alpha=0.6))
plot(algunosmunicipiosm, add=TRUE, lwd=0.5)
text(coordinates(algunosmunicipiosm), labels=as.character(algunosmunicipiosm$MPIO_CNMBR), cex=0.3)

plot(aspectM,main="Aspecto Zona MontaƱosa de Antioquia", col=rainbow(10,alpha=0.7))
plot(algunosmunicipiosm, add=TRUE, lwd=0.5)
text(coordinates(algunosmunicipiosm), labels=as.character(algunosmunicipiosm$MPIO_CNMBR), cex=0.3)

LS0tDQp0aXRsZTogIkRhdG9zIGRlIEVsZXZhY2nDs24gQW50aW9xdWlhIg0KRGF0ZTogIjI1LjExLjIwMjEiDQpBdXRob3I6ICJBbmRyw6lzIEhpbmNhcGnDqSBDYXN0YcOxZWRhIHkgTWFyw61hIEZlcm5hbmRhIFNhbnRhZsOpIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCmBgYHtyfQ0KbGlicmFyeShyYXN0ZXJWaXMpDQpsaWJyYXJ5KHJhc3RlcikNCmxpYnJhcnkocmdsKQ0KbGlicmFyeShyZ2RhbCkNCmxpYnJhcnkoZWxldmF0cikNCmxpYnJhcnkoc2YpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkobWFwdmlldykNCmBgYA0KYGBge3J9DQptdW5pYyA8LSBzZjo6c3RfcmVhZCgiQzovVXNlcnMvaGluY2EvRG9jdW1lbnRzLyhBKSBIaW5jYS9VTkFML1NlbWVzdHJlIDUvR2VvbcOhdGljYS8wNV9BTlRJT1FVSUEvQURNSU5JU1RSQVRJVk8vTUdOX01QSU9fUE9MSVRJQ08uc2hwIikNCmBgYA0KDQpgYGB7cn0NCmVsZXZhdGlvbiA8LSBnZXRfZWxldl9yYXN0ZXIobXVuaWMsIHogPSAxMCkNCmBgYA0KDQpgYGB7cn0NCmlmIChyZXF1aXJlKHJnZGFsKSkgew0KIHJmIDwtIHdyaXRlUmFzdGVyKGVsZXZhdGlvbiwgZmlsZW5hbWU9ZmlsZS5wYXRoKCJDOi9Vc2Vycy9oaW5jYS9Eb2N1bWVudHMvKEEpIEhpbmNhL1VOQUwvU2VtZXN0cmUgNS9HZW9tw6F0aWNhL2FudGlvcXVpYV9kZW1fejEwLnRpZiIpLCBmb3JtYXQ9IkdUaWZmIiwgb3ZlcndyaXRlPVRSVUUpDQp9DQpgYGANCmBgYHtyfQ0KZWxldmF0aW9uIDwtICByYXN0ZXIoIkM6L1VzZXJzL2hpbmNhL0RvY3VtZW50cy8oQSkgSGluY2EvVU5BTC9TZW1lc3RyZSA1L0dlb23DoXRpY2EvYW50aW9xdWlhX2RlbV96MTAudGlmIikNCmBgYA0KYGBge3J9DQplbGV2YXRpb24NCmBgYA0KDQpgYGB7cn0NCm11bmljX3NwIDwtIGFzKG11bmljLCAiU3BhdGlhbCIpDQpgYGANCmBgYHtyfQ0KcGxvdChlbGV2YXRpb24sIG1haW49IkRhdG9zIGRlIERFTSBkZXNjYXJnYWRvcyBzaW4gdHJhdGFtaWVudG8gW21ldGVyc10iKQ0KcGxvdChtdW5pY19zcCxjb2w9Ik5BIixib3JkZXI9ImJsYWNrIiwgYWRkPVRSVUUpDQp0ZXh0KGNvb3JkaW5hdGVzKG11bmljX3NwKSwgbGFiZWxzPWFzLmNoYXJhY3RlcihtdW5pYyRNUElPX0NOTUJSKSwgDQogICAgIGNvbD0iYmxhY2siLCBjZXg9MC4yMCkNCmBgYA0KYGBge3J9DQplbGV2X2Nyb3AgPSBjcm9wKGVsZXZhdGlvbiwgbXVuaWNfc3ApDQpwbG90KGVsZXZfY3JvcCwgbWFpbj0iREVNIFJlY29ydGFkbyBwYXJhIEFudGlvcXVpYSIpDQpwbG90KG11bmljX3NwLCBhZGQ9VFJVRSkNCnRleHQoY29vcmRpbmF0ZXMobXVuaWNfc3ApLCBsYWJlbHM9YXMuY2hhcmFjdGVyKG11bmljX3NwJE1QSU9fQ05NQlIpLCBjZXg9MC4yKQ0KYGBgDQpgYGB7cn0NCmVsZXZfY3JvcA0KYGBgDQpgYGB7cn0NCmNycyhlbGV2X2Nyb3ApDQpgYGANCmBgYHtyfQ0KbGlicmFyeShzcCkNCnNwYXRpYWxyZWYgPC0gQ1JTKFNSU19zdHJpbmc9IkVQU0c6MzI2MTgiKQ0KYGBgDQpgYGB7cn0NCnByMyA8LSBwcm9qZWN0RXh0ZW50KGVsZXZfY3JvcCwgY3JzPXNwYXRpYWxyZWYpDQpyZXMocHIzKSA8LSAxODANCnJlcF9lbGV2IDwtIHByb2plY3RSYXN0ZXIoZWxldl9jcm9wLCBwcjMpDQpgYGANCg0KYGBge3J9DQpyZXBfZWxldg0KYGBgDQoNCmBgYHtyfQ0KKHJlcF9tdW5pYyA9IHNwVHJhbnNmb3JtKG11bmljX3NwLHNwYXRpYWxyZWYpKQ0KYGBgDQpgYGB7cn0NCnBsb3QocmVwX2VsZXYsIG1haW49IlJlcHJvamVjdGVkIGRpZ2l0YWwgZWxldmF0aW9uIG1vZGVsIikNCnBsb3QocmVwX211bmljLCBsd2Q9MC41LCBhZGQ9VFJVRSkNCnRleHQoY29vcmRpbmF0ZXMocmVwX211bmljKSwgbGFiZWxzPWFzLmNoYXJhY3RlcihyZXBfbXVuaWMkTVBJT19DTk1CUiksIGNleD0wLjIpDQpgYGANCmBgYHtyfQ0Kd3JpdGVSYXN0ZXIocmVwX2VsZXYsIGZpbGVuYW1lPSJDOi9Vc2Vycy9oaW5jYS9Eb2N1bWVudHMvKEEpIEhpbmNhL1VOQUwvU2VtZXN0cmUgNS9HZW9tw6F0aWNhL3JlcF9ib3lhY2FfZGVtLnRpZiIsIGRhdGF0eXBlPSdJTlQ0UycsIG92ZXJ3cml0ZT1UUlVFKQ0KYGBgDQpgYGB7cn0NCmhpc3QocmVwX2VsZXYpDQpgYGANCmBgYHtyfQ0KcHJvbWVkaW8gPC0gY2VsbFN0YXRzKHJlcF9lbGV2LCAnbWVhbicpDQptaW5pbW8gPC0gY2VsbFN0YXRzKHJlcF9lbGV2LCAnbWluJykNCm1heGltbyA8LSBjZWxsU3RhdHMocmVwX2VsZXYsICdtYXgnKQ0KZGVzdmlhY2lvbiAgPC0gY2VsbFN0YXRzKHJlcF9lbGV2LCAnc2QnKQ0KYGBgDQoNCmBgYHtyfQ0KbWV0cmljYXMgPC0gYygnbWVhbicsICdtaW4nLCAnbWF4JywgJ3N0ZCcpDQp2YWxvcmVzIDwtIGMocHJvbWVkaW8sIG1pbmltbywgbWF4aW1vLCBkZXN2aWFjaW9uKQ0KYGBgDQpgYGB7cn0NCihkZl9lc3RhZGlzdGljYXMgPC0gZGF0YS5mcmFtZShtZXRyaWNhcywgdmFsb3JlcykpDQpgYGANCg0KYGBge3J9DQpzbG9wZSA9IHRlcnJhaW4ocmVwX2VsZXYsb3B0PSdzbG9wZScsIHVuaXQ9J2RlZ3JlZXMnKQ0KYXNwZWN0ID0gdGVycmFpbihyZXBfZWxldixvcHQ9J2FzcGVjdCcsdW5pdD0nZGVncmVlcycpDQpoaWxsID0gaGlsbFNoYWRlKHNsb3BlLGFzcGVjdCw0MCwzMTUpDQpgYGANCmBgYHtyfQ0KcGxvdChyZXBfZWxldixtYWluPSJERU0gZm9yIEFudGlvcXVpYSBtdW5pY2lwYWxpdGllcyBbbWV0ZXJzXSIsIGNvbD10ZXJyYWluLmNvbG9ycygyNSxhbHBoYT0wLjgpKQ0KcGxvdChyZXBfbXVuaWMsIGFkZD1UUlVFLCBsd2Q9MC41KQ0KdGV4dChjb29yZGluYXRlcyhyZXBfbXVuaWMpLCBsYWJlbHM9YXMuY2hhcmFjdGVyKHJlcF9tdW5pYyRNUElPX0NOTUJSKSwgY2V4PTAuMikNCmBgYA0KYGBge3J9DQpwbG90KHNsb3BlLG1haW49IlNsb3BlIGZvciBBbnRpb3F1aWEgbXVuaWNpcGFsaXRpZXMgW2RlZ3JlZXNdIiwgY29sPXRvcG8uY29sb3JzKDYsYWxwaGE9MC42KSkNCnBsb3QocmVwX211bmljLCBhZGQ9VFJVRSwgbHdkPTAuNSkNCnRleHQoY29vcmRpbmF0ZXMocmVwX211bmljKSwgbGFiZWxzPWFzLmNoYXJhY3RlcihyZXBfbXVuaWMkTVBJT19DTk1CUiksIGNleD0wLjIpDQpgYGANCg0KYGBge3J9DQpwbG90KGFzcGVjdCxtYWluPSJBc3BlY3QgZm9yIHNldmVyYWwgbXVuaWNpcGFsaXRpZXMgW2RlZ3JlZXNdIiwgY29sPXJhaW5ib3coMTAsYWxwaGE9MC43KSkNCnBsb3QocmVwX211bmljLCBhZGQ9VFJVRSwgbHdkPTAuNSkNCnRleHQoY29vcmRpbmF0ZXMocmVwX211bmljKSwgbGFiZWxzPWFzLmNoYXJhY3RlcihyZXBfbXVuaWMkTVBJT19DTk1CUiksIGNleD0wLjIpDQpgYGANCg0KYGBge3J9DQpwbG90KGhpbGwsDQogICAgICAgIGNvbD1ncmV5KDE6MTAwLzEwMCksICANCiAgICAgICAgbGVnZW5kPUZBTFNFLCAgICAgICAgIA0KICAgICAgICBtYWluPSJERU0gZm9yIEFudGlvcXVpYSBtdW5pY2lwYWxpdGllcyBbbV0iLA0KICAgICAgICBheGVzPUZBTFNFKSAgICAgICAgICAgDQoNCnBsb3QocmVwX2VsZXYsIA0KICAgICAgICBheGVzPUZBTFNFLA0KICAgICAgICBjb2w9dGVycmFpbi5jb2xvcnMoMTIsIGFscGhhPTAuNiksIGFkZD1UUlVFKQ0KcGxvdChyZXBfbXVuaWMsIGFkZD1UUlVFLCBsd2Q9MC41KQ0KdGV4dChjb29yZGluYXRlcyhyZXBfbXVuaWMpLCBsYWJlbHM9YXMuY2hhcmFjdGVyKHJlcF9tdW5pYyRNUElPX0NOTUJSKSwgY2V4PTAuMikNCmBgYA0KYGBge3J9DQpsaWJyYXJ5KHJheXNoYWRlcikNCmBgYA0KYGBge3J9DQplbG1hdCA9IHJhc3Rlcl90b19tYXRyaXgocmVwX2VsZXYpDQpgYGANCg0KYGBge3J9DQplbG1hdCAlPiUNCiAgc3BoZXJlX3NoYWRlKHRleHR1cmUgPSAiZGVzZXJ0IikgJT4lDQogIGFkZF93YXRlcihkZXRlY3Rfd2F0ZXIoZWxtYXQpLCBjb2xvciA9ICJkZXNlcnQiKSAlPiUNCiAgYWRkX3NoYWRvdyhyYXlfc2hhZGUoZWxtYXQpLCAwLjUpICU+JQ0KICBhZGRfc2hhZG93KGFtYmllbnRfc2hhZGUoZWxtYXQpLCAwKSAlPiUNCiAgcGxvdF9tYXAoKQ0KYGBgDQpgYGB7cn0NCmxpc3RhIDwtIGxpc3QoIk1VVEFUw4EiICwgIkNISUdPUk9Ew5MiICwgIkNBUkVQQSIgLCAiQVBBUlRBRMOTIiAsICJUVVJCTyIgLCAiTkVDT0NMw40iICwgIkFSQk9MRVRFUyIgLCAiU0FOIEpVQU4gREUgVVJBQsOBIikNCihhbGd1bm9zbXVuaWNpcGlvcyA8LSBtdW5pYyAlPiUgZmlsdGVyKE1QSU9fQ05NQlIgJWluJSB1bmxpc3QobGlzdGEpKSkNCmBgYA0KDQpgYGB7cn0NCmFsZ3Vub3NtdW5pY2lwaW9zIDwtIGFzKGFsZ3Vub3NtdW5pY2lwaW9zLCAiU3BhdGlhbCIpDQpgYGANCmBgYHtyfQ0KZWxldl9jcm9wQSA9IGNyb3AoZWxldmF0aW9uLCBhbGd1bm9zbXVuaWNpcGlvcykNCmVsZXZfY3JvcEEgPSBtYXNrKGVsZXZfY3JvcEEsIGFsZ3Vub3NtdW5pY2lwaW9zKQ0KcGxvdChlbGV2X2Nyb3BBLCBtYWluPSIgREVNIFVyYWLDoSBkZSBBbnRpb3F1aWEgIikNCnBsb3QoYWxndW5vc211bmljaXBpb3MsIGFkZD1UUlVFKQ0KdGV4dChjb29yZGluYXRlcyhhbGd1bm9zbXVuaWNpcGlvcyksIGxhYmVscz1hcy5jaGFyYWN0ZXIoYWxndW5vc211bmljaXBpb3MkTVBJT19DTk1CUiksIGNleD0wLjMpDQpgYGANCg0KDQoNCmBgYHtyfQ0Kc2xvcGVBID0gdGVycmFpbihlbGV2X2Nyb3BBLCBvcHQ9J3Nsb3BlJywgdW5pdD0nZGVncmVlcycpDQphc3BlY3RBID0gdGVycmFpbihlbGV2X2Nyb3BBLCBvcHQ9J2FzcGVjdCcsdW5pdD0nZGVncmVlcycpDQpoaWxsTSA9IGhpbGxTaGFkZShzbG9wZUEsIGFzcGVjdEEsIDQwLCAzMTUpDQpgYGANCmBgYHtyfQ0KcGxvdChzbG9wZUEsbWFpbj0iUGVuZGllbnRlIFVyYWLDoSBkZSBBbnRpb3F1aWEgW2dyYWRvc10iLCBjb2w9dG9wby5jb2xvcnMoNixhbHBoYT0wLjYpKQ0KcGxvdChhbGd1bm9zbXVuaWNpcGlvcywgYWRkPVRSVUUsIGx3ZD0wLjUpDQp0ZXh0KGNvb3JkaW5hdGVzKGFsZ3Vub3NtdW5pY2lwaW9zKSwgbGFiZWxzPWFzLmNoYXJhY3RlcihhbGd1bm9zbXVuaWNpcGlvcyRNUElPX0NOTUJSKSwgY2V4PTAuMykNCmBgYA0KYGBge3J9DQpwbG90KGFzcGVjdEEsbWFpbj0iQXNwZWN0byBVcmFiw6EgZGUgQW50aW9xdWlhIiwgY29sPXJhaW5ib3coMTAsYWxwaGE9MC43KSkNCnBsb3QoYWxndW5vc211bmljaXBpb3MsIGFkZD1UUlVFLCBsd2Q9MC41KQ0KdGV4dChjb29yZGluYXRlcyhhbGd1bm9zbXVuaWNpcGlvcyksIGxhYmVscz1hcy5jaGFyYWN0ZXIoYWxndW5vc211bmljaXBpb3MkTVBJT19DTk1CUiksIGNleD0wLjMpDQpgYGANCmBgYHtyfQ0KbGlzdGEgPC0gbGlzdCgiUklPTkVHUk8iICwgIlBFw5FPTCIgLCAiR1VBUk5FIiAsICJTQU5UVUFSSU8iICwgIk1BUklOSUxMQSIgLCAiU0FOIFZJQ0VOVEUiICwgIkdSQU5BREEiICwgIkNPTkNFUENJw5NOIiAsICJCQVJCT1NBIikNCihhbGd1bm9zbXVuaWNpcGlvc20gPC0gbXVuaWMgJT4lIGZpbHRlcihNUElPX0NOTUJSICVpbiUgdW5saXN0KGxpc3RhKSkpDQpgYGANCmBgYHtyfQ0KYWxndW5vc211bmljaXBpb3NtIDwtIGFzKGFsZ3Vub3NtdW5pY2lwaW9zbSwgIlNwYXRpYWwiKQ0KYGBgDQpgYGB7cn0NCmVsZXZfY3JvcE0gPSBjcm9wKGVsZXZhdGlvbiwgYWxndW5vc211bmljaXBpb3NtKQ0KZWxldl9jcm9wTSA9IG1hc2soZWxldl9jcm9wTSwgYWxndW5vc211bmljaXBpb3NtKQ0KcGxvdChlbGV2X2Nyb3BNLCBtYWluPSIgREVNIFpvbmEgTW9udGHDsW9zYSBkZSBBbnRpb3F1aWEgIikNCnBsb3QoYWxndW5vc211bmljaXBpb3NtLCBhZGQ9VFJVRSkNCnRleHQoY29vcmRpbmF0ZXMoYWxndW5vc211bmljaXBpb3NtKSwgbGFiZWxzPWFzLmNoYXJhY3RlcihhbGd1bm9zbXVuaWNpcGlvc20kTVBJT19DTk1CUiksIGNleD0wLjMpDQpgYGANCg0KYGBge3J9DQpzbG9wZU0gPSB0ZXJyYWluKGVsZXZfY3JvcE0sIG9wdD0nc2xvcGUnLCB1bml0PSdkZWdyZWVzJykNCmFzcGVjdE0gPSB0ZXJyYWluKGVsZXZfY3JvcE0sIG9wdD0nYXNwZWN0Jyx1bml0PSdkZWdyZWVzJykNCmhpbGxNID0gaGlsbFNoYWRlKHNsb3BlTSwgYXNwZWN0TSwgNDAsIDMxNSkNCmBgYA0KYGBge3J9DQpwbG90KHNsb3BlTSxtYWluPSJQZW5kaWVudGUgWm9uYSBNb250YcOxb3NhIEFudGlvcXVpYSBbZ3JhZG9zXSIsIGNvbD10b3BvLmNvbG9ycyg2LGFscGhhPTAuNikpDQpwbG90KGFsZ3Vub3NtdW5pY2lwaW9zbSwgYWRkPVRSVUUsIGx3ZD0wLjUpDQp0ZXh0KGNvb3JkaW5hdGVzKGFsZ3Vub3NtdW5pY2lwaW9zbSksIGxhYmVscz1hcy5jaGFyYWN0ZXIoYWxndW5vc211bmljaXBpb3NtJE1QSU9fQ05NQlIpLCBjZXg9MC4zKQ0KYGBgDQpgYGB7cn0NCnBsb3QoYXNwZWN0TSxtYWluPSJBc3BlY3RvIFpvbmEgTW9udGHDsW9zYSBkZSBBbnRpb3F1aWEiLCBjb2w9cmFpbmJvdygxMCxhbHBoYT0wLjcpKQ0KcGxvdChhbGd1bm9zbXVuaWNpcGlvc20sIGFkZD1UUlVFLCBsd2Q9MC41KQ0KdGV4dChjb29yZGluYXRlcyhhbGd1bm9zbXVuaWNpcGlvc20pLCBsYWJlbHM9YXMuY2hhcmFjdGVyKGFsZ3Vub3NtdW5pY2lwaW9zbSRNUElPX0NOTUJSKSwgY2V4PTAuMykNCmBgYA0KDQo=