1.Primero se instalan aquellos paquetes o librerías que no hemos instalado previamente

install.packages( c( "sf", "stars","leaflet", "gstat","automap","raster", "RColorBrewer"))
Error in install.packages : Updating loaded packages

2. Ahora se cargan 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.Se ajusta el directorio de trabajo con el fin que sea el mismo en el cual se encuentra almacenado el archivo R script

getwd()
[1] "C:/Users/LENOVO/Desktop/INTREPOLACION_JOHA/interpolacion/Interpolacion-20250224T023201Z-001/Interpolacion"
    setwd("C:/Users/LENOVO/Desktop/INTREPOLACION_JOHA/interpolacion/Interpolacion-20250224T023201Z-001/Interpolacion")

4. Se declaran las variables a continuación

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

 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]]
puntos = st_read(ruta_puntos)
Reading layer `puntos_muestreo' from data source 
  `C:\Users\LENOVO\Desktop\INTREPOLACION_JOHA\interpolacion\Interpolacion-20250224T023201Z-001\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
    gs_crs = st_crs(raster_dem)
    puntos = st_transform(puntos, crs = gs_crs)
    crs_puntos=st_crs(puntos)
    crs_puntos
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]]
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)
    }
El sistema de referencia de coordenadas del raster y de los puntos es el mismo:
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_reproj <-  st_transform(puntos, crs_raster)
    
    (puntos_reproj)
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
1   Santander   Confines   6.331580  -73.25827       1533 4.8   0.08
2   Santander   Confines   6.345463  -73.28759       1489 4.9   0.07
3   Santander   Confines   6.357339  -73.28138       1482 4.8   0.08
4   Santander   Confines   6.360368  -73.24903       1581 4.7   0.07
5   Santander   Confines   6.340922  -73.20868       1878 4.8   0.15
6   Santander   Confines   6.357226  -73.23005       1742 4.8   0.09
7   Santander   Confines   6.339062  -73.23301       1752 4.9   0.09
8   Santander   Confines   6.402768  -73.22524       1715 4.8   0.08
9   Santander   Confines   6.365608  -73.21098       1878 4.8   0.10
10  Santander     Paramo   6.384360  -73.19552       1912 4.9   0.12
   NH4.ppm NO3.ppm K2O.ppm P2O5.ppm SOC.pct Sand.pct Silt.pct
1     10.3     8.4   173.5     10.1    2.46     40.7     32.6
2     10.3     5.4   122.9      8.9    1.62     51.2     26.1
3     18.2     0.9   119.3      6.2    2.95     51.9     35.4
4      6.7     2.3   181.9     12.1    1.02     37.3     36.1
5     24.0    12.3   130.1      7.3    2.48     65.6     30.3
6     11.7     1.2   131.3      4.8    1.60     40.8     46.5
7      9.4     2.0    73.5     11.5    3.65     55.0     42.5
8      9.4     5.9   194.0      6.6    2.12     33.7     45.4
9     19.3     0.3   273.5      3.4    3.81     64.4     24.9
10    19.1     0.1   128.9     18.8    3.14     39.1     50.7
   Clay.pct Slope.pct                geometry
1      26.6      10.5 POINT (4971447 2257635)
2      22.6       9.2 POINT (4968206 2259171)
3      12.7       7.4 POINT (4968893 2260483)
4      26.5      12.6 POINT (4972470 2260816)
5       4.1       8.5 POINT (4976930 2258665)
6      12.6       7.5 POINT (4974568 2260467)
7       2.5       5.6 POINT (4974240 2258460)
8      20.9      13.7 POINT (4975101 2265500)
9      10.6       1.5 POINT (4976677 2261393)
10     10.3      15.8 POINT (4978386 2263464)

Respondiendo las siguientes preguntas :

 st_crs(puntos)
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]]
    st_crs(raster_dem)
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]]

6. Interpolar el valor de pH usando IDW

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

var="pH"
 puntos[var]
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 2018 / 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.

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.

z = predict(g, raster_dem)
[inverse distance weighted interpolation]
    
    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  5.04681 5.130046 5.162891 5.174822 5.238671 5.283381
var1.var        NA       NA       NA      NaN       NA       NA
            NA's
var1.pred  0e+00
var1.var   1e+05
dimension(s):
z = z["var1.pred",,]

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

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)
 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

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

Respondiendo la siguiente pregunta

 zona_optima = prediccion 
    zona_optima[zona_optima < 6.0 | zona_optima > 6.8] <- NA  
    plot(zona_optima, col = hcl.colors(10, "Blues"), main = "Zonas óptimas para el jitomate")
downsample set to 1

7. Interpolar el valor de pH usando Kriging

7.1. Crear el variograma empírico

En este caso, se está interesado en el variograma del pH

v_emp_ok = variogram(pH ~ 1, puntos_reproj)
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"))
plot(v_mod_ok)

7.3. Definir modelo de interpolación usando el variograma

g2 = gstat(formula = pH ~ 1, model = v_mod_ok$var_model, data = puntos)

7.4. Llevar a cabo la predicción

 z = predict(g2, raster_dem)
[using ordinary kriging]

var1.pred que contiene la suiperficie con los valores de las predicciones

var1.var representa la varianza (desviación estándard al cuadrado)

  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 visalizamos la superficie de la prediccion

prediccion = z["var1.pred",,]
  names(prediccion) = "pH"
b_predict = seq(4, 7, 0.1)  
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)
 plot(varianza, breaks = b_var, col = hcl.colors(length(b_var)-1, "Spectral"), reset = FALSE)
downsample set to 1
  plot(st_geometry(puntos_reproj), pch = 3, add = TRUE)

cv2 = gstat.cv(g2)

  |                                                                 
  |                                                           |   0%[using ordinary kriging]

  |                                                                 
  |=                                                          |   2%[using ordinary kriging]

  |                                                                 
  |==                                                         |   3%[using ordinary kriging]

  |                                                                 
  |===                                                        |   5%[using ordinary kriging]

  |                                                                 
  |====                                                       |   6%[using ordinary kriging]

  |                                                                 
  |====                                                       |   8%[using ordinary kriging]

  |                                                                 
  |=====                                                      |   9%[using ordinary kriging]

  |                                                                 
  |======                                                     |  11%[using ordinary kriging]

  |                                                                 
  |=======                                                    |  12%[using ordinary kriging]

  |                                                                 
  |========                                                   |  14%[using ordinary kriging]

  |                                                                 
  |=========                                                  |  15%[using ordinary kriging]

  |                                                                 
  |==========                                                 |  17%[using ordinary kriging]

  |                                                                 
  |===========                                                |  18%[using ordinary kriging]

  |                                                                 
  |============                                               |  20%[using ordinary kriging]

  |                                                                 
  |=============                                              |  21%[using ordinary kriging]

  |                                                                 
  |=============                                              |  23%[using ordinary kriging]

  |                                                                 
  |==============                                             |  24%[using ordinary kriging]

  |                                                                 
  |===============                                            |  26%[using ordinary kriging]

  |                                                                 
  |================                                           |  27%[using ordinary kriging]

  |                                                                 
  |=================                                          |  29%[using ordinary kriging]

  |                                                                 
  |==================                                         |  30%[using ordinary kriging]

  |                                                                 
  |===================                                        |  32%[using ordinary kriging]

  |                                                                 
  |====================                                       |  33%[using ordinary kriging]

  |                                                                 
  |=====================                                      |  35%[using ordinary kriging]

  |                                                                 
  |=====================                                      |  36%[using ordinary kriging]

  |                                                                 
  |======================                                     |  38%[using ordinary kriging]

  |                                                                 
  |=======================                                    |  39%[using ordinary kriging]

  |                                                                 
  |========================                                   |  41%[using ordinary kriging]

  |                                                                 
  |=========================                                  |  42%[using ordinary kriging]

  |                                                                 
  |==========================                                 |  44%[using ordinary kriging]

  |                                                                 
  |===========================                                |  45%[using ordinary kriging]

  |                                                                 
  |============================                               |  47%[using ordinary kriging]

  |                                                                 
  |=============================                              |  48%[using ordinary kriging]

  |                                                                 
  |==============================                             |  50%[using ordinary kriging]

  |                                                                 
  |==============================                             |  52%[using ordinary kriging]

  |                                                                 
  |===============================                            |  53%[using ordinary kriging]

  |                                                                 
  |================================                           |  55%[using ordinary kriging]

  |                                                                 
  |=================================                          |  56%[using ordinary kriging]

  |                                                                 
  |==================================                         |  58%[using ordinary kriging]

  |                                                                 
  |===================================                        |  59%[using ordinary kriging]

  |                                                                 
  |====================================                       |  61%[using ordinary kriging]

  |                                                                 
  |=====================================                      |  62%[using ordinary kriging]

  |                                                                 
  |======================================                     |  64%[using ordinary kriging]

  |                                                                 
  |======================================                     |  65%[using ordinary kriging]

  |                                                                 
  |=======================================                    |  67%[using ordinary kriging]

  |                                                                 
  |========================================                   |  68%[using ordinary kriging]

  |                                                                 
  |=========================================                  |  70%[using ordinary kriging]

  |                                                                 
  |==========================================                 |  71%[using ordinary kriging]

  |                                                                 
  |===========================================                |  73%[using ordinary kriging]

  |                                                                 
  |============================================               |  74%[using ordinary kriging]

  |                                                                 
  |=============================================              |  76%[using ordinary kriging]

  |                                                                 
  |==============================================             |  77%[using ordinary kriging]

  |                                                                 
  |==============================================             |  79%[using ordinary kriging]

  |                                                                 
  |===============================================            |  80%[using ordinary kriging]

  |                                                                 
  |================================================           |  82%[using ordinary kriging]

  |                                                                 
  |=================================================          |  83%[using ordinary kriging]

  |                                                                 
  |==================================================         |  85%[using ordinary kriging]

  |                                                                 
  |===================================================        |  86%[using ordinary kriging]

  |                                                                 
  |====================================================       |  88%[using ordinary kriging]

  |                                                                 
  |=====================================================      |  89%[using ordinary kriging]

  |                                                                 
  |======================================================     |  91%[using ordinary kriging]

  |                                                                 
  |=======================================================    |  92%[using ordinary kriging]

  |                                                                 
  |=======================================================    |  94%[using ordinary kriging]

  |                                                                 
  |========================================================   |  95%[using ordinary kriging]

  |                                                                 
  |=========================================================  |  97%[using ordinary kriging]

  |                                                                 
  |========================================================== |  98%[using ordinary kriging]

  |                                                                 
  |===========================================================| 100%[using ordinary kriging]
cv2 = st_as_sf(cv2)
sp::bubble(as(cv2[, "residual"], "Spatial"))

  sqrt(sum((cv2$var1.pred - cv2$observed)^2) / nrow(cv2))
[1] 0.7066087
 cv3 = gstat.cv(g)

  |                                                                 
  |                                                           |   0%[inverse distance weighted interpolation]

  |                                                                 
  |=                                                          |   2%[inverse distance weighted interpolation]

  |                                                                 
  |==                                                         |   3%[inverse distance weighted interpolation]

  |                                                                 
  |===                                                        |   5%[inverse distance weighted interpolation]

  |                                                                 
  |====                                                       |   6%[inverse distance weighted interpolation]

  |                                                                 
  |====                                                       |   8%[inverse distance weighted interpolation]

  |                                                                 
  |=====                                                      |   9%[inverse distance weighted interpolation]

  |                                                                 
  |======                                                     |  11%[inverse distance weighted interpolation]

  |                                                                 
  |=======                                                    |  12%[inverse distance weighted interpolation]

  |                                                                 
  |========                                                   |  14%[inverse distance weighted interpolation]

  |                                                                 
  |=========                                                  |  15%[inverse distance weighted interpolation]

  |                                                                 
  |==========                                                 |  17%[inverse distance weighted interpolation]

  |                                                                 
  |===========                                                |  18%[inverse distance weighted interpolation]

  |                                                                 
  |============                                               |  20%[inverse distance weighted interpolation]

  |                                                                 
  |=============                                              |  21%[inverse distance weighted interpolation]

  |                                                                 
  |=============                                              |  23%[inverse distance weighted interpolation]

  |                                                                 
  |==============                                             |  24%[inverse distance weighted interpolation]

  |                                                                 
  |===============                                            |  26%[inverse distance weighted interpolation]

  |                                                                 
  |================                                           |  27%[inverse distance weighted interpolation]

  |                                                                 
  |=================                                          |  29%[inverse distance weighted interpolation]

  |                                                                 
  |==================                                         |  30%[inverse distance weighted interpolation]

  |                                                                 
  |===================                                        |  32%[inverse distance weighted interpolation]

  |                                                                 
  |====================                                       |  33%[inverse distance weighted interpolation]

  |                                                                 
  |=====================                                      |  35%[inverse distance weighted interpolation]

  |                                                                 
  |=====================                                      |  36%[inverse distance weighted interpolation]

  |                                                                 
  |======================                                     |  38%[inverse distance weighted interpolation]

  |                                                                 
  |=======================                                    |  39%[inverse distance weighted interpolation]

  |                                                                 
  |========================                                   |  41%[inverse distance weighted interpolation]

  |                                                                 
  |=========================                                  |  42%[inverse distance weighted interpolation]

  |                                                                 
  |==========================                                 |  44%[inverse distance weighted interpolation]

  |                                                                 
  |===========================                                |  45%[inverse distance weighted interpolation]

  |                                                                 
  |============================                               |  47%[inverse distance weighted interpolation]

  |                                                                 
  |=============================                              |  48%[inverse distance weighted interpolation]

  |                                                                 
  |==============================                             |  50%[inverse distance weighted interpolation]

  |                                                                 
  |==============================                             |  52%[inverse distance weighted interpolation]

  |                                                                 
  |===============================                            |  53%[inverse distance weighted interpolation]

  |                                                                 
  |================================                           |  55%[inverse distance weighted interpolation]

  |                                                                 
  |=================================                          |  56%[inverse distance weighted interpolation]

  |                                                                 
  |==================================                         |  58%[inverse distance weighted interpolation]

  |                                                                 
  |===================================                        |  59%[inverse distance weighted interpolation]

  |                                                                 
  |====================================                       |  61%[inverse distance weighted interpolation]

  |                                                                 
  |=====================================                      |  62%[inverse distance weighted interpolation]

  |                                                                 
  |======================================                     |  64%[inverse distance weighted interpolation]

  |                                                                 
  |======================================                     |  65%[inverse distance weighted interpolation]

  |                                                                 
  |=======================================                    |  67%[inverse distance weighted interpolation]

  |                                                                 
  |========================================                   |  68%[inverse distance weighted interpolation]

  |                                                                 
  |=========================================                  |  70%[inverse distance weighted interpolation]

  |                                                                 
  |==========================================                 |  71%[inverse distance weighted interpolation]

  |                                                                 
  |===========================================                |  73%[inverse distance weighted interpolation]

  |                                                                 
  |============================================               |  74%[inverse distance weighted interpolation]

  |                                                                 
  |=============================================              |  76%[inverse distance weighted interpolation]

  |                                                                 
  |==============================================             |  77%[inverse distance weighted interpolation]

  |                                                                 
  |==============================================             |  79%[inverse distance weighted interpolation]

  |                                                                 
  |===============================================            |  80%[inverse distance weighted interpolation]

  |                                                                 
  |================================================           |  82%[inverse distance weighted interpolation]

  |                                                                 
  |=================================================          |  83%[inverse distance weighted interpolation]

  |                                                                 
  |==================================================         |  85%[inverse distance weighted interpolation]

  |                                                                 
  |===================================================        |  86%[inverse distance weighted interpolation]

  |                                                                 
  |====================================================       |  88%[inverse distance weighted interpolation]

  |                                                                 
  |=====================================================      |  89%[inverse distance weighted interpolation]

  |                                                                 
  |======================================================     |  91%[inverse distance weighted interpolation]

  |                                                                 
  |=======================================================    |  92%[inverse distance weighted interpolation]

  |                                                                 
  |=======================================================    |  94%[inverse distance weighted interpolation]

  |                                                                 
  |========================================================   |  95%[inverse distance weighted interpolation]

  |                                                                 
  |=========================================================  |  97%[inverse distance weighted interpolation]

  |                                                                 
  |========================================================== |  98%[inverse distance weighted interpolation]

  |                                                                 
  |===========================================================| 100%[inverse distance weighted interpolation]
  cv3 = st_as_sf(cv3)
sp::bubble(as(cv3[, "residual"], "Spatial"))

  sqrt(sum((cv3$var1.pred - cv3$observed)^2) / nrow(cv3))
[1] 0.7196336
write_stars(prediccion, dsn = "./ph_kriging.tif")
  write_stars(varianza, dsn = "./ph_varianza.tif")

Cálculo del RMSE

LS0tDQp0aXRsZTogIkV4YW1lbiBpbnRlcnBvbGFjacOzbiINCmF1dGhvcjogIkpvaGFubmEgQ2FtYXJnbyINCmRhdGU6ICIyNC8wMi8yMDI1Ig0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCiMjIDEuUHJpbWVybyBzZSBpbnN0YWxhbiBhcXVlbGxvcyBwYXF1ZXRlcyBvIGxpYnJlcsOtYXMgcXVlIG5vIGhlbW9zIGluc3RhbGFkbyBwcmV2aWFtZW50ZQ0KDQpgYGB7cn0NCmluc3RhbGwucGFja2FnZXMoIGMoICJzZiIsICJzdGFycyIsImxlYWZsZXQiLCAiZ3N0YXQiLCJhdXRvbWFwIiwicmFzdGVyIiwgIlJDb2xvckJyZXdlciIpKQ0KYGBgDQojIyAyLiBBaG9yYSBzZSBjYXJnYW4gbGFzIGxpYnJlcsOtYXMgcXVlIHJlcXVlcmltb3MgdXNhciBsYXMgY3VhbGVzIHlhIGRlYmllcm9uIHNlciBpbnN0YWxhZGFzIGVuIGVsIHBhc28gYW50ZXJpb3INCmBgYHtyfQ0KbGlicmFyeShzZikNCmxpYnJhcnkoc3RhcnMpDQpsaWJyYXJ5KGxlYWZsZXQpDQpsaWJyYXJ5KGdzdGF0KQ0KbGlicmFyeShhdXRvbWFwKQ0KbGlicmFyeShyYXN0ZXIpDQpsaWJyYXJ5KFJDb2xvckJyZXdlcikNCmBgYA0KIyMgMy5TZSBhanVzdGEgZWwgZGlyZWN0b3JpbyBkZSB0cmFiYWpvIGNvbiBlbCBmaW4gcXVlIHNlYSBlbCBtaXNtbyBlbiBlbCBjdWFsIHNlIGVuY3VlbnRyYSBhbG1hY2VuYWRvIGVsIGFyY2hpdm8gUiBzY3JpcHQNCi0gRWwgZGlyZWN0b3JpbyBkZSB0cmFiYWpvIGVzIGFxdWVsIGVuIGVsIGN1YWwgc2UgZ3VhcmRhbiBwb3IgZGVmZWN0byBsb3MgYXJjaGl2b3MgY3JlYWRvcyBhbCB0cmFiYWphciBjb24gcnV0YXMgcmVsYXRpdmFzDQotIExhIHNpZ3VpZW50ZSBsw61uZWEgbm9zIG11ZXN0cmEgY3VhbCBlcyBlbCBkaXJlY3RvcmlvIGRlIHRyYWJham8gYWN0dWFsIA0KYGBge3J9DQpnZXR3ZCgpDQpzZXR3ZCgiQzovVXNlcnMvTEVOT1ZPL0Rlc2t0b3AvSU5UUkVQT0xBQ0lPTl9KT0hBL2ludGVycG9sYWNpb24vSW50ZXJwb2xhY2lvbi0yMDI1MDIyNFQwMjMyMDFaLTAwMS9JbnRlcnBvbGFjaW9uIikNCmBgYA0KIyMgNC4gU2UgZGVjbGFyYW4gbGFzIHZhcmlhYmxlcyBhIGNvbnRpbnVhY2nDs24NCmBgYHtyfQ0KcnV0YV9hb2k9Ii4vbXVuaWNpcGlvc19tdWVzdHJlby5zaHAiDQpydXRhX3B1bnRvcz0iLi9wdW50b3NfbXVlc3RyZW8uc2hwIiAjUnV0YSBkZSBhcmNoaXZvIHNocCBkZSBwdW50b3MgZGUgbXVlc3RyZW8NCnJ1dGFfcmFzdGVyPSIuL2RlbV9zcnRtXzkzNzcudGlmIiAgICNSdXRhIGRlIERFTSAodGlmKSBkZSDDoXJlYSBkZSBlc3R1ZGlvDQpgYGANCiMjIDUuIExlZXIgeSB2aXN1YWxpemFyIGxvcyBhcmNoaXZvcyBkZSBkYXRvcyAoc2hwIHkgdGlmKSBxdWUgc2UgdmFuIGEgdXNhcg0KLSBMYSBzaWd1aWVudGUgbMOtbmVhIGxlZSBlbCBhcmNoaXZvIGRlbCBfX0RFTV9fIGNvbW8gdW4gZWxlbWVudG8gZGUgX19SX18geSBsbyBhbG1hY2VuYSBlbiBsYSB2YXJpYWJsZSBfX3Jhc3Rlcl9kZW1fXywgeSBjb250aWVuZSBsb3Mgc2lndWllbnRlcyBjb21wb25lbnRlczoNCi0gX19yZWFkX3N0YXJzX186IEVzIHVuYSBmdW5jacOzbiBkZWwgcGFxdWV0ZSBzdGFycyBlbiBSIHF1ZSBzZSB1dGlsaXphIHBhcmEgbGVlciBhcmNoaXZvcyByw6FzdGVyLCBfX3J1dGFfcmFzdGVyX186IFZhcmlhYmxlIHF1ZSBjb250aWVuZSBsYSBydXRhIGFsIGFyY2hpdm8gcsOhc3RlciBxdWUgc2UgbGVlcsOhLCBfX1Jhc3RlcklPX18gPSBBcmd1bWVudG8gcXVlIHBlcm1pdGUgZXNwZWNpZmljYXIgb3BjaW9uZXMgcGFyYSBsYSBsZWN0dXJhIGRlbCBhcmNoaXZvLiANCi0gRW4gZXN0ZSBjYXNvLCBfX1Jhc3RlcklPX18gc2UgdXNhIHBhcmEgZXNwZWNpZmljYXIgcXVlIHZhIGEgbGVlciBzb2xhbWVudGUgbGEgYmFuZGEgMSBkZWwgcsOhc3RlciAobGlzdChiYW5kcyA9IDEpKS4NCi0gRWwgcsOhc3RlciBkZWwgREVNIHNvbG8gdGllbmUgMSBiYW5kYSBwZXJvIGVzIGNvbcO6biB0cmFiYWphciBjb24gcsOhc3RlcnMgbXVsdGliYW5kYSwgZXN0YSBvcGNpw7NuIGVzIG11eSDDunRpbCBwYXJhIGVzcGVjaWZpY2FyIGxhIGJhbmRhIGVzcGVjw61maWNhIGNvbiBsYSBxdWUgc2UgZGVzZWEgdHJhYmFqYXINCmBgYHtyfQ0KcmFzdGVyX2RlbT1yZWFkX3N0YXJzKHJ1dGFfcmFzdGVyLCBSYXN0ZXJJTyA9IGxpc3QoYmFuZHMgPSAxKSkNCnJhc3Rlcl9kZW0NCnBsb3QocmFzdGVyX2RlbSkNCmNyc19yYXN0ZXI9c3RfY3JzKHJhc3Rlcl9kZW0pDQpjcnNfcmFzdGVyDQpgYGANCi0gTGEgc2lndWllbnRlIGzDrW5lYSBwZXJtaXRlIGxlZXIgZWwgYXJjaGl2byBzaGFwZWZpbGUgZGUgbG9zIHB1bnRvcyBkZSBtdWVzdHJlbyBjb21vIHVuIG9iamV0byBkZSBfX1JfXw0KYGBge3J9DQpwdW50b3MgPSBzdF9yZWFkKHJ1dGFfcHVudG9zKQ0KZ3NfY3JzID0gc3RfY3JzKHJhc3Rlcl9kZW0pDQpwdW50b3MgPSBzdF90cmFuc2Zvcm0ocHVudG9zLCBjcnMgPSBnc19jcnMpDQpjcnNfcHVudG9zPXN0X2NycyhwdW50b3MpDQpjcnNfcHVudG9zDQpgYGANCi0gQXVucXVlIGFwYXJlbnRlbWVudGUgdGllbmVuIGVsIG1pc21vIHNpc3RlbWEgZGUgcmVmZXJlbmNpYSBkZSBjb29yZGVuYWRhcyxleGlzdGVuIGRpZmVyZW5jaWFzIGVuIGxhIHJlcHJlc2VudGFjacOzbiBkZWwgQ1JTLCBlc3RhcyBkaWZlcmVuY2lhcyBlbiBsYSByZXByZXNlbnRhY2nDs24gcHVlZGVuIGhhY2VyIHF1ZSBSIG8gbG9zIHBhcXVldGVzIGRlIG1hbmVqbyBkZSBDUlMgY29uc2lkZXJlbiBsb3Mgb2JqZXRvcyBjb21vIGRpc3RpbnRvcywgYSBwZXNhciBkZSBxdWUgZ2VvbcOpdHJpY2FtZW50ZSBwb2Ryw61hbiByZXByZXNlbnRhciBlbCBtaXNtbyBzaXN0ZW1hIGRlIHJlZmVyZW5jaWEuDQotIFNlIGNvbXBhcmFuIGxvcyBzaXN0ZW1hcyBkZSByZWZlcmVuY2lhDQpgYGB7cn0NCmlmIChpZGVudGljYWwoY3JzX3Jhc3RlciwgY3JzX3B1bnRvcykpIHsNCmNhdCgiRWwgc2lzdGVtYSBkZSByZWZlcmVuY2lhIGRlIGNvb3JkZW5hZGFzIGRlbCByYXN0ZXIgeSBkZSBsb3MgcHVudG9zIGVzIGVsIG1pc21vOlxuIikNCnByaW50KGNyc19yYXN0ZXIpDQp9IGVsc2Ugew0KY2F0KCJMb3Mgc2lzdGVtYXMgZGUgcmVmZXJlbmNpYSBkZSBjb29yZGVuYWRhcyBzb24gZGlmZXJlbnRlcy5cbiIpDQpjYXQoIlJhc3RlcjpcbiIpDQpwcmludChjcnNfcmFzdGVyKQ0KY2F0KCJQdW50b3M6XG4iKQ0KcHJpbnQoY3JzX3B1bnRvcykNCn0NCmBgYA0KLSBBIGNvbnRpbnVhY2nDs24gc2UgbXVlc3RyYSBsYSB0YWJsYSBkZSBhdHJpYnV0b3MgZGUgbG9zIHB1bnRvcyBkZSBtdWVzdHJlbw0KYGBge3J9DQpwdW50b3NfcmVwcm9qIDwtICBzdF90cmFuc2Zvcm0ocHVudG9zLCBjcnNfcmFzdGVyKQ0KKHB1bnRvc19yZXByb2opDQpgYGANClJlc3BvbmRpZW5kbyBsYXMgc2lndWllbnRlcyBwcmVndW50YXMgOg0KDQotIMK/UXXDqSBhdHJpYnV0b3MgdGllbmVuIGxvcyBwdW50b3MgZGUgbXVlc3RyZW8gZGUgc3VlbG9zPw0KDQotIMK/RW4gcXXDqSBzaXN0ZW1hIGRlIGNvb3JkZW5hZGFzIHNlIGVuY3VlbnRyYSBlbCBhcmNoaXZvIGRlIG11ZXN0cmVvIGRlIHN1ZWxvcz9lc2NyaWJhIGVsIGPDs2RpZ28gcGFyYSByZXZpc2FyIGVsIFNpc3RlbWEgZGUgQ29vcmRlbmFkYXMgYWJham8NCmBgYHtyfQ0Kc3RfY3JzKHB1bnRvcykNCnN0X2NycyhyYXN0ZXJfZGVtKQ0KYGBgDQojIyA2LiBJbnRlcnBvbGFyIGVsIHZhbG9yIGRlIHBIIHVzYW5kbyBJRFcgDQpfXzYuMS4gUHJpbWVybyDDqWNoZWxlIHVuIHZpc3Rhem8gYSBsb3MgdmFsb3JlcyBkZSBsYSB2YXJpYWJsZSBwSF9fDQoNCi0gX192YXI9InBIIl9fIDogRGVmaW5lIHF1ZSBsYSB2YXJpYWJsZSB2YXIgYWxtYWNlbmFyw6EgbGEgY2FkZW5hIGRlIHRleHRvIHBIDQotIF9fcHVudG9zW3Zhcl1fXyA6IEV4dHJhZSBzb2xvIGxhIGNvbHVtbmEgcEggZGUgbGEgdGFibGEgZGUgYXRyaWJ1dG9zIGRlIGxvcyBwdW50b3MgZGUgbXVlc3RyZW8NCmBgYHtyfQ0KdmFyPSJwSCIgI0RlZmluZSBxdWUgbGEgdmFyaWFibGUgdmFyIGFsbWFjZW5hcsOhIGxhIGNhZGVuYSBkZSB0ZXh0byBwSA0KcHVudG9zW3Zhcl0gI0V4dHJhZSBzb2xvIGxhIGNvbHVtbmEgcEggZGUgbGEgdGFibGEgZGUgYXRyaWJ1dG9zIGRlIGxvcyBwdW50b3MgZGUgbXVlc3RyZW8NCmBgYA0KX182LjIuIExhIHNpZ3VpZW50ZSBsw61uZWEgZGVmaW5lIGVsIG1vZGVsbyBkZSBpbnRlcnBvbGFjacOzbl9fDQoNCkVuIGxhIGZ1bmNpw7NuIF9fZ3N0YXRfXyBkZWwgcGFxdWV0ZSBnc3RhdCwgX19pZHdfXyBlcyBlbCBtw6l0b2RvIGRlIGludGVycG9sYWNpw7NuIHBvciBkZWZlY3RvIHBvciBlc3RlIG1vdGl2byBubyB2ZSBlbCB0w6lybWlubyBpZHcgZW4gbmluZ3VuYSBwYXJ0ZS4NCg0KLSBfX2dfXyA6IEVzIGxhIHZhcmlhYmxlIGVuIGVsIGN1YWwgc2UgYWxtYWNlbmFyw6EgZWwgcmVzdWx0YWRvIGRlIGxhIGZ1bmNpw7NuIGdzdGF0LiANCi0gX19nc3RhdCgpX186IEVzIGxhIGZ1bmNpw7NuIHByaW5jaXBhbCBhIGxhIGN1YWwgc2UgbGUgaW5ncmVzYW4gbG9zIHNpZ3VpZW50ZXMgYXJndW1lbnRvczogX19mb3JtdWxhID0gcEggfiAxX18gOiBGw7NybXVsYSBlbiBsYSBjdWFsIGxhIHZhcmlhYmxlIHBIIGVzIGxhIHZhcmlhYmxlIGRlIHJlc3B1ZXN0YSAobGEgcXVlIHZhbW9zIGEgcHJlZGVjaXIpLCBfX3kgfiAxX186IGluZGljYSBxdWUgc2UgZXN0w6EgbW9kZWxhbmRvIHBIIGNvbW8gdW5hIGNvbnN0YW50ZSAoc2luIG90cmFzIHZhcmlhYmxlcyBwcmVkaWN0b3JhcykuIA0KDQotIEVsIGFyZ3VtZW50byBfX2RhdGFfXyBlc3BlY2lmaWNhIGxhIGNhcGEgZGUgcHVudG9zIGNvbiB2YWxvcmVzIGRlIHBIIHF1ZSBzZSB1c2Fyw6EgcGFyYSBnZW5lcmFyIGxhIGludGVycG9sYWNpw7NuLg0KTWVkaWFudGUgZWwgYXJndW1lbnRvIF9fc2V0X18gc2UgcGFzYW4gb3BjaW9uZXMgYWRpY2lvbmFsZXMgYSBsYSBmdW5jacOzbiBnc3RhdC4gDQotIEVuIGVzdGUgY2FzbywgX19pZHA9Ml9fIHNlIHJlZmllcmUgYSBsYSBwb3RlbmNpYSBhIGxhIHF1ZSBzZSBlbGV2YSBsYSBkaXN0YW5jaWEgZW4gZWwgbcOpdG9kbyBpZHcuDQpgYGB7cn0NCnN0X2NycyhwdW50b3NfcmVwcm9qKQ0KICAgIGNycyhyYXN0ZXJfZGVtKQ0KICAgIA0KYGBgDQpgYGB7cn0NCmcgPSBnc3RhdChmb3JtdWxhID0gcEggfiAxLCBkYXRhID0gcHVudG9zX3JlcHJvaixzZXQ9bGlzdChpZHA9MikpDQpgYGANCl9fNi4zLiBMdWVnbyBkZSBkZWZpbmlyIGxvcyBwYXLDoW1ldHJvcyBkZSBudWVzdHJvIG1vZGVsbyBkZSBpbnRlcnBvbGFjacOzbiBJRFMgY3JlYW1vcyBsYSBzdXBlcmZpY2llIGRlIHByZWRpY2Npw7NuLl9fDQoNCi0gX19wcmVkaWN0X18gOiBFcyB1bmEgZnVuY2nDs24gcGFyYSByZWFsaXphciBwcmVkaWNjaW9uZXMgc29icmUgdW4gY29uanVudG8gZGUgZGF0b3MgZXNwYWNpYWxlcw0KLSBfX2dfXyA6IEVzIGxhIHZhcmlhYmxlIGRlIHRpcG8gZ3N0YXQgcXVlIGNvbnRpZW5lIGxhIGNvbmZpZ3VyYWNpw7NuIGRlbCBtb2RlbG8gaWR3DQotIF9fcmFzdGVyX2RlbV9fOiBQcm9wb3JjaW9uYSBsYXMgY29vcmRlbmFkYXMgZXNwYWNpYWxlcyBzb2JyZSBsYXMgY3VhbGVzIHNlIHF1aWVyZSBoYWNlciBsYSBpbnRlcnBvbGFjacOzbiwgZXMgZGVjaXIsIF9fcmFzdGVyX2RlbV9fIGRlZmluZSBsYSAibWFsbGEiIG8gZWwgcmFzdGVyIHBsYW50aWxsYSBzb2JyZSBsYSBxdWUgc2UgY2FsY3VsYXLDoW4gbGFzIHByZWRpY2Npb25lcy4NCi0gX196X18gOkVzIGxhIHZhcmlhYmxlIHF1ZSBhbG1hY2VuYXLDoSBsb3MgcmVzdWx0YWRvcyBkZSBsYSBpbnRlcnBvbGFjacOzbiwgZXMgZGVjaXIgcXVlIF9fel9fIGNvbnRlbmRyw6EgdW4gcmFzdGVyIGNvbiBsb3MgdmFsb3JlcyBwcmVkaWNob3MgcGFyYSBjYWRhIGNlbGRhIGRlbCByw6FzdGVyIGFsbWFjZW5hZG8gZW4gcmFzdGVyX2RlbS4NCi0gX19wcmludCh6KV9fIDogTXVlc3RyYSBsb3MgcmVzdWx0YWRvcyBhbG1hY2VuYWRvcyBlbiB6LiANCmBgYHtyfQ0KeiA9IHByZWRpY3QoZywgcmFzdGVyX2RlbSkNCiAgICANCnByaW50KHopDQpgYGANCi0gTm90YXLDoSBxdWUgZWwgcmFzdGVyIHF1ZSBjb250aWVuZSBsYSBpbnRlcnBvbGFjacOzbiBjcmVhIGRvcyBhdHJpYnV0b3M6DQoNCiAgX192YXIxLnByZWRfXyA6IENvbnRpZW5lIGxhIHN1aXBlcmZpY2llIGNvbiBsb3MgdmFsb3JlcyBkZSBsYXMgcHJlZGljY2lvbmVzDQoNCiAgX192YXIxLnZhcl9fIDogUmVwcmVzZW50YSBsYSB2YXJpYW56YSBxdWUgc2UgZ2VuZXJhIMO6bmljYW1lbnRlIGN1YW5kbyBzZSB1c2Ega3JpZ2luZyANCg0KDQotIENvbW8gcGFyYSBfX0lEV19fIG5vIGdlbmVyYW1vcyB1biBhdHJpYnV0byBkZSB2YXJpYW56YSxzb2xvIHRyYWVtb3MgZWwgcHJpbWVyIGF0cmlidXRvIGRlIHogeSBsbyBhbG1hY2VuYW1vcyBlbiBsYSB2YXJpYWJsZSB6LCBlcyBkZWNpciBxdWUgcmVlbXBsYXphbW9zIGVsIHZhbG9yIHF1ZSB0ZW7DrWEgX196X18gY29uIDIgYXRyaWJ1dG9zIHBvciBlbCBhdHJpYnV0byBfX3ZhcjEucHJlZF9fLg0KYGBge3J9DQp6ID0gelsidmFyMS5wcmVkIiwsXQ0KYGBgDQpfXzYuNC4gVmlzdWFsaWNlIGVuIFIgZXMgcmVzdWx0YWRvIGRlIGxhIGludGVycG9sYWNpw7NuX18NCg0KLSBDYW1iaWFtb3MgZWwgbm9tYnJlIGRlbCBhdHJpYnV0byBkZSBfX3ZhcjEucHJlZF9fIGEgX18icEgiX18gYXPDrSBlbCByYXN0ZXIgX196X18gdGVuZHLDoSB1biDDum5pY28gYXRyaWJ1dG8gbGxhbWFkbyBfXyJwSCJfXyBxdWUgY29udGllbmUgbG9zIHZhbG9yZXMgaW50ZXJwb2xhZG9zLg0KYGBge3J9DQpuYW1lcyh6KSA9ICJwSCINCmBgYA0KLUxhIHNpZ3VpZW50ZSBsw61uZWEgY3JlYSB1bmEgc2VjdWVuY2lhIGRlIG7Dum1lcm9zIGRlc2RlIF9fNF9fIGhhc3RhIF9fNy41X18gY29uIHVuIGluY3JlbWVudG8gZGUgX18wLjFfXyB5IGxhIGFsbWFjZW5hIGVuIGxhIHZhcmlhYmxlIF9fYl9fLg0KYGBge3J9DQpiID0gc2VxKDQsIDcuNSwgMC4xKQ0KYGBgDQotIExhIHNpZ3VpZW50ZSBsw61uZWEgZ2VuZXJhIHVuIGdyw6FmaWNvIGRlIGxhIHByZWRpY2Npw7NuLg0KDQogIF9fYnJlYWtzID0gYl9fOiBEZWZpbmUgbG9zIGludGVydmFsb3MgZGUgbG9zIGRhdG9zIHVzYW5kbyBsYSBzZWN1ZW5jaWEgZ2VuZXJhZGEgZW4gZWwgcGFzbyBhbnRlcmlvci4NCiAgX19jb2wgPSBoY2wuY29sb3JzKGxlbmd0aChiKS0xLCAiU3BlY3RyYWwiKV9fOiBEZWZpbmUgdW5hIHBhbGV0YSBkZSBjb2xvcmVzIF9fIlNwZWN0cmFsIl9fIHBhcmEgdmlzdWFsaXphciBsb3MgZGF0b3Nhcy4gDQotIExhIGNhbnRpZGFkIGRlIGNvbG9yZXMgc2UgZGV0ZXJtaW5hIGNvbW8gX19sZW5ndGgoYiktMV9fLCBlcyBkZWNpciwgdW4gY29sb3IgcGFyYSBjYWRhIGludGVydmFsbyBkZWZpbmlkbyBlbiBfX2JfXy4NCiAgX19yZXNldCA9IEZBTFNFX186IEVzdGUgYXJndW1lbnRvIGV2aXRhIHF1ZSBsb3MgbMOtbWl0ZXMgZGVsIGdyw6FmaWNvIHNlIHJlc2V0ZWVuIGRlc3B1w6lzIGRlIGVzdGUgcGxvdCwgZXMgw7p0aWwgcG9ycXVlIHNlIHZhbiBhIGFncmVnYXIgbcOhcyBlbGVtZW50b3MgYWwgZ3LDoWZpY28gZW4gbG9zIHNpZ3VpZW50ZXMgcGFzb3MuDQoNCi0gU2UgYcOxYWRlbiBhbCBncsOhZmljbyBleGlzdGVudGUgbG9zIHB1bnRvcyBkZSBtdWVzdHJlby4NCiAgDQogIEVsIGFyZ3VtZW50byBfX3BjaCA9IDNfXyBkZWZpbmUgZWwgdGlwbyBkZSBzw61tYm9sbyAoZW4gZXN0ZSBjYXNvLCB1bmEgcGVxdWXDsW8gY3J1eiksIF9fYWRkID0gVFJVRV9fIGluZGljYSBxdWUgc2UgZGViZW4gYcOxYWRpciBlc3RvcyBwdW50b3MgYWwgZ3LDoWZpY28gZXhpc3RlbnRlIGVuIGx1Z2FyIGRlIGNyZWFyIHVuIG51ZXZvIGdyw6FmaWNvLg0KDQotIFNlIGHDsWFkZSBhbCBncsOhZmljbyBleGlzdGVudGUgY3VydmFzIGRlIG5pdmVsIGJhc2FkYXMgZW4gZWwgcsOhc3RlciBjb24gbGEgcHJlZGljY2nDs24uDQpgYGB7cn0NCnBsb3QoeiwgYnJlYWtzID0gYiwgY29sID0gaGNsLmNvbG9ycyhsZW5ndGgoYiktMSwgIlNwZWN0cmFsIiksIHJlc2V0ID0gRkFMU0UpDQpwbG90KHN0X2dlb21ldHJ5KHB1bnRvc19yZXByb2opLCBwY2ggPSAzLCBhZGQgPSBUUlVFKQ0KY29udG91cih6LCBicmVha3MgPSBiLCBhZGQgPSBUUlVFKQ0KYGBgDQpfXzYuNS4gQWxtYWNlbmFyIHJhc3RlciBlbiBhcmNoaXZvIGdlb3RpZmYgZW4gc3UgY29tcHV0YWRvcl9fDQoNCi0gU2UgZGVmaW5lIGxhIHZhcmlhYmxlIGNvbiBsYSBydXRhIGRlbCBhcmNoaXZvIF9fdGlmX18gcXVlIGNvbnRlbmRyw6EgX196X18NCi0gU2UgZ3VhcmRhIGVsIHJhc3RlciBlbiBsYSBydXRhIGFsbWFjZW5hZGEgZW4gX19pbnRlcnBvbGFjaW9uX2lkd19fIChmb3JtYXRvIGdlb3RpZmYpDQpgYGB7cn0NCmludGVycG9sYWNpb25faWR3PSIuL3BoX2lkdy50aWYiDQp3cml0ZV9zdGFycyh6LCBkc24gPSBpbnRlcnBvbGFjaW9uX2lkdykgICAgDQpgYGANClJlc3BvbmRpZW5kbyBsYSBzaWd1aWVudGUgcHJlZ3VudGENCg0KLSDCv0N1w6FsZXMgc29uIGxhcyB6b25hcyBtw6FzIGFkZWN1YWRhcyBlbiB0w6lybWlub3MgZGUgcGggZGVsIHN1ZWxvIHBhcmEgZWwgZGVzYXJyb2xsbyBkZWwgaml0b21hdGU/DQpgYGB7cn0NCnpvbmFfb3B0aW1hID0gcHJlZGljY2lvbiANCnpvbmFfb3B0aW1hW3pvbmFfb3B0aW1hIDwgNi4wIHwgem9uYV9vcHRpbWEgPiA2LjhdIDwtIE5BICANCnBsb3Qoem9uYV9vcHRpbWEsIGNvbCA9IGhjbC5jb2xvcnMoMTAsICJCbHVlcyIpLCBtYWluID0gIlpvbmFzIMOzcHRpbWFzIHBhcmEgZWwgaml0b21hdGUiKQ0KYGBgDQojIyA3LiAgSW50ZXJwb2xhciBlbCB2YWxvciBkZSBwSCB1c2FuZG8gS3JpZ2luZw0KX183LjEuIENyZWFyIGVsIHZhcmlvZ3JhbWEgZW1ww61yaWNvX18NCg0KLSBfX3ZhcmlvZ3JhbV9fIGVzIHVuYSBmdW5jacOzbiBkZWwgcGFxdWV0ZSBnc3RhdCBxdWUgY2FsY3VsYSBlbCB2YXJpb2dyYW1hIGVtcMOtcmljbyBwYXJhIGxvcyBwdW50b3MgZGUgbXVlc3RyZW8gZGUgc3VlbG9zLg0KICANCi0gX19wSCB+IDFfXyBjb3JyZXNwb25lIGFsIG1vZGVsbyBkZSBmw7NybXVsYSBxdWUgc2UgZXN0w6EgdXNhbmRvIHBhcmEgY2FsY3VsYXIgZWwgdmFyaW9ncmFtYS4gDQoNCkVuIGVzdGUgY2Fzbywgc2UgZXN0w6EgaW50ZXJlc2FkbyBlbiBlbCB2YXJpb2dyYW1hIGRlbCBwSA0KDQotIF9feSB+IDFfXyBJbmRpY2EgcXVlIG5vIGhheSBuaW5ndW5hIHZhcmlhYmxlIGV4cGxpY2F0aXZhIG8gY292YXJpYWJsZSAoc29sbyBwSCkNCiAgDQotIF9fcHVudG9zX18gRXMgdW5hIHZhcmlhYmxlIHF1ZSBhbG1hY2VuYSBsb3MgcHVudG9zIGRlIG11ZXN0cmVvIGNvbiBsb3MgdmFsb3JlcyBkZSBwSC4NCmBgYHtyfQ0Kdl9lbXBfb2sgPSB2YXJpb2dyYW0ocEggfiAxLCBwdW50b3NfcmVwcm9qKQ0KYGBgDQotIFNlIGltcHJpbWUgZWwgdmFyaW9ncmFtYSBlbXDDrXJpY28NCmBgYHtyfQ0KcGxvdCh2X2VtcF9vaykNCmBgYA0KX183LjIuIEFqdXN0YXIgZWwgdmFyaW9ncmFtYSBlbXDDrXJpY28gYSB1bmEgZnVuY2nDs25fXw0KYGBge3J9DQp2X21vZF9vayA9IGF1dG9maXRWYXJpb2dyYW0ocEggfiAxLCBhcyhwdW50b3NfcmVwcm9qLCAiU3BhdGlhbCIpKQ0KYGBgDQotIFNlIGltcHJpbWUgZWwgdmFyaW9ncmFtYSBhanVzdGFkbw0KYGBge3J9DQpwbG90KHZfbW9kX29rKQ0KYGBgDQpfXzcuMy4gRGVmaW5pciBtb2RlbG8gZGUgaW50ZXJwb2xhY2nDs24gdXNhbmRvIGVsIHZhcmlvZ3JhbWFfXw0KYGBge3J9DQpnMiA9IGdzdGF0KGZvcm11bGEgPSBwSCB+IDEsIG1vZGVsID0gdl9tb2Rfb2skdmFyX21vZGVsLCBkYXRhID0gcHVudG9zKQ0KYGBgDQpfXzcuNC4gTGxldmFyIGEgY2FibyBsYSBwcmVkaWNjacOzbl9fDQpgYGB7cn0NCiB6ID0gcHJlZGljdChnMiwgcmFzdGVyX2RlbSkNCmBgYA0KLSBOb3RhcsOhIHF1ZSBlbCByYXN0ZXIgcXVlIGNvbnRpZW5lIGxhIGludGVycG9sYWNpw7NuIGNyZWEgZG9zIGF0cmlidXRvczoNCg0KX192YXIxLnByZWRfXyBxdWUgY29udGllbmUgbGEgc3VpcGVyZmljaWUgY29uIGxvcyB2YWxvcmVzIGRlIGxhcyBwcmVkaWNjaW9uZXMNCg0KX192YXIxLnZhcl9fIHJlcHJlc2VudGEgbGEgdmFyaWFuemEgKGRlc3ZpYWNpw7NuIGVzdMOhbmRhcmQgYWwgY3VhZHJhZG8pDQpgYGB7cn0NCnByaW50KHopDQpgYGANCiBfXzcuNS4gQWhvcmEgdmlzYWxpemFtb3MgbGEgc3VwZXJmaWNpZSBkZSBsYSBwcmVkaWNjaW9uX18NCmBgYHtyfQ0KcHJlZGljY2lvbiA9IHpbInZhcjEucHJlZCIsLF0NCm5hbWVzKHByZWRpY2Npb24pID0gInBIIg0KYGBgDQotIExhIHNpZ3VpZW50ZSBsw61uZWEgY3JlYSB1bmEgc2VjdWVuY2lhIGRlIG7Dum1lcm9zIGRlc2RlIF9fNF9fIGhhc3RhIF9fN19fIGNvbiB1biBpbmNyZW1lbnRvIGRlIF9fMC4xX18geSBsYSBhbG1hY2VuYSBlbiBsYSB2YXJpYWJsZSBfX2JfcHJlZGljdC5fXw0KYGBge3J9DQpiX3ByZWRpY3QgPSBzZXEoNCwgNywgMC4xKSAgDQpgYGANCi0gTGEgc2lndWllbnRlIGzDrW5lYSBtdWVzdHJhIHVuIGdyw6FmaWNvIGRlIGxhIHByZWRpY2Npw7NuLg0KYGBge3J9DQpwbG90KHByZWRpY2Npb24sIGJyZWFrcyA9IGJfcHJlZGljdCwgY29sID0gaGNsLmNvbG9ycyhsZW5ndGgoYl9wcmVkaWN0KS0xLCAiU3BlY3RyYWwiKSwgcmVzZXQgPSBGQUxTRSkNCmBgYA0KX183LjYuIEFob3JhIHZpc3VhbGl6YW1vcyBsYSBzdXBlcmZpY2llIGRlIGxhIHZhcmlhbnphX18NCmBgYHtyfQ0KdmFyaWFuemEgPSB6WyJ2YXIxLnZhciIsLF0NCm5hbWVzKHZhcmlhbnphKSA9ICJ2YXJpYW56YSBwSCINCmBgYA0KYGBge3J9DQpiX3ZhciA9IHNlcSgwLjEsIDEuNCwgMC4xKQ0KYGBgDQotIExhIHNpZ3VpZW50ZSBsw61uZWEgbXVlc3RyYSBsYSBkaXN0cmlidWNpw7NuIGRlIGxhIHZhcmlhbnphDQpgYGB7cn0NCnBsb3QodmFyaWFuemEsIGJyZWFrcyA9IGJfdmFyLCBjb2wgPSBoY2wuY29sb3JzKGxlbmd0aChiX3ZhciktMSwgIlNwZWN0cmFsIiksIHJlc2V0ID0gRkFMU0UpDQpwbG90KHN0X2dlb21ldHJ5KHB1bnRvc19yZXByb2opLCBwY2ggPSAzLCBhZGQgPSBUUlVFKQ0KYGBgDQpgYGB7cn0NCmN2MiA9IGdzdGF0LmN2KGcyKQ0KY3YyID0gc3RfYXNfc2YoY3YyKQ0KYGBgDQpgYGB7cn0NCnNwOjpidWJibGUoYXMoY3YyWywgInJlc2lkdWFsIl0sICJTcGF0aWFsIikpDQpzcXJ0KHN1bSgoY3YyJHZhcjEucHJlZCAtIGN2MiRvYnNlcnZlZCleMikgLyBucm93KGN2MikpDQpgYGANCmBgYHtyfQ0KY3YzID0gZ3N0YXQuY3YoZykNCmN2MyA9IHN0X2FzX3NmKGN2MykNCmBgYA0KYGBge3J9DQpzcDo6YnViYmxlKGFzKGN2M1ssICJyZXNpZHVhbCJdLCAiU3BhdGlhbCIpKQ0Kc3FydChzdW0oKGN2MyR2YXIxLnByZWQgLSBjdjMkb2JzZXJ2ZWQpXjIpIC8gbnJvdyhjdjMpKQ0KYGBgDQotIEV4cG9ydGFtb3MgbG9zIHJhc3RlciBkZSBsYSBwcmVkaWNjacOzbiB5IGRlIHZhcmlhbnphIGEgYXJjaGl2b3MgZ2VvdGlmZg0KLSBTZSBlc2NyaWJlIGVsIGPDs2RpZ28NCmBgYHtyfQ0Kd3JpdGVfc3RhcnMocHJlZGljY2lvbiwgZHNuID0gIi4vcGhfa3JpZ2luZy50aWYiKQ0Kd3JpdGVfc3RhcnModmFyaWFuemEsIGRzbiA9ICIuL3BoX3ZhcmlhbnphLnRpZiIpDQpgYGANCiMjIEPDoWxjdWxvIGRlbCBSTVNFIA0KLSBFbCBjw6FsY3VsbyBkZWwgX19STVNFX18gZW4gX19LcmlnaW5nX18gZXMgZGUgMC43MDY2MDg3IHkgZWwgX19STVNFX18gZGUgX19JRFdfXyBlcyBkZSAwLjcxOTYzMzYgcG9yIGxvIHRhbnRvIHBvZHLDrWFtb3MgZGVjaXIgcXVlIGVsIG1lam9yIGVzIGVsIGRlIF9fS3JpZ2luZ19fIGFsIHRlbmVyIHVuIG1lbm9yIHZhbG9yLg0K