Teoría

La información del clima se obtiene del ASOS (*Automated Surface Serving System) ubicados en los aeropuertos de todas las ciudades del mundo.

Instalar paquetes y llamar librerias

#install.packages("riem") # Accesar al ASOS para obtener datos climáticos
library(riem)
#install.packages("tidyverse") #Manipulación de datos
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.0     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
#install.packages("ggplot2") # Gráficas con mejor diseño que plot
library(ggplot2)
#install.packages("plotly") #Gráficas con mejor calidad
library(plotly)
## 
## Attaching package: 'plotly'
## 
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## 
## The following object is masked from 'package:stats':
## 
##     filter
## 
## The following object is masked from 'package:graphics':
## 
##     layout

Paso.1 Nuscar la red del país (México) y copiar CODE

#view(riem_networks())
# MX__ASOS

Paso.2 Buscar la estación o ciudad (Monterrey) y copiar ID

# view(riem_stations("MX__ASOS"))
#MMMY

Paso.3 Obtener datos del clima

clima_mty <- riem_measures("MMMY")

Ejercicio 1. Obetener datos del clima de Monterrey de febrero 2024

clima_mty_feb <- subset(clima_mty, valid >= as.POSIXct("2024-02-01 00:000") & valid <= as.POSIXct("2024-02-29 00:000"))

Ejercicio 2. Graficar la Humedad Relativa durante Febrero 2024

plot(clima_mty_feb$valid,clima_mty_feb$relh,type="l", main="Humedad Relativa en Monterrey durante Febrero 2024",xlab="Fecha",ylab = "Humedad Relativa(%)")

#Promediar humedad relativa diaria
clima_mty_feb$date <- as.Date(clima_mty_feb$valid)

cmfd <- aggregate(clima_mty_feb, by= list(date = clima_mty_feb$date), FUN=mean)
## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA
plot(cmfd$date,cmfd$relh,type="l", main="Promedio Diario de Humedad Relativa en Monterrey durante Febrero 2024",xlab="Fecha",ylab = "Humedad Relativa(%)")

Ejercicio 3.

# Paso 1. Buscar la red del país (México) y copiar CODE
#View(riem_networks())
# MX__ASOS

# Paso 2. Buscar la estación o ciudad (Puebla) y copiar CODE
#View(riem_stations("MX__ASOS"))
# MMPB

# Paso 3. Obtener datos del clima de la ciudad 
clima_cva <- riem_measures("MMPB")

# Paso 4. Obtener datos del clima de Puebla en febrero
clima_cuerna_feb <- subset(clima_cva, valid >= as.POSIXct("2024-02-01 00:00") & valid <= as.POSIXct("2024-02-29 23:59"))

# Paso 5. Convertir temperatura en farenheit a celcius 
clima_cuerna_feb <- clima_cuerna_feb %>%  mutate(tmpc = (tmpf - 32) * (5/9))

# Promediar la temperatura Celsius por día
promedio_diario <- aggregate(clima_cuerna_feb$tmpc,by = list(date = as.Date(clima_cuerna_feb$valid)), FUN = mean)

plot(promedio_diario$date,promedio_diario$x, type = "l",main = "Promedio Diario de temperatura en Cuernavaca durante Febrero 2024", xlab = "Fecha", ylab = " Temperatura (°C)" )

Conclusión

En R podemos osbervar datos sobre el clima en diferentes ciudades alrededor del mundo, gracias a que en los aeropuertos de cada ciudad hay aparatos llamados ASOS que arrojan información cada 30 min sobre datos meterológicos. Nosotros podemos acceder a estos usando el paquete y libreria riem en el programa R, podemos analizarlos y sacar conclusiones que nos puede ayudar a hacer diferentes estudios.

LS0tCnRpdGxlOiAiQ2xpbWEiCmF1dGhvcjogIkpvcmdlIFBvbnMgQTAxNDI0MTA4IgpkYXRlOiAiMjAyNC0wMi0xNSIKb3V0cHV0OiAKICBodG1sX2RvY3VtZW50OiAKICAgIHRvYzogVFJVRQogICAgdG9jX2Zsb2F0OiBUUlVFCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFCiAgICB0aGVtZTogZGFyawotLS0KIVtdKC9Vc2Vycy9qb3Jwb25zL0Rlc2t0b3AvdmdrTVd4SXJENzhyV1Z0OWhTWklFZy5naWYpCgojIDxzcGFuIHN0eWxlPSJjb2xvcjogeWVsbG93OyIgPiBUZW9yw61hIDwvc3Bhbj4KTGEgaW5mb3JtYWNpw7NuIGRlbCBjbGltYSBzZSBvYnRpZW5lIGRlbCAqKkFTT1MqKiAoKkF1dG9tYXRlZCBTdXJmYWNlIFNlcnZpbmcgU3lzdGVtKSB1YmljYWRvcyBlbiBsb3MgYWVyb3B1ZXJ0b3MgZGUgdG9kYXMgbGFzIGNpdWRhZGVzIGRlbCBtdW5kby4KCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBSZWQ7IiA+IEluc3RhbGFyIHBhcXVldGVzIHkgbGxhbWFyIGxpYnJlcmlhcyA8L3NwYW4+CmBgYHtyfQojaW5zdGFsbC5wYWNrYWdlcygicmllbSIpICMgQWNjZXNhciBhbCBBU09TIHBhcmEgb2J0ZW5lciBkYXRvcyBjbGltw6F0aWNvcwpsaWJyYXJ5KHJpZW0pCiNpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKSAjTWFuaXB1bGFjacOzbiBkZSBkYXRvcwpsaWJyYXJ5KHRpZHl2ZXJzZSkKI2luc3RhbGwucGFja2FnZXMoImdncGxvdDIiKSAjIEdyw6FmaWNhcyBjb24gbWVqb3IgZGlzZcOxbyBxdWUgcGxvdApsaWJyYXJ5KGdncGxvdDIpCiNpbnN0YWxsLnBhY2thZ2VzKCJwbG90bHkiKSAjR3LDoWZpY2FzIGNvbiBtZWpvciBjYWxpZGFkCmxpYnJhcnkocGxvdGx5KQpgYGAKIyA8c3BhbiBzdHlsZT0iY29sb3I6IEJsdWU7IiA+IFBhc28uMSBOdXNjYXIgbGEgcmVkIGRlbCBwYcOtcyAoTcOpeGljbykgeSBjb3BpYXIgQ09ERSA8L3NwYW4+CmBgYHtyfQojdmlldyhyaWVtX25ldHdvcmtzKCkpCiMgTVhfX0FTT1MKCmBgYAojIDxzcGFuIHN0eWxlPSJjb2xvcjogT3JhbmdlOyIgPiBQYXNvLjIgQnVzY2FyIGxhIGVzdGFjacOzbiBvIGNpdWRhZCAoTW9udGVycmV5KSB5IGNvcGlhciBJRDwvc3Bhbj4KYGBge3J9CiMgdmlldyhyaWVtX3N0YXRpb25zKCJNWF9fQVNPUyIpKQojTU1NWQpgYGAKIyA8c3BhbiBzdHlsZT0iY29sb3I6IFB1cnBsZTsiID4gUGFzby4zIE9idGVuZXIgZGF0b3MgZGVsIGNsaW1hIDwvc3Bhbj4KYGBge3J9CmNsaW1hX210eSA8LSByaWVtX21lYXN1cmVzKCJNTU1ZIikKYGBgCgojIDxzcGFuIHN0eWxlPSJjb2xvcjogV2hpdGU7IiA+IEVqZXJjaWNpbyAxLiBPYmV0ZW5lciBkYXRvcyBkZWwgY2xpbWEgZGUgTW9udGVycmV5IGRlIGZlYnJlcm8gMjAyNCA8L3NwYW4+CmBgYHtyfQpjbGltYV9tdHlfZmViIDwtIHN1YnNldChjbGltYV9tdHksIHZhbGlkID49IGFzLlBPU0lYY3QoIjIwMjQtMDItMDEgMDA6MDAwIikgJiB2YWxpZCA8PSBhcy5QT1NJWGN0KCIyMDI0LTAyLTI5IDAwOjAwMCIpKQpgYGAKIyA8c3BhbiBzdHlsZT0iY29sb3I6IFdoaXRlOyIgPiBFamVyY2ljaW8gMi4gR3JhZmljYXIgbGEgSHVtZWRhZCBSZWxhdGl2YSBkdXJhbnRlIEZlYnJlcm8gMjAyNCA8L3NwYW4+CmBgYHtyfQpwbG90KGNsaW1hX210eV9mZWIkdmFsaWQsY2xpbWFfbXR5X2ZlYiRyZWxoLHR5cGU9ImwiLCBtYWluPSJIdW1lZGFkIFJlbGF0aXZhIGVuIE1vbnRlcnJleSBkdXJhbnRlIEZlYnJlcm8gMjAyNCIseGxhYj0iRmVjaGEiLHlsYWIgPSAiSHVtZWRhZCBSZWxhdGl2YSglKSIpCgojUHJvbWVkaWFyIGh1bWVkYWQgcmVsYXRpdmEgZGlhcmlhCmNsaW1hX210eV9mZWIkZGF0ZSA8LSBhcy5EYXRlKGNsaW1hX210eV9mZWIkdmFsaWQpCgpjbWZkIDwtIGFnZ3JlZ2F0ZShjbGltYV9tdHlfZmViLCBieT0gbGlzdChkYXRlID0gY2xpbWFfbXR5X2ZlYiRkYXRlKSwgRlVOPW1lYW4pCgpwbG90KGNtZmQkZGF0ZSxjbWZkJHJlbGgsdHlwZT0ibCIsIG1haW49IlByb21lZGlvIERpYXJpbyBkZSBIdW1lZGFkIFJlbGF0aXZhIGVuIE1vbnRlcnJleSBkdXJhbnRlIEZlYnJlcm8gMjAyNCIseGxhYj0iRmVjaGEiLHlsYWIgPSAiSHVtZWRhZCBSZWxhdGl2YSglKSIpCgpgYGAKCgojIEVqZXJjaWNpbyAzLiAKCmBgYHtyfQojIFBhc28gMS4gQnVzY2FyIGxhIHJlZCBkZWwgcGHDrXMgKE3DqXhpY28pIHkgY29waWFyIENPREUKI1ZpZXcocmllbV9uZXR3b3JrcygpKQojIE1YX19BU09TCgojIFBhc28gMi4gQnVzY2FyIGxhIGVzdGFjacOzbiBvIGNpdWRhZCAoUHVlYmxhKSB5IGNvcGlhciBDT0RFCiNWaWV3KHJpZW1fc3RhdGlvbnMoIk1YX19BU09TIikpCiMgTU1QQgoKIyBQYXNvIDMuIE9idGVuZXIgZGF0b3MgZGVsIGNsaW1hIGRlIGxhIGNpdWRhZCAKY2xpbWFfY3ZhIDwtIHJpZW1fbWVhc3VyZXMoIk1NUEIiKQoKIyBQYXNvIDQuIE9idGVuZXIgZGF0b3MgZGVsIGNsaW1hIGRlIFB1ZWJsYSBlbiBmZWJyZXJvCmNsaW1hX2N1ZXJuYV9mZWIgPC0gc3Vic2V0KGNsaW1hX2N2YSwgdmFsaWQgPj0gYXMuUE9TSVhjdCgiMjAyNC0wMi0wMSAwMDowMCIpICYgdmFsaWQgPD0gYXMuUE9TSVhjdCgiMjAyNC0wMi0yOSAyMzo1OSIpKQoKIyBQYXNvIDUuIENvbnZlcnRpciB0ZW1wZXJhdHVyYSBlbiBmYXJlbmhlaXQgYSBjZWxjaXVzIApjbGltYV9jdWVybmFfZmViIDwtIGNsaW1hX2N1ZXJuYV9mZWIgJT4lICBtdXRhdGUodG1wYyA9ICh0bXBmIC0gMzIpICogKDUvOSkpCgojIFByb21lZGlhciBsYSB0ZW1wZXJhdHVyYSBDZWxzaXVzIHBvciBkw61hCnByb21lZGlvX2RpYXJpbyA8LSBhZ2dyZWdhdGUoY2xpbWFfY3Vlcm5hX2ZlYiR0bXBjLGJ5ID0gbGlzdChkYXRlID0gYXMuRGF0ZShjbGltYV9jdWVybmFfZmViJHZhbGlkKSksIEZVTiA9IG1lYW4pCgpwbG90KHByb21lZGlvX2RpYXJpbyRkYXRlLHByb21lZGlvX2RpYXJpbyR4LCB0eXBlID0gImwiLG1haW4gPSAiUHJvbWVkaW8gRGlhcmlvIGRlIHRlbXBlcmF0dXJhIGVuIEN1ZXJuYXZhY2EgZHVyYW50ZSBGZWJyZXJvIDIwMjQiLCB4bGFiID0gIkZlY2hhIiwgeWxhYiA9ICIgVGVtcGVyYXR1cmEgKMKwQykiICkKYGBgCgoKIyBDb25jbHVzacOzbgpFbiBSIHBvZGVtb3Mgb3NiZXJ2YXIgZGF0b3Mgc29icmUgZWwgY2xpbWEgZW4gZGlmZXJlbnRlcyBjaXVkYWRlcyBhbHJlZGVkb3IgZGVsIG11bmRvLCBncmFjaWFzIGEgcXVlIGVuIGxvcyBhZXJvcHVlcnRvcyBkZSBjYWRhIGNpdWRhZCBoYXkgYXBhcmF0b3MgbGxhbWFkb3MgQVNPUyBxdWUgYXJyb2phbiBpbmZvcm1hY2nDs24gY2FkYSAzMCBtaW4gc29icmUgZGF0b3MgbWV0ZXJvbMOzZ2ljb3MuIE5vc290cm9zIHBvZGVtb3MgYWNjZWRlciBhIGVzdG9zIHVzYW5kbyBlbCBwYXF1ZXRlIHkgbGlicmVyaWEgcmllbSBlbiBlbCBwcm9ncmFtYSBSLCBwb2RlbW9zIGFuYWxpemFybG9zIHkgc2FjYXIgY29uY2x1c2lvbmVzIHF1ZSBub3MgcHVlZGUgYXl1ZGFyIGEgaGFjZXIgZGlmZXJlbnRlcyBlc3R1ZGlvcy4KCgo=