Presentación

En el marco del cálculo del costo de menstruar en Argentina, llevado a cabo desde la campaña #MenstruAcción y EcoFeminitas, en el presente documento de trabajo se presenta el cálculo del costo de menstruar en Argentina. Para ello se utilizan los datos obtenidos mediante el #MenstruScrapper, desarrollado por Nayla Portas de [LAS] de sistemas. El #MenstruScrapper fue ejecutado el día 17 de Septiembre de 2021 sobre la página Precios Claros, sumándose esta información a la obtenida anteriormente en Septiembre y Marzo de 2019, Marzo y Septiembre de 2020, y Marzo de 2021. En esta instancia, se obtuvieron 83.317 observaciones en total.

Estos datos fueron explorados, organizados y limpiados en otra instancia también publicada. En nuestro repositorio se encuentran aclaradas todas las fuentes adicionales a las que se recurrió para realizar el cálculo y los archivos correspondientes.

Preparando el entorno de trabajo

Comenzamos levantando las librerías necesarias, y cargando los datos que se encuentran en formato .RDS. Aprovechamos para tener una vista previa de los datos.

library(tidyverse)
library(readxl)
library(DT)
datos <- readRDS("Fuentes/precios-gestion-menstrual-2021-09-17-limpio.RDS")

head(datos)

A su vez, se carga la estimación, por cada provincia, de personas que menstrúan. Como está aclarado en la carpeta de fuentes, esto sale de las proyecciones poblacionales del INDEC para 2021, teniendo en cuenta que la menarca se estima en los 13 años y la menopausia en 49 años. Estos datos se van a utilizar para ponderar el precio promedio de cada provincia a la hora de agregar en un indicador nacional. Como se encuentran en un archivo .xls, usamos la función read_excel(). Obtenemos también una vista previa de la estructura de estos datos.

menstruan <- read_excel("Fuentes/poblaciones.xls") %>% 
  select(Provincia, Menstruan) # Para sacar las columnas con comentarios

head(menstruan)

A continuación, calculamos el total a nivel nacional de personas que menstrúan, sumando los datos de todas las provincias. Y, dividiendo los datos de cada provincia por dicho total, obtenemos las proporciones que nos van a servir para ponderar los promedios de precio según el peso de cada una de las provincias. Como guardo estas modificaciones bajo el mismo nombre, la información será pisada en la misma tabla menstruan, de la que se vuelve a presentar una vista previa.

menstruan <- menstruan %>% 
  mutate(total = sum(Menstruan),
         pond = Menstruan/total) %>% 
  select(Provincia, pond)

head(menstruan)

Además, considerando que hay outliers (valores atípicos) en los precios unitarios, a la hora de calcular los promedios de precios provinciales se remueven “las colas” de la distribución, utilizando una media alfa podada:

Cálculo y Resultados

A continuación ya procedemos a calcular los precios promedio de toallitas y tampones. Para el caso del total nacional, primero habrá que calcular los precios promedio (por unidad) de cada provincia, para luego agregarlos en un promedio general. Una vez que tenemos precios representativos de toallitas y tampones, podremos estimar un costo anual por persona de acuerdo a las estimaciones de cuántos ciclos por año presentan las personas que menstrúan, y cuántos productos utilizan por ciclo.

Total Nacional

Toallitas

Promedio del precio por unidad

Para calcular el precio promedio de cada provincia tomamos los datos, los filtramos para quedarnos únicamente con las toallitas, agrupando las observaciones según la variable Provincia. Con summarise() podemos definir indicadores que agregan la información para cada grupo, así que definimos el promedio provincial como una media podada. Es en el parámetro trim que se aclara la proporción de los datos que se podan. Finalmente, anexamos en una nueva columna los ponderadores de cada provincia, así toda la información necesaria para el cálculo del promedio nacional se encuentra en la misma tabla.

toallitas <- datos %>% 
  filter(Categoría == "toallitas") %>%
  group_by(Provincia) %>% 
  summarise(prom = mean(precio_unidad, trim = 0.025)) %>% 
  left_join(., menstruan, by = "Provincia")

head(toallitas)

Luego, el valor promedio para el total nacional se calcula como una media ponderada. La función weighted.mean() nos permite aclarar la variable a promediar, y la variable que funciona como ponderador.

valor_toallitas <- weighted.mean(toallitas$prom, toallitas$pond)

Toallitas: El precio promedio por unidad es de $14.34

Gasto por año por persona

El gasto anual por persona se calcula teniendo en cuenta:

  • ciclos por año: 13
  • productos utilizados por ciclo: 22

(Ambos datos se encuentran aclarados en las Fuentes)

ciclos_por_anio <- 13
productos_por_ciclo <- 22
productos_por_anio <- ciclos_por_anio * productos_por_ciclo

gasto_por_anio_toallitas <- valor_toallitas * productos_por_anio

Toallitas: El gasto promedio por año por persona es de $4101.75

Tampones

Se realiza un procedimiento semejante para el caso de los tampones.

Promedio del precio por unidad

tampones <- datos %>% 
  filter(Categoría == "tampones") %>%
  group_by(Provincia) %>% 
  summarise(prom = mean(precio_unidad, trim = 0.025)) %>% 
  left_join(., menstruan, by = "Provincia")

valor_tampones <- weighted.mean(tampones$prom, tampones$pond)

Tampones: El precio promedio por unidad es de $16.38

Gasto por año por persona

El gasto anual por persona se calcula teniendo en cuenta:

  • ciclos por año: 13
  • productos utilizados por ciclo: 22
gasto_por_anio_tampones <- valor_tampones * productos_por_anio

Tampones: El gasto promedio por año por persona es de $4686.05

Por provincia

Para obtener los datos de cada provincia el procedimiento es aún más sencillo. En la variable gasto_por_anio, cada precio promedio se multiplica por la cantidad de productos que se utilizan anualmente. Por una cuestión de exposición, se quitan de la tabla las columnas con aquellos precios promedios por unidad, y los ponderadores provinciales.

Toallitas

Gasto por año por persona

toallitas <- toallitas %>% 
  mutate(gasto_por_anio = round(prom * productos_por_anio, 2)) %>% 
  select(-prom, -pond) %>% 
  arrange(gasto_por_anio)

toallitas %>%
    datatable(
    extensions = 'Buttons', 
    options = list(dom = 'Bfrtip', 
                   buttons = c('copy', 'csv', 'excel', 'pdf', 'print')))

Tampones

Gasto por año por persona

tampones <- tampones %>% 
  mutate(gasto_por_anio = round(prom * productos_por_anio, 2)) %>% 
  select(-prom, -pond) %>% 
  arrange(gasto_por_anio)

tampones %>% 
    datatable(
    extensions = 'Buttons', 
    options = list(dom = 'Bfrtip', 
                   buttons = c('copy', 'csv', 'excel', 'pdf', 'print')))

Aumentos

Como esta es la cuarta vez que realizamos este ejercicio de estimación semestral, podemos ver cómo evolucionaron los precios de toallitas y tampones en el último año. También, con los datos del Índice de Precios al Consumidor (IPC - INDEC), se puede realizar una comparación entre la evolución de estos productos de gestión menstrual y el nivel general de precios, el rubro alimentos y bebidas no alcohólicas, y el de Salud. Ambas series se levantan desde archivos de extensión .xlsx en las tablas serie_inflacion y precios_pgm.

serie_inflacion <- read_excel("Fuentes/serie_inflacion.xlsx")
precios_pgm <- read_excel("Fuentes/serie_precios_pgm.xlsx")
head(serie_inflacion)
head(precios_pgm)

Asegurándonos de que los datos se encuentran ordenados por fecha, podemos transformar ambas series para que se encuentren expresadas con el mes de marzo 2019 = 100. De esta forma podremos comparar la evolución de ambas. Esto lo hacemos modificando las series con las que contamos dividiendo todos los valores por el primero de ellos (y multiplicando por 100). La selección del primer elemento de la serie se realizó con la función first().

base100 <- serie_inflacion %>% 
  mutate(`Nivel General` = `Nivel General`/first(`Nivel General`) * 100,
         `Alimentos y bebidas no alcohólicas` = `Alimentos y bebidas no alcohólicas`/
           first(`Alimentos y bebidas no alcohólicas`) * 100,
         Salud = Salud/first(Salud) * 100)

head(base100)
pgm_100 <- precios_pgm %>% 
  mutate(Toallitas = Toallitas/first(Toallitas) * 100,
         Tampones = Tampones/first(Tampones) * 100)

head(pgm_100)

Podemos anexar la evolución de los precios de los productos de gestión menstrual a la serie de inflación, por más que esta última tenga valores mensuales y nuestros datos se hayan recolectado cada seis meses, utilizando Mes como variable de link. Luego reordenamos la información para que todas las variables, excepto Mes, se presenten en una variable Categoría (con valores “Nivel General”, “Salud”, “Toallitas”, etc.), y los valores de cada serie se agrupen en la variable Indice. No habrá datos en diversos meses para toallitas y tampones, así que filtramos esas filas vacías, y finalmente creamos la variable Grupo para identificar como “IPC” a las categorías del índice de precios al consumidor, y como “PGM” a los productos de gestión menstrual.

# Esto se puede correr "de a poco" para ver cómo cambian las cosas en cada paso
base100 <- base100 %>% 
  left_join(., pgm_100, by = "Mes") %>% 
  pivot_longer(-Mes, names_to = "Categoria", values_to = "Indice") %>% 
  filter(!is.na(Indice)) %>% 
  mutate(Grupo = case_when(Categoria %in% c("Nivel General", "Alimentos y bebidas no alcohólicas", "Salud") ~ "IPC",
                           Categoria %in% c("Toallitas", "Tampones") ~ "PGM"))

head(base100)

A fines de graficar esta información, por esta vez se prescinde de la serie de “Alimentos y bedidas no alcohólicas” porque no agrega tanta información en la comparabilidad, y sí ocupa espacio visual que puede obstruir la comparación de las demás series.

base100bis <- base100 %>% 
  filter(Categoria != "Alimentos y bebidas no alcohólicas")

Para el gráfico puedo definir un vector de colores que sirva para distinguir las series de IPC (en la gama de azules) y las de productos de gestión menstrual (en la gama del rojo).

colorcitos <- c('royalblue4', 'royalblue', 
                'violetred', 'red')

Finalmente, definimos nuestro gráfico. Tomando la tabla base100bis,

library(ggrepel)

ggplot(base100bis, aes(x = Mes, y = Indice, group = Categoria, color = Categoria)) +
  geom_line(data = base100bis %>% filter(Grupo == "PGM"), size = 1, alpha = 1) +
  geom_line(data = base100bis %>% filter(Grupo == "IPC"), alpha = 1, size = 1) +
  geom_point(data = base100bis %>% filter(Grupo == "PGM"), size = 2) +
  theme_minimal() +
  theme(legend.position = "top",
        text = element_text(size = 12)) +
  scale_color_manual(values = colorcitos) +
  expand_limits(x = as.POSIXct(c("2019-03-01", "2020-11-01"))) + 
  labs(title = "Inflación de Toallitas y Tampones vs. Salud y Nivel General del IPC-INDEC",
       subtitle = "Marzo 2019 - Marzo 2021",
       x = "",
       y = "Indice de precios",
       caption = "Fuente: #MenstruAcción y #EcoFemiData (EcoFeminita)") +
  scale_x_datetime(breaks = seq(as.POSIXct('2019-03-01'), by='6 months', length = 5),
                   labels = c("03-2019", "09-2019", "03-2020", "09-2020", "03-2021"))

LS0tCnRpdGxlOiAiQ8OhbGN1bG86IMK/Q3XDoW50byBjdWVzdGEgbWVuc3RydWFyPyIKc3VidGl0bGU6ICJEYXRvcyBkZSBTZXB0aWVtYnJlIDIwMjEiCmF1dGhvcjogIkVjb2ZlbWluaXRhIC8gI01lbnN0cnVBY2Npw7NuIC8gRWNvZmVtaWRhdGEiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiBmYWxzZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICB0b2NfZGVwdGg6IDUKLS0tCgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogIGJvZHl7CiAgZm9udC1zaXplOiAxNHB0Owp9Cjwvc3R5bGU+CgohW10oaW1nL0xvZ29zIEVjb0ZlbWluaXRhLTAzLnBuZyl7d2lkdGg9MTMwcHh9ICFbXShpbWcvTUVOU1RSVUFDQ0lPTi5wbmcpe3dpZHRoPTExMHB4fSAhW10oaW1nL0Vjb2ZlbWlkYXRhLnBuZyl7d2lkdGg9MTAwcHh9CgoKIyMgUHJlc2VudGFjacOzbgoKRW4gZWwgbWFyY28gZGVsIGPDoWxjdWxvIGRlbCBjb3N0byBkZSBtZW5zdHJ1YXIgZW4gQXJnZW50aW5hLCBsbGV2YWRvIGEgY2FibyBkZXNkZSBsYSBjYW1wYcOxYSAjTWVuc3RydUFjY2nDs24geSBFY29GZW1pbml0YXMsIGVuIGVsIHByZXNlbnRlIGRvY3VtZW50byBkZSB0cmFiYWpvIHNlIHByZXNlbnRhIGVsIGPDoWxjdWxvIGRlbCBjb3N0byBkZSBtZW5zdHJ1YXIgZW4gQXJnZW50aW5hLiBQYXJhIGVsbG8gc2UgdXRpbGl6YW4gbG9zIGRhdG9zIG9idGVuaWRvcyBtZWRpYW50ZSBlbCBbI01lbnN0cnVTY3JhcHBlcl0oaHR0cHM6Ly9naXRodWIuY29tL25wb3J0YXMvbWVuc3RydXNjcmFwcGVyKSwgZGVzYXJyb2xsYWRvIHBvciBOYXlsYSBQb3J0YXMgZGUgW0xBU10gZGUgc2lzdGVtYXMuIEVsICNNZW5zdHJ1U2NyYXBwZXIgZnVlIGVqZWN1dGFkbyBlbCBkw61hIDE3IGRlIFNlcHRpZW1icmUgZGUgMjAyMSBzb2JyZSBsYSBww6FnaW5hIFByZWNpb3MgQ2xhcm9zLCBzdW3DoW5kb3NlIGVzdGEgaW5mb3JtYWNpw7NuIGEgbGEgb2J0ZW5pZGEgYW50ZXJpb3JtZW50ZSBlbiBTZXB0aWVtYnJlIHkgTWFyem8gZGUgMjAxOSwgTWFyem8geSBTZXB0aWVtYnJlIGRlIDIwMjAsIHkgTWFyem8gZGUgMjAyMS4gRW4gZXN0YSBpbnN0YW5jaWEsIHNlIG9idHV2aWVyb24gODMuMzE3IG9ic2VydmFjaW9uZXMgZW4gdG90YWwuCgorIFJlc3BlY3RvIGRlIGxvcyB0YW1wb25lczogU2Ugb2J0dXZpZXJvbiAxNy43OTkgcHJlY2lvcy4KKyBSZXNwZWN0byBkZSBsYXMgdG9hbGxpdGFzOiBTZSBvYnR1dmllcm9uIDY1LjUxOCBwcmVjaW9zLgoKRXN0b3MgZGF0b3MgZnVlcm9uIGV4cGxvcmFkb3MsIG9yZ2FuaXphZG9zIHkgbGltcGlhZG9zIGVuIG90cmEgaW5zdGFuY2lhIHRhbWJpw6luIHB1YmxpY2FkYS4gRW4gW251ZXN0cm8gcmVwb3NpdG9yaW9dKGh0dHBzOi8vZ2l0aHViLmNvbS9FY29mZW1pbml0YS9FY29GZW1pRGF0YS90cmVlL21hc3Rlci9NZW5zdHJ1QWNjaW9uL2N1YW50b19jdWVzdGFfbWVuc3RydWFyKSBzZSBlbmN1ZW50cmFuIGFjbGFyYWRhcyB0b2RhcyBsYXMgZnVlbnRlcyBhZGljaW9uYWxlcyBhIGxhcyBxdWUgc2UgcmVjdXJyacOzIHBhcmEgcmVhbGl6YXIgZWwgY8OhbGN1bG8geSBsb3MgYXJjaGl2b3MgY29ycmVzcG9uZGllbnRlcy4KCiMjIFByZXBhcmFuZG8gZWwgZW50b3JubyBkZSB0cmFiYWpvCgpDb21lbnphbW9zIGxldmFudGFuZG8gbGFzIGxpYnJlcsOtYXMgbmVjZXNhcmlhcywgeSBjYXJnYW5kbyBsb3MgZGF0b3MgcXVlIHNlIGVuY3VlbnRyYW4gZW4gZm9ybWF0byAuUkRTLiBBcHJvdmVjaGFtb3MgcGFyYSB0ZW5lciB1bmEgdmlzdGEgcHJldmlhIGRlIGxvcyBkYXRvcy4KCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KERUKQpgYGAKCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZGF0b3MgPC0gcmVhZFJEUygiRnVlbnRlcy9wcmVjaW9zLWdlc3Rpb24tbWVuc3RydWFsLTIwMjEtMDktMTctbGltcGlvLlJEUyIpCgpoZWFkKGRhdG9zKQpgYGAKCkEgc3UgdmV6LCBzZSBjYXJnYSBsYSBlc3RpbWFjacOzbiwgcG9yIGNhZGEgcHJvdmluY2lhLCBkZSBwZXJzb25hcyBxdWUgbWVuc3Ryw7phbi4gQ29tbyBlc3TDoSBhY2xhcmFkbyBlbiBsYSBjYXJwZXRhIGRlIGZ1ZW50ZXMsIGVzdG8gc2FsZSBkZSBsYXMgcHJveWVjY2lvbmVzIHBvYmxhY2lvbmFsZXMgZGVsIElOREVDIHBhcmEgMjAyMSwgdGVuaWVuZG8gZW4gY3VlbnRhIHF1ZSBsYSBtZW5hcmNhIHNlIGVzdGltYSBlbiBsb3MgMTMgYcOxb3MgeSBsYSBtZW5vcGF1c2lhIGVuIDQ5IGHDsW9zLiBFc3RvcyBkYXRvcyBzZSB2YW4gYSB1dGlsaXphciBwYXJhIHBvbmRlcmFyIGVsIHByZWNpbyBwcm9tZWRpbyBkZSBjYWRhIHByb3ZpbmNpYSBhIGxhIGhvcmEgZGUgYWdyZWdhciBlbiB1biBpbmRpY2Fkb3IgbmFjaW9uYWwuIENvbW8gc2UgZW5jdWVudHJhbiBlbiB1biBhcmNoaXZvIGAueGxzYCwgdXNhbW9zIGxhIGZ1bmNpw7NuIGByZWFkX2V4Y2VsKClgLiBPYnRlbmVtb3MgdGFtYmnDqW4gdW5hIHZpc3RhIHByZXZpYSBkZSBsYSBlc3RydWN0dXJhIGRlIGVzdG9zIGRhdG9zLgoKYGBge3IgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQptZW5zdHJ1YW4gPC0gcmVhZF9leGNlbCgiRnVlbnRlcy9wb2JsYWNpb25lcy54bHMiKSAlPiUgCiAgc2VsZWN0KFByb3ZpbmNpYSwgTWVuc3RydWFuKSAjIFBhcmEgc2FjYXIgbGFzIGNvbHVtbmFzIGNvbiBjb21lbnRhcmlvcwoKaGVhZChtZW5zdHJ1YW4pCmBgYAoKQSBjb250aW51YWNpw7NuLCBjYWxjdWxhbW9zIGVsIHRvdGFsIGEgbml2ZWwgbmFjaW9uYWwgZGUgcGVyc29uYXMgcXVlIG1lbnN0csO6YW4sIHN1bWFuZG8gbG9zIGRhdG9zIGRlIHRvZGFzIGxhcyBwcm92aW5jaWFzLiBZLCBkaXZpZGllbmRvIGxvcyBkYXRvcyBkZSBjYWRhIHByb3ZpbmNpYSBwb3IgZGljaG8gdG90YWwsIG9idGVuZW1vcyBsYXMgcHJvcG9yY2lvbmVzIHF1ZSBub3MgdmFuIGEgc2VydmlyIHBhcmEgcG9uZGVyYXIgbG9zIHByb21lZGlvcyBkZSBwcmVjaW8gc2Vnw7puIGVsIHBlc28gZGUgY2FkYSB1bmEgZGUgbGFzIHByb3ZpbmNpYXMuIENvbW8gZ3VhcmRvIGVzdGFzIG1vZGlmaWNhY2lvbmVzIGJham8gZWwgbWlzbW8gbm9tYnJlLCBsYSBpbmZvcm1hY2nDs24gc2Vyw6EgcGlzYWRhIGVuIGxhIG1pc21hIHRhYmxhIGBtZW5zdHJ1YW5gLCBkZSBsYSBxdWUgc2UgdnVlbHZlIGEgcHJlc2VudGFyIHVuYSB2aXN0YSBwcmV2aWEuCgpgYGB7ciBlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9Cm1lbnN0cnVhbiA8LSBtZW5zdHJ1YW4gJT4lIAogIG11dGF0ZSh0b3RhbCA9IHN1bShNZW5zdHJ1YW4pLAogICAgICAgICBwb25kID0gTWVuc3RydWFuL3RvdGFsKSAlPiUgCiAgc2VsZWN0KFByb3ZpbmNpYSwgcG9uZCkKCmhlYWQobWVuc3RydWFuKQpgYGAKCkFkZW3DoXMsIGNvbnNpZGVyYW5kbyBxdWUgaGF5IG91dGxpZXJzICh2YWxvcmVzIGF0w61waWNvcykgZW4gbG9zIHByZWNpb3MgdW5pdGFyaW9zLCBhIGxhIGhvcmEgZGUgY2FsY3VsYXIgbG9zIHByb21lZGlvcyBkZSBwcmVjaW9zIHByb3ZpbmNpYWxlcyBzZSByZW11ZXZlbiAibGFzIGNvbGFzIiBkZSBsYSBkaXN0cmlidWNpw7NuLCB1dGlsaXphbmRvIHVuYSBtZWRpYSBhbGZhIHBvZGFkYTogICAgIAoKLSBhbGZhID0gMi41JQoKIyMgQ8OhbGN1bG8geSBSZXN1bHRhZG9zCgpBIGNvbnRpbnVhY2nDs24geWEgcHJvY2VkZW1vcyBhIGNhbGN1bGFyIGxvcyBwcmVjaW9zIHByb21lZGlvIGRlIHRvYWxsaXRhcyB5IHRhbXBvbmVzLiBQYXJhIGVsIGNhc28gZGVsIHRvdGFsIG5hY2lvbmFsLCBwcmltZXJvIGhhYnLDoSBxdWUgY2FsY3VsYXIgbG9zIHByZWNpb3MgcHJvbWVkaW8gKHBvciB1bmlkYWQpIGRlIGNhZGEgcHJvdmluY2lhLCBwYXJhIGx1ZWdvIGFncmVnYXJsb3MgZW4gdW4gcHJvbWVkaW8gZ2VuZXJhbC4gVW5hIHZleiBxdWUgdGVuZW1vcyBwcmVjaW9zIHJlcHJlc2VudGF0aXZvcyBkZSB0b2FsbGl0YXMgeSB0YW1wb25lcywgcG9kcmVtb3MgZXN0aW1hciB1biBjb3N0byBhbnVhbCBwb3IgcGVyc29uYSBkZSBhY3VlcmRvIGEgbGFzIGVzdGltYWNpb25lcyBkZSBjdcOhbnRvcyBjaWNsb3MgcG9yIGHDsW8gcHJlc2VudGFuIGxhcyBwZXJzb25hcyBxdWUgbWVuc3Ryw7phbiwgeSBjdcOhbnRvcyBwcm9kdWN0b3MgdXRpbGl6YW4gcG9yIGNpY2xvLgoKIyMgVG90YWwgTmFjaW9uYWwKCiMjIyBUb2FsbGl0YXMKCiMjIyBQcm9tZWRpbyBkZWwgcHJlY2lvIHBvciB1bmlkYWQKClBhcmEgY2FsY3VsYXIgZWwgcHJlY2lvIHByb21lZGlvIGRlIGNhZGEgcHJvdmluY2lhIHRvbWFtb3MgbG9zIGRhdG9zLCBsb3MgZmlsdHJhbW9zIHBhcmEgcXVlZGFybm9zIMO6bmljYW1lbnRlIGNvbiBsYXMgdG9hbGxpdGFzLCBhZ3J1cGFuZG8gbGFzIG9ic2VydmFjaW9uZXMgc2Vnw7puIGxhIHZhcmlhYmxlIGBQcm92aW5jaWFgLiBDb24gYHN1bW1hcmlzZSgpYCBwb2RlbW9zIGRlZmluaXIgaW5kaWNhZG9yZXMgcXVlIGFncmVnYW4gbGEgaW5mb3JtYWNpw7NuIHBhcmEgY2FkYSBncnVwbywgYXPDrSBxdWUgZGVmaW5pbW9zIGVsIHByb21lZGlvIHByb3ZpbmNpYWwgY29tbyB1bmEgbWVkaWEgcG9kYWRhLiBFcyBlbiBlbCBwYXLDoW1ldHJvIGB0cmltYCBxdWUgc2UgYWNsYXJhIGxhIHByb3BvcmNpw7NuIGRlIGxvcyBkYXRvcyBxdWUgc2UgcG9kYW4uIEZpbmFsbWVudGUsIGFuZXhhbW9zIGVuIHVuYSBudWV2YSBjb2x1bW5hIGxvcyBwb25kZXJhZG9yZXMgZGUgY2FkYSBwcm92aW5jaWEsIGFzw60gdG9kYSBsYSBpbmZvcm1hY2nDs24gbmVjZXNhcmlhIHBhcmEgZWwgY8OhbGN1bG8gZGVsIHByb21lZGlvIG5hY2lvbmFsIHNlIGVuY3VlbnRyYSBlbiBsYSBtaXNtYSB0YWJsYS4KCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KdG9hbGxpdGFzIDwtIGRhdG9zICU+JSAKICBmaWx0ZXIoQ2F0ZWdvcsOtYSA9PSAidG9hbGxpdGFzIikgJT4lCiAgZ3JvdXBfYnkoUHJvdmluY2lhKSAlPiUgCiAgc3VtbWFyaXNlKHByb20gPSBtZWFuKHByZWNpb191bmlkYWQsIHRyaW0gPSAwLjAyNSkpICU+JSAKICBsZWZ0X2pvaW4oLiwgbWVuc3RydWFuLCBieSA9ICJQcm92aW5jaWEiKQoKaGVhZCh0b2FsbGl0YXMpCmBgYAoKTHVlZ28sIGVsIHZhbG9yIHByb21lZGlvIHBhcmEgZWwgdG90YWwgbmFjaW9uYWwgc2UgY2FsY3VsYSBjb21vIHVuYSBtZWRpYSBwb25kZXJhZGEuIExhIGZ1bmNpw7NuIGB3ZWlnaHRlZC5tZWFuKClgIG5vcyBwZXJtaXRlIGFjbGFyYXIgbGEgdmFyaWFibGUgYSBwcm9tZWRpYXIsIHkgbGEgdmFyaWFibGUgcXVlIGZ1bmNpb25hIGNvbW8gcG9uZGVyYWRvci4KCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KdmFsb3JfdG9hbGxpdGFzIDwtIHdlaWdodGVkLm1lYW4odG9hbGxpdGFzJHByb20sIHRvYWxsaXRhcyRwb25kKQpgYGAKCjxmb250IHNpemU9IjYiPiBUb2FsbGl0YXM6IEVsIHByZWNpbyBwcm9tZWRpbyBwb3IgdW5pZGFkIGVzIGRlICRgciByb3VuZCh2YWxvcl90b2FsbGl0YXMsIDIpYCA8L2ZvbnQ+IAoKIyMjIEdhc3RvIHBvciBhw7FvIHBvciBwZXJzb25hCgpFbCBnYXN0byBhbnVhbCBwb3IgcGVyc29uYSBzZSBjYWxjdWxhIHRlbmllbmRvIGVuIGN1ZW50YToKCi0gY2ljbG9zIHBvciBhw7FvOiAxMwotIHByb2R1Y3RvcyB1dGlsaXphZG9zIHBvciBjaWNsbzogMjIKCihBbWJvcyBkYXRvcyBzZSBlbmN1ZW50cmFuIGFjbGFyYWRvcyBlbiBsYXMgYEZ1ZW50ZXNgKQoKYGBge3IgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpjaWNsb3NfcG9yX2FuaW8gPC0gMTMKcHJvZHVjdG9zX3Bvcl9jaWNsbyA8LSAyMgpwcm9kdWN0b3NfcG9yX2FuaW8gPC0gY2ljbG9zX3Bvcl9hbmlvICogcHJvZHVjdG9zX3Bvcl9jaWNsbwoKZ2FzdG9fcG9yX2FuaW9fdG9hbGxpdGFzIDwtIHZhbG9yX3RvYWxsaXRhcyAqIHByb2R1Y3Rvc19wb3JfYW5pbwpgYGAKCjxmb250IHNpemU9IjYiPiBUb2FsbGl0YXM6IEVsIGdhc3RvIHByb21lZGlvIHBvciBhw7FvIHBvciBwZXJzb25hIGVzIGRlICRgciByb3VuZChnYXN0b19wb3JfYW5pb190b2FsbGl0YXMsIDIpYCA8L2ZvbnQ+IAoKIyMjIFRhbXBvbmVzCgpTZSByZWFsaXphIHVuIHByb2NlZGltaWVudG8gc2VtZWphbnRlIHBhcmEgZWwgY2FzbyBkZSBsb3MgdGFtcG9uZXMuCgojIyMgUHJvbWVkaW8gZGVsIHByZWNpbyBwb3IgdW5pZGFkCgpgYGB7ciBlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnRhbXBvbmVzIDwtIGRhdG9zICU+JSAKICBmaWx0ZXIoQ2F0ZWdvcsOtYSA9PSAidGFtcG9uZXMiKSAlPiUKICBncm91cF9ieShQcm92aW5jaWEpICU+JSAKICBzdW1tYXJpc2UocHJvbSA9IG1lYW4ocHJlY2lvX3VuaWRhZCwgdHJpbSA9IDAuMDI1KSkgJT4lIAogIGxlZnRfam9pbiguLCBtZW5zdHJ1YW4sIGJ5ID0gIlByb3ZpbmNpYSIpCgp2YWxvcl90YW1wb25lcyA8LSB3ZWlnaHRlZC5tZWFuKHRhbXBvbmVzJHByb20sIHRhbXBvbmVzJHBvbmQpCmBgYAoKPGZvbnQgc2l6ZT0iNiI+IFRhbXBvbmVzOiBFbCBwcmVjaW8gcHJvbWVkaW8gcG9yIHVuaWRhZCBlcyBkZSAkYHIgcm91bmQodmFsb3JfdGFtcG9uZXMsIDIpYCA8L2ZvbnQ+IAoKIyMjIEdhc3RvIHBvciBhw7FvIHBvciBwZXJzb25hCgpFbCBnYXN0byBhbnVhbCBwb3IgcGVyc29uYSBzZSBjYWxjdWxhIHRlbmllbmRvIGVuIGN1ZW50YToKCi0gY2ljbG9zIHBvciBhw7FvOiAxMwotIHByb2R1Y3RvcyB1dGlsaXphZG9zIHBvciBjaWNsbzogMjIKCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZ2FzdG9fcG9yX2FuaW9fdGFtcG9uZXMgPC0gdmFsb3JfdGFtcG9uZXMgKiBwcm9kdWN0b3NfcG9yX2FuaW8KYGBgCgo8Zm9udCBzaXplPSI2Ij4gVGFtcG9uZXM6IEVsIGdhc3RvIHByb21lZGlvIHBvciBhw7FvIHBvciBwZXJzb25hIGVzIGRlICRgciByb3VuZChnYXN0b19wb3JfYW5pb190YW1wb25lcywgMilgIDwvZm9udD4gCgojIyBQb3IgcHJvdmluY2lhCgpQYXJhIG9idGVuZXIgbG9zIGRhdG9zIGRlIGNhZGEgcHJvdmluY2lhIGVsIHByb2NlZGltaWVudG8gZXMgYcO6biBtw6FzIHNlbmNpbGxvLiBFbiBsYSB2YXJpYWJsZSBgZ2FzdG9fcG9yX2FuaW9gLCBjYWRhIHByZWNpbyBwcm9tZWRpbyBzZSBtdWx0aXBsaWNhIHBvciBsYSBjYW50aWRhZCBkZSBwcm9kdWN0b3MgcXVlIHNlIHV0aWxpemFuIGFudWFsbWVudGUuIFBvciB1bmEgY3Vlc3Rpw7NuIGRlIGV4cG9zaWNpw7NuLCBzZSBxdWl0YW4gZGUgbGEgdGFibGEgbGFzIGNvbHVtbmFzIGNvbiBhcXVlbGxvcyBwcmVjaW9zIHByb21lZGlvcyBwb3IgdW5pZGFkLCB5IGxvcyBwb25kZXJhZG9yZXMgcHJvdmluY2lhbGVzLgoKIyMjIFRvYWxsaXRhcwoKIyMjIEdhc3RvIHBvciBhw7FvIHBvciBwZXJzb25hCgpgYGB7ciBlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnRvYWxsaXRhcyA8LSB0b2FsbGl0YXMgJT4lIAogIG11dGF0ZShnYXN0b19wb3JfYW5pbyA9IHJvdW5kKHByb20gKiBwcm9kdWN0b3NfcG9yX2FuaW8sIDIpKSAlPiUgCiAgc2VsZWN0KC1wcm9tLCAtcG9uZCkgJT4lIAogIGFycmFuZ2UoZ2FzdG9fcG9yX2FuaW8pCgp0b2FsbGl0YXMgJT4lCiAgICBkYXRhdGFibGUoCiAgICBleHRlbnNpb25zID0gJ0J1dHRvbnMnLCAKICAgIG9wdGlvbnMgPSBsaXN0KGRvbSA9ICdCZnJ0aXAnLCAKICAgICAgICAgICAgICAgICAgIGJ1dHRvbnMgPSBjKCdjb3B5JywgJ2NzdicsICdleGNlbCcsICdwZGYnLCAncHJpbnQnKSkpCmBgYAoKIyMjIFRhbXBvbmVzCgojIyMgR2FzdG8gcG9yIGHDsW8gcG9yIHBlcnNvbmEKCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KdGFtcG9uZXMgPC0gdGFtcG9uZXMgJT4lIAogIG11dGF0ZShnYXN0b19wb3JfYW5pbyA9IHJvdW5kKHByb20gKiBwcm9kdWN0b3NfcG9yX2FuaW8sIDIpKSAlPiUgCiAgc2VsZWN0KC1wcm9tLCAtcG9uZCkgJT4lIAogIGFycmFuZ2UoZ2FzdG9fcG9yX2FuaW8pCgp0YW1wb25lcyAlPiUgCiAgICBkYXRhdGFibGUoCiAgICBleHRlbnNpb25zID0gJ0J1dHRvbnMnLCAKICAgIG9wdGlvbnMgPSBsaXN0KGRvbSA9ICdCZnJ0aXAnLCAKICAgICAgICAgICAgICAgICAgIGJ1dHRvbnMgPSBjKCdjb3B5JywgJ2NzdicsICdleGNlbCcsICdwZGYnLCAncHJpbnQnKSkpCmBgYAoKIyMgQXVtZW50b3MKCkNvbW8gZXN0YSBlcyBsYSBjdWFydGEgdmV6IHF1ZSByZWFsaXphbW9zIGVzdGUgZWplcmNpY2lvIGRlIGVzdGltYWNpw7NuIHNlbWVzdHJhbCwgcG9kZW1vcyB2ZXIgY8OzbW8gZXZvbHVjaW9uYXJvbiBsb3MgcHJlY2lvcyBkZSB0b2FsbGl0YXMgeSB0YW1wb25lcyBlbiBlbCDDumx0aW1vIGHDsW8uIFRhbWJpw6luLCBjb24gbG9zIGRhdG9zIGRlbCDDjW5kaWNlIGRlIFByZWNpb3MgYWwgQ29uc3VtaWRvciAoSVBDIC0gSU5ERUMpLCBzZSBwdWVkZSByZWFsaXphciB1bmEgY29tcGFyYWNpw7NuIGVudHJlIGxhIGV2b2x1Y2nDs24gZGUgZXN0b3MgcHJvZHVjdG9zIGRlIGdlc3Rpw7NuIG1lbnN0cnVhbCB5IGVsIG5pdmVsIGdlbmVyYWwgZGUgcHJlY2lvcywgZWwgcnVicm8gYWxpbWVudG9zIHkgYmViaWRhcyBubyBhbGNvaMOzbGljYXMsIHkgZWwgZGUgU2FsdWQuIEFtYmFzIHNlcmllcyBzZSBsZXZhbnRhbiBkZXNkZSBhcmNoaXZvcyBkZSBleHRlbnNpw7NuIC54bHN4IGVuIGxhcyB0YWJsYXMgYHNlcmllX2luZmxhY2lvbmAgeSBgcHJlY2lvc19wZ21gLgoKYGBge3IgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpzZXJpZV9pbmZsYWNpb24gPC0gcmVhZF9leGNlbCgiRnVlbnRlcy9zZXJpZV9pbmZsYWNpb24ueGxzeCIpCnByZWNpb3NfcGdtIDwtIHJlYWRfZXhjZWwoIkZ1ZW50ZXMvc2VyaWVfcHJlY2lvc19wZ20ueGxzeCIpCmBgYAoKYGBge3IgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpoZWFkKHNlcmllX2luZmxhY2lvbikKYGBgCgpgYGB7ciBlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmhlYWQocHJlY2lvc19wZ20pCmBgYAoKQXNlZ3Vyw6FuZG9ub3MgZGUgcXVlIGxvcyBkYXRvcyBzZSBlbmN1ZW50cmFuIG9yZGVuYWRvcyBwb3IgZmVjaGEsIHBvZGVtb3MgdHJhbnNmb3JtYXIgYW1iYXMgc2VyaWVzIHBhcmEgcXVlIHNlIGVuY3VlbnRyZW4gZXhwcmVzYWRhcyBjb24gZWwgbWVzIGRlIG1hcnpvIDIwMTkgPSAxMDAuIERlIGVzdGEgZm9ybWEgcG9kcmVtb3MgY29tcGFyYXIgbGEgZXZvbHVjacOzbiBkZSBhbWJhcy4gRXN0byBsbyBoYWNlbW9zIG1vZGlmaWNhbmRvIGxhcyBzZXJpZXMgY29uIGxhcyBxdWUgY29udGFtb3MgZGl2aWRpZW5kbyB0b2RvcyBsb3MgdmFsb3JlcyBwb3IgZWwgcHJpbWVybyBkZSBlbGxvcyAoeSBtdWx0aXBsaWNhbmRvIHBvciAxMDApLiBMYSBzZWxlY2Npw7NuIGRlbCBwcmltZXIgZWxlbWVudG8gZGUgbGEgc2VyaWUgc2UgcmVhbGl6w7MgY29uIGxhIGZ1bmNpw7NuIGBmaXJzdCgpYC4KCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KYmFzZTEwMCA8LSBzZXJpZV9pbmZsYWNpb24gJT4lIAogIG11dGF0ZShgTml2ZWwgR2VuZXJhbGAgPSBgTml2ZWwgR2VuZXJhbGAvZmlyc3QoYE5pdmVsIEdlbmVyYWxgKSAqIDEwMCwKICAgICAgICAgYEFsaW1lbnRvcyB5IGJlYmlkYXMgbm8gYWxjb2jDs2xpY2FzYCA9IGBBbGltZW50b3MgeSBiZWJpZGFzIG5vIGFsY29ow7NsaWNhc2AvCiAgICAgICAgICAgZmlyc3QoYEFsaW1lbnRvcyB5IGJlYmlkYXMgbm8gYWxjb2jDs2xpY2FzYCkgKiAxMDAsCiAgICAgICAgIFNhbHVkID0gU2FsdWQvZmlyc3QoU2FsdWQpICogMTAwKQoKaGVhZChiYXNlMTAwKQpgYGAKCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KcGdtXzEwMCA8LSBwcmVjaW9zX3BnbSAlPiUgCiAgbXV0YXRlKFRvYWxsaXRhcyA9IFRvYWxsaXRhcy9maXJzdChUb2FsbGl0YXMpICogMTAwLAogICAgICAgICBUYW1wb25lcyA9IFRhbXBvbmVzL2ZpcnN0KFRhbXBvbmVzKSAqIDEwMCkKCmhlYWQocGdtXzEwMCkKYGBgCgpQb2RlbW9zIGFuZXhhciBsYSBldm9sdWNpw7NuIGRlIGxvcyBwcmVjaW9zIGRlIGxvcyBwcm9kdWN0b3MgZGUgZ2VzdGnDs24gbWVuc3RydWFsIGEgbGEgc2VyaWUgZGUgaW5mbGFjacOzbiwgcG9yIG3DoXMgcXVlIGVzdGEgw7psdGltYSB0ZW5nYSB2YWxvcmVzIG1lbnN1YWxlcyB5IG51ZXN0cm9zIGRhdG9zIHNlIGhheWFuIHJlY29sZWN0YWRvIGNhZGEgc2VpcyBtZXNlcywgdXRpbGl6YW5kbyBgTWVzYCBjb21vIHZhcmlhYmxlIGRlIGxpbmsuIEx1ZWdvIHJlb3JkZW5hbW9zIGxhIGluZm9ybWFjacOzbiBwYXJhIHF1ZSB0b2RhcyBsYXMgdmFyaWFibGVzLCBleGNlcHRvIGBNZXNgLCBzZSBwcmVzZW50ZW4gZW4gdW5hIHZhcmlhYmxlIGBDYXRlZ29yw61hYCAoY29uIHZhbG9yZXMgIk5pdmVsIEdlbmVyYWwiLCAiU2FsdWQiLCAiVG9hbGxpdGFzIiwgZXRjLiksIHkgbG9zIHZhbG9yZXMgZGUgY2FkYSBzZXJpZSBzZSBhZ3J1cGVuIGVuIGxhIHZhcmlhYmxlIGBJbmRpY2VgLiBObyBoYWJyw6EgZGF0b3MgZW4gZGl2ZXJzb3MgbWVzZXMgcGFyYSB0b2FsbGl0YXMgeSB0YW1wb25lcywgYXPDrSBxdWUgZmlsdHJhbW9zIGVzYXMgZmlsYXMgdmFjw61hcywgeSBmaW5hbG1lbnRlIGNyZWFtb3MgbGEgdmFyaWFibGUgYEdydXBvYCBwYXJhIGlkZW50aWZpY2FyIGNvbW8gIklQQyIgYSBsYXMgY2F0ZWdvcsOtYXMgZGVsIMOtbmRpY2UgZGUgcHJlY2lvcyBhbCBjb25zdW1pZG9yLCB5IGNvbW8gIlBHTSIgYSBsb3MgcHJvZHVjdG9zIGRlIGdlc3Rpw7NuIG1lbnN0cnVhbC4KCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBFc3RvIHNlIHB1ZWRlIGNvcnJlciAiZGUgYSBwb2NvIiBwYXJhIHZlciBjw7NtbyBjYW1iaWFuIGxhcyBjb3NhcyBlbiBjYWRhIHBhc28KYmFzZTEwMCA8LSBiYXNlMTAwICU+JSAKICBsZWZ0X2pvaW4oLiwgcGdtXzEwMCwgYnkgPSAiTWVzIikgJT4lIAogIHBpdm90X2xvbmdlcigtTWVzLCBuYW1lc190byA9ICJDYXRlZ29yaWEiLCB2YWx1ZXNfdG8gPSAiSW5kaWNlIikgJT4lIAogIGZpbHRlcighaXMubmEoSW5kaWNlKSkgJT4lIAogIG11dGF0ZShHcnVwbyA9IGNhc2Vfd2hlbihDYXRlZ29yaWEgJWluJSBjKCJOaXZlbCBHZW5lcmFsIiwgIkFsaW1lbnRvcyB5IGJlYmlkYXMgbm8gYWxjb2jDs2xpY2FzIiwgIlNhbHVkIikgfiAiSVBDIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2F0ZWdvcmlhICVpbiUgYygiVG9hbGxpdGFzIiwgIlRhbXBvbmVzIikgfiAiUEdNIikpCgpoZWFkKGJhc2UxMDApCmBgYAoKQSBmaW5lcyBkZSBncmFmaWNhciBlc3RhIGluZm9ybWFjacOzbiwgcG9yIGVzdGEgdmV6IHNlIHByZXNjaW5kZSBkZSBsYSBzZXJpZSBkZSAiQWxpbWVudG9zIHkgYmVkaWRhcyBubyBhbGNvaMOzbGljYXMiIHBvcnF1ZSBubyBhZ3JlZ2EgdGFudGEgaW5mb3JtYWNpw7NuIGVuIGxhIGNvbXBhcmFiaWxpZGFkLCB5IHPDrSBvY3VwYSBlc3BhY2lvIHZpc3VhbCBxdWUgcHVlZGUgb2JzdHJ1aXIgbGEgY29tcGFyYWNpw7NuIGRlIGxhcyBkZW3DoXMgc2VyaWVzLgoKYGBge3IgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpiYXNlMTAwYmlzIDwtIGJhc2UxMDAgJT4lIAogIGZpbHRlcihDYXRlZ29yaWEgIT0gIkFsaW1lbnRvcyB5IGJlYmlkYXMgbm8gYWxjb2jDs2xpY2FzIikKYGBgCgpQYXJhIGVsIGdyw6FmaWNvIHB1ZWRvIGRlZmluaXIgdW4gdmVjdG9yIGRlIGNvbG9yZXMgcXVlIHNpcnZhIHBhcmEgZGlzdGluZ3VpciBsYXMgc2VyaWVzIGRlIElQQyAoZW4gbGEgZ2FtYSBkZSBhenVsZXMpIHkgbGFzIGRlIHByb2R1Y3RvcyBkZSBnZXN0acOzbiBtZW5zdHJ1YWwgKGVuIGxhIGdhbWEgZGVsIHJvam8pLgoKYGBge3IgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpjb2xvcmNpdG9zIDwtIGMoJ3JveWFsYmx1ZTQnLCAncm95YWxibHVlJywgCiAgICAgICAgICAgICAgICAndmlvbGV0cmVkJywgJ3JlZCcpCmBgYAoKRmluYWxtZW50ZSwgZGVmaW5pbW9zIG51ZXN0cm8gZ3LDoWZpY28uIFRvbWFuZG8gbGEgdGFibGEgYGJhc2UxMDBiaXNgLCAKCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeShnZ3JlcGVsKQoKZ2dwbG90KGJhc2UxMDBiaXMsIGFlcyh4ID0gTWVzLCB5ID0gSW5kaWNlLCBncm91cCA9IENhdGVnb3JpYSwgY29sb3IgPSBDYXRlZ29yaWEpKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBiYXNlMTAwYmlzICU+JSBmaWx0ZXIoR3J1cG8gPT0gIlBHTSIpLCBzaXplID0gMSwgYWxwaGEgPSAxKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBiYXNlMTAwYmlzICU+JSBmaWx0ZXIoR3J1cG8gPT0gIklQQyIpLCBhbHBoYSA9IDEsIHNpemUgPSAxKSArCiAgZ2VvbV9wb2ludChkYXRhID0gYmFzZTEwMGJpcyAlPiUgZmlsdGVyKEdydXBvID09ICJQR00iKSwgc2l6ZSA9IDIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvcmNpdG9zKSArCiAgZXhwYW5kX2xpbWl0cyh4ID0gYXMuUE9TSVhjdChjKCIyMDE5LTAzLTAxIiwgIjIwMjAtMTEtMDEiKSkpICsgCiAgbGFicyh0aXRsZSA9ICJJbmZsYWNpw7NuIGRlIFRvYWxsaXRhcyB5IFRhbXBvbmVzIHZzLiBTYWx1ZCB5IE5pdmVsIEdlbmVyYWwgZGVsIElQQy1JTkRFQyIsCiAgICAgICBzdWJ0aXRsZSA9ICJNYXJ6byAyMDE5IC0gTWFyem8gMjAyMSIsCiAgICAgICB4ID0gIiIsCiAgICAgICB5ID0gIkluZGljZSBkZSBwcmVjaW9zIiwKICAgICAgIGNhcHRpb24gPSAiRnVlbnRlOiAjTWVuc3RydUFjY2nDs24geSAjRWNvRmVtaURhdGEgKEVjb0ZlbWluaXRhKSIpICsKICBzY2FsZV94X2RhdGV0aW1lKGJyZWFrcyA9IHNlcShhcy5QT1NJWGN0KCcyMDE5LTAzLTAxJyksIGJ5PSc2IG1vbnRocycsIGxlbmd0aCA9IDUpLAogICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiMDMtMjAxOSIsICIwOS0yMDE5IiwgIjAzLTIwMjAiLCAiMDktMjAyMCIsICIwMy0yMDIxIikpCmBgYAoKCgoKCgoKCgoKCgoKCgoK