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
Deportes |
Value |
Imagen |
Atletismo |
397 |
|
LS0tCnRpdGxlOiAiSW1wYWN0byBkZWwgZGVwb3J0ZSBlbiBudWVzdHJvIHBhw61zIgphdXRob3I6ICJNZWxhbmllIE5ldWZjb3VyKG1lbmV1ZkBhbHVtbmkudXYuZXMpIgpkYXRlOiAiRGljaWVtYnJlIGRlIDIwMjEgKGFjdHVhbGl6YWRvIGVsIGByIGZvcm1hdChTeXMudGltZSgpLCAnJWQtJW0tJVknKWApIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgICNjc3M6ICIuL2Fzc2V0cy9teV9jc3NfZmlsZS5jc3MiCiAgICB0aGVtZTogcGFwZXIKICAgIGhpZ2hsaWdodDogdGV4dG1hdGUgCiAgICB0b2M6IHRydWUKICAgIHRvY19kZXB0aDogMyAKICAgIHRvY19mbG9hdDogCiAgICAgIGNvbGxhcHNlZDogdHJ1ZQogICAgICBzbW9vdGhfc2Nyb2xsOiB0cnVlCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQogICAgZGZfcHJpbnQ6IGthYmxlCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKZWRpdG9yX29wdGlvbnM6IAogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlCi0tLQogIApgYGB7Y3NzLCBlY2hvID0gRkFMU0V9Ci5jb2x1bW5zIHtkaXNwbGF5OmZsZXg7fQpoMS50aXRsZSB7Zm9udC1zaXplOiA0MCBweDtjb2xvcjogIzAwMDBDRH0KICAgIGgxIHtjb2xvcjojMTg3NENEOyBmb250LXNpemU6IDMwcHggO2ZvbnQtZmFtaWx5OiBBcmlhbCBCbGFja30KICAgICAgICBoMntjb2xvcjogIzE4NzRDRDsgZm9udC1zaXplOiAyMHB4OyBmb250LWZhbWlseTogQXJpYWx9CiAgICAgICAgICAgIAogICAgICAgICAgICBib2R5IHsgYmFja2dyb3VuZC1jb2xvcjogIzk4RjVGRn0KICAgICAgICAgICAgICAgIGEge2NvbG9yOiAjMDEwMTAxO30KICAgICAgICAgICAgICAgICAgICAubGlzdC1ncm91cC1pdGVtLmFjdGl2ZSwgLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmU6Zm9jdXMsIC5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlOmhvdmVyIHsKICAgICAgICAgICAgICAgICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogOwogICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2M0MzQyZDsKICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiBwYWxlcmVkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLm5hdi1waWxscyA+IGxpLmFjdGl2ZSA+IGEsIC5uYXYtcGlsbHMgPiBsaS5hY3RpdmUgPiBhOmhvdmVyLCAubmF2LXBpbGxzID4gbGkuYWN0aXZlID4gCmBgYAoKYGBge3IgY2h1bmstc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0KICAgICAgICAgICAgICAgICAga25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBldmFsID0gVFJVRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3Jlc3VsdHMgPSAiaG9sZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZSA9IEZBTFNFLCBjYWNoZS5wYXRoID0gIi9jYWNoZXMvIiwgY29tbWVudCA9ICIjPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZmlnLndpZHRoID0gNywgI2ZpZy5oZWlnaHQ9IDcsICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjb3V0LndpZHRoID0gNywgb3V0LmhlaWdodCA9IDcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZSA9IFRSVUUsICBmaWcuc2hvdyA9ICJob2xkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZy5hc3AgPSAwLjYyOCwgb3V0LndpZHRoID0gIjc1JSIsIGZpZy5hbGlnbiA9ICJjZW50ZXIiKQpgYGAKCmBgYHtyIG9wdGlvbnMtc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0KICAgICAgICAgICAgICAgICAgb3B0aW9ucyhzY2lwZW4gPSA5OTkpICMtIHBhcmEgcXVpdGFyIGxhIG5vdGFjacOzbiBjaWVudMOtZmljYQogICAgICAgICAgICAgICAgICBvcHRpb25zKCJ5YW1sLmV2YWwuZXhwciIgPSBUUlVFKQpgYGAKICAgICAgICAgICAgICAgICAgCmBgYHtyIGtsaXBweSwgZWNobyA9IEZBTFNFfQogICAgICAgICAgICAgICAgICBrbGlwcHk6OmtsaXBweShwb3NpdGlvbiA9IGMoInRvcCIsICJyaWdodCIpKSAjLSByZW1vdGVzOjppbnN0YWxsX2dpdGh1Yigicmxlc3VyL2tsaXBweSIpCmBgYAogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgIAo8aHIgY2xhc3M9ImxpbmVhLWJsYWNrIj4KICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgoKVHJhYmFqbyBlbGFib3JhZG8gcGFyYSBsYSBhc2lnbmF0dXJhICJQcm9ncmFtYWNpw7NuIHkgbWFuZWpvIGRlIGRhdG9zIGVuIGxhIGVyYSBkZWwgQmlnIERhdGEiIGRlIGxhIFVuaXZlcnNpdGF0IGRlIFZhbMOobmNpYSBkdXJhbnRlIGVsIGN1cnNvIDIwMjEtMjAyMi4gRWwgcmVwbyBkZWwgdHJhYmFqbyBlc3TDoSBbYXF1w61dKGh0dHBzOi8vZ2l0aHViLmNvbS9tZW5ldWYvdHJhYmFqb19CaWdEYXRhKXt0YXJnZXQ9Il9ibGFuayJ9LiAKICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgIApMYSBww6FnaW5hIHdlYiBkZSBsYSBhc2lnbmF0dXJhIHkgbG9zIHRyYWJham9zIGRlIG1pcyBjb21wYcOxZXJvcyBwdWVkZW4gdmVyc2UgW2FxdcOtXShodHRwczovL3BlcmV6cDQ0LmdpdGh1Yi5pby9pbnRyby1kcy0yMS0yMi13ZWIvMDctdHJhYmFqb3MuaHRtbCl7dGFyZ2V0PSJfYmxhbmsifS4KICAgICAgICAgICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIAoKCiAgICAgICAgICAgICAgICAgICAKIyAxLiBJTlRST0RVQ0NJw5NOCiAgICAgICAgICAgICAgICAgICAgCkVuIGVsIHByZXNlbnRlIHRyYWJham8gdm95IGEgbW9zdHJhciBhbGd1bm9zIGRhdG9zIGRlIGludGVyw6lzIHNvYnJlIGVsIGRlcG9ydGUuIEVsIGRlcG9ydGUgZXN0YSBtdXkgcHJlc2VudGUgZW4gbnVlc3RyYXMgdmlkYXMsIHRhbnRvIHBhcmEgbGEgZ2VudGUgcXVlIGxvIHByw6FjdGljYSBjb21vIHBhcmEgbGEgZ2VudGUgcXVlIGxvIGRpc2ZydXRhIHZpZW5kb2xvLiBNaSBvYmpldGl2byBlbiBlc3RlIHRyYWJham8gZXMgcXVlIHBvZGHDrXMgaW5mb3JtYXJvcyBlc3RhZMOtc3RpY2FtZW50ZSBjb21vIGRlIHByZXNlbnRlIGVzdGEgZWwgZGVwb3J0ZSBlbiBudWVzdHJvIHBhw61zLgogICAgICAgICAgICAgICAgICAKIVtdKC4vaW1hZ2VuZXMvRGVwb3J0ZXMucG5nKQogICAgICAgICAgICAgICAgICAKCiMgMi4gQ0FSR0FNT1MgREFUT1MgWSBQQVFVRVRFUwoKYGBge3IsIGV2YWwgPSBUUlVFfSAgICAgICAgIApsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZ2d0aGVtZXMpCmxpYnJhcnkoaHJicnRoZW1lcykKbGlicmFyeShnZ2FuaW1hdGUpCmxpYnJhcnkod29yZGNsb3VkMikKbGlicmFyeSh2aXJpZGlzKQpsaWJyYXJ5KCJwbG90bHkiKQpsaWJyYXJ5KGdlb21ldHJpZXMpCmxpYnJhcnkobGFiZWxpbmcpCmxpYnJhcnkobWFwZGF0YSkKbGlicmFyeShzY2FsZXMpCmxpYnJhcnkoZ3QpCmxpYnJhcnkodGliYmxlKQoKCkdhc3RvSG9nYXJlczwtIHJpbzo6aW1wb3J0KCIuL2RhdG9zL0dhc3RvSG9nYXJlcy5jc3YiKQpIYWJpdG9zRGVwb3J0aXZvcyA8LSByaW86OmltcG9ydCgiLi9kYXRvcy9IYWJpdG9zRGVwb3J0aXZvcy5jc3YiKQpOaXZlbEVzdHVkaW9zIDwtIHJpbzo6aW1wb3J0KCIuL2RhdG9zL05pdmVsRXN0dWRpb3MuY3N2IikKR2FzdG9QdWJsaWNvIDwtIHJpbzo6aW1wb3J0KCIuL2RhdG9zL0dhc3RvUHVibGljby5jc3YiKQpFbXByZXNhcyA8LSByaW86OmltcG9ydCgiLi9kYXRvcy9FbXByZXNhcy5jc3YiKQpSZWNvcmQgPC0gcmlvOjppbXBvcnQoIi4vZGF0b3MvUmVjb3JkLmNzdiIpCkNhbXBlb25hdG9zIDwtIHJpbzo6aW1wb3J0KCIuL2RhdG9zL2NhbXBlb25hdG9zLmNzdiIpCmBgYAoKCiMgMy4gSMOBQklUT1MgREVQT1JUSVZPUwoKVG9kb3Mgc2FiZW1vcyBxdWUgZWwgc2VkZW50YXJpc21vIGVzIHVubyBkZSBsb3MgcHJpbmNpcGFsZXMgZW5lbWlnb3MgZGUgbGEgc2FsdWQuIE51ZXN0cm8gY3VlcnBvIGhhIHNpZG8gZGlzZcOxYWRvIHBhcmEgZXN0YXIgZW4gbW92aW1pZW50bywgeSBsb3MgbcO6c2N1bG9zIHJlcXVpZXJlbiBkZSBhY3RpdmFjacOzbiBmw61zaWNhIHBhcmEgbWFudGVuZXJzZSBmdWVydGVzLiBEZSBoZWNobywgbXVjaGFzIGVuZmVybWVkYWRlcyBzZSBwdWVkZW4gcHJldmVuaXIgbGxldmFuZG8gdW5hIHJ1dGluYSBkZXBvcnRpdmEgYWRlY3VhZGEuIFBvciBlbGxvIHRlbmVyIGjDoWJpdG9zIGRlcG9ydGl2b3MgZXMgZXNlbmNpYWwuIAoKYGBge3J9CmRmX2hhYml0b3MgPC0gSGFiaXRvc0RlcG9ydGl2b3MgJT4lCiBmaWx0ZXIoIShUcmFtb19FZGFkICVpbiUgIjE1LS4uLiIpKQoKcDEgPC0gZ2dwbG90KGRmX2hhYml0b3MpICsKIGFlcyh4ID0gVHJhbW9fRWRhZCwgZmlsbCA9IFRyYW1vX0VkYWQsIHdlaWdodCA9IFBvcmNlbnRhamUpICsKIGdlb21fYmFyKCkgKwogc2NhbGVfY29sb3VyX3ZpcmlkaXNfYyhvcHRpb249Im1hZ21hIikgKwogdGhlbWVfbWluaW1hbCgpICsKIGZhY2V0X3dyYXAodmFycyhQZXJpb2RvKSkgKyB0aGVtZShwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMSksCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpICsgbGFicyh0aXRsZSA9ICJQb3JjZW50YWplIGRlIGxhIHBvYmxhY2nDs24gY29uIGhhYml0b3MgZGVwb3J0aXZvcyIsCiAgICB4ID0gIlRyYW1vIGRlIEVkYWQiLCB5ID0gIlBvcmNlbnRhamUgZGUgbGEgcG9ibGFjacOzbiIpICsgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiIzk4RjVGRiIpLAogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiIzk4RjVGRiIpLAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiM5OEY1RkYiKSwKICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiM5OEY1RkYiKSwKICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiIzk4RjVGRiIpKQoKZ2dwbG90bHkocDEpCgpgYGAKRW4gZXN0ZSBncsOhZmljbyBzZSBwdWVkZSBpbHVzdHJhciBjb21vIGxvcyBow6FiaXRvcyBkZXBvcnRpdm9zIGhhbiBhdW1lbnRhZG8gZGUgMjAxMCBhIDIwMjAsIGVuIHRvZG9zIGxvcyByYW5nb3MgZGUgZWRhZGVzLCBhbGdvIHNpbiBsdWdhciBhIGR1ZGFzIGJlbmVmaWNpb3NvLgoKCgojIDQuIEVNUFJFU0FTIFJFTEFDSU9OQURBUyBDT04gRUwgREVQT1JURSAKYGBge3J9CmRmX2VtcHJlc2FzIDwtIEVtcHJlc2FzICU+JSAKICBzZWxlY3QoQ0NBQSwgRW1wcmVzYXMpICU+JQogIGdyb3VwX2J5KENDQUEpIAoKYmIgPC0gZ2dwbG90KGRmX2VtcHJlc2FzLCBhZXMoeD0iIiwgeT0gRW1wcmVzYXMsIGZpbGwgPSBDQ0FBKSkrCiAgZ2VvbV9iYXIod2lkdGggPSAxLCBzdGF0ID0gImlkZW50aXR5IikgKwogIGxhYnModGl0bGUgPSAiQ2FudGlkYWQgZGUgZW1wcmVzYXMgdmluY3VsYWRhcyBhbCBkZXBvcnRlIGVuIGNhZGEgQ0NBQSIsCiAgICAgICB4ID0gIiAiLAogICAgICAgeSA9ICIgIiwgZmlsbD0gIiIpICsgIGd1aWRlcyhmaWxsPWd1aWRlX2xlZ2VuZChuY29sPTIpKSArIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gIiM5OEY1RkYiKSwKICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gIiM5OEY1RkYiKSwKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjOThGNUZGIiksCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjOThGNUZGIiksCiAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiM5OEY1RkYiKSkgK2xhYnMoZmlsbCA9IE5VTEwpIAoKY2MgPC0gYmIgKyBjb29yZF9wb2xhcigieSIsIHN0YXJ0PTApCmNjICsgdGhlbWVfbWluaW1hbCgpCgpgYGAKRW4gZXN0ZSBncsOhZmljbyBwb2RlbW9zIG9ic2VydmFyIGxhIGNhbnRpZGFkIGRlIGVtcHJlc2FzIHJlbGFjaW9uYWRhcyBjb24gZWwgZGVwb3J0ZSBxdWUgdGllbmUgY2FkYSBDb211bmlkYWQgQXV0w7Nub21hLCBkZXN0YWNhbiBzb2JyZXRvZG8gQW5kYWx1Y2lhLCBDYXRhbHXDsWEgeSBNYWRyaWQuCgoKIyA1LiBHQVNUTyBUT1RBTCBIT0dBUkVTCkVzdGUgYXBhcnRhZG8gbm9zIHNlcnZpcsOhIHBhcmEgdGVuZXIgdW5hIGlkZWEgbG8gaW1wbGljYWRhcyBxdWUgZXN0w6FuIGxhcyBmYW1pbGlhcyBlbiBlbCBkZXBvcnRlLgpgYGB7cn0KZGZfaG9nYXJlcyA8LSBHYXN0b0hvZ2FyZXMgJT4lCiAgc2VsZWN0KEHDsW9zLCBHYXN0by50b3RhbCkKCgpnZ3Bsb3QoIGRhdGE9IGRmX2hvZ2FyZXMsIGFlcyh4PUHDsW9zLCB5PSBHYXN0by50b3RhbCwgY29sb3VyID0gR2FzdG8udG90YWwpKSArCiAgZ2VvbV9saW5lKCkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2d0aXRsZSgiRXZvbHVjacOzbiBkZWwgZ2FzdG8gZGUgbG9zIGhvZ2FyZXMgZW4gZGVwb3J0ZXMiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgeWxhYigiIikgKyBzY2FsZV94X2NvbnRpbnVvdXMoICAKICAgIGJyZWFrcyA9IGMoMjAxMC4wLCAyMDE1LjAsIDIwMjAuMCksCiAgICAgbGFiZWwgPSBjKCIyMDEwIiwgIjIwMTUiLCAiMjAyMCIpKSArCiAgdHJhbnNpdGlvbl9yZXZlYWwoQcOxb3MpICsgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiIzk4RjVGRiIpLAogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiIzk4RjVGRiIpLAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiM5OEY1RkYiKSwKICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiM5OEY1RkYiKSwKICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiIzk4RjVGRiIpKSArbGFicyhmaWxsID0gTlVMTCkKICAKYGBgCgojIDYuIEdBU1RPIFDDmkJMSUNPIApFbCBnYXN0byBww7pibGljbyBkZWRpY2FkbyBhbCBkZXBvcnRlIGVzIGVzZW5jaWFsLCBhIG1heW9yIGdhc3RvIG1hcyBzZSBpbmNlbnRpdmFyw6EgYSBsYXMgcGVyc29uYXMgYSByZWFsaXphciBkZXBvcnRlLCBtw6FzIHkgZGUgbWF5b3IgY2FsaWRhZC4gCgpgYGB7cn0KR2FzdG9QdWJsaWNvICU+JQogdGFpbCgxMCkgJT4lCiAgZ2dwbG90KCBhZXMoeD1Bw7FvcywgeT1HYXN0by5Qw7pibGljby5BZG1Mb2NhbCkpICsKICAgIGdlb21fbGluZSggY29sb3I9ImdyZXkiKSArCiAgICBnZW9tX3BvaW50KHNoYXBlPTIxLCBjb2xvcj0iYmxhY2siLCBmaWxsPSIjNjliM2EyIiwgc2l6ZT0zKSArIHlsYWIoIkdhc3RvIikgKwogICAgdGhlbWVfaXBzdW0oKSAgKyAgeWxpbSgwLDMxMDApICsgc2NhbGVfeF9jb250aW51b3VzKCAgCiAgICBicmVha3MgPSBjKDIwMTAuMCwgMjAxNS4wLCAyMDEyLjUsIDIwMTcuNSksCiAgICAgbGFiZWwgPSBjKCIyMDEwIiwgIjIwMTUiLCAiMjAxMiIsICIyMDE3IikpICsKICAgIGdndGl0bGUoIkV2b2x1Y2nDs24gZ2FzdG8gcMO6YmxpY28iKSArIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gIiM5OEY1RkYiKSwKICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gIiM5OEY1RkYiKSwKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjOThGNUZGIiksCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjOThGNUZGIiksCiAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiM5OEY1RkYiKSkgK2xhYnMoZmlsbCA9IE5VTEwpCgpgYGAKCgoKCgojIDcuIFLDiUNPUkRTIEVOIEVTUEHDkUEgPC9GT05UPiB7LnRhYnNldH0gCkVzcGHDsWEgZXMgdW4gcGHDrXMgcXVlIHN1ZWxlIGRlc3RhY2FyIGVuIGxvcyBkZXBvcnRlcy4gVGVuZW1vcyBhIG1pbGVzIGRlIGRlcG9ydGlzdGFzIGVzcGVjdGFjdWxhcmVzIHF1ZSBhw7FvIGEgYcOxbyBub3MgdHJhZW4gbWVkZWxsYXMgYSBjYXNhLiBBcXXDrSBpbHVzdHJhcsOpIGxvcyBkZXBvcnRlcyBlbiBsb3MgcXVlIGhlbW9zIGNvbnNlZ3VpZG8gbcOhcyByZWNvcmRzLiAKCgojIyA8Rk9OVCBDT0xPUj0iIzAzMDMwMyI+VG90YWw8L0ZPTlQ+CmBgYHtyfQpkZl9yZWNvcmR0b3RhbCA8LSBSZWNvcmQgJT4lCiAgc2VsZWN0KERlcG9ydGVzLCBUb3RhbCkgJT4lCiAgc2xpY2VfbWF4KFRvdGFsLCBuID0gNSklPiUKICBhcnJhbmdlKGRlc2MoVG90YWwpKQoKCmRmIDwtIGdncGxvdChkZl9yZWNvcmR0b3RhbCwgYWVzKHg9RGVwb3J0ZXMsIHk9VG90YWwpKSArCiAgZ2VvbV9zZWdtZW50KCBhZXMoeD1EZXBvcnRlcywgeGVuZD1EZXBvcnRlcywgeT0wLCB5ZW5kPVRvdGFsKSkgKwogIGdlb21fcG9pbnQoIHNpemU9NSwgY29sb3I9InB1cnBsZSIsIGFscGhhPTAuNSwgc2hhcGU9NDAsIHN0cm9rZT0xKSArIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueD1lbGVtZW50X2JsYW5rKCkpICsgIGxhYnModGl0bGUgPSAiVG9wIDUgcsOpY29yZHMiLAogICAgICAgICAgICAgIHN1YnRpdGxlID0gImHDsW8gMjAyMCIsIAogICAgICAgICAgICAgIHggPSAiRGVwb3J0ZXMiLAogICAgICAgICAgICAgIHkgPSAiUmVjb3JkIikgICsgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiIzk4RjVGRiIpLAogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiIzk4RjVGRiIpLAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiM5OEY1RkYiKSwKICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiM5OEY1RkYiKSwKICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiIzk4RjVGRiIpKSArbGFicyhmaWxsID0gTlVMTCkKCmdncGxvdGx5KGRmKQoKYGBgCgojIyA8Rk9OVCBDT0xPUj0iIzAzMDMwMyI+TXVqZXJlczwvRk9OVD4KCmBgYHtyfQpkZl9yZWNvcmRtdWplcmVzIDwtIFJlY29yZCAlPiUKICBzZWxlY3QoRGVwb3J0ZXMsIE11amVyZXMpICU+JQogIHNsaWNlX21heChNdWplcmVzLCBuID0gNSklPiUKICBhcnJhbmdlKGRlc2MoTXVqZXJlcykpCgp3b3JkY2xvdWQyKGRhdGE9ZGZfcmVjb3JkbXVqZXJlcywgc2l6ZT0wLjQpCmBgYAoKIyMgPEZPTlQgQ09MT1I9IiMwMzAzMDMiPkhvbWJyZXM8L0ZPTlQ+CmBgYHtyfQpkZl9yZWNvcmRob21icmVzIDwtIFJlY29yZCAlPiUKICBzZWxlY3QoRGVwb3J0ZXMsIEhvbWJyZXMpICU+JQogIHNsaWNlX21heChIb21icmVzLCBuID0gNSklPiUKICBhcnJhbmdlKGRlc2MoSG9tYnJlcykpCgoKCnBoIDwtIGdncGxvdChkZl9yZWNvcmRob21icmVzLCBhZXMoeCA9IERlcG9ydGVzLCB5ID0gSG9tYnJlcyksIGNvbG9yID0gIkhvbWJyZXMiKSArCmdlb21fYmFyKGZpbGwgPSAiI0ZGODNGQSIsIHN0YXQgPSAiaWRlbnRpdHkiKSArCnhsYWIoIiIpICsKeWxhYigiIikgKwpnZ3RpdGxlKCJMb3MgNSBkZXBvcnRlcyBjb24gbcOhcyByZWNvcmRzIGNvbnNlZ3VpZG9zIHBvciBob21icmVzIikgKwpjb29yZF9mbGlwKCkgKyB0aGVtZV9taW5pbWFsKCkgKyB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICIjOThGNUZGIiksCiAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICIjOThGNUZGIiksCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiIzk4RjVGRiIpLAogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiIzk4RjVGRiIpLAogICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjOThGNUZGIikpICtsYWJzKGZpbGwgPSBOVUxMKQoKZ2dwbG90bHkocGgpCgpgYGAKCgojIDguIENBTVBFT05BVE9TIFVOSVZFUlNJVEFSSU9TCkxhcyB1bml2ZXJzaWRhZGVzIGVzcGHDsW9sYXMgcG9yIHTDqXJtaW5vcyBnZW5lcmFsIGVzdGFuIGltcGxpY2FkYXMgYmFzdGFudGUgZW4gbG9zIGRlcG9ydGVzLCBkYW5kb2xlcyB0b2RvIHRpcG8gZGUgZmFjaWxpZGFkZXMgYSBsb3MgZXN0dWRpYW50ZXMgcGFyYSBxdWUgcHJhY3RpcXVlbiBjdWFscXVpZXIgZGVwb3J0ZSBhIHByZWNpb3MgcmVkdWNpZG9zLiBTaW4gZHVkYSBsYSBjYWxpZGFkIGRlIGVzdG9zIHVuaXZlcnNpdGFyaW9zIGVzIGVqZW1wbGFyIHB1ZXN0byBxdWUgbWlsZXMgZGUgZXN0dWRpYW50ZXMgcGFydGljaXBhbiBjYWRhIGHDsW8gZW4gZWxvcyBjYW1wZW9uYXRvcyBkZSBlc3Bhw7FhIHVuaXZlcnNpdGFyaW9zIHRyYXMgZXNmdWVyem8geSBzYWNyaWZpY2lvLiBFbiBlc3RhIHRhYmxhIG9zIHZveSBhIG1vc3RyYXIgcXVlIGRlcG9ydGUgZXMgZWwgcXVlIGN1ZW50YSBjb24gbWF5b3JlcyBwYXJ0aWNpcGFudGVzLgpgYGB7ciwgZXZhbD1UUlVFfQpkZl9jYW1wZW9uYXRvcyA8LSBDYW1wZW9uYXRvcyAKCmRmdG9wMSA8LSBkZl9jYW1wZW9uYXRvcyAlPiUgc2xpY2VfbWF4KFZhbHVlLCBuPTEpCgpJbWFnZW4gPC0gImh0dHBzOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvYy9jYy9Qcm92YXNfZGVfQXRsZXRpc21vX25hc19PbGltcCVDMyVBRGFkYXNfUmlvXzIwMTZfJTI4Mjg0ODgwODcyMTQlMjkuanBnIgoKZGZ0b3AxIDwtIGRmdG9wMSAlPiUgYWRkX2NvbHVtbihJbWFnZW4pCgpUYWJsYV9kdG9wMSA8LSBkZnRvcDEgJT4lIGd0KCkKClRhYmxhX2R0b3AxIDwtIFRhYmxhX2R0b3AxICU+JQogICAgICAgICAgICAgICAgICAgdGFiX2hlYWRlcih0aXRsZSA9IG1kKCIqKkRlcG9ydGUgY29uIG1heW9yIHBhcnRpY2lwYWNpw7NuIGVuIGxvcyBjdG8uKioiKSkKICAgICAgICAgICAgICAgICAgIApUYWJsYV9kdG9wMSA8LSBUYWJsYV9kdG9wMSAlPiUKICAgICAgICAgICAgICAgIHRhYl9vcHRpb25zKGhlYWRpbmcuYmFja2dyb3VuZC5jb2xvciA9ICIjMDAwMEZGIikgJT4lIHRhYl9vcHRpb25zKGhlYWRpbmcudGl0bGUuZm9udC5zaXplID0gMTcsICBjb2x1bW5fbGFiZWxzLmZvbnQud2VpZ2h0ID0gICJib2xkIikKCgpUYWJsYV9kdG9wMSA8LSBUYWJsYV9kdG9wMSAgJT4lCiAgZ3Q6OnRleHRfdHJhbnNmb3JtKGxvY2F0aW9ucyA9IGNlbGxzX2JvZHkoY29sdW1ucyA9IGMoSW1hZ2VuKSksIGZuID0gZnVuY3Rpb24oeCkge2d0Ojp3ZWJfaW1hZ2UoeCwgaGVpZ2h0ID0gMzApfSkgJT4lICBjb2xzX2FsaWduKAogICBhbGlnbiA9ICJjZW50ZXIiKQoKVGFibGFfZHRvcDEKCiAgCgpgYGAKCgojIEJJQkxJT0dSQUZJQSAKCi0gW2VubGFjZSBhIGxhIHDDoWdpbmEgd2ViIGRlIGxhIGFzaWduYXR1cmFdKGh0dHBzOi8vcGVyZXpwNDQuZ2l0aHViLmlvL2ludHJvLWRzLTIxLTIyLXdlYi9pbmRleC5odG1sKQoKLSBbZW5sYWNlIGdhbGVyaWEgZGUgZ3LDoWZpY29zIGRlIGdncGxvdDJdKGh0dHBzOi8vd3d3LnItZ3JhcGgtZ2FsbGVyeS5jb20vKQoKLSBbZW5sYWNlIGEgbGEgcMOhZ2luYSB3ZWIgZGUgbG9zIGRhdG9zIGVjb27Ds21pY29zIGRlbCB0cmFiYWpvXShodHRwczovL3d3dy5jdWx0dXJheWRlcG9ydGUuZ29iLmVzL2RhbS9qY3I6YjI0YzY4YWQtNzVmZi00OGQwLWFhMWYtZDU3MDc1ZjIyZTY0L2FudWFyaW8tZGUtZXN0YWRpc3RpY2FzLWRlcG9ydGl2YXMtMjAyMS5wZGYpCgoKCg==