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 2021-2022. El repo del trabajo está aquí.

La página web de la asignatura y los trabajos de mis compañeros pueden verse aquí.

1. INTRODUCCIÓN

En el presente trabajo voy a mostrar algunos datos de interés sobre el deporte. El deporte esta muy presente en nuestras vidas, tanto para la gente que lo práctica como para la gente que lo disfruta viendolo. Mi objetivo en este trabajo es que podaís informaros estadísticamente como de presente esta el deporte en nuestro país.

2. CARGAMOS DATOS Y PAQUETES

library(ggplot2)
library(dplyr)
library(ggthemes)
library(hrbrthemes)
library(gganimate)
library(wordcloud2)
library(viridis)
library("plotly")
library(geometries)
library(labeling)
library(mapdata)
library(scales)
library(gt)
library(tibble)


GastoHogares<- rio::import("./datos/GastoHogares.csv")
HabitosDeportivos <- rio::import("./datos/HabitosDeportivos.csv")
NivelEstudios <- rio::import("./datos/NivelEstudios.csv")
GastoPublico <- rio::import("./datos/GastoPublico.csv")
Empresas <- rio::import("./datos/Empresas.csv")
Record <- rio::import("./datos/Record.csv")
Campeonatos <- rio::import("./datos/campeonatos.csv")

3. HÁBITOS DEPORTIVOS

Todos sabemos que el sedentarismo es uno de los principales enemigos de la salud. Nuestro cuerpo ha sido diseñado para estar en movimiento, y los músculos requieren de activación física para mantenerse fuertes. De hecho, muchas enfermedades se pueden prevenir llevando una rutina deportiva adecuada. Por ello tener hábitos deportivos es esencial.

df_habitos <- HabitosDeportivos %>%
 filter(!(Tramo_Edad %in% "15-..."))

p1 <- ggplot(df_habitos) +
 aes(x = Tramo_Edad, fill = Tramo_Edad, weight = Porcentaje) +
 geom_bar() +
 scale_colour_viridis_c(option="magma") +
 theme_minimal() +
 facet_wrap(vars(Periodo)) + theme(plot.subtitle = element_text(size = 11),
    axis.title = element_text(size = 10),
    plot.title = element_text(size = 12)) + labs(title = "Porcentaje de la población con habitos deportivos",
    x = "Tramo de Edad", y = "Porcentaje de la población") + theme(panel.grid.major = element_line(colour = "#98F5FF"),
    panel.grid.minor = element_line(colour = "#98F5FF"),
    panel.background = element_rect(fill = "#98F5FF"),
    plot.background = element_rect(fill = "#98F5FF"),
    legend.background = element_rect(fill = "#98F5FF"))

ggplotly(p1)

En este gráfico se puede ilustrar como los hábitos deportivos han aumentado de 2010 a 2020, en todos los rangos de edades, algo sin lugar a dudas beneficioso.

4. EMPRESAS RELACIONADAS CON EL DEPORTE

df_empresas <- Empresas %>% 
  select(CCAA, Empresas) %>%
  group_by(CCAA) 

bb <- ggplot(df_empresas, aes(x="", y= Empresas, fill = CCAA))+
  geom_bar(width = 1, stat = "identity") +
  labs(title = "Cantidad de empresas vinculadas al deporte en cada CCAA",
       x = " ",
       y = " ", fill= "") +  guides(fill=guide_legend(ncol=2)) + theme(panel.grid.major = element_line(colour = "#98F5FF"),
    panel.grid.minor = element_line(colour = "#98F5FF"),
    panel.background = element_rect(fill = "#98F5FF"),
    plot.background = element_rect(fill = "#98F5FF"),
    legend.background = element_rect(fill = "#98F5FF")) +labs(fill = NULL) 

cc <- bb + coord_polar("y", start=0)
cc + theme_minimal()

En este gráfico podemos observar la cantidad de empresas relacionadas con el deporte que tiene cada Comunidad Autónoma, destacan sobretodo Andalucia, Cataluña y Madrid.

5. GASTO TOTAL HOGARES

Este apartado nos servirá para tener una idea lo implicadas que están las familias en el deporte.

df_hogares <- GastoHogares %>%
  select(Años, Gasto.total)


ggplot( data= df_hogares, aes(x=Años, y= Gasto.total, colour = Gasto.total)) +
  geom_line() +
  geom_point() +
  ggtitle("Evolución del gasto de los hogares en deportes") +
  theme_ipsum() +
  ylab("") + scale_x_continuous(  
    breaks = c(2010.0, 2015.0, 2020.0),
     label = c("2010", "2015", "2020")) +
  transition_reveal(Años) + theme(panel.grid.major = element_line(colour = "#98F5FF"),
    panel.grid.minor = element_line(colour = "#98F5FF"),
    panel.background = element_rect(fill = "#98F5FF"),
    plot.background = element_rect(fill = "#98F5FF"),
    legend.background = element_rect(fill = "#98F5FF")) +labs(fill = NULL)

6. GASTO PÚBLICO

El gasto público dedicado al deporte es esencial, a mayor gasto mas se incentivará a las personas a realizar deporte, más y de mayor calidad.

GastoPublico %>%
 tail(10) %>%
  ggplot( aes(x=Años, y=Gasto.Público.AdmLocal)) +
    geom_line( color="grey") +
    geom_point(shape=21, color="black", fill="#69b3a2", size=3) + ylab("Gasto") +
    theme_ipsum()  +  ylim(0,3100) + scale_x_continuous(  
    breaks = c(2010.0, 2015.0, 2012.5, 2017.5),
     label = c("2010", "2015", "2012", "2017")) +
    ggtitle("Evolución gasto público") + theme(panel.grid.major = element_line(colour = "#98F5FF"),
    panel.grid.minor = element_line(colour = "#98F5FF"),
    panel.background = element_rect(fill = "#98F5FF"),
    plot.background = element_rect(fill = "#98F5FF"),
    legend.background = element_rect(fill = "#98F5FF")) +labs(fill = NULL)

7. RÉCORDS EN ESPAÑA

España es un país que suele destacar en los deportes. Tenemos a miles de deportistas espectaculares que año a año nos traen medellas a casa. Aquí ilustraré los deportes en los que hemos conseguido más records.

Total

df_recordtotal <- Record %>%
  select(Deportes, Total) %>%
  slice_max(Total, n = 5)%>%
  arrange(desc(Total))


df <- ggplot(df_recordtotal, aes(x=Deportes, y=Total)) +
  geom_segment( aes(x=Deportes, xend=Deportes, y=0, yend=Total)) +
  geom_point( size=5, color="purple", alpha=0.5, shape=40, stroke=1) + theme(axis.title.x=element_blank(),
        axis.text.x=element_blank(),
        axis.ticks.x=element_blank()) +  labs(title = "Top 5 récords",
              subtitle = "año 2020", 
              x = "Deportes",
              y = "Record")  + theme(panel.grid.major = element_line(colour = "#98F5FF"),
    panel.grid.minor = element_line(colour = "#98F5FF"),
    panel.background = element_rect(fill = "#98F5FF"),
    plot.background = element_rect(fill = "#98F5FF"),
    legend.background = element_rect(fill = "#98F5FF")) +labs(fill = NULL)

ggplotly(df)

Mujeres

df_recordmujeres <- Record %>%
  select(Deportes, Mujeres) %>%
  slice_max(Mujeres, n = 5)%>%
  arrange(desc(Mujeres))

wordcloud2(data=df_recordmujeres, size=0.4)

Hombres

df_recordhombres <- Record %>%
  select(Deportes, Hombres) %>%
  slice_max(Hombres, n = 5)%>%
  arrange(desc(Hombres))



ph <- ggplot(df_recordhombres, aes(x = Deportes, y = Hombres), color = "Hombres") +
geom_bar(fill = "#FF83FA", stat = "identity") +
xlab("") +
ylab("") +
ggtitle("Los 5 deportes con más records conseguidos por hombres") +
coord_flip() + theme_minimal() + theme(panel.grid.major = element_line(colour = "#98F5FF"),
    panel.grid.minor = element_line(colour = "#98F5FF"),
    panel.background = element_rect(fill = "#98F5FF"),
    plot.background = element_rect(fill = "#98F5FF"),
    legend.background = element_rect(fill = "#98F5FF")) +labs(fill = NULL)

ggplotly(ph)

8. CAMPEONATOS UNIVERSITARIOS

Las universidades españolas por términos general estan implicadas bastante en los deportes, dandoles todo tipo de facilidades a los estudiantes para que practiquen cualquier deporte a precios reducidos. Sin duda la calidad de estos universitarios es ejemplar puesto que miles de estudiantes participan cada año en elos campeonatos de españa universitarios tras esfuerzo y sacrificio. En esta tabla os voy a mostrar que deporte es el que cuenta con mayores participantes.

df_campeonatos <- Campeonatos 

dftop1 <- df_campeonatos %>% slice_max(Value, n=1)

Imagen <- "https://upload.wikimedia.org/wikipedia/commons/c/cc/Provas_de_Atletismo_nas_Olimp%C3%ADadas_Rio_2016_%2828488087214%29.jpg"

dftop1 <- dftop1 %>% add_column(Imagen)

Tabla_dtop1 <- dftop1 %>% gt()

Tabla_dtop1 <- Tabla_dtop1 %>%
                   tab_header(title = md("**Deporte con mayor participación en los cto.**"))
                   
Tabla_dtop1 <- Tabla_dtop1 %>%
                tab_options(heading.background.color = "#0000FF") %>% tab_options(heading.title.font.size = 17,  column_labels.font.weight =  "bold")


Tabla_dtop1 <- Tabla_dtop1  %>%
  gt::text_transform(locations = cells_body(columns = c(Imagen)), fn = function(x) {gt::web_image(x, height = 30)}) %>%  cols_align(
   align = "center")

Tabla_dtop1
Deporte con mayor participación en los cto.
Deportes Value Imagen
Atletismo 397
LS0tCnRpdGxlOiAiSW1wYWN0byBkZWwgZGVwb3J0ZSBlbiBudWVzdHJvIHBhw61zIgphdXRob3I6ICJNZWxhbmllIE5ldWZjb3VyKG1lbmV1ZkBhbHVtbmkudXYuZXMpIgpkYXRlOiAiRGljaWVtYnJlIGRlIDIwMjEgKGFjdHVhbGl6YWRvIGVsIGByIGZvcm1hdChTeXMudGltZSgpLCAnJWQtJW0tJVknKWApIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgICNjc3M6ICIuL2Fzc2V0cy9teV9jc3NfZmlsZS5jc3MiCiAgICB0aGVtZTogcGFwZXIKICAgIGhpZ2hsaWdodDogdGV4dG1hdGUgCiAgICB0b2M6IHRydWUKICAgIHRvY19kZXB0aDogMyAKICAgIHRvY19mbG9hdDogCiAgICAgIGNvbGxhcHNlZDogdHJ1ZQogICAgICBzbW9vdGhfc2Nyb2xsOiB0cnVlCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQogICAgZGZfcHJpbnQ6IGthYmxlCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKZWRpdG9yX29wdGlvbnM6IAogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlCi0tLQogIApgYGB7Y3NzLCBlY2hvID0gRkFMU0V9Ci5jb2x1bW5zIHtkaXNwbGF5OmZsZXg7fQpoMS50aXRsZSB7Zm9udC1zaXplOiA0MCBweDtjb2xvcjogIzAwMDBDRH0KICAgIGgxIHtjb2xvcjojMTg3NENEOyBmb250LXNpemU6IDMwcHggO2ZvbnQtZmFtaWx5OiBBcmlhbCBCbGFja30KICAgICAgICBoMntjb2xvcjogIzE4NzRDRDsgZm9udC1zaXplOiAyMHB4OyBmb250LWZhbWlseTogQXJpYWx9CiAgICAgICAgICAgIAogICAgICAgICAgICBib2R5IHsgYmFja2dyb3VuZC1jb2xvcjogIzk4RjVGRn0KICAgICAgICAgICAgICAgIGEge2NvbG9yOiAjMDEwMTAxO30KICAgICAgICAgICAgICAgICAgICAubGlzdC1ncm91cC1pdGVtLmFjdGl2ZSwgLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmU6Zm9jdXMsIC5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlOmhvdmVyIHsKICAgICAgICAgICAgICAgICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogOwogICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2M0MzQyZDsKICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiBwYWxlcmVkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLm5hdi1waWxscyA+IGxpLmFjdGl2ZSA+IGEsIC5uYXYtcGlsbHMgPiBsaS5hY3RpdmUgPiBhOmhvdmVyLCAubmF2LXBpbGxzID4gbGkuYWN0aXZlID4gCmBgYAoKYGBge3IgY2h1bmstc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0KICAgICAgICAgICAgICAgICAga25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBldmFsID0gVFJVRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3Jlc3VsdHMgPSAiaG9sZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZSA9IEZBTFNFLCBjYWNoZS5wYXRoID0gIi9jYWNoZXMvIiwgY29tbWVudCA9ICIjPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZmlnLndpZHRoID0gNywgI2ZpZy5oZWlnaHQ9IDcsICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjb3V0LndpZHRoID0gNywgb3V0LmhlaWdodCA9IDcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZSA9IFRSVUUsICBmaWcuc2hvdyA9ICJob2xkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZy5hc3AgPSAwLjYyOCwgb3V0LndpZHRoID0gIjc1JSIsIGZpZy5hbGlnbiA9ICJjZW50ZXIiKQpgYGAKCmBgYHtyIG9wdGlvbnMtc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0KICAgICAgICAgICAgICAgICAgb3B0aW9ucyhzY2lwZW4gPSA5OTkpICMtIHBhcmEgcXVpdGFyIGxhIG5vdGFjacOzbiBjaWVudMOtZmljYQogICAgICAgICAgICAgICAgICBvcHRpb25zKCJ5YW1sLmV2YWwuZXhwciIgPSBUUlVFKQpgYGAKICAgICAgICAgICAgICAgICAgCmBgYHtyIGtsaXBweSwgZWNobyA9IEZBTFNFfQogICAgICAgICAgICAgICAgICBrbGlwcHk6OmtsaXBweShwb3NpdGlvbiA9IGMoInRvcCIsICJyaWdodCIpKSAjLSByZW1vdGVzOjppbnN0YWxsX2dpdGh1Yigicmxlc3VyL2tsaXBweSIpCmBgYAogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgIAo8aHIgY2xhc3M9ImxpbmVhLWJsYWNrIj4KICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgoKVHJhYmFqbyBlbGFib3JhZG8gcGFyYSBsYSBhc2lnbmF0dXJhICJQcm9ncmFtYWNpw7NuIHkgbWFuZWpvIGRlIGRhdG9zIGVuIGxhIGVyYSBkZWwgQmlnIERhdGEiIGRlIGxhIFVuaXZlcnNpdGF0IGRlIFZhbMOobmNpYSBkdXJhbnRlIGVsIGN1cnNvIDIwMjEtMjAyMi4gRWwgcmVwbyBkZWwgdHJhYmFqbyBlc3TDoSBbYXF1w61dKGh0dHBzOi8vZ2l0aHViLmNvbS9tZW5ldWYvdHJhYmFqb19CaWdEYXRhKXt0YXJnZXQ9Il9ibGFuayJ9LiAKICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgIApMYSBww6FnaW5hIHdlYiBkZSBsYSBhc2lnbmF0dXJhIHkgbG9zIHRyYWJham9zIGRlIG1pcyBjb21wYcOxZXJvcyBwdWVkZW4gdmVyc2UgW2FxdcOtXShodHRwczovL3BlcmV6cDQ0LmdpdGh1Yi5pby9pbnRyby1kcy0yMS0yMi13ZWIvMDctdHJhYmFqb3MuaHRtbCl7dGFyZ2V0PSJfYmxhbmsifS4KICAgICAgICAgICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIAoKCiAgICAgICAgICAgICAgICAgICAKIyAxLiBJTlRST0RVQ0NJw5NOCiAgICAgICAgICAgICAgICAgICAgCkVuIGVsIHByZXNlbnRlIHRyYWJham8gdm95IGEgbW9zdHJhciBhbGd1bm9zIGRhdG9zIGRlIGludGVyw6lzIHNvYnJlIGVsIGRlcG9ydGUuIEVsIGRlcG9ydGUgZXN0YSBtdXkgcHJlc2VudGUgZW4gbnVlc3RyYXMgdmlkYXMsIHRhbnRvIHBhcmEgbGEgZ2VudGUgcXVlIGxvIHByw6FjdGljYSBjb21vIHBhcmEgbGEgZ2VudGUgcXVlIGxvIGRpc2ZydXRhIHZpZW5kb2xvLiBNaSBvYmpldGl2byBlbiBlc3RlIHRyYWJham8gZXMgcXVlIHBvZGHDrXMgaW5mb3JtYXJvcyBlc3RhZMOtc3RpY2FtZW50ZSBjb21vIGRlIHByZXNlbnRlIGVzdGEgZWwgZGVwb3J0ZSBlbiBudWVzdHJvIHBhw61zLgogICAgICAgICAgICAgICAgICAKIVtdKC4vaW1hZ2VuZXMvRGVwb3J0ZXMucG5nKQogICAgICAgICAgICAgICAgICAKCiMgMi4gQ0FSR0FNT1MgREFUT1MgWSBQQVFVRVRFUwoKYGBge3IsIGV2YWwgPSBUUlVFfSAgICAgICAgIApsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZ2d0aGVtZXMpCmxpYnJhcnkoaHJicnRoZW1lcykKbGlicmFyeShnZ2FuaW1hdGUpCmxpYnJhcnkod29yZGNsb3VkMikKbGlicmFyeSh2aXJpZGlzKQpsaWJyYXJ5KCJwbG90bHkiKQpsaWJyYXJ5KGdlb21ldHJpZXMpCmxpYnJhcnkobGFiZWxpbmcpCmxpYnJhcnkobWFwZGF0YSkKbGlicmFyeShzY2FsZXMpCmxpYnJhcnkoZ3QpCmxpYnJhcnkodGliYmxlKQoKCkdhc3RvSG9nYXJlczwtIHJpbzo6aW1wb3J0KCIuL2RhdG9zL0dhc3RvSG9nYXJlcy5jc3YiKQpIYWJpdG9zRGVwb3J0aXZvcyA8LSByaW86OmltcG9ydCgiLi9kYXRvcy9IYWJpdG9zRGVwb3J0aXZvcy5jc3YiKQpOaXZlbEVzdHVkaW9zIDwtIHJpbzo6aW1wb3J0KCIuL2RhdG9zL05pdmVsRXN0dWRpb3MuY3N2IikKR2FzdG9QdWJsaWNvIDwtIHJpbzo6aW1wb3J0KCIuL2RhdG9zL0dhc3RvUHVibGljby5jc3YiKQpFbXByZXNhcyA8LSByaW86OmltcG9ydCgiLi9kYXRvcy9FbXByZXNhcy5jc3YiKQpSZWNvcmQgPC0gcmlvOjppbXBvcnQoIi4vZGF0b3MvUmVjb3JkLmNzdiIpCkNhbXBlb25hdG9zIDwtIHJpbzo6aW1wb3J0KCIuL2RhdG9zL2NhbXBlb25hdG9zLmNzdiIpCmBgYAoKCiMgMy4gSMOBQklUT1MgREVQT1JUSVZPUwoKVG9kb3Mgc2FiZW1vcyBxdWUgZWwgc2VkZW50YXJpc21vIGVzIHVubyBkZSBsb3MgcHJpbmNpcGFsZXMgZW5lbWlnb3MgZGUgbGEgc2FsdWQuIE51ZXN0cm8gY3VlcnBvIGhhIHNpZG8gZGlzZcOxYWRvIHBhcmEgZXN0YXIgZW4gbW92aW1pZW50bywgeSBsb3MgbcO6c2N1bG9zIHJlcXVpZXJlbiBkZSBhY3RpdmFjacOzbiBmw61zaWNhIHBhcmEgbWFudGVuZXJzZSBmdWVydGVzLiBEZSBoZWNobywgbXVjaGFzIGVuZmVybWVkYWRlcyBzZSBwdWVkZW4gcHJldmVuaXIgbGxldmFuZG8gdW5hIHJ1dGluYSBkZXBvcnRpdmEgYWRlY3VhZGEuIFBvciBlbGxvIHRlbmVyIGjDoWJpdG9zIGRlcG9ydGl2b3MgZXMgZXNlbmNpYWwuIAoKYGBge3J9CmRmX2hhYml0b3MgPC0gSGFiaXRvc0RlcG9ydGl2b3MgJT4lCiBmaWx0ZXIoIShUcmFtb19FZGFkICVpbiUgIjE1LS4uLiIpKQoKcDEgPC0gZ2dwbG90KGRmX2hhYml0b3MpICsKIGFlcyh4ID0gVHJhbW9fRWRhZCwgZmlsbCA9IFRyYW1vX0VkYWQsIHdlaWdodCA9IFBvcmNlbnRhamUpICsKIGdlb21fYmFyKCkgKwogc2NhbGVfY29sb3VyX3ZpcmlkaXNfYyhvcHRpb249Im1hZ21hIikgKwogdGhlbWVfbWluaW1hbCgpICsKIGZhY2V0X3dyYXAodmFycyhQZXJpb2RvKSkgKyB0aGVtZShwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMSksCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpICsgbGFicyh0aXRsZSA9ICJQb3JjZW50YWplIGRlIGxhIHBvYmxhY2nDs24gY29uIGhhYml0b3MgZGVwb3J0aXZvcyIsCiAgICB4ID0gIlRyYW1vIGRlIEVkYWQiLCB5ID0gIlBvcmNlbnRhamUgZGUgbGEgcG9ibGFjacOzbiIpICsgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiIzk4RjVGRiIpLAogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiIzk4RjVGRiIpLAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiM5OEY1RkYiKSwKICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiM5OEY1RkYiKSwKICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiIzk4RjVGRiIpKQoKZ2dwbG90bHkocDEpCgpgYGAKRW4gZXN0ZSBncsOhZmljbyBzZSBwdWVkZSBpbHVzdHJhciBjb21vIGxvcyBow6FiaXRvcyBkZXBvcnRpdm9zIGhhbiBhdW1lbnRhZG8gZGUgMjAxMCBhIDIwMjAsIGVuIHRvZG9zIGxvcyByYW5nb3MgZGUgZWRhZGVzLCBhbGdvIHNpbiBsdWdhciBhIGR1ZGFzIGJlbmVmaWNpb3NvLgoKCgojIDQuIEVNUFJFU0FTIFJFTEFDSU9OQURBUyBDT04gRUwgREVQT1JURSAKYGBge3J9CmRmX2VtcHJlc2FzIDwtIEVtcHJlc2FzICU+JSAKICBzZWxlY3QoQ0NBQSwgRW1wcmVzYXMpICU+JQogIGdyb3VwX2J5KENDQUEpIAoKYmIgPC0gZ2dwbG90KGRmX2VtcHJlc2FzLCBhZXMoeD0iIiwgeT0gRW1wcmVzYXMsIGZpbGwgPSBDQ0FBKSkrCiAgZ2VvbV9iYXIod2lkdGggPSAxLCBzdGF0ID0gImlkZW50aXR5IikgKwogIGxhYnModGl0bGUgPSAiQ2FudGlkYWQgZGUgZW1wcmVzYXMgdmluY3VsYWRhcyBhbCBkZXBvcnRlIGVuIGNhZGEgQ0NBQSIsCiAgICAgICB4ID0gIiAiLAogICAgICAgeSA9ICIgIiwgZmlsbD0gIiIpICsgIGd1aWRlcyhmaWxsPWd1aWRlX2xlZ2VuZChuY29sPTIpKSArIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gIiM5OEY1RkYiKSwKICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gIiM5OEY1RkYiKSwKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjOThGNUZGIiksCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjOThGNUZGIiksCiAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiM5OEY1RkYiKSkgK2xhYnMoZmlsbCA9IE5VTEwpIAoKY2MgPC0gYmIgKyBjb29yZF9wb2xhcigieSIsIHN0YXJ0PTApCmNjICsgdGhlbWVfbWluaW1hbCgpCgpgYGAKRW4gZXN0ZSBncsOhZmljbyBwb2RlbW9zIG9ic2VydmFyIGxhIGNhbnRpZGFkIGRlIGVtcHJlc2FzIHJlbGFjaW9uYWRhcyBjb24gZWwgZGVwb3J0ZSBxdWUgdGllbmUgY2FkYSBDb211bmlkYWQgQXV0w7Nub21hLCBkZXN0YWNhbiBzb2JyZXRvZG8gQW5kYWx1Y2lhLCBDYXRhbHXDsWEgeSBNYWRyaWQuCgoKIyA1LiBHQVNUTyBUT1RBTCBIT0dBUkVTCkVzdGUgYXBhcnRhZG8gbm9zIHNlcnZpcsOhIHBhcmEgdGVuZXIgdW5hIGlkZWEgbG8gaW1wbGljYWRhcyBxdWUgZXN0w6FuIGxhcyBmYW1pbGlhcyBlbiBlbCBkZXBvcnRlLgpgYGB7cn0KZGZfaG9nYXJlcyA8LSBHYXN0b0hvZ2FyZXMgJT4lCiAgc2VsZWN0KEHDsW9zLCBHYXN0by50b3RhbCkKCgpnZ3Bsb3QoIGRhdGE9IGRmX2hvZ2FyZXMsIGFlcyh4PUHDsW9zLCB5PSBHYXN0by50b3RhbCwgY29sb3VyID0gR2FzdG8udG90YWwpKSArCiAgZ2VvbV9saW5lKCkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2d0aXRsZSgiRXZvbHVjacOzbiBkZWwgZ2FzdG8gZGUgbG9zIGhvZ2FyZXMgZW4gZGVwb3J0ZXMiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgeWxhYigiIikgKyBzY2FsZV94X2NvbnRpbnVvdXMoICAKICAgIGJyZWFrcyA9IGMoMjAxMC4wLCAyMDE1LjAsIDIwMjAuMCksCiAgICAgbGFiZWwgPSBjKCIyMDEwIiwgIjIwMTUiLCAiMjAyMCIpKSArCiAgdHJhbnNpdGlvbl9yZXZlYWwoQcOxb3MpICsgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiIzk4RjVGRiIpLAogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiIzk4RjVGRiIpLAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiM5OEY1RkYiKSwKICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiM5OEY1RkYiKSwKICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiIzk4RjVGRiIpKSArbGFicyhmaWxsID0gTlVMTCkKICAKYGBgCgojIDYuIEdBU1RPIFDDmkJMSUNPIApFbCBnYXN0byBww7pibGljbyBkZWRpY2FkbyBhbCBkZXBvcnRlIGVzIGVzZW5jaWFsLCBhIG1heW9yIGdhc3RvIG1hcyBzZSBpbmNlbnRpdmFyw6EgYSBsYXMgcGVyc29uYXMgYSByZWFsaXphciBkZXBvcnRlLCBtw6FzIHkgZGUgbWF5b3IgY2FsaWRhZC4gCgpgYGB7cn0KR2FzdG9QdWJsaWNvICU+JQogdGFpbCgxMCkgJT4lCiAgZ2dwbG90KCBhZXMoeD1Bw7FvcywgeT1HYXN0by5Qw7pibGljby5BZG1Mb2NhbCkpICsKICAgIGdlb21fbGluZSggY29sb3I9ImdyZXkiKSArCiAgICBnZW9tX3BvaW50KHNoYXBlPTIxLCBjb2xvcj0iYmxhY2siLCBmaWxsPSIjNjliM2EyIiwgc2l6ZT0zKSArIHlsYWIoIkdhc3RvIikgKwogICAgdGhlbWVfaXBzdW0oKSAgKyAgeWxpbSgwLDMxMDApICsgc2NhbGVfeF9jb250aW51b3VzKCAgCiAgICBicmVha3MgPSBjKDIwMTAuMCwgMjAxNS4wLCAyMDEyLjUsIDIwMTcuNSksCiAgICAgbGFiZWwgPSBjKCIyMDEwIiwgIjIwMTUiLCAiMjAxMiIsICIyMDE3IikpICsKICAgIGdndGl0bGUoIkV2b2x1Y2nDs24gZ2FzdG8gcMO6YmxpY28iKSArIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gIiM5OEY1RkYiKSwKICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gIiM5OEY1RkYiKSwKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjOThGNUZGIiksCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjOThGNUZGIiksCiAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiM5OEY1RkYiKSkgK2xhYnMoZmlsbCA9IE5VTEwpCgpgYGAKCgoKCgojIDcuIFLDiUNPUkRTIEVOIEVTUEHDkUEgPC9GT05UPiB7LnRhYnNldH0gCkVzcGHDsWEgZXMgdW4gcGHDrXMgcXVlIHN1ZWxlIGRlc3RhY2FyIGVuIGxvcyBkZXBvcnRlcy4gVGVuZW1vcyBhIG1pbGVzIGRlIGRlcG9ydGlzdGFzIGVzcGVjdGFjdWxhcmVzIHF1ZSBhw7FvIGEgYcOxbyBub3MgdHJhZW4gbWVkZWxsYXMgYSBjYXNhLiBBcXXDrSBpbHVzdHJhcsOpIGxvcyBkZXBvcnRlcyBlbiBsb3MgcXVlIGhlbW9zIGNvbnNlZ3VpZG8gbcOhcyByZWNvcmRzLiAKCgojIyA8Rk9OVCBDT0xPUj0iIzAzMDMwMyI+VG90YWw8L0ZPTlQ+CmBgYHtyfQpkZl9yZWNvcmR0b3RhbCA8LSBSZWNvcmQgJT4lCiAgc2VsZWN0KERlcG9ydGVzLCBUb3RhbCkgJT4lCiAgc2xpY2VfbWF4KFRvdGFsLCBuID0gNSklPiUKICBhcnJhbmdlKGRlc2MoVG90YWwpKQoKCmRmIDwtIGdncGxvdChkZl9yZWNvcmR0b3RhbCwgYWVzKHg9RGVwb3J0ZXMsIHk9VG90YWwpKSArCiAgZ2VvbV9zZWdtZW50KCBhZXMoeD1EZXBvcnRlcywgeGVuZD1EZXBvcnRlcywgeT0wLCB5ZW5kPVRvdGFsKSkgKwogIGdlb21fcG9pbnQoIHNpemU9NSwgY29sb3I9InB1cnBsZSIsIGFscGhhPTAuNSwgc2hhcGU9NDAsIHN0cm9rZT0xKSArIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueD1lbGVtZW50X2JsYW5rKCkpICsgIGxhYnModGl0bGUgPSAiVG9wIDUgcsOpY29yZHMiLAogICAgICAgICAgICAgIHN1YnRpdGxlID0gImHDsW8gMjAyMCIsIAogICAgICAgICAgICAgIHggPSAiRGVwb3J0ZXMiLAogICAgICAgICAgICAgIHkgPSAiUmVjb3JkIikgICsgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiIzk4RjVGRiIpLAogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiIzk4RjVGRiIpLAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiM5OEY1RkYiKSwKICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiM5OEY1RkYiKSwKICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiIzk4RjVGRiIpKSArbGFicyhmaWxsID0gTlVMTCkKCmdncGxvdGx5KGRmKQoKYGBgCgojIyA8Rk9OVCBDT0xPUj0iIzAzMDMwMyI+TXVqZXJlczwvRk9OVD4KCmBgYHtyfQpkZl9yZWNvcmRtdWplcmVzIDwtIFJlY29yZCAlPiUKICBzZWxlY3QoRGVwb3J0ZXMsIE11amVyZXMpICU+JQogIHNsaWNlX21heChNdWplcmVzLCBuID0gNSklPiUKICBhcnJhbmdlKGRlc2MoTXVqZXJlcykpCgp3b3JkY2xvdWQyKGRhdGE9ZGZfcmVjb3JkbXVqZXJlcywgc2l6ZT0wLjQpCmBgYAoKIyMgPEZPTlQgQ09MT1I9IiMwMzAzMDMiPkhvbWJyZXM8L0ZPTlQ+CmBgYHtyfQpkZl9yZWNvcmRob21icmVzIDwtIFJlY29yZCAlPiUKICBzZWxlY3QoRGVwb3J0ZXMsIEhvbWJyZXMpICU+JQogIHNsaWNlX21heChIb21icmVzLCBuID0gNSklPiUKICBhcnJhbmdlKGRlc2MoSG9tYnJlcykpCgoKCnBoIDwtIGdncGxvdChkZl9yZWNvcmRob21icmVzLCBhZXMoeCA9IERlcG9ydGVzLCB5ID0gSG9tYnJlcyksIGNvbG9yID0gIkhvbWJyZXMiKSArCmdlb21fYmFyKGZpbGwgPSAiI0ZGODNGQSIsIHN0YXQgPSAiaWRlbnRpdHkiKSArCnhsYWIoIiIpICsKeWxhYigiIikgKwpnZ3RpdGxlKCJMb3MgNSBkZXBvcnRlcyBjb24gbcOhcyByZWNvcmRzIGNvbnNlZ3VpZG9zIHBvciBob21icmVzIikgKwpjb29yZF9mbGlwKCkgKyB0aGVtZV9taW5pbWFsKCkgKyB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICIjOThGNUZGIiksCiAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICIjOThGNUZGIiksCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiIzk4RjVGRiIpLAogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiIzk4RjVGRiIpLAogICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjOThGNUZGIikpICtsYWJzKGZpbGwgPSBOVUxMKQoKZ2dwbG90bHkocGgpCgpgYGAKCgojIDguIENBTVBFT05BVE9TIFVOSVZFUlNJVEFSSU9TCkxhcyB1bml2ZXJzaWRhZGVzIGVzcGHDsW9sYXMgcG9yIHTDqXJtaW5vcyBnZW5lcmFsIGVzdGFuIGltcGxpY2FkYXMgYmFzdGFudGUgZW4gbG9zIGRlcG9ydGVzLCBkYW5kb2xlcyB0b2RvIHRpcG8gZGUgZmFjaWxpZGFkZXMgYSBsb3MgZXN0dWRpYW50ZXMgcGFyYSBxdWUgcHJhY3RpcXVlbiBjdWFscXVpZXIgZGVwb3J0ZSBhIHByZWNpb3MgcmVkdWNpZG9zLiBTaW4gZHVkYSBsYSBjYWxpZGFkIGRlIGVzdG9zIHVuaXZlcnNpdGFyaW9zIGVzIGVqZW1wbGFyIHB1ZXN0byBxdWUgbWlsZXMgZGUgZXN0dWRpYW50ZXMgcGFydGljaXBhbiBjYWRhIGHDsW8gZW4gZWxvcyBjYW1wZW9uYXRvcyBkZSBlc3Bhw7FhIHVuaXZlcnNpdGFyaW9zIHRyYXMgZXNmdWVyem8geSBzYWNyaWZpY2lvLiBFbiBlc3RhIHRhYmxhIG9zIHZveSBhIG1vc3RyYXIgcXVlIGRlcG9ydGUgZXMgZWwgcXVlIGN1ZW50YSBjb24gbWF5b3JlcyBwYXJ0aWNpcGFudGVzLgpgYGB7ciwgZXZhbD1UUlVFfQpkZl9jYW1wZW9uYXRvcyA8LSBDYW1wZW9uYXRvcyAKCmRmdG9wMSA8LSBkZl9jYW1wZW9uYXRvcyAlPiUgc2xpY2VfbWF4KFZhbHVlLCBuPTEpCgpJbWFnZW4gPC0gImh0dHBzOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvYy9jYy9Qcm92YXNfZGVfQXRsZXRpc21vX25hc19PbGltcCVDMyVBRGFkYXNfUmlvXzIwMTZfJTI4Mjg0ODgwODcyMTQlMjkuanBnIgoKZGZ0b3AxIDwtIGRmdG9wMSAlPiUgYWRkX2NvbHVtbihJbWFnZW4pCgpUYWJsYV9kdG9wMSA8LSBkZnRvcDEgJT4lIGd0KCkKClRhYmxhX2R0b3AxIDwtIFRhYmxhX2R0b3AxICU+JQogICAgICAgICAgICAgICAgICAgdGFiX2hlYWRlcih0aXRsZSA9IG1kKCIqKkRlcG9ydGUgY29uIG1heW9yIHBhcnRpY2lwYWNpw7NuIGVuIGxvcyBjdG8uKioiKSkKICAgICAgICAgICAgICAgICAgIApUYWJsYV9kdG9wMSA8LSBUYWJsYV9kdG9wMSAlPiUKICAgICAgICAgICAgICAgIHRhYl9vcHRpb25zKGhlYWRpbmcuYmFja2dyb3VuZC5jb2xvciA9ICIjMDAwMEZGIikgJT4lIHRhYl9vcHRpb25zKGhlYWRpbmcudGl0bGUuZm9udC5zaXplID0gMTcsICBjb2x1bW5fbGFiZWxzLmZvbnQud2VpZ2h0ID0gICJib2xkIikKCgpUYWJsYV9kdG9wMSA8LSBUYWJsYV9kdG9wMSAgJT4lCiAgZ3Q6OnRleHRfdHJhbnNmb3JtKGxvY2F0aW9ucyA9IGNlbGxzX2JvZHkoY29sdW1ucyA9IGMoSW1hZ2VuKSksIGZuID0gZnVuY3Rpb24oeCkge2d0Ojp3ZWJfaW1hZ2UoeCwgaGVpZ2h0ID0gMzApfSkgJT4lICBjb2xzX2FsaWduKAogICBhbGlnbiA9ICJjZW50ZXIiKQoKVGFibGFfZHRvcDEKCiAgCgpgYGAKCgojIEJJQkxJT0dSQUZJQSAKCi0gW2VubGFjZSBhIGxhIHDDoWdpbmEgd2ViIGRlIGxhIGFzaWduYXR1cmFdKGh0dHBzOi8vcGVyZXpwNDQuZ2l0aHViLmlvL2ludHJvLWRzLTIxLTIyLXdlYi9pbmRleC5odG1sKQoKLSBbZW5sYWNlIGdhbGVyaWEgZGUgZ3LDoWZpY29zIGRlIGdncGxvdDJdKGh0dHBzOi8vd3d3LnItZ3JhcGgtZ2FsbGVyeS5jb20vKQoKLSBbZW5sYWNlIGEgbGEgcMOhZ2luYSB3ZWIgZGUgbG9zIGRhdG9zIGVjb27Ds21pY29zIGRlbCB0cmFiYWpvXShodHRwczovL3d3dy5jdWx0dXJheWRlcG9ydGUuZ29iLmVzL2RhbS9qY3I6YjI0YzY4YWQtNzVmZi00OGQwLWFhMWYtZDU3MDc1ZjIyZTY0L2FudWFyaW8tZGUtZXN0YWRpc3RpY2FzLWRlcG9ydGl2YXMtMjAyMS5wZGYpCgoKCg==