Visualización

library(rio)
res2016 = import("resultados2016.xlsx")

Una de las tareas más comunes en el manejo de datos es la visualización de los resultados. En R hay dos maneras de proceder. La primera es usar los comandos de base de R. La otra es usar una librería ggplot2 que permite una mayor flexibilidad en la producción y estética de los gráficos.

Para esto se carga la librería ggplot2. Esta tiene un comando ggplot en el que se define los aspectos del gráfico. Por ejemplo, para graficar una variable numérica, como el porcentaje de voto a FP por provincia, se puede producir un histograma.

Dentro de este comando se define la base de datos y la variable que se va a graficar. Luego se van agregando capas. La primera define el tipo de gráfico. Usamos geom_histogram para producir el histograma y se especifica el ancho de columna. Luego se define las etiquetas de ejes y el tema del gráfico.

Se observa que el gráfico de porcentaje de votos a Fuerza Popular es aproximadamente simétrico, tal como indicaban la similitud entre media y mediana.

library(ggplot2)
ggplot(res2016, aes(x=fp))+
  geom_histogram(binwidth = 5)+
  xlab("% Voto FP 2016") +
  ylab("Frecuencia")+
  theme_minimal()

Habíamos encontrado que la media y la mediana del porcentaje de voto al Frente Amplio diferían. Esto lo comprobamos produciendo el histograma de esta variable.

ggplot(res2016, aes(x=fa))+
  geom_histogram(binwidth = 5)+
  geom_vline(xintercept = 29.3, color = "red")+
  geom_vline(xintercept = 24.5, color = "green")+
  xlab("% Voto FA 2011")+
  ylab("Frecuencia")+
  theme_classic()

Otro gráfico útil en la visualización es el llamado “boxplot” o “gráfico de cajas”. Este tipo de gráficos sirve bastante para comparar entre grupos de otra variable.

Para producir un gráfico de cajas usamos la especificación geom_bloxplot() y podemos definir los límites y saltos del eje Y. Este gráfico nos muestra que el distrito con el menor porcentaje de voto a FP tuvo un poco más de 5% y que el máximo fue de casi 80%. También muestra que la votación mediana fue de 40%. Los límites de la caja son el cuartil 25 y el cuartil 75.

ggplot(res2016, aes(y=fp))+
  geom_boxplot()+
  ylab("% Voto FP 2011")

El aspecto más útil de los gráficos de cajas es la comparación. Por ejemplo, si se quisiera comparar el voto a Fuerza Popular entre departamentos del país. Para hacer esto se debe definir que la variable en el eje Y sea el porcentaje de votos a Fuerza Popular “fp” y en el eje X la variable que define los departamentos “dpto”.

En el gráfico se pueden hacer varias comparaciones. Lo más importante es comparar medianas y anchos de cajas entre departamentos. Los puntos aislados son “outliers” o valores extremos, que se calculan automáticamente y se grafican.

Este gráfico, sin embargo, es muy desagragado.

ggplot(res2016, aes(y=fp, x=dpto))+
  geom_boxplot()+
  scale_y_continuous(limits = c(0, 100), breaks = seq(0, 100, 10))+
  ylab("% Voto FP 2011")+
  xlab("Departamento")+
  theme_minimal()

Si se quisiera comparar entre regiones (costa, sierra y selva), se tendría que crear esta variable, a partir de la variable “dpto”.

Recodificando variables

library(tidyverse)
res2016 = res2016 %>%
  mutate(region = case_when(
    dpto=="AMAZONAS"~3,
    dpto=="ANCASH"~2,
    dpto=="APURIMAC"~2,
    dpto=="AREQUIPA"~2,
    dpto=="AYACUCHO"~2,
    dpto=="CAJAMARCA"~2,
    dpto=="CUSCO"~2,
    dpto=="CALLAO"~1,
    dpto=="HUANCAVELICA"~2,
    dpto=="HUANUCO"~3,
    dpto=="ICA"~1,
    dpto=="JUNIN"~2,
    dpto=="LA LIBERTAD"~1,
    dpto=="LAMBAYEQUE"~1,
    dpto=="LIMA"~1,
    dpto=="LORETO"~3,
    dpto=="MADRE DE DIOS"~3,
    dpto=="MOQUEGUA"~1,
    dpto=="PASCO"~2,
    dpto=="PIURA"~1,
    dpto=="PUNO"~2,
    dpto=="SAN MARTIN"~3,
    dpto=="TACNA"~1,
    dpto=="TUMBES"~1,
    dpto=="UCAYALI"~3
  )) 
res2016 %>%
  count(Region = region, name="Frecuencia")
##   Region Frecuencia
## 1      1         49
## 2      2        104
## 3      3         43

La variable creada es una variable de tipo “numérico”. En R existe otro tipo de variable llamado “factor”. Podemos convertir cualquier variable a una de factor y etiquetar cada valor.

library(forcats)
res2016 = res2016 %>%
  mutate(region2 = factor(region, labels=c("Costa", "Sierra", "Selva")))

Ahora, procedemos a producir el gráfico de cajas de porcentaje de voto a Fuerza Popular por región.

ggplot(res2016, aes(y=fp, x=region2))+
  geom_boxplot()+
  scale_y_continuous(limits = c(0, 100), breaks = seq(0, 100, 20))+
  ylab("% Voto FP 2016")+
  xlab("Región")+
  theme_get()

Se observa en este gráfico que el voto mediano a Fuerza Popular fue mayor entre provincias de la costa, seguido por la selva y luego la sierra. Este mismo patrón se observa si calculáramos la media del porcentaje de voto provincial a Fuerza Popular por región.

res2016 %>% 
  group_by(region2) %>%
  summarise(mean(fp), sd(fp))
## # A tibble: 3 × 3
##   region2 `mean(fp)` `sd(fp)`
##   <fct>        <dbl>    <dbl>
## 1 Costa         49.6     13.6
## 2 Sierra        32.5     14.0
## 3 Selva         45.0     13.6

Caso 1: ¿los peruanos leen?

Pregunta: Existe un sentido común que indica que los peruanos no leen. ¿Es aquello cierto? ¿Existen diferencias de género o socioeconómicas en los niveles de lectura?

Para responder a esta pregunta, usaremos la Encuesta Nacional de Lectura de 2022.

library(rio)
enl = import("/Users/Arturo/Library/CloudStorage/GoogleDrive-arturo.maldonado@pucp.pe/My Drive/A Cursos/Estadistica_1/Data/ENL2022/ENL2022.sav")

Esta encuesta tiene una pregunta que indaga directamente (P408). Cuando se importa los datos a R, esta variable se importa como una variable numérica, cuando en realidad, es una variable de tipo factor.

Se usa el comando mutate para crear una nueva variable y el comando factor para transformar la variable numérica a una de factor con sus respectivos labels.

library(tidyverse)
enl = enl %>%
  mutate(lee = factor(P408, labels=c("Sí", "No")))

Descripción de variables de factor

Para describir variables que no son numéricas, podemos producir tablas de distribución de frecuencias. Por ejemplo, podemos describir la variable “lee” de la base de datos. Podemos usar el comando count para calcular la tabla de distribución de frecuencias de esta variable. Se guarda esta tabla en un objeto “tabla1”.

tabla1 = enl %>%
  filter(lee == "Sí" | lee == "No") |>
  count(Lee = lee, name="Frecuencia")
tabla1
##   Lee Frecuencia
## 1  Sí      18929
## 2  No      22714

Para calcular los porcentajes, se puede agregar a la tabla una columna “Porcentaje” con el cálculo de la “Frecuencia” (columna existente) ente la suma total de las frecuencias. Se encuentra que Fuerza Popular ganó en el 57% de provincias del Perú.

tabla1 = tabla1 %>%
  mutate(Porcentaje = (Frecuencia / sum(Frecuencia)*100 ))
tabla1
##   Lee Frecuencia Porcentaje
## 1  Sí      18929   45.45542
## 2  No      22714   54.54458

Para graficar una variable de tipo cualitativa (o de factor en el lenguaje de R), se debe usar, por ejemplo, un gráfico de barras. Podemos graficar estos porcentajes.

Para esto usamos la librería ggplot2, pero ahora no realizaremos un histograma (no usaremos geom_histogram), sino barras, con geom_bar. Dentro de este comando se añade stat="identity para indicar que R no calcule nada y solo use los datos de “tabla”.

library(ggplot2)
graf1 = ggplot(tabla1, aes(x=Lee,y=Porcentaje))+
  geom_bar(stat="identity", width=0.5)
graf1

La encuesta también incluye la pregunta P209 sobre género. Esta variable se importa como una numérica, por lo que nuevamente la transformamos en una variable de tipo factor “sexo” con sus etiquetas.

enl = enl %>%
  mutate(sexo = factor(P209, labels=c("Hombre", "Mujer")))

Ahora usamos esta variable para calcular las frecuencias y porcentajes por grupos de sexo.

tabla2 = enl %>%
  filter(lee == "Sí" | lee == "No") %>%
  group_by(sexo) %>%
  count(Lee = lee, name="N")%>%
  mutate(total = sum(N), 
         Por = N / total * 100)
tabla2
## # A tibble: 4 × 5
## # Groups:   sexo [2]
##   sexo   Lee       N total   Por
##   <fct>  <fct> <int> <int> <dbl>
## 1 Hombre Sí     8307 19759  42.0
## 2 Hombre No    11452 19759  58.0
## 3 Mujer  Sí    10622 21884  48.5
## 4 Mujer  No    11262 21884  51.5

La tabla nos indica los porcentajes de los que sí leen y los que no leen por sexo. Como solo queremos graficar los porcentajes de los que sí leen, podemos eliminar las filas de los que no leen.

tabla2 = tabla2[-c(2,4),]

Con esta tabla reducida, podemos graficas usando ggplot. Ahora agregamos la capa geom_text para incluir el dato del porcentaje dentro del gráfico.

graf2 = ggplot(tabla2, aes(x=sexo, y=Por))+
  geom_bar(stat="identity")+
  geom_text(aes(label=paste(round(Por, 1))), vjust=-1, size=3)+
  labs(x="Sexo", y="Porcentaje")+
  theme_classic()
graf2

La base de datos incluye una variable “nse”, que refiere al nivel socioeconómico de la persona que responde. Este nivel socioeconómico está categorizado en 4 niveles.

enl = enl %>%
  mutate(nse1 = factor(nse, labels=c("Rural", "Bajo", "Medio", "Alto")))

Pasamos a calcular los porcentajes de lectura por los 4 niveles socioeconómicos.

tabla3 = enl %>%
  filter(lee == "Sí" | lee == "No") %>%
  group_by(nse1) %>%
  count(Lee = lee, name="N")%>%
  mutate(total = sum(N), 
         Por = N / total * 100)
tabla3
## # A tibble: 8 × 5
## # Groups:   nse1 [4]
##   nse1  Lee       N total   Por
##   <fct> <fct> <int> <int> <dbl>
## 1 Rural Sí     1431  4819  29.7
## 2 Rural No     3388  4819  70.3
## 3 Bajo  Sí     8684 20815  41.7
## 4 Bajo  No    12131 20815  58.3
## 5 Medio Sí     4254  8301  51.2
## 6 Medio No     4047  8301  48.8
## 7 Alto  Sí     4560  7708  59.2
## 8 Alto  No     3148  7708  40.8

Nuevamente eliminamos las filas de los porcentajes de aquellos que no leen.

tabla3 = tabla3[-c(2,4,6,8),]

Y graficamos los porcentajes de los que sí leen por niveles socioeconómicos.

graf3 = ggplot(tabla3, aes(x=nse1, y=Por))+
  geom_bar(stat="identity")+
  geom_text(aes(label=paste(round(Por, 1))), vjust=-1, size=3)+
  labs(x="NSE", y="Porcentaje")+
  theme_classic()
graf3

Tarea

Se encontró que una mayor proporción de mujeres que hombres lee. ¿Cuántos libros impresos y digitales lee el peruano promedio? ¿Existen diferencias entre hombres y mujeres entre el promedio de libros impresos y digitales que leen? ¿Entre niveles socioeconómicos?

Caso 2: Encuesta Nacional Docente 2020

Cada dos años, el Ministerio de Educación realiza una encuesta a una muestra de docentes de educación básica en el Perú. La última disponible fue hecha en 2020, en medio de la pandemia del COVID-19. Las bases de datos y cuestionarios de esta encuesta se encuentran disponibles aquí.

En esta ubicación se encuentra la base de datos, que puede ser descargada y leída en R con el siguiente código.

library(rio)
endo2020 = import("bases/ENDO_REMOTO_2020.dta")
#CAMBIAR A PROPIO DIRECTORIO DE TRABAJO

Estimación puntual

De una variable numérica, la medida de tendencia central más útil es la media. La encuesta a docentes incluye la pregunta:

  1. ¿A cuántos estudiantes le brinda acompañamiento como docente de aula en esta IE? (Ver cuestionario)

De esta pregunta podemos preguntarnos: ¿A cuántos alumnos en promedio acompaña el docente peruano en aula? Esta encuesta tiene una pregunta que nos permite calcular esta media y la desviación estándar.

library(dplyr)
library(tidyverse)
endo2020 %>%
  summarize(Media =mean(P1_6, na.rm = T), Desv.Std = sd(P1_6, na.rm = T))
##      Media Desv.Std
## 1 39.98644 50.76707

Es decir, un profesor promedio en Perú acompaña aproximadamente a 40 alumnos en aula. ¿Existen diferencias en el número promedio de alumnos que acompañan docentes hombres y docentes mujeres?

Cuando se importa la base de datos, la variable sexo, P1_1, es definida como numérica.

str(endo2020$P1_1)
##  num [1:28216] 1 2 2 NA NA 2 1 NA NA NA ...
##  - attr(*, "label")= chr "Sexo"
##  - attr(*, "format.stata")= chr "%12.0g"
##  - attr(*, "labels")= Named num [1:2] 1 2
##   ..- attr(*, "names")= chr [1:2] "Masculino" "Femenino"

La podemos transformar a una variable de tipo factor.

endo2020 = endo2020 %>%
  mutate(sexo = factor(P1_1, labels=c("Hombre", "Mujer")))

Calculamos los datos para hombres y mujeres.

tabla1 = endo2020 %>%
  group_by(sexo) %>%
  summarize(Media = mean(P1_6, na.rm = T), 
            Desv.Std = sd(P1_6, na.rm = T),
            Mediana = median(P1_6, na.rm = T))
tabla1
## # A tibble: 3 × 4
##   sexo   Media Desv.Std Mediana
##   <fct>  <dbl>    <dbl>   <dbl>
## 1 Hombre  52.2     60.4      28
## 2 Mujer   34.1     44.2      22
## 3 <NA>   NaN       NA        NA

Se encuentra que los docentes hombres acompañan, en promedio, a 52 alumnos, mientras que las docentes mujeres acompañan a 34 alumnos, una diferencia de 18 alumnos en promedio.

Todos estos resultados son puntuales y aplican para la muestra de 28,216 profesores.

Para una comparación gráfica, se puede usar boxplot.

library(ggplot2)
ggplot(endo2020, aes(y=P1_6, x=sexo))+
  geom_boxplot()
## Warning: Removed 9266 rows containing
## non-finite outside the scale
## range (`stat_boxplot()`).

endo2020 = endo2020 %>%
  mutate(condicion = factor(P1_7, labels=c("Nombrado", "Contratado x concurso", "Contratado otro")))
tabla2 = endo2020 %>%
  group_by(condicion) %>%
  summarize(Media = mean(P1_6, na.rm = T), 
            Desv.Std = sd(P1_6, na.rm = T),
            Mediana = median(P1_6, na.rm = T))
tabla2
## # A tibble: 4 × 4
##   condicion             Media Desv.Std Mediana
##   <fct>                 <dbl>    <dbl>   <dbl>
## 1 Nombrado               36.9     48.0      23
## 2 Contratado x concurso  43.7     53.6      23
## 3 Contratado otro        50.6     66.1      23
## 4 <NA>                  NaN       NA        NA
library(ggplot2)
library(tidyverse)
endo2020 %>%
  drop_na(P1_6) %>%
  ggplot(aes(y=P1_6, x=condicion))+
  geom_boxplot()

ggplot(subset(endo2020, !is.na(P1_6)), aes(y=P1_6, x=condicion))+
  geom_boxplot()

Si se quiere hacer un gráfico de barras simples para mostrar la media del número de alumnos por sexo del profesor, se puede usar:

ggplot(tabla1, aes(x=sexo, y=Media)) + 
  geom_bar(stat = "identity") +
  ggtitle("Número de alumnos promedio por sexo del docente") +
  xlab("Sexo del docente") +
  geom_text(aes(label=round(Media,1)), vjust=1.30, color="white", size=3)+
  theme_minimal()
## Warning: Removed 1 row containing
## missing values or values
## outside the scale range
## (`geom_bar()`).
## Warning: Removed 1 row containing
## missing values or values
## outside the scale range
## (`geom_text()`).

¿Cómo se pueden extrapolar estos resultados al universo de profesores peruanos?

Estimación por intervalos

Tanto la media muestral, como la proporción muestral, son estimaciones puntuales, basados en los resultados de la muestra. Es decir, estas son estimaciones correspondientes a las 28,216 observaciones que son parte de este estudio. Sin embargo, esta muestra forma parte de un universo o población (el conjunto de profesores del Perú), del que seguramente se quiere decir algo.

El mismo razonamiento aplica a una encuesta de opinión convencional. La ficha técnica de una encuesta menciona, generalmente, el tamaño de muestra y la población a la que se busca representar. También se puede encontrar el margen de error (+/- 2.8%) y el nivel de confianza (generalmente de 95%).(Ver, por ejemplo, la encuesta de opinión de agosto 2023 de Ipsos.

El proceso mediante el cual se parte de una muestra para decir algo de un universo o población es un proceso de inferencia y es parte de la estadística inferencial. La estadística inferencial introduce la incertidumbre en los estimados, debido al hecho de estar trabajando con una muestra y no con el total de observaciones del universo.

Un breve paseo por las probabilidades

Partimos del hecho que en el común de las investigaciones uno tiene que seleccionar un conjunto de observaciones que son parte del total, que es muy costoso e ineficiente hacer un estudio de la población completa. La analogía es, por ejemplo, que para un análisis de sangre se extrae una “muestra” de sangre y no el total de sangre del cuerpo.

A esto le sumamos el hecho que nuestras herramientas de recojo de información son imperfectas. Un estudio transversal, por ejemplo, debería recoger información de los individuos en un corte en el tiempo, sin embargo, muchos estudios no son una “foto del momento”, pues las observaciones toman tiempo y abarcan horas, días o semanas, sino meses.

Es por este motivo que para un estudio se selecciona “una” muestra, un conjunto de observaciones que son una fracción del total. Esta selección se hace siguiendo procedimientos aleatorios, de tal manera que cualquier unidad del universo tenga la misma probabilidad de ser seleccionada.

El punto es que esta única muestra es solo una de las múltiples muestras teóricas que se podrían seleccionar de un universo determinado.

Partamos de un ejemplo muy simple. Para un universo de 5 personas, se pueden extraer 10 muestras de tamaño 2 diferentes.

La fórmula para calcular el número de muestras probables es la de combinatorias, que incluye el operador factorial. Si aplicamos esta fórmula a un ejemplo de un universo más grande, por ejemplo, un salón de clase de 50 alumnos, donde se quiere saber cuántas muestras diferentes de tamaño 4 se pueden extraer. Según la fórmula:

\[ \frac{50!} {(50-4)! 4!} = \frac{50!} {46! 4!} = \frac{50*49*48*47} {4*3*2} = 230,300 \]

Para un sondeo de opinión, donde el universo son 24 millones de individuos y se quiere saber cuántas muestras diferentes de tamaño 1,500 se pueden extraer, este número de muestras probables es muuuuy grande.

Volviendo al ejemplo muy simple de 5 personas donde se quiere extraer una muestra de 2 y se quiere inferir los datos de la muestra de dos variables: sexo y edad.

Se tiene un universo de 5 individuos, cada uno con su sexo y edad. En la población la proporción de hombres es de 60% y la media de edad es de 34 años.

Si queremos extraer una muestra de tamaño de 2 de ese universo, se tienen 10 posibles muestras, cada una tendrá una aproximación de la proporción de hombres y de la media de edad. Dependiendo de qué muestra de todas las posibles sea la que se observa, los estadísticos serán una aproximación de los parámetros poblacionales.

En el caso de la proporción de hombres, se puede tabular los resultados de cada muestra probable.

Resultados muestrales Número de muestras que arrojaron ese resultado Frecuencia
0% 1 X
50% 5 XXXXX
100% 4 XXXX

Incluso se podría calcular un promedio de todas esas proporciones muestrales (100+50+100+…+50/10), y ese resultado sería 65%, un resultado algo cerca de la proporción poblacional de 60%.

Este mismo procedimiento se podría hacer para todas las 230,300 muestras probables de tamaño 4 de un universo de 50 alumnos. Cada uno de los 50 alumnos será hombre o mujer y la proporción poblacional de hombres se puede calcular en ese total. A su vez, cada muestra de 4, tendrá una proporción muestral que tendrá valores (0 si no hay ningún hombre, 25% si hay 1 hombre, 50% si hay 2 hombres, 75% si hay 3 hombres y 100% si todos son hombres). Finalmente, se puede contar cuántas de las 230,300 muestras probables tuvieron 0%, 25%, 50%, 75% y 100% de hombres. Esta distribución se llama “distribución de muestreo”.

Si quisiéramos ampliar el tamaño de muestra a 10, entonces los resultados posibles serían, 0, 10, 20, 30, 40, 50, 60, 70, 80, 90 y 100%. También podríamos contar cuántas muestras tienen estos resultados.

De un universo más grande, se puede plantear extraer muestras de tamaño más grande. Por ejemplo, teóricamente se puede pensar que de un universo de 20 millones, se pueden extraer casi infinitas muestras de tamaño 1,500. Cada una de estas muestras tendrá un estadístico que será una aproximación del parámetro. Los estadísticos de todas estas casi infinitas muestras se pueden tabular y graficar.

Teorema del límite central

Este teorema muestra que la distribución de muestreo se aproxima a una distribución normal, con centro en el parámetro, en la medida que el tamaño de muestra aumenta.

Esto se puede mostrar gráficamente en el Tablero de Galton, ver aquí

Por lo tanto, la distribución de muestreo de N grandes para cualquier variable seguirá las características de cualquier curva normal. Toda curva normal es simétrica y sabemos que si desde el centro se desplaza 1 desviación estándar en ambas direcciones, entre esos límites estarán el 68.3% de todas las observaciones. Si se desplaza 2 desviaciones estándar en ambas direcciones, se acumularían el 95.4% de todas las observaciones. Con 3 desviaciones estándar hacia ambos lados, se acumularía el 99.7% de todas las observaciones.

Traduciendo a la distribución de muestreo, la idea es que si se tabulan y se hace un gráfico de barras de los resultados de todas las muestras probables, se tendría una curva normal con centro en el parámetro. Sabríamos que si desde ese centro nos desplazamos 2 desviaciones estándar en ambas direcciones, entre esos límites estarían el 95% de todas las muestra probables.

Es altamente probable (95% probable) que si en una investigación se extrae una sola muestra, esta sea parte del 95% de muestras posibles a +/- 2 desviaciones estándar del parámetro. De la misma manera, es poco probable (5% probable) que una sola muestra no esté a +/- 2 desviaciones estándar del parámetro.

Estimación de intervalos de confianza

La distribución de muestreo es teórica, muy difícilmente se puede calcular en la realidad. Regularmente tampoco sabemos los datos del universo. Lo que tenemos a mano es 1 muestra observada. Es decir, en un estudio de las muuuuuchas muestras probables, se selecciona 1 muestra.

En el caso de la encuesta ENDO, por ejemplo, del universo de profesores peruanos, se seleccionó 1 muestra de 28,216 observaciones, de las muuuuchas muestras de 28,216 individuos de la población total.

Si teóricamente sabemos que en la distribución muestral, el 95% de todas las muestras están a +/- 2 desviaciones estándar1 del centro, que coincide con el parámetro poblacional, es muy probable que la única muestra que se ha observado sea parte de ese conjunto. De hecho, se puede decir que se tiene 95% de probabilidades de que sea parte de ese grupo.

Por lo tanto, si a partir del estadístico muestral, se aplica esta distancia de +/- 2 errores estándar, se tiene 95% de probabilidades que entre esos límites se incluya al valor del parámetro. Para verlo de manera más visual, en la siguiente figura se tiene la distribución de muestreo teórica (y desconocida), donde se marca la región que acumula el 95% de todas las muestras probables.

Más abajo se marca los resultados de 2 muestras observadas. La primera proporción muestral subestima la proporción poblacional. La segunda, por el contrario, sobreestima la proporción poblacional. En el primer caso, si a partir del estadístico muestral se aplica +/- 1.96 errores estándar (línea horizontal en negrita), se observa que el parámetro poblacional está incluido en esos límites.

Es probable, como en el segundo caso, que otra muestra probable, cuando se le aplique el intervalo de +/- 1.96 errores estándar, no incluya al parámetro. Se observa que la línea en negrita no incluye la linea vertical entrecortada que marca el valor del parámetro poblacional.

Sin embargo, sabemos que es mucho más probable (95% de probabilidades) que si una muestra observada es parte del 95% de muestras alrededor del parámetro, este intervalo incluya al parámetro poblacional. A estos límites le llamamos “intervalos de confianza”.

En cualquier investigación solo se cuenta con una muestra observada, cuyo estadístico muestral, sea una media o un proporción, es una aproximación del parámetro poblacional.

Para poder extrapolar desde la muestra hasta la población, se tiene que construir un intervalo de confianza alrededor del estadístico muestral. Este intervalo se construye aplicando la “distancia” de +/- 1.96 errores estándar, para tener una confianza de 95% de incluir al parámetro poblacional.

Si se está extrapolando para una variable numérica, mediante la media, el error estándar (o se) es:

\[ se = 1.96 * \frac{s} {\sqrt{n}} \]

Si se está extrapolando para una variable categórica, mediante una proporción, el error estándar (o se) es:

\[ se = 1.96 * \sqrt{\frac{(p * (1-p))} {n}} \]

A manera de resumen, la siguiente tabla nos muestra el parámetro, el estadístico puntual y el error estándar para cada tipo de variable y cómo se forma el intervalo de confianza.

En estas fórmulas, se usa el símbolo “t” y “z” para referir a las distribuciones teóricas que se usan. Para fines prácticos, cuando la muestra es grande, ambas distribuciones son iguales. El valor de “t” o “z” depende del nivel de confianza que queremos. Es decir, de la probabilidad que queremos de que el intervalo incluya al parámetro. De esta manera:

  • Z al 90% = 1.645

  • Z al 95% = 1.96

  • Z al 98% = 2.326

  • Z al 99% = 2.576

¿Qué pasa con el IC cuando se quiere mayor confianza? ¿Se vuelve más o menos preciso?

En el ejemplo del cálculo del promedio de alumnos que atiende los profesores, se puede añadir el cálculo de los intervalos de confianza en ambos casos, para hombres y mujeres. El comando para hacer esto es ciMean que es parte de la librería lsr.

library(lsr)
ciMean(endo2020$P1_6, na.rm = T)
##          2.5%   97.5%
## [1,] 39.26358 40.7093

Si se calculan los intervalos de confianza por grupos, estos se pueden comparar.

library(lsr)
ci_alumxsexo = endo2020 |>
  group_by(sexo) |>
  summarise(Media = mean(P1_6, na.rm=T),
            min = ciMean(P1_6, na.rm=T)[1],
            max = ciMean(P1_6, na.rm=T)[2]
            )
ci_alumxsexo
## # A tibble: 3 × 4
##   sexo   Media   min   max
##   <fct>  <dbl> <dbl> <dbl>
## 1 Hombre  52.2  50.7  53.8
## 2 Mujer   34.1  33.3  34.8
## 3 <NA>   NaN    NA    NA

Se encuentra que la media de alumnos que atiende un docente hombre esta entre 50.7 y 53.8 alumnos, mientras que en el caso de las docentes mujeres está entre 33.3 y 34.8 alumnos en aula.

¿Qué más se puede decir de esta comparación entre intervalos de confianza? ¿Cómo graficar estos intervalos de confianza?

Bibliografía


  1. En realidad es a +/- 2 errores estándar del centro. El error estándar se entiende como la desviación estándar de la distribución de muestreo.↩︎

LS0tCnRpdGxlOiAnQ2xhc2UgMzogVmlzdWFsaXphY2nDs24nCmF1dGhvcjogIkFydHVybyBNYWxkb25hZG8iCmRhdGU6ICIzLzkvMjAyMyIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgY29sbGFwc2VkOiBmYWxzZQogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQogICAgdG9jX2RlcHRoOiAxCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICB0aGVtZTogY29zbW8KICAgIGhpZ2hsaWdodDogdGV4dG1hdGUKZWRpdG9yX29wdGlvbnM6CiAgbWFya2Rvd246CiAgICB3cmFwOiBzZW50ZW5jZQpiaWJsaW9ncmFwaHk6IHJlZmVyZW5jZXMuYmliCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgVmlzdWFsaXphY2nDs24KCmBgYHtyfQpsaWJyYXJ5KHJpbykKcmVzMjAxNiA9IGltcG9ydCgicmVzdWx0YWRvczIwMTYueGxzeCIpCmBgYAoKVW5hIGRlIGxhcyB0YXJlYXMgbcOhcyBjb211bmVzIGVuIGVsIG1hbmVqbyBkZSBkYXRvcyBlcyBsYSB2aXN1YWxpemFjacOzbiBkZSBsb3MgcmVzdWx0YWRvcy4KRW4gUiBoYXkgZG9zIG1hbmVyYXMgZGUgcHJvY2VkZXIuCkxhIHByaW1lcmEgZXMgdXNhciBsb3MgY29tYW5kb3MgZGUgYmFzZSBkZSBSLgpMYSBvdHJhIGVzIHVzYXIgdW5hIGxpYnJlcsOtYSBgZ2dwbG90MmAgcXVlIHBlcm1pdGUgdW5hIG1heW9yIGZsZXhpYmlsaWRhZCBlbiBsYSBwcm9kdWNjacOzbiB5IGVzdMOpdGljYSBkZSBsb3MgZ3LDoWZpY29zLgoKUGFyYSBlc3RvIHNlIGNhcmdhIGxhIGxpYnJlcsOtYSBgZ2dwbG90MmAuCkVzdGEgdGllbmUgdW4gY29tYW5kbyBgZ2dwbG90YCBlbiBlbCBxdWUgc2UgZGVmaW5lIGxvcyBhc3BlY3RvcyBkZWwgZ3LDoWZpY28uClBvciBlamVtcGxvLCBwYXJhIGdyYWZpY2FyIHVuYSB2YXJpYWJsZSBudW3DqXJpY2EsIGNvbW8gZWwgcG9yY2VudGFqZSBkZSB2b3RvIGEgRlAgcG9yIHByb3ZpbmNpYSwgc2UgcHVlZGUgcHJvZHVjaXIgdW4gaGlzdG9ncmFtYS4KCkRlbnRybyBkZSBlc3RlIGNvbWFuZG8gc2UgZGVmaW5lIGxhIGJhc2UgZGUgZGF0b3MgeSBsYSB2YXJpYWJsZSBxdWUgc2UgdmEgYSBncmFmaWNhci4KTHVlZ28gc2UgdmFuIGFncmVnYW5kbyBjYXBhcy4KTGEgcHJpbWVyYSBkZWZpbmUgZWwgdGlwbyBkZSBncsOhZmljby4KVXNhbW9zIGBnZW9tX2hpc3RvZ3JhbWAgcGFyYSBwcm9kdWNpciBlbCBoaXN0b2dyYW1hIHkgc2UgZXNwZWNpZmljYSBlbCBhbmNobyBkZSBjb2x1bW5hLgpMdWVnbyBzZSBkZWZpbmUgbGFzIGV0aXF1ZXRhcyBkZSBlamVzIHkgZWwgdGVtYSBkZWwgZ3LDoWZpY28uCgpTZSBvYnNlcnZhIHF1ZSBlbCBncsOhZmljbyBkZSBwb3JjZW50YWplIGRlIHZvdG9zIGEgRnVlcnphIFBvcHVsYXIgZXMgYXByb3hpbWFkYW1lbnRlIHNpbcOpdHJpY28sIHRhbCBjb21vIGluZGljYWJhbiBsYSBzaW1pbGl0dWQgZW50cmUgbWVkaWEgeSBtZWRpYW5hLgoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeShnZ3Bsb3QyKQpnZ3Bsb3QocmVzMjAxNiwgYWVzKHg9ZnApKSsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDUpKwogIHhsYWIoIiUgVm90byBGUCAyMDE2IikgKwogIHlsYWIoIkZyZWN1ZW5jaWEiKSsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgpIYWLDrWFtb3MgZW5jb250cmFkbyBxdWUgbGEgbWVkaWEgeSBsYSBtZWRpYW5hIGRlbCBwb3JjZW50YWplIGRlIHZvdG8gYWwgRnJlbnRlIEFtcGxpbyBkaWZlcsOtYW4uCkVzdG8gbG8gY29tcHJvYmFtb3MgcHJvZHVjaWVuZG8gZWwgaGlzdG9ncmFtYSBkZSBlc3RhIHZhcmlhYmxlLgoKYGBge3J9CmdncGxvdChyZXMyMDE2LCBhZXMoeD1mYSkpKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gNSkrCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMjkuMywgY29sb3IgPSAicmVkIikrCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMjQuNSwgY29sb3IgPSAiZ3JlZW4iKSsKICB4bGFiKCIlIFZvdG8gRkEgMjAxMSIpKwogIHlsYWIoIkZyZWN1ZW5jaWEiKSsKICB0aGVtZV9jbGFzc2ljKCkKYGBgCgpPdHJvIGdyw6FmaWNvIMO6dGlsIGVuIGxhIHZpc3VhbGl6YWNpw7NuIGVzIGVsIGxsYW1hZG8gImJveHBsb3QiIG8gImdyw6FmaWNvIGRlIGNhamFzIi4KRXN0ZSB0aXBvIGRlIGdyw6FmaWNvcyBzaXJ2ZSBiYXN0YW50ZSBwYXJhIGNvbXBhcmFyIGVudHJlIGdydXBvcyBkZSBvdHJhIHZhcmlhYmxlLgoKUGFyYSBwcm9kdWNpciB1biBncsOhZmljbyBkZSBjYWphcyB1c2Ftb3MgbGEgZXNwZWNpZmljYWNpw7NuIGBnZW9tX2Jsb3hwbG90KClgIHkgcG9kZW1vcyBkZWZpbmlyIGxvcyBsw61taXRlcyB5IHNhbHRvcyBkZWwgZWplIFkuCkVzdGUgZ3LDoWZpY28gbm9zIG11ZXN0cmEgcXVlIGVsIGRpc3RyaXRvIGNvbiBlbCBtZW5vciBwb3JjZW50YWplIGRlIHZvdG8gYSBGUCB0dXZvIHVuIHBvY28gbcOhcyBkZSA1JSB5IHF1ZSBlbCBtw6F4aW1vIGZ1ZSBkZSBjYXNpIDgwJS4KVGFtYmnDqW4gbXVlc3RyYSBxdWUgbGEgdm90YWNpw7NuIG1lZGlhbmEgZnVlIGRlIDQwJS4KTG9zIGzDrW1pdGVzIGRlIGxhIGNhamEgc29uIGVsIGN1YXJ0aWwgMjUgeSBlbCBjdWFydGlsIDc1LgoKYGBge3J9CmdncGxvdChyZXMyMDE2LCBhZXMoeT1mcCkpKwogIGdlb21fYm94cGxvdCgpKwogIHlsYWIoIiUgVm90byBGUCAyMDExIikKYGBgCgpFbCBhc3BlY3RvIG3DoXMgw7p0aWwgZGUgbG9zIGdyw6FmaWNvcyBkZSBjYWphcyBlcyBsYSBjb21wYXJhY2nDs24uClBvciBlamVtcGxvLCBzaSBzZSBxdWlzaWVyYSBjb21wYXJhciBlbCB2b3RvIGEgRnVlcnphIFBvcHVsYXIgZW50cmUgZGVwYXJ0YW1lbnRvcyBkZWwgcGHDrXMuClBhcmEgaGFjZXIgZXN0byBzZSBkZWJlIGRlZmluaXIgcXVlIGxhIHZhcmlhYmxlIGVuIGVsIGVqZSBZIHNlYSBlbCBwb3JjZW50YWplIGRlIHZvdG9zIGEgRnVlcnphIFBvcHVsYXIgImZwIiB5IGVuIGVsIGVqZSBYIGxhIHZhcmlhYmxlIHF1ZSBkZWZpbmUgbG9zIGRlcGFydGFtZW50b3MgImRwdG8iLgoKRW4gZWwgZ3LDoWZpY28gc2UgcHVlZGVuIGhhY2VyIHZhcmlhcyBjb21wYXJhY2lvbmVzLgpMbyBtw6FzIGltcG9ydGFudGUgZXMgY29tcGFyYXIgbWVkaWFuYXMgeSBhbmNob3MgZGUgY2FqYXMgZW50cmUgZGVwYXJ0YW1lbnRvcy4KTG9zIHB1bnRvcyBhaXNsYWRvcyBzb24gIm91dGxpZXJzIiBvIHZhbG9yZXMgZXh0cmVtb3MsIHF1ZSBzZSBjYWxjdWxhbiBhdXRvbcOhdGljYW1lbnRlIHkgc2UgZ3JhZmljYW4uCgpFc3RlIGdyw6FmaWNvLCBzaW4gZW1iYXJnbywgZXMgbXV5IGRlc2FncmFnYWRvLgoKYGBge3J9CmdncGxvdChyZXMyMDE2LCBhZXMoeT1mcCwgeD1kcHRvKSkrCiAgZ2VvbV9ib3hwbG90KCkrCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMTAwKSwgYnJlYWtzID0gc2VxKDAsIDEwMCwgMTApKSsKICB5bGFiKCIlIFZvdG8gRlAgMjAxMSIpKwogIHhsYWIoIkRlcGFydGFtZW50byIpKwogIHRoZW1lX21pbmltYWwoKQpgYGAKClNpIHNlIHF1aXNpZXJhIGNvbXBhcmFyIGVudHJlIHJlZ2lvbmVzIChjb3N0YSwgc2llcnJhIHkgc2VsdmEpLCBzZSB0ZW5kcsOtYSBxdWUgY3JlYXIgZXN0YSB2YXJpYWJsZSwgYSBwYXJ0aXIgZGUgbGEgdmFyaWFibGUgImRwdG8iLgoKIyMgUmVjb2RpZmljYW5kbyB2YXJpYWJsZXMKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKcmVzMjAxNiA9IHJlczIwMTYgJT4lCiAgbXV0YXRlKHJlZ2lvbiA9IGNhc2Vfd2hlbigKICAgIGRwdG89PSJBTUFaT05BUyJ+MywKICAgIGRwdG89PSJBTkNBU0gifjIsCiAgICBkcHRvPT0iQVBVUklNQUMifjIsCiAgICBkcHRvPT0iQVJFUVVJUEEifjIsCiAgICBkcHRvPT0iQVlBQ1VDSE8ifjIsCiAgICBkcHRvPT0iQ0FKQU1BUkNBIn4yLAogICAgZHB0bz09IkNVU0NPIn4yLAogICAgZHB0bz09IkNBTExBTyJ+MSwKICAgIGRwdG89PSJIVUFOQ0FWRUxJQ0EifjIsCiAgICBkcHRvPT0iSFVBTlVDTyJ+MywKICAgIGRwdG89PSJJQ0EifjEsCiAgICBkcHRvPT0iSlVOSU4ifjIsCiAgICBkcHRvPT0iTEEgTElCRVJUQUQifjEsCiAgICBkcHRvPT0iTEFNQkFZRVFVRSJ+MSwKICAgIGRwdG89PSJMSU1BIn4xLAogICAgZHB0bz09IkxPUkVUTyJ+MywKICAgIGRwdG89PSJNQURSRSBERSBESU9TIn4zLAogICAgZHB0bz09Ik1PUVVFR1VBIn4xLAogICAgZHB0bz09IlBBU0NPIn4yLAogICAgZHB0bz09IlBJVVJBIn4xLAogICAgZHB0bz09IlBVTk8ifjIsCiAgICBkcHRvPT0iU0FOIE1BUlRJTiJ+MywKICAgIGRwdG89PSJUQUNOQSJ+MSwKICAgIGRwdG89PSJUVU1CRVMifjEsCiAgICBkcHRvPT0iVUNBWUFMSSJ+MwogICkpIApgYGAKCmBgYHtyfQpyZXMyMDE2ICU+JQogIGNvdW50KFJlZ2lvbiA9IHJlZ2lvbiwgbmFtZT0iRnJlY3VlbmNpYSIpCmBgYAoKTGEgdmFyaWFibGUgY3JlYWRhIGVzIHVuYSB2YXJpYWJsZSBkZSB0aXBvICJudW3DqXJpY28iLgpFbiBSIGV4aXN0ZSBvdHJvIHRpcG8gZGUgdmFyaWFibGUgbGxhbWFkbyAiZmFjdG9yIi4KUG9kZW1vcyBjb252ZXJ0aXIgY3VhbHF1aWVyIHZhcmlhYmxlIGEgdW5hIGRlIGZhY3RvciB5IGV0aXF1ZXRhciBjYWRhIHZhbG9yLgoKYGBge3J9CmxpYnJhcnkoZm9yY2F0cykKcmVzMjAxNiA9IHJlczIwMTYgJT4lCiAgbXV0YXRlKHJlZ2lvbjIgPSBmYWN0b3IocmVnaW9uLCBsYWJlbHM9YygiQ29zdGEiLCAiU2llcnJhIiwgIlNlbHZhIikpKQpgYGAKCkFob3JhLCBwcm9jZWRlbW9zIGEgcHJvZHVjaXIgZWwgZ3LDoWZpY28gZGUgY2FqYXMgZGUgcG9yY2VudGFqZSBkZSB2b3RvIGEgRnVlcnphIFBvcHVsYXIgcG9yIHJlZ2nDs24uCgpgYGB7cn0KZ2dwbG90KHJlczIwMTYsIGFlcyh5PWZwLCB4PXJlZ2lvbjIpKSsKICBnZW9tX2JveHBsb3QoKSsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAxMDApLCBicmVha3MgPSBzZXEoMCwgMTAwLCAyMCkpKwogIHlsYWIoIiUgVm90byBGUCAyMDE2IikrCiAgeGxhYigiUmVnacOzbiIpKwogIHRoZW1lX2dldCgpCmBgYAoKU2Ugb2JzZXJ2YSBlbiBlc3RlIGdyw6FmaWNvIHF1ZSBlbCB2b3RvIG1lZGlhbm8gYSBGdWVyemEgUG9wdWxhciBmdWUgbWF5b3IgZW50cmUgcHJvdmluY2lhcyBkZSBsYSBjb3N0YSwgc2VndWlkbyBwb3IgbGEgc2VsdmEgeSBsdWVnbyBsYSBzaWVycmEuCkVzdGUgbWlzbW8gcGF0csOzbiBzZSBvYnNlcnZhIHNpIGNhbGN1bMOhcmFtb3MgbGEgbWVkaWEgZGVsIHBvcmNlbnRhamUgZGUgdm90byBwcm92aW5jaWFsIGEgRnVlcnphIFBvcHVsYXIgcG9yIHJlZ2nDs24uCgpgYGB7cn0KcmVzMjAxNiAlPiUgCiAgZ3JvdXBfYnkocmVnaW9uMikgJT4lCiAgc3VtbWFyaXNlKG1lYW4oZnApLCBzZChmcCkpCmBgYAoKIyBDYXNvIDE6IMK/bG9zIHBlcnVhbm9zIGxlZW4/CgoqUHJlZ3VudGE6IEV4aXN0ZSB1biBzZW50aWRvIGNvbcO6biBxdWUgaW5kaWNhIHF1ZSBsb3MgcGVydWFub3Mgbm8gbGVlbi4gwr9FcyBhcXVlbGxvIGNpZXJ0bz8gwr9FeGlzdGVuIGRpZmVyZW5jaWFzIGRlIGfDqW5lcm8gbyBzb2Npb2Vjb27Ds21pY2FzIGVuIGxvcyBuaXZlbGVzIGRlIGxlY3R1cmE/KgoKUGFyYSByZXNwb25kZXIgYSBlc3RhIHByZWd1bnRhLCB1c2FyZW1vcyBsYSBFbmN1ZXN0YSBOYWNpb25hbCBkZSBMZWN0dXJhIGRlIDIwMjIuCgpgYGB7cn0KbGlicmFyeShyaW8pCmVubCA9IGltcG9ydCgiL1VzZXJzL0FydHVyby9MaWJyYXJ5L0Nsb3VkU3RvcmFnZS9Hb29nbGVEcml2ZS1hcnR1cm8ubWFsZG9uYWRvQHB1Y3AucGUvTXkgRHJpdmUvQSBDdXJzb3MvRXN0YWRpc3RpY2FfMS9EYXRhL0VOTDIwMjIvRU5MMjAyMi5zYXYiKQpgYGAKCkVzdGEgZW5jdWVzdGEgdGllbmUgdW5hIHByZWd1bnRhIHF1ZSBpbmRhZ2EgZGlyZWN0YW1lbnRlIChQNDA4KS4KQ3VhbmRvIHNlIGltcG9ydGEgbG9zIGRhdG9zIGEgUiwgZXN0YSB2YXJpYWJsZSBzZSBpbXBvcnRhIGNvbW8gdW5hIHZhcmlhYmxlIG51bcOpcmljYSwgY3VhbmRvIGVuIHJlYWxpZGFkLCBlcyB1bmEgdmFyaWFibGUgZGUgdGlwbyBmYWN0b3IuCgpTZSB1c2EgZWwgY29tYW5kbyBgbXV0YXRlYCBwYXJhIGNyZWFyIHVuYSBudWV2YSB2YXJpYWJsZSB5IGVsIGNvbWFuZG8gYGZhY3RvcmAgcGFyYSB0cmFuc2Zvcm1hciBsYSB2YXJpYWJsZSBudW3DqXJpY2EgYSB1bmEgZGUgZmFjdG9yIGNvbiBzdXMgcmVzcGVjdGl2b3MgYGxhYmVsc2AuCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmVubCA9IGVubCAlPiUKICBtdXRhdGUobGVlID0gZmFjdG9yKFA0MDgsIGxhYmVscz1jKCJTw60iLCAiTm8iKSkpCmBgYAoKIyMgRGVzY3JpcGNpw7NuIGRlIHZhcmlhYmxlcyBkZSBmYWN0b3IKClBhcmEgZGVzY3JpYmlyIHZhcmlhYmxlcyBxdWUgbm8gc29uIG51bcOpcmljYXMsIHBvZGVtb3MgcHJvZHVjaXIgdGFibGFzIGRlIGRpc3RyaWJ1Y2nDs24gZGUgZnJlY3VlbmNpYXMuClBvciBlamVtcGxvLCBwb2RlbW9zIGRlc2NyaWJpciBsYSB2YXJpYWJsZSAibGVlIiBkZSBsYSBiYXNlIGRlIGRhdG9zLgpQb2RlbW9zIHVzYXIgZWwgY29tYW5kbyBgY291bnRgIHBhcmEgY2FsY3VsYXIgbGEgdGFibGEgZGUgZGlzdHJpYnVjacOzbiBkZSBmcmVjdWVuY2lhcyBkZSBlc3RhIHZhcmlhYmxlLgpTZSBndWFyZGEgZXN0YSB0YWJsYSBlbiB1biBvYmpldG8gInRhYmxhMSIuCgpgYGB7cn0KdGFibGExID0gZW5sICU+JQogIGZpbHRlcihsZWUgPT0gIlPDrSIgfCBsZWUgPT0gIk5vIikgfD4KICBjb3VudChMZWUgPSBsZWUsIG5hbWU9IkZyZWN1ZW5jaWEiKQp0YWJsYTEKYGBgCgpQYXJhIGNhbGN1bGFyIGxvcyBwb3JjZW50YWplcywgc2UgcHVlZGUgYWdyZWdhciBhIGxhIHRhYmxhIHVuYSBjb2x1bW5hICJQb3JjZW50YWplIiBjb24gZWwgY8OhbGN1bG8gZGUgbGEgIkZyZWN1ZW5jaWEiIChjb2x1bW5hIGV4aXN0ZW50ZSkgZW50ZSBsYSBzdW1hIHRvdGFsIGRlIGxhcyBmcmVjdWVuY2lhcy4KU2UgZW5jdWVudHJhIHF1ZSBGdWVyemEgUG9wdWxhciBnYW7DsyBlbiBlbCA1NyUgZGUgcHJvdmluY2lhcyBkZWwgUGVyw7ouCgpgYGB7cn0KdGFibGExID0gdGFibGExICU+JQogIG11dGF0ZShQb3JjZW50YWplID0gKEZyZWN1ZW5jaWEgLyBzdW0oRnJlY3VlbmNpYSkqMTAwICkpCnRhYmxhMQpgYGAKClBhcmEgZ3JhZmljYXIgdW5hIHZhcmlhYmxlIGRlIHRpcG8gY3VhbGl0YXRpdmEgKG8gZGUgZmFjdG9yIGVuIGVsIGxlbmd1YWplIGRlIFIpLCBzZSBkZWJlIHVzYXIsIHBvciBlamVtcGxvLCB1biBncsOhZmljbyBkZSBiYXJyYXMuClBvZGVtb3MgZ3JhZmljYXIgZXN0b3MgcG9yY2VudGFqZXMuCgpQYXJhIGVzdG8gdXNhbW9zIGxhIGxpYnJlcsOtYSBgZ2dwbG90MmAsIHBlcm8gYWhvcmEgbm8gcmVhbGl6YXJlbW9zIHVuIGhpc3RvZ3JhbWEgKG5vIHVzYXJlbW9zIGBnZW9tX2hpc3RvZ3JhbWApLCBzaW5vIGJhcnJhcywgY29uIGBnZW9tX2JhcmAuCkRlbnRybyBkZSBlc3RlIGNvbWFuZG8gc2UgYcOxYWRlIGBzdGF0PSJpZGVudGl0eWAgcGFyYSBpbmRpY2FyIHF1ZSBSIG5vIGNhbGN1bGUgbmFkYSB5IHNvbG8gdXNlIGxvcyBkYXRvcyBkZSAidGFibGEiLgoKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKZ3JhZjEgPSBnZ3Bsb3QodGFibGExLCBhZXMoeD1MZWUseT1Qb3JjZW50YWplKSkrCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCB3aWR0aD0wLjUpCmdyYWYxCmBgYAoKTGEgZW5jdWVzdGEgdGFtYmnDqW4gaW5jbHV5ZSBsYSBwcmVndW50YSBQMjA5IHNvYnJlIGfDqW5lcm8uCkVzdGEgdmFyaWFibGUgc2UgaW1wb3J0YSBjb21vIHVuYSBudW3DqXJpY2EsIHBvciBsbyBxdWUgbnVldmFtZW50ZSBsYSB0cmFuc2Zvcm1hbW9zIGVuIHVuYSB2YXJpYWJsZSBkZSB0aXBvIGZhY3RvciAic2V4byIgY29uIHN1cyBldGlxdWV0YXMuCgpgYGB7cn0KZW5sID0gZW5sICU+JQogIG11dGF0ZShzZXhvID0gZmFjdG9yKFAyMDksIGxhYmVscz1jKCJIb21icmUiLCAiTXVqZXIiKSkpCmBgYAoKQWhvcmEgdXNhbW9zIGVzdGEgdmFyaWFibGUgcGFyYSBjYWxjdWxhciBsYXMgZnJlY3VlbmNpYXMgeSBwb3JjZW50YWplcyBwb3IgZ3J1cG9zIGRlIHNleG8uCgpgYGB7cn0KdGFibGEyID0gZW5sICU+JQogIGZpbHRlcihsZWUgPT0gIlPDrSIgfCBsZWUgPT0gIk5vIikgJT4lCiAgZ3JvdXBfYnkoc2V4bykgJT4lCiAgY291bnQoTGVlID0gbGVlLCBuYW1lPSJOIiklPiUKICBtdXRhdGUodG90YWwgPSBzdW0oTiksIAogICAgICAgICBQb3IgPSBOIC8gdG90YWwgKiAxMDApCnRhYmxhMgpgYGAKCkxhIHRhYmxhIG5vcyBpbmRpY2EgbG9zIHBvcmNlbnRhamVzIGRlIGxvcyBxdWUgc8OtIGxlZW4geSBsb3MgcXVlIG5vIGxlZW4gcG9yIHNleG8uCkNvbW8gc29sbyBxdWVyZW1vcyBncmFmaWNhciBsb3MgcG9yY2VudGFqZXMgZGUgbG9zIHF1ZSBzw60gbGVlbiwgcG9kZW1vcyBlbGltaW5hciBsYXMgZmlsYXMgZGUgbG9zIHF1ZSBubyBsZWVuLgoKYGBge3J9CnRhYmxhMiA9IHRhYmxhMlstYygyLDQpLF0KYGBgCgpDb24gZXN0YSB0YWJsYSByZWR1Y2lkYSwgcG9kZW1vcyBncmFmaWNhcyB1c2FuZG8gYGdncGxvdGAuCkFob3JhIGFncmVnYW1vcyBsYSBjYXBhIGBnZW9tX3RleHRgIHBhcmEgaW5jbHVpciBlbCBkYXRvIGRlbCBwb3JjZW50YWplIGRlbnRybyBkZWwgZ3LDoWZpY28uCgpgYGB7cn0KZ3JhZjIgPSBnZ3Bsb3QodGFibGEyLCBhZXMoeD1zZXhvLCB5PVBvcikpKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikrCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1wYXN0ZShyb3VuZChQb3IsIDEpKSksIHZqdXN0PS0xLCBzaXplPTMpKwogIGxhYnMoeD0iU2V4byIsIHk9IlBvcmNlbnRhamUiKSsKICB0aGVtZV9jbGFzc2ljKCkKZ3JhZjIKYGBgCgpMYSBiYXNlIGRlIGRhdG9zIGluY2x1eWUgdW5hIHZhcmlhYmxlICJuc2UiLCBxdWUgcmVmaWVyZSBhbCBuaXZlbCBzb2Npb2Vjb27Ds21pY28gZGUgbGEgcGVyc29uYSBxdWUgcmVzcG9uZGUuCkVzdGUgbml2ZWwgc29jaW9lY29uw7NtaWNvIGVzdMOhIGNhdGVnb3JpemFkbyBlbiA0IG5pdmVsZXMuCgpgYGB7cn0KZW5sID0gZW5sICU+JQogIG11dGF0ZShuc2UxID0gZmFjdG9yKG5zZSwgbGFiZWxzPWMoIlJ1cmFsIiwgIkJham8iLCAiTWVkaW8iLCAiQWx0byIpKSkKYGBgCgpQYXNhbW9zIGEgY2FsY3VsYXIgbG9zIHBvcmNlbnRhamVzIGRlIGxlY3R1cmEgcG9yIGxvcyA0IG5pdmVsZXMgc29jaW9lY29uw7NtaWNvcy4KCmBgYHtyfQp0YWJsYTMgPSBlbmwgJT4lCiAgZmlsdGVyKGxlZSA9PSAiU8OtIiB8IGxlZSA9PSAiTm8iKSAlPiUKICBncm91cF9ieShuc2UxKSAlPiUKICBjb3VudChMZWUgPSBsZWUsIG5hbWU9Ik4iKSU+JQogIG11dGF0ZSh0b3RhbCA9IHN1bShOKSwgCiAgICAgICAgIFBvciA9IE4gLyB0b3RhbCAqIDEwMCkKdGFibGEzCmBgYAoKTnVldmFtZW50ZSBlbGltaW5hbW9zIGxhcyBmaWxhcyBkZSBsb3MgcG9yY2VudGFqZXMgZGUgYXF1ZWxsb3MgcXVlIG5vIGxlZW4uCgpgYGB7cn0KdGFibGEzID0gdGFibGEzWy1jKDIsNCw2LDgpLF0KYGBgCgpZIGdyYWZpY2Ftb3MgbG9zIHBvcmNlbnRhamVzIGRlIGxvcyBxdWUgc8OtIGxlZW4gcG9yIG5pdmVsZXMgc29jaW9lY29uw7NtaWNvcy4KCmBgYHtyfQpncmFmMyA9IGdncGxvdCh0YWJsYTMsIGFlcyh4PW5zZTEsIHk9UG9yKSkrCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSsKICBnZW9tX3RleHQoYWVzKGxhYmVsPXBhc3RlKHJvdW5kKFBvciwgMSkpKSwgdmp1c3Q9LTEsIHNpemU9MykrCiAgbGFicyh4PSJOU0UiLCB5PSJQb3JjZW50YWplIikrCiAgdGhlbWVfY2xhc3NpYygpCmdyYWYzCmBgYAoKIyMgVGFyZWEKClNlIGVuY29udHLDsyBxdWUgdW5hIG1heW9yIHByb3BvcmNpw7NuIGRlIG11amVyZXMgcXVlIGhvbWJyZXMgbGVlLgrCv0N1w6FudG9zIGxpYnJvcyBpbXByZXNvcyB5IGRpZ2l0YWxlcyBsZWUgZWwgcGVydWFubyBwcm9tZWRpbz8Kwr9FeGlzdGVuIGRpZmVyZW5jaWFzIGVudHJlIGhvbWJyZXMgeSBtdWplcmVzIGVudHJlIGVsIHByb21lZGlvIGRlIGxpYnJvcyBpbXByZXNvcyB5IGRpZ2l0YWxlcyBxdWUgbGVlbj8Kwr9FbnRyZSBuaXZlbGVzIHNvY2lvZWNvbsOzbWljb3M/CgojIENhc28gMjogRW5jdWVzdGEgTmFjaW9uYWwgRG9jZW50ZSAyMDIwCgpDYWRhIGRvcyBhw7FvcywgZWwgTWluaXN0ZXJpbyBkZSBFZHVjYWNpw7NuIHJlYWxpemEgdW5hIGVuY3Vlc3RhIGEgdW5hIG11ZXN0cmEgZGUgZG9jZW50ZXMgZGUgZWR1Y2FjacOzbiBiw6FzaWNhIGVuIGVsIFBlcsO6LgpMYSDDumx0aW1hIGRpc3BvbmlibGUgZnVlIGhlY2hhIGVuIDIwMjAsIGVuIG1lZGlvIGRlIGxhIHBhbmRlbWlhIGRlbCBDT1ZJRC0xOS4KTGFzIGJhc2VzIGRlIGRhdG9zIHkgY3Vlc3Rpb25hcmlvcyBkZSBlc3RhIGVuY3Vlc3RhIHNlIGVuY3VlbnRyYW4gZGlzcG9uaWJsZXMgW2FxdcOtXShodHRwOi8vd3d3Lm1pbmVkdS5nb2IucGUvcG9saXRpY2FzL2RvY2VuY2lhL2VuY3Vlc3RhLW5hY2lvbmFsLWEtZG9jZW50ZXMtZW5kby5waHApLgoKRW4gZXN0YSB1YmljYWNpw7NuIHNlIGVuY3VlbnRyYSBsYSBiYXNlIGRlIGRhdG9zLCBxdWUgcHVlZGUgc2VyIGRlc2NhcmdhZGEgeSBsZcOtZGEgZW4gUiBjb24gZWwgc2lndWllbnRlIGPDs2RpZ28uCgpgYGB7ciBlbmRvfQpsaWJyYXJ5KHJpbykKZW5kbzIwMjAgPSBpbXBvcnQoImJhc2VzL0VORE9fUkVNT1RPXzIwMjAuZHRhIikKI0NBTUJJQVIgQSBQUk9QSU8gRElSRUNUT1JJTyBERSBUUkFCQUpPCmBgYAoKIyBFc3RpbWFjacOzbiBwdW50dWFsCgpEZSB1bmEgdmFyaWFibGUgbnVtw6lyaWNhLCBsYSBtZWRpZGEgZGUgdGVuZGVuY2lhIGNlbnRyYWwgbcOhcyDDunRpbCBlcyBsYSBtZWRpYS4KTGEgZW5jdWVzdGEgYSBkb2NlbnRlcyBpbmNsdXllIGxhIHByZWd1bnRhOgoKNi4gIMK/QSBjdcOhbnRvcyBlc3R1ZGlhbnRlcyBsZSBicmluZGEgYWNvbXBhw7FhbWllbnRvIGNvbW8gZG9jZW50ZSBkZSBhdWxhIGVuIGVzdGEgSUU/IChWZXIgY3Vlc3Rpb25hcmlvKQoKRGUgZXN0YSBwcmVndW50YSBwb2RlbW9zIHByZWd1bnRhcm5vczogwr9BIGN1w6FudG9zIGFsdW1ub3MgZW4gcHJvbWVkaW8gYWNvbXBhw7FhIGVsIGRvY2VudGUgcGVydWFubyBlbiBhdWxhPwpFc3RhIGVuY3Vlc3RhIHRpZW5lIHVuYSBwcmVndW50YSBxdWUgbm9zIHBlcm1pdGUgY2FsY3VsYXIgZXN0YSBtZWRpYSB5IGxhIGRlc3ZpYWNpw7NuIGVzdMOhbmRhci4KCmBgYHtyIGRlc2MgYWx1bW5vcywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5dmVyc2UpCmVuZG8yMDIwICU+JQogIHN1bW1hcml6ZShNZWRpYSA9bWVhbihQMV82LCBuYS5ybSA9IFQpLCBEZXN2LlN0ZCA9IHNkKFAxXzYsIG5hLnJtID0gVCkpCmBgYAoKRXMgZGVjaXIsIHVuIHByb2Zlc29yIHByb21lZGlvIGVuIFBlcsO6IGFjb21wYcOxYSBhcHJveGltYWRhbWVudGUgYSA0MCBhbHVtbm9zIGVuIGF1bGEuCsK/RXhpc3RlbiBkaWZlcmVuY2lhcyBlbiBlbCBuw7ptZXJvIHByb21lZGlvIGRlIGFsdW1ub3MgcXVlIGFjb21wYcOxYW4gZG9jZW50ZXMgaG9tYnJlcyB5IGRvY2VudGVzIG11amVyZXM/CgpDdWFuZG8gc2UgaW1wb3J0YSBsYSBiYXNlIGRlIGRhdG9zLCBsYSB2YXJpYWJsZSBzZXhvLCBQMV8xLCBlcyBkZWZpbmlkYSBjb21vIG51bcOpcmljYS4KCmBgYHtyfQpzdHIoZW5kbzIwMjAkUDFfMSkKYGBgCgpMYSBwb2RlbW9zIHRyYW5zZm9ybWFyIGEgdW5hIHZhcmlhYmxlIGRlIHRpcG8gZmFjdG9yLgoKYGBge3J9CmVuZG8yMDIwID0gZW5kbzIwMjAgJT4lCiAgbXV0YXRlKHNleG8gPSBmYWN0b3IoUDFfMSwgbGFiZWxzPWMoIkhvbWJyZSIsICJNdWplciIpKSkKYGBgCgpDYWxjdWxhbW9zIGxvcyBkYXRvcyBwYXJhIGhvbWJyZXMgeSBtdWplcmVzLgoKYGBge3IgZG9jZW50ZXMgaG9tYnJlfQp0YWJsYTEgPSBlbmRvMjAyMCAlPiUKICBncm91cF9ieShzZXhvKSAlPiUKICBzdW1tYXJpemUoTWVkaWEgPSBtZWFuKFAxXzYsIG5hLnJtID0gVCksIAogICAgICAgICAgICBEZXN2LlN0ZCA9IHNkKFAxXzYsIG5hLnJtID0gVCksCiAgICAgICAgICAgIE1lZGlhbmEgPSBtZWRpYW4oUDFfNiwgbmEucm0gPSBUKSkKdGFibGExCmBgYAoKU2UgZW5jdWVudHJhIHF1ZSBsb3MgZG9jZW50ZXMgaG9tYnJlcyBhY29tcGHDsWFuLCBlbiBwcm9tZWRpbywgYSA1MiBhbHVtbm9zLCBtaWVudHJhcyBxdWUgbGFzIGRvY2VudGVzIG11amVyZXMgYWNvbXBhw7FhbiBhIDM0IGFsdW1ub3MsIHVuYSBkaWZlcmVuY2lhIGRlIDE4IGFsdW1ub3MgZW4gcHJvbWVkaW8uCgpUb2RvcyBlc3RvcyByZXN1bHRhZG9zIHNvbiBwdW50dWFsZXMgeSBhcGxpY2FuIHBhcmEgbGEgbXVlc3RyYSBkZSAyOCwyMTYgcHJvZmVzb3Jlcy4KClBhcmEgdW5hIGNvbXBhcmFjacOzbiBncsOhZmljYSwgc2UgcHVlZGUgdXNhciBib3hwbG90LgoKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKZ2dwbG90KGVuZG8yMDIwLCBhZXMoeT1QMV82LCB4PXNleG8pKSsKICBnZW9tX2JveHBsb3QoKQpgYGAKCmBgYHtyfQplbmRvMjAyMCA9IGVuZG8yMDIwICU+JQogIG11dGF0ZShjb25kaWNpb24gPSBmYWN0b3IoUDFfNywgbGFiZWxzPWMoIk5vbWJyYWRvIiwgIkNvbnRyYXRhZG8geCBjb25jdXJzbyIsICJDb250cmF0YWRvIG90cm8iKSkpCmBgYAoKYGBge3J9CnRhYmxhMiA9IGVuZG8yMDIwICU+JQogIGdyb3VwX2J5KGNvbmRpY2lvbikgJT4lCiAgc3VtbWFyaXplKE1lZGlhID0gbWVhbihQMV82LCBuYS5ybSA9IFQpLCAKICAgICAgICAgICAgRGVzdi5TdGQgPSBzZChQMV82LCBuYS5ybSA9IFQpLAogICAgICAgICAgICBNZWRpYW5hID0gbWVkaWFuKFAxXzYsIG5hLnJtID0gVCkpCnRhYmxhMgpgYGAKCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkodGlkeXZlcnNlKQplbmRvMjAyMCAlPiUKICBkcm9wX25hKFAxXzYpICU+JQogIGdncGxvdChhZXMoeT1QMV82LCB4PWNvbmRpY2lvbikpKwogIGdlb21fYm94cGxvdCgpCmBgYAoKYGBge3J9CmdncGxvdChzdWJzZXQoZW5kbzIwMjAsICFpcy5uYShQMV82KSksIGFlcyh5PVAxXzYsIHg9Y29uZGljaW9uKSkrCiAgZ2VvbV9ib3hwbG90KCkKYGBgCgpTaSBzZSBxdWllcmUgaGFjZXIgdW4gZ3LDoWZpY28gZGUgYmFycmFzIHNpbXBsZXMgcGFyYSBtb3N0cmFyIGxhIG1lZGlhIGRlbCBuw7ptZXJvIGRlIGFsdW1ub3MgcG9yIHNleG8gZGVsIHByb2Zlc29yLCBzZSBwdWVkZSB1c2FyOgoKYGBge3J9CmdncGxvdCh0YWJsYTEsIGFlcyh4PXNleG8sIHk9TWVkaWEpKSArIAogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArCiAgZ2d0aXRsZSgiTsO6bWVybyBkZSBhbHVtbm9zIHByb21lZGlvIHBvciBzZXhvIGRlbCBkb2NlbnRlIikgKwogIHhsYWIoIlNleG8gZGVsIGRvY2VudGUiKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1yb3VuZChNZWRpYSwxKSksIHZqdXN0PTEuMzAsIGNvbG9yPSJ3aGl0ZSIsIHNpemU9MykrCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKwr9Dw7NtbyBzZSBwdWVkZW4gZXh0cmFwb2xhciBlc3RvcyByZXN1bHRhZG9zIGFsIHVuaXZlcnNvIGRlIHByb2Zlc29yZXMgcGVydWFub3M/CgojIEVzdGltYWNpw7NuIHBvciBpbnRlcnZhbG9zCgpUYW50byBsYSBtZWRpYSBtdWVzdHJhbCwgY29tbyBsYSBwcm9wb3JjacOzbiBtdWVzdHJhbCwgc29uIGVzdGltYWNpb25lcyBwdW50dWFsZXMsIGJhc2Fkb3MgZW4gbG9zIHJlc3VsdGFkb3MgZGUgbGEgbXVlc3RyYS4KRXMgZGVjaXIsIGVzdGFzIHNvbiBlc3RpbWFjaW9uZXMgY29ycmVzcG9uZGllbnRlcyBhIGxhcyAyOCwyMTYgb2JzZXJ2YWNpb25lcyBxdWUgc29uIHBhcnRlIGRlIGVzdGUgZXN0dWRpby4KU2luIGVtYmFyZ28sIGVzdGEgbXVlc3RyYSBmb3JtYSBwYXJ0ZSBkZSB1biB1bml2ZXJzbyBvIHBvYmxhY2nDs24gKGVsIGNvbmp1bnRvIGRlIHByb2Zlc29yZXMgZGVsIFBlcsO6KSwgZGVsIHF1ZSBzZWd1cmFtZW50ZSBzZSBxdWllcmUgZGVjaXIgYWxnby4KCkVsIG1pc21vIHJhem9uYW1pZW50byBhcGxpY2EgYSB1bmEgZW5jdWVzdGEgZGUgb3BpbmnDs24gY29udmVuY2lvbmFsLgpMYSBmaWNoYSB0w6ljbmljYSBkZSB1bmEgZW5jdWVzdGEgbWVuY2lvbmEsIGdlbmVyYWxtZW50ZSwgZWwgdGFtYcOxbyBkZSBtdWVzdHJhIHkgbGEgcG9ibGFjacOzbiBhIGxhIHF1ZSBzZSBidXNjYSByZXByZXNlbnRhci4KVGFtYmnDqW4gc2UgcHVlZGUgZW5jb250cmFyIGVsIG1hcmdlbiBkZSBlcnJvciAoKy8tIDIuOCUpIHkgZWwgbml2ZWwgZGUgY29uZmlhbnphIChnZW5lcmFsbWVudGUgZGUgOTUlKS4oVmVyLCBwb3IgZWplbXBsbywgbGEgW2VuY3Vlc3RhIGRlIG9waW5pw7NuIGRlIGFnb3N0byAyMDIzIGRlIElwc29zXShodHRwczovL3d3dy5pcHNvcy5jb20vc2l0ZXMvZGVmYXVsdC9maWxlcy9jdC9uZXdzL2RvY3VtZW50cy8yMDIzLTA4L0luZm9ybWUlMjBFbmN1ZXN0YSUyME5hY2lvbmFsJTIwVXJiYW5vJTIwUnVyYWwlMjAtJTIwQW1lcmljYSUyMFRlbGV2aXNpw7NuJTIwYWwlMjAxMSUyMGRlJTIwYWdvc3RvJTIwMjAyMyUyMEVzdHVkaW8lMjBkZSUyME9waW5pw7NuLnBkZikuCgpFbCBwcm9jZXNvIG1lZGlhbnRlIGVsIGN1YWwgc2UgcGFydGUgZGUgdW5hIG11ZXN0cmEgcGFyYSBkZWNpciBhbGdvIGRlIHVuIHVuaXZlcnNvIG8gcG9ibGFjacOzbiBlcyB1biBwcm9jZXNvIGRlIGluZmVyZW5jaWEgeSBlcyBwYXJ0ZSBkZSBsYSBlc3RhZMOtc3RpY2EgaW5mZXJlbmNpYWwuCkxhIGVzdGFkw61zdGljYSBpbmZlcmVuY2lhbCBpbnRyb2R1Y2UgbGEgKippbmNlcnRpZHVtYnJlKiogZW4gbG9zIGVzdGltYWRvcywgZGViaWRvIGFsIGhlY2hvIGRlIGVzdGFyIHRyYWJhamFuZG8gY29uIHVuYSBtdWVzdHJhIHkgbm8gY29uIGVsIHRvdGFsIGRlIG9ic2VydmFjaW9uZXMgZGVsIHVuaXZlcnNvLgoKIyMgVW4gYnJldmUgcGFzZW8gcG9yIGxhcyBwcm9iYWJpbGlkYWRlcwoKUGFydGltb3MgZGVsIGhlY2hvIHF1ZSBlbiBlbCBjb23Dum4gZGUgbGFzIGludmVzdGlnYWNpb25lcyB1bm8gdGllbmUgcXVlIHNlbGVjY2lvbmFyIHVuIGNvbmp1bnRvIGRlIG9ic2VydmFjaW9uZXMgcXVlIHNvbiBwYXJ0ZSBkZWwgdG90YWwsIHF1ZSBlcyBtdXkgY29zdG9zbyBlIGluZWZpY2llbnRlIGhhY2VyIHVuIGVzdHVkaW8gZGUgbGEgcG9ibGFjacOzbiBjb21wbGV0YS4KTGEgYW5hbG9nw61hIGVzLCBwb3IgZWplbXBsbywgcXVlIHBhcmEgdW4gYW7DoWxpc2lzIGRlIHNhbmdyZSBzZSBleHRyYWUgdW5hICJtdWVzdHJhIiBkZSBzYW5ncmUgeSBubyBlbCB0b3RhbCBkZSBzYW5ncmUgZGVsIGN1ZXJwby4KCkEgZXN0byBsZSBzdW1hbW9zIGVsIGhlY2hvIHF1ZSBudWVzdHJhcyBoZXJyYW1pZW50YXMgZGUgcmVjb2pvIGRlIGluZm9ybWFjacOzbiBzb24gaW1wZXJmZWN0YXMuClVuIGVzdHVkaW8gdHJhbnN2ZXJzYWwsIHBvciBlamVtcGxvLCBkZWJlcsOtYSByZWNvZ2VyIGluZm9ybWFjacOzbiBkZSBsb3MgaW5kaXZpZHVvcyBlbiB1biBjb3J0ZSBlbiBlbCB0aWVtcG8sIHNpbiBlbWJhcmdvLCBtdWNob3MgZXN0dWRpb3Mgbm8gc29uIHVuYSAiZm90byBkZWwgbW9tZW50byIsIHB1ZXMgbGFzIG9ic2VydmFjaW9uZXMgdG9tYW4gdGllbXBvIHkgYWJhcmNhbiBob3JhcywgZMOtYXMgbyBzZW1hbmFzLCBzaW5vIG1lc2VzLgoKRXMgcG9yIGVzdGUgbW90aXZvIHF1ZSBwYXJhIHVuIGVzdHVkaW8gc2Ugc2VsZWNjaW9uYSAidW5hIiBtdWVzdHJhLCB1biBjb25qdW50byBkZSBvYnNlcnZhY2lvbmVzIHF1ZSBzb24gdW5hIGZyYWNjacOzbiBkZWwgdG90YWwuCkVzdGEgc2VsZWNjacOzbiBzZSBoYWNlIHNpZ3VpZW5kbyBwcm9jZWRpbWllbnRvcyBhbGVhdG9yaW9zLCBkZSB0YWwgbWFuZXJhIHF1ZSBjdWFscXVpZXIgdW5pZGFkIGRlbCB1bml2ZXJzbyB0ZW5nYSBsYSBtaXNtYSBwcm9iYWJpbGlkYWQgZGUgc2VyIHNlbGVjY2lvbmFkYS4KCkVsIHB1bnRvIGVzIHF1ZSBlc3RhIMO6bmljYSBtdWVzdHJhIGVzIHNvbG8gdW5hIGRlIGxhcyBtw7psdGlwbGVzIG11ZXN0cmFzIHRlw7NyaWNhcyBxdWUgc2UgcG9kcsOtYW4gc2VsZWNjaW9uYXIgZGUgdW4gdW5pdmVyc28gZGV0ZXJtaW5hZG8uCgpQYXJ0YW1vcyBkZSB1biBlamVtcGxvIG11eSBzaW1wbGUuClBhcmEgdW4gdW5pdmVyc28gZGUgNSBwZXJzb25hcywgc2UgcHVlZGVuIGV4dHJhZXIgMTAgbXVlc3RyYXMgZGUgdGFtYcOxbyAyIGRpZmVyZW50ZXMuCgohW10obXVlc3RyYTEuanBlZykKCkxhIGbDs3JtdWxhIHBhcmEgY2FsY3VsYXIgZWwgbsO6bWVybyBkZSBtdWVzdHJhcyBwcm9iYWJsZXMgZXMgbGEgZGUgY29tYmluYXRvcmlhcywgcXVlIGluY2x1eWUgZWwgb3BlcmFkb3IgZmFjdG9yaWFsLgpTaSBhcGxpY2Ftb3MgZXN0YSBmw7NybXVsYSBhIHVuIGVqZW1wbG8gZGUgdW4gdW5pdmVyc28gbcOhcyBncmFuZGUsIHBvciBlamVtcGxvLCB1biBzYWzDs24gZGUgY2xhc2UgZGUgNTAgYWx1bW5vcywgZG9uZGUgc2UgcXVpZXJlIHNhYmVyIGN1w6FudGFzIG11ZXN0cmFzIGRpZmVyZW50ZXMgZGUgdGFtYcOxbyA0IHNlIHB1ZWRlbiBleHRyYWVyLgpTZWfDum4gbGEgZsOzcm11bGE6CgokJApcZnJhY3s1MCF9IHsoNTAtNCkhIDQhfSA9IFxmcmFjezUwIX0gezQ2ISA0IX0gPSBcZnJhY3s1MCo0OSo0OCo0N30gezQqMyoyfSA9IDIzMCwzMDAKJCQKClBhcmEgdW4gc29uZGVvIGRlIG9waW5pw7NuLCBkb25kZSBlbCB1bml2ZXJzbyBzb24gMjQgbWlsbG9uZXMgZGUgaW5kaXZpZHVvcyB5IHNlIHF1aWVyZSBzYWJlciBjdcOhbnRhcyBtdWVzdHJhcyBkaWZlcmVudGVzIGRlIHRhbWHDsW8gMSw1MDAgc2UgcHVlZGVuIGV4dHJhZXIsIGVzdGUgbsO6bWVybyBkZSBtdWVzdHJhcyBwcm9iYWJsZXMgZXMgbXV1dXV5IGdyYW5kZS4KClZvbHZpZW5kbyBhbCBlamVtcGxvIG11eSBzaW1wbGUgZGUgNSBwZXJzb25hcyBkb25kZSBzZSBxdWllcmUgZXh0cmFlciB1bmEgbXVlc3RyYSBkZSAyIHkgc2UgcXVpZXJlIGluZmVyaXIgbG9zIGRhdG9zIGRlIGxhIG11ZXN0cmEgZGUgZG9zIHZhcmlhYmxlczogc2V4byB5IGVkYWQuCgpTZSB0aWVuZSB1biB1bml2ZXJzbyBkZSA1IGluZGl2aWR1b3MsIGNhZGEgdW5vIGNvbiBzdSBzZXhvIHkgZWRhZC4KRW4gbGEgcG9ibGFjacOzbiBsYSBwcm9wb3JjacOzbiBkZSBob21icmVzIGVzIGRlIDYwJSB5IGxhIG1lZGlhIGRlIGVkYWQgZXMgZGUgMzQgYcOxb3MuCgohW10obXVlc3RyYTIuanBlZykKClNpIHF1ZXJlbW9zIGV4dHJhZXIgdW5hIG11ZXN0cmEgZGUgdGFtYcOxbyBkZSAyIGRlIGVzZSB1bml2ZXJzbywgc2UgdGllbmVuIDEwIHBvc2libGVzIG11ZXN0cmFzLCBjYWRhIHVuYSB0ZW5kcsOhIHVuYSBhcHJveGltYWNpw7NuIGRlIGxhIHByb3BvcmNpw7NuIGRlIGhvbWJyZXMgeSBkZSBsYSBtZWRpYSBkZSBlZGFkLgpEZXBlbmRpZW5kbyBkZSBxdcOpIG11ZXN0cmEgZGUgdG9kYXMgbGFzIHBvc2libGVzIHNlYSBsYSBxdWUgc2Ugb2JzZXJ2YSwgbG9zIGVzdGFkw61zdGljb3Mgc2Vyw6FuIHVuYSBhcHJveGltYWNpw7NuIGRlIGxvcyBwYXLDoW1ldHJvcyBwb2JsYWNpb25hbGVzLgoKRW4gZWwgY2FzbyBkZSBsYSBwcm9wb3JjacOzbiBkZSBob21icmVzLCBzZSBwdWVkZSB0YWJ1bGFyIGxvcyByZXN1bHRhZG9zIGRlIGNhZGEgbXVlc3RyYSBwcm9iYWJsZS4KCnwgUmVzdWx0YWRvcyBtdWVzdHJhbGVzIHwgTsO6bWVybyBkZSBtdWVzdHJhcyBxdWUgYXJyb2phcm9uIGVzZSByZXN1bHRhZG8gfCBGcmVjdWVuY2lhIHwKfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tOnw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLTp8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAp8IDAlIHwgMSB8IFggfAp8IDUwJSB8IDUgfCBYWFhYWCB8CnwgMTAwJSB8IDQgfCBYWFhYIHwKCkluY2x1c28gc2UgcG9kcsOtYSBjYWxjdWxhciB1biBwcm9tZWRpbyBkZSB0b2RhcyBlc2FzIHByb3BvcmNpb25lcyBtdWVzdHJhbGVzICgxMDArNTArMTAwKy4uLis1MC8xMCksIHkgZXNlIHJlc3VsdGFkbyBzZXLDrWEgNjUlLCB1biByZXN1bHRhZG8gYWxnbyBjZXJjYSBkZSBsYSBwcm9wb3JjacOzbiBwb2JsYWNpb25hbCBkZSA2MCUuCgpFc3RlIG1pc21vIHByb2NlZGltaWVudG8gc2UgcG9kcsOtYSBoYWNlciBwYXJhIHRvZGFzIGxhcyAyMzAsMzAwIG11ZXN0cmFzIHByb2JhYmxlcyBkZSB0YW1hw7FvIDQgZGUgdW4gdW5pdmVyc28gZGUgNTAgYWx1bW5vcy4KQ2FkYSB1bm8gZGUgbG9zIDUwIGFsdW1ub3Mgc2Vyw6EgaG9tYnJlIG8gbXVqZXIgeSBsYSBwcm9wb3JjacOzbiBwb2JsYWNpb25hbCBkZSBob21icmVzIHNlIHB1ZWRlIGNhbGN1bGFyIGVuIGVzZSB0b3RhbC4KQSBzdSB2ZXosIGNhZGEgbXVlc3RyYSBkZSA0LCB0ZW5kcsOhIHVuYSBwcm9wb3JjacOzbiBtdWVzdHJhbCBxdWUgdGVuZHLDoSB2YWxvcmVzICgwIHNpIG5vIGhheSBuaW5nw7puIGhvbWJyZSwgMjUlIHNpIGhheSAxIGhvbWJyZSwgNTAlIHNpIGhheSAyIGhvbWJyZXMsIDc1JSBzaSBoYXkgMyBob21icmVzIHkgMTAwJSBzaSB0b2RvcyBzb24gaG9tYnJlcykuCkZpbmFsbWVudGUsIHNlIHB1ZWRlIGNvbnRhciBjdcOhbnRhcyBkZSBsYXMgMjMwLDMwMCBtdWVzdHJhcyBwcm9iYWJsZXMgdHV2aWVyb24gMCUsIDI1JSwgNTAlLCA3NSUgeSAxMDAlIGRlIGhvbWJyZXMuCkVzdGEgZGlzdHJpYnVjacOzbiBzZSBsbGFtYSAiKipkaXN0cmlidWNpw7NuIGRlIG11ZXN0cmVvKioiLgoKU2kgcXVpc2nDqXJhbW9zIGFtcGxpYXIgZWwgdGFtYcOxbyBkZSBtdWVzdHJhIGEgMTAsIGVudG9uY2VzIGxvcyByZXN1bHRhZG9zIHBvc2libGVzIHNlcsOtYW4sIDAsIDEwLCAyMCwgMzAsIDQwLCA1MCwgNjAsIDcwLCA4MCwgOTAgeSAxMDAlLgpUYW1iacOpbiBwb2Ryw61hbW9zIGNvbnRhciBjdcOhbnRhcyBtdWVzdHJhcyB0aWVuZW4gZXN0b3MgcmVzdWx0YWRvcy4KCkRlIHVuIHVuaXZlcnNvIG3DoXMgZ3JhbmRlLCBzZSBwdWVkZSBwbGFudGVhciBleHRyYWVyIG11ZXN0cmFzIGRlIHRhbWHDsW8gbcOhcyBncmFuZGUuClBvciBlamVtcGxvLCB0ZcOzcmljYW1lbnRlIHNlIHB1ZWRlIHBlbnNhciBxdWUgZGUgdW4gdW5pdmVyc28gZGUgMjAgbWlsbG9uZXMsIHNlIHB1ZWRlbiBleHRyYWVyIGNhc2kgaW5maW5pdGFzIG11ZXN0cmFzIGRlIHRhbWHDsW8gMSw1MDAuCkNhZGEgdW5hIGRlIGVzdGFzIG11ZXN0cmFzIHRlbmRyw6EgdW4gZXN0YWTDrXN0aWNvIHF1ZSBzZXLDoSB1bmEgYXByb3hpbWFjacOzbiBkZWwgcGFyw6FtZXRyby4KTG9zIGVzdGFkw61zdGljb3MgZGUgdG9kYXMgZXN0YXMgY2FzaSBpbmZpbml0YXMgbXVlc3RyYXMgc2UgcHVlZGVuIHRhYnVsYXIgeSBncmFmaWNhci4KCiMjIFRlb3JlbWEgZGVsIGzDrW1pdGUgY2VudHJhbAoKRXN0ZSB0ZW9yZW1hIG11ZXN0cmEgcXVlIGxhICoqZGlzdHJpYnVjacOzbiBkZSBtdWVzdHJlbyBzZSBhcHJveGltYSBhIHVuYSBkaXN0cmlidWNpw7NuIG5vcm1hbCoqLCBjb24gY2VudHJvIGVuIGVsIHBhcsOhbWV0cm8sIGVuIGxhIG1lZGlkYSBxdWUgZWwgdGFtYcOxbyBkZSBtdWVzdHJhIGF1bWVudGEuCgpFc3RvIHNlIHB1ZWRlIG1vc3RyYXIgZ3LDoWZpY2FtZW50ZSBlbiBlbCBUYWJsZXJvIGRlIEdhbHRvbiwgdmVyIFthcXXDrV0oaHR0cHM6Ly95b3V0dS5iZS9Bd0VhSENqZ2VYaz9zaT1hMC13ZkctZm5nNEhZc1JRKQoKUG9yIGxvIHRhbnRvLCBsYSBkaXN0cmlidWNpw7NuIGRlIG11ZXN0cmVvIGRlIE4gZ3JhbmRlcyBwYXJhIGN1YWxxdWllciB2YXJpYWJsZSBzZWd1aXLDoSBsYXMgY2FyYWN0ZXLDrXN0aWNhcyBkZSBjdWFscXVpZXIgY3VydmEgbm9ybWFsLgpUb2RhIGN1cnZhIG5vcm1hbCBlcyBzaW3DqXRyaWNhIHkgc2FiZW1vcyBxdWUgc2kgZGVzZGUgZWwgY2VudHJvIHNlIGRlc3BsYXphIDEgZGVzdmlhY2nDs24gZXN0w6FuZGFyIGVuIGFtYmFzIGRpcmVjY2lvbmVzLCBlbnRyZSBlc29zIGzDrW1pdGVzIGVzdGFyw6FuIGVsIDY4LjMlIGRlIHRvZGFzIGxhcyBvYnNlcnZhY2lvbmVzLgpTaSBzZSBkZXNwbGF6YSAyIGRlc3ZpYWNpb25lcyBlc3TDoW5kYXIgZW4gYW1iYXMgZGlyZWNjaW9uZXMsIHNlIGFjdW11bGFyw61hbiBlbCA5NS40JSBkZSB0b2RhcyBsYXMgb2JzZXJ2YWNpb25lcy4KQ29uIDMgZGVzdmlhY2lvbmVzIGVzdMOhbmRhciBoYWNpYSBhbWJvcyBsYWRvcywgc2UgYWN1bXVsYXLDrWEgZWwgOTkuNyUgZGUgdG9kYXMgbGFzIG9ic2VydmFjaW9uZXMuCgohW10oYzMuMy5wbmcpe3dpZHRoPSI1MTAifQoKVHJhZHVjaWVuZG8gYSBsYSBkaXN0cmlidWNpw7NuIGRlIG11ZXN0cmVvLCBsYSBpZGVhIGVzIHF1ZSBzaSBzZSB0YWJ1bGFuIHkgc2UgaGFjZSB1biBncsOhZmljbyBkZSBiYXJyYXMgZGUgbG9zIHJlc3VsdGFkb3MgZGUgdG9kYXMgbGFzIG11ZXN0cmFzIHByb2JhYmxlcywgc2UgdGVuZHLDrWEgdW5hIGN1cnZhIG5vcm1hbCBjb24gY2VudHJvIGVuIGVsIHBhcsOhbWV0cm8uClNhYnLDrWFtb3MgcXVlIHNpIGRlc2RlIGVzZSBjZW50cm8gbm9zIGRlc3BsYXphbW9zIDIgZGVzdmlhY2lvbmVzIGVzdMOhbmRhciBlbiBhbWJhcyBkaXJlY2Npb25lcywgZW50cmUgZXNvcyBsw61taXRlcyBlc3RhcsOtYW4gZWwgOTUlIGRlIHRvZGFzIGxhcyBtdWVzdHJhIHByb2JhYmxlcy4KCkVzIGFsdGFtZW50ZSBwcm9iYWJsZSAoOTUlIHByb2JhYmxlKSBxdWUgc2kgZW4gdW5hIGludmVzdGlnYWNpw7NuIHNlIGV4dHJhZSB1bmEgc29sYSBtdWVzdHJhLCBlc3RhIHNlYSBwYXJ0ZSBkZWwgOTUlIGRlIG11ZXN0cmFzIHBvc2libGVzIGEgKy8tIDIgZGVzdmlhY2lvbmVzIGVzdMOhbmRhciBkZWwgcGFyw6FtZXRyby4KRGUgbGEgbWlzbWEgbWFuZXJhLCBlcyBwb2NvIHByb2JhYmxlICg1JSBwcm9iYWJsZSkgcXVlIHVuYSBzb2xhIG11ZXN0cmEgbm8gZXN0w6kgYSArLy0gMiBkZXN2aWFjaW9uZXMgZXN0w6FuZGFyIGRlbCBwYXLDoW1ldHJvLgoKIyBFc3RpbWFjacOzbiBkZSBpbnRlcnZhbG9zIGRlIGNvbmZpYW56YQoKTGEgZGlzdHJpYnVjacOzbiBkZSBtdWVzdHJlbyBlcyB0ZcOzcmljYSwgbXV5IGRpZsOtY2lsbWVudGUgc2UgcHVlZGUgY2FsY3VsYXIgZW4gbGEgcmVhbGlkYWQuClJlZ3VsYXJtZW50ZSB0YW1wb2NvIHNhYmVtb3MgbG9zIGRhdG9zIGRlbCB1bml2ZXJzby4KTG8gcXVlIHRlbmVtb3MgYSBtYW5vIGVzICoqMSBtdWVzdHJhIG9ic2VydmFkYSoqLgpFcyBkZWNpciwgZW4gdW4gZXN0dWRpbyBkZSBsYXMgbXV1dXV1Y2hhcyBtdWVzdHJhcyBwcm9iYWJsZXMsIHNlIHNlbGVjY2lvbmEgMSBtdWVzdHJhLgoKRW4gZWwgY2FzbyBkZSBsYSBlbmN1ZXN0YSBFTkRPLCBwb3IgZWplbXBsbywgZGVsIHVuaXZlcnNvIGRlIHByb2Zlc29yZXMgcGVydWFub3MsIHNlIHNlbGVjY2lvbsOzIDEgbXVlc3RyYSBkZSAyOCwyMTYgb2JzZXJ2YWNpb25lcywgZGUgbGFzIG11dXV1Y2hhcyBtdWVzdHJhcyBkZSAyOCwyMTYgaW5kaXZpZHVvcyBkZSBsYSBwb2JsYWNpw7NuIHRvdGFsLgoKU2kgdGXDs3JpY2FtZW50ZSBzYWJlbW9zIHF1ZSBlbiBsYSBkaXN0cmlidWNpw7NuIG11ZXN0cmFsLCBlbCA5NSUgZGUgdG9kYXMgbGFzIG11ZXN0cmFzIGVzdMOhbiBhICsvLSAyIGRlc3ZpYWNpb25lcyBlc3TDoW5kYXJbXjFdIGRlbCBjZW50cm8sIHF1ZSBjb2luY2lkZSBjb24gZWwgcGFyw6FtZXRybyBwb2JsYWNpb25hbCwgZXMgbXV5IHByb2JhYmxlIHF1ZSBsYSDDum5pY2EgbXVlc3RyYSBxdWUgc2UgaGEgb2JzZXJ2YWRvIHNlYSBwYXJ0ZSBkZSBlc2UgY29uanVudG8uCkRlIGhlY2hvLCBzZSBwdWVkZSBkZWNpciBxdWUgc2UgdGllbmUgOTUlIGRlIHByb2JhYmlsaWRhZGVzIGRlIHF1ZSBzZWEgcGFydGUgZGUgZXNlIGdydXBvLgoKW14xXTogRW4gcmVhbGlkYWQgZXMgYSArLy0gMiBlcnJvcmVzIGVzdMOhbmRhciBkZWwgY2VudHJvLgogICAgRWwgZXJyb3IgZXN0w6FuZGFyIHNlIGVudGllbmRlIGNvbW8gbGEgZGVzdmlhY2nDs24gZXN0w6FuZGFyIGRlIGxhIGRpc3RyaWJ1Y2nDs24gZGUgbXVlc3RyZW8uCgpQb3IgbG8gdGFudG8sIHNpIGEgcGFydGlyIGRlbCBlc3RhZMOtc3RpY28gbXVlc3RyYWwsIHNlIGFwbGljYSBlc3RhIGRpc3RhbmNpYSBkZSArLy0gMiBlcnJvcmVzIGVzdMOhbmRhciwgc2UgdGllbmUgOTUlIGRlIHByb2JhYmlsaWRhZGVzIHF1ZSBlbnRyZSBlc29zIGzDrW1pdGVzIHNlIGluY2x1eWEgYWwgdmFsb3IgZGVsIHBhcsOhbWV0cm8uClBhcmEgdmVybG8gZGUgbWFuZXJhIG3DoXMgdmlzdWFsLCBlbiBsYSBzaWd1aWVudGUgZmlndXJhIHNlIHRpZW5lIGxhIGRpc3RyaWJ1Y2nDs24gZGUgbXVlc3RyZW8gdGXDs3JpY2EgKHkgZGVzY29ub2NpZGEpLCBkb25kZSBzZSBtYXJjYSBsYSByZWdpw7NuIHF1ZSBhY3VtdWxhIGVsIDk1JSBkZSB0b2RhcyBsYXMgbXVlc3RyYXMgcHJvYmFibGVzLgoKTcOhcyBhYmFqbyBzZSBtYXJjYSBsb3MgcmVzdWx0YWRvcyBkZSAyIG11ZXN0cmFzIG9ic2VydmFkYXMuCkxhIHByaW1lcmEgcHJvcG9yY2nDs24gbXVlc3RyYWwgc3ViZXN0aW1hIGxhIHByb3BvcmNpw7NuIHBvYmxhY2lvbmFsLgpMYSBzZWd1bmRhLCBwb3IgZWwgY29udHJhcmlvLCBzb2JyZWVzdGltYSBsYSBwcm9wb3JjacOzbiBwb2JsYWNpb25hbC4KRW4gZWwgcHJpbWVyIGNhc28sIHNpIGEgcGFydGlyIGRlbCBlc3RhZMOtc3RpY28gbXVlc3RyYWwgc2UgYXBsaWNhICsvLSAxLjk2IGVycm9yZXMgZXN0w6FuZGFyIChsw61uZWEgaG9yaXpvbnRhbCBlbiBuZWdyaXRhKSwgc2Ugb2JzZXJ2YSBxdWUgZWwgcGFyw6FtZXRybyBwb2JsYWNpb25hbCBlc3TDoSBpbmNsdWlkbyBlbiBlc29zIGzDrW1pdGVzLgoKRXMgcHJvYmFibGUsIGNvbW8gZW4gZWwgc2VndW5kbyBjYXNvLCBxdWUgb3RyYSBtdWVzdHJhIHByb2JhYmxlLCBjdWFuZG8gc2UgbGUgYXBsaXF1ZSBlbCBpbnRlcnZhbG8gZGUgKy8tIDEuOTYgZXJyb3JlcyBlc3TDoW5kYXIsIG5vIGluY2x1eWEgYWwgcGFyw6FtZXRyby4KU2Ugb2JzZXJ2YSBxdWUgbGEgbMOtbmVhIGVuIG5lZ3JpdGEgbm8gaW5jbHV5ZSBsYSBsaW5lYSB2ZXJ0aWNhbCBlbnRyZWNvcnRhZGEgcXVlIG1hcmNhIGVsIHZhbG9yIGRlbCBwYXLDoW1ldHJvIHBvYmxhY2lvbmFsLgoKIVtdKGMzLjQucG5nKXt3aWR0aD0iNTgxIn0KClNpbiBlbWJhcmdvLCBzYWJlbW9zIHF1ZSBlcyBtdWNobyBtw6FzIHByb2JhYmxlICg5NSUgZGUgcHJvYmFiaWxpZGFkZXMpIHF1ZSBzaSB1bmEgbXVlc3RyYSBvYnNlcnZhZGEgZXMgcGFydGUgZGVsIDk1JSBkZSBtdWVzdHJhcyBhbHJlZGVkb3IgZGVsIHBhcsOhbWV0cm8sIGVzdGUgaW50ZXJ2YWxvIGluY2x1eWEgYWwgcGFyw6FtZXRybyBwb2JsYWNpb25hbC4KQSBlc3RvcyBsw61taXRlcyBsZSBsbGFtYW1vcyAiaW50ZXJ2YWxvcyBkZSBjb25maWFuemEiLgoKRW4gY3VhbHF1aWVyIGludmVzdGlnYWNpw7NuIHNvbG8gc2UgY3VlbnRhIGNvbiB1bmEgbXVlc3RyYSBvYnNlcnZhZGEsIGN1eW8gZXN0YWTDrXN0aWNvIG11ZXN0cmFsLCBzZWEgdW5hIG1lZGlhIG8gdW4gcHJvcG9yY2nDs24sIGVzIHVuYSBhcHJveGltYWNpw7NuIGRlbCBwYXLDoW1ldHJvIHBvYmxhY2lvbmFsLgoKUGFyYSBwb2RlciBleHRyYXBvbGFyIGRlc2RlIGxhIG11ZXN0cmEgaGFzdGEgbGEgcG9ibGFjacOzbiwgc2UgdGllbmUgcXVlIGNvbnN0cnVpciB1biBpbnRlcnZhbG8gZGUgY29uZmlhbnphIGFscmVkZWRvciBkZWwgZXN0YWTDrXN0aWNvIG11ZXN0cmFsLgpFc3RlIGludGVydmFsbyBzZSBjb25zdHJ1eWUgYXBsaWNhbmRvIGxhICJkaXN0YW5jaWEiIGRlICsvLSAxLjk2IGVycm9yZXMgZXN0w6FuZGFyLCBwYXJhIHRlbmVyIHVuYSBjb25maWFuemEgZGUgOTUlIGRlIGluY2x1aXIgYWwgcGFyw6FtZXRybyBwb2JsYWNpb25hbC4KClNpIHNlIGVzdMOhIGV4dHJhcG9sYW5kbyBwYXJhIHVuYSB2YXJpYWJsZSBudW3DqXJpY2EsIG1lZGlhbnRlIGxhIG1lZGlhLCBlbCBlcnJvciBlc3TDoW5kYXIgKG8gc2UpIGVzOgoKJCQKc2UgPSAxLjk2ICogXGZyYWN7c30ge1xzcXJ0e259fQokJAoKU2kgc2UgZXN0w6EgZXh0cmFwb2xhbmRvIHBhcmEgdW5hIHZhcmlhYmxlIGNhdGVnw7NyaWNhLCBtZWRpYW50ZSB1bmEgcHJvcG9yY2nDs24sIGVsIGVycm9yIGVzdMOhbmRhciAobyBzZSkgZXM6CgokJApzZSA9IDEuOTYgKiBcc3FydHtcZnJhY3socCAqICgxLXApKX0ge259fQokJAoKQSBtYW5lcmEgZGUgcmVzdW1lbiwgbGEgc2lndWllbnRlIHRhYmxhIG5vcyBtdWVzdHJhIGVsIHBhcsOhbWV0cm8sIGVsIGVzdGFkw61zdGljbyBwdW50dWFsIHkgZWwgZXJyb3IgZXN0w6FuZGFyIHBhcmEgY2FkYSB0aXBvIGRlIHZhcmlhYmxlIHkgY8OzbW8gc2UgZm9ybWEgZWwgaW50ZXJ2YWxvIGRlIGNvbmZpYW56YS4KCiFbXShjMy41LnBuZykKCkVuIGVzdGFzIGbDs3JtdWxhcywgc2UgdXNhIGVsIHPDrW1ib2xvICJ0IiB5ICJ6IiBwYXJhIHJlZmVyaXIgYSBsYXMgZGlzdHJpYnVjaW9uZXMgdGXDs3JpY2FzIHF1ZSBzZSB1c2FuLgpQYXJhIGZpbmVzIHByw6FjdGljb3MsIGN1YW5kbyBsYSBtdWVzdHJhIGVzIGdyYW5kZSwgYW1iYXMgZGlzdHJpYnVjaW9uZXMgc29uIGlndWFsZXMuCkVsIHZhbG9yIGRlICJ0IiBvICJ6IiBkZXBlbmRlIGRlbCBuaXZlbCBkZSBjb25maWFuemEgcXVlIHF1ZXJlbW9zLgpFcyBkZWNpciwgZGUgbGEgcHJvYmFiaWxpZGFkIHF1ZSBxdWVyZW1vcyBkZSBxdWUgZWwgaW50ZXJ2YWxvIGluY2x1eWEgYWwgcGFyw6FtZXRyby4KRGUgZXN0YSBtYW5lcmE6CgotICAgWiBhbCA5MCUgPSAxLjY0NQoKLSAgIFogYWwgOTUlID0gMS45NgoKLSAgIFogYWwgOTglID0gMi4zMjYKCi0gICBaIGFsIDk5JSA9IDIuNTc2CgrCv1F1w6kgcGFzYSBjb24gZWwgSUMgY3VhbmRvIHNlIHF1aWVyZSBtYXlvciBjb25maWFuemE/CsK/U2UgdnVlbHZlIG3DoXMgbyBtZW5vcyBwcmVjaXNvPwoKRW4gZWwgZWplbXBsbyBkZWwgY8OhbGN1bG8gZGVsIHByb21lZGlvIGRlIGFsdW1ub3MgcXVlIGF0aWVuZGUgbG9zIHByb2Zlc29yZXMsIHNlIHB1ZWRlIGHDsWFkaXIgZWwgY8OhbGN1bG8gZGUgbG9zIGludGVydmFsb3MgZGUgY29uZmlhbnphIGVuIGFtYm9zIGNhc29zLCBwYXJhIGhvbWJyZXMgeSBtdWplcmVzLgpFbCBjb21hbmRvIHBhcmEgaGFjZXIgZXN0byBlcyBgY2lNZWFuYCBxdWUgZXMgcGFydGUgZGUgbGEgbGlicmVyw61hIGBsc3JgLgoKYGBge3J9CmxpYnJhcnkobHNyKQpjaU1lYW4oZW5kbzIwMjAkUDFfNiwgbmEucm0gPSBUKQpgYGAKClNpIHNlIGNhbGN1bGFuIGxvcyBpbnRlcnZhbG9zIGRlIGNvbmZpYW56YSBwb3IgZ3J1cG9zLCBlc3RvcyBzZSBwdWVkZW4gY29tcGFyYXIuCgpgYGB7ciBJQyBkb2NlbnRlc30KbGlicmFyeShsc3IpCmNpX2FsdW14c2V4byA9IGVuZG8yMDIwIHw+CiAgZ3JvdXBfYnkoc2V4bykgfD4KICBzdW1tYXJpc2UoTWVkaWEgPSBtZWFuKFAxXzYsIG5hLnJtPVQpLAogICAgICAgICAgICBtaW4gPSBjaU1lYW4oUDFfNiwgbmEucm09VClbMV0sCiAgICAgICAgICAgIG1heCA9IGNpTWVhbihQMV82LCBuYS5ybT1UKVsyXQogICAgICAgICAgICApCmNpX2FsdW14c2V4bwpgYGAKClNlIGVuY3VlbnRyYSBxdWUgbGEgbWVkaWEgZGUgYWx1bW5vcyBxdWUgYXRpZW5kZSB1biBkb2NlbnRlIGhvbWJyZSBlc3RhIGVudHJlIDUwLjcgeSA1My44IGFsdW1ub3MsIG1pZW50cmFzIHF1ZSBlbiBlbCBjYXNvIGRlIGxhcyBkb2NlbnRlcyBtdWplcmVzIGVzdMOhIGVudHJlIDMzLjMgeSAzNC44IGFsdW1ub3MgZW4gYXVsYS4KCsK/UXXDqSBtw6FzIHNlIHB1ZWRlIGRlY2lyIGRlIGVzdGEgY29tcGFyYWNpw7NuIGVudHJlIGludGVydmFsb3MgZGUgY29uZmlhbnphPwrCv0PDs21vIGdyYWZpY2FyIGVzdG9zIGludGVydmFsb3MgZGUgY29uZmlhbnphPwoKIyBCaWJsaW9ncmFmw61hCg==