Código Sesisón 2, 3, y 4. Análisis de Datos de Panel
library(WDI)
library(wbstats)
library(tidyverse)
library(ggplot2)
library(gplots)
library(plm)
library(lmtest)
library(pglm)
#Información de México
PIB_MEX <- wb_data(country = "MX", indicator = "NY.GDP.PCAP.CD", start_date = 1990, end_date = 2025)
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")

#Información de varios países
PIB_PANEL <- wb_data(country = c("MX", "US", "DK"), indicator = "NY.GDP.PCAP.CD", start_date = 1990, end_date = 2025)
ggplot(PIB_PANEL, aes(x=date, y=NY.GDP.PCAP.CD, color=iso3c)) +
geom_point() +
geom_line() +
labs(title = "PIB per Capita Panel (Current USD$)", x = "Año", y = "Valor")

#Información de varios países e indicadores
VI_PANEL <- wb_data(country = c("MX", "US", "DK"), indicator = c("NY.GDP.PCAP.CD", "SP.DYN.LE00.IN"), start_date = 1990, end_date = 2025)
ggplot(VI_PANEL, aes(x=date, y=NY.GDP.PCAP.CD, color=iso3c)) +
geom_point() +
geom_line() +
labs(title = "PIB per Capita Panel (Current USD$)", x = "Año", y = "Valor")

#Heterogeneidad: Variación entre individuos
plotmeans(NY.GDP.PCAP.CD ~ country, main = "Heterogeneidad entre países", xlab = "País", ylab = "PIB per Capita", data = VI_PANEL)

#Alta Heterogeneida: Si los puntos (medias) están muy separados entre sí.
#MODELOS DE EFECTO FIJO Y ALEATORIOS
#Paso 1. Convertir la base de datos a formato de panel
datos_panel <- pdata.frame(PIB_PANEL, index = c("country", "date"))
#Modelo de Efectos Fijos
modelo_efecto_fijo <- plm(NY.GDP.PCAP.CD ~ date, data = datos_panel, model = "within")
summary(modelo_efecto_fijo)
## Oneway (individual) effect Within Model
##
## Call:
## plm(formula = NY.GDP.PCAP.CD ~ date, data = datos_panel, model = "within")
##
## Balanced Panel: n = 3, T = 34, N = 102
##
## Residuals:
## Min. 1st Qu. Median 3rd Qu. Max.
## -15362.18 -4826.15 -700.84 5571.86 15709.61
##
## Coefficients:
## Estimate Std. Error t-value Pr(>|t|)
## date1991 375.05 6499.90 0.0577 0.9541617
## date1992 1763.43 6499.90 0.2713 0.7870066
## date1993 2029.53 6499.90 0.3122 0.7558421
## date1994 3312.09 6499.90 0.5096 0.6120589
## date1995 4755.69 6499.90 0.7317 0.4669682
## date1996 5445.10 6499.90 0.8377 0.4052111
## date1997 5292.53 6499.90 0.8142 0.4184310
## date1998 6034.70 6499.90 0.9284 0.3565682
## date1999 6837.61 6499.90 1.0520 0.2966562
## date2000 6882.42 6499.90 1.0588 0.2935281
## date2001 7308.70 6499.90 1.1244 0.2649026
## date2002 8436.39 6499.90 1.2979 0.1988305
## date2003 11171.57 6499.90 1.7187 0.0903514 .
## date2004 14090.20 6499.90 2.1678 0.0337889 *
## date2005 15930.73 6499.90 2.4509 0.0169060 *
## date2006 18001.68 6499.90 2.7695 0.0072818 **
## date2007 20962.48 6499.90 3.2250 0.0019602 **
## date2008 23260.58 6499.90 3.5786 0.0006534 ***
## date2009 20034.17 6499.90 3.0822 0.0029968 **
## date2010 20851.75 6499.90 3.2080 0.0020632 **
## date2011 22870.48 6499.90 3.5186 0.0007910 ***
## date2012 22347.85 6499.90 3.4382 0.0010188 **
## date2013 24025.13 6499.90 3.6962 0.0004469 ***
## date2014 25095.79 6499.90 3.8610 0.0002597 ***
## date2015 22075.56 6499.90 3.3963 0.0011609 **
## date2016 22625.57 6499.90 3.4809 0.0008909 ***
## date2017 24521.44 6499.90 3.7726 0.0003480 ***
## date2018 26893.95 6499.90 4.1376 0.0001015 ***
## date2019 27149.91 6499.90 4.1770 8.855e-05 ***
## date2020 26769.79 6499.90 4.1185 0.0001084 ***
## date2021 32477.19 6499.90 4.9966 4.547e-06 ***
## date2022 34527.71 6499.90 5.3120 1.371e-06 ***
## date2023 37028.18 6499.90 5.6967 3.075e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Total Sum of Squares: 1.5466e+10
## Residual Sum of Squares: 4182600000
## R-Squared: 0.72956
## Adj. R-Squared: 0.58615
## F-statistic: 5.39549 on 33 and 66 DF, p-value: 3.151e-09
#Modelo de Efectos Aleatorios
modelo_efecto_aleatorio <- plm(NY.GDP.PCAP.CD ~ date, data = datos_panel, model = "random")
summary(modelo_efecto_aleatorio)
## Oneway (individual) effect Random Effect Model
## (Swamy-Arora's transformation)
##
## Call:
## plm(formula = NY.GDP.PCAP.CD ~ date, data = datos_panel, model = "random")
##
## Balanced Panel: n = 3, T = 34, N = 102
##
## Effects:
## var std.dev share
## idiosyncratic 63373056 7961 0.112
## individual 500147856 22364 0.888
## theta: 0.9391
##
## Residuals:
## Min. 1st Qu. Median 3rd Qu. Max.
## -16937.44 -4810.28 -561.29 5934.15 16444.19
##
## Coefficients:
## Estimate Std. Error z-value Pr(>|z|)
## (Intercept) 17976.26 13705.48 1.3116 0.1896516
## date1991 375.05 6499.90 0.0577 0.9539874
## date1992 1763.43 6499.90 0.2713 0.7861599
## date1993 2029.53 6499.90 0.3122 0.7548577
## date1994 3312.09 6499.90 0.5096 0.6103593
## date1995 4755.69 6499.90 0.7317 0.4643782
## date1996 5445.10 6499.90 0.8377 0.4021877
## date1997 5292.53 6499.90 0.8142 0.4155028
## date1998 6034.70 6499.90 0.9284 0.3531851
## date1999 6837.61 6499.90 1.0520 0.2928199
## date2000 6882.42 6499.90 1.0588 0.2896682
## date2001 7308.70 6499.90 1.1244 0.2608297
## date2002 8436.39 6499.90 1.2979 0.1943127
## date2003 11171.57 6499.90 1.7187 0.0856637 .
## date2004 14090.20 6499.90 2.1678 0.0301773 *
## date2005 15930.73 6499.90 2.4509 0.0142492 *
## date2006 18001.68 6499.90 2.7695 0.0056137 **
## date2007 20962.48 6499.90 3.2250 0.0012595 **
## date2008 23260.58 6499.90 3.5786 0.0003454 ***
## date2009 20034.17 6499.90 3.0822 0.0020546 **
## date2010 20851.75 6499.90 3.2080 0.0013366 **
## date2011 22870.48 6499.90 3.5186 0.0004338 ***
## date2012 22347.85 6499.90 3.4382 0.0005856 ***
## date2013 24025.13 6499.90 3.6962 0.0002188 ***
## date2014 25095.79 6499.90 3.8610 0.0001129 ***
## date2015 22075.56 6499.90 3.3963 0.0006831 ***
## date2016 22625.57 6499.90 3.4809 0.0004997 ***
## date2017 24521.44 6499.90 3.7726 0.0001616 ***
## date2018 26893.95 6499.90 4.1376 3.510e-05 ***
## date2019 27149.91 6499.90 4.1770 2.954e-05 ***
## date2020 26769.79 6499.90 4.1185 3.814e-05 ***
## date2021 32477.19 6499.90 4.9966 5.836e-07 ***
## date2022 34527.71 6499.90 5.3120 1.084e-07 ***
## date2023 37028.18 6499.90 5.6967 1.221e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Total Sum of Squares: 1.5593e+10
## Residual Sum of Squares: 4309400000
## R-Squared: 0.72363
## Adj. R-Squared: 0.58952
## Chisq: 178.051 on 33 DF, p-value: < 2.22e-16
#Prueba de Hausman
phtest(modelo_efecto_fijo, modelo_efecto_aleatorio)
##
## Hausman Test
##
## data: NY.GDP.PCAP.CD ~ date
## chisq = 1.3283e-13, df = 33, p-value = 1
## alternative hypothesis: one model is inconsistent
#Como el p-value es mayor a 0.05, usamos el modelo de Efectos Aleatorios
Actividad de Patentes
Importar la base de datos
library(readxl)
patentes <- read_xls("/Users/lishdz/Desktop/8vo/periodo 1/modulo 1 - r/PATENT 3.xls")
Entender la 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))
## [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)
Construir base de datos tipo panel
patentes_panel <- pdata.frame(patentes1, index = c("cusip", "year"))
Modelo de Efectos Fijos y Aleatorios
#Modelo de Efectos Fijos
modelo_efecto_fijo_patentes <- plm(patents ~ merger + employ + return + patentsg + stckpr + rnd + rndeflt + rndstck + sales + sic, data = patentes_panel, model = "within")
summary(modelo_efecto_fijo_patentes)
## Oneway (individual) effect Within Model
##
## Call:
## plm(formula = patents ~ merger + employ + return + patentsg +
## stckpr + rnd + rndeflt + rndstck + sales + sic, data = patentes_panel,
## model = "within")
##
## Unbalanced Panel: n = 215, T = 2-10, N = 2083
##
## Residuals:
## Min. 1st Qu. Median 3rd Qu. Max.
## -468.39577 -1.75634 -0.25666 1.85265 172.64513
##
## Coefficients:
## Estimate Std. Error t-value Pr(>|t|)
## merger 6.02467998 4.30535335 1.3993 0.1619
## employ -0.09095534 0.08057733 -1.1288 0.2591
## return -0.01221444 0.12005904 -0.1017 0.9190
## patentsg 0.03913907 0.02580379 1.5168 0.1295
## stckpr -0.03959771 0.03347713 -1.1828 0.2370
## rnd -2.04101003 0.15053766 -13.5581 < 2.2e-16 ***
## rndeflt 3.25369409 0.22523191 14.4460 < 2.2e-16 ***
## rndstck 0.19724166 0.01808942 10.9037 < 2.2e-16 ***
## sales -0.00188938 0.00041715 -4.5293 6.294e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Total Sum of Squares: 1090400
## Residual Sum of Squares: 714450
## R-Squared: 0.34479
## Adj. R-Squared: 0.2662
## F-statistic: 108.696 on 9 and 1859 DF, p-value: < 2.22e-16
#Modelo de Efectos Aleatorios
modelo_efecto_aleatorio_patentes <- plm(patents ~ merger + employ + return + patentsg + stckpr + rnd + rndeflt + rndstck + sales + sic, data = patentes_panel, model = "random")
summary(modelo_efecto_aleatorio_patentes)
## Oneway (individual) effect Random Effect Model
## (Swamy-Arora's transformation)
##
## Call:
## plm(formula = patents ~ merger + employ + return + patentsg +
## stckpr + rnd + rndeflt + rndstck + sales + sic, data = patentes_panel,
## model = "random")
##
## Unbalanced Panel: n = 215, T = 2-10, N = 2083
##
## Effects:
## var std.dev share
## idiosyncratic 384.3 19.6 1
## individual 0.0 0.0 0
## theta:
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0 0 0 0 0 0
##
## Residuals:
## Min. 1st Qu. Median 3rd Qu. Max.
## -525.42194 -2.59738 -0.31264 1.88763 277.92369
##
## Coefficients:
## Estimate Std. Error z-value Pr(>|z|)
## (Intercept) 1.19864916 2.94181986 0.4075 0.68368
## merger 1.92231907 4.04770404 0.4749 0.63485
## employ 0.12548448 0.03060149 4.1006 4.121e-05 ***
## return 0.06432167 0.10374558 0.6200 0.53526
## patentsg 0.78696226 0.01016726 77.4016 < 2.2e-16 ***
## stckpr 0.00355791 0.02557045 0.1391 0.88934
## rnd -0.18291882 0.04480367 -4.0827 4.452e-05 ***
## rndeflt 0.26805014 0.03877619 6.9128 4.753e-12 ***
## rndstck -0.00122890 0.00628664 -0.1955 0.84502
## sales -0.00054529 0.00025769 -2.1161 0.03434 *
## sic -0.00049485 0.00081918 -0.6041 0.54579
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Total Sum of Squares: 10910000
## Residual Sum of Squares: 1154800
## R-Squared: 0.89416
## Adj. R-Squared: 0.89365
## Chisq: 17504.4 on 10 DF, p-value: < 2.22e-16
#Prueba de Hausman
phtest(modelo_efecto_fijo_patentes, modelo_efecto_aleatorio_patentes)
##
## Hausman Test
##
## data: patents ~ merger + employ + return + patentsg + stckpr + rnd + ...
## chisq = 1104.9, df = 9, p-value < 2.2e-16
## alternative hypothesis: one model is inconsistent
#Como el p-value es mayor a 0.05, usamos el modelo de Efectos Aleatorios
Pueba de heterocedasticidad y autocorrelación
#HETEROCEDASTICIDAD
#Modelos Fijos
bptest(modelo_efecto_fijo_patentes)
##
## studentized Breusch-Pagan test
##
## data: modelo_efecto_fijo_patentes
## BP = 617.25, df = 10, p-value < 2.2e-16
#Como el p-value es < 0.05, hay heterocedasticidad en los residuos.
#Modelo Aleatorio
bptest(modelo_efecto_aleatorio_patentes)
##
## studentized Breusch-Pagan test
##
## data: modelo_efecto_aleatorio_patentes
## BP = 617.25, df = 10, p-value < 2.2e-16
#Como el p-value es < 0.05, hay heterocedasticidad en los residuos.
# AUTOCORRELACIÓN
#Modelos Efecto Fijo
pwartest(modelo_efecto_fijo_patentes)
##
## Wooldridge's test for serial correlation in FE panels
##
## data: modelo_efecto_fijo_patentes
## F = 42.281, df1 = 1, df2 = 1866, p-value = 1.012e-10
## alternative hypothesis: serial correlation
#Como el p-value es < 0.05, hay autocorrelación en los residuos.
#Modelos Efecto Aleatorio
pbnftest(modelo_efecto_aleatorio_patentes)
##
## modified Bhargava/Franzini/Narendranathan Panel Durbin-Watson Test
##
## data: patents ~ merger + employ + return + patentsg + stckpr + rnd + ...
## DW = 1.0069
## alternative hypothesis: serial correlation in idiosyncratic errors
#Como el p-value es menos a 1.5 hay autocorrelación serial.
#Corrección del Modelo con Errores Estándar Robustos
coeficientes_corregidos <- coeftest(modelo_efecto_fijo_patentes, vcov = vcovHC(modelo_efecto_fijo_patentes, type = "HC0"))
solo_coeficientes <- coeficientes_corregidos[, 1]
solo_coeficientes
## merger employ return patentsg stckpr rnd
## 6.024679976 -0.090955344 -0.012214441 0.039139069 -0.039597715 -2.041010028
## rndeflt rndstck sales
## 3.253694087 0.197241659 -0.001889381
4. Generar pronóstico 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)
prediccion <- 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$rndstck, datos_de_prueba$sales))
prediccion
## [1] 4.199779
LS0tCnRpdGxlOiAiQWN0aXZpZGFkIDEiCmF1dGhvcjogIkxpc3NldCBIZXJuw6FuZGV6IEEwMTI4NDYxMSIKZGF0ZTogIjIwMjUtMDItMTMiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogVFJVRQogICAgdG9jX2Zsb2F0OiBUUlVFCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFCiAgICB0aGVtZTogY2VydWxlYW4KLS0tCgohW10oL1VzZXJzL2xpc2hkei9EZXNrdG9wLzh2by9wZXJpb2RvIDEvbW9kdWxvIDEgLSByL2dpcGh5LmdpZikKCiMgQWN0aXZpZGFkIDEuIE1vZGVsbyBFY29ub23DqXRyaWNvCiFbXSgvVXNlcnMvbGlzaGR6L0Rlc2t0b3AvOHZvL3BlcmlvZG8gMS9tb2R1bG8gMSAtIHIvc2NyZWVuLnBuZykKCgojIEPDs2RpZ28gU2VzaXPDs24gMiwgMywgeSA0LiBBbsOhbGlzaXMgZGUgRGF0b3MgZGUgUGFuZWwKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeShXREkpCmxpYnJhcnkod2JzdGF0cykKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShncGxvdHMpCmxpYnJhcnkocGxtKQpsaWJyYXJ5KGxtdGVzdCkKbGlicmFyeShwZ2xtKQoKI0luZm9ybWFjacOzbiBkZSBNw6l4aWNvClBJQl9NRVggPC0gd2JfZGF0YShjb3VudHJ5ID0gIk1YIiwgaW5kaWNhdG9yID0gIk5ZLkdEUC5QQ0FQLkNEIiwgc3RhcnRfZGF0ZSA9IDE5OTAsIGVuZF9kYXRlID0gMjAyNSkKCmdncGxvdChQSUJfTUVYLCBhZXMoeD1kYXRlLCB5PU5ZLkdEUC5QQ0FQLkNEKSkgKyAKICBnZW9tX3BvaW50KCkgKyAKICBnZW9tX2xpbmUoKSArIAogIGxhYnModGl0bGUgPSAiUElCIHBlciBDYXBpdGEgZW4gTcOpeGljbyAoQ3VycmVudCBVU0QkKSIsIHggPSAiQcOxbyIsIHkgPSAiVmFsb3IiKQoKI0luZm9ybWFjacOzbiBkZSB2YXJpb3MgcGHDrXNlcwpQSUJfUEFORUwgPC0gd2JfZGF0YShjb3VudHJ5ID0gYygiTVgiLCAiVVMiLCAiREsiKSwgaW5kaWNhdG9yID0gIk5ZLkdEUC5QQ0FQLkNEIiwgc3RhcnRfZGF0ZSA9IDE5OTAsIGVuZF9kYXRlID0gMjAyNSkKCmdncGxvdChQSUJfUEFORUwsIGFlcyh4PWRhdGUsIHk9TlkuR0RQLlBDQVAuQ0QsIGNvbG9yPWlzbzNjKSkgKyAKICBnZW9tX3BvaW50KCkgKyAKICBnZW9tX2xpbmUoKSArIAogIGxhYnModGl0bGUgPSAiUElCIHBlciBDYXBpdGEgUGFuZWwgKEN1cnJlbnQgVVNEJCkiLCB4ID0gIkHDsW8iLCB5ID0gIlZhbG9yIikKCiNJbmZvcm1hY2nDs24gZGUgdmFyaW9zIHBhw61zZXMgZSBpbmRpY2Fkb3JlcwpWSV9QQU5FTCA8LSB3Yl9kYXRhKGNvdW50cnkgPSBjKCJNWCIsICJVUyIsICJESyIpLCBpbmRpY2F0b3IgPSBjKCJOWS5HRFAuUENBUC5DRCIsICJTUC5EWU4uTEUwMC5JTiIpLCBzdGFydF9kYXRlID0gMTk5MCwgZW5kX2RhdGUgPSAyMDI1KQoKZ2dwbG90KFZJX1BBTkVMLCBhZXMoeD1kYXRlLCB5PU5ZLkdEUC5QQ0FQLkNELCBjb2xvcj1pc28zYykpICsgCiAgZ2VvbV9wb2ludCgpICsgCiAgZ2VvbV9saW5lKCkgKyAKICBsYWJzKHRpdGxlID0gIlBJQiBwZXIgQ2FwaXRhIFBhbmVsIChDdXJyZW50IFVTRCQpIiwgeCA9ICJBw7FvIiwgeSA9ICJWYWxvciIpCgoKI0hldGVyb2dlbmVpZGFkOiBWYXJpYWNpw7NuIGVudHJlIGluZGl2aWR1b3MKcGxvdG1lYW5zKE5ZLkdEUC5QQ0FQLkNEIH4gY291bnRyeSwgbWFpbiA9ICJIZXRlcm9nZW5laWRhZCBlbnRyZSBwYcOtc2VzIiwgeGxhYiA9ICJQYcOtcyIsIHlsYWIgPSAiUElCIHBlciBDYXBpdGEiLCBkYXRhID0gVklfUEFORUwpCgojQWx0YSBIZXRlcm9nZW5laWRhOiBTaSBsb3MgcHVudG9zIChtZWRpYXMpIGVzdMOhbiBtdXkgc2VwYXJhZG9zIGVudHJlIHPDrS4gCgoKI01PREVMT1MgREUgRUZFQ1RPIEZJSk8gWSBBTEVBVE9SSU9TCgojUGFzbyAxLiBDb252ZXJ0aXIgbGEgYmFzZSBkZSBkYXRvcyBhIGZvcm1hdG8gZGUgcGFuZWwKZGF0b3NfcGFuZWwgPC0gcGRhdGEuZnJhbWUoUElCX1BBTkVMLCBpbmRleCA9IGMoImNvdW50cnkiLCAiZGF0ZSIpKQoKI01vZGVsbyBkZSBFZmVjdG9zIEZpam9zCm1vZGVsb19lZmVjdG9fZmlqbyA8LSBwbG0oTlkuR0RQLlBDQVAuQ0QgfiBkYXRlLCBkYXRhID0gZGF0b3NfcGFuZWwsIG1vZGVsID0gIndpdGhpbiIpCnN1bW1hcnkobW9kZWxvX2VmZWN0b19maWpvKQoKI01vZGVsbyBkZSBFZmVjdG9zIEFsZWF0b3Jpb3MKbW9kZWxvX2VmZWN0b19hbGVhdG9yaW8gPC0gcGxtKE5ZLkdEUC5QQ0FQLkNEIH4gZGF0ZSwgZGF0YSA9IGRhdG9zX3BhbmVsLCBtb2RlbCA9ICJyYW5kb20iKQpzdW1tYXJ5KG1vZGVsb19lZmVjdG9fYWxlYXRvcmlvKQoKI1BydWViYSBkZSBIYXVzbWFuCnBodGVzdChtb2RlbG9fZWZlY3RvX2Zpam8sIG1vZGVsb19lZmVjdG9fYWxlYXRvcmlvKQogICNDb21vIGVsIHAtdmFsdWUgZXMgbWF5b3IgYSAwLjA1LCB1c2Ftb3MgZWwgbW9kZWxvIGRlIEVmZWN0b3MgQWxlYXRvcmlvcwoKYGBgCgojIEFwbGljYWNpw7NuIGRlIFNoaW55IChFamVtcGxvIHkgZWplcmNpY2lvIHNlc2nDs24gMyBwb3IgbWVzYXMpCltBcHAgZGUgU2hpbnldKGh0dHBzOi8vbGlzc2V0aGR6LnNoaW55YXBwcy5pby9hcHAyLykKCiMgQWN0aXZpZGFkIGRlIFBhdGVudGVzCgojIyBJbXBvcnRhciBsYSBiYXNlIGRlIGRhdG9zCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkocmVhZHhsKQpwYXRlbnRlcyA8LSByZWFkX3hscygiL1VzZXJzL2xpc2hkei9EZXNrdG9wLzh2by9wZXJpb2RvIDEvbW9kdWxvIDEgLSByL1BBVEVOVCAzLnhscyIpCgpgYGAKCiMjIEVudGVuZGVyIGxhIGJhc2UgZGUgZGF0b3MKYGBge3J9CnN1bW1hcnkocGF0ZW50ZXMpCnN1bShpcy5uYShwYXRlbnRlcykpCnNhcHBseShwYXRlbnRlcywgZnVuY3Rpb24oeCkgc3VtKGlzLm5hKHgpKSkKcGF0ZW50ZXMxIDwtIG5hLm9taXQocGF0ZW50ZXMpCmBgYAoKIyMgQ29uc3RydWlyIGJhc2UgZGUgZGF0b3MgdGlwbyBwYW5lbApgYGB7cn0KcGF0ZW50ZXNfcGFuZWwgPC0gcGRhdGEuZnJhbWUocGF0ZW50ZXMxLCBpbmRleCA9IGMoImN1c2lwIiwgInllYXIiKSkKYGBgCgojIyBNb2RlbG8gZGUgRWZlY3RvcyBGaWpvcyB5IEFsZWF0b3Jpb3MKYGBge3J9CiNNb2RlbG8gZGUgRWZlY3RvcyBGaWpvcwptb2RlbG9fZWZlY3RvX2Zpam9fcGF0ZW50ZXMgPC0gcGxtKHBhdGVudHMgfiBtZXJnZXIgKyBlbXBsb3kgKyByZXR1cm4gKyBwYXRlbnRzZyArIHN0Y2twciArIHJuZCArIHJuZGVmbHQgKyBybmRzdGNrICsgc2FsZXMgKyBzaWMsIGRhdGEgPSBwYXRlbnRlc19wYW5lbCwgbW9kZWwgPSAid2l0aGluIikKc3VtbWFyeShtb2RlbG9fZWZlY3RvX2Zpam9fcGF0ZW50ZXMpCgojTW9kZWxvIGRlIEVmZWN0b3MgQWxlYXRvcmlvcwptb2RlbG9fZWZlY3RvX2FsZWF0b3Jpb19wYXRlbnRlcyA8LSBwbG0ocGF0ZW50cyB+IG1lcmdlciArIGVtcGxveSArIHJldHVybiArIHBhdGVudHNnICsgc3Rja3ByICsgcm5kICsgcm5kZWZsdCArIHJuZHN0Y2sgKyBzYWxlcyArIHNpYywgZGF0YSA9IHBhdGVudGVzX3BhbmVsLCBtb2RlbCA9ICJyYW5kb20iKQpzdW1tYXJ5KG1vZGVsb19lZmVjdG9fYWxlYXRvcmlvX3BhdGVudGVzKQoKI1BydWViYSBkZSBIYXVzbWFuCnBodGVzdChtb2RlbG9fZWZlY3RvX2Zpam9fcGF0ZW50ZXMsIG1vZGVsb19lZmVjdG9fYWxlYXRvcmlvX3BhdGVudGVzKQogICNDb21vIGVsIHAtdmFsdWUgZXMgbWF5b3IgYSAwLjA1LCB1c2Ftb3MgZWwgbW9kZWxvIGRlIEVmZWN0b3MgQWxlYXRvcmlvcwoKYGBgCgojIyBQdWViYSBkZSBoZXRlcm9jZWRhc3RpY2lkYWQgeSBhdXRvY29ycmVsYWNpw7NuCmBgYHtyfQojSEVURVJPQ0VEQVNUSUNJREFECiNNb2RlbG9zIEZpam9zCmJwdGVzdChtb2RlbG9fZWZlY3RvX2Zpam9fcGF0ZW50ZXMpCiAgI0NvbW8gZWwgcC12YWx1ZSBlcyA8IDAuMDUsIGhheSBoZXRlcm9jZWRhc3RpY2lkYWQgZW4gbG9zIHJlc2lkdW9zLgoKI01vZGVsbyBBbGVhdG9yaW8KYnB0ZXN0KG1vZGVsb19lZmVjdG9fYWxlYXRvcmlvX3BhdGVudGVzKQogICNDb21vIGVsIHAtdmFsdWUgZXMgPCAwLjA1LCBoYXkgaGV0ZXJvY2VkYXN0aWNpZGFkIGVuIGxvcyByZXNpZHVvcy4KCiMgQVVUT0NPUlJFTEFDScOTTgojTW9kZWxvcyBFZmVjdG8gRmlqbwpwd2FydGVzdChtb2RlbG9fZWZlY3RvX2Zpam9fcGF0ZW50ZXMpCiAgICAjQ29tbyBlbCBwLXZhbHVlIGVzIDwgMC4wNSwgaGF5IGF1dG9jb3JyZWxhY2nDs24gZW4gbG9zIHJlc2lkdW9zLgoKI01vZGVsb3MgRWZlY3RvIEFsZWF0b3JpbwpwYm5mdGVzdChtb2RlbG9fZWZlY3RvX2FsZWF0b3Jpb19wYXRlbnRlcykKICAjQ29tbyBlbCBwLXZhbHVlIGVzIG1lbm9zIGEgMS41IGhheSBhdXRvY29ycmVsYWNpw7NuIHNlcmlhbC4gCgoKI0NvcnJlY2Npw7NuIGRlbCBNb2RlbG8gY29uIEVycm9yZXMgRXN0w6FuZGFyIFJvYnVzdG9zCmNvZWZpY2llbnRlc19jb3JyZWdpZG9zIDwtIGNvZWZ0ZXN0KG1vZGVsb19lZmVjdG9fZmlqb19wYXRlbnRlcywgdmNvdiA9IHZjb3ZIQyhtb2RlbG9fZWZlY3RvX2Zpam9fcGF0ZW50ZXMsIHR5cGUgPSAiSEMwIikpCgpzb2xvX2NvZWZpY2llbnRlcyA8LSBjb2VmaWNpZW50ZXNfY29ycmVnaWRvc1ssIDFdCnNvbG9fY29lZmljaWVudGVzCmBgYAoKIyMgNC4gR2VuZXJhciBwcm9uw7NzdGljbyB5IGV2YWx1YXIgbW9kZWxvCmBgYHtyfQpkYXRvc19kZV9wcnVlYmEgPC0gZGF0YS5mcmFtZShtZXJnZXI9MCwgZW1wbG95PTEwLCByZXR1cm49NiwgcGF0ZW50c2cgPSAyNCwgc3Rja3ByID0gNDgsIHJuZCA9IDMsIHJuZGVmbHQgPSAzLCBybmRzdGNrID0gMTYsIHNhbGVzID0gMzQ0KQoKcHJlZGljY2lvbiA8LSBzdW0oc29sb19jb2VmaWNpZW50ZXMqYyggZGF0b3NfZGVfcHJ1ZWJhJG1lcmdlciwgZGF0b3NfZGVfcHJ1ZWJhJGVtcGxveSwgZGF0b3NfZGVfcHJ1ZWJhJHJldHVybiwgZGF0b3NfZGVfcHJ1ZWJhJHBhdGVudHNnLCBkYXRvc19kZV9wcnVlYmEkc3Rja3ByLCBkYXRvc19kZV9wcnVlYmEkcm5kLCBkYXRvc19kZV9wcnVlYmEkcm5kZWZsdCwgZGF0b3NfZGVfcHJ1ZWJhJHJuZHN0Y2ssIGRhdG9zX2RlX3BydWViYSRzYWxlcykpCgpwcmVkaWNjaW9uCmBgYAoK