Trabajo elaborado para la asignatura “Programación y manejo de datos en la era del Big Data” de la Universitat de València durante el curso 2020-2021. La página web de la asignatura puede verse aquí: https://bernicartusciello.github.io/intro-ds-20-21-web/. Los trabajos de mis compañeros de curso pueden verse aquí.



1. Introducción

En el siguiente trabajo se relacionara el mercado bursátil con el sector aéreo, de forma más concreta se hablará de la evolución de los precios de las acciones de cinco grandes aerolíneas a lo largo de los últimos 5 años. Se podrá observar, cómo se comparan varias empresas aéreas en distintos continentes y cómo se han visto influido los precios de sus acciones por diferentes shocks en estos años.

A lo largo de este trabajo, se puede observar cómo las aerolíneas pertenecen a un sector muy volátil donde se podrá ver reflejado en las gráficas los altos y bajos en los precios que han tenido en los últimos años. Más recientemente, como el COVID ha perjudicado a estas empresas en el mercado bursátil. A causa de estas situaciones muchas de las aerolineas se han visto gravemente perjudicadas ya que durante esta última crisis se prohibieron los vuelos a causa del gran nivel de contagio que tiene este virus, por lo cual los gobiernos querían evitar que se siguiera propagando el virus afectando gravemente a los ingresos de estas empresas, provocando que tengan pedir ayudas y subsidios a los gobiernos para no entrar en quiebras.

2. Evolución Precios del Sector.

Información

En este gráfico se puede observar los precios de las acciones de las 5 aerolíneas: American Airlines, Air France, Lufthansa, Ryanair y United Airlines. Podemos destacar como en los años 2017 y finales del 2018 las empresas presentaron un auge en el valor de cotización y esto debido distintas razones como la globalización, el aumento de los viajes de ocio y negocios, y el crecimiento de las compañías de bajo coste, todos estos causantes del importante aumento de vuelos que se ha experimentado a nivel mundial. Sin embargo, en los periodos siguientes cabe recalcar el acontecimiento que causó que estos números pasarán a la historia como la mayor caída de la bolsa en las acciones del sector aéreo, la pandemia del coronavirus. El virus fue un importante causante de la baja de estos precios debido al cierre de fronteras entre los los países y el impedimento de movilidad de la población mundial.

Otros de los motivos por el cual se prevé una proyección más negativa en el sector es que gracias al confinamiento que sucedió a causa del covid-19 muchos de las empresas comenzaron a implementar el teletrabajo, a raíz de esto las empresas se dieron cuenta de que las reuniones por videollamadas eran igual de eficientes como si los trabajadores estuviesen presentes. Por lo cual, muchas empresas ahora prefieren cerrar sus tratos de manera online en vez de tener que desplazar a sus trabajadores que esto genera grandes costes y disminuyen los beneficios que pueden tener a futuro.

Gráfico

3. Evolución Precios por Empresa

En este caso, se puede observar de manera más detallada la variación que ha tenido cada compañía aérea a lo largo del tiempo. Se separó de la gráfica conjunta de las 5 aerolíneas a una gráfica por cada empresa.

En estas gráficas individuales, se puede destacar de forma más precisa como durante el periodo 2017 y 2018, estas acciones tuvieron un auge en sus precios alcanzando su máximo dentro de los últimos cinco años, como fue el caso de American Airlines un precio aproximado de 60 euros, al igual que United Airlines de 100 euros. Por otro lado, a raíz de la crisis del covid-19 se puede destacar unas de las mayores caídas de los precios de las acciones de las distintas aerolíneas a causa de la limitación de movilidad de las personas por el confinamiento.

Ryanair ha sido una de las pocas empresas áreas que se ha recuperado después de la crisis alcanzando niveles parecidos antes de la pandemia, ya que al comienzo de la apertura de los aeropuertos fue la que obtuvo una mayor cantidad de ventas comparado al resto de aerolíneas, que puede ser debido a su servicio low-cost.

También se puede observar como ha comenzado la recuperación de los precios de estas aerolíneas, aunque no ha sido mucho se puede notar que está teniendo leve subida. Además, analizamos la situación de United Airlines y American Airlines que tuvieron las mayores caídas de los precios en relación a lo demás pudiendo ser una de las razones de que estas pertenezcan a las 4 aerolíneas más grandes del mundo en cuanto a ingresos y a flota aérea.

Gráfica

Gráfica Dinámica

4. Gráficas de Velas de American Airlines

Aquí se puede observar un gráfico de velas de la acción de American Airlines. De forma más detallada se aprecia la apertura y el cierre diario de la acción, al igual que se detalla el precio máximo y el precio mínimo que alcanzado que ha tenido la acción a lo largo del día. La gráfica de velas es la principal gráfica que usan los inversionistas y los traders para detallar el precio de una acción, como proporciona tanta información al solo colocar el mouse encima de una vela es una de las herramientas más eficientes para ellos.

#> [1] "AAL"

5. Trayectorias Europeas de United Airlines

Se puede observar en este mapa las rutas de United Airlines hacia el continente europeo y destacar las principales ciudades HUB las cuales son Washington DC (Capital de los Estados Unidos) y New York (La ciudad sede del gran centro financiero del país). United Airlines ofrece varios vuelos directos hacia ciudades como Madrid, Londres, Roma y París que por culpa de la situación pandémica se vieron gravemente afectados tras la cancelación de los vuelos. Las ayudas que se les otorgó a este sector por parte del gobierno fueron de gran ayuda para frenar el desplome de las empresas tras el cese de la actividad aérea. Sin embargo, estas ayudas fueron suficientes hasta cierto punto ya que finalizaron a mediados del mes de agosto, situación que obligó a la empresa en septiembre reducir su plantilla en aproximadamente 13.000 empleados, casi 7.000 auxiliares de vuelo.

6. Conclusión

Por un lado, hemos podido comprobar que las aerolíneas pertenecen a un sector muy volátil y por ello, se han visto gravemente perjudicadas hasta el punto de tener que ser rescatadas por los gobiernos para no entrar en quiebra.

En el primer gráfico, cabe destacar la caída de United Airlines y la fuerte recuperación de Ryanair situándose en niveles similares de antes de la pandemia.

En el gráfico dinámico de American Airlines hemos observado como transcurre la cotización de la acción de manera más específica, día a día desde enero 2015 hasta enero 2020.

En el mapa de las rutas aéreas se ven reflejados los trayectos que realiza la compañía United Airlines entre Estados Unidos y Europa.

Por otro lado, las empresas han comprobado(forzadamente) a causa del CODVID-19 que el teletrabajo es una forma de reducir costes totales. A raíz de esto, podríamos decir que ha marcado un antes y un después en la visión empresarial. Se contempla una gran incertidumbre a corto plazo.

7. Referencias Bibliográficas

Para la realización del trabajo he utilizado:



Para acabar este chunk para incluir tu session info:

sessioninfo::session_info() %>% details::details(summary = 'current session info') 

current session info


- Session info ---------------------------------------------------------------
 setting  value                       
 version  R version 4.0.2 (2020-06-22)
 os       Windows 10 x64              
 system   x86_64, mingw32             
 ui       RTerm                       
 language (EN)                        
 collate  Spanish_Spain.1252          
 ctype    Spanish_Spain.1252          
 tz       Europe/Paris                
 date     2020-12-17                  

- Packages -------------------------------------------------------------------
 package           * version    date       lib source                        
 assertthat          0.2.1      2019-03-21 [1] CRAN (R 4.0.3)                
 backports           1.1.10     2020-09-15 [1] CRAN (R 4.0.3)                
 blob                1.2.1      2020-01-20 [1] CRAN (R 4.0.3)                
 broom               0.7.2      2020-10-20 [1] CRAN (R 4.0.3)                
 cellranger          1.1.0      2016-07-27 [1] CRAN (R 4.0.3)                
 class               7.3-17     2020-04-26 [2] CRAN (R 4.0.2)                
 classInt            0.4-3      2020-04-07 [1] CRAN (R 4.0.3)                
 cli                 2.1.0      2020-10-12 [1] CRAN (R 4.0.3)                
 colorspace          1.4-1      2019-03-18 [1] CRAN (R 4.0.3)                
 crayon              1.3.4      2017-09-16 [1] CRAN (R 4.0.3)                
 curl                4.3        2019-12-02 [1] CRAN (R 4.0.3)                
 data.table        * 1.13.2     2020-10-19 [1] CRAN (R 4.0.3)                
 DBI                 1.1.0      2019-12-15 [1] CRAN (R 4.0.3)                
 dbplyr              1.4.4      2020-05-27 [1] CRAN (R 4.0.3)                
 digest              0.6.27     2020-10-24 [1] CRAN (R 4.0.3)                
 dplyr             * 1.0.2      2020-08-18 [1] CRAN (R 4.0.3)                
 dygraphs          * 1.1.1.6    2018-07-11 [1] CRAN (R 4.0.3)                
 e1071               1.7-4      2020-10-14 [1] CRAN (R 4.0.3)                
 ellipsis            0.3.1      2020-05-15 [1] CRAN (R 4.0.3)                
 evaluate            0.14       2019-05-28 [1] CRAN (R 4.0.3)                
 fansi               0.4.1      2020-01-08 [1] CRAN (R 4.0.3)                
 farver              2.0.3      2020-01-16 [1] CRAN (R 4.0.3)                
 forcats           * 0.5.0      2020-03-01 [1] CRAN (R 4.0.3)                
 fs                  1.5.0      2020-07-31 [1] CRAN (R 4.0.3)                
 generics            0.0.2      2018-11-29 [1] CRAN (R 4.0.3)                
 gganimate         * 1.0.7      2020-10-15 [1] CRAN (R 4.0.3)                
 ggplot2           * 3.3.2      2020-06-19 [1] CRAN (R 4.0.3)                
 gifski              0.8.6      2018-09-28 [1] CRAN (R 4.0.3)                
 glue                1.4.2      2020-08-27 [1] CRAN (R 4.0.3)                
 gtable              0.3.0      2019-03-25 [1] CRAN (R 4.0.3)                
 haven               2.3.1      2020-06-01 [1] CRAN (R 4.0.3)                
 here                0.1        2017-05-28 [1] CRAN (R 4.0.3)                
 hms                 0.5.3      2020-01-08 [1] CRAN (R 4.0.3)                
 htmltools           0.5.0      2020-06-16 [1] CRAN (R 4.0.3)                
 htmlwidgets       * 1.5.2      2020-10-03 [1] CRAN (R 4.0.3)                
 httr                1.4.2      2020-07-20 [1] CRAN (R 4.0.3)                
 jsonlite            1.7.1      2020-09-07 [1] CRAN (R 4.0.3)                
 KernSmooth          2.23-17    2020-04-26 [2] CRAN (R 4.0.2)                
 klippy              0.0.0.9500 2020-11-13 [1] Github (rlesur/klippy@378c247)
 knitr               1.30       2020-09-22 [1] CRAN (R 4.0.3)                
 labeling            0.4.2      2020-10-20 [1] CRAN (R 4.0.3)                
 lattice             0.20-41    2020-04-02 [2] CRAN (R 4.0.2)                
 lazyeval            0.2.2      2019-03-15 [1] CRAN (R 4.0.3)                
 lifecycle           0.2.0      2020-03-06 [1] CRAN (R 4.0.3)                
 lubridate           1.7.9      2020-06-08 [1] CRAN (R 4.0.3)                
 magrittr            1.5        2014-11-22 [1] CRAN (R 4.0.3)                
 modelr              0.1.8      2020-05-19 [1] CRAN (R 4.0.3)                
 munsell             0.5.0      2018-06-12 [1] CRAN (R 4.0.3)                
 pillar              1.4.6      2020-07-10 [1] CRAN (R 4.0.3)                
 pkgconfig           2.0.3      2019-09-22 [1] CRAN (R 4.0.3)                
 plotly            * 4.9.2.1    2020-04-04 [1] CRAN (R 4.0.3)                
 plyr                1.8.6      2020-03-03 [1] CRAN (R 4.0.3)                
 prettyunits         1.1.1      2020-01-24 [1] CRAN (R 4.0.3)                
 progress            1.2.2      2019-05-16 [1] CRAN (R 4.0.3)                
 purrr             * 0.3.4      2020-04-17 [1] CRAN (R 4.0.3)                
 quantmod          * 0.4.17     2020-03-31 [1] CRAN (R 4.0.3)                
 R6                  2.4.1      2019-11-12 [1] CRAN (R 4.0.3)                
 Rcpp                1.0.5      2020-07-06 [1] CRAN (R 4.0.3)                
 readr             * 1.4.0      2020-10-05 [1] CRAN (R 4.0.3)                
 readxl            * 1.3.1      2019-03-13 [1] CRAN (R 4.0.3)                
 reprex              0.3.0      2019-05-16 [1] CRAN (R 4.0.3)                
 rgeos               0.5-5      2020-09-07 [1] CRAN (R 4.0.3)                
 rlang               0.4.8      2020-10-08 [1] CRAN (R 4.0.3)                
 rmarkdown           2.5        2020-10-21 [1] CRAN (R 4.0.3)                
 rnaturalearth     * 0.1.0      2017-03-21 [1] CRAN (R 4.0.3)                
 rnaturalearthdata   0.1.0      2017-02-21 [1] CRAN (R 4.0.3)                
 rprojroot           1.3-2      2018-01-03 [1] CRAN (R 4.0.3)                
 rstudioapi          0.11       2020-02-07 [1] CRAN (R 4.0.3)                
 rvest             * 0.3.6      2020-07-25 [1] CRAN (R 4.0.3)                
 scales              1.1.1      2020-05-11 [1] CRAN (R 4.0.3)                
 sessioninfo         1.1.1      2018-11-05 [1] CRAN (R 4.0.3)                
 sf                  0.9-6      2020-09-13 [1] CRAN (R 4.0.3)                
 sp                  1.4-4      2020-10-07 [1] CRAN (R 4.0.3)                
 stringi             1.5.3      2020-09-09 [1] CRAN (R 4.0.3)                
 stringr           * 1.4.0      2019-02-10 [1] CRAN (R 4.0.3)                
 tibble            * 3.0.4      2020-10-12 [1] CRAN (R 4.0.3)                
 tidyr             * 1.1.2      2020-08-27 [1] CRAN (R 4.0.3)                
 tidyselect          1.1.0      2020-05-11 [1] CRAN (R 4.0.3)                
 tidyverse         * 1.3.0      2019-11-21 [1] CRAN (R 4.0.3)                
 TTR               * 0.24.2     2020-09-01 [1] CRAN (R 4.0.3)                
 tweenr              1.0.1      2018-12-14 [1] CRAN (R 4.0.3)                
 units               0.6-7      2020-06-13 [1] CRAN (R 4.0.3)                
 vctrs               0.3.4      2020-08-29 [1] CRAN (R 4.0.3)                
 viridisLite         0.3.0      2018-02-01 [1] CRAN (R 4.0.3)                
 withr               2.3.0      2020-09-22 [1] CRAN (R 4.0.3)                
 xfun                0.18       2020-09-29 [1] CRAN (R 4.0.3)                
 xml2              * 1.3.2      2020-04-23 [1] CRAN (R 4.0.3)                
 xts               * 0.12.1     2020-09-09 [1] CRAN (R 4.0.3)                
 yaml                2.2.1      2020-02-01 [1] CRAN (R 4.0.3)                
 zoo               * 1.8-8      2020-05-02 [1] CRAN (R 4.0.3)                

[1] C:/Users/berna/OneDrive/Documentos/R/win-library/4.0
[2] C:/Program Files/R/R-4.0.2/library


LS0tDQp0aXRsZTogPGNlbnRlcj48Rk9OVCBDT0xPUj0ic2t5LWJsdWUiPlNpdHVhY2nDs24gZGVsIFNlY3RvciBBw6lyZW8tMTk8L0ZPTlQ+PC9jZW50ZXI+DQphdXRob3I6ICJNaWVtYnJvcyBkZWwgZ3J1cG86IFxuXG5cbiAqKkJlcm5hcmRvIENhcnR1c2NpZWxsbyoqIChjYXJ0dXNjaUBhbHVtbmkudXYuZXMpIFxuXG4gKipWaWNlbnRlIENlbGlzKiogKHZpY2Vyb25AYWx1bW5pLnV2LmVzKSBcblxuICoqSm9zZSBGZXJuYW5kZXoqKiAoam9mZXJjYXJAYWx1bW5pLnV2LmVzKSBcblxuIFVuaXZlcnNpdGF0IGRlIFZhbMOobmNpYSINCg0KZGF0ZTogIkRpY2llbWJyZSBkZSAyMDIwIChhY3R1YWxpemFkbyBlbCBgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkLSVtLSVZJylgKSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0aGVtZTogcGFwZXINCiAgICBoaWdobGlnaHQ6IHRleHRtYXRlIA0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogMyANCiAgICB0b2NfZmxvYXQ6IA0KICAgICAgY29sbGFwc2VkOiB0cnVlDQogICAgICBzbW9vdGhfc2Nyb2xsOiB0cnVlDQogICAgc2VsZl9jb250YWluZWQ6IHRydWUNCiAgICBudW1iZXJfc2VjdGlvbnM6IGZhbHNlDQogICAgZGZfcHJpbnQ6IGthYmxlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogY29uc29sZQ0KLS0tDQoNCmBgYHtyIHBhY2thZ2VzLXNldHVwLCBpbmNsdWRlID0gRkFMU0V9DQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkocnZlc3QpICAgICMgRm9yIHNjcmFwaW5nIHRoZSB3ZWINCmxpYnJhcnkodGlkeXIpICAgICMgRnVuY3Rpb25zIHRvIHRpZHkgb3VyIGRhdGENCmxpYnJhcnkoZHBseXIpICAgICMgUGlwZSBvcGVyYXRvciwgdGliYmxlIGhhbmRsaW5nDQpsaWJyYXJ5KGdncGxvdDIpIA0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHF1YW50bW9kKQ0KbGlicmFyeShkeWdyYXBocykNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGRhdGEudGFibGUpDQpsaWJyYXJ5KHh0cykNCmxpYnJhcnkoaHRtbHdpZGdldHMpDQpsaWJyYXJ5KHJuYXR1cmFsZWFydGgpDQpsaWJyYXJ5KGdnYW5pbWF0ZSkNCmxpYnJhcnkocGxvdGx5KQ0KYGBgDQoNCmBgYHtyIGNodW5rLXNldHVwLCBpbmNsdWRlID0gRkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIGV2YWwgPSBUUlVFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgICAgICAgI3Jlc3VsdHMgPSAiaG9sZCIsDQogICAgICAgICAgICAgICAgICAgICAgY2FjaGUgPSBGQUxTRSwgY2FjaGUucGF0aCA9ICIvY2FjaGVzLyIsIGNvbW1lbnQgPSAiIz4iLA0KICAgICAgICAgICAgICAgICAgICAgICNmaWcud2lkdGggPSA3LCAjZmlnLmhlaWdodD0gNywgICANCiAgICAgICAgICAgICAgICAgICAgICAjb3V0LndpZHRoID0gNywgb3V0LmhlaWdodCA9IDcsDQogICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2UgPSBUUlVFLCAgZmlnLnNob3cgPSAiaG9sZCIsDQogICAgICAgICAgICAgICAgICAgICAgZmlnLmFzcCA9IDcvOSwgb3V0LndpZHRoID0gIjYwJSIsIGZpZy5hbGlnbiA9ICJjZW50ZXIiKQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGRldiA9ICJwbmciLCBkZXYuYXJncyA9IGxpc3QodHlwZSA9ICJjYWlyby1wbmciKSkNCmBgYA0KDQpgYGB7ciBvcHRpb25zLXNldHVwLCBpbmNsdWRlID0gRkFMU0V9DQpvcHRpb25zKHNjaXBlbiA9IDk5OSkgIy0gcGFyYSBxdWl0YXIgbGEgbm90YWNpw7NuIGNpZW50w61maWNhDQpvcHRpb25zKCJ5YW1sLmV2YWwuZXhwciIgPSBUUlVFKSANCmBgYA0KDQpgYGB7ciBjaHVua19zZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgZXZhbCA9IFRSVUUsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgIGNhY2hlID0gRkFMU0UsIGNhY2hlLnBhdGggPSAiL2NhY2hlcy8iLCBjb21tZW50ID0gIiM+IiwNCiAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZSA9IFRSVUUsICBmaWcuc2hvdyA9ICJob2xkIiwNCiAgICAgICAgICAgICAgICAgICAgICBmaWcuYXNwID0gNy85LCBvdXQud2lkdGggPSAiODAlIiwgZmlnLmFsaWduID0gImNlbnRlciIpDQpgYGANCg0KYGBge3Iga2xpcHB5LCBlY2hvID0gRkFMU0V9DQprbGlwcHk6OmtsaXBweShwb3NpdGlvbiA9IGMoInRvcCIsICJyaWdodCIpKSAjLSByZW1vdGVzOjppbnN0YWxsX2dpdGh1Yigicmxlc3VyL2tsaXBweSIpDQpgYGANCg0KLS0tLS0tLS0tLS0tLS0tLS0NCg0KVHJhYmFqbyAgZWxhYm9yYWRvIHBhcmEgbGEgYXNpZ25hdHVyYSAiUHJvZ3JhbWFjacOzbiB5IG1hbmVqbyBkZSBkYXRvcyBlbiBsYSBlcmEgZGVsIEJpZyBEYXRhIiBkZSBsYSBVbml2ZXJzaXRhdCBkZSBWYWzDqG5jaWEgZHVyYW50ZSBlbCBjdXJzbyAyMDIwLTIwMjEuIExhIHDDoWdpbmEgd2ViIGRlIGxhIGFzaWduYXR1cmEgcHVlZGUgdmVyc2UgYXF1w606IDxodHRwczovL2Jlcm5pY2FydHVzY2llbGxvLmdpdGh1Yi5pby9pbnRyby1kcy0yMC0yMS13ZWIvPi4gTG9zIHRyYWJham9zIGRlIG1pcyBjb21wYcOxZXJvcyBkZSBjdXJzbyBwdWVkZW4gdmVyc2UgW2FxdcOtXShodHRwczovL3BlcmV6cDQ0LmdpdGh1Yi5pby9pbnRyby1kcy0yMC0yMS13ZWIvMDctdHJhYmFqb3MuaHRtbCkuDQoNCi0tLS0tLS0tLS0tLS0tLQ0KDQo8YnI+DQoNCiMjICAgPEZPTlQgQ09MT1I9InNreS1ibHVlIj4xLiBJbnRyb2R1Y2Npw7NuPC9GT05UPg0KDQoNCkVuIGVsIHNpZ3VpZW50ZSB0cmFiYWpvIHNlIHJlbGFjaW9uYXJhIGVsIG1lcmNhZG8gYnVyc8OhdGlsIGNvbiBlbCBzZWN0b3IgYcOpcmVvLCBkZSBmb3JtYSBtw6FzIGNvbmNyZXRhIHNlIGhhYmxhcsOhIGRlIGxhIGV2b2x1Y2nDs24gZGUgbG9zIHByZWNpb3MgZGUgbGFzIGFjY2lvbmVzIGRlIGNpbmNvIGdyYW5kZXMgYWVyb2zDrW5lYXMgYSBsbyBsYXJnbyBkZSBsb3Mgw7psdGltb3MgNSBhw7Fvcy4gU2UgcG9kcsOhIG9ic2VydmFyLCBjw7NtbyBzZSBjb21wYXJhbiB2YXJpYXMgZW1wcmVzYXMgYcOpcmVhcyBlbiBkaXN0aW50b3MgY29udGluZW50ZXMgeSBjw7NtbyBzZSBoYW4gdmlzdG8gaW5mbHVpZG8gbG9zIHByZWNpb3MgZGUgc3VzIGFjY2lvbmVzIHBvciBkaWZlcmVudGVzIHNob2NrcyBlbiBlc3RvcyBhw7Fvcy4NCg0KQSBsbyBsYXJnbyBkZSBlc3RlIHRyYWJham8sIHNlIHB1ZWRlIG9ic2VydmFyIGPDs21vIGxhcyBhZXJvbMOtbmVhcyBwZXJ0ZW5lY2VuIGEgdW4gc2VjdG9yIG11eSB2b2zDoXRpbCBkb25kZSBzZSBwb2Ryw6EgdmVyIHJlZmxlamFkbyBlbiBsYXMgZ3LDoWZpY2FzIGxvcyBhbHRvcyB5IGJham9zIGVuIGxvcyBwcmVjaW9zIHF1ZSBoYW4gdGVuaWRvIGVuIGxvcyDDumx0aW1vcyBhw7Fvcy4gTcOhcyByZWNpZW50ZW1lbnRlLCBjb21vIGVsIENPVklEIGhhIHBlcmp1ZGljYWRvIGEgZXN0YXMgZW1wcmVzYXMgZW4gZWwgbWVyY2FkbyBidXJzw6F0aWwuIEEgY2F1c2EgZGUgZXN0YXMgc2l0dWFjaW9uZXMgbXVjaGFzIGRlIGxhcyBhZXJvbGluZWFzIHNlIGhhbiB2aXN0byBncmF2ZW1lbnRlIHBlcmp1ZGljYWRhcyB5YSBxdWUgZHVyYW50ZSBlc3RhIMO6bHRpbWEgY3Jpc2lzIHNlIHByb2hpYmllcm9uIGxvcyB2dWVsb3MgYSBjYXVzYSBkZWwgZ3JhbiBuaXZlbCBkZSBjb250YWdpbyBxdWUgdGllbmUgZXN0ZSB2aXJ1cywgcG9yIGxvIGN1YWwgbG9zIGdvYmllcm5vcyBxdWVyw61hbiBldml0YXIgcXVlIHNlIHNpZ3VpZXJhIHByb3BhZ2FuZG8gZWwgdmlydXMgYWZlY3RhbmRvIGdyYXZlbWVudGUgYSBsb3MgaW5ncmVzb3MgZGUgZXN0YXMgZW1wcmVzYXMsIHByb3ZvY2FuZG8gcXVlIHRlbmdhbiBwZWRpciBheXVkYXMgeSBzdWJzaWRpb3MgYSBsb3MgZ29iaWVybm9zIHBhcmEgbm8gZW50cmFyIGVuIHF1aWVicmFzLg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgZXZhbD1UUlVFfQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MgKGhlcmU6OmhlcmUoICIvaW1hZ2VuZXMiLCJBbWVyaWNhbi1BaXJsaW5lcy03MzctTWF4LmpwZyIpKQ0KDQpgYGANCg0KIyMgICA8Rk9OVCBDT0xPUj0ic2t5LWJsdWUiPjIuIEV2b2x1Y2nDs24gUHJlY2lvcyBkZWwgU2VjdG9yPC9GT05UPi4gey50YWJzZXR9DQoNCiMjIyA8Rk9OVCBDT0xPUj0ic2t5LWJsdWUiPioqSW5mb3JtYWNpw7NuKio8L0ZPTlQ+DQoNCkVuIGVzdGUgZ3LDoWZpY28gc2UgcHVlZGUgb2JzZXJ2YXIgbG9zIHByZWNpb3MgZGUgbGFzIGFjY2lvbmVzIGRlIGxhcyA1IGFlcm9sw61uZWFzOiBBbWVyaWNhbiBBaXJsaW5lcywgQWlyIEZyYW5jZSwgTHVmdGhhbnNhLCBSeWFuYWlyIHkgVW5pdGVkIEFpcmxpbmVzLiBQb2RlbW9zIGRlc3RhY2FyIGNvbW8gZW4gbG9zIGHDsW9zIDIwMTcgeSBmaW5hbGVzIGRlbCAyMDE4IGxhcyBlbXByZXNhcyBwcmVzZW50YXJvbiB1biBhdWdlIGVuIGVsIHZhbG9yIGRlIGNvdGl6YWNpw7NuIHkgZXN0byBkZWJpZG8gZGlzdGludGFzIHJhem9uZXMgY29tbyBsYSBnbG9iYWxpemFjacOzbiwgZWwgYXVtZW50byBkZSBsb3MgdmlhamVzIGRlIG9jaW8geSBuZWdvY2lvcywgeSBlbCBjcmVjaW1pZW50byBkZSBsYXMgY29tcGHDscOtYXMgZGUgYmFqbyBjb3N0ZSwgdG9kb3MgZXN0b3MgY2F1c2FudGVzIGRlbCBpbXBvcnRhbnRlIGF1bWVudG8gZGUgdnVlbG9zIHF1ZSBzZSBoYSBleHBlcmltZW50YWRvIGEgbml2ZWwgbXVuZGlhbC4gU2luIGVtYmFyZ28sIGVuIGxvcyBwZXJpb2RvcyBzaWd1aWVudGVzIGNhYmUgcmVjYWxjYXIgZWwgYWNvbnRlY2ltaWVudG8gcXVlIGNhdXPDsyBxdWUgZXN0b3MgbsO6bWVyb3MgcGFzYXLDoW4gYSBsYSBoaXN0b3JpYSBjb21vIGxhIG1heW9yIGNhw61kYSBkZSBsYSBib2xzYSBlbiBsYXMgYWNjaW9uZXMgZGVsIHNlY3RvciBhw6lyZW8sIGxhIHBhbmRlbWlhIGRlbCBjb3JvbmF2aXJ1cy4gRWwgdmlydXMgZnVlIHVuIGltcG9ydGFudGUgY2F1c2FudGUgZGUgbGEgYmFqYSBkZSBlc3RvcyBwcmVjaW9zIGRlYmlkbyBhbCBjaWVycmUgZGUgZnJvbnRlcmFzIGVudHJlIGxvcyBsb3MgcGHDrXNlcyB5IGVsIGltcGVkaW1lbnRvIGRlIG1vdmlsaWRhZCBkZSBsYSBwb2JsYWNpw7NuIG11bmRpYWwuIA0KDQpPdHJvcyBkZSBsb3MgbW90aXZvcyBwb3IgZWwgY3VhbCBzZSBwcmV2w6kgdW5hIHByb3llY2Npw7NuIG3DoXMgbmVnYXRpdmEgZW4gZWwgc2VjdG9yIGVzIHF1ZSBncmFjaWFzIGFsIGNvbmZpbmFtaWVudG8gcXVlIHN1Y2VkacOzIGEgY2F1c2EgZGVsIGNvdmlkLTE5IG11Y2hvcyBkZSBsYXMgZW1wcmVzYXMgY29tZW56YXJvbiBhIGltcGxlbWVudGFyIGVsIHRlbGV0cmFiYWpvLCBhIHJhw616IGRlIGVzdG8gbGFzIGVtcHJlc2FzIHNlIGRpZXJvbiBjdWVudGEgZGUgcXVlIGxhcyByZXVuaW9uZXMgcG9yIHZpZGVvbGxhbWFkYXMgZXJhbiBpZ3VhbCBkZSBlZmljaWVudGVzIGNvbW8gc2kgbG9zIHRyYWJhamFkb3JlcyBlc3R1dmllc2VuIHByZXNlbnRlcy4gUG9yIGxvIGN1YWwsIG11Y2hhcyBlbXByZXNhcyBhaG9yYSBwcmVmaWVyZW4gY2VycmFyIHN1cyB0cmF0b3MgZGUgbWFuZXJhIG9ubGluZSBlbiB2ZXogZGUgdGVuZXIgcXVlIGRlc3BsYXphciBhIHN1cyB0cmFiYWphZG9yZXMgcXVlIGVzdG8gZ2VuZXJhICBncmFuZGVzIGNvc3RlcyB5IGRpc21pbnV5ZW4gbG9zIGJlbmVmaWNpb3MgcXVlIHB1ZWRlbiB0ZW5lciBhIGZ1dHVyby4NCg0KIyMjIDxGT05UIENPTE9SPSJza3ktYmx1ZSI+KipHcsOhZmljbyoqPC9GT05UPg0KYGBge3IsIGVjaG8gPSBGQUxTRSwgaW5jbHVkZSA9IFRSVUV9DQpwcmVjaW9fYWMgPC0gcmVhZF9leGNlbCgiLi9kYXRvcy9hZXJvbGluZWFzLnhsc3giKQ0KDQptZWRpYSA8LSBtZWFuKHByZWNpb19hYyRgcHJlY2lvIEFBTGAsIG5hLnJtID0gVFJVRSkgICAgDQpkZXN2aWFjaW9uIDwtIHNkKHByZWNpb19hYyRgcHJlY2lvIEFBTGAsIG5hLnJtID0gVFJVRSkgDQoNCnAxIDwtIGdhdGhlcihwcmVjaW9fYWMsIGFlcmVvLCBwcmVjaW9zLCBgcHJlY2lvIEFBTGA6YHByZWNpbyBBSVJGYCApDQoNCnAxICU+JSBmaWx0ZXIoYWVyZW8gJWluJSBjKCJwcmVjaW8gQUFMIiwgInByZWNpbyBMSEEiLCAicHJlY2lvIFVBTCIsICJwcmVjaW8gUllBIiwicHJlY2lvIEFJUkYiKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBmZWNoYSwgeSA9IHByZWNpb3MgLCBjb2xvciA9IGFlcmVvKSkgKyBnZW9tX2xpbmUoKSANCg0KYGBgDQoNCg0KIyMgICA8Rk9OVCBDT0xPUj0ic2t5LWJsdWUiPjMuIEV2b2x1Y2nDs24gUHJlY2lvcyBwb3IgRW1wcmVzYTwvRk9OVD4gey50YWJzZXR9DQoNCkVuIGVzdGUgY2Fzbywgc2UgcHVlZGUgb2JzZXJ2YXIgZGUgbWFuZXJhIG3DoXMgZGV0YWxsYWRhIGxhIHZhcmlhY2nDs24gcXVlIGhhIHRlbmlkbyBjYWRhIGNvbXBhw7HDrWEgYcOpcmVhIGEgbG8gbGFyZ28gZGVsIHRpZW1wby4gU2Ugc2VwYXLDsyBkZSBsYSBncsOhZmljYSBjb25qdW50YSBkZSBsYXMgNSBhZXJvbMOtbmVhcyBhIHVuYSBncsOhZmljYSBwb3IgY2FkYSBlbXByZXNhLiAgDQoNCkVuIGVzdGFzIGdyw6FmaWNhcyBpbmRpdmlkdWFsZXMsIHNlIHB1ZWRlIGRlc3RhY2FyIGRlIGZvcm1hIG3DoXMgcHJlY2lzYSBjb21vIGR1cmFudGUgZWwgcGVyaW9kbyAyMDE3IHkgMjAxOCwgZXN0YXMgYWNjaW9uZXMgdHV2aWVyb24gdW4gYXVnZSBlbiBzdXMgcHJlY2lvcyBhbGNhbnphbmRvIHN1IG3DoXhpbW8gZGVudHJvIGRlIGxvcyDDumx0aW1vcyBjaW5jbyBhw7FvcywgY29tbyBmdWUgZWwgY2FzbyBkZSBBbWVyaWNhbiBBaXJsaW5lcyB1biBwcmVjaW8gYXByb3hpbWFkbyBkZSA2MCBldXJvcywgYWwgaWd1YWwgcXVlIFVuaXRlZCBBaXJsaW5lcyBkZSAxMDAgZXVyb3MuIFBvciBvdHJvIGxhZG8sIGEgcmHDrXogZGUgbGEgY3Jpc2lzIGRlbCBjb3ZpZC0xOSBzZSBwdWVkZSBkZXN0YWNhciB1bmFzIGRlIGxhcyBtYXlvcmVzIGNhw61kYXMgZGUgbG9zIHByZWNpb3MgZGUgbGFzIGFjY2lvbmVzIGRlIGxhcyBkaXN0aW50YXMgYWVyb2zDrW5lYXMgYSBjYXVzYSBkZSBsYSBsaW1pdGFjacOzbiBkZSBtb3ZpbGlkYWQgZGUgbGFzIHBlcnNvbmFzIHBvciBlbCBjb25maW5hbWllbnRvLiANCg0KUnlhbmFpciBoYSBzaWRvIHVuYSBkZSBsYXMgcG9jYXMgZW1wcmVzYXMgw6FyZWFzIHF1ZSBzZSBoYSByZWN1cGVyYWRvIGRlc3B1w6lzIGRlIGxhIGNyaXNpcyBhbGNhbnphbmRvIG5pdmVsZXMgcGFyZWNpZG9zIGFudGVzIGRlIGxhIHBhbmRlbWlhLCB5YSBxdWUgYWwgY29taWVuem8gZGUgbGEgYXBlcnR1cmEgZGUgbG9zIGFlcm9wdWVydG9zIGZ1ZSBsYSBxdWUgb2J0dXZvIHVuYSBtYXlvciBjYW50aWRhZCBkZSB2ZW50YXMgY29tcGFyYWRvIGFsIHJlc3RvIGRlIGFlcm9sw61uZWFzLCBxdWUgcHVlZGUgc2VyIGRlYmlkbyBhIHN1IHNlcnZpY2lvIGxvdy1jb3N0LiANCg0KVGFtYmnDqW4gc2UgcHVlZGUgb2JzZXJ2YXIgY29tbyBoYSBjb21lbnphZG8gbGEgcmVjdXBlcmFjacOzbiBkZSBsb3MgcHJlY2lvcyBkZSBlc3RhcyBhZXJvbMOtbmVhcywgYXVucXVlIG5vIGhhIHNpZG8gbXVjaG8gc2UgcHVlZGUgbm90YXIgcXVlIGVzdMOhIHRlbmllbmRvIGxldmUgc3ViaWRhLiBBZGVtw6FzLCBhbmFsaXphbW9zIGxhIHNpdHVhY2nDs24gZGUgVW5pdGVkIEFpcmxpbmVzIHkgQW1lcmljYW4gQWlybGluZXMgcXVlIHR1dmllcm9uIGxhcyBtYXlvcmVzIGNhw61kYXMgZGUgbG9zIHByZWNpb3MgZW4gcmVsYWNpw7NuIGEgbG8gZGVtw6FzIHB1ZGllbmRvIHNlciB1bmEgZGUgbGFzIHJhem9uZXMgZGUgcXVlIGVzdGFzIHBlcnRlbmV6Y2FuIGEgbGFzIDQgYWVyb2zDrW5lYXMgbcOhcyBncmFuZGVzIGRlbCBtdW5kbyBlbiBjdWFudG8gYSBpbmdyZXNvcyB5IGEgZmxvdGEgYcOpcmVhLiANCg0KIyMjIDxGT05UIENPTE9SPSJza3ktYmx1ZSI+KipHcsOhZmljYSoqPC9GT05UPg0KDQpgYGB7ciwgZWNobyA9IEZBTFNFLCBpbmNsdWRlID0gVFJVRX0NCnAxICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBmZWNoYSwgeSA9IHByZWNpb3MsIGNvbG9yID0gYWVyZW8pKSArDQogIGdlb21fbGluZSgpICsNCiAgZmFjZXRfd3JhcCh+YWVyZW8sc2NhbGVzID0gJ2ZyZWVfeScpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgbGFicyh4ID0gJ2ZlY2hhJywNCiAgICAgICB5ID0gIlByZWNpbyBhY2Npw7NuIiwNCiAgICAgICB0aXRsZSA9ICJTZWN0b3IgQWVyZW8iKQ0KYGBgDQoNCiMjIyA8Rk9OVCBDT0xPUj0ic2t5LWJsdWUiPioqR3LDoWZpY2EgRGluw6FtaWNhKio8L0ZPTlQ+DQpgYGB7ciBwcmVjaW8yMywgIGVjaG8gPSBGQUxTRSwgaW5jbHVkZSA9IFRSVUV9DQoNCg0KcHJlY2lvMjMgPC0gZ2dwbG90KHAxLCBhZXMoZmVjaGEgLCBwcmVjaW9zLCAgY29sb3I9IGFlcmVvKSkgICsgZ2VvbV9saW5lKCkgKyANCiAgbGFicyh0aXRsZSA9ICJTZWN0b3IgQcOpcmVvIHBvciBlbXByZXNhIiwNCiAgICAgY2FwdGlvbiA9ICJFbGFib3JhY2nDs24gcHJvcGlhIiwNCiAgICB5ID0gInByZWNpb3MiLCB4ID0gImZlY2hhIikgKyAgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKCkpICsgDQogIGZhY2V0X3dyYXAofmFlcmVvLCBucm93ID0gNCwgbmNvbCA9IDMpICArIHRyYW5zaXRpb25fcmV2ZWFsKGZlY2hhKQ0KYGBgDQoNCmBgYHtyIGVjaG89IEZBTFNFLCBldmFsID0gVFJVRSwgb3V0LndpZHRoPSI4MCUifQ0KcHJlY2lvMjMNCmBgYA0KDQojIyAgIDxGT05UIENPTE9SPSJza3ktYmx1ZSI+NC4gR3LDoWZpY2FzIGRlIFZlbGFzIGRlIEFtZXJpY2FuIEFpcmxpbmVzPC9GT05UPiAgIyMNCg0KQXF1w60gc2UgcHVlZGUgb2JzZXJ2YXIgdW4gZ3LDoWZpY28gZGUgdmVsYXMgZGUgbGEgYWNjacOzbiBkZSBBbWVyaWNhbiBBaXJsaW5lcy4gRGUgZm9ybWEgbcOhcyBkZXRhbGxhZGEgc2UgYXByZWNpYSBsYSBhcGVydHVyYSB5IGVsIGNpZXJyZSBkaWFyaW8gZGUgbGEgYWNjacOzbiwgYWwgaWd1YWwgcXVlIHNlIGRldGFsbGEgZWwgcHJlY2lvIG3DoXhpbW8geSBlbCBwcmVjaW8gbcOtbmltbyBxdWUgYWxjYW56YWRvIHF1ZSBoYSB0ZW5pZG8gbGEgYWNjacOzbiBhIGxvIGxhcmdvIGRlbCBkw61hLiBMYSBncsOhZmljYSBkZSB2ZWxhcyBlcyBsYSBwcmluY2lwYWwgZ3LDoWZpY2EgcXVlIHVzYW4gbG9zIGludmVyc2lvbmlzdGFzIHkgbG9zIHRyYWRlcnMgcGFyYSBkZXRhbGxhciBlbCBwcmVjaW8gZGUgdW5hIGFjY2nDs24sIGNvbW8gcHJvcG9yY2lvbmEgdGFudGEgaW5mb3JtYWNpw7NuIGFsIHNvbG8gY29sb2NhciBlbCBtb3VzZSBlbmNpbWEgZGUgdW5hIHZlbGEgZXMgdW5hIGRlIGxhcyBoZXJyYW1pZW50YXMgbcOhcyBlZmljaWVudGVzIHBhcmEgZWxsb3MuIA0KDQoNCg0KYGBge3IsIGVjaG8gPSBGQUxTRSwgaW5jbHVkZSA9IFRSVUV9DQpzdGFydCA8LSBhcy5EYXRlKCIyMDE1LTAxLTAxIikNCmVuZCA8LSBhcy5EYXRlKCIyMDIwLTAxLTEyIikNCg0KZ2V0U3ltYm9scygiQUFMIiwgc3JjID0gInlhaG9vIiwgZnJvbSA9IHN0YXJ0LCB0byA9IGVuZCkNCg0KDQphbWVyaWNhbiA8LSBBQUxbLGMoMSwyLDMsNCldDQpuYW1lcyhhbWVyaWNhbikgPC0gYygiT3BlbiIsICJIaWdodCIsICJMb3ciLCAiQ2xvc2UiKQ0KDQphbWVyaWNhbl8xIDwtDQogIGR5Z3JhcGgoYW1lcmljYW4sDQogICAgICAgICAgbWFpbiA9ICJBbWVyaWNhbiBBaXJsaW5lcyIpICU+JQ0KICBkeU9wdGlvbnMoZ3JpZExpbmVDb2xvciA9ICJ3aGl0ZSIpICU+JQ0KICBkeVJvbGxlcihyb2xsUGVyaW9kID0gNykgICU+JQ0KICBkeVJhbmdlU2VsZWN0b3IoaGVpZ2h0ID0gMjApICU+JQ0KICBkeVJhbmdlU2VsZWN0b3IoZGF0ZVdpbmRvdyA9IGMoIjIwMTUtMDEtMDEiLCAiMjAyMC0wMS0xMiIpKSAlPiUNCiAgZHlDYW5kbGVzdGljaygpDQoNCmFtZXJpY2FuXzENCmBgYA0KDQoNCiMjICAgPEZPTlQgQ09MT1I9InNreS1ibHVlIj41LiBUcmF5ZWN0b3JpYXMgRXVyb3BlYXMgZGUgVW5pdGVkIEFpcmxpbmVzPC9GT05UPg0KDQpTZSBwdWVkZSBvYnNlcnZhciBlbiBlc3RlIG1hcGEgbGFzIHJ1dGFzIGRlIFVuaXRlZCBBaXJsaW5lcyBoYWNpYSBlbCBjb250aW5lbnRlIGV1cm9wZW8geSBkZXN0YWNhciBsYXMgcHJpbmNpcGFsZXMgY2l1ZGFkZXMgSFVCIGxhcyBjdWFsZXMgc29uIFdhc2hpbmd0b24gREMgKENhcGl0YWwgZGUgbG9zIEVzdGFkb3MgVW5pZG9zKSB5IE5ldyBZb3JrIChMYSBjaXVkYWQgc2VkZSBkZWwgZ3JhbiBjZW50cm8gZmluYW5jaWVybyBkZWwgcGHDrXMpLiBVbml0ZWQgQWlybGluZXMgb2ZyZWNlIHZhcmlvcyB2dWVsb3MgZGlyZWN0b3MgaGFjaWEgY2l1ZGFkZXMgY29tbyBNYWRyaWQsIExvbmRyZXMsIFJvbWEgeSBQYXLDrXMgcXVlIHBvciBjdWxwYSBkZSBsYSBzaXR1YWNpw7NuIHBhbmTDqW1pY2Egc2Ugdmllcm9uIGdyYXZlbWVudGUgYWZlY3RhZG9zIHRyYXMgbGEgY2FuY2VsYWNpw7NuIGRlIGxvcyB2dWVsb3MuIExhcyBheXVkYXMgcXVlIHNlIGxlcyBvdG9yZ8OzIGEgZXN0ZSBzZWN0b3IgcG9yIHBhcnRlIGRlbCBnb2JpZXJubyBmdWVyb24gZGUgZ3JhbiBheXVkYSBwYXJhIGZyZW5hciBlbCBkZXNwbG9tZSBkZSBsYXMgZW1wcmVzYXMgdHJhcyBlbCBjZXNlIGRlIGxhIGFjdGl2aWRhZCBhw6lyZWEuIFNpbiBlbWJhcmdvLCBlc3RhcyBheXVkYXMgZnVlcm9uIHN1ZmljaWVudGVzIGhhc3RhIGNpZXJ0byBwdW50byB5YSBxdWUgZmluYWxpemFyb24gYSBtZWRpYWRvcyBkZWwgbWVzIGRlIGFnb3N0bywgc2l0dWFjacOzbiBxdWUgb2JsaWfDsyBhIGxhIGVtcHJlc2EgZW4gc2VwdGllbWJyZSByZWR1Y2lyIHN1IHBsYW50aWxsYSBlbiBhcHJveGltYWRhbWVudGUgMTMuMDAwIGVtcGxlYWRvcywgY2FzaSA3LjAwMCBhdXhpbGlhcmVzIGRlIHZ1ZWxvLiANCg0KYGBge3IsIGVjaG8gPSBGQUxTRSwgaW5jbHVkZSA9IFRSVUV9DQp3b3JsZCA8LSBybmF0dXJhbGVhcnRoOjpuZV9jb3VudHJpZXMoc2NhbGUgPSAibWVkaXVtIiwgcmV0dXJuY2xhc3MgPSAic2YiKQ0KcCA8LSBnZ3Bsb3QoZGF0YSA9IHdvcmxkKSArIGdlb21fc2YoZmlsbCA9ICJwYXBheWF3aGlwIikgKw0KICBsYWJzKHRpdGxlID0gIlJ1dGFzIEFlcmVhcyBVbml0ZWQgQWlybGluZXMiLA0KICAgICAgIGNhcHRpb24gPSAiRWxhYm9yYWNpb24gcHJvcGlhIikNCnAgKyB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG9yID0gZ3JheSguOCksIGxpbmV0eXBlID0gImRhc2hlZCIsIHNpemUgPSAwLjA1KSwNCiAgICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAibGlnaHRibHVlMSIpKSArIGNvb3JkX3NmKHhsaW0gPSBjKC0xMzAsIDQwLjAwKSwgeWxpbSA9IGMoMjMsIDYwKSwgZXhwYW5kID0gRkFMU0UpICsNCiAgYW5ub3RhdGUoInNlZ21lbnQiLCB4ID0gLTcyLjUsIHhlbmQgPSAtNCwgeSA9IDQxLjEsIHllbmQgPSA0MC41LCBjb2xvdXIgPSAiYmxhY2siKSArDQogIGFubm90YXRlKCJwb2ludCIsIHggPSAtNzIuNSwgeSA9IDQxLjEgKSArIGFubm90YXRlKCJwb2ludCIsIHggPSAtNCwgeSA9IDQwLjUgKSArDQogIGFubm90YXRlKGdlb20gPSAidGV4dCIsIGxhYmVsID0gIk5ldyBZb3JrIiwgc2l6ZSA9IDMuMiwgeCA9IC03Mi41LCB5ID0gNDMpICsNCiAgYW5ub3RhdGUoZ2VvbSA9ICJ0ZXh0IiwgbGFiZWwgPSAiTWFkcmlkIiwgc2l6ZSA9IDMuMiwgeCA9IC00LCB5ID0gNDIuNSkgKw0KICBhbm5vdGF0ZSgic2VnbWVudCIsIHggPSAtNzcsIHhlbmQgPSAtMSwgeSA9IDM5LCB5ZW5kID0gNTEuNSwgY29sb3VyID0gImJsYWNrIikgKw0KICBhbm5vdGF0ZSgicG9pbnQiLCB4ID0gLTc3LCB5ID0gMzkpICsgYW5ub3RhdGUoInBvaW50IiwgeCA9IC0xLCB5ID0gNTEuNSkgKw0KICBhbm5vdGF0ZShnZW9tID0gInRleHQiLCBsYWJlbCA9ICJXYXNoaW5ndG9uIERDIiwgc2l6ZSA9IDMuMiwgeCA9IC03NiwgeSA9IDM3LjUpICsNCiAgYW5ub3RhdGUoZ2VvbSA9ICJ0ZXh0IiwgbGFiZWwgPSAiTG9uZHJlcyIsIHNpemUgPSAzLjIsIHggPSAtMSwgeSA9IDU1KSArDQogIGFubm90YXRlKCJzZWdtZW50IiwgeCA9IC03Mi41LCB4ZW5kID0gMywgeSA9IDQxLjEsIHllbmQgPSA0OCkgKyBhbm5vdGF0ZSgicG9pbnQiLCB4ID0gMywgeSA9IDQ4KSArDQogIGFubm90YXRlKGdlb20gPSAidGV4dCIsIGxhYmVsID0gIlBhcmlzIiwgc2l6ZSA9IDMuMiwgeCA9IDMsIHkgPSA1MCkgKw0KICBhbm5vdGF0ZSgic2VnbWVudCIsIHggPSAtNzcsIHhlbmQgPSAxMS41LCB5ID0gMzksIHllbmQgPSA0NCkgKyBhbm5vdGF0ZSgicG9pbnQiLCB4ID0xMS41LCB5ID0gNDQpICsNCiAgYW5ub3RhdGUoZ2VvbSA9ICJ0ZXh0IiwgbGFiZWwgPSAiUm9tYSIsIHNpemUgPSAzLjIsIHggPSAxMS41LCB5ID0gNDYuNSkgDQoNCg0KYGBgDQoNCg0KDQoNCg0KIyMgICA8Rk9OVCBDT0xPUj0ic2t5LWJsdWUiPjYuIENvbmNsdXNpw7NuPC9GT05UPg0KDQpQb3IgdW4gbGFkbywgaGVtb3MgcG9kaWRvIGNvbXByb2JhciBxdWUgbGFzIGFlcm9sw61uZWFzIHBlcnRlbmVjZW4gYSB1biBzZWN0b3IgbXV5IHZvbMOhdGlsIHkgcG9yIGVsbG8sIHNlIGhhbiB2aXN0byBncmF2ZW1lbnRlIHBlcmp1ZGljYWRhcyBoYXN0YSBlbCBwdW50byBkZSB0ZW5lciBxdWUgc2VyIHJlc2NhdGFkYXMgcG9yIGxvcyBnb2JpZXJub3MgcGFyYSBubyBlbnRyYXIgZW4gcXVpZWJyYS4NCg0KRW4gZWwgcHJpbWVyIGdyw6FmaWNvLCBjYWJlIGRlc3RhY2FyIGxhIGNhw61kYSBkZSBVbml0ZWQgQWlybGluZXMgeSBsYSBmdWVydGUgcmVjdXBlcmFjacOzbiBkZSBSeWFuYWlyIHNpdHXDoW5kb3NlIGVuIG5pdmVsZXMgc2ltaWxhcmVzIGRlIGFudGVzIGRlIGxhIHBhbmRlbWlhLg0KDQpFbiBlbCBncsOhZmljbyBkaW7DoW1pY28gZGUgQW1lcmljYW4gQWlybGluZXMgaGVtb3Mgb2JzZXJ2YWRvIGNvbW8gdHJhbnNjdXJyZSBsYSBjb3RpemFjacOzbiBkZSBsYSBhY2Npw7NuIGRlIG1hbmVyYSBtw6FzIGVzcGVjw61maWNhLCBkw61hIGEgZMOtYSBkZXNkZSBlbmVybyAyMDE1IGhhc3RhIGVuZXJvIDIwMjAuDQoNCkVuIGVsIG1hcGEgZGUgbGFzIHJ1dGFzIGHDqXJlYXMgc2UgdmVuIHJlZmxlamFkb3MgbG9zIHRyYXllY3RvcyBxdWUgcmVhbGl6YSBsYSBjb21wYcOxw61hIFVuaXRlZCBBaXJsaW5lcyBlbnRyZSBFc3RhZG9zIFVuaWRvcyB5IEV1cm9wYS4NCg0KUG9yIG90cm8gbGFkbywgbGFzIGVtcHJlc2FzIGhhbiBjb21wcm9iYWRvKGZvcnphZGFtZW50ZSkgYSBjYXVzYSBkZWwgQ09EVklELTE5IHF1ZSBlbCB0ZWxldHJhYmFqbyBlcyB1bmEgZm9ybWEgZGUgcmVkdWNpciBjb3N0ZXMgdG90YWxlcy4gQSByYcOteiBkZSBlc3RvLCBwb2Ryw61hbW9zIGRlY2lyIHF1ZSBoYSBtYXJjYWRvIHVuIGFudGVzIHkgdW4gZGVzcHXDqXMgZW4gbGEgdmlzacOzbiBlbXByZXNhcmlhbC4gU2UgY29udGVtcGxhIHVuYSBncmFuIGluY2VydGlkdW1icmUgYSBjb3J0byBwbGF6by4NCg0KDQoNCiMjICAgPEZPTlQgQ09MT1I9InNreS1ibHVlIj43LiBSZWZlcmVuY2lhcyBCaWJsaW9ncsOhZmljYXM8L0ZPTlQ+DQoNClBhcmEgbGEgcmVhbGl6YWNpw7NuIGRlbCB0cmFiYWpvIGhlIHV0aWxpemFkbzoNCg0KLSBbTWFya2V0IEJ1c2luZXNzIEluc2lkZXJdKGh0dHBzOi8vbWFya2V0cy5idXNpbmVzc2luc2lkZXIuY29tLykNCg0KLSBbSW52ZXN0aW5nXShodHRwczovL2VzLmludmVzdGluZy5jb20vKQ0KDQotIFtScHVic10oaHR0cHM6Ly9ycHVicy5jb20vbHVpcy1mZXJuYW5kZXp0LzYxMDQ2NikNCi0tLS0tLS0tLS0tLS0tLS0NCg0KPGJyPjxicj4NCg0KUGFyYSBhY2FiYXIgZXN0ZSBjaHVuayBwYXJhIGluY2x1aXIgdHUgYHNlc3Npb24gaW5mb2A6DQoNCmBgYHtyfQ0Kc2Vzc2lvbmluZm86OnNlc3Npb25faW5mbygpICU+JSBkZXRhaWxzOjpkZXRhaWxzKHN1bW1hcnkgPSAnY3VycmVudCBzZXNzaW9uIGluZm8nKSANCmBgYA0KDQoNCg0KDQoNCg==