Teoría

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

Instalar paquetes y llamar librerías

library(riem)
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
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
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
## ✔ lubridate 1.9.3     ✔ tibble    3.2.1
## ✔ purrr     1.0.2     ✔ tidyr     1.3.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks plotly::filter(), stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors

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 (Monterrey) y copiar ID

view(riem_stations("MX__ASOS"))
# MMMY

Paso 3. Obtener los 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:00") & valid <= as.POSIXct("2024-02-29 23:59"))

Ejercicio 2. Graficar la Humedad Relativa en Monterrey 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$fecha <- as.Date(clima_mty_feb$valid)

cmdf <- aggregate(clima_mty_feb, by=list(date = clima_mty_feb$fecha), 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 Humedad Relativa promedio por día
plot(cmdf$fecha,cmdf$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 Diaria durante Febrero 2024 en Puebla

view(riem_stations("MX__ASOS"))
# MMPB

clima_pue <- riem_measures("MMPB")

clima_pue_feb <- subset(clima_pue, valid >= as.POSIXct("2024-02-01 00:00") & valid <= as.POSIXct("2024-02-29 23:59"))

clima_pue_feb$tmpf <- (clima_pue_feb$tmpf - 32) * 5/9

plot(clima_pue_feb$valid,clima_pue_feb$relh,type="l",main="Humedad Relativa en Puebla durante Febrero 2024 °C", xlab="Fecha", ylab="Humedad Relativa (%)")

Conclusión

La visualización de la humedad relativa en Monterrey y Puebla durante febrero de 2024 revela patrones climáticos distintos en ambas ciudades. La humedad relativa es un indicador clave del contenido de vapor de agua en el aire y puede influir en la percepción del clima. Al comparar las gráficas de humedad relativa de Monterrey y Puebla durante el mismo período, se pueden identificar diferencias en los patrones climáticos diarios.La evidencia visual revela que Monterrey experimentó variaciones en la humedad relativa durante febrero de 2024, con niveles que se mantuvieron en un rango específico y fluctuaron en ciertos intervalos. En contraste, Puebla presentó patrones más dinámicos, con variaciones significativas en la humedad relativa, indicando condiciones climáticas más cambiantes a lo largo del mes. Estas diferencias resaltan la diversidad climática entre ambas ciudades durante el período analizado.

LS0tDQp0aXRsZTogIkNsaW1hIg0KYXV0aG9yOiAiQWRyaWFuIE1vcmFsZXMgLSBBMDE3MjI1MzIiDQpkYXRlOiAiMjAyNC0wMi0yOSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IFRSVUUNCiAgICB0b2NfZmxvYXQ6IFRSVUUgDQogICAgY29kZV9kb3dubG9hZDogVFJVRQ0KICAgIHRoZW1lOiBkYXJrDQotLS0NCiFbXShDOlxcVXNlcnNcXGFkcmlhXFxPbmVEcml2ZVxcRG9jdW1lbnRvc1xcUlN0dWRpb1xcMTcxMDI0LTEyMDUxMDUyLmpwZykNCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IHllbGxvdzsiPlRlb3LDrWE8L3NwYW4+DQpMYSBpbmZvcm1hY2nDs24gZGVsIGNsaW1hIHNlIG9idGllbmUgZGVsICoqQVNPUyoqICgqQXV0b21hdGVkIFN1cmZhY2UgT2JzZXJ2aW5nIFN5c3RlbSopIHViaWNhZG9zIGVuIGxvcyBhZXJvcHVlcnRvcyBkZSB0b2RhcyBsYXMgY2l1ZGFkZXMgZGVsIG11bmRvLg0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogeWVsbG93OyI+SW5zdGFsYXIgcGFxdWV0ZXMgeSBsbGFtYXIgbGlicmVyw61hczwvc3Bhbj4NCmBgYHtyfQ0KbGlicmFyeShyaWVtKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogeWVsbG93OyI+UGFzbyAxLiBCdXNjYXIgbGEgcmVkIGRlbCBwYcOtcyAoTcOpeGljbykgeSBjb3BpYXIgQ09ERTwvc3Bhbj4NCmBgYHtyfQ0KdmlldyhyaWVtX25ldHdvcmtzKCkpDQojIE1YX19BU09TDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IHllbGxvdzsiPlBhc28gMi4gQnVzY2FyIGxhIGVzdGFjacOzbiBvIGNpdWRhZCAoTW9udGVycmV5KSB5IGNvcGlhciBJRDwvc3Bhbj4NCmBgYHtyfQ0KdmlldyhyaWVtX3N0YXRpb25zKCJNWF9fQVNPUyIpKQ0KIyBNTU1ZDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IHllbGxvdzsiPlBhc28gMy4gT2J0ZW5lciBsb3MgZGF0b3MgZGVsIGNsaW1hPC9zcGFuPg0KYGBge3J9DQpjbGltYV9tdHkgPC0gcmllbV9tZWFzdXJlcygiTU1NWSIpDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IHllbGxvdzsiPkVqZXJjaWNpbyAxLiBPYnRlbmVyIGRhdG9zIGRlbCBjbGltYSBkZSBNb250ZXJyZXkgZGUgRmVicmVybyAyMDI0PC9zcGFuPg0KYGBge3J9DQpjbGltYV9tdHlfZmViIDwtIHN1YnNldChjbGltYV9tdHksIHZhbGlkID49IGFzLlBPU0lYY3QoIjIwMjQtMDItMDEgMDA6MDAiKSAmIHZhbGlkIDw9IGFzLlBPU0lYY3QoIjIwMjQtMDItMjkgMjM6NTkiKSkNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogeWVsbG93OyI+RWplcmNpY2lvIDIuIEdyYWZpY2FyIGxhIEh1bWVkYWQgUmVsYXRpdmEgZW4gTW9udGVycmV5IGR1cmFudGUgRmVicmVybyAyMDI0PC9zcGFuPg0KYGBge3J9DQpwbG90KGNsaW1hX210eV9mZWIkdmFsaWQsY2xpbWFfbXR5X2ZlYiRyZWxoLHR5cGU9ImwiLG1haW49Ikh1bWVkYWQgUmVsYXRpdmEgZW4gTW9udGVycmV5IGR1cmFudGUgRmVicmVybyAyMDI0IiwgeGxhYj0iRmVjaGEiLCB5bGFiPSJIdW1lZGFkIFJlbGF0aXZhICglKSIpDQoNCiNQcm9tZWRpYXIgSHVtZWRhZCBSZWxhdGl2YSBkaWFyaWENCmNsaW1hX210eV9mZWIkZmVjaGEgPC0gYXMuRGF0ZShjbGltYV9tdHlfZmViJHZhbGlkKQ0KDQpjbWRmIDwtIGFnZ3JlZ2F0ZShjbGltYV9tdHlfZmViLCBieT1saXN0KGRhdGUgPSBjbGltYV9tdHlfZmViJGZlY2hhKSwgRlVOPW1lYW4pDQoNCiMgR3JhZmljYXIgSHVtZWRhZCBSZWxhdGl2YSBwcm9tZWRpbyBwb3IgZMOtYQ0KcGxvdChjbWRmJGZlY2hhLGNtZGYkcmVsaCx0eXBlPSJsIixtYWluPSJQcm9tZWRpbyBEaWFyaW8gZGUgSHVtZWRhZCBSZWxhdGl2YSBlbiBNb250ZXJyZXkgZHVyYW50ZSBGZWJyZXJvIDIwMjQiLCB4bGFiPSJGZWNoYSIsIHlsYWI9Ikh1bWVkYWQgUmVsYXRpdmEgKCUpIikNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogeWVsbG93OyI+RWplcmNpY2lvIDMuIEdyYWZpY2FyIGxhIFRlbXBlcmF0dXJhICjCsEMpIFByb21lZGlvIERpYXJpYSBkdXJhbnRlIEZlYnJlcm8gMjAyNCBlbiBQdWVibGEgPC9zcGFuPg0KYGBge3J9DQp2aWV3KHJpZW1fc3RhdGlvbnMoIk1YX19BU09TIikpDQojIE1NUEINCg0KY2xpbWFfcHVlIDwtIHJpZW1fbWVhc3VyZXMoIk1NUEIiKQ0KDQpjbGltYV9wdWVfZmViIDwtIHN1YnNldChjbGltYV9wdWUsIHZhbGlkID49IGFzLlBPU0lYY3QoIjIwMjQtMDItMDEgMDA6MDAiKSAmIHZhbGlkIDw9IGFzLlBPU0lYY3QoIjIwMjQtMDItMjkgMjM6NTkiKSkNCg0KY2xpbWFfcHVlX2ZlYiR0bXBmIDwtIChjbGltYV9wdWVfZmViJHRtcGYgLSAzMikgKiA1LzkNCg0KcGxvdChjbGltYV9wdWVfZmViJHZhbGlkLGNsaW1hX3B1ZV9mZWIkcmVsaCx0eXBlPSJsIixtYWluPSJIdW1lZGFkIFJlbGF0aXZhIGVuIFB1ZWJsYSBkdXJhbnRlIEZlYnJlcm8gMjAyNCDCsEMiLCB4bGFiPSJGZWNoYSIsIHlsYWI9Ikh1bWVkYWQgUmVsYXRpdmEgKCUpIikNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogeWVsbG93OyI+Q29uY2x1c2nDs248L3NwYW4+DQoNCkxhIHZpc3VhbGl6YWNpw7NuIGRlIGxhIGh1bWVkYWQgcmVsYXRpdmEgZW4gTW9udGVycmV5IHkgUHVlYmxhIGR1cmFudGUgZmVicmVybyBkZSAyMDI0IHJldmVsYSBwYXRyb25lcyBjbGltw6F0aWNvcyBkaXN0aW50b3MgZW4gYW1iYXMgY2l1ZGFkZXMuIExhIGh1bWVkYWQgcmVsYXRpdmEgZXMgdW4gaW5kaWNhZG9yIGNsYXZlIGRlbCBjb250ZW5pZG8gZGUgdmFwb3IgZGUgYWd1YSBlbiBlbCBhaXJlIHkgcHVlZGUgaW5mbHVpciBlbiBsYSBwZXJjZXBjacOzbiBkZWwgY2xpbWEuIEFsIGNvbXBhcmFyIGxhcyBncsOhZmljYXMgZGUgaHVtZWRhZCByZWxhdGl2YSBkZSBNb250ZXJyZXkgeSBQdWVibGEgZHVyYW50ZSBlbCBtaXNtbyBwZXLDrW9kbywgc2UgcHVlZGVuIGlkZW50aWZpY2FyIGRpZmVyZW5jaWFzIGVuIGxvcyBwYXRyb25lcyBjbGltw6F0aWNvcyBkaWFyaW9zLkxhIGV2aWRlbmNpYSB2aXN1YWwgcmV2ZWxhIHF1ZSBNb250ZXJyZXkgZXhwZXJpbWVudMOzIHZhcmlhY2lvbmVzIGVuIGxhIGh1bWVkYWQgcmVsYXRpdmEgZHVyYW50ZSBmZWJyZXJvIGRlIDIwMjQsIGNvbiBuaXZlbGVzIHF1ZSBzZSBtYW50dXZpZXJvbiBlbiB1biByYW5nbyBlc3BlY8OtZmljbyB5IGZsdWN0dWFyb24gZW4gY2llcnRvcyBpbnRlcnZhbG9zLiBFbiBjb250cmFzdGUsIFB1ZWJsYSBwcmVzZW50w7MgcGF0cm9uZXMgbcOhcyBkaW7DoW1pY29zLCBjb24gdmFyaWFjaW9uZXMgc2lnbmlmaWNhdGl2YXMgZW4gbGEgaHVtZWRhZCByZWxhdGl2YSwgaW5kaWNhbmRvIGNvbmRpY2lvbmVzIGNsaW3DoXRpY2FzIG3DoXMgY2FtYmlhbnRlcyBhIGxvIGxhcmdvIGRlbCBtZXMuIEVzdGFzIGRpZmVyZW5jaWFzIHJlc2FsdGFuIGxhIGRpdmVyc2lkYWQgY2xpbcOhdGljYSBlbnRyZSBhbWJhcyBjaXVkYWRlcyBkdXJhbnRlIGVsIHBlcsOtb2RvIGFuYWxpemFkby4NCg0K