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.

Prueba t de diferencia de medias

Esta prueba compara la media de una variable numérica entre dos grupos o categorías de una variable nominal u ordinal. Los grupos que forman la variable nominal/ordinal tienen que ser independientes. Es decir, cada observación debe pertenecer a un grupo o al otro, pero no a ambos.

Por ejemplo, si se quisiera evaluar si existen diferencias en el rendimiento académico entre alumnos hombres y mujeres en la PUCP, teóricamente, se habría registrado el CRAEST de todos los alumnos de la universidad (Variable X) y por lo tanto se podría tener los parámetros del CRAEST para los alumnos hombres y las alumnas mujeres.

Como no se tiene recursos para llegar a toda la población, se extrae una muestra, que incluye alumnos y alumnas. En cada grupo se puede calcular el promedio del CRAEST y se pueden comparar esos promedios muestrales.

Es decir, esta prueba buscar dar luces si la diferencia \(\overline{X}_1 - \overline{X}_2\) se puede extrapolar a la diferencia \(\mu_{x1} - \mu_{x2}\).

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)
sexo condicion N total
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=