1. Primero vamos a instalar aquellos paquetes o librerías que no hemos instalado previamente.

install.packages( c( "sf", "stars","leaflet", "gstat","automap","raster", "RColorBrewer"))

2. Ahora vamos a cargar las librerías que requerimos usar las cuales ya debieron ser instaladas en el paso anterior.

library(sf)
library(stars)
library(leaflet)
library(gstat)
library(automap)
library(raster)
library(RColorBrewer)

3. Vamos a ajustar el directorio de trabajo con el fin que sea el mismo en el cual se encuentra almacenado el archivo R script.

El directorio de trabajo es aquel en el cual se guardan por defecto los archivos creados al trabajar con rutas relativas.

La siguiente línea nos muestra cual es el directorio de trabajo actual.

getwd()
[1] "C:/Users/Karen González/OneDrive/Escritorio/Taller examen geomática/Interpolacion"

4. Declarar las variables

ruta_aoi="./municipios_muestreo.shp"
ruta_puntos="./puntos_muestreo.shp" #Ruta de archivo shp de puntos de muestreo
ruta_raster="./dem_srtm_9377.tif"   #Ruta de DEM (tif) de área de estudio

5. Leer y visualizar los archivos de datos (shp y tif) que se van a usar

La siguiente línea lee el archivo del DEM como un elemento de R y lo almacena en la variable raster_dem Tiene los siguientes componentes:

read_stars: Es una función del paquete stars en R que se utiliza para leer archivos ráster. ruta_raster: CVariable que contiene la ruta al archivo ráster que se leerá. RasterIO = Argumento que permite especificar opciones para la lectura del archivo. En este caso, RasterIO se usa para especificar que va a leer solamente la banda 1 del ráster (list(bands = 1)). El ráster del DEM solo tiene 1 banda pero es común trabajar con rásters multibanda

Esta opción es muy útil para especificar la banda específica con la que se desea trabajar.

raster_dem=read_stars(ruta_raster, RasterIO = list(bands = 1))
    raster_dem
stars object with 2 dimensions and 1 attribute
attribute(s), summary of first 1e+05 cells:
                   Min. 1st Qu. Median    Mean 3rd Qu. Max.
dem_srtm_9377.tif  -247       0      0 131.274       0 1673
dimension(s):
    plot(raster_dem)
downsample set to 1

    crs_raster=st_crs(raster_dem)
    crs_raster
Coordinate Reference System:
  User input: MAGNA-SIRGAS 2018 / Origen-Nacional 
  wkt:
PROJCRS["MAGNA-SIRGAS 2018 / Origen-Nacional",
    BASEGEOGCRS["MAGNA-SIRGAS 2018",
        DATUM["Marco Geocentrico Nacional de Referencia 2018",
            ELLIPSOID["GRS 1980",6378137,298.257222101,
                LENGTHUNIT["metre",1]]],
        PRIMEM["Greenwich",0,
            ANGLEUNIT["degree",0.0174532925199433]],
        ID["EPSG",20046]],
    CONVERSION["Colombia Transverse Mercator",
        METHOD["Transverse Mercator",
            ID["EPSG",9807]],
        PARAMETER["Latitude of natural origin",4,
            ANGLEUNIT["degree",0.0174532925199433],
            ID["EPSG",8801]],
        PARAMETER["Longitude of natural origin",-73,
            ANGLEUNIT["degree",0.0174532925199433],
            ID["EPSG",8802]],
        PARAMETER["Scale factor at natural origin",0.9992,
            SCALEUNIT["unity",1],
            ID["EPSG",8805]],
        PARAMETER["False easting",5000000,
            LENGTHUNIT["metre",1],
            ID["EPSG",8806]],
        PARAMETER["False northing",2000000,
            LENGTHUNIT["metre",1],
            ID["EPSG",8807]]],
    CS[Cartesian,2],
        AXIS["northing (N)",north,
            ORDER[1],
            LENGTHUNIT["metre",1]],
        AXIS["easting (E)",east,
            ORDER[2],
            LENGTHUNIT["metre",1]],
    USAGE[
        SCOPE["Cadastre, topographic mapping."],
        AREA["Colombia - onshore and offshore. Includes San Andres y Providencia, Malpelo Islands, Roncador Bank, Serrana Bank and Serranilla Bank."],
        BBOX[-4.23,-84.77,15.51,-66.87]],
    ID["EPSG",9377]]

La siguiente línea permite leer el archivo shapefile de los puntos de muestreo como un objeto de R

 puntos = st_read(ruta_puntos)
Reading layer `puntos_muestreo' from data source 
  `C:\Users\Karen González\OneDrive\Escritorio\Taller examen geomática\Interpolacion\puntos_muestreo.shp' 
  using driver `ESRI Shapefile'
Simple feature collection with 67 features and 16 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: 4968206 ymin: 2257635 xmax: 5005157 ymax: 2292361
Projected CRS: MAGNA-SIRGAS_Origen-Nacional
    crs_puntos=st_crs(puntos)
    crs_puntos
Coordinate Reference System:
  User input: MAGNA-SIRGAS_Origen-Nacional 
  wkt:
PROJCRS["MAGNA-SIRGAS_Origen-Nacional",
    BASEGEOGCRS["GCS_MAGNA-SIRGAS_2018",
        DATUM["Marco Geocentrico Nacional de Referencia 2018",
            ELLIPSOID["GRS 1980",6378137,298.257222101,
                LENGTHUNIT["metre",1]],
            ID["EPSG",1329]],
        PRIMEM["Greenwich",0,
            ANGLEUNIT["Degree",0.0174532925199433]]],
    CONVERSION["unnamed",
        METHOD["Transverse Mercator",
            ID["EPSG",9807]],
        PARAMETER["Latitude of natural origin",4,
            ANGLEUNIT["Degree",0.0174532925199433],
            ID["EPSG",8801]],
        PARAMETER["Longitude of natural origin",-73,
            ANGLEUNIT["Degree",0.0174532925199433],
            ID["EPSG",8802]],
        PARAMETER["Scale factor at natural origin",0.9992,
            SCALEUNIT["unity",1],
            ID["EPSG",8805]],
        PARAMETER["False easting",5000000,
            LENGTHUNIT["metre",1],
            ID["EPSG",8806]],
        PARAMETER["False northing",2000000,
            LENGTHUNIT["metre",1],
            ID["EPSG",8807]]],
    CS[Cartesian,2],
        AXIS["(E)",east,
            ORDER[1],
            LENGTHUNIT["metre",1,
                ID["EPSG",9001]]],
        AXIS["(N)",north,
            ORDER[2],
            LENGTHUNIT["metre",1,
                ID["EPSG",9001]]]]

Aunque aparentemente tienen el mismo sistema de referencia de coordenadas, existen diferencias en la representación del CRS. Estas diferencias en la representación pueden hacer que R o los paquetes de manejo de CRS consideren los objetos como distintos, a pesar de que geométricamente podrían representar el mismo sistema de referencia.

Comparar los sistemas de referencia:

if (identical(crs_raster, crs_puntos)) {
      cat("El sistema de referencia de coordenadas del raster y de los puntos es el mismo:\n")
      print(crs_raster)
    } else {
      cat("Los sistemas de referencia de coordenadas son diferentes.\n")
      cat("Raster:\n")
      print(crs_raster)
      cat("Puntos:\n")
      print(crs_puntos)
    }
Los sistemas de referencia de coordenadas son diferentes.
Raster:
Coordinate Reference System:
  User input: MAGNA-SIRGAS 2018 / Origen-Nacional 
  wkt:
PROJCRS["MAGNA-SIRGAS 2018 / Origen-Nacional",
    BASEGEOGCRS["MAGNA-SIRGAS 2018",
        DATUM["Marco Geocentrico Nacional de Referencia 2018",
            ELLIPSOID["GRS 1980",6378137,298.257222101,
                LENGTHUNIT["metre",1]]],
        PRIMEM["Greenwich",0,
            ANGLEUNIT["degree",0.0174532925199433]],
        ID["EPSG",20046]],
    CONVERSION["Colombia Transverse Mercator",
        METHOD["Transverse Mercator",
            ID["EPSG",9807]],
        PARAMETER["Latitude of natural origin",4,
            ANGLEUNIT["degree",0.0174532925199433],
            ID["EPSG",8801]],
        PARAMETER["Longitude of natural origin",-73,
            ANGLEUNIT["degree",0.0174532925199433],
            ID["EPSG",8802]],
        PARAMETER["Scale factor at natural origin",0.9992,
            SCALEUNIT["unity",1],
            ID["EPSG",8805]],
        PARAMETER["False easting",5000000,
            LENGTHUNIT["metre",1],
            ID["EPSG",8806]],
        PARAMETER["False northing",2000000,
            LENGTHUNIT["metre",1],
            ID["EPSG",8807]]],
    CS[Cartesian,2],
        AXIS["northing (N)",north,
            ORDER[1],
            LENGTHUNIT["metre",1]],
        AXIS["easting (E)",east,
            ORDER[2],
            LENGTHUNIT["metre",1]],
    USAGE[
        SCOPE["Cadastre, topographic mapping."],
        AREA["Colombia - onshore and offshore. Includes San Andres y Providencia, Malpelo Islands, Roncador Bank, Serrana Bank and Serranilla Bank."],
        BBOX[-4.23,-84.77,15.51,-66.87]],
    ID["EPSG",9377]]
Puntos:
Coordinate Reference System:
  User input: MAGNA-SIRGAS_Origen-Nacional 
  wkt:
PROJCRS["MAGNA-SIRGAS_Origen-Nacional",
    BASEGEOGCRS["GCS_MAGNA-SIRGAS_2018",
        DATUM["Marco Geocentrico Nacional de Referencia 2018",
            ELLIPSOID["GRS 1980",6378137,298.257222101,
                LENGTHUNIT["metre",1]],
            ID["EPSG",1329]],
        PRIMEM["Greenwich",0,
            ANGLEUNIT["Degree",0.0174532925199433]]],
    CONVERSION["unnamed",
        METHOD["Transverse Mercator",
            ID["EPSG",9807]],
        PARAMETER["Latitude of natural origin",4,
            ANGLEUNIT["Degree",0.0174532925199433],
            ID["EPSG",8801]],
        PARAMETER["Longitude of natural origin",-73,
            ANGLEUNIT["Degree",0.0174532925199433],
            ID["EPSG",8802]],
        PARAMETER["Scale factor at natural origin",0.9992,
            SCALEUNIT["unity",1],
            ID["EPSG",8805]],
        PARAMETER["False easting",5000000,
            LENGTHUNIT["metre",1],
            ID["EPSG",8806]],
        PARAMETER["False northing",2000000,
            LENGTHUNIT["metre",1],
            ID["EPSG",8807]]],
    CS[Cartesian,2],
        AXIS["(E)",east,
            ORDER[1],
            LENGTHUNIT["metre",1,
                ID["EPSG",9001]]],
        AXIS["(N)",north,
            ORDER[2],
            LENGTHUNIT["metre",1,
                ID["EPSG",9001]]]]
puntos_reproj <-  st_transform(puntos, crs_raster)
    
    (puntos_reproj) #Muestra la tabla de atributos de los puntos de muestreo
Simple feature collection with 67 features and 16 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: 4968206 ymin: 2257635 xmax: 5005157 ymax: 2292361
Projected CRS: MAGNA-SIRGAS 2018 / Origen-Nacional
First 10 features:
   Department Municipali Latitude.D Longitude. Altitude.m  pH EC.dSm NH4.ppm NO3.ppm K2O.ppm P2O5.ppm
1   Santander   Confines   6.331580  -73.25827       1533 4.8   0.08    10.3     8.4   173.5     10.1
2   Santander   Confines   6.345463  -73.28759       1489 4.9   0.07    10.3     5.4   122.9      8.9
3   Santander   Confines   6.357339  -73.28138       1482 4.8   0.08    18.2     0.9   119.3      6.2
4   Santander   Confines   6.360368  -73.24903       1581 4.7   0.07     6.7     2.3   181.9     12.1
5   Santander   Confines   6.340922  -73.20868       1878 4.8   0.15    24.0    12.3   130.1      7.3
6   Santander   Confines   6.357226  -73.23005       1742 4.8   0.09    11.7     1.2   131.3      4.8
7   Santander   Confines   6.339062  -73.23301       1752 4.9   0.09     9.4     2.0    73.5     11.5
8   Santander   Confines   6.402768  -73.22524       1715 4.8   0.08     9.4     5.9   194.0      6.6
9   Santander   Confines   6.365608  -73.21098       1878 4.8   0.10    19.3     0.3   273.5      3.4
10  Santander     Paramo   6.384360  -73.19552       1912 4.9   0.12    19.1     0.1   128.9     18.8
   SOC.pct Sand.pct Silt.pct Clay.pct Slope.pct                geometry
1     2.46     40.7     32.6     26.6      10.5 POINT (4971447 2257635)
2     1.62     51.2     26.1     22.6       9.2 POINT (4968206 2259171)
3     2.95     51.9     35.4     12.7       7.4 POINT (4968893 2260483)
4     1.02     37.3     36.1     26.5      12.6 POINT (4972470 2260816)
5     2.48     65.6     30.3      4.1       8.5 POINT (4976930 2258665)
6     1.60     40.8     46.5     12.6       7.5 POINT (4974568 2260467)
7     3.65     55.0     42.5      2.5       5.6 POINT (4974240 2258460)
8     2.12     33.7     45.4     20.9      13.7 POINT (4975101 2265500)
9     3.81     64.4     24.9     10.6       1.5 POINT (4976677 2261393)
10    3.14     39.1     50.7     10.3      15.8 POINT (4978386 2263464)

¿Qué atributos tienen los puntos de muestreo de suelos?

Atributos: Department, Municipali, Latitude.D, Longitude., Altitude.m, pH, EC.dSm, NH4.ppm, NO3.ppm, K2O.ppm, P2O5.ppm, SOC.pct.

¿En qué sistema de coordenadas se encuentra el archivo de muestreo de suelos? MAGNA-SIRGAS 2018 / Origen-Nacional

Escriba el código para revisar el Sistema de Coordenadas abajo:

st_crs(puntos_reproj)
Coordinate Reference System:
  User input: MAGNA-SIRGAS 2018 / Origen-Nacional 
  wkt:
PROJCRS["MAGNA-SIRGAS 2018 / Origen-Nacional",
    BASEGEOGCRS["MAGNA-SIRGAS 2018",
        DATUM["Marco Geocentrico Nacional de Referencia 2018",
            ELLIPSOID["GRS 1980",6378137,298.257222101,
                LENGTHUNIT["metre",1]]],
        PRIMEM["Greenwich",0,
            ANGLEUNIT["degree",0.0174532925199433]],
        ID["EPSG",20046]],
    CONVERSION["Colombia Transverse Mercator",
        METHOD["Transverse Mercator",
            ID["EPSG",9807]],
        PARAMETER["Latitude of natural origin",4,
            ANGLEUNIT["degree",0.0174532925199433],
            ID["EPSG",8801]],
        PARAMETER["Longitude of natural origin",-73,
            ANGLEUNIT["degree",0.0174532925199433],
            ID["EPSG",8802]],
        PARAMETER["Scale factor at natural origin",0.9992,
            SCALEUNIT["unity",1],
            ID["EPSG",8805]],
        PARAMETER["False easting",5000000,
            LENGTHUNIT["metre",1],
            ID["EPSG",8806]],
        PARAMETER["False northing",2000000,
            LENGTHUNIT["metre",1],
            ID["EPSG",8807]]],
    CS[Cartesian,2],
        AXIS["northing (N)",north,
            ORDER[1],
            LENGTHUNIT["metre",1]],
        AXIS["easting (E)",east,
            ORDER[2],
            LENGTHUNIT["metre",1]],
    USAGE[
        SCOPE["Cadastre, topographic mapping."],
        AREA["Colombia - onshore and offshore. Includes San Andres y Providencia, Malpelo Islands, Roncador Bank, Serrana Bank and Serranilla Bank."],
        BBOX[-4.23,-84.77,15.51,-66.87]],
    ID["EPSG",9377]]

Se reproyectó a “EPSG”,9377

6. Interpolar el valor de pH usando IDW

6.1. Primero échele un vistazo a los valores de la variable pH

var="pH" #Define que la variable var almacenará la cadena de texto pH
    puntos[var] #Extrae solo la columna pH de la tabla de atributos de los puntos de muestreo
Simple feature collection with 67 features and 1 field
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: 4968206 ymin: 2257635 xmax: 5005157 ymax: 2292361
Projected CRS: MAGNA-SIRGAS_Origen-Nacional
First 10 features:
    pH                geometry
1  4.8 POINT (4971447 2257635)
2  4.9 POINT (4968206 2259171)
3  4.8 POINT (4968893 2260483)
4  4.7 POINT (4972470 2260816)
5  4.8 POINT (4976930 2258665)
6  4.8 POINT (4974568 2260467)
7  4.9 POINT (4974240 2258460)
8  4.8 POINT (4975101 2265500)
9  4.8 POINT (4976677 2261393)
10 4.9 POINT (4978386 2263464)

6.2. La siguiente línea define el modelo de interpolación

En la función gstat del paquete gstat, idw es el método de interpolación por defecto por este motivo no ve el término idw en ninguna parte.

g es la variable en el cual se almacenará el resultado de la función gstat. gstat(): Es la función principal a la cual se le ingresan los siguientes argumentos: formula = pH ~ 1: Fórmula en la cual la variable pH es la variable de respuesta (la que vamos a predecir) y ~ 1 indica que se está modelando pH como una constante (sin otras variables predictoras).

El argumento data especifica la capa de puntos con valores de pH que se usará para generar la interpolación. Mediante el argumento set se pasan opciones adicionales a la función gstat. En este caso, idp=2 se refiere a la potencia a la que se eleva la distancia en el método idw.

st_crs(puntos_reproj)
Coordinate Reference System:
  User input: MAGNA-SIRGAS 2018 / Origen-Nacional 
  wkt:
PROJCRS["MAGNA-SIRGAS 2018 / Origen-Nacional",
    BASEGEOGCRS["MAGNA-SIRGAS 2018",
        DATUM["Marco Geocentrico Nacional de Referencia 2018",
            ELLIPSOID["GRS 1980",6378137,298.257222101,
                LENGTHUNIT["metre",1]]],
        PRIMEM["Greenwich",0,
            ANGLEUNIT["degree",0.0174532925199433]],
        ID["EPSG",20046]],
    CONVERSION["Colombia Transverse Mercator",
        METHOD["Transverse Mercator",
            ID["EPSG",9807]],
        PARAMETER["Latitude of natural origin",4,
            ANGLEUNIT["degree",0.0174532925199433],
            ID["EPSG",8801]],
        PARAMETER["Longitude of natural origin",-73,
            ANGLEUNIT["degree",0.0174532925199433],
            ID["EPSG",8802]],
        PARAMETER["Scale factor at natural origin",0.9992,
            SCALEUNIT["unity",1],
            ID["EPSG",8805]],
        PARAMETER["False easting",5000000,
            LENGTHUNIT["metre",1],
            ID["EPSG",8806]],
        PARAMETER["False northing",2000000,
            LENGTHUNIT["metre",1],
            ID["EPSG",8807]]],
    CS[Cartesian,2],
        AXIS["northing (N)",north,
            ORDER[1],
            LENGTHUNIT["metre",1]],
        AXIS["easting (E)",east,
            ORDER[2],
            LENGTHUNIT["metre",1]],
    USAGE[
        SCOPE["Cadastre, topographic mapping."],
        AREA["Colombia - onshore and offshore. Includes San Andres y Providencia, Malpelo Islands, Roncador Bank, Serrana Bank and Serranilla Bank."],
        BBOX[-4.23,-84.77,15.51,-66.87]],
    ID["EPSG",9377]]
    crs(raster_dem)
[1] NA
    g = gstat(formula = pH ~ 1, data = puntos_reproj,set=list(idp=2))

6.3. Luego de definir los parámetros de nuestro modelo de interpolación IDS creamos la superficie de predicción.

predict es una función para realizar predicciones sobre un conjunto de datos espaciales. g es la variable de tipo gstat que contiene la configuración del modelo idw raster_dem proporciona las coordenadas espaciales sobre las cuales se quiere hacer la interpolación. Es decir, raster_dem define la “malla” o el raster plantilla sobre la que se calcularán las predicciones. z es la variable que almacenará los resultados de la interpolación. Es decir que z contendrá un raster con los valores predichos para cada celda del ráster almacenado en raster_dem.

z = predict(g, raster_dem)
[inverse distance weighted interpolation]
print(z) #  Muestra los resultados almacenados en z. 
stars object with 2 dimensions and 2 attributes
attribute(s), summary of first 1e+05 cells:
              Min.  1st Qu.   Median     Mean  3rd Qu.     Max.  NA's
var1.pred  5.04681 5.130046 5.162891 5.174822 5.238671 5.283381 0e+00
var1.var        NA       NA       NA      NaN       NA       NA 1e+05
dimension(s):
    #Notará que el raster que contiene la interpolación crea dos atributos:
      #var1.pred que contiene la suiperficie con los valores de las predicciones
      #var1.var representa la varianza que se genera únicamente cuando se usa kriging 

Como para IDW no generamos un atributo de varianza, solo traemos el primer atributo de z y lo almacenamos en la variable z. Es decir que reemplazamos el valor que tenía z con 2 atributos por el atributo var1.pred

z = z["var1.pred",,]

6.4. Visualice en R es resultado de la interpolación

Cambiamos el nombre del atributo de var1.pred a “pH”. Así, el raster z tendrá un único atributo llamado “pH” que contiene los valores interpolados.

names(z) = "pH"

La siguiente línea crea una secuencia de números desde 4 hasta 7.5 con un incremento de 0.1 y la almacena en la variable b.

b = seq(4, 7.5, 0.1)

La siguiente línea genera un gráfico de la predicción.

breaks = b: Define los intervalos de los datos usando la secuencia generada en el paso anterior. col = hcl.colors(length(b)-1, “Spectral”): Define una paleta de colores “Spectral” para visualizar los datos.

La cantidad de colores se determina como length(b)-1, es decir, un color para cada intervalo definido en b.

reset = FALSE: Este argumento evita que los límites del gráfico se reseteen después de este plot. Es útil porque se van a agregar más elementos al gráfico en los siguientes pasos.

Añadir al gráfico existente los puntos de muestreo.

El argumento pch = 3 define el tipo de símbolo (en este caso, una pequeño cruz) add = TRUE indica que se deben añadir estos puntos al gráfico existente en lugar de crear un nuevo gráfico.

Añadir al gráfico existente curvas de nivel basadas en el ráster con la predicción.

 plot(z, breaks = b, col = hcl.colors(length(b)-1, "Spectral"), reset = FALSE)
downsample set to 1
plot(st_geometry(puntos_reproj), pch = 3, add = TRUE)
contour(z, breaks = b, add = TRUE)

6.5. Almacenar raster en archivo geotiff en su computador.

Definir variable con la ruta del archivo tif que contendrá z

Guardar el raster en la ruta almacenada en interpolacion_idw (formato geotiff)

interpolacion_idw="./ph_idw.tif"
write_stars(z, dsn = interpolacion_idw)

¿Cuáles son las zonas más adecuadas en términos de ph del suelo para el desarrollo del jitomate?

Hay dos zonas aptas para el desarrollo del culivo de tomate, que son las del pH 6 y 6.5 (color azúl oscuro), esta hortaliza difícilmente tolera pH más ácidos que estos.

7. Interpolar el valor de pH usando Kriging

7.1. Crear el variograma empírico

variogram es una función del paquete gstat que calcula el variograma empírico para los puntos de muestreo de suelos. pH ~ 1 correspone al modelo de fórmula que se está usando para calcular el variograma. En este caso, se está interesado en el variograma del pH y ~ 1 indica que no hay ninguna variable explicativa o covariable (solo pH) puntos: variable que almacena los puntos de muestreo con los valores de pH.

v_emp_ok = variogram(pH ~ 1, puntos_reproj)
  # Imprimir el variograma empírico
    plot(v_emp_ok)

7.2. Ajustar el variograma empírico a una función

v_mod_ok = autofitVariogram(pH ~ 1, as(puntos_reproj, "Spatial"))
#Imprimir el variograma ajustado
    plot(v_mod_ok)

7.3. Definir modelo de interpolación usando el variograma

g = gstat(formula = pH ~ 1, model = v_mod_ok$var_model, data = puntos_reproj)
  

7.4. Llevar a cabo la predicción

Notará que el raster que contiene la interpolación crea dos atributos: var1.pred que contiene la suiperficie con los valores de las predicciones var1.var representa la varianza (desviación estándard al cuadrado)

 z = predict(g, raster_dem)
[using ordinary kriging]
print(z)
stars object with 2 dimensions and 2 attributes
attribute(s), summary of first 1e+05 cells:
               Min.   1st Qu.    Median      Mean 3rd Qu.     Max.
var1.pred  4.973535 5.0923192 5.1475910 5.1348409 5.18763 5.238132
var1.var   0.604284 0.7349258 0.8883815 0.9006311 1.04760 1.302663
dimension(s):

7.5. Ahora visualizamos la superficie de la prediccion

prediccion = z["var1.pred",,]
  names(prediccion) = "pH"

La siguiente línea crea una secuencia de números desde 4 hasta 7 con un incremento de 0.1 y la almacena en la variable b_predict.

b_predict = seq(4, 7, 0.1)  
#La siguiente línea muestra un gráfico de la predicción.
plot(prediccion, breaks = b_predict, col = hcl.colors(length(b_predict)-1, "Spectral"), reset = FALSE)
downsample set to 1

7.6. Ahora visualizamos la superficie de la varianza

varianza = z["var1.var",,]
  names(varianza) = "varianza pH"

  b_var = seq(0.1, 1.4, 0.1)

La siguiente línea muestra la distribución de la varianza

plot(varianza, breaks = b_var, col = hcl.colors(length(b_var)-1, "Spectral"), reset = FALSE)
downsample set to 1

NA

Exporte los raster de la predicción y de varianza a archivos geotiff

Escriba acá su código:

Exportar geotiff para la predicción

interpolacion_kriging="./ph_kriging.tif"
write_stars(prediccion, dsn = interpolacion_kriging)

Exportar geotiff para la varianza

interpolacion_k_varianza="./ph_kriging_var.tif"
write_stars(varianza, dsn = interpolacion_k_varianza) 
  
LS0tDQp0aXRsZTogIlRhbGxlciBleGFtZW4gaW50ZXJwb2xhY2nDs24gLSBLYXJlbiBHb256w6FsZXogIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCiMgMS4gUHJpbWVybyB2YW1vcyBhIGluc3RhbGFyIGFxdWVsbG9zIHBhcXVldGVzIG8gbGlicmVyw61hcyBxdWUgbm8gaGVtb3MgaW5zdGFsYWRvIHByZXZpYW1lbnRlLiANCg0KYGBge3J9DQppbnN0YWxsLnBhY2thZ2VzKCBjKCAic2YiLCAic3RhcnMiLCJsZWFmbGV0IiwgImdzdGF0IiwiYXV0b21hcCIsInJhc3RlciIsICJSQ29sb3JCcmV3ZXIiKSkNCmBgYA0KDQojIDIuIEFob3JhIHZhbW9zIGEgY2FyZ2FyIGxhcyBsaWJyZXLDrWFzIHF1ZSByZXF1ZXJpbW9zIHVzYXIgbGFzIGN1YWxlcyB5YSBkZWJpZXJvbiBzZXIgaW5zdGFsYWRhcyBlbiBlbCBwYXNvIGFudGVyaW9yLg0KDQpgYGB7cn0NCmxpYnJhcnkoc2YpDQpsaWJyYXJ5KHN0YXJzKQ0KbGlicmFyeShsZWFmbGV0KQ0KbGlicmFyeShnc3RhdCkNCmxpYnJhcnkoYXV0b21hcCkNCmxpYnJhcnkocmFzdGVyKQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQpgYGANCg0KIyAzLiBWYW1vcyBhIGFqdXN0YXIgZWwgZGlyZWN0b3JpbyBkZSB0cmFiYWpvIGNvbiBlbCBmaW4gcXVlIHNlYSBlbCBtaXNtbyBlbiBlbCBjdWFsIHNlIGVuY3VlbnRyYSBhbG1hY2VuYWRvIGVsIGFyY2hpdm8gUiBzY3JpcHQuIA0KDQpFbCBkaXJlY3RvcmlvIGRlIHRyYWJham8gZXMgYXF1ZWwgZW4gZWwgY3VhbCBzZSBndWFyZGFuIHBvciBkZWZlY3RvIGxvcyBhcmNoaXZvcyBjcmVhZG9zIGFsIHRyYWJhamFyIGNvbiBydXRhcyByZWxhdGl2YXMuDQoNCkxhIHNpZ3VpZW50ZSBsw61uZWEgbm9zIG11ZXN0cmEgY3VhbCBlcyBlbCBkaXJlY3RvcmlvIGRlIHRyYWJham8gYWN0dWFsLg0KDQpgYGB7cn0NCmdldHdkKCkNCmBgYA0KIyA0LiBEZWNsYXJhciBsYXMgdmFyaWFibGVzDQoNCmBgYHtyfQ0KcnV0YV9hb2k9Ii4vbXVuaWNpcGlvc19tdWVzdHJlby5zaHAiDQpydXRhX3B1bnRvcz0iLi9wdW50b3NfbXVlc3RyZW8uc2hwIiAjUnV0YSBkZSBhcmNoaXZvIHNocCBkZSBwdW50b3MgZGUgbXVlc3RyZW8NCnJ1dGFfcmFzdGVyPSIuL2RlbV9zcnRtXzkzNzcudGlmIiAgICNSdXRhIGRlIERFTSAodGlmKSBkZSDDoXJlYSBkZSBlc3R1ZGlvDQpgYGANCg0KIyA1LiBMZWVyIHkgdmlzdWFsaXphciBsb3MgYXJjaGl2b3MgZGUgZGF0b3MgKHNocCB5IHRpZikgcXVlIHNlIHZhbiBhIHVzYXINCkxhIHNpZ3VpZW50ZSBsw61uZWEgbGVlIGVsIGFyY2hpdm8gZGVsIERFTSBjb21vIHVuIGVsZW1lbnRvIGRlIFIgeSBsbyBhbG1hY2VuYSBlbiBsYSB2YXJpYWJsZSByYXN0ZXJfZGVtDQpUaWVuZSBsb3Mgc2lndWllbnRlcyBjb21wb25lbnRlczogDQoNCnJlYWRfc3RhcnM6IEVzIHVuYSBmdW5jacOzbiBkZWwgcGFxdWV0ZSBzdGFycyBlbiBSIHF1ZSBzZSB1dGlsaXphIHBhcmEgbGVlciBhcmNoaXZvcyByw6FzdGVyLg0KcnV0YV9yYXN0ZXI6IENWYXJpYWJsZSBxdWUgY29udGllbmUgbGEgcnV0YSBhbCBhcmNoaXZvIHLDoXN0ZXIgcXVlIHNlIGxlZXLDoS4gDQpSYXN0ZXJJTyA9IEFyZ3VtZW50byBxdWUgcGVybWl0ZSBlc3BlY2lmaWNhciBvcGNpb25lcyBwYXJhIGxhIGxlY3R1cmEgZGVsIGFyY2hpdm8uIA0KRW4gZXN0ZSBjYXNvLCBSYXN0ZXJJTyBzZSB1c2EgcGFyYSBlc3BlY2lmaWNhciBxdWUgdmEgYSBsZWVyIHNvbGFtZW50ZSBsYSBiYW5kYSAxIGRlbCByw6FzdGVyIChsaXN0KGJhbmRzID0gMSkpLg0KRWwgcsOhc3RlciBkZWwgREVNIHNvbG8gdGllbmUgMSBiYW5kYSBwZXJvIGVzIGNvbcO6biB0cmFiYWphciBjb24gcsOhc3RlcnMgbXVsdGliYW5kYQ0KDQpFc3RhIG9wY2nDs24gZXMgbXV5IMO6dGlsIHBhcmEgZXNwZWNpZmljYXIgbGEgYmFuZGEgZXNwZWPDrWZpY2EgY29uIGxhIHF1ZSBzZSBkZXNlYSB0cmFiYWphci4NCg0KYGBge3J9DQpyYXN0ZXJfZGVtPXJlYWRfc3RhcnMocnV0YV9yYXN0ZXIsIFJhc3RlcklPID0gbGlzdChiYW5kcyA9IDEpKQ0KICAgIHJhc3Rlcl9kZW0NCiAgICBwbG90KHJhc3Rlcl9kZW0pDQogICAgY3JzX3Jhc3Rlcj1zdF9jcnMocmFzdGVyX2RlbSkNCiAgICBjcnNfcmFzdGVyDQpgYGANCkxhIHNpZ3VpZW50ZSBsw61uZWEgcGVybWl0ZSBsZWVyIGVsIGFyY2hpdm8gc2hhcGVmaWxlIGRlIGxvcyBwdW50b3MgZGUgbXVlc3RyZW8gY29tbyB1biBvYmpldG8gZGUgUg0KDQpgYGB7cn0NCiBwdW50b3MgPSBzdF9yZWFkKHJ1dGFfcHVudG9zKQ0KICAgIGNyc19wdW50b3M9c3RfY3JzKHB1bnRvcykNCiAgICBjcnNfcHVudG9zDQpgYGANCg0KQXVucXVlIGFwYXJlbnRlbWVudGUgdGllbmVuIGVsIG1pc21vIHNpc3RlbWEgZGUgcmVmZXJlbmNpYSBkZSBjb29yZGVuYWRhcywgZXhpc3RlbiBkaWZlcmVuY2lhcyBlbiBsYSByZXByZXNlbnRhY2nDs24gZGVsIENSUy4gRXN0YXMgZGlmZXJlbmNpYXMgZW4gbGEgcmVwcmVzZW50YWNpw7NuIHB1ZWRlbiBoYWNlciBxdWUgUiBvIGxvcyBwYXF1ZXRlcyBkZSBtYW5lam8gZGUgQ1JTIGNvbnNpZGVyZW4gbG9zIG9iamV0b3MgY29tbyBkaXN0aW50b3MsIGEgcGVzYXIgZGUgcXVlIGdlb23DqXRyaWNhbWVudGUgcG9kcsOtYW4gcmVwcmVzZW50YXIgZWwgbWlzbW8gc2lzdGVtYSBkZSByZWZlcmVuY2lhLg0KDQpDb21wYXJhciBsb3Mgc2lzdGVtYXMgZGUgcmVmZXJlbmNpYToNCg0KYGBge3J9DQppZiAoaWRlbnRpY2FsKGNyc19yYXN0ZXIsIGNyc19wdW50b3MpKSB7DQogICAgICBjYXQoIkVsIHNpc3RlbWEgZGUgcmVmZXJlbmNpYSBkZSBjb29yZGVuYWRhcyBkZWwgcmFzdGVyIHkgZGUgbG9zIHB1bnRvcyBlcyBlbCBtaXNtbzpcbiIpDQogICAgICBwcmludChjcnNfcmFzdGVyKQ0KICAgIH0gZWxzZSB7DQogICAgICBjYXQoIkxvcyBzaXN0ZW1hcyBkZSByZWZlcmVuY2lhIGRlIGNvb3JkZW5hZGFzIHNvbiBkaWZlcmVudGVzLlxuIikNCiAgICAgIGNhdCgiUmFzdGVyOlxuIikNCiAgICAgIHByaW50KGNyc19yYXN0ZXIpDQogICAgICBjYXQoIlB1bnRvczpcbiIpDQogICAgICBwcmludChjcnNfcHVudG9zKQ0KICAgIH0NCmBgYA0KYGBge3J9DQpwdW50b3NfcmVwcm9qIDwtICBzdF90cmFuc2Zvcm0ocHVudG9zLCBjcnNfcmFzdGVyKQ0KICAgIA0KICAgIChwdW50b3NfcmVwcm9qKSAjTXVlc3RyYSBsYSB0YWJsYSBkZSBhdHJpYnV0b3MgZGUgbG9zIHB1bnRvcyBkZSBtdWVzdHJlbw0KYGBgDQrCv1F1w6kgYXRyaWJ1dG9zIHRpZW5lbiBsb3MgcHVudG9zIGRlIG11ZXN0cmVvIGRlIHN1ZWxvcz8NCg0KQXRyaWJ1dG9zOiBEZXBhcnRtZW50LCBNdW5pY2lwYWxpLCBMYXRpdHVkZS5ELCBMb25naXR1ZGUuLCBBbHRpdHVkZS5tLCAgcEgsIEVDLmRTbSwgTkg0LnBwbSwgTk8zLnBwbSwgSzJPLnBwbSwgUDJPNS5wcG0sIFNPQy5wY3QuIA0KDQrCv0VuIHF1w6kgc2lzdGVtYSBkZSBjb29yZGVuYWRhcyBzZSBlbmN1ZW50cmEgZWwgYXJjaGl2byBkZSBtdWVzdHJlbyBkZSBzdWVsb3M/DQpNQUdOQS1TSVJHQVMgMjAxOCAvIE9yaWdlbi1OYWNpb25hbCANCiAgICANCkVzY3JpYmEgZWwgY8OzZGlnbyBwYXJhIHJldmlzYXIgZWwgU2lzdGVtYSBkZSBDb29yZGVuYWRhcyBhYmFqbzoNCg0KYGBge3J9DQpzdF9jcnMocHVudG9zX3JlcHJvaikNCmBgYA0KU2UgcmVwcm95ZWN0w7MgYSAiRVBTRyIsOTM3Nw0KDQojIDYuIEludGVycG9sYXIgZWwgdmFsb3IgZGUgcEggdXNhbmRvIElEVyANCg0KNi4xLiBQcmltZXJvIMOpY2hlbGUgdW4gdmlzdGF6byBhIGxvcyB2YWxvcmVzIGRlIGxhIHZhcmlhYmxlIHBIIA0KYGBge3J9DQp2YXI9InBIIiAjRGVmaW5lIHF1ZSBsYSB2YXJpYWJsZSB2YXIgYWxtYWNlbmFyw6EgbGEgY2FkZW5hIGRlIHRleHRvIHBIDQogICAgcHVudG9zW3Zhcl0gI0V4dHJhZSBzb2xvIGxhIGNvbHVtbmEgcEggZGUgbGEgdGFibGEgZGUgYXRyaWJ1dG9zIGRlIGxvcyBwdW50b3MgZGUgbXVlc3RyZW8NCmBgYA0KNi4yLiBMYSBzaWd1aWVudGUgbMOtbmVhIGRlZmluZSBlbCBtb2RlbG8gZGUgaW50ZXJwb2xhY2nDs24NCg0KRW4gbGEgZnVuY2nDs24gZ3N0YXQgZGVsIHBhcXVldGUgZ3N0YXQsIGlkdyBlcyBlbCBtw6l0b2RvIGRlIGludGVycG9sYWNpw7NuIHBvciBkZWZlY3RvIHBvciBlc3RlIG1vdGl2byBubyB2ZSBlbCB0w6lybWlubyBpZHcgZW4gbmluZ3VuYSBwYXJ0ZS4NCiAgICAgIA0KZyBlcyBsYSB2YXJpYWJsZSBlbiBlbCBjdWFsIHNlIGFsbWFjZW5hcsOhIGVsIHJlc3VsdGFkbyBkZSBsYSBmdW5jacOzbiBnc3RhdC4gDQpnc3RhdCgpOiBFcyBsYSBmdW5jacOzbiBwcmluY2lwYWwgYSBsYSBjdWFsIHNlIGxlIGluZ3Jlc2FuIGxvcyBzaWd1aWVudGVzIGFyZ3VtZW50b3M6DQpmb3JtdWxhID0gcEggfiAxOiBGw7NybXVsYSBlbiBsYSBjdWFsIGxhIHZhcmlhYmxlIHBIIGVzIGxhIHZhcmlhYmxlIGRlIHJlc3B1ZXN0YSAobGEgcXVlIHZhbW9zIGEgcHJlZGVjaXIpIA0KeSB+IDEgaW5kaWNhIHF1ZSBzZSBlc3TDoSBtb2RlbGFuZG8gcEggY29tbyB1bmEgY29uc3RhbnRlIChzaW4gb3RyYXMgdmFyaWFibGVzIHByZWRpY3RvcmFzKS4gDQoNCkVsIGFyZ3VtZW50byBkYXRhIGVzcGVjaWZpY2EgbGEgY2FwYSBkZSBwdW50b3MgY29uIHZhbG9yZXMgZGUgcEggcXVlIHNlIHVzYXLDoSBwYXJhIGdlbmVyYXIgbGEgaW50ZXJwb2xhY2nDs24uIE1lZGlhbnRlIGVsIGFyZ3VtZW50byBzZXQgc2UgcGFzYW4gb3BjaW9uZXMgYWRpY2lvbmFsZXMgYSBsYSBmdW5jacOzbiBnc3RhdC4gRW4gZXN0ZSBjYXNvLCBpZHA9MiBzZSByZWZpZXJlIGEgbGENCnBvdGVuY2lhIGEgbGEgcXVlIHNlIGVsZXZhIGxhIGRpc3RhbmNpYSBlbiBlbCBtw6l0b2RvIGlkdy4NCg0KYGBge3J9DQpzdF9jcnMocHVudG9zX3JlcHJvaikNCiAgICBjcnMocmFzdGVyX2RlbSkNCiAgICBnID0gZ3N0YXQoZm9ybXVsYSA9IHBIIH4gMSwgZGF0YSA9IHB1bnRvc19yZXByb2osc2V0PWxpc3QoaWRwPTIpKQ0KYGBgDQo2LjMuIEx1ZWdvIGRlIGRlZmluaXIgbG9zIHBhcsOhbWV0cm9zIGRlIG51ZXN0cm8gbW9kZWxvIGRlIGludGVycG9sYWNpw7NuIElEUyBjcmVhbW9zIGxhIHN1cGVyZmljaWUgZGUgcHJlZGljY2nDs24uDQoNCnByZWRpY3QgZXMgdW5hIGZ1bmNpw7NuIHBhcmEgcmVhbGl6YXIgcHJlZGljY2lvbmVzIHNvYnJlIHVuIGNvbmp1bnRvIGRlIGRhdG9zIGVzcGFjaWFsZXMuDQpnIGVzIGxhIHZhcmlhYmxlIGRlIHRpcG8gZ3N0YXQgcXVlIGNvbnRpZW5lIGxhIGNvbmZpZ3VyYWNpw7NuIGRlbCBtb2RlbG8gaWR3DQpyYXN0ZXJfZGVtIHByb3BvcmNpb25hIGxhcyBjb29yZGVuYWRhcyBlc3BhY2lhbGVzIHNvYnJlIGxhcyBjdWFsZXMgc2UgcXVpZXJlIGhhY2VyIGxhIGludGVycG9sYWNpw7NuLiBFcyBkZWNpciwgcmFzdGVyX2RlbSBkZWZpbmUgbGEgIm1hbGxhIiBvIGVsIHJhc3RlciBwbGFudGlsbGEgc29icmUgbGEgcXVlIHNlIGNhbGN1bGFyw6FuIGxhcyBwcmVkaWNjaW9uZXMuDQp6IGVzIGxhIHZhcmlhYmxlIHF1ZSBhbG1hY2VuYXLDoSBsb3MgcmVzdWx0YWRvcyBkZSBsYSBpbnRlcnBvbGFjacOzbi4gRXMgZGVjaXIgcXVlIHogY29udGVuZHLDoSB1biByYXN0ZXIgY29uIGxvcyB2YWxvcmVzIHByZWRpY2hvcyBwYXJhIGNhZGEgY2VsZGEgZGVsIHLDoXN0ZXIgYWxtYWNlbmFkbyBlbiByYXN0ZXJfZGVtLg0KDQpgYGB7cn0NCnogPSBwcmVkaWN0KGcsIHJhc3Rlcl9kZW0pDQpwcmludCh6KSAjICBNdWVzdHJhIGxvcyByZXN1bHRhZG9zIGFsbWFjZW5hZG9zIGVuIHouIA0KICAgICNOb3RhcsOhIHF1ZSBlbCByYXN0ZXIgcXVlIGNvbnRpZW5lIGxhIGludGVycG9sYWNpw7NuIGNyZWEgZG9zIGF0cmlidXRvczoNCiAgICAgICN2YXIxLnByZWQgcXVlIGNvbnRpZW5lIGxhIHN1aXBlcmZpY2llIGNvbiBsb3MgdmFsb3JlcyBkZSBsYXMgcHJlZGljY2lvbmVzDQogICAgICAjdmFyMS52YXIgcmVwcmVzZW50YSBsYSB2YXJpYW56YSBxdWUgc2UgZ2VuZXJhIMO6bmljYW1lbnRlIGN1YW5kbyBzZSB1c2Ega3JpZ2luZyANCmBgYA0KQ29tbyBwYXJhIElEVyBubyBnZW5lcmFtb3MgdW4gYXRyaWJ1dG8gZGUgdmFyaWFuemEsIHNvbG8gdHJhZW1vcyBlbCBwcmltZXIgYXRyaWJ1dG8gZGUgeiB5IGxvIGFsbWFjZW5hbW9zIGVuIGxhIHZhcmlhYmxlIHouIEVzIGRlY2lyIHF1ZSByZWVtcGxhemFtb3MgZWwgdmFsb3IgcXVlIHRlbsOtYSB6IGNvbiAyIGF0cmlidXRvcyBwb3IgZWwgYXRyaWJ1dG8gdmFyMS5wcmVkDQoNCmBgYHtyfQ0KeiA9IHpbInZhcjEucHJlZCIsLF0NCmBgYA0KDQo2LjQuIFZpc3VhbGljZSBlbiBSIGVzIHJlc3VsdGFkbyBkZSBsYSBpbnRlcnBvbGFjacOzbg0KDQpDYW1iaWFtb3MgZWwgbm9tYnJlIGRlbCBhdHJpYnV0byBkZSB2YXIxLnByZWQgYSAicEgiLiBBc8OtLCBlbCByYXN0ZXIgeiB0ZW5kcsOhIHVuIMO6bmljbyBhdHJpYnV0byBsbGFtYWRvICJwSCIgcXVlIGNvbnRpZW5lIGxvcyB2YWxvcmVzIGludGVycG9sYWRvcy4NCg0KYGBge3J9DQpuYW1lcyh6KSA9ICJwSCINCmBgYA0KDQpMYSBzaWd1aWVudGUgbMOtbmVhIGNyZWEgdW5hIHNlY3VlbmNpYSBkZSBuw7ptZXJvcyBkZXNkZSA0IGhhc3RhIDcuNSBjb24gdW4gaW5jcmVtZW50byBkZSAwLjEgeSBsYSBhbG1hY2VuYSBlbiBsYSB2YXJpYWJsZSBiLg0KDQpgYGB7cn0NCmIgPSBzZXEoNCwgNy41LCAwLjEpDQpgYGANCg0KTGEgc2lndWllbnRlIGzDrW5lYSBnZW5lcmEgdW4gZ3LDoWZpY28gZGUgbGEgcHJlZGljY2nDs24uIA0KDQpicmVha3MgPSBiOiBEZWZpbmUgbG9zIGludGVydmFsb3MgZGUgbG9zIGRhdG9zIHVzYW5kbyBsYSBzZWN1ZW5jaWEgZ2VuZXJhZGEgZW4gZWwgcGFzbyBhbnRlcmlvci4NCmNvbCA9IGhjbC5jb2xvcnMobGVuZ3RoKGIpLTEsICJTcGVjdHJhbCIpOiBEZWZpbmUgdW5hIHBhbGV0YSBkZSBjb2xvcmVzICJTcGVjdHJhbCIgcGFyYSB2aXN1YWxpemFyIGxvcyBkYXRvcy4gDQoNCkxhIGNhbnRpZGFkIGRlIGNvbG9yZXMgc2UgZGV0ZXJtaW5hIGNvbW8gbGVuZ3RoKGIpLTEsIGVzIGRlY2lyLCB1biBjb2xvciBwYXJhIGNhZGEgaW50ZXJ2YWxvIGRlZmluaWRvIGVuIGIuDQoNCnJlc2V0ID0gRkFMU0U6IEVzdGUgYXJndW1lbnRvIGV2aXRhIHF1ZSBsb3MgbMOtbWl0ZXMgZGVsIGdyw6FmaWNvIHNlIHJlc2V0ZWVuIGRlc3B1w6lzIGRlIGVzdGUgcGxvdC4gRXMgw7p0aWwgcG9ycXVlIHNlIHZhbiBhIGFncmVnYXIgbcOhcyBlbGVtZW50b3MgYWwgZ3LDoWZpY28gZW4gbG9zIHNpZ3VpZW50ZXMgcGFzb3MuDQoNCkHDsWFkaXIgYWwgZ3LDoWZpY28gZXhpc3RlbnRlIGxvcyBwdW50b3MgZGUgbXVlc3RyZW8uDQoNCkVsIGFyZ3VtZW50byBwY2ggPSAzIGRlZmluZSBlbCB0aXBvIGRlIHPDrW1ib2xvIChlbiBlc3RlIGNhc28sIHVuYSBwZXF1ZcOxbyBjcnV6KQ0KYWRkID0gVFJVRSBpbmRpY2EgcXVlIHNlIGRlYmVuIGHDsWFkaXIgZXN0b3MgcHVudG9zIGFsIGdyw6FmaWNvIGV4aXN0ZW50ZSBlbiBsdWdhciBkZSBjcmVhciB1biBudWV2byBncsOhZmljby4NCg0KQcOxYWRpciBhbCBncsOhZmljbyBleGlzdGVudGUgY3VydmFzIGRlIG5pdmVsIGJhc2FkYXMgZW4gZWwgcsOhc3RlciBjb24gbGEgcHJlZGljY2nDs24uDQoNCmBgYHtyfQ0KIHBsb3QoeiwgYnJlYWtzID0gYiwgY29sID0gaGNsLmNvbG9ycyhsZW5ndGgoYiktMSwgIlNwZWN0cmFsIiksIHJlc2V0ID0gRkFMU0UpDQpwbG90KHN0X2dlb21ldHJ5KHB1bnRvc19yZXByb2opLCBwY2ggPSAzLCBhZGQgPSBUUlVFKQ0KY29udG91cih6LCBicmVha3MgPSBiLCBhZGQgPSBUUlVFKQ0KYGBgDQo2LjUuICBBbG1hY2VuYXIgcmFzdGVyIGVuIGFyY2hpdm8gZ2VvdGlmZiBlbiBzdSBjb21wdXRhZG9yLg0KDQpEZWZpbmlyIHZhcmlhYmxlIGNvbiBsYSBydXRhIGRlbCBhcmNoaXZvIHRpZiBxdWUgY29udGVuZHLDoSB6DQoNCkd1YXJkYXIgZWwgcmFzdGVyIGVuIGxhIHJ1dGEgYWxtYWNlbmFkYSBlbiBpbnRlcnBvbGFjaW9uX2lkdyAoZm9ybWF0byBnZW90aWZmKQ0KICAgIA0KYGBge3J9DQppbnRlcnBvbGFjaW9uX2lkdz0iLi9waF9pZHcudGlmIg0Kd3JpdGVfc3RhcnMoeiwgZHNuID0gaW50ZXJwb2xhY2lvbl9pZHcpDQpgYGANCg0Kwr9DdcOhbGVzIHNvbiBsYXMgem9uYXMgbcOhcyBhZGVjdWFkYXMgZW4gdMOpcm1pbm9zIGRlIHBoIGRlbCBzdWVsbyBwYXJhIGVsIGRlc2Fycm9sbG8gZGVsIGppdG9tYXRlPw0KDQpIYXkgZG9zIHpvbmFzIGFwdGFzIHBhcmEgZWwgZGVzYXJyb2xsbyBkZWwgY3VsaXZvIGRlIHRvbWF0ZSwgcXVlIHNvbiBsYXMgZGVsIHBIIDYgeSA2LjUgKGNvbG9yIGF6w7psIG9zY3VybyksIGVzdGEgaG9ydGFsaXphIGRpZsOtY2lsbWVudGUgdG9sZXJhIHBIIG3DoXMgw6FjaWRvcyBxdWUgZXN0b3MuIA0KDQoNCiMgNy4gIEludGVycG9sYXIgZWwgdmFsb3IgZGUgcEggdXNhbmRvIEtyaWdpbmcNCg0KNy4xLiBDcmVhciBlbCB2YXJpb2dyYW1hIGVtcMOtcmljbw0KDQp2YXJpb2dyYW0gZXMgdW5hIGZ1bmNpw7NuIGRlbCBwYXF1ZXRlIGdzdGF0IHF1ZSBjYWxjdWxhIGVsIHZhcmlvZ3JhbWEgZW1ww61yaWNvIHBhcmEgbG9zIHB1bnRvcyBkZSBtdWVzdHJlbyBkZSBzdWVsb3MuDQpwSCB+IDEgY29ycmVzcG9uZSBhbCBtb2RlbG8gZGUgZsOzcm11bGEgcXVlIHNlIGVzdMOhIHVzYW5kbyBwYXJhIGNhbGN1bGFyIGVsIHZhcmlvZ3JhbWEuIEVuIGVzdGUgY2Fzbywgc2UgZXN0w6EgaW50ZXJlc2FkbyBlbiBlbCB2YXJpb2dyYW1hIGRlbCBwSA0KeSB+IDEgaW5kaWNhIHF1ZSBubyBoYXkgbmluZ3VuYSB2YXJpYWJsZSBleHBsaWNhdGl2YSBvIGNvdmFyaWFibGUgKHNvbG8gcEgpDQpwdW50b3M6IHZhcmlhYmxlIHF1ZSBhbG1hY2VuYSBsb3MgcHVudG9zIGRlIG11ZXN0cmVvIGNvbiBsb3MgdmFsb3JlcyBkZSBwSC4NCg0KYGBge3J9DQp2X2VtcF9vayA9IHZhcmlvZ3JhbShwSCB+IDEsIHB1bnRvc19yZXByb2opDQogICMgSW1wcmltaXIgZWwgdmFyaW9ncmFtYSBlbXDDrXJpY28NCiAgICBwbG90KHZfZW1wX29rKQ0KYGBgDQo3LjIuIEFqdXN0YXIgZWwgdmFyaW9ncmFtYSBlbXDDrXJpY28gYSB1bmEgZnVuY2nDs24NCg0KYGBge3J9DQp2X21vZF9vayA9IGF1dG9maXRWYXJpb2dyYW0ocEggfiAxLCBhcyhwdW50b3NfcmVwcm9qLCAiU3BhdGlhbCIpKQ0KI0ltcHJpbWlyIGVsIHZhcmlvZ3JhbWEgYWp1c3RhZG8NCiAgICBwbG90KHZfbW9kX29rKQ0KYGBgDQo3LjMuIERlZmluaXIgbW9kZWxvIGRlIGludGVycG9sYWNpw7NuIHVzYW5kbyBlbCB2YXJpb2dyYW1hDQpgYGB7cn0NCmcgPSBnc3RhdChmb3JtdWxhID0gcEggfiAxLCBtb2RlbCA9IHZfbW9kX29rJHZhcl9tb2RlbCwgZGF0YSA9IHB1bnRvc19yZXByb2opDQogIA0KYGBgDQo3LjQuIExsZXZhciBhIGNhYm8gbGEgcHJlZGljY2nDs24NCg0KTm90YXLDoSBxdWUgZWwgcmFzdGVyIHF1ZSBjb250aWVuZSBsYSBpbnRlcnBvbGFjacOzbiBjcmVhIGRvcyBhdHJpYnV0b3M6DQp2YXIxLnByZWQgcXVlIGNvbnRpZW5lIGxhIHN1aXBlcmZpY2llIGNvbiBsb3MgdmFsb3JlcyBkZSBsYXMgcHJlZGljY2lvbmVzDQp2YXIxLnZhciByZXByZXNlbnRhIGxhIHZhcmlhbnphIChkZXN2aWFjacOzbiBlc3TDoW5kYXJkIGFsIGN1YWRyYWRvKSANCg0KYGBge3J9DQogeiA9IHByZWRpY3QoZywgcmFzdGVyX2RlbSkNCnByaW50KHopDQpgYGANCjcuNS4gQWhvcmEgdmlzdWFsaXphbW9zIGxhIHN1cGVyZmljaWUgZGUgbGEgcHJlZGljY2lvbg0KYGBge3J9DQpwcmVkaWNjaW9uID0gelsidmFyMS5wcmVkIiwsXQ0KICBuYW1lcyhwcmVkaWNjaW9uKSA9ICJwSCINCmBgYA0KTGEgc2lndWllbnRlIGzDrW5lYSBjcmVhIHVuYSBzZWN1ZW5jaWEgZGUgbsO6bWVyb3MgZGVzZGUgNCBoYXN0YSA3IGNvbiB1biBpbmNyZW1lbnRvIGRlIDAuMSB5IGxhIGFsbWFjZW5hIGVuIGxhIHZhcmlhYmxlIGJfcHJlZGljdC4NCg0KYGBge3J9DQpiX3ByZWRpY3QgPSBzZXEoNCwgNywgMC4xKSAgDQojTGEgc2lndWllbnRlIGzDrW5lYSBtdWVzdHJhIHVuIGdyw6FmaWNvIGRlIGxhIHByZWRpY2Npw7NuLg0KcGxvdChwcmVkaWNjaW9uLCBicmVha3MgPSBiX3ByZWRpY3QsIGNvbCA9IGhjbC5jb2xvcnMobGVuZ3RoKGJfcHJlZGljdCktMSwgIlNwZWN0cmFsIiksIHJlc2V0ID0gRkFMU0UpDQpgYGANCjcuNi4gQWhvcmEgdmlzdWFsaXphbW9zIGxhIHN1cGVyZmljaWUgZGUgbGEgdmFyaWFuemENCmBgYHtyfQ0KdmFyaWFuemEgPSB6WyJ2YXIxLnZhciIsLF0NCiAgbmFtZXModmFyaWFuemEpID0gInZhcmlhbnphIHBIIg0KDQogIGJfdmFyID0gc2VxKDAuMSwgMS40LCAwLjEpDQpgYGANCkxhIHNpZ3VpZW50ZSBsw61uZWEgbXVlc3RyYSBsYSBkaXN0cmlidWNpw7NuIGRlIGxhIHZhcmlhbnphDQoNCmBgYHtyfQ0KcGxvdCh2YXJpYW56YSwgYnJlYWtzID0gYl92YXIsIGNvbCA9IGhjbC5jb2xvcnMobGVuZ3RoKGJfdmFyKS0xLCAiU3BlY3RyYWwiKSwgcmVzZXQgPSBGQUxTRSkNCiAgDQpgYGANCkV4cG9ydGUgbG9zIHJhc3RlciBkZSBsYSBwcmVkaWNjacOzbiB5IGRlIHZhcmlhbnphIGEgYXJjaGl2b3MgZ2VvdGlmZg0KDQpFc2NyaWJhIGFjw6Egc3UgY8OzZGlnbzoNCg0KRXhwb3J0YXIgZ2VvdGlmZiBwYXJhIGxhIHByZWRpY2Npw7NuIA0KDQpgYGB7cn0NCmludGVycG9sYWNpb25fa3JpZ2luZz0iLi9waF9rcmlnaW5nLnRpZiINCndyaXRlX3N0YXJzKHByZWRpY2Npb24sIGRzbiA9IGludGVycG9sYWNpb25fa3JpZ2luZykNCmBgYA0KRXhwb3J0YXIgZ2VvdGlmZiBwYXJhIGxhIHZhcmlhbnphIA0KDQpgYGB7cn0NCmludGVycG9sYWNpb25fa192YXJpYW56YT0iLi9waF9rcmlnaW5nX3Zhci50aWYiDQp3cml0ZV9zdGFycyh2YXJpYW56YSwgZHNuID0gaW50ZXJwb2xhY2lvbl9rX3ZhcmlhbnphKSANCiAgDQpgYGANCg0K