Las notas del presente curso fueron elaboradas originalmente por Diego Kozlowski y Guido Weksler. En las sucesivas modificaciones colaboraron: Natsumi Shokida y Matías Lioni.

Cálculo de Pobreza por Línea

En esta clase abordaremos conceptos teóricos y definiciones metodológicas de la medición “indirecta” de la pobreza, a través del metodo usualmente conococido como “Porbreza por Línea”, acorde a la Metodología n° 22 de INDEC.
Luego, procederemos a realizar una estimación de la incidencia de la pobreza e indigencia por personas.

Conceptos a abordar:

  • Medición indirecta de la satisfacción de necesidades básicas
  • Umbral de necesidades energéticas y proteicas
  • Unidades de Adulto Equivalente
  • Composición de la canasta básica alimentaria (Diferenciación regional)
  • Población de Referencia
  • Coeficiente de Engel
  • Canasta Básica Total
  • Pobreza como fenómeno del hogar
  • Ingreso total familiar

Reiniciar R

Cargamos las librerías necesarias para realizar este ejercicio

library(tidyverse, warn = FALSE)
── Attaching packages ──────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 1.2.1 ──
✔ ggplot2 3.0.0     ✔ purrr   0.2.5
✔ tibble  1.4.2     ✔ dplyr   0.7.6
✔ tidyr   0.8.1     ✔ stringr 1.3.1
✔ readr   1.1.1     ✔ forcats 0.3.0
── Conflicts ─────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
library(openxlsx, warn = FALSE)

Aprovechando la facilidad que presenta el R para trabajar con multiples bases de datos, realizaremos la estimación de la incidencia para 2 trimestres consecutivos. Previo a levantar las bases, definimos un vector que contiene las variables relevantes para el ejercicio. Luego a la hora de levantar aplicamos un select al *dataframe** para conservar solo estas variables. Finalmente, para realizar la estimación conjunta de los dos trimestres, unimos ambas bases de datos

var.ind <- c('CODUSU','NRO_HOGAR' ,'COMPONENTE','ANO4','TRIMESTRE','REGION',
             'AGLOMERADO', 'PONDERA', 'CH04', 'CH06', 'ITF', 'PONDIH','P21')
individual.316 <- read.table("../Fuentes/usu_individual_t316.txt", sep=";", dec=",", header = TRUE, fill = TRUE) %>% 
  select(var.ind)
individual.416 <- read.table("../Fuentes/usu_individual_t416.txt", sep=";", dec=",", header = TRUE, fill = TRUE) %>% 
  select(var.ind)
Bases <- bind_rows(individual.316,individual.416)

A su vez levantaremos las siguientes fuentes secundarias:

  • Unidades de Adulto equivalente según sexo y edad
  • Canasta Básica Alimentaria Regionales de cada una de las regiones
  • Canasta Básica Total Regionales de cada una de las regiones
  • Diccionario de códigos de regiones y aglomerados de EPH

La información de estos cuadros fue extraída del comunicado de pobreza.

Adequi <- read.xlsx("../Fuentes/ADEQUI.xlsx")
CBA    <- read.xlsx("../Fuentes/CANASTAS.xlsx",sheet = "CBA")
CBT    <- read.xlsx("../Fuentes/CANASTAS.xlsx",sheet = "CBT")
dic.regiones <- read.xlsx("../Fuentes/Regiones.xlsx")
CBT
CBA
Adequi
dic.regiones

Canastas Trimestrales por Region

Dado que en las bases de microdatos de EPH no se publica el mes correspondiente a cada uno de los registros individuales, las estimación de pobreza que pueden realizar los usuarios necesariamente debe ser a partir de canastas trimestrales.

Para ello, a partir de los datos mensuales de la Canasta Básica Alimentaria y Total publicados por INDEC, calculamos un valor trimestral de ambas canastas, para un Adulto Equivalente perteneciente a cada una de las regiones. A vez, necesitaremos una tabla que pueda unirse con la base de datos de la EPH para asignar a cada registro, su canasta correspondiente (acorde al trimestre y a la región).

CBA <- CBA %>% 
  mutate(Canasta = 'CBA')
CBT <- CBT %>% 
  mutate(Canasta = 'CBT')
Canastas_Reg <- bind_rows(CBA,CBT)                       %>% 
  gather(.,Region, Valor, c(3:(ncol(.)-1) ))             %>%
  mutate(Trimestre = case_when(Mes %in% c(1:3)   ~1,
                               Mes %in% c(4:6)   ~2,
                               Mes %in% c(7:9)   ~3,
                               Mes %in% c(10:12) ~4),
         Periodo = paste(Año, Trimestre, sep='.'))      
Canastas_Reg

Habiendo agregado el identificador del período, promediamos las canastas de un mismo trimestre y luego le agregamos el código de la region correspondiente que nos permitirá unir este Dataframe con la base de microdatos de la EPH

Canastas_Reg_2 <- Canastas_Reg %>% 
  group_by(Canasta, Region, Periodo)                     %>% 
  summarise(Valor = mean(Valor))                         %>% 
  spread(., Canasta,Valor)                               %>% 
  left_join(., dic.regiones, by = "Region")              %>% 
  ungroup()                                              
Canastas_Reg_2

Unidades de Adulto Equivalente por hogar en la base Individual

  1. Incorporamos a cada registro de nuestra base la Unidad de Adulto Equivalente (UAE) correspondiente, matcheando las columnas de Edad (CH06) y Sexo (CH04) mediante la función left_join.
Pobreza_Individual <- Bases %>% 
  mutate(Periodo = paste(ANO4, TRIMESTRE, sep='.')) %>% 
  left_join(., Adequi, by = c("CH04", "CH06")) %>% 
  left_join(., Canastas_Reg_2, by = c("REGION", "Periodo"))    
Pobreza_Individual
  1. Utilizamos la función group_by para calcular el total de UAE por hogar. Notesé que al usar la función mutate creamos una nueva columna, permitiendo conservar la dimensión individual de la base.
Pobreza_Individual_paso2 <- Pobreza_Individual %>%  
  group_by(CODUSU, NRO_HOGAR, Periodo)                          %>% 
  mutate(Adequi_hogar = sum(adequi))                            %>%
  ungroup()                                                      
Pobreza_Individual_paso2
  1. En base a las UAE del hogar al que pertenece cada individuo calculamos el valor de las canastas que delimitan las lineas de pobreza e indigencia correspondientes.
  2. Realizamos la comparación lógica entre el Ingreso Total Familiar y las Canastas calculadas para asignar a cada individuo su “situación” mediante la función case_when.
Pobreza_Individual_paso3 <-  Pobreza_Individual_paso2 %>% 
 mutate(CBA = CBA*Adequi_hogar,
        CBT = CBT*Adequi_hogar,
        Situacion = case_when(ITF<CBA            ~ 'Indigente',
                               ITF>=CBA & ITF<CBT ~ 'Pobre',
                               ITF>=CBT           ~ 'No.Pobre'))  
Pobreza_Individual_paso3

Cálculo de Tasas de Pobreza e Indigencia

Habiendo identificado a cada persona como pobre, indigente o no pobre el paso final para calcular la incidencia de la pobreza e indigencia requiere realizar un conteo de estos casos (Para lo cual se requiere sumar los ponderadores (PONDIH) de los registros que cumplen con una u otroa condición)

Pobreza_resumen <- Pobreza_Individual_paso3 %>% 
  group_by(Periodo) %>% 
  summarise(Tasa_pobreza    = sum(PONDIH[Situacion %in% c('Pobre', 'Indigente')],na.rm = TRUE)/
                              sum(PONDIH,na.rm = TRUE),
            
            Tasa_indigencia = sum(PONDIH[Situacion == 'Indigente'],na.rm = TRUE)/
                              sum(PONDIH,na.rm = TRUE)) 
Pobreza_resumen

En caso de querer calcular la pobreza para otros subgrupos poblacionales, simplemente se requiere replicar el cálculo con la tabla agrupada según la variable de interés

Pobreza_resumen_region <- Pobreza_Individual_paso3 %>% 
  group_by(Periodo,Region) %>% 
  summarise(Tasa_pobreza    = sum(PONDIH[Situacion %in% c('Pobre', 'Indigente')],na.rm = TRUE)/
                              sum(PONDIH,na.rm = TRUE),
            
            Tasa_indigencia = sum(PONDIH[Situacion == 'Indigente'],na.rm = TRUE)/
                              sum(PONDIH,na.rm = TRUE)) 
Pobreza_resumen_region

Ejercicios Para prácticar

  • Calcular el % de pobreza e indigencia para mujeres y hombres (3 y 4to trimestre 2017)
  • Calcular el % de hogares bajo la linea de pobreza e indigencia, a nivel nacional y abierto por regiones (3 y 4to trimestre 2017)

Ejercicios de tarea

  • Calcular el % de pobreza e indigencia para mujeres y hombres en cada una de las regiones(3 y 4to trimestre 2017)
LS0tCnRpdGxlOiAiVXRpbGl6YWNpw7NuIGRlbCBsZW5ndWFqZSBSIHBhcmEgYXBsaWNhY2nDs24gZW4gbGEgRW5jdWVzdGEgUGVybWFuZW50ZSBkZSBIb2dhcmVzIgpzdWJ0aXRsZTogIkNsYXNlIDMuIFBvYnJlemEgZSBJbmRpZ2VuY2lhLiIKZGF0ZTogIjA2LzEwLzIwMTgiCm91dHB1dDoKICBodG1sX25vdGVib29rOiAKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlIAotLS0KKkxhcyBub3RhcyBkZWwgcHJlc2VudGUgY3Vyc28gZnVlcm9uIGVsYWJvcmFkYXMgb3JpZ2luYWxtZW50ZSBwb3IgRGllZ28gS296bG93c2tpIHkgR3VpZG8gV2Vrc2xlci4gRW4gbGFzIHN1Y2VzaXZhcyBtb2RpZmljYWNpb25lcyBjb2xhYm9yYXJvbjogTmF0c3VtaSBTaG9raWRhIHkgTWF0w61hcyBMaW9uaSouCgojIEPDoWxjdWxvIGRlIFBvYnJlemEgcG9yIEzDrW5lYQoKRW4gZXN0YSBjbGFzZSBhYm9yZGFyZW1vcyBjb25jZXB0b3MgdGXDs3JpY29zIHkgZGVmaW5pY2lvbmVzIG1ldG9kb2zDs2dpY2FzIGRlIGxhIG1lZGljacOzbiAiaW5kaXJlY3RhIiBkZSBsYSBwb2JyZXphLCBhIHRyYXbDqXMgZGVsIG1ldG9kbyB1c3VhbG1lbnRlIGNvbm9jb2NpZG8gY29tbyAiUG9yYnJlemEgcG9yIEzDrW5lYSIsIGFjb3JkZSBhIGxhIFtNZXRvZG9sb2fDrWEgbsKwIDIyIGRlIElOREVDXShodHRwczovL3d3dy5pbmRlYy5nb2IuYXIvZnRwL2N1YWRyb3Mvc29jaWVkYWQvRVBIX21ldG9kb2xvZ2lhXzIyX3BvYnJlemEucGRmXSkuICAKTHVlZ28sIHByb2NlZGVyZW1vcyBhIHJlYWxpemFyIHVuYSBlc3RpbWFjacOzbiBkZSBsYSBpbmNpZGVuY2lhIGRlIGxhIHBvYnJlemEgZSBpbmRpZ2VuY2lhIHBvciBwZXJzb25hcy4KCkNvbmNlcHRvcyBhIGFib3JkYXI6ICAKICAKICAtIE1lZGljacOzbiBpbmRpcmVjdGEgZGUgbGEgc2F0aXNmYWNjacOzbiBkZSBuZWNlc2lkYWRlcyBiw6FzaWNhcwogIC0gVW1icmFsIGRlIG5lY2VzaWRhZGVzIGVuZXJnw6l0aWNhcyB5IHByb3RlaWNhcwogIC0gVW5pZGFkZXMgZGUgQWR1bHRvIEVxdWl2YWxlbnRlCiAgLSBDb21wb3NpY2nDs24gZGUgbGEgY2FuYXN0YSBiw6FzaWNhIGFsaW1lbnRhcmlhIChEaWZlcmVuY2lhY2nDs24gcmVnaW9uYWwpCiAgLSBQb2JsYWNpw7NuIGRlIFJlZmVyZW5jaWEKICAtIENvZWZpY2llbnRlIGRlIEVuZ2VsCiAgLSBDYW5hc3RhIELDoXNpY2EgVG90YWwKICAtIFBvYnJlemEgY29tbyBmZW7Ds21lbm8gZGVsIGhvZ2FyCiAgLSBJbmdyZXNvIHRvdGFsIGZhbWlsaWFyCiAgCgo+IFJlaW5pY2lhciBSCgoKQ2FyZ2Ftb3MgbGFzIGxpYnJlcsOtYXMgbmVjZXNhcmlhcyBwYXJhIHJlYWxpemFyIGVzdGUgZWplcmNpY2lvCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSwgd2FybiA9IEZBTFNFKQpsaWJyYXJ5KG9wZW54bHN4LCB3YXJuID0gRkFMU0UpCmBgYAoKQXByb3ZlY2hhbmRvIGxhIGZhY2lsaWRhZCBxdWUgcHJlc2VudGEgZWwgUiBwYXJhIHRyYWJhamFyIGNvbiBtdWx0aXBsZXMgYmFzZXMgZGUgZGF0b3MsIHJlYWxpemFyZW1vcyBsYSBlc3RpbWFjacOzbiBkZSBsYSBpbmNpZGVuY2lhIHBhcmEgMiB0cmltZXN0cmVzIGNvbnNlY3V0aXZvcy4gUHJldmlvIGEgbGV2YW50YXIgbGFzIGJhc2VzLCBkZWZpbmltb3MgdW4gdmVjdG9yIHF1ZSBjb250aWVuZSBsYXMgdmFyaWFibGVzIHJlbGV2YW50ZXMgcGFyYSBlbCBlamVyY2ljaW8uIEx1ZWdvIGEgbGEgaG9yYSBkZSBsZXZhbnRhciBhcGxpY2Ftb3MgdW4gKipzZWxlY3QqKiBhbCAqZGF0YWZyYW1lKiogcGFyYSBjb25zZXJ2YXIgc29sbyBlc3RhcyB2YXJpYWJsZXMuIEZpbmFsbWVudGUsIHBhcmEgcmVhbGl6YXIgbGEgZXN0aW1hY2nDs24gY29uanVudGEgZGUgbG9zIGRvcyB0cmltZXN0cmVzLCB1bmltb3MgYW1iYXMgYmFzZXMgZGUgZGF0b3MKCmBgYHtyLHdhcm5pbmc9RkFMU0V9CnZhci5pbmQgPC0gYygnQ09EVVNVJywnTlJPX0hPR0FSJyAsJ0NPTVBPTkVOVEUnLCdBTk80JywnVFJJTUVTVFJFJywnUkVHSU9OJywKICAgICAgICAgICAgICdBR0xPTUVSQURPJywgJ1BPTkRFUkEnLCAnQ0gwNCcsICdDSDA2JywgJ0lURicsICdQT05ESUgnLCdQMjEnKQoKaW5kaXZpZHVhbC4zMTYgPC0gcmVhZC50YWJsZSgiLi4vRnVlbnRlcy91c3VfaW5kaXZpZHVhbF90MzE2LnR4dCIsIHNlcD0iOyIsIGRlYz0iLCIsIGhlYWRlciA9IFRSVUUsIGZpbGwgPSBUUlVFKSAlPiUgCiAgc2VsZWN0KHZhci5pbmQpCmluZGl2aWR1YWwuNDE2IDwtIHJlYWQudGFibGUoIi4uL0Z1ZW50ZXMvdXN1X2luZGl2aWR1YWxfdDQxNi50eHQiLCBzZXA9IjsiLCBkZWM9IiwiLCBoZWFkZXIgPSBUUlVFLCBmaWxsID0gVFJVRSkgJT4lIAogIHNlbGVjdCh2YXIuaW5kKQoKQmFzZXMgPC0gYmluZF9yb3dzKGluZGl2aWR1YWwuMzE2LGluZGl2aWR1YWwuNDE2KQoKYGBgCgoKQSBzdSB2ZXogbGV2YW50YXJlbW9zIGxhcyBzaWd1aWVudGVzIGZ1ZW50ZXMgc2VjdW5kYXJpYXM6ICAgICAgICAgCgogLSAgVW5pZGFkZXMgZGUgQWR1bHRvIGVxdWl2YWxlbnRlIHNlZ8O6biBzZXhvIHkgZWRhZCAKIC0gIENhbmFzdGEgQsOhc2ljYSBBbGltZW50YXJpYSBSZWdpb25hbGVzIGRlIGNhZGEgdW5hIGRlIGxhcyByZWdpb25lcyAKIC0gIENhbmFzdGEgQsOhc2ljYSBUb3RhbCBSZWdpb25hbGVzIGRlIGNhZGEgdW5hIGRlIGxhcyByZWdpb25lcyAKIC0gIERpY2Npb25hcmlvIGRlIGPDs2RpZ29zIGRlIHJlZ2lvbmVzIHkgYWdsb21lcmFkb3MgZGUgRVBIICAgICAgICAgCiAKTGEgaW5mb3JtYWNpw7NuIGRlIGVzdG9zIGN1YWRyb3MgZnVlIGV4dHJhw61kYSBkZWwgW2NvbXVuaWNhZG8gZGUgcG9icmV6YV0oaHR0cDovL3d3dy5pbmRlYy5nb2IuYXIvdXBsb2Fkcy9pbmZvcm1lc2RlcHJlbnNhL2VwaF9wb2JyZXphXzAyXzE2LnBkZikuCgpgYGB7cn0KQWRlcXVpIDwtIHJlYWQueGxzeCgiLi4vRnVlbnRlcy9BREVRVUkueGxzeCIpCkNCQSAgICA8LSByZWFkLnhsc3goIi4uL0Z1ZW50ZXMvQ0FOQVNUQVMueGxzeCIsc2hlZXQgPSAiQ0JBIikKQ0JUICAgIDwtIHJlYWQueGxzeCgiLi4vRnVlbnRlcy9DQU5BU1RBUy54bHN4IixzaGVldCA9ICJDQlQiKQpkaWMucmVnaW9uZXMgPC0gcmVhZC54bHN4KCIuLi9GdWVudGVzL1JlZ2lvbmVzLnhsc3giKQoKQ0JUCkNCQQpBZGVxdWkKZGljLnJlZ2lvbmVzCmBgYAoKIyMgQ2FuYXN0YXMgVHJpbWVzdHJhbGVzIHBvciBSZWdpb24KRGFkbyBxdWUgZW4gbGFzIGJhc2VzIGRlIG1pY3JvZGF0b3MgZGUgRVBIIG5vIHNlIHB1YmxpY2EgZWwgbWVzIGNvcnJlc3BvbmRpZW50ZSBhIGNhZGEgdW5vIGRlIGxvcyByZWdpc3Ryb3MgaW5kaXZpZHVhbGVzLCBsYXMgZXN0aW1hY2nDs24gZGUgcG9icmV6YSBxdWUgcHVlZGVuIHJlYWxpemFyIGxvcyB1c3VhcmlvcyBuZWNlc2FyaWFtZW50ZSBkZWJlIHNlciBhIHBhcnRpciBkZSAqKmNhbmFzdGFzIHRyaW1lc3RyYWxlcyoqLgoKUGFyYSBlbGxvLCBhIHBhcnRpciBkZSBsb3MgZGF0b3MgbWVuc3VhbGVzIGRlIGxhIENhbmFzdGEgQsOhc2ljYSBBbGltZW50YXJpYSB5IFRvdGFsIHB1YmxpY2Fkb3MgcG9yIElOREVDLCBjYWxjdWxhbW9zIHVuIHZhbG9yIHRyaW1lc3RyYWwgZGUgYW1iYXMgY2FuYXN0YXMsIHBhcmEgdW4gQWR1bHRvIEVxdWl2YWxlbnRlIHBlcnRlbmVjaWVudGUgYSBjYWRhIHVuYSBkZSBsYXMgcmVnaW9uZXMuIEEgdmV6LCBuZWNlc2l0YXJlbW9zIHVuYSB0YWJsYSBxdWUgcHVlZGEgX3VuaXJzZV8gY29uIGxhIGJhc2UgZGUgZGF0b3MgZGUgbGEgRVBIIHBhcmEgYXNpZ25hciBhIGNhZGEgcmVnaXN0cm8sIHN1IGNhbmFzdGEgY29ycmVzcG9uZGllbnRlIChhY29yZGUgYWwgdHJpbWVzdHJlIHkgYSBsYSByZWdpw7NuKS4gCgpgYGB7cn0KQ0JBIDwtIENCQSAlPiUgCiAgbXV0YXRlKENhbmFzdGEgPSAnQ0JBJykKCkNCVCA8LSBDQlQgJT4lIAogIG11dGF0ZShDYW5hc3RhID0gJ0NCVCcpCgpDYW5hc3Rhc19SZWcgPC0gYmluZF9yb3dzKENCQSxDQlQpICAgICAgICAgICAgICAgICAgICAgICAlPiUgCiAgZ2F0aGVyKC4sUmVnaW9uLCBWYWxvciwgYygzOihuY29sKC4pLTEpICkpICAgICAgICAgICAgICU+JQogIG11dGF0ZShUcmltZXN0cmUgPSBjYXNlX3doZW4oTWVzICVpbiUgYygxOjMpICAgfjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXMgJWluJSBjKDQ6NikgICB+MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lcyAlaW4lIGMoNzo5KSAgIH4zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzICVpbiUgYygxMDoxMikgfjQpLAogICAgICAgICBQZXJpb2RvID0gcGFzdGUoQcOxbywgVHJpbWVzdHJlLCBzZXA9Jy4nKSkgICAgICAKQ2FuYXN0YXNfUmVnCmBgYApIYWJpZW5kbyBhZ3JlZ2FkbyBlbCBpZGVudGlmaWNhZG9yIGRlbCBwZXLDrW9kbywgcHJvbWVkaWFtb3MgbGFzIGNhbmFzdGFzIGRlIHVuIG1pc21vIHRyaW1lc3RyZSB5IGx1ZWdvIGxlIGFncmVnYW1vcyBlbCBjw7NkaWdvIGRlIGxhIHJlZ2lvbiBjb3JyZXNwb25kaWVudGUgcXVlIG5vcyBwZXJtaXRpcsOhIHVuaXIgZXN0ZSAqKkRhdGFmcmFtZSoqIGNvbiBsYSBiYXNlIGRlIG1pY3JvZGF0b3MgZGUgbGEgRVBICmBgYHtyfQpDYW5hc3Rhc19SZWdfMiA8LSBDYW5hc3Rhc19SZWcgJT4lIAogIGdyb3VwX2J5KENhbmFzdGEsIFJlZ2lvbiwgUGVyaW9kbykgICAgICAgICAgICAgICAgICAgICAlPiUgCiAgc3VtbWFyaXNlKFZhbG9yID0gbWVhbihWYWxvcikpICAgICAgICAgICAgICAgICAgICAgICAgICU+JSAKICBzcHJlYWQoLiwgQ2FuYXN0YSxWYWxvcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJT4lIAogIGxlZnRfam9pbiguLCBkaWMucmVnaW9uZXMsIGJ5ID0gIlJlZ2lvbiIpICAgICAgICAgICAgICAlPiUgCiAgdW5ncm91cCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApDYW5hc3Rhc19SZWdfMgpgYGAKCgojI1VuaWRhZGVzIGRlIEFkdWx0byBFcXVpdmFsZW50ZSBwb3IgaG9nYXIgZW4gbGEgYmFzZSBJbmRpdmlkdWFsCgoxLiBJbmNvcnBvcmFtb3MgYSBjYWRhIHJlZ2lzdHJvIGRlIG51ZXN0cmEgYmFzZSBsYSBVbmlkYWQgZGUgQWR1bHRvIEVxdWl2YWxlbnRlIChVQUUpIGNvcnJlc3BvbmRpZW50ZSwgbWF0Y2hlYW5kbyBsYXMgY29sdW1uYXMgZGUgRWRhZCAoQ0gwNikgeSBTZXhvIChDSDA0KSBtZWRpYW50ZSBsYSBmdW5jacOzbiBfX2xlZnRfam9pbl9fLiAgICAgICAgICAgIAoKYGBge3IsIHdhcm5pbmc9RkFMU0V9ClBvYnJlemFfSW5kaXZpZHVhbCA8LSBCYXNlcyAlPiUgCiAgbXV0YXRlKFBlcmlvZG8gPSBwYXN0ZShBTk80LCBUUklNRVNUUkUsIHNlcD0nLicpKSAlPiUgCiAgbGVmdF9qb2luKC4sIEFkZXF1aSwgYnkgPSBjKCJDSDA0IiwgIkNIMDYiKSkgJT4lIAogIGxlZnRfam9pbiguLCBDYW5hc3Rhc19SZWdfMiwgYnkgPSBjKCJSRUdJT04iLCAiUGVyaW9kbyIpKSAgICAKCgpQb2JyZXphX0luZGl2aWR1YWwKYGBgCgoyLiBVdGlsaXphbW9zIGxhIGZ1bmNpw7NuIF9fZ3JvdXBfYnlfXyBwYXJhIGNhbGN1bGFyIGVsIHRvdGFsIGRlIFVBRSBwb3IgaG9nYXIuIE5vdGVzw6kgcXVlIGFsIHVzYXIgbGEgZnVuY2nDs24gX19tdXRhdGVfXyBjcmVhbW9zIHVuYSBudWV2YSBjb2x1bW5hLCBwZXJtaXRpZW5kbyBjb25zZXJ2YXIgbGEgZGltZW5zacOzbiBpbmRpdmlkdWFsIGRlIGxhIGJhc2UuICAgICAgICAgICAgICAKYGBge3IsIHdhcm5pbmc9RkFMU0V9ClBvYnJlemFfSW5kaXZpZHVhbF9wYXNvMiA8LSBQb2JyZXphX0luZGl2aWR1YWwgJT4lICAKICBncm91cF9ieShDT0RVU1UsIE5ST19IT0dBUiwgUGVyaW9kbykgICAgICAgICAgICAgICAgICAgICAgICAgICU+JSAKICBtdXRhdGUoQWRlcXVpX2hvZ2FyID0gc3VtKGFkZXF1aSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICU+JQogIHVuZ3JvdXAoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApQb2JyZXphX0luZGl2aWR1YWxfcGFzbzIKYGBgCgozLiBFbiBiYXNlIGEgbGFzIFVBRSBkZWwgaG9nYXIgYWwgcXVlIHBlcnRlbmVjZSBjYWRhIGluZGl2aWR1byBjYWxjdWxhbW9zIGVsIHZhbG9yIGRlIGxhcyBjYW5hc3RhcyBxdWUgZGVsaW1pdGFuIGxhcyBsaW5lYXMgZGUgcG9icmV6YSBlIGluZGlnZW5jaWEgY29ycmVzcG9uZGllbnRlcy4gCjQuIFJlYWxpemFtb3MgbGEgY29tcGFyYWNpw7NuIGzDs2dpY2EgZW50cmUgZWwgSW5ncmVzbyBUb3RhbCBGYW1pbGlhciB5IGxhcyBDYW5hc3RhcyBjYWxjdWxhZGFzIHBhcmEgYXNpZ25hciBhIGNhZGEgaW5kaXZpZHVvIHN1ICJzaXR1YWNpw7NuIiBtZWRpYW50ZSBsYSBmdW5jacOzbiBfX2Nhc2Vfd2hlbl9fLiAgCmBgYHtyLCB3YXJuaW5nPUZBTFNFfQpQb2JyZXphX0luZGl2aWR1YWxfcGFzbzMgPC0gIFBvYnJlemFfSW5kaXZpZHVhbF9wYXNvMiAlPiUgCiBtdXRhdGUoQ0JBID0gQ0JBKkFkZXF1aV9ob2dhciwKICAgICAgICBDQlQgPSBDQlQqQWRlcXVpX2hvZ2FyLAogICAgICAgIFNpdHVhY2lvbiA9IGNhc2Vfd2hlbihJVEY8Q0JBICAgICAgICAgICAgfiAnSW5kaWdlbnRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElURj49Q0JBICYgSVRGPENCVCB+ICdQb2JyZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVEY+PUNCVCAgICAgICAgICAgfiAnTm8uUG9icmUnKSkgIAoKUG9icmV6YV9JbmRpdmlkdWFsX3Bhc28zCmBgYAojI0PDoWxjdWxvIGRlIFRhc2FzIGRlIFBvYnJlemEgZSBJbmRpZ2VuY2lhCkhhYmllbmRvIGlkZW50aWZpY2FkbyBhIGNhZGEgcGVyc29uYSBjb21vICoqcG9icmUsIGluZGlnZW50ZSBvIG5vIHBvYnJlKiogZWwgcGFzbyBmaW5hbCBwYXJhIGNhbGN1bGFyIGxhIGluY2lkZW5jaWEgZGUgbGEgcG9icmV6YSBlIGluZGlnZW5jaWEgcmVxdWllcmUgcmVhbGl6YXIgdW4gY29udGVvIGRlIGVzdG9zIGNhc29zIChQYXJhIGxvIGN1YWwgc2UgcmVxdWllcmUgc3VtYXIgbG9zIHBvbmRlcmFkb3JlcyAoKipQT05ESUgqKikgZGUgbG9zIHJlZ2lzdHJvcyBxdWUgY3VtcGxlbiBjb24gdW5hIHUgb3Ryb2EgY29uZGljacOzbikKCmBgYHtyfQpQb2JyZXphX3Jlc3VtZW4gPC0gUG9icmV6YV9JbmRpdmlkdWFsX3Bhc28zICU+JSAKICBncm91cF9ieShQZXJpb2RvKSAlPiUgCiAgc3VtbWFyaXNlKFRhc2FfcG9icmV6YSAgICA9IHN1bShQT05ESUhbU2l0dWFjaW9uICVpbiUgYygnUG9icmUnLCAnSW5kaWdlbnRlJyldLG5hLnJtID0gVFJVRSkvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bShQT05ESUgsbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgCiAgICAgICAgICAgIFRhc2FfaW5kaWdlbmNpYSA9IHN1bShQT05ESUhbU2l0dWFjaW9uID09ICdJbmRpZ2VudGUnXSxuYS5ybSA9IFRSVUUpLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0oUE9ORElILG5hLnJtID0gVFJVRSkpIApQb2JyZXphX3Jlc3VtZW4KYGBgCgpFbiBjYXNvIGRlIHF1ZXJlciBjYWxjdWxhciBsYSBwb2JyZXphIHBhcmEgb3Ryb3Mgc3ViZ3J1cG9zIHBvYmxhY2lvbmFsZXMsIHNpbXBsZW1lbnRlIHNlIHJlcXVpZXJlIHJlcGxpY2FyIGVsIGPDoWxjdWxvIGNvbiBsYSB0YWJsYSBhZ3J1cGFkYSBzZWfDum4gbGEgdmFyaWFibGUgZGUgaW50ZXLDqXMKCmBgYHtyfQpQb2JyZXphX3Jlc3VtZW5fcmVnaW9uIDwtIFBvYnJlemFfSW5kaXZpZHVhbF9wYXNvMyAlPiUgCiAgZ3JvdXBfYnkoUGVyaW9kbyxSZWdpb24pICU+JSAKICBzdW1tYXJpc2UoVGFzYV9wb2JyZXphICAgID0gc3VtKFBPTkRJSFtTaXR1YWNpb24gJWluJSBjKCdQb2JyZScsICdJbmRpZ2VudGUnKV0sbmEucm0gPSBUUlVFKS8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtKFBPTkRJSCxuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAKICAgICAgICAgICAgVGFzYV9pbmRpZ2VuY2lhID0gc3VtKFBPTkRJSFtTaXR1YWNpb24gPT0gJ0luZGlnZW50ZSddLG5hLnJtID0gVFJVRSkvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bShQT05ESUgsbmEucm0gPSBUUlVFKSkgClBvYnJlemFfcmVzdW1lbl9yZWdpb24KYGBgCgojRWplcmNpY2lvcyBQYXJhIHByw6FjdGljYXIKIC0gQ2FsY3VsYXIgZWwgJSBkZSBwb2JyZXphIGUgaW5kaWdlbmNpYSBwYXJhIG11amVyZXMgeSBob21icmVzICgzIHkgNHRvIHRyaW1lc3RyZSAyMDE3KQogLSBDYWxjdWxhciBlbCAlIGRlICoqaG9nYXJlcyoqIGJham8gbGEgbGluZWEgZGUgcG9icmV6YSBlIGluZGlnZW5jaWEsIGEgbml2ZWwgbmFjaW9uYWwgeSBhYmllcnRvIHBvciByZWdpb25lcyAoMyB5IDR0byB0cmltZXN0cmUgMjAxNykKCgojRWplcmNpY2lvcyBkZSB0YXJlYQogLSBDYWxjdWxhciBlbCAlIGRlIHBvYnJlemEgZSBpbmRpZ2VuY2lhIHBhcmEgbXVqZXJlcyB5IGhvbWJyZXMgZW4gY2FkYSB1bmEgZGUgbGFzIHJlZ2lvbmVzKDMgeSA0dG8gdHJpbWVzdHJlIDIwMTcpCgoK