CALCULAR TASA DE NATALIDAD (por 1,000 habitantes)
Es importante recordar que se trabajará con una base de datos
externa, por lo tanto será llamada al script y se accederá a ella por
medio del nombre “df”.
# -> CALCULAR TASA DE NATALIDAD
# Obtención de df
df <- read.csv('/Volumes/JESUS SSD/TRABAJOS EPIGENETICA/estadisticas_vitales_mexico_2018_2021.csv')
# Datos
nacimientos <- df$nacimientos_registrados # Número de nacimientos en un año
total_poblacion <- df$poblacion_total # Población total en ese año
# Cálculo de la tasa de natalidad
tasa_natalidad <- (nacimientos / total_poblacion) * 1000
# Resultado
cat("Tasa de natalidad:",
# decidí sacar el promedio porque de la forma básica me arroja 3 vectores.
mean(tasa_natalidad, na.rm = TRUE),
"nacimientos por cada 1,000 habitantes durante el periodo 2018-2021\n")
Tasa de natalidad: 15.49277 nacimientos por cada 1,000 habitantes durante el periodo 2018-2021
df$tasa_natalidad <- (df$nacimientos_registrados / df$poblacion_total) * 1000
df[, c("año", "tasa_natalidad")]
NA
SE HARÁ USO DE LA LIBRERIA ggplot2 PARA VISUALIZAR LOS DATOS.
# Visualización
library(ggplot2)
# calcular tasas de natalidad
df$tasa_natalidad <- (df$nacimientos_registrados / df$poblacion_total) * 1000
# Gráfico
ggplot(df, aes(x = año, y = tasa_natalidad, fill = año)) +
geom_bar(stat = "identity") +
geom_text(aes(label = round(tasa_natalidad, 2)), vjust = -0.3, size = 4
) +
labs(title = "Tasa de natalidad por año", x = "Año", y = "Tasa de natalidad (por 1,000 habitantes)"
) +
theme_classic()

CALCULAR TASA DE MORTALIDAD (por 1,000 habitantes)
# Calculo de la tasa de mortalidad
tasa_mortalidad <- (df$defunciones_registradas/df$poblacion_total) * 1000
df$tasa_mortalidad <- (df$defunciones_registradas / df$poblacion_total) * 1000
df[, c("año", "tasa_mortalidad")]
# Resultado
cat("Tasa de mortalidad:",
# decidí sacar el promedio porque de la forma básica me arroja 3 vectores.
mean(tasa_mortalidad, na.rm = TRUE),
"muertes por cada 1,000 habitantes durante el periodo 2018-2021\n")
Tasa de mortalidad: 7.303069 muertes por cada 1,000 habitantes durante el periodo 2018-2021
SE HARÁ USO DE LA LIBRERIA ggplot2 PARA VISUALIZAR LOS DATOS.

CALCULAR INCREMENTO NATURAL (por 1,000 habitantes)
La formula para calcular el incremento natural es:
Tasa de natalidad - Tasa de mortalidad = Incremento
natural
incremento_natural <- (tasa_natalidad - tasa_mortalidad)
df$incremento_natural <- df$tasa_natalidad - df$tasa_mortalidad
df[, c("año", "incremento_natural")]
# Resultado
cat("Incremento natural",
# decidí sacar el promedio porque de la forma básica me arroja 3 vectores.
mean(incremento_natural, na.rm = TRUE),
"por cada 1,000 habitantes durante el periodo 2018-2021\n")
Incremento natural 8.189702 por cada 1,000 habitantes durante el periodo 2018-2021
str(df)
'data.frame': 4 obs. of 9 variables:
$ año : int 2018 2019 2020 2021
$ poblacion_total : int 124738000 125930000 126014024 126705138
$ nacimientos_registrados : int 2162535 2092214 1629211 1912178
$ defunciones_registradas : int 722611 747784 1086743 1122249
$ incremento_natural : num 11.54 10.68 4.3 6.23
$ casos_covid_confirmados : int 0 0 1437185 NA
$ defunciones_covid_confirmadas: int 0 0 126507 NA
$ tasa_natalidad : num 17.3 16.6 12.9 15.1
$ tasa_mortalidad : num 5.79 5.94 8.62 8.86
SE HARÁ USO DE LA LIBRERIA ggplot2 PARA VISUALIZAR LOS DATOS.
library(ggplot2)
ggplot(df, aes(x = año, y = incremento_natural)) +
geom_line(linewidth = 1) +
geom_point(size = 3) +
geom_text(
aes(label = round(incremento_natural, 2)),
vjust = -1.5,
size = 4
) +
scale_y_continuous(expand = expansion(mult = c(0.05, 0.2))) +
labs(
title = "Dinámica del incremento natural de la población",
x = "Año",
y = "Incremento natural (por cada 1,000 habitantes)"
) +
theme_minimal()

CALCULAR TASA DE LETALIDAD POR COVID-19 (%) DONDE EXISTAN CASOS
# Resultado
cat("Letalidad por Covid-19 fue de",
# decidí sacar el promedio porque de la forma básica me arroja 3 vectores.
mean(porc_letalidad, na.rm = TRUE),
"% durante 2020.\n ")
Letalidad por Covid-19 fue de 8.802416 % durante 2020.
df$letalidad_covid <- (df$defunciones_covid_confirmadas / df$casos_covid_confirmados) * 100
df[, c("año", "letalidad_covid")]
df_letalidad <- df[df$casos_covid_confirmados > 0, c("año", "letalidad_covid")]
df_letalidad
NA
La letalidad solo se calculó para el año en el que se registraron
casos confirmados, ya que en los otros años no hubo casos, por lo que la
letalidad no es estadísticamente calculable.
SE HARÁ USO DE LA LIBRERIA ggplot2 PARA VISUALIZAR LOS DATOS.
letalidad_valida <- letalidad[!is.na(letalidad) & !is.nan(letalidad)]
valores <- c(
Letalidad = letalidad_valida,
"No letalidad" = 1 - letalidad_valida
)
pie(
valores,
labels = paste0(names(valores), ": ", round(valores * 100, 2), "%"),
main = "Letalidad por Covid-19 en el año 2020",
col = c("firebrick", "blue")
)

USO DE FLEXTABLE
Petición:
Construye una con flextable que incluya: anio, poblacion_total,
nacimientos_registrados, defunciones_registradas, incremento_natural y
las tasas calculadas.
# Crear el conjunto de datos
library(flextable)
datos <- data.frame(
año = c(2018, 2019, 2020, 2021),
poblacion_total = c(124738000, 125930000, 126014024, 126705138),
nacimientos_registrados = c(2162535, 2092214, 1629211, 1912178),
defunciones_registradas = c(722611, 747784, 1086743, 1122249),
casos_covid_confirmados = c(0, 0, 1437185, 0),
defunciones_covid_confirmadas = c(0, 0, 126507, 0)
)
datos$tasa_natalidad <- (datos$nacimientos_registrados /
datos$poblacion_total) * 1000
datos$tasa_mortalidad <- (datos$defunciones_registradas /
datos$poblacion_total) * 1000
datos$incremento_natural <- datos$tasa_natalidad - datos$tasa_mortalidad
datos$tasa_letalidad <- (datos$defunciones_covid_confirmadas / datos$casos_covid_confirmados) * 100
# Redondear solo columnas númericas
datos_redondeados <- datos %>%
mutate_if(is.numeric, round, 2)
# Crear la tabla con flextable
flextable(datos_redondeados) %>%
autofit()
año | poblacion_total | nacimientos_registrados | defunciones_registradas | casos_covid_confirmados | defunciones_covid_confirmadas | tasa_natalidad | tasa_mortalidad | incremento_natural | tasa_letalidad |
|---|
2,018 | 124,738,000 | 2,162,535 | 722,611 | 0 | 0 | 17.34 | 5.79 | 11.54 |
|
2,019 | 125,930,000 | 2,092,214 | 747,784 | 0 | 0 | 16.61 | 5.94 | 10.68 |
|
2,020 | 126,014,024 | 1,629,211 | 1,086,743 | 1,437,185 | 126,507 | 12.93 | 8.62 | 4.30 | 8.8 |
2,021 | 126,705,138 | 1,912,178 | 1,122,249 | 0 | 0 | 15.09 | 8.86 | 6.23 |
|
Preguntas:
¿En qué año se observa la mayor tasa de mortalidad y cómo se
relaciona con la pandemia?
- Se observa un incremento en la mortalidad, se puede entender que la
pandemia incrementó los numeros de muertes en la población.
¿Cómo cambia la tasa de natalidad entre 2018 y 2021?
- Se presentó una reducción de la tasa de natalidad. El año con la
tasa más baja fue en 2020.
¿Qué ocurre con el incremento natural durante ese periodo?
- Cae a pique en 2020 e intenta subir un poco si nivel en 2021, siendo
2018 el año con los números más altos.
¿Qué significa la tasa de letalidad por COVID-19 que obtuviste
para 2020?
- Representa el porcentaje de personas que fallecen entre quienes
padecieron de Covid-19.
LS0tCnRpdGxlOiAiQW7DoWxpc2lzIGRlIEVzdGFkw61zdGljYXMgVml0YWxlcyBlbiBNw6l4aWNvICgyMDE44oCTMjAyMSkgLSBUQVJFQSIKYXV0aG9yOiAiTENCTS4gSmVzw7pzIEFuZ2VsIEhlcm7DoW5kZXogQ2jDoXZleiIKZGF0ZTogIjEyIGRlIGRpY2llbWJyZSAyMDI1IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgojIyBDQUxDVUxBUiBUQVNBIERFIE5BVEFMSURBRCAocG9yIDEsMDAwIGhhYml0YW50ZXMpCgo+ICpFcyBpbXBvcnRhbnRlIHJlY29yZGFyIHF1ZSBzZSB0cmFiYWphcsOhIGNvbiB1bmEgYmFzZSBkZSBkYXRvcyBleHRlcm5hLCBwb3IgbG8gdGFudG8gc2Vyw6EgbGxhbWFkYSBhbCBzY3JpcHQgeSBzZSBhY2NlZGVyw6EgYSBlbGxhIHBvciBtZWRpbyBkZWwgbm9tYnJlICJkZiIuKgoKYGBge3J9CiMgLT4gQ0FMQ1VMQVIgVEFTQSBERSBOQVRBTElEQUQKCiMgT2J0ZW5jacOzbiBkZSBkZgoKZGYgPC0gcmVhZC5jc3YoJy9Wb2x1bWVzL0pFU1VTIFNTRC9UUkFCQUpPUyBFUElHRU5FVElDQS9lc3RhZGlzdGljYXNfdml0YWxlc19tZXhpY29fMjAxOF8yMDIxLmNzdicpCgojIERhdG9zCm5hY2ltaWVudG9zIDwtIGRmJG5hY2ltaWVudG9zX3JlZ2lzdHJhZG9zICMgTsO6bWVybyBkZSBuYWNpbWllbnRvcyBlbiB1biBhw7FvIAp0b3RhbF9wb2JsYWNpb24gPC0gZGYkcG9ibGFjaW9uX3RvdGFsICMgUG9ibGFjacOzbiB0b3RhbCBlbiBlc2UgYcOxbyAKCgojIEPDoWxjdWxvIGRlIGxhIHRhc2EgZGUgbmF0YWxpZGFkIAp0YXNhX25hdGFsaWRhZCA8LSAobmFjaW1pZW50b3MgLyB0b3RhbF9wb2JsYWNpb24pICogMTAwMAoKIyBSZXN1bHRhZG8KY2F0KCJUYXNhIGRlIG5hdGFsaWRhZDoiLCAKICAgICMgZGVjaWTDrSBzYWNhciBlbCBwcm9tZWRpbyBwb3JxdWUgZGUgbGEgZm9ybWEgYsOhc2ljYSBtZSBhcnJvamEgMyB2ZWN0b3Jlcy4KICAgIG1lYW4odGFzYV9uYXRhbGlkYWQsIG5hLnJtID0gVFJVRSksIAogICAgIm5hY2ltaWVudG9zIHBvciBjYWRhIDEsMDAwIGhhYml0YW50ZXMgZHVyYW50ZSBlbCBwZXJpb2RvIDIwMTgtMjAyMVxuIikKCmRmJHRhc2FfbmF0YWxpZGFkIDwtIChkZiRuYWNpbWllbnRvc19yZWdpc3RyYWRvcyAvIGRmJHBvYmxhY2lvbl90b3RhbCkgKiAxMDAwCgpkZlssIGMoImHDsW8iLCAidGFzYV9uYXRhbGlkYWQiKV0KCmBgYAoKIyMjIFNFIEhBUsOBIFVTTyBERSBMQSBMSUJSRVJJQSBnZ3Bsb3QyIFBBUkEgVklTVUFMSVpBUiBMT1MgREFUT1MuCgpgYGB7cn0KIyBWaXN1YWxpemFjacOzbiAKbGlicmFyeShnZ3Bsb3QyKQoKCiMgY2FsY3VsYXIgdGFzYXMgZGUgbmF0YWxpZGFkIApkZiR0YXNhX25hdGFsaWRhZCA8LSAoZGYkbmFjaW1pZW50b3NfcmVnaXN0cmFkb3MgLyBkZiRwb2JsYWNpb25fdG90YWwpICogMTAwMAoKIyBHcsOhZmljbwpnZ3Bsb3QoZGYsIGFlcyh4ID0gYcOxbywgeSA9IHRhc2FfbmF0YWxpZGFkLCBmaWxsID0gYcOxbykpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZCh0YXNhX25hdGFsaWRhZCwgMikpLCB2anVzdCA9IC0wLjMsIHNpemUgPSA0CiAgKSArCiAgbGFicyh0aXRsZSA9ICJUYXNhIGRlIG5hdGFsaWRhZCBwb3IgYcOxbyIsIHggPSAiQcOxbyIsIHkgPSAiVGFzYSBkZSBuYXRhbGlkYWQgKHBvciAxLDAwMCBoYWJpdGFudGVzKSIKICApICsKICB0aGVtZV9jbGFzc2ljKCkKYGBgCgojIyBDQUxDVUxBUiBUQVNBIERFIE1PUlRBTElEQUQgKHBvciAxLDAwMCBoYWJpdGFudGVzKQoKYGBge3J9CiMgQ2FsY3VsbyBkZSBsYSB0YXNhIGRlIG1vcnRhbGlkYWQgCgp0YXNhX21vcnRhbGlkYWQgPC0gKGRmJGRlZnVuY2lvbmVzX3JlZ2lzdHJhZGFzL2RmJHBvYmxhY2lvbl90b3RhbCkgKiAxMDAwCgpkZiR0YXNhX21vcnRhbGlkYWQgPC0gKGRmJGRlZnVuY2lvbmVzX3JlZ2lzdHJhZGFzIC8gZGYkcG9ibGFjaW9uX3RvdGFsKSAqIDEwMDAKCmRmWywgYygiYcOxbyIsICJ0YXNhX21vcnRhbGlkYWQiKV0KCgojIFJlc3VsdGFkbwpjYXQoIlRhc2EgZGUgbW9ydGFsaWRhZDoiLCAKICAgICMgZGVjaWTDrSBzYWNhciBlbCBwcm9tZWRpbyBwb3JxdWUgZGUgbGEgZm9ybWEgYsOhc2ljYSBtZSBhcnJvamEgMyB2ZWN0b3Jlcy4KICAgIG1lYW4odGFzYV9tb3J0YWxpZGFkLCBuYS5ybSA9IFRSVUUpLCAKICAgICJtdWVydGVzIHBvciBjYWRhIDEsMDAwIGhhYml0YW50ZXMgZHVyYW50ZSBlbCBwZXJpb2RvIDIwMTgtMjAyMVxuIikKCgpgYGAKCiMjIyBTRSBIQVLDgSBVU08gREUgTEEgTElCUkVSSUEgZ2dwbG90MiBQQVJBIFZJU1VBTElaQVIgTE9TIERBVE9TLgoKYGBge3J9CiMgVmlzdWFsaXphY2nDs24gCmxpYnJhcnkoZ2dwbG90MikKCgojIGNhbGN1bGFyIHRhc2FzIGRlIG5hdGFsaWRhZCAKZGYkdGFzYV9tb3J0YWxpZGFkIDwtIChkZiRkZWZ1bmNpb25lc19yZWdpc3RyYWRhcyAvIGRmJHBvYmxhY2lvbl90b3RhbCkgKiAxMDAwCgoKCiMgR3LDoWZpY28KZ2dwbG90KGRmLCBhZXMoeCA9IGHDsW8sIHkgPSB0YXNhX21vcnRhbGlkYWQsIGZpbGwgPSBhw7FvKSkgKwogICMgZ2VvbV9jb2woZmlsbCA9ICJzdGVlbGJsdWUiKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQodGFzYV9tb3J0YWxpZGFkLCAyKSksIHZqdXN0ID0gLTAuMywgc2l6ZSA9IDQpICsKICBsYWJzKHRpdGxlID0gIlRhc2EgZGUgbW9ydGFsaWRhZCBwb3IgYcOxbyIsIHggPSAiQcOxbyIsIHkgPSAiVGFzYSBkZSBtb3J0YWxpZGFkIChwb3IgMSwwMDAgaGFiaXRhbnRlcykiKSArCiAgdGhlbWVfY2xhc3NpYygpCmBgYAoKIyMgQ0FMQ1VMQVIgSU5DUkVNRU5UTyBOQVRVUkFMIChwb3IgMSwwMDAgaGFiaXRhbnRlcykKCj4gTGEgZm9ybXVsYSBwYXJhIGNhbGN1bGFyIGVsIGluY3JlbWVudG8gbmF0dXJhbCBlczoKPgo+ICpUYXNhIGRlIG5hdGFsaWRhZCAtIFRhc2EgZGUgbW9ydGFsaWRhZCA9IEluY3JlbWVudG8gbmF0dXJhbCoKCmBgYHtyfQppbmNyZW1lbnRvX25hdHVyYWwgPC0gKHRhc2FfbmF0YWxpZGFkIC0gdGFzYV9tb3J0YWxpZGFkKQoKZGYkaW5jcmVtZW50b19uYXR1cmFsIDwtIGRmJHRhc2FfbmF0YWxpZGFkIC0gZGYkdGFzYV9tb3J0YWxpZGFkCgpkZlssIGMoImHDsW8iLCAiaW5jcmVtZW50b19uYXR1cmFsIildCgojIFJlc3VsdGFkbwpjYXQoIkluY3JlbWVudG8gbmF0dXJhbCIsIAogICAgIyBkZWNpZMOtIHNhY2FyIGVsIHByb21lZGlvIHBvcnF1ZSBkZSBsYSBmb3JtYSBiw6FzaWNhIG1lIGFycm9qYSAzIHZlY3RvcmVzLgogICAgbWVhbihpbmNyZW1lbnRvX25hdHVyYWwsIG5hLnJtID0gVFJVRSksIAogICAgInBvciBjYWRhIDEsMDAwIGhhYml0YW50ZXMgZHVyYW50ZSBlbCBwZXJpb2RvIDIwMTgtMjAyMVxuIikKYGBgCgpgYGB7cn0Kc3RyKGRmKQpgYGAKCgojIyMgU0UgSEFSw4EgVVNPIERFIExBIExJQlJFUklBIGdncGxvdDIgUEFSQSBWSVNVQUxJWkFSIExPUyBEQVRPUy4KCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCgpnZ3Bsb3QoZGYsIGFlcyh4ID0gYcOxbywgeSA9IGluY3JlbWVudG9fbmF0dXJhbCkpICsKICBnZW9tX2xpbmUobGluZXdpZHRoID0gMSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICBnZW9tX3RleHQoCiAgICBhZXMobGFiZWwgPSByb3VuZChpbmNyZW1lbnRvX25hdHVyYWwsIDIpKSwKICAgIHZqdXN0ID0gLTEuNSwKICAgIHNpemUgPSA0CiAgKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLjA1LCAwLjIpKSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJEaW7DoW1pY2EgZGVsIGluY3JlbWVudG8gbmF0dXJhbCBkZSBsYSBwb2JsYWNpw7NuIiwKICAgIHggPSAiQcOxbyIsCiAgICB5ID0gIkluY3JlbWVudG8gbmF0dXJhbCAocG9yIGNhZGEgMSwwMDAgaGFiaXRhbnRlcykiCiAgKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKIyMgQ0FMQ1VMQVIgVEFTQSBERSBMRVRBTElEQUQgUE9SIENPVklELTE5ICglKSBET05ERSBFWElTVEFOIENBU09TCgpgYGB7cn0KIyBSZXN1bHRhZG8KY2F0KCJMZXRhbGlkYWQgcG9yIENvdmlkLTE5IGZ1ZSBkZSIsIAogICAgIyBkZWNpZMOtIHNhY2FyIGVsIHByb21lZGlvIHBvcnF1ZSBkZSBsYSBmb3JtYSBiw6FzaWNhIG1lIGFycm9qYSAzIHZlY3RvcmVzLgogICAgbWVhbihwb3JjX2xldGFsaWRhZCwgbmEucm0gPSBUUlVFKSwgCiAgICAiJSBkdXJhbnRlIDIwMjAuXG4gIikKCmRmJGxldGFsaWRhZF9jb3ZpZCA8LSAoZGYkZGVmdW5jaW9uZXNfY292aWRfY29uZmlybWFkYXMgLyBkZiRjYXNvc19jb3ZpZF9jb25maXJtYWRvcykgKiAxMDAKCmRmWywgYygiYcOxbyIsICJsZXRhbGlkYWRfY292aWQiKV0KCmRmX2xldGFsaWRhZCA8LSBkZltkZiRjYXNvc19jb3ZpZF9jb25maXJtYWRvcyA+IDAsIGMoImHDsW8iLCAibGV0YWxpZGFkX2NvdmlkIildCgpkZl9sZXRhbGlkYWQKCmBgYAoKPiAqTGEgbGV0YWxpZGFkIHNvbG8gc2UgY2FsY3Vsw7MgcGFyYSBlbCBhw7FvIGVuIGVsIHF1ZSBzZSByZWdpc3RyYXJvbiBjYXNvcyBjb25maXJtYWRvcywgeWEgcXVlIGVuIGxvcyBvdHJvcyBhw7FvcyBubyBodWJvIGNhc29zLCBwb3IgbG8gcXVlIGxhIGxldGFsaWRhZCBubyBlcyBlc3RhZMOtc3RpY2FtZW50ZSBjYWxjdWxhYmxlLioKCiMjIyBTRSBIQVLDgSBVU08gREUgTEEgTElCUkVSSUEgZ2dwbG90MiBQQVJBIFZJU1VBTElaQVIgTE9TIERBVE9TLgoKYGBge3J9CmxldGFsaWRhZF92YWxpZGEgPC0gbGV0YWxpZGFkWyFpcy5uYShsZXRhbGlkYWQpICYgIWlzLm5hbihsZXRhbGlkYWQpXQp2YWxvcmVzIDwtIGMoCiAgTGV0YWxpZGFkID0gbGV0YWxpZGFkX3ZhbGlkYSwKICAiTm8gbGV0YWxpZGFkIiA9IDEgLSBsZXRhbGlkYWRfdmFsaWRhCikKcGllKAogIHZhbG9yZXMsCiAgbGFiZWxzID0gcGFzdGUwKG5hbWVzKHZhbG9yZXMpLCAiOiAiLCByb3VuZCh2YWxvcmVzICogMTAwLCAyKSwgIiUiKSwKICBtYWluID0gIkxldGFsaWRhZCBwb3IgQ292aWQtMTkgZW4gZWwgYcOxbyAyMDIwIiwKICBjb2wgPSBjKCJmaXJlYnJpY2siLCAiYmx1ZSIpCikKYGBgCgojIyMgVVNPIERFIEZMRVhUQUJMRQoKUGV0aWNpw7NuOgoKPiBDb25zdHJ1eWUgdW5hIGNvbiBmbGV4dGFibGUgcXVlIGluY2x1eWE6IGFuaW8sIHBvYmxhY2lvbl90b3RhbCwgbmFjaW1pZW50b3NfcmVnaXN0cmFkb3MsIGRlZnVuY2lvbmVzX3JlZ2lzdHJhZGFzLCBpbmNyZW1lbnRvX25hdHVyYWwgeSBsYXMgdGFzYXMgY2FsY3VsYWRhcy4KCmBgYHtyfQojIENyZWFyIGVsIGNvbmp1bnRvIGRlIGRhdG9zIAoKbGlicmFyeShmbGV4dGFibGUpCgpkYXRvcyA8LSBkYXRhLmZyYW1lKAogIGHDsW8gPSBjKDIwMTgsIDIwMTksIDIwMjAsIDIwMjEpLAogIHBvYmxhY2lvbl90b3RhbCA9IGMoMTI0NzM4MDAwLCAxMjU5MzAwMDAsIDEyNjAxNDAyNCwgMTI2NzA1MTM4KSwKICBuYWNpbWllbnRvc19yZWdpc3RyYWRvcyA9IGMoMjE2MjUzNSwgMjA5MjIxNCwgMTYyOTIxMSwgMTkxMjE3OCksCiAgZGVmdW5jaW9uZXNfcmVnaXN0cmFkYXMgPSBjKDcyMjYxMSwgNzQ3Nzg0LCAxMDg2NzQzLCAxMTIyMjQ5KSwKICBjYXNvc19jb3ZpZF9jb25maXJtYWRvcyA9IGMoMCwgMCwgMTQzNzE4NSwgMCksCiAgZGVmdW5jaW9uZXNfY292aWRfY29uZmlybWFkYXMgPSBjKDAsIDAsIDEyNjUwNywgMCkKKQoKZGF0b3MkdGFzYV9uYXRhbGlkYWQgPC0gKGRhdG9zJG5hY2ltaWVudG9zX3JlZ2lzdHJhZG9zIC8KICAgICAgICAgICAgICAgICAgICAgICAgIGRhdG9zJHBvYmxhY2lvbl90b3RhbCkgKiAxMDAwCgpkYXRvcyR0YXNhX21vcnRhbGlkYWQgPC0gKGRhdG9zJGRlZnVuY2lvbmVzX3JlZ2lzdHJhZGFzIC8KICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRvcyRwb2JsYWNpb25fdG90YWwpICogMTAwMAoKZGF0b3MkaW5jcmVtZW50b19uYXR1cmFsIDwtIGRhdG9zJHRhc2FfbmF0YWxpZGFkIC0gZGF0b3MkdGFzYV9tb3J0YWxpZGFkCgpkYXRvcyR0YXNhX2xldGFsaWRhZCA8LSAoZGF0b3MkZGVmdW5jaW9uZXNfY292aWRfY29uZmlybWFkYXMgLyBkYXRvcyRjYXNvc19jb3ZpZF9jb25maXJtYWRvcykgKiAxMDAKCiMgUmVkb25kZWFyIHNvbG8gY29sdW1uYXMgbsO6bWVyaWNhcwpkYXRvc19yZWRvbmRlYWRvcyA8LSBkYXRvcyAlPiUKICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsIDIpCgojIENyZWFyIGxhIHRhYmxhIGNvbiBmbGV4dGFibGUKZmxleHRhYmxlKGRhdG9zX3JlZG9uZGVhZG9zKSAlPiUKICBhdXRvZml0KCkKYGBgCgojIyMgUHJlZ3VudGFzOgoKMS4gIMK/RW4gcXXDqSBhw7FvIHNlIG9ic2VydmEgbGEgbWF5b3IgdGFzYSBkZSBtb3J0YWxpZGFkIHkgY8OzbW8gc2UgcmVsYWNpb25hIGNvbiBsYSBwYW5kZW1pYT8KCiAgICAtICAgU2Ugb2JzZXJ2YSB1biBpbmNyZW1lbnRvIGVuIGxhIG1vcnRhbGlkYWQsIHNlIHB1ZWRlIGVudGVuZGVyIHF1ZSBsYSBwYW5kZW1pYSBpbmNyZW1lbnTDsyBsb3MgbnVtZXJvcyBkZSBtdWVydGVzIGVuIGxhIHBvYmxhY2nDs24uCgoyLiAgwr9Dw7NtbyBjYW1iaWEgbGEgdGFzYSBkZSBuYXRhbGlkYWQgZW50cmUgMjAxOCB5IDIwMjE/CgogICAgLSAgIFNlIHByZXNlbnTDsyB1bmEgcmVkdWNjacOzbiBkZSBsYSB0YXNhIGRlIG5hdGFsaWRhZC4gRWwgYcOxbyBjb24gbGEgdGFzYSBtw6FzIGJhamEgZnVlIGVuIDIwMjAuCgozLiAgwr9RdcOpIG9jdXJyZSBjb24gZWwgaW5jcmVtZW50byBuYXR1cmFsIGR1cmFudGUgZXNlIHBlcmlvZG8/CgogICAgLSAgIENhZSBhIHBpcXVlIGVuIDIwMjAgZSBpbnRlbnRhIHN1YmlyIHVuIHBvY28gc2kgbml2ZWwgZW4gMjAyMSwgc2llbmRvIDIwMTggZWwgYcOxbyBjb24gbG9zIG7Dum1lcm9zIG3DoXMgYWx0b3MuCgo0LiAgwr9RdcOpIHNpZ25pZmljYSBsYSB0YXNhIGRlIGxldGFsaWRhZCBwb3IgQ09WSUQtMTkgcXVlIG9idHV2aXN0ZSBwYXJhIDIwMjA/CgogICAgLSAgIFJlcHJlc2VudGEgZWwgcG9yY2VudGFqZSBkZSBwZXJzb25hcyBxdWUgZmFsbGVjZW4gZW50cmUgcXVpZW5lcyBwYWRlY2llcm9uIGRlIENvdmlkLTE5Lgo=