Teoria

La informacion del clima se obtiene del ASOS(Automated Surface Observing System) ubicados en los aeropuertos de las ciudades.

Instalar paquetes y llamar librerias

# install.packages("riem") # Accesar al ASOS para obtener datos climáticos 
library(riem)
# install.packages("tidyverse") # Manipulacion de datos
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.3.3
## Warning: package 'ggplot2' was built under R version 4.3.3
## ── 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)
## Warning: package 'plotly' was built under R version 4.3.3
## 
## 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
# install.packages("dplyr)
library(dplyr)

Paso 1. Buscar la red del pais (Mexico) y copiar CODE

#View(riem_networks())
#MX_ASOS

Paso 2. Buscar la estacion 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. Obtener 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 23:59"))

Ejercicio 2. Graficar la Humedad Relativa en monterrey durante febrero

plot(clima_mty_feb$valid,clima_mty_feb$relh,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

## 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
# Graficar la humedad relativa
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. Graficar la temperatura (°C) promedio diario en Guaymas

# 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 (Guaymas) y copiar CODE
#View(riem_stations("MX__ASOS"))
# MMGM

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

# Paso 4. Obtener datos del clima de Guaymas en febrero
clima_guay_feb <- subset(clima_guaymas, 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_guay_feb <- clima_guay_feb %>%  mutate(tmpc = (tmpf - 32) * (5/9))

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

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

Conclusion

En esta actividad, que trato sobre el clima de diferentes ubicaciones, se empleó diferentes librerías para poder desarrollar nuevas tablas y funciones que serán de utilidad. En este caso se usó una gráfica de líneas en el que muestra diariamente los diferentes grados que tuvo la localidad que en este caso fue Monterrey y se midieron por unos aparatos que arroja esta información.

En mi caso que yo escogí Guaymas el clima que tuvo en febrero fue muy variado, a inicios fue muy frío por la temporada de invierno y a finales estaba siendo caliente y fresco porque se terminó dicha temporada.

LS0tDQp0aXRsZTogIkNsaW1hIg0KYXV0aG9yOiAiRGFyaW8gR2FsbGFyZG8iDQpkYXRlOiAiMjAyNC0wMi0yOSINCm91dHB1dDoNCiAgIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KLS0tDQoNCiFbXShDOlxcVXNlcnNcXENhcmxvc1xcRG93bmxvYWRzXFxwMWQxbzFyNDNuMTZlMmtlMWZmNzEwMTcxam1lOC02OTZ4NTIyLmpwZy5vcHRpbWFsLmpwZykNCg0KIyA8c3BhbiBzdHlsZSA9ICJjb2xvcjogeWVsbG93OyI+VGVvcmlhPC9zcGFuPg0KTGEgaW5mb3JtYWNpb24gZGVsIGNsaW1hIHNlIG9idGllbmUgZGVsICoqQVNPUyoqKCpBdXRvbWF0ZWQgU3VyZmFjZSBPYnNlcnZpbmcgU3lzdGVtKikgdWJpY2Fkb3MgZW4gbG9zIGFlcm9wdWVydG9zIGRlIGxhcyBjaXVkYWRlcy4NCg0KIyA8c3BhbiBzdHlsZSA9ICJjb2xvcjogeWVsbG93OyI+SW5zdGFsYXIgcGFxdWV0ZXMgeSBsbGFtYXIgbGlicmVyaWFzPC9zcGFuPg0KYGBge3J9DQojIGluc3RhbGwucGFja2FnZXMoInJpZW0iKSAjIEFjY2VzYXIgYWwgQVNPUyBwYXJhIG9idGVuZXIgZGF0b3MgY2xpbcOhdGljb3MgDQpsaWJyYXJ5KHJpZW0pDQojIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpICMgTWFuaXB1bGFjaW9uIGRlIGRhdG9zDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCiMgaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpICMgR3LDoWZpY2FzIGNvbiBtZWpvciBkaXNlw7FvIHF1ZSBwbG90IA0KbGlicmFyeShnZ3Bsb3QyKQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJwbG90bHkiKSAjIEdyw6FmaWNhcyBjb24gbWVqb3IgY2FsaWRhZA0KbGlicmFyeShwbG90bHkpDQojIGluc3RhbGwucGFja2FnZXMoImRwbHlyKQ0KbGlicmFyeShkcGx5cikNCmBgYA0KDQojIDxzcGFuIHN0eWxlID0gImNvbG9yOiB5ZWxsb3c7Ij5QYXNvIDEuIEJ1c2NhciBsYSByZWQgZGVsIHBhaXMgKE1leGljbykgeSBjb3BpYXIgQ09ERTwvc3Bhbj4NCmBgYHtyfQ0KI1ZpZXcocmllbV9uZXR3b3JrcygpKQ0KI01YX0FTT1MNCmBgYA0KDQojIDxzcGFuIHN0eWxlID0gImNvbG9yOiB5ZWxsb3c7Ij5QYXNvIDIuIEJ1c2NhciBsYSBlc3RhY2lvbiBvIGNpdWRhZCAoTW9udGVycmV5KSB5IGNvcGlhciBJRCA8L3NwYW4+DQpgYGB7cn0NCiN2aWV3KHJpZW1fc3RhdGlvbnMoIk1YX19BU09TIikpDQojIE1NTVkNCmBgYA0KDQojIDxzcGFuIHN0eWxlID0gImNvbG9yOiB5ZWxsb3c7Ij5QYXNvIDMuIE9idGVuZXIgZGF0b3MgZGVsIGNsaW1hIDwvc3Bhbj4NCmBgYHtyfQ0KY2xpbWFfbXR5IDwtIHJpZW1fbWVhc3VyZXMoIk1NTVkiKQ0KYGBgDQoNCiMgPHNwYW4gc3R5bGUgPSAiY29sb3I6IHllbGxvdzsiPkVqZXJjaWNpbyAxLiBPYnRlbmVyIGRhdG9zIGRlbCBjbGltYSBkZSBNb250ZXJyZXkgZGUgRmVicmVybyAyMDI0IDwvc3Bhbj4NCmBgYHtyfQ0KY2xpbWFfbXR5X2ZlYiA8LSBzdWJzZXQoY2xpbWFfbXR5LCB2YWxpZCA+PSBhcy5QT1NJWGN0KCIyMDI0LTAyLTAxIDAwOjAwMCIpICYgdmFsaWQgPD0gYXMuUE9TSVhjdCgiMjAyNC0wMi0yOSAyMzo1OSIpKQ0KYGBgDQoNCiMgPHNwYW4gc3R5bGUgPSAiY29sb3I6IHllbGxvdzsiPkVqZXJjaWNpbyAyLiBHcmFmaWNhciBsYSBIdW1lZGFkIFJlbGF0aXZhIGVuIG1vbnRlcnJleSBkdXJhbnRlIGZlYnJlcm8gPC9zcGFuPg0KYGBge3J9DQpwbG90KGNsaW1hX210eV9mZWIkdmFsaWQsY2xpbWFfbXR5X2ZlYiRyZWxoLG1haW49ICJodW1lZGFkIHJlbGF0aXZhIGVuIG1vbnRlcnJleSBkdXJhbnRlIGZlYnJlcm8gMjAyNCIseGxhYj0iZmVjaGEiLHlsYWI9ICgiaHVtZWRhZCByZWxhdGl2YSAoJSkiKSkNCg0KI1Byb21lZGlhciBIdW1lZGFkIFJlbGF0aXZhIGRpYXJpYQ0KDQpjbGltYV9tdHlfZmViJGRhdGUgPC0gYXMuRGF0ZShjbGltYV9tdHlfZmViJHZhbGlkKQ0KDQpjbWZkIDwtIGFnZ3JlZ2F0ZShjbGltYV9tdHlfZmViLCBieT1saXN0KGRhdGUgPSBjbGltYV9tdHlfZmViJGRhdGUpLCBGVU49bWVhbikNCg0KIyBHcmFmaWNhciBsYSBodW1lZGFkIHJlbGF0aXZhDQpwbG90KGNtZmQkZGF0ZSxjbWZkJHJlbGgsdHlwZT0gImwiLCBtYWluID0gIlByb21lZGlvIERpYXJpbyBkZSBIdW1lZGFkIHJlbGF0aXZhIGVuICBtb250ZXJyZXkgZHVyYW50ZSBmZWJyZXJvIDIwMjQiLHhsYWI9ImZlY2hhIix5bGFiPSAoImh1bWVkYWQgcmVsYXRpdmEgKCUpIikpDQpgYGANCg0KDQojIDxzcGFuIHN0eWxlID0gImNvbG9yOiB5ZWxsb3c7Ij4gRWplcmNpY2lvIDMuIEdyYWZpY2FyIGxhIHRlbXBlcmF0dXJhICjCsEMpIHByb21lZGlvIGRpYXJpbyBlbiBHdWF5bWFzIDwvc3Bhbj4NCmBgYHtyfQ0KIyBQYXNvIDEuIEJ1c2NhciBsYSByZWQgZGVsIHBhw61zIChNw6l4aWNvKSB5IGNvcGlhciBDT0RFDQojVmlldyhyaWVtX25ldHdvcmtzKCkpDQojIE1YX19BU09TDQoNCiMgUGFzbyAyLiBCdXNjYXIgbGEgZXN0YWNpw7NuIG8gY2l1ZGFkIChHdWF5bWFzKSB5IGNvcGlhciBDT0RFDQojVmlldyhyaWVtX3N0YXRpb25zKCJNWF9fQVNPUyIpKQ0KIyBNTUdNDQoNCiMgUGFzbyAzLiBPYnRlbmVyIGRhdG9zIGRlbCBjbGltYSBkZSBsYSBjaXVkYWQgDQpjbGltYV9ndWF5bWFzIDwtIHJpZW1fbWVhc3VyZXMoIk1NR00iKQ0KDQojIFBhc28gNC4gT2J0ZW5lciBkYXRvcyBkZWwgY2xpbWEgZGUgR3VheW1hcyBlbiBmZWJyZXJvDQpjbGltYV9ndWF5X2ZlYiA8LSBzdWJzZXQoY2xpbWFfZ3VheW1hcywgdmFsaWQgPj0gYXMuUE9TSVhjdCgiMjAyNC0wMi0wMSAwMDowMCIpICYgdmFsaWQgPD0gYXMuUE9TSVhjdCgiMjAyNC0wMi0yOSAyMzo1OSIpKQ0KDQojIFBhc28gNS4gQ29udmVydGlyIHRlbXBlcmF0dXJhIGVuIGZhcmVuaGVpdCBhIGNlbGNpdXMgDQpjbGltYV9ndWF5X2ZlYiA8LSBjbGltYV9ndWF5X2ZlYiAlPiUgIG11dGF0ZSh0bXBjID0gKHRtcGYgLSAzMikgKiAoNS85KSkNCg0KIyBQcm9tZWRpYXIgbGEgdGVtcGVyYXR1cmEgQ2Vsc2l1cyBwb3IgZMOtYQ0KcHJvbWVkaW9fZGlhcmlvIDwtIGFnZ3JlZ2F0ZShjbGltYV9ndWF5X2ZlYiR0bXBjLGJ5ID0gbGlzdChkYXRlID0gYXMuRGF0ZShjbGltYV9ndWF5X2ZlYiR2YWxpZCkpLCBGVU4gPSBtZWFuKQ0KDQpwbG90KHByb21lZGlvX2RpYXJpbyRkYXRlLHByb21lZGlvX2RpYXJpbyR4LCB0eXBlID0gImwiLG1haW4gPSAiUHJvbWVkaW8gRGlhcmlvIGRlIHRlbXBlcmF0dXJhIGVuIEd1YXltYXMgZHVyYW50ZSBGZWJyZXJvIDIwMjQiLCB4bGFiID0gIkZlY2hhIiwgeWxhYiA9ICIgVGVtcGVyYXR1cmEgKMKwQykiICkNCmBgYA0KDQojIDxzcGFuIHN0eWxlID0gImNvbG9yOiB5ZWxsb3c7Ij4gQ29uY2x1c2lvbiA8L3NwYW4+DQpFbiBlc3RhIGFjdGl2aWRhZCwgcXVlIHRyYXRvIHNvYnJlIGVsIGNsaW1hIGRlIGRpZmVyZW50ZXMgdWJpY2FjaW9uZXMsIHNlIGVtcGxlw7MgZGlmZXJlbnRlcyBsaWJyZXLDrWFzIHBhcmEgcG9kZXIgZGVzYXJyb2xsYXIgbnVldmFzIHRhYmxhcyB5IGZ1bmNpb25lcyBxdWUgc2Vyw6FuIGRlIHV0aWxpZGFkLiBFbiBlc3RlIGNhc28gc2UgdXPDsyB1bmEgZ3LDoWZpY2EgZGUgbMOtbmVhcyBlbiBlbCBxdWUgbXVlc3RyYSBkaWFyaWFtZW50ZSBsb3MgZGlmZXJlbnRlcyBncmFkb3MgcXVlIHR1dm8gbGEgbG9jYWxpZGFkIHF1ZSBlbiBlc3RlIGNhc28gZnVlIE1vbnRlcnJleSB5IHNlIG1pZGllcm9uIHBvciB1bm9zIGFwYXJhdG9zIHF1ZSBhcnJvamEgZXN0YSBpbmZvcm1hY2nDs24uDQoNCkVuIG1pIGNhc28gcXVlIHlvIGVzY29nw60gR3VheW1hcyBlbCBjbGltYSBxdWUgdHV2byBlbiBmZWJyZXJvIGZ1ZSBtdXkgdmFyaWFkbywgYSBpbmljaW9zIGZ1ZSBtdXkgZnLDrW8gcG9yIGxhIHRlbXBvcmFkYSBkZSBpbnZpZXJubyB5IGEgZmluYWxlcyBlc3RhYmEgc2llbmRvIGNhbGllbnRlIHkgZnJlc2NvIHBvcnF1ZSBzZSB0ZXJtaW7DsyBkaWNoYSB0ZW1wb3JhZGEuDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0K