Librerias

library(WDI)
library(wbstats)
library(ggplot2)
library(gplots)
library(plm)
library(tidyverse)
library(readxl)
library(WDI)
library(wbstats)
library(ggplot2)
library(gplots)
library(plm)
library(lmtest)
library(pglm)

1. Código sesiones 2, 3 y 4

Analisis de Datos de Panel

Información de paises e indicadores

### A. Obtener la información de 1 país
PIB_MEX <- wb_data(country = "MX", indicator = "NY.GDP.PCAP.CD",
                   start_date = 1900, end_date = 2025)

summary(PIB_MEX)
##     iso2c              iso3c             country               date     
##  Length:64          Length:64          Length:64          Min.   :1960  
##  Class :character   Class :character   Class :character   1st Qu.:1976  
##  Mode  :character   Mode  :character   Mode  :character   Median :1992  
##                                                           Mean   :1992  
##                                                           3rd Qu.:2007  
##                                                           Max.   :2023  
##  NY.GDP.PCAP.CD        unit            obs_status          footnote        
##  Min.   :  355.1   Length:64          Length:64          Length:64         
##  1st Qu.: 1427.8   Class :character   Class :character   Class :character  
##  Median : 4006.5   Mode  :character   Mode  :character   Mode  :character  
##  Mean   : 5097.1                                                           
##  3rd Qu.: 8905.4                                                           
##  Max.   :13790.0                                                           
##   last_updated       
##  Min.   :2025-01-28  
##  1st Qu.:2025-01-28  
##  Median :2025-01-28  
##  Mean   :2025-01-28  
##  3rd Qu.:2025-01-28  
##  Max.   :2025-01-28
ggplot(PIB_MEX, aes(x= date, y=NY.GDP.PCAP.CD)) + 
  geom_point() +
  geom_line()+
  labs(title = "PIB per Capita en México (Current USD)", x = "Año", y ="Valor")

### B. Obtener la información de varios países
PIB_PANEL <- wb_data(country = c("MX","US", "CA"), indicator = "NY.GDP.PCAP.CD",
                   start_date = 1900, end_date = 2025)
summary(PIB_PANEL)
##     iso2c              iso3c             country               date     
##  Length:192         Length:192         Length:192         Min.   :1960  
##  Class :character   Class :character   Class :character   1st Qu.:1976  
##  Mode  :character   Mode  :character   Mode  :character   Median :1992  
##                                                           Mean   :1992  
##                                                           3rd Qu.:2007  
##                                                           Max.   :2023  
##  NY.GDP.PCAP.CD        unit            obs_status          footnote        
##  Min.   :  355.1   Length:192         Length:192         Length:192        
##  1st Qu.: 4059.2   Class :character   Class :character   Class :character  
##  Median :10544.4   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :19152.2                                                           
##  3rd Qu.:29010.1                                                           
##  Max.   :82769.4                                                           
##   last_updated       
##  Min.   :2025-01-28  
##  1st Qu.:2025-01-28  
##  Median :2025-01-28  
##  Mean   :2025-01-28  
##  3rd Qu.:2025-01-28  
##  Max.   :2025-01-28
ggplot(PIB_PANEL, aes(x= date, y=NY.GDP.PCAP.CD, color=iso3c)) + 
  geom_point() +
  geom_line()+
  labs(title = "PIB per Capita en Norteamérica (Current USD)", x = "Año", y ="Valor")

### C. Obtener la información de varios indicadores en varios países

MEGAPIB <- wb_data(country = c("MX","US", "CA"), indicator = c("NY.GDP.PCAP.CD", "SP.DYN.LE00.IN"),
                   start_date = 1900, end_date = 2025)

summary(MEGAPIB)
##     iso2c              iso3c             country               date     
##  Length:192         Length:192         Length:192         Min.   :1960  
##  Class :character   Class :character   Class :character   1st Qu.:1976  
##  Mode  :character   Mode  :character   Mode  :character   Median :1992  
##                                                           Mean   :1992  
##                                                           3rd Qu.:2007  
##                                                           Max.   :2023  
##                                                                         
##  NY.GDP.PCAP.CD    SP.DYN.LE00.IN 
##  Min.   :  355.1   Min.   :55.02  
##  1st Qu.: 4059.2   1st Qu.:71.11  
##  Median :10544.4   Median :74.36  
##  Mean   :19152.2   Mean   :73.41  
##  3rd Qu.:29010.1   3rd Qu.:77.49  
##  Max.   :82769.4   Max.   :82.22  
##                    NA's   :3
### D. Heterogeneidad - Variación entre individuos
plotmeans(NY.GDP.PCAP.CD ~ country, main = "Heterogeneidad entre países", xlab = "País", ylab = "PIB per Capita", data = MEGAPIB)

Interpretación: - Alta Heterogenidad: Si los puntos (medias) están muy separados entre países. - Baja Heterogenidad: Si los puntos (medias) están muy cerca uno de otros. - En este caso, EUA y Canadá tienen un PIB per Cápita mayor que México, mostrando alta heterogenidad entre países.

Modelos y Prueba de Hausman

datos_panel <- pdata.frame(PIB_PANEL, index = c("country", "date"))

#Modelo de efectos fijos
modelo_efectos_fijos <- plm(NY.GDP.PCAP.CD ~ date, data=datos_panel, model = "within")

#Modelo de efectos aleatorios
modelo_efectos_aleatorios <- plm(NY.GDP.PCAP.CD ~ date, data=datos_panel, model ="random")

#Prueba de hausman
phtest(modelo_efectos_fijos, modelo_efectos_aleatorios)
## 
##  Hausman Test
## 
## data:  NY.GDP.PCAP.CD ~ date
## chisq = 2.1185e-13, df = 63, p-value = 1
## alternative hypothesis: one model is inconsistent
#Como el p-value es mayor a 0.05, usamos el modelo de efectos aleatorios

3. Código Sesión 5

Actividad Patentes

Importar Base de Datos

patentes <- read_excel("/Users/genarorodriguezalcantara/Desktop/Tec/Generacion de escenarios futuros con analítica (Gpo 101)/PIB/PATENT 3.xls")

Entender Base de Datos

summary(patentes)
##      cusip            merger           employ            return       
##  Min.   :   800   Min.   :0.0000   Min.   :  0.085   Min.   :-73.022  
##  1st Qu.:368514   1st Qu.:0.0000   1st Qu.:  1.227   1st Qu.:  5.128  
##  Median :501116   Median :0.0000   Median :  3.842   Median :  7.585  
##  Mean   :514536   Mean   :0.0177   Mean   : 18.826   Mean   :  8.003  
##  3rd Qu.:754688   3rd Qu.:0.0000   3rd Qu.: 15.442   3rd Qu.: 10.501  
##  Max.   :878555   Max.   :1.0000   Max.   :506.531   Max.   : 48.675  
##                                    NA's   :21        NA's   :8        
##     patents         patentsg           stckpr              rnd           
##  Min.   :  0.0   Min.   :   0.00   Min.   :  0.1875   Min.   :   0.0000  
##  1st Qu.:  1.0   1st Qu.:   1.00   1st Qu.:  7.6250   1st Qu.:   0.6847  
##  Median :  3.0   Median :   4.00   Median : 16.5000   Median :   2.1456  
##  Mean   : 22.9   Mean   :  27.14   Mean   : 22.6270   Mean   :  29.3398  
##  3rd Qu.: 15.0   3rd Qu.:  19.00   3rd Qu.: 29.2500   3rd Qu.:  11.9168  
##  Max.   :906.0   Max.   :1063.00   Max.   :402.0000   Max.   :1719.3535  
##                                    NA's   :2                             
##     rndeflt             rndstck             sales               sic      
##  Min.   :   0.0000   Min.   :   0.125   Min.   :    1.22   Min.   :2000  
##  1st Qu.:   0.4788   1st Qu.:   5.152   1st Qu.:   52.99   1st Qu.:2890  
##  Median :   1.4764   Median :  13.353   Median :  174.06   Median :3531  
##  Mean   :  19.7238   Mean   : 163.823   Mean   : 1219.60   Mean   :3333  
##  3rd Qu.:   8.7527   3rd Qu.:  74.563   3rd Qu.:  728.96   3rd Qu.:3661  
##  Max.   :1000.7876   Max.   :9755.352   Max.   :44224.00   Max.   :9997  
##                      NA's   :157        NA's   :3                        
##       year     
##  Min.   :2012  
##  1st Qu.:2014  
##  Median :2016  
##  Mean   :2016  
##  3rd Qu.:2019  
##  Max.   :2021  
## 
sum(is.na(patentes)) #contas NAs
## [1] 191
sapply(patentes, function(x) sum(is.na(x)))
##    cusip   merger   employ   return  patents patentsg   stckpr      rnd 
##        0        0       21        8        0        0        2        0 
##  rndeflt  rndstck    sales      sic     year 
##        0      157        3        0        0
patentes1 <- na.omit(patentes)

A. Construcción del modelo de datos en panel

panel_patentes <- pdata.frame(patentes1, index = c("cusip", "year"))

B. Modelo de Efectos Fijos y Aleatorios

Modelo de efectos fijos

modelo_efectos_fijos_patentes <- plm(patents ~ merger + employ + return + patentsg + stckpr + rnd + rndeflt + sales + sic, data = panel_patentes, model = "within")

Modelo de efectos aleatorios

modelo_efectos_aleatorios_patentes <- plm(patents ~ merger + employ + return + patentsg + stckpr + rnd + rndeflt + sales + sic, data = panel_patentes, model ="random")

Prueba de hausman

phtest(modelo_efectos_fijos_patentes, modelo_efectos_aleatorios_patentes)
## 
##  Hausman Test
## 
## data:  patents ~ merger + employ + return + patentsg + stckpr + rnd +  ...
## chisq = 917.76, df = 8, p-value < 2.2e-16
## alternative hypothesis: one model is inconsistent

C. Pruebas de heterocedasticidad y autocorrelación serial

Prueba de Heterocedasticidad para el model de efectos fijos

bptest(modelo_efectos_aleatorios_patentes)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo_efectos_aleatorios_patentes
## BP = 616, df = 9, p-value < 2.2e-16
# como el pvalue es < 0.05, hay heterocedasticidad en los residuos

Prueba de Heterocedasticidad para el model de efectos aleatorios

bptest(modelo_efectos_aleatorios_patentes)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo_efectos_aleatorios_patentes
## BP = 616, df = 9, p-value < 2.2e-16
# como el pvalue es < 0.05, hay heterocedasticidad en los residuos

pwartest(modelo_efectos_fijos_patentes)
## 
##  Wooldridge's test for serial correlation in FE panels
## 
## data:  modelo_efectos_fijos_patentes
## F = 73.741, df1 = 1, df2 = 1866, p-value < 2.2e-16
## alternative hypothesis: serial correlation
# como el pvalue es < 0.05, hay autocorrelación serial en los errores

pbnftest(modelo_efectos_aleatorios_patentes)
## 
##  modified Bhargava/Franzini/Narendranathan Panel Durbin-Watson Test
## 
## data:  patents ~ merger + employ + return + patentsg + stckpr + rnd +  ...
## DW = 0.89311
## alternative hypothesis: serial correlation in idiosyncratic errors
# como el valor es de < 1.5, hay autocorrelación positiva significativa

D. Correción del modelo con errores estandar robustos

coeficientes_corregidos <- coeftest(modelo_efectos_fijos_patentes, vcov=vcovHC(modelo_efectos_fijos_patentes, type = "HC0"))

solo_coeficientes <- coeficientes_corregidos[,1]

E. Generar Pronósticos y evaluar modelo

datos_de_prueba <- data.frame(merger=0, employ=10, return=6, patentsg=24, stckpr=48, rnd=3, rndeflt=3, rndstck=16, sales=344)

prediction <- sum(solo_coeficientes*c(datos_de_prueba$merger, datos_de_prueba$employ, datos_de_prueba$return, datos_de_prueba$patentsg, datos_de_prueba$stckpr, datos_de_prueba$rnd, datos_de_prueba$rndeflt, datos_de_prueba$sales))

prediction
## [1] -5.620776
LS0tCnRpdGxlOiAiQWN0aXZkYWQgMS4gQW7DoWxpc2lzIHkgYXBsaWNhY2nDs24gZGUgZGF0b3MgcGFuZWwiCmF1dGhvcjogIkdlbmFybyBSb2Ryw61ndWV6IEFsY8OhbnRhcmEgLSBBMDA4MzMxNzIiCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OiAKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiBUUlVFCiAgICB0b2NfZmxvYXQ6IFRSVUUKICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUKICAgIHRoZW1lOiBjZXJ1bGVhbgotLS0KCiFbXSgvVXNlcnMvZ2VuYXJvcm9kcmlndWV6YWxjYW50YXJhL0Rlc2t0b3AvVGVjL0dlbmVyYWNpb24gZGUgZXNjZW5hcmlvcyBmdXR1cm9zIGNvbiBhbmFsacyBdGljYSAoR3BvIDEwMSkvUElCL2R2c19jb21wKy0rQ3JhaWcrVGF5bG9yLmdpZikKCiMgTGlicmVyaWFzCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkoV0RJKQpsaWJyYXJ5KHdic3RhdHMpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShncGxvdHMpCmxpYnJhcnkocGxtKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShyZWFkeGwpCmxpYnJhcnkoV0RJKQpsaWJyYXJ5KHdic3RhdHMpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShncGxvdHMpCmxpYnJhcnkocGxtKQpsaWJyYXJ5KGxtdGVzdCkKbGlicmFyeShwZ2xtKQpgYGAKCiMgMS4gQ8OzZGlnbyBzZXNpb25lcyAyLCAzIHkgNAojIyBBbmFsaXNpcyBkZSBEYXRvcyBkZSBQYW5lbAojIyMgSW5mb3JtYWNpw7NuIGRlIHBhaXNlcyBlIGluZGljYWRvcmVzCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMjIyBBLiBPYnRlbmVyIGxhIGluZm9ybWFjacOzbiBkZSAxIHBhw61zClBJQl9NRVggPC0gd2JfZGF0YShjb3VudHJ5ID0gIk1YIiwgaW5kaWNhdG9yID0gIk5ZLkdEUC5QQ0FQLkNEIiwKICAgICAgICAgICAgICAgICAgIHN0YXJ0X2RhdGUgPSAxOTAwLCBlbmRfZGF0ZSA9IDIwMjUpCgpzdW1tYXJ5KFBJQl9NRVgpCmBgYAoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZ2dwbG90KFBJQl9NRVgsIGFlcyh4PSBkYXRlLCB5PU5ZLkdEUC5QQ0FQLkNEKSkgKyAKICBnZW9tX3BvaW50KCkgKwogIGdlb21fbGluZSgpKwogIGxhYnModGl0bGUgPSAiUElCIHBlciBDYXBpdGEgZW4gTcOpeGljbyAoQ3VycmVudCBVU0QpIiwgeCA9ICJBw7FvIiwgeSA9IlZhbG9yIikKYGBgCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIyMgQi4gT2J0ZW5lciBsYSBpbmZvcm1hY2nDs24gZGUgdmFyaW9zIHBhw61zZXMKUElCX1BBTkVMIDwtIHdiX2RhdGEoY291bnRyeSA9IGMoIk1YIiwiVVMiLCAiQ0EiKSwgaW5kaWNhdG9yID0gIk5ZLkdEUC5QQ0FQLkNEIiwKICAgICAgICAgICAgICAgICAgIHN0YXJ0X2RhdGUgPSAxOTAwLCBlbmRfZGF0ZSA9IDIwMjUpCnN1bW1hcnkoUElCX1BBTkVMKQpgYGAKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmdncGxvdChQSUJfUEFORUwsIGFlcyh4PSBkYXRlLCB5PU5ZLkdEUC5QQ0FQLkNELCBjb2xvcj1pc28zYykpICsgCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2xpbmUoKSsKICBsYWJzKHRpdGxlID0gIlBJQiBwZXIgQ2FwaXRhIGVuIE5vcnRlYW3DqXJpY2EgKEN1cnJlbnQgVVNEKSIsIHggPSAiQcOxbyIsIHkgPSJWYWxvciIpCmBgYAoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyMjIEMuIE9idGVuZXIgbGEgaW5mb3JtYWNpw7NuIGRlIHZhcmlvcyBpbmRpY2Fkb3JlcyBlbiB2YXJpb3MgcGHDrXNlcwoKTUVHQVBJQiA8LSB3Yl9kYXRhKGNvdW50cnkgPSBjKCJNWCIsIlVTIiwgIkNBIiksIGluZGljYXRvciA9IGMoIk5ZLkdEUC5QQ0FQLkNEIiwgIlNQLkRZTi5MRTAwLklOIiksCiAgICAgICAgICAgICAgICAgICBzdGFydF9kYXRlID0gMTkwMCwgZW5kX2RhdGUgPSAyMDI1KQoKc3VtbWFyeShNRUdBUElCKQpgYGAKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMjIyBELiBIZXRlcm9nZW5laWRhZCAtIFZhcmlhY2nDs24gZW50cmUgaW5kaXZpZHVvcwpwbG90bWVhbnMoTlkuR0RQLlBDQVAuQ0QgfiBjb3VudHJ5LCBtYWluID0gIkhldGVyb2dlbmVpZGFkIGVudHJlIHBhw61zZXMiLCB4bGFiID0gIlBhw61zIiwgeWxhYiA9ICJQSUIgcGVyIENhcGl0YSIsIGRhdGEgPSBNRUdBUElCKQpgYGAKSW50ZXJwcmV0YWNpw7NuOgotIEFsdGEgSGV0ZXJvZ2VuaWRhZDogU2kgbG9zIHB1bnRvcyAobWVkaWFzKSBlc3TDoW4gbXV5IHNlcGFyYWRvcyBlbnRyZSBwYcOtc2VzLgotIEJhamEgSGV0ZXJvZ2VuaWRhZDogU2kgbG9zIHB1bnRvcyAobWVkaWFzKSBlc3TDoW4gbXV5IGNlcmNhIHVubyBkZSBvdHJvcy4KLSBFbiBlc3RlIGNhc28sIEVVQSB5IENhbmFkw6EgdGllbmVuIHVuIFBJQiBwZXIgQ8OhcGl0YSBtYXlvciBxdWUgTcOpeGljbywgbW9zdHJhbmRvIGFsdGEgaGV0ZXJvZ2VuaWRhZCBlbnRyZSBwYcOtc2VzLgoKIyMjIE1vZGVsb3MgeSBQcnVlYmEgZGUgSGF1c21hbgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpkYXRvc19wYW5lbCA8LSBwZGF0YS5mcmFtZShQSUJfUEFORUwsIGluZGV4ID0gYygiY291bnRyeSIsICJkYXRlIikpCgojTW9kZWxvIGRlIGVmZWN0b3MgZmlqb3MKbW9kZWxvX2VmZWN0b3NfZmlqb3MgPC0gcGxtKE5ZLkdEUC5QQ0FQLkNEIH4gZGF0ZSwgZGF0YT1kYXRvc19wYW5lbCwgbW9kZWwgPSAid2l0aGluIikKCiNNb2RlbG8gZGUgZWZlY3RvcyBhbGVhdG9yaW9zCm1vZGVsb19lZmVjdG9zX2FsZWF0b3Jpb3MgPC0gcGxtKE5ZLkdEUC5QQ0FQLkNEIH4gZGF0ZSwgZGF0YT1kYXRvc19wYW5lbCwgbW9kZWwgPSJyYW5kb20iKQoKI1BydWViYSBkZSBoYXVzbWFuCnBodGVzdChtb2RlbG9fZWZlY3Rvc19maWpvcywgbW9kZWxvX2VmZWN0b3NfYWxlYXRvcmlvcykKCiNDb21vIGVsIHAtdmFsdWUgZXMgbWF5b3IgYSAwLjA1LCB1c2Ftb3MgZWwgbW9kZWxvIGRlIGVmZWN0b3MgYWxlYXRvcmlvcwpgYGAKCiMgMi4gTGluayBBcGxpY2FjacOzbiBTaGlueQpbSW5kaWNhZG9yZXMgQmFuY28gTXVuZGlhbF0gKGh0dHBzOi8vYTAwODMzMTcyLnNoaW55YXBwcy5pby9QSUJCLykKCiMgMy4gQ8OzZGlnbyBTZXNpw7NuIDUKIyMgQWN0aXZpZGFkIFBhdGVudGVzCiMjIyBJbXBvcnRhciBCYXNlIGRlIERhdG9zCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnBhdGVudGVzIDwtIHJlYWRfZXhjZWwoIi9Vc2Vycy9nZW5hcm9yb2RyaWd1ZXphbGNhbnRhcmEvRGVza3RvcC9UZWMvR2VuZXJhY2lvbiBkZSBlc2NlbmFyaW9zIGZ1dHVyb3MgY29uIGFuYWxpzIF0aWNhIChHcG8gMTAxKS9QSUIvUEFURU5UIDMueGxzIikKYGBgCgojIyMgRW50ZW5kZXIgQmFzZSBkZSBEYXRvcwpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpzdW1tYXJ5KHBhdGVudGVzKQpzdW0oaXMubmEocGF0ZW50ZXMpKSAjY29udGFzIE5BcwpzYXBwbHkocGF0ZW50ZXMsIGZ1bmN0aW9uKHgpIHN1bShpcy5uYSh4KSkpCnBhdGVudGVzMSA8LSBuYS5vbWl0KHBhdGVudGVzKQpgYGAKCiMjIyBBLiBDb25zdHJ1Y2Npw7NuIGRlbCBtb2RlbG8gZGUgZGF0b3MgZW4gcGFuZWwKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KcGFuZWxfcGF0ZW50ZXMgPC0gcGRhdGEuZnJhbWUocGF0ZW50ZXMxLCBpbmRleCA9IGMoImN1c2lwIiwgInllYXIiKSkKYGBgCgojIyMgQi4gTW9kZWxvIGRlIEVmZWN0b3MgRmlqb3MgeSBBbGVhdG9yaW9zCiMjIyMgTW9kZWxvIGRlIGVmZWN0b3MgZmlqb3MKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbW9kZWxvX2VmZWN0b3NfZmlqb3NfcGF0ZW50ZXMgPC0gcGxtKHBhdGVudHMgfiBtZXJnZXIgKyBlbXBsb3kgKyByZXR1cm4gKyBwYXRlbnRzZyArIHN0Y2twciArIHJuZCArIHJuZGVmbHQgKyBzYWxlcyArIHNpYywgZGF0YSA9IHBhbmVsX3BhdGVudGVzLCBtb2RlbCA9ICJ3aXRoaW4iKQpgYGAKCiMjIyMgTW9kZWxvIGRlIGVmZWN0b3MgYWxlYXRvcmlvcwpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQptb2RlbG9fZWZlY3Rvc19hbGVhdG9yaW9zX3BhdGVudGVzIDwtIHBsbShwYXRlbnRzIH4gbWVyZ2VyICsgZW1wbG95ICsgcmV0dXJuICsgcGF0ZW50c2cgKyBzdGNrcHIgKyBybmQgKyBybmRlZmx0ICsgc2FsZXMgKyBzaWMsIGRhdGEgPSBwYW5lbF9wYXRlbnRlcywgbW9kZWwgPSJyYW5kb20iKQpgYGAKCiMjIyMgUHJ1ZWJhIGRlIGhhdXNtYW4KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KcGh0ZXN0KG1vZGVsb19lZmVjdG9zX2Zpam9zX3BhdGVudGVzLCBtb2RlbG9fZWZlY3Rvc19hbGVhdG9yaW9zX3BhdGVudGVzKQpgYGAKCiMjIyBDLiBQcnVlYmFzIGRlIGhldGVyb2NlZGFzdGljaWRhZCB5IGF1dG9jb3JyZWxhY2nDs24gc2VyaWFsCiMjIyMgUHJ1ZWJhIGRlIEhldGVyb2NlZGFzdGljaWRhZCBwYXJhIGVsIG1vZGVsIGRlIGVmZWN0b3MgZmlqb3MKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KYnB0ZXN0KG1vZGVsb19lZmVjdG9zX2FsZWF0b3Jpb3NfcGF0ZW50ZXMpCiMgY29tbyBlbCBwdmFsdWUgZXMgPCAwLjA1LCBoYXkgaGV0ZXJvY2VkYXN0aWNpZGFkIGVuIGxvcyByZXNpZHVvcwpgYGAKCiMjIyMgUHJ1ZWJhIGRlIEhldGVyb2NlZGFzdGljaWRhZCBwYXJhIGVsIG1vZGVsIGRlIGVmZWN0b3MgYWxlYXRvcmlvcwpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpicHRlc3QobW9kZWxvX2VmZWN0b3NfYWxlYXRvcmlvc19wYXRlbnRlcykKIyBjb21vIGVsIHB2YWx1ZSBlcyA8IDAuMDUsIGhheSBoZXRlcm9jZWRhc3RpY2lkYWQgZW4gbG9zIHJlc2lkdW9zCgpwd2FydGVzdChtb2RlbG9fZWZlY3Rvc19maWpvc19wYXRlbnRlcykKIyBjb21vIGVsIHB2YWx1ZSBlcyA8IDAuMDUsIGhheSBhdXRvY29ycmVsYWNpw7NuIHNlcmlhbCBlbiBsb3MgZXJyb3JlcwoKcGJuZnRlc3QobW9kZWxvX2VmZWN0b3NfYWxlYXRvcmlvc19wYXRlbnRlcykKIyBjb21vIGVsIHZhbG9yIGVzIGRlIDwgMS41LCBoYXkgYXV0b2NvcnJlbGFjacOzbiBwb3NpdGl2YSBzaWduaWZpY2F0aXZhCmBgYAoKIyMjIEQuIENvcnJlY2nDs24gZGVsIG1vZGVsbyBjb24gZXJyb3JlcyBlc3RhbmRhciByb2J1c3RvcwpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpjb2VmaWNpZW50ZXNfY29ycmVnaWRvcyA8LSBjb2VmdGVzdChtb2RlbG9fZWZlY3Rvc19maWpvc19wYXRlbnRlcywgdmNvdj12Y292SEMobW9kZWxvX2VmZWN0b3NfZmlqb3NfcGF0ZW50ZXMsIHR5cGUgPSAiSEMwIikpCgpzb2xvX2NvZWZpY2llbnRlcyA8LSBjb2VmaWNpZW50ZXNfY29ycmVnaWRvc1ssMV0KYGBgCgojIyMgRS4gR2VuZXJhciBQcm9uw7NzdGljb3MgeSBldmFsdWFyIG1vZGVsbwpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpkYXRvc19kZV9wcnVlYmEgPC0gZGF0YS5mcmFtZShtZXJnZXI9MCwgZW1wbG95PTEwLCByZXR1cm49NiwgcGF0ZW50c2c9MjQsIHN0Y2twcj00OCwgcm5kPTMsIHJuZGVmbHQ9Mywgcm5kc3Rjaz0xNiwgc2FsZXM9MzQ0KQoKcHJlZGljdGlvbiA8LSBzdW0oc29sb19jb2VmaWNpZW50ZXMqYyhkYXRvc19kZV9wcnVlYmEkbWVyZ2VyLCBkYXRvc19kZV9wcnVlYmEkZW1wbG95LCBkYXRvc19kZV9wcnVlYmEkcmV0dXJuLCBkYXRvc19kZV9wcnVlYmEkcGF0ZW50c2csIGRhdG9zX2RlX3BydWViYSRzdGNrcHIsIGRhdG9zX2RlX3BydWViYSRybmQsIGRhdG9zX2RlX3BydWViYSRybmRlZmx0LCBkYXRvc19kZV9wcnVlYmEkc2FsZXMpKQoKcHJlZGljdGlvbgpgYGA=