# Cargo los paquetes necesarios
library(magrittr)
library(ggplot2)
library(dplyr)
library(data.table)
library(metR)

Primero hay que leer los datos de temperatura del mar (SST) y de presión al nivel del mar (MSL).

datos <- ReadNetCDF("datos/temperatura_mar.nc", vars = c("sst", presion = "msl"))

Como ayuda, también

mapa <- function(fill = "white", colour = NA) {
  geom_polygon(data = map_data("world2"), aes(long, lat, group = group), 
               fill = fill, colour = colour, inherit.aes = FALSE, size = 0.2)
}

La principal variación de SST y de la presión suele ser el ciclo anual, que es predecible y no es interesante. Entonces, lo primero que hacemos es crear dos variables nuevas, sst_a y presion_a con las anomalías de temperatura y presión con respecto al ciclo anual. Esto es, el valor de cada variable menos el valor medio para cada mes y cada punto de grilla.

data.table

datos[, `:=`(sst_a = sst - mean(sst), 
             presion_a = presion - mean(presion)),
      by = .(longitude, latitude, month(time))]

dplyr

datos <- datos %>% 
  group_by(longitude, latitude, mes = month(time)) %>% 
  mutate(sst_a = sst - mean(sst), 
         presion_a = presion - mean(presion)) %>% 
  ungroup() %>% 
  select(-mes)

El Niño, o ENSO por El Niño Southern Oscillation, es una de los principales modos de variabilidad del océano. Se trata de variaciones de baja frecuencia en la temperatura de la superficie del mar en el Pacífico Ecuatorial. Durante los eventos positivos (El Niño) la temperatura de la superficie del mar en el la región oriental del Pacífico ecuatorial es más alta de lo normal, y en los eventos negativos (La Niña), la temperatura es más fría de lo normal. Esta oscilación tiene impactos globales, afectando la temperatura y la precipitación de regiones muy alejadas, algo conocido como teleconexiones.

Una de las formas más comunes de medir el ENSO es con el índice oceánico, que es la anomalía media estandarizada en una caja entre 170ºE y 120ºE y 5ºS y 5ºN, que se muestra en la siguiente figura.

datos %>% 
  filter(time == unique(time)[225]) %>% 
  ggplot(aes(longitude, latitude)) +
  geom_contour_fill(aes(z = sst_a), na.fill = TRUE) +
  mapa() +
  annotate("rect", xmax = 240, xmin = 190, ymin = -5, ymax = 5, fill = NA, color = "black") +
  scale_fill_divergent()

Entonces, antes que nada calculamos el índice de El Niño oceánico (ONI por la siglas de Oceanic Niño Index).

data.table

enso <- datos %>% 
  .[abs(latitude) < 5 & ConvertLongitude(longitude) %between% c(-170, -120)] %>% 
  .[, .(oni = mean(sst_a)), by = time] %>% 
  .[, oni := oni/sd(oni)]

dplyr

enso <- datos %>% 
  filter(abs(latitude) < 5 & between(ConvertLongitude(longitude), -170, -120)) %>% 
  group_by(time) %>% 
  summarise(oni = mean(sst_a)) %>% 
  ungroup() %>% 
  mutate(oni = oni/sd(oni))

(Técnicamente el ONI tiene también un promedio móvil de 3 meses, pero no hace tanta diferencia.)

¿Cómo evolucionó este índice a lo largo del tiempo? Podemos hacer un gráfico con el índice, marcando los valores de \(\pm0.5\), que definen los eventos Niño y Niña.

ggplot(enso, aes(time, oni)) +
  geom_line() +
  geom_hline(yintercept = c(-0.5, 0.5), color = "gray50") + 
  annotate("label", y = c(0.5, -0.5), x = lubridate::as_datetime("1979-01-01"),
           label = c("NIÑO", "NIÑA"), vjust = c(-0.2, 1.2), 
           label.size = grid::unit(0,"lines"), color = "gray50") +
  scale_x_datetime(name = NULL) +
  scale_y_continuous(name = NULL) +
  labs(title = "Índice ENSO34", 
       caption = "Fuente: ERA5 (1979–2020)") +
  theme_minimal()

Se ven claramente algunos eventos niño particularmente fuertes, como el de 1983, 1998 o 2015, así como algunos eventos Niña también intensos, como en 1989.

Ahora podemos calcular los campos de regresión entre este índice y otras variables, presión a nivel del mar en este caso. Para eso hay que primero unir la tabla enso a los datos y luego calcular la regresión para cada punto de grilla.

data.table

enso_regresion <- datos %>% 
  .[enso, on = "time"] %>% 
  .[, FitLm(presion_a, oni), by = .(longitude, latitude)] %>% 
  .[term != "(Intercept)"] 

dplyr

enso_regresion <- sst %>% 
  right_join(enso, by = "time") %>% 
  group_by(latitude, longitude) %>% 
  summarise(as.data.frame(FitLm(presion_a, oni))) %>% 
  ungroup() %>% 
  filter(term != "(Intercept)") 

Y ahora que tenemos esto, podemos graficarlo.

enso_regresion %>% 
  ggplot(aes(longitude, latitude)) +
  geom_contour_fill(aes(z = estimate, fill = ..level..), na.fill = 0, 
                    breaks = AnchorBreaks(binwidth = 25, exclude = 0)) +
  geom_contour_tanaka(aes(z = estimate), na.fill = 0, 
                      breaks = AnchorBreaks(binwidth = 25, exclude = 0)) +
  mapa(fill = NA, colour = "black")  +
  annotate("rect", xmax = 240, xmin = 190, ymin = -5, ymax = 5, 
           fill = NA, color = "black") +
  scale_fill_divergent_discretised(name = "hPa") +
  scale_x_longitude() +
  scale_y_latitude() +
  coord_quickmap() +
  theme_minimal() +
  labs(title = "Regresíon presión a nivel del mar con ENSO", 
       caption = "Fuente: ERA5 (1979–2020)")

En esta figura podemos ver las teleconexiones en acción. Los valores máximos de regresión entre la temperatura del mar y la presión al nivel del mar se da en la costa de la Antártica (el mar de Amundsen) e el hemisferio sur y en la región de las Aleutianas en el hemisferio norte.

LS0tCnRpdGxlOiAiUmVsYWNpw7NuIGVudHJlIHByZXNpw7NuIGEgbml2ZWwgZGVsIG1hciB5IEVOU08iCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIHRvYzogZmFsc2UKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KAogIGNhY2hlID0gVFJVRSwKICBlY2hvID0gVFJVRSwKICBtZXNzYWdlID0gRkFMU0UsCiAgd2FybmluZyA9IEZBTFNFCikKYGBgCgoKYGBge3J9CiMgQ2FyZ28gbG9zIHBhcXVldGVzIG5lY2VzYXJpb3MKbGlicmFyeShtYWdyaXR0cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGRhdGEudGFibGUpCmxpYnJhcnkobWV0UikKYGBgCgpQcmltZXJvIGhheSBxdWUgbGVlciBsb3MgZGF0b3MgZGUgdGVtcGVyYXR1cmEgZGVsIG1hciAoU1NUKSB5IGRlIHByZXNpw7NuIGFsIG5pdmVsIGRlbCBtYXIgKE1TTCkuIAoKYGBge3J9CmRhdG9zIDwtIFJlYWROZXRDREYoImRhdG9zL3RlbXBlcmF0dXJhX21hci5uYyIsIHZhcnMgPSBjKCJzc3QiLCBwcmVzaW9uID0gIm1zbCIpKQpgYGAKCkNvbW8gYXl1ZGEsIHRhbWJpw6luIAoKYGBge3J9Cm1hcGEgPC0gZnVuY3Rpb24oZmlsbCA9ICJ3aGl0ZSIsIGNvbG91ciA9IE5BKSB7CiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBtYXBfZGF0YSgid29ybGQyIiksIGFlcyhsb25nLCBsYXQsIGdyb3VwID0gZ3JvdXApLCAKICAgICAgICAgICAgICAgZmlsbCA9IGZpbGwsIGNvbG91ciA9IGNvbG91ciwgaW5oZXJpdC5hZXMgPSBGQUxTRSwgc2l6ZSA9IDAuMikKfQpgYGAKCkxhIHByaW5jaXBhbCB2YXJpYWNpw7NuIGRlIFNTVCB5IGRlIGxhIHByZXNpw7NuIHN1ZWxlIHNlciBlbCBjaWNsbyBhbnVhbCwgcXVlIGVzIHByZWRlY2libGUgeSBubyBlcyBpbnRlcmVzYW50ZS4KRW50b25jZXMsIGxvIHByaW1lcm8gcXVlIGhhY2Vtb3MgZXMgY3JlYXIgZG9zIHZhcmlhYmxlcyBudWV2YXMsIGBzc3RfYWAgeSBgcHJlc2lvbl9hYCBjb24gbGFzIGFub21hbMOtYXMgZGUgdGVtcGVyYXR1cmEgeSBwcmVzacOzbiBjb24gcmVzcGVjdG8gYWwgY2ljbG8gYW51YWwuIApFc3RvIGVzLCBlbCB2YWxvciBkZSBjYWRhIHZhcmlhYmxlIG1lbm9zIGVsIHZhbG9yIG1lZGlvIHBhcmEgY2FkYSBtZXMgeSBjYWRhIHB1bnRvIGRlIGdyaWxsYS4gCgojIyMgey50YWJzZXQgLnVubGlzdGVkIC51bm51bWJlcmVkfQoKIyMjIyBkYXRhLnRhYmxlCgpgYGB7cn0KZGF0b3NbLCBgOj1gKHNzdF9hID0gc3N0IC0gbWVhbihzc3QpLCAKICAgICAgICAgICAgIHByZXNpb25fYSA9IHByZXNpb24gLSBtZWFuKHByZXNpb24pKSwKICAgICAgYnkgPSAuKGxvbmdpdHVkZSwgbGF0aXR1ZGUsIG1vbnRoKHRpbWUpKV0KYGBgCgojIyMjIGRwbHlyCgpgYGB7ciwgZXZhbCA9IEZBTFNFfQpkYXRvcyA8LSBkYXRvcyAlPiUgCiAgZ3JvdXBfYnkobG9uZ2l0dWRlLCBsYXRpdHVkZSwgbWVzID0gbW9udGgodGltZSkpICU+JSAKICBtdXRhdGUoc3N0X2EgPSBzc3QgLSBtZWFuKHNzdCksIAogICAgICAgICBwcmVzaW9uX2EgPSBwcmVzaW9uIC0gbWVhbihwcmVzaW9uKSkgJT4lIAogIHVuZ3JvdXAoKSAlPiUgCiAgc2VsZWN0KC1tZXMpCmBgYAoKIyMjIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9CgpFbCBOacOxbywgbyBFTlNPIHBvciBFbCBOacOxbyBTb3V0aGVybiBPc2NpbGxhdGlvbiwgZXMgdW5hIGRlIGxvcyBwcmluY2lwYWxlcyBtb2RvcyBkZSB2YXJpYWJpbGlkYWQgZGVsIG9jw6lhbm8uIApTZSB0cmF0YSBkZSB2YXJpYWNpb25lcyBkZSBiYWphIGZyZWN1ZW5jaWEgZW4gbGEgdGVtcGVyYXR1cmEgZGUgbGEgc3VwZXJmaWNpZSBkZWwgbWFyIGVuIGVsIFBhY8OtZmljbyBFY3VhdG9yaWFsLiAKRHVyYW50ZSBsb3MgZXZlbnRvcyBwb3NpdGl2b3MgKEVsIE5pw7FvKSBsYSB0ZW1wZXJhdHVyYSBkZSBsYSBzdXBlcmZpY2llIGRlbCBtYXIgZW4gZWwgbGEgcmVnacOzbiBvcmllbnRhbCBkZWwgUGFjw61maWNvIGVjdWF0b3JpYWwgZXMgbcOhcyBhbHRhIGRlIGxvIG5vcm1hbCwgeSBlbiBsb3MgZXZlbnRvcyBuZWdhdGl2b3MgKExhIE5pw7FhKSwgbGEgdGVtcGVyYXR1cmEgZXMgbcOhcyBmcsOtYSBkZSBsbyBub3JtYWwuIApFc3RhIG9zY2lsYWNpw7NuIHRpZW5lIGltcGFjdG9zIGdsb2JhbGVzLCBhZmVjdGFuZG8gbGEgdGVtcGVyYXR1cmEgeSBsYSBwcmVjaXBpdGFjacOzbiBkZSByZWdpb25lcyBtdXkgYWxlamFkYXMsIGFsZ28gY29ub2NpZG8gY29tbyB0ZWxlY29uZXhpb25lcy4gCgpVbmEgZGUgbGFzIGZvcm1hcyBtw6FzIGNvbXVuZXMgZGUgbWVkaXIgZWwgRU5TTyBlcyBjb24gZWwgw61uZGljZSBvY2XDoW5pY28sIHF1ZSBlcyBsYSBhbm9tYWzDrWEgbWVkaWEgZXN0YW5kYXJpemFkYSBlbiB1bmEgY2FqYSBlbnRyZSAxNzDCukUgeSAxMjDCukUgeSA1wrpTIHkgNcK6TiwgcXVlIHNlIG11ZXN0cmEgZW4gbGEgc2lndWllbnRlIGZpZ3VyYS4gCgpgYGB7cn0KZGF0b3MgJT4lIAogIGZpbHRlcih0aW1lID09IHVuaXF1ZSh0aW1lKVsyMjVdKSAlPiUgCiAgZ2dwbG90KGFlcyhsb25naXR1ZGUsIGxhdGl0dWRlKSkgKwogIGdlb21fY29udG91cl9maWxsKGFlcyh6ID0gc3N0X2EpLCBuYS5maWxsID0gVFJVRSkgKwogIG1hcGEoKSArCiAgYW5ub3RhdGUoInJlY3QiLCB4bWF4ID0gMjQwLCB4bWluID0gMTkwLCB5bWluID0gLTUsIHltYXggPSA1LCBmaWxsID0gTkEsIGNvbG9yID0gImJsYWNrIikgKwogIHNjYWxlX2ZpbGxfZGl2ZXJnZW50KCkKYGBgCgoKRW50b25jZXMsIGFudGVzIHF1ZSBuYWRhIGNhbGN1bGFtb3MgZWwgw61uZGljZSBkZSBFbCBOacOxbyBvY2XDoW5pY28gKE9OSSBwb3IgbGEgc2lnbGFzIGRlIE9jZWFuaWMgTmnDsW8gSW5kZXgpLiAKCiMjIyB7LnRhYnNldCAudW5saXN0ZWQgLnVubnVtYmVyZWR9CgojIyMjIGRhdGEudGFibGUKCmBgYHtyfQplbnNvIDwtIGRhdG9zICU+JSAKICAuW2FicyhsYXRpdHVkZSkgPCA1ICYgQ29udmVydExvbmdpdHVkZShsb25naXR1ZGUpICViZXR3ZWVuJSBjKC0xNzAsIC0xMjApXSAlPiUgCiAgLlssIC4ob25pID0gbWVhbihzc3RfYSkpLCBieSA9IHRpbWVdICU+JSAKICAuWywgb25pIDo9IG9uaS9zZChvbmkpXQpgYGAKCiMjIyMgZHBseXIKCmBgYHtyLCBldmFsID0gRkFMU0V9CmVuc28gPC0gZGF0b3MgJT4lIAogIGZpbHRlcihhYnMobGF0aXR1ZGUpIDwgNSAmIGJldHdlZW4oQ29udmVydExvbmdpdHVkZShsb25naXR1ZGUpLCAtMTcwLCAtMTIwKSkgJT4lIAogIGdyb3VwX2J5KHRpbWUpICU+JSAKICBzdW1tYXJpc2Uob25pID0gbWVhbihzc3RfYSkpICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIG11dGF0ZShvbmkgPSBvbmkvc2Qob25pKSkKYGBgCgojIyMgey50YWJzZXQgLnVubGlzdGVkIC51bm51bWJlcmVkfQoKKFTDqWNuaWNhbWVudGUgZWwgT05JIHRpZW5lIHRhbWJpw6luIHVuIHByb21lZGlvIG3Ds3ZpbCBkZSAzIG1lc2VzLCBwZXJvIG5vIGhhY2UgdGFudGEgZGlmZXJlbmNpYS4pCgrCv0PDs21vIGV2b2x1Y2lvbsOzIGVzdGUgw61uZGljZSBhIGxvIGxhcmdvIGRlbCB0aWVtcG8/IApQb2RlbW9zIGhhY2VyIHVuIGdyw6FmaWNvIGNvbiBlbCDDrW5kaWNlLCBtYXJjYW5kbyBsb3MgdmFsb3JlcyBkZSAkXHBtMC41JCwgcXVlIGRlZmluZW4gbG9zIGV2ZW50b3MgTmnDsW8geSBOacOxYS4KCmBgYHtyfQpnZ3Bsb3QoZW5zbywgYWVzKHRpbWUsIG9uaSkpICsKICBnZW9tX2xpbmUoKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gYygtMC41LCAwLjUpLCBjb2xvciA9ICJncmF5NTAiKSArIAogIGFubm90YXRlKCJsYWJlbCIsIHkgPSBjKDAuNSwgLTAuNSksIHggPSBsdWJyaWRhdGU6OmFzX2RhdGV0aW1lKCIxOTc5LTAxLTAxIiksCiAgICAgICAgICAgbGFiZWwgPSBjKCJOScORTyIsICJOScORQSIpLCB2anVzdCA9IGMoLTAuMiwgMS4yKSwgCiAgICAgICAgICAgbGFiZWwuc2l6ZSA9IGdyaWQ6OnVuaXQoMCwibGluZXMiKSwgY29sb3IgPSAiZ3JheTUwIikgKwogIHNjYWxlX3hfZGF0ZXRpbWUobmFtZSA9IE5VTEwpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9IE5VTEwpICsKICBsYWJzKHRpdGxlID0gIsONbmRpY2UgRU5TTzM0IiwgCiAgICAgICBjYXB0aW9uID0gIkZ1ZW50ZTogRVJBNSAoMTk3OeKAkzIwMjApIikgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKClNlIHZlbiBjbGFyYW1lbnRlIGFsZ3Vub3MgZXZlbnRvcyBuacOxbyBwYXJ0aWN1bGFybWVudGUgZnVlcnRlcywgY29tbyBlbCBkZSAxOTgzLCAxOTk4IG8gMjAxNSwgYXPDrSBjb21vIGFsZ3Vub3MgZXZlbnRvcyBOacOxYSB0YW1iacOpbiBpbnRlbnNvcywgY29tbyBlbiAxOTg5LiAKCkFob3JhIHBvZGVtb3MgY2FsY3VsYXIgbG9zIGNhbXBvcyBkZSByZWdyZXNpw7NuIGVudHJlIGVzdGUgw61uZGljZSB5IG90cmFzIHZhcmlhYmxlcywgcHJlc2nDs24gYSBuaXZlbCBkZWwgbWFyIGVuIGVzdGUgY2Fzby4gClBhcmEgZXNvIGhheSBxdWUgcHJpbWVybyB1bmlyIGxhIHRhYmxhIGBlbnNvYCBhIGxvcyBkYXRvcyB5IGx1ZWdvIGNhbGN1bGFyIGxhIHJlZ3Jlc2nDs24gcGFyYSBjYWRhIHB1bnRvIGRlIGdyaWxsYS4gCgojIyMgey50YWJzZXQgLnVubGlzdGVkIC51bm51bWJlcmVkfQoKIyMjIyBkYXRhLnRhYmxlCgpgYGB7cn0KZW5zb19yZWdyZXNpb24gPC0gZGF0b3MgJT4lIAogIC5bZW5zbywgb24gPSAidGltZSJdICU+JSAKICAuWywgRml0TG0ocHJlc2lvbl9hLCBvbmkpLCBieSA9IC4obG9uZ2l0dWRlLCBsYXRpdHVkZSldICU+JSAKICAuW3Rlcm0gIT0gIihJbnRlcmNlcHQpIl0gCmBgYAoKIyMjIyBkcGx5cgoKYGBge3IsIGV2YWwgPSBGQUxTRX0KZW5zb19yZWdyZXNpb24gPC0gc3N0ICU+JSAKICByaWdodF9qb2luKGVuc28sIGJ5ID0gInRpbWUiKSAlPiUgCiAgZ3JvdXBfYnkobGF0aXR1ZGUsIGxvbmdpdHVkZSkgJT4lIAogIHN1bW1hcmlzZShhcy5kYXRhLmZyYW1lKEZpdExtKHByZXNpb25fYSwgb25pKSkpICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIGZpbHRlcih0ZXJtICE9ICIoSW50ZXJjZXB0KSIpIApgYGAKCiMjIyB7LnRhYnNldCAudW5saXN0ZWQgLnVubnVtYmVyZWR9CgpZIGFob3JhIHF1ZSB0ZW5lbW9zIGVzdG8sIHBvZGVtb3MgZ3JhZmljYXJsby4gCgpgYGB7cn0KZW5zb19yZWdyZXNpb24gJT4lIAogIGdncGxvdChhZXMobG9uZ2l0dWRlLCBsYXRpdHVkZSkpICsKICBnZW9tX2NvbnRvdXJfZmlsbChhZXMoeiA9IGVzdGltYXRlLCBmaWxsID0gLi5sZXZlbC4uKSwgbmEuZmlsbCA9IDAsIAogICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IEFuY2hvckJyZWFrcyhiaW53aWR0aCA9IDI1LCBleGNsdWRlID0gMCkpICsKICBnZW9tX2NvbnRvdXJfdGFuYWthKGFlcyh6ID0gZXN0aW1hdGUpLCBuYS5maWxsID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBBbmNob3JCcmVha3MoYmlud2lkdGggPSAyNSwgZXhjbHVkZSA9IDApKSArCiAgbWFwYShmaWxsID0gTkEsIGNvbG91ciA9ICJibGFjayIpICArCiAgYW5ub3RhdGUoInJlY3QiLCB4bWF4ID0gMjQwLCB4bWluID0gMTkwLCB5bWluID0gLTUsIHltYXggPSA1LCAKICAgICAgICAgICBmaWxsID0gTkEsIGNvbG9yID0gImJsYWNrIikgKwogIHNjYWxlX2ZpbGxfZGl2ZXJnZW50X2Rpc2NyZXRpc2VkKG5hbWUgPSAiaFBhIikgKwogIHNjYWxlX3hfbG9uZ2l0dWRlKCkgKwogIHNjYWxlX3lfbGF0aXR1ZGUoKSArCiAgY29vcmRfcXVpY2ttYXAoKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBsYWJzKHRpdGxlID0gIlJlZ3Jlc8Otb24gcHJlc2nDs24gYSBuaXZlbCBkZWwgbWFyIGNvbiBFTlNPIiwgCiAgICAgICBjYXB0aW9uID0gIkZ1ZW50ZTogRVJBNSAoMTk3OeKAkzIwMjApIikKYGBgCgpFbiBlc3RhIGZpZ3VyYSBwb2RlbW9zIHZlciBsYXMgdGVsZWNvbmV4aW9uZXMgZW4gYWNjacOzbi4gTG9zIHZhbG9yZXMgbcOheGltb3MgZGUgcmVncmVzacOzbiBlbnRyZSBsYSB0ZW1wZXJhdHVyYSBkZWwgbWFyIHkgbGEgcHJlc2nDs24gYWwgbml2ZWwgZGVsIG1hciBzZSBkYSBlbiBsYSBjb3N0YSBkZSBsYSBBbnTDoXJ0aWNhIChlbCBtYXIgZGUgQW11bmRzZW4pIGUgZWwgaGVtaXNmZXJpbyBzdXIgeSBlbiBsYSByZWdpw7NuIGRlIGxhcyBBbGV1dGlhbmFzIGVuIGVsIGhlbWlzZmVyaW8gbm9ydGUuIAo=