# Instalación de librerías para las actividades
#install.packages("WDI")
library(WDI)
#install.packages("wbstats")
library(wbstats)
#install.packages("tidyverse")
library(tidyverse)
#install.packages("gplots")
library(gplots)
#install.packages("plm")
library(plm)
#install.packages("psych")
library(psych)
#install.packages("xlsx")
library(xlsx)
#install.packages("dplyr")
library(dplyr)
##Para la función filter y lag de dplyr es necesario especificar la librería cuando se use ya que hay un conflicto presentado con la función filter y lag, su uso debería ser de la siguiente manera: dplyr::function(x,...)

#install.packages("readxl")
library(readxl)

Ejercicio 1. Los primeros 3 pasos del Análisis Económico Empírico (5 puntos)

Pregunta de interés

¿Qué factores afectan el precio de un automóvil?

Factor Variable
Costo de los materiales Materias primas
Costo de ensamblaje Costo Operativo
Impuestos gubernamentales Impuestos
Costos de Transporte Transporte

Modelo económico

Precio de un auto = f(Materias primas, Costo Operativo, Impuestos, Transporte)

Fórmula y modelo:

Precio de un auto = 0 + 1 * Materias primas + 2 * Costo Operativo + 3 * Impuestos + 4 * Transporte + μ

En este modelo para calcular el precio de un auto podemos ver las variables Materias Primas, Costo Operativo, Impuestos y Transporte más un error (μ) de ajuste.

Tarea 1. Resumen de 1 cuartilla “Definiciones de Tipos de Datos” (10 puntos)

Datos de Corte Transversal

Los datos de Corte Transversal son datos que se recopilan de un objeto de manera única en un solo punto en el tiempo. Este tipo de datos proporciona una imagen de una población o una muestra en un momento particular. Este tipo de datos es utilizado para proporcionar una imagen en campos como economía, sociología, salud pública e investigación de mercados.

Datos de Series de Tiempo

Una serie de tiempo es una secuencia de observaciones tomadas a intervalos regulares a lo largo del tiempo. Estas observaciones pueden representar cualquier variable que cambie con el tiempo, como ventas mensuales, temperaturas diarias, tasas de interés o precios de acciones. Las series de tiempo se descomponen en componentes clave: tendencia, que muestra la variación a largo plazo; estacionalidad, que refleja patrones repetitivos en ciertos momentos del año; ciclos, que son fluctuaciones más largas que no siguen un patrón fijo; y movimiento irregular, que es el ruido aleatorio. Las series de tiempo se utilizan en pronósticos, análisis económicos, control de calidad y más.

Datos Panel

Los datos de panel, también conocidos como datos longitudinales o datos de series de tiempo de sección transversal, son datos que se derivan de un número de observaciones a lo largo del tiempo en un número de unidades de sección transversal como individuos, hogares, empresas o gobiernos³. Estos datos combinan una dimensión temporal con otra transversal, lo que los diferencia de las series de tiempo que recogen observaciones de un fenómeno a lo largo del tiempo sin considerar la variación entre diferentes unidades. En resumen, los datos de panel permiten analizar patrones a lo largo del tiempo y conectar variables, lo que resulta útil en áreas como la economía, la ciencia y la investigación social.

Fuentes

Ortega, Cristina. “Datos Transversales: Qué Son, Características Y Tipos.” QuestionPro, 8 Jan. 2024, www.questionpro.com/blog/es/datos-transversales/#:~:text=8%20Conclusi%C3%B3n-,%C2%BFQu%C3%A9%20son%20los%20datos%20transversales %3F,muestra%20en%20un%20momento%20particular. Accessed 24 Feb. 2024.

‌Gutiérrez, Juan M. “EL MODELO de DATOS de PANEL.” Todo Econometría Y Ciencia de Datos, 8 Nov. 2020, todoeconometria.com/paneldata1/. Accessed 24 Feb. 2024.

‌“¿Qué Es Una Serie de Tiempo?” Minitab.com, 2023, support.minitab.com/es-mx/minitab/21/help-and-how-to/statistical-modeling/time-series/supporting-topics/basics/what-is-a-time-series/. Accessed 24 Feb. 2024.

R Script “Panel” para obtener Indicadores del Banco Mundial (5 puntos)

Obtención de la base de datos

gdp_data1 <- wb_data(country=c("MX","EC","CA"), indicator = "NY.GDP.PCAP.CD", start_date=2013, end_date=2023)
head(gdp_data1)
## # A tibble: 6 × 9
##   iso2c iso3c country  date NY.GDP.PCAP.CD unit  obs_status footnote
##   <chr> <chr> <chr>   <dbl>          <dbl> <chr> <chr>      <chr>   
## 1 CA    CAN   Canada   2013         52635. <NA>  <NA>       <NA>    
## 2 CA    CAN   Canada   2014         50956. <NA>  <NA>       <NA>    
## 3 CA    CAN   Canada   2015         43596. <NA>  <NA>       <NA>    
## 4 CA    CAN   Canada   2016         42316. <NA>  <NA>       <NA>    
## 5 CA    CAN   Canada   2017         45129. <NA>  <NA>       <NA>    
## 6 CA    CAN   Canada   2018         46549. <NA>  <NA>       <NA>    
## # ℹ 1 more variable: last_updated <date>

Generación de conjunto de datos panel

panel1 <- select(gdp_data1,country, date, NY.GDP.PCAP.CD)
head(panel1)
## # A tibble: 6 × 3
##   country  date NY.GDP.PCAP.CD
##   <chr>   <dbl>          <dbl>
## 1 Canada   2013         52635.
## 2 Canada   2014         50956.
## 3 Canada   2015         43596.
## 4 Canada   2016         42316.
## 5 Canada   2017         45129.
## 6 Canada   2018         46549.

Ejercicio 2. Conjunto de Datos de Panel con Indicadores del Banco Mundial (15 puntos)

Actividad en equipo - Integrantes:

  • Regina Enríquez Chapa (A01721435)

  • Maximiliano Carvajal Huesca (A01552179)

  • Guillermo Cázares Cruz (A01283709)

Obtención de base de datos

gdp_data <- wb_data(country=c("MX","NO","FI","SE","DK"), indicator = c("EN.ATM.CO2E.KT", "EG.FEC.RNEW.ZS", "SP.URB.TOTL.IN.ZS", "AG.LND.AGRI.ZS"), start_date=1950, end_date=2020)

Variables obtenidas en el dataframe

  • EN.ATM.CO2E.KT es Emisiones de CO2 (kt)

  • EG.FEC.RNEW.ZS es Consumo de energía renovable (% del consumo total de energía final)

  • SP.URB.TOTL.IN.ZS es Población urbana (% del total)

  • AG.LND.AGRI.ZS es Tierras agrícolas (% del área de tierra)

Generación de datos panel

panel <- select(gdp_data, country,date,EN.ATM.CO2E.KT,EG.FEC.RNEW.ZS,SP.URB.TOTL.IN.ZS,AG.LND.AGRI.ZS)
panel <- subset(panel, date == 1990 | date == 2000 | date == 2010 | date == 2020)
head(panel)
## # A tibble: 6 × 6
##   country  date EN.ATM.CO2E.KT EG.FEC.RNEW.ZS SP.URB.TOTL.IN.ZS AG.LND.AGRI.ZS
##   <chr>   <dbl>          <dbl>          <dbl>             <dbl>          <dbl>
## 1 Denmark  1990         51978            7.05              84.8          69.7 
## 2 Denmark  2000         52602           10.7               85.1          66.2 
## 3 Denmark  2010         48125.          21.2               86.8          65.6 
## 4 Denmark  2020         27356.          39.7               88.1          65.5 
## 5 Finland  1990         54563.          24.5               79.4           7.86
## 6 Finland  2000         55098.          31.7               82.2           7.28

Identificación de NA’s

na_count <- colSums(is.na(panel))
na_count
##           country              date    EN.ATM.CO2E.KT    EG.FEC.RNEW.ZS 
##                 0                 0                 0                 0 
## SP.URB.TOTL.IN.ZS    AG.LND.AGRI.ZS 
##                 0                 0

No se identificaron NA’s en la base de datos.

Tarea 2. Gráficas de Heterogeneidad (5 puntos)

# Heterogeneidad

# Gráfico para la heterogeneidad por países
plotmeans(EN.ATM.CO2E.KT ~ country, data = panel, main = "Heterogeneidad entre países", xlab = "País", ylab = "Promedio de CO2E (KT)")

# Gráfico para la heterogeneidad por año
plotmeans(EN.ATM.CO2E.KT ~ date, data = panel, main = "Heterogeneidad entre años", xlab = "Año", ylab = "Promedio de CO2E (KT)")

¿La línea que une los promedios es horizontal, o tiene muchos picos?

La primera gráfica muestra heterogeneidad entre países ya que se tiene un pico en México. Por el contrario, la gráfica de años es homogénea pues mantiene promedios con una varianza bastante reducida entre los años.

¿Los intervalos de confianza miden lo mismo, o están desfasados?

Los intervalos de confianza de los países están severamente desfasados, por otro lado, los intervalos de confianza de los años son bastante similares. Esto se puede observar con las líneas azules en cada uno de los puntos de ambas gráficas.

Investiga el concepto de Heterogeneidad y determina si lo que se ve en las gráficas es deseable o no deseable.

El concepto de heterogeneidad se refiere a la diversidad y variabilidad entre distintas entidades dentro de un conjunto o población. Para un estudio, la gráfica de países es deseada debido a que se identifica una diferencia entre México y los demás territorios. Por otro lado, debido a que la gráfica de años mantiene promedios similares no se pueden resaltar observaciones en los cambios de CO2 a través de los años, por lo que se considera que para un estudio, esto no es deseado.

Ejercicio 3. Modelos con Indicadores del Banco Mundial (10 puntos)

Modelo 1. Regresión agrupada (pooled)

pooled <- plm(EN.ATM.CO2E.KT ~ EG.FEC.RNEW.ZS + SP.URB.TOTL.IN.ZS + AG.LND.AGRI.ZS, data = panel, model = "pooling")
summary(pooled)
## Pooling Model
## 
## Call:
## plm(formula = EN.ATM.CO2E.KT ~ EG.FEC.RNEW.ZS + SP.URB.TOTL.IN.ZS + 
##     AG.LND.AGRI.ZS, data = panel, model = "pooling")
## 
## Balanced Panel: n = 5, T = 4, N = 20
## 
## Residuals:
##    Min. 1st Qu.  Median 3rd Qu.    Max. 
## -136648  -52292   -9079   39455  204408 
## 
## Coefficients:
##                     Estimate Std. Error t-value Pr(>|t|)   
## (Intercept)       1222636.00  373989.24  3.2692 0.004822 **
## EG.FEC.RNEW.ZS      -3731.73    1972.73 -1.8917 0.076779 . 
## SP.URB.TOTL.IN.ZS  -12233.92    4689.56 -2.6088 0.019000 * 
## AG.LND.AGRI.ZS        434.16    1376.95  0.3153 0.756605   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    3.6681e+11
## Residual Sum of Squares: 1.5952e+11
## R-Squared:      0.56511
## Adj. R-Squared: 0.48357
## F-statistic: 6.93026 on 3 and 16 DF, p-value: 0.0033436

Modelo 2. Efectos fijos (within)

within <- plm(EN.ATM.CO2E.KT ~ EG.FEC.RNEW.ZS + SP.URB.TOTL.IN.ZS + AG.LND.AGRI.ZS, data = panel, model = "within")
summary(within)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = EN.ATM.CO2E.KT ~ EG.FEC.RNEW.ZS + SP.URB.TOTL.IN.ZS + 
##     AG.LND.AGRI.ZS, data = panel, model = "within")
## 
## Balanced Panel: n = 5, T = 4, N = 20
## 
## Residuals:
##     Min.  1st Qu.   Median  3rd Qu.     Max. 
## -65601.0  -4652.2   -261.2   4404.5  71652.4 
## 
## Coefficients:
##                   Estimate Std. Error t-value Pr(>|t|)  
## EG.FEC.RNEW.ZS     -2325.4     1030.7 -2.2562  0.04351 *
## SP.URB.TOTL.IN.ZS   5630.1     3161.8  1.7807  0.10027  
## AG.LND.AGRI.ZS     -4817.8     7447.1 -0.6469  0.52985  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    2.0033e+10
## Residual Sum of Squares: 1.2546e+10
## R-Squared:      0.37373
## Adj. R-Squared: 0.0083984
## F-statistic: 2.38697 on 3 and 12 DF, p-value: 0.12004

Prueba pF

Prueba de efectos individuales y/o temporales basada en la comparación del modelo within y pooling.

pFtest(within,pooled)
## 
##  F test for individual effects
## 
## data:  EN.ATM.CO2E.KT ~ EG.FEC.RNEW.ZS + SP.URB.TOTL.IN.ZS + AG.LND.AGRI.ZS
## F = 35.144, df1 = 4, df2 = 12, p-value = 1.545e-06
## alternative hypothesis: significant effects

En este caso el modelo pooled es mejor que el de within porque se pueden observar más asteriscos a un lado de las variables, de igual forma la Adjusted R^2 de pooled es más cercana a 1, lo que de igual forma nos indica que es un mejor modelo para el problema.

Modelo 3. Efectos aleatorios (random) - Método walhus

walhus <- plm(EN.ATM.CO2E.KT ~ EG.FEC.RNEW.ZS + SP.URB.TOTL.IN.ZS + AG.LND.AGRI.ZS, data = panel, model = "random", random.method="walhus")
summary(walhus)
## Oneway (individual) effect Random Effect Model 
##    (Wallace-Hussain's transformation)
## 
## Call:
## plm(formula = EN.ATM.CO2E.KT ~ EG.FEC.RNEW.ZS + SP.URB.TOTL.IN.ZS + 
##     AG.LND.AGRI.ZS, data = panel, model = "random", random.method = "walhus")
## 
## Balanced Panel: n = 5, T = 4, N = 20
## 
## Effects:
##                     var   std.dev share
## idiosyncratic 5.456e+09 7.386e+04 0.684
## individual    2.520e+09 5.020e+04 0.316
## theta: 0.4074
## 
## Residuals:
##    Min. 1st Qu.  Median 3rd Qu.    Max. 
## -102642  -34418  -11046   17706  183325 
## 
## Coefficients:
##                    Estimate Std. Error z-value Pr(>|z|)
## (Intercept)       604781.74  377280.91  1.6030   0.1089
## EG.FEC.RNEW.ZS     -2582.41    1898.47 -1.3603   0.1737
## SP.URB.TOTL.IN.ZS  -5293.62    4816.46 -1.0991   0.2717
## AG.LND.AGRI.ZS       908.12    1503.49  0.6040   0.5458
## 
## Total Sum of Squares:    1.418e+11
## Residual Sum of Squares: 9.0765e+10
## R-Squared:      0.35992
## Adj. R-Squared: 0.23991
## Chisq: 8.99696 on 3 DF, p-value: 0.029331

Debido a la falta de asteriscos podemos determinar que este modelo no es un modelo adecuado para el caso, hay que remarcar que la Adjusted R^2 si es mayor que la del modelo within. En esta situación se dará prioridad a la R cuadrada por lo que se determina que el model walhus es mejor.

Modelo 3.1 Efectos aleatorios (random) - Método amemiya

amemiya <- plm(EN.ATM.CO2E.KT ~ EG.FEC.RNEW.ZS + SP.URB.TOTL.IN.ZS + AG.LND.AGRI.ZS, data = panel, model = "random", random.method="amemiya")
summary(amemiya)
## Oneway (individual) effect Random Effect Model 
##    (Amemiya's transformation)
## 
## Call:
## plm(formula = EN.ATM.CO2E.KT ~ EG.FEC.RNEW.ZS + SP.URB.TOTL.IN.ZS + 
##     AG.LND.AGRI.ZS, data = panel, model = "random", random.method = "amemiya")
## 
## Balanced Panel: n = 5, T = 4, N = 20
## 
## Effects:
##                     var   std.dev share
## idiosyncratic 8.364e+08 2.892e+04 0.021
## individual    3.966e+10 1.991e+05 0.979
## theta: 0.9276
## 
## Residuals:
##     Min.  1st Qu.   Median  3rd Qu.     Max. 
## -50889.6  -9549.8  -4287.7   1382.3  91281.3 
## 
## Coefficients:
##                     Estimate Std. Error z-value Pr(>|z|)  
## (Intercept)       -308381.32  259915.46 -1.1865  0.23544  
## EG.FEC.RNEW.ZS      -2236.96     958.68 -2.3334  0.01963 *
## SP.URB.TOTL.IN.ZS    6156.92    2717.24  2.2659  0.02346 *
## AG.LND.AGRI.ZS       -259.79    3193.72 -0.0813  0.93517  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    2.1852e+10
## Residual Sum of Squares: 1.4785e+10
## R-Squared:      0.32339
## Adj. R-Squared: 0.19653
## Chisq: 7.64745 on 3 DF, p-value: 0.053889

Modelo 3.2 Efectos aleatorios (random) - Método nerlove

nerlove <- plm(EN.ATM.CO2E.KT ~ EG.FEC.RNEW.ZS + SP.URB.TOTL.IN.ZS + AG.LND.AGRI.ZS, data = panel, model = "random", random.method="nerlove")
summary(nerlove)
## Oneway (individual) effect Random Effect Model 
##    (Nerlove's transformation)
## 
## Call:
## plm(formula = EN.ATM.CO2E.KT ~ EG.FEC.RNEW.ZS + SP.URB.TOTL.IN.ZS + 
##     AG.LND.AGRI.ZS, data = panel, model = "random", random.method = "nerlove")
## 
## Balanced Panel: n = 5, T = 4, N = 20
## 
## Effects:
##                     var   std.dev share
## idiosyncratic 6.273e+08 2.505e+04 0.012
## individual    4.983e+10 2.232e+05 0.988
## theta: 0.944
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -53402.84  -9145.02  -3809.63    744.93  87580.93 
## 
## Coefficients:
##                     Estimate Std. Error z-value Pr(>|z|)  
## (Intercept)       -294948.37  279648.48 -1.0547  0.29156  
## EG.FEC.RNEW.ZS      -2250.45     936.20 -2.4038  0.01623 *
## SP.URB.TOTL.IN.ZS    6183.64    2682.50  2.3052  0.02116 *
## AG.LND.AGRI.ZS       -810.95    3755.61 -0.2159  0.82904  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    2.1121e+10
## Residual Sum of Squares: 1.4028e+10
## R-Squared:      0.33584
## Adj. R-Squared: 0.21132
## Chisq: 8.09074 on 3 DF, p-value: 0.044173

Prueba de Hausman

Nos permite comparar ambos modelos y establecer qué modelo es más consistente y eficiente.

phtest(amemiya,within)
## 
##  Hausman Test
## 
## data:  EN.ATM.CO2E.KT ~ EG.FEC.RNEW.ZS + SP.URB.TOTL.IN.ZS + AG.LND.AGRI.ZS
## chisq = 0.57227, df = 3, p-value = 0.9028
## alternative hypothesis: one model is inconsistent

Gracias a la prueba de Hausman podemos determinar que un modelo el modelo within mejor que el modelo amemiya, además, la Adjusted R^2 nos ayuda a llegar a la misma conclusión. A pesar de esto, en general el mejor modelo es el pooled.

Tarea 3. Patentes (20 puntos, 5 por cada instrucción)

Actividad en equipo - Integrantes:

  • Regina Enríquez Chapa (A01721435)

  • Maximiliano Carvajal Huesca (A01552179)

  • Guillermo Cázares Cruz (A01283709)

Instalación de librerías

#install.packages("psych")
#install.packages("xlsx")
library(psych)
library(dplyr)
library(readxl)
library(xlsx)

Carga de la base de datos.

patente <- read.csv("PATENT 3 NONA.csv")
patente <- patente[,1:12]

Exploratory Data Analysis (EDA)

#EDA
summary(patente)
##      cusip            merger            employ           return      
##  Min.   :   800   Min.   :0.00000   Min.   :  0.00   Min.   :-73.00  
##  1st Qu.:368514   1st Qu.:0.00000   1st Qu.:  1.00   1st Qu.:  5.00  
##  Median :501026   Median :0.00000   Median :  4.00   Median :  8.00  
##  Mean   :512955   Mean   :0.01778   Mean   : 18.75   Mean   :  8.02  
##  3rd Qu.:750633   3rd Qu.:0.00000   3rd Qu.: 15.00   3rd Qu.: 11.00  
##  Max.   :878555   Max.   :1.00000   Max.   :507.00   Max.   : 49.00  
##     patents       patentsg           stckpr            rnd         
##  Min.   :  0   Min.   :   0.00   Min.   :  0.00   Min.   :   0.00  
##  1st Qu.:  1   1st Qu.:   1.00   1st Qu.:  8.00   1st Qu.:   1.00  
##  Median :  3   Median :   4.00   Median : 17.00   Median :   2.00  
##  Mean   : 23   Mean   :  27.26   Mean   : 22.71   Mean   :  29.44  
##  3rd Qu.: 15   3rd Qu.:  19.00   3rd Qu.: 29.00   3rd Qu.:  12.00  
##  Max.   :906   Max.   :1063.00   Max.   :402.00   Max.   :1719.00  
##     rndeflt            sales               sic            year     
##  Min.   :   0.00   Min.   :    1.00   Min.   :2000   Min.   :2012  
##  1st Qu.:   0.00   1st Qu.:   54.25   1st Qu.:2890   1st Qu.:2014  
##  Median :   1.00   Median :  176.50   Median :3531   Median :2016  
##  Mean   :  19.79   Mean   : 1223.54   Mean   :3334   Mean   :2016  
##  3rd Qu.:   9.00   3rd Qu.:  740.50   3rd Qu.:3661   3rd Qu.:2019  
##  Max.   :1001.00   Max.   :44224.00   Max.   :9997   Max.   :2021
psych::describe(patente)
##          vars    n      mean        sd   median   trimmed       mad  min    max
## cusip       1 2250 512954.81 245828.97 501026.0 526832.04 320323.14  800 878555
## merger      2 2250      0.02      0.13      0.0      0.00      0.00    0      1
## employ      3 2250     18.75     49.96      4.0      8.31      4.45    0    507
## return      4 2250      8.02      5.55      8.0      7.83      4.45  -73     49
## patents     5 2250     23.00     69.91      3.0      8.73      4.45    0    906
## patentsg    6 2250     27.26     79.35      4.0     11.02      5.93    0   1063
## stckpr      7 2250     22.71     25.50     17.0     18.70     14.83    0    402
## rnd         8 2250     29.44    124.66      2.0      6.96      2.97    0   1719
## rndeflt     9 2250     19.79     80.61      1.0      4.83      1.48    0   1001
## sales      10 2250   1223.54   3712.01    176.5    431.68    226.10    1  44224
## sic        11 2250   3334.15    654.47   3531.0   3372.52    269.83 2000   9997
## year       12 2250   2016.50      2.87   2016.5   2016.50      3.71 2012   2021
##           range  skew kurtosis      se
## cusip    877755 -0.31    -0.88 5182.53
## merger        1  7.29    51.22    0.00
## employ      507  6.17    44.41    1.05
## return      122 -0.96    24.82    0.12
## patents     906  7.76    76.94    1.47
## patentsg   1063  7.39    69.84    1.67
## stckpr      402  5.37    52.54    0.54
## rnd        1719  8.98    95.41    2.63
## rndeflt    1001  8.07    73.21    1.70
## sales     44223  6.63    54.32   78.26
## sic        7997  4.18    45.79   13.80
## year          9  0.00    -1.23    0.06

Tratamiento de NA’s

# Código para obtener el % de NA por columna
porcentaje_NA <- colSums(is.na(patente)) / nrow(patente) * 100
# Mostrar el resultado
porcentaje_NA
##    cusip   merger   employ   return  patents patentsg   stckpr      rnd 
##        0        0        0        0        0        0        0        0 
##  rndeflt    sales      sic     year 
##        0        0        0        0

Pruebas de autocorrelación y heteroscedasticidad

plotmeans(patentsg ~ cusip, data = patente, n.label=FALSE, main= "Heterogeneidad entre firmas")

plotmeans(patentsg ~ year, data = patente, n.label=FALSE, main= "Heterogeneidad por años")

Modelo 1. Regresión agrupada (pooled)

pooled1 <- plm(patentsg ~ return + employ + rnd + sales, data = patente, model = "pooling")
## Warning in pdata.frame(data, index): duplicate couples (id-time) in resulting pdata.frame
##  to find out which, use, e.g., table(index(your_pdataframe), useNA = "ifany")
summary(pooled1)
## Pooling Model
## 
## Call:
## plm(formula = patentsg ~ return + employ + rnd + sales, data = patente, 
##     model = "pooling")
## 
## Unbalanced Panel: n = 225, T = 10-10, N = 2250
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -442.5435  -10.5304   -4.6064    1.7056  529.9156 
## 
## Coefficients:
##                Estimate  Std. Error t-value  Pr(>|t|)    
## (Intercept) -2.53818295  2.00364931 -1.2668    0.2054    
## return       0.89882599  0.20031729  4.4870 7.588e-06 ***
## employ       1.50534937  0.04795130 31.3933 < 2.2e-16 ***
## rnd         -0.07849107  0.01848652 -4.2459 2.266e-05 ***
## sales       -0.00271798  0.00054088 -5.0251 5.428e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    14161000
## Residual Sum of Squares: 6169000
## R-Squared:      0.56435
## Adj. R-Squared: 0.56357
## F-statistic: 727.051 on 4 and 2245 DF, p-value: < 2.22e-16

Modelo 2. Efectos fijos (within)

within1 <- plm(patentsg ~ return + employ + rnd + sales, data = patente, model =  "within")
## Warning in pdata.frame(data, index): duplicate couples (id-time) in resulting pdata.frame
##  to find out which, use, e.g., table(index(your_pdataframe), useNA = "ifany")
summary(within1)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = patentsg ~ return + employ + rnd + sales, data = patente, 
##     model = "within")
## 
## Unbalanced Panel: n = 225, T = 10-10, N = 2250
## 
## Residuals:
##       Min.    1st Qu.     Median    3rd Qu.       Max. 
## -218.73410   -1.90671   -0.31204    1.51679  269.88092 
## 
## Coefficients:
##          Estimate Std. Error  t-value  Pr(>|t|)    
## return -0.0032470  0.0897144  -0.0362    0.9711    
## employ -0.0575524  0.0606945  -0.9482    0.3431    
## rnd    -0.1442205  0.0119849 -12.0335 < 2.2e-16 ***
## sales  -0.0015633  0.0003528  -4.4312 9.872e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    715640
## Residual Sum of Squares: 590370
## R-Squared:      0.17504
## Adj. R-Squared: 0.081968
## F-statistic: 107.202 on 4 and 2021 DF, p-value: < 2.22e-16

Prueba pF

pFtest(within1,pooled1)
## 
##  F test for individual effects
## 
## data:  patentsg ~ return + employ + rnd + sales
## F = 85.256, df1 = 224, df2 = 2021, p-value < 2.2e-16
## alternative hypothesis: significant effects

Modelo 3. Efectos aleatorios (random) - Método walhus

walhus1 <- plm(patentsg ~ return + employ + rnd + sales, data = patente, model = "random", random.method="walhus")
## Warning in pdata.frame(data, index): duplicate couples (id-time) in resulting pdata.frame
##  to find out which, use, e.g., table(index(your_pdataframe), useNA = "ifany")
summary(walhus1)
## Oneway (individual) effect Random Effect Model 
##    (Wallace-Hussain's transformation)
## 
## Call:
## plm(formula = patentsg ~ return + employ + rnd + sales, data = patente, 
##     model = "random", random.method = "walhus")
## 
## Unbalanced Panel: n = 225, T = 10-10, N = 2250
## 
## Effects:
##                   var std.dev share
## idiosyncratic  411.68   20.29 0.148
## individual    2370.92   48.69 0.852
## theta:
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.8694  0.8694  0.8694  0.8694  0.8694  0.8694 
## 
## Residuals:
##        Min.     1st Qu.      Median     3rd Qu.        Max. 
## -148.025783   -3.940434   -2.544015   -0.081562  315.829057 
## 
## Coefficients:
##               Estimate Std. Error z-value  Pr(>|z|)    
## (Intercept) 18.0941170  3.2698706  5.5336 3.137e-08 ***
## return       0.0609435  0.0987705  0.6170    0.5372    
## employ       0.7930595  0.0493501 16.0701 < 2.2e-16 ***
## rnd         -0.1141524  0.0128585 -8.8776 < 2.2e-16 ***
## sales       -0.0023162  0.0003790 -6.1114 9.878e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    945100
## Residual Sum of Squares: 807600
## R-Squared:      0.14549
## Adj. R-Squared: 0.14397
## Chisq: 382.239 on 4 DF, p-value: < 2.22e-16

Modelo 3.1 Efectos aleatorios (random) - Método amemiya

amemiya1 <- plm(patentsg ~ return + employ + rnd + sales, data = patente, model = "random", random.method="amemiya")
## Warning in pdata.frame(data, index): duplicate couples (id-time) in resulting pdata.frame
##  to find out which, use, e.g., table(index(your_pdataframe), useNA = "ifany")
summary(amemiya1)
## Oneway (individual) effect Random Effect Model 
##    (Amemiya's transformation)
## 
## Call:
## plm(formula = patentsg ~ return + employ + rnd + sales, data = patente, 
##     model = "random", random.method = "amemiya")
## 
## Unbalanced Panel: n = 225, T = 10-10, N = 2250
## 
## Effects:
##                   var std.dev share
## idiosyncratic  292.12   17.09 0.031
## individual    9227.46   96.06 0.969
## theta:
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.9438  0.9438  0.9438  0.9438  0.9438  0.9438 
## 
## Residuals:
##       Min.    1st Qu.     Median    3rd Qu.       Max. 
## -174.84560   -3.06638   -1.81786    0.34125  292.15087 
## 
## Coefficients:
##                Estimate  Std. Error  z-value  Pr(>|z|)    
## (Intercept) 29.25741429  6.48942621   4.5085 6.530e-06 ***
## return       0.01380746  0.08902493   0.1551    0.8767    
## employ       0.21667365  0.05564987   3.8935 9.880e-05 ***
## rnd         -0.13464500  0.01182439 -11.3871 < 2.2e-16 ***
## sales       -0.00180607  0.00034823  -5.1864 2.144e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    758060
## Residual Sum of Squares: 647710
## R-Squared:      0.14557
## Adj. R-Squared: 0.14405
## Chisq: 382.48 on 4 DF, p-value: < 2.22e-16

Modelo 3.2 Efectos aleatorios (random) - Método nerlove

nerlove1 <- plm(patentsg ~ return + employ + rnd + sales, data = patente, model = "random", random.method="nerlove")
## Warning in pdata.frame(data, index): duplicate couples (id-time) in resulting pdata.frame
##  to find out which, use, e.g., table(index(your_pdataframe), useNA = "ifany")
summary(nerlove1)
## Oneway (individual) effect Random Effect Model 
##    (Nerlove's transformation)
## 
## Call:
## plm(formula = patentsg ~ return + employ + rnd + sales, data = patente, 
##     model = "random", random.method = "nerlove")
## 
## Unbalanced Panel: n = 225, T = 10-10, N = 2250
## 
## Effects:
##                   var std.dev share
## idiosyncratic  262.39   16.20 0.028
## individual    9265.80   96.26 0.972
## theta:
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.9469  0.9469  0.9469  0.9469  0.9469  0.9469 
## 
## Residuals:
##       Min.    1st Qu.     Median    3rd Qu.       Max. 
## -176.59240   -3.00166   -1.76173    0.38987  290.97104 
## 
## Coefficients:
##                Estimate  Std. Error  z-value  Pr(>|z|)    
## (Intercept) 29.72678963  6.82036888   4.3585 1.309e-05 ***
## return       0.01220865  0.08866824   0.1377 0.8904862    
## employ       0.19225413  0.05584827   3.4424 0.0005765 ***
## rnd         -0.13550037  0.01178374 -11.4989 < 2.2e-16 ***
## sales       -0.00178445  0.00034702  -5.1422 2.715e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    753600
## Residual Sum of Squares: 642330
## R-Squared:      0.14765
## Adj. R-Squared: 0.14613
## Chisq: 388.894 on 4 DF, p-value: < 2.22e-16

Prueba de Hausman

phtest(nerlove1,within1)
## 
##  Hausman Test
## 
## data:  patentsg ~ return + employ + rnd + sales
## chisq = 113.03, df = 4, p-value < 2.2e-16
## alternative hypothesis: one model is inconsistent

Conclusión

Al comparar todos los modelos de panel identificamos que el mejor modelo fue el modelo pooled debido a que el Adjusted R^2 es de 0.564 a comparación con todos los demás que son debajo del 0.2, se encontró una gran significancia en las variables del modelo lo cual indica que el modelo es óptimo.

LS0tDQp0aXRsZTogIkFjdGl2aWRhZCAxLiBBbsOhbGlzaXMgeSBhcGxpY2FjacOzbiBkZSBkYXRvcyBwYW5lbCINCmF1dGhvcjogIk1heGltaWxpYW5vIENhcnZhamFsIEh1ZXNjYSINCmRhdGU6ICIyMDI0LTAyLTE4Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogVFJVRQ0KICAgIHRvY19mbG9hdDogVFJVRQ0KICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUNCiAgICB0aGVtZTogdW5pdGVkDQotLS0NCg0KIVtdKGltYWdlcy9pbWFnZSUyMGV4bXBsLTAxLmdpZikNCg0KYGBgez1odG1sfQ0KPHN0eWxlPg0KYm9keSB7DQp0ZXh0LWFsaWduOiBqdXN0aWZ5fQ0KPC9zdHlsZT4NCmBgYA0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KYGBge3IsbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgSW5zdGFsYWNpw7NuIGRlIGxpYnJlcsOtYXMgcGFyYSBsYXMgYWN0aXZpZGFkZXMNCiNpbnN0YWxsLnBhY2thZ2VzKCJXREkiKQ0KbGlicmFyeShXREkpDQojaW5zdGFsbC5wYWNrYWdlcygid2JzdGF0cyIpDQpsaWJyYXJ5KHdic3RhdHMpDQojaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KI2luc3RhbGwucGFja2FnZXMoImdwbG90cyIpDQpsaWJyYXJ5KGdwbG90cykNCiNpbnN0YWxsLnBhY2thZ2VzKCJwbG0iKQ0KbGlicmFyeShwbG0pDQojaW5zdGFsbC5wYWNrYWdlcygicHN5Y2giKQ0KbGlicmFyeShwc3ljaCkNCiNpbnN0YWxsLnBhY2thZ2VzKCJ4bHN4IikNCmxpYnJhcnkoeGxzeCkNCiNpbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpDQpsaWJyYXJ5KGRwbHlyKQ0KIyNQYXJhIGxhIGZ1bmNpw7NuIGZpbHRlciB5IGxhZyBkZSBkcGx5ciBlcyBuZWNlc2FyaW8gZXNwZWNpZmljYXIgbGEgbGlicmVyw61hIGN1YW5kbyBzZSB1c2UgeWEgcXVlIGhheSB1biBjb25mbGljdG8gcHJlc2VudGFkbyBjb24gbGEgZnVuY2nDs24gZmlsdGVyIHkgbGFnLCBzdSB1c28gZGViZXLDrWEgc2VyIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6IGRwbHlyOjpmdW5jdGlvbih4LC4uLikNCg0KI2luc3RhbGwucGFja2FnZXMoInJlYWR4bCIpDQpsaWJyYXJ5KHJlYWR4bCkNCmBgYA0KDQojIEVqZXJjaWNpbyAxLiBMb3MgcHJpbWVyb3MgMyBwYXNvcyBkZWwgQW7DoWxpc2lzIEVjb27Ds21pY28gRW1ww61yaWNvICg1IHB1bnRvcykNCg0KIyMjIFByZWd1bnRhIGRlIGludGVyw6lzDQoNCsK/UXXDqSBmYWN0b3JlcyBhZmVjdGFuIGVsIHByZWNpbyBkZSB1biBhdXRvbcOzdmlsPw0KDQp8IEZhY3RvciAgICAgICAgICAgICAgICAgICAgfCBWYXJpYWJsZSAgICAgICAgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLXwNCnwgQ29zdG8gZGUgbG9zIG1hdGVyaWFsZXMgICB8IE1hdGVyaWFzIHByaW1hcyB8DQp8IENvc3RvIGRlIGVuc2FtYmxhamUgICAgICAgfCBDb3N0byBPcGVyYXRpdm8gfA0KfCBJbXB1ZXN0b3MgZ3ViZXJuYW1lbnRhbGVzIHwgSW1wdWVzdG9zICAgICAgIHwNCnwgQ29zdG9zIGRlIFRyYW5zcG9ydGUgICAgICB8IFRyYW5zcG9ydGUgICAgICB8DQoNCiMjIyBNb2RlbG8gZWNvbsOzbWljbw0KDQpQcmVjaW8gZGUgdW4gYXV0byA9IGYoTWF0ZXJpYXMgcHJpbWFzLCBDb3N0byBPcGVyYXRpdm8sIEltcHVlc3RvcywgVHJhbnNwb3J0ZSkNCg0KRsOzcm11bGEgeSBtb2RlbG86DQoNCiFbXShmb3JtdWxhLnBuZyl7c3R5bGU9Im1hcmdpbi1sZWZ0OiBhdXRvOyAgIG1hcmdpbi1yaWdodDogYXV0bzsiIHdpZHRoPSIxNTYifQ0KDQpQcmVjaW8gZGUgdW4gYXV0byA9IDAgKyAxIFwqIE1hdGVyaWFzIHByaW1hcyArIDIgXCogQ29zdG8gT3BlcmF0aXZvICsgMyBcKiBJbXB1ZXN0b3MgKyA0IFwqIFRyYW5zcG9ydGUgKyDOvA0KDQpFbiBlc3RlIG1vZGVsbyBwYXJhIGNhbGN1bGFyIGVsIHByZWNpbyBkZSB1biBhdXRvIHBvZGVtb3MgdmVyIGxhcyB2YXJpYWJsZXMgKipNYXRlcmlhcyoqICoqUHJpbWFzKiosICoqQ29zdG8qKiAqKk9wZXJhdGl2byoqLCAqKkltcHVlc3RvcyoqIHkgVHJhbnNwb3J0ZSBtw6FzIHVuICoqZXJyb3IqKiAozrwpIGRlIGFqdXN0ZS4NCg0KIyBUYXJlYSAxLiBSZXN1bWVuIGRlIDEgY3VhcnRpbGxhICJEZWZpbmljaW9uZXMgZGUgVGlwb3MgZGUgRGF0b3MiICgxMCBwdW50b3MpDQoNCiFbXShkYXRhLmdpZil7d2lkdGg9IjY5OSJ9DQoNCiMjIyBEYXRvcyBkZSBDb3J0ZSBUcmFuc3ZlcnNhbA0KDQpMb3MgKipkYXRvcyBkZSBDb3J0ZSBUcmFuc3ZlcnNhbCoqIHNvbiBkYXRvcyBxdWUgc2UgcmVjb3BpbGFuIGRlIHVuIG9iamV0byBkZSBtYW5lcmEgw7puaWNhIGVuIHVuIHNvbG8gcHVudG8gZW4gZWwgdGllbXBvLiBFc3RlIHRpcG8gZGUgZGF0b3MgcHJvcG9yY2lvbmEgdW5hIGltYWdlbiBkZSB1bmEgcG9ibGFjacOzbiBvIHVuYSBtdWVzdHJhIGVuIHVuIG1vbWVudG8gcGFydGljdWxhci4gRXN0ZSB0aXBvIGRlIGRhdG9zIGVzIHV0aWxpemFkbyBwYXJhIHByb3BvcmNpb25hciB1bmEgaW1hZ2VuIGVuIGNhbXBvcyBjb21vIGVjb25vbcOtYSwgc29jaW9sb2fDrWEsIHNhbHVkIHDDumJsaWNhIGUgaW52ZXN0aWdhY2nDs24gZGUgbWVyY2Fkb3MuDQoNCiMjIyBEYXRvcyBkZSBTZXJpZXMgZGUgVGllbXBvDQoNClVuYSAqKnNlcmllIGRlIHRpZW1wbyoqIGVzIHVuYSBzZWN1ZW5jaWEgZGUgb2JzZXJ2YWNpb25lcyB0b21hZGFzIGEgaW50ZXJ2YWxvcyByZWd1bGFyZXMgYSBsbyBsYXJnbyBkZWwgdGllbXBvLiBFc3RhcyBvYnNlcnZhY2lvbmVzIHB1ZWRlbiByZXByZXNlbnRhciBjdWFscXVpZXIgdmFyaWFibGUgcXVlIGNhbWJpZSBjb24gZWwgdGllbXBvLCBjb21vIHZlbnRhcyBtZW5zdWFsZXMsIHRlbXBlcmF0dXJhcyBkaWFyaWFzLCB0YXNhcyBkZSBpbnRlcsOpcyBvIHByZWNpb3MgZGUgYWNjaW9uZXMuIExhcyBzZXJpZXMgZGUgdGllbXBvIHNlIGRlc2NvbXBvbmVuIGVuIGNvbXBvbmVudGVzIGNsYXZlOiAqKnRlbmRlbmNpYSoqLCBxdWUgbXVlc3RyYSBsYSB2YXJpYWNpw7NuIGEgbGFyZ28gcGxhem87ICoqZXN0YWNpb25hbGlkYWQqKiwgcXVlIHJlZmxlamEgcGF0cm9uZXMgcmVwZXRpdGl2b3MgZW4gY2llcnRvcyBtb21lbnRvcyBkZWwgYcOxbzsgKipjaWNsb3MqKiwgcXVlIHNvbiBmbHVjdHVhY2lvbmVzIG3DoXMgbGFyZ2FzIHF1ZSBubyBzaWd1ZW4gdW4gcGF0csOzbiBmaWpvOyB5ICoqbW92aW1pZW50byBpcnJlZ3VsYXIqKiwgcXVlIGVzIGVsIHJ1aWRvIGFsZWF0b3Jpby4gTGFzIHNlcmllcyBkZSB0aWVtcG8gc2UgdXRpbGl6YW4gZW4gcHJvbsOzc3RpY29zLCBhbsOhbGlzaXMgZWNvbsOzbWljb3MsIGNvbnRyb2wgZGUgY2FsaWRhZCB5IG3DoXMuDQoNCiMjIyBEYXRvcyBQYW5lbA0KDQpMb3MgKipkYXRvcyBkZSBwYW5lbCoqLCB0YW1iacOpbiBjb25vY2lkb3MgY29tbyAqKmRhdG9zIGxvbmdpdHVkaW5hbGVzKiogbyAqKmRhdG9zIGRlIHNlcmllcyBkZSB0aWVtcG8gZGUgc2VjY2nDs24gdHJhbnN2ZXJzYWwqKiwgc29uIGRhdG9zIHF1ZSBzZSBkZXJpdmFuIGRlIHVuIG7Dum1lcm8gZGUgb2JzZXJ2YWNpb25lcyBhIGxvIGxhcmdvIGRlbCB0aWVtcG8gZW4gdW4gbsO6bWVybyBkZSB1bmlkYWRlcyBkZSBzZWNjacOzbiB0cmFuc3ZlcnNhbCBjb21vIGluZGl2aWR1b3MsIGhvZ2FyZXMsIGVtcHJlc2FzIG8gZ29iaWVybm9zwrMuIEVzdG9zIGRhdG9zIGNvbWJpbmFuIHVuYSBkaW1lbnNpw7NuIHRlbXBvcmFsIGNvbiBvdHJhIHRyYW5zdmVyc2FsLCBsbyBxdWUgbG9zIGRpZmVyZW5jaWEgZGUgbGFzICoqc2VyaWVzIGRlIHRpZW1wbyoqIHF1ZSByZWNvZ2VuIG9ic2VydmFjaW9uZXMgZGUgdW4gZmVuw7NtZW5vIGEgbG8gbGFyZ28gZGVsIHRpZW1wbyBzaW4gY29uc2lkZXJhciBsYSB2YXJpYWNpw7NuIGVudHJlIGRpZmVyZW50ZXMgdW5pZGFkZXMuIEVuIHJlc3VtZW4sIGxvcyBkYXRvcyBkZSBwYW5lbCBwZXJtaXRlbiBhbmFsaXphciBwYXRyb25lcyBhIGxvIGxhcmdvIGRlbCB0aWVtcG8geSBjb25lY3RhciB2YXJpYWJsZXMsIGxvIHF1ZSByZXN1bHRhIMO6dGlsIGVuIMOhcmVhcyBjb21vIGxhIGVjb25vbcOtYSwgbGEgY2llbmNpYSB5IGxhIGludmVzdGlnYWNpw7NuIHNvY2lhbC4NCg0KIyMjIEZ1ZW50ZXMNCg0KT3J0ZWdhLCBDcmlzdGluYS4g4oCcRGF0b3MgVHJhbnN2ZXJzYWxlczogUXXDqSBTb24sIENhcmFjdGVyw61zdGljYXMgWSBUaXBvcy7igJ0gKlF1ZXN0aW9uUHJvKiwgOCBKYW4uIDIwMjQsIFt3d3cucXVlc3Rpb25wcm8uY29tL2Jsb2cvZXMvZGF0b3MtdHJhbnN2ZXJzYWxlcy8jOlx+OnRleHQ9OCUyMENvbmNsdXNpJUMzJUIzbi0sJUMyJUJGUXUlQzMlQTklMjBzb24lMjBsb3MlMjBkYXRvcyUyMHRyYW5zdmVyc2FsZXMgJTNGLG11ZXN0cmElMjBlbiUyMHVuJTIwbW9tZW50byUyMHBhcnRpY3VsYXJdKHd3dy5xdWVzdGlvbnByby5jb20vYmxvZy9lcy9kYXRvcy10cmFuc3ZlcnNhbGVzLyM6fjp0ZXh0PTglMjBDb25jbHVzaSVDMyVCM24tLCVDMiVCRlF1JUMzJUE5JTIwc29uJTIwbG9zJTIwZGF0b3MlMjB0cmFuc3ZlcnNhbGVzJTNGLG11ZXN0cmElMjBlbiUyMHVuJTIwbW9tZW50byUyMHBhcnRpY3VsYXIpLiBBY2Nlc3NlZCAyNCBGZWIuIDIwMjQuDQoNCuKAjEd1dGnDqXJyZXosIEp1YW4gTS4g4oCcRUwgTU9ERUxPIGRlIERBVE9TIGRlIFBBTkVMLuKAnSAqVG9kbyBFY29ub21ldHLDrWEgWSBDaWVuY2lhIGRlIERhdG9zKiwgOCBOb3YuIDIwMjAsIFt0b2RvZWNvbm9tZXRyaWEuY29tL3BhbmVsZGF0YTEvXSh0b2RvZWNvbm9tZXRyaWEuY29tL3BhbmVsZGF0YTEvKS4gQWNjZXNzZWQgMjQgRmViLiAyMDI0Lg0KDQrigIzigJzCv1F1w6kgRXMgVW5hIFNlcmllIGRlIFRpZW1wbz/igJ0gKk1pbml0YWIuY29tKiwgMjAyMywgW3N1cHBvcnQubWluaXRhYi5jb20vZXMtbXgvbWluaXRhYi8yMS9oZWxwLWFuZC1ob3ctdG8vc3RhdGlzdGljYWwtbW9kZWxpbmcvdGltZS1zZXJpZXMvc3VwcG9ydGluZy10b3BpY3MvYmFzaWNzL3doYXQtaXMtYS10aW1lLXNlcmllcy8uXShzdXBwb3J0Lm1pbml0YWIuY29tL2VzLW14L21pbml0YWIvMjEvaGVscC1hbmQtaG93LXRvL3N0YXRpc3RpY2FsLW1vZGVsaW5nL3RpbWUtc2VyaWVzL3N1cHBvcnRpbmctdG9waWNzL2Jhc2ljcy93aGF0LWlzLWEtdGltZS1zZXJpZXMvLikgQWNjZXNzZWQgMjQgRmViLiAyMDI0Lg0KDQojIFIgU2NyaXB0ICJQYW5lbCIgcGFyYSBvYnRlbmVyIEluZGljYWRvcmVzIGRlbCBCYW5jbyBNdW5kaWFsICg1IHB1bnRvcykNCg0KIVtdKG1hcGFzLmdpZikNCg0KIyMjIE9idGVuY2nDs24gZGUgbGEgYmFzZSBkZSBkYXRvcw0KDQpgYGB7cn0NCmdkcF9kYXRhMSA8LSB3Yl9kYXRhKGNvdW50cnk9YygiTVgiLCJFQyIsIkNBIiksIGluZGljYXRvciA9ICJOWS5HRFAuUENBUC5DRCIsIHN0YXJ0X2RhdGU9MjAxMywgZW5kX2RhdGU9MjAyMykNCmhlYWQoZ2RwX2RhdGExKQ0KYGBgDQoNCiMjIyBHZW5lcmFjacOzbiBkZSBjb25qdW50byBkZSAqKmRhdG9zIHBhbmVsKioNCg0KYGBge3J9DQpwYW5lbDEgPC0gc2VsZWN0KGdkcF9kYXRhMSxjb3VudHJ5LCBkYXRlLCBOWS5HRFAuUENBUC5DRCkNCmhlYWQocGFuZWwxKQ0KYGBgDQoNCiMgRWplcmNpY2lvIDIuIENvbmp1bnRvIGRlIERhdG9zIGRlIFBhbmVsIGNvbiBJbmRpY2Fkb3JlcyBkZWwgQmFuY28gTXVuZGlhbCAoMTUgcHVudG9zKQ0KDQpBY3RpdmlkYWQgZW4gZXF1aXBvIC0gSW50ZWdyYW50ZXM6DQoNCi0gICBSZWdpbmEgRW5yw61xdWV6IENoYXBhIChBMDE3MjE0MzUpDQoNCi0gICBNYXhpbWlsaWFubyBDYXJ2YWphbCBIdWVzY2EgKEEwMTU1MjE3OSkNCg0KLSAgIEd1aWxsZXJtbyBDw6F6YXJlcyBDcnV6IChBMDEyODM3MDkpDQoNCiMjIyBPYnRlbmNpw7NuIGRlIGJhc2UgZGUgZGF0b3MNCg0KYGBge3J9DQpnZHBfZGF0YSA8LSB3Yl9kYXRhKGNvdW50cnk9YygiTVgiLCJOTyIsIkZJIiwiU0UiLCJESyIpLCBpbmRpY2F0b3IgPSBjKCJFTi5BVE0uQ08yRS5LVCIsICJFRy5GRUMuUk5FVy5aUyIsICJTUC5VUkIuVE9UTC5JTi5aUyIsICJBRy5MTkQuQUdSSS5aUyIpLCBzdGFydF9kYXRlPTE5NTAsIGVuZF9kYXRlPTIwMjApDQpgYGANCg0KVmFyaWFibGVzIG9idGVuaWRhcyBlbiBlbCAqZGF0YWZyYW1lKg0KDQotICAgRU4uQVRNLkNPMkUuS1QgZXMgRW1pc2lvbmVzIGRlIENPMiAoa3QpDQoNCi0gICBFRy5GRUMuUk5FVy5aUyBlcyBDb25zdW1vIGRlIGVuZXJnw61hIHJlbm92YWJsZSAoJSBkZWwgY29uc3VtbyB0b3RhbCBkZSBlbmVyZ8OtYSBmaW5hbCkNCg0KLSAgIFNQLlVSQi5UT1RMLklOLlpTIGVzIFBvYmxhY2nDs24gdXJiYW5hICglIGRlbCB0b3RhbCkNCg0KLSAgIEFHLkxORC5BR1JJLlpTIGVzIFRpZXJyYXMgYWdyw61jb2xhcyAoJSBkZWwgw6FyZWEgZGUgdGllcnJhKQ0KDQojIyMgR2VuZXJhY2nDs24gZGUgZGF0b3MgcGFuZWwNCg0KYGBge3J9DQpwYW5lbCA8LSBzZWxlY3QoZ2RwX2RhdGEsIGNvdW50cnksZGF0ZSxFTi5BVE0uQ08yRS5LVCxFRy5GRUMuUk5FVy5aUyxTUC5VUkIuVE9UTC5JTi5aUyxBRy5MTkQuQUdSSS5aUykNCnBhbmVsIDwtIHN1YnNldChwYW5lbCwgZGF0ZSA9PSAxOTkwIHwgZGF0ZSA9PSAyMDAwIHwgZGF0ZSA9PSAyMDEwIHwgZGF0ZSA9PSAyMDIwKQ0KaGVhZChwYW5lbCkNCmBgYA0KDQojIyMgSWRlbnRpZmljYWNpw7NuIGRlICpOQSdzKg0KDQpgYGB7cn0NCm5hX2NvdW50IDwtIGNvbFN1bXMoaXMubmEocGFuZWwpKQ0KbmFfY291bnQNCmBgYA0KDQpObyBzZSBpZGVudGlmaWNhcm9uICpOQSdzKiBlbiBsYSBiYXNlIGRlIGRhdG9zLg0KDQojIFRhcmVhIDIuIEdyw6FmaWNhcyBkZSBIZXRlcm9nZW5laWRhZCAoNSBwdW50b3MpDQoNCmBgYHtyLCB3YXJuaW5nID0gRkFMU0V9DQojIEhldGVyb2dlbmVpZGFkDQoNCiMgR3LDoWZpY28gcGFyYSBsYSBoZXRlcm9nZW5laWRhZCBwb3IgcGHDrXNlcw0KcGxvdG1lYW5zKEVOLkFUTS5DTzJFLktUIH4gY291bnRyeSwgZGF0YSA9IHBhbmVsLCBtYWluID0gIkhldGVyb2dlbmVpZGFkIGVudHJlIHBhw61zZXMiLCB4bGFiID0gIlBhw61zIiwgeWxhYiA9ICJQcm9tZWRpbyBkZSBDTzJFIChLVCkiKQ0KDQojIEdyw6FmaWNvIHBhcmEgbGEgaGV0ZXJvZ2VuZWlkYWQgcG9yIGHDsW8NCnBsb3RtZWFucyhFTi5BVE0uQ08yRS5LVCB+IGRhdGUsIGRhdGEgPSBwYW5lbCwgbWFpbiA9ICJIZXRlcm9nZW5laWRhZCBlbnRyZSBhw7FvcyIsIHhsYWIgPSAiQcOxbyIsIHlsYWIgPSAiUHJvbWVkaW8gZGUgQ08yRSAoS1QpIikNCmBgYA0KDQojIyMgwr9MYSBsw61uZWEgcXVlIHVuZSBsb3MgcHJvbWVkaW9zIGVzIGhvcml6b250YWwsIG8gdGllbmUgbXVjaG9zIHBpY29zPw0KDQpMYSBwcmltZXJhIGdyw6FmaWNhIG11ZXN0cmEgKipoZXRlcm9nZW5laWRhZCoqIGVudHJlIHBhw61zZXMgeWEgcXVlIHNlIHRpZW5lIHVuIHBpY28gZW4gTcOpeGljby4gUG9yIGVsIGNvbnRyYXJpbywgbGEgZ3LDoWZpY2EgZGUgYcOxb3MgZXMgKipob21vZ8OpbmVhKiogcHVlcyBtYW50aWVuZSBwcm9tZWRpb3MgY29uIHVuYSAqKnZhcmlhbnphKiogYmFzdGFudGUgcmVkdWNpZGEgZW50cmUgbG9zIGHDsW9zLg0KDQojIyMgwr9Mb3MgaW50ZXJ2YWxvcyBkZSBjb25maWFuemEgbWlkZW4gbG8gbWlzbW8sIG8gZXN0w6FuIGRlc2Zhc2Fkb3M/DQoNCkxvcyAqKmludGVydmFsb3MgZGUgY29uZmlhbnphKiogZGUgbG9zIHBhw61zZXMgZXN0w6FuIHNldmVyYW1lbnRlIGRlc2Zhc2Fkb3MsIHBvciBvdHJvIGxhZG8sIGxvcyBpbnRlcnZhbG9zIGRlIGNvbmZpYW56YSBkZSBsb3MgYcOxb3Mgc29uIGJhc3RhbnRlIHNpbWlsYXJlcy4gRXN0byBzZSBwdWVkZSBvYnNlcnZhciBjb24gbGFzIGzDrW5lYXMgYXp1bGVzIGVuIGNhZGEgdW5vIGRlIGxvcyBwdW50b3MgZGUgYW1iYXMgZ3LDoWZpY2FzLg0KDQojIyMgSW52ZXN0aWdhIGVsIGNvbmNlcHRvIGRlIEhldGVyb2dlbmVpZGFkIHkgZGV0ZXJtaW5hIHNpIGxvIHF1ZSBzZSB2ZSBlbiBsYXMgZ3LDoWZpY2FzIGVzIGRlc2VhYmxlIG8gbm8gZGVzZWFibGUuDQoNCkVsIGNvbmNlcHRvIGRlICoqaGV0ZXJvZ2VuZWlkYWQqKiBzZSByZWZpZXJlIGEgbGEgZGl2ZXJzaWRhZCB5IHZhcmlhYmlsaWRhZCBlbnRyZSBkaXN0aW50YXMgZW50aWRhZGVzIGRlbnRybyBkZSB1biBjb25qdW50byBvIHBvYmxhY2nDs24uIFBhcmEgdW4gZXN0dWRpbywgbGEgZ3LDoWZpY2EgZGUgcGHDrXNlcyBlcyBkZXNlYWRhIGRlYmlkbyBhIHF1ZSBzZSBpZGVudGlmaWNhIHVuYSBkaWZlcmVuY2lhIGVudHJlIE3DqXhpY28geSBsb3MgZGVtw6FzIHRlcnJpdG9yaW9zLiBQb3Igb3RybyBsYWRvLCBkZWJpZG8gYSBxdWUgbGEgZ3LDoWZpY2EgZGUgYcOxb3MgbWFudGllbmUgcHJvbWVkaW9zIHNpbWlsYXJlcyBubyBzZSBwdWVkZW4gcmVzYWx0YXIgb2JzZXJ2YWNpb25lcyBlbiBsb3MgY2FtYmlvcyBkZSBDTzIgYSB0cmF2w6lzIGRlIGxvcyBhw7FvcywgcG9yIGxvIHF1ZSBzZSBjb25zaWRlcmEgcXVlIHBhcmEgdW4gZXN0dWRpbywgZXN0byBubyBlcyBkZXNlYWRvLg0KDQojIEVqZXJjaWNpbyAzLiBNb2RlbG9zIGNvbiBJbmRpY2Fkb3JlcyBkZWwgQmFuY28gTXVuZGlhbCAoMTAgcHVudG9zKQ0KDQojIyMgTW9kZWxvIDEuIFJlZ3Jlc2nDs24gYWdydXBhZGEgKHBvb2xlZCkNCg0KYGBge3J9DQpwb29sZWQgPC0gcGxtKEVOLkFUTS5DTzJFLktUIH4gRUcuRkVDLlJORVcuWlMgKyBTUC5VUkIuVE9UTC5JTi5aUyArIEFHLkxORC5BR1JJLlpTLCBkYXRhID0gcGFuZWwsIG1vZGVsID0gInBvb2xpbmciKQ0Kc3VtbWFyeShwb29sZWQpDQpgYGANCg0KIyMjIE1vZGVsbyAyLiBFZmVjdG9zIGZpam9zICh3aXRoaW4pDQoNCmBgYHtyfQ0Kd2l0aGluIDwtIHBsbShFTi5BVE0uQ08yRS5LVCB+IEVHLkZFQy5STkVXLlpTICsgU1AuVVJCLlRPVEwuSU4uWlMgKyBBRy5MTkQuQUdSSS5aUywgZGF0YSA9IHBhbmVsLCBtb2RlbCA9ICJ3aXRoaW4iKQ0Kc3VtbWFyeSh3aXRoaW4pDQpgYGANCg0KIyMjIFBydWViYSBwRg0KDQpQcnVlYmEgZGUgZWZlY3RvcyBpbmRpdmlkdWFsZXMgeS9vIHRlbXBvcmFsZXMgYmFzYWRhIGVuIGxhIGNvbXBhcmFjacOzbiBkZWwgbW9kZWxvICoqKndpdGhpbioqKiB5ICoqKnBvb2xpbmcqKiouDQoNCmBgYHtyfQ0KcEZ0ZXN0KHdpdGhpbixwb29sZWQpDQpgYGANCg0KRW4gZXN0ZSBjYXNvIGVsIG1vZGVsbyAqKipwb29sZWQqKiogZXMgbWVqb3IgcXVlIGVsIGRlICoqKndpdGhpbioqKiBwb3JxdWUgc2UgcHVlZGVuIG9ic2VydmFyIG3DoXMgYXN0ZXJpc2NvcyBhIHVuIGxhZG8gZGUgbGFzIHZhcmlhYmxlcywgZGUgaWd1YWwgZm9ybWEgbGEgKioqQWRqdXN0ZWQgUlxeMioqKiBkZSAqKipwb29sZWQqKiogZXMgbcOhcyBjZXJjYW5hIGEgMSwgbG8gcXVlIGRlIGlndWFsIGZvcm1hIG5vcyBpbmRpY2EgcXVlIGVzIHVuIG1lam9yIG1vZGVsbyBwYXJhIGVsIHByb2JsZW1hLg0KDQojIyMgTW9kZWxvIDMuIEVmZWN0b3MgYWxlYXRvcmlvcyAocmFuZG9tKSAtIE3DqXRvZG8gd2FsaHVzDQoNCmBgYHtyfQ0Kd2FsaHVzIDwtIHBsbShFTi5BVE0uQ08yRS5LVCB+IEVHLkZFQy5STkVXLlpTICsgU1AuVVJCLlRPVEwuSU4uWlMgKyBBRy5MTkQuQUdSSS5aUywgZGF0YSA9IHBhbmVsLCBtb2RlbCA9ICJyYW5kb20iLCByYW5kb20ubWV0aG9kPSJ3YWxodXMiKQ0Kc3VtbWFyeSh3YWxodXMpDQpgYGANCg0KRGViaWRvIGEgbGEgZmFsdGEgZGUgYXN0ZXJpc2NvcyBwb2RlbW9zIGRldGVybWluYXIgcXVlIGVzdGUgbW9kZWxvIG5vIGVzIHVuIG1vZGVsbyBhZGVjdWFkbyBwYXJhIGVsIGNhc28sIGhheSBxdWUgcmVtYXJjYXIgcXVlIGxhICoqKkFkanVzdGVkIFJcXjIqKiogc2kgZXMgbWF5b3IgcXVlIGxhIGRlbCBtb2RlbG8gKioqd2l0aGluKioqLiBFbiBlc3RhIHNpdHVhY2nDs24gc2UgZGFyw6EgcHJpb3JpZGFkIGEgbGEgUiBjdWFkcmFkYSBwb3IgbG8gcXVlIHNlIGRldGVybWluYSBxdWUgZWwgbW9kZWwgKioqd2FsaHVzKioqIGVzIG1lam9yLg0KDQojIyMgTW9kZWxvIDMuMSBFZmVjdG9zIGFsZWF0b3Jpb3MgKHJhbmRvbSkgLSBNw6l0b2RvIGFtZW1peWENCg0KYGBge3J9DQphbWVtaXlhIDwtIHBsbShFTi5BVE0uQ08yRS5LVCB+IEVHLkZFQy5STkVXLlpTICsgU1AuVVJCLlRPVEwuSU4uWlMgKyBBRy5MTkQuQUdSSS5aUywgZGF0YSA9IHBhbmVsLCBtb2RlbCA9ICJyYW5kb20iLCByYW5kb20ubWV0aG9kPSJhbWVtaXlhIikNCnN1bW1hcnkoYW1lbWl5YSkNCmBgYA0KDQojIyMgTW9kZWxvIDMuMiBFZmVjdG9zIGFsZWF0b3Jpb3MgKHJhbmRvbSkgLSBNw6l0b2RvIG5lcmxvdmUNCg0KYGBge3J9DQpuZXJsb3ZlIDwtIHBsbShFTi5BVE0uQ08yRS5LVCB+IEVHLkZFQy5STkVXLlpTICsgU1AuVVJCLlRPVEwuSU4uWlMgKyBBRy5MTkQuQUdSSS5aUywgZGF0YSA9IHBhbmVsLCBtb2RlbCA9ICJyYW5kb20iLCByYW5kb20ubWV0aG9kPSJuZXJsb3ZlIikNCnN1bW1hcnkobmVybG92ZSkNCmBgYA0KDQojIyMgUHJ1ZWJhIGRlIEhhdXNtYW4NCg0KTm9zIHBlcm1pdGUgY29tcGFyYXIgYW1ib3MgbW9kZWxvcyB5IGVzdGFibGVjZXIgcXXDqSBtb2RlbG8gZXMgbcOhcyBjb25zaXN0ZW50ZSB5IGVmaWNpZW50ZS4NCg0KYGBge3J9DQpwaHRlc3QoYW1lbWl5YSx3aXRoaW4pDQpgYGANCg0KR3JhY2lhcyBhIGxhIHBydWViYSBkZSBIYXVzbWFuIHBvZGVtb3MgZGV0ZXJtaW5hciBxdWUgdW4gbW9kZWxvIGVsIG1vZGVsbyAqKip3aXRoaW4qKiogbWVqb3IgcXVlIGVsIG1vZGVsbyAqKiphbWVtaXlhKioqLCBhZGVtw6FzLCBsYSAqKipBZGp1c3RlZCBSXF4yKioqIG5vcyBheXVkYSBhIGxsZWdhciBhIGxhIG1pc21hIGNvbmNsdXNpw7NuLiBBIHBlc2FyIGRlIGVzdG8sIGVuIGdlbmVyYWwgZWwgbWVqb3IgbW9kZWxvIGVzIGVsICoqKnBvb2xlZCoqKi4NCg0KIyBUYXJlYSAzLiBQYXRlbnRlcyAoMjAgcHVudG9zLCA1IHBvciBjYWRhIGluc3RydWNjacOzbikNCg0KIVtdKHBhdGVudGVzLmdpZil7d2lkdGg9IjY5NiJ9DQoNCkFjdGl2aWRhZCBlbiBlcXVpcG8gLSBJbnRlZ3JhbnRlczoNCg0KLSAgIFJlZ2luYSBFbnLDrXF1ZXogQ2hhcGEgKEEwMTcyMTQzNSkNCg0KLSAgIE1heGltaWxpYW5vIENhcnZhamFsIEh1ZXNjYSAoQTAxNTUyMTc5KQ0KDQotICAgR3VpbGxlcm1vIEPDoXphcmVzIENydXogKEEwMTI4MzcwOSkNCg0KIyMjIEluc3RhbGFjacOzbiBkZSBsaWJyZXLDrWFzDQoNCmBgYHtyfQ0KI2luc3RhbGwucGFja2FnZXMoInBzeWNoIikNCiNpbnN0YWxsLnBhY2thZ2VzKCJ4bHN4IikNCmxpYnJhcnkocHN5Y2gpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KHhsc3gpDQpgYGANCg0KIyMjIENhcmdhIGRlIGxhIGJhc2UgZGUgZGF0b3MuDQoNCmBgYHtyfQ0KcGF0ZW50ZSA8LSByZWFkLmNzdigiUEFURU5UIDMgTk9OQS5jc3YiKQ0KcGF0ZW50ZSA8LSBwYXRlbnRlWywxOjEyXQ0KYGBgDQoNCiMjIyAqRXhwbG9yYXRvcnkgRGF0YSBBbmFseXNpcyAoRURBKSoNCg0KYGBge3J9DQojRURBDQpzdW1tYXJ5KHBhdGVudGUpDQpwc3ljaDo6ZGVzY3JpYmUocGF0ZW50ZSkNCmBgYA0KDQojIyMgVHJhdGFtaWVudG8gZGUgKk5BJ3MqDQoNCmBgYHtyfQ0KIyBDw7NkaWdvIHBhcmEgb2J0ZW5lciBlbCAlIGRlIE5BIHBvciBjb2x1bW5hDQpwb3JjZW50YWplX05BIDwtIGNvbFN1bXMoaXMubmEocGF0ZW50ZSkpIC8gbnJvdyhwYXRlbnRlKSAqIDEwMA0KIyBNb3N0cmFyIGVsIHJlc3VsdGFkbw0KcG9yY2VudGFqZV9OQQ0KYGBgDQoNCiMjIyBQcnVlYmFzIGRlIGF1dG9jb3JyZWxhY2nDs24geSBoZXRlcm9zY2VkYXN0aWNpZGFkDQoNCmBgYHtyLCB3YXJuaW5nID0gRkFMU0V9DQoNCnBsb3RtZWFucyhwYXRlbnRzZyB+IGN1c2lwLCBkYXRhID0gcGF0ZW50ZSwgbi5sYWJlbD1GQUxTRSwgbWFpbj0gIkhldGVyb2dlbmVpZGFkIGVudHJlIGZpcm1hcyIpDQpwbG90bWVhbnMocGF0ZW50c2cgfiB5ZWFyLCBkYXRhID0gcGF0ZW50ZSwgbi5sYWJlbD1GQUxTRSwgbWFpbj0gIkhldGVyb2dlbmVpZGFkIHBvciBhw7FvcyIpDQpgYGANCg0KIyMjIE1vZGVsbyAxLiBSZWdyZXNpw7NuIGFncnVwYWRhIChwb29sZWQpDQoNCmBgYHtyfQ0KcG9vbGVkMSA8LSBwbG0ocGF0ZW50c2cgfiByZXR1cm4gKyBlbXBsb3kgKyBybmQgKyBzYWxlcywgZGF0YSA9IHBhdGVudGUsIG1vZGVsID0gInBvb2xpbmciKQ0Kc3VtbWFyeShwb29sZWQxKQ0KYGBgDQoNCiMjIyBNb2RlbG8gMi4gRWZlY3RvcyBmaWpvcyAod2l0aGluKQ0KDQpgYGB7cn0NCndpdGhpbjEgPC0gcGxtKHBhdGVudHNnIH4gcmV0dXJuICsgZW1wbG95ICsgcm5kICsgc2FsZXMsIGRhdGEgPSBwYXRlbnRlLCBtb2RlbCA9ICAid2l0aGluIikNCnN1bW1hcnkod2l0aGluMSkNCmBgYA0KDQojIyMgUHJ1ZWJhIHBGDQoNCmBgYHtyfQ0KcEZ0ZXN0KHdpdGhpbjEscG9vbGVkMSkNCmBgYA0KDQojIyMgTW9kZWxvIDMuIEVmZWN0b3MgYWxlYXRvcmlvcyAocmFuZG9tKSAtIE3DqXRvZG8gd2FsaHVzDQoNCmBgYHtyfQ0Kd2FsaHVzMSA8LSBwbG0ocGF0ZW50c2cgfiByZXR1cm4gKyBlbXBsb3kgKyBybmQgKyBzYWxlcywgZGF0YSA9IHBhdGVudGUsIG1vZGVsID0gInJhbmRvbSIsIHJhbmRvbS5tZXRob2Q9IndhbGh1cyIpDQpzdW1tYXJ5KHdhbGh1czEpDQpgYGANCg0KIyMjIE1vZGVsbyAzLjEgRWZlY3RvcyBhbGVhdG9yaW9zIChyYW5kb20pIC0gTcOpdG9kbyBhbWVtaXlhDQoNCmBgYHtyfQ0KYW1lbWl5YTEgPC0gcGxtKHBhdGVudHNnIH4gcmV0dXJuICsgZW1wbG95ICsgcm5kICsgc2FsZXMsIGRhdGEgPSBwYXRlbnRlLCBtb2RlbCA9ICJyYW5kb20iLCByYW5kb20ubWV0aG9kPSJhbWVtaXlhIikNCnN1bW1hcnkoYW1lbWl5YTEpDQpgYGANCg0KIyMjIE1vZGVsbyAzLjIgRWZlY3RvcyBhbGVhdG9yaW9zIChyYW5kb20pIC0gTcOpdG9kbyBuZXJsb3ZlDQoNCmBgYHtyfQ0KbmVybG92ZTEgPC0gcGxtKHBhdGVudHNnIH4gcmV0dXJuICsgZW1wbG95ICsgcm5kICsgc2FsZXMsIGRhdGEgPSBwYXRlbnRlLCBtb2RlbCA9ICJyYW5kb20iLCByYW5kb20ubWV0aG9kPSJuZXJsb3ZlIikNCnN1bW1hcnkobmVybG92ZTEpDQpgYGANCg0KIyMjIFBydWViYSBkZSBIYXVzbWFuDQoNCmBgYHtyfQ0KcGh0ZXN0KG5lcmxvdmUxLHdpdGhpbjEpDQpgYGANCg0KIyMjIENvbmNsdXNpw7NuDQoNCkFsIGNvbXBhcmFyIHRvZG9zIGxvcyBtb2RlbG9zIGRlIHBhbmVsIGlkZW50aWZpY2Ftb3MgcXVlIGVsIG1lam9yIG1vZGVsbyBmdWUgZWwgbW9kZWxvIHBvb2xlZCBkZWJpZG8gYSBxdWUgZWwgQWRqdXN0ZWQgUlxeMiBlcyBkZSAwLjU2NCBhIGNvbXBhcmFjacOzbiBjb24gdG9kb3MgbG9zIGRlbcOhcyBxdWUgc29uIGRlYmFqbyBkZWwgMC4yLCBzZSBlbmNvbnRyw7MgdW5hIGdyYW4gc2lnbmlmaWNhbmNpYSBlbiBsYXMgdmFyaWFibGVzIGRlbCBtb2RlbG8gbG8gY3VhbCBpbmRpY2EgcXVlIGVsIG1vZGVsbyBlcyDDs3B0aW1vLg0KDQohW10oZGl2aWRlci5naWYpDQo=