Tema 5. Pruebas de Hipotésis T de
Student
Utilizar Tabla “Valores Críticos para Distribuciones T”

Tabla Gosset (siglo XX) en Cervecería Guiness en Irlanda
Se usa siempre que Tamaño muestra <= 30 y la Desviación Estándar
POBLACIONAL sea desconocida
En esta se asume que la Distribución de la población es normal (no
está sesgada)
Pasos
Paso 1: Plantear Hipotésis
Caso 1
H0: μ = x- H1: μ =/ x-
Caso 2
H0: μ = x- H1: μ > x-
Caso 3
H0: μ = x- H1: μ < x-
Paso 2: Nivel de Significancia y Grados de Libertad
α(Alfa): Nivel deSignificancia = 1 - Nivel de Confiabilidad. Este
valor se busca en la tabla para obtener el valor de Z.
Grados de Libertad: n-1
Paso 3: Zona de Aceptación y Rechazo
Opción 1: > - α / 2 & < α/2
Opcion 2: < α
Opción 3: > -α
Paso 4: Fórmula
t = (x- - μ) / (s/sqrt(n))
Paso 5: Conclusión
Se rechaza H0
Se acepta H0
Ejercicios
Ejercicio 1
Focos duran promedio 500 hrs, Se verficia con 25 focos, con una
confianza del 90%, el promedio de los 25 focos fue 505.36 hrs y la Desv
Est Muestral 12.07 hrs
# Paso 1
# H0: μ = x-
#H1: μ =/ x-
#Paso 2
#alfa = 0.10
# Grado Libertad 25-1 = 24
# Paso 3
# > - α / 2 & < α/2
# Paso 4
t1= (505.36 - 500) / (12.07/ sqrt(25))
t1
## [1] 2.220381
if (t1 < -1.711||t1 > 1.711) {
Respuesta1 <- "En el ejercicio 1, Se rechaza la hipótesis nula"
} else {
Respuesta1 <- "En el ejercicio 1, se acepta la hipótesis nula"
}
Respuesta1
## [1] "En el ejercicio 1, Se rechaza la hipótesis nula"
Ejercicio 2
Datos2 <- c(107, 92, 97, 95, 105, 101, 91, 99, 95, 104)
PromPago <- 100
#Nivel Confianza 90%
Varianza2 <- var(Datos2)
Desv2 <- sqrt(Varianza2)
PromMuestra <- mean(Datos2)
# Paso 1
# H0: μ = x-
#H1: μ =/ x-
#Paso 2
#alfa = 0.10
# Grado Libertad 10-1 = 9
# Paso 3
# > - α / 2 & < α/2
# α = 0.05
#Paso 4:
t2 <- (PromMuestra - PromPago)/(Desv2/sqrt(10))
t2
## [1] -0.7988776
#Paso 5:
if (t2 < -1.833||t2 > 1.833) {
Respuesta2 <- "En el ejercicio 2, Se rechaza la hipótesis nula"
} else {
Respuesta2 <- "En el ejercicio 2, se acepta la hipótesis nula"
}
Respuesta2
## [1] "En el ejercicio 2, se acepta la hipótesis nula"
t.test(Datos2,y= NULL,alternative="two.sided",mu=100,paired=FALSE,var.equal?FALSE,conf.level=0.90)
##
## One Sample t-test
##
## data: Datos2
## t = -0.79888, df = 9, p-value = 0.4449
## alternative hypothesis: true mean is not equal to 100
## 90 percent confidence interval:
## 95.38755 101.81245
## sample estimates:
## mean of x
## 98.6
#Si es de una cola, alternative puede ser: "less" o "greater"
#Si p value es mayor a 0.10 se acepta H0
#Conclusión Se acepta H0
#Intervalo de Confianza: Entre 95 y 101 dólares.
Ejercicio 8-70
Drive-a-Lemon, renta automóviles en buenas condiciones mecánicas,
pero más antiguos que aquellos que rentan las grandes cadenas nacionales
de renta de coches. Como resultado, anuncia que sus tarifas son
considerablemente más bajas que las de sus grandes competidores. Una
encuesta en la industria estableció que el cargo total promedio por
renta en una de las mayores compañías es de $77.38 dólares. Una muestra
aleatoria de 18 transacciones realizadas por Drive-a- Lemon mostró un
cargo total promedio de $87.61, con una desviación estándar de la
muestra de $19.48. Verifique que, con un nivel de significancia de
0.025, el cargo total promedio de Drive-a- Lemon es más alto que el de
las grandes compañías. ¿Indica este resultado que las tarifas de Drive-
a-Lemon, no son más bajas que las de las grandes cadenas nacionales?
Justifique su respuesta.
Respuesta:
Paso 1: Plantear Hipotésis
H0: μ = x-
H1: μ > x-
Paso 2: Nivel de Significancia
Alfa: 0.025
Grados de Libertad 18-1= 17
Paso 3: Zona de Aceptación/Rechazo
< α
α = 0.025
Paso 4:
t8_70<- (87.61 - 77.38)/(19.48/sqrt(18))
t8_70
## [1] 2.22804
#Paso 5
if (t8_70 < 2.110) {
Respuesta8_70 <- "En el ejercicio 8_70, Se rechaza la hipótesis nula"
} else {
Respuesta8_70 <- "En el ejercicio 8_70, se acepta la hipótesis nula"
}
Respuesta8_70
## [1] "En el ejercicio 8_70, se acepta la hipótesis nula"
Tema 6. Análisis de Varianza (ANOVA)
Unifactorial
Se utiliza para determinar si existen diferencias estadísticamente
significativas entre las medias de 3 o más grupos.
Factor: Característica que siderencia las
poblaciones/tratamientos
Niveles: Distintas poblaciones/tratamientos
Observaciones: Partes en cada población/tratamiento
Pasos
Paso 1: Plantear Hipotésis
H0: μ1=μ2=μ3=μ4=μN
H1: Por lo menos dos de las μ son diferentes
Paso 2: Nivel de Significancia
“α =”
#Niveles (I) #### Observaciones (J) #### Grados de Libertad
Tratamientos (GLTr) = I - 1 #### Grado de Libertad del Error (GLE) =
I(J-1)
Paso 3: Zona de Aceptación/Rechazo
Valor de Tabla F
Paso 4: Fórmula
Suma de Cuadrados Total (SCT)
Suma de Cuadrados de los Tratamientos (SCTr)
Suma de Cuadrados del Error (SCE)
Cuadrados Medios de Tratamientos (CMTr) = SCTr/GLTr
Cuadrados Medios del Error (CME) = SCE/GLE
Paso 5: Conclusión
Se rechaza H0
Se acepta H0
Paso 6: Presentar Resultados Tabla ANOVA
| Tratamientos |
GLTr |
SCTr |
CMTr |
FTr |
| Error |
GLE |
SCE |
CME |
|
| Total |
GLT |
SCT |
|
|
Ejercicios
Ejercicio 1 Una empresa comparó diferentes tipos de cajas con
respecto ala resistencia a la compresión en ligas(lb)
C1 <- c(655.5, 788.3, 734.3, 721.4, 788.3, 679.1, 699.4)
C2 <- c(789.2, 772.5, 786.9, 686.1, 732.1, 774.8)
C3 <- c(737.1, 639, 696.3, 671.7, 717.2, 727.1)
C4 <- c(535.1, 628.7, 542.4, 559, 586.9, 520)
#Paso 2
#Alfa = 0.05
#Niveles (I)= 4
# Observaciones (J) = 6
#Grados de Libertad Tratamientos = I - 1 = 4-1 = 3
#Grado de Libertad del Error = I(J-1) = 4(6-1) = 20
#Paso 3
ZonaAcep<- 3.10
#Paso 4
SCT<- 161213.73
SCTr<- 127374.76
SCE <- SCT - SCTr
SCE
## [1] 33838.97
## [1] 42458.25
## [1] 1691.949
## [1] 25.09429
#Paso 5
# Se rechaza H0
#Solución en R
# resistencia <- read.csv("Cajas.csv")
# resistencia$Mezcla<-as.factor(resistencia$Caja)
# qf(.95,df1=3,df=20)
# anova1 <- aov(Resistencias ~ Caja, data=resistencia)
# summary(anova1)
Ejercicio 2
mezcla1 <- c(0.56, 1.12, 0.9, 1.07, 0.94)
mezcla2 <- c(0.72, 0.69, 0.87, 0.78, 0.91)
mezcla3 <- c(0.62, 1.08, 1.07, 0.99, 0.93)
#Paso 2
#Alfa = 0.01
#I= 3
#J = 5
#GLTr = 2
#GLE = 12
# Paso 3
ZonaAcep<- 6.93
# Paso 4
#Paso 4
SCT<- 0.4309
SCTr<- 0.0608
SCE <- SCT - SCTr
SCE
## [1] 0.3701
## [1] 0.0304
## [1] 0.03084167
## [1] 0.9856795
#Paso 6
# Se acepta H0
#Versión en R
# DFMezclas <- read.csv("Mezclas.csv")
# qf(.99,df1=2,df2=12)
# DFMezclas$Mezcla <- as.factor(DFMezclas$Mezcla)
# anova2 <- aov(Valor ~ Mezcla, data = DFMezclas)
# summary(anova2)
Tema 7. Regresión Lineal Simple

y = Bo + B1X
B1^ (^: Estimada) = Sumatoria (Xi - X-)(yi-y-) / Sumatoria
(Xi-X-)^2
= Sxy / Sxx =
= ( (Sumatoria(xiyi) - (Sumatoria xi)(Sumatoria yi)/n ) / Sumatoria
Xi^2 - (Sumatoria Xi) ^2 / n
B0^= (Sumatoria y - B1^ * Sumatoria xi) / n
= y- - B1^ * x-
SCE = Sumatoria yi^2 - B0^ * Sumatoria Yi - B1^ * Sumatoria
xiyi
STC = Sumatoria(yi- y-)^2 = Syy= Sumatoria Yi^2 - (Sumatoria yi)^2 /
n
r^2 = 1- (SCE/STC)
| 0.1 |
8 |
1.6 |
0.04 |
64 |
| 0.5 |
10 |
5 |
0.25 |
100 |
| 1 |
18 |
18 |
1 |
324 |
| 2 |
35 |
70 |
4 |
1225 |
| 3 |
60 |
180 |
9 |
600 |
| 6.7 |
131 |
274.6 |
14.29 |
5313 |
| 1.34 |
26.2 |
|
|
|
B1^= (274.6 - (6.7)(131)/5) / (14.29-((6.7)^2)/5) = 18.65
B0^= (26.2 - 18.65(1.34)) = 1.21
y= 1.21 + 18.65x
SCE = 5313 - 1.21(131)-18.65(274.6) = 33.50
STC = 5313 - (131^2) / 5 = 1880.80
r^2 = 1- (33.50/1880.80) = 0.98
Función en R
#Ejercicio 1
x <- c(0.2,0.5,1,2,3)
y <- c(8,10,18,35,60)
regresion <- lm(y ~ x)
summary(regresion)
##
## Call:
## lm(formula = y ~ x)
##
## Residuals:
## 1 2 3 4 5
## 3.0591 -0.5354 -1.8596 -3.5079 2.8437
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.211 2.451 0.494 0.65510
## x 18.648 1.450 12.863 0.00101 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3.341 on 3 degrees of freedom
## Multiple R-squared: 0.9822, Adjusted R-squared: 0.9763
## F-statistic: 165.5 on 1 and 3 DF, p-value: 0.001014




#Ejercicio 2
x2 <- c(-6, -3, 0, 3, 6, 9, 12, 15, 20, 25)
y2 <- c(2, 2.8, 3.9, 4.2, 5.8, 6.2, 7.5, 8.2, 9.3, 10.9)
Regresion2 <- lm(y2 ~ x2)
summary(Regresion2)
##
## Call:
## lm(formula = y2 ~ x2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.41088 -0.12507 -0.03329 0.14807 0.32493
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.746694 0.101162 37.04 3.10e-10 ***
## x2 0.288062 0.008087 35.62 4.22e-10 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2438 on 8 degrees of freedom
## Multiple R-squared: 0.9937, Adjusted R-squared: 0.993
## F-statistic: 1269 on 1 and 8 DF, p-value: 4.223e-10




Ejercicio 11-26
Un estudio compara el número de horas de alivio que proporcionan
cinco marcas de antiácidos administrados a 25 personas diferentes, cada
una con acidez estomacal considerada fuerte. Los resultados son los
siguientes:
| - |
4.4 |
5.8 |
4.8 |
2.9 |
4.6 |
| - |
4.6 |
5.2 |
5.9 |
2.7 |
4.3 |
| - |
4.5 |
4.9 |
4.9 |
2.9 |
3.8 |
| - |
4.1 |
4.7 |
4.6 |
3.9 |
5.2 |
| - |
3.8 |
4.6 |
4.3 |
4.3 |
4.4 |
a) Calcule el cociente F. Para un nivel de significancia de 0.05,
¿las marcas producen cantidades significativamente diferentes de alivio
a las personas con acidez estomacal fuerte?
antiacidos <- read.csv("G:\\Mi unidad\\LIT\\Diagnostico para lineas de accion\\Archivos en R\\Semana 2\\antiacidos.csv")
antiacidos$marca <- as.factor(antiacidos$marca)
qf(0.95,df1=4,df2=12)
## [1] 3.259167
anova3 <- aov(horas ~ marca, data=antiacidos)
summary(anova3)
## Df Sum Sq Mean Sq F value Pr(>F)
## marca 4 9.006 2.2514 7.653 0.000655 ***
## Residuals 20 5.884 0.2942
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#### F = 7.65, Fu = 2.87, de forma que rechazamos H0. Las marcas producen una cantidad de alivio significativamente diferente.
#### Las marcas producen una cantidad de alivio significativamente diferente
Ejercicio 11-38
En la ciudad de Bigville, una cadena de comida rápida está
adquiriendo una mala reputación debido a que tardan mucho en servir a
los clientes. Como la cadena tiene cuatro restaurantes en esa ciudad,
quiere saber si los cuatro restaurantes tienen el mismo tiempo promedio
de servicio. Uno de los dueños de la cadena ha decidido visitar cada
local y registrar el tiempo de servicio para 5 clientes escogidos al
azar. En sus cuatro visitas al medio día registró los siguientes tiempos
de servicio en minutos:
| 3 |
3 |
2 |
3 |
|
|
| 4 |
3.5 |
3.5 |
4 |
|
|
| 5.5 |
4.5 |
5 |
5.5 |
|
|
| 3.5 |
4. |
6.5 |
2.5 |
|
|
| 4 |
5.5 |
6 |
3 |
|
|
a) Utilice un nivel de significancia de 0.05, ¿todos los
restaurantes tienen el mismo tiempo medio de servicio?
b) Según sus resultados, ¿deberá el dueño hacer algunas
recomendaciones a cualquiera de los administradores de los
restaurantes?
restaurante <- read.csv("G:\\Mi unidad\\LIT\\Diagnostico para lineas de accion\\Archivos en R\\Semana 2\\restaurante.csv")
qf(0.95,df1=3,df2=16)
## [1] 3.238872
anova4 <- aov(tiempo ~ restaurante, data=restaurante)
summary(anova4)
## Df Sum Sq Mean Sq F value Pr(>F)
## restaurante 1 0.123 0.1225 0.076 0.786
## Residuals 18 29.015 1.6119
#### No se rechaza H0
#### Los tiempos medios de servicio no son significativamente diferentes
#### Debido a que ningún restaurante es peor que los otros, cualquier recomendación tendría que hacerse a todos los administradores
Ejercicio 12-64
Un arrendador está interesado en ver si las rentas de sus
departamentos son las comunes. Para esto tomó una muestra aleatoria de
11 rentas y tamaños de departamentos en complejos de departamentos
similares.
Los datos son los siguientes:
| 230 |
2 |
| 190 |
1 |
| 450 |
3 |
| 310 |
2 |
| 218 |
2 |
| 185 |
2 |
| 340 |
2 |
| 245 |
1 |
| 125 |
1 |
| 350 |
2 |
| 280 |
2 |
a) Desarrolle la ecuación de estimación que mejor describa estos
datos.
b) Calcule el coeficiente de determinación.
c) Pronostique la renta para un departamento de dos recámaras.
## a)
rentas <- c(230, 190, 450, 310, 218, 185, 340, 245, 125, 350, 280)
recamaras <- c(2, 1, 3, 2, 2, 2, 2, 1, 1, 2, 2)
regresion3 <- lm(rentas ~ recamaras)
summary(regresion3)
##
## Call:
## lm(formula = rentas ~ recamaras)
##
## Residuals:
## Min 1Q Median 3Q Max
## -101.80 -51.35 19.10 50.25 74.10
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 55.00 63.19 0.870 0.40667
## recamaras 115.90 33.13 3.498 0.00675 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 63.19 on 9 degrees of freedom
## Multiple R-squared: 0.5762, Adjusted R-squared: 0.5291
## F-statistic: 12.23 on 1 and 9 DF, p-value: 0.006746
## a) RENTA = 55.0018 + 115.8991*RECÁMARAS
## b)
## r2 = 0.5762.
## c)
recamaras1 <- 2
renta1 <- 55-115.90*recamaras1
renta1
## [1] -176.8
LS0tDQp0aXRsZTogIldvcmtzaG9wIDIiDQphdXRob3I6ICJIZWN0b3IgR3VhZGFsdXBlIGRlIGxhIEdhcnphIFRyZXZpw7FvIEEwMTE3Nzk2MCINCmRhdGU6ICIyMDIzLTA1LTIyIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIHRvYzogVFJVRQ0KICAgIHRvY19mbG9hdDogVFJVRQ0KICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUNCiAgICB0aGVtZTogdW5pdGVkDQogICAgaGlnaGxpZ2h0OiB0YW5nbw0KLS0tDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBCbHVlOyI+VGVtYSA1LiBQcnVlYmFzIGRlIEhpcG90w6lzaXMgVCBkZSBTdHVkZW50PC9zcGFuPg0KDQojIyMjIFV0aWxpemFyIFRhYmxhICJWYWxvcmVzIENyw610aWNvcyBwYXJhIERpc3RyaWJ1Y2lvbmVzIFQiDQoNCiFbXShHOlxcTWkgdW5pZGFkXFxMSVRcXERpYWdub3N0aWNvIHBhcmEgbGluZWFzIGRlIGFjY2lvblxcQXJjaGl2b3MgZW4gUlxcU2VtYW5hIDJcXFRzdHVkZW50LmpwZykNCg0KIyMjIyBUYWJsYSBHb3NzZXQgKHNpZ2xvIFhYKSBlbiBDZXJ2ZWNlcsOtYSBHdWluZXNzIGVuIElybGFuZGENCiMjIyMgU2UgdXNhIHNpZW1wcmUgcXVlIFRhbWHDsW8gbXVlc3RyYSA8PSAzMCB5IGxhIERlc3ZpYWNpw7NuIEVzdMOhbmRhciBQT0JMQUNJT05BTCBzZWEgZGVzY29ub2NpZGENCiMjIyMgRW4gZXN0YSBzZSBhc3VtZSBxdWUgbGEgRGlzdHJpYnVjacOzbiBkZSBsYSBwb2JsYWNpw7NuIGVzIG5vcm1hbCAobm8gZXN0w6Egc2VzZ2FkYSkNCg0KIyMgUGFzb3MNCiMjIyBQYXNvIDE6IFBsYW50ZWFyIEhpcG90w6lzaXMNCg0KIyMjIyBDYXNvIDENCg0KSDA6IM68ID0geC0gDQpIMTogIM68ID0vIHgtDQoNCiMjIyMgQ2FzbyAyDQoNCkgwOiDOvCA9IHgtIA0KSDE6IM68ID4geC0NCg0KIyMjIyBDYXNvIDMNCg0KSDA6IM68ID0geC0gDQpIMTogzrwgPCB4LQ0KDQoNCiMjIyBQYXNvIDI6IE5pdmVsIGRlIFNpZ25pZmljYW5jaWEgeSBHcmFkb3MgZGUgTGliZXJ0YWQNCg0KIyMjIyDOsShBbGZhKTogTml2ZWwgZGVTaWduaWZpY2FuY2lhID0gMSAtIE5pdmVsIGRlIENvbmZpYWJpbGlkYWQuIEVzdGUgdmFsb3Igc2UgYnVzY2EgZW4gbGEgdGFibGEgcGFyYSBvYnRlbmVyIGVsIHZhbG9yIGRlIFouDQoNCg0KIyMjIyBHcmFkb3MgZGUgTGliZXJ0YWQ6IG4tMQ0KDQoNCiMjIyBQYXNvIDM6IFpvbmEgZGUgQWNlcHRhY2nDs24geSBSZWNoYXpvDQoNCiMjIyMgT3BjacOzbiAxOiA+IC0gzrEgLyAyICYgPCDOsS8yDQoNCiMjIyMgT3BjaW9uIDI6IDwgzrENCg0KIyMjIyBPcGNpw7NuIDM6ID4gLc6xIA0KDQoNCiMjIyBQYXNvIDQ6IEbDs3JtdWxhDQoNCiMjIyMgdCA9ICh4LSAtIM68KSAgLyAgKHMvc3FydChuKSkNCg0KDQojIyMgUGFzbyA1OiBDb25jbHVzacOzbg0KDQojIyMjIFNlIHJlY2hhemEgSDANCiMjIyMgU2UgYWNlcHRhIEgwDQoNCiMjIEVqZXJjaWNpb3MNCiMjIyBFamVyY2ljaW8gMQ0KIyMjIyBGb2NvcyBkdXJhbiBwcm9tZWRpbyA1MDAgaHJzLCBTZSB2ZXJmaWNpYSBjb24gMjUgZm9jb3MsIGNvbiB1bmEgY29uZmlhbnphIGRlbCA5MCUsIGVsIHByb21lZGlvIGRlIGxvcyAyNSBmb2NvcyBmdWUgNTA1LjM2IGhycyB5IGxhIERlc3YgRXN0IE11ZXN0cmFsIDEyLjA3IGhycw0KYGBge3IgfQ0KIyBQYXNvIDENCiMgSDA6IM68ID0geC0gDQojSDE6ICDOvCA9LyB4LQ0KDQojUGFzbyAyDQojYWxmYSA9IDAuMTANCiMgR3JhZG8gTGliZXJ0YWQgMjUtMSA9IDI0DQoNCiMgUGFzbyAzIA0KIyA+IC0gzrEgLyAyICYgPCDOsS8yDQoNCiMgUGFzbyA0DQp0MT0gKDUwNS4zNiAtIDUwMCkgLyAoMTIuMDcvIHNxcnQoMjUpKQ0KdDENCg0KaWYgKHQxIDwgLTEuNzExfHx0MSA+IDEuNzExKSAgew0KICBSZXNwdWVzdGExIDwtICJFbiBlbCBlamVyY2ljaW8gMSwgU2UgcmVjaGF6YSBsYSBoaXDDs3Rlc2lzIG51bGEiDQp9IGVsc2Ugew0KICBSZXNwdWVzdGExIDwtICJFbiBlbCBlamVyY2ljaW8gMSwgc2UgYWNlcHRhIGxhIGhpcMOzdGVzaXMgbnVsYSINCn0NClJlc3B1ZXN0YTENCg0KYGBgDQojIyMgRWplcmNpY2lvIDINCmBgYHtyIH0NCkRhdG9zMiA8LSBjKDEwNywgOTIsIDk3LCA5NSwgMTA1LCAxMDEsIDkxLCA5OSwgOTUsIDEwNCkNClByb21QYWdvIDwtIDEwMA0KI05pdmVsIENvbmZpYW56YSA5MCUNClZhcmlhbnphMiA8LSB2YXIoRGF0b3MyKQ0KRGVzdjIgPC0gc3FydChWYXJpYW56YTIpDQoNClByb21NdWVzdHJhIDwtIG1lYW4oRGF0b3MyKQ0KDQojIFBhc28gMQ0KIyBIMDogzrwgPSB4LSANCiNIMTogIM68ID0vIHgtDQoNCiNQYXNvIDINCiNhbGZhID0gMC4xMA0KIyBHcmFkbyBMaWJlcnRhZCAxMC0xID0gOQ0KDQojIFBhc28gMyANCiMgPiAtIM6xIC8gMiAmIDwgzrEvMg0KIyDOsSA9IDAuMDUNCg0KI1Bhc28gNDoNCnQyIDwtIChQcm9tTXVlc3RyYSAtIFByb21QYWdvKS8oRGVzdjIvc3FydCgxMCkpDQp0Mg0KDQojUGFzbyA1Og0KaWYgKHQyIDwgLTEuODMzfHx0MiA+IDEuODMzKSAgew0KICBSZXNwdWVzdGEyIDwtICJFbiBlbCBlamVyY2ljaW8gMiwgU2UgcmVjaGF6YSBsYSBoaXDDs3Rlc2lzIG51bGEiDQp9IGVsc2Ugew0KICBSZXNwdWVzdGEyIDwtICJFbiBlbCBlamVyY2ljaW8gMiwgc2UgYWNlcHRhIGxhIGhpcMOzdGVzaXMgbnVsYSINCn0NClJlc3B1ZXN0YTINCg0KdC50ZXN0KERhdG9zMix5PSBOVUxMLGFsdGVybmF0aXZlPSJ0d28uc2lkZWQiLG11PTEwMCxwYWlyZWQ9RkFMU0UsdmFyLmVxdWFsP0ZBTFNFLGNvbmYubGV2ZWw9MC45MCkNCg0KI1NpIGVzIGRlIHVuYSBjb2xhLCBhbHRlcm5hdGl2ZSBwdWVkZSBzZXI6ICJsZXNzIiBvICJncmVhdGVyIg0KDQojU2kgcCB2YWx1ZSBlcyBtYXlvciBhIDAuMTAgc2UgYWNlcHRhIEgwDQoNCiNDb25jbHVzacOzbiBTZSBhY2VwdGEgSDANCiNJbnRlcnZhbG8gZGUgQ29uZmlhbnphOiBFbnRyZSA5NSB5IDEwMSBkw7NsYXJlcy4NCg0KYGBgDQojIyMgRWplcmNpY2lvIDgtNzANCiMjIyMgRHJpdmUtYS1MZW1vbiwgcmVudGEgYXV0b23Ds3ZpbGVzIGVuIGJ1ZW5hcyBjb25kaWNpb25lcyBtZWPDoW5pY2FzLCBwZXJvIG3DoXMgYW50aWd1b3MgcXVlIGFxdWVsbG9zIHF1ZSByZW50YW4gbGFzIGdyYW5kZXMgY2FkZW5hcyBuYWNpb25hbGVzIGRlIHJlbnRhIGRlIGNvY2hlcy4gQ29tbyByZXN1bHRhZG8sIGFudW5jaWEgcXVlIHN1cyB0YXJpZmFzIHNvbiBjb25zaWRlcmFibGVtZW50ZSBtw6FzIGJhamFzIHF1ZSBsYXMgZGUgc3VzIGdyYW5kZXMgY29tcGV0aWRvcmVzLiBVbmEgZW5jdWVzdGEgZW4gbGEgaW5kdXN0cmlhIGVzdGFibGVjacOzIHF1ZSBlbCBjYXJnbyB0b3RhbCBwcm9tZWRpbyBwb3IgcmVudGEgZW4gdW5hIGRlIGxhcyBtYXlvcmVzIGNvbXBhw7HDrWFzIGVzIGRlICQ3Ny4zOCBkw7NsYXJlcy4gVW5hIG11ZXN0cmEgYWxlYXRvcmlhIGRlIDE4IHRyYW5zYWNjaW9uZXMgcmVhbGl6YWRhcyBwb3IgRHJpdmUtYS0gTGVtb24gbW9zdHLDsyB1biBjYXJnbyB0b3RhbCBwcm9tZWRpbyBkZSAkODcuNjEsIGNvbiB1bmEgZGVzdmlhY2nDs24gZXN0w6FuZGFyIGRlIGxhIG11ZXN0cmEgZGUgJDE5LjQ4LiBWZXJpZmlxdWUgcXVlLCBjb24gdW4gbml2ZWwgZGUgc2lnbmlmaWNhbmNpYSBkZSAwLjAyNSwgZWwgY2FyZ28gdG90YWwgcHJvbWVkaW8gZGUgRHJpdmUtYS0gTGVtb24gZXMgbcOhcyBhbHRvIHF1ZSBlbCBkZSBsYXMgZ3JhbmRlcyBjb21wYcOxw61hcy4gwr9JbmRpY2EgZXN0ZSByZXN1bHRhZG8gcXVlIGxhcyB0YXJpZmFzIGRlIERyaXZlLSBhLUxlbW9uLCBubyBzb24gbcOhcyBiYWphcyBxdWUgbGFzIGRlIGxhcyBncmFuZGVzIGNhZGVuYXMgbmFjaW9uYWxlcz8gSnVzdGlmaXF1ZSBzdSByZXNwdWVzdGEuDQoNCiMjIyMgKipSZXNwdWVzdGE6KioNCiMjIyMgUGFzbyAxOiBQbGFudGVhciBIaXBvdMOpc2lzDQojIyMjIEgwOiDOvCA9IHgtIA0KIyMjIyBIMTogzrwgPiB4LQ0KDQojIyMjIFBhc28gMjogTml2ZWwgZGUgU2lnbmlmaWNhbmNpYQ0KIyMjIyBBbGZhOiAwLjAyNQ0KIyMjIyBHcmFkb3MgZGUgTGliZXJ0YWQgMTgtMT0gMTcNCg0KIyMjIyBQYXNvIDM6IFpvbmEgZGUgQWNlcHRhY2nDs24vUmVjaGF6bw0KIyMjIyA8IM6xDQojIyMjIM6xID0gMC4wMjUNCg0KIyMjIyBQYXNvIDQ6DQpgYGB7ciB9DQp0OF83MDwtICg4Ny42MSAtIDc3LjM4KS8oMTkuNDgvc3FydCgxOCkpDQp0OF83MA0KI1Bhc28gNQ0KaWYgKHQ4XzcwIDwgMi4xMTApICB7DQogIFJlc3B1ZXN0YThfNzAgPC0gIkVuIGVsIGVqZXJjaWNpbyA4XzcwLCBTZSByZWNoYXphIGxhIGhpcMOzdGVzaXMgbnVsYSINCn0gZWxzZSB7DQogIFJlc3B1ZXN0YThfNzAgPC0gIkVuIGVsIGVqZXJjaWNpbyA4XzcwLCBzZSBhY2VwdGEgbGEgaGlww7N0ZXNpcyBudWxhIg0KfQ0KUmVzcHVlc3RhOF83MA0KDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IG9yYW5nZTsiPiBUZW1hIDYuIEFuw6FsaXNpcyBkZSBWYXJpYW56YSAoQU5PVkEpIFVuaWZhY3RvcmlhbDwvc3Bhbj4NCg0KIyMjIyBTZSB1dGlsaXphIHBhcmEgZGV0ZXJtaW5hciBzaSBleGlzdGVuIGRpZmVyZW5jaWFzIGVzdGFkw61zdGljYW1lbnRlIHNpZ25pZmljYXRpdmFzIGVudHJlIGxhcyBtZWRpYXMgZGUgMyBvIG3DoXMgZ3J1cG9zLg0KIyMjIyBGYWN0b3I6IENhcmFjdGVyw61zdGljYSBxdWUgc2lkZXJlbmNpYSBsYXMgcG9ibGFjaW9uZXMvdHJhdGFtaWVudG9zDQojIyMjIE5pdmVsZXM6IERpc3RpbnRhcyBwb2JsYWNpb25lcy90cmF0YW1pZW50b3MNCiMjIyMgT2JzZXJ2YWNpb25lczogUGFydGVzIGVuIGNhZGEgcG9ibGFjacOzbi90cmF0YW1pZW50bw0KDQojIyBQYXNvcw0KIyMjIFBhc28gMTogUGxhbnRlYXIgSGlwb3TDqXNpcw0KIyMjIyBIMDogzrwxPc68Mj3OvDM9zrw0Pc68Tg0KIyMjIyBIMTogUG9yIGxvIG1lbm9zIGRvcyBkZSBsYXMgzrwgc29uIGRpZmVyZW50ZXMNCg0KDQoNCiMjIyBQYXNvIDI6IE5pdmVsIGRlIFNpZ25pZmljYW5jaWENCiMjIyMgIs6xID0gIg0KI05pdmVsZXMgKEkpDQojIyMjIE9ic2VydmFjaW9uZXMgKEopIA0KIyMjIyBHcmFkb3MgZGUgTGliZXJ0YWQgVHJhdGFtaWVudG9zIChHTFRyKSA9IEkgLSAxIA0KIyMjIyBHcmFkbyBkZSBMaWJlcnRhZCBkZWwgRXJyb3IgKEdMRSkgPSBJKEotMSkgDQoNCiMjIyBQYXNvIDM6IFpvbmEgZGUgQWNlcHRhY2nDs24vUmVjaGF6bw0KDQojIyMjIFZhbG9yIGRlIFRhYmxhIEYNCg0KIyMjIFBhc28gNDogRsOzcm11bGENCiMjIyMgU3VtYSBkZSBDdWFkcmFkb3MgVG90YWwgKFNDVCkNCiMjIyMgU3VtYSBkZSBDdWFkcmFkb3MgZGUgbG9zIFRyYXRhbWllbnRvcyAoU0NUcikNCiMjIyMgU3VtYSBkZSBDdWFkcmFkb3MgZGVsIEVycm9yIChTQ0UpDQojIyMjIEN1YWRyYWRvcyBNZWRpb3MgZGUgVHJhdGFtaWVudG9zIChDTVRyKSA9IFNDVHIvR0xUcg0KIyMjIyBDdWFkcmFkb3MgTWVkaW9zIGRlbCBFcnJvciAoQ01FKSA9IFNDRS9HTEUNCg0KIyMjIFBhc28gNTogQ29uY2x1c2nDs24NCg0KIyMjIyBTZSByZWNoYXphIEgwDQojIyMjIFNlIGFjZXB0YSBIMA0KDQojIyMgUGFzbyA2OiBQcmVzZW50YXIgUmVzdWx0YWRvcyBUYWJsYSBBTk9WQQ0KRnVlbnRlIGRlIFZhcmlhY2nDs24gfCBHcmFkb3MgZGUgTGliZXJ0YWQgfCBTdW1hIGRlIEN1YWRyYWRvcyB8IEN1YWRyYWRvcyBNZWRpb3MgfCBGIA0KLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLQ0KVHJhdGFtaWVudG9zCXwgR0xUciB8IFNDVHIgfCBDTVRyIHwgRlRyDQpFcnJvciB8CUdMRSB8IFNDRSB8IENNRSB8IA0KVG90YWwgfAlHTFQgfCBTQ1QgfCB8IA0KDQojIyBFamVyY2ljaW9zDQojIyMgRWplcmNpY2lvIDEgVW5hIGVtcHJlc2EgY29tcGFyw7MgZGlmZXJlbnRlcyB0aXBvcyBkZSBjYWphcyBjb24gcmVzcGVjdG8gYWxhIHJlc2lzdGVuY2lhIGEgbGEgY29tcHJlc2nDs24gZW4gbGlnYXMobGIpDQoNCmBgYHtyIH0NCkMxIDwtIGMoNjU1LjUsIDc4OC4zLCA3MzQuMywgNzIxLjQsIDc4OC4zLCA2NzkuMSwgNjk5LjQpDQpDMiA8LSBjKDc4OS4yLCA3NzIuNSwgNzg2LjksIDY4Ni4xLCA3MzIuMSwgNzc0LjgpDQpDMyA8LSBjKDczNy4xLCA2MzksIDY5Ni4zLCA2NzEuNywgNzE3LjIsIDcyNy4xKQ0KQzQgPC0gYyg1MzUuMSwgNjI4LjcsIDU0Mi40LCA1NTksIDU4Ni45LCA1MjApDQoNCiNQYXNvIDINCiNBbGZhID0gMC4wNQ0KI05pdmVsZXMgKEkpPSA0DQojIE9ic2VydmFjaW9uZXMgKEopID0gNg0KI0dyYWRvcyBkZSBMaWJlcnRhZCBUcmF0YW1pZW50b3MgPSBJIC0gMSA9IDQtMSA9IDMNCiNHcmFkbyBkZSBMaWJlcnRhZCBkZWwgRXJyb3IgPSBJKEotMSkgPSA0KDYtMSkgPSAyMA0KDQojUGFzbyAzDQpab25hQWNlcDwtIDMuMTANCg0KI1Bhc28gNA0KU0NUPC0gMTYxMjEzLjczDQpTQ1RyPC0gMTI3Mzc0Ljc2DQpTQ0UgPC0gU0NUIC0gU0NUcg0KU0NFDQoNCkNNVHI8LSBTQ1RyLzMNCkNNVHINCkNNRTwtIFNDRS8yMA0KQ01FDQoNCmY8LSBDTVRyL0NNRQ0KZg0KDQojUGFzbyA1DQojIFNlIHJlY2hhemEgSDANCg0KI1NvbHVjacOzbiBlbiBSDQojIHJlc2lzdGVuY2lhIDwtIHJlYWQuY3N2KCJDYWphcy5jc3YiKQ0KIyByZXNpc3RlbmNpYSRNZXpjbGE8LWFzLmZhY3RvcihyZXNpc3RlbmNpYSRDYWphKQ0KDQojIHFmKC45NSxkZjE9MyxkZj0yMCkNCiMgYW5vdmExIDwtIGFvdihSZXNpc3RlbmNpYXMgfiBDYWphLCBkYXRhPXJlc2lzdGVuY2lhKQ0KIyBzdW1tYXJ5KGFub3ZhMSkNCg0KYGBgDQojIyMgRWplcmNpY2lvIDINCg0KYGBge3IgfQ0KbWV6Y2xhMSA8LSBjKDAuNTYsIDEuMTIsIDAuOSwgMS4wNywgMC45NCkNCm1lemNsYTIgPC0gYygwLjcyLCAwLjY5LCAwLjg3LCAwLjc4LCAwLjkxKQ0KbWV6Y2xhMyA8LSBjKDAuNjIsIDEuMDgsIDEuMDcsIDAuOTksIDAuOTMpDQoNCiNQYXNvIDINCiNBbGZhID0gMC4wMQ0KI0k9IDMNCiNKID0gNQ0KI0dMVHIgPSAyDQojR0xFID0gIDEyDQoNCiMgUGFzbyAzDQpab25hQWNlcDwtIDYuOTMNCg0KIyBQYXNvIDQNCiNQYXNvIDQNClNDVDwtIDAuNDMwOQ0KU0NUcjwtIDAuMDYwOCANClNDRSA8LSBTQ1QgLSBTQ1RyDQpTQ0UNCg0KQ01UcjwtIFNDVHIvMg0KQ01Ucg0KQ01FPC0gU0NFLzEyDQpDTUUNCg0KZjwtIENNVHIvQ01FDQpmDQoNCiNQYXNvIDYNCiMgU2UgYWNlcHRhIEgwDQoNCiNWZXJzacOzbiBlbiBSDQoNCiMgREZNZXpjbGFzIDwtIHJlYWQuY3N2KCJNZXpjbGFzLmNzdiIpDQojIHFmKC45OSxkZjE9MixkZjI9MTIpDQojIERGTWV6Y2xhcyRNZXpjbGEgPC0gYXMuZmFjdG9yKERGTWV6Y2xhcyRNZXpjbGEpDQojIGFub3ZhMiA8LSBhb3YoVmFsb3IgfiBNZXpjbGEsIGRhdGEgPSBERk1lemNsYXMpDQojIHN1bW1hcnkoYW5vdmEyKQ0KDQpgYGANCg0KIyAgPHNwYW4gc3R5bGU9ImNvbG9yOiBsaWdodGdyZWVuOyI+ICBUZW1hIDcuIFJlZ3Jlc2nDs24gTGluZWFsIFNpbXBsZSA8L3NwYW4+IA0KDQohW10oRzpcXE1pIHVuaWRhZFxcTElUXFxEaWFnbm9zdGljbyBwYXJhIGxpbmVhcyBkZSBhY2Npb25cXEFyY2hpdm9zIGVuIFJcXFNlbWFuYSAyXFxyZWNhbWFyYS5qcGcpDQoNCiMjIyMgeSA9IEJvICsgQjFYIA0KDQojIyMjIEIxXiAoXjogRXN0aW1hZGEpID0gU3VtYXRvcmlhIChYaSAtIFgtKSh5aS15LSkgLyBTdW1hdG9yaWEgKFhpLVgtKV4yIA0KIyMjIyA9IFN4eSAvIFN4eCA9ICAgDQojIyMjID0gKCAoU3VtYXRvcmlhKHhpeWkpIC0gKFN1bWF0b3JpYSB4aSkoU3VtYXRvcmlhIHlpKS9uICApICAgLyBTdW1hdG9yaWEgWGleMiAgLSAgIChTdW1hdG9yaWEgWGkpIF4yIC8gbiANCiMjIyMgQjBePSAoU3VtYXRvcmlhIHkgLSBCMV4gKiBTdW1hdG9yaWEgeGkpICAvIG4gIA0KIyMjIyA9ICAgeS0gLSBCMV4gKiB4LQ0KDQojIyMjIFNDRSA9IFN1bWF0b3JpYSB5aV4yIC0gQjBeICogU3VtYXRvcmlhIFlpIC0gQjFeICogU3VtYXRvcmlhIHhpeWkNCiMjIyMgU1RDID0gU3VtYXRvcmlhKHlpLSB5LSleMiA9IFN5eT0gU3VtYXRvcmlhIFlpXjIgLSAoU3VtYXRvcmlhIHlpKV4yIC8gbg0KIyMjIyByXjIgPSAxLSAoU0NFL1NUQykNCg0KeCB8IHkgfCB4eSB8IHheMiB8IHleMg0KLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLQ0KMC4xCXwgOCB8IDEuNiB8IDAuMDQgfCA2NA0KMC41IHwJMTAgfCA1IHwgMC4yNSB8IDEwMA0KMSB8CTE4IHwgMTggfCAxIHwgMzI0DQoyIHwJMzUgfCA3MCB8IDQgfCAxMjI1DQozIHwJNjAgfCAxODAgfCA5IHwgNjAwDQo2LjcgfAkxMzEgfCAyNzQuNiB8IDE0LjI5IHwgNTMxMw0KMS4zNCB8CTI2LjIgfCB8IHwNCg0KIyMjIyBCMV49ICgyNzQuNiAtICg2LjcpKDEzMSkvNSkgLyAoMTQuMjktKCg2LjcpXjIpLzUpID0gMTguNjUNCiMjIyMgQjBePSAoMjYuMiAtIDE4LjY1KDEuMzQpKSA9IDEuMjENCg0KIyMjIyB5PSAxLjIxICsgMTguNjV4DQoNCiMjIyMgU0NFID0gNTMxMyAtIDEuMjEoMTMxKS0xOC42NSgyNzQuNikgPSAzMy41MA0KIyMjIyBTVEMgPSA1MzEzIC0gKDEzMV4yKSAvIDUgPSAxODgwLjgwDQojIyMjIHJeMiA9IDEtICgzMy41MC8xODgwLjgwKSA9IDAuOTgNCg0KIyMjIEZ1bmNpw7NuIGVuIFINCmBgYHtyIH0NCiNFamVyY2ljaW8gMQ0KeCA8LSBjKDAuMiwwLjUsMSwyLDMpDQp5IDwtIGMoOCwxMCwxOCwzNSw2MCkgDQpyZWdyZXNpb24gPC0gbG0oeSB+IHgpDQpzdW1tYXJ5KHJlZ3Jlc2lvbikNCnBsb3QocmVncmVzaW9uKQ0KDQoNCg0KI0VqZXJjaWNpbyAyDQp4MiA8LSBjKC02LAktMywJMCwJMywJNiwgOSwJMTIsCTE1LAkyMCwJMjUpDQp5MiA8LSBjKDIsCTIuOCwJMy45LAk0LjIsCTUuOCwJNi4yLAk3LjUsCTguMiwJOS4zLAkxMC45KQ0KUmVncmVzaW9uMiA8LSBsbSh5MiB+IHgyKQ0Kc3VtbWFyeShSZWdyZXNpb24yKQ0KcGxvdChSZWdyZXNpb24yKQ0KDQpgYGANCg0KIyMjICoqRWplcmNpY2lvIDExLTI2KioNCiMjIyMgVW4gZXN0dWRpbyBjb21wYXJhIGVsIG7Dum1lcm8gZGUgaG9yYXMgZGUgYWxpdmlvIHF1ZSBwcm9wb3JjaW9uYW4gY2luY28gbWFyY2FzIGRlIGFudGnDoWNpZG9zIGFkbWluaXN0cmFkb3MgYSAyNSBwZXJzb25hcyBkaWZlcmVudGVzLCBjYWRhIHVuYSBjb24gYWNpZGV6IGVzdG9tYWNhbCBjb25zaWRlcmFkYSBmdWVydGUuIExvcyByZXN1bHRhZG9zIHNvbiBsb3Mgc2lndWllbnRlczoNCk1hcmNhIHwgQSB8IEIgfCBDIHwgRCB8IEUNCiAtLS0gfCAtLS0gfCAtLS0gfCAtLS0gfCAtLS0gfCAtLS0gfA0KICAtICAgIHwgNC40IHwgNS44IHwgNC44IHwgMi45IHwgNC42DQogIC0gICAgfCA0LjYgfCA1LjIgfCA1LjkgfCAyLjcgfCA0LjMNCiAgLSAgICB8IDQuNSB8IDQuOSB8IDQuOSB8IDIuOSB8IDMuOA0KICAtICAgIHwgNC4xIHwgNC43IHwgNC42IHwgMy45IHwgNS4yDQogIC0gICAgfCAzLjggfCA0LjYgfCA0LjMgfCA0LjMgfCA0LjQNCg0KIyMjIyMgYSkgQ2FsY3VsZSBlbCBjb2NpZW50ZSBGLiBQYXJhIHVuIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgZGUgMC4wNSwgwr9sYXMgbWFyY2FzIHByb2R1Y2VuIGNhbnRpZGFkZXMgc2lnbmlmaWNhdGl2YW1lbnRlIGRpZmVyZW50ZXMgZGUgYWxpdmlvIGEgbGFzIHBlcnNvbmFzIGNvbiBhY2lkZXogZXN0b21hY2FsIGZ1ZXJ0ZT8NCmBgYHtyfQ0KYW50aWFjaWRvcyA8LSByZWFkLmNzdigiRzpcXE1pIHVuaWRhZFxcTElUXFxEaWFnbm9zdGljbyBwYXJhIGxpbmVhcyBkZSBhY2Npb25cXEFyY2hpdm9zIGVuIFJcXFNlbWFuYSAyXFxhbnRpYWNpZG9zLmNzdiIpDQphbnRpYWNpZG9zJG1hcmNhIDwtIGFzLmZhY3RvcihhbnRpYWNpZG9zJG1hcmNhKQ0KcWYoMC45NSxkZjE9NCxkZjI9MTIpDQphbm92YTMgPC0gYW92KGhvcmFzIH4gbWFyY2EsIGRhdGE9YW50aWFjaWRvcykNCnN1bW1hcnkoYW5vdmEzKQ0KDQojIyMjIEYgPSA3LjY1LCBGdSA9IDIuODcsIGRlIGZvcm1hIHF1ZSByZWNoYXphbW9zIEgwLiBMYXMgbWFyY2FzIHByb2R1Y2VuIHVuYSBjYW50aWRhZCBkZSBhbGl2aW8gc2lnbmlmaWNhdGl2YW1lbnRlIGRpZmVyZW50ZS4gDQojIyMjIExhcyBtYXJjYXMgcHJvZHVjZW4gdW5hIGNhbnRpZGFkIGRlIGFsaXZpbyBzaWduaWZpY2F0aXZhbWVudGUgZGlmZXJlbnRlDQpgYGANCg0KIyMjICoqRWplcmNpY2lvIDExLTM4KioNCiMjIyMjIEVuIGxhIGNpdWRhZCBkZSBCaWd2aWxsZSwgdW5hIGNhZGVuYSBkZSBjb21pZGEgcsOhcGlkYSBlc3TDoSBhZHF1aXJpZW5kbyB1bmEgbWFsYSByZXB1dGFjacOzbiBkZWJpZG8gYSBxdWUgdGFyZGFuIG11Y2hvIGVuIHNlcnZpciBhIGxvcyBjbGllbnRlcy4gQ29tbyBsYSBjYWRlbmEgdGllbmUgY3VhdHJvIHJlc3RhdXJhbnRlcyBlbiBlc2EgY2l1ZGFkLCBxdWllcmUgc2FiZXIgc2kgbG9zIGN1YXRybyByZXN0YXVyYW50ZXMgdGllbmVuIGVsIG1pc21vIHRpZW1wbyBwcm9tZWRpbyBkZSBzZXJ2aWNpby4gVW5vIGRlIGxvcyBkdWXDsW9zIGRlIGxhIGNhZGVuYSBoYSBkZWNpZGlkbyB2aXNpdGFyIGNhZGEgbG9jYWwgeSByZWdpc3RyYXIgZWwgdGllbXBvIGRlIHNlcnZpY2lvIHBhcmEgNSBjbGllbnRlcyBlc2NvZ2lkb3MgYWwgYXphci4gRW4gc3VzIGN1YXRybyB2aXNpdGFzIGFsIG1lZGlvIGTDrWEgcmVnaXN0csOzIGxvcyBzaWd1aWVudGVzIHRpZW1wb3MgZGUgc2VydmljaW8gZW4gbWludXRvczoNClJlc3RhdXJhbnRlIDEgfCBSZXN0YXVyYW50ZSAyIHwgUmVzdGF1cmFudGUgMyB8IFJlc3RhdXJhbnRlIDQgfA0KIC0tLSB8IC0tLSB8IC0tLSB8IC0tLSB8IC0tLSB8IC0tLSB8DQozICAgfCAzICAgfCAyICAgfCAzICAgfA0KNCAgIHwgMy41IHwgMy41IHwgNCAgIHwNCjUuNSB8IDQuNSB8IDUgICB8IDUuNSB8DQozLjUgfCA0LiAgfCA2LjUgfCAyLjUgfA0KNCAgIHwgNS41IHwgNiAgIHwgMyAgIHwNCg0KIyMjIyMgYSkgVXRpbGljZSB1biBuaXZlbCBkZSBzaWduaWZpY2FuY2lhIGRlIDAuMDUsIMK/dG9kb3MgbG9zIHJlc3RhdXJhbnRlcyB0aWVuZW4gZWwgbWlzbW8gdGllbXBvIG1lZGlvIGRlIHNlcnZpY2lvPw0KIyMjIyMgYikgU2Vnw7puIHN1cyByZXN1bHRhZG9zLCDCv2RlYmVyw6EgZWwgZHVlw7FvIGhhY2VyIGFsZ3VuYXMgcmVjb21lbmRhY2lvbmVzIGEgY3VhbHF1aWVyYSBkZSBsb3MgYWRtaW5pc3RyYWRvcmVzIGRlIGxvcyByZXN0YXVyYW50ZXM/DQpgYGB7cn0NCnJlc3RhdXJhbnRlIDwtIHJlYWQuY3N2KCJHOlxcTWkgdW5pZGFkXFxMSVRcXERpYWdub3N0aWNvIHBhcmEgbGluZWFzIGRlIGFjY2lvblxcQXJjaGl2b3MgZW4gUlxcU2VtYW5hIDJcXHJlc3RhdXJhbnRlLmNzdiIpDQpxZigwLjk1LGRmMT0zLGRmMj0xNikNCmFub3ZhNCA8LSBhb3YodGllbXBvIH4gcmVzdGF1cmFudGUsIGRhdGE9cmVzdGF1cmFudGUpDQpzdW1tYXJ5KGFub3ZhNCkNCg0KIyMjIyBObyBzZSByZWNoYXphIEgwDQojIyMjIExvcyB0aWVtcG9zIG1lZGlvcyBkZSBzZXJ2aWNpbyBubyBzb24gc2lnbmlmaWNhdGl2YW1lbnRlIGRpZmVyZW50ZXMNCiMjIyMgRGViaWRvIGEgcXVlIG5pbmfDum4gcmVzdGF1cmFudGUgZXMgcGVvciBxdWUgbG9zIG90cm9zLCBjdWFscXVpZXIgcmVjb21lbmRhY2nDs24gdGVuZHLDrWEgcXVlIGhhY2Vyc2UgYSB0b2RvcyBsb3MgYWRtaW5pc3RyYWRvcmVzDQoNCmBgYA0KDQojIyMgKipFamVyY2ljaW8gMTItNjQqKg0KIyMjIyMgVW4gYXJyZW5kYWRvciBlc3TDoSBpbnRlcmVzYWRvIGVuIHZlciBzaSBsYXMgcmVudGFzIGRlIHN1cyBkZXBhcnRhbWVudG9zIHNvbiBsYXMgY29tdW5lcy4gUGFyYSBlc3RvIHRvbcOzIHVuYSBtdWVzdHJhIGFsZWF0b3JpYSBkZSAxMSByZW50YXMgeSB0YW1hw7FvcyBkZSBkZXBhcnRhbWVudG9zIGVuIGNvbXBsZWpvcyBkZSBkZXBhcnRhbWVudG9zIHNpbWlsYXJlcy4gDQojIyMjIyBMb3MgZGF0b3Mgc29uIGxvcyBzaWd1aWVudGVzOg0KDQpSZW50YSB8IE7DuW1lcm8gZGUgcmVjYW1hcmFzDQogLS0tLS0tIHwgLS0tLS0tIA0KMjMwIHwgMg0KMTkwIHwgMQ0KNDUwIHwgMw0KMzEwIHwgMg0KMjE4IHwgMg0KMTg1IHwgMg0KMzQwIHwgMg0KMjQ1IHwgMQ0KMTI1IHwgMSANCjM1MCB8IDINCjI4MCB8IDINCg0KIyMjIyMgYSkgRGVzYXJyb2xsZSBsYSBlY3VhY2nDs24gZGUgZXN0aW1hY2nDs24gcXVlIG1lam9yIGRlc2NyaWJhIGVzdG9zIGRhdG9zLg0KIyMjIyMgYikgQ2FsY3VsZSBlbCBjb2VmaWNpZW50ZSBkZSBkZXRlcm1pbmFjacOzbi4NCiMjIyMjIGMpIFByb25vc3RpcXVlIGxhIHJlbnRhIHBhcmEgdW4gZGVwYXJ0YW1lbnRvIGRlIGRvcyByZWPDoW1hcmFzLg0KDQpgYGB7cn0NCiMjIGEpDQpyZW50YXMgPC0gYygyMzAsIDE5MCwgNDUwLCAzMTAsIDIxOCwgMTg1LCAzNDAsIDI0NSwgMTI1LCAzNTAsIDI4MCkNCnJlY2FtYXJhcyA8LSBjKDIsIDEsIDMsIDIsIDIsIDIsIDIsIDEsIDEsIDIsIDIpDQoNCnJlZ3Jlc2lvbjMgPC0gbG0ocmVudGFzIH4gcmVjYW1hcmFzKQ0Kc3VtbWFyeShyZWdyZXNpb24zKQ0KIyMgYSkgUkVOVEEgPSA1NS4wMDE4ICsgMTE1Ljg5OTEqUkVDw4FNQVJBUw0KDQojIyBiKQ0KIyMgcjIgPSAwLjU3NjIuDQoNCiMjIGMpDQpyZWNhbWFyYXMxIDwtIDINCnJlbnRhMSA8LSA1NS0xMTUuOTAqcmVjYW1hcmFzMQ0KcmVudGExDQoNCmBgYA0KDQo=