Introducción
La comparación de los intervalos de confianza de 2 grupos es un
método “informal” para saber si las diferencias en las medias o las
proporciones entre dos grupos se pueden extrapolar a la población. La
idea era calcular los intervalos de confianza para cada grupo y ver si
los intervalos se interceptan o no. La regla era que si los intervalos
de ambos grupos no se interceptaban, podíamos extrapolar que la
diferencia muestral existe en la población al 95% de confianza. Si los
intervalos no se traslapan, entonces no podemos afirmar que las
diferencias sean significativas. En esta sección se verá cómo pasar de
la evaluación “informal” a la “formal” mediante la introducción a la
prueba t de diferencia de medias.
Los 6 pasos de la inferencia estadística
Estos 6 pasos básicamente se seguirán en toda prueba inferencial,
donde se quiera extrapolar un resultado de la muestra a la
población.
Paso 1: hipótesis
ANALOGÍA DEL JUICIO: el acusado entra el juicio con presunción de
inocencia.
Formular la hipótesis nula y la hipótesis alternativa. Ambas
hipótesis son acerca de los parámetros.
H0: \(\mu_{x1} - \mu_{x2} = 0\)
HA: \(\mu_{x1} - \mu_{x2} \ne
0\)
La H0 es generalmente la hipótesis de no efecto, de no diferencias.
Se parte siempre de una hipótesis de no diferencias. Esta es la
hipótesis que se busca negar mediante los resultados obtenidos en la
muestra.
La idea central es que si la H0 fuera cierta en la población, los
resultados muestrales ocurrirían muy cerca a 0 en muchas muestras y
pocas muestras tendrán valores muy diferentes de cero.
Paso 2: distribución muestral
ANALOGÍA DEL JUICIO: Si el acusado es inocente, entonces no
debería existir tales o cuales pruebas
Si la H0 es verdadera y se extraen muestras repetidamente, las
diferencias muestrales se centrarán alrededor de cero como una
distribución t aproximadamente normal. Esta distribución tendrá un error
estándar calculado
- Si las varianzas poblacionales son iguales de:
\[
s_{\overline{x1}-\overline{x2}} =
\sqrt{\frac{(n_1-1)s_{x1}^2+(n_2-1)s_{x2}^2}{n_1+n_2-2}}*\sqrt{\frac{n_1+n_2}{n_1n_2}}
\]
- Si las varianzas poblacionales son diferentes de:
\[
s_{\overline{x1}-\overline{x2}} =
\sqrt{\frac{s_{X1}^2}{n_1-1}+\frac{s_{X2}^2}{n_2-1}}
\]
Paso 3: nivel de significancia
ANALOGÍA DEL JUICIO: qué tantas pruebas debe haber para
sentenciar al acusado?
Se trata de la probabilidad que define qué tan inusual debe ser la
diferencia de medias muestral para rechazar la H0 (que la diferencia de
medias poblacionales sea 0). El valor más común es de \(\alpha=0.05\).
Es decir, qué tan diferente debe ser la diferencia de medias
muestrales de cero para poder afirmar que este valor es muy “raro” o
“diferente” si es que la H0 fuera cierta.
Paso 4: observación
ANALOGÍA DEL JUICIO: Qué pruebas trae el fiscal y la
policía?
Se calcula el estadístico de la prueba. Este estadístico lo que hace
es “medir” qué tan “raro” o “diferente” es el valor encontrado.
\[
t_{\overline{x1}-\overline{x2}}=\frac{\overline{X}_1-\overline{X}_2}{s_{\overline{X}_1-\overline{X}_2}}
\]
Este valor del estadístico de la prueba está en unidades del error
estándar, es decir, qué tan cerca o lejos se encuentra del centro de la
distribución (centrada en 0).
Con este valor, en la distribución t se calcula la probabilidad de
que este valor ocurra, el valor de p-value. Es decir, el p-value mide la
probabilidad de observar en una muestra una diferencia de medias como la
observada, si la diferencia de medias poblacional fuera cero.
Se puede usar una calculadora de p-value de la distribución t
disponible aquí.
En la práctica, cualquier software estadístico nos brinda el resultado
del p-value.
Paso 5: decisión
ANALOGÍA DEL JUICIO: Juez decide si las pruebas no son lo
suficientemente sólidas para condenar al acusado. O, si son lo
suficientemente sólidas para condenarlo.
- Si el p-value > 0.05, entonces se falla en rechazar la Ho. Esto
indicaría que existe más de 5% de probabilidades que una muestra
aleatoria cualquiera encuentre una diferencia de medias como la
observada si es que la diferencia de medias poblacional fuese 0.
- Si el p-value <= 0.05 entonces se rechaza H0 y se afirma HA
(siempre con un grado de incertidumbre). Esto indicaría que la
probabilidad de observar una diferencia de medias como la observada en
la muestra es baja (menor a 5%). Como sí se ha observado esa diferencia
de medias en la muestra, entonces se concluye que lo más probable es que
la hipótesis que indica que la diferencia de medias poblacional es 0 sea
falsa.
Paso 6: interpretación
ANALOGÍA DEL JUICIO: Si no hay suficientes pruebas, nunca se
afirma que el acusado es inocente!!! Se afirma que no es culpable. Si
hay suficientes pruebas, se afirma que el acusado es culpable.
Si el p-value es > 0.05, la conclusión es que no se puede
rechazar la Ho. La conclusión NO es que se afirma la H0. Nunca se afirma
que las medias sean iguales!!!
Con los datos obtenidos, no se puede decir que existe una
diferencia de medias entre ambos grupos.
Si el p-value es <= 0.05, se afirma que sí existe una
diferencia de medias entre ambos grupos con un 95% de
confianza.
Ejemplo 1 de variable numérica: ENDO 2020
Importamos la base de datos
library(rio)
endo2020 = import("bases/ENDO_REMOTO_2020.dta")
Factorizamos la variable P1_1 y creamos variable sexo con sus
etiquetas.
library(dplyr)
library(tidyverse)
endo2020 = endo2020 %>%
mutate(sexo = factor(P1_1, labels=c("Hombre", "Mujer")))
Queremos evaluar la diferencia de medias entre el número de alumnos
con los que trabaja un profesor hombre y una profesora mujer. Para esto
calculamos la media de alumnos para cada grupo.
alumxsexo = endo2020 %>%
group_by(sexo) %>%
summarize(Media = mean(P1_6, na.rm = T))
alumxsexo
## # A tibble: 3 × 2
## sexo Media
## <fct> <dbl>
## 1 Hombre 52.2
## 2 Mujer 34.1
## 3 <NA> NaN
Con esta tabla, calculamos la diferencia entre las medias de los
grupos.
alumxsexo[1,2] - alumxsexo[2,2]
## Media
## 1 18.18187
La diferencia es de 18.2 alumnos. Esta diferencia es para el grupo de
28 mil profesores encuestados. La pregunta es: ¿Se puede afirmar que
existe esta diferencia en la población?
Para evaluar si existen o no diferencias poblacionales, usamos el
comando t.test
. E
t.test(P1_6 ~ sexo, data = endo2020)
##
## Welch Two Sample t-test
##
## data: P1_6 by sexo
## t = 21.079, df = 9466.6, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group Hombre and group Mujer is not equal to 0
## 95 percent confidence interval:
## 16.49110 19.87264
## sample estimates:
## mean in group Hombre mean in group Mujer
## 52.24745 34.06558
Como el p-value < 0.05, entonces se rechaza la H0 y se puede
afirmar que esa diferencia existe en la población a tal nivel de
significancia.
endo2020 = endo2020 %>%
mutate(nivel = case_when(
NIVEL==1~1,
NIVEL==2~2,
NIVEL==3~2))
alumxnivel = endo2020 %>%
group_by(nivel) %>%
summarize(Media = mean(P1_6, na.rm = T))
alumxnivel
## # A tibble: 2 × 2
## nivel Media
## <dbl> <dbl>
## 1 1 18.7
## 2 2 48.6
t.test(P1_6 ~ nivel, data = endo2020)
##
## Welch Two Sample t-test
##
## data: P1_6 by nivel
## t = -58.732, df = 14809, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group 1 and group 2 is not equal to 0
## 95 percent confidence interval:
## -30.89932 -28.90345
## sample estimates:
## mean in group 1 mean in group 2
## 18.67677 48.57816
Ejemplo de variable categórica para la diferencia de proporciones:
ENDO
Se vio en el módulo anterior que se podía evaluar si existen
diferencias entre la proporción de profesores hombres que habían
recibido apoyo psicológico comparado con las profesoras mujeres.
La prueba adecuada para evaluar una prueba de diferencia de
proporciones es mediante el comando prop.test
. Este
comando, como se puede ver en el “help”, pide como argumentos los datos
de “éxitos” (la proporción que se quiere evaluar) y los datos de
“intentos” (el n total). Es decir, a diferencia del comando
t.test
que pido como argumentos las variables, aquí se
tiene primero que encontrar los “éxitos” e “intentos”.
Primero se tiene que transformar la variable P1_13 que es importada
como numérica, como una variable de factor y con sus etiquetas.
endo2020 = endo2020 %>%
mutate(apoyo = factor(P1_13, labels=c("Sí", "No")))
Luego, para responder a la pregunta de si esta proporción varía entre
docentes hombres y mujeres, tenemos que crear otra tabla con las
frecuencias por cada grupo de la variable “sexo” y “apoyo”.
A diferencia del módulo anterior, aquí vamos a usar
group_by
de ambas variables y en cada grupo calcular el N
total. Esto nos dará los éxitos que requerimos.
tabla1 = endo2020 %>%
filter(apoyo =="Sí" | apoyo == "No") %>%
group_by(sexo) %>%
count(apoyo = apoyo, name="N") %>%
mutate(total = sum(N))
tabla1
## # A tibble: 4 × 4
## # Groups: sexo [2]
## sexo apoyo N total
## <fct> <fct> <int> <int>
## 1 Hombre Sí 2777 6163
## 2 Hombre No 3386 6163
## 3 Mujer Sí 6699 12767
## 4 Mujer No 6068 12767
Con estos datos, corremos el comando prop.test
.
prop.test(c(2777, 6699), c(6163,12767))
##
## 2-sample test for equality of proportions with continuity correction
##
## data: c(2777, 6699) out of c(6163, 12767)
## X-squared = 91.044, df = 1, p-value < 2.2e-16
## alternative hypothesis: two.sided
## 95 percent confidence interval:
## -0.08938432 -0.05885549
## sample estimates:
## prop 1 prop 2
## 0.4505922 0.5247121
Según los resultados, se encuentra que el 52.5% de docentes mujeres
recibieron apoyo psicológico versus el 45.1% de docentes hombres. Este
comando nos brinda el IC de la diferencia de proporciones al 95% de
confianza. Este IC de la diferencia de proporciones varía entre -8.9% y
-5.9%. La diferencia de proporciones tiene un p-value < 2.2e-16, que
es menor a 0.05, por lo que se rechaza la H0 y se afirma que la
diferencia en porcentajes entre hombres y mujeres es estadísticamente
significativa en la población. Es decir, que las profesoras peruanas
reciben más ayuda psicológica que los profesores peruanos.
Otro ejemplo es evaluar si la condición laboral de “Nombrado” (P1_7)
varía entre hombres y mujeres. Lo primero es factorizar la variable.
endo2020 = endo2020 %>%
mutate(condicion = factor(P1_7, labels=c("Nombrado",
"Contratado por concurso",
"Contratado con otra modalidad")))
Luego, se crea la tabla con los datos que requerimos.
tabla2 = endo2020 %>%
filter(condicion =="Nombrado" | condicion == "Contratado por concurso"
| condicion == "Contratado con otra modalidad") %>%
group_by(sexo) %>%
count(condicion = condicion, name="N") %>%
mutate(total = sum(N))
tabla2
## # A tibble: 6 × 4
## # Groups: sexo [2]
## sexo condicion N total
## <fct> <fct> <int> <int>
## 1 Hombre Nombrado 3303 6171
## 2 Hombre Contratado por concurso 2830 6171
## 3 Hombre Contratado con otra modalidad 38 6171
## 4 Mujer Nombrado 7140 12779
## 5 Mujer Contratado por concurso 5578 12779
## 6 Mujer Contratado con otra modalidad 61 12779
Con esta tabla se encuentra que entre los hombres se tiene 3303
éxitos y para las mujeres un total de 7140 éxitos. Lo que no se
encuentra directamente es el total, que se tiene que calcular sobre cada
grupo, sobre cada columna.
De esta manera se encuentra que entre los hombres se tiene 3303
éxitos de un total de 6171 intentos (53.5.4%). Entre los mujeres se
tiene 7140 intentos de un total de 12779 intentos (55.9%).
Para tener una mejor presentación de la tabla cuando se produce el
html, se puede usar la librería knitr
y el comando
kable
.
library(knitr)
kable(head(tabla2), format="markdown", digits=1)
Hombre |
Nombrado |
3303 |
6171 |
Hombre |
Contratado por concurso |
2830 |
6171 |
Hombre |
Contratado con otra modalidad |
38 |
6171 |
Mujer |
Nombrado |
7140 |
12779 |
Mujer |
Contratado por concurso |
5578 |
12779 |
Mujer |
Contratado con otra modalidad |
61 |
12779 |
Estos datos son los que requiere el comando prop.table
para evaluar la diferencia de proporciones (9.7-6.4= 3.3%).
prop.test(x=c(3303, 7140), n=c(6171, 12779), conf.level=0.95)
##
## 2-sample test for equality of proportions with continuity correction
##
## data: c(3303, 7140) out of c(6171, 12779)
## X-squared = 9.182, df = 1, p-value = 0.002444
## alternative hypothesis: two.sided
## 95 percent confidence interval:
## -0.038735472 -0.008231852
## sample estimates:
## prop 1 prop 2
## 0.5352455 0.5587292
Como se observa de los resultados, el estadístico de la prueba
“X-squared” se llama chi-cuadrado y no es el mismo que el estadístico t.
El p-value asociado es 0.0025 < 0.05, por lo que lleva a la
conclusión de rechazar la H0 de igualdad de proporciones y afirmar que
entre ambos grupos existe una diferencia en la proporción de “nombrados”
entre hombres y mujeres en la población.
Es importante notar cuando se concluye que no se puede decir
o no se puede afirmar. Cuando se obtiene un p-value <= 0.05,
se rechaza la H0 y se afirma la HA, que la diferencia existe en la
población con un 95% de confianza. Pero, cuando se obtiene un p-value
> 0.05, no se afirma la HA, lo que se concluye es que no se puede
rechazar la H0. Esto quiere decir que no afirmamos que las medias
poblacionales sean iguales, sino que, con los datos que tenemos, no
podemos decir que son diferentes.
Para aclarar esto, vale la pena hacer una analogía jurídica.
Analogía del juicio
Ya sea mediante nuestra experiencia viendo JusticiaTV o viendo series
sobre abogados, la imagen que tenemos de un juicio es como esta
imagen.
En esta imagen hay varios actores:
El acusado: entre rejas y con el traje naranja.
El policía que cuida al acusado, pero que también simboliza a la
institución que se encarga del recojo de pruebas.
El fiscal o parte acusadora: que se encuentra mostrando una
imagen de un cuchillo, posiblemente tomada por un policía.
Los abogados defensores: sentados.
El jurado: que evalúan las pruebas y tienen la facultad de emitir
un veredicto.
El juez: que anuncia el veredicto y le da carácter
legal.
La lógica que sigue este tipo de procedimiento es similar a la que
sigue una prueba de inferencia estadística.
La H0 es la hipótesis de no efecto. En el caso del juicio es el
supuesto de entrada de que el acusado es inocente. Se llama “presunción
de inocencia”. La hipótesis alternativa es que es culpable, pero para
llegar a ella se requiere negar la H0 mediante datos o
“evidencia”.
La policía es la que recoge la evidencia para que la fiscalía
pueda acusar. Es decir, la policía armaría la “base de datos” de
evidencia.
La labor de la fiscalía (la parte que acusa) es armar el caso. Es
decir, presentar la evidencia recogida por la policía de tal manera que
el jurado se convenza del caso. La fiscalía sería como la prueba de
inferencia estadística.
Mientras más y mejor evidencia presente la fiscalía, más
elementos para que el jurado rechace la H0 de “presunción de
inocencia”.
Si la evidencia no es sólida, el jurado tendrá dudas y puede no
rechazar la Ho de presunción de inocencia.
En el juicio no hay una medida matemática que resuma la evidencia
a favor o en contra (como el p-value) ni un valor crítico para tomar una
decisión. Se asume que los jurados sabrán establecer ese límite en el
cual la evidencia es lo suficientemente sólida para rechazar la
H0.
Si la evidencia cruza ese umbral de los jurados, se rechazará la
H0. El jurado recomendará su decisión al juez. El juez anunciará que el
acusado es “culpable”. Es decir, se afirma la HA.
Si la evidencia no cruza ese umbral de los jurados, no se rechaza
la H0. El jurado trasladará su decisión al juez y el juez anunciará que
el acusado “no es culpable”. Es decir, no se puede rechazar la
H0.
Es importante notar la decisión cuando la evidencia no es sólida.
No es lo mismo decir “no es culpable” a decir “es inocente”. Decir que
el acusado no es culpable involucra una situación de incertidumbre. Por
ejemplo, si la policía no hizo bien su trabajo y no recogió la evidencia
de manera adecuada, es posible que haya dudas con respecto al acusado.
Decir que el acusado es inocente, por el contrario, implica una certeza,
que la evidencia es contundente en apuntar en esa dirección.
A pesar que este método es científico puede llevar a
errores.
Falso positivo (o error de tipo I): cuando declaras culpable a un
inocente.
Falso negativo (o error de tipo II): cuando declaras no culpable
a un culpable.
- Para evitar falsos positivos se propone pedir evidencia cada vez más
sólida para condenar a alguien. Pero, si se exige evidencia cada vez más
solida, aumenta la probabilidad de falsos negativos. Ambos tipos de
errores se contrabalancean mutuamente.
¿Qué tipo de error es más pernicioso? Es un tema que los filósofos
tratan de responder.
“There are two ways to be fooled. One is to believe what isn´t true.
The other is to refuse to believe what is true” (Soren Kierkegaard).
Nota final
Este procedimiento se podría decir que es parte del método
científico, en el sentido popperiano de “falseabilidad”. Desde esta
perspectiva, una investigación científica parte de una hipótesis de no
efecto que busca negar con evidencia empírica para llegar a la
conclusión que sí existen ese efecto. Las conclusiones a las que se
llegan siempre tienen un componente de incertidumbre.
Este método es contraintuitivo. El ser humano, por el contrario,
generalmente busca evidencia para afirmar una hipótesis de que existe un
efecto o relación. En cierto sentido, se busca reafirmar las
prenociones.
Por ejemplo, no es lo mismo partir de la hipótesis que la “revolución
capitalista” en el Perú trajo bienestar y desarrollo y buscar evidencia
que apoya esta hipótesis, que partir de la hipótesis que la “revolución
capitalista” NO trajo bienestar y desarrollo y buscar evidencia
suficiente para negar esa hipótesis y afirmar que sí lo hizo. Para una
muestra de esta diferencia ver el comentario
de Cotler al libro de Althaus.
LS0tCnRpdGxlOiAiQ2xhc2UgNSB5IDY6IFBydWViYXMgZGUgc2lnbmlmaWNhbmNpYSIKYXV0aG9yOiAiQXJ0dXJvIE1hbGRvbmFkbyIKZGF0ZTogIjI0LzA5LzIwMjQiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIGNvbGxhcHNlZDogZmFsc2UKICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UKICAgIHRvY19kZXB0aDogMQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgdGhlbWU6IGNvc21vCiAgICBoaWdobGlnaHQ6IHRleHRtYXRlCmVkaXRvcl9vcHRpb25zOgogIG1hcmtkb3duOgogICAgd3JhcDogc2VudGVuY2UKYmlibGlvZ3JhcGh5OiByZWZlcmVuY2VzLmJpYgotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmBgYAoKIyBJbnRyb2R1Y2Npw7NuCgpMYSBjb21wYXJhY2nDs24gZGUgbG9zIGludGVydmFsb3MgZGUgY29uZmlhbnphIGRlIDIgZ3J1cG9zIGVzIHVuIG3DqXRvZG8gImluZm9ybWFsIiBwYXJhIHNhYmVyIHNpIGxhcyBkaWZlcmVuY2lhcyBlbiBsYXMgbWVkaWFzIG8gbGFzIHByb3BvcmNpb25lcyBlbnRyZSBkb3MgZ3J1cG9zIHNlIHB1ZWRlbiBleHRyYXBvbGFyIGEgbGEgcG9ibGFjacOzbi4KTGEgaWRlYSBlcmEgY2FsY3VsYXIgbG9zIGludGVydmFsb3MgZGUgY29uZmlhbnphIHBhcmEgY2FkYSBncnVwbyB5IHZlciBzaSBsb3MgaW50ZXJ2YWxvcyBzZSBpbnRlcmNlcHRhbiBvIG5vLgpMYSByZWdsYSBlcmEgcXVlIHNpIGxvcyBpbnRlcnZhbG9zIGRlIGFtYm9zIGdydXBvcyBubyBzZSBpbnRlcmNlcHRhYmFuLCBwb2TDrWFtb3MgZXh0cmFwb2xhciBxdWUgbGEgZGlmZXJlbmNpYSBtdWVzdHJhbCBleGlzdGUgZW4gbGEgcG9ibGFjacOzbiBhbCA5NSUgZGUgY29uZmlhbnphLgpTaSBsb3MgaW50ZXJ2YWxvcyBubyBzZSB0cmFzbGFwYW4sIGVudG9uY2VzIG5vIHBvZGVtb3MgYWZpcm1hciBxdWUgbGFzIGRpZmVyZW5jaWFzIHNlYW4gc2lnbmlmaWNhdGl2YXMuCkVuIGVzdGEgc2VjY2nDs24gc2UgdmVyw6EgY8OzbW8gcGFzYXIgZGUgbGEgZXZhbHVhY2nDs24gImluZm9ybWFsIiBhIGxhICJmb3JtYWwiIG1lZGlhbnRlIGxhIGludHJvZHVjY2nDs24gYSBsYSBwcnVlYmEgdCBkZSBkaWZlcmVuY2lhIGRlIG1lZGlhcy4KCiMgUHJ1ZWJhIHQgZGUgZGlmZXJlbmNpYSBkZSBtZWRpYXMKCkVzdGEgcHJ1ZWJhIGNvbXBhcmEgbGEgbWVkaWEgZGUgdW5hIHZhcmlhYmxlIG51bcOpcmljYSBlbnRyZSBkb3MgZ3J1cG9zIG8gY2F0ZWdvcsOtYXMgZGUgdW5hIHZhcmlhYmxlIG5vbWluYWwgdSBvcmRpbmFsLgpMb3MgZ3J1cG9zIHF1ZSBmb3JtYW4gbGEgdmFyaWFibGUgbm9taW5hbC9vcmRpbmFsIHRpZW5lbiBxdWUgc2VyIGluZGVwZW5kaWVudGVzLgpFcyBkZWNpciwgY2FkYSBvYnNlcnZhY2nDs24gZGViZSBwZXJ0ZW5lY2VyIGEgdW4gZ3J1cG8gbyBhbCBvdHJvLCBwZXJvIG5vIGEgYW1ib3MuCgpQb3IgZWplbXBsbywgc2kgc2UgcXVpc2llcmEgZXZhbHVhciBzaSBleGlzdGVuIGRpZmVyZW5jaWFzIGVuIGVsIHJlbmRpbWllbnRvIGFjYWTDqW1pY28gZW50cmUgYWx1bW5vcyBob21icmVzIHkgbXVqZXJlcyBlbiBsYSBQVUNQLCB0ZcOzcmljYW1lbnRlLCBzZSBoYWJyw61hIHJlZ2lzdHJhZG8gZWwgQ1JBRVNUIGRlIHRvZG9zIGxvcyBhbHVtbm9zIGRlIGxhIHVuaXZlcnNpZGFkIChWYXJpYWJsZSBYKSB5IHBvciBsbyB0YW50byBzZSBwb2Ryw61hIHRlbmVyIGxvcyBwYXLDoW1ldHJvcyBkZWwgQ1JBRVNUIHBhcmEgbG9zIGFsdW1ub3MgaG9tYnJlcyB5IGxhcyBhbHVtbmFzIG11amVyZXMuCgpDb21vIG5vIHNlIHRpZW5lIHJlY3Vyc29zIHBhcmEgbGxlZ2FyIGEgdG9kYSBsYSBwb2JsYWNpw7NuLCBzZSBleHRyYWUgdW5hIG11ZXN0cmEsIHF1ZSBpbmNsdXllIGFsdW1ub3MgeSBhbHVtbmFzLgpFbiBjYWRhIGdydXBvIHNlIHB1ZWRlIGNhbGN1bGFyIGVsIHByb21lZGlvIGRlbCBDUkFFU1QgeSBzZSBwdWVkZW4gY29tcGFyYXIgZXNvcyBwcm9tZWRpb3MgbXVlc3RyYWxlcy4KCiFbXSg1LjEucG5nKXt3aWR0aD0iMzg2In0KCkVzIGRlY2lyLCBlc3RhIHBydWViYSBidXNjYXIgZGFyIGx1Y2VzIHNpIGxhIGRpZmVyZW5jaWEgJFxvdmVybGluZXtYfV8xIC0gXG92ZXJsaW5le1h9XzIkIHNlIHB1ZWRlIGV4dHJhcG9sYXIgYSBsYSBkaWZlcmVuY2lhICRcbXVfe3gxfSAtIFxtdV97eDJ9JC4KCiMgTG9zIDYgcGFzb3MgZGUgbGEgaW5mZXJlbmNpYSBlc3RhZMOtc3RpY2EKCkVzdG9zIDYgcGFzb3MgYsOhc2ljYW1lbnRlIHNlIHNlZ3VpcsOhbiBlbiB0b2RhIHBydWViYSBpbmZlcmVuY2lhbCwgZG9uZGUgc2UgcXVpZXJhIGV4dHJhcG9sYXIgdW4gcmVzdWx0YWRvIGRlIGxhIG11ZXN0cmEgYSBsYSBwb2JsYWNpw7NuLgoKIyMgUGFzbyAxOiBoaXDDs3Rlc2lzCgoqQU5BTE9Hw41BIERFTCBKVUlDSU86IGVsIGFjdXNhZG8gZW50cmEgZWwganVpY2lvIGNvbiBwcmVzdW5jacOzbiBkZSBpbm9jZW5jaWEuKgoKRm9ybXVsYXIgbGEgaGlww7N0ZXNpcyBudWxhIHkgbGEgaGlww7N0ZXNpcyBhbHRlcm5hdGl2YS4KQW1iYXMgaGlww7N0ZXNpcyBzb24gYWNlcmNhIGRlIGxvcyBwYXLDoW1ldHJvcy4KCkgwOiAkXG11X3t4MX0gLSBcbXVfe3gyfSA9IDAkCgpIQTogJFxtdV97eDF9IC0gXG11X3t4Mn0gXG5lIDAkCgpMYSBIMCBlcyBnZW5lcmFsbWVudGUgbGEgaGlww7N0ZXNpcyBkZSBubyBlZmVjdG8sIGRlIG5vIGRpZmVyZW5jaWFzLgpTZSBwYXJ0ZSBzaWVtcHJlIGRlIHVuYSBoaXDDs3Rlc2lzIGRlIG5vIGRpZmVyZW5jaWFzLgpFc3RhIGVzIGxhIGhpcMOzdGVzaXMgcXVlIHNlIGJ1c2NhIG5lZ2FyIG1lZGlhbnRlIGxvcyByZXN1bHRhZG9zIG9idGVuaWRvcyBlbiBsYSBtdWVzdHJhLgoKTGEgaWRlYSBjZW50cmFsIGVzIHF1ZSBzaSBsYSBIMCBmdWVyYSBjaWVydGEgZW4gbGEgcG9ibGFjacOzbiwgbG9zIHJlc3VsdGFkb3MgbXVlc3RyYWxlcyBvY3Vycmlyw61hbiBtdXkgY2VyY2EgYSAwIGVuIG11Y2hhcyBtdWVzdHJhcyB5IHBvY2FzIG11ZXN0cmFzIHRlbmRyw6FuIHZhbG9yZXMgbXV5IGRpZmVyZW50ZXMgZGUgY2Vyby4KCiMjIFBhc28gMjogZGlzdHJpYnVjacOzbiBtdWVzdHJhbAoKKkFOQUxPR8ONQSBERUwgSlVJQ0lPOiBTaSBlbCBhY3VzYWRvIGVzIGlub2NlbnRlLCBlbnRvbmNlcyBubyBkZWJlcsOtYSBleGlzdGlyIHRhbGVzIG8gY3VhbGVzIHBydWViYXMqCgpTaSBsYSBIMCBlcyB2ZXJkYWRlcmEgeSBzZSBleHRyYWVuIG11ZXN0cmFzIHJlcGV0aWRhbWVudGUsIGxhcyBkaWZlcmVuY2lhcyBtdWVzdHJhbGVzIHNlIGNlbnRyYXLDoW4gYWxyZWRlZG9yIGRlIGNlcm8gY29tbyB1bmEgZGlzdHJpYnVjacOzbiB0IGFwcm94aW1hZGFtZW50ZSBub3JtYWwuCkVzdGEgZGlzdHJpYnVjacOzbiB0ZW5kcsOhIHVuIGVycm9yIGVzdMOhbmRhciBjYWxjdWxhZG8KCi0gICBTaSBsYXMgdmFyaWFuemFzIHBvYmxhY2lvbmFsZXMgc29uIGlndWFsZXMgZGU6CgokJApzX3tcb3ZlcmxpbmV7eDF9LVxvdmVybGluZXt4Mn19ID0gXHNxcnR7XGZyYWN7KG5fMS0xKXNfe3gxfV4yKyhuXzItMSlzX3t4Mn1eMn17bl8xK25fMi0yfX0qXHNxcnR7XGZyYWN7bl8xK25fMn17bl8xbl8yfX0KJCQKCi0gICBTaSBsYXMgdmFyaWFuemFzIHBvYmxhY2lvbmFsZXMgc29uIGRpZmVyZW50ZXMgZGU6CgokJApzX3tcb3ZlcmxpbmV7eDF9LVxvdmVybGluZXt4Mn19ID0gXHNxcnR7XGZyYWN7c197WDF9XjJ9e25fMS0xfStcZnJhY3tzX3tYMn1eMn17bl8yLTF9fQokJAoKIyMgUGFzbyAzOiBuaXZlbCBkZSBzaWduaWZpY2FuY2lhCgoqQU5BTE9Hw41BIERFTCBKVUlDSU86IHF1w6kgdGFudGFzIHBydWViYXMgZGViZSBoYWJlciBwYXJhIHNlbnRlbmNpYXIgYWwgYWN1c2Fkbz8qCgpTZSB0cmF0YSBkZSBsYSBwcm9iYWJpbGlkYWQgcXVlIGRlZmluZSBxdcOpIHRhbiBpbnVzdWFsIGRlYmUgc2VyIGxhIGRpZmVyZW5jaWEgZGUgbWVkaWFzIG11ZXN0cmFsIHBhcmEgcmVjaGF6YXIgbGEgSDAgKHF1ZSBsYSBkaWZlcmVuY2lhIGRlIG1lZGlhcyBwb2JsYWNpb25hbGVzIHNlYSAwKS4KRWwgdmFsb3IgbcOhcyBjb23Dum4gZXMgZGUgJFxhbHBoYT0wLjA1JC4KCkVzIGRlY2lyLCBxdcOpIHRhbiBkaWZlcmVudGUgZGViZSBzZXIgbGEgZGlmZXJlbmNpYSBkZSBtZWRpYXMgbXVlc3RyYWxlcyBkZSBjZXJvIHBhcmEgcG9kZXIgYWZpcm1hciBxdWUgZXN0ZSB2YWxvciBlcyBtdXkgInJhcm8iIG8gImRpZmVyZW50ZSIgc2kgZXMgcXVlIGxhIEgwIGZ1ZXJhIGNpZXJ0YS4KCiMjIFBhc28gNDogb2JzZXJ2YWNpw7NuCgoqQU5BTE9Hw41BIERFTCBKVUlDSU86IFF1w6kgcHJ1ZWJhcyB0cmFlIGVsIGZpc2NhbCB5IGxhIHBvbGljw61hPyoKClNlIGNhbGN1bGEgZWwgZXN0YWTDrXN0aWNvIGRlIGxhIHBydWViYS4KRXN0ZSBlc3RhZMOtc3RpY28gbG8gcXVlIGhhY2UgZXMgIm1lZGlyIiBxdcOpIHRhbiAicmFybyIgbyAiZGlmZXJlbnRlIiBlcyBlbCB2YWxvciBlbmNvbnRyYWRvLgoKJCQKdF97XG92ZXJsaW5le3gxfS1cb3ZlcmxpbmV7eDJ9fT1cZnJhY3tcb3ZlcmxpbmV7WH1fMS1cb3ZlcmxpbmV7WH1fMn17c197XG92ZXJsaW5le1h9XzEtXG92ZXJsaW5le1h9XzJ9fQokJAoKRXN0ZSB2YWxvciBkZWwgZXN0YWTDrXN0aWNvIGRlIGxhIHBydWViYSBlc3TDoSBlbiB1bmlkYWRlcyBkZWwgZXJyb3IgZXN0w6FuZGFyLCBlcyBkZWNpciwgcXXDqSB0YW4gY2VyY2EgbyBsZWpvcyBzZSBlbmN1ZW50cmEgZGVsIGNlbnRybyBkZSBsYSBkaXN0cmlidWNpw7NuIChjZW50cmFkYSBlbiAwKS4KCkNvbiBlc3RlIHZhbG9yLCBlbiBsYSBkaXN0cmlidWNpw7NuIHQgc2UgY2FsY3VsYSBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIGVzdGUgdmFsb3Igb2N1cnJhLCBlbCB2YWxvciBkZSBwLXZhbHVlLgpFcyBkZWNpciwgZWwgcC12YWx1ZSBtaWRlIGxhIHByb2JhYmlsaWRhZCBkZSBvYnNlcnZhciBlbiB1bmEgbXVlc3RyYSB1bmEgZGlmZXJlbmNpYSBkZSBtZWRpYXMgY29tbyBsYSBvYnNlcnZhZGEsIHNpIGxhIGRpZmVyZW5jaWEgZGUgbWVkaWFzIHBvYmxhY2lvbmFsIGZ1ZXJhIGNlcm8uCgpTZSBwdWVkZSB1c2FyIHVuYSBjYWxjdWxhZG9yYSBkZSBwLXZhbHVlIGRlIGxhIGRpc3RyaWJ1Y2nDs24gdCBkaXNwb25pYmxlIFthcXXDrV0oaHR0cHM6Ly93d3cuc29jc2Npc3RhdGlzdGljcy5jb20vdGVzdHMvKS4KRW4gbGEgcHLDoWN0aWNhLCBjdWFscXVpZXIgc29mdHdhcmUgZXN0YWTDrXN0aWNvIG5vcyBicmluZGEgZWwgcmVzdWx0YWRvIGRlbCBwLXZhbHVlLgoKIyMgUGFzbyA1OiBkZWNpc2nDs24KCipBTkFMT0fDjUEgREVMIEpVSUNJTzogSnVleiBkZWNpZGUgc2kgbGFzIHBydWViYXMgbm8gc29uIGxvIHN1ZmljaWVudGVtZW50ZSBzw7NsaWRhcyBwYXJhIGNvbmRlbmFyIGFsIGFjdXNhZG8uIE8sIHNpIHNvbiBsbyBzdWZpY2llbnRlbWVudGUgc8OzbGlkYXMgcGFyYSBjb25kZW5hcmxvLioKCi0gICBTaSBlbCBwLXZhbHVlIFw+IDAuMDUsIGVudG9uY2VzIHNlIGZhbGxhIGVuIHJlY2hhemFyIGxhIEhvLiBFc3RvIGluZGljYXLDrWEgcXVlIGV4aXN0ZSBtw6FzIGRlIDUlIGRlIHByb2JhYmlsaWRhZGVzIHF1ZSB1bmEgbXVlc3RyYSBhbGVhdG9yaWEgY3VhbHF1aWVyYSBlbmN1ZW50cmUgdW5hIGRpZmVyZW5jaWEgZGUgbWVkaWFzIGNvbW8gbGEgb2JzZXJ2YWRhIHNpIGVzIHF1ZSBsYSBkaWZlcmVuY2lhIGRlIG1lZGlhcyBwb2JsYWNpb25hbCBmdWVzZSAwLgoKIVtdKDUuMi5wbmcpe3dpZHRoPSIxMTIifQoKLSAgIFNpIGVsIHAtdmFsdWUgXDw9IDAuMDUgZW50b25jZXMgc2UgcmVjaGF6YSBIMCB5IHNlIGFmaXJtYSBIQSAoc2llbXByZSBjb24gdW4gZ3JhZG8gZGUgaW5jZXJ0aWR1bWJyZSkuIEVzdG8gaW5kaWNhcsOtYSBxdWUgbGEgcHJvYmFiaWxpZGFkIGRlIG9ic2VydmFyIHVuYSBkaWZlcmVuY2lhIGRlIG1lZGlhcyBjb21vIGxhIG9ic2VydmFkYSBlbiBsYSBtdWVzdHJhIGVzIGJhamEgKG1lbm9yIGEgNSUpLiBDb21vIHPDrSBzZSBoYSBvYnNlcnZhZG8gZXNhIGRpZmVyZW5jaWEgZGUgbWVkaWFzIGVuIGxhIG11ZXN0cmEsIGVudG9uY2VzIHNlIGNvbmNsdXllIHF1ZSBsbyBtw6FzIHByb2JhYmxlIGVzIHF1ZSBsYSBoaXDDs3Rlc2lzIHF1ZSBpbmRpY2EgcXVlIGxhIGRpZmVyZW5jaWEgZGUgbWVkaWFzIHBvYmxhY2lvbmFsIGVzIDAgc2VhIGZhbHNhLgoKIVtdKDUuMy5wbmcpe3dpZHRoPSIxNTAifQoKIyMgUGFzbyA2OiBpbnRlcnByZXRhY2nDs24KCipBTkFMT0fDjUEgREVMIEpVSUNJTzogU2kgbm8gaGF5IHN1ZmljaWVudGVzIHBydWViYXMsIG51bmNhIHNlIGFmaXJtYSBxdWUgZWwgYWN1c2FkbyBlcyBpbm9jZW50ZSEhISBTZSBhZmlybWEgcXVlIG5vIGVzIGN1bHBhYmxlLiBTaSBoYXkgc3VmaWNpZW50ZXMgcHJ1ZWJhcywgc2UgYWZpcm1hIHF1ZSBlbCBhY3VzYWRvIGVzIGN1bHBhYmxlLioKCi0gICBTaSBlbCBwLXZhbHVlIGVzIFw+IDAuMDUsIGxhIGNvbmNsdXNpw7NuIGVzIHF1ZSBubyBzZSBwdWVkZSByZWNoYXphciBsYSBIby4KICAgIExhIGNvbmNsdXNpw7NuIE5PIGVzIHF1ZSBzZSBhZmlybWEgbGEgSDAuCiAgICBOdW5jYSBzZSBhZmlybWEgcXVlIGxhcyBtZWRpYXMgc2VhbiBpZ3VhbGVzISEhCgotICAgQ29uIGxvcyBkYXRvcyBvYnRlbmlkb3MsIG5vIHNlIHB1ZWRlIGRlY2lyIHF1ZSBleGlzdGUgdW5hIGRpZmVyZW5jaWEgZGUgbWVkaWFzIGVudHJlIGFtYm9zIGdydXBvcy4KCi0gICBTaSBlbCBwLXZhbHVlIGVzIFw8PSAwLjA1LCBzZSBhZmlybWEgcXVlIHPDrSBleGlzdGUgdW5hIGRpZmVyZW5jaWEgZGUgbWVkaWFzIGVudHJlIGFtYm9zIGdydXBvcyBjb24gdW4gOTUlIGRlIGNvbmZpYW56YS4KCiMgRWplbXBsbyAxIGRlIHZhcmlhYmxlIG51bcOpcmljYTogRU5ETyAyMDIwCgpJbXBvcnRhbW9zIGxhIGJhc2UgZGUgZGF0b3MKCmBgYHtyIGJhc2UgZW5kbywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeShyaW8pCmVuZG8yMDIwID0gaW1wb3J0KCJiYXNlcy9FTkRPX1JFTU9UT18yMDIwLmR0YSIpCmBgYAoKRmFjdG9yaXphbW9zIGxhIHZhcmlhYmxlIFAxXzEgeSBjcmVhbW9zIHZhcmlhYmxlIHNleG8gY29uIHN1cyBldGlxdWV0YXMuCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKZW5kbzIwMjAgPSBlbmRvMjAyMCAlPiUKICBtdXRhdGUoc2V4byA9IGZhY3RvcihQMV8xLCBsYWJlbHM9YygiSG9tYnJlIiwgIk11amVyIikpKQpgYGAKClF1ZXJlbW9zIGV2YWx1YXIgbGEgZGlmZXJlbmNpYSBkZSBtZWRpYXMgZW50cmUgZWwgbsO6bWVybyBkZSBhbHVtbm9zIGNvbiBsb3MgcXVlIHRyYWJhamEgdW4gcHJvZmVzb3IgaG9tYnJlIHkgdW5hIHByb2Zlc29yYSBtdWplci4KUGFyYSBlc3RvIGNhbGN1bGFtb3MgbGEgbWVkaWEgZGUgYWx1bW5vcyBwYXJhIGNhZGEgZ3J1cG8uCgpgYGB7ciBkaWYgYWx1bW5vcyBwb3Igc2V4b30KYWx1bXhzZXhvID0gZW5kbzIwMjAgJT4lCiAgZ3JvdXBfYnkoc2V4bykgJT4lCiAgc3VtbWFyaXplKE1lZGlhID0gbWVhbihQMV82LCBuYS5ybSA9IFQpKQphbHVteHNleG8KYGBgCgpDb24gZXN0YSB0YWJsYSwgY2FsY3VsYW1vcyBsYSBkaWZlcmVuY2lhIGVudHJlIGxhcyBtZWRpYXMgZGUgbG9zIGdydXBvcy4KCmBgYHtyfQphbHVteHNleG9bMSwyXSAtIGFsdW14c2V4b1syLDJdCmBgYAoKTGEgZGlmZXJlbmNpYSBlcyBkZSAxOC4yIGFsdW1ub3MuCkVzdGEgZGlmZXJlbmNpYSBlcyBwYXJhIGVsIGdydXBvIGRlIDI4IG1pbCBwcm9mZXNvcmVzIGVuY3Vlc3RhZG9zLgpMYSBwcmVndW50YSBlczogwr9TZSBwdWVkZSBhZmlybWFyIHF1ZSBleGlzdGUgZXN0YSBkaWZlcmVuY2lhIGVuIGxhIHBvYmxhY2nDs24/CgpQYXJhIGV2YWx1YXIgc2kgZXhpc3RlbiBvIG5vIGRpZmVyZW5jaWFzIHBvYmxhY2lvbmFsZXMsIHVzYW1vcyBlbCBjb21hbmRvIGB0LnRlc3RgLgpFCgpgYGB7ciBwcnVlYmEgdH0KdC50ZXN0KFAxXzYgfiBzZXhvLCBkYXRhID0gZW5kbzIwMjApCmBgYAoKQ29tbyBlbCBwLXZhbHVlIFw8IDAuMDUsIGVudG9uY2VzIHNlIHJlY2hhemEgbGEgSDAgeSBzZSBwdWVkZSBhZmlybWFyIHF1ZSBlc2EgZGlmZXJlbmNpYSBleGlzdGUgZW4gbGEgcG9ibGFjacOzbiBhIHRhbCBuaXZlbCBkZSBzaWduaWZpY2FuY2lhLgoKYGBge3J9CmVuZG8yMDIwID0gZW5kbzIwMjAgJT4lCiAgbXV0YXRlKG5pdmVsID0gY2FzZV93aGVuKAogICAgTklWRUw9PTF+MSwKICAgIE5JVkVMPT0yfjIsCiAgICBOSVZFTD09M34yKSkKYGBgCgpgYGB7cn0KYWx1bXhuaXZlbCA9IGVuZG8yMDIwICU+JQogIGdyb3VwX2J5KG5pdmVsKSAlPiUKICBzdW1tYXJpemUoTWVkaWEgPSBtZWFuKFAxXzYsIG5hLnJtID0gVCkpCmFsdW14bml2ZWwKYGBgCgpgYGB7cn0KdC50ZXN0KFAxXzYgfiBuaXZlbCwgZGF0YSA9IGVuZG8yMDIwKQpgYGAKCiMgRWplbXBsbyBkZSB2YXJpYWJsZSBjYXRlZ8OzcmljYSBwYXJhIGxhIGRpZmVyZW5jaWEgZGUgcHJvcG9yY2lvbmVzOiBFTkRPCgpTZSB2aW8gZW4gZWwgbcOzZHVsbyBhbnRlcmlvciBxdWUgc2UgcG9kw61hIGV2YWx1YXIgc2kgZXhpc3RlbiBkaWZlcmVuY2lhcyBlbnRyZSBsYSBwcm9wb3JjacOzbiBkZSBwcm9mZXNvcmVzIGhvbWJyZXMgcXVlIGhhYsOtYW4gcmVjaWJpZG8gYXBveW8gcHNpY29sw7NnaWNvIGNvbXBhcmFkbyBjb24gbGFzIHByb2Zlc29yYXMgbXVqZXJlcy4KCkxhIHBydWViYSBhZGVjdWFkYSBwYXJhIGV2YWx1YXIgdW5hIHBydWViYSBkZSBkaWZlcmVuY2lhIGRlIHByb3BvcmNpb25lcyBlcyBtZWRpYW50ZSBlbCBjb21hbmRvIGBwcm9wLnRlc3RgLgpFc3RlIGNvbWFuZG8sIGNvbW8gc2UgcHVlZGUgdmVyIGVuIGVsICJoZWxwIiwgcGlkZSBjb21vIGFyZ3VtZW50b3MgbG9zIGRhdG9zIGRlICLDqXhpdG9zIiAobGEgcHJvcG9yY2nDs24gcXVlIHNlIHF1aWVyZSBldmFsdWFyKSB5IGxvcyBkYXRvcyBkZSAiaW50ZW50b3MiIChlbCBuIHRvdGFsKS4KRXMgZGVjaXIsIGEgZGlmZXJlbmNpYSBkZWwgY29tYW5kbyBgdC50ZXN0YCBxdWUgcGlkbyBjb21vIGFyZ3VtZW50b3MgbGFzIHZhcmlhYmxlcywgYXF1w60gc2UgdGllbmUgcHJpbWVybyBxdWUgZW5jb250cmFyIGxvcyAiw6l4aXRvcyIgZSAiaW50ZW50b3MiLgoKUHJpbWVybyBzZSB0aWVuZSBxdWUgdHJhbnNmb3JtYXIgbGEgdmFyaWFibGUgUDFfMTMgcXVlIGVzIGltcG9ydGFkYSBjb21vIG51bcOpcmljYSwgY29tbyB1bmEgdmFyaWFibGUgZGUgZmFjdG9yIHkgY29uIHN1cyBldGlxdWV0YXMuCgpgYGB7cn0KZW5kbzIwMjAgPSBlbmRvMjAyMCAlPiUKICBtdXRhdGUoYXBveW8gPSBmYWN0b3IoUDFfMTMsIGxhYmVscz1jKCJTw60iLCAiTm8iKSkpCmBgYAoKTHVlZ28sIHBhcmEgcmVzcG9uZGVyIGEgbGEgcHJlZ3VudGEgZGUgc2kgZXN0YSBwcm9wb3JjacOzbiB2YXLDrWEgZW50cmUgZG9jZW50ZXMgaG9tYnJlcyB5IG11amVyZXMsIHRlbmVtb3MgcXVlIGNyZWFyIG90cmEgdGFibGEgY29uIGxhcyBmcmVjdWVuY2lhcyBwb3IgY2FkYSBncnVwbyBkZSBsYSB2YXJpYWJsZSAic2V4byIgeSAiYXBveW8iLgoKQSBkaWZlcmVuY2lhIGRlbCBtw7NkdWxvIGFudGVyaW9yLCBhcXXDrSB2YW1vcyBhIHVzYXIgYGdyb3VwX2J5YCBkZSBhbWJhcyB2YXJpYWJsZXMgeSBlbiBjYWRhIGdydXBvIGNhbGN1bGFyIGVsIE4gdG90YWwuCkVzdG8gbm9zIGRhcsOhIGxvcyDDqXhpdG9zIHF1ZSByZXF1ZXJpbW9zLgoKYGBge3J9CnRhYmxhMSA9IGVuZG8yMDIwICU+JQogIGZpbHRlcihhcG95byA9PSJTw60iIHwgYXBveW8gPT0gIk5vIikgJT4lCiAgZ3JvdXBfYnkoc2V4bykgJT4lCiAgY291bnQoYXBveW8gPSBhcG95bywgbmFtZT0iTiIpICU+JQogIG11dGF0ZSh0b3RhbCA9IHN1bShOKSkKdGFibGExCmBgYAoKQ29uIGVzdG9zIGRhdG9zLCBjb3JyZW1vcyBlbCBjb21hbmRvIGBwcm9wLnRlc3RgLgoKYGBge3J9CnByb3AudGVzdChjKDI3NzcsIDY2OTkpLCBjKDYxNjMsMTI3NjcpKQpgYGAKClNlZ8O6biBsb3MgcmVzdWx0YWRvcywgc2UgZW5jdWVudHJhIHF1ZSBlbCA1Mi41JSBkZSBkb2NlbnRlcyBtdWplcmVzIHJlY2liaWVyb24gYXBveW8gcHNpY29sw7NnaWNvIHZlcnN1cyBlbCA0NS4xJSBkZSBkb2NlbnRlcyBob21icmVzLgpFc3RlIGNvbWFuZG8gbm9zIGJyaW5kYSBlbCBJQyBkZSBsYSBkaWZlcmVuY2lhIGRlIHByb3BvcmNpb25lcyBhbCA5NSUgZGUgY29uZmlhbnphLgpFc3RlIElDIGRlIGxhIGRpZmVyZW5jaWEgZGUgcHJvcG9yY2lvbmVzIHZhcsOtYSBlbnRyZSAtOC45JSB5IC01LjklLgpMYSBkaWZlcmVuY2lhIGRlIHByb3BvcmNpb25lcyB0aWVuZSB1biBwLXZhbHVlIFw8IDIuMmUtMTYsIHF1ZSBlcyBtZW5vciBhIDAuMDUsIHBvciBsbyBxdWUgc2UgcmVjaGF6YSBsYSBIMCB5IHNlIGFmaXJtYSBxdWUgbGEgZGlmZXJlbmNpYSBlbiBwb3JjZW50YWplcyBlbnRyZSBob21icmVzIHkgbXVqZXJlcyBlcyBlc3RhZMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZhIGVuIGxhIHBvYmxhY2nDs24uCkVzIGRlY2lyLCBxdWUgbGFzIHByb2Zlc29yYXMgcGVydWFuYXMgcmVjaWJlbiBtw6FzIGF5dWRhIHBzaWNvbMOzZ2ljYSBxdWUgbG9zIHByb2Zlc29yZXMgcGVydWFub3MuCgpPdHJvIGVqZW1wbG8gZXMgZXZhbHVhciBzaSBsYSBjb25kaWNpw7NuIGxhYm9yYWwgZGUgIk5vbWJyYWRvIiAoUDFfNykgdmFyw61hIGVudHJlIGhvbWJyZXMgeSBtdWplcmVzLgpMbyBwcmltZXJvIGVzIGZhY3Rvcml6YXIgbGEgdmFyaWFibGUuCgpgYGB7cn0KZW5kbzIwMjAgPSBlbmRvMjAyMCAlPiUKICBtdXRhdGUoY29uZGljaW9uID0gZmFjdG9yKFAxXzcsIGxhYmVscz1jKCJOb21icmFkbyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbnRyYXRhZG8gcG9yIGNvbmN1cnNvIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29udHJhdGFkbyBjb24gb3RyYSBtb2RhbGlkYWQiKSkpCmBgYAoKTHVlZ28sIHNlIGNyZWEgbGEgdGFibGEgY29uIGxvcyBkYXRvcyBxdWUgcmVxdWVyaW1vcy4KCmBgYHtyfQp0YWJsYTIgPSBlbmRvMjAyMCAlPiUKICBmaWx0ZXIoY29uZGljaW9uID09Ik5vbWJyYWRvIiB8IGNvbmRpY2lvbiA9PSAiQ29udHJhdGFkbyBwb3IgY29uY3Vyc28iCiAgfCBjb25kaWNpb24gPT0gIkNvbnRyYXRhZG8gY29uIG90cmEgbW9kYWxpZGFkIikgJT4lCiAgZ3JvdXBfYnkoc2V4bykgJT4lCiAgY291bnQoY29uZGljaW9uID0gY29uZGljaW9uLCBuYW1lPSJOIikgJT4lCiAgbXV0YXRlKHRvdGFsID0gc3VtKE4pKQp0YWJsYTIKYGBgCgpDb24gZXN0YSB0YWJsYSBzZSBlbmN1ZW50cmEgcXVlIGVudHJlIGxvcyBob21icmVzIHNlIHRpZW5lIDMzMDMgw6l4aXRvcyB5IHBhcmEgbGFzIG11amVyZXMgdW4gdG90YWwgZGUgNzE0MCDDqXhpdG9zLgpMbyBxdWUgbm8gc2UgZW5jdWVudHJhIGRpcmVjdGFtZW50ZSBlcyBlbCB0b3RhbCwgcXVlIHNlIHRpZW5lIHF1ZSBjYWxjdWxhciBzb2JyZSBjYWRhIGdydXBvLCBzb2JyZSBjYWRhIGNvbHVtbmEuCgpEZSBlc3RhIG1hbmVyYSBzZSBlbmN1ZW50cmEgcXVlIGVudHJlIGxvcyBob21icmVzIHNlIHRpZW5lIDMzMDMgw6l4aXRvcyBkZSB1biB0b3RhbCBkZSA2MTcxIGludGVudG9zICg1My41LjQlKS4KRW50cmUgbG9zIG11amVyZXMgc2UgdGllbmUgNzE0MCBpbnRlbnRvcyBkZSB1biB0b3RhbCBkZSAxMjc3OSBpbnRlbnRvcyAoNTUuOSUpLgoKUGFyYSB0ZW5lciB1bmEgbWVqb3IgcHJlc2VudGFjacOzbiBkZSBsYSB0YWJsYSBjdWFuZG8gc2UgcHJvZHVjZSBlbCBodG1sLCBzZSBwdWVkZSB1c2FyIGxhIGxpYnJlcsOtYSBga25pdHJgIHkgZWwgY29tYW5kbyBga2FibGVgLgoKYGBge3J9CmxpYnJhcnkoa25pdHIpCmthYmxlKGhlYWQodGFibGEyKSwgZm9ybWF0PSJtYXJrZG93biIsIGRpZ2l0cz0xKQpgYGAKCkVzdG9zIGRhdG9zIHNvbiBsb3MgcXVlIHJlcXVpZXJlIGVsIGNvbWFuZG8gYHByb3AudGFibGVgIHBhcmEgZXZhbHVhciBsYSBkaWZlcmVuY2lhIGRlIHByb3BvcmNpb25lcyAoOS43LTYuND0gMy4zJSkuCgpgYGB7ciBwcm9wIHRlc3QgMH0KcHJvcC50ZXN0KHg9YygzMzAzLCA3MTQwKSwgbj1jKDYxNzEsIDEyNzc5KSwgY29uZi5sZXZlbD0wLjk1KQpgYGAKCkNvbW8gc2Ugb2JzZXJ2YSBkZSBsb3MgcmVzdWx0YWRvcywgZWwgZXN0YWTDrXN0aWNvIGRlIGxhIHBydWViYSAiWC1zcXVhcmVkIiBzZSBsbGFtYSBjaGktY3VhZHJhZG8geSBubyBlcyBlbCBtaXNtbyBxdWUgZWwgZXN0YWTDrXN0aWNvIHQuCkVsIHAtdmFsdWUgYXNvY2lhZG8gZXMgMC4wMDI1IFw8IDAuMDUsIHBvciBsbyBxdWUgbGxldmEgYSBsYSBjb25jbHVzacOzbiBkZSByZWNoYXphciBsYSBIMCBkZSBpZ3VhbGRhZCBkZSBwcm9wb3JjaW9uZXMgeSBhZmlybWFyIHF1ZSBlbnRyZSBhbWJvcyBncnVwb3MgZXhpc3RlIHVuYSBkaWZlcmVuY2lhIGVuIGxhIHByb3BvcmNpw7NuIGRlICJub21icmFkb3MiIGVudHJlIGhvbWJyZXMgeSBtdWplcmVzIGVuIGxhIHBvYmxhY2nDs24uCgpFcyBpbXBvcnRhbnRlIG5vdGFyIGN1YW5kbyBzZSBjb25jbHV5ZSBxdWUgKm5vIHNlIHB1ZWRlIGRlY2lyKiBvICpubyBzZSBwdWVkZSBhZmlybWFyLiogQ3VhbmRvIHNlIG9idGllbmUgdW4gcC12YWx1ZSBcPD0gMC4wNSwgc2UgcmVjaGF6YSBsYSBIMCB5IHNlIGFmaXJtYSBsYSBIQSwgcXVlIGxhIGRpZmVyZW5jaWEgZXhpc3RlIGVuIGxhIHBvYmxhY2nDs24gY29uIHVuIDk1JSBkZSBjb25maWFuemEuClBlcm8sIGN1YW5kbyBzZSBvYnRpZW5lIHVuIHAtdmFsdWUgXD4gMC4wNSwgbm8gc2UgYWZpcm1hIGxhIEhBLCBsbyBxdWUgc2UgY29uY2x1eWUgZXMgcXVlIG5vIHNlIHB1ZWRlIHJlY2hhemFyIGxhIEgwLgpFc3RvIHF1aWVyZSBkZWNpciBxdWUgbm8gYWZpcm1hbW9zIHF1ZSBsYXMgbWVkaWFzIHBvYmxhY2lvbmFsZXMgc2VhbiBpZ3VhbGVzLCBzaW5vIHF1ZSwgY29uIGxvcyBkYXRvcyBxdWUgdGVuZW1vcywgbm8gcG9kZW1vcyBkZWNpciBxdWUgc29uIGRpZmVyZW50ZXMuCgpQYXJhIGFjbGFyYXIgZXN0bywgdmFsZSBsYSBwZW5hIGhhY2VyIHVuYSBhbmFsb2fDrWEganVyw61kaWNhLgoKIyBBbmFsb2fDrWEgZGVsIGp1aWNpbwoKWWEgc2VhIG1lZGlhbnRlIG51ZXN0cmEgZXhwZXJpZW5jaWEgdmllbmRvIEp1c3RpY2lhVFYgbyB2aWVuZG8gc2VyaWVzIHNvYnJlIGFib2dhZG9zLCBsYSBpbWFnZW4gcXVlIHRlbmVtb3MgZGUgdW4ganVpY2lvIGVzIGNvbW8gZXN0YSBpbWFnZW4uCgohW10oNS5qdWljaW8uanBlZyl7d2lkdGg9IjQ3MiJ9CgpFbiBlc3RhIGltYWdlbiBoYXkgdmFyaW9zIGFjdG9yZXM6CgotICAgRWwgYWN1c2FkbzogZW50cmUgcmVqYXMgeSBjb24gZWwgdHJhamUgbmFyYW5qYS4KCi0gICBFbCBwb2xpY8OtYSBxdWUgY3VpZGEgYWwgYWN1c2FkbywgcGVybyBxdWUgdGFtYmnDqW4gc2ltYm9saXphIGEgbGEgaW5zdGl0dWNpw7NuIHF1ZSBzZSBlbmNhcmdhIGRlbCByZWNvam8gZGUgcHJ1ZWJhcy4KCi0gICBFbCBmaXNjYWwgbyBwYXJ0ZSBhY3VzYWRvcmE6IHF1ZSBzZSBlbmN1ZW50cmEgbW9zdHJhbmRvIHVuYSBpbWFnZW4gZGUgdW4gY3VjaGlsbG8sIHBvc2libGVtZW50ZSB0b21hZGEgcG9yIHVuIHBvbGljw61hLgoKLSAgIExvcyBhYm9nYWRvcyBkZWZlbnNvcmVzOiBzZW50YWRvcy4KCi0gICBFbCBqdXJhZG86IHF1ZSBldmFsw7phbiBsYXMgcHJ1ZWJhcyB5IHRpZW5lbiBsYSBmYWN1bHRhZCBkZSBlbWl0aXIgdW4gdmVyZWRpY3RvLgoKLSAgIEVsIGp1ZXo6IHF1ZSBhbnVuY2lhIGVsIHZlcmVkaWN0byB5IGxlIGRhIGNhcsOhY3RlciBsZWdhbC4KCkxhIGzDs2dpY2EgcXVlIHNpZ3VlIGVzdGUgdGlwbyBkZSBwcm9jZWRpbWllbnRvIGVzIHNpbWlsYXIgYSBsYSBxdWUgc2lndWUgdW5hIHBydWViYSBkZSBpbmZlcmVuY2lhIGVzdGFkw61zdGljYS4KCi0gICBMYSBIMCBlcyBsYSBoaXDDs3Rlc2lzIGRlIG5vIGVmZWN0by4KICAgIEVuIGVsIGNhc28gZGVsIGp1aWNpbyBlcyBlbCBzdXB1ZXN0byBkZSBlbnRyYWRhIGRlIHF1ZSBlbCBhY3VzYWRvIGVzIGlub2NlbnRlLgogICAgU2UgbGxhbWEgInByZXN1bmNpw7NuIGRlIGlub2NlbmNpYSIuCiAgICBMYSBoaXDDs3Rlc2lzIGFsdGVybmF0aXZhIGVzIHF1ZSBlcyBjdWxwYWJsZSwgcGVybyBwYXJhIGxsZWdhciBhIGVsbGEgc2UgcmVxdWllcmUgbmVnYXIgbGEgSDAgbWVkaWFudGUgZGF0b3MgbyAiZXZpZGVuY2lhIi4KCi0gICBMYSBwb2xpY8OtYSBlcyBsYSBxdWUgcmVjb2dlIGxhIGV2aWRlbmNpYSBwYXJhIHF1ZSBsYSBmaXNjYWzDrWEgcHVlZGEgYWN1c2FyLgogICAgRXMgZGVjaXIsIGxhIHBvbGljw61hIGFybWFyw61hIGxhICJiYXNlIGRlIGRhdG9zIiBkZSBldmlkZW5jaWEuCgotICAgTGEgbGFib3IgZGUgbGEgZmlzY2Fsw61hIChsYSBwYXJ0ZSBxdWUgYWN1c2EpIGVzIGFybWFyIGVsIGNhc28uCiAgICBFcyBkZWNpciwgcHJlc2VudGFyIGxhIGV2aWRlbmNpYSByZWNvZ2lkYSBwb3IgbGEgcG9saWPDrWEgZGUgdGFsIG1hbmVyYSBxdWUgZWwganVyYWRvIHNlIGNvbnZlbnphIGRlbCBjYXNvLgogICAgTGEgZmlzY2Fsw61hIHNlcsOtYSBjb21vIGxhIHBydWViYSBkZSBpbmZlcmVuY2lhIGVzdGFkw61zdGljYS4KCi0gICBNaWVudHJhcyBtw6FzIHkgbWVqb3IgZXZpZGVuY2lhIHByZXNlbnRlIGxhIGZpc2NhbMOtYSwgbcOhcyBlbGVtZW50b3MgcGFyYSBxdWUgZWwganVyYWRvIHJlY2hhY2UgbGEgSDAgZGUgInByZXN1bmNpw7NuIGRlIGlub2NlbmNpYSIuCgotICAgU2kgbGEgZXZpZGVuY2lhIG5vIGVzIHPDs2xpZGEsIGVsIGp1cmFkbyB0ZW5kcsOhIGR1ZGFzIHkgcHVlZGUgbm8gcmVjaGF6YXIgbGEgSG8gZGUgcHJlc3VuY2nDs24gZGUgaW5vY2VuY2lhLgoKLSAgIEVuIGVsIGp1aWNpbyBubyBoYXkgdW5hIG1lZGlkYSBtYXRlbcOhdGljYSBxdWUgcmVzdW1hIGxhIGV2aWRlbmNpYSBhIGZhdm9yIG8gZW4gY29udHJhIChjb21vIGVsIHAtdmFsdWUpIG5pIHVuIHZhbG9yIGNyw610aWNvIHBhcmEgdG9tYXIgdW5hIGRlY2lzacOzbi4KICAgIFNlIGFzdW1lIHF1ZSBsb3MganVyYWRvcyBzYWJyw6FuIGVzdGFibGVjZXIgZXNlIGzDrW1pdGUgZW4gZWwgY3VhbCBsYSBldmlkZW5jaWEgZXMgbG8gc3VmaWNpZW50ZW1lbnRlIHPDs2xpZGEgcGFyYSByZWNoYXphciBsYSBIMC4KCi0gICBTaSBsYSBldmlkZW5jaWEgY3J1emEgZXNlIHVtYnJhbCBkZSBsb3MganVyYWRvcywgc2UgcmVjaGF6YXLDoSBsYSBIMC4KICAgIEVsIGp1cmFkbyByZWNvbWVuZGFyw6Egc3UgZGVjaXNpw7NuIGFsIGp1ZXouCiAgICBFbCBqdWV6IGFudW5jaWFyw6EgcXVlIGVsIGFjdXNhZG8gZXMgImN1bHBhYmxlIi4KICAgIEVzIGRlY2lyLCBzZSBhZmlybWEgbGEgSEEuCgotICAgU2kgbGEgZXZpZGVuY2lhIG5vIGNydXphIGVzZSB1bWJyYWwgZGUgbG9zIGp1cmFkb3MsIG5vIHNlIHJlY2hhemEgbGEgSDAuCiAgICBFbCBqdXJhZG8gdHJhc2xhZGFyw6Egc3UgZGVjaXNpw7NuIGFsIGp1ZXogeSBlbCBqdWV6IGFudW5jaWFyw6EgcXVlIGVsIGFjdXNhZG8gIm5vIGVzIGN1bHBhYmxlIi4KICAgIEVzIGRlY2lyLCBubyBzZSBwdWVkZSByZWNoYXphciBsYSBIMC4KCi0gICBFcyBpbXBvcnRhbnRlIG5vdGFyIGxhIGRlY2lzacOzbiBjdWFuZG8gbGEgZXZpZGVuY2lhIG5vIGVzIHPDs2xpZGEuCiAgICBObyBlcyBsbyBtaXNtbyBkZWNpciAibm8gZXMgY3VscGFibGUiIGEgZGVjaXIgImVzIGlub2NlbnRlIi4KICAgIERlY2lyIHF1ZSBlbCBhY3VzYWRvIG5vIGVzIGN1bHBhYmxlIGludm9sdWNyYSB1bmEgc2l0dWFjacOzbiBkZSBpbmNlcnRpZHVtYnJlLgogICAgUG9yIGVqZW1wbG8sIHNpIGxhIHBvbGljw61hIG5vIGhpem8gYmllbiBzdSB0cmFiYWpvIHkgbm8gcmVjb2dpw7MgbGEgZXZpZGVuY2lhIGRlIG1hbmVyYSBhZGVjdWFkYSwgZXMgcG9zaWJsZSBxdWUgaGF5YSBkdWRhcyBjb24gcmVzcGVjdG8gYWwgYWN1c2Fkby4KICAgIERlY2lyIHF1ZSBlbCBhY3VzYWRvIGVzIGlub2NlbnRlLCBwb3IgZWwgY29udHJhcmlvLCBpbXBsaWNhIHVuYSBjZXJ0ZXphLCBxdWUgbGEgZXZpZGVuY2lhIGVzIGNvbnR1bmRlbnRlIGVuIGFwdW50YXIgZW4gZXNhIGRpcmVjY2nDs24uCgotICAgQSBwZXNhciBxdWUgZXN0ZSBtw6l0b2RvIGVzIGNpZW50w61maWNvIHB1ZWRlIGxsZXZhciBhIGVycm9yZXMuCgotICAgRmFsc28gcG9zaXRpdm8gKG8gZXJyb3IgZGUgdGlwbyBJKTogY3VhbmRvIGRlY2xhcmFzIGN1bHBhYmxlIGEgdW4gaW5vY2VudGUuCgotICAgRmFsc28gbmVnYXRpdm8gKG8gZXJyb3IgZGUgdGlwbyBJSSk6IGN1YW5kbyBkZWNsYXJhcyBubyBjdWxwYWJsZSBhIHVuIGN1bHBhYmxlLgoKIVtdKGVycm9yJTIwdGlwbyUyMDElMjB5JTIwMi5qcGcpe3dpZHRoPSI0NjYifQoKLSAgIFBhcmEgZXZpdGFyIGZhbHNvcyBwb3NpdGl2b3Mgc2UgcHJvcG9uZSBwZWRpciBldmlkZW5jaWEgY2FkYSB2ZXogbcOhcyBzw7NsaWRhIHBhcmEgY29uZGVuYXIgYSBhbGd1aWVuLiBQZXJvLCBzaSBzZSBleGlnZSBldmlkZW5jaWEgY2FkYSB2ZXogbcOhcyBzb2xpZGEsIGF1bWVudGEgbGEgcHJvYmFiaWxpZGFkIGRlIGZhbHNvcyBuZWdhdGl2b3MuIEFtYm9zIHRpcG9zIGRlIGVycm9yZXMgc2UgY29udHJhYmFsYW5jZWFuIG11dHVhbWVudGUuCgohW10oY2hlZi5wbmcpe3dpZHRoPSI0MzkifQoKwr9RdcOpIHRpcG8gZGUgZXJyb3IgZXMgbcOhcyBwZXJuaWNpb3NvPwpFcyB1biB0ZW1hIHF1ZSBsb3MgZmlsw7Nzb2ZvcyB0cmF0YW4gZGUgcmVzcG9uZGVyLgoKIlRoZXJlIGFyZSB0d28gd2F5cyB0byBiZSBmb29sZWQuIE9uZSBpcyB0byBiZWxpZXZlIHdoYXQgaXNuwrR0IHRydWUuIFRoZSBvdGhlciBpcyB0byByZWZ1c2UgdG8gYmVsaWV2ZSB3aGF0IGlzIHRydWUiIChTb3JlbiBLaWVya2VnYWFyZCkuCgojIE5vdGEgZmluYWwKCkVzdGUgcHJvY2VkaW1pZW50byBzZSBwb2Ryw61hIGRlY2lyIHF1ZSBlcyBwYXJ0ZSBkZWwgbcOpdG9kbyBjaWVudMOtZmljbywgZW4gZWwgc2VudGlkbyBwb3BwZXJpYW5vIGRlICJmYWxzZWFiaWxpZGFkIi4KRGVzZGUgZXN0YSBwZXJzcGVjdGl2YSwgdW5hIGludmVzdGlnYWNpw7NuIGNpZW50w61maWNhIHBhcnRlIGRlIHVuYSBoaXDDs3Rlc2lzIGRlIG5vIGVmZWN0byBxdWUgYnVzY2EgbmVnYXIgY29uIGV2aWRlbmNpYSBlbXDDrXJpY2EgcGFyYSBsbGVnYXIgYSBsYSBjb25jbHVzacOzbiBxdWUgc8OtIGV4aXN0ZW4gZXNlIGVmZWN0by4KTGFzIGNvbmNsdXNpb25lcyBhIGxhcyBxdWUgc2UgbGxlZ2FuIHNpZW1wcmUgdGllbmVuIHVuIGNvbXBvbmVudGUgZGUgaW5jZXJ0aWR1bWJyZS4KCkVzdGUgbcOpdG9kbyBlcyBjb250cmFpbnR1aXRpdm8uCkVsIHNlciBodW1hbm8sIHBvciBlbCBjb250cmFyaW8sIGdlbmVyYWxtZW50ZSBidXNjYSBldmlkZW5jaWEgcGFyYSBhZmlybWFyIHVuYSBoaXDDs3Rlc2lzIGRlIHF1ZSBleGlzdGUgdW4gZWZlY3RvIG8gcmVsYWNpw7NuLgpFbiBjaWVydG8gc2VudGlkbywgc2UgYnVzY2EgcmVhZmlybWFyIGxhcyBwcmVub2Npb25lcy4KClBvciBlamVtcGxvLCBubyBlcyBsbyBtaXNtbyBwYXJ0aXIgZGUgbGEgaGlww7N0ZXNpcyBxdWUgbGEgInJldm9sdWNpw7NuIGNhcGl0YWxpc3RhIiBlbiBlbCBQZXLDuiB0cmFqbyBiaWVuZXN0YXIgeSBkZXNhcnJvbGxvIHkgYnVzY2FyIGV2aWRlbmNpYSBxdWUgYXBveWEgZXN0YSBoaXDDs3Rlc2lzLCBxdWUgcGFydGlyIGRlIGxhIGhpcMOzdGVzaXMgcXVlIGxhICJyZXZvbHVjacOzbiBjYXBpdGFsaXN0YSIgTk8gdHJham8gYmllbmVzdGFyIHkgZGVzYXJyb2xsbyB5IGJ1c2NhciBldmlkZW5jaWEgc3VmaWNpZW50ZSBwYXJhIG5lZ2FyIGVzYSBoaXDDs3Rlc2lzIHkgYWZpcm1hciBxdWUgc8OtIGxvIGhpem8uClBhcmEgdW5hIG11ZXN0cmEgZGUgZXN0YSBkaWZlcmVuY2lhIHZlciBlbCBbY29tZW50YXJpbyBkZSBDb3RsZXIgYWwgbGlicm8gZGUgQWx0aGF1c10oaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj05MzVMS091cmk1NCZ0PTQzcykuCgojIAo=