Situación Problema:

Te acabas de incorporar a una empresa consultora en Inteligencia de Negocios, actualmente están brindando servicios de análisis para la industria de la aviación y les interesa tener a la aerolínea American Airlines como cliente ya que es una de las aerolíneas líderes en los aeropuertos de Nueva York, motivo por el cuál te han contratado.

Te han pedido que identifiques cómo puede dicha aerolínea mejorar su posición competitiva !!

Para identificar oportunidades de mejorar la posición competitiva de la aerolínea American Airlines, necesitas realizar algunos análisis, para determinar si hay variaciones en la posición de liderazgo de dicha aerolínea.

Modelo Entidad-Relación

Se te ha solicitado hacer un estudio sobre la situación actual de la aerolínea American Airlines ya que se necesita revisar sus destinos, horarios y aviones con los que cuenta para hacer propuestas de aumento o reducción de vuelos por destino y horarios, así como la cantidad de aviones.

Para lograrlo considera las funciones sugeridas en los siguientes pasos:

Consulta y explora el data frame planes y weather para que conozcas su contenido.

library(nycflights13)

#View(planes)
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  
##                    
##                    
##                    
## 
#View(weather)
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

Se necesita saber de cada vuelo, la aerolínea, el aeropuerto de origen y el aeropuerto destino.

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  
## 
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
select(flights)
## # A tibble: 336,776 × 0
vuelos <- select(flights, flight, carrier, origin, dest)
head(vuelos)
## # A tibble: 6 × 4
##   flight carrier origin dest 
##    <int> <chr>   <chr>  <chr>
## 1   1545 UA      EWR    IAH  
## 2   1714 UA      LGA    IAH  
## 3   1141 AA      JFK    MIA  
## 4    725 B6      JFK    BQN  
## 5    461 DL      LGA    ATL  
## 6   1696 UA      EWR    ORD

En la consulta anterior se necesita conocer el nombre de la aerolínea.

#left_join()

Se necesita saber la cantidad de vuelos por cada destino para identificar cuáles son los destinos más buscados.

count(vuelos, dest, sort = TRUE)
## # A tibble: 105 × 2
##    dest      n
##    <chr> <int>
##  1 ORD   17283
##  2 ATL   17215
##  3 LAX   16174
##  4 BOS   15508
##  5 MCO   14082
##  6 CLT   14064
##  7 SFO   13331
##  8 FLL   12055
##  9 MIA   11728
## 10 DCA    9705
## # … with 95 more rows

Agregar el nombre de la aerolínea al data frame anterior.

#left_join()

Se necesita conocer las aerolíneas (clave y nombre) y destinos que vuelan por la Mañana: de 6 a 12, Tarde: de 12 a 19 , Noche: de 19 a 24 y Madrugada de 24 a 6.

Agrega un nuevo campo a la tabla con el nombre de clas_horario y agrega, mañana, tarde, noche y madrugada según sea el caso.

horarios <- select(flights, flight, carrier, origin, dest, hour)
head(horarios)
## # A tibble: 6 × 5
##   flight carrier origin dest   hour
##    <int> <chr>   <chr>  <chr> <dbl>
## 1   1545 UA      EWR    IAH       5
## 2   1714 UA      LGA    IAH       5
## 3   1141 AA      JFK    MIA       5
## 4    725 B6      JFK    BQN       5
## 5    461 DL      LGA    ATL       6
## 6   1696 UA      EWR    ORD       5
#horarios$categoria <- if(flights$hour>=6 & flights$hour<12) {
  "Mañana"
## [1] "Mañana"
#}
#head(horarios)

Se necesita saber la cantidad de vuelos por aerolínea y destino que hay por la Mañana, Tarde, Noche y Madrugada.

#pendiente

Se necesita saber a qué destinos vuela la aerolínea American Airlines Inc.-AA durante la madrugada.

#pendiente

¿Qué aviones utiliza la aerolínea AA? aerolínea, tipo, motor y número de asientos y ¿Cuántos vuelos se han realizado con cada uno? elimina los NA’s

head(planes)
## # A tibble: 6 × 9
##   tailnum  year type                    manuf…¹ model engines seats speed engine
##   <chr>   <int> <chr>                   <chr>   <chr>   <int> <int> <int> <chr> 
## 1 N10156   2004 Fixed wing multi engine EMBRAER EMB-…       2    55    NA Turbo…
## 2 N102UW   1998 Fixed wing multi engine AIRBUS… A320…       2   182    NA Turbo…
## 3 N103US   1999 Fixed wing multi engine AIRBUS… A320…       2   182    NA Turbo…
## 4 N104UW   1999 Fixed wing multi engine AIRBUS… A320…       2   182    NA Turbo…
## 5 N10575   2002 Fixed wing multi engine EMBRAER EMB-…       2    55    NA Turbo…
## 6 N105UW   1999 Fixed wing multi engine AIRBUS… A320…       2   182    NA Turbo…
## # … with abbreviated variable name ¹​manufacturer
aviones <- select(planes, type, engines, seats)
tail(aviones)
## # A tibble: 6 × 3
##   type                    engines seats
##   <chr>                     <int> <int>
## 1 Fixed wing multi engine       2   142
## 2 Fixed wing multi engine       2   100
## 3 Fixed wing multi engine       2   142
## 4 Fixed wing multi engine       2   100
## 5 Fixed wing multi engine       2   142
## 6 Fixed wing multi engine       2   142
aviones
## # A tibble: 3,322 × 3
##    type                    engines seats
##    <chr>                     <int> <int>
##  1 Fixed wing multi engine       2    55
##  2 Fixed wing multi engine       2   182
##  3 Fixed wing multi engine       2   182
##  4 Fixed wing multi engine       2   182
##  5 Fixed wing multi engine       2    55
##  6 Fixed wing multi engine       2   182
##  7 Fixed wing multi engine       2   182
##  8 Fixed wing multi engine       2   182
##  9 Fixed wing multi engine       2   182
## 10 Fixed wing multi engine       2   182
## # … with 3,312 more rows

Conclusión

Al no poder ejecutar todos los codigos, no se pudo encontrar todos los resultados necesarios para poder responder a la pregunta que se pedia en la sección. Sin embargo algunos de los hallazgos que se pudieron llegar a ver con lo que si se pudo ejecutar descubrimos que “American Airlines” tiene vuelos que salen de todos los aeropuertos, son de las aerolineas lideres de NYC y cuentan con diferentes aviones la mayoria teniendo 2 motores y normalmente siendo un “Fixed wing multi engine”, como sea en un minimo de casos tienen un “Fixed wing single engine”.

Como sea para poder generar algunas de las propuestas requeridas de esta parte se puede comenzar con si identificamos que hay una gran demanda de vuelos a un destino en particular en un horario determinado, podemos aumentar la cantidad de vuelos y asignar más aviones a ese destino y horario para satisfacer la demanda. Por otro lado, si identificamos que hay poca demanda de vuelos a un destino en particular en un horario determinado, podemos reducir la cantidad de vuelos y asignar menos aviones a ese destino y horario para maximizar la eficiencia de los recursos.

Visualización de Datos

En los avances anteriores se han realizado diferentes análisis y ahora nos solicitan hacer visualizaciones de la aerolínea American Airlines para los ejecutivos con las siguientes características.

Dentro de las aerolíneas el retraso tanto en la hora de partida como en la hora de llegada a su destino van generando indicadores negativos.

Se solicita analizar para la aerolínea American Airlines si los vuelos que tienen retraso en la partida también tienen retraso en la hora de llegada.

Realiza una visualización con una gráfica Scatterplot.

Visualiza la tendencia de la temperatura durante los primeros 15 días del mes de Enero en los vuelos que parten del aeropuerto “Newark, EWR”, utilizar una gráfica de línea.

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
## # … with 4 more variables: precip <dbl>, pressure <dbl>, visib <dbl>,
## #   time_hour <dttm>
g1 <- filter(weather, origin=="EWR")
head(g1)
## # 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
## # … with 4 more variables: precip <dbl>, pressure <dbl>, visib <dbl>,
## #   time_hour <dttm>
g2 <- filter(g1, day<15)
g3 <- filter(g2, month==1)
#g4 <- g3 %>%summarize_if(is.numeric, ~mean(.,na.rm=TRUE)
plot(g3$day, g3$temp, type="p")

Visualiza la temperatura más frecuente en los primeros 15 días del mes de Enero, utilizar un histrograma.

Utiliza Facets para observar cómo varía la temperatura en cada mes en él histograma del punto anterior.

Número de vuelos que salieron de Nueva York en 2013 por aerolínea (mostrar solamente las 10 aerolíneas con más vuelos), utilizar gráfica de barras.

Visualiza el punto anterior en una gráfica de pie.

Relaciona el data frame fligths con el data frame airports a través del campo destino ¿cómo lograr estas relación?

Crea un nuevo data frame con el punto anterior únicamente con los 5 carriers con más vuelos por destino.

Realiza una visualización del punto anterior de las siguientes tres formas.

Conclusión

Se plantea una pregunta al principio de esta parte que no se podra responder de una manera correcta sin embargo al tener un poco de entendimiento sobre lo que se habla y de los datos. Por ejemplo se podria decir que si la mayoría de los vuelos con retraso en la partida también tienen retraso en la hora de llegada, podríamos inferir que hay un patrón de retrasos en los vuelos de American Airlines que se refleja tanto en la salida como en la llegada.

Al igual se pudo encontrar un hallazgo y es que durante los primeros 15 días del mes de Enero en los vuelos que parten del aeropuerto “Newark” se vio una tendencia de temperaturas. Los hallazgos fueron que la temperatura promedio era de Fº 39.71, tenian un máximo de Fº 57.92 y una mínima de Fº 24.08.

Compromiso ético y ciudadano

Describe el valor de la integridad.

Segun la UNODC la integridad es “la práctica de ser una persona honesta, respetuosa, adherirse a nuestros valores y tomar sistemáticamente decisiones positivas, incluso cuando nadie esté mirando.”

Agrega una reflexión personal de cómo puedes actuar con respeto y honestidad en los negocios y en el uso de datos cuando realices análisis de datos y estés en contacto con los datos de una empresa.

Con el uso de datos de una empresa al trabajar con diferentes negocios uno tiene que ser consciente y responsable y discreto con la informacion que se le esta compartiendo. Ya que la informacion dada puede ser sensible y no es para compartir con cualquier persona. Hay que actuar de manera respetuosa con la empresa y actuar de una manera correcta.

Conclusión Final

En conclusión, la base de datos “nycflights13” es una colección de datos de vuelos en la ciudad de Nueva York durante el año 2013. La base de datos contiene información detallada sobre más de 300,000 vuelos, incluyendo información sobre el aeropuerto de origen y destino, el tiempo de vuelo, el tipo de avión utilizado, el retraso en la salida y llegada, entre otros. La base de datos también incluye información climática sobre la ciudad de Nueva York, lo que permite a los usuarios analizar cómo los cambios en el clima afectan los vuelos.

Este trabajo me ayudo a poder manipular una base de datos bastante extensa, conocer los diferentes codigos y comandos para poder explorarla, limpiarla y encontrar los datos exactos que uno quiere. También se puede mencionar que se pudo utilizar esta base de datos para realizar análisis detallados y obtener información valiosa sobre el desempeño de las aerolíneas, los patrones de viaje, cantidad de vuelos, las tendencias climáticas en la región entre muchas otras cosas.

Además, el uso de herramientas como R Studio para manipular y analizar la base de datos permite una mayor eficiencia y precisión en la exploración de los datos, lo que puede ser de gran utilidad para las aerolíneas y otras entidades relacionadas con la industria de los vuelos en la ciudad de Nueva York. Al aprovechar esta herramienta y utilizarla adecuadamente, es posible tomar decisiones más informadas y mejorar la calidad y eficiencia, pudiendo encontrar esas ventajas competitivas o areas de oportunidad.

Bibliografia

Código de Integridad y Ética Empresarial - CCE. (2017, October 20). Consejo Coordinador Empresarial. http://codigoeticaeintegridad.com/

Wickham, H. and Grolemund, G. (2017) R for Data Science: Import, Tidy, Transform, Visualize, and Model Data O’Reilly Media: Sebastopol, California Nycflights13 v1.0.0 https://www.rdocumentation.org/packages/nycflights13/versions/1.0.0

La Ciencia de la Integridad. (2021). Naciones Unidas : Oficina de Las Naciones Unidas Contra La Droga Y El Delito. https://www.unodc.org/unodc/es/listen-first/super-skills/integrity.html#:~:text=La%20integridad%20es%20la%20pr%C3%A1ctica,de%20acuerdo%20a%20los%20principios.

LS0tCnRpdGxlOiAiU2l0dWFjacOzbiBQcm9ibGVtYSAyIgphdXRob3I6ICJNYXJjZWxvIFRhbSBBcmljYSAtIEEwMTcyMjE0MCIKZGF0ZTogIjIwMjMtMDMtMTciCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKLS0tCgohW10oL1VzZXJzL21hcmNlbG90YW0vRGVza3RvcC9tYW5pcHVsYWNpb24gZGUgZGF0b3MvYXZpb25hZXJvcHVlcnRvLnBuZykKCgojIyMgU2l0dWFjacOzbiBQcm9ibGVtYTogCgpUZSBhY2FiYXMgZGUgaW5jb3Jwb3JhciBhIHVuYSBlbXByZXNhIGNvbnN1bHRvcmEgZW4gSW50ZWxpZ2VuY2lhIGRlIE5lZ29jaW9zLCBhY3R1YWxtZW50ZSBlc3TDoW4gYnJpbmRhbmRvIHNlcnZpY2lvcyBkZSBhbsOhbGlzaXMgcGFyYSBsYSBpbmR1c3RyaWEgZGUgbGEgYXZpYWNpw7NuIHkgbGVzIGludGVyZXNhIHRlbmVyIGEgbGEgYWVyb2zDrW5lYSBBbWVyaWNhbiBBaXJsaW5lcyBjb21vIGNsaWVudGUgeWEgcXVlIGVzIHVuYSBkZSBsYXMgYWVyb2zDrW5lYXMgbMOtZGVyZXMgZW4gbG9zIGFlcm9wdWVydG9zIGRlIE51ZXZhIFlvcmssIG1vdGl2byBwb3IgZWwgY3XDoWwgdGUgaGFuIGNvbnRyYXRhZG8uCgpUZSBoYW4gcGVkaWRvIHF1ZSBpZGVudGlmaXF1ZXMgY8OzbW8gcHVlZGUgZGljaGEgYWVyb2zDrW5lYSBtZWpvcmFyIHN1IHBvc2ljacOzbiBjb21wZXRpdGl2YSAhIQoKUGFyYSBpZGVudGlmaWNhciBvcG9ydHVuaWRhZGVzIGRlIG1lam9yYXIgbGEgcG9zaWNpw7NuIGNvbXBldGl0aXZhIGRlIGxhIGFlcm9sw61uZWEgQW1lcmljYW4gQWlybGluZXMsIG5lY2VzaXRhcyByZWFsaXphciBhbGd1bm9zIGFuw6FsaXNpcywgcGFyYSBkZXRlcm1pbmFyIHNpIGhheSB2YXJpYWNpb25lcyBlbiBsYSBwb3NpY2nDs24gZGUgbGlkZXJhemdvIGRlIGRpY2hhIGFlcm9sw61uZWEuIAoKIyMjIE1vZGVsbyBFbnRpZGFkLVJlbGFjacOzbgpTZSB0ZSBoYSBzb2xpY2l0YWRvIGhhY2VyIHVuIGVzdHVkaW8gc29icmUgbGEgc2l0dWFjacOzbiBhY3R1YWwgZGUgbGEgYWVyb2zDrW5lYSBBbWVyaWNhbiBBaXJsaW5lcyB5YSBxdWUgc2UgbmVjZXNpdGEgcmV2aXNhciBzdXMgZGVzdGlub3MsIGhvcmFyaW9zIHkgYXZpb25lcyBjb24gbG9zIHF1ZSBjdWVudGEgcGFyYSBoYWNlciBwcm9wdWVzdGFzIGRlIGF1bWVudG8gbyByZWR1Y2Npw7NuIGRlIHZ1ZWxvcyBwb3IgZGVzdGlubyB5IGhvcmFyaW9zLCBhc8OtIGNvbW8gbGEgY2FudGlkYWQgZGUgYXZpb25lcy4KClBhcmEgbG9ncmFybG8gY29uc2lkZXJhIGxhcyBmdW5jaW9uZXMgc3VnZXJpZGFzIGVuIGxvcyBzaWd1aWVudGVzIHBhc29zOgoKKipDb25zdWx0YSB5IGV4cGxvcmEgZWwgZGF0YSBmcmFtZSBwbGFuZXMgeSB3ZWF0aGVyIHBhcmEgcXVlIGNvbm96Y2FzIHN1IGNvbnRlbmlkby4qKgpgYGB7cn0KCmxpYnJhcnkobnljZmxpZ2h0czEzKQoKI1ZpZXcocGxhbmVzKQpzdW1tYXJ5KHBsYW5lcykKI1ZpZXcod2VhdGhlcikKc3VtbWFyeSh3ZWF0aGVyKQpgYGAKKipTZSBuZWNlc2l0YSBzYWJlciBkZSBjYWRhIHZ1ZWxvLCBsYSBhZXJvbMOtbmVhLCBlbCBhZXJvcHVlcnRvIGRlIG9yaWdlbiB5IGVsIGFlcm9wdWVydG8gZGVzdGluby4qKgpgYGB7cn0Kc3VtbWFyeShmbGlnaHRzKQpsaWJyYXJ5KGRwbHlyKQpzZWxlY3QoZmxpZ2h0cykKdnVlbG9zIDwtIHNlbGVjdChmbGlnaHRzLCBmbGlnaHQsIGNhcnJpZXIsIG9yaWdpbiwgZGVzdCkKaGVhZCh2dWVsb3MpCmBgYAoKKipFbiBsYSBjb25zdWx0YSBhbnRlcmlvciBzZSBuZWNlc2l0YSBjb25vY2VyIGVsIG5vbWJyZSBkZSBsYSBhZXJvbMOtbmVhLioqCmBgYHtyfQojbGVmdF9qb2luKCkKYGBgCgoqKlNlIG5lY2VzaXRhIHNhYmVyIGxhIGNhbnRpZGFkIGRlIHZ1ZWxvcyBwb3IgY2FkYSBkZXN0aW5vIHBhcmEgaWRlbnRpZmljYXIgY3XDoWxlcyBzb24gbG9zIGRlc3Rpbm9zIG3DoXMgYnVzY2Fkb3MuKioKYGBge3J9CmNvdW50KHZ1ZWxvcywgZGVzdCwgc29ydCA9IFRSVUUpCmBgYAoKKipBZ3JlZ2FyIGVsIG5vbWJyZSBkZSBsYSBhZXJvbMOtbmVhIGFsIGRhdGEgZnJhbWUgYW50ZXJpb3IuKioKYGBge3J9CiNsZWZ0X2pvaW4oKQpgYGAKCioqU2UgbmVjZXNpdGEgY29ub2NlciBsYXMgYWVyb2zDrW5lYXMgKGNsYXZlIHkgbm9tYnJlKSB5IGRlc3Rpbm9zIHF1ZSB2dWVsYW4gcG9yIGxhIE1hw7FhbmE6IGRlIDYgYSAxMiwgVGFyZGU6IGRlIDEyIGEgMTkgLCBOb2NoZTogZGUgMTkgYSAyNCB5IE1hZHJ1Z2FkYSBkZSAyNCBhIDYuKioKCkFncmVnYSB1biBudWV2byBjYW1wbyBhIGxhIHRhYmxhIGNvbiBlbCBub21icmUgZGUgY2xhc19ob3JhcmlvIHkgYWdyZWdhLCBtYcOxYW5hLCB0YXJkZSwgbm9jaGUgeSBtYWRydWdhZGEgc2Vnw7puIHNlYSBlbCBjYXNvLgpgYGB7cn0KaG9yYXJpb3MgPC0gc2VsZWN0KGZsaWdodHMsIGZsaWdodCwgY2Fycmllciwgb3JpZ2luLCBkZXN0LCBob3VyKQpoZWFkKGhvcmFyaW9zKQojaG9yYXJpb3MkY2F0ZWdvcmlhIDwtIGlmKGZsaWdodHMkaG91cj49NiAmIGZsaWdodHMkaG91cjwxMikgewogICJNYcOxYW5hIgojfQojaGVhZChob3JhcmlvcykKYGBgCgoqKlNlIG5lY2VzaXRhIHNhYmVyIGxhIGNhbnRpZGFkIGRlIHZ1ZWxvcyBwb3IgYWVyb2zDrW5lYSB5IGRlc3Rpbm8gcXVlIGhheSBwb3IgbGEgTWHDsWFuYSwgVGFyZGUsIE5vY2hlIHkgTWFkcnVnYWRhLioqCmBgYHtyfQojcGVuZGllbnRlCmBgYAoKKipTZSBuZWNlc2l0YSBzYWJlciBhIHF1w6kgZGVzdGlub3MgdnVlbGEgbGEgYWVyb2zDrW5lYSBBbWVyaWNhbiBBaXJsaW5lcyBJbmMuLUFBICBkdXJhbnRlIGxhIG1hZHJ1Z2FkYS4qKgpgYGB7cn0KI3BlbmRpZW50ZQpgYGAKCioqwr9RdcOpIGF2aW9uZXMgdXRpbGl6YSBsYSBhZXJvbMOtbmVhIEFBPyBhZXJvbMOtbmVhLCB0aXBvLCBtb3RvciB5IG7Dum1lcm8gZGUgYXNpZW50b3MgeSDCv0N1w6FudG9zIHZ1ZWxvcyBzZSBoYW4gcmVhbGl6YWRvIGNvbiBjYWRhIHVubz8gZWxpbWluYSBsb3MgTkEncyoqCmBgYHtyfQpoZWFkKHBsYW5lcykKYXZpb25lcyA8LSBzZWxlY3QocGxhbmVzLCB0eXBlLCBlbmdpbmVzLCBzZWF0cykKdGFpbChhdmlvbmVzKQphdmlvbmVzCmBgYAoKKipDb25jbHVzacOzbioqCgpBbCBubyBwb2RlciBlamVjdXRhciB0b2RvcyBsb3MgY29kaWdvcywgbm8gc2UgcHVkbyBlbmNvbnRyYXIgdG9kb3MgbG9zIHJlc3VsdGFkb3MgbmVjZXNhcmlvcyBwYXJhIHBvZGVyIHJlc3BvbmRlciBhIGxhIHByZWd1bnRhIHF1ZSBzZSBwZWRpYSBlbiBsYSBzZWNjacOzbi4gU2luIGVtYmFyZ28gYWxndW5vcyBkZSBsb3MgaGFsbGF6Z29zIHF1ZSBzZSBwdWRpZXJvbiBsbGVnYXIgYSB2ZXIgY29uIGxvIHF1ZSBzaSBzZSBwdWRvIGVqZWN1dGFyIGRlc2N1YnJpbW9zIHF1ZSAiQW1lcmljYW4gQWlybGluZXMiIHRpZW5lIHZ1ZWxvcyBxdWUgc2FsZW4gZGUgdG9kb3MgbG9zIGFlcm9wdWVydG9zLCBzb24gZGUgbGFzIGFlcm9saW5lYXMgbGlkZXJlcyBkZSBOWUMgeSBjdWVudGFuIGNvbiBkaWZlcmVudGVzIGF2aW9uZXMgbGEgbWF5b3JpYSB0ZW5pZW5kbyAyIG1vdG9yZXMgeSBub3JtYWxtZW50ZSBzaWVuZG8gdW4gIkZpeGVkIHdpbmcgbXVsdGkgZW5naW5lIiwgY29tbyBzZWEgZW4gdW4gbWluaW1vIGRlIGNhc29zIHRpZW5lbiB1biAiRml4ZWQgd2luZyBzaW5nbGUgZW5naW5lIi4gCgpDb21vIHNlYSBwYXJhIHBvZGVyIGdlbmVyYXIgYWxndW5hcyBkZSBsYXMgcHJvcHVlc3RhcyByZXF1ZXJpZGFzIGRlIGVzdGEgcGFydGUgc2UgcHVlZGUgY29tZW56YXIgY29uIHNpIGlkZW50aWZpY2Ftb3MgcXVlIGhheSB1bmEgZ3JhbiBkZW1hbmRhIGRlIHZ1ZWxvcyBhIHVuIGRlc3Rpbm8gZW4gcGFydGljdWxhciBlbiB1biBob3JhcmlvIGRldGVybWluYWRvLCBwb2RlbW9zIGF1bWVudGFyIGxhIGNhbnRpZGFkIGRlIHZ1ZWxvcyB5IGFzaWduYXIgbcOhcyBhdmlvbmVzIGEgZXNlIGRlc3Rpbm8geSBob3JhcmlvIHBhcmEgc2F0aXNmYWNlciBsYSBkZW1hbmRhLiBQb3Igb3RybyBsYWRvLCBzaSBpZGVudGlmaWNhbW9zIHF1ZSBoYXkgcG9jYSBkZW1hbmRhIGRlIHZ1ZWxvcyBhIHVuIGRlc3Rpbm8gZW4gcGFydGljdWxhciBlbiB1biBob3JhcmlvIGRldGVybWluYWRvLCBwb2RlbW9zIHJlZHVjaXIgbGEgY2FudGlkYWQgZGUgdnVlbG9zIHkgYXNpZ25hciBtZW5vcyBhdmlvbmVzIGEgZXNlIGRlc3Rpbm8geSBob3JhcmlvIHBhcmEgbWF4aW1pemFyIGxhIGVmaWNpZW5jaWEgZGUgbG9zIHJlY3Vyc29zLgoKIyMjIFZpc3VhbGl6YWNpw7NuIGRlIERhdG9zCkVuIGxvcyBhdmFuY2VzIGFudGVyaW9yZXMgc2UgaGFuIHJlYWxpemFkbyBkaWZlcmVudGVzIGFuw6FsaXNpcyB5IGFob3JhIG5vcyBzb2xpY2l0YW4gaGFjZXIgdmlzdWFsaXphY2lvbmVzIGRlIGxhIGFlcm9sw61uZWEgQW1lcmljYW4gQWlybGluZXMgcGFyYSBsb3MgZWplY3V0aXZvcyBjb24gbGFzIHNpZ3VpZW50ZXMgY2FyYWN0ZXLDrXN0aWNhcy4KCkRlbnRybyBkZSBsYXMgYWVyb2zDrW5lYXMgZWwgcmV0cmFzbyB0YW50byBlbiBsYSBob3JhIGRlIHBhcnRpZGEgY29tbyBlbiBsYSBob3JhIGRlIGxsZWdhZGEgYSBzdSBkZXN0aW5vIHZhbiBnZW5lcmFuZG8gaW5kaWNhZG9yZXMgbmVnYXRpdm9zLiAKClNlIHNvbGljaXRhIGFuYWxpemFyIHBhcmEgbGEgYWVyb2zDrW5lYSBBbWVyaWNhbiBBaXJsaW5lcyBzaSBsb3MgdnVlbG9zIHF1ZSB0aWVuZW4gcmV0cmFzbyBlbiBsYSBwYXJ0aWRhIHRhbWJpw6luIHRpZW5lbiByZXRyYXNvIGVuIGxhIGhvcmEgZGUgbGxlZ2FkYS4KClJlYWxpemEgdW5hIHZpc3VhbGl6YWNpw7NuIGNvbiB1bmEgZ3LDoWZpY2EgU2NhdHRlcnBsb3QuCgoqKlZpc3VhbGl6YSBsYSB0ZW5kZW5jaWEgZGUgbGEgdGVtcGVyYXR1cmEgZHVyYW50ZSBsb3MgcHJpbWVyb3MgMTUgZMOtYXMgZGVsIG1lcyBkZSBFbmVybyBlbiBsb3MgdnVlbG9zIHF1ZSBwYXJ0ZW4gZGVsIGFlcm9wdWVydG8g4oCcTmV3YXJrLCAgRVdS4oCdLCB1dGlsaXphciB1bmEgZ3LDoWZpY2EgZGUgbMOtbmVhLioqCmBgYHtyfQpoZWFkKHdlYXRoZXIpCmcxIDwtIGZpbHRlcih3ZWF0aGVyLCBvcmlnaW49PSJFV1IiKQpoZWFkKGcxKQpnMiA8LSBmaWx0ZXIoZzEsIGRheTwxNSkKZzMgPC0gZmlsdGVyKGcyLCBtb250aD09MSkKI2c0IDwtIGczICU+JXN1bW1hcml6ZV9pZihpcy5udW1lcmljLCB+bWVhbiguLG5hLnJtPVRSVUUpCnBsb3QoZzMkZGF5LCBnMyR0ZW1wLCB0eXBlPSJwIikKYGBgCgoqKlZpc3VhbGl6YSBsYSB0ZW1wZXJhdHVyYSBtw6FzIGZyZWN1ZW50ZSBlbiBsb3MgcHJpbWVyb3MgMTUgZMOtYXMgZGVsIG1lcyBkZSBFbmVybywgdXRpbGl6YXIgdW4gaGlzdHJvZ3JhbWEuKioKCioqVXRpbGl6YSBGYWNldHMgcGFyYSBvYnNlcnZhciBjw7NtbyB2YXLDrWEgbGEgdGVtcGVyYXR1cmEgZW4gY2FkYSBtZXMgZW4gw6lsIGhpc3RvZ3JhbWEgZGVsIHB1bnRvIGFudGVyaW9yLioqCgoqKk7Dum1lcm8gZGUgdnVlbG9zIHF1ZSBzYWxpZXJvbiBkZSBOdWV2YSBZb3JrIGVuIDIwMTMgcG9yIGFlcm9sw61uZWEgKG1vc3RyYXIgc29sYW1lbnRlIGxhcyAxMCBhZXJvbMOtbmVhcyBjb24gbcOhcyB2dWVsb3MpLCB1dGlsaXphciBncsOhZmljYSBkZSBiYXJyYXMuKioKCioqVmlzdWFsaXphIGVsIHB1bnRvIGFudGVyaW9yIGVuIHVuYSBncsOhZmljYSBkZSBwaWUuKioKCioqUmVsYWNpb25hIGVsIGRhdGEgZnJhbWUgZmxpZ3RocyBjb24gZWwgZGF0YSBmcmFtZSBhaXJwb3J0cyBhIHRyYXbDqXMgZGVsIGNhbXBvIGRlc3Rpbm8gwr9jw7NtbyBsb2dyYXIgZXN0YXMgcmVsYWNpw7NuPyoqCgoqKkNyZWEgdW4gbnVldm8gZGF0YSBmcmFtZSBjb24gZWwgcHVudG8gYW50ZXJpb3Igw7puaWNhbWVudGUgY29uIGxvcyA1IGNhcnJpZXJzIGNvbiBtw6FzIHZ1ZWxvcyBwb3IgZGVzdGluby4qKgoKKipSZWFsaXphIHVuYSB2aXN1YWxpemFjacOzbiBkZWwgcHVudG8gYW50ZXJpb3IgZGUgbGFzIHNpZ3VpZW50ZXMgdHJlcyBmb3JtYXMuKioKCioqQ29uY2x1c2nDs24qKgoKU2UgcGxhbnRlYSB1bmEgcHJlZ3VudGEgYWwgcHJpbmNpcGlvIGRlIGVzdGEgcGFydGUgcXVlIG5vIHNlIHBvZHJhIHJlc3BvbmRlciBkZSB1bmEgbWFuZXJhIGNvcnJlY3RhIHNpbiBlbWJhcmdvIGFsIHRlbmVyIHVuIHBvY28gZGUgZW50ZW5kaW1pZW50byBzb2JyZSBsbyBxdWUgc2UgaGFibGEgeSBkZSBsb3MgZGF0b3MuIFBvciBlamVtcGxvIHNlIHBvZHJpYSBkZWNpciBxdWUgc2kgbGEgbWF5b3LDrWEgZGUgbG9zIHZ1ZWxvcyBjb24gcmV0cmFzbyBlbiBsYSBwYXJ0aWRhIHRhbWJpw6luIHRpZW5lbiByZXRyYXNvIGVuIGxhIGhvcmEgZGUgbGxlZ2FkYSwgcG9kcsOtYW1vcyBpbmZlcmlyIHF1ZSBoYXkgdW4gcGF0csOzbiBkZSByZXRyYXNvcyBlbiBsb3MgdnVlbG9zIGRlIEFtZXJpY2FuIEFpcmxpbmVzIHF1ZSBzZSByZWZsZWphIHRhbnRvIGVuIGxhIHNhbGlkYSBjb21vIGVuIGxhIGxsZWdhZGEuCgpBbCBpZ3VhbCBzZSBwdWRvIGVuY29udHJhciB1biBoYWxsYXpnbyB5IGVzIHF1ZSBkdXJhbnRlIGxvcyBwcmltZXJvcyAxNSBkw61hcyBkZWwgbWVzIGRlIEVuZXJvIGVuIGxvcyB2dWVsb3MgcXVlIHBhcnRlbiBkZWwgYWVyb3B1ZXJ0byDigJxOZXdhcmsiIHNlIHZpbyB1bmEgdGVuZGVuY2lhIGRlIHRlbXBlcmF0dXJhcy4gTG9zIGhhbGxhemdvcyBmdWVyb24gcXVlIGxhIHRlbXBlcmF0dXJhIHByb21lZGlvIGVyYSBkZSBGwrogMzkuNzEsIHRlbmlhbiB1biBtw6F4aW1vIGRlIEbCuiA1Ny45MiB5IHVuYSBtw61uaW1hIGRlIEbCuiAyNC4wOC4KCiMjIyBDb21wcm9taXNvIMOpdGljbyB5IGNpdWRhZGFubwoKKipEZXNjcmliZSBlbCB2YWxvciBkZSBsYSBpbnRlZ3JpZGFkLioqCgpTZWd1biBsYSBVTk9EQyBsYSBpbnRlZ3JpZGFkIGVzICJsYSBwcsOhY3RpY2EgZGUgc2VyIHVuYSBwZXJzb25hIGhvbmVzdGEsIHJlc3BldHVvc2EsIGFkaGVyaXJzZSBhIG51ZXN0cm9zIHZhbG9yZXMgeSB0b21hciBzaXN0ZW3DoXRpY2FtZW50ZSBkZWNpc2lvbmVzIHBvc2l0aXZhcywgaW5jbHVzbyBjdWFuZG8gbmFkaWUgZXN0w6kgbWlyYW5kby4iCgoqKkFncmVnYSB1bmEgcmVmbGV4acOzbiBwZXJzb25hbCBkZSBjw7NtbyBwdWVkZXMgYWN0dWFyIGNvbiByZXNwZXRvIHkgaG9uZXN0aWRhZCBlbiBsb3MgbmVnb2Npb3MgeSBlbiBlbCB1c28gZGUgZGF0b3MgY3VhbmRvIHJlYWxpY2VzIGFuw6FsaXNpcyBkZSBkYXRvcyB5IGVzdMOpcyBlbiBjb250YWN0byBjb24gbG9zIGRhdG9zIGRlIHVuYSBlbXByZXNhLioqCgpDb24gZWwgdXNvIGRlIGRhdG9zIGRlIHVuYSBlbXByZXNhIGFsIHRyYWJhamFyIGNvbiBkaWZlcmVudGVzIG5lZ29jaW9zIHVubyB0aWVuZSBxdWUgc2VyIGNvbnNjaWVudGUgeSByZXNwb25zYWJsZSB5IGRpc2NyZXRvIGNvbiBsYSBpbmZvcm1hY2lvbiBxdWUgc2UgbGUgZXN0YSBjb21wYXJ0aWVuZG8uIFlhIHF1ZSBsYSBpbmZvcm1hY2lvbiBkYWRhIHB1ZWRlIHNlciBzZW5zaWJsZSB5IG5vIGVzIHBhcmEgY29tcGFydGlyIGNvbiBjdWFscXVpZXIgcGVyc29uYS4gSGF5IHF1ZSBhY3R1YXIgZGUgbWFuZXJhIHJlc3BldHVvc2EgY29uIGxhIGVtcHJlc2EgeSBhY3R1YXIgZGUgdW5hIG1hbmVyYSBjb3JyZWN0YS4KCiMjIyBDb25jbHVzacOzbiBGaW5hbAoKRW4gY29uY2x1c2nDs24sIGxhIGJhc2UgZGUgZGF0b3MgIm55Y2ZsaWdodHMxMyIgZXMgdW5hIGNvbGVjY2nDs24gZGUgZGF0b3MgZGUgdnVlbG9zIGVuIGxhIGNpdWRhZCBkZSBOdWV2YSBZb3JrIGR1cmFudGUgZWwgYcOxbyAyMDEzLiBMYSBiYXNlIGRlIGRhdG9zIGNvbnRpZW5lIGluZm9ybWFjacOzbiBkZXRhbGxhZGEgc29icmUgbcOhcyBkZSAzMDAsMDAwIHZ1ZWxvcywgaW5jbHV5ZW5kbyBpbmZvcm1hY2nDs24gc29icmUgZWwgYWVyb3B1ZXJ0byBkZSBvcmlnZW4geSBkZXN0aW5vLCBlbCB0aWVtcG8gZGUgdnVlbG8sIGVsIHRpcG8gZGUgYXZpw7NuIHV0aWxpemFkbywgZWwgcmV0cmFzbyBlbiBsYSBzYWxpZGEgeSBsbGVnYWRhLCBlbnRyZSBvdHJvcy4gTGEgYmFzZSBkZSBkYXRvcyB0YW1iacOpbiBpbmNsdXllIGluZm9ybWFjacOzbiBjbGltw6F0aWNhIHNvYnJlIGxhIGNpdWRhZCBkZSBOdWV2YSBZb3JrLCBsbyBxdWUgcGVybWl0ZSBhIGxvcyB1c3VhcmlvcyBhbmFsaXphciBjw7NtbyBsb3MgY2FtYmlvcyBlbiBlbCBjbGltYSBhZmVjdGFuIGxvcyB2dWVsb3MuCgpFc3RlIHRyYWJham8gbWUgYXl1ZG8gYSBwb2RlciBtYW5pcHVsYXIgdW5hIGJhc2UgZGUgZGF0b3MgYmFzdGFudGUgZXh0ZW5zYSwgY29ub2NlciBsb3MgZGlmZXJlbnRlcyBjb2RpZ29zIHkgY29tYW5kb3MgcGFyYSBwb2RlciBleHBsb3JhcmxhLCBsaW1waWFybGEgeSBlbmNvbnRyYXIgbG9zIGRhdG9zIGV4YWN0b3MgcXVlIHVubyBxdWllcmUuIFRhbWJpw6luIHNlIHB1ZWRlIG1lbmNpb25hciBxdWUgc2UgcHVkbyB1dGlsaXphciBlc3RhIGJhc2UgZGUgZGF0b3MgcGFyYSByZWFsaXphciBhbsOhbGlzaXMgZGV0YWxsYWRvcyB5IG9idGVuZXIgaW5mb3JtYWNpw7NuIHZhbGlvc2Egc29icmUgZWwgZGVzZW1wZcOxbyBkZSBsYXMgYWVyb2zDrW5lYXMsIGxvcyBwYXRyb25lcyBkZSB2aWFqZSwgY2FudGlkYWQgZGUgdnVlbG9zLCBsYXMgdGVuZGVuY2lhcyBjbGltw6F0aWNhcyBlbiBsYSByZWdpw7NuIGVudHJlIG11Y2hhcyBvdHJhcyBjb3Nhcy4KCkFkZW3DoXMsIGVsIHVzbyBkZSBoZXJyYW1pZW50YXMgY29tbyBSIFN0dWRpbyBwYXJhIG1hbmlwdWxhciB5IGFuYWxpemFyIGxhIGJhc2UgZGUgZGF0b3MgcGVybWl0ZSB1bmEgbWF5b3IgZWZpY2llbmNpYSB5IHByZWNpc2nDs24gZW4gbGEgZXhwbG9yYWNpw7NuIGRlIGxvcyBkYXRvcywgbG8gcXVlIHB1ZWRlIHNlciBkZSBncmFuIHV0aWxpZGFkIHBhcmEgbGFzIGFlcm9sw61uZWFzIHkgb3RyYXMgZW50aWRhZGVzIHJlbGFjaW9uYWRhcyBjb24gbGEgaW5kdXN0cmlhIGRlIGxvcyB2dWVsb3MgZW4gbGEgY2l1ZGFkIGRlIE51ZXZhIFlvcmsuIEFsIGFwcm92ZWNoYXIgZXN0YSBoZXJyYW1pZW50YSB5IHV0aWxpemFybGEgYWRlY3VhZGFtZW50ZSwgZXMgcG9zaWJsZSB0b21hciBkZWNpc2lvbmVzIG3DoXMgaW5mb3JtYWRhcyB5IG1lam9yYXIgbGEgY2FsaWRhZCB5IGVmaWNpZW5jaWEsIHB1ZGllbmRvIGVuY29udHJhciBlc2FzIHZlbnRhamFzIGNvbXBldGl0aXZhcyBvIGFyZWFzIGRlIG9wb3J0dW5pZGFkLgoKIyMjIEJpYmxpb2dyYWZpYQoKQ8OzZGlnbyBkZSBJbnRlZ3JpZGFkIHkgw4l0aWNhIEVtcHJlc2FyaWFsIC0gQ0NFLiAoMjAxNywgT2N0b2JlciAyMCkuIENvbnNlam8gQ29vcmRpbmFkb3IgRW1wcmVzYXJpYWwuIGh0dHA6Ly9jb2RpZ29ldGljYWVpbnRlZ3JpZGFkLmNvbS8KCldpY2toYW0sIEguIGFuZCBHcm9sZW11bmQsIEcuICgyMDE3KSBSIGZvciBEYXRhIFNjaWVuY2U6IEltcG9ydCwgVGlkeSwgVHJhbnNmb3JtLCBWaXN1YWxpemUsIGFuZCBNb2RlbCBEYXRhIE/igJlSZWlsbHkgTWVkaWE6IFNlYmFzdG9wb2wsIENhbGlmb3JuaWEKTnljZmxpZ2h0czEzIHYxLjAuMCBodHRwczovL3d3dy5yZG9jdW1lbnRhdGlvbi5vcmcvcGFja2FnZXMvbnljZmxpZ2h0czEzL3ZlcnNpb25zLzEuMC4wIAoKTGEgQ2llbmNpYSBkZSBsYSBJbnRlZ3JpZGFkLiAoMjAyMSkuIE5hY2lvbmVzIFVuaWRhcyA6IE9maWNpbmEgZGUgTGFzIE5hY2lvbmVzIFVuaWRhcyBDb250cmEgTGEgRHJvZ2EgWSBFbCBEZWxpdG8uIGh0dHBzOi8vd3d3LnVub2RjLm9yZy91bm9kYy9lcy9saXN0ZW4tZmlyc3Qvc3VwZXItc2tpbGxzL2ludGVncml0eS5odG1sIzp+OnRleHQ9TGElMjBpbnRlZ3JpZGFkJTIwZXMlMjBsYSUyMHByJUMzJUExY3RpY2EsZGUlMjBhY3VlcmRvJTIwYSUyMGxvcyUyMHByaW5jaXBpb3MuCgoK