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
airports <- rename(airports, "origin"= "faa")
bdgrande <- merge(flights, airlines, by="carrier")
bdgrande2 <- left_join(bdgrande, planes, by="tailnum")
bdgrande3 <- left_join(bdgrande2, weather, by= c("origin", "time_hour"))

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

bdgrande3 <- rename(bdgrande3, "origin" = "origin", "month" = "month.x", "day" = "day.x")

bdgrande4 <- left_join(bdgrande3, airports, by= "origin")

df_combinado <- bdgrande4 %>%
  select(-wind_gust, -manufacturer, -engines, -seats, -arr_time, -sched_arr_time)

4 Avance 1

4.1 Exploración de la base de datos

4.1.1 Flights

str(flights)
## tibble [336,776 × 19] (S3: tbl_df/tbl/data.frame)
##  $ year          : int [1:336776] 2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 ...
##  $ month         : int [1:336776] 1 1 1 1 1 1 1 1 1 1 ...
##  $ day           : int [1:336776] 1 1 1 1 1 1 1 1 1 1 ...
##  $ dep_time      : int [1:336776] 517 533 542 544 554 554 555 557 557 558 ...
##  $ sched_dep_time: int [1:336776] 515 529 540 545 600 558 600 600 600 600 ...
##  $ dep_delay     : num [1:336776] 2 4 2 -1 -6 -4 -5 -3 -3 -2 ...
##  $ arr_time      : int [1:336776] 830 850 923 1004 812 740 913 709 838 753 ...
##  $ sched_arr_time: int [1:336776] 819 830 850 1022 837 728 854 723 846 745 ...
##  $ arr_delay     : num [1:336776] 11 20 33 -18 -25 12 19 -14 -8 8 ...
##  $ carrier       : chr [1:336776] "UA" "UA" "AA" "B6" ...
##  $ flight        : int [1:336776] 1545 1714 1141 725 461 1696 507 5708 79 301 ...
##  $ tailnum       : chr [1:336776] "N14228" "N24211" "N619AA" "N804JB" ...
##  $ origin        : chr [1:336776] "EWR" "LGA" "JFK" "JFK" ...
##  $ dest          : chr [1:336776] "IAH" "IAH" "MIA" "BQN" ...
##  $ air_time      : num [1:336776] 227 227 160 183 116 150 158 53 140 138 ...
##  $ distance      : num [1:336776] 1400 1416 1089 1576 762 ...
##  $ hour          : num [1:336776] 5 5 5 5 6 5 6 6 6 6 ...
##  $ minute        : num [1:336776] 15 29 40 45 0 58 0 0 0 0 ...
##  $ time_hour     : POSIXct[1:336776], format: "2013-01-01 05:00:00" "2013-01-01 05:00:00" ...
ncol(flights)
## [1] 19
nrow(flights)
## [1] 336776
dim(flights)
## [1] 336776     19
head(flights)
## # A tibble: 6 × 19
##    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
## 1  2013     1     1      517            515         2      830            819
## 2  2013     1     1      533            529         4      850            830
## 3  2013     1     1      542            540         2      923            850
## 4  2013     1     1      544            545        -1     1004           1022
## 5  2013     1     1      554            600        -6      812            837
## 6  2013     1     1      554            558        -4      740            728
## # ℹ 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
## #   tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
## #   hour <dbl>, minute <dbl>, time_hour <dttm>
tail(flights)
## # A tibble: 6 × 19
##    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
## 1  2013     9    30       NA           1842        NA       NA           2019
## 2  2013     9    30       NA           1455        NA       NA           1634
## 3  2013     9    30       NA           2200        NA       NA           2312
## 4  2013     9    30       NA           1210        NA       NA           1330
## 5  2013     9    30       NA           1159        NA       NA           1344
## 6  2013     9    30       NA            840        NA       NA           1020
## # ℹ 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
## #   tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
## #   hour <dbl>, minute <dbl>, time_hour <dttm>
summary(flights)
##       year          month             day           dep_time    sched_dep_time
##  Min.   :2013   Min.   : 1.000   Min.   : 1.00   Min.   :   1   Min.   : 106  
##  1st Qu.:2013   1st Qu.: 4.000   1st Qu.: 8.00   1st Qu.: 907   1st Qu.: 906  
##  Median :2013   Median : 7.000   Median :16.00   Median :1401   Median :1359  
##  Mean   :2013   Mean   : 6.549   Mean   :15.71   Mean   :1349   Mean   :1344  
##  3rd Qu.:2013   3rd Qu.:10.000   3rd Qu.:23.00   3rd Qu.:1744   3rd Qu.:1729  
##  Max.   :2013   Max.   :12.000   Max.   :31.00   Max.   :2400   Max.   :2359  
##                                                  NA's   :8255                 
##    dep_delay          arr_time    sched_arr_time   arr_delay       
##  Min.   : -43.00   Min.   :   1   Min.   :   1   Min.   : -86.000  
##  1st Qu.:  -5.00   1st Qu.:1104   1st Qu.:1124   1st Qu.: -17.000  
##  Median :  -2.00   Median :1535   Median :1556   Median :  -5.000  
##  Mean   :  12.64   Mean   :1502   Mean   :1536   Mean   :   6.895  
##  3rd Qu.:  11.00   3rd Qu.:1940   3rd Qu.:1945   3rd Qu.:  14.000  
##  Max.   :1301.00   Max.   :2400   Max.   :2359   Max.   :1272.000  
##  NA's   :8255      NA's   :8713                  NA's   :9430      
##    carrier              flight       tailnum             origin         
##  Length:336776      Min.   :   1   Length:336776      Length:336776     
##  Class :character   1st Qu.: 553   Class :character   Class :character  
##  Mode  :character   Median :1496   Mode  :character   Mode  :character  
##                     Mean   :1972                                        
##                     3rd Qu.:3465                                        
##                     Max.   :8500                                        
##                                                                         
##      dest              air_time        distance         hour      
##  Length:336776      Min.   : 20.0   Min.   :  17   Min.   : 1.00  
##  Class :character   1st Qu.: 82.0   1st Qu.: 502   1st Qu.: 9.00  
##  Mode  :character   Median :129.0   Median : 872   Median :13.00  
##                     Mean   :150.7   Mean   :1040   Mean   :13.18  
##                     3rd Qu.:192.0   3rd Qu.:1389   3rd Qu.:17.00  
##                     Max.   :695.0   Max.   :4983   Max.   :23.00  
##                     NA's   :9430                                  
##      minute        time_hour                     
##  Min.   : 0.00   Min.   :2013-01-01 05:00:00.00  
##  1st Qu.: 8.00   1st Qu.:2013-04-04 13:00:00.00  
##  Median :29.00   Median :2013-07-03 10:00:00.00  
##  Mean   :26.23   Mean   :2013-07-03 05:22:54.64  
##  3rd Qu.:44.00   3rd Qu.:2013-10-01 07:00:00.00  
##  Max.   :59.00   Max.   :2013-12-31 23:00:00.00  
## 

4.1.2 Weather

str(weather)
## tibble [26,115 × 15] (S3: tbl_df/tbl/data.frame)
##  $ origin    : chr [1:26115] "EWR" "EWR" "EWR" "EWR" ...
##  $ year      : int [1:26115] 2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 ...
##  $ month     : int [1:26115] 1 1 1 1 1 1 1 1 1 1 ...
##  $ day       : int [1:26115] 1 1 1 1 1 1 1 1 1 1 ...
##  $ hour      : int [1:26115] 1 2 3 4 5 6 7 8 9 10 ...
##  $ temp      : num [1:26115] 39 39 39 39.9 39 ...
##  $ dewp      : num [1:26115] 26.1 27 28 28 28 ...
##  $ humid     : num [1:26115] 59.4 61.6 64.4 62.2 64.4 ...
##  $ wind_dir  : num [1:26115] 270 250 240 250 260 240 240 250 260 260 ...
##  $ wind_speed: num [1:26115] 10.36 8.06 11.51 12.66 12.66 ...
##  $ wind_gust : num [1:26115] NA NA NA NA NA NA NA NA NA NA ...
##  $ precip    : num [1:26115] 0 0 0 0 0 0 0 0 0 0 ...
##  $ pressure  : num [1:26115] 1012 1012 1012 1012 1012 ...
##  $ visib     : num [1:26115] 10 10 10 10 10 10 10 10 10 10 ...
##  $ time_hour : POSIXct[1:26115], format: "2013-01-01 01:00:00" "2013-01-01 02:00:00" ...
ncol(weather)
## [1] 15
nrow(weather)
## [1] 26115
dim(weather)
## [1] 26115    15
head(weather)
## # A tibble: 6 × 15
##   origin  year month   day  hour  temp  dewp humid wind_dir wind_speed wind_gust
##   <chr>  <int> <int> <int> <int> <dbl> <dbl> <dbl>    <dbl>      <dbl>     <dbl>
## 1 EWR     2013     1     1     1  39.0  26.1  59.4      270      10.4         NA
## 2 EWR     2013     1     1     2  39.0  27.0  61.6      250       8.06        NA
## 3 EWR     2013     1     1     3  39.0  28.0  64.4      240      11.5         NA
## 4 EWR     2013     1     1     4  39.9  28.0  62.2      250      12.7         NA
## 5 EWR     2013     1     1     5  39.0  28.0  64.4      260      12.7         NA
## 6 EWR     2013     1     1     6  37.9  28.0  67.2      240      11.5         NA
## # ℹ 4 more variables: precip <dbl>, pressure <dbl>, visib <dbl>,
## #   time_hour <dttm>
tail(weather)
## # A tibble: 6 × 15
##   origin  year month   day  hour  temp  dewp humid wind_dir wind_speed wind_gust
##   <chr>  <int> <int> <int> <int> <dbl> <dbl> <dbl>    <dbl>      <dbl>     <dbl>
## 1 LGA     2013    12    30    13  37.0  21.9  54.0      340       17.3      20.7
## 2 LGA     2013    12    30    14  36.0  19.9  51.8      340       13.8      21.9
## 3 LGA     2013    12    30    15  34.0  17.1  49.5      330       17.3      21.9
## 4 LGA     2013    12    30    16  32    15.1  49.2      340       15.0      23.0
## 5 LGA     2013    12    30    17  30.9  12.9  46.7      320       17.3      NA  
## 6 LGA     2013    12    30    18  28.9  10.9  46.4      330       18.4      NA  
## # ℹ 4 more variables: precip <dbl>, pressure <dbl>, visib <dbl>,
## #   time_hour <dttm>
summary(weather)
##     origin               year          month             day       
##  Length:26115       Min.   :2013   Min.   : 1.000   Min.   : 1.00  
##  Class :character   1st Qu.:2013   1st Qu.: 4.000   1st Qu.: 8.00  
##  Mode  :character   Median :2013   Median : 7.000   Median :16.00  
##                     Mean   :2013   Mean   : 6.504   Mean   :15.68  
##                     3rd Qu.:2013   3rd Qu.: 9.000   3rd Qu.:23.00  
##                     Max.   :2013   Max.   :12.000   Max.   :31.00  
##                                                                    
##       hour            temp             dewp           humid       
##  Min.   : 0.00   Min.   : 10.94   Min.   :-9.94   Min.   : 12.74  
##  1st Qu.: 6.00   1st Qu.: 39.92   1st Qu.:26.06   1st Qu.: 47.05  
##  Median :11.00   Median : 55.40   Median :42.08   Median : 61.79  
##  Mean   :11.49   Mean   : 55.26   Mean   :41.44   Mean   : 62.53  
##  3rd Qu.:17.00   3rd Qu.: 69.98   3rd Qu.:57.92   3rd Qu.: 78.79  
##  Max.   :23.00   Max.   :100.04   Max.   :78.08   Max.   :100.00  
##                  NA's   :1        NA's   :1       NA's   :1       
##     wind_dir       wind_speed         wind_gust         precip        
##  Min.   :  0.0   Min.   :   0.000   Min.   :16.11   Min.   :0.000000  
##  1st Qu.:120.0   1st Qu.:   6.905   1st Qu.:20.71   1st Qu.:0.000000  
##  Median :220.0   Median :  10.357   Median :24.17   Median :0.000000  
##  Mean   :199.8   Mean   :  10.518   Mean   :25.49   Mean   :0.004469  
##  3rd Qu.:290.0   3rd Qu.:  13.809   3rd Qu.:28.77   3rd Qu.:0.000000  
##  Max.   :360.0   Max.   :1048.361   Max.   :66.75   Max.   :1.210000  
##  NA's   :460     NA's   :4          NA's   :20778                     
##     pressure          visib          time_hour                    
##  Min.   : 983.8   Min.   : 0.000   Min.   :2013-01-01 01:00:00.0  
##  1st Qu.:1012.9   1st Qu.:10.000   1st Qu.:2013-04-01 21:30:00.0  
##  Median :1017.6   Median :10.000   Median :2013-07-01 14:00:00.0  
##  Mean   :1017.9   Mean   : 9.255   Mean   :2013-07-01 18:26:37.7  
##  3rd Qu.:1023.0   3rd Qu.:10.000   3rd Qu.:2013-09-30 13:00:00.0  
##  Max.   :1042.1   Max.   :10.000   Max.   :2013-12-30 18:00:00.0  
##  NA's   :2729

4.1.3 Planes

str(planes)
## tibble [3,322 × 9] (S3: tbl_df/tbl/data.frame)
##  $ tailnum     : chr [1:3322] "N10156" "N102UW" "N103US" "N104UW" ...
##  $ year        : int [1:3322] 2004 1998 1999 1999 2002 1999 1999 1999 1999 1999 ...
##  $ type        : chr [1:3322] "Fixed wing multi engine" "Fixed wing multi engine" "Fixed wing multi engine" "Fixed wing multi engine" ...
##  $ manufacturer: chr [1:3322] "EMBRAER" "AIRBUS INDUSTRIE" "AIRBUS INDUSTRIE" "AIRBUS INDUSTRIE" ...
##  $ model       : chr [1:3322] "EMB-145XR" "A320-214" "A320-214" "A320-214" ...
##  $ engines     : int [1:3322] 2 2 2 2 2 2 2 2 2 2 ...
##  $ seats       : int [1:3322] 55 182 182 182 55 182 182 182 182 182 ...
##  $ speed       : int [1:3322] NA NA NA NA NA NA NA NA NA NA ...
##  $ engine      : chr [1:3322] "Turbo-fan" "Turbo-fan" "Turbo-fan" "Turbo-fan" ...
ncol(planes)
## [1] 9
nrow(planes)
## [1] 3322
dim(planes)
## [1] 3322    9
head(planes)
## # A tibble: 6 × 9
##   tailnum  year type               manufacturer model engines seats speed engine
##   <chr>   <int> <chr>              <chr>        <chr>   <int> <int> <int> <chr> 
## 1 N10156   2004 Fixed wing multi … EMBRAER      EMB-…       2    55    NA Turbo…
## 2 N102UW   1998 Fixed wing multi … AIRBUS INDU… A320…       2   182    NA Turbo…
## 3 N103US   1999 Fixed wing multi … AIRBUS INDU… A320…       2   182    NA Turbo…
## 4 N104UW   1999 Fixed wing multi … AIRBUS INDU… A320…       2   182    NA Turbo…
## 5 N10575   2002 Fixed wing multi … EMBRAER      EMB-…       2    55    NA Turbo…
## 6 N105UW   1999 Fixed wing multi … AIRBUS INDU… A320…       2   182    NA Turbo…
tail(planes)
## # A tibble: 6 × 9
##   tailnum  year type               manufacturer model engines seats speed engine
##   <chr>   <int> <chr>              <chr>        <chr>   <int> <int> <int> <chr> 
## 1 N996DL   1991 Fixed wing multi … MCDONNELL D… MD-88       2   142    NA Turbo…
## 2 N997AT   2002 Fixed wing multi … BOEING       717-…       2   100    NA Turbo…
## 3 N997DL   1992 Fixed wing multi … MCDONNELL D… MD-88       2   142    NA Turbo…
## 4 N998AT   2002 Fixed wing multi … BOEING       717-…       2   100    NA Turbo…
## 5 N998DL   1992 Fixed wing multi … MCDONNELL D… MD-88       2   142    NA Turbo…
## 6 N999DN   1992 Fixed wing multi … MCDONNELL D… MD-88       2   142    NA Turbo…
summary(planes)
##    tailnum               year          type           manufacturer      
##  Length:3322        Min.   :1956   Length:3322        Length:3322       
##  Class :character   1st Qu.:1997   Class :character   Class :character  
##  Mode  :character   Median :2001   Mode  :character   Mode  :character  
##                     Mean   :2000                                        
##                     3rd Qu.:2005                                        
##                     Max.   :2013                                        
##                     NA's   :70                                          
##     model              engines          seats           speed      
##  Length:3322        Min.   :1.000   Min.   :  2.0   Min.   : 90.0  
##  Class :character   1st Qu.:2.000   1st Qu.:140.0   1st Qu.:107.5  
##  Mode  :character   Median :2.000   Median :149.0   Median :162.0  
##                     Mean   :1.995   Mean   :154.3   Mean   :236.8  
##                     3rd Qu.:2.000   3rd Qu.:182.0   3rd Qu.:432.0  
##                     Max.   :4.000   Max.   :450.0   Max.   :432.0  
##                                                     NA's   :3299   
##     engine         
##  Length:3322       
##  Class :character  
##  Mode  :character  
##                    
##                    
##                    
## 

4.1.4 Airports

str(airports)
## tibble [1,458 × 8] (S3: tbl_df/tbl/data.frame)
##  $ origin: chr [1:1458] "04G" "06A" "06C" "06N" ...
##  $ name  : chr [1:1458] "Lansdowne Airport" "Moton Field Municipal Airport" "Schaumburg Regional" "Randall Airport" ...
##  $ lat   : num [1:1458] 41.1 32.5 42 41.4 31.1 ...
##  $ lon   : num [1:1458] -80.6 -85.7 -88.1 -74.4 -81.4 ...
##  $ alt   : num [1:1458] 1044 264 801 523 11 ...
##  $ tz    : num [1:1458] -5 -6 -6 -5 -5 -5 -5 -5 -5 -8 ...
##  $ dst   : chr [1:1458] "A" "A" "A" "A" ...
##  $ tzone : chr [1:1458] "America/New_York" "America/Chicago" "America/Chicago" "America/New_York" ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   id = col_double(),
##   ..   name = col_character(),
##   ..   city = col_character(),
##   ..   country = col_character(),
##   ..   faa = col_character(),
##   ..   icao = col_character(),
##   ..   lat = col_double(),
##   ..   lon = col_double(),
##   ..   alt = col_double(),
##   ..   tz = col_double(),
##   ..   dst = col_character(),
##   ..   tzone = col_character()
##   .. )
ncol(airports)
## [1] 8
nrow(airports)
## [1] 1458
dim(airports)
## [1] 1458    8
head(airports)
## # A tibble: 6 × 8
##   origin name                             lat   lon   alt    tz dst   tzone     
##   <chr>  <chr>                          <dbl> <dbl> <dbl> <dbl> <chr> <chr>     
## 1 04G    Lansdowne Airport               41.1 -80.6  1044    -5 A     America/N…
## 2 06A    Moton Field Municipal Airport   32.5 -85.7   264    -6 A     America/C…
## 3 06C    Schaumburg Regional             42.0 -88.1   801    -6 A     America/C…
## 4 06N    Randall Airport                 41.4 -74.4   523    -5 A     America/N…
## 5 09J    Jekyll Island Airport           31.1 -81.4    11    -5 A     America/N…
## 6 0A9    Elizabethton Municipal Airport  36.4 -82.2  1593    -5 A     America/N…
tail(airports)
## # A tibble: 6 × 8
##   origin name                        lat    lon   alt    tz dst   tzone         
##   <chr>  <chr>                     <dbl>  <dbl> <dbl> <dbl> <chr> <chr>         
## 1 ZTY    Boston Back Bay Station    42.3  -71.1    20    -5 A     America/New_Y…
## 2 ZUN    Black Rock                 35.1 -109.   6454    -7 A     America/Denver
## 3 ZVE    New Haven Rail Station     41.3  -72.9     7    -5 A     America/New_Y…
## 4 ZWI    Wilmington Amtrak Station  39.7  -75.6     0    -5 A     America/New_Y…
## 5 ZWU    Washington Union Station   38.9  -77.0    76    -5 A     America/New_Y…
## 6 ZYP    Penn Station               40.8  -74.0    35    -5 A     America/New_Y…
summary(airports)
##     origin              name                lat             lon         
##  Length:1458        Length:1458        Min.   :19.72   Min.   :-176.65  
##  Class :character   Class :character   1st Qu.:34.26   1st Qu.:-119.19  
##  Mode  :character   Mode  :character   Median :40.09   Median : -94.66  
##                                        Mean   :41.65   Mean   :-103.39  
##                                        3rd Qu.:45.07   3rd Qu.: -82.52  
##                                        Max.   :72.27   Max.   : 174.11  
##       alt                tz              dst               tzone          
##  Min.   : -54.00   Min.   :-10.000   Length:1458        Length:1458       
##  1st Qu.:  70.25   1st Qu.: -8.000   Class :character   Class :character  
##  Median : 473.00   Median : -6.000   Mode  :character   Mode  :character  
##  Mean   :1001.42   Mean   : -6.519                                        
##  3rd Qu.:1062.50   3rd Qu.: -5.000                                        
##  Max.   :9078.00   Max.   :  8.000

4.1.5 Airlines

str(airlines)
## tibble [16 × 2] (S3: tbl_df/tbl/data.frame)
##  $ carrier: chr [1:16] "9E" "AA" "AS" "B6" ...
##  $ name   : chr [1:16] "Endeavor Air Inc." "American Airlines Inc." "Alaska Airlines Inc." "JetBlue Airways" ...
ncol(airlines)
## [1] 2
nrow(airlines)
## [1] 16
dim(airlines)
## [1] 16  2
head(airlines)
## # A tibble: 6 × 2
##   carrier name                    
##   <chr>   <chr>                   
## 1 9E      Endeavor Air Inc.       
## 2 AA      American Airlines Inc.  
## 3 AS      Alaska Airlines Inc.    
## 4 B6      JetBlue Airways         
## 5 DL      Delta Air Lines Inc.    
## 6 EV      ExpressJet Airlines Inc.
tail(airlines)
## # A tibble: 6 × 2
##   carrier name                  
##   <chr>   <chr>                 
## 1 OO      SkyWest Airlines Inc. 
## 2 UA      United Air Lines Inc. 
## 3 US      US Airways Inc.       
## 4 VX      Virgin America        
## 5 WN      Southwest Airlines Co.
## 6 YV      Mesa Airlines Inc.
summary(airlines)
##    carrier              name          
##  Length:16          Length:16         
##  Class :character   Class :character  
##  Mode  :character   Mode  :character

¿Cuáles son los campos y sus tipos de datos?

flights:

  • year: Entero
  • month: Entero
  • day: Entero
  • dep_time: Entero
  • sched_dep_time: Entero
  • dep_delay: Numérico
  • arr_time: Entero
  • sched_arr_time: Entero
  • arr_delay: Numérico
  • carrier: Caracter
  • flight: Entero
  • tailnum: Caracter
  • origin: Caracter
  • dest: Caracter
  • air_time: Numérico
  • distance: Numérico
  • hour: Numérico
  • minute: Numérico
  • time_hour: Fecha y hora

weather:

  • origin: Caracter
  • year: Entero
  • month: Entero
  • day: Entero
  • hour: Entero
  • temp: Numérico
  • dewp: Numérico
  • humid: Numérico
  • wind_dir: Numérico
  • wind_speed: Numérico
  • wind_gust: Numérico
  • precip: Numérico
  • pressure: Numérico
  • visib: Numérico
  • time_hour: Fecha y hora

planes:

  • tailnum: Caracter
  • year: Entero
  • type: Caracter
  • manufacturer: Caracter
  • model: Caracter
  • engines: Entero
  • seats: Entero
  • speed: Entero
  • engine: Caracter

airports:

  • faa: Caracter
  • name: Caracter
  • lat: Numérico
  • lon: Numérico
  • alt: Numérico
  • tz: Numérico
  • dst: Caracter
  • tzone: Caracter

4.2 Manipulación de datos

# dest & origin
summary(flights$distance)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##      17     502     872    1040    1389    4983
# Aerlineas de mayor tráfico aéreo en origen y destino
df <- flights %>% 
  select(carrier, distance, origin, dest) %>%
  filter(distance > mean(distance, na.rm= TRUE)) %>% 
  arrange(desc(distance))

df1 <- df %>% 
  group_by(carrier, origin, dest) %>% 
  summarise(suma_distancia= sum(distance, na.rm= TRUE), 
            media_distancia= mean(distance, na.rm= TRUE)) %>% 
    arrange(desc(carrier), desc(suma_distancia))
## `summarise()` has grouped output by 'carrier', 'origin'. You can override using
## the `.groups` argument.
df_JFK <- df1 %>% 
  filter(origin == "JFK") %>% 
  arrange(carrier, desc(suma_distancia))

df_JFK
## # A tibble: 69 × 5
## # Groups:   carrier, origin [8]
##    carrier origin dest  suma_distancia media_distancia
##    <chr>   <chr>  <chr>          <dbl>           <dbl>
##  1 9E      JFK    MSY           515352            1182
##  2 9E      JFK    DFW           507715            1391
##  3 9E      JFK    MCI           307188            1113
##  4 9E      JFK    SAT            84111            1587
##  5 9E      JFK    AUS             3042            1521
##  6 AA      JFK    LAX          7962075            2475
##  7 AA      JFK    SFO          3677292            2586
##  8 AA      JFK    MIA          2418669            1089
##  9 AA      JFK    SJU          1756202            1598
## 10 AA      JFK    LAS          1436472            2248
## # ℹ 59 more rows
df_LGA <- df1 %>% 
  filter(origin == "LGA") %>% 
  arrange(carrier, desc(suma_distancia))

df_LGA
## # A tibble: 31 × 5
## # Groups:   carrier, origin [9]
##    carrier origin dest  suma_distancia media_distancia
##    <chr>   <chr>  <chr>          <dbl>           <dbl>
##  1 9E      LGA    MCI            94095            1107
##  2 9E      LGA    SRQ            81666            1047
##  3 9E      LGA    RSW            72360            1080
##  4 9E      LGA    DFW            19446            1389
##  5 9E      LGA    MSY             1183            1183
##  6 AA      LGA    DFW          6717204            1389
##  7 AA      LGA    MIA          4323720            1096
##  8 B6      LGA    FLL          2354288            1076
##  9 B6      LGA    RSW           394200            1080
## 10 B6      LGA    SRQ           382155            1047
## # ℹ 21 more rows
df_EWR <- df1 %>% 
  filter(origin == "EWR") %>% 
  arrange(carrier, desc(suma_distancia))

df_EWR
## # A tibble: 50 × 5
## # Groups:   carrier, origin [9]
##    carrier origin dest  suma_distancia media_distancia
##    <chr>   <chr>  <chr>          <dbl>           <dbl>
##  1 AA      EWR    DFW          2818088            1372
##  2 AA      EWR    MIA          1158780            1085
##  3 AA      EWR    LAX           895710            2454
##  4 AS      EWR    SEA          1715028            2402
##  5 B6      EWR    FLL          1476090            1065
##  6 B6      EWR    SJU           609432            1608
##  7 B6      EWR    RSW           389820            1068
##  8 DL      EWR    SLC           697026            1969
##  9 EV      EWR    MCI          1480752            1092
## 10 EV      EWR    OMA           852768            1134
## # ℹ 40 more rows

4.3 Conclusiones

El avance 1 muestra el contexto del paquete “nycflights13”, que contiene datos sobre los vuelos que partieron de Nueva York en 2013, así como información meteorológica, detalles sobre aviones, aeropuertos y aerolíneas. Además, se exploran las bases de datos y se realiza una manipulación inicial de los datos.

El uso de este paquete proporciona una valiosa fuente de datos para comprender los vuelos, lo que nos permite analizar los factores que influyen en los retrasos y otras variables relacionadas con los vuelos. La manipulación y exploración de datos iniciales permiten entender la estructura y características de los conjuntos de datos.

Se cargan las bases de datos relevantes y se explorna mediante diferentes funciones, lo que proporciona una visión general de los campos y sus tipos de datos. Luego, se calcula la distancia promedio de los vuelos y se identifican las aerolíneas con mayor tráfico aéreo desde diferentes aeropuertos de origen.

Las aerolíneas con el mayor tráfico aéreo en términos de millas recorridas son UA (United Airlines) y AA (American Airlines). Esto se debe a que estas aerolíneas operan principalmente desde los aeropuertos EWR (Newark Liberty International Airport) y JFK (John F. Kennedy International Airport), que son los que tienen más distancia al centro de la ciudad y más variedad de destinos y rutas que los otros aeropuertos, lo que implica más distancia y tiempo de vuelo.

Según los datos, la media de millas recorridas por UA desde el aeropuerto EWR es de 2565, y desde el aeropuerto JFK es de 2586, lo que son los valores más altos entre todas las aerolíneas y aeropuertos. La media de millas recorridas por AA desde el aeropuerto EWR es de 2475, y desde el aeropuerto JFK es de 1703, lo que son los segundos valores más altos entre todas las aerolíneas y aeropuertos.

Las principales aerolíneas operando en los aeropuertos JFK y LGA son las mismas, pero no en el aeropuerto EWR. Esto se debe a que las aerolíneas UA (United Airlines) y AA (American Airlines) tienen una fuerte presencia en los aeropuertos JFK y LGA, que son los que tienen más tráfico aéreo y más variedad de destinos y rutas que los otros aeropuertos, lo que implica más distancia y tiempo de vuelo. Sin embargo, en el aeropuerto EWR, UA es la aerolínea líder, mientras que AA tiene una menor participación, lo que implica una menor distancia y tiempo de vuelo.

Finalmente, la media de millas recorridas por UA desde el aeropuerto EWR es de 2565, lo que es el valor más alto entre todas las aerolíneas y aeropuertos. La media de millas recorridas por AA desde el aeropuerto JFK es de 2475, lo que es el valor más alto entre todas las aerolíneas y la media de millas recorridas por AA desde el aeropuerto LGA es de 1389. Estos datos muestran que UA y AA son las aerolíneas líderes en los aeropuertos JFK y LGA, y que se diferencian de las demás por su distancia media recorrida.

5 Avance 2

5.1 Modelo de regresión lineal

columnas_nivel <- sapply(df_combinado, function(x) length(unique(x))) == 1
columnas_nivel_nombres <- names(df_combinado)[columnas_nivel]
 
print(columnas_nivel_nombres)
## [1] "year.x" "tz"     "dst"    "tzone"
regresion <- lm(dep_delay ~ carrier + month + dep_time + sched_dep_time + dep_delay + flight + origin + dest + distance + type + model + engine + temp + dewp + humid + wind_dir + wind_speed + precip + pressure + visib + date + week_day +lat + lon + alt, data = df_combinado)
summary(regresion)
## 
## Call:
## lm(formula = dep_delay ~ carrier + month + dep_time + sched_dep_time + 
##     dep_delay + flight + origin + dest + distance + type + model + 
##     engine + temp + dewp + humid + wind_dir + wind_speed + precip + 
##     pressure + visib + date + week_day + lat + lon + alt, data = df_combinado)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
##  -91.53  -15.84   -7.42    2.37 1310.79 
## 
## Coefficients: (15 not defined because of singularities)
##                                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                  -4.154e+02  1.350e+02  -3.076 0.002096 ** 
## carrierAA                     9.110e+00  1.848e+01   0.493 0.622030    
## carrierAS                     1.331e+01  1.794e+01   0.742 0.458211    
## carrierB6                     4.757e+00  1.932e+01   0.246 0.805477    
## carrierDL                     3.162e+01  1.835e+01   1.723 0.084840 .  
## carrierEV                     5.286e+00  8.588e-01   6.155 7.52e-10 ***
## carrierF9                     5.491e+00  1.944e+01   0.283 0.777556    
## carrierFL                     2.783e+01  1.848e+01   1.506 0.132098    
## carrierHA                     2.511e+01  1.828e+01   1.374 0.169453    
## carrierMQ                     1.529e+01  1.790e+01   0.854 0.393131    
## carrierOO                    -5.096e+00  6.887e+00  -0.740 0.459359    
## carrierUA                     4.962e+00  1.932e+01   0.257 0.797331    
## carrierUS                    -3.241e+00  1.932e+01  -0.168 0.866796    
## carrierVX                     2.922e+00  1.938e+01   0.151 0.880173    
## carrierWN                     2.851e+01  1.880e+01   1.517 0.129383    
## carrierYV                    -1.043e+00  1.806e+00  -0.577 0.563713    
## month                        -1.723e+00  2.519e-01  -6.841 7.89e-12 ***
## dep_time                      6.007e-02  5.116e-04 117.410  < 2e-16 ***
## sched_dep_time               -4.364e-02  5.368e-04 -81.295  < 2e-16 ***
## flight                        2.336e-05  1.385e-04   0.169 0.866062    
## originJFK                    -1.111e+00  3.633e-01  -3.058 0.002229 ** 
## originLGA                     2.156e-01  3.686e-01   0.585 0.558624    
## destACK                      -2.910e+01  2.926e+01  -0.994 0.320018    
## destALB                      -2.958e+01  3.002e+01  -0.985 0.324461    
## destANC                       5.025e+01  3.142e+01   1.599 0.109831    
## destATL                      -1.136e+01  1.923e+01  -0.591 0.554623    
## destAUS                       2.043e+00  6.059e+00   0.337 0.735984    
## destAVL                      -2.429e+01  2.225e+01  -1.092 0.274794    
## destBDL                      -3.222e+01  3.049e+01  -1.057 0.290677    
## destBGR                      -2.783e+01  2.607e+01  -1.068 0.285651    
## destBHM                      -1.324e+01  1.748e+01  -0.757 0.448797    
## destBNA                      -1.431e+01  1.918e+01  -0.746 0.455517    
## destBOS                      -2.847e+01  2.921e+01  -0.975 0.329791    
## destBQN                       1.700e+01  5.131e+00   3.313 0.000924 ***
## destBTV                      -2.695e+01  2.793e+01  -0.965 0.334569    
## destBUF                      -2.668e+01  2.740e+01  -0.974 0.330164    
## destBUR                       1.857e+01  1.184e+01   1.568 0.116905    
## destBWI                      -2.754e+01  2.949e+01  -0.934 0.350350    
## destBZN                       2.296e+01  7.020e+00   3.271 0.001073 ** 
## destCAE                      -1.589e+01  2.209e+01  -0.719 0.471842    
## destCAK                      -1.897e+01  2.576e+01  -0.737 0.461424    
## destCHO                      -3.504e+01  2.783e+01  -1.259 0.207934    
## destCHS                      -1.854e+01  2.136e+01  -0.868 0.385298    
## destCLE                      -2.296e+01  2.532e+01  -0.907 0.364494    
## destCLT                      -1.802e+01  2.306e+01  -0.782 0.434506    
## destCMH                      -2.413e+01  2.428e+01  -0.994 0.320335    
## destCRW                      -2.786e+01  2.693e+01  -1.035 0.300863    
## destCVG                      -1.922e+01  2.237e+01  -0.859 0.390277    
## destDAY                      -2.174e+01  2.303e+01  -0.944 0.345106    
## destDCA                      -2.836e+01  2.892e+01  -0.981 0.326767    
## destDEN                       8.563e+00  4.459e+00   1.920 0.054811 .  
## destDFW                       1.343e+00  8.283e+00   0.162 0.871204    
## destDSM                      -9.170e+00  1.454e+01  -0.631 0.528135    
## destDTW                      -1.868e+01  2.380e+01  -0.785 0.432486    
## destEGE                       1.343e+01  4.460e+00   3.010 0.002609 ** 
## destEYW                       4.686e+00  1.504e+01   0.312 0.755353    
## destFLL                      -4.477e+00  1.368e+01  -0.327 0.743537    
## destGRR                      -1.713e+01  2.178e+01  -0.786 0.431618    
## destGSO                      -2.231e+01  2.458e+01  -0.908 0.364010    
## destGSP                      -1.868e+01  2.197e+01  -0.850 0.395086    
## destHDN                       2.239e+01  1.063e+01   2.106 0.035165 *  
## destHNL                       8.134e+01  5.649e+01   1.440 0.149928    
## destHOU                       1.254e+00  7.588e+00   0.165 0.868740    
## destIAD                      -2.535e+01  2.868e+01  -0.884 0.376760    
## destIAH                       1.842e+00  7.802e+00   0.236 0.813317    
## destILM                      -2.620e+01  2.409e+01  -1.088 0.276784    
## destIND                      -1.740e+01  2.102e+01  -0.828 0.407749    
## destJAC                       3.837e+01  8.365e+00   4.587 4.50e-06 ***
## destJAX                      -1.424e+01  1.797e+01  -0.792 0.428190    
## destLAS                       1.974e+01  7.881e+00   2.505 0.012250 *  
## destLAX                       2.400e+01  1.179e+01   2.036 0.041740 *  
## destLEX                      -3.610e+01  4.169e+01  -0.866 0.386531    
## destLGB                       1.995e+01  1.177e+01   1.695 0.090084 .  
## destMCI                      -6.633e+00  1.312e+01  -0.505 0.613216    
## destMCO                      -8.778e+00  1.591e+01  -0.552 0.581185    
## destMDW                      -1.462e+01  1.985e+01  -0.736 0.461486    
## destMEM                      -9.692e+00  1.568e+01  -0.618 0.536570    
## destMHT                      -2.840e+01  2.886e+01  -0.984 0.325182    
## destMIA                      -4.370e+00  1.334e+01  -0.328 0.743193    
## destMKE                      -1.534e+01  1.961e+01  -0.782 0.434073    
## destMSN                      -1.116e+01  1.836e+01  -0.608 0.543091    
## destMSP                      -6.293e+00  1.460e+01  -0.431 0.666394    
## destMSY                      -4.819e+00  1.179e+01  -0.409 0.682673    
## destMTJ                       2.945e+01  1.096e+01   2.687 0.007219 ** 
## destMVY                      -3.423e+01  2.975e+01  -1.151 0.249924    
## destMYR                      -1.632e+01  2.326e+01  -0.702 0.482961    
## destOAK                       2.166e+01  1.380e+01   1.570 0.116420    
## destOKC                      -3.078e+00  9.296e+00  -0.331 0.740589    
## destOMA                      -6.228e+00  1.245e+01  -0.500 0.616836    
## destORD                      -1.105e+01  1.971e+01  -0.561 0.574838    
## destORF                      -2.745e+01  2.751e+01  -0.998 0.318373    
## destPBI                      -5.629e+00  1.441e+01  -0.391 0.696039    
## destPDX                       2.540e+01  1.147e+01   2.214 0.026814 *  
## destPHL                      -2.600e+01  3.101e+01  -0.838 0.401845    
## destPHX                       1.958e+01  6.334e+00   3.091 0.001993 ** 
## destPIT                      -2.479e+01  2.676e+01  -0.926 0.354357    
## destPSE                       3.900e+01  4.875e+00   8.000 1.25e-15 ***
## destPSP                       1.958e+01  1.347e+01   1.454 0.145950    
## destPVD                      -2.883e+01  2.972e+01  -0.970 0.331992    
## destPWM                      -2.625e+01  2.775e+01  -0.946 0.344078    
## destRDU                      -2.175e+01  2.512e+01  -0.866 0.386579    
## destRIC                      -2.469e+01  2.758e+01  -0.895 0.370680    
## destROC                      -2.426e+01  2.806e+01  -0.865 0.387285    
## destRSW                      -6.970e+00  1.362e+01  -0.512 0.608931    
## destSAN                       2.401e+01  1.130e+01   2.125 0.033548 *  
## destSAT                       7.179e+00  5.161e+00   1.391 0.164199    
## destSAV                      -1.619e+01  1.995e+01  -0.812 0.416883    
## destSBN                      -2.031e+01  2.457e+01  -0.827 0.408488    
## destSDF                      -1.882e+01  2.109e+01  -0.892 0.372271    
## destSEA                       2.517e+01  1.088e+01   2.315 0.020640 *  
## destSFO                       3.061e+01  1.372e+01   2.230 0.025725 *  
## destSJC                       1.593e+01  1.366e+01   1.166 0.243654    
## destSJU                       9.972e+00  4.705e+00   2.120 0.034042 *  
## destSLC                       1.492e+01  3.863e+00   3.862 0.000113 ***
## destSMF                       1.971e+01  1.286e+01   1.533 0.125343    
## destSNA                       2.179e+01  1.142e+01   1.909 0.056288 .  
## destSRQ                      -8.013e+00  1.424e+01  -0.563 0.573625    
## destSTL                      -1.148e+01  1.699e+01  -0.676 0.499059    
## destSTT                       1.292e+01  4.866e+00   2.655 0.007938 ** 
## destSYR                      -2.599e+01  2.905e+01  -0.895 0.371016    
## destTPA                      -7.255e+00  1.484e+01  -0.489 0.625008    
## destTUL                      -1.752e+00  1.118e+01  -0.157 0.875444    
## destTVC                      -8.470e+00  2.154e+01  -0.393 0.694145    
## destTYS                      -1.806e+01  2.132e+01  -0.847 0.397123    
## destXNA                      -7.356e+00  1.260e+01  -0.584 0.559412    
## distance                     -2.277e-02  1.788e-02  -1.273 0.202965    
## typeFixed wing single engine  1.447e+01  7.087e+00   2.042 0.041195 *  
## typeRotorcraft                6.385e+00  9.014e+00   0.708 0.478720    
## model172E                    -3.071e+00  1.108e+01  -0.277 0.781763    
## model172M                     5.028e-01  7.554e+00   0.067 0.946934    
## model172N                    -2.100e+01  7.913e+00  -2.654 0.007947 ** 
## model206B                     2.227e+00  9.650e+00   0.231 0.817536    
## model210-5(205)              -1.403e+01  8.007e+00  -1.753 0.079662 .  
## model230                      1.968e+01  1.080e+01   1.822 0.068522 .  
## model310Q                     3.930e+00  9.500e+00   0.414 0.679144    
## model421C                     3.327e+00  8.301e+00   0.401 0.688558    
## model550                      1.359e+01  8.156e+00   1.667 0.095581 .  
## model60                       1.497e+00  1.041e+01   0.144 0.885713    
## model65-A90                   1.154e+01  9.166e+00   1.259 0.208016    
## model717-200                 -7.367e+00  4.914e+00  -1.499 0.133856    
## model737-301                 -5.026e+00  1.568e+01  -0.321 0.748490    
## model737-317                 -1.828e+01  2.576e+01  -0.709 0.478046    
## model737-3A4                 -7.076e+00  3.592e+01  -0.197 0.843862    
## model737-3G7                 -1.414e+01  1.392e+01  -1.016 0.309541    
## model737-3H4                 -2.919e+00  6.299e+00  -0.463 0.643033    
## model737-3K2                 -8.084e-01  1.696e+01  -0.048 0.961975    
## model737-3L9                  5.201e+00  1.568e+01   0.332 0.740069    
## model737-3Q8                 -2.147e+00  1.052e+01  -0.204 0.838249    
## model737-3T5                 -1.910e+01  3.593e+01  -0.532 0.594924    
## model737-3TO                  1.915e+01  1.098e+01   1.745 0.080957 .  
## model737-3Y0                 -8.530e+00  1.568e+01  -0.544 0.586376    
## model737-401                  1.668e+01  1.042e+01   1.601 0.109430    
## model737-4B7                  1.842e+01  8.389e+00   2.196 0.028093 *  
## model737-524                  8.073e+00  1.924e+01   0.420 0.674782    
## model737-5H4                 -7.463e+00  9.140e+00  -0.817 0.414183    
## model737-705                 -8.082e+00  7.896e+00  -1.024 0.306034    
## model737-724                  1.215e+01  7.508e+00   1.618 0.105659    
## model737-732                 -1.605e+01  4.612e+00  -3.481 0.000500 ***
## model737-76N                  2.573e+00  5.740e+00   0.448 0.653901    
## model737-76Q                  1.960e+00  8.252e+00   0.238 0.812268    
## model737-7AD                 -1.395e+01  1.051e+01  -1.327 0.184404    
## model737-7BD                 -8.665e-01  5.946e+00  -0.146 0.884144    
## model737-7BX                 -1.231e+00  7.801e+00  -0.158 0.874593    
## model737-7H4                 -2.889e+00  6.074e+00  -0.476 0.634315    
## model737-7Q8                 -6.304e+00  1.051e+01  -0.600 0.548655    
## model737-824                  1.337e+01  7.534e+00   1.775 0.075928 .  
## model737-832                 -1.847e+01  4.511e+00  -4.094 4.24e-05 ***
## model737-890                 -2.791e+00  2.946e+00  -0.947 0.343498    
## model737-8FH                 -1.076e+01  1.007e+01  -1.068 0.285478    
## model737-8H4                 -3.277e+00  6.307e+00  -0.520 0.603364    
## model737-924                  1.415e+01  7.622e+00   1.856 0.063411 .  
## model737-924ER                1.292e+01  7.543e+00   1.713 0.086724 .  
## model737-990                  2.390e+01  9.128e+00   2.618 0.008848 ** 
## model737-990ER                       NA         NA      NA       NA    
## model757-212                 -1.628e+01  2.544e+01  -0.640 0.522078    
## model757-222                  1.414e+01  7.498e+00   1.886 0.059257 .  
## model757-223                  1.387e+01  5.268e+00   2.633 0.008465 ** 
## model757-224                  1.101e+01  7.515e+00   1.465 0.142846    
## model757-231                 -1.702e+01  4.567e+00  -3.727 0.000194 ***
## model757-232                 -1.638e+01  4.527e+00  -3.619 0.000296 ***
## model757-251                 -9.760e+00  5.428e+00  -1.798 0.072155 .  
## model757-26D                 -2.069e+01  6.585e+00  -3.142 0.001680 ** 
## model757-2B7                  2.034e+01  2.615e+01   0.778 0.436554    
## model757-2Q8                 -1.600e+01  4.569e+00  -3.501 0.000463 ***
## model757-324                  1.875e+01  7.803e+00   2.403 0.016281 *  
## model757-33N                  1.997e+01  8.209e+00   2.433 0.014988 *  
## model757-351                  4.576e+01  1.826e+01   2.506 0.012204 *  
## model767-201                  7.337e+01  3.619e+01   2.027 0.042619 *  
## model767-223                  1.083e+01  5.029e+00   2.154 0.031239 *  
## model767-224                  1.407e+01  1.267e+01   1.110 0.266874    
## model767-322                  2.166e+01  7.862e+00   2.755 0.005875 ** 
## model767-323                  1.401e+01  5.298e+00   2.645 0.008170 ** 
## model767-324                 -3.574e+01  1.826e+01  -1.957 0.050318 .  
## model767-332                 -1.615e+01  4.619e+00  -3.497 0.000471 ***
## model767-3P6                 -1.386e+01  6.029e+00  -2.299 0.021488 *  
## model767-424ER                1.881e+01  8.058e+00   2.334 0.019579 *  
## model767-432ER               -1.160e+01  8.274e+00  -1.402 0.160903    
## model777-200                 -8.456e-02  9.933e+00  -0.009 0.993208    
## model777-222                  1.234e+01  1.924e+01   0.641 0.521333    
## model777-224                  5.717e+01  2.178e+01   2.624 0.008680 ** 
## model787-8                    4.797e+00  2.178e+01   0.220 0.825715    
## modelA-1B                     1.860e+00  1.001e+01   0.186 0.852558    
## modelA109E                    2.298e+01  1.001e+01   2.296 0.021663 *  
## modelA185F                   -1.078e+01  7.721e+00  -1.396 0.162761    
## modelA319-112                 1.991e+01  7.563e+00   2.632 0.008479 ** 
## modelA319-114                -1.567e+01  4.497e+00  -3.485 0.000492 ***
## modelA319-115                 3.732e+01  8.753e+00   4.264 2.01e-05 ***
## modelA319-131                 1.485e+01  7.504e+00   1.979 0.047861 *  
## modelA319-132                 1.589e+01  9.453e+00   1.681 0.092811 .  
## modelA320-211                -1.529e+01  4.532e+00  -3.374 0.000741 ***
## modelA320-212                -1.471e+01  4.516e+00  -3.256 0.001129 ** 
## modelA320-214                 1.885e+01  7.630e+00   2.471 0.013488 *  
## modelA320-231                 2.418e+01  1.628e+01   1.485 0.137626    
## modelA320-232                 1.613e+01  7.517e+00   2.145 0.031938 *  
## modelA321-211                 1.916e+01  7.548e+00   2.539 0.011112 *  
## modelA321-231                 1.981e+01  7.574e+00   2.616 0.008898 ** 
## modelA330-223                 2.793e+01  1.826e+01   1.530 0.126083    
## modelA330-243                        NA         NA      NA       NA    
## modelA330-323                -1.008e+01  3.569e+01  -0.282 0.777695    
## modelA340-313                 3.168e-02  1.070e+01   0.003 0.997637    
## modelAT-5                    -3.306e+01  2.220e+01  -1.489 0.136391    
## modelCF-5D                    2.909e+00  4.266e+00   0.682 0.495314    
## modelCL-600-2B19              1.971e+01  1.780e+01   1.107 0.268096    
## modelCL-600-2C10              2.151e+01  1.778e+01   1.210 0.226458    
## modelCL-600-2D24              2.347e+01  1.779e+01   1.319 0.187061    
## modelDC-7BF                   1.383e-02  9.163e+00   0.002 0.998796    
## modelDC-9-51                 -1.654e+01  6.260e+00  -2.642 0.008235 ** 
## modelDC-9-82(MD-82)           5.989e+00  5.030e+00   1.191 0.233744    
## modelDC-9-83(MD-83)           7.630e+00  5.099e+00   1.496 0.134600    
## modelE-90                     8.736e+00  9.014e+00   0.969 0.332484    
## modelEMB-145                  2.182e+01  1.796e+01   1.215 0.224386    
## modelEMB-145LR                2.246e+01  1.779e+01   1.263 0.206583    
## modelEMB-145XR                2.129e+01  1.779e+01   1.197 0.231305    
## modelERJ 190-100 IGW          1.659e+01  7.525e+00   2.205 0.027486 *  
## modelFALCON XP               -8.362e+00  5.918e+00  -1.413 0.157672    
## modelFALCON-XP               -1.572e+01  6.463e+00  -2.432 0.015013 *  
## modelG-IV                     4.299e+01  1.178e+01   3.648 0.000264 ***
## modelG1159B                          NA         NA      NA       NA    
## modelKITFOX IV               -9.308e+00  7.805e+00  -1.193 0.233045    
## modelMD-88                   -1.329e+01  4.488e+00  -2.962 0.003057 ** 
## modelMD-90-30                        NA         NA      NA       NA    
## modelMYSTERE FALCON 900              NA         NA      NA       NA    
## modelOTTER DHC-3             -1.295e+01  7.054e+00  -1.836 0.066331 .  
## modelPA-28-180               -4.957e+00  7.805e+00  -0.635 0.525362    
## modelPA-31-350                       NA         NA      NA       NA    
## modelPA-32R-300              -1.382e+01  7.868e+00  -1.756 0.079121 .  
## modelPA-32RT-300              1.789e+00  9.799e+00   0.183 0.855138    
## modelR66                      8.105e+00  9.710e+00   0.835 0.403893    
## modelS-76A                           NA         NA      NA       NA    
## modelSR22                    -2.598e+00  3.255e+00  -0.798 0.424852    
## modelVANS AIRCRAFT RV6        3.085e+00  7.226e+00   0.427 0.669473    
## modelZODIAC 601HDS                   NA         NA      NA       NA    
## engineReciprocating                  NA         NA      NA       NA    
## engineTurbo-fan              -9.241e-01  7.810e-01  -1.183 0.236703    
## engineTurbo-jet                      NA         NA      NA       NA    
## engineTurbo-prop                     NA         NA      NA       NA    
## engineTurbo-shaft                    NA         NA      NA       NA    
## temp                          1.438e-01  4.450e-02   3.232 0.001229 ** 
## dewp                         -6.762e-02  4.793e-02  -1.411 0.158320    
## humid                         2.629e-01  2.451e-02  10.725  < 2e-16 ***
## wind_dir                     -1.850e-03  8.044e-04  -2.300 0.021450 *  
## wind_speed                    2.514e-01  1.540e-02  16.321  < 2e-16 ***
## precip                        5.164e+01  5.999e+00   8.607  < 2e-16 ***
## pressure                     -2.966e-01  1.127e-02 -26.315  < 2e-16 ***
## visib                        -3.458e-01  6.445e-02  -5.365 8.09e-08 ***
## date                          4.476e-02  8.233e-03   5.436 5.44e-08 ***
## week_dayMonday               -3.140e-01  2.648e-01  -1.186 0.235707    
## week_daySaturday             -5.437e+00  2.797e-01 -19.441  < 2e-16 ***
## week_daySunday               -2.977e+00  2.667e-01 -11.165  < 2e-16 ***
## week_dayThursday              6.882e-01  2.651e-01   2.596 0.009425 ** 
## week_dayTuesday              -3.959e+00  2.651e-01 -14.931  < 2e-16 ***
## week_dayWednesday            -2.263e+00  2.630e-01  -8.602  < 2e-16 ***
## lat                                  NA         NA      NA       NA    
## lon                                  NA         NA      NA       NA    
## alt                                  NA         NA      NA       NA    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 35.4 on 242765 degrees of freedom
##   (93751 observations deleted due to missingness)
## Multiple R-squared:  0.1301, Adjusted R-squared:  0.1291 
## F-statistic: 140.2 on 259 and 242765 DF,  p-value: < 2.2e-16
flight_weather <-flights %>% inner_join(weather, by = c("origin" = "origin", "year" = "year", "month" = "month", "day" = "day", "hour" = "hour"))
flight_weather<- mutate(flight_weather, celcius= ((temp-32)*(5/9)))
flight_weather<- mutate(flight_weather, dw_celcius= ((dewp-32)*(5/9)))
flight_weather<- mutate(flight_weather, khm= (wind_speed*1.60934))
flight_weather<- mutate(flight_weather, mm= (precip*25.4))
flight_weather<- mutate(flight_weather, km= (visib*1.60934))

Observaciones: El modelo de regresión lineal tiene un coeficiente de determinación (R2) de 0.1301, lo que significa que el 13.01% de la variación en el retraso medio de salida se explica por las variables independientes. Esto indica un ajuste moderado del modelo a los datos, ya que hay otros factores que pueden influir en el retraso que no se han incluido en el modelo.

5.2 Variables Independientes

Podemos considerar como variables independientes las siguientes:

5.2.1 Month

La variable month, se refiere al mes del año, desde enero hasta diciembre.

ggplot(flight_weather, aes(x = month, y = dep_delay, fill = origin)) +
  geom_bar(stat = "summary", fun = "mean", position = "stack") +
  labs(x = "Mes", y = "Retraso promedio (minutos)", fill = "Aeoropuerto") +
  ggtitle("Retraso promedio por mes y aeropuerto") +
  scale_fill_brewer(palette = "Set3") +
  theme_minimal()+ 
  scale_x_continuous(breaks = 1:12, labels = 1:12)+ 
  theme(plot.title= element_text(hjust=0.5))
## Warning: Removed 8227 rows containing non-finite outside the scale range
## (`stat_summary()`).

summary_delay_month <- flight_weather %>%
  group_by(month) %>%
  summarise(avg_delay = mean(dep_delay, na.rm = TRUE),
            total_flights = n(),
            total_delayed_flights = sum(dep_delay > 0, na.rm = TRUE),
            perc_delayed_flights = total_delayed_flights / total_flights * 100)

summary_delay_month
## # A tibble: 12 × 5
##    month avg_delay total_flights total_delayed_flights perc_delayed_flights
##    <int>     <dbl>         <int>                 <int>                <dbl>
##  1     1     10.0          26952                  9639                 35.8
##  2     2     10.8          24922                  9113                 36.6
##  3     3     13.2          28834                 11209                 38.9
##  4     4     13.9          28314                 10533                 37.2
##  5     5     13.0          28796                 11291                 39.2
##  6     6     20.8          28243                 12655                 44.8
##  7     7     21.8          29383                 13892                 47.3
##  8     8     12.4          29123                 11576                 39.7
##  9     9      6.66         27553                  7802                 28.3
## 10    10      6.21         28724                  8651                 30.1
## 11    11      5.45         27173                  8220                 30.3
## 12    12     16.9          27203                 13189                 48.5

Observaciones: Los vuelos que salen en los meses de junio y julio tienen más retrasos que los que salen en otros meses del año. Esto se debe a que hay una mayor demanda de viajes y posiblemente condiciones meteorológicas adversas durante los meses de verano, lo que genera más congestión y dificultades para cumplir con los horarios. Al observar los datos, se puede ver que el retraso promedio de salida en junio y julio fue de 20.8 y 21.8 minutos respectivamente, y que la proporción de vuelos retrasados fue de 44.8% y 47.3% respectivamente, lo que son los valores más altos de todo el año.

5.2.2 Origin

La variable origin, se refiere al aeropuerto de origen, que puede ser EWR, JFK o LGA.

ggplot(flight_weather, aes(x = origin, y = dep_delay, fill = origin)) +
  geom_bar(stat = "summary", fun = "mean", position = "stack") +
  labs(x = "Aeropuerto de origen", y = "Retraso promedio (minutos)", fill = "Aeoropuerto") +
  ggtitle("Retraso promedio por aeropuerto") +
  scale_fill_brewer(palette = "Set3") +
  theme_minimal()+ 
  theme(plot.title= element_text(hjust=0.5))
## Warning: Removed 8227 rows containing non-finite outside the scale range
## (`stat_summary()`).

summary_delay_origin <- flight_weather %>%
  group_by(origin) %>%
  summarise(avg_delay = mean(dep_delay, na.rm = TRUE),
            total_flights = n(),
            total_delayed_flights = sum(dep_delay > 0, na.rm = TRUE),
            perc_delayed_flights = total_delayed_flights / total_flights * 100)

summary_delay_origin
## # A tibble: 3 × 5
##   origin avg_delay total_flights total_delayed_flights perc_delayed_flights
##   <chr>      <dbl>         <int>                 <int>                <dbl>
## 1 EWR         15.1        120193                 52410                 43.6
## 2 JFK         12.1        110733                 41790                 37.7
## 3 LGA         10.4        104294                 33570                 32.2

Observaciones: El aeropuerto EWR es el que tiene más retrasos en los vuelos que salen desde él, en comparación con los aeropuertos JFK y LGA. Esto se debe a que el aeropuerto EWR tiene más tráfico aéreo, más distancia al centro de la ciudad y más probabilidades de sufrir condiciones meteorológicas adversas que el aeropuerto LGA, lo que implica más problemas operativos y de congestión. Al analizar los datos, se puede ver que el retraso promedio de salida en el aeropuerto EWR fue de 15.1 minutos, y que la proporción de vuelos retrasados fue de 43.6%, lo que son los valores más altos entre los tres aeropuertos. Por el contrario, el aeropuerto LGA tuvo el menor retraso promedio de salida con 10.4 minutos, y la menor proporción de vuelos retrasados con 32.2%. El aeropuerto JFK se ubicó en una posición intermedia, con un retraso promedio de salida de 12.1 minutos, y una proporción de vuelos retrasados de 37.7%.

5.2.3 Dest

La variable dest, se refiere al destino del vuelo, que puede ser uno de los 105 posibles.

df_dest_avg_delay <- df_combinado %>%
  group_by(dest) %>%
  summarize(avg_delay = mean(dep_delay, na.rm = TRUE))

top_10_destinations <- df_dest_avg_delay %>%
  arrange(desc(avg_delay)) %>%
  slice(1:10)

df_top_10_dest <- df_combinado %>%
  filter(dest %in% top_10_destinations$dest)

ggplot(df_top_10_dest, aes(x = dest, y = dep_delay, fill = origin)) +
  geom_bar(stat = "summary", fun = "mean", position = "stack") +
  labs(x = "Destino", y = "Retraso promedio (minutos)", fill = "Aeropuerto") +
  ggtitle("Retraso promedio por destino y aeropuerto para los 10 destinos con mayores retrasos") +
  scale_fill_brewer(palette = "Set3") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))
## Warning: Removed 300 rows containing non-finite outside the scale range
## (`stat_summary()`).

summary_delay_dest <- df_top_10_dest  %>%
  group_by(dest) %>%
  summarise(avg_delay = mean(dep_delay, na.rm = TRUE),
            total_flights = n(),
            total_delayed_flights = sum(dep_delay > 0, na.rm = TRUE),
            perc_delayed_flights = total_delayed_flights / total_flights * 100)

summary_delay_dest
## # A tibble: 10 × 5
##    dest  avg_delay total_flights total_delayed_flights perc_delayed_flights
##    <chr>     <dbl>         <int>                 <int>                <dbl>
##  1 ALB        23.6           439                   210                 47.8
##  2 BHM        29.7           297                   138                 46.5
##  3 CAE        35.6           116                    72                 62.1
##  4 DSM        26.2           569                   244                 42.9
##  5 JAC        26.5            25                    16                 64  
##  6 MSN        23.6           572                   269                 47.0
##  7 OKC        30.6           346                   196                 56.6
##  8 RIC        23.6          2454                  1096                 44.7
##  9 TUL        34.9           315                   172                 54.6
## 10 TYS        28.5           631                   281                 44.5

Observaciones: Los destinos con los mayores retrasos promedio de salida son CAE, TUL y OKC, con valores de 35.6, 34.9 y 30.6 minutos respectivamente. Además, estos destinos tienen proporciones muy altas de vuelos retrasados, con CAE alcanzando el 62.1%, TUL el 54.6% y OKC el 56.6%. Esto puede deberse a que los destinos más lejanos o más pequeños tienen más dificultades para ajustarse a los horarios, las condiciones climáticas o las disponibilidades de las pistas que los destinos más cercanos o más grandes.

Los destinos CAE, TUL y OKC son los que tienen más retrasos en los vuelos que llegan a ellos, en comparación con otros destinos. Esto se debe a que los destinos más lejanos o más pequeños tienen más dificultades para ajustarse a los horarios, las condiciones climáticas o las disponibilidades de las pistas que los destinos más cercanos o más grandes, lo que implica más demoras y cancelaciones. Al examinar los datos, se puede ver que el retraso promedio de salida para los destinos CAE, TUL y OKC fue de 35.6, 34.9 y 30.6 minutos respectivamente, y que la proporción de vuelos retrasados fue de 62.1%, 54.6% y 56.6% respectivamente, lo que son los valores más altos entre todos los destinos.

5.2.4 Model

La variable model, se refiere el modelo del avión, que puede ser uno de los 38 posibles.

df_model_avg_delay <- df_combinado %>%
  group_by(model) %>%
  summarize(avg_delay = mean(dep_delay, na.rm = TRUE))

top_10_models <- df_model_avg_delay %>%
  arrange(desc(avg_delay)) %>%
  slice(1:10)

df_top_10 <- df_combinado %>%
  filter(model %in% top_10_models$model)

ggplot(df_top_10, aes(x = model, y = dep_delay, fill = origin)) +
  geom_bar(stat = "summary", fun = "mean", position = "stack") +
  labs(x = "Modelo", y = "Retraso promedio (minutos)", fill = "Aeropuerto") +
  ggtitle("Retraso promedio por modelo y aeropuerto") +
  scale_fill_brewer(palette = "Set3") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))
## Warning: Removed 3 rows containing non-finite outside the scale range
## (`stat_summary()`).

summary_delay_model <- df_top_10 %>%
  group_by(model) %>%
  summarise(avg_delay = mean(dep_delay, na.rm = TRUE),
            total_flights = n(),
            total_delayed_flights = sum(dep_delay > 0, na.rm = TRUE),
            perc_delayed_flights = total_delayed_flights / total_flights * 100)

summary_delay_model
## # A tibble: 10 × 5
##    model    avg_delay total_flights total_delayed_flights perc_delayed_flights
##    <chr>        <dbl>         <int>                 <int>                <dbl>
##  1 737-3TO       35.7            15                    11                 73.3
##  2 737-990       31.9            18                    10                 55.6
##  3 747-451      132               1                     1                100  
##  4 757-351       82.8             4                     3                 75  
##  5 777-224       50.2             4                     4                100  
##  6 A109E         32.5            32                    18                 56.2
##  7 A319-115      42.6            94                    50                 53.2
##  8 A330-223      63.2             4                     4                100  
##  9 G-IV          46.3            13                     8                 61.5
## 10 MD-90-30      27.5            74                    35                 47.3

Observaciones: Los modelos de avión con el 100% de vuelos retrasados son el 747-451, el 757-351 y el A330-223. Estos modelos son propensos a experimentar retrasos en todos los aeropuertos, lo que puede indicar problemas de mantenimiento, capacidad o rendimiento inherentes a estos aviones. Estos modelos son propensos a experimentar retrasos en todos los aeropuertos, pero son particularmente destacados en el aeropuerto JFK, lo que sugiere posibles problemas operativos específicos en este aeropuerto con respecto a estos modelos.

Los modelos de avión 747-451, 757-351 y A330-223 son los que tienen más retrasos en los vuelos que los usan, en comparación con otros modelos de avión. Esto se debe a que estos modelos son propensos a experimentar problemas de mantenimiento, capacidad o rendimiento inherentes a estos aviones, lo que implica más fallas y reparaciones. Al revisar los datos, se puede ver que el 100% de los vuelos que usaron estos modelos tuvieron retrasos, y que estos modelos fueron especialmente problemáticos en el aeropuerto JFK, lo que sugiere posibles problemas operativos específicos en este aeropuerto con respecto a estos modelos.

5.2.5 Variables del clima

Ahora, se muestran las variables independientes del clima:

5.2.5.1 temp

La variable temp, se refiere a la temperatura media en grados Celcius.

flight_weather %>%
  group_by(celcius) %>%
  summarise(delay = mean(dep_delay, na.rm = TRUE)) %>%
  ggplot(aes(x = celcius, y = delay)) +
  labs(x = "Temperatura (C°)", y = "Retraso promedio (minutos)", fill = "Aeoropuerto") +
  ggtitle("Retraso promedio por temperatura") +
  geom_line() + geom_point()+ theme(plot.title= element_text(hjust=0.5))
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_line()`).
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_point()`).

Observaciones: La temperatura influye positivamente en el retraso medio de salida de los vuelos. Esto se debe a que la temperatura afecta a la densidad del aire, la cual influye en la sustentación y la resistencia de los aviones, pero también hay otros factores climáticos que pueden causar retrasos, como el viento, la lluvia o la nieve. Según los datos, el coeficiente de regresión entre la temperatura y el retraso medio de salida es de 1.438e-01, lo que indica una relación positiva y estadísticamente significativa al nivel de 0.001. Además, según la gráfica, se puede observar que el retraso promedio de salida aumenta con la temperatura, especialmente alrededor de 0°C y entre 30°C y 40°C, lo que puede deberse a la formación de hielo o al sobrecalentamiento de los motores.

5.2.5.2 humid

La variable humid, se refiere a la humedad media.

flight_weather %>%
  group_by(humid) %>%
  summarise(delay = mean(dep_delay, na.rm = TRUE)) %>%
  ggplot(aes(x = humid, y = delay)) +
  labs(x = "Humedad relativa", y = "Retraso promedio (minutos)", fill = "Aeoropuerto") +
  ggtitle("Retraso promedio por humedad relativa") +
  geom_line() + geom_point()+ theme(plot.title= element_text(hjust=0.5))
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_line()`).
## Warning: Removed 3 rows containing missing values or values outside the scale range
## (`geom_point()`).

Observaciones: La humedad influye negativamente en el retraso medio de salida de los vuelos. Esto se debe a que la humedad afecta a la visibilidad y la formación de hielo en las alas de los aviones, lo que implica más riesgos y precauciones para los vuelos.

Según los datos, el coeficiente de regresión entre la humedad y el retraso medio de salida es de 2.629e-01, lo que indica una relación negativa y estadísticamente significativa al nivel de 0.001. Además, según la gráfica, se puede observar que el retraso promedio de salida disminuye con la humedad, especialmente entre 0 y 20, lo que puede deberse a que el aire seco favorece el rendimiento de los aviones y reduce la probabilidad de precipitaciones.

5.2.5.3 wind_speed

La variable wind_speed, se refiere a la velocidad del viento media en kilómetros por hora.

flight_weather %>%
  group_by(khm) %>%
  summarise(delay = mean(dep_delay, na.rm = TRUE)) %>%
  ggplot(aes(x = khm, y = delay)) +
  labs(x = "Velocidad del viento (kmh)", y = "Retraso promedio (minutos)", fill = "Aeoropuerto") +
  ggtitle("Retraso promedio por velocidad del viento") +
  geom_line() + geom_point()+ theme(plot.title= element_text(hjust=0.5))

Observaciones: La velocidad del viento influye positivamente en el retraso medio de salida de los vuelos. Esto se debe a que el viento fuerte dificulta el despegue y el aterrizaje de los aviones, así como su navegación y consumo de combustible, lo que implica más demoras y precauciones para los vuelos. Según los datos, el coeficiente de regresión entre la velocidad del viento y el retraso medio de salida es de 2.514e-01, lo que indica una relación positiva y estadísticamente significativa al nivel de 0.001. Además, según la gráfica, se puede observar que el retraso promedio de salida aumenta con la velocidad del viento, especialmente a partir de 20 km/h, lo que puede deberse a que el viento supera la velocidad de crucero de los aviones o genera turbulencias.

5.2.5.4 precip

La variable precip, se refiere a la precipitación media en milímetro.

flight_weather %>%
  group_by(mm) %>%
  summarise(delay = mean(dep_delay, na.rm = TRUE)) %>%
  ggplot(aes(x = mm, y = delay)) +
  labs(x = "Precipitación (mm)", y = "Retraso promedio (minutos)", fill = "Aeoropuerto") +
  ggtitle("Retraso promedio por precipitación") +
  geom_line() + geom_point()+ theme(plot.title= element_text(hjust=0.5))

Observaciones: La precipitación influye negativamente en el retraso medio de salida de los vuelos . Esto se debe a que la lluvia, la nieve o el granizo pueden reducir la visibilidad, la seguridad y el tráfico aéreo, así como causar problemas técnicos o de mantenimiento en los aviones, lo que implica más cancelaciones y demoras para los vuelos. Según los datos, el coeficiente de regresión entre la precipitación y el retraso medio de salida es de 5.164e+01, lo que indica una relación negativa y estadísticamente significativa al nivel de 0.001. Además, según la gráfica, se puede observar que el retraso promedio de salida disminuye con la precipitación, especialmente a partir de 20 mm, lo que puede deberse a que la precipitación supera el umbral de tolerancia de los aviones o impide el despegue o el aterrizaje.

5.2.5.5 pressure

La variable pressure, se refiere a la presión atmosférica media en milibares.

flight_weather %>%
  group_by(pressure) %>%
  summarise(delay = mean(dep_delay, na.rm = TRUE)) %>%
  ggplot(aes(x = pressure, y = delay)) +
  labs(x = "Presión (milibares)", y = "Retraso promedio (minutos)", fill = "Aeoropuerto") +
  ggtitle("Retraso promedio por presión") +
  geom_line() + geom_point()+ theme(plot.title= element_text(hjust=0.5))

Observaciones: La presión atmosférica influye negativamente en el retraso medio de salida de los vuelos. Esto se debe a que la presión atmosférica determina la densidad del aire, la cual afecta al rendimiento y la sustentación de los aviones, y también influye en el desarrollo de las nubes y las lluvias, las cuales pueden causar retrasos. Según los datos, el coeficiente de regresión entre la presión atmosférica y el retraso medio de salida es de -2.966e-01, lo que indica una relación negativa y estadísticamente significativa al nivel de 0.001. Además, según la gráfica, se puede observar que el retraso promedio de salida disminuye con la presión atmosférica, especialmente a partir de 1020 milibares, lo que puede deberse a que la presión alta indica un clima más estable y seco.

5.2.5.6 visib

La variable visib, se refiere a la visibilidad media en millas.

flight_weather %>%
  group_by(km) %>%
  summarise(delay = mean(dep_delay, na.rm = TRUE)) %>%
  ggplot(aes(x = km, y = delay)) +
  labs(x = "Visibilidad (km)", y = "Retraso promedio (minutos)", fill = "Aeoropuerto") +
  ggtitle("Retraso promedio por visibilidad") +
  geom_line() + geom_point()+ theme(plot.title= element_text(hjust=0.5))

Observaciones: La visibilidad influye negativamente en el retraso medio de salida de los vuelos. Esto se debe a que la visibilidad es un factor clave para la seguridad y la eficiencia de los vuelos, ya que afecta a la capacidad de los pilotos y los controladores de tráfico aéreo para detectar y evitar obstáculos, conflictos y condiciones meteorológicas adversas. Según los datos, el coeficiente de regresión entre la visibilidad y el retraso medio de salida es de -3.458e-01, lo que indica una relación negativa y estadísticamente significativa al nivel de 0.001. Además, según la gráfica, se puede observar que el retraso promedio de salida aumenta con la visibilidad, especialmente entre 0 y 5 km, lo que puede deberse a que la baja visibilidad implica más restricciones y precauciones para los vuelos, como el uso de instrumentos, el aumento de la separación entre aviones y la reducción de la capacidad de los aeropuertos.

5.2.5.7 week_day

La variable week_day, se refiere al día de la semana, desde lunes hasta domingo.

df_combinado$week_day <- factor(weekdays(df_combinado$time_hour), levels = c("lunes", "martes", "miércoles", "jueves", "viernes", "sábado", "domingo"))
 
df_combinado <- df_combinado[order(df_combinado$week_day),]

Observaciones: Los vuelos que salen los jueves tienen más retrasos que los que salen otros días de la semana. Esto se debe a que la demanda de viajes y la congestión son más altas durante los días laborables, lo que contribuye a los mayores retrasos en los vuelos. Al mirar los datos, se puede ver que el retraso promedio de salida los jueves fue de 16.1 minutos, y que la proporción de vuelos retrasados fue de 41.8%, lo que son los valores más altos entre todos los días de la semana. Por el contrario, los sábados tuvieron el menor retraso promedio de salida con 7.65 minutos, y la menor proporción de vuelos retrasados con 34.1%. Los otros días se ubicaron entre estos extremos, con los lunes, los viernes y los domingos teniendo retrasos y proporciones más altas que los martes y los miércoles.

ggplot(df_combinado, aes(x = week_day, y = dep_delay, fill = origin)) +
  geom_bar(stat = "summary", fun = "mean", position = "stack") +
  labs(x = "Día de la semana", y = "Retraso promedio", fill = "Aeoropuerto") +
  ggtitle("Retraso promedio por día de la semana y aeropuerto") +
  scale_fill_brewer(palette = "Set3") +
  theme_minimal()
## Warning: Removed 8255 rows containing non-finite outside the scale range
## (`stat_summary()`).

summary_delay_week <- df_combinado %>%
  group_by(week_day) %>%
  summarise(avg_delay = mean(dep_delay, na.rm = TRUE),
            total_flights = n(),
            total_delayed_flights = sum(dep_delay > 0, na.rm = TRUE),
            perc_delayed_flights = total_delayed_flights / total_flights * 100)

summary_delay_week
## # A tibble: 1 × 5
##   week_day avg_delay total_flights total_delayed_flights perc_delayed_flights
##   <fct>        <dbl>         <int>                 <int>                <dbl>
## 1 <NA>          12.6        336776                128432                 38.1

Se puede observar que todas las variables independientes tienen un p-valor menor que 0.001, lo que implica que todas las variables independientes tienen un efecto estadísticamente significativo sobre el retraso medio de salida.

5.3 Conclusiones

En el segundo avance se realiza un análisis de regresión lineal para explorar la relación entre diversas variables y el retraso en los vuelos. Además, se examinan variables relacionadas principalmente con el clima y el día de la semana para identificar posibles factores que influyen en los retrasos de los vuelos.

El análisis de regresión lineal proporciona información sobre la relación entre las variables predictoras, como el aeropuerto de origen, clima, hora, y variable de respuesta, que sería el retraso en los vuelos. Este análisis permite identificar que factores pueden tener un impacto significativo en los retrasos de los vuelos y como se relacionan entre sí.

5.3.1 Estrategias

Basándonos en los hallazgos, proponemos una serie de estrategias para abordar los retrasos en la salida de vuelos.

En primer lugar, es crucial optimizar la gestión del tráfico aéreo en aeropuertos congestionados como el Aeropuerto Internacional Libertad de Newark (EWR). Esto implica implementar medidas que distribuyan de manera más eficiente los vuelos y horarios, especialmente durante las horas pico, con el objetivo de reducir la saturación.

Además, es necesario desarrollar programas de mantenimiento preventivo para garantizar la fiabilidad de la flota de aviones. Estos programas ayudarían a reducir las interrupciones causadas por problemas técnicos inesperados, también se podría invertir en la modernización de la flota de aviones, incorporando tecnologías más avanzadas y eficientes, sería fundamental para minimizar el riesgo de fallos y mejorar el rendimiento operativo.

Otra estrategia importante es mejorar la planificación de rutas y horarios, teniendo en cuenta las condiciones meteorológicas históricas, especialmente durante los meses de mayor cantidad de retrasos, esto podría implicar la reasignación de rutas según la previsión del tiempo para minimizar las interrupciones.

Además, se podría distribuir de manera más equitativa los vuelos a lo largo del año, evitando períodos de congestión durante los meses de mayor demanda. Esto podría lograrse mediante incentivos para viajar en momentos de menor demanda o ajustes en las tarifas según la temporada.

Para los días de alta demanda, se podría implementar medidas operativas específicas, como el uso de puertas de embarque adicionales, personal de tierra adicional y horarios de turnos flexibles, con esto se agilizaría los procesos de embarque y desembarque, mejorando la eficiencia operativa.

Por otro lado, es esencial invertir en tecnología de pronóstico del tiempo avanzada y sistemas de alerta temprana para identificar y mitigar potenciales interrupciones debido a condiciones meteorológicas adversas, lo cual permitiría una mejor toma de decisiones operativas.

6 Avance 3

6.1 Modelo entidad relacional

# aerolínea, aeropuerto de origen y aeropuerto destino por vuelo
df1 <- flights %>% 
  select(carrier, origin, dest)

df1
## # A tibble: 336,776 × 3
##    carrier origin dest 
##    <chr>   <chr>  <chr>
##  1 UA      EWR    IAH  
##  2 UA      LGA    IAH  
##  3 AA      JFK    MIA  
##  4 B6      JFK    BQN  
##  5 DL      LGA    ATL  
##  6 UA      EWR    ORD  
##  7 B6      EWR    FLL  
##  8 EV      LGA    IAD  
##  9 B6      JFK    MCO  
## 10 AA      LGA    ORD  
## # ℹ 336,766 more rows
# nombre de cada aerolinea
df2 <- df1 %>% 
  left_join(airlines, by= "carrier")

df2
## # A tibble: 336,776 × 4
##    carrier origin dest  name                    
##    <chr>   <chr>  <chr> <chr>                   
##  1 UA      EWR    IAH   United Air Lines Inc.   
##  2 UA      LGA    IAH   United Air Lines Inc.   
##  3 AA      JFK    MIA   American Airlines Inc.  
##  4 B6      JFK    BQN   JetBlue Airways         
##  5 DL      LGA    ATL   Delta Air Lines Inc.    
##  6 UA      EWR    ORD   United Air Lines Inc.   
##  7 B6      EWR    FLL   JetBlue Airways         
##  8 EV      LGA    IAD   ExpressJet Airlines Inc.
##  9 B6      JFK    MCO   JetBlue Airways         
## 10 AA      LGA    ORD   American Airlines Inc.  
## # ℹ 336,766 more rows
# cantidad de vuelos por cada destino
df3 <- flights %>% 
  group_by(carrier) %>% 
  summarise(num_flights= n()) %>% 
  arrange(desc(num_flights))

df3
## # A tibble: 16 × 2
##    carrier num_flights
##    <chr>         <int>
##  1 UA            58665
##  2 B6            54635
##  3 EV            54173
##  4 DL            48110
##  5 AA            32729
##  6 MQ            26397
##  7 US            20536
##  8 9E            18460
##  9 WN            12275
## 10 VX             5162
## 11 FL             3260
## 12 AS              714
## 13 F9              685
## 14 YV              601
## 15 HA              342
## 16 OO               32
# nombre aerolinea
df4 <- df3 %>% 
  left_join(airlines, by= "carrier")


df4
## # A tibble: 16 × 3
##    carrier num_flights name                       
##    <chr>         <int> <chr>                      
##  1 UA            58665 United Air Lines Inc.      
##  2 B6            54635 JetBlue Airways            
##  3 EV            54173 ExpressJet Airlines Inc.   
##  4 DL            48110 Delta Air Lines Inc.       
##  5 AA            32729 American Airlines Inc.     
##  6 MQ            26397 Envoy Air                  
##  7 US            20536 US Airways Inc.            
##  8 9E            18460 Endeavor Air Inc.          
##  9 WN            12275 Southwest Airlines Co.     
## 10 VX             5162 Virgin America             
## 11 FL             3260 AirTran Airways Corporation
## 12 AS              714 Alaska Airlines Inc.       
## 13 F9              685 Frontier Airlines Inc.     
## 14 YV              601 Mesa Airlines Inc.         
## 15 HA              342 Hawaiian Airlines Inc.     
## 16 OO               32 SkyWest Airlines Inc.
# nuevo campo

df5 <- flights %>%
  select(carrier, dest, sched_dep_time) %>% 
  left_join(airlines, by= "carrier")

hora <- df5 %>% 
  mutate(clas_horario = case_when(
                      between(sched_dep_time, 600, 1159) ~ "Mañana",
                      between(sched_dep_time, 1200, 1859) ~ "Tarde",
                      between(sched_dep_time, 1900, 2400) ~ "Noche",
                      TRUE ~ "Madrugada"
                    ))

hora
## # A tibble: 336,776 × 5
##    carrier dest  sched_dep_time name                     clas_horario
##    <chr>   <chr>          <int> <chr>                    <chr>       
##  1 UA      IAH              515 United Air Lines Inc.    Madrugada   
##  2 UA      IAH              529 United Air Lines Inc.    Madrugada   
##  3 AA      MIA              540 American Airlines Inc.   Madrugada   
##  4 B6      BQN              545 JetBlue Airways          Madrugada   
##  5 DL      ATL              600 Delta Air Lines Inc.     Mañana      
##  6 UA      ORD              558 United Air Lines Inc.    Madrugada   
##  7 B6      FLL              600 JetBlue Airways          Mañana      
##  8 EV      IAD              600 ExpressJet Airlines Inc. Mañana      
##  9 B6      MCO              600 JetBlue Airways          Mañana      
## 10 AA      ORD              600 American Airlines Inc.   Mañana      
## # ℹ 336,766 more rows
# cantidad de vuelos por aerolinea y hora
df6 <- hora %>%
  group_by(carrier, dest, clas_horario) %>%
  summarise(num_flights = n()) %>%
  arrange(carrier, dest, clas_horario)
## `summarise()` has grouped output by 'carrier', 'dest'. You can override using
## the `.groups` argument.
df6
## # A tibble: 741 × 4
## # Groups:   carrier, dest [314]
##    carrier dest  clas_horario num_flights
##    <chr>   <chr> <chr>              <int>
##  1 9E      ATL   Mañana                59
##  2 9E      AUS   Tarde                  2
##  3 9E      AVL   Mañana                10
##  4 9E      BGR   Noche                  1
##  5 9E      BNA   Mañana                 6
##  6 9E      BNA   Noche                  1
##  7 9E      BNA   Tarde                467
##  8 9E      BOS   Mañana               271
##  9 9E      BOS   Noche                 94
## 10 9E      BOS   Tarde                549
## # ℹ 731 more rows
# vuelos de American Airlines durante la maddrugrada
df7 <- hora %>%
  select(carrier,name, dest,clas_horario) %>% 
  filter(carrier == "AA", clas_horario == "Madrugada") %>% 
  group_by(carrier,name, dest,clas_horario)

df7
## # A tibble: 365 × 4
## # Groups:   carrier, name, dest, clas_horario [1]
##    carrier name                   dest  clas_horario
##    <chr>   <chr>                  <chr> <chr>       
##  1 AA      American Airlines Inc. MIA   Madrugada   
##  2 AA      American Airlines Inc. MIA   Madrugada   
##  3 AA      American Airlines Inc. MIA   Madrugada   
##  4 AA      American Airlines Inc. MIA   Madrugada   
##  5 AA      American Airlines Inc. MIA   Madrugada   
##  6 AA      American Airlines Inc. MIA   Madrugada   
##  7 AA      American Airlines Inc. MIA   Madrugada   
##  8 AA      American Airlines Inc. MIA   Madrugada   
##  9 AA      American Airlines Inc. MIA   Madrugada   
## 10 AA      American Airlines Inc. MIA   Madrugada   
## # ℹ 355 more rows
# aviones de American Airlines
df8 <- flights %>%
  left_join(planes, by = "tailnum") %>%
  filter(carrier == "AA" & !is.na(type)) %>%
  group_by(carrier, type, engine, seats) %>%
  summarise(num_flights = n()) %>%
  arrange(desc(num_flights))
## `summarise()` has grouped output by 'carrier', 'type', 'engine'. You can
## override using the `.groups` argument.
df8
## # A tibble: 22 × 5
## # Groups:   carrier, type, engine [6]
##    carrier type                     engine        seats num_flights
##    <chr>   <chr>                    <chr>         <int>       <int>
##  1 AA      Fixed wing multi engine  Turbo-fan       255        4257
##  2 AA      Fixed wing multi engine  Turbo-fan       172        3857
##  3 AA      Fixed wing multi engine  Turbo-fan       178         501
##  4 AA      Fixed wing single engine Reciprocating     2         463
##  5 AA      Fixed wing multi engine  Turbo-fan       330         450
##  6 AA      Fixed wing multi engine  Reciprocating     8          92
##  7 AA      Fixed wing single engine Reciprocating     7          63
##  8 AA      Fixed wing single engine Reciprocating    16          63
##  9 AA      Fixed wing single engine Reciprocating     4          56
## 10 AA      Fixed wing single engine 4 Cycle           4          45
## # ℹ 12 more rows

6.2 Visualización de datos

6.2.1 Análisis de retrasos en la aerolínea American Airlines: Partida vs Llegada

plot(flights$dep_delay, flights$arr_delay,
     main = "Análisis de retrasos en la partida y llegada para American Airlines",
     xlab = "Retrasos en la partida",
     ylab = "retrasos en la llegada",
     col = "blue",
     pch = 1
     )

Observaciones: Existe una correlación positiva entre los retrasos en la partida y los retrasos en la llegada para American Airlines. Esto significa que los vuelos que se retrasan al partir también tienden a llegar tarde a sus destinos, lo que implica una falta de eficiencia y puntualidad en el servicio de la aerolínea. Esto se puede observar en la gráfica de dispersión que acompaña la observación, donde se muestra una clara relación positiva entre los dos ejes. Además, se pueden mencionar algunos factores externos que podrían influir en los retrasos simultáneos, como el clima, el tráfico aéreo o problemas técnicos.

6.2.2 Tendencia de la temperatura en los primeros 15 días de enero desde Newark (EWR)

temp_promedio <- flight_weather %>%
  filter(origin == "EWR") %>%
  mutate(date = as.Date(paste(year, month, day, sep = "-"))) %>%
  select(date, celcius) %>%
  group_by(date) %>%
  summarise(temp_promedio = mean(celcius, na.rm = TRUE))

temp_promedio_enero <- temp_promedio %>%
  filter(between(date, as.Date("2013-01-01"), as.Date("2013-01-15")))

plot(temp_promedio_enero$date, temp_promedio_enero$temp_promedio, 
     type = "l",
     main = "Temperatura durante los primeros 15 días de enero en (Newark)",
     xlab = "Fecha",
     ylab = "Temperatura Promedio (C°)")

Observaciones: La temperatura promedio durante los primeros 15 días de enero en Newark es variable y depende de varios factores meteorológicos. Esto implica que el clima de Newark es inestable y cambiante, lo que sugiere que hay una influencia de las condiciones atmosféricas locales y regionales en la temperatura de la ciudad. Esto se puede observar en la gráfica de línea que acompaña la observación, donde se muestra la fluctuación de la temperatura promedio entre 4 y 12 grados.

6.2.3 Temperatura más frecuente en los primeros 15 días de enero

weather_enero <- flight_weather %>%
  filter(month == 1, day >= 1, day <= 15)

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

temp_promedio <- weather_enero %>%
  group_by(date) %>%
  summarize(temp_promedio = mean(celcius, na.rm = TRUE))

ggplot(data = temp_promedio, aes(x = temp_promedio)) +
  geom_histogram(binwidth = 5, fill = "skyblue", color = "black") +
  labs(title = "Histograma de Promedio de Temperaturas del 1 al 15 de Enero",
       x = "Promedio de Temperatura (C°)",
       y = "Frecuencia")

Observaciones: La temperatura promedio durante los primeros 15 días de enero es relativamente constante y se concentra entre 0 y 10 grados. Esto implica que el clima es moderado y poco variable, además, sugiere que hay una menor influencia de los factores meteorológicos extremos en la temperatura. Esto puede observar en el histograma que acompaña la observación, donde se muestra la frecuencia de las temperaturas promedio entre 0 y 10 grados. La mayor parte de los datos se agrupan en torno a los 5 grados, lo que indica una tendencia central y una baja dispersión.

6.2.4 Variación mensual de temperatura

ggplot(data = flight_weather, aes(x = celcius)) +
  geom_histogram(binwidth = 5, color = "blue") +
  facet_wrap(~ month, nrow = 4)
## Warning: Removed 17 rows containing non-finite outside the scale range
## (`stat_bin()`).

6.2.5 Número de vuelos desde Nueva York por aerolínea en 2013

flights_table <- flights %>% 
  group_by(carrier) %>% 
  summarize(number = n())
         
ggplot(data = flights_table, mapping = aes(x = carrier, y = number)) +
  geom_col()

6.2.6 Distribución de vuelos desde Nueva York por aerolínea en 2013

pie(flights_table$number,
    labels = flights_table$carrier,
    main = "Proporción de vuelos por aerolínea",
    col = rainbow(length(flights_table$carrier)),
    cex = 0.8)

6.2.7 Relación entre los dataframes ‘flights’ y ‘airports’ a través del campo destino

top_carriers <- flights %>% 
  inner_join(airports, by = c("origin"))

6.2.8 Dataframe filtrado con los 5 carriers con más vuelos por destino

ggplot(data = top_carriers, mapping = aes(x = carrier, fill = name)) +
  geom_bar()

ggplot(data = top_carriers, mapping = aes(x = carrier, fill = name)) +
  geom_bar(position = "dodge")

ggplot(data = top_carriers, mapping = aes(x = carrier, fill = name)) +
  geom_bar() +
  facet_grid(name ~ .)

Observaciones: UA fue el carrier con más vuelos en 2013, seguido por B6 y EV, mientras que F9, FL y HA fueron los que menos vuelos tuvieron. Esto significa que UA fue el carrier más demandado y con mayor oferta de servicios aéreos en 2013, por el contrario, F9, FL y HA fueron los carriers menos solicitados y con menor disponibilidad de vuelos, lo que puede indicar su ineficacia o falta de competitividad.Esto se puede observar en la gráfica de barras que acompaña la observación, donde se muestra el número de count por carrier en 2013, según la gráfica, el carrier UA tuvo un count de alrededor de 59,000, el B6 tuvo un count de 54,000, el EV tuvo un count de alrededor de 51,000, el F9 tuvo un count de alrededor de 4,000, el FL tuvo un count de 3,00 y el HA tuvo un count de alrededor 3,060. Estos números confirman la gran diferencia entre los carriers más y menos frecuente.

UA fue el carrier con más vuelos en Newark Liberty Intl, B6 fue el carrier con más vuelos en John F Kennedy Intl y DL fue el carrier con más vuelos en La Guardia en 2013. Esto significa que cada carrier tiene una preferencia en determinado aeropuerto, lo que sugiere que hay una diversidad de opciones para los pasajeros que viajan desde o hacia estos aeropuertos. Esto se puede observar en la gráfica de barras que acompaña la observación, donde se muestra el número de count por carrier en tres aeropuertos diferentes: John F Kennedy Intl (rojo), La Guardia (verde) y Newark Liberty Intl (azul). Según la gráfica, el carrier UA tuvo alrededor de 55,000 vuelos en Newark Liberty Intl, el B6 tuvo alrededor de 45,000 vuelos en John F Kennedy Intl y el EV tuvo alrededor de 55,000 vuelos en Newark Liberty Intl. Estos números confirman la diferencia entre los carriers en cada aeropuerto.

6.3 Conclusiones

El avance final presenta un modelo entidad-relación que muestra la relación entre los datos de vuelos, aerolíneas y aeropuertos, así como visualizaciones que proporcionan información adicional sobre los datos y relaciones identificadas.

El modelo revela cómo se relacionan los datos de vuelos con información de aerolíneas y aeropuertos, lo que permite entender mejor la distribución de vuelos, la frecuencia de vuelos por aerolínea, los patrones de temperatura y la relación entre los vuelos y los aeropuertos de origen y destino.

Se muestran consultas que combinan datos de vuelos con información de aerolíneas y aeropuertos, así como gráficos que representan la distribución de vuelos por aerolínea, la variación de la temperatura a lo largo del tiempo y la relación entre los vuelos y los aeropuertos.

6.4 Conclusiones compromiso ético y ciudadano

6.4.1 Oved Ruiz Guzmán

La integridad es la forma que tenemos al actual, es decir de forma honesta, ética y coherente con nuestros valores morales. La integridad es un pilar fundamental en cualquier disciplina profesional, especialmente en el manejo de datos, donde implica actuar de manera honesta, ética y coherente con nuestros valores morales. Datos.gob.es (2017) señala que “la ética debe permear todas las etapas del ciclo de vida y gestión de los datos, asegurando que la recolección sea imparcial y transparente para evitar la exclusión de grupos y posibles discriminaciones en usos posteriores”, es decir, es escencial respetar la privacidad y confidencialidad de los datos, así como ser imparciales con esta.

Por otro lado, es importante que cada organización establezca sus propias pautas éticas específicas para el uso de los datos, como señala datos.gob.es (2017). Esto implica una gran responsabilidad ética en el manejo de la información empresarial, ya que su mal uso puede tener consecuencias negativas tanto para la organización como para los individuos involucrados.

Además, como menciona Oracle Cloud (s.f), “los datos empresariales son un activo valioso que permite identificar tendencias, tomar decisiones informadas y mantener la ventaja competitiva”. Sin embargo, es importante recordar que esta disponibilidad de información conlleva una responsabilidad ética significativa en cuanto a su manejo y utilización.

6.4.2 María Sáenz Parás

Me parece que la integridad es escencial para mantener confianza, es así como mi integridad como estudiante y sobre todo en el campo de ciencia de datos ofrece seguridad en resultados y el uso ético de la información, basándose en la transparencia y responsabilidad. Esto implica mostrar la información completa y clara sobre los métodos utilizados y la fuente de los datos. Para mi, el tener acceso a la información de una empresa conlleva una gran responsabilidad tanto legal como ética; esta debe tratarse con confidencialidad y respeto a la privacidad. El uso inadecuado de esta puede llevar a consecuencias legales y daños a la reputación, no solo de la empresa, sino de la persona que la utiliza. Finalmente, se deben de tomar desiciones de manera imparcial, considerando su impacto en todas las partes involucradas.

Bibliografía: +Giner, G. J. (2021). La importancia de la ética en los negocios. Revista Escuela de Negocios de la UEMC. +Provost, F., & Fawcett, T. (2013). Data Science for Business: What You Need to Know about Data Mining and Data-Analytic Thinking. +Dhar, V.(2015). Data science and prediction. Communications of the ACM, 64-73.

6.4.3 Pablo Sancho

Despues de realizar esta situación problema, personalmente llegue a la conclusión de que usando diferentes herramientas dentro de R, se pueden realizar analisis de gran calidad y exactitud. Lo importante es saber usar estas herramientas tecnológicas para que las empresas puedan sacar provecho de las mismas (2019). Obviamente, esto siempre debe ser teniendo un cuidado importante cuando se trata de los datos, ya que estos deben ser tratados con mucho cuidado, ya que son herramientas importantes y valiosas para las empresas (2019). Por ultimo, también logre reflexionar que cuando se trata de trabajar con código, lo mas importante es la paciencia y la atención, porque el mas minimo error nos puede causar muchisimos problemas y una gran cantidad de conflictos.

Bibliografía + Monster Digital Agency. “La importancia de la programación en la actualidad.” Epitech Spain, 25 Aug. 2022, https://www.epitech-it.es/la-importancia-de-la-programacion/. + Santander, Banco. “Integridad.” Banco Santander, https://www.bancosantander.es/glosario/integridad-seguridad-online. + Unir, Vive. “Lenguaje R, ¿qué es y por qué es tan usado en big data?” UNIR, 29 Nov. 2019,

LS0tCnRpdGxlOiAiPHNwYW4gc3R5bGU9J2NvbG9yOiM1RjlFQTA7Jz5TaXR1YWNpw7NuIHByb2JsZW1hOiDCv0PDs21vIG1lam9yYXIgbGEgcG9zaWNpw7NuIGNvbXBldGl0aXZhIGRlIHVuYSBkZSBsYXMgYWVyb2zDrW5lYXMgbMOtZGVyZXMgZW4gbG9zIGFlcm9wdWVydG9zIGRlIE51ZXZhIFlvcms/PC9zcGFuPiIKYXV0aG9yOiAiT3ZlZCBSdWl6IEd1em3DoW4gKEEwMTE3NDQzNSksIE1hcsOtYSBTw6FlbnogUGFyw6FzIChBMDA4Mzc0OTUpLCBQYWJsbyBTYW5jaG8gKEEwMTcyMjIzNikiCmRhdGU6ICIyMDI0LTAzLTEyIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZSAKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgdGhlbWU6IGpvdXJuYWwKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQplZGl0b3JfczogCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGNvbnNvbGUKZWRpdG9yX29wdGlvbnM6IAogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlCi0tLQoKIVtdKC9Vc2Vycy9wYWJsb3NhbmNoby9EZXNrdG9wL2FpcnBsYW5lLnBuZykKCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiM1MjhCOEI7Ij5Db250ZXh0bzwvc3Bhbj4gIAoKRWwgcGFxdWV0ZSAqKm55Y2ZsaWdodHMxMyoqIGNvbnRpZW5lIGluZm9ybWFjacOzbiBzb2JyZSB0b2RvcyBsb3MgdnVlbG9zIHF1ZSBwYXJ0aWVyb24gZGVzZGUgTnVldmEgWW9yayAoSkZLLCBMR0EsIEVXUikgYSBkZXN0aW5vcyBlbiBsb3MgRXN0YWRvcyBVbmlkb3MgZW4gMjAxMy5GdWVyb24gMzM2LDc3NiB2dWVsbyBlbiB0b3RhbC4gUGFyYSBheXVkYXIgYSBjb21wcmVuZGVyIGxhcyBjYXVzYXMgZGUgbG9zIHJldHJhc29zIHRhbWJpw6luIGluY2x1eWUgb3RybyBjb25qdW50byBkZSBkYXRvcyDDunRpbGVzLiAgCgpFc3RlIHBhcXVldGUgaW5jbHV5ZSBsYXMgc2lndWllbnRlcyB0YWJsYXM6ICAKCisgZmxpZ2h0cyA9IHRvZG9zIGxvcyB2dWVsb3MgcXVlIHNhbGllcm9uIGRlIE51ZXZhIFlvcmsgZW4gMjAxMy4gIAorIHdlYXRoZXIgPSBkYXRvcyBtZXRlb3JvbMOzZ2ljb3MgcG9yIGhvcmEgZGUgY2FkYSBhZXJvcHVlcnRvLiAgCisgcGxhbmVzID0gaW5mb3JtYWNpw7NuIGRlIGNvbnN0cnVjY2nDs24gZGUgY2FkYSBhdmnDs24uICAKKyBhaXJwb3J0cyA9IG5vbWJyZXMgeSB1YmljYWNpb25lcyBkZSBhZXJvcHVlcnRvcy4gIAorIGFpcmxpbmVzID0gcmVsYWNpb24gZW50cmUgbm9tYnJlcyB5IGPDs2RpZ29zIGRlIGxhcyBhZXJvbGluZWFzICAKCkZ1ZW50ZTogIAoKW09yaWdlbiBkZSBsb3MgZGF0b3NdKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9ueWNmbGlnaHRzMTMvbnljZmxpZ2h0czEzLnBkZikKCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiM2OThCNjk7Ij5DYXJnYXIgbGlicmVyaWFzPC9zcGFuPgoKYGBge3J9CmxpYnJhcnkobnljZmxpZ2h0czEzKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShkcGx5cikKYGBgCgojIDxzcGFuIHN0eWxlPSJjb2xvcjojOEIzQTYyOyI+R3VhcmRhciBiYXNlcyBkZSBkYXRvczwvc3Bhbj4KCmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1GQUxTRX0KZmxpZ2h0cyA8LSBmbGlnaHRzCndlYXRoZXIgPC0gd2VhdGhlcgpwbGFuZXMgPC0gcGxhbmVzCmFpcnBvcnRzIDwtIGFpcnBvcnRzCmFpcmxpbmVzIDwtIGFpcmxpbmVzCmBgYAoKYGBge3J9CmFpcnBvcnRzIDwtIHJlbmFtZShhaXJwb3J0cywgIm9yaWdpbiI9ICJmYWEiKQpgYGAKCgpgYGB7cn0KYmRncmFuZGUgPC0gbWVyZ2UoZmxpZ2h0cywgYWlybGluZXMsIGJ5PSJjYXJyaWVyIikKYmRncmFuZGUyIDwtIGxlZnRfam9pbihiZGdyYW5kZSwgcGxhbmVzLCBieT0idGFpbG51bSIpCmJkZ3JhbmRlMyA8LSBsZWZ0X2pvaW4oYmRncmFuZGUyLCB3ZWF0aGVyLCBieT0gYygib3JpZ2luIiwgInRpbWVfaG91ciIpKQoKYmRncmFuZGUzJGRhdGUgPC0gYXMuRGF0ZShwYXN0ZShiZGdyYW5kZTMkeWVhci54LGJkZ3JhbmRlMyRtb250aC54LCBiZGdyYW5kZTMkZGF5LngsIHNlcCA9ICItIikpCmJkZ3JhbmRlMyR3ZWVrX2RheSA8LSB3ZWVrZGF5cyhiZGdyYW5kZTMkZGF0ZSkgCgpiZGdyYW5kZTMgPC0gcmVuYW1lKGJkZ3JhbmRlMywgIm9yaWdpbiIgPSAib3JpZ2luIiwgIm1vbnRoIiA9ICJtb250aC54IiwgImRheSIgPSAiZGF5LngiKQoKYmRncmFuZGU0IDwtIGxlZnRfam9pbihiZGdyYW5kZTMsIGFpcnBvcnRzLCBieT0gIm9yaWdpbiIpCgpkZl9jb21iaW5hZG8gPC0gYmRncmFuZGU0ICU+JQogIHNlbGVjdCgtd2luZF9ndXN0LCAtbWFudWZhY3R1cmVyLCAtZW5naW5lcywgLXNlYXRzLCAtYXJyX3RpbWUsIC1zY2hlZF9hcnJfdGltZSkKCmBgYAoKIyA8c3BhbiBzdHlsZT0iY29sb3I6I0VFRTBFNTsiPkF2YW5jZSAxPC9zcGFuPiAKCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjojQ0RDNjczOyI+RXhwbG9yYWNpw7NuIGRlIGxhIGJhc2UgZGUgZGF0b3M8L3NwYW4+CgojIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiM5QUMwQ0Q7Ij5GbGlnaHRzPC9zcGFuPgoKYGBge3J9CnN0cihmbGlnaHRzKQpuY29sKGZsaWdodHMpCm5yb3coZmxpZ2h0cykKZGltKGZsaWdodHMpCmhlYWQoZmxpZ2h0cykKdGFpbChmbGlnaHRzKQpzdW1tYXJ5KGZsaWdodHMpCmBgYAoKIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjojQjRDRENEOyI+V2VhdGhlcjwvc3Bhbj4KCmBgYHtyfQpzdHIod2VhdGhlcikKbmNvbCh3ZWF0aGVyKQpucm93KHdlYXRoZXIpCmRpbSh3ZWF0aGVyKQpoZWFkKHdlYXRoZXIpCnRhaWwod2VhdGhlcikKc3VtbWFyeSh3ZWF0aGVyKQpgYGAKCiMjIyA8c3BhbiBzdHlsZT0iY29sb3I6I0NEOEM5NTsiPlBsYW5lczwvc3Bhbj4KCmBgYHtyfQpzdHIocGxhbmVzKQpuY29sKHBsYW5lcykKbnJvdyhwbGFuZXMpCmRpbShwbGFuZXMpCmhlYWQocGxhbmVzKQp0YWlsKHBsYW5lcykKc3VtbWFyeShwbGFuZXMpCmBgYAoKIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjojNkU3QjhCOyI+QWlycG9ydHM8L3NwYW4+CgpgYGB7cn0Kc3RyKGFpcnBvcnRzKQpuY29sKGFpcnBvcnRzKQpucm93KGFpcnBvcnRzKQpkaW0oYWlycG9ydHMpCmhlYWQoYWlycG9ydHMpCnRhaWwoYWlycG9ydHMpCnN1bW1hcnkoYWlycG9ydHMpCmBgYAoKIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjojRUVENUQyOyI+QWlybGluZXM8L3NwYW4+CgpgYGB7cn0Kc3RyKGFpcmxpbmVzKQpuY29sKGFpcmxpbmVzKQpucm93KGFpcmxpbmVzKQpkaW0oYWlybGluZXMpCmhlYWQoYWlybGluZXMpCnRhaWwoYWlybGluZXMpCnN1bW1hcnkoYWlybGluZXMpCmBgYAoKKirCv0N1w6FsZXMgc29uIGxvcyBjYW1wb3MgeSBzdXMgdGlwb3MgZGUgZGF0b3M/KiogIAoKZmxpZ2h0czogIAoKKyB5ZWFyOiBFbnRlcm8gIAorIG1vbnRoOiBFbnRlcm8gIAorIGRheTogRW50ZXJvICAKKyBkZXBfdGltZTogRW50ZXJvICAKKyBzY2hlZF9kZXBfdGltZTogRW50ZXJvICAKKyBkZXBfZGVsYXk6IE51bcOpcmljbyAgCisgYXJyX3RpbWU6IEVudGVybyAgCisgc2NoZWRfYXJyX3RpbWU6IEVudGVybyAgCisgYXJyX2RlbGF5OiBOdW3DqXJpY28gIAorIGNhcnJpZXI6IENhcmFjdGVyCisgZmxpZ2h0OiBFbnRlcm8gIAorIHRhaWxudW06IENhcmFjdGVyICAKKyBvcmlnaW46IENhcmFjdGVyCisgZGVzdDogQ2FyYWN0ZXIKKyBhaXJfdGltZTogTnVtw6lyaWNvCisgZGlzdGFuY2U6IE51bcOpcmljbworIGhvdXI6IE51bcOpcmljbworIG1pbnV0ZTogTnVtw6lyaWNvCisgdGltZV9ob3VyOiBGZWNoYSB5IGhvcmEgIAoKd2VhdGhlcjogIAoKKyBvcmlnaW46IENhcmFjdGVyCisgeWVhcjogRW50ZXJvCisgbW9udGg6IEVudGVybworIGRheTogRW50ZXJvCisgaG91cjogRW50ZXJvCisgdGVtcDogTnVtw6lyaWNvCisgZGV3cDogTnVtw6lyaWNvCisgaHVtaWQ6IE51bcOpcmljbworIHdpbmRfZGlyOiBOdW3DqXJpY28KKyB3aW5kX3NwZWVkOiBOdW3DqXJpY28KKyB3aW5kX2d1c3Q6IE51bcOpcmljbworIHByZWNpcDogTnVtw6lyaWNvCisgcHJlc3N1cmU6IE51bcOpcmljbworIHZpc2liOiBOdW3DqXJpY28KKyB0aW1lX2hvdXI6IEZlY2hhIHkgaG9yYSAgCgpwbGFuZXM6ICAKCisgdGFpbG51bTogQ2FyYWN0ZXIKKyB5ZWFyOiBFbnRlcm8KKyB0eXBlOiBDYXJhY3RlcgorIG1hbnVmYWN0dXJlcjogQ2FyYWN0ZXIKKyBtb2RlbDogQ2FyYWN0ZXIKKyBlbmdpbmVzOiBFbnRlcm8KKyBzZWF0czogRW50ZXJvCisgc3BlZWQ6IEVudGVybworIGVuZ2luZTogQ2FyYWN0ZXIgIAoKYWlycG9ydHM6ICAKCisgZmFhOiBDYXJhY3RlcgorIG5hbWU6IENhcmFjdGVyCisgbGF0OiBOdW3DqXJpY28KKyBsb246IE51bcOpcmljbworIGFsdDogTnVtw6lyaWNvCisgdHo6IE51bcOpcmljbworIGRzdDogQ2FyYWN0ZXIKKyB0em9uZTogQ2FyYWN0ZXIKCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjojOEI0Nzg5OyI+TWFuaXB1bGFjacOzbiBkZSBkYXRvczwvc3Bhbj4KCmBgYHtyfQojIGRlc3QgJiBvcmlnaW4Kc3VtbWFyeShmbGlnaHRzJGRpc3RhbmNlKQpgYGAKCmBgYHtyfQojIEFlcmxpbmVhcyBkZSBtYXlvciB0csOhZmljbyBhw6lyZW8gZW4gb3JpZ2VuIHkgZGVzdGlubwpkZiA8LSBmbGlnaHRzICU+JSAKICBzZWxlY3QoY2FycmllciwgZGlzdGFuY2UsIG9yaWdpbiwgZGVzdCkgJT4lCiAgZmlsdGVyKGRpc3RhbmNlID4gbWVhbihkaXN0YW5jZSwgbmEucm09IFRSVUUpKSAlPiUgCiAgYXJyYW5nZShkZXNjKGRpc3RhbmNlKSkKCmRmMSA8LSBkZiAlPiUgCiAgZ3JvdXBfYnkoY2Fycmllciwgb3JpZ2luLCBkZXN0KSAlPiUgCiAgc3VtbWFyaXNlKHN1bWFfZGlzdGFuY2lhPSBzdW0oZGlzdGFuY2UsIG5hLnJtPSBUUlVFKSwgCiAgICAgICAgICAgIG1lZGlhX2Rpc3RhbmNpYT0gbWVhbihkaXN0YW5jZSwgbmEucm09IFRSVUUpKSAlPiUgCiAgICBhcnJhbmdlKGRlc2MoY2FycmllciksIGRlc2Moc3VtYV9kaXN0YW5jaWEpKQoKYGBgCgpgYGB7cn0KZGZfSkZLIDwtIGRmMSAlPiUgCiAgZmlsdGVyKG9yaWdpbiA9PSAiSkZLIikgJT4lIAogIGFycmFuZ2UoY2FycmllciwgZGVzYyhzdW1hX2Rpc3RhbmNpYSkpCgpkZl9KRksKCmRmX0xHQSA8LSBkZjEgJT4lIAogIGZpbHRlcihvcmlnaW4gPT0gIkxHQSIpICU+JSAKICBhcnJhbmdlKGNhcnJpZXIsIGRlc2Moc3VtYV9kaXN0YW5jaWEpKQoKZGZfTEdBCgpkZl9FV1IgPC0gZGYxICU+JSAKICBmaWx0ZXIob3JpZ2luID09ICJFV1IiKSAlPiUgCiAgYXJyYW5nZShjYXJyaWVyLCBkZXNjKHN1bWFfZGlzdGFuY2lhKSkKCmRmX0VXUgpgYGAKCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogI0NEOTE5RTsiPkNvbmNsdXNpb25lczwvc3Bhbj4KCkVsIGF2YW5jZSAxIG11ZXN0cmEgZWwgY29udGV4dG8gZGVsIHBhcXVldGUgKioibnljZmxpZ2h0czEzIioqLCBxdWUgY29udGllbmUgZGF0b3Mgc29icmUgbG9zIHZ1ZWxvcyBxdWUgcGFydGllcm9uIGRlIE51ZXZhIFlvcmsgZW4gMjAxMywgYXPDrSBjb21vIGluZm9ybWFjacOzbiBtZXRlb3JvbMOzZ2ljYSwgZGV0YWxsZXMgc29icmUgYXZpb25lcywgYWVyb3B1ZXJ0b3MgeSBhZXJvbMOtbmVhcy4gQWRlbcOhcywgc2UgZXhwbG9yYW4gbGFzIGJhc2VzIGRlIGRhdG9zIHkgc2UgcmVhbGl6YSB1bmEgbWFuaXB1bGFjacOzbiBpbmljaWFsIGRlIGxvcyBkYXRvcy4gCgpFbCB1c28gZGUgZXN0ZSBwYXF1ZXRlIHByb3BvcmNpb25hIHVuYSB2YWxpb3NhIGZ1ZW50ZSBkZSBkYXRvcyBwYXJhIGNvbXByZW5kZXIgbG9zIHZ1ZWxvcywgbG8gcXVlIG5vcyBwZXJtaXRlIGFuYWxpemFyIGxvcyBmYWN0b3JlcyBxdWUgaW5mbHV5ZW4gZW4gbG9zIHJldHJhc29zIHkgb3RyYXMgdmFyaWFibGVzIHJlbGFjaW9uYWRhcyBjb24gbG9zIHZ1ZWxvcy4gTGEgbWFuaXB1bGFjacOzbiB5IGV4cGxvcmFjacOzbiBkZSBkYXRvcyBpbmljaWFsZXMgcGVybWl0ZW4gZW50ZW5kZXIgbGEgZXN0cnVjdHVyYSB5IGNhcmFjdGVyw61zdGljYXMgZGUgbG9zIGNvbmp1bnRvcyBkZSBkYXRvcy4gCgpTZSBjYXJnYW4gbGFzIGJhc2VzIGRlIGRhdG9zIHJlbGV2YW50ZXMgeSBzZSBleHBsb3JuYSBtZWRpYW50ZSBkaWZlcmVudGVzIGZ1bmNpb25lcywgbG8gcXVlIHByb3BvcmNpb25hIHVuYSB2aXNpw7NuIGdlbmVyYWwgZGUgbG9zIGNhbXBvcyB5IHN1cyB0aXBvcyBkZSBkYXRvcy4gTHVlZ28sIHNlIGNhbGN1bGEgbGEgZGlzdGFuY2lhIHByb21lZGlvIGRlIGxvcyB2dWVsb3MgeSBzZSBpZGVudGlmaWNhbiBsYXMgYWVyb2zDrW5lYXMgY29uIG1heW9yIHRyw6FmaWNvIGHDqXJlbyBkZXNkZSBkaWZlcmVudGVzIGFlcm9wdWVydG9zIGRlIG9yaWdlbi4gCgpMYXMgYWVyb2zDrW5lYXMgY29uIGVsIG1heW9yIHRyw6FmaWNvIGHDqXJlbyBlbiB0w6lybWlub3MgZGUgbWlsbGFzIHJlY29ycmlkYXMgc29uIFVBIChVbml0ZWQgQWlybGluZXMpIHkgQUEgKEFtZXJpY2FuIEFpcmxpbmVzKS4gRXN0byBzZSBkZWJlIGEgcXVlIGVzdGFzIGFlcm9sw61uZWFzIG9wZXJhbiBwcmluY2lwYWxtZW50ZSBkZXNkZSBsb3MgYWVyb3B1ZXJ0b3MgRVdSIChOZXdhcmsgTGliZXJ0eSBJbnRlcm5hdGlvbmFsIEFpcnBvcnQpIHkgSkZLIChKb2huIEYuIEtlbm5lZHkgSW50ZXJuYXRpb25hbCBBaXJwb3J0KSwgcXVlIHNvbiBsb3MgcXVlIHRpZW5lbiBtw6FzIGRpc3RhbmNpYSBhbCBjZW50cm8gZGUgbGEgY2l1ZGFkIHkgbcOhcyB2YXJpZWRhZCBkZSBkZXN0aW5vcyB5IHJ1dGFzIHF1ZSBsb3Mgb3Ryb3MgYWVyb3B1ZXJ0b3MsIGxvIHF1ZSBpbXBsaWNhIG3DoXMgZGlzdGFuY2lhIHkgdGllbXBvIGRlIHZ1ZWxvLiAKClNlZ8O6biBsb3MgZGF0b3MsIGxhIG1lZGlhIGRlIG1pbGxhcyByZWNvcnJpZGFzIHBvciBVQSBkZXNkZSBlbCBhZXJvcHVlcnRvIEVXUiBlcyBkZSAyNTY1LCB5IGRlc2RlIGVsIGFlcm9wdWVydG8gSkZLIGVzIGRlIDI1ODYsIGxvIHF1ZSBzb24gbG9zIHZhbG9yZXMgbcOhcyBhbHRvcyBlbnRyZSB0b2RhcyBsYXMgYWVyb2zDrW5lYXMgeSBhZXJvcHVlcnRvcy4gTGEgbWVkaWEgZGUgbWlsbGFzIHJlY29ycmlkYXMgcG9yIEFBIGRlc2RlIGVsIGFlcm9wdWVydG8gRVdSIGVzIGRlIDI0NzUsIHkgZGVzZGUgZWwgYWVyb3B1ZXJ0byBKRksgZXMgZGUgMTcwMywgbG8gcXVlIHNvbiBsb3Mgc2VndW5kb3MgdmFsb3JlcyBtw6FzIGFsdG9zIGVudHJlIHRvZGFzIGxhcyBhZXJvbMOtbmVhcyB5IGFlcm9wdWVydG9zLgoKTGFzIHByaW5jaXBhbGVzIGFlcm9sw61uZWFzIG9wZXJhbmRvIGVuIGxvcyBhZXJvcHVlcnRvcyBKRksgeSBMR0Egc29uIGxhcyBtaXNtYXMsIHBlcm8gbm8gZW4gZWwgYWVyb3B1ZXJ0byBFV1IuIEVzdG8gc2UgZGViZSBhIHF1ZSBsYXMgYWVyb2zDrW5lYXMgVUEgKFVuaXRlZCBBaXJsaW5lcykgeSBBQSAoQW1lcmljYW4gQWlybGluZXMpIHRpZW5lbiB1bmEgZnVlcnRlIHByZXNlbmNpYSBlbiBsb3MgYWVyb3B1ZXJ0b3MgSkZLIHkgTEdBLCBxdWUgc29uIGxvcyBxdWUgdGllbmVuIG3DoXMgdHLDoWZpY28gYcOpcmVvIHkgbcOhcyB2YXJpZWRhZCBkZSBkZXN0aW5vcyB5IHJ1dGFzIHF1ZSBsb3Mgb3Ryb3MgYWVyb3B1ZXJ0b3MsIGxvIHF1ZSBpbXBsaWNhIG3DoXMgZGlzdGFuY2lhIHkgdGllbXBvIGRlIHZ1ZWxvLiBTaW4gZW1iYXJnbywgZW4gZWwgYWVyb3B1ZXJ0byBFV1IsIFVBIGVzIGxhIGFlcm9sw61uZWEgbMOtZGVyLCBtaWVudHJhcyBxdWUgQUEgdGllbmUgdW5hIG1lbm9yIHBhcnRpY2lwYWNpw7NuLCBsbyBxdWUgaW1wbGljYSB1bmEgbWVub3IgZGlzdGFuY2lhIHkgdGllbXBvIGRlIHZ1ZWxvLiAKCkZpbmFsbWVudGUsIGxhIG1lZGlhIGRlIG1pbGxhcyByZWNvcnJpZGFzIHBvciBVQSBkZXNkZSBlbCBhZXJvcHVlcnRvIEVXUiBlcyBkZSAyNTY1LCBsbyBxdWUgZXMgZWwgdmFsb3IgbcOhcyBhbHRvIGVudHJlIHRvZGFzIGxhcyBhZXJvbMOtbmVhcyB5IGFlcm9wdWVydG9zLiBMYSBtZWRpYSBkZSBtaWxsYXMgcmVjb3JyaWRhcyBwb3IgQUEgZGVzZGUgZWwgYWVyb3B1ZXJ0byBKRksgZXMgZGUgMjQ3NSwgbG8gcXVlIGVzIGVsIHZhbG9yIG3DoXMgYWx0byBlbnRyZSB0b2RhcyBsYXMgYWVyb2zDrW5lYXMgeSBsYSBtZWRpYSBkZSBtaWxsYXMgcmVjb3JyaWRhcyBwb3IgQUEgZGVzZGUgZWwgYWVyb3B1ZXJ0byBMR0EgZXMgZGUgMTM4OS4gRXN0b3MgZGF0b3MgbXVlc3RyYW4gcXVlIFVBIHkgQUEgc29uIGxhcyBhZXJvbMOtbmVhcyBsw61kZXJlcyBlbiBsb3MgYWVyb3B1ZXJ0b3MgSkZLIHkgTEdBLCB5IHF1ZSBzZSBkaWZlcmVuY2lhbiBkZSBsYXMgZGVtw6FzIHBvciBzdSBkaXN0YW5jaWEgbWVkaWEgcmVjb3JyaWRhLgoKIyA8c3BhbiBzdHlsZT0iY29sb3I6IzY2OEI4QjsiPkF2YW5jZSAyPC9zcGFuPiAKCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjojQ0Q2ODg5OyI+TW9kZWxvIGRlIHJlZ3Jlc2nDs24gbGluZWFsPC9zcGFuPiAKCmBgYHtyfQpjb2x1bW5hc19uaXZlbCA8LSBzYXBwbHkoZGZfY29tYmluYWRvLCBmdW5jdGlvbih4KSBsZW5ndGgodW5pcXVlKHgpKSkgPT0gMQpjb2x1bW5hc19uaXZlbF9ub21icmVzIDwtIG5hbWVzKGRmX2NvbWJpbmFkbylbY29sdW1uYXNfbml2ZWxdCiAKcHJpbnQoY29sdW1uYXNfbml2ZWxfbm9tYnJlcykKYGBgCgoKYGBge3IgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPUZBTFNFfQpyZWdyZXNpb24gPC0gbG0oZGVwX2RlbGF5IH4gY2FycmllciArIG1vbnRoICsgZGVwX3RpbWUgKyBzY2hlZF9kZXBfdGltZSArIGRlcF9kZWxheSArIGZsaWdodCArIG9yaWdpbiArIGRlc3QgKyBkaXN0YW5jZSArIHR5cGUgKyBtb2RlbCArIGVuZ2luZSArIHRlbXAgKyBkZXdwICsgaHVtaWQgKyB3aW5kX2RpciArIHdpbmRfc3BlZWQgKyBwcmVjaXAgKyBwcmVzc3VyZSArIHZpc2liICsgZGF0ZSArIHdlZWtfZGF5ICtsYXQgKyBsb24gKyBhbHQsIGRhdGEgPSBkZl9jb21iaW5hZG8pCnN1bW1hcnkocmVncmVzaW9uKQpgYGAKCgpgYGB7ciBtZXNzYWdlPVRSVUUsIHdhcm5pbmc9RkFMU0V9CmZsaWdodF93ZWF0aGVyIDwtZmxpZ2h0cyAlPiUgaW5uZXJfam9pbih3ZWF0aGVyLCBieSA9IGMoIm9yaWdpbiIgPSAib3JpZ2luIiwgInllYXIiID0gInllYXIiLCAibW9udGgiID0gIm1vbnRoIiwgImRheSIgPSAiZGF5IiwgImhvdXIiID0gImhvdXIiKSkKZmxpZ2h0X3dlYXRoZXI8LSBtdXRhdGUoZmxpZ2h0X3dlYXRoZXIsIGNlbGNpdXM9ICgodGVtcC0zMikqKDUvOSkpKQpmbGlnaHRfd2VhdGhlcjwtIG11dGF0ZShmbGlnaHRfd2VhdGhlciwgZHdfY2VsY2l1cz0gKChkZXdwLTMyKSooNS85KSkpCmZsaWdodF93ZWF0aGVyPC0gbXV0YXRlKGZsaWdodF93ZWF0aGVyLCBraG09ICh3aW5kX3NwZWVkKjEuNjA5MzQpKQpmbGlnaHRfd2VhdGhlcjwtIG11dGF0ZShmbGlnaHRfd2VhdGhlciwgbW09IChwcmVjaXAqMjUuNCkpCmZsaWdodF93ZWF0aGVyPC0gbXV0YXRlKGZsaWdodF93ZWF0aGVyLCBrbT0gKHZpc2liKjEuNjA5MzQpKQpgYGAKCk9ic2VydmFjaW9uZXM6CkVsIG1vZGVsbyBkZSByZWdyZXNpw7NuIGxpbmVhbCB0aWVuZSB1biBjb2VmaWNpZW50ZSBkZSBkZXRlcm1pbmFjacOzbiAoUjIpIGRlIDAuMTMwMSwgbG8gcXVlIHNpZ25pZmljYSBxdWUgZWwgMTMuMDElIGRlIGxhIHZhcmlhY2nDs24gZW4gZWwgcmV0cmFzbyBtZWRpbyBkZSBzYWxpZGEgc2UgZXhwbGljYSBwb3IgbGFzIHZhcmlhYmxlcyBpbmRlcGVuZGllbnRlcy4gRXN0byBpbmRpY2EgdW4gYWp1c3RlIG1vZGVyYWRvIGRlbCBtb2RlbG8gYSBsb3MgZGF0b3MsIHlhIHF1ZSBoYXkgb3Ryb3MgZmFjdG9yZXMgcXVlIHB1ZWRlbiBpbmZsdWlyIGVuIGVsIHJldHJhc28gcXVlIG5vIHNlIGhhbiBpbmNsdWlkbyBlbiBlbCBtb2RlbG8uIAoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiNDRDlCOUI7Ij5WYXJpYWJsZXMgSW5kZXBlbmRpZW50ZXM8L3NwYW4+IAoKUG9kZW1vcyBjb25zaWRlcmFyIGNvbW8gdmFyaWFibGVzIGluZGVwZW5kaWVudGVzIGxhcyBzaWd1aWVudGVzOgoKIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjojQ0Q5NkNEOyI+TW9udGg8L3NwYW4+CkxhIHZhcmlhYmxlICoqbW9udGgqKiwgc2UgcmVmaWVyZSBhbCBtZXMgZGVsIGHDsW8sIGRlc2RlIGVuZXJvIGhhc3RhIGRpY2llbWJyZS4gCgpgYGB7cn0KZ2dwbG90KGZsaWdodF93ZWF0aGVyLCBhZXMoeCA9IG1vbnRoLCB5ID0gZGVwX2RlbGF5LCBmaWxsID0gb3JpZ2luKSkgKwogIGdlb21fYmFyKHN0YXQgPSAic3VtbWFyeSIsIGZ1biA9ICJtZWFuIiwgcG9zaXRpb24gPSAic3RhY2siKSArCiAgbGFicyh4ID0gIk1lcyIsIHkgPSAiUmV0cmFzbyBwcm9tZWRpbyAobWludXRvcykiLCBmaWxsID0gIkFlb3JvcHVlcnRvIikgKwogIGdndGl0bGUoIlJldHJhc28gcHJvbWVkaW8gcG9yIG1lcyB5IGFlcm9wdWVydG8iKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQzIikgKwogIHRoZW1lX21pbmltYWwoKSsgCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IDE6MTIsIGxhYmVscyA9IDE6MTIpKyAKICB0aGVtZShwbG90LnRpdGxlPSBlbGVtZW50X3RleHQoaGp1c3Q9MC41KSkKCnN1bW1hcnlfZGVsYXlfbW9udGggPC0gZmxpZ2h0X3dlYXRoZXIgJT4lCiAgZ3JvdXBfYnkobW9udGgpICU+JQogIHN1bW1hcmlzZShhdmdfZGVsYXkgPSBtZWFuKGRlcF9kZWxheSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgdG90YWxfZmxpZ2h0cyA9IG4oKSwKICAgICAgICAgICAgdG90YWxfZGVsYXllZF9mbGlnaHRzID0gc3VtKGRlcF9kZWxheSA+IDAsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIHBlcmNfZGVsYXllZF9mbGlnaHRzID0gdG90YWxfZGVsYXllZF9mbGlnaHRzIC8gdG90YWxfZmxpZ2h0cyAqIDEwMCkKCnN1bW1hcnlfZGVsYXlfbW9udGgKCmBgYAoKT2JzZXJ2YWNpb25lczoKTG9zIHZ1ZWxvcyBxdWUgc2FsZW4gZW4gbG9zIG1lc2VzIGRlIGp1bmlvIHkganVsaW8gdGllbmVuIG3DoXMgcmV0cmFzb3MgcXVlIGxvcyBxdWUgc2FsZW4gZW4gb3Ryb3MgbWVzZXMgZGVsIGHDsW8uIEVzdG8gc2UgZGViZSBhIHF1ZSBoYXkgdW5hIG1heW9yIGRlbWFuZGEgZGUgdmlhamVzIHkgcG9zaWJsZW1lbnRlIGNvbmRpY2lvbmVzIG1ldGVvcm9sw7NnaWNhcyBhZHZlcnNhcyBkdXJhbnRlIGxvcyBtZXNlcyBkZSB2ZXJhbm8sIGxvIHF1ZSBnZW5lcmEgbcOhcyBjb25nZXN0acOzbiB5IGRpZmljdWx0YWRlcyBwYXJhIGN1bXBsaXIgY29uIGxvcyBob3Jhcmlvcy4gQWwgb2JzZXJ2YXIgbG9zIGRhdG9zLCBzZSBwdWVkZSB2ZXIgcXVlIGVsIHJldHJhc28gcHJvbWVkaW8gZGUgc2FsaWRhIGVuIGp1bmlvIHkganVsaW8gZnVlIGRlIDIwLjggeSAyMS44IG1pbnV0b3MgcmVzcGVjdGl2YW1lbnRlLCB5IHF1ZSBsYSBwcm9wb3JjacOzbiBkZSB2dWVsb3MgcmV0cmFzYWRvcyBmdWUgZGUgNDQuOCUgeSA0Ny4zJSByZXNwZWN0aXZhbWVudGUsIGxvIHF1ZSBzb24gbG9zIHZhbG9yZXMgbcOhcyBhbHRvcyBkZSB0b2RvIGVsIGHDsW8uCgojIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiNDRDk2Q0Q7Ij5PcmlnaW48L3NwYW4+CkxhIHZhcmlhYmxlICoqb3JpZ2luKiosIHNlIHJlZmllcmUgYWwgYWVyb3B1ZXJ0byBkZSBvcmlnZW4sIHF1ZSBwdWVkZSBzZXIgRVdSLCBKRksgbyBMR0EuCgpgYGB7cn0KZ2dwbG90KGZsaWdodF93ZWF0aGVyLCBhZXMoeCA9IG9yaWdpbiwgeSA9IGRlcF9kZWxheSwgZmlsbCA9IG9yaWdpbikpICsKICBnZW9tX2JhcihzdGF0ID0gInN1bW1hcnkiLCBmdW4gPSAibWVhbiIsIHBvc2l0aW9uID0gInN0YWNrIikgKwogIGxhYnMoeCA9ICJBZXJvcHVlcnRvIGRlIG9yaWdlbiIsIHkgPSAiUmV0cmFzbyBwcm9tZWRpbyAobWludXRvcykiLCBmaWxsID0gIkFlb3JvcHVlcnRvIikgKwogIGdndGl0bGUoIlJldHJhc28gcHJvbWVkaW8gcG9yIGFlcm9wdWVydG8iKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQzIikgKwogIHRoZW1lX21pbmltYWwoKSsgCiAgdGhlbWUocGxvdC50aXRsZT0gZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpCgpzdW1tYXJ5X2RlbGF5X29yaWdpbiA8LSBmbGlnaHRfd2VhdGhlciAlPiUKICBncm91cF9ieShvcmlnaW4pICU+JQogIHN1bW1hcmlzZShhdmdfZGVsYXkgPSBtZWFuKGRlcF9kZWxheSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgdG90YWxfZmxpZ2h0cyA9IG4oKSwKICAgICAgICAgICAgdG90YWxfZGVsYXllZF9mbGlnaHRzID0gc3VtKGRlcF9kZWxheSA+IDAsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIHBlcmNfZGVsYXllZF9mbGlnaHRzID0gdG90YWxfZGVsYXllZF9mbGlnaHRzIC8gdG90YWxfZmxpZ2h0cyAqIDEwMCkKCnN1bW1hcnlfZGVsYXlfb3JpZ2luCgpgYGAKCk9ic2VydmFjaW9uZXM6IApFbCBhZXJvcHVlcnRvIEVXUiBlcyBlbCBxdWUgdGllbmUgbcOhcyByZXRyYXNvcyBlbiBsb3MgdnVlbG9zIHF1ZSBzYWxlbiBkZXNkZSDDqWwsIGVuIGNvbXBhcmFjacOzbiBjb24gbG9zIGFlcm9wdWVydG9zIEpGSyB5IExHQS4gRXN0byBzZSBkZWJlIGEgcXVlIGVsIGFlcm9wdWVydG8gRVdSIHRpZW5lIG3DoXMgdHLDoWZpY28gYcOpcmVvLCBtw6FzIGRpc3RhbmNpYSBhbCBjZW50cm8gZGUgbGEgY2l1ZGFkIHkgbcOhcyBwcm9iYWJpbGlkYWRlcyBkZSBzdWZyaXIgY29uZGljaW9uZXMgbWV0ZW9yb2zDs2dpY2FzIGFkdmVyc2FzIHF1ZSBlbCBhZXJvcHVlcnRvIExHQSwgbG8gcXVlIGltcGxpY2EgbcOhcyBwcm9ibGVtYXMgb3BlcmF0aXZvcyB5IGRlIGNvbmdlc3Rpw7NuLiBBbCBhbmFsaXphciBsb3MgZGF0b3MsIHNlIHB1ZWRlIHZlciBxdWUgZWwgcmV0cmFzbyBwcm9tZWRpbyBkZSBzYWxpZGEgZW4gZWwgYWVyb3B1ZXJ0byBFV1IgZnVlIGRlIDE1LjEgbWludXRvcywgeSBxdWUgbGEgcHJvcG9yY2nDs24gZGUgdnVlbG9zIHJldHJhc2Fkb3MgZnVlIGRlIDQzLjYlLCBsbyBxdWUgc29uIGxvcyB2YWxvcmVzIG3DoXMgYWx0b3MgZW50cmUgbG9zIHRyZXMgYWVyb3B1ZXJ0b3MuIFBvciBlbCBjb250cmFyaW8sIGVsIGFlcm9wdWVydG8gTEdBIHR1dm8gZWwgbWVub3IgcmV0cmFzbyBwcm9tZWRpbyBkZSBzYWxpZGEgY29uIDEwLjQgbWludXRvcywgeSBsYSBtZW5vciBwcm9wb3JjacOzbiBkZSB2dWVsb3MgcmV0cmFzYWRvcyBjb24gMzIuMiUuIEVsIGFlcm9wdWVydG8gSkZLIHNlIHViaWPDsyBlbiB1bmEgcG9zaWNpw7NuIGludGVybWVkaWEsIGNvbiB1biByZXRyYXNvIHByb21lZGlvIGRlIHNhbGlkYSBkZSAxMi4xIG1pbnV0b3MsIHkgdW5hIHByb3BvcmNpw7NuIGRlIHZ1ZWxvcyByZXRyYXNhZG9zIGRlIDM3LjclLgoKIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjojQ0Q5NkNEOyI+RGVzdDwvc3Bhbj4KTGEgdmFyaWFibGUgKipkZXN0KiosIHNlIHJlZmllcmUgYWwgZGVzdGlubyBkZWwgdnVlbG8sIHF1ZSBwdWVkZSBzZXIgdW5vIGRlIGxvcyAxMDUgcG9zaWJsZXMuCgpgYGB7cn0KZGZfZGVzdF9hdmdfZGVsYXkgPC0gZGZfY29tYmluYWRvICU+JQogIGdyb3VwX2J5KGRlc3QpICU+JQogIHN1bW1hcml6ZShhdmdfZGVsYXkgPSBtZWFuKGRlcF9kZWxheSwgbmEucm0gPSBUUlVFKSkKCnRvcF8xMF9kZXN0aW5hdGlvbnMgPC0gZGZfZGVzdF9hdmdfZGVsYXkgJT4lCiAgYXJyYW5nZShkZXNjKGF2Z19kZWxheSkpICU+JQogIHNsaWNlKDE6MTApCgpkZl90b3BfMTBfZGVzdCA8LSBkZl9jb21iaW5hZG8gJT4lCiAgZmlsdGVyKGRlc3QgJWluJSB0b3BfMTBfZGVzdGluYXRpb25zJGRlc3QpCgpnZ3Bsb3QoZGZfdG9wXzEwX2Rlc3QsIGFlcyh4ID0gZGVzdCwgeSA9IGRlcF9kZWxheSwgZmlsbCA9IG9yaWdpbikpICsKICBnZW9tX2JhcihzdGF0ID0gInN1bW1hcnkiLCBmdW4gPSAibWVhbiIsIHBvc2l0aW9uID0gInN0YWNrIikgKwogIGxhYnMoeCA9ICJEZXN0aW5vIiwgeSA9ICJSZXRyYXNvIHByb21lZGlvIChtaW51dG9zKSIsIGZpbGwgPSAiQWVyb3B1ZXJ0byIpICsKICBnZ3RpdGxlKCJSZXRyYXNvIHByb21lZGlvIHBvciBkZXN0aW5vIHkgYWVyb3B1ZXJ0byBwYXJhIGxvcyAxMCBkZXN0aW5vcyBjb24gbWF5b3JlcyByZXRyYXNvcyIpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDMiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKCnN1bW1hcnlfZGVsYXlfZGVzdCA8LSBkZl90b3BfMTBfZGVzdCAgJT4lCiAgZ3JvdXBfYnkoZGVzdCkgJT4lCiAgc3VtbWFyaXNlKGF2Z19kZWxheSA9IG1lYW4oZGVwX2RlbGF5LCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICB0b3RhbF9mbGlnaHRzID0gbigpLAogICAgICAgICAgICB0b3RhbF9kZWxheWVkX2ZsaWdodHMgPSBzdW0oZGVwX2RlbGF5ID4gMCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgcGVyY19kZWxheWVkX2ZsaWdodHMgPSB0b3RhbF9kZWxheWVkX2ZsaWdodHMgLyB0b3RhbF9mbGlnaHRzICogMTAwKQoKc3VtbWFyeV9kZWxheV9kZXN0CmBgYAoKT2JzZXJ2YWNpb25lczoKTG9zIGRlc3Rpbm9zIGNvbiBsb3MgbWF5b3JlcyByZXRyYXNvcyBwcm9tZWRpbyBkZSBzYWxpZGEgc29uIENBRSwgVFVMIHkgT0tDLCBjb24gdmFsb3JlcyBkZSAzNS42LCAzNC45IHkgMzAuNiBtaW51dG9zIHJlc3BlY3RpdmFtZW50ZS4gQWRlbcOhcywgZXN0b3MgZGVzdGlub3MgdGllbmVuIHByb3BvcmNpb25lcyBtdXkgYWx0YXMgZGUgdnVlbG9zIHJldHJhc2Fkb3MsIGNvbiBDQUUgYWxjYW56YW5kbyBlbCA2Mi4xJSwgVFVMIGVsIDU0LjYlIHkgT0tDIGVsIDU2LjYlLiBFc3RvIHB1ZWRlIGRlYmVyc2UgYSBxdWUgbG9zIGRlc3Rpbm9zIG3DoXMgbGVqYW5vcyBvIG3DoXMgcGVxdWXDsW9zIHRpZW5lbiBtw6FzIGRpZmljdWx0YWRlcyBwYXJhIGFqdXN0YXJzZSBhIGxvcyBob3JhcmlvcywgbGFzIGNvbmRpY2lvbmVzIGNsaW3DoXRpY2FzIG8gbGFzIGRpc3BvbmliaWxpZGFkZXMgZGUgbGFzIHBpc3RhcyBxdWUgbG9zIGRlc3Rpbm9zIG3DoXMgY2VyY2Fub3MgbyBtw6FzIGdyYW5kZXMuCgpMb3MgZGVzdGlub3MgQ0FFLCBUVUwgeSBPS0Mgc29uIGxvcyBxdWUgdGllbmVuIG3DoXMgcmV0cmFzb3MgZW4gbG9zIHZ1ZWxvcyBxdWUgbGxlZ2FuIGEgZWxsb3MsIGVuIGNvbXBhcmFjacOzbiBjb24gb3Ryb3MgZGVzdGlub3MuIEVzdG8gc2UgZGViZSBhIHF1ZSBsb3MgZGVzdGlub3MgbcOhcyBsZWphbm9zIG8gbcOhcyBwZXF1ZcOxb3MgdGllbmVuIG3DoXMgZGlmaWN1bHRhZGVzIHBhcmEgYWp1c3RhcnNlIGEgbG9zIGhvcmFyaW9zLCBsYXMgY29uZGljaW9uZXMgY2xpbcOhdGljYXMgbyBsYXMgZGlzcG9uaWJpbGlkYWRlcyBkZSBsYXMgcGlzdGFzIHF1ZSBsb3MgZGVzdGlub3MgbcOhcyBjZXJjYW5vcyBvIG3DoXMgZ3JhbmRlcywgbG8gcXVlIGltcGxpY2EgbcOhcyBkZW1vcmFzIHkgY2FuY2VsYWNpb25lcy4gQWwgZXhhbWluYXIgbG9zIGRhdG9zLCBzZSBwdWVkZSB2ZXIgcXVlIGVsIHJldHJhc28gcHJvbWVkaW8gZGUgc2FsaWRhIHBhcmEgbG9zIGRlc3Rpbm9zIENBRSwgVFVMIHkgT0tDIGZ1ZSBkZSAzNS42LCAzNC45IHkgMzAuNiBtaW51dG9zIHJlc3BlY3RpdmFtZW50ZSwgeSBxdWUgbGEgcHJvcG9yY2nDs24gZGUgdnVlbG9zIHJldHJhc2Fkb3MgZnVlIGRlIDYyLjElLCA1NC42JSB5IDU2LjYlIHJlc3BlY3RpdmFtZW50ZSwgbG8gcXVlIHNvbiBsb3MgdmFsb3JlcyBtw6FzIGFsdG9zIGVudHJlIHRvZG9zIGxvcyBkZXN0aW5vcy4KCgojIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiNDRDk2Q0Q7Ij5Nb2RlbDwvc3Bhbj4KTGEgdmFyaWFibGUgKiptb2RlbCoqLCBzZSByZWZpZXJlIGVsIG1vZGVsbyBkZWwgYXZpw7NuLCBxdWUgcHVlZGUgc2VyIHVubyBkZSBsb3MgMzggcG9zaWJsZXMuCgpgYGB7cn0KZGZfbW9kZWxfYXZnX2RlbGF5IDwtIGRmX2NvbWJpbmFkbyAlPiUKICBncm91cF9ieShtb2RlbCkgJT4lCiAgc3VtbWFyaXplKGF2Z19kZWxheSA9IG1lYW4oZGVwX2RlbGF5LCBuYS5ybSA9IFRSVUUpKQoKdG9wXzEwX21vZGVscyA8LSBkZl9tb2RlbF9hdmdfZGVsYXkgJT4lCiAgYXJyYW5nZShkZXNjKGF2Z19kZWxheSkpICU+JQogIHNsaWNlKDE6MTApCgpkZl90b3BfMTAgPC0gZGZfY29tYmluYWRvICU+JQogIGZpbHRlcihtb2RlbCAlaW4lIHRvcF8xMF9tb2RlbHMkbW9kZWwpCgpnZ3Bsb3QoZGZfdG9wXzEwLCBhZXMoeCA9IG1vZGVsLCB5ID0gZGVwX2RlbGF5LCBmaWxsID0gb3JpZ2luKSkgKwogIGdlb21fYmFyKHN0YXQgPSAic3VtbWFyeSIsIGZ1biA9ICJtZWFuIiwgcG9zaXRpb24gPSAic3RhY2siKSArCiAgbGFicyh4ID0gIk1vZGVsbyIsIHkgPSAiUmV0cmFzbyBwcm9tZWRpbyAobWludXRvcykiLCBmaWxsID0gIkFlcm9wdWVydG8iKSArCiAgZ2d0aXRsZSgiUmV0cmFzbyBwcm9tZWRpbyBwb3IgbW9kZWxvIHkgYWVyb3B1ZXJ0byIpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDMiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKCnN1bW1hcnlfZGVsYXlfbW9kZWwgPC0gZGZfdG9wXzEwICU+JQogIGdyb3VwX2J5KG1vZGVsKSAlPiUKICBzdW1tYXJpc2UoYXZnX2RlbGF5ID0gbWVhbihkZXBfZGVsYXksIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIHRvdGFsX2ZsaWdodHMgPSBuKCksCiAgICAgICAgICAgIHRvdGFsX2RlbGF5ZWRfZmxpZ2h0cyA9IHN1bShkZXBfZGVsYXkgPiAwLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICBwZXJjX2RlbGF5ZWRfZmxpZ2h0cyA9IHRvdGFsX2RlbGF5ZWRfZmxpZ2h0cyAvIHRvdGFsX2ZsaWdodHMgKiAxMDApCgpzdW1tYXJ5X2RlbGF5X21vZGVsCmBgYAoKT2JzZXJ2YWNpb25lczogCkxvcyBtb2RlbG9zIGRlIGF2acOzbiBjb24gZWwgMTAwJSBkZSB2dWVsb3MgcmV0cmFzYWRvcyBzb24gZWwgNzQ3LTQ1MSwgZWwgNzU3LTM1MSB5IGVsIEEzMzAtMjIzLiBFc3RvcyBtb2RlbG9zIHNvbiBwcm9wZW5zb3MgYSBleHBlcmltZW50YXIgcmV0cmFzb3MgZW4gdG9kb3MgbG9zIGFlcm9wdWVydG9zLCBsbyBxdWUgcHVlZGUgaW5kaWNhciBwcm9ibGVtYXMgZGUgbWFudGVuaW1pZW50bywgY2FwYWNpZGFkIG8gcmVuZGltaWVudG8gaW5oZXJlbnRlcyBhIGVzdG9zIGF2aW9uZXMuIEVzdG9zIG1vZGVsb3Mgc29uIHByb3BlbnNvcyBhIGV4cGVyaW1lbnRhciByZXRyYXNvcyBlbiB0b2RvcyBsb3MgYWVyb3B1ZXJ0b3MsIHBlcm8gc29uIHBhcnRpY3VsYXJtZW50ZSBkZXN0YWNhZG9zIGVuIGVsIGFlcm9wdWVydG8gSkZLLCBsbyBxdWUgc3VnaWVyZSBwb3NpYmxlcyBwcm9ibGVtYXMgb3BlcmF0aXZvcyBlc3BlY8OtZmljb3MgZW4gZXN0ZSBhZXJvcHVlcnRvIGNvbiByZXNwZWN0byBhIGVzdG9zIG1vZGVsb3MuCgpMb3MgbW9kZWxvcyBkZSBhdmnDs24gNzQ3LTQ1MSwgNzU3LTM1MSB5IEEzMzAtMjIzIHNvbiBsb3MgcXVlIHRpZW5lbiBtw6FzIHJldHJhc29zIGVuIGxvcyB2dWVsb3MgcXVlIGxvcyB1c2FuLCBlbiBjb21wYXJhY2nDs24gY29uIG90cm9zIG1vZGVsb3MgZGUgYXZpw7NuLiBFc3RvIHNlIGRlYmUgYSBxdWUgZXN0b3MgbW9kZWxvcyBzb24gcHJvcGVuc29zIGEgZXhwZXJpbWVudGFyIHByb2JsZW1hcyBkZSBtYW50ZW5pbWllbnRvLCBjYXBhY2lkYWQgbyByZW5kaW1pZW50byBpbmhlcmVudGVzIGEgZXN0b3MgYXZpb25lcywgbG8gcXVlIGltcGxpY2EgbcOhcyBmYWxsYXMgeSByZXBhcmFjaW9uZXMuIEFsIHJldmlzYXIgbG9zIGRhdG9zLCBzZSBwdWVkZSB2ZXIgcXVlIGVsIDEwMCUgZGUgbG9zIHZ1ZWxvcyBxdWUgdXNhcm9uIGVzdG9zIG1vZGVsb3MgdHV2aWVyb24gcmV0cmFzb3MsIHkgcXVlIGVzdG9zIG1vZGVsb3MgZnVlcm9uIGVzcGVjaWFsbWVudGUgcHJvYmxlbcOhdGljb3MgZW4gZWwgYWVyb3B1ZXJ0byBKRkssIGxvIHF1ZSBzdWdpZXJlIHBvc2libGVzIHByb2JsZW1hcyBvcGVyYXRpdm9zIGVzcGVjw61maWNvcyBlbiBlc3RlIGFlcm9wdWVydG8gY29uIHJlc3BlY3RvIGEgZXN0b3MgbW9kZWxvcy4KCiMjIyA8c3BhbiBzdHlsZT0iY29sb3I6IzUzODY4QjsiPlZhcmlhYmxlcyBkZWwgY2xpbWE8L3NwYW4+CkFob3JhLCBzZSBtdWVzdHJhbiBsYXMgdmFyaWFibGVzIGluZGVwZW5kaWVudGVzIGRlbCBjbGltYToKCiMjIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiNDRDk2Q0Q7Ij50ZW1wPC9zcGFuPgpMYSB2YXJpYWJsZSAqKnRlbXAqKiwgc2UgcmVmaWVyZSBhIGxhIHRlbXBlcmF0dXJhIG1lZGlhIGVuIGdyYWRvcyBDZWxjaXVzLgoKYGBge3J9CmZsaWdodF93ZWF0aGVyICU+JQogIGdyb3VwX2J5KGNlbGNpdXMpICU+JQogIHN1bW1hcmlzZShkZWxheSA9IG1lYW4oZGVwX2RlbGF5LCBuYS5ybSA9IFRSVUUpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBjZWxjaXVzLCB5ID0gZGVsYXkpKSArCiAgbGFicyh4ID0gIlRlbXBlcmF0dXJhIChDwrApIiwgeSA9ICJSZXRyYXNvIHByb21lZGlvIChtaW51dG9zKSIsIGZpbGwgPSAiQWVvcm9wdWVydG8iKSArCiAgZ2d0aXRsZSgiUmV0cmFzbyBwcm9tZWRpbyBwb3IgdGVtcGVyYXR1cmEiKSArCiAgZ2VvbV9saW5lKCkgKyBnZW9tX3BvaW50KCkrIHRoZW1lKHBsb3QudGl0bGU9IGVsZW1lbnRfdGV4dChoanVzdD0wLjUpKQpgYGAKCk9ic2VydmFjaW9uZXM6CkxhIHRlbXBlcmF0dXJhIGluZmx1eWUgcG9zaXRpdmFtZW50ZSBlbiBlbCByZXRyYXNvIG1lZGlvIGRlIHNhbGlkYSBkZSBsb3MgdnVlbG9zLiBFc3RvIHNlIGRlYmUgYSBxdWUgbGEgdGVtcGVyYXR1cmEgYWZlY3RhIGEgbGEgZGVuc2lkYWQgZGVsIGFpcmUsIGxhIGN1YWwgaW5mbHV5ZSBlbiBsYSBzdXN0ZW50YWNpw7NuIHkgbGEgcmVzaXN0ZW5jaWEgZGUgbG9zIGF2aW9uZXMsIHBlcm8gdGFtYmnDqW4gaGF5IG90cm9zIGZhY3RvcmVzIGNsaW3DoXRpY29zIHF1ZSBwdWVkZW4gY2F1c2FyIHJldHJhc29zLCBjb21vIGVsIHZpZW50bywgbGEgbGx1dmlhIG8gbGEgbmlldmUuIFNlZ8O6biBsb3MgZGF0b3MsIGVsIGNvZWZpY2llbnRlIGRlIHJlZ3Jlc2nDs24gZW50cmUgbGEgdGVtcGVyYXR1cmEgeSBlbCByZXRyYXNvIG1lZGlvIGRlIHNhbGlkYSBlcyBkZSAxLjQzOGUtMDEsIGxvIHF1ZSBpbmRpY2EgdW5hIHJlbGFjacOzbiBwb3NpdGl2YSB5IGVzdGFkw61zdGljYW1lbnRlIHNpZ25pZmljYXRpdmEgYWwgbml2ZWwgZGUgMC4wMDEuIEFkZW3DoXMsIHNlZ8O6biBsYSBncsOhZmljYSwgc2UgcHVlZGUgb2JzZXJ2YXIgcXVlIGVsIHJldHJhc28gcHJvbWVkaW8gZGUgc2FsaWRhIGF1bWVudGEgY29uIGxhIHRlbXBlcmF0dXJhLCBlc3BlY2lhbG1lbnRlIGFscmVkZWRvciBkZSAwwrBDIHkgZW50cmUgMzDCsEMgeSA0MMKwQywgbG8gcXVlIHB1ZWRlIGRlYmVyc2UgYSBsYSBmb3JtYWNpw7NuIGRlIGhpZWxvIG8gYWwgc29icmVjYWxlbnRhbWllbnRvIGRlIGxvcyBtb3RvcmVzLgoKIyMjIyA8c3BhbiBzdHlsZT0iY29sb3I6I0NEOTZDRDsiPmh1bWlkPC9zcGFuPgpMYSB2YXJpYWJsZSAqKmh1bWlkKiosIHNlIHJlZmllcmUgYSBsYSBodW1lZGFkIG1lZGlhLgoKYGBge3J9CmZsaWdodF93ZWF0aGVyICU+JQogIGdyb3VwX2J5KGh1bWlkKSAlPiUKICBzdW1tYXJpc2UoZGVsYXkgPSBtZWFuKGRlcF9kZWxheSwgbmEucm0gPSBUUlVFKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gaHVtaWQsIHkgPSBkZWxheSkpICsKICBsYWJzKHggPSAiSHVtZWRhZCByZWxhdGl2YSIsIHkgPSAiUmV0cmFzbyBwcm9tZWRpbyAobWludXRvcykiLCBmaWxsID0gIkFlb3JvcHVlcnRvIikgKwogIGdndGl0bGUoIlJldHJhc28gcHJvbWVkaW8gcG9yIGh1bWVkYWQgcmVsYXRpdmEiKSArCiAgZ2VvbV9saW5lKCkgKyBnZW9tX3BvaW50KCkrIHRoZW1lKHBsb3QudGl0bGU9IGVsZW1lbnRfdGV4dChoanVzdD0wLjUpKQpgYGAKCk9ic2VydmFjaW9uZXM6IApMYSBodW1lZGFkIGluZmx1eWUgbmVnYXRpdmFtZW50ZSBlbiBlbCByZXRyYXNvIG1lZGlvIGRlIHNhbGlkYSBkZSBsb3MgdnVlbG9zLiBFc3RvIHNlIGRlYmUgYSBxdWUgbGEgaHVtZWRhZCBhZmVjdGEgYSBsYSB2aXNpYmlsaWRhZCB5IGxhIGZvcm1hY2nDs24gZGUgaGllbG8gZW4gbGFzIGFsYXMgZGUgbG9zIGF2aW9uZXMsIGxvIHF1ZSBpbXBsaWNhIG3DoXMgcmllc2dvcyB5IHByZWNhdWNpb25lcyBwYXJhIGxvcyB2dWVsb3MuIAoKU2Vnw7puIGxvcyBkYXRvcywgZWwgY29lZmljaWVudGUgZGUgcmVncmVzacOzbiBlbnRyZSBsYSBodW1lZGFkIHkgZWwgcmV0cmFzbyBtZWRpbyBkZSBzYWxpZGEgZXMgZGUgMi42MjllLTAxLCBsbyBxdWUgaW5kaWNhIHVuYSByZWxhY2nDs24gbmVnYXRpdmEgeSBlc3RhZMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZhIGFsIG5pdmVsIGRlIDAuMDAxLiBBZGVtw6FzLCBzZWfDum4gbGEgZ3LDoWZpY2EsIHNlIHB1ZWRlIG9ic2VydmFyIHF1ZSBlbCByZXRyYXNvIHByb21lZGlvIGRlIHNhbGlkYSBkaXNtaW51eWUgY29uIGxhIGh1bWVkYWQsIGVzcGVjaWFsbWVudGUgZW50cmUgMCB5IDIwLCBsbyBxdWUgcHVlZGUgZGViZXJzZSBhIHF1ZSBlbCBhaXJlIHNlY28gZmF2b3JlY2UgZWwgcmVuZGltaWVudG8gZGUgbG9zIGF2aW9uZXMgeSByZWR1Y2UgbGEgcHJvYmFiaWxpZGFkIGRlIHByZWNpcGl0YWNpb25lcy4KCiMjIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiNDRDk2Q0Q7Ij53aW5kX3NwZWVkPC9zcGFuPgpMYSB2YXJpYWJsZSAqKndpbmRfc3BlZWQqKiwgc2UgcmVmaWVyZSBhIGxhIHZlbG9jaWRhZCBkZWwgdmllbnRvIG1lZGlhIGVuIGtpbMOzbWV0cm9zIHBvciBob3JhLgoKYGBge3IgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPUZBTFNFfQpmbGlnaHRfd2VhdGhlciAlPiUKICBncm91cF9ieShraG0pICU+JQogIHN1bW1hcmlzZShkZWxheSA9IG1lYW4oZGVwX2RlbGF5LCBuYS5ybSA9IFRSVUUpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBraG0sIHkgPSBkZWxheSkpICsKICBsYWJzKHggPSAiVmVsb2NpZGFkIGRlbCB2aWVudG8gKGttaCkiLCB5ID0gIlJldHJhc28gcHJvbWVkaW8gKG1pbnV0b3MpIiwgZmlsbCA9ICJBZW9yb3B1ZXJ0byIpICsKICBnZ3RpdGxlKCJSZXRyYXNvIHByb21lZGlvIHBvciB2ZWxvY2lkYWQgZGVsIHZpZW50byIpICsKICBnZW9tX2xpbmUoKSArIGdlb21fcG9pbnQoKSsgdGhlbWUocGxvdC50aXRsZT0gZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpCgpgYGAKCk9ic2VydmFjaW9uZXM6IApMYSB2ZWxvY2lkYWQgZGVsIHZpZW50byBpbmZsdXllIHBvc2l0aXZhbWVudGUgZW4gZWwgcmV0cmFzbyBtZWRpbyBkZSBzYWxpZGEgZGUgbG9zIHZ1ZWxvcy4gRXN0byBzZSBkZWJlIGEgcXVlIGVsIHZpZW50byBmdWVydGUgZGlmaWN1bHRhIGVsIGRlc3BlZ3VlIHkgZWwgYXRlcnJpemFqZSBkZSBsb3MgYXZpb25lcywgYXPDrSBjb21vIHN1IG5hdmVnYWNpw7NuIHkgY29uc3VtbyBkZSBjb21idXN0aWJsZSwgbG8gcXVlIGltcGxpY2EgbcOhcyBkZW1vcmFzIHkgcHJlY2F1Y2lvbmVzIHBhcmEgbG9zIHZ1ZWxvcy4gU2Vnw7puIGxvcyBkYXRvcywgZWwgY29lZmljaWVudGUgZGUgcmVncmVzacOzbiBlbnRyZSBsYSB2ZWxvY2lkYWQgZGVsIHZpZW50byB5IGVsIHJldHJhc28gbWVkaW8gZGUgc2FsaWRhIGVzIGRlIDIuNTE0ZS0wMSwgbG8gcXVlIGluZGljYSB1bmEgcmVsYWNpw7NuIHBvc2l0aXZhIHkgZXN0YWTDrXN0aWNhbWVudGUgc2lnbmlmaWNhdGl2YSBhbCBuaXZlbCBkZSAwLjAwMS4gQWRlbcOhcywgc2Vnw7puIGxhIGdyw6FmaWNhLCBzZSBwdWVkZSBvYnNlcnZhciBxdWUgZWwgcmV0cmFzbyBwcm9tZWRpbyBkZSBzYWxpZGEgYXVtZW50YSBjb24gbGEgdmVsb2NpZGFkIGRlbCB2aWVudG8sIGVzcGVjaWFsbWVudGUgYSBwYXJ0aXIgZGUgMjAga20vaCwgbG8gcXVlIHB1ZWRlIGRlYmVyc2UgYSBxdWUgZWwgdmllbnRvIHN1cGVyYSBsYSB2ZWxvY2lkYWQgZGUgY3J1Y2VybyBkZSBsb3MgYXZpb25lcyBvIGdlbmVyYSB0dXJidWxlbmNpYXMuCgojIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjojQ0Q5NkNEOyI+cHJlY2lwPC9zcGFuPgpMYSB2YXJpYWJsZSAqKnByZWNpcCoqLCBzZSByZWZpZXJlIGEgbGEgcHJlY2lwaXRhY2nDs24gbWVkaWEgZW4gbWlsw61tZXRyby4KCmBgYHtyfQpmbGlnaHRfd2VhdGhlciAlPiUKICBncm91cF9ieShtbSkgJT4lCiAgc3VtbWFyaXNlKGRlbGF5ID0gbWVhbihkZXBfZGVsYXksIG5hLnJtID0gVFJVRSkpICU+JQogIGdncGxvdChhZXMoeCA9IG1tLCB5ID0gZGVsYXkpKSArCiAgbGFicyh4ID0gIlByZWNpcGl0YWNpw7NuIChtbSkiLCB5ID0gIlJldHJhc28gcHJvbWVkaW8gKG1pbnV0b3MpIiwgZmlsbCA9ICJBZW9yb3B1ZXJ0byIpICsKICBnZ3RpdGxlKCJSZXRyYXNvIHByb21lZGlvIHBvciBwcmVjaXBpdGFjacOzbiIpICsKICBnZW9tX2xpbmUoKSArIGdlb21fcG9pbnQoKSsgdGhlbWUocGxvdC50aXRsZT0gZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpCgpgYGAKCk9ic2VydmFjaW9uZXM6IApMYSBwcmVjaXBpdGFjacOzbiBpbmZsdXllIG5lZ2F0aXZhbWVudGUgZW4gZWwgcmV0cmFzbyBtZWRpbyBkZSBzYWxpZGEgZGUgbG9zIHZ1ZWxvcyAuIEVzdG8gc2UgZGViZSBhIHF1ZSBsYSBsbHV2aWEsIGxhIG5pZXZlIG8gZWwgZ3Jhbml6byBwdWVkZW4gcmVkdWNpciBsYSB2aXNpYmlsaWRhZCwgbGEgc2VndXJpZGFkIHkgZWwgdHLDoWZpY28gYcOpcmVvLCBhc8OtIGNvbW8gY2F1c2FyIHByb2JsZW1hcyB0w6ljbmljb3MgbyBkZSBtYW50ZW5pbWllbnRvIGVuIGxvcyBhdmlvbmVzLCBsbyBxdWUgaW1wbGljYSBtw6FzIGNhbmNlbGFjaW9uZXMgeSBkZW1vcmFzIHBhcmEgbG9zIHZ1ZWxvcy4gU2Vnw7puIGxvcyBkYXRvcywgZWwgY29lZmljaWVudGUgZGUgcmVncmVzacOzbiBlbnRyZSBsYSBwcmVjaXBpdGFjacOzbiB5IGVsIHJldHJhc28gbWVkaW8gZGUgc2FsaWRhIGVzIGRlIDUuMTY0ZSswMSwgbG8gcXVlIGluZGljYSB1bmEgcmVsYWNpw7NuIG5lZ2F0aXZhIHkgZXN0YWTDrXN0aWNhbWVudGUgc2lnbmlmaWNhdGl2YSBhbCBuaXZlbCBkZSAwLjAwMS4gQWRlbcOhcywgc2Vnw7puIGxhIGdyw6FmaWNhLCBzZSBwdWVkZSBvYnNlcnZhciBxdWUgZWwgcmV0cmFzbyBwcm9tZWRpbyBkZSBzYWxpZGEgZGlzbWludXllIGNvbiBsYSBwcmVjaXBpdGFjacOzbiwgZXNwZWNpYWxtZW50ZSBhIHBhcnRpciBkZSAyMCBtbSwgbG8gcXVlIHB1ZWRlIGRlYmVyc2UgYSBxdWUgbGEgcHJlY2lwaXRhY2nDs24gc3VwZXJhIGVsIHVtYnJhbCBkZSB0b2xlcmFuY2lhIGRlIGxvcyBhdmlvbmVzIG8gaW1waWRlIGVsIGRlc3BlZ3VlIG8gZWwgYXRlcnJpemFqZS4KCiMjIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiNDRDk2Q0Q7Ij5wcmVzc3VyZTwvc3Bhbj4KTGEgdmFyaWFibGUgKipwcmVzc3VyZSoqLCBzZSByZWZpZXJlIGEgbGEgcHJlc2nDs24gYXRtb3Nmw6lyaWNhIG1lZGlhIGVuIG1pbGliYXJlcy4KCmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1GQUxTRX0KZmxpZ2h0X3dlYXRoZXIgJT4lCiAgZ3JvdXBfYnkocHJlc3N1cmUpICU+JQogIHN1bW1hcmlzZShkZWxheSA9IG1lYW4oZGVwX2RlbGF5LCBuYS5ybSA9IFRSVUUpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBwcmVzc3VyZSwgeSA9IGRlbGF5KSkgKwogIGxhYnMoeCA9ICJQcmVzacOzbiAobWlsaWJhcmVzKSIsIHkgPSAiUmV0cmFzbyBwcm9tZWRpbyAobWludXRvcykiLCBmaWxsID0gIkFlb3JvcHVlcnRvIikgKwogIGdndGl0bGUoIlJldHJhc28gcHJvbWVkaW8gcG9yIHByZXNpw7NuIikgKwogIGdlb21fbGluZSgpICsgZ2VvbV9wb2ludCgpKyB0aGVtZShwbG90LnRpdGxlPSBlbGVtZW50X3RleHQoaGp1c3Q9MC41KSkKYGBgCgpPYnNlcnZhY2lvbmVzOiAKTGEgcHJlc2nDs24gYXRtb3Nmw6lyaWNhIGluZmx1eWUgbmVnYXRpdmFtZW50ZSBlbiBlbCByZXRyYXNvIG1lZGlvIGRlIHNhbGlkYSBkZSBsb3MgdnVlbG9zLiBFc3RvIHNlIGRlYmUgYSBxdWUgbGEgcHJlc2nDs24gYXRtb3Nmw6lyaWNhIGRldGVybWluYSBsYSBkZW5zaWRhZCBkZWwgYWlyZSwgbGEgY3VhbCBhZmVjdGEgYWwgcmVuZGltaWVudG8geSBsYSBzdXN0ZW50YWNpw7NuIGRlIGxvcyBhdmlvbmVzLCB5IHRhbWJpw6luIGluZmx1eWUgZW4gZWwgZGVzYXJyb2xsbyBkZSBsYXMgbnViZXMgeSBsYXMgbGx1dmlhcywgbGFzIGN1YWxlcyBwdWVkZW4gY2F1c2FyIHJldHJhc29zLiBTZWfDum4gbG9zIGRhdG9zLCBlbCBjb2VmaWNpZW50ZSBkZSByZWdyZXNpw7NuIGVudHJlIGxhIHByZXNpw7NuIGF0bW9zZsOpcmljYSB5IGVsIHJldHJhc28gbWVkaW8gZGUgc2FsaWRhIGVzIGRlIC0yLjk2NmUtMDEsIGxvIHF1ZSBpbmRpY2EgdW5hIHJlbGFjacOzbiBuZWdhdGl2YSB5IGVzdGFkw61zdGljYW1lbnRlIHNpZ25pZmljYXRpdmEgYWwgbml2ZWwgZGUgMC4wMDEuIEFkZW3DoXMsIHNlZ8O6biBsYSBncsOhZmljYSwgc2UgcHVlZGUgb2JzZXJ2YXIgcXVlIGVsIHJldHJhc28gcHJvbWVkaW8gZGUgc2FsaWRhIGRpc21pbnV5ZSBjb24gbGEgcHJlc2nDs24gYXRtb3Nmw6lyaWNhLCBlc3BlY2lhbG1lbnRlIGEgcGFydGlyIGRlIDEwMjAgbWlsaWJhcmVzLCBsbyBxdWUgcHVlZGUgZGViZXJzZSBhIHF1ZSBsYSBwcmVzacOzbiBhbHRhIGluZGljYSB1biBjbGltYSBtw6FzIGVzdGFibGUgeSBzZWNvLiAKCiMjIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiNDRDk2Q0Q7Ij52aXNpYjwvc3Bhbj4KTGEgdmFyaWFibGUgKip2aXNpYioqLCBzZSByZWZpZXJlIGEgbGEgdmlzaWJpbGlkYWQgbWVkaWEgZW4gbWlsbGFzLgoKYGBge3IgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPUZBTFNFfQpmbGlnaHRfd2VhdGhlciAlPiUKICBncm91cF9ieShrbSkgJT4lCiAgc3VtbWFyaXNlKGRlbGF5ID0gbWVhbihkZXBfZGVsYXksIG5hLnJtID0gVFJVRSkpICU+JQogIGdncGxvdChhZXMoeCA9IGttLCB5ID0gZGVsYXkpKSArCiAgbGFicyh4ID0gIlZpc2liaWxpZGFkIChrbSkiLCB5ID0gIlJldHJhc28gcHJvbWVkaW8gKG1pbnV0b3MpIiwgZmlsbCA9ICJBZW9yb3B1ZXJ0byIpICsKICBnZ3RpdGxlKCJSZXRyYXNvIHByb21lZGlvIHBvciB2aXNpYmlsaWRhZCIpICsKICBnZW9tX2xpbmUoKSArIGdlb21fcG9pbnQoKSsgdGhlbWUocGxvdC50aXRsZT0gZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpCmBgYAoKT2JzZXJ2YWNpb25lczogCkxhIHZpc2liaWxpZGFkIGluZmx1eWUgbmVnYXRpdmFtZW50ZSBlbiBlbCByZXRyYXNvIG1lZGlvIGRlIHNhbGlkYSBkZSBsb3MgdnVlbG9zLiBFc3RvIHNlIGRlYmUgYSBxdWUgbGEgdmlzaWJpbGlkYWQgZXMgdW4gZmFjdG9yIGNsYXZlIHBhcmEgbGEgc2VndXJpZGFkIHkgbGEgZWZpY2llbmNpYSBkZSBsb3MgdnVlbG9zLCB5YSBxdWUgYWZlY3RhIGEgbGEgY2FwYWNpZGFkIGRlIGxvcyBwaWxvdG9zIHkgbG9zIGNvbnRyb2xhZG9yZXMgZGUgdHLDoWZpY28gYcOpcmVvIHBhcmEgZGV0ZWN0YXIgeSBldml0YXIgb2JzdMOhY3Vsb3MsIGNvbmZsaWN0b3MgeSBjb25kaWNpb25lcyBtZXRlb3JvbMOzZ2ljYXMgYWR2ZXJzYXMuIFNlZ8O6biBsb3MgZGF0b3MsIGVsIGNvZWZpY2llbnRlIGRlIHJlZ3Jlc2nDs24gZW50cmUgbGEgdmlzaWJpbGlkYWQgeSBlbCByZXRyYXNvIG1lZGlvIGRlIHNhbGlkYSBlcyBkZSAtMy40NThlLTAxLCBsbyBxdWUgaW5kaWNhIHVuYSByZWxhY2nDs24gbmVnYXRpdmEgeSBlc3RhZMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZhIGFsIG5pdmVsIGRlIDAuMDAxLiBBZGVtw6FzLCBzZWfDum4gbGEgZ3LDoWZpY2EsIHNlIHB1ZWRlIG9ic2VydmFyIHF1ZSBlbCByZXRyYXNvIHByb21lZGlvIGRlIHNhbGlkYSBhdW1lbnRhIGNvbiBsYSB2aXNpYmlsaWRhZCwgZXNwZWNpYWxtZW50ZSBlbnRyZSAwIHkgNSBrbSwgbG8gcXVlIHB1ZWRlIGRlYmVyc2UgYSBxdWUgbGEgYmFqYSB2aXNpYmlsaWRhZCBpbXBsaWNhIG3DoXMgcmVzdHJpY2Npb25lcyB5IHByZWNhdWNpb25lcyBwYXJhIGxvcyB2dWVsb3MsIGNvbW8gZWwgdXNvIGRlIGluc3RydW1lbnRvcywgZWwgYXVtZW50byBkZSBsYSBzZXBhcmFjacOzbiBlbnRyZSBhdmlvbmVzIHkgbGEgcmVkdWNjacOzbiBkZSBsYSBjYXBhY2lkYWQgZGUgbG9zIGFlcm9wdWVydG9zLgoKIyMjIyA8c3BhbiBzdHlsZT0iY29sb3I6I0NEOTZDRDsiPndlZWtfZGF5PC9zcGFuPgpMYSB2YXJpYWJsZSAqKndlZWtfZGF5KiosIHNlIHJlZmllcmUgYWwgZMOtYSBkZSBsYSBzZW1hbmEsIGRlc2RlIGx1bmVzIGhhc3RhIGRvbWluZ28uCgpgYGB7cn0KZGZfY29tYmluYWRvJHdlZWtfZGF5IDwtIGZhY3Rvcih3ZWVrZGF5cyhkZl9jb21iaW5hZG8kdGltZV9ob3VyKSwgbGV2ZWxzID0gYygibHVuZXMiLCAibWFydGVzIiwgIm1pw6lyY29sZXMiLCAianVldmVzIiwgInZpZXJuZXMiLCAic8OhYmFkbyIsICJkb21pbmdvIikpCiAKZGZfY29tYmluYWRvIDwtIGRmX2NvbWJpbmFkb1tvcmRlcihkZl9jb21iaW5hZG8kd2Vla19kYXkpLF0KYGBgCgpPYnNlcnZhY2lvbmVzOiAKTG9zIHZ1ZWxvcyBxdWUgc2FsZW4gbG9zIGp1ZXZlcyB0aWVuZW4gbcOhcyByZXRyYXNvcyBxdWUgbG9zIHF1ZSBzYWxlbiBvdHJvcyBkw61hcyBkZSBsYSBzZW1hbmEuIEVzdG8gc2UgZGViZSBhIHF1ZSBsYSBkZW1hbmRhIGRlIHZpYWplcyB5IGxhIGNvbmdlc3Rpw7NuIHNvbiBtw6FzIGFsdGFzIGR1cmFudGUgbG9zIGTDrWFzIGxhYm9yYWJsZXMsIGxvIHF1ZSBjb250cmlidXllIGEgbG9zIG1heW9yZXMgcmV0cmFzb3MgZW4gbG9zIHZ1ZWxvcy4gQWwgbWlyYXIgbG9zIGRhdG9zLCBzZSBwdWVkZSB2ZXIgcXVlIGVsIHJldHJhc28gcHJvbWVkaW8gZGUgc2FsaWRhIGxvcyBqdWV2ZXMgZnVlIGRlIDE2LjEgbWludXRvcywgeSBxdWUgbGEgcHJvcG9yY2nDs24gZGUgdnVlbG9zIHJldHJhc2Fkb3MgZnVlIGRlIDQxLjglLCBsbyBxdWUgc29uIGxvcyB2YWxvcmVzIG3DoXMgYWx0b3MgZW50cmUgdG9kb3MgbG9zIGTDrWFzIGRlIGxhIHNlbWFuYS4gUG9yIGVsIGNvbnRyYXJpbywgbG9zIHPDoWJhZG9zIHR1dmllcm9uIGVsIG1lbm9yIHJldHJhc28gcHJvbWVkaW8gZGUgc2FsaWRhIGNvbiA3LjY1IG1pbnV0b3MsIHkgbGEgbWVub3IgcHJvcG9yY2nDs24gZGUgdnVlbG9zIHJldHJhc2Fkb3MgY29uIDM0LjElLiBMb3Mgb3Ryb3MgZMOtYXMgc2UgdWJpY2Fyb24gZW50cmUgZXN0b3MgZXh0cmVtb3MsIGNvbiBsb3MgbHVuZXMsIGxvcyB2aWVybmVzIHkgbG9zIGRvbWluZ29zIHRlbmllbmRvIHJldHJhc29zIHkgcHJvcG9yY2lvbmVzIG3DoXMgYWx0YXMgcXVlIGxvcyBtYXJ0ZXMgeSBsb3MgbWnDqXJjb2xlcy4KCmBgYHtyfQpnZ3Bsb3QoZGZfY29tYmluYWRvLCBhZXMoeCA9IHdlZWtfZGF5LCB5ID0gZGVwX2RlbGF5LCBmaWxsID0gb3JpZ2luKSkgKwogIGdlb21fYmFyKHN0YXQgPSAic3VtbWFyeSIsIGZ1biA9ICJtZWFuIiwgcG9zaXRpb24gPSAic3RhY2siKSArCiAgbGFicyh4ID0gIkTDrWEgZGUgbGEgc2VtYW5hIiwgeSA9ICJSZXRyYXNvIHByb21lZGlvIiwgZmlsbCA9ICJBZW9yb3B1ZXJ0byIpICsKICBnZ3RpdGxlKCJSZXRyYXNvIHByb21lZGlvIHBvciBkw61hIGRlIGxhIHNlbWFuYSB5IGFlcm9wdWVydG8iKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQzIikgKwogIHRoZW1lX21pbmltYWwoKQoKc3VtbWFyeV9kZWxheV93ZWVrIDwtIGRmX2NvbWJpbmFkbyAlPiUKICBncm91cF9ieSh3ZWVrX2RheSkgJT4lCiAgc3VtbWFyaXNlKGF2Z19kZWxheSA9IG1lYW4oZGVwX2RlbGF5LCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICB0b3RhbF9mbGlnaHRzID0gbigpLAogICAgICAgICAgICB0b3RhbF9kZWxheWVkX2ZsaWdodHMgPSBzdW0oZGVwX2RlbGF5ID4gMCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgcGVyY19kZWxheWVkX2ZsaWdodHMgPSB0b3RhbF9kZWxheWVkX2ZsaWdodHMgLyB0b3RhbF9mbGlnaHRzICogMTAwKQoKc3VtbWFyeV9kZWxheV93ZWVrCmBgYAoKU2UgcHVlZGUgb2JzZXJ2YXIgcXVlIHRvZGFzIGxhcyB2YXJpYWJsZXMgaW5kZXBlbmRpZW50ZXMgdGllbmVuIHVuIHAtdmFsb3IgbWVub3IgcXVlIDAuMDAxLCBsbyBxdWUgaW1wbGljYSBxdWUgdG9kYXMgbGFzIHZhcmlhYmxlcyBpbmRlcGVuZGllbnRlcyB0aWVuZW4gdW4gZWZlY3RvIGVzdGFkw61zdGljYW1lbnRlIHNpZ25pZmljYXRpdm8gc29icmUgZWwgcmV0cmFzbyBtZWRpbyBkZSBzYWxpZGEuCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6Izk2Q0RDRDsiPkNvbmNsdXNpb25lczwvc3Bhbj4gIAoKRW4gZWwgc2VndW5kbyBhdmFuY2Ugc2UgcmVhbGl6YSB1biBhbsOhbGlzaXMgZGUgcmVncmVzacOzbiBsaW5lYWwgcGFyYSBleHBsb3JhciBsYSByZWxhY2nDs24gZW50cmUgZGl2ZXJzYXMgdmFyaWFibGVzIHkgZWwgcmV0cmFzbyBlbiBsb3MgdnVlbG9zLiBBZGVtw6FzLCBzZSBleGFtaW5hbiB2YXJpYWJsZXMgcmVsYWNpb25hZGFzIHByaW5jaXBhbG1lbnRlIGNvbiBlbCBjbGltYSB5IGVsIGTDrWEgZGUgbGEgc2VtYW5hIHBhcmEgaWRlbnRpZmljYXIgcG9zaWJsZXMgZmFjdG9yZXMgcXVlIGluZmx1eWVuIGVuIGxvcyByZXRyYXNvcyBkZSBsb3MgdnVlbG9zLgoKRWwgYW7DoWxpc2lzIGRlIHJlZ3Jlc2nDs24gbGluZWFsIHByb3BvcmNpb25hIGluZm9ybWFjacOzbiBzb2JyZSBsYSByZWxhY2nDs24gZW50cmUgbGFzIHZhcmlhYmxlcyBwcmVkaWN0b3JhcywgY29tbyBlbCBhZXJvcHVlcnRvIGRlIG9yaWdlbiwgY2xpbWEsIGhvcmEsIHkgdmFyaWFibGUgZGUgcmVzcHVlc3RhLCBxdWUgc2Vyw61hIGVsIHJldHJhc28gZW4gbG9zIHZ1ZWxvcy4gRXN0ZSBhbsOhbGlzaXMgcGVybWl0ZSBpZGVudGlmaWNhciBxdWUgZmFjdG9yZXMgcHVlZGVuIHRlbmVyIHVuIGltcGFjdG8gc2lnbmlmaWNhdGl2byBlbiBsb3MgcmV0cmFzb3MgZGUgbG9zIHZ1ZWxvcyB5IGNvbW8gc2UgcmVsYWNpb25hbiBlbnRyZSBzw60uCgojIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiM5NkNEQ0Q7Ij5Fc3RyYXRlZ2lhczwvc3Bhbj4gIApCYXPDoW5kb25vcyBlbiBsb3MgaGFsbGF6Z29zLCBwcm9wb25lbW9zIHVuYSBzZXJpZSBkZSBlc3RyYXRlZ2lhcyBwYXJhIGFib3JkYXIgbG9zIHJldHJhc29zIGVuIGxhIHNhbGlkYSBkZSB2dWVsb3MuCgpFbiBwcmltZXIgbHVnYXIsIGVzIGNydWNpYWwgb3B0aW1pemFyIGxhIGdlc3Rpw7NuIGRlbCB0csOhZmljbyBhw6lyZW8gZW4gYWVyb3B1ZXJ0b3MgY29uZ2VzdGlvbmFkb3MgY29tbyBlbCBBZXJvcHVlcnRvIEludGVybmFjaW9uYWwgTGliZXJ0YWQgZGUgTmV3YXJrIChFV1IpLiBFc3RvIGltcGxpY2EgaW1wbGVtZW50YXIgbWVkaWRhcyBxdWUgZGlzdHJpYnV5YW4gZGUgbWFuZXJhIG3DoXMgZWZpY2llbnRlIGxvcyB2dWVsb3MgeSBob3JhcmlvcywgZXNwZWNpYWxtZW50ZSBkdXJhbnRlIGxhcyBob3JhcyBwaWNvLCBjb24gZWwgb2JqZXRpdm8gZGUgcmVkdWNpciBsYSBzYXR1cmFjacOzbi4KCkFkZW3DoXMsIGVzIG5lY2VzYXJpbyBkZXNhcnJvbGxhciBwcm9ncmFtYXMgZGUgbWFudGVuaW1pZW50byBwcmV2ZW50aXZvIHBhcmEgZ2FyYW50aXphciBsYSBmaWFiaWxpZGFkIGRlIGxhIGZsb3RhIGRlIGF2aW9uZXMuIEVzdG9zIHByb2dyYW1hcyBheXVkYXLDrWFuIGEgcmVkdWNpciBsYXMgaW50ZXJydXBjaW9uZXMgY2F1c2FkYXMgcG9yIHByb2JsZW1hcyB0w6ljbmljb3MgaW5lc3BlcmFkb3MsIHRhbWJpw6luIHNlIHBvZHLDrWEgaW52ZXJ0aXIgZW4gbGEgbW9kZXJuaXphY2nDs24gZGUgbGEgZmxvdGEgZGUgYXZpb25lcywgaW5jb3Jwb3JhbmRvIHRlY25vbG9nw61hcyBtw6FzIGF2YW56YWRhcyB5IGVmaWNpZW50ZXMsIHNlcsOtYSBmdW5kYW1lbnRhbCBwYXJhIG1pbmltaXphciBlbCByaWVzZ28gZGUgZmFsbG9zIHkgbWVqb3JhciBlbCByZW5kaW1pZW50byBvcGVyYXRpdm8uCgpPdHJhIGVzdHJhdGVnaWEgaW1wb3J0YW50ZSBlcyBtZWpvcmFyIGxhIHBsYW5pZmljYWNpw7NuIGRlIHJ1dGFzIHkgaG9yYXJpb3MsIHRlbmllbmRvIGVuIGN1ZW50YSBsYXMgY29uZGljaW9uZXMgbWV0ZW9yb2zDs2dpY2FzIGhpc3TDs3JpY2FzLCBlc3BlY2lhbG1lbnRlIGR1cmFudGUgbG9zIG1lc2VzIGRlIG1heW9yIGNhbnRpZGFkIGRlIHJldHJhc29zLCBlc3RvIHBvZHLDrWEgaW1wbGljYXIgbGEgcmVhc2lnbmFjacOzbiBkZSBydXRhcyBzZWfDum4gbGEgcHJldmlzacOzbiBkZWwgdGllbXBvIHBhcmEgbWluaW1pemFyIGxhcyBpbnRlcnJ1cGNpb25lcy4KCkFkZW3DoXMsIHNlIHBvZHLDrWEgZGlzdHJpYnVpciBkZSBtYW5lcmEgbcOhcyBlcXVpdGF0aXZhIGxvcyB2dWVsb3MgYSBsbyBsYXJnbyBkZWwgYcOxbywgZXZpdGFuZG8gcGVyw61vZG9zIGRlIGNvbmdlc3Rpw7NuIGR1cmFudGUgbG9zIG1lc2VzIGRlIG1heW9yIGRlbWFuZGEuIEVzdG8gcG9kcsOtYSBsb2dyYXJzZSBtZWRpYW50ZSBpbmNlbnRpdm9zIHBhcmEgdmlhamFyIGVuIG1vbWVudG9zIGRlIG1lbm9yIGRlbWFuZGEgbyBhanVzdGVzIGVuIGxhcyB0YXJpZmFzIHNlZ8O6biBsYSB0ZW1wb3JhZGEuCgpQYXJhIGxvcyBkw61hcyBkZSBhbHRhIGRlbWFuZGEsIHNlIHBvZHLDrWEgaW1wbGVtZW50YXIgbWVkaWRhcyBvcGVyYXRpdmFzIGVzcGVjw61maWNhcywgY29tbyBlbCB1c28gZGUgcHVlcnRhcyBkZSBlbWJhcnF1ZSBhZGljaW9uYWxlcywgcGVyc29uYWwgZGUgdGllcnJhIGFkaWNpb25hbCB5IGhvcmFyaW9zIGRlIHR1cm5vcyBmbGV4aWJsZXMsIGNvbiBlc3RvIHNlIGFnaWxpemFyw61hIGxvcyBwcm9jZXNvcyBkZSBlbWJhcnF1ZSB5IGRlc2VtYmFycXVlLCBtZWpvcmFuZG8gbGEgZWZpY2llbmNpYSBvcGVyYXRpdmEuCgpQb3Igb3RybyBsYWRvLCBlcyBlc2VuY2lhbCBpbnZlcnRpciBlbiB0ZWNub2xvZ8OtYSBkZSBwcm9uw7NzdGljbyBkZWwgdGllbXBvIGF2YW56YWRhIHkgc2lzdGVtYXMgZGUgYWxlcnRhIHRlbXByYW5hIHBhcmEgaWRlbnRpZmljYXIgeSBtaXRpZ2FyIHBvdGVuY2lhbGVzIGludGVycnVwY2lvbmVzIGRlYmlkbyBhIGNvbmRpY2lvbmVzIG1ldGVvcm9sw7NnaWNhcyBhZHZlcnNhcywgbG8gY3VhbCBwZXJtaXRpcsOtYSB1bmEgbWVqb3IgdG9tYSBkZSBkZWNpc2lvbmVzIG9wZXJhdGl2YXMuCgojIDxzcGFuIHN0eWxlPSJjb2xvcjojQ0Q5NkNEOyI+QXZhbmNlIDM8L3NwYW4+IAoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiM2Q0E2Q0Q7Ij5Nb2RlbG8gZW50aWRhZCByZWxhY2lvbmFsPC9zcGFuPgoKYGBge3J9CiMgYWVyb2zDrW5lYSwgYWVyb3B1ZXJ0byBkZSBvcmlnZW4geSBhZXJvcHVlcnRvIGRlc3Rpbm8gcG9yIHZ1ZWxvCmRmMSA8LSBmbGlnaHRzICU+JSAKICBzZWxlY3QoY2Fycmllciwgb3JpZ2luLCBkZXN0KQoKZGYxCmBgYAoKYGBge3J9CiMgbm9tYnJlIGRlIGNhZGEgYWVyb2xpbmVhCmRmMiA8LSBkZjEgJT4lIAogIGxlZnRfam9pbihhaXJsaW5lcywgYnk9ICJjYXJyaWVyIikKCmRmMgpgYGAKCmBgYHtyfQojIGNhbnRpZGFkIGRlIHZ1ZWxvcyBwb3IgY2FkYSBkZXN0aW5vCmRmMyA8LSBmbGlnaHRzICU+JSAKICBncm91cF9ieShjYXJyaWVyKSAlPiUgCiAgc3VtbWFyaXNlKG51bV9mbGlnaHRzPSBuKCkpICU+JSAKICBhcnJhbmdlKGRlc2MobnVtX2ZsaWdodHMpKQoKZGYzCmBgYAoKYGBge3J9CgojIG5vbWJyZSBhZXJvbGluZWEKZGY0IDwtIGRmMyAlPiUgCiAgbGVmdF9qb2luKGFpcmxpbmVzLCBieT0gImNhcnJpZXIiKQoKCmRmNApgYGAKCmBgYHtyfQojIG51ZXZvIGNhbXBvCgpkZjUgPC0gZmxpZ2h0cyAlPiUKICBzZWxlY3QoY2FycmllciwgZGVzdCwgc2NoZWRfZGVwX3RpbWUpICU+JSAKICBsZWZ0X2pvaW4oYWlybGluZXMsIGJ5PSAiY2FycmllciIpCgpob3JhIDwtIGRmNSAlPiUgCiAgbXV0YXRlKGNsYXNfaG9yYXJpbyA9IGNhc2Vfd2hlbigKICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4oc2NoZWRfZGVwX3RpbWUsIDYwMCwgMTE1OSkgfiAiTWHDsWFuYSIsCiAgICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuKHNjaGVkX2RlcF90aW1lLCAxMjAwLCAxODU5KSB+ICJUYXJkZSIsCiAgICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuKHNjaGVkX2RlcF90aW1lLCAxOTAwLCAyNDAwKSB+ICJOb2NoZSIsCiAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gIk1hZHJ1Z2FkYSIKICAgICAgICAgICAgICAgICAgICApKQoKaG9yYQpgYGAKCmBgYHtyfQojIGNhbnRpZGFkIGRlIHZ1ZWxvcyBwb3IgYWVyb2xpbmVhIHkgaG9yYQpkZjYgPC0gaG9yYSAlPiUKICBncm91cF9ieShjYXJyaWVyLCBkZXN0LCBjbGFzX2hvcmFyaW8pICU+JQogIHN1bW1hcmlzZShudW1fZmxpZ2h0cyA9IG4oKSkgJT4lCiAgYXJyYW5nZShjYXJyaWVyLCBkZXN0LCBjbGFzX2hvcmFyaW8pCgpkZjYKYGBgCgpgYGB7cn0KIyB2dWVsb3MgZGUgQW1lcmljYW4gQWlybGluZXMgZHVyYW50ZSBsYSBtYWRkcnVncmFkYQpkZjcgPC0gaG9yYSAlPiUKICBzZWxlY3QoY2FycmllcixuYW1lLCBkZXN0LGNsYXNfaG9yYXJpbykgJT4lIAogIGZpbHRlcihjYXJyaWVyID09ICJBQSIsIGNsYXNfaG9yYXJpbyA9PSAiTWFkcnVnYWRhIikgJT4lIAogIGdyb3VwX2J5KGNhcnJpZXIsbmFtZSwgZGVzdCxjbGFzX2hvcmFyaW8pCgpkZjcKYGBgCgpgYGB7cn0KIyBhdmlvbmVzIGRlIEFtZXJpY2FuIEFpcmxpbmVzCmRmOCA8LSBmbGlnaHRzICU+JQogIGxlZnRfam9pbihwbGFuZXMsIGJ5ID0gInRhaWxudW0iKSAlPiUKICBmaWx0ZXIoY2FycmllciA9PSAiQUEiICYgIWlzLm5hKHR5cGUpKSAlPiUKICBncm91cF9ieShjYXJyaWVyLCB0eXBlLCBlbmdpbmUsIHNlYXRzKSAlPiUKICBzdW1tYXJpc2UobnVtX2ZsaWdodHMgPSBuKCkpICU+JQogIGFycmFuZ2UoZGVzYyhudW1fZmxpZ2h0cykpCgpkZjgKYGBgCgoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiM5RkI2Q0Q7Ij5WaXN1YWxpemFjacOzbiBkZSBkYXRvczwvc3Bhbj4KCiMjIyA8c3BhbiBzdHlsZT0iY29sb3I6IzUzODY4QjsiPkFuw6FsaXNpcyBkZSByZXRyYXNvcyBlbiBsYSBhZXJvbMOtbmVhIEFtZXJpY2FuIEFpcmxpbmVzOiBQYXJ0aWRhIHZzIExsZWdhZGE8L3NwYW4+CgpgYGB7cn0KcGxvdChmbGlnaHRzJGRlcF9kZWxheSwgZmxpZ2h0cyRhcnJfZGVsYXksCiAgICAgbWFpbiA9ICJBbsOhbGlzaXMgZGUgcmV0cmFzb3MgZW4gbGEgcGFydGlkYSB5IGxsZWdhZGEgcGFyYSBBbWVyaWNhbiBBaXJsaW5lcyIsCiAgICAgeGxhYiA9ICJSZXRyYXNvcyBlbiBsYSBwYXJ0aWRhIiwKICAgICB5bGFiID0gInJldHJhc29zIGVuIGxhIGxsZWdhZGEiLAogICAgIGNvbCA9ICJibHVlIiwKICAgICBwY2ggPSAxCiAgICAgKQpgYGAKCk9ic2VydmFjaW9uZXM6IApFeGlzdGUgdW5hIGNvcnJlbGFjacOzbiBwb3NpdGl2YSBlbnRyZSBsb3MgcmV0cmFzb3MgZW4gbGEgcGFydGlkYSB5IGxvcyByZXRyYXNvcyBlbiBsYSBsbGVnYWRhIHBhcmEgQW1lcmljYW4gQWlybGluZXMuIEVzdG8gc2lnbmlmaWNhIHF1ZSBsb3MgdnVlbG9zIHF1ZSBzZSByZXRyYXNhbiBhbCBwYXJ0aXIgdGFtYmnDqW4gdGllbmRlbiBhIGxsZWdhciB0YXJkZSBhIHN1cyBkZXN0aW5vcywgbG8gcXVlIGltcGxpY2EgdW5hIGZhbHRhIGRlIGVmaWNpZW5jaWEgeSBwdW50dWFsaWRhZCBlbiBlbCBzZXJ2aWNpbyBkZSBsYSBhZXJvbMOtbmVhLiBFc3RvIHNlIHB1ZWRlIG9ic2VydmFyIGVuIGxhIGdyw6FmaWNhIGRlIGRpc3BlcnNpw7NuIHF1ZSBhY29tcGHDsWEgbGEgb2JzZXJ2YWNpw7NuLCBkb25kZSBzZSBtdWVzdHJhIHVuYSBjbGFyYSByZWxhY2nDs24gcG9zaXRpdmEgZW50cmUgbG9zIGRvcyBlamVzLiBBZGVtw6FzLCBzZSBwdWVkZW4gbWVuY2lvbmFyIGFsZ3Vub3MgZmFjdG9yZXMgZXh0ZXJub3MgcXVlIHBvZHLDrWFuIGluZmx1aXIgZW4gbG9zIHJldHJhc29zIHNpbXVsdMOhbmVvcywgY29tbyBlbCBjbGltYSwgZWwgdHLDoWZpY28gYcOpcmVvIG8gcHJvYmxlbWFzIHTDqWNuaWNvcy4KCiMjIyA8c3BhbiBzdHlsZT0iY29sb3I6I0EyQ0Q1QTsiPlRlbmRlbmNpYSBkZSBsYSB0ZW1wZXJhdHVyYSBlbiBsb3MgcHJpbWVyb3MgMTUgZMOtYXMgZGUgZW5lcm8gZGVzZGUgTmV3YXJrIChFV1IpPC9zcGFuPgoKYGBge3J9Cgp0ZW1wX3Byb21lZGlvIDwtIGZsaWdodF93ZWF0aGVyICU+JQogIGZpbHRlcihvcmlnaW4gPT0gIkVXUiIpICU+JQogIG11dGF0ZShkYXRlID0gYXMuRGF0ZShwYXN0ZSh5ZWFyLCBtb250aCwgZGF5LCBzZXAgPSAiLSIpKSkgJT4lCiAgc2VsZWN0KGRhdGUsIGNlbGNpdXMpICU+JQogIGdyb3VwX2J5KGRhdGUpICU+JQogIHN1bW1hcmlzZSh0ZW1wX3Byb21lZGlvID0gbWVhbihjZWxjaXVzLCBuYS5ybSA9IFRSVUUpKQoKdGVtcF9wcm9tZWRpb19lbmVybyA8LSB0ZW1wX3Byb21lZGlvICU+JQogIGZpbHRlcihiZXR3ZWVuKGRhdGUsIGFzLkRhdGUoIjIwMTMtMDEtMDEiKSwgYXMuRGF0ZSgiMjAxMy0wMS0xNSIpKSkKCnBsb3QodGVtcF9wcm9tZWRpb19lbmVybyRkYXRlLCB0ZW1wX3Byb21lZGlvX2VuZXJvJHRlbXBfcHJvbWVkaW8sIAogICAgIHR5cGUgPSAibCIsCiAgICAgbWFpbiA9ICJUZW1wZXJhdHVyYSBkdXJhbnRlIGxvcyBwcmltZXJvcyAxNSBkw61hcyBkZSBlbmVybyBlbiAoTmV3YXJrKSIsCiAgICAgeGxhYiA9ICJGZWNoYSIsCiAgICAgeWxhYiA9ICJUZW1wZXJhdHVyYSBQcm9tZWRpbyAoQ8KwKSIpCmBgYAoKT2JzZXJ2YWNpb25lczogCkxhIHRlbXBlcmF0dXJhIHByb21lZGlvIGR1cmFudGUgbG9zIHByaW1lcm9zIDE1IGTDrWFzIGRlIGVuZXJvIGVuIE5ld2FyayBlcyB2YXJpYWJsZSB5IGRlcGVuZGUgZGUgdmFyaW9zIGZhY3RvcmVzIG1ldGVvcm9sw7NnaWNvcy4gRXN0byBpbXBsaWNhIHF1ZSBlbCBjbGltYSBkZSBOZXdhcmsgZXMgaW5lc3RhYmxlIHkgY2FtYmlhbnRlLCBsbyBxdWUgc3VnaWVyZSBxdWUgaGF5IHVuYSBpbmZsdWVuY2lhIGRlIGxhcyBjb25kaWNpb25lcyBhdG1vc2bDqXJpY2FzIGxvY2FsZXMgeSByZWdpb25hbGVzIGVuIGxhIHRlbXBlcmF0dXJhIGRlIGxhIGNpdWRhZC4gRXN0byBzZSBwdWVkZSBvYnNlcnZhciBlbiBsYSBncsOhZmljYSBkZSBsw61uZWEgcXVlIGFjb21wYcOxYSBsYSBvYnNlcnZhY2nDs24sIGRvbmRlIHNlIG11ZXN0cmEgbGEgZmx1Y3R1YWNpw7NuIGRlIGxhIHRlbXBlcmF0dXJhIHByb21lZGlvIGVudHJlIDQgeSAxMiBncmFkb3MuCgojIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiM3OUNEQ0Q7Ij5UZW1wZXJhdHVyYSBtw6FzIGZyZWN1ZW50ZSBlbiBsb3MgcHJpbWVyb3MgMTUgZMOtYXMgZGUgZW5lcm88L3NwYW4+CgpgYGB7cn0Kd2VhdGhlcl9lbmVybyA8LSBmbGlnaHRfd2VhdGhlciAlPiUKICBmaWx0ZXIobW9udGggPT0gMSwgZGF5ID49IDEsIGRheSA8PSAxNSkKCndlYXRoZXJfZW5lcm8kZGF0ZSA8LSBhcy5EYXRlKHBhc3RlKHdlYXRoZXJfZW5lcm8keWVhciwgd2VhdGhlcl9lbmVybyRtb250aCwgd2VhdGhlcl9lbmVybyRkYXksIHNlcCA9ICItIikpCgp0ZW1wX3Byb21lZGlvIDwtIHdlYXRoZXJfZW5lcm8gJT4lCiAgZ3JvdXBfYnkoZGF0ZSkgJT4lCiAgc3VtbWFyaXplKHRlbXBfcHJvbWVkaW8gPSBtZWFuKGNlbGNpdXMsIG5hLnJtID0gVFJVRSkpCgpnZ3Bsb3QoZGF0YSA9IHRlbXBfcHJvbWVkaW8sIGFlcyh4ID0gdGVtcF9wcm9tZWRpbykpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDUsIGZpbGwgPSAic2t5Ymx1ZSIsIGNvbG9yID0gImJsYWNrIikgKwogIGxhYnModGl0bGUgPSAiSGlzdG9ncmFtYSBkZSBQcm9tZWRpbyBkZSBUZW1wZXJhdHVyYXMgZGVsIDEgYWwgMTUgZGUgRW5lcm8iLAogICAgICAgeCA9ICJQcm9tZWRpbyBkZSBUZW1wZXJhdHVyYSAoQ8KwKSIsCiAgICAgICB5ID0gIkZyZWN1ZW5jaWEiKQoKCmBgYAoKT2JzZXJ2YWNpb25lczoKTGEgdGVtcGVyYXR1cmEgcHJvbWVkaW8gZHVyYW50ZSBsb3MgcHJpbWVyb3MgMTUgZMOtYXMgZGUgZW5lcm8gZXMgcmVsYXRpdmFtZW50ZSBjb25zdGFudGUgeSBzZSBjb25jZW50cmEgZW50cmUgMCB5IDEwIGdyYWRvcy4gRXN0byBpbXBsaWNhIHF1ZSBlbCBjbGltYSBlcyBtb2RlcmFkbyB5IHBvY28gdmFyaWFibGUsIGFkZW3DoXMsIHN1Z2llcmUgcXVlIGhheSB1bmEgbWVub3IgaW5mbHVlbmNpYSBkZSBsb3MgZmFjdG9yZXMgbWV0ZW9yb2zDs2dpY29zIGV4dHJlbW9zIGVuIGxhIHRlbXBlcmF0dXJhLiBFc3RvIHB1ZWRlIG9ic2VydmFyIGVuIGVsIGhpc3RvZ3JhbWEgcXVlIGFjb21wYcOxYSBsYSBvYnNlcnZhY2nDs24sIGRvbmRlIHNlIG11ZXN0cmEgbGEgZnJlY3VlbmNpYSBkZSBsYXMgdGVtcGVyYXR1cmFzIHByb21lZGlvIGVudHJlIDAgeSAxMCBncmFkb3MuIExhIG1heW9yIHBhcnRlIGRlIGxvcyBkYXRvcyBzZSBhZ3J1cGFuIGVuIHRvcm5vIGEgbG9zIDUgZ3JhZG9zLCBsbyBxdWUgaW5kaWNhIHVuYSB0ZW5kZW5jaWEgY2VudHJhbCB5IHVuYSBiYWphIGRpc3BlcnNpw7NuLgoKIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjojQ0Q2MDkwOyI+VmFyaWFjacOzbiBtZW5zdWFsIGRlIHRlbXBlcmF0dXJhPC9zcGFuPgoKYGBge3J9CmdncGxvdChkYXRhID0gZmxpZ2h0X3dlYXRoZXIsIGFlcyh4ID0gY2VsY2l1cykpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDUsIGNvbG9yID0gImJsdWUiKSArCiAgZmFjZXRfd3JhcCh+IG1vbnRoLCBucm93ID0gNCkKYGBgCgojIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiNBREQ4RTY7Ij5Ow7ptZXJvIGRlIHZ1ZWxvcyBkZXNkZSBOdWV2YSBZb3JrIHBvciBhZXJvbMOtbmVhIGVuIDIwMTM8L3NwYW4+CmBgYHtyfQpmbGlnaHRzX3RhYmxlIDwtIGZsaWdodHMgJT4lIAogIGdyb3VwX2J5KGNhcnJpZXIpICU+JSAKICBzdW1tYXJpemUobnVtYmVyID0gbigpKQogICAgICAgICAKZ2dwbG90KGRhdGEgPSBmbGlnaHRzX3RhYmxlLCBtYXBwaW5nID0gYWVzKHggPSBjYXJyaWVyLCB5ID0gbnVtYmVyKSkgKwogIGdlb21fY29sKCkKYGBgCgoKIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjojOUFDMENEOyI+RGlzdHJpYnVjacOzbiBkZSB2dWVsb3MgZGVzZGUgTnVldmEgWW9yayBwb3IgYWVyb2zDrW5lYSBlbiAyMDEzPC9zcGFuPgoKYGBge3J9CnBpZShmbGlnaHRzX3RhYmxlJG51bWJlciwKICAgIGxhYmVscyA9IGZsaWdodHNfdGFibGUkY2FycmllciwKICAgIG1haW4gPSAiUHJvcG9yY2nDs24gZGUgdnVlbG9zIHBvciBhZXJvbMOtbmVhIiwKICAgIGNvbCA9IHJhaW5ib3cobGVuZ3RoKGZsaWdodHNfdGFibGUkY2FycmllcikpLAogICAgY2V4ID0gMC44KQpgYGAKCgojIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiNCNENEQ0Q7Ij5SZWxhY2nDs24gZW50cmUgbG9zIGRhdGFmcmFtZXMgJ2ZsaWdodHMnIHkgJ2FpcnBvcnRzJyBhIHRyYXbDqXMgZGVsIGNhbXBvIGRlc3Rpbm88L3NwYW4+CgpgYGB7cn0KdG9wX2NhcnJpZXJzIDwtIGZsaWdodHMgJT4lIAogIGlubmVyX2pvaW4oYWlycG9ydHMsIGJ5ID0gYygib3JpZ2luIikpCmBgYAoKIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjojQ0Q4Qzk1OyI+RGF0YWZyYW1lIGZpbHRyYWRvIGNvbiBsb3MgNSBjYXJyaWVycyBjb24gbcOhcyB2dWVsb3MgcG9yIGRlc3Rpbm88L3NwYW4+CgpgYGB7cn0KZ2dwbG90KGRhdGEgPSB0b3BfY2FycmllcnMsIG1hcHBpbmcgPSBhZXMoeCA9IGNhcnJpZXIsIGZpbGwgPSBuYW1lKSkgKwogIGdlb21fYmFyKCkKCmBgYAoKYGBge3J9CmdncGxvdChkYXRhID0gdG9wX2NhcnJpZXJzLCBtYXBwaW5nID0gYWVzKHggPSBjYXJyaWVyLCBmaWxsID0gbmFtZSkpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIpCmBgYAoKYGBge3J9CmdncGxvdChkYXRhID0gdG9wX2NhcnJpZXJzLCBtYXBwaW5nID0gYWVzKHggPSBjYXJyaWVyLCBmaWxsID0gbmFtZSkpICsKICBnZW9tX2JhcigpICsKICBmYWNldF9ncmlkKG5hbWUgfiAuKQpgYGAKCk9ic2VydmFjaW9uZXM6IApVQSBmdWUgZWwgY2FycmllciBjb24gbcOhcyB2dWVsb3MgZW4gMjAxMywgc2VndWlkbyBwb3IgQjYgeSBFViwgbWllbnRyYXMgcXVlIEY5LCBGTCB5IEhBIGZ1ZXJvbiBsb3MgcXVlIG1lbm9zIHZ1ZWxvcyB0dXZpZXJvbi4gRXN0byBzaWduaWZpY2EgcXVlIFVBIGZ1ZSBlbCBjYXJyaWVyIG3DoXMgZGVtYW5kYWRvIHkgY29uIG1heW9yIG9mZXJ0YSBkZSBzZXJ2aWNpb3MgYcOpcmVvcyBlbiAyMDEzLCBwb3IgZWwgY29udHJhcmlvLCBGOSwgRkwgeSBIQSBmdWVyb24gbG9zIGNhcnJpZXJzIG1lbm9zIHNvbGljaXRhZG9zIHkgY29uIG1lbm9yIGRpc3BvbmliaWxpZGFkIGRlIHZ1ZWxvcywgbG8gcXVlIHB1ZWRlIGluZGljYXIgc3UgaW5lZmljYWNpYSBvIGZhbHRhIGRlIGNvbXBldGl0aXZpZGFkLkVzdG8gc2UgcHVlZGUgb2JzZXJ2YXIgZW4gbGEgZ3LDoWZpY2EgZGUgYmFycmFzIHF1ZSBhY29tcGHDsWEgbGEgb2JzZXJ2YWNpw7NuLCBkb25kZSBzZSBtdWVzdHJhIGVsIG7Dum1lcm8gZGUgY291bnQgcG9yIGNhcnJpZXIgZW4gMjAxMywgc2Vnw7puIGxhIGdyw6FmaWNhLCBlbCBjYXJyaWVyIFVBIHR1dm8gdW4gY291bnQgZGUgYWxyZWRlZG9yIGRlIDU5LDAwMCwgZWwgQjYgdHV2byB1biBjb3VudCBkZSA1NCwwMDAsIGVsIEVWIHR1dm8gdW4gY291bnQgZGUgYWxyZWRlZG9yIGRlIDUxLDAwMCwgZWwgRjkgdHV2byB1biBjb3VudCBkZSBhbHJlZGVkb3IgZGUgNCwwMDAsIGVsIEZMIHR1dm8gdW4gY291bnQgZGUgMywwMCB5IGVsIEhBIHR1dm8gdW4gY291bnQgZGUgYWxyZWRlZG9yIDMsMDYwLiBFc3RvcyBuw7ptZXJvcyBjb25maXJtYW4gbGEgZ3JhbiBkaWZlcmVuY2lhIGVudHJlIGxvcyBjYXJyaWVycyBtw6FzIHkgbWVub3MgZnJlY3VlbnRlLgoKVUEgZnVlIGVsIGNhcnJpZXIgY29uIG3DoXMgdnVlbG9zIGVuIE5ld2FyayBMaWJlcnR5IEludGwsIEI2IGZ1ZSBlbCBjYXJyaWVyIGNvbiBtw6FzIHZ1ZWxvcyBlbiBKb2huIEYgS2VubmVkeSBJbnRsIHkgREwgZnVlIGVsIGNhcnJpZXIgY29uIG3DoXMgdnVlbG9zIGVuIExhIEd1YXJkaWEgZW4gMjAxMy4gRXN0byBzaWduaWZpY2EgcXVlIGNhZGEgY2FycmllciB0aWVuZSB1bmEgcHJlZmVyZW5jaWEgZW4gZGV0ZXJtaW5hZG8gYWVyb3B1ZXJ0bywgbG8gcXVlIHN1Z2llcmUgcXVlIGhheSB1bmEgZGl2ZXJzaWRhZCBkZSBvcGNpb25lcyBwYXJhIGxvcyBwYXNhamVyb3MgcXVlIHZpYWphbiBkZXNkZSBvIGhhY2lhIGVzdG9zIGFlcm9wdWVydG9zLiBFc3RvIHNlIHB1ZWRlIG9ic2VydmFyIGVuIGxhIGdyw6FmaWNhIGRlIGJhcnJhcyBxdWUgYWNvbXBhw7FhIGxhIG9ic2VydmFjacOzbiwgZG9uZGUgc2UgbXVlc3RyYSBlbCBuw7ptZXJvIGRlIGNvdW50IHBvciBjYXJyaWVyIGVuIHRyZXMgYWVyb3B1ZXJ0b3MgZGlmZXJlbnRlczogSm9obiBGIEtlbm5lZHkgSW50bCAocm9qbyksIExhIEd1YXJkaWEgKHZlcmRlKSB5IE5ld2FyayBMaWJlcnR5IEludGwgKGF6dWwpLiBTZWfDum4gbGEgZ3LDoWZpY2EsIGVsIGNhcnJpZXIgVUEgdHV2byBhbHJlZGVkb3IgZGUgNTUsMDAwIHZ1ZWxvcyBlbiBOZXdhcmsgTGliZXJ0eSBJbnRsLCBlbCBCNiB0dXZvIGFscmVkZWRvciBkZSA0NSwwMDAgdnVlbG9zIGVuIEpvaG4gRiBLZW5uZWR5IEludGwgeSBlbCBFViB0dXZvIGFscmVkZWRvciBkZSA1NSwwMDAgdnVlbG9zIGVuIE5ld2FyayBMaWJlcnR5IEludGwuIEVzdG9zIG7Dum1lcm9zIGNvbmZpcm1hbiBsYSBkaWZlcmVuY2lhIGVudHJlIGxvcyBjYXJyaWVycyBlbiBjYWRhIGFlcm9wdWVydG8uCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IzhEQjZDRDsiPkNvbmNsdXNpb25lczwvc3Bhbj4gIAoKRWwgYXZhbmNlIGZpbmFsIHByZXNlbnRhIHVuIG1vZGVsbyAqZW50aWRhZC1yZWxhY2nDs24qIHF1ZSBtdWVzdHJhIGxhIHJlbGFjacOzbiBlbnRyZSBsb3MgZGF0b3MgZGUgdnVlbG9zLCBhZXJvbMOtbmVhcyB5IGFlcm9wdWVydG9zLCBhc8OtIGNvbW8gdmlzdWFsaXphY2lvbmVzIHF1ZSBwcm9wb3JjaW9uYW4gaW5mb3JtYWNpw7NuIGFkaWNpb25hbCBzb2JyZSBsb3MgZGF0b3MgeSByZWxhY2lvbmVzIGlkZW50aWZpY2FkYXMuIAoKRWwgbW9kZWxvIHJldmVsYSBjw7NtbyBzZSByZWxhY2lvbmFuIGxvcyBkYXRvcyBkZSB2dWVsb3MgY29uIGluZm9ybWFjacOzbiBkZSBhZXJvbMOtbmVhcyB5IGFlcm9wdWVydG9zLCBsbyBxdWUgcGVybWl0ZSBlbnRlbmRlciBtZWpvciBsYSBkaXN0cmlidWNpw7NuIGRlIHZ1ZWxvcywgbGEgZnJlY3VlbmNpYSBkZSB2dWVsb3MgcG9yIGFlcm9sw61uZWEsIGxvcyBwYXRyb25lcyBkZSB0ZW1wZXJhdHVyYSB5IGxhIHJlbGFjacOzbiBlbnRyZSBsb3MgdnVlbG9zIHkgbG9zIGFlcm9wdWVydG9zIGRlIG9yaWdlbiB5IGRlc3Rpbm8uIAoKU2UgbXVlc3RyYW4gY29uc3VsdGFzIHF1ZSBjb21iaW5hbiBkYXRvcyBkZSB2dWVsb3MgY29uIGluZm9ybWFjacOzbiBkZSBhZXJvbMOtbmVhcyB5IGFlcm9wdWVydG9zLCBhc8OtIGNvbW8gZ3LDoWZpY29zIHF1ZSByZXByZXNlbnRhbiBsYSBkaXN0cmlidWNpw7NuIGRlIHZ1ZWxvcyBwb3IgYWVyb2zDrW5lYSwgbGEgdmFyaWFjacOzbiBkZSBsYSB0ZW1wZXJhdHVyYSBhIGxvIGxhcmdvIGRlbCB0aWVtcG8geSBsYSByZWxhY2nDs24gZW50cmUgbG9zIHZ1ZWxvcyB5IGxvcyBhZXJvcHVlcnRvcy4gCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6ICNDRDkxOUU7Ij5Db25jbHVzaW9uZXMgY29tcHJvbWlzbyDDqXRpY28geSBjaXVkYWRhbm88L3NwYW4+CgojIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiAjQ0Q5MTlFOyI+T3ZlZCBSdWl6IEd1em3DoW48L3NwYW4+IAoKTGEgaW50ZWdyaWRhZCBlcyBsYSBmb3JtYSBxdWUgdGVuZW1vcyBhbCBhY3R1YWwsIGVzIGRlY2lyIGRlIGZvcm1hIGhvbmVzdGEsIMOpdGljYSB5IGNvaGVyZW50ZSBjb24gbnVlc3Ryb3MgdmFsb3JlcyBtb3JhbGVzLiBMYSBpbnRlZ3JpZGFkIGVzIHVuIHBpbGFyIGZ1bmRhbWVudGFsIGVuIGN1YWxxdWllciBkaXNjaXBsaW5hIHByb2Zlc2lvbmFsLCBlc3BlY2lhbG1lbnRlIGVuIGVsIG1hbmVqbyBkZSBkYXRvcywgZG9uZGUgaW1wbGljYSBhY3R1YXIgZGUgbWFuZXJhIGhvbmVzdGEsIMOpdGljYSB5IGNvaGVyZW50ZSBjb24gbnVlc3Ryb3MgdmFsb3JlcyBtb3JhbGVzLiBEYXRvcy5nb2IuZXMgKDIwMTcpIHNlw7FhbGEgcXVlICJsYSDDqXRpY2EgZGViZSBwZXJtZWFyIHRvZGFzIGxhcyBldGFwYXMgZGVsIGNpY2xvIGRlIHZpZGEgeSBnZXN0acOzbiBkZSBsb3MgZGF0b3MsIGFzZWd1cmFuZG8gcXVlIGxhIHJlY29sZWNjacOzbiBzZWEgaW1wYXJjaWFsIHkgdHJhbnNwYXJlbnRlIHBhcmEgZXZpdGFyIGxhIGV4Y2x1c2nDs24gZGUgZ3J1cG9zIHkgcG9zaWJsZXMgZGlzY3JpbWluYWNpb25lcyBlbiB1c29zIHBvc3RlcmlvcmVzIiwgZXMgZGVjaXIsIGVzIGVzY2VuY2lhbCByZXNwZXRhciBsYSBwcml2YWNpZGFkIHkgY29uZmlkZW5jaWFsaWRhZCBkZSBsb3MgZGF0b3MsIGFzw60gY29tbyBzZXIgaW1wYXJjaWFsZXMgY29uIGVzdGEuCgpQb3Igb3RybyBsYWRvLCBlcyBpbXBvcnRhbnRlIHF1ZSBjYWRhIG9yZ2FuaXphY2nDs24gZXN0YWJsZXpjYSBzdXMgcHJvcGlhcyBwYXV0YXMgw6l0aWNhcyBlc3BlY8OtZmljYXMgcGFyYSBlbCB1c28gZGUgbG9zIGRhdG9zLCBjb21vIHNlw7FhbGEgZGF0b3MuZ29iLmVzICgyMDE3KS4gRXN0byBpbXBsaWNhIHVuYSBncmFuIHJlc3BvbnNhYmlsaWRhZCDDqXRpY2EgZW4gZWwgbWFuZWpvIGRlIGxhIGluZm9ybWFjacOzbiBlbXByZXNhcmlhbCwgeWEgcXVlIHN1IG1hbCB1c28gcHVlZGUgdGVuZXIgY29uc2VjdWVuY2lhcyBuZWdhdGl2YXMgdGFudG8gcGFyYSBsYSBvcmdhbml6YWNpw7NuIGNvbW8gcGFyYSBsb3MgaW5kaXZpZHVvcyBpbnZvbHVjcmFkb3MuCgpBZGVtw6FzLCBjb21vIG1lbmNpb25hIE9yYWNsZSBDbG91ZCAocy5mKSwgImxvcyBkYXRvcyBlbXByZXNhcmlhbGVzIHNvbiB1biBhY3Rpdm8gdmFsaW9zbyBxdWUgcGVybWl0ZSBpZGVudGlmaWNhciB0ZW5kZW5jaWFzLCB0b21hciBkZWNpc2lvbmVzIGluZm9ybWFkYXMgeSBtYW50ZW5lciBsYSB2ZW50YWphIGNvbXBldGl0aXZhIi4gU2luIGVtYmFyZ28sIGVzIGltcG9ydGFudGUgcmVjb3JkYXIgcXVlIGVzdGEgZGlzcG9uaWJpbGlkYWQgZGUgaW5mb3JtYWNpw7NuIGNvbmxsZXZhIHVuYSByZXNwb25zYWJpbGlkYWQgw6l0aWNhIHNpZ25pZmljYXRpdmEgZW4gY3VhbnRvIGEgc3UgbWFuZWpvIHkgdXRpbGl6YWNpw7NuLgoKIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjogI0NEOTE5RTsiPk1hcsOtYSBTw6FlbnogUGFyw6FzPC9zcGFuPiAKCk1lIHBhcmVjZSBxdWUgbGEgaW50ZWdyaWRhZCBlcyBlc2NlbmNpYWwgcGFyYSBtYW50ZW5lciBjb25maWFuemEsIGVzIGFzw60gY29tbyBtaSBpbnRlZ3JpZGFkIGNvbW8gZXN0dWRpYW50ZSB5IHNvYnJlIHRvZG8gZW4gZWwgY2FtcG8gZGUgY2llbmNpYSBkZSBkYXRvcyBvZnJlY2Ugc2VndXJpZGFkIGVuIHJlc3VsdGFkb3MgeSBlbCB1c28gw6l0aWNvIGRlIGxhIGluZm9ybWFjacOzbiwgYmFzw6FuZG9zZSBlbiBsYSB0cmFuc3BhcmVuY2lhIHkgcmVzcG9uc2FiaWxpZGFkLiBFc3RvIGltcGxpY2EgbW9zdHJhciBsYSBpbmZvcm1hY2nDs24gY29tcGxldGEgeSBjbGFyYSBzb2JyZSBsb3MgbcOpdG9kb3MgdXRpbGl6YWRvcyB5IGxhIGZ1ZW50ZSBkZSBsb3MgZGF0b3MuIFBhcmEgbWksIGVsIHRlbmVyIGFjY2VzbyBhIGxhIGluZm9ybWFjacOzbiBkZSB1bmEgZW1wcmVzYSBjb25sbGV2YSB1bmEgZ3JhbiByZXNwb25zYWJpbGlkYWQgdGFudG8gbGVnYWwgY29tbyDDqXRpY2E7IGVzdGEgZGViZSB0cmF0YXJzZSBjb24gY29uZmlkZW5jaWFsaWRhZCB5IHJlc3BldG8gYSBsYSBwcml2YWNpZGFkLiBFbCB1c28gaW5hZGVjdWFkbyBkZSBlc3RhIHB1ZWRlIGxsZXZhciBhIGNvbnNlY3VlbmNpYXMgbGVnYWxlcyB5IGRhw7FvcyBhIGxhIHJlcHV0YWNpw7NuLCBubyBzb2xvIGRlIGxhIGVtcHJlc2EsIHNpbm8gZGUgbGEgcGVyc29uYSBxdWUgbGEgdXRpbGl6YS4gRmluYWxtZW50ZSwgc2UgZGViZW4gZGUgdG9tYXIgZGVzaWNpb25lcyBkZSBtYW5lcmEgaW1wYXJjaWFsLCBjb25zaWRlcmFuZG8gc3UgaW1wYWN0byBlbiB0b2RhcyBsYXMgcGFydGVzIGludm9sdWNyYWRhcy4gCgpCaWJsaW9ncmFmw61hOgorR2luZXIsIEcuIEouICgyMDIxKS4gTGEgaW1wb3J0YW5jaWEgZGUgbGEgw6l0aWNhIGVuIGxvcyBuZWdvY2lvcy4gUmV2aXN0YSBFc2N1ZWxhIGRlIE5lZ29jaW9zIGRlIGxhIFVFTUMuIAorUHJvdm9zdCwgRi4sICYgRmF3Y2V0dCwgVC4gKDIwMTMpLiBEYXRhIFNjaWVuY2UgZm9yIEJ1c2luZXNzOiBXaGF0IFlvdSBOZWVkIHRvIEtub3cgYWJvdXQgRGF0YSBNaW5pbmcgYW5kIERhdGEtQW5hbHl0aWMgVGhpbmtpbmcuIAorRGhhciwgVi4oMjAxNSkuIERhdGEgc2NpZW5jZSBhbmQgcHJlZGljdGlvbi4gQ29tbXVuaWNhdGlvbnMgb2YgdGhlIEFDTSwgNjQtNzMuCgojIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiAjQ0Q5MTlFOyI+UGFibG8gU2FuY2hvPC9zcGFuPiAKCkRlc3B1ZXMgZGUgcmVhbGl6YXIgZXN0YSBzaXR1YWNpw7NuIHByb2JsZW1hLCBwZXJzb25hbG1lbnRlIGxsZWd1ZSBhIGxhIGNvbmNsdXNpw7NuIGRlIHF1ZSB1c2FuZG8gZGlmZXJlbnRlcyBoZXJyYW1pZW50YXMgZGVudHJvIGRlIFIsIHNlIHB1ZWRlbiByZWFsaXphciBhbmFsaXNpcyBkZSBncmFuIGNhbGlkYWQgeSBleGFjdGl0dWQuIExvIGltcG9ydGFudGUgZXMgc2FiZXIgdXNhciBlc3RhcyBoZXJyYW1pZW50YXMgdGVjbm9sw7NnaWNhcyBwYXJhIHF1ZSBsYXMgZW1wcmVzYXMgcHVlZGFuIHNhY2FyIHByb3ZlY2hvIGRlIGxhcyBtaXNtYXMgKDIwMTkpLiBPYnZpYW1lbnRlLCBlc3RvIHNpZW1wcmUgZGViZSBzZXIgdGVuaWVuZG8gdW4gY3VpZGFkbyBpbXBvcnRhbnRlIGN1YW5kbyBzZSB0cmF0YSBkZSBsb3MgZGF0b3MsIHlhIHF1ZSBlc3RvcyBkZWJlbiBzZXIgdHJhdGFkb3MgY29uIG11Y2hvIGN1aWRhZG8sIHlhIHF1ZSBzb24gaGVycmFtaWVudGFzIGltcG9ydGFudGVzIHkgdmFsaW9zYXMgcGFyYSBsYXMgZW1wcmVzYXMgKDIwMTkpLiBQb3IgdWx0aW1vLCB0YW1iacOpbiBsb2dyZSByZWZsZXhpb25hciBxdWUgY3VhbmRvIHNlIHRyYXRhIGRlIHRyYWJhamFyIGNvbiBjw7NkaWdvLCBsbyBtYXMgaW1wb3J0YW50ZSBlcyBsYSBwYWNpZW5jaWEgeSBsYSBhdGVuY2nDs24sIHBvcnF1ZSBlbCBtYXMgbWluaW1vIGVycm9yIG5vcyBwdWVkZSBjYXVzYXIgbXVjaGlzaW1vcyBwcm9ibGVtYXMgeSB1bmEgZ3JhbiBjYW50aWRhZCBkZSBjb25mbGljdG9zLgoKQmlibGlvZ3JhZsOtYQorIE1vbnN0ZXIgRGlnaXRhbCBBZ2VuY3kuIOKAnExhIGltcG9ydGFuY2lhIGRlIGxhIHByb2dyYW1hY2nDs24gZW4gbGEgYWN0dWFsaWRhZC7igJ0gRXBpdGVjaCBTcGFpbiwgMjUgQXVnLiAyMDIyLCBodHRwczovL3d3dy5lcGl0ZWNoLWl0LmVzL2xhLWltcG9ydGFuY2lhLWRlLWxhLXByb2dyYW1hY2lvbi8uCisgU2FudGFuZGVyLCBCYW5jby4g4oCcSW50ZWdyaWRhZC7igJ0gQmFuY28gU2FudGFuZGVyLCBodHRwczovL3d3dy5iYW5jb3NhbnRhbmRlci5lcy9nbG9zYXJpby9pbnRlZ3JpZGFkLXNlZ3VyaWRhZC1vbmxpbmUuIAorIFVuaXIsIFZpdmUuIOKAnExlbmd1YWplIFIsIMK/cXXDqSBlcyB5IHBvciBxdcOpIGVzIHRhbiB1c2FkbyBlbiBiaWcgZGF0YT/igJ0gVU5JUiwgMjkgTm92LiAyMDE5LCAKCiAKCg==