#Instalar paquetes y llamar librerías

#install.packages("plm")
library(plm)
#install.packages("gplots")
library(gplots)

Ejercicio 1

** Valor del mercado de la industria del cuidado de la pien en México **

INSTRUCCIONES: genera el modelo de regresión lineal simple y calcula el coeficiente de determinación. ¿Cuál es el pronóstico para 2026?

df <- data.frame(
  Año = c(2020, 2021, 2022, 2023, 2024, 2025),
  Valor = c(2.00, 2.22, 2.35, 2.46, 2.53, 2.60)
)

modelo_regresión <- lm(Valor ~ Año, data=df)

summary(modelo_regresión)
## 
## Call:
## lm(formula = Valor ~ Año, data = df)
## 
## Residuals:
##         1         2         3         4         5         6 
## -0.071429  0.033143  0.047714  0.042286 -0.003143 -0.048571 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)   
## (Intercept) -231.09429   27.17159  -8.505  0.00105 **
## Año            0.11543    0.01343   8.592  0.00101 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.0562 on 4 degrees of freedom
## Multiple R-squared:  0.9486, Adjusted R-squared:  0.9357 
## F-statistic: 73.82 on 1 and 4 DF,  p-value: 0.001008
df_pronostico <- data.frame(Año=2026)

predict(modelo_regresión, df_pronostico)
##     1 
## 2.764

CONCLUSIÓN: El mercado muestra un crecimiento constante. Por cada año quie pasa, el valor del mercado de la industria del cuidado de la piel aumenta 115 M USD.

Ejercicio 2

** Sueldo de los CEO y ventas de la Empresa **

INSTRUCCIONES: genera el modelo de elasticidad constante y calcula el coeficiente de determinación. ¿Cual es el promedio de sueldo para un CEO si la empresa vende $500 M USD?

df2 <- data.frame(
  Ventas = c(2.72, 7.39, 20.09, 54.60, 148.41, 403.43),
  Sueldo = c(375.31, 38.04, 627.50, 347.23, 448.99, 580.56)
)

modelo_elasticidad <- lm(log(Sueldo) ~ log(Ventas), data=df2)

summary(modelo_elasticidad)
## 
## Call:
## lm(formula = log(Sueldo) ~ log(Ventas), data = df2)
## 
## Residuals:
##          1          2          3          4          5          6 
##  8.487e-01 -1.697e+00  8.487e-01 -1.958e-05 -3.567e-05 -9.288e-05 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept)   4.8218     0.9678   4.982  0.00758 **
## log(Ventas)   0.2570     0.2485   1.034  0.35938   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.039 on 4 degrees of freedom
## Multiple R-squared:  0.211,  Adjusted R-squared:  0.01381 
## F-statistic:  1.07 on 1 and 4 DF,  p-value: 0.3594
df2_pronostico <- data.frame(Ventas=500)

predicción_log <- predict(modelo_elasticidad, df2_pronostico)
predicción <- exp(predicción_log)
predicción
##        1 
## 613.5421

CONCLUSIÓN: La relación entre las ventas de la empresa y el sueldo de los CEO es inelástica. Por cada 1% que aumentan las ventas, el sueldo del CEO aumenta 0.25%.

Método ARE para argumentos claros y convincentes: Afirmación: Idea principal. Razón: Razonamiento lógico. Evidencia: Pruebas que apoyan la razón.

Ejercicio 3

Relación de la publicidad en las ventas de las principales aerolíneas de México INSTRUCCIONES: Genera el mejpor modelo de predicción. ¿Cuál es el pronóstico de ventas para cada aerolínea si en 2026 gastaran 6M USD en publicidad?

df3 <- data.frame(
  Empresa = c("Aeroméxico", "Aeroméxico", "Aeroméxico", "Volaris", "Volaris", "Volaris", "Viva", "Viva", "Viva"),
  Año = c(2023, 2024, 2025, 2023, 2024, 2025, 2023, 2024, 2025),
  Publicidad = c(1, 2, 3, 2, 3, 4, 3, 4, 5),
  Ventas = c(12, 14, 16, 8, 10, 12, 4, 6, 8)
)

df3 <- pdata.frame(df3, index = c("Empresa","Año"))

#Lo siguiente es explicación
modelo_regresión2 <- lm(Ventas ~ Publicidad, data=df3)
summary(modelo_regresión2)
## 
## Call:
## lm(formula = Ventas ~ Publicidad, data = df3)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
##     -6     -3      0      3      6 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept)   13.000      3.645   3.567  0.00914 **
## Publicidad    -1.000      1.134  -0.882  0.40708   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.928 on 7 degrees of freedom
## Multiple R-squared:    0.1,  Adjusted R-squared:  -0.02857 
## F-statistic: 0.7778 on 1 and 7 DF,  p-value: 0.4071
#Usando regresión el modelo nos da que el modelo baja la venta, lo cual no es correcto, por eso usamos otros modelos.
#Fin de la explicación

#Prueba de heterogeneidad
plotmeans(Ventas ~ Publicidad, data=df3)
## Warning in qt((1 + p)/2, ns - 1): NaNs produced

#INTERPRETACIÓN: Buscamos linea quebrada que una de los promedios (Hay heterogeneidad) para elegir entre modelo de efectos fijos o aleatorios. Si sale una línea horizontal. no hay heterogeneidad. Probablemente la mejor opción sea el modelo agrupado.

#Opción 1 - Modelo de regrsión agrupada (Pooled)
pooled <- plm(Ventas ~ Publicidad, data=df3, model="pooling")
summary(pooled)
## Pooling Model
## 
## Call:
## plm(formula = Ventas ~ Publicidad, data = df3, model = "pooling")
## 
## Balanced Panel: n = 3, T = 3, N = 9
## 
## Residuals:
##        Min.     1st Qu.      Median     3rd Qu.        Max. 
## -6.0000e+00 -3.0000e+00 -1.0547e-15  3.0000e+00  6.0000e+00 
## 
## Coefficients:
##             Estimate Std. Error t-value Pr(>|t|)   
## (Intercept)  13.0000     3.6450  3.5666 0.009139 **
## Publicidad   -1.0000     1.1339 -0.8819 0.407084   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    120
## Residual Sum of Squares: 108
## R-Squared:      0.1
## Adj. R-Squared: -0.028571
## F-statistic: 0.777778 on 1 and 7 DF, p-value: 0.40708
#Opción 2 - Modelo de efectos fijos (Within)
within <- plm(Ventas ~ Publicidad, data=df3, model="within")
## Warning in summary.lm(object, ...): essentially perfect fit: summary may be
## unreliable
summary(within)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = Ventas ~ Publicidad, data = df3, model = "within")
## 
## Balanced Panel: n = 3, T = 3, N = 9
## 
## Residuals:
## Aeroméxico-2023 Aeroméxico-2024 Aeroméxico-2025       Viva-2023       Viva-2024 
##     -9.4246e-16      0.0000e+00     -1.8849e-16      1.8849e-16      0.0000e+00 
##       Viva-2025    Volaris-2023    Volaris-2024    Volaris-2025 
##     -1.8849e-16      1.8849e-16      0.0000e+00     -1.8849e-16 
## 
## Coefficients:
##              Estimate Std. Error    t-value  Pr(>|t|)    
## Publicidad 2.0000e+00 1.8849e-16 1.0611e+16 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    24
## Residual Sum of Squares: 1.0659e-30
## R-Squared:      1
## Adj. R-Squared: 1
## F-statistic: 1.12583e+32 on 1 and 5 DF, p-value: < 2.22e-16
#Prueba F
#INTERPRETACIÓN: si p < 0.05 no usar POOLED. Si p > 0.05 usar POOLED.
pFtest(within,pooled) #Ojo: El primer argumento es el modelo within!
## 
##  F test for individual effects
## 
## data:  Ventas ~ Publicidad
## F = 2.5331e+32, df1 = 2, df2 = 5, p-value < 2.2e-16
## alternative hypothesis: significant effects
#Opción 3 - Modelo de efectos aleatorios (Random)
random <- plm(Ventas ~ Publicidad, data=df3, model="random")
## Warning in summary.lm(object, ...): essentially perfect fit: summary may be
## unreliable
## Warning in summary.lm(object, ...): essentially perfect fit: summary may be
## unreliable
summary(random)
## Oneway (individual) effect Random Effect Model 
##    (Swamy-Arora's transformation)
## 
## Call:
## plm(formula = Ventas ~ Publicidad, data = df3, model = "random")
## 
## Balanced Panel: n = 3, T = 3, N = 9
## 
## Effects:
##                     var   std.dev share
## idiosyncratic 4.207e-31 6.486e-16 0.005
## individual    8.330e-29 9.127e-15 0.995
## theta: 0.959
## 
## Residuals:
##        Min.     1st Qu.      Median     3rd Qu.        Max. 
## -2.5563e-01 -2.3550e-01 -1.0097e-16  2.3550e-01  2.5563e-01 
## 
## Coefficients:
##             Estimate Std. Error z-value Pr(>|z|)    
## (Intercept) 4.030201   1.870922  2.1541  0.03123 *  
## Publicidad  1.989933   0.092814 21.4400  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    24.161
## Residual Sum of Squares: 0.36242
## R-Squared:      0.985
## Adj. R-Squared: 0.98286
## Chisq: 459.672 on 1 DF, p-value: < 2.22e-16
#Prueba de Hausman
#INTERPRETACIÓN: si p < 0.05 usar Efectos Fijos. Si p > 0.05 usar Efectos Aleatorios.
phtest(random,within) #Ojo: El primer argumento es el modelo random!
## 
##  Hausman Test
## 
## data:  Ventas ~ Publicidad
## chisq = 0.011765, df = 1, p-value = 0.9136
## alternative hypothesis: one model is inconsistent
#Por lo tanto el mejor modelo para este panel es el de EFECTOS ALEATORIOS.

df3_pronostico <- data.frame(
  Empresa = c("Aeroméxico", "Volaris", "Viva"),
  Año = c(2026, 2026, 2026),
  Publicidad = c(6, 6, 6)
)

df3_pronostico <- pdata.frame(df3_pronostico, index = c("Empresa","Año"))

intercepto <- coef(random)["(Intercept)"]
pendiente <- coef(random)["Publicidad"]
efectos <- ranef(random)

df3_pronostico$Ventas <- intercepto + efectos + pendiente*df3_pronostico$Publicidad
df3_pronostico[,c("Ventas")]
## Aeroméxico-2026       Viva-2026    Volaris-2026 
##       21.949664        9.989933       15.969799

CONCLUSIÓN: Existe una relación lineal perfecta y positiva entre la inversión de publicidad y las ventas de estas 3 aerolíneas. A través del modelo de efectos aleatorios se determinó que el pronóstico de ventas, si invirtiéran $6 M UDS en publicidad el siguiente año, sería de 22 M USD para Aeroméxico, 10 para Viva y 16 para Volaris.

Ejercicio 4

Relación de la publicidad en las ventas de las principales empresas de Cuidado de la Piel en México INSTRUCCIONES: Genera el mejpor modelo de predicción. ¿Cuál es el pronóstico de ventas para cada empresa si en 2026 INCREMENTAN EN 10% sugasto en publicidad con respecto a 2025?

df4 <- data.frame ( Empresa = c("Genoma Lab", "Genoma Lab", "Genoma Lab", "L'oreal", "L'oreal", "L'oreal", "Beiersdorf", "Beiersdorf", "Beiersdorf", "Natura", "Natura", "Natura"),
  Año = c(2023, 2024, 2025, 2023, 2024, 2025, 2023, 2024, 2025, 2023, 2024, 2025),
  Publicidad = c(1920, 2050, 2010, 1580, 1750, 1890, 740, 810, 870, 560, 610, 640),
  Ventas = c(7650, 8100, 7525, 13200, 14500, 15600, 5550, 6020, 6400, 6700, 7150, 7480)
)

df4 <- pdata.frame(df4, index = c("Empresa","Año"))

#Prueba de heterogeneidad
plotmeans(Ventas ~ Publicidad, data=df4)
## Warning in qt((1 + p)/2, ns - 1): NaNs produced

#Opción 1 - Modelo de regrsión agrupada (Pooled)
pooled <- plm(Ventas ~ Publicidad, data=df4, model="pooling")
summary(pooled)
## Pooling Model
## 
## Call:
## plm(formula = Ventas ~ Publicidad, data = df4, model = "pooling")
## 
## Balanced Panel: n = 4, T = 3, N = 12
## 
## Residuals:
##    Min. 1st Qu.  Median 3rd Qu.    Max. 
## -3575.6 -1948.7  -477.5  1379.3  4876.8 
## 
## Coefficients:
##              Estimate Std. Error t-value Pr(>|t|)  
## (Intercept) 4778.6326  2081.2268  2.2961  0.04455 *
## Publicidad     3.1453     1.4681  2.1424  0.05780 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    134450000
## Residual Sum of Squares: 92152000
## R-Squared:      0.31459
## Adj. R-Squared: 0.24605
## F-statistic: 4.58984 on 1 and 10 DF, p-value: 0.057802
#Opción 2 - Modelo de efectos fijos (Within)
within <- plm(Ventas ~ Publicidad, data=df4, model="within")
summary(within)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = Ventas ~ Publicidad, data = df4, model = "within")
## 
## Balanced Panel: n = 4, T = 3, N = 12
## 
## Residuals:
##     Min.  1st Qu.   Median  3rd Qu.     Max. 
## -350.440  -68.753   -5.220   49.412  406.936 
## 
## Coefficients:
##            Estimate Std. Error t-value  Pr(>|t|)    
## Publicidad  7.02641    0.84282  8.3368 6.998e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    3738800
## Residual Sum of Squares: 342100
## R-Squared:      0.9085
## Adj. R-Squared: 0.85621
## F-statistic: 69.502 on 1 and 7 DF, p-value: 6.9984e-05
#Prueba F
#INTERPRETACIÓN: si p < 0.05 no usar POOLED. Si p > 0.05 usar POOLED.
pFtest(within,pooled) #Ojo: El primer argumento es el modelo within!
## 
##  F test for individual effects
## 
## data:  Ventas ~ Publicidad
## F = 626.19, df1 = 3, df2 = 7, p-value = 7.247e-09
## alternative hypothesis: significant effects
#Opción 3 - Modelo de efectos aleatorios (Random)
random2 <- plm(Ventas ~ Publicidad, data=df4, model="random")
summary(random)
## Oneway (individual) effect Random Effect Model 
##    (Swamy-Arora's transformation)
## 
## Call:
## plm(formula = Ventas ~ Publicidad, data = df3, model = "random")
## 
## Balanced Panel: n = 3, T = 3, N = 9
## 
## Effects:
##                     var   std.dev share
## idiosyncratic 4.207e-31 6.486e-16 0.005
## individual    8.330e-29 9.127e-15 0.995
## theta: 0.959
## 
## Residuals:
##        Min.     1st Qu.      Median     3rd Qu.        Max. 
## -2.5563e-01 -2.3550e-01 -1.0097e-16  2.3550e-01  2.5563e-01 
## 
## Coefficients:
##             Estimate Std. Error z-value Pr(>|z|)    
## (Intercept) 4.030201   1.870922  2.1541  0.03123 *  
## Publicidad  1.989933   0.092814 21.4400  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    24.161
## Residual Sum of Squares: 0.36242
## R-Squared:      0.985
## Adj. R-Squared: 0.98286
## Chisq: 459.672 on 1 DF, p-value: < 2.22e-16
#Prueba de Hausman
#INTERPRETACIÓN: si p < 0.05 usar Efectos Fijos. Si p > 0.05 usar Efectos Aleatorios.
phtest(random,within) #Ojo: El primer argumento es el modelo random!
## 
##  Hausman Test
## 
## data:  Ventas ~ Publicidad
## chisq = 36.148, df = 1, p-value = 1.829e-09
## alternative hypothesis: one model is inconsistent
#Por lo tanto el mejor modelo para este panel es el de EFECTOS ALEATORIOS.

df4_pronostico <- data.frame(
  Empresa = c("Genoma Lab", "L'Oreal", "Beiersdorf", "Natura"),
  Año = c(2026, 2026, 2026, 2026),
  Publicidad = c(1.1*2010, 1.1*1890, 1.1*870, 1.1*640)
)

df4_pronostico <- pdata.frame(df4_pronostico, index = c("Empresa","Año"))

intercepto2 <- coef(random2)["(Intercept)"]
pendiente2 <- coef(random2)["Publicidad"]
efectos2 <- ranef(random2)

df4_pronostico$Ventas <- intercepto + efectos + pendiente*df4_pronostico$Publicidad
## Warning in get(.Generic)(e1, e2): longer object length is not a multiple of
## shorter object length
df4_pronostico[,c("Ventas")]
## Beiersdorf-2026 Genoma Lab-2026    L'Oreal-2026     Natura-2026 
##        1914.376        4397.792        4141.101        1410.923

CONCLUSIÓN: Por cada 1 M USD adicional invertido en la publicidad, las ventas aumentan 6.78M.

LS0tCnRpdGxlOiAiRWplcmNpY2lvcyBlbiBjbGFzZSIKYXV0aG9yOiAiQ2FybGEgTGlldmFubyAtIEEwMTcxMTg1NiIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IFRSVUUKICAgIHRvY19mbG9hdDogVFJVRQogICAgY29kZV9kb3dubG9hZDogVFJVRQogICAgdGhlbWU6IGNlcnVsZWFuCmRhdGU6ICIyMDI2LTA4LTEyIgotLS0KCiFbXShodHRwczovL3d3dy53YXNoaW5ndG9ucG9zdC5jb20vd3AtYXBwcy9pbXJzLnBocD9zcmM9aHR0cHM6Ly9hcmMtYW5nbGVyZmlzaC13YXNocG9zdC1wcm9kLXdhc2hwb3N0LnMzLmFtYXpvbmF3cy5jb20vcHVibGljL1BWNURLS0NUWDZQTFBCSjJZVUxDRk5GUkNRX3NpemUtbm9ybWFsaXplZC5qcGcmdz0xNDQwKQoKCiNJbnN0YWxhciBwYXF1ZXRlcyB5IGxsYW1hciBsaWJyZXLDrWFzCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiNpbnN0YWxsLnBhY2thZ2VzKCJwbG0iKQpsaWJyYXJ5KHBsbSkKI2luc3RhbGwucGFja2FnZXMoImdwbG90cyIpCmxpYnJhcnkoZ3Bsb3RzKQpgYGAKCgojIEVqZXJjaWNpbyAxCgoqKiBWYWxvciBkZWwgbWVyY2FkbyBkZSBsYSBpbmR1c3RyaWEgZGVsIGN1aWRhZG8gZGUgbGEgcGllbiBlbiBNw6l4aWNvICoqCgpJTlNUUlVDQ0lPTkVTOiBnZW5lcmEgZWwgbW9kZWxvIGRlIHJlZ3Jlc2nDs24gbGluZWFsIHNpbXBsZSB5IGNhbGN1bGEgZWwgY29lZmljaWVudGUgZGUgZGV0ZXJtaW5hY2nDs24uIMK/Q3XDoWwgZXMgZWwgcHJvbsOzc3RpY28gcGFyYSAyMDI2PwoKYGBge3J9CmRmIDwtIGRhdGEuZnJhbWUoCiAgQcOxbyA9IGMoMjAyMCwgMjAyMSwgMjAyMiwgMjAyMywgMjAyNCwgMjAyNSksCiAgVmFsb3IgPSBjKDIuMDAsIDIuMjIsIDIuMzUsIDIuNDYsIDIuNTMsIDIuNjApCikKCm1vZGVsb19yZWdyZXNpw7NuIDwtIGxtKFZhbG9yIH4gQcOxbywgZGF0YT1kZikKCnN1bW1hcnkobW9kZWxvX3JlZ3Jlc2nDs24pCgpkZl9wcm9ub3N0aWNvIDwtIGRhdGEuZnJhbWUoQcOxbz0yMDI2KQoKcHJlZGljdChtb2RlbG9fcmVncmVzacOzbiwgZGZfcHJvbm9zdGljbykKYGBgCgpDT05DTFVTScOTTjogRWwgbWVyY2FkbyBtdWVzdHJhIHVuIGNyZWNpbWllbnRvIGNvbnN0YW50ZS4gUG9yIGNhZGEgYcOxbyBxdWllIHBhc2EsIGVsIHZhbG9yIGRlbCBtZXJjYWRvIGRlIGxhIGluZHVzdHJpYSBkZWwgY3VpZGFkbyBkZSBsYSBwaWVsIGF1bWVudGEgMTE1IE0gVVNELgoKIyBFamVyY2ljaW8gMgoKKiogU3VlbGRvIGRlIGxvcyBDRU8geSB2ZW50YXMgZGUgbGEgRW1wcmVzYSAqKgoKSU5TVFJVQ0NJT05FUzogZ2VuZXJhIGVsIG1vZGVsbyBkZSBlbGFzdGljaWRhZCBjb25zdGFudGUgeSBjYWxjdWxhIGVsIGNvZWZpY2llbnRlIGRlIGRldGVybWluYWNpw7NuLiDCv0N1YWwgZXMgZWwgcHJvbWVkaW8gZGUgc3VlbGRvIHBhcmEgdW4gQ0VPIHNpIGxhIGVtcHJlc2EgdmVuZGUgJDUwMCBNIFVTRD8KCmBgYHtyfQpkZjIgPC0gZGF0YS5mcmFtZSgKICBWZW50YXMgPSBjKDIuNzIsIDcuMzksIDIwLjA5LCA1NC42MCwgMTQ4LjQxLCA0MDMuNDMpLAogIFN1ZWxkbyA9IGMoMzc1LjMxLCAzOC4wNCwgNjI3LjUwLCAzNDcuMjMsIDQ0OC45OSwgNTgwLjU2KQopCgptb2RlbG9fZWxhc3RpY2lkYWQgPC0gbG0obG9nKFN1ZWxkbykgfiBsb2coVmVudGFzKSwgZGF0YT1kZjIpCgpzdW1tYXJ5KG1vZGVsb19lbGFzdGljaWRhZCkKCmRmMl9wcm9ub3N0aWNvIDwtIGRhdGEuZnJhbWUoVmVudGFzPTUwMCkKCnByZWRpY2Npw7NuX2xvZyA8LSBwcmVkaWN0KG1vZGVsb19lbGFzdGljaWRhZCwgZGYyX3Byb25vc3RpY28pCnByZWRpY2Npw7NuIDwtIGV4cChwcmVkaWNjacOzbl9sb2cpCnByZWRpY2Npw7NuCmBgYApDT05DTFVTScOTTjogTGEgcmVsYWNpw7NuIGVudHJlIGxhcyB2ZW50YXMgZGUgbGEgZW1wcmVzYSB5IGVsIHN1ZWxkbyBkZSBsb3MgQ0VPIGVzIGluZWzDoXN0aWNhLiBQb3IgY2FkYSAxJSBxdWUgYXVtZW50YW4gbGFzIHZlbnRhcywgZWwgc3VlbGRvIGRlbCBDRU8gYXVtZW50YSAwLjI1JS4KCk3DqXRvZG8gQVJFIHBhcmEgYXJndW1lbnRvcyBjbGFyb3MgeSBjb252aW5jZW50ZXM6CkFmaXJtYWNpw7NuOiBJZGVhIHByaW5jaXBhbC4KUmF6w7NuOiBSYXpvbmFtaWVudG8gbMOzZ2ljby4KRXZpZGVuY2lhOiBQcnVlYmFzIHF1ZSBhcG95YW4gbGEgcmF6w7NuLgoKIyBFamVyY2ljaW8gMwoKKipSZWxhY2nDs24gZGUgbGEgcHVibGljaWRhZCBlbiBsYXMgdmVudGFzIGRlIGxhcyBwcmluY2lwYWxlcyBhZXJvbMOtbmVhcyBkZSBNw6l4aWNvKioKSU5TVFJVQ0NJT05FUzogR2VuZXJhIGVsIG1lanBvciBtb2RlbG8gZGUgcHJlZGljY2nDs24uIMK/Q3XDoWwgZXMgZWwgcHJvbsOzc3RpY28gZGUgdmVudGFzIHBhcmEgY2FkYSBhZXJvbMOtbmVhIHNpIGVuIDIwMjYgZ2FzdGFyYW4gNk0gVVNEIGVuIHB1YmxpY2lkYWQ/CgpgYGB7cn0KZGYzIDwtIGRhdGEuZnJhbWUoCiAgRW1wcmVzYSA9IGMoIkFlcm9tw6l4aWNvIiwgIkFlcm9tw6l4aWNvIiwgIkFlcm9tw6l4aWNvIiwgIlZvbGFyaXMiLCAiVm9sYXJpcyIsICJWb2xhcmlzIiwgIlZpdmEiLCAiVml2YSIsICJWaXZhIiksCiAgQcOxbyA9IGMoMjAyMywgMjAyNCwgMjAyNSwgMjAyMywgMjAyNCwgMjAyNSwgMjAyMywgMjAyNCwgMjAyNSksCiAgUHVibGljaWRhZCA9IGMoMSwgMiwgMywgMiwgMywgNCwgMywgNCwgNSksCiAgVmVudGFzID0gYygxMiwgMTQsIDE2LCA4LCAxMCwgMTIsIDQsIDYsIDgpCikKCmRmMyA8LSBwZGF0YS5mcmFtZShkZjMsIGluZGV4ID0gYygiRW1wcmVzYSIsIkHDsW8iKSkKCiNMbyBzaWd1aWVudGUgZXMgZXhwbGljYWNpw7NuCm1vZGVsb19yZWdyZXNpw7NuMiA8LSBsbShWZW50YXMgfiBQdWJsaWNpZGFkLCBkYXRhPWRmMykKc3VtbWFyeShtb2RlbG9fcmVncmVzacOzbjIpCiNVc2FuZG8gcmVncmVzacOzbiBlbCBtb2RlbG8gbm9zIGRhIHF1ZSBlbCBtb2RlbG8gYmFqYSBsYSB2ZW50YSwgbG8gY3VhbCBubyBlcyBjb3JyZWN0bywgcG9yIGVzbyB1c2Ftb3Mgb3Ryb3MgbW9kZWxvcy4KI0ZpbiBkZSBsYSBleHBsaWNhY2nDs24KCiNQcnVlYmEgZGUgaGV0ZXJvZ2VuZWlkYWQKcGxvdG1lYW5zKFZlbnRhcyB+IFB1YmxpY2lkYWQsIGRhdGE9ZGYzKQojSU5URVJQUkVUQUNJw5NOOiBCdXNjYW1vcyBsaW5lYSBxdWVicmFkYSBxdWUgdW5hIGRlIGxvcyBwcm9tZWRpb3MgKEhheSBoZXRlcm9nZW5laWRhZCkgcGFyYSBlbGVnaXIgZW50cmUgbW9kZWxvIGRlIGVmZWN0b3MgZmlqb3MgbyBhbGVhdG9yaW9zLiBTaSBzYWxlIHVuYSBsw61uZWEgaG9yaXpvbnRhbC4gbm8gaGF5IGhldGVyb2dlbmVpZGFkLiBQcm9iYWJsZW1lbnRlIGxhIG1lam9yIG9wY2nDs24gc2VhIGVsIG1vZGVsbyBhZ3J1cGFkby4KCiNPcGNpw7NuIDEgLSBNb2RlbG8gZGUgcmVncnNpw7NuIGFncnVwYWRhIChQb29sZWQpCnBvb2xlZCA8LSBwbG0oVmVudGFzIH4gUHVibGljaWRhZCwgZGF0YT1kZjMsIG1vZGVsPSJwb29saW5nIikKc3VtbWFyeShwb29sZWQpCgojT3BjacOzbiAyIC0gTW9kZWxvIGRlIGVmZWN0b3MgZmlqb3MgKFdpdGhpbikKd2l0aGluIDwtIHBsbShWZW50YXMgfiBQdWJsaWNpZGFkLCBkYXRhPWRmMywgbW9kZWw9IndpdGhpbiIpCnN1bW1hcnkod2l0aGluKQoKI1BydWViYSBGCiNJTlRFUlBSRVRBQ0nDk046IHNpIHAgPCAwLjA1IG5vIHVzYXIgUE9PTEVELiBTaSBwID4gMC4wNSB1c2FyIFBPT0xFRC4KcEZ0ZXN0KHdpdGhpbixwb29sZWQpICNPam86IEVsIHByaW1lciBhcmd1bWVudG8gZXMgZWwgbW9kZWxvIHdpdGhpbiEKCiNPcGNpw7NuIDMgLSBNb2RlbG8gZGUgZWZlY3RvcyBhbGVhdG9yaW9zIChSYW5kb20pCnJhbmRvbSA8LSBwbG0oVmVudGFzIH4gUHVibGljaWRhZCwgZGF0YT1kZjMsIG1vZGVsPSJyYW5kb20iKQpzdW1tYXJ5KHJhbmRvbSkKCiNQcnVlYmEgZGUgSGF1c21hbgojSU5URVJQUkVUQUNJw5NOOiBzaSBwIDwgMC4wNSB1c2FyIEVmZWN0b3MgRmlqb3MuIFNpIHAgPiAwLjA1IHVzYXIgRWZlY3RvcyBBbGVhdG9yaW9zLgpwaHRlc3QocmFuZG9tLHdpdGhpbikgI09qbzogRWwgcHJpbWVyIGFyZ3VtZW50byBlcyBlbCBtb2RlbG8gcmFuZG9tIQoKI1BvciBsbyB0YW50byBlbCBtZWpvciBtb2RlbG8gcGFyYSBlc3RlIHBhbmVsIGVzIGVsIGRlIEVGRUNUT1MgQUxFQVRPUklPUy4KCmRmM19wcm9ub3N0aWNvIDwtIGRhdGEuZnJhbWUoCiAgRW1wcmVzYSA9IGMoIkFlcm9tw6l4aWNvIiwgIlZvbGFyaXMiLCAiVml2YSIpLAogIEHDsW8gPSBjKDIwMjYsIDIwMjYsIDIwMjYpLAogIFB1YmxpY2lkYWQgPSBjKDYsIDYsIDYpCikKCmRmM19wcm9ub3N0aWNvIDwtIHBkYXRhLmZyYW1lKGRmM19wcm9ub3N0aWNvLCBpbmRleCA9IGMoIkVtcHJlc2EiLCJBw7FvIikpCgppbnRlcmNlcHRvIDwtIGNvZWYocmFuZG9tKVsiKEludGVyY2VwdCkiXQpwZW5kaWVudGUgPC0gY29lZihyYW5kb20pWyJQdWJsaWNpZGFkIl0KZWZlY3RvcyA8LSByYW5lZihyYW5kb20pCgpkZjNfcHJvbm9zdGljbyRWZW50YXMgPC0gaW50ZXJjZXB0byArIGVmZWN0b3MgKyBwZW5kaWVudGUqZGYzX3Byb25vc3RpY28kUHVibGljaWRhZApkZjNfcHJvbm9zdGljb1ssYygiVmVudGFzIildCmBgYAoKQ09OQ0xVU0nDk046IEV4aXN0ZSB1bmEgcmVsYWNpw7NuIGxpbmVhbCBwZXJmZWN0YSB5IHBvc2l0aXZhIGVudHJlIGxhIGludmVyc2nDs24gZGUgcHVibGljaWRhZCB5IGxhcyB2ZW50YXMgZGUgZXN0YXMgMyBhZXJvbMOtbmVhcy4gQSB0cmF2w6lzIGRlbCBtb2RlbG8gZGUgZWZlY3RvcyBhbGVhdG9yaW9zIHNlIGRldGVybWluw7MgcXVlIGVsIHByb27Ds3N0aWNvIGRlIHZlbnRhcywgc2kgaW52aXJ0acOpcmFuICQ2IE0gVURTIGVuIHB1YmxpY2lkYWQgZWwgc2lndWllbnRlIGHDsW8sIHNlcsOtYSBkZSAyMiBNIFVTRCBwYXJhIEFlcm9tw6l4aWNvLCAxMCBwYXJhIFZpdmEgeSAxNiBwYXJhIFZvbGFyaXMuCgojIEVqZXJjaWNpbyA0CioqUmVsYWNpw7NuIGRlIGxhIHB1YmxpY2lkYWQgZW4gbGFzIHZlbnRhcyBkZSBsYXMgcHJpbmNpcGFsZXMgZW1wcmVzYXMgZGUgQ3VpZGFkbyBkZSBsYSBQaWVsIGVuIE3DqXhpY28qKgpJTlNUUlVDQ0lPTkVTOiBHZW5lcmEgZWwgbWVqcG9yIG1vZGVsbyBkZSBwcmVkaWNjacOzbi4gwr9DdcOhbCBlcyBlbCBwcm9uw7NzdGljbyBkZSB2ZW50YXMgcGFyYSBjYWRhIGVtcHJlc2Egc2kgZW4gMjAyNiBJTkNSRU1FTlRBTiBFTiAxMCUgc3VnYXN0byBlbiBwdWJsaWNpZGFkIGNvbiByZXNwZWN0byBhIDIwMjU/CgpgYGB7cn0KZGY0IDwtIGRhdGEuZnJhbWUgKCBFbXByZXNhID0gYygiR2Vub21hIExhYiIsICJHZW5vbWEgTGFiIiwgIkdlbm9tYSBMYWIiLCAiTCdvcmVhbCIsICJMJ29yZWFsIiwgIkwnb3JlYWwiLCAiQmVpZXJzZG9yZiIsICJCZWllcnNkb3JmIiwgIkJlaWVyc2RvcmYiLCAiTmF0dXJhIiwgIk5hdHVyYSIsICJOYXR1cmEiKSwKICBBw7FvID0gYygyMDIzLCAyMDI0LCAyMDI1LCAyMDIzLCAyMDI0LCAyMDI1LCAyMDIzLCAyMDI0LCAyMDI1LCAyMDIzLCAyMDI0LCAyMDI1KSwKICBQdWJsaWNpZGFkID0gYygxOTIwLCAyMDUwLCAyMDEwLCAxNTgwLCAxNzUwLCAxODkwLCA3NDAsIDgxMCwgODcwLCA1NjAsIDYxMCwgNjQwKSwKICBWZW50YXMgPSBjKDc2NTAsIDgxMDAsIDc1MjUsIDEzMjAwLCAxNDUwMCwgMTU2MDAsIDU1NTAsIDYwMjAsIDY0MDAsIDY3MDAsIDcxNTAsIDc0ODApCikKCmRmNCA8LSBwZGF0YS5mcmFtZShkZjQsIGluZGV4ID0gYygiRW1wcmVzYSIsIkHDsW8iKSkKCiNQcnVlYmEgZGUgaGV0ZXJvZ2VuZWlkYWQKcGxvdG1lYW5zKFZlbnRhcyB+IFB1YmxpY2lkYWQsIGRhdGE9ZGY0KQoKI09wY2nDs24gMSAtIE1vZGVsbyBkZSByZWdyc2nDs24gYWdydXBhZGEgKFBvb2xlZCkKcG9vbGVkIDwtIHBsbShWZW50YXMgfiBQdWJsaWNpZGFkLCBkYXRhPWRmNCwgbW9kZWw9InBvb2xpbmciKQpzdW1tYXJ5KHBvb2xlZCkKCiNPcGNpw7NuIDIgLSBNb2RlbG8gZGUgZWZlY3RvcyBmaWpvcyAoV2l0aGluKQp3aXRoaW4gPC0gcGxtKFZlbnRhcyB+IFB1YmxpY2lkYWQsIGRhdGE9ZGY0LCBtb2RlbD0id2l0aGluIikKc3VtbWFyeSh3aXRoaW4pCgojUHJ1ZWJhIEYKI0lOVEVSUFJFVEFDScOTTjogc2kgcCA8IDAuMDUgbm8gdXNhciBQT09MRUQuIFNpIHAgPiAwLjA1IHVzYXIgUE9PTEVELgpwRnRlc3Qod2l0aGluLHBvb2xlZCkgI09qbzogRWwgcHJpbWVyIGFyZ3VtZW50byBlcyBlbCBtb2RlbG8gd2l0aGluIQoKI09wY2nDs24gMyAtIE1vZGVsbyBkZSBlZmVjdG9zIGFsZWF0b3Jpb3MgKFJhbmRvbSkKcmFuZG9tMiA8LSBwbG0oVmVudGFzIH4gUHVibGljaWRhZCwgZGF0YT1kZjQsIG1vZGVsPSJyYW5kb20iKQpzdW1tYXJ5KHJhbmRvbSkKCiNQcnVlYmEgZGUgSGF1c21hbgojSU5URVJQUkVUQUNJw5NOOiBzaSBwIDwgMC4wNSB1c2FyIEVmZWN0b3MgRmlqb3MuIFNpIHAgPiAwLjA1IHVzYXIgRWZlY3RvcyBBbGVhdG9yaW9zLgpwaHRlc3QocmFuZG9tLHdpdGhpbikgI09qbzogRWwgcHJpbWVyIGFyZ3VtZW50byBlcyBlbCBtb2RlbG8gcmFuZG9tIQoKI1BvciBsbyB0YW50byBlbCBtZWpvciBtb2RlbG8gcGFyYSBlc3RlIHBhbmVsIGVzIGVsIGRlIEVGRUNUT1MgQUxFQVRPUklPUy4KCmRmNF9wcm9ub3N0aWNvIDwtIGRhdGEuZnJhbWUoCiAgRW1wcmVzYSA9IGMoIkdlbm9tYSBMYWIiLCAiTCdPcmVhbCIsICJCZWllcnNkb3JmIiwgIk5hdHVyYSIpLAogIEHDsW8gPSBjKDIwMjYsIDIwMjYsIDIwMjYsIDIwMjYpLAogIFB1YmxpY2lkYWQgPSBjKDEuMSoyMDEwLCAxLjEqMTg5MCwgMS4xKjg3MCwgMS4xKjY0MCkKKQoKZGY0X3Byb25vc3RpY28gPC0gcGRhdGEuZnJhbWUoZGY0X3Byb25vc3RpY28sIGluZGV4ID0gYygiRW1wcmVzYSIsIkHDsW8iKSkKCmludGVyY2VwdG8yIDwtIGNvZWYocmFuZG9tMilbIihJbnRlcmNlcHQpIl0KcGVuZGllbnRlMiA8LSBjb2VmKHJhbmRvbTIpWyJQdWJsaWNpZGFkIl0KZWZlY3RvczIgPC0gcmFuZWYocmFuZG9tMikKCmRmNF9wcm9ub3N0aWNvJFZlbnRhcyA8LSBpbnRlcmNlcHRvICsgZWZlY3RvcyArIHBlbmRpZW50ZSpkZjRfcHJvbm9zdGljbyRQdWJsaWNpZGFkCmRmNF9wcm9ub3N0aWNvWyxjKCJWZW50YXMiKV0KCmBgYApDT05DTFVTScOTTjogUG9yIGNhZGEgMSBNIFVTRCBhZGljaW9uYWwgaW52ZXJ0aWRvIGVuIGxhIHB1YmxpY2lkYWQsIGxhcyB2ZW50YXMgYXVtZW50YW4gNi43OE0uCg==