En el modelo de regresión lineal simple se quieren conocer las interrelaciones entre dos variables, de las cuales por lo menos una es una variable aleatoria
Supuestos
1.-La relación entre Y y X es lineal.
2.-Las Xi son variables no estocƔsticas (no aleatorias) cuyos valores son fijos (o controlados por el experimentador).
3.-La media del tƩrmino error es cero.
4.-La varianza del tƩrmino error es igual en todos los niveles de X. Es el principio de homocedasticidad.
5.-No existe autocorrelación entre el término error de diferentes niveles de X.
6.-La covarianza entre el tƩrmino error y la variable explicativa X es cero.
7.-El número de observaciones (el tamaño de la muestra) debe ser superior al número de parÔmetros a estimar.
8.-Los valores de X en una muestra dada no pueden ser todos iguales, teóricamente la var(X) debe ser un número finito positivo.
9.-El modelo estĆ” correctamente especificado.
10.-No existe multicolinealidad perfecta.
Supuestos según mi interpretación
Relaciónes por default
La relación entre Y y X es lineal. (Esta relación se ve desde la grÔfica de la variable dependiente e independiente)
Las Xi son variables no estocƔsticas (no aleatorias) cuyos valores son fijos (o controlados por el experimentador). (No hace falta explicarla)
El nĆŗmero de observaciones (el tamaƱo de la muestra) debe ser superior al nĆŗmero de parĆ”metros a estimar.(Si tenemos 4 betas, las observaciones deben ser mĆnimo 5, n<betas )
Los valores de X en una muestra dada no pueden ser todos iguales, teóricamente la var(X) debe ser un número finito positivo. LOS VALORES DE Y DEBEN SER DIFERENTES PARA CADA x
El modelo estÔ correctamente especificado.(Tiene que ver la coherencia teórica del modelo, no una relación espuria )
Supuestos que tienen que ver con el error
La media del tƩrmino error es cero. (solo basta con obtener el promedio)
TambiƩn hay que checar la normalidad de los errores
La varianza del tƩrmino error es igual en todos los niveles de X. Es el principio de homocedasticidad.(se obtienen con bp.test)
La covarianza entre el término error y la variable explicativa X es cero. (Se hace una covarianza entre x y los errore, otros hacen una correlación, estoy casi seguro que no es necesario, nunca va a haber correlación )
Supuestos que sólo aplican a ciertos casos
No existe multicolinealidad perfecta. (Sólo para regresiones multiples, se hace una correlación entre las variables)
No existe autocorrelación entre el término error de diferentes niveles de X. (Se debe ser hacer en series de tiempo con la prueba durbin-watson)
Importar y explorar datos
url1<-"https://raw.githubusercontent.com/armandovl/datasets_uno/main/Avance_Metodos.csv"
datos1<-read.csv(url(url1))
head(datos1)
Estamos probando si el porcentaje de deserción escolar a los 15 años estÔ en función del porcentaje de carencia alimenticia, las observaciones son por municipios en México
#ver la relación entre las variables
plot(datos1$por_car_alim,datos1$por_des_15,)

#ponemos el grƔfico mƔs estƩtico
plot(datos1$por_car_alim,datos1$por_des_15,
col="green3", #color a los puntos
pch=18, #cambiar el tipo de puntos
main="Relación carencia alimentaria y deserción escolar",#tĆtulo
xlab = "% poblacion con carencia aimentaria" ,
ylab = "% poblacion con deserción escolar"
)

Obtener manualmente la pendiente y el intercepto
#desviación estandar en x
sd(datos1$por_car_alim)
[1] 19.07691
#desviación estandar en y
sd(datos1$por_des_15)
[1] 9.630251
correlacionXY<-cor(datos1[,2:6])
print(correlacionXY)
por_des_15 po_per_pob por_sin_seg por_car_salud por_car_alim
por_des_15 1.0000000 0.7543165 0.2726830 0.2784925 0.8202800
po_per_pob 0.7543165 1.0000000 0.3299312 0.3303831 0.8710004
por_sin_seg 0.2726830 0.3299312 1.0000000 0.9524951 0.2592960
por_car_salud 0.2784925 0.3303831 0.9524951 1.0000000 0.2668206
por_car_alim 0.8202800 0.8710004 0.2592960 0.2668206 1.0000000
correlacionXY<-cor(datos1[,2:6])[5,1] #la posición columna 3,fila 1
print(correlacionXY)
[1] 0.82028
#valor de la pendiente
correlacionXY<-cor(datos1[,2:6])[5,1]
desvX<-sd(datos1$por_car_alim)
desvY<-sd(datos1$por_des_15)
pendiente<-correlacionXY*(desvY/desvX)
print(pendiente)
[1] 0.4140871
#calcular el valor de la pendiente 2
covarianzaXY<-cov(datos1$por_car_alim,datos1$por_des_15)
varianzaX<-var(datos1$por_car_alim)
pendiente2<-covarianzaXY/varianzaX
print(pendiente2)
[1] 0.4140871
#cƔlculo del intercepto
mediaX<-mean(datos1$por_car_alim)
mediaY<-mean(datos1$por_des_15)
intercepto<-mediaY-(pendiente2*mediaX)
print(intercepto)
[1] 0.7722395
Entrenar el modelo
modelo1<-lm(datos1$por_des_15~datos1$por_car_alim)
#ver los coeficientes
modelo1
Call:
lm(formula = datos1$por_des_15 ~ datos1$por_car_alim)
Coefficients:
(Intercept) datos1$por_car_alim
0.7722 0.4141
#ver el resumen del modelo
#se destaca el p valor de 2.2 por 10 a la -16, nos dice que si hay pendiente
summary(modelo1)
Call:
lm(formula = datos1$por_des_15 ~ datos1$por_car_alim)
Residuals:
Min 1Q Median 3Q Max
-20.8050 -3.0055 -0.4101 2.4206 31.4353
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.772240 0.216663 3.564 0.000372 ***
datos1$por_car_alim 0.414087 0.005829 71.045 < 2e-16 ***
---
Signif. codes: 0 ā***ā 0.001 ā**ā 0.01 ā*ā 0.05 ā.ā 0.1 ā ā 1
Residual standard error: 5.509 on 2454 degrees of freedom
Multiple R-squared: 0.6729, Adjusted R-squared: 0.6727
F-statistic: 5047 on 1 and 2454 DF, p-value: < 2.2e-16
anova(modelo1) #el p valor serĆa el mismo si le sacamos un anova al modelo
Analysis of Variance Table
Response: datos1$por_des_15
Df Sum Sq Mean Sq F value Pr(>F)
datos1$por_car_alim 1 153197 153197 5047.4 < 2.2e-16 ***
Residuals 2454 74484 30
---
Signif. codes: 0 ā***ā 0.001 ā**ā 0.01 ā*ā 0.05 ā.ā 0.1 ā ā 1
#grafico unido
par(mfcol = c(2, 2))
plot(modelo1)
par(mfcol = c(1, 1))

AnƔlizar los supuestos de los residuos
residuos=residuals(modelo1)
Normalidad de los errores
TambiƩn hay que checar la normalidad de os errores
ver si los errores son independientes , se distribuyen de manera normal
plot(modelo,2)

par(mfrow=c(2,1))
hist(residuos, col="yellow")
boxplot(residuos, bty="l", range=1.5, col="yellow", horizontal=T,xlab="residuos")
par(mfrow=c(1,1))

hist(residuos,
breaks=25,
col="lightblue",
freq=FALSE,
)
lines(density(residuos), lwd = 2, col = 'blue')
#tendencia de curva normal
x <- seq(min(residuos), max(residuos), length = 40)
f <- dnorm(x, mean = mean(residuos), sd = sd(residuos))
lines(x, f, col = "red", lwd = 2)

Test de normalidad h0= distribución normal, se busca valores mayores a 0.05
! En este caso ,No se acepta el supuesto de normalidad
shapiro.test(residuos) #menos de 50 observaciones
Shapiro-Wilk normality test
data: residuos
W = 0.95077, p-value < 2.2e-16
#para mƔs de 50 observaciones
#kolmorogov
ks.test(residuos,"pnorm", mean(residuos), sd(residuos))
One-sample Kolmogorov-Smirnov test
data: residuos
D = 0.083476, p-value = 2.776e-15
alternative hypothesis: two-sided
ks.test(residuos, "pnorm") #creo que es mejor la de arriba
One-sample Kolmogorov-Smirnov test
data: residuos
D = 0.31932, p-value < 2.2e-16
alternative hypothesis: two-sided
# Alternativamente conviene usar la modificación de Lilliefors a este test.
# Esta corrección considera que los parÔmetros son estimados, a diferencia
# del «ks» «a secas»:
library(nortest)
lillie.test(residuos)
Lilliefors (Kolmogorov-Smirnov) normality test
data: residuos
D = 0.083476, p-value < 2.2e-16
# realizar la prueba Anderson-Darling para comprobar la normalidad
ad.test (residuos)
Anderson-Darling normality test
data: residuos
A = 30.174, p-value < 2.2e-16
Homogeneidad de varianzas
La varianza del tƩrmino error es igual en todos los niveles de X. Es el principio de homocedasticidad.(se obtienen con bp.test)
Se busca un pvalor mayor a 0.05 ya que la h0=las pruebas son homogeneas
#En este caso se rechaza la h0, por lo tanto hay heteregeneidad de varianza,no se cumple el supuesto
library(lmtest)
bptest(modelo)
studentized Breusch-Pagan test
data: modelo
BP = 329.13, df = 1, p-value < 2.2e-16
Probar la homogeneidad por el mƩtodo grƔfico
los residuos versus los predichos hacen una forma de embudo
predichos=fitted(modelo1)
plot(residuos~predichos)

plot(residuos)

plot(modelo1,1)

relacion residuos con X (no endogeneidad)
Creo que nunca va a haber correlacion
cor(residuos, datos1$por_car_alim)
[1] -3.80044e-18
cov(residuos, datos1$por_car_alim)
[1] -3.993438e-16
plot (datos1$por_car_alim,residuos)

plot (residuos~datos1$por_des_15)

plot (datos1$por_des_15,residuos)

LS0tDQp0aXRsZTogIlJlZ3Jlc2nDs24gTGluZWFsIFN1cHVlc3RvcyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KDQotLS0NCjxwIGFsaWduPSJqdXN0aWZ5Ij4NCkVuIGVsIG1vZGVsbyBkZSByZWdyZXNpw7NuIGxpbmVhbCBzaW1wbGUgc2UgcXVpZXJlbiBjb25vY2VyIGxhcyBpbnRlcnJlbGFjaW9uZXMgZW50cmUgZG9zIHZhcmlhYmxlcywgZGUgbGFzIGN1YWxlcyBwb3IgbG8gbWVub3MgdW5hIGVzIHVuYSB2YXJpYWJsZSBhbGVhdG9yaWEgDQo8L3A+DQoNCiMjIFN1cHVlc3Rvcw0KPHAgYWxpZ249Imp1c3RpZnkiPg0KMS4tTGEgcmVsYWNpw7NuIGVudHJlIFkgeSBYIGVzIGxpbmVhbC48YnI+DQoNCjIuLUxhcyBYaSBzb24gdmFyaWFibGVzIG5vIGVzdG9jw6FzdGljYXMgKG5vIGFsZWF0b3JpYXMpIGN1eW9zIHZhbG9yZXMgc29uIGZpam9zIChvIGNvbnRyb2xhZG9zIHBvciBlbCBleHBlcmltZW50YWRvcikuPGJyPiANCg0KMy4tTGEgbWVkaWEgZGVsIHTDqXJtaW5vIGVycm9yIGVzIGNlcm8uIDxicj4NCg0KNC4tTGEgdmFyaWFuemEgZGVsIHTDqXJtaW5vIGVycm9yIGVzIGlndWFsIGVuIHRvZG9zIGxvcyBuaXZlbGVzIGRlIFguIEVzIGVsIHByaW5jaXBpbyBkZSBob21vY2VkYXN0aWNpZGFkLjxicj4NCg0KNS4tTm8gZXhpc3RlIGF1dG9jb3JyZWxhY2nDs24gZW50cmUgZWwgdMOpcm1pbm8gZXJyb3IgZGUgZGlmZXJlbnRlcyBuaXZlbGVzIGRlIFguPGJyPg0KDQo2Li1MYSBjb3ZhcmlhbnphIGVudHJlIGVsIHTDqXJtaW5vIGVycm9yIHkgbGEgdmFyaWFibGUgZXhwbGljYXRpdmEgWCBlcyBjZXJvLjxicj4NCg0KNy4tRWwgbsO6bWVybyBkZSBvYnNlcnZhY2lvbmVzIChlbCB0YW1hw7FvIGRlIGxhIG11ZXN0cmEpIGRlYmUgc2VyIHN1cGVyaW9yIGFsIG7Dum1lcm8gZGUgcGFyw6FtZXRyb3MgYSBlc3RpbWFyLjxicj4NCg0KOC4tTG9zIHZhbG9yZXMgZGUgWCBlbiB1bmEgbXVlc3RyYSBkYWRhIG5vIHB1ZWRlbiBzZXIgdG9kb3MgaWd1YWxlcywgdGXDs3JpY2FtZW50ZSBsYSB2YXIoWCkgZGViZSBzZXIgdW4gbsO6bWVybyBmaW5pdG8gcG9zaXRpdm8uPGJyPg0KDQo5Li1FbCBtb2RlbG8gZXN0w6EgY29ycmVjdGFtZW50ZSBlc3BlY2lmaWNhZG8uPGJyPg0KDQoxMC4tTm8gZXhpc3RlIG11bHRpY29saW5lYWxpZGFkIHBlcmZlY3RhLjxicj4NCjwvcD4NCg0KIyMgU3VwdWVzdG9zIHNlZ8O6biBtaSBpbnRlcnByZXRhY2nDs24NCg0KPHA+DQo8c3Ryb25nPlJlbGFjacOzbmVzIHBvciBkZWZhdWx0PC9zdHJvbmc+IDxicj4NCkxhIHJlbGFjacOzbiBlbnRyZSBZIHkgWCBlcyBsaW5lYWwuIChFc3RhIHJlbGFjacOzbiBzZSB2ZSBkZXNkZSBsYSBncsOhZmljYSBkZSBsYSB2YXJpYWJsZSBkZXBlbmRpZW50ZSBlIGluZGVwZW5kaWVudGUpPGJyPg0KDQpMYXMgWGkgc29uIHZhcmlhYmxlcyBubyBlc3RvY8Ohc3RpY2FzIChubyBhbGVhdG9yaWFzKSBjdXlvcyB2YWxvcmVzIHNvbiBmaWpvcyAobyBjb250cm9sYWRvcyBwb3IgZWwgZXhwZXJpbWVudGFkb3IpLiAoTm8gaGFjZSBmYWx0YSBleHBsaWNhcmxhKSA8YnI+DQoNCkVsIG7Dum1lcm8gZGUgb2JzZXJ2YWNpb25lcyAoZWwgdGFtYcOxbyBkZSBsYSBtdWVzdHJhKSBkZWJlIHNlciBzdXBlcmlvciBhbCBuw7ptZXJvIGRlIHBhcsOhbWV0cm9zIGEgZXN0aW1hci4oU2kgdGVuZW1vcyA0IGJldGFzLCBsYXMgb2JzZXJ2YWNpb25lcyBkZWJlbiBzZXIgbcOtbmltbyA1LCBuPGJldGFzICk8YnI+DQoNCkxvcyB2YWxvcmVzIGRlIFggZW4gdW5hIG11ZXN0cmEgZGFkYSBubyBwdWVkZW4gc2VyIHRvZG9zIGlndWFsZXMsIHRlw7NyaWNhbWVudGUgbGEgdmFyKFgpIGRlYmUgc2VyIHVuIG7Dum1lcm8gZmluaXRvIHBvc2l0aXZvLiBMT1MgVkFMT1JFUyBERSBZIERFQkVOIFNFUiBESUZFUkVOVEVTIFBBUkEgQ0FEQSB4PGJyPg0KDQpFbCBtb2RlbG8gZXN0w6EgY29ycmVjdGFtZW50ZSBlc3BlY2lmaWNhZG8uKFRpZW5lIHF1ZSB2ZXIgbGEgY29oZXJlbmNpYSB0ZcOzcmljYSBkZWwgbW9kZWxvLCBubyB1bmEgcmVsYWNpw7NuIGVzcHVyaWEgKTxicj4NCjwvcD4NCg0KPGJyPg0KDQo8c3Ryb25nPlN1cHVlc3RvcyBxdWUgdGllbmVuIHF1ZSB2ZXIgY29uIGVsIGVycm9yPC9zdHJvbmc+DQo8cD4NCkxhIG1lZGlhIGRlbCB0w6lybWlubyBlcnJvciBlcyBjZXJvLiAoc29sbyBiYXN0YSBjb24gb2J0ZW5lciBlbCBwcm9tZWRpbyk8YnI+DQoNCjxzdHJvbmc+VGFtYmnDqW4gaGF5IHF1ZSBjaGVjYXIgbGEgbm9ybWFsaWRhZCBkZSBsb3MgZXJyb3Jlczwvc3Ryb25nPg0KDQpMYSB2YXJpYW56YSBkZWwgdMOpcm1pbm8gZXJyb3IgZXMgaWd1YWwgZW4gdG9kb3MgbG9zIG5pdmVsZXMgZGUgWC4gRXMgZWwgcHJpbmNpcGlvIGRlIGhvbW9jZWRhc3RpY2lkYWQuKHNlIG9idGllbmVuIGNvbiBicC50ZXN0KSA8YnI+DQoNCg0KTGEgY292YXJpYW56YSBlbnRyZSBlbCB0w6lybWlubyBlcnJvciB5IGxhIHZhcmlhYmxlIGV4cGxpY2F0aXZhIFggZXMgY2Vyby4gKFNlIGhhY2UgdW5hIGNvdmFyaWFuemEgZW50cmUgeCB5IGxvcyBlcnJvcmUsIG90cm9zIGhhY2VuIHVuYSBjb3JyZWxhY2nDs24sIGVzdG95IGNhc2kgc2VndXJvIHF1ZSBubyBlcyBuZWNlc2FyaW8sIG51bmNhIHZhIGEgaGFiZXIgY29ycmVsYWNpw7NuICkgPGJyPg0KDQo8YnI+DQoNCjwvcD4NCg0KPHN0cm9uZz5TdXB1ZXN0b3MgcXVlIHPDs2xvIGFwbGljYW4gYSBjaWVydG9zIGNhc29zPC9zdHJvbmc+DQo8cD4NCk5vIGV4aXN0ZSBtdWx0aWNvbGluZWFsaWRhZCBwZXJmZWN0YS4gKFPDs2xvIHBhcmEgcmVncmVzaW9uZXMgbXVsdGlwbGVzLCBzZSBoYWNlIHVuYSBjb3JyZWxhY2nDs24gZW50cmUgbGFzIHZhcmlhYmxlcykgPGJyPg0KDQpObyBleGlzdGUgYXV0b2NvcnJlbGFjacOzbiBlbnRyZSBlbCB0w6lybWlubyBlcnJvciBkZSBkaWZlcmVudGVzIG5pdmVsZXMgZGUgWC4gKFNlIGRlYmUgc2VyIGhhY2VyIGVuIHNlcmllcyBkZSB0aWVtcG8gY29uIGxhIHBydWViYSBkdXJiaW4td2F0c29uKTxicj4NCjwvcD4NCg0KDQojIyBJbXBvcnRhciB5IGV4cGxvcmFyIGRhdG9zDQpgYGB7cn0NCnVybDE8LSJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXJtYW5kb3ZsL2RhdGFzZXRzX3Vuby9tYWluL0F2YW5jZV9NZXRvZG9zLmNzdiINCmRhdG9zMTwtcmVhZC5jc3YodXJsKHVybDEpKQ0KaGVhZChkYXRvczEpDQpgYGANCg0KRXN0YW1vcyBwcm9iYW5kbyBzaSBlbCBwb3JjZW50YWplIGRlIGRlc2VyY2nDs24gZXNjb2xhciBhIGxvcyAxNSBhw7FvcyBlc3TDoSBlbiBmdW5jacOzbiBkZWwgcG9yY2VudGFqZSBkZSBjYXJlbmNpYSBhbGltZW50aWNpYSwgbGFzIG9ic2VydmFjaW9uZXMgc29uIHBvciBtdW5pY2lwaW9zIGVuIE3DqXhpY28NCmBgYHtyfQ0KI3ZlciBsYSByZWxhY2nDs24gZW50cmUgbGFzIHZhcmlhYmxlcw0KcGxvdChkYXRvczEkcG9yX2Nhcl9hbGltLGRhdG9zMSRwb3JfZGVzXzE1KQ0KYGBgDQoNCmBgYHtyfQ0KI3BvbmVtb3MgZWwgZ3LDoWZpY28gbcOhcyBlc3TDqXRpY28NCnBsb3QoZGF0b3MxJHBvcl9jYXJfYWxpbSxkYXRvczEkcG9yX2Rlc18xNSwNCiAgICAgY29sPSJncmVlbjMiLCAjY29sb3IgYSBsb3MgcHVudG9zDQogICAgIHBjaD0xOCwgI2NhbWJpYXIgZWwgdGlwbyBkZSBwdW50b3MNCiAgICAgbWFpbj0iUmVsYWNpw7NuIGNhcmVuY2lhIGFsaW1lbnRhcmlhIHkgZGVzZXJjacOzbiBlc2NvbGFyIiwjdMOtdHVsbw0KICAgICB4bGFiID0gIiUgcG9ibGFjaW9uIGNvbiBjYXJlbmNpYSBhaW1lbnRhcmlhIiAsDQogICAgIHlsYWIgPSAiJSBwb2JsYWNpb24gY29uIGRlc2VyY2nDs24gZXNjb2xhciIgDQogICAgICkNCmBgYA0KDQojIyBPYnRlbmVyIG1hbnVhbG1lbnRlIGxhIHBlbmRpZW50ZSB5IGVsIGludGVyY2VwdG8NCg0KYGBge3J9DQojZGVzdmlhY2nDs24gZXN0YW5kYXIgZW4geA0Kc2QoZGF0b3MxJHBvcl9jYXJfYWxpbSkNCmBgYA0KDQpgYGB7cn0NCiNkZXN2aWFjacOzbiBlc3RhbmRhciBlbiB5DQpzZChkYXRvczEkcG9yX2Rlc18xNSkNCmBgYA0KYGBge3J9DQpjb3JyZWxhY2lvblhZPC1jb3IoZGF0b3MxWywyOjZdKQ0KcHJpbnQoY29ycmVsYWNpb25YWSkNCmBgYA0KYGBge3J9DQpjb3JyZWxhY2lvblhZPC1jb3IoZGF0b3MxWywyOjZdKVs1LDFdICNsYSBwb3NpY2nDs24gY29sdW1uYSAzLGZpbGEgMQ0KcHJpbnQoY29ycmVsYWNpb25YWSkNCmBgYA0KDQpgYGB7cn0NCiN2YWxvciBkZSBsYSBwZW5kaWVudGUNCmNvcnJlbGFjaW9uWFk8LWNvcihkYXRvczFbLDI6Nl0pWzUsMV0NCmRlc3ZYPC1zZChkYXRvczEkcG9yX2Nhcl9hbGltKQ0KZGVzdlk8LXNkKGRhdG9zMSRwb3JfZGVzXzE1KQ0KDQpwZW5kaWVudGU8LWNvcnJlbGFjaW9uWFkqKGRlc3ZZL2Rlc3ZYKQ0KcHJpbnQocGVuZGllbnRlKQ0KDQpgYGANCg0KDQoNCmBgYHtyfQ0KI2NhbGN1bGFyIGVsIHZhbG9yIGRlIGxhIHBlbmRpZW50ZSAyDQpjb3ZhcmlhbnphWFk8LWNvdihkYXRvczEkcG9yX2Nhcl9hbGltLGRhdG9zMSRwb3JfZGVzXzE1KQ0KdmFyaWFuemFYPC12YXIoZGF0b3MxJHBvcl9jYXJfYWxpbSkNCg0KcGVuZGllbnRlMjwtY292YXJpYW56YVhZL3ZhcmlhbnphWA0KcHJpbnQocGVuZGllbnRlMikNCmBgYA0KYGBge3J9DQojY8OhbGN1bG8gZGVsIGludGVyY2VwdG8NCm1lZGlhWDwtbWVhbihkYXRvczEkcG9yX2Nhcl9hbGltKQ0KbWVkaWFZPC1tZWFuKGRhdG9zMSRwb3JfZGVzXzE1KQ0KDQppbnRlcmNlcHRvPC1tZWRpYVktKHBlbmRpZW50ZTIqbWVkaWFYKQ0KcHJpbnQoaW50ZXJjZXB0bykNCmBgYA0KDQoNCiMjIEVudHJlbmFyIGVsIG1vZGVsbw0KYGBge3J9DQptb2RlbG8xPC1sbShkYXRvczEkcG9yX2Rlc18xNX5kYXRvczEkcG9yX2Nhcl9hbGltKQ0KYGBgDQoNCmBgYHtyfQ0KI3ZlciBsb3MgY29lZmljaWVudGVzDQptb2RlbG8xDQpgYGANCg0KYGBge3J9DQojdmVyIGVsIHJlc3VtZW4gZGVsIG1vZGVsbw0KI3NlIGRlc3RhY2EgZWwgcCB2YWxvciBkZSAyLjIgcG9yIDEwIGEgbGEgLTE2LCBub3MgZGljZSBxdWUgc2kgaGF5IHBlbmRpZW50ZQ0Kc3VtbWFyeShtb2RlbG8xKQ0KYGBgDQoNCmBgYHtyfQ0KYW5vdmEobW9kZWxvMSkgI2VsIHAgdmFsb3Igc2Vyw61hIGVsIG1pc21vIHNpIGxlIHNhY2Ftb3MgdW4gYW5vdmEgYWwgbW9kZWxvDQpgYGANCmBgYHtyfQ0KI2dyYWZpY28gdW5pZG8NCnBhcihtZmNvbCA9IGMoMiwgMikpDQpwbG90KG1vZGVsbzEpDQoNCnBhcihtZmNvbCA9IGMoMSwgMSkpDQpgYGANCg0KDQoNCiMjIEFuw6FsaXphciBsb3Mgc3VwdWVzdG9zIGRlIGxvcyByZXNpZHVvcw0KYGBge3J9DQpyZXNpZHVvcz1yZXNpZHVhbHMobW9kZWxvMSkNCmBgYA0KDQojIyMgTGEgbWVkaWEgZGVsIHTDqXJtaW5vIGVycm9yIGVzIGNlcm8uIChzb2xvIGJhc3RhIGNvbiBvYnRlbmVyIGVsIHByb21lZGlvKQ0KYGBge3J9DQptZWFuKHJlc2lkdW9zKSAjZXMgbXV5IGNlcmNhbmEgYSBjZXJvLCBwZXJvIGVuIGVzdGUgY2FzbyBlbiBuZWdhdGl2bywgcGVybyBjZXJjYW5vIGEgY2Vybw0KYGBgDQojIyMgTm9ybWFsaWRhZCBkZSBsb3MgZXJyb3Jlcw0KVGFtYmnDqW4gaGF5IHF1ZSBjaGVjYXIgbGEgbm9ybWFsaWRhZCBkZSBvcyBlcnJvcmVzIDxicj4NCnZlciBzaSBsb3MgZXJyb3JlcyBzb24gaW5kZXBlbmRpZW50ZXMgLCBzZSBkaXN0cmlidXllbiBkZSBtYW5lcmEgbm9ybWFsDQoNCmBgYHtyfQ0KI2RlIG1hbmVyYSBncmFmaWNhIHBhcmVjZSBxdWUgbm8gaGF5IG5vcm1hbGlkYWQNCnBsb3QobW9kZWxvLDIpDQpgYGANCmBgYHtyfQ0KcGFyKG1mcm93PWMoMiwxKSkNCmhpc3QocmVzaWR1b3MsIGNvbD0ieWVsbG93IikNCmJveHBsb3QocmVzaWR1b3MsIGJ0eT0ibCIsIHJhbmdlPTEuNSwgY29sPSJ5ZWxsb3ciLCBob3Jpem9udGFsPVQseGxhYj0icmVzaWR1b3MiKQ0KDQoNCnBhcihtZnJvdz1jKDEsMSkpDQpgYGANCg0KYGBge3J9DQojc2VndW5kbyBtw6l0b2RvLCBzZSB2ZSB1bmEgY3VydG9zaXMgZ3JhbmRlDQpoaXN0KHJlc2lkdW9zLA0KICAgICBicmVha3M9MjUsDQogICAgIGNvbD0ibGlnaHRibHVlIiwNCiAgICAgZnJlcT1GQUxTRSwNCiAgICAgKQ0KDQpsaW5lcyhkZW5zaXR5KHJlc2lkdW9zKSwgbHdkID0gMiwgY29sID0gJ2JsdWUnKQ0KDQojdGVuZGVuY2lhIGRlIGN1cnZhIG5vcm1hbA0KeCA8LSBzZXEobWluKHJlc2lkdW9zKSwgbWF4KHJlc2lkdW9zKSwgbGVuZ3RoID0gNDApDQpmIDwtIGRub3JtKHgsIG1lYW4gPSBtZWFuKHJlc2lkdW9zKSwgc2QgPSBzZChyZXNpZHVvcykpDQpsaW5lcyh4LCBmLCBjb2wgPSAicmVkIiwgbHdkID0gMikNCmBgYA0KPGJyPiBUZXN0IGRlIG5vcm1hbGlkYWQgaDA9IGRpc3RyaWJ1Y2nDs24gbm9ybWFsLCBzZSBidXNjYSB2YWxvcmVzIG1heW9yZXMgYSAwLjA1DQoNCiEgRW4gZXN0ZSBjYXNvICxObyBzZSBhY2VwdGEgZWwgc3VwdWVzdG8gZGUgbm9ybWFsaWRhZA0KDQpgYGB7cn0NCnNoYXBpcm8udGVzdChyZXNpZHVvcykgI21lbm9zIGRlIDUwIG9ic2VydmFjaW9uZXMNCmBgYA0KDQpgYGB7cn0NCiNwYXJhIG3DoXMgZGUgNTAgb2JzZXJ2YWNpb25lcw0KI2tvbG1vcm9nb3YNCmtzLnRlc3QocmVzaWR1b3MsInBub3JtIiwgbWVhbihyZXNpZHVvcyksIHNkKHJlc2lkdW9zKSkNCmBgYA0KDQpgYGB7cn0NCmtzLnRlc3QocmVzaWR1b3MsICJwbm9ybSIpICNjcmVvIHF1ZSBlcyBtZWpvciBsYSBkZSBhcnJpYmENCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFfQ0KIyBBbHRlcm5hdGl2YW1lbnRlIGNvbnZpZW5lIHVzYXIgbGEgbW9kaWZpY2FjacOzbiBkZSBMaWxsaWVmb3JzIGEgZXN0ZSB0ZXN0Lg0KIyBFc3RhIGNvcnJlY2Npw7NuIGNvbnNpZGVyYSBxdWUgbG9zIHBhcsOhbWV0cm9zIHNvbiBlc3RpbWFkb3MsIGEgZGlmZXJlbmNpYQ0KIyBkZWwgwqtrc8K7IMKrYSBzZWNhc8K7Og0KDQpsaWJyYXJ5KG5vcnRlc3QpDQpsaWxsaWUudGVzdChyZXNpZHVvcykNCmBgYA0KYGBge3J9DQojIHJlYWxpemFyIGxhIHBydWViYSBBbmRlcnNvbi1EYXJsaW5nIHBhcmEgY29tcHJvYmFyIGxhIG5vcm1hbGlkYWQNCmFkLnRlc3QgKHJlc2lkdW9zKQ0KDQpgYGANCg0KIyMjIEhvbW9nZW5laWRhZCBkZSB2YXJpYW56YXMNCg0KTGEgdmFyaWFuemEgZGVsIHTDqXJtaW5vIGVycm9yIGVzIGlndWFsIGVuIHRvZG9zIGxvcyBuaXZlbGVzIGRlIFguIEVzIGVsIHByaW5jaXBpbyBkZSBob21vY2VkYXN0aWNpZGFkLihzZSBvYnRpZW5lbiBjb24gYnAudGVzdCk8YnI+DQoNClNlIGJ1c2NhIHVuIHB2YWxvciBtYXlvciBhIDAuMDUgeWEgcXVlIGxhIGgwPWxhcyBwcnVlYmFzIHNvbiBob21vZ2VuZWFzDQpgYGB7ciBtZXNzYWdlPUZBTFNFfQ0KDQojRW4gZXN0ZSBjYXNvIHNlIHJlY2hhemEgbGEgaDAsIHBvciBsbyB0YW50byBoYXkgaGV0ZXJlZ2VuZWlkYWQgZGUgdmFyaWFuemEsbm8gc2UgY3VtcGxlIGVsIHN1cHVlc3RvDQpsaWJyYXJ5KGxtdGVzdCkNCmJwdGVzdChtb2RlbG8pDQoNCmBgYA0KUHJvYmFyIGxhIGhvbW9nZW5laWRhZCBwb3IgZWwgbcOpdG9kbyBncsOhZmljbzxicj4NCmxvcyByZXNpZHVvcyB2ZXJzdXMgbG9zIHByZWRpY2hvcyBoYWNlbiB1bmEgZm9ybWEgZGUgZW1idWRvDQoNCmBgYHtyfQ0KcHJlZGljaG9zPWZpdHRlZChtb2RlbG8xKQ0KcGxvdChyZXNpZHVvc35wcmVkaWNob3MpDQpgYGANCmBgYHtyfQ0KcGxvdChyZXNpZHVvcykgI2dyYWZpY2FyIHNvbG8gcmVzaWR1b3MNCmBgYA0KYGBge3J9DQpwbG90KG1vZGVsbzEsMSkNCmBgYA0KIyMgcmVsYWNpb24gcmVzaWR1b3MgY29uIFggKG5vIGVuZG9nZW5laWRhZCkNCg0KQ3JlbyBxdWUgbnVuY2EgdmEgYSBoYWJlciBjb3JyZWxhY2lvbg0KDQpgYGB7cn0NCmNvcihyZXNpZHVvcywgZGF0b3MxJHBvcl9jYXJfYWxpbSkNCg0KYGBgDQoNCmBgYHtyfQ0KY292KHJlc2lkdW9zLCBkYXRvczEkcG9yX2Nhcl9hbGltKQ0KYGBgDQpgYGB7cn0NCnBsb3QgKGRhdG9zMSRwb3JfY2FyX2FsaW0scmVzaWR1b3MpDQpgYGANCg0KYGBge3J9DQpwbG90IChyZXNpZHVvc35kYXRvczEkcG9yX2Rlc18xNSkNCmBgYA0KDQoNCg0KYGBge3J9DQpwbG90IChkYXRvczEkcG9yX2Rlc18xNSxyZXNpZHVvcykNCmBgYA0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg==