1 Contexto

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

Este paquete incluye las siguientes tablas:

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

Fuente:

Origen de los datos

2 Cargar librerias

library(nycflights13)
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)

3 Guardar bases de datos

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

bdgrande <- merge(flights, airlines, by="carrier")
bdgrande2 <- merge(bdgrande, planes, by="tailnum")
bdgrande2$date <- as.Date(paste(bdgrande2$year.x,bdgrande2$month, bdgrande2$day, sep = "-"))
bdgrande2$week_day <- weekdays(bdgrande2$date) 
df_combinado <- bdgrande2 %>%
  left_join(weather, by = c("origin" = "origin", "year.x" = "year", "month" = "month", "day" = "day"))
df_combinado <- df_combinado %>%
  select(-wind_gust, -manufacturer, -engines, -seats, -arr_time, -sched_arr_time)
df_combinado <- as.data.frame(df_combinado)

4 Avance 1

4.1 Modelo de regresión lineal

regresion <- lm(dep_delay ~ tailnum + carrier + year.x + month + day + dep_time + dep_delay + arr_delay + flight + origin + dest + air_time + distance + hour.x + minute + time_hour.x + name + year.y + type + model + speed + engine + date + week_day + hour.y + temp + dewp + humid + wind_dir + wind_speed + precip + pressure + visib + time_hour.y, data=df_combinado)
summary(regresion)
## 
## Call:
## lm(formula = dep_delay ~ tailnum + carrier + year.x + month + 
##     day + dep_time + dep_delay + arr_delay + flight + origin + 
##     dest + air_time + distance + hour.x + minute + time_hour.x + 
##     name + year.y + type + model + speed + engine + date + week_day + 
##     hour.y + temp + dewp + humid + wind_dir + wind_speed + precip + 
##     pressure + visib + time_hour.y, data = df_combinado)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -22.0996  -4.1682  -0.1576   4.1222  20.4548 
## 
## Coefficients: (29 not defined because of singularities)
##                                Estimate Std. Error  t value Pr(>|t|)    
## (Intercept)                  -1.539e+03  1.303e+03   -1.182 0.237352    
## tailnumN202AA                 8.596e-01  2.936e-01    2.928 0.003413 ** 
## tailnumN350AA                 4.490e+02  5.231e+01    8.584  < 2e-16 ***
## tailnumN364AA                 4.503e+02  5.231e+01    8.609  < 2e-16 ***
## tailnumN378AA                 4.499e+02  5.231e+01    8.600  < 2e-16 ***
## tailnumN381AA                 4.498e+02  5.231e+01    8.599  < 2e-16 ***
## tailnumN425AA                 3.945e-01  2.780e-01    1.419 0.155937    
## tailnumN508AA                 1.565e+00  2.777e-01    5.637 1.76e-08 ***
## tailnumN519MQ                -1.207e+00  5.073e-01   -2.380 0.017312 *  
## tailnumN525AA                 3.684e-01  2.769e-01    1.331 0.183309    
## tailnumN545AA                -1.580e-01  2.817e-01   -0.561 0.575011    
## tailnumN567AA                 2.489e+00  2.524e-01    9.860  < 2e-16 ***
## tailnumN600TR                 2.506e+00  1.145e+00    2.188 0.028658 *  
## tailnumN615AA                 4.485e+02  5.237e+01    8.563  < 2e-16 ***
## tailnumN621AA                 4.508e+02  5.236e+01    8.611  < 2e-16 ***
## tailnumN675MC                -3.614e+00  8.984e-01   -4.023 5.77e-05 ***
## tailnumN737MQ                -2.479e+00  5.822e-01   -4.258 2.07e-05 ***
## tailnumN762NC                 2.021e-01  7.446e-01    0.271 0.786057    
## tailnumN767NC                 1.665e+00  7.210e-01    2.309 0.020960 *  
## tailnumN774NC                -6.066e-01  8.626e-01   -0.703 0.481899    
## tailnumN777NC                -5.685e-01  7.914e-01   -0.718 0.472543    
## tailnumN779NC                -1.562e+00  7.541e-01   -2.071 0.038345 *  
## tailnumN782NC                 1.096e+00  7.325e-01    1.496 0.134592    
## carrierDL                            NA         NA       NA       NA    
## carrierMQ                            NA         NA       NA       NA    
## year.x                               NA         NA       NA       NA    
## month                        -3.971e+00  2.525e+00   -1.572 0.115869    
## day                          -1.469e-01  8.387e-02   -1.751 0.079877 .  
## dep_time                      4.625e-01  1.733e-03  266.896  < 2e-16 ***
## arr_delay                     1.919e-01  2.778e-03   69.099  < 2e-16 ***
## flight                       -5.766e-04  1.148e-04   -5.021 5.19e-07 ***
## originJFK                     3.789e+00  7.995e-01    4.740 2.16e-06 ***
## originLGA                     7.921e+00  1.024e+00    7.735 1.09e-14 ***
## destBNA                       1.395e+00  3.137e-01    4.449 8.67e-06 ***
## destCLE                      -1.819e+02  2.123e+01   -8.568  < 2e-16 ***
## destCLT                      -1.140e+02  1.351e+01   -8.439  < 2e-16 ***
## destCMH                      -1.494e+02  1.747e+01   -8.553  < 2e-16 ***
## destCRW                      -1.697e+02  1.968e+01   -8.627  < 2e-16 ***
## destDCA                      -2.880e+02  3.367e+01   -8.554  < 2e-16 ***
## destDFW                       3.399e+02  3.898e+01    8.721  < 2e-16 ***
## destDTW                      -1.354e+02  1.606e+01   -8.433  < 2e-16 ***
## destEGE                       8.823e+01  9.278e+00    9.510  < 2e-16 ***
## destLAS                       3.613e+02  4.034e+01    8.958  < 2e-16 ***
## destMCO                      -3.447e+02  4.056e+01   -8.498  < 2e-16 ***
## destMIA                      -2.667e+02  3.151e+01   -8.463  < 2e-16 ***
## destMSP                       1.396e+02  1.603e+01    8.705  < 2e-16 ***
## destORD                      -1.387e+01  1.718e+00   -8.073 7.25e-16 ***
## destRDU                      -1.760e+02  2.049e+01   -8.591  < 2e-16 ***
## destSAN                       4.629e+02  5.267e+01    8.788  < 2e-16 ***
## destSFO                       5.395e+02  6.135e+01    8.794  < 2e-16 ***
## destSJU                              NA         NA       NA       NA    
## destSTL                       6.773e+01  7.967e+00    8.502  < 2e-16 ***
## destXNA                       2.145e+02  2.395e+01    8.953  < 2e-16 ***
## air_time                     -2.012e-01  5.437e-03  -37.000  < 2e-16 ***
## distance                     -5.144e-01  6.200e-02   -8.297  < 2e-16 ***
## hour.x                       -4.632e+01  2.389e-01 -193.873  < 2e-16 ***
## minute                       -6.899e-01  3.638e-03 -189.628  < 2e-16 ***
## time_hour.x                   4.600e-05  5.006e-05    0.919 0.358161    
## nameDelta Air Lines Inc.             NA         NA       NA       NA    
## nameEnvoy Air                        NA         NA       NA       NA    
## year.y                               NA         NA       NA       NA    
## typeFixed wing single engine         NA         NA       NA       NA    
## typeRotorcraft                       NA         NA       NA       NA    
## model172E                            NA         NA       NA       NA    
## model172M                            NA         NA       NA       NA    
## model172N                            NA         NA       NA       NA    
## model206B                            NA         NA       NA       NA    
## model310Q                            NA         NA       NA       NA    
## model421C                            NA         NA       NA       NA    
## model65-A90                          NA         NA       NA       NA    
## modelA185F                           NA         NA       NA       NA    
## modelDC-7BF                          NA         NA       NA       NA    
## modelDC-9-51                         NA         NA       NA       NA    
## modelOTTER DHC-3                     NA         NA       NA       NA    
## modelPA-28-180                       NA         NA       NA       NA    
## modelPA-31-350                       NA         NA       NA       NA    
## modelPA-32R-300                      NA         NA       NA       NA    
## speed                                NA         NA       NA       NA    
## engineReciprocating                  NA         NA       NA       NA    
## engineTurbo-jet                      NA         NA       NA       NA    
## engineTurbo-prop                     NA         NA       NA       NA    
## engineTurbo-shaft                    NA         NA       NA       NA    
## date                         -3.851e+00  4.368e+00   -0.882 0.377971    
## week_dayMonday                1.356e+00  1.687e-01    8.037 9.77e-16 ***
## week_daySaturday              1.674e+00  1.769e-01    9.466  < 2e-16 ***
## week_daySunday                1.685e-01  1.697e-01    0.993 0.320662    
## week_dayThursday              1.132e-01  1.607e-01    0.705 0.481015    
## week_dayTuesday              -3.998e-02  1.678e-01   -0.238 0.811704    
## week_dayWednesday             7.163e-01  1.554e-01    4.611 4.04e-06 ***
## hour.y                        3.366e-03  6.497e-03    0.518 0.604424    
## temp                         -9.587e-02  2.951e-02   -3.249 0.001161 ** 
## dewp                          8.216e-02  3.163e-02    2.598 0.009389 ** 
## humid                        -5.202e-02  1.567e-02   -3.319 0.000905 ***
## wind_dir                     -3.706e-04  4.492e-04   -0.825 0.409356    
## wind_speed                   -1.371e-02  4.914e-03   -2.789 0.005293 ** 
## precip                       -5.582e+00  4.232e+00   -1.319 0.187241    
## pressure                      3.219e-02  6.923e-03    4.650 3.34e-06 ***
## visib                        -1.124e-01  3.904e-02   -2.878 0.004006 ** 
## time_hour.y                          NA         NA       NA       NA    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.977 on 19251 degrees of freedom
##   (6761785 observations deleted due to missingness)
## Multiple R-squared:  0.9759, Adjusted R-squared:  0.9758 
## F-statistic: 1.13e+04 on 69 and 19251 DF,  p-value: < 2.2e-16

4.2 Relación entre días de la semana y retraso medio de salida

flights_delayed <- filter(flights, dep_delay > 0)

by_origin_hour <- group_by(flights_delayed, origin, time_hour)

delay_count <- summarise(by_origin_hour, mean_delay = mean(dep_delay, na.rm = TRUE),
                         count = n())
## `summarise()` has grouped output by 'origin'. You can override using the
## `.groups` argument.
flights_weather <- inner_join(delay_count, weather, by = c("origin", "time_hour"))

flights_weather$date <- as.Date(paste(flights_weather$year,flights_weather$month, flights_weather$day, sep = "-"))
flights_weather$week_day <- weekdays(flights_weather$date)

flights_weather$week_day <- factor(flights_weather$week_day, levels = c("lunes", "martes", "miércoles", "jueves", "viernes", "sábado", "domingo"))
by_week_day <- group_by(flights_weather, week_day)
delay_by_day <- summarise(by_week_day, mean_delay = mean(mean_delay, na.rm = TRUE),
                          count = sum(count))

delay_by_day %>% 
  ggplot(aes(x = week_day, y = mean_delay, size = count)) +
  geom_bar(stat = "identity", fill = "blue") +
  labs(x = "Día de la semana", y = "Retraso promedio (minutos)", 
       title = "Retraso promedio por día de la semana") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

4.3 Relación entre temperatura y retraso medio de salida

by_temp <- group_by(flights_weather, temp)

delay_temp <- summarise(by_temp, mean_delay = mean(mean_delay, na.rm = TRUE),
                        count = sum(count))

delay_temp %>% 
  ggplot(aes(x = temp, y = mean_delay)) +
  geom_point(size = 2, color = "blue", alpha = 0.8) +
  geom_smooth(method = "lm") +
  labs(x = "Temperatura media (Fahrenheit)", y = "Retraso de salida medio (minutos)") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))
## `geom_smooth()` using formula = 'y ~ x'

4.4 Relación entre el punto de rocío y retraso medio de salida

by_dewpoint <- group_by(flights_weather, dewp)

filtered_dewpoint <- flights_weather %>%
  filter(!is.na(dewp)) %>%
  filter(dewp >= quantile(flights_weather$dewp, 0.25, na.rm = TRUE) & dewp <= quantile(flights_weather$dewp, 0.75, na.rm = TRUE))

delay_dewpoint <- filtered_dewpoint %>%
  group_by(dewp) %>%
  summarise(mean_delay = mean(mean_delay, na.rm = TRUE),
            count = sum(count))

delay_dewpoint %>% 
  ggplot(aes(x = dewp, y = mean_delay)) +
  geom_point(size = 2, color = "blue", alpha = 0.8) +
  geom_smooth(method = "lm") +
  labs(x = "Punto de rocío media (Farenheit)",y = "Retraso de salida media (minutos)") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))
## `geom_smooth()` using formula = 'y ~ x'

4.5 Relación entre humedad y retraso medio de salida

by_humid <- group_by(flights_weather, humid)

filtered_humid <- flights_weather %>%
  filter(!is.na(humid)) %>%
  filter(humid >= quantile(flights_weather$humid, 0.25, na.rm = TRUE) & humid <= quantile(flights_weather$humid, 0.75, na.rm = TRUE))

delay_humid <- filtered_humid %>%
  group_by(humid) %>%
  summarise(mean_delay = mean(mean_delay, na.rm = TRUE),
            count = sum(count))
delay_humid %>% 
  ggplot(aes(x = humid, y = mean_delay)) +
  geom_point(size = 2, color = "blue", alpha = 0.8) +
  geom_smooth(method = "lm") +
  labs(x = "Humedad media",y = "Retraso de salida media (minutos)") +
  theme_minimal()+
  theme(plot.title = element_text(hjust = 0.5))
## `geom_smooth()` using formula = 'y ~ x'

4.6 Relación entre presión y retraso medio de salida

by_pressure <- group_by(flights_weather, pressure)

filtered_pressure <- flights_weather %>%
  filter(!is.na(pressure)) %>%
  filter(pressure >= quantile(flights_weather$pressure, 0.25, na.rm = TRUE) & pressure <= quantile(flights_weather$pressure, 0.75, na.rm = TRUE))

delay_pressure <- filtered_dewpoint %>%
  group_by(pressure) %>%
  summarise(mean_delay = mean(mean_delay, na.rm = TRUE),
            count = sum(count))

delay_pressure %>% 
  ggplot(aes(x = pressure, y = mean_delay)) +
  geom_point(size = 2, color = "blue", alpha = 0.8) +
  geom_smooth(method = "lm") +
  labs(x = "Presión media (milibares)",y = "Retraso de salida media (minutos)") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))
## `geom_smooth()` using formula = 'y ~ x'

4.7 Relación entre visibilidad y retraso medio de salida

by_visib <- group_by(flights_weather, visib)

delay_visib <- summarise(by_visib, mean_delay = mean(mean_delay, na.rm = TRUE),
                         count = sum(count))

delay_visib %>% 
  ggplot(aes(x = visib, y = mean_delay)) +
  geom_point(size = 2, color = "blue", alpha = 0.8) +
  geom_smooth(method = "lm") +
  labs(x = "Visibilidad media (millas)", y = "Retraso de salida media (minutos)") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))
## `geom_smooth()` using formula = 'y ~ x'

4.8 Relación entre velocidad del viento y retraso medio de salida

by_wind_speed <- group_by(flights_weather, wind_speed)

delay_wind_speed <- summarise(by_wind_speed, mean_delay = mean(mean_delay, na.rm = TRUE),
                         count = sum(count))

delay_wind_speed %>% 
  ggplot(aes(x = wind_speed, y = mean_delay)) +
  geom_point(size = 2, color = "blue", alpha = 0.8) +
  geom_smooth(method = "lm") +
  labs(x = "velocidad media del viento (mph)",y = "Retraso de salida media (minutos)") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))
## `geom_smooth()` using formula = 'y ~ x'

5 Conclusiones

Después de analizar el modelo de regresión lineal, podemos observar que el 97.58% de la variación en la variable dependiente se explica por la variable independiente. Se han examinado las siguientes variables con significancia en los rangos (0, 0.001) y (0, 0.001):

  • week_day
  • temp
  • dewp
  • humid
  • wind_dir
  • wind_speed
  • pressure
  • visib

Se seleccionaron estas variables porque tienen una relación directa y lógica con el retraso de los vuelos, capturando el impacto del día de la semana, las condiciones meteorológicas y la visibilidad en el desempeño de los aviones y el tráfico aéreo. Además, estas variables son estadísticamente significativas al nivel de confianza del 95%, lo que indica un efecto real y no aleatorio.

Por otro lado, se descartaron las otras variables marcadas con “***” porque tienen una relación más indirecta o compleja con el retraso de los vuelos, dependiendo de factores no incluidos en el análisis, como el tipo de avión, el destino, la hora o la fecha. Agregar estas variables podría causar problemas al modelo, lo que afectaría su calidad y precisión.

Al analizar las variables individualmente:

  • week_day: Los retrasos son más altos durante los días laborables y disminuyen ligeramente durante el fin de semana, siendo el sábado el día con menos retraso. Esto podría ser debido a menos tráfico aéreo o demanda de vuelos los fines de semana.

  • temp: Existe una relación positiva entre la temperatura media y el retraso de salida medio de los vuelos. Sin embargo, la relación no es muy fuerte.

  • dewp: A mayor punto de rocío, mayor retraso, sugiriendo que la humedad puede afectar la visibilidad y la formación de hielo en las alas de los aviones.

  • humid: No hay una relación clara entre estas variables.

  • wind_speed: A mayor velocidad del viento, mayor retraso, posiblemente debido a sus efectos en la velocidad, dirección y estabilidad de los aviones.

  • pressure: A mayor presión, menor retraso, lo que puede estar relacionado con la estabilidad atmosférica y la probabilidad de precipitaciones.

  • visib: A menor visibilidad, mayor retraso, lo que sugiere su importancia para la seguridad y eficiencia de los vuelos.

Basándonos en los datos presentados en las gráficas anteriores, podemos observar que hay dos variables que destacan claramente por su mayor variabilidad en relación con las demás. Esta mayor variabilidad sugiere que estas dos variables ejercen una influencia significativa en la capacidad de los vuelos para salir puntualmente o experimentar retrasos. Estas dos variables son la visibilidad y la velocidad del viento.

La visibilidad juega un papel crucial en la aviación, ya que determina la capacidad de los pilotos para visualizar y navegar la ruta del vuelo. Aunque hoy en día contamos con tecnologías avanzadas de GPS y rastreo, la visibilidad sigue siendo un factor fundamental para garantizar la seguridad de los vuelos. Una visibilidad reducida puede dificultar la capacidad de los pilotos para tomar decisiones rápidas y precisas, especialmente durante despegues y aterrizajes, donde la visibilidad directa es fundamental.

Por otro lado, la velocidad del viento también desempeña un papel significativo en la operación de vuelos. Las ráfagas de viento pueden afectar la estabilidad de la aeronave y provocar turbulencias durante el vuelo, lo que puede resultar en retrasos y molestias para los pasajeros. Además, las fuertes corrientes de viento pueden dificultar las maniobras de despegue y aterrizaje, lo que requiere una mayor atención por parte de los pilotos y puede provocar demoras en el tráfico aéreo.

Para abordar estos desafíos y reducir la cantidad de retrasos en los vuelos, existen varias estrategias que pueden implementarse. Una opción es ajustar los horarios de vuelo para evitar condiciones meteorológicas adversas siempre que sea posible. Esto puede implicar reprogramar vuelos para momentos del día con condiciones climáticas más favorables o desviar rutas para evitar áreas con pronósticos meteorológicos desfavorables.

Además, la mejora continua de la tecnología aeronáutica es fundamental para mitigar los impactos negativos de la visibilidad reducida y la velocidad del viento en los vuelos. Las innovaciones en sistemas de navegación y sensores meteorológicos pueden proporcionar a los pilotos información más precisa y oportuna sobre las condiciones ambientales, lo que les permite tomar decisiones informadas y mejorar la seguridad operativa de los vuelos.

LS0tCnRpdGxlOiAiPHNwYW4gc3R5bGU9J2NvbG9yOiBicm93bjsnPlNpdHVhY2nDs24gcHJvYmxlbWEgRXF1aXBvIDc8L3NwYW4+IgphdXRob3I6ICJQYWJsbyBTYW5jaG8iCmRhdGU6ICIyMDI0LTAzLTA0IgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZSAKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgdGhlbWU6IGpvdXJuYWwKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQplZGl0b3JfczogCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGNvbnNvbGUKZWRpdG9yX29wdGlvbnM6IAogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlCi0tLQoKIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsYWNrOyI+Q29udGV4dG88L3NwYW4+ICAKCkVsIHBhcXVldGUgKipueWNmbGlnaHRzMTMqKiBjb250aWVuZSBpbmZvcm1hY2nDs24gc29icmUgdG9kb3MgbG9zIHZ1ZWxvcyBxdWUgcGFydGllcm9uIGRlc2RlIE51ZXZhIFlvcmsgKEpGSywgTEdBLCBFV1IpIGEgZGVzdGlub3MgZW4gbG9zIEVzdGFkb3MgVW5pZG9zIGVuIDIwMTMuRnVlcm9uIDMzNiw3NzYgdnVlbG8gZW4gdG90YWwuIFBhcmEgYXl1ZGFyIGEgY29tcHJlbmRlciBsYXMgY2F1c2FzIGRlIGxvcyByZXRyYXNvcyB0YW1iacOpbiBpbmNsdXllIG90cm8gY29uanVudG8gZGUgZGF0b3Mgw7p0aWxlcy4gIAoKRXN0ZSBwYXF1ZXRlIGluY2x1eWUgbGFzIHNpZ3VpZW50ZXMgdGFibGFzOiAgCgorIGZsaWdodHMgPSB0b2RvcyBsb3MgdnVlbG9zIHF1ZSBzYWxpZXJvbiBkZSBOdWV2YSBZb3JrIGVuIDIwMTMuICAKKyB3ZWF0aGVyID0gZGF0b3MgbWV0ZW9yb2zDs2dpY29zIHBvciBob3JhIGRlIGNhZGEgYWVyb3B1ZXJ0by4gIAorIHBsYW5lcyA9IGluZm9ybWFjacOzbiBkZSBjb25zdHJ1Y2Npw7NuIGRlIGNhZGEgYXZpw7NuLiAgCisgYWlycG9ydHMgPSBub21icmVzIHkgdWJpY2FjaW9uZXMgZGUgYWVyb3B1ZXJ0b3MuICAKKyBhaXJsaW5lcyA9IHJlbGFjaW9uIGVudHJlIG5vbWJyZXMgeSBjw7NkaWdvcyBkZSBsYXMgYWVyb2xpbmVhcyAgCgpGdWVudGU6ICAKCltPcmlnZW4gZGUgbG9zIGRhdG9zXShodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvbnljZmxpZ2h0czEzL255Y2ZsaWdodHMxMy5wZGYpCgojIDxzcGFuIHN0eWxlPSJjb2xvcjogYmxhY2s7Ij5DYXJnYXIgbGlicmVyaWFzPC9zcGFuPgoKYGBge3J9CmxpYnJhcnkobnljZmxpZ2h0czEzKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShkcGx5cikKYGBgCgojIDxzcGFuIHN0eWxlPSJjb2xvcjogYmxhY2s7Ij5HdWFyZGFyIGJhc2VzIGRlIGRhdG9zPC9zcGFuPgoKYGBge3IgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPUZBTFNFfQpmbGlnaHRzIDwtIGZsaWdodHMKd2VhdGhlciA8LSB3ZWF0aGVyCnBsYW5lcyA8LSBwbGFuZXMKYWlycG9ydHMgPC0gYWlycG9ydHMKYWlybGluZXMgPC0gYWlybGluZXMKCmJkZ3JhbmRlIDwtIG1lcmdlKGZsaWdodHMsIGFpcmxpbmVzLCBieT0iY2FycmllciIpCmJkZ3JhbmRlMiA8LSBtZXJnZShiZGdyYW5kZSwgcGxhbmVzLCBieT0idGFpbG51bSIpCmJkZ3JhbmRlMiRkYXRlIDwtIGFzLkRhdGUocGFzdGUoYmRncmFuZGUyJHllYXIueCxiZGdyYW5kZTIkbW9udGgsIGJkZ3JhbmRlMiRkYXksIHNlcCA9ICItIikpCmJkZ3JhbmRlMiR3ZWVrX2RheSA8LSB3ZWVrZGF5cyhiZGdyYW5kZTIkZGF0ZSkgCmRmX2NvbWJpbmFkbyA8LSBiZGdyYW5kZTIgJT4lCiAgbGVmdF9qb2luKHdlYXRoZXIsIGJ5ID0gYygib3JpZ2luIiA9ICJvcmlnaW4iLCAieWVhci54IiA9ICJ5ZWFyIiwgIm1vbnRoIiA9ICJtb250aCIsICJkYXkiID0gImRheSIpKQpkZl9jb21iaW5hZG8gPC0gZGZfY29tYmluYWRvICU+JQogIHNlbGVjdCgtd2luZF9ndXN0LCAtbWFudWZhY3R1cmVyLCAtZW5naW5lcywgLXNlYXRzLCAtYXJyX3RpbWUsIC1zY2hlZF9hcnJfdGltZSkKZGZfY29tYmluYWRvIDwtIGFzLmRhdGEuZnJhbWUoZGZfY29tYmluYWRvKQpgYGAKCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibGFjazsiPkF2YW5jZSAxPC9zcGFuPiAKCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogYnJvd247Ij5Nb2RlbG8gZGUgcmVncmVzacOzbiBsaW5lYWw8L3NwYW4+IAoKYGBge3IgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPUZBTFNFfQpyZWdyZXNpb24gPC0gbG0oZGVwX2RlbGF5IH4gdGFpbG51bSArIGNhcnJpZXIgKyB5ZWFyLnggKyBtb250aCArIGRheSArIGRlcF90aW1lICsgZGVwX2RlbGF5ICsgYXJyX2RlbGF5ICsgZmxpZ2h0ICsgb3JpZ2luICsgZGVzdCArIGFpcl90aW1lICsgZGlzdGFuY2UgKyBob3VyLnggKyBtaW51dGUgKyB0aW1lX2hvdXIueCArIG5hbWUgKyB5ZWFyLnkgKyB0eXBlICsgbW9kZWwgKyBzcGVlZCArIGVuZ2luZSArIGRhdGUgKyB3ZWVrX2RheSArIGhvdXIueSArIHRlbXAgKyBkZXdwICsgaHVtaWQgKyB3aW5kX2RpciArIHdpbmRfc3BlZWQgKyBwcmVjaXAgKyBwcmVzc3VyZSArIHZpc2liICsgdGltZV9ob3VyLnksIGRhdGE9ZGZfY29tYmluYWRvKQpzdW1tYXJ5KHJlZ3Jlc2lvbikKYGBgCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJyb3duOyI+UmVsYWNpw7NuIGVudHJlIGTDrWFzIGRlIGxhIHNlbWFuYSB5IHJldHJhc28gbWVkaW8gZGUgc2FsaWRhPC9zcGFuPgoKYGBge3IgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPUZBTFNFfQpmbGlnaHRzX2RlbGF5ZWQgPC0gZmlsdGVyKGZsaWdodHMsIGRlcF9kZWxheSA+IDApCgpieV9vcmlnaW5faG91ciA8LSBncm91cF9ieShmbGlnaHRzX2RlbGF5ZWQsIG9yaWdpbiwgdGltZV9ob3VyKQoKZGVsYXlfY291bnQgPC0gc3VtbWFyaXNlKGJ5X29yaWdpbl9ob3VyLCBtZWFuX2RlbGF5ID0gbWVhbihkZXBfZGVsYXksIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCA9IG4oKSkKCmZsaWdodHNfd2VhdGhlciA8LSBpbm5lcl9qb2luKGRlbGF5X2NvdW50LCB3ZWF0aGVyLCBieSA9IGMoIm9yaWdpbiIsICJ0aW1lX2hvdXIiKSkKCmZsaWdodHNfd2VhdGhlciRkYXRlIDwtIGFzLkRhdGUocGFzdGUoZmxpZ2h0c193ZWF0aGVyJHllYXIsZmxpZ2h0c193ZWF0aGVyJG1vbnRoLCBmbGlnaHRzX3dlYXRoZXIkZGF5LCBzZXAgPSAiLSIpKQpmbGlnaHRzX3dlYXRoZXIkd2Vla19kYXkgPC0gd2Vla2RheXMoZmxpZ2h0c193ZWF0aGVyJGRhdGUpCgpmbGlnaHRzX3dlYXRoZXIkd2Vla19kYXkgPC0gZmFjdG9yKGZsaWdodHNfd2VhdGhlciR3ZWVrX2RheSwgbGV2ZWxzID0gYygibHVuZXMiLCAibWFydGVzIiwgIm1pw6lyY29sZXMiLCAianVldmVzIiwgInZpZXJuZXMiLCAic8OhYmFkbyIsICJkb21pbmdvIikpCmBgYAoKCmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1GQUxTRX0KYnlfd2Vla19kYXkgPC0gZ3JvdXBfYnkoZmxpZ2h0c193ZWF0aGVyLCB3ZWVrX2RheSkKZGVsYXlfYnlfZGF5IDwtIHN1bW1hcmlzZShieV93ZWVrX2RheSwgbWVhbl9kZWxheSA9IG1lYW4obWVhbl9kZWxheSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCA9IHN1bShjb3VudCkpCgpkZWxheV9ieV9kYXkgJT4lIAogIGdncGxvdChhZXMoeCA9IHdlZWtfZGF5LCB5ID0gbWVhbl9kZWxheSwgc2l6ZSA9IGNvdW50KSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsID0gImJsdWUiKSArCiAgbGFicyh4ID0gIkTDrWEgZGUgbGEgc2VtYW5hIiwgeSA9ICJSZXRyYXNvIHByb21lZGlvIChtaW51dG9zKSIsIAogICAgICAgdGl0bGUgPSAiUmV0cmFzbyBwcm9tZWRpbyBwb3IgZMOtYSBkZSBsYSBzZW1hbmEiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKCmBgYAoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBicm93bjsiPlJlbGFjacOzbiBlbnRyZSB0ZW1wZXJhdHVyYSB5IHJldHJhc28gbWVkaW8gZGUgc2FsaWRhPC9zcGFuPgoKYGBge3IgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPUZBTFNFfQpieV90ZW1wIDwtIGdyb3VwX2J5KGZsaWdodHNfd2VhdGhlciwgdGVtcCkKCmRlbGF5X3RlbXAgPC0gc3VtbWFyaXNlKGJ5X3RlbXAsIG1lYW5fZGVsYXkgPSBtZWFuKG1lYW5fZGVsYXksIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gc3VtKGNvdW50KSkKCmRlbGF5X3RlbXAgJT4lIAogIGdncGxvdChhZXMoeCA9IHRlbXAsIHkgPSBtZWFuX2RlbGF5KSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDIsIGNvbG9yID0gImJsdWUiLCBhbHBoYSA9IDAuOCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsKICBsYWJzKHggPSAiVGVtcGVyYXR1cmEgbWVkaWEgKEZhaHJlbmhlaXQpIiwgeSA9ICJSZXRyYXNvIGRlIHNhbGlkYSBtZWRpbyAobWludXRvcykiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKYGBgCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJyb3duOyI+UmVsYWNpw7NuIGVudHJlIGVsIHB1bnRvIGRlIHJvY8OtbyB5IHJldHJhc28gbWVkaW8gZGUgc2FsaWRhPC9zcGFuPgoKYGBge3IgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPUZBTFNFfQpieV9kZXdwb2ludCA8LSBncm91cF9ieShmbGlnaHRzX3dlYXRoZXIsIGRld3ApCgpmaWx0ZXJlZF9kZXdwb2ludCA8LSBmbGlnaHRzX3dlYXRoZXIgJT4lCiAgZmlsdGVyKCFpcy5uYShkZXdwKSkgJT4lCiAgZmlsdGVyKGRld3AgPj0gcXVhbnRpbGUoZmxpZ2h0c193ZWF0aGVyJGRld3AsIDAuMjUsIG5hLnJtID0gVFJVRSkgJiBkZXdwIDw9IHF1YW50aWxlKGZsaWdodHNfd2VhdGhlciRkZXdwLCAwLjc1LCBuYS5ybSA9IFRSVUUpKQoKZGVsYXlfZGV3cG9pbnQgPC0gZmlsdGVyZWRfZGV3cG9pbnQgJT4lCiAgZ3JvdXBfYnkoZGV3cCkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fZGVsYXkgPSBtZWFuKG1lYW5fZGVsYXksIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIGNvdW50ID0gc3VtKGNvdW50KSkKCmRlbGF5X2Rld3BvaW50ICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBkZXdwLCB5ID0gbWVhbl9kZWxheSkpICsKICBnZW9tX3BvaW50KHNpemUgPSAyLCBjb2xvciA9ICJibHVlIiwgYWxwaGEgPSAwLjgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArCiAgbGFicyh4ID0gIlB1bnRvIGRlIHJvY8OtbyBtZWRpYSAoRmFyZW5oZWl0KSIseSA9ICJSZXRyYXNvIGRlIHNhbGlkYSBtZWRpYSAobWludXRvcykiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKYGBgCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJyb3duOyI+UmVsYWNpw7NuIGVudHJlIGh1bWVkYWQgeSByZXRyYXNvIG1lZGlvIGRlIHNhbGlkYTwvc3Bhbj4KCgpgYGB7ciBtZXNzYWdlPVRSVUUsIHdhcm5pbmc9RkFMU0V9CmJ5X2h1bWlkIDwtIGdyb3VwX2J5KGZsaWdodHNfd2VhdGhlciwgaHVtaWQpCgpmaWx0ZXJlZF9odW1pZCA8LSBmbGlnaHRzX3dlYXRoZXIgJT4lCiAgZmlsdGVyKCFpcy5uYShodW1pZCkpICU+JQogIGZpbHRlcihodW1pZCA+PSBxdWFudGlsZShmbGlnaHRzX3dlYXRoZXIkaHVtaWQsIDAuMjUsIG5hLnJtID0gVFJVRSkgJiBodW1pZCA8PSBxdWFudGlsZShmbGlnaHRzX3dlYXRoZXIkaHVtaWQsIDAuNzUsIG5hLnJtID0gVFJVRSkpCgpkZWxheV9odW1pZCA8LSBmaWx0ZXJlZF9odW1pZCAlPiUKICBncm91cF9ieShodW1pZCkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fZGVsYXkgPSBtZWFuKG1lYW5fZGVsYXksIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIGNvdW50ID0gc3VtKGNvdW50KSkKZGVsYXlfaHVtaWQgJT4lIAogIGdncGxvdChhZXMoeCA9IGh1bWlkLCB5ID0gbWVhbl9kZWxheSkpICsKICBnZW9tX3BvaW50KHNpemUgPSAyLCBjb2xvciA9ICJibHVlIiwgYWxwaGEgPSAwLjgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArCiAgbGFicyh4ID0gIkh1bWVkYWQgbWVkaWEiLHkgPSAiUmV0cmFzbyBkZSBzYWxpZGEgbWVkaWEgKG1pbnV0b3MpIikgKwogIHRoZW1lX21pbmltYWwoKSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKCmBgYAoKCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogYnJvd247Ij5SZWxhY2nDs24gZW50cmUgcHJlc2nDs24geSByZXRyYXNvIG1lZGlvIGRlIHNhbGlkYTwvc3Bhbj4KCmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1GQUxTRX0KYnlfcHJlc3N1cmUgPC0gZ3JvdXBfYnkoZmxpZ2h0c193ZWF0aGVyLCBwcmVzc3VyZSkKCmZpbHRlcmVkX3ByZXNzdXJlIDwtIGZsaWdodHNfd2VhdGhlciAlPiUKICBmaWx0ZXIoIWlzLm5hKHByZXNzdXJlKSkgJT4lCiAgZmlsdGVyKHByZXNzdXJlID49IHF1YW50aWxlKGZsaWdodHNfd2VhdGhlciRwcmVzc3VyZSwgMC4yNSwgbmEucm0gPSBUUlVFKSAmIHByZXNzdXJlIDw9IHF1YW50aWxlKGZsaWdodHNfd2VhdGhlciRwcmVzc3VyZSwgMC43NSwgbmEucm0gPSBUUlVFKSkKCmRlbGF5X3ByZXNzdXJlIDwtIGZpbHRlcmVkX2Rld3BvaW50ICU+JQogIGdyb3VwX2J5KHByZXNzdXJlKSAlPiUKICBzdW1tYXJpc2UobWVhbl9kZWxheSA9IG1lYW4obWVhbl9kZWxheSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgY291bnQgPSBzdW0oY291bnQpKQoKZGVsYXlfcHJlc3N1cmUgJT4lIAogIGdncGxvdChhZXMoeCA9IHByZXNzdXJlLCB5ID0gbWVhbl9kZWxheSkpICsKICBnZW9tX3BvaW50KHNpemUgPSAyLCBjb2xvciA9ICJibHVlIiwgYWxwaGEgPSAwLjgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArCiAgbGFicyh4ID0gIlByZXNpw7NuIG1lZGlhIChtaWxpYmFyZXMpIix5ID0gIlJldHJhc28gZGUgc2FsaWRhIG1lZGlhIChtaW51dG9zKSIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQoKYGBgCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJyb3duOyI+UmVsYWNpw7NuIGVudHJlIHZpc2liaWxpZGFkIHkgcmV0cmFzbyBtZWRpbyBkZSBzYWxpZGE8L3NwYW4+ICAKCmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1GQUxTRX0KYnlfdmlzaWIgPC0gZ3JvdXBfYnkoZmxpZ2h0c193ZWF0aGVyLCB2aXNpYikKCmRlbGF5X3Zpc2liIDwtIHN1bW1hcmlzZShieV92aXNpYiwgbWVhbl9kZWxheSA9IG1lYW4obWVhbl9kZWxheSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gc3VtKGNvdW50KSkKCmRlbGF5X3Zpc2liICU+JSAKICBnZ3Bsb3QoYWVzKHggPSB2aXNpYiwgeSA9IG1lYW5fZGVsYXkpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMiwgY29sb3IgPSAiYmx1ZSIsIGFscGhhID0gMC44KSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikgKwogIGxhYnMoeCA9ICJWaXNpYmlsaWRhZCBtZWRpYSAobWlsbGFzKSIsIHkgPSAiUmV0cmFzbyBkZSBzYWxpZGEgbWVkaWEgKG1pbnV0b3MpIikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCgpgYGAKCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJyb3duOyI+UmVsYWNpw7NuIGVudHJlIHZlbG9jaWRhZCBkZWwgdmllbnRvIHkgcmV0cmFzbyBtZWRpbyBkZSBzYWxpZGE8L3NwYW4+ICAKCmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1GQUxTRX0KYnlfd2luZF9zcGVlZCA8LSBncm91cF9ieShmbGlnaHRzX3dlYXRoZXIsIHdpbmRfc3BlZWQpCgpkZWxheV93aW5kX3NwZWVkIDwtIHN1bW1hcmlzZShieV93aW5kX3NwZWVkLCBtZWFuX2RlbGF5ID0gbWVhbihtZWFuX2RlbGF5LCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgPSBzdW0oY291bnQpKQoKZGVsYXlfd2luZF9zcGVlZCAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gd2luZF9zcGVlZCwgeSA9IG1lYW5fZGVsYXkpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMiwgY29sb3IgPSAiYmx1ZSIsIGFscGhhID0gMC44KSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikgKwogIGxhYnMoeCA9ICJ2ZWxvY2lkYWQgbWVkaWEgZGVsIHZpZW50byAobXBoKSIseSA9ICJSZXRyYXNvIGRlIHNhbGlkYSBtZWRpYSAobWludXRvcykiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKCmBgYAoKIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsYWNrOyI+Q29uY2x1c2lvbmVzPC9zcGFuPiAgCiAgCiAgCkRlc3B1w6lzIGRlIGFuYWxpemFyIGVsIG1vZGVsbyBkZSByZWdyZXNpw7NuIGxpbmVhbCwgcG9kZW1vcyBvYnNlcnZhciBxdWUgZWwgOTcuNTglIGRlIGxhIHZhcmlhY2nDs24gZW4gbGEgdmFyaWFibGUgZGVwZW5kaWVudGUgc2UgZXhwbGljYSBwb3IgbGEgdmFyaWFibGUgaW5kZXBlbmRpZW50ZS4gU2UgaGFuIGV4YW1pbmFkbyBsYXMgc2lndWllbnRlcyB2YXJpYWJsZXMgY29uIHNpZ25pZmljYW5jaWEgZW4gbG9zIHJhbmdvcyAoMCwgMC4wMDEpIHkgKDAsIDAuMDAxKToKCisgd2Vla19kYXkKKyB0ZW1wCisgZGV3cAorIGh1bWlkCisgd2luZF9kaXIKKyB3aW5kX3NwZWVkCisgcHJlc3N1cmUKKyB2aXNpYgoKU2Ugc2VsZWNjaW9uYXJvbiBlc3RhcyB2YXJpYWJsZXMgcG9ycXVlIHRpZW5lbiB1bmEgcmVsYWNpw7NuIGRpcmVjdGEgeSBsw7NnaWNhIGNvbiBlbCByZXRyYXNvIGRlIGxvcyB2dWVsb3MsIGNhcHR1cmFuZG8gZWwgaW1wYWN0byBkZWwgZMOtYSBkZSBsYSBzZW1hbmEsIGxhcyBjb25kaWNpb25lcyBtZXRlb3JvbMOzZ2ljYXMgeSBsYSB2aXNpYmlsaWRhZCBlbiBlbCBkZXNlbXBlw7FvIGRlIGxvcyBhdmlvbmVzIHkgZWwgdHLDoWZpY28gYcOpcmVvLiBBZGVtw6FzLCBlc3RhcyB2YXJpYWJsZXMgc29uIGVzdGFkw61zdGljYW1lbnRlIHNpZ25pZmljYXRpdmFzIGFsIG5pdmVsIGRlIGNvbmZpYW56YSBkZWwgOTUlLCBsbyBxdWUgaW5kaWNhIHVuIGVmZWN0byByZWFsIHkgbm8gYWxlYXRvcmlvLiAgCgpQb3Igb3RybyBsYWRvLCBzZSBkZXNjYXJ0YXJvbiBsYXMgb3RyYXMgdmFyaWFibGVzIG1hcmNhZGFzIGNvbiAiKioqIiBwb3JxdWUgdGllbmVuIHVuYSByZWxhY2nDs24gbcOhcyBpbmRpcmVjdGEgbyBjb21wbGVqYSBjb24gZWwgcmV0cmFzbyBkZSBsb3MgdnVlbG9zLCBkZXBlbmRpZW5kbyBkZSBmYWN0b3JlcyBubyBpbmNsdWlkb3MgZW4gZWwgYW7DoWxpc2lzLCBjb21vIGVsIHRpcG8gZGUgYXZpw7NuLCBlbCBkZXN0aW5vLCBsYSBob3JhIG8gbGEgZmVjaGEuIEFncmVnYXIgZXN0YXMgdmFyaWFibGVzIHBvZHLDrWEgY2F1c2FyIHByb2JsZW1hcyBhbCBtb2RlbG8sIGxvIHF1ZSBhZmVjdGFyw61hIHN1IGNhbGlkYWQgeSBwcmVjaXNpw7NuLiAgCgpBbCBhbmFsaXphciBsYXMgdmFyaWFibGVzIGluZGl2aWR1YWxtZW50ZTogIAoKKyB3ZWVrX2RheTogTG9zIHJldHJhc29zIHNvbiBtw6FzIGFsdG9zIGR1cmFudGUgbG9zIGTDrWFzIGxhYm9yYWJsZXMgeSBkaXNtaW51eWVuIGxpZ2VyYW1lbnRlIGR1cmFudGUgZWwgZmluIGRlIHNlbWFuYSwgc2llbmRvIGVsIHPDoWJhZG8gZWwgZMOtYSBjb24gbWVub3MgcmV0cmFzby4gRXN0byBwb2Ryw61hIHNlciBkZWJpZG8gYSBtZW5vcyB0csOhZmljbyBhw6lyZW8gbyBkZW1hbmRhIGRlIHZ1ZWxvcyBsb3MgZmluZXMgZGUgc2VtYW5hLiAgCgorIHRlbXA6IEV4aXN0ZSB1bmEgcmVsYWNpw7NuIHBvc2l0aXZhIGVudHJlIGxhIHRlbXBlcmF0dXJhIG1lZGlhIHkgZWwgcmV0cmFzbyBkZSBzYWxpZGEgbWVkaW8gZGUgbG9zIHZ1ZWxvcy4gU2luIGVtYmFyZ28sIGxhIHJlbGFjacOzbiBubyBlcyBtdXkgZnVlcnRlLiAgCgorIGRld3A6IEEgbWF5b3IgcHVudG8gZGUgcm9jw61vLCBtYXlvciByZXRyYXNvLCBzdWdpcmllbmRvIHF1ZSBsYSBodW1lZGFkIHB1ZWRlIGFmZWN0YXIgbGEgdmlzaWJpbGlkYWQgeSBsYSBmb3JtYWNpw7NuIGRlIGhpZWxvIGVuIGxhcyBhbGFzIGRlIGxvcyBhdmlvbmVzLiAgCgorIGh1bWlkOiBObyBoYXkgdW5hIHJlbGFjacOzbiBjbGFyYSBlbnRyZSBlc3RhcyB2YXJpYWJsZXMuICAKCisgd2luZF9zcGVlZDogQSBtYXlvciB2ZWxvY2lkYWQgZGVsIHZpZW50bywgbWF5b3IgcmV0cmFzbywgcG9zaWJsZW1lbnRlIGRlYmlkbyBhIHN1cyBlZmVjdG9zIGVuIGxhIHZlbG9jaWRhZCwgZGlyZWNjacOzbiB5IGVzdGFiaWxpZGFkIGRlIGxvcyBhdmlvbmVzLiAgCgorIHByZXNzdXJlOiBBIG1heW9yIHByZXNpw7NuLCBtZW5vciByZXRyYXNvLCBsbyBxdWUgcHVlZGUgZXN0YXIgcmVsYWNpb25hZG8gY29uIGxhIGVzdGFiaWxpZGFkIGF0bW9zZsOpcmljYSB5IGxhIHByb2JhYmlsaWRhZCBkZSBwcmVjaXBpdGFjaW9uZXMuICAKCisgdmlzaWI6IEEgbWVub3IgdmlzaWJpbGlkYWQsIG1heW9yIHJldHJhc28sIGxvIHF1ZSBzdWdpZXJlIHN1IGltcG9ydGFuY2lhIHBhcmEgbGEgc2VndXJpZGFkIHkgZWZpY2llbmNpYSBkZSBsb3MgdnVlbG9zLiAgCgpCYXPDoW5kb25vcyBlbiBsb3MgZGF0b3MgcHJlc2VudGFkb3MgZW4gbGFzIGdyw6FmaWNhcyBhbnRlcmlvcmVzLCBwb2RlbW9zIG9ic2VydmFyIHF1ZSBoYXkgZG9zIHZhcmlhYmxlcyBxdWUgZGVzdGFjYW4gY2xhcmFtZW50ZSBwb3Igc3UgbWF5b3IgdmFyaWFiaWxpZGFkIGVuIHJlbGFjacOzbiBjb24gbGFzIGRlbcOhcy4gRXN0YSBtYXlvciB2YXJpYWJpbGlkYWQgc3VnaWVyZSBxdWUgZXN0YXMgZG9zIHZhcmlhYmxlcyBlamVyY2VuIHVuYSBpbmZsdWVuY2lhIHNpZ25pZmljYXRpdmEgZW4gbGEgY2FwYWNpZGFkIGRlIGxvcyB2dWVsb3MgcGFyYSBzYWxpciBwdW50dWFsbWVudGUgbyBleHBlcmltZW50YXIgcmV0cmFzb3MuIEVzdGFzIGRvcyB2YXJpYWJsZXMgc29uIGxhIHZpc2liaWxpZGFkIHkgbGEgdmVsb2NpZGFkIGRlbCB2aWVudG8uCgpMYSB2aXNpYmlsaWRhZCBqdWVnYSB1biBwYXBlbCBjcnVjaWFsIGVuIGxhIGF2aWFjacOzbiwgeWEgcXVlIGRldGVybWluYSBsYSBjYXBhY2lkYWQgZGUgbG9zIHBpbG90b3MgcGFyYSB2aXN1YWxpemFyIHkgbmF2ZWdhciBsYSBydXRhIGRlbCB2dWVsby4gQXVucXVlIGhveSBlbiBkw61hIGNvbnRhbW9zIGNvbiB0ZWNub2xvZ8OtYXMgYXZhbnphZGFzIGRlIEdQUyB5IHJhc3RyZW8sIGxhIHZpc2liaWxpZGFkIHNpZ3VlIHNpZW5kbyB1biBmYWN0b3IgZnVuZGFtZW50YWwgcGFyYSBnYXJhbnRpemFyIGxhIHNlZ3VyaWRhZCBkZSBsb3MgdnVlbG9zLiBVbmEgdmlzaWJpbGlkYWQgcmVkdWNpZGEgcHVlZGUgZGlmaWN1bHRhciBsYSBjYXBhY2lkYWQgZGUgbG9zIHBpbG90b3MgcGFyYSB0b21hciBkZWNpc2lvbmVzIHLDoXBpZGFzIHkgcHJlY2lzYXMsIGVzcGVjaWFsbWVudGUgZHVyYW50ZSBkZXNwZWd1ZXMgeSBhdGVycml6YWplcywgZG9uZGUgbGEgdmlzaWJpbGlkYWQgZGlyZWN0YSBlcyBmdW5kYW1lbnRhbC4KClBvciBvdHJvIGxhZG8sIGxhIHZlbG9jaWRhZCBkZWwgdmllbnRvIHRhbWJpw6luIGRlc2VtcGXDsWEgdW4gcGFwZWwgc2lnbmlmaWNhdGl2byBlbiBsYSBvcGVyYWNpw7NuIGRlIHZ1ZWxvcy4gTGFzIHLDoWZhZ2FzIGRlIHZpZW50byBwdWVkZW4gYWZlY3RhciBsYSBlc3RhYmlsaWRhZCBkZSBsYSBhZXJvbmF2ZSB5IHByb3ZvY2FyIHR1cmJ1bGVuY2lhcyBkdXJhbnRlIGVsIHZ1ZWxvLCBsbyBxdWUgcHVlZGUgcmVzdWx0YXIgZW4gcmV0cmFzb3MgeSBtb2xlc3RpYXMgcGFyYSBsb3MgcGFzYWplcm9zLiBBZGVtw6FzLCBsYXMgZnVlcnRlcyBjb3JyaWVudGVzIGRlIHZpZW50byBwdWVkZW4gZGlmaWN1bHRhciBsYXMgbWFuaW9icmFzIGRlIGRlc3BlZ3VlIHkgYXRlcnJpemFqZSwgbG8gcXVlIHJlcXVpZXJlIHVuYSBtYXlvciBhdGVuY2nDs24gcG9yIHBhcnRlIGRlIGxvcyBwaWxvdG9zIHkgcHVlZGUgcHJvdm9jYXIgZGVtb3JhcyBlbiBlbCB0csOhZmljbyBhw6lyZW8uCgpQYXJhIGFib3JkYXIgZXN0b3MgZGVzYWbDrW9zIHkgcmVkdWNpciBsYSBjYW50aWRhZCBkZSByZXRyYXNvcyBlbiBsb3MgdnVlbG9zLCBleGlzdGVuIHZhcmlhcyBlc3RyYXRlZ2lhcyBxdWUgcHVlZGVuIGltcGxlbWVudGFyc2UuIFVuYSBvcGNpw7NuIGVzIGFqdXN0YXIgbG9zIGhvcmFyaW9zIGRlIHZ1ZWxvIHBhcmEgZXZpdGFyIGNvbmRpY2lvbmVzIG1ldGVvcm9sw7NnaWNhcyBhZHZlcnNhcyBzaWVtcHJlIHF1ZSBzZWEgcG9zaWJsZS4gRXN0byBwdWVkZSBpbXBsaWNhciByZXByb2dyYW1hciB2dWVsb3MgcGFyYSBtb21lbnRvcyBkZWwgZMOtYSBjb24gY29uZGljaW9uZXMgY2xpbcOhdGljYXMgbcOhcyBmYXZvcmFibGVzIG8gZGVzdmlhciBydXRhcyBwYXJhIGV2aXRhciDDoXJlYXMgY29uIHByb27Ds3N0aWNvcyBtZXRlb3JvbMOzZ2ljb3MgZGVzZmF2b3JhYmxlcy4KCkFkZW3DoXMsIGxhIG1lam9yYSBjb250aW51YSBkZSBsYSB0ZWNub2xvZ8OtYSBhZXJvbsOhdXRpY2EgZXMgZnVuZGFtZW50YWwgcGFyYSBtaXRpZ2FyIGxvcyBpbXBhY3RvcyBuZWdhdGl2b3MgZGUgbGEgdmlzaWJpbGlkYWQgcmVkdWNpZGEgeSBsYSB2ZWxvY2lkYWQgZGVsIHZpZW50byBlbiBsb3MgdnVlbG9zLiBMYXMgaW5ub3ZhY2lvbmVzIGVuIHNpc3RlbWFzIGRlIG5hdmVnYWNpw7NuIHkgc2Vuc29yZXMgbWV0ZW9yb2zDs2dpY29zIHB1ZWRlbiBwcm9wb3JjaW9uYXIgYSBsb3MgcGlsb3RvcyBpbmZvcm1hY2nDs24gbcOhcyBwcmVjaXNhIHkgb3BvcnR1bmEgc29icmUgbGFzIGNvbmRpY2lvbmVzIGFtYmllbnRhbGVzLCBsbyBxdWUgbGVzIHBlcm1pdGUgdG9tYXIgZGVjaXNpb25lcyBpbmZvcm1hZGFzIHkgbWVqb3JhciBsYSBzZWd1cmlkYWQgb3BlcmF0aXZhIGRlIGxvcyB2dWVsb3MuCgoK