Contexto

El paquete nycflights13 contiene información sobre todos los vuelos que partieron desde New York (EWR, JFK y LGA) a destinos en los Estados Unidos en 2013. Fueron 336,776 vuelos en total. Para ayudar a comprender las causas de los retrasos, también incluye otros conjuntos de datos útiles.

Fuente:
Origen de los datos

Este paquete incluye las siguientes tablas:

  • flights = todos los vuelos que salieron de NY en 2013.
  • weather = datos meteorológicos por hora de cada aeropuerto.
  • planes = información de contrucción de cada avión.
  • airports = nombres y ubicaciones de aeropuertos.
  • airlines = relación entre nombres y códigos de las aerolineas.

Instalar paquetes y llamar librerías

# install.packages("nycflights13")
library(nycflights13)
# install.packages("tidyverse")
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
# library(dplyr)
library(dplyr)

Guardar base de datos

flights <- flights
weather <- weather
planes <- planes
airports <- airports
airlines <- airlines

Relación entre las bases de datos

Funciones básicas de manejo de datos

Select

La función select sirve para seleccionar las columnas de una tabla (data frame).

df1 <- flights %>% select(carrier, flight) # Selección de columnas específicas
df2 <- flights %>% select(carrier:distance) # Selección de rango
df3 <- flights %>% select(-carrier, -flight) # Eliminar columnas específicas
df4 <- flights %>% select(-carrier:-distance) # Eliminar rango de columnas
df5 <- flights %>% select(aerolinea = carrier) # Selecciona una columna y le cambia el nombre
df6 <- flights %>% rename(aerolinea = carrier) # Cambia el nombre de una columna de toda la base de datos

Filter

La función Filter sirve para seleccionar renglones de una tabla (Data frame).

df7 <- flights %>% filter(dep_delay >=500) # Extrae renglonas que cumplan condición
# Igual ==, Desigual =!=, Mayor que >, Mayor o igual que >=, Menor que <, Menor o igual que <=
# Operadores lógicos: AND &, OR |, NOT !
df8 <- flights %>% filter(dep_delay >=500, dep_delay <600) # Estrae renglones que cumplan con dos condiciones 
df9 <- flights %>% slice(1000:1099) # Extrae los números de los renglones indicados, sin importar sus valores

Distinct

La función Distinct sirve para eliminar renglones duplicados.

df10 <- distinct(flights) # Dejar sólo los renglones diferentes, borra todos los repetidos.

Merge

La función Merge sirve para juntar bases de datos.

bdgrande <- merge (flights, airlines, by="carrier")
bdgrande2 <- merge (bdgrande, planes, by="tailnum")

Mutate

df11 <- mutate(bdgrande2, dist_km = distance*1.609) # Agrega variables nuevas calculadas a partir de variables existentes en la base de datos.
# 1.609 es conversión de millas a km

Ejercicios

  1. Encuentra todos los vuelos que tuvieron un atraso en llegada de 2 horas o más.
ejercicio1 <- bdgrande2 %>% filter(arr_delay >= 120)
  1. Encuentra todos los vuelos que llegaron a Houston (IAH / HOU)
ejercicio2 <- bdgrande2 %>% filter(dest == "IAH" | dest == "HOU")
  1. Encuentra todos los vuelos operados por United, American o Delta.
ejercicio3 <- bdgrande2 %>% filter(carrier %in% c("UA", "AA", "DL"))
  1. Encuentra todos los vuelos que despegaron en Julio, Agosto o Septiembre.
ejercicio4 <- bdgrande2 %>% filter(month %in% c("7", "8", "9"))
  1. Encuentra todos los vuelos que arrivaron más de 2 horas tarde, pero no despegaron tarde.
ejercicio5 <- bdgrande2 %>% filter(arr_delay >= 120, dep_delay <= 0)
  1. Encuentra todos los vuelos que se retrasaron al menos 1 hora, pero que llegaron antes 30 minutos o más.
ejercicio6 <- bdgrande2 %>% filter(dep_delay >= 60, arr_delay <= -30)
  1. Encuentra todos los vuelos que salieron entre la medianoche y las 6 a.m.
ejercicio7 <- bdgrande2 %>% filter(dep_time == 2400 | dep_time <= 600)

Arrange

Similar a filter() pero en lugar de seleccionar renglones, los ordena de menor a mayor.

df11 <- arrange(bdgrande2, year.x, month, day)

Para acomodar de mayor a menor:

df12 <- arrange(bdgrande2, year.x, desc(month), day)

Summarize

Colapsa una tabla a un sólo renglón.

# Obtén el retraso promedio de despegue de todos los vuelos.
summarize(bdgrande2, mean(dep_delay, na.rm=TRUE))
##   mean(dep_delay, na.rm = TRUE)
## 1                      13.17979

Group by

Agrupa tabla basado en algunas columnas.

por_dia <- group_by(bdgrande2, year.x, month, day)
summarize(por_dia, mean(dep_delay, na.rm=TRUE))
## `summarise()` has grouped output by 'year.x', 'month'. You can override using
## the `.groups` argument.
## # A tibble: 365 × 4
## # Groups:   year.x, month [12]
##    year.x month   day `mean(dep_delay, na.rm = TRUE)`
##     <int> <int> <int>                           <dbl>
##  1   2013     1     1                           10.7 
##  2   2013     1     2                           14.4 
##  3   2013     1     3                           11.1 
##  4   2013     1     4                           10.0 
##  5   2013     1     5                            5.70
##  6   2013     1     6                            7.98
##  7   2013     1     7                            6.49
##  8   2013     1     8                            3.10
##  9   2013     1     9                            3.17
## 10   2013     1    10                            1.89
## # ℹ 355 more rows

Retraso de aviones

Por qué los aviones llegan tarde y como se puede evitar esto

df13 <- flights %>% select(dep_delay, arr_delay)
ggplot() +
  geom_point(mapping = aes(x = dep_delay, y = arr_delay), data = df13) +
  geom_point(
    mapping = aes(x = dep_delay, y = arr_delay), data = df13,
    colour = 'pink', size = 1
  )
## Warning: Removed 9430 rows containing missing values or values outside the scale range
## (`geom_point()`).
## Removed 9430 rows containing missing values or values outside the scale range
## (`geom_point()`).

LS0tCnRpdGxlOiAiRGF0YSBXcmFuZ2xpbmcgKFBhcnRlIDEpIgphdXRob3I6ICJBbmEgUGF1bGEgQWx2ZWFyIC0gQTAxMDI3NzE0IgpkYXRlOiAiMjAyNC0wMi0xOSIKb3V0cHV0OiAKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiBUUlVFCiAgICB0b2NfZmxvYXQ6IFRSVUUKICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUKICAgIHRoZW1lOiB5ZXRpCi0tLQoKIVtdKC9Vc2Vycy9hbmFwYXVhbHZlYXIvRGVza3RvcC9TNjBNLmdpZikKCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBmdWNoc2lhOyI+Q29udGV4dG88L3NwYW4+CkVsIHBhcXVldGUgKipueWNmbGlnaHRzMTMqKiBjb250aWVuZSBpbmZvcm1hY2nDs24gc29icmUgdG9kb3MgbG9zIHZ1ZWxvcyBxdWUgcGFydGllcm9uIGRlc2RlIE5ldyBZb3JrIChFV1IsIEpGSyB5IExHQSkgYSBkZXN0aW5vcyBlbiBsb3MgRXN0YWRvcyBVbmlkb3MgZW4gMjAxMy4gRnVlcm9uIDMzNiw3NzYgdnVlbG9zIGVuIHRvdGFsLiBQYXJhIGF5dWRhciBhIGNvbXByZW5kZXIgbGFzIGNhdXNhcyBkZSBsb3MgcmV0cmFzb3MsIHRhbWJpw6luIGluY2x1eWUgb3Ryb3MgY29uanVudG9zIGRlIGRhdG9zIMO6dGlsZXMuIAoKRnVlbnRlOiAgCltPcmlnZW4gZGUgbG9zIGRhdG9zXShodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvbnljZmxpZ2h0czEzL255Y2ZsaWdodHMxMy5wZGYpCgpFc3RlIHBhcXVldGUgaW5jbHV5ZSBsYXMgc2lndWllbnRlcyB0YWJsYXM6IAoKKyBmbGlnaHRzID0gdG9kb3MgbG9zIHZ1ZWxvcyBxdWUgc2FsaWVyb24gZGUgTlkgZW4gMjAxMy4gICAKKyB3ZWF0aGVyID0gZGF0b3MgbWV0ZW9yb2zDs2dpY29zIHBvciBob3JhIGRlIGNhZGEgYWVyb3B1ZXJ0by4gICAKKyBwbGFuZXMgPSBpbmZvcm1hY2nDs24gZGUgY29udHJ1Y2Npw7NuIGRlIGNhZGEgYXZpw7NuLiAgCisgYWlycG9ydHMgPSBub21icmVzIHkgdWJpY2FjaW9uZXMgZGUgYWVyb3B1ZXJ0b3MuICAgCisgYWlybGluZXMgPSByZWxhY2nDs24gZW50cmUgbm9tYnJlcyB5IGPDs2RpZ29zIGRlIGxhcyBhZXJvbGluZWFzLiAKCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBmdWNoc2lhOyI+SW5zdGFsYXIgcGFxdWV0ZXMgeSBsbGFtYXIgbGlicmVyw61hczwvc3Bhbj4KYGBge3J9CiMgaW5zdGFsbC5wYWNrYWdlcygibnljZmxpZ2h0czEzIikKbGlicmFyeShueWNmbGlnaHRzMTMpCiMgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikKbGlicmFyeSh0aWR5dmVyc2UpCiMgbGlicmFyeShkcGx5cikKbGlicmFyeShkcGx5cikKYGBgCgoKCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBmdWNoc2lhOyI+R3VhcmRhciBiYXNlIGRlIGRhdG9zPC9zcGFuPgpgYGB7cn0KZmxpZ2h0cyA8LSBmbGlnaHRzCndlYXRoZXIgPC0gd2VhdGhlcgpwbGFuZXMgPC0gcGxhbmVzCmFpcnBvcnRzIDwtIGFpcnBvcnRzCmFpcmxpbmVzIDwtIGFpcmxpbmVzCmBgYAoKIyA8c3BhbiBzdHlsZT0iY29sb3I6IGZ1Y2hzaWE7Ij5SZWxhY2nDs24gZW50cmUgbGFzIGJhc2VzIGRlIGRhdG9zPC9zcGFuPgoKIVtdKC9Vc2Vycy9hbmFwYXVhbHZlYXIvRGVza3RvcC9yZWxhdGlvbmFsLW55Y2ZsaWdodHMucG5nKQoKIyA8c3BhbiBzdHlsZT0iY29sb3I6IGZ1Y2hzaWE7Ij5GdW5jaW9uZXMgYsOhc2ljYXMgZGUgbWFuZWpvIGRlIGRhdG9zPC9zcGFuPgoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBwaW5rOyI+U2VsZWN0PC9zcGFuPgpMYSBmdW5jacOzbiAqc2VsZWN0KiBzaXJ2ZSBwYXJhIHNlbGVjY2lvbmFyIGxhcyBjb2x1bW5hcyBkZSB1bmEgdGFibGEgKCpkYXRhIGZyYW1lKikuICAKYGBge3J9CmRmMSA8LSBmbGlnaHRzICU+JSBzZWxlY3QoY2FycmllciwgZmxpZ2h0KSAjIFNlbGVjY2nDs24gZGUgY29sdW1uYXMgZXNwZWPDrWZpY2FzCmRmMiA8LSBmbGlnaHRzICU+JSBzZWxlY3QoY2FycmllcjpkaXN0YW5jZSkgIyBTZWxlY2Npw7NuIGRlIHJhbmdvCmRmMyA8LSBmbGlnaHRzICU+JSBzZWxlY3QoLWNhcnJpZXIsIC1mbGlnaHQpICMgRWxpbWluYXIgY29sdW1uYXMgZXNwZWPDrWZpY2FzCmRmNCA8LSBmbGlnaHRzICU+JSBzZWxlY3QoLWNhcnJpZXI6LWRpc3RhbmNlKSAjIEVsaW1pbmFyIHJhbmdvIGRlIGNvbHVtbmFzCmRmNSA8LSBmbGlnaHRzICU+JSBzZWxlY3QoYWVyb2xpbmVhID0gY2FycmllcikgIyBTZWxlY2Npb25hIHVuYSBjb2x1bW5hIHkgbGUgY2FtYmlhIGVsIG5vbWJyZQpkZjYgPC0gZmxpZ2h0cyAlPiUgcmVuYW1lKGFlcm9saW5lYSA9IGNhcnJpZXIpICMgQ2FtYmlhIGVsIG5vbWJyZSBkZSB1bmEgY29sdW1uYSBkZSB0b2RhIGxhIGJhc2UgZGUgZGF0b3MKYGBgCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IHBpbms7Ij5GaWx0ZXI8L3NwYW4+CkxhIGZ1bmNpw7NuICpGaWx0ZXIqIHNpcnZlIHBhcmEgc2VsZWNjaW9uYXIgcmVuZ2xvbmVzIGRlIHVuYSB0YWJsYSAoKkRhdGEgZnJhbWUqKS4gIApgYGB7cn0KZGY3IDwtIGZsaWdodHMgJT4lIGZpbHRlcihkZXBfZGVsYXkgPj01MDApICMgRXh0cmFlIHJlbmdsb25hcyBxdWUgY3VtcGxhbiBjb25kaWNpw7NuCiMgSWd1YWwgPT0sIERlc2lndWFsID0hPSwgTWF5b3IgcXVlID4sIE1heW9yIG8gaWd1YWwgcXVlID49LCBNZW5vciBxdWUgPCwgTWVub3IgbyBpZ3VhbCBxdWUgPD0KIyBPcGVyYWRvcmVzIGzDs2dpY29zOiBBTkQgJiwgT1IgfCwgTk9UICEKZGY4IDwtIGZsaWdodHMgJT4lIGZpbHRlcihkZXBfZGVsYXkgPj01MDAsIGRlcF9kZWxheSA8NjAwKSAjIEVzdHJhZSByZW5nbG9uZXMgcXVlIGN1bXBsYW4gY29uIGRvcyBjb25kaWNpb25lcyAKZGY5IDwtIGZsaWdodHMgJT4lIHNsaWNlKDEwMDA6MTA5OSkgIyBFeHRyYWUgbG9zIG7Dum1lcm9zIGRlIGxvcyByZW5nbG9uZXMgaW5kaWNhZG9zLCBzaW4gaW1wb3J0YXIgc3VzIHZhbG9yZXMKYGBgCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IHBpbms7Ij5EaXN0aW5jdDwvc3Bhbj4KTGEgZnVuY2nDs24gKkRpc3RpbmN0KiBzaXJ2ZSBwYXJhIGVsaW1pbmFyIHJlbmdsb25lcyBkdXBsaWNhZG9zLiAgCmBgYHtyfQpkZjEwIDwtIGRpc3RpbmN0KGZsaWdodHMpICMgRGVqYXIgc8OzbG8gbG9zIHJlbmdsb25lcyBkaWZlcmVudGVzLCBib3JyYSB0b2RvcyBsb3MgcmVwZXRpZG9zLgpgYGAKCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcGluazsiPk1lcmdlPC9zcGFuPgpMYSBmdW5jacOzbiAqTWVyZ2UqIHNpcnZlIHBhcmEganVudGFyIGJhc2VzIGRlIGRhdG9zLiAgCmBgYHtyfQpiZGdyYW5kZSA8LSBtZXJnZSAoZmxpZ2h0cywgYWlybGluZXMsIGJ5PSJjYXJyaWVyIikKYmRncmFuZGUyIDwtIG1lcmdlIChiZGdyYW5kZSwgcGxhbmVzLCBieT0idGFpbG51bSIpCmBgYAoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBwaW5rOyI+TXV0YXRlPC9zcGFuPgpgYGB7cn0KZGYxMSA8LSBtdXRhdGUoYmRncmFuZGUyLCBkaXN0X2ttID0gZGlzdGFuY2UqMS42MDkpICMgQWdyZWdhIHZhcmlhYmxlcyBudWV2YXMgY2FsY3VsYWRhcyBhIHBhcnRpciBkZSB2YXJpYWJsZXMgZXhpc3RlbnRlcyBlbiBsYSBiYXNlIGRlIGRhdG9zLgojIDEuNjA5IGVzIGNvbnZlcnNpw7NuIGRlIG1pbGxhcyBhIGttCmBgYAoKIyMgIDxzcGFuIHN0eWxlPSJjb2xvcjogcGluazsiPkVqZXJjaWNpb3M8L3NwYW4+CjEuIEVuY3VlbnRyYSB0b2RvcyBsb3MgdnVlbG9zIHF1ZSB0dXZpZXJvbiB1biBhdHJhc28gZW4gbGxlZ2FkYSBkZSAyIGhvcmFzIG8gbcOhcy4KYGBge3J9CmVqZXJjaWNpbzEgPC0gYmRncmFuZGUyICU+JSBmaWx0ZXIoYXJyX2RlbGF5ID49IDEyMCkKYGBgCgoyLiBFbmN1ZW50cmEgdG9kb3MgbG9zIHZ1ZWxvcyBxdWUgbGxlZ2Fyb24gYSBIb3VzdG9uIChJQUggLyBIT1UpCmBgYHtyfQplamVyY2ljaW8yIDwtIGJkZ3JhbmRlMiAlPiUgZmlsdGVyKGRlc3QgPT0gIklBSCIgfCBkZXN0ID09ICJIT1UiKQpgYGAKCjMuIEVuY3VlbnRyYSB0b2RvcyBsb3MgdnVlbG9zIG9wZXJhZG9zIHBvciBVbml0ZWQsIEFtZXJpY2FuIG8gRGVsdGEuIApgYGB7cn0KZWplcmNpY2lvMyA8LSBiZGdyYW5kZTIgJT4lIGZpbHRlcihjYXJyaWVyICVpbiUgYygiVUEiLCAiQUEiLCAiREwiKSkKYGBgCgo0LiBFbmN1ZW50cmEgdG9kb3MgbG9zIHZ1ZWxvcyBxdWUgZGVzcGVnYXJvbiBlbiBKdWxpbywgQWdvc3RvIG8gU2VwdGllbWJyZS4gIApgYGB7cn0KZWplcmNpY2lvNCA8LSBiZGdyYW5kZTIgJT4lIGZpbHRlcihtb250aCAlaW4lIGMoIjciLCAiOCIsICI5IikpCmBgYAo1LiBFbmN1ZW50cmEgdG9kb3MgbG9zIHZ1ZWxvcyBxdWUgYXJyaXZhcm9uIG3DoXMgZGUgMiBob3JhcyB0YXJkZSwgcGVybyBubyBkZXNwZWdhcm9uIHRhcmRlLiAgCmBgYHtyfQplamVyY2ljaW81IDwtIGJkZ3JhbmRlMiAlPiUgZmlsdGVyKGFycl9kZWxheSA+PSAxMjAsIGRlcF9kZWxheSA8PSAwKQpgYGAKNi4gRW5jdWVudHJhIHRvZG9zIGxvcyB2dWVsb3MgcXVlIHNlIHJldHJhc2Fyb24gYWwgbWVub3MgMSBob3JhLCBwZXJvIHF1ZSBsbGVnYXJvbiBhbnRlcyAzMCBtaW51dG9zIG8gbcOhcy4gIApgYGB7cn0KZWplcmNpY2lvNiA8LSBiZGdyYW5kZTIgJT4lIGZpbHRlcihkZXBfZGVsYXkgPj0gNjAsIGFycl9kZWxheSA8PSAtMzApCmBgYAoKNy4gRW5jdWVudHJhIHRvZG9zIGxvcyB2dWVsb3MgcXVlIHNhbGllcm9uIGVudHJlIGxhIG1lZGlhbm9jaGUgeSBsYXMgNiBhLm0uIApgYGB7cn0KZWplcmNpY2lvNyA8LSBiZGdyYW5kZTIgJT4lIGZpbHRlcihkZXBfdGltZSA9PSAyNDAwIHwgZGVwX3RpbWUgPD0gNjAwKQpgYGAKCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcGluazsiPkFycmFuZ2U8L3NwYW4+ClNpbWlsYXIgYSBmaWx0ZXIoKSBwZXJvIGVuIGx1Z2FyIGRlIHNlbGVjY2lvbmFyIHJlbmdsb25lcywgbG9zIG9yZGVuYSBkZSBtZW5vciBhIG1heW9yLiAgCmBgYHtyfQpkZjExIDwtIGFycmFuZ2UoYmRncmFuZGUyLCB5ZWFyLngsIG1vbnRoLCBkYXkpCmBgYAoKUGFyYSBhY29tb2RhciBkZSBtYXlvciBhIG1lbm9yOiAgCmBgYHtyfQpkZjEyIDwtIGFycmFuZ2UoYmRncmFuZGUyLCB5ZWFyLngsIGRlc2MobW9udGgpLCBkYXkpCmBgYAoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBwaW5rOyI+U3VtbWFyaXplPC9zcGFuPgpDb2xhcHNhIHVuYSB0YWJsYSBhIHVuIHPDs2xvIHJlbmdsw7NuLiAgCmBgYHtyfQojIE9idMOpbiBlbCByZXRyYXNvIHByb21lZGlvIGRlIGRlc3BlZ3VlIGRlIHRvZG9zIGxvcyB2dWVsb3MuCnN1bW1hcml6ZShiZGdyYW5kZTIsIG1lYW4oZGVwX2RlbGF5LCBuYS5ybT1UUlVFKSkKYGBgCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IHBpbms7Ij5Hcm91cCBieTwvc3Bhbj4KQWdydXBhIHRhYmxhIGJhc2FkbyBlbiBhbGd1bmFzIGNvbHVtbmFzLiAgCmBgYHtyfQpwb3JfZGlhIDwtIGdyb3VwX2J5KGJkZ3JhbmRlMiwgeWVhci54LCBtb250aCwgZGF5KQpzdW1tYXJpemUocG9yX2RpYSwgbWVhbihkZXBfZGVsYXksIG5hLnJtPVRSVUUpKQpgYGAKCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogZGVlcHBpbms7Ij5SZXRyYXNvIGRlIGF2aW9uZXM8L3NwYW4+ClBvciBxdcOpIGxvcyBhdmlvbmVzIGxsZWdhbiB0YXJkZSB5IGNvbW8gc2UgcHVlZGUgZXZpdGFyIGVzdG8KCmBgYHtyfQpkZjEzIDwtIGZsaWdodHMgJT4lIHNlbGVjdChkZXBfZGVsYXksIGFycl9kZWxheSkKZ2dwbG90KCkgKwogIGdlb21fcG9pbnQobWFwcGluZyA9IGFlcyh4ID0gZGVwX2RlbGF5LCB5ID0gYXJyX2RlbGF5KSwgZGF0YSA9IGRmMTMpICsKICBnZW9tX3BvaW50KAogICAgbWFwcGluZyA9IGFlcyh4ID0gZGVwX2RlbGF5LCB5ID0gYXJyX2RlbGF5KSwgZGF0YSA9IGRmMTMsCiAgICBjb2xvdXIgPSAncGluaycsIHNpemUgPSAxCiAgKQpgYGAKCgo=