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

Reiniciar R

Datos De Panel

Introducción

En esta clase veremos como construir un pool de datos de panel utilizando múltiples bases de la EPH. El ejercicio consiste en analizar las transiciones individuales entre las distintas categorías y estados ocupacionales. Trabajaremos con un caso sencillo, sin reclasificar a la población en más que las categorías definidas por la EPH. A su vez, para maximizar la cantidad de casos del ejercicio utilizando las bases recientemente publicadas, trabajaremos con transiciones entre trimestres (Aunque en la práctica suelen realizarse paneles anuales para observar más movilidad)

Cargamos la librería tidyverse con la cual trabajaremos para procesar la información

library(tidyverse, warn = FALSE)

Levantamos las Bases Individuales de 4 trimestres publicados.

individual.216 <- read.table("../Fuentes/usu_individual_t216.txt", sep=";", dec=",", header = TRUE, fill = TRUE)
individual.316 <- read.table("../Fuentes/usu_individual_t316.txt", sep=";", dec=",", header = TRUE, fill = TRUE)
individual.416 <- read.table("../Fuentes/usu_individual_t416.txt", sep=";", dec=",", header = TRUE, fill = TRUE)
individual.117 <- read.table("../Fuentes/usu_individual_t117.txt", sep=";", dec=",", header = TRUE, fill = TRUE)

Pasos para la construccion del Panel

  1. Creamos un Vector que contenga unicamente las variables de interés, para recortar luego la base con la funcion select.
  2. Unimos todas las bases con la función bind_rows, seleccionando solo las variables del vector.
  3. Filtramos de la base los casos de no respuesta y acotaremos en este ejercicio el analisis a la población entre 18 y 65 años.
  4. Creamos las categorías de análisis que deseamos observar en distintos perídos.
  5. Armamos un identificador ordinal para los registros de cada trimestre.
  6. Replicamos el dataframe construido y le cambiamos los nombres a todas las variables, a excepción de las que usaremos para identificar a un mismo individuo ( CODUSU, NRO_HOGAR, COMPONENTE).
  7. En la base replicada, modificamos el identificador ordinal en función de la amplitud que deseamos en las observaciones de panel. En nuestro caso como uniremos registros con distancia de 1 trimestre, le restamos 1 a cada valor
  8. Unimos ambas bases con la funcion inner_join que solo nos dejará registros que en ambas bases contengan los mismos CODUSU, NRO_HOGAR, COMPONENTE e identificador ordinal.
  9. Creamos la columna para las consistencias, y luego filtramos la base para eliminar los registros inconsistentes
#Paso 1
var.ind <- c('CODUSU','NRO_HOGAR','COMPONENTE', 'ANO4','TRIMESTRE','ESTADO','CAT_OCUP','PONDERA', 'CH04', 'CH06','P21','PP3E_TOT')
#Paso 2  
Bases_Continua <- bind_rows(
  individual.216  %>% select(var.ind),
  individual.316  %>% select(var.ind),
  individual.416  %>% select(var.ind),
  individual.117  %>% select(var.ind))
#Pasos 3  y 4
Bases_Continua <-  Bases_Continua %>% 
      filter(CH06 %in% c(18:65),ESTADO !=0) %>% 
      mutate(Categoria = case_when(ESTADO %in%  c(3,4)~"Inactivos",
                                   ESTADO   ==  2 ~"Desocupados",
                                   ESTADO   ==  1 & CAT_OCUP == 1 ~"Patrones",
                                   ESTADO   ==  1 & CAT_OCUP == 2 ~"Cuenta Propistas",
                                   ESTADO   ==  1 & CAT_OCUP == 3 ~"Asalariados",
                                   ESTADO   ==  1 & CAT_OCUP == 4 ~"Trabajador familiar s/r",
                              TRUE ~ "Otros"))
#Paso  5
Bases_Continua <- Bases_Continua %>% 
    mutate(Trimestre = paste(ANO4, TRIMESTRE, sep="_")) %>% 
    arrange(Trimestre) %>% 
    mutate(Id_Trimestre = match(Trimestre,unique(Trimestre)))
#Paso 6
Bases_Continua_Replica <- Bases_Continua
names(Bases_Continua_Replica)
 [1] "CODUSU"       "NRO_HOGAR"    "COMPONENTE"   "ANO4"         "TRIMESTRE"   
 [6] "ESTADO"       "CAT_OCUP"     "PONDERA"      "CH04"         "CH06"        
[11] "P21"          "PP3E_TOT"     "Categoria"    "Trimestre"    "Id_Trimestre"
names(Bases_Continua_Replica)[4:(length(Bases_Continua_Replica)-1)] <- 
  paste0(names(Bases_Continua_Replica)[4:(length(Bases_Continua_Replica)-1)],"_t1")
names(Bases_Continua_Replica)
 [1] "CODUSU"       "NRO_HOGAR"    "COMPONENTE"   "ANO4_t1"      "TRIMESTRE_t1"
 [6] "ESTADO_t1"    "CAT_OCUP_t1"  "PONDERA_t1"   "CH04_t1"      "CH06_t1"     
[11] "P21_t1"       "PP3E_TOT_t1"  "Categoria_t1" "Trimestre_t1" "Id_Trimestre"
#Paso 7
Bases_Continua_Replica$Id_Trimestre <- Bases_Continua_Replica$Id_Trimestre - 1
#Pasos 8 y 9
Panel_Continua <- inner_join(Bases_Continua,Bases_Continua_Replica)
Panel_Continua <- Panel_Continua %>% 
    mutate(Consistencia = case_when(abs(CH06_t1-CH06) > 2 |
                                    CH04 != CH04_t1 ~ "inconsistente",
                                    TRUE ~ "consistente")) %>% 
    filter(Consistencia == "consistente")

Matrices de transición

Calculo de probabilidades de transición.

Realizaremos un breve ejercicio para identificar la magnitud relativa de las transiciones entre las distintas categorías ocupacionales. Para ello calculamos la suma ponderada de la cantidad de casos observados para cada posible combinación de Cateogria y Categoria_t1. Luego calcularemos la probabilidad de encontrarse en categoría en t1, condicional a haber pertenecido a las distintas categorías en t0.

Notese que la linea comentada en el medio de la cadena de pipes, nos permitiría iterar rapidamente sobre el procedimiento anterior agregando un filtro. En este ejemplo, podríamos recalcular las proporciones únicamente para aquellas personas que presentan un movimiento de categoría

Gráfico de Matriz de Transición

library(ggthemes)
ggplot(Categorias_transiciones, aes(x = Categoria_t1, 
                                    y = Categoria, fill = Prob_salida,
                                    label =round(Prob_salida*100,2))) +
  labs(title = "Probabilidades de Transicion de hacia las distintas Categorías")+
  geom_tile()+
  geom_text()+
  scale_fill_gradient(low = "grey100", high = "grey30")+
  theme_tufte()

LS0tDQp0aXRsZTogIlV0aWxpemFjacOzbiBkZWwgbGVuZ3VhamUgUiBwYXJhIGFwbGljYWNpw7NuIGVuIGxhIEVuY3Vlc3RhIFBlcm1hbmVudGUgZGUgSG9nYXJlcyINCnN1YnRpdGxlOiAiQ2xhc2UgNi4gUG9vbCBkZSBEYXRvcyBlbiBQYW5lbCB5IE1hdHJpY2VzIGRlIFRyYW5zaWNpw7NuIg0KZGF0ZTogIjcvMTEvMjAxOCINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQotLS0NCiAgICAgICANCipMYXMgbm90YXMgZGVsIHByZXNlbnRlIGN1cnNvIGZ1ZXJvbiBlbGFib3JhZGFzIG9yaWdpbmFsbWVudGUgcG9yIERpZWdvIEtvemxvd3NraSB5IEd1aWRvIFdla3NsZXIuIEVuIGxhcyBzdWNlc2l2YXMgbW9kaWZpY2FjaW9uZXMgY29sYWJvcmFyb246IE5hdHN1bWkgU2hva2lkYSB5IE1hdMOtYXMgTGlvbmkqIA0KICAgICAgICAgICAgICAgICAgICANCj5SZWluaWNpYXIgUg0KDQoNCiNEYXRvcyBEZSBQYW5lbCANCiMjSW50cm9kdWNjacOzbg0KRW4gZXN0YSBjbGFzZSB2ZXJlbW9zIGNvbW8gY29uc3RydWlyIHVuIF9wb29sXyBkZSBkYXRvcyBkZSBwYW5lbCB1dGlsaXphbmRvIG3Dumx0aXBsZXMgYmFzZXMgZGUgbGEgRVBILiBFbCBlamVyY2ljaW8gY29uc2lzdGUgZW4gYW5hbGl6YXIgbGFzIHRyYW5zaWNpb25lcyBpbmRpdmlkdWFsZXMgZW50cmUgbGFzIGRpc3RpbnRhcyBjYXRlZ29yw61hcyB5IGVzdGFkb3Mgb2N1cGFjaW9uYWxlcy4NClRyYWJhamFyZW1vcyBjb24gdW4gY2FzbyBzZW5jaWxsbywgc2luIHJlY2xhc2lmaWNhciBhIGxhIHBvYmxhY2nDs24gZW4gbcOhcyBxdWUgbGFzIGNhdGVnb3LDrWFzIGRlZmluaWRhcyBwb3IgbGEgRVBILiBBIHN1IHZleiwgcGFyYSBtYXhpbWl6YXIgbGEgY2FudGlkYWQgZGUgY2Fzb3MgZGVsIGVqZXJjaWNpbyB1dGlsaXphbmRvIGxhcyBiYXNlcyByZWNpZW50ZW1lbnRlIHB1YmxpY2FkYXMsIHRyYWJhamFyZW1vcyBjb24gdHJhbnNpY2lvbmVzIGVudHJlIHRyaW1lc3RyZXMgKEF1bnF1ZSBlbiBsYSBwcsOhY3RpY2Egc3VlbGVuIHJlYWxpemFyc2UgcGFuZWxlcyBhbnVhbGVzIHBhcmEgb2JzZXJ2YXIgbcOhcyBtb3ZpbGlkYWQpDQogDQpDYXJnYW1vcyBsYSBsaWJyZXLDrWEgX3RpZHl2ZXJzZV8gY29uIGxhIGN1YWwgdHJhYmFqYXJlbW9zIHBhcmEgcHJvY2VzYXIgbGEgaW5mb3JtYWNpw7NuDQoNCmBgYHtyLG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlLCB3YXJuID0gRkFMU0UpDQpgYGANCg0KTGV2YW50YW1vcyBsYXMgQmFzZXMgSW5kaXZpZHVhbGVzIGRlIDQgdHJpbWVzdHJlcyBwdWJsaWNhZG9zLiAgICAgICANCg0KYGBge3J9DQppbmRpdmlkdWFsLjIxNiA8LSByZWFkLnRhYmxlKCIuLi9GdWVudGVzL3VzdV9pbmRpdmlkdWFsX3QyMTYudHh0Iiwgc2VwPSI7IiwgZGVjPSIsIiwgaGVhZGVyID0gVFJVRSwgZmlsbCA9IFRSVUUpDQppbmRpdmlkdWFsLjMxNiA8LSByZWFkLnRhYmxlKCIuLi9GdWVudGVzL3VzdV9pbmRpdmlkdWFsX3QzMTYudHh0Iiwgc2VwPSI7IiwgZGVjPSIsIiwgaGVhZGVyID0gVFJVRSwgZmlsbCA9IFRSVUUpDQppbmRpdmlkdWFsLjQxNiA8LSByZWFkLnRhYmxlKCIuLi9GdWVudGVzL3VzdV9pbmRpdmlkdWFsX3Q0MTYudHh0Iiwgc2VwPSI7IiwgZGVjPSIsIiwgaGVhZGVyID0gVFJVRSwgZmlsbCA9IFRSVUUpDQppbmRpdmlkdWFsLjExNyA8LSByZWFkLnRhYmxlKCIuLi9GdWVudGVzL3VzdV9pbmRpdmlkdWFsX3QxMTcudHh0Iiwgc2VwPSI7IiwgZGVjPSIsIiwgaGVhZGVyID0gVFJVRSwgZmlsbCA9IFRSVUUpDQpgYGANCg0KIyMgUGFzb3MgcGFyYSBsYSBjb25zdHJ1Y2Npb24gZGVsIFBhbmVsDQoxLiBDcmVhbW9zIHVuIFZlY3RvciBxdWUgY29udGVuZ2EgdW5pY2FtZW50ZSBsYXMgdmFyaWFibGVzIGRlIGludGVyw6lzLCBwYXJhIHJlY29ydGFyIGx1ZWdvIGxhIGJhc2UgY29uIGxhIGZ1bmNpb24gX19zZWxlY3RfXy4gICAgICANCjIuIFVuaW1vcyB0b2RhcyBsYXMgYmFzZXMgY29uIGxhIGZ1bmNpw7NuIF9fYmluZF9yb3dzX18sIHNlbGVjY2lvbmFuZG8gc29sbyBsYXMgdmFyaWFibGVzIGRlbCB2ZWN0b3IuDQozLiBGaWx0cmFtb3MgZGUgbGEgYmFzZSBsb3MgY2Fzb3MgZGUgbm8gcmVzcHVlc3RhIHkgYWNvdGFyZW1vcyBlbiBlc3RlIGVqZXJjaWNpbyBlbCBhbmFsaXNpcyBhIGxhIHBvYmxhY2nDs24gZW50cmUgMTggeSA2NSBhw7Fvcy4gIA0KNC4gQ3JlYW1vcyBsYXMgY2F0ZWdvcsOtYXMgZGUgYW7DoWxpc2lzIHF1ZSBkZXNlYW1vcyBvYnNlcnZhciBlbiBkaXN0aW50b3MgcGVyw61kb3MuDQo1LiBBcm1hbW9zIHVuIF9pZGVudGlmaWNhZG9yIG9yZGluYWxfIHBhcmEgbG9zIHJlZ2lzdHJvcyBkZSBjYWRhIHRyaW1lc3RyZS4NCjYuIFJlcGxpY2Ftb3MgZWwgZGF0YWZyYW1lIGNvbnN0cnVpZG8geSBsZSBjYW1iaWFtb3MgbG9zIG5vbWJyZXMgYSB0b2RhcyBsYXMgdmFyaWFibGVzLCBhIGV4Y2VwY2nDs24gZGUgbGFzIHF1ZSB1c2FyZW1vcyBwYXJhIGlkZW50aWZpY2FyIGEgdW4gbWlzbW8gaW5kaXZpZHVvICggX0NPRFVTVV8sIF9OUk9fSE9HQVJfLCBfQ09NUE9ORU5URV8pLg0KNy4gRW4gbGEgYmFzZSByZXBsaWNhZGEsIG1vZGlmaWNhbW9zIGVsIF9pZGVudGlmaWNhZG9yIG9yZGluYWxfIGVuIGZ1bmNpw7NuIGRlIGxhIGFtcGxpdHVkIHF1ZSBkZXNlYW1vcyBlbiBsYXMgb2JzZXJ2YWNpb25lcyBkZSBwYW5lbC4gRW4gbnVlc3RybyBjYXNvIGNvbW8gdW5pcmVtb3MgcmVnaXN0cm9zIGNvbiBkaXN0YW5jaWEgZGUgMSB0cmltZXN0cmUsIGxlIHJlc3RhbW9zIF8xXyBhIGNhZGEgdmFsb3INCjguIFVuaW1vcyBhbWJhcyBiYXNlcyBjb24gbGEgZnVuY2lvbiBfX2lubmVyX2pvaW5fXyBxdWUgc29sbyBub3MgZGVqYXLDoSByZWdpc3Ryb3MgcXVlIGVuIGFtYmFzIGJhc2VzIGNvbnRlbmdhbiBsb3MgbWlzbW9zIF9DT0RVU1VfLCBfTlJPX0hPR0FSXywgX0NPTVBPTkVOVEVfIGUgX2lkZW50aWZpY2Fkb3Igb3JkaW5hbF8uDQo5LiBDcmVhbW9zIGxhIGNvbHVtbmEgcGFyYSBsYXMgY29uc2lzdGVuY2lhcywgeSBsdWVnbyBmaWx0cmFtb3MgbGEgYmFzZSBwYXJhIGVsaW1pbmFyIGxvcyByZWdpc3Ryb3MgaW5jb25zaXN0ZW50ZXMNCmBgYHtyLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCiNQYXNvIDENCnZhci5pbmQgPC0gYygnQ09EVVNVJywnTlJPX0hPR0FSJywnQ09NUE9ORU5URScsICdBTk80JywnVFJJTUVTVFJFJywnRVNUQURPJywnQ0FUX09DVVAnLCdQT05ERVJBJywgJ0NIMDQnLCAnQ0gwNicsJ1AyMScsJ1BQM0VfVE9UJykNCg0KI1Bhc28gMiAgDQpCYXNlc19Db250aW51YSA8LSBiaW5kX3Jvd3MoDQogIGluZGl2aWR1YWwuMjE2ICAlPiUgc2VsZWN0KHZhci5pbmQpLA0KICBpbmRpdmlkdWFsLjMxNiAgJT4lIHNlbGVjdCh2YXIuaW5kKSwNCiAgaW5kaXZpZHVhbC40MTYgICU+JSBzZWxlY3QodmFyLmluZCksDQogIGluZGl2aWR1YWwuMTE3ICAlPiUgc2VsZWN0KHZhci5pbmQpKQ0KI1Bhc29zIDMgIHkgNA0KQmFzZXNfQ29udGludWEgPC0gIEJhc2VzX0NvbnRpbnVhICU+JSANCiAgICAgIGZpbHRlcihDSDA2ICVpbiUgYygxODo2NSksRVNUQURPICE9MCkgJT4lIA0KICAgICAgbXV0YXRlKENhdGVnb3JpYSA9IGNhc2Vfd2hlbihFU1RBRE8gJWluJSAgYygzLDQpfiJJbmFjdGl2b3MiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFU1RBRE8gICA9PSAgMiB+IkRlc29jdXBhZG9zIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVNUQURPICAgPT0gIDEgJiBDQVRfT0NVUCA9PSAxIH4iUGF0cm9uZXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFU1RBRE8gICA9PSAgMSAmIENBVF9PQ1VQID09IDIgfiJDdWVudGEgUHJvcGlzdGFzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVNUQURPICAgPT0gIDEgJiBDQVRfT0NVUCA9PSAzIH4iQXNhbGFyaWFkb3MiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFU1RBRE8gICA9PSAgMSAmIENBVF9PQ1VQID09IDQgfiJUcmFiYWphZG9yIGZhbWlsaWFyIHMvciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gIk90cm9zIikpDQojUGFzbyAgNQ0KQmFzZXNfQ29udGludWEgPC0gQmFzZXNfQ29udGludWEgJT4lIA0KICAgIG11dGF0ZShUcmltZXN0cmUgPSBwYXN0ZShBTk80LCBUUklNRVNUUkUsIHNlcD0iXyIpKSAlPiUgDQogICAgYXJyYW5nZShUcmltZXN0cmUpICU+JSANCiAgICBtdXRhdGUoSWRfVHJpbWVzdHJlID0gbWF0Y2goVHJpbWVzdHJlLHVuaXF1ZShUcmltZXN0cmUpKSkNCg0KI1Bhc28gNg0KQmFzZXNfQ29udGludWFfUmVwbGljYSA8LSBCYXNlc19Db250aW51YQ0KDQpuYW1lcyhCYXNlc19Db250aW51YV9SZXBsaWNhKQ0KDQpuYW1lcyhCYXNlc19Db250aW51YV9SZXBsaWNhKVs0OihsZW5ndGgoQmFzZXNfQ29udGludWFfUmVwbGljYSktMSldIDwtIA0KICBwYXN0ZTAobmFtZXMoQmFzZXNfQ29udGludWFfUmVwbGljYSlbNDoobGVuZ3RoKEJhc2VzX0NvbnRpbnVhX1JlcGxpY2EpLTEpXSwiX3QxIikNCg0KbmFtZXMoQmFzZXNfQ29udGludWFfUmVwbGljYSkNCg0KI1Bhc28gNw0KQmFzZXNfQ29udGludWFfUmVwbGljYSRJZF9UcmltZXN0cmUgPC0gQmFzZXNfQ29udGludWFfUmVwbGljYSRJZF9UcmltZXN0cmUgLSAxDQojUGFzb3MgOCB5IDkNClBhbmVsX0NvbnRpbnVhIDwtIGlubmVyX2pvaW4oQmFzZXNfQ29udGludWEsQmFzZXNfQ29udGludWFfUmVwbGljYSkNClBhbmVsX0NvbnRpbnVhIDwtIFBhbmVsX0NvbnRpbnVhICU+JSANCiAgICBtdXRhdGUoQ29uc2lzdGVuY2lhID0gY2FzZV93aGVuKGFicyhDSDA2X3QxLUNIMDYpID4gMiB8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSDA0ICE9IENIMDRfdDEgfiAiaW5jb25zaXN0ZW50ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gImNvbnNpc3RlbnRlIikpICU+JSANCiAgICBmaWx0ZXIoQ29uc2lzdGVuY2lhID09ICJjb25zaXN0ZW50ZSIpDQpgYGANCg0KI01hdHJpY2VzIGRlIHRyYW5zaWNpw7NuDQojIyBDYWxjdWxvIGRlIHByb2JhYmlsaWRhZGVzIGRlIHRyYW5zaWNpw7NuLiANClJlYWxpemFyZW1vcyB1biBicmV2ZSBlamVyY2ljaW8gcGFyYSBpZGVudGlmaWNhciBsYSBtYWduaXR1ZCByZWxhdGl2YSBkZSBsYXMgdHJhbnNpY2lvbmVzIGVudHJlIGxhcyBkaXN0aW50YXMgY2F0ZWdvcsOtYXMgb2N1cGFjaW9uYWxlcy4gUGFyYSBlbGxvIGNhbGN1bGFtb3MgbGEgc3VtYSBwb25kZXJhZGEgZGUgbGEgY2FudGlkYWQgZGUgY2Fzb3Mgb2JzZXJ2YWRvcyBwYXJhIGNhZGEgcG9zaWJsZSBjb21iaW5hY2nDs24gZGUgX19DYXRlb2dyaWFfXyB5IF9fQ2F0ZWdvcmlhX3QxX18uIEx1ZWdvIGNhbGN1bGFyZW1vcyBsYSBwcm9iYWJpbGlkYWQgZGUgZW5jb250cmFyc2UgZW4gY2F0ZWdvcsOtYSBlbiB0MSwgY29uZGljaW9uYWwgYSBoYWJlciBwZXJ0ZW5lY2lkbyBhIGxhcyBkaXN0aW50YXMgY2F0ZWdvcsOtYXMgZW4gdDAuICANCg0KDQpgYGB7cn0NCkNhdGVnb3JpYXNfdHJhbnNpY2lvbmVzIDwtIFBhbmVsX0NvbnRpbnVhICU+JSANCiAgI2ZpbHRlcihDYXRlZ29yaWEgIT0gQ2F0ZWdvcmlhX3QxKSAlPiUgDQogIGdyb3VwX2J5KENhdGVnb3JpYSxDYXRlZ29yaWFfdDEpICU+JSANCiAgc3VtbWFyaXNlKGZyZWNfbXVlc3RyYWwgPSBuKCksDQogICAgICAgICAgICBmcmVjdWVuY2lhID0gc3VtKChQT05ERVJBK1BPTkRFUkFfdDEpLzIpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGdyb3VwX2J5KENhdGVnb3JpYSkgJT4lIA0KICBtdXRhdGUoUHJvYl9zYWxpZGEgPSBmcmVjdWVuY2lhL3N1bShmcmVjdWVuY2lhKSkNCg0KQ2F0ZWdvcmlhc190cmFuc2ljaW9uZXMNCmBgYA0KTm90ZXNlIHF1ZSBsYSBsaW5lYSBjb21lbnRhZGEgZW4gZWwgbWVkaW8gZGUgbGEgY2FkZW5hIGRlIHBpcGVzLCBub3MgcGVybWl0aXLDrWEgaXRlcmFyIHJhcGlkYW1lbnRlIHNvYnJlIGVsIHByb2NlZGltaWVudG8gYW50ZXJpb3IgYWdyZWdhbmRvIHVuIGZpbHRyby4gRW4gZXN0ZSBlamVtcGxvLCBwb2Ryw61hbW9zIHJlY2FsY3VsYXIgbGFzIHByb3BvcmNpb25lcyDDum5pY2FtZW50ZSBwYXJhIGFxdWVsbGFzIHBlcnNvbmFzIHF1ZSBwcmVzZW50YW4gdW4gbW92aW1pZW50byBkZSBjYXRlZ29yw61hDQoNCiMjR3LDoWZpY28gZGUgTWF0cml6IGRlIFRyYW5zaWNpw7NuDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3RoZW1lcykNCmdncGxvdChDYXRlZ29yaWFzX3RyYW5zaWNpb25lcywgYWVzKHggPSBDYXRlZ29yaWFfdDEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IENhdGVnb3JpYSwgZmlsbCA9IFByb2Jfc2FsaWRhLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPXJvdW5kKFByb2Jfc2FsaWRhKjEwMCwyKSkpICsNCiAgbGFicyh0aXRsZSA9ICJQcm9iYWJpbGlkYWRlcyBkZSBUcmFuc2ljaW9uIGRlIGhhY2lhIGxhcyBkaXN0aW50YXMgQ2F0ZWdvcsOtYXMiKSsNCiAgZ2VvbV90aWxlKCkrDQogIGdlb21fdGV4dCgpKw0KICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9ICJncmV5MTAwIiwgaGlnaCA9ICJncmV5MzAiKSsNCiAgdGhlbWVfdHVmdGUoKQ0KYGBgDQo=