0. Definición del ambiente de trabajo.

Al comenzar siempre es importante establecer el idioma adecuado para que el programa reconozca caracteres especiales. En el caso de definir al idioma español, la instrucción a utilizar es:

Sys.setlocale("LC_ALL", "es_ES") #alternativa 1
## [1] "es_ES/es_ES/es_ES/C/es_ES/C"
Sys.setenv(LANG = "es") #alternativa 2

También es importante instalar las librerías que se utilizarán posteriormente:

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.2     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ ggplot2   3.4.3     ✔ tibble    3.2.1
## ✔ lubridate 1.9.2     ✔ tidyr     1.3.0
## ✔ purrr     1.0.1     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(DescTools)
library(haven)

Además es muy relevante establecer la ubicación del directorio de trabajo, con el fin que el programa identifique la carpeta de la que extraerá y, también, donde guardará la información solicitada.

getwd() ##directorio actual
## [1] "/Users/gustavo/Dropbox/R/Rmarkdown"
setwd("~/Dropbox/R") ##Esta permite cambiar y definir el directorio deseado
list.files() ##Esta permite enlistar los archivos dentro del directorio
##  [1] "~$datos_morena_frag.xlsx"                             
##  [2] "~$ia_ponencia_morena.docx"                            
##  [3] "~$morena_nueva_encuesta_2020.xlsx"                    
##  [4] "1-Estudio-Berumen-30mayo-6junio.PDF"                  
##  [5] "200613COVID19MEXICO.csv"                              
##  [6] "alumnos_political_compass.csv"                        
##  [7] "autoestima.csv"                                       
##  [8] "Base Voto x Mujeres Experimento 1 copia.csv"          
##  [9] "base_alternancias.csv"                                
## [10] "Base_datos_Informe_Pais.xlsx"                         
## [11] "base_municipios_final_datos_01.csv"                   
## [12] "base_voto_mujeres_2012_2018.csv"                      
## [13] "base_votos_2015_2018.csv"                             
## [14] "Bertrand_data.dta"                                    
## [15] "berumen_encuesta_6_junio.sav"                         
## [16] "Clase 2 DGAPA.xlsx"                                   
## [17] "Clase 4 DGAPA.xlsx"                                   
## [18] "Componente principal SPP.jpeg"                        
## [19] "Concentrado_Elecciones_Federales_1976_2018 copia.csv" 
## [20] "conejos.csv"                                          
## [21] "confidence_intervals_Coursera.rmd"                    
## [22] "Copia de factorial 3x2x2.csv"                         
## [23] "copia_semillas.csv"                                   
## [24] "cuadro_latino.csv"                                    
## [25] "Curso Intro a R I y II"                               
## [26] "data_clientelismo.csv"                                
## [27] "data_clientelismo.dta"                                
## [28] "datos_2_fac_aleat.csv"                                
## [29] "datos_computos_distritos_diputado.txt"                
## [30] "datos_covid1.txt"                                     
## [31] "datos_covid2.csv"                                     
## [32] "datos_covid3.xlsx"                                    
## [33] "datos_gc.csv"                                         
## [34] "datos_morena_frag.xlsx"                               
## [35] "datos_pp1.csv"                                        
## [36] "datos_pp2.csv"                                        
## [37] "datos_repeticiones.csv"                               
## [38] "datos_telas.csv"                                      
## [39] "diccionario_datos_covid19"                            
## [40] "Diferencia_votos_DIP_FED_2015.csv"                    
## [41] "diminish.txt"                                         
## [42] "encuesta_abierta_morena_2020.xlsx"                    
## [43] "encuesta_abierta_morena.csv"                          
## [44] "Encuesta_Gea.dta"                                     
## [45] "encuesta_nina_w_ 2016"                                
## [46] "encuesta_nueva_morena.csv"                            
## [47] "enpol_sec_5_6.csv"                                    
## [48] "enpol_sec7_1.csv"                                     
## [49] "enpol_sec8_9_10.csv"                                  
## [50] "experim_azucar.csv"                                   
## [51] "guia_ponencia_morena.docx"                            
## [52] "ICI_2018.xlsx"                                        
## [53] "idh_mpio_2000_2005.csv"                               
## [54] "idh_mpio_2000_2005.xls"                               
## [55] "indices_spp_subnacional_1980_2018.xlsx"               
## [56] "intro_to_data_Coursera.html"                          
## [57] "jerarquico_cruzado.csv"                               
## [58] "Latinobarometro_2018_Esp_Spss_v20190303.sav"          
## [59] "Latinobarometro_2018_Esp_Stata_v20190303.dta"         
## [60] "Latinobarometro_2020_Esp_Rdata_v1_0.rdata"            
## [61] "mediciones_repetidas.csv"                             
## [62] "Mi_Exportación.xlsx"                                  
## [63] "modelo_jerarquico.csv"                                
## [64] "morena_nueva_encuesta_2020.xlsx"                      
## [65] "morena-basedatos-integrada-vf-1.csv"                  
## [66] "morena-bd-integrada-estimación-empresas.xlsx"         
## [67] "partylevel_20130907.csv"                              
## [68] "presid06computo.dta"                                  
## [69] "Principal Component Analysis R Program and Output.pdf"
## [70] "resultados_diputadosfederales_2018.csv"               
## [71] "Rmarkdown"                                            
## [72] "scripts"                                              
## [73] "SDEMT319_10.dta"                                      
## [74] "sdemt319_10.sav"                                      
## [75] "SDEMT319.dta"                                         
## [76] "syllabus.log"                                         
## [77] "syllabus.Rmd"                                         
## [78] "syllabus.tex"                                         
## [79] "Tabasco_votos_dip_loc_2018_dif.csv"                   
## [80] "tarea_hipertension.csv"                               
## [81] "TiposErrores.png"                                     
## [82] "V-Dem-CY-Core-v12.csv"                                
## [83] "voto_cand_socioec_2012.csv"                           
## [84] "voto_cand_socioec_2015.csv"                           
## [85] "voto_cand_socioec_2018.csv"                           
## [86] "votos_diputados_2015.csv"                             
## [87] "votos_mujeres_2012_2018_copia.csv"                    
## [88] "votos_mujeres_2012_2018.csv"

Una vez establecido el directorio de trabajo, se debe cargar la base de datos o data frame en el ambiente del programa, de la que se analizará la información. Para ello habrá que “cargar” la información sobre los pacientes infectados por COVID-19 reportados por la Secretaría de Salud del gobierno federal mexicano.

datos_covid <- read.csv("~/Dropbox/R/200613COVID19MEXICO.csv", header = TRUE) #ruta de acceso a los datos, 'header = TRUE' en caso de que el archivo cuente con nombres de las variables.

1. Inferencia por intervalos.

Los Intervalos de Confianza (IC) son otra técnica de estimación dentro del ámbito de la estadística inferencial. Estos corresponden a un rango de valores generados a partir de datos de una muestra y dentro del que se estima que se encontrará el “verdadero” valor de la población. A diferencia del proceso de estimación puntual, el cual compara un valor específico (un estadístico como, por ej., la media de una variable) a partir de un valor calculado frente a un valor crítico, evaluado a partir de sus probabilidades correspondientes, el IC asume que dentro del conjunto de valores que abarca, una parte se integra por un Margen de Error (ME) en torno al valor puntual del estadístico puntual. Y de la unión de ambos (ME y estadístico puntual, por ej. la media, mediana o proporción), se cuenta con un Nivel de Confianza que permite inferir que en su interior se contendrá al parámetro de interés.

Debido a la naturales del IC (un rango), este permite incluir en su interior a un conjunto de probabilidades asociadas a los valores puntuales que lo integran. Esto aumenta la probabilidad de, a su vez, inferir el valor del parámetro de interés a diferencia de la técnica de estimación puntual.

Fórmula de un IC a partir del estadístico puntual de la media de una muestra: \[ \bar{x} \pm ME \]

Por su parte, el ME se construye a partir de dos elementos:

  1. Un Nivel de Confianza (definido en unidades \(Z\)) que se corresponde con la proporción o probabilidad que el analista considera (arbitrariamente) pertinente para aceptar que en el rango de interés se incluye al parámetro de interés y, además, fuera de ello se encuentra el tamaño de error esperado y aceptado.
  2. El segundo elemento consiste en el Error Estándar (ES), que se refiere a la variación de una muestra respecto de una distribución muestral, donde se asume que las muestras de ésta última son del mismo tamaño que la primera.

Donde el ME es igual a: \[ME = z^\star \frac{s}{\sqrt{n}}\]

A partir de los elementos que integran al IC: un estimador puntual de interés para el análisis del comportamiento de una población, un Nivel de Confianza definido por el analista y el Error Estándar de la muestra, se calculan dos valores aleatorios que definen los límites del rango de valores del IC: su valor mínimo y su valor máximo.

De manera que el IC, calculado a partir del valor de la media de una muestra, es igual al valor mínimo y al valor máximo derivado de: \[\bar{x} \pm z^\star \frac{s}{\sqrt{n}}\]

1.1. Muestra e Intervalos de Confianza.

Para comenzar la demostración sobre la construcción de los IC y su utilidad, a continuación se trabajará sobre una submuestra obtenida de la base de datos sobre pacientes infectados con COVID-19 que elaboró la Secretaría de Salud del Gobierno Federal de México. Esto con el fin de establecer, primero, que un analista suele trabajar con muestras de poblaciones en la gran mayoría de los casos, y esto supone que, segundo, cada muestra puede mostrar variaciones en cuanto a los valores calculados para un mismo estadístico. Lo que supone un reto para aproximarse al estimar el valor del parámetro de interés en la población -esto es lo último que se desea conocer en los análisis cuantitativos.

A continuación se comenzará con la construcción de una submuestra, para lo que se deberá, inicialmente, establecer el valor de “arranque” o “semilla” en R, y a partir del que se integrarán los casos aleatoriamente. Definir dicho valor inicial permite que los análisis sean posteriormente reproducibles y arriben al mismo resultado.

1.1.1. Integración de una muestra aleatoria.

Dicho valor “semilla” es un número completamente arbitrario que es definido por el analista, y su utilidad está en definir el valor inicial que servirá para el proceso de aleatorización posterior. Esto permitirá que las submuestras que se construyen, posteriormente, registrarán los mismos casos y valores entre sí.

set.seed(54321)

A partir de los datos sobre los pacientes infectados con COVID-19 que ha elaborado la SSA del gobierno federal mexicano, se deberá integrar una submuestra con 10,000 casos. Para ello se usará el script sample_n () de la paquetería dplyr, por lo que deberá ser instalada previamente. Esta librería se incluye dentro del paquete de otra librería más amplia, que es tidyverse().

n_muestra <- 10000 #objeto que define el tamaño de la muestra
muestra <- sample_n(datos_covid, n_muestra) #script para integrar la muestra.

De esta manera, en el recuadro del “ambiente” de R Studio ahora aparecen nuevos datos con el nombre de “muestra”, que se acaba de integrar de manera aleatoria.

Pregunta: Describe la distribución de la variable EDAD en la muestra recién integrada. ¿Cuál es el valor promedio y cuánto se desvían el resto de los casos?

1.1.2. Elementos del Intervalo de Confianza.

Los valores de los estadísticos obtenidos de una muestra suelen ser nuestro “mejor”, o en ocasiones el único, estimador para conocer un parámetro de interés en una población. De esta manera, a partir de las diversas técnicas de la estadística inferencial, dichos estadísticos sirven como estimadores puntuales del parámetro poblacional.

Por ejemplo, el estadístico de la media (\(\bar{x}\)) de una variable en una muestra nos permite acercarnos al valor de la media en la población (\(\mu\)). Sin embargo el valor del estadístico solo tiene asociado un solo valor de probabilidad, y a partir de comparar su valor correspondiente en una distribución muestral (el cuantil correspondiente según el estadístico de prueba utilizado para evaluar su posición) con respecto al valor crítico determinado a partir del mismo estadístico de prueba, es que se puede determinar si dicho valor muestral se aproxima probabilísticamente al valor poblacional.

Este proceso de comparación, que se denomina prueba de significancia, se reporta a partir de un solo valor (que en ocasiones se reduce al p-valor del valor obtenido o calculado del estadístico muestral), y no necesariamente permite identificar el tamaño de la incertidumbre que contiene el valor calculado.

La utilidad de los IC radica en que, partiendo de un punto de referencia -a partir del valor del estadístico de interés- se puede estimar un rango de valores posibles que puede adoptar el parámetro de interés a la vez que se incluye el grado de incertidumbre en la estimación misma. De manera que el IC ofrece mayor información al analista sobre el proceso de estimación:

  1. presenta el valor de estimación puntual y,
  2. el tamaño de incertidumbre contenida en la estimación.

Dicho tamaño de incertidumbre contenida en el rango establecido por el IC también permite incluir una mayor cantidad de valores posibles que puede adoptar el parámetro de interés y, a su vez, incorporar una cantidad mayor de probabilidades asociadas a estos valores posibles.

Como se vio arriba, los elementos que integran a un IC son:

  1. estimador puntual que puede ser algún momento o medida de tendencia central (media, mediana, proporción),
  2. margen de error, que supone la variación que existirá en torno al estimador puntual.

El margen de error -como también se describió arriba- se integra con dos elementos:

  1. el error estándar o típico de la muestra con respecto a la distribución muestral, y
  2. el nivel de confianza establecido por el analista previamente, y que depende del tipo de distribución de probabilidades del estadístico de prueba utilizado para el análisis (\(z, t, F, \chi^2, r\)).
1.1.2.1. Cálculo del estimador puntual para una variable continua.

En el caso de trabajar con una variable del tipo continua y con una distribución parecida a una normal, la media suele ser el estimador puntual más pertinente. Para ello se calculará la media de la variable EDAD de los pacientes en la submuestra construida previamente.

x_barra <- mean(muestra $ EDAD)
x_barra
## [1] 42.4318
1.1.2.2. Determinación del Nivel de Confianza y su cuantil correspondiente.

El Nivel de Confianza es una proporción definida previamente por el analista, mediante la que define cuál es el porcentaje de casos, y probabilidades, que desea incluir en el rango de valores que busca estimar. Este nivel de confianza se determina a partir de identificar el valor crítico asociado al Nivel de Confianza deseado. Para ello se utilizará el script qnorm().

El Nivel de Confianza no es lo mismo que un percentil al momento de definir el valor crítico del IC. El percentil se refiere al acumulado de probabilidades ubicados a la izquierda del valor crítico mientras que el Nivel de Confianza define el tamaño del rango de valores, y sus probabilidades asociadas, en torno a (a su izquierda y derecha) del estimador puntual seleccionado. De manera que el Nivel de Confianza se refiere a un porcentaje de casos ubicados al centro de la distribución.

Por ejemplo, un Nivel de Confianza del 95% se refiere al 95% de los casos ubicados en torno al centro de la distribución, mientras que un valor crítico asociado con esta área se corresponde con el percentil 0.975 pues a la derecha de dicho valor crítico quedará el 2.5% de los casos y, simétricamente, quedará el 2.5% a la izquierda de la distribución. En total, la suma de estos valores extremos será de 5% o una proporción de 0.05 (alfa).

La manera de identificar el valor del cuantil correspondiente a un Nivel de Confianza del 95% para el IC es la siguiente:

z_95 <- qnorm(0.975) #se usa la proporción 0.975 por que a su derecha se excluye al 0.025 de los casos y, de manera simétrica también se excluirá al 0.025 de los casos a la izquierda del rango.
z_95 #unidades de desviación estándar o "Z"
## [1] 1.959964

En el caso de trabajar con un Nivel de Confianza del 99%, se refiere al 99% de los casos ubicados en torno al centro de la distribución, y su valor crítico correspondiente consiste en el percentil 0.995 pues a la derecha de dicho valor crítico quedará el 0.5% de los casos y, simétricamente, quedará el 0.5% a la izquierda de la distribución. En toral, la suma de estos valores extremos será de 1% o una proporción de 0.01 (alfa).

z_99 <- qnorm(0.995) #se usa la proporción 0.975 por que a su derecha se excluye al 0.025 de los casos y, de manera simétrica también se excluirá al 0.025 de los casos a la izquierda del rango.
z_99 #unidades de desviación estándar o "Z"
## [1] 2.575829
1.1.2.3. Cálculo del Error Estándar de la muestra.

El error estándar permite identificar la variación que existe en la muestra analizada con respecto de la distribución muestral de otras muestras (hipotéticas) del mismo tamaño (\(n\)) que la muestra original. Este valor ayuda a establecer si el estimador utilizado (\(\bar{x}\)) es un buen estimador para acercarse al parámetro poblacional de interés.

La manera de calcular el error estándar consiste en dividir la desviación estándar de la variable analizada entre la raíz cuadrada del tamaño de la muestra utilizada (\(\frac{s}{\sqrt{n}}\)).

error_std<-(sd(muestra$EDAD) / #desviación estándar de la variable EDAD en la muestra
              sqrt(n_muestra)) #raíz cuadrada del tamaño de la muestra
error_std
## [1] 0.1655911

Otra manera de calcular el Error Estándar bajo la liberaría DescTools() es:

SE <- MeanSE(muestra $ EDAD, sd = NULL, na.rm = TRUE)
SE
## [1] 0.1655911

1.2. Integración del Intervalo de Confianza a partir de la media.

Una vez calculados los elementos del IC, se puede integrar el rango de valores que lo integrarán. Debido a que el IC es un rango, este se define por dos valores aleatorios:

  1. el límite inferior con un Nivel de Confianza del 95%, se pueden calcular manualmente de la siguiente forma:
lim_inf <- x_barra - (z_95 * error_std)
lim_inf
## [1] 42.10725
  1. La manera de calcular el límite superior con un Nivel de Confianza del 95% es:
lim_sup <- x_barra + (z_95 * error_std)
lim_sup
## [1] 42.75635
  1. Integración del Intervalo de Confianza:

A partir de ambos límites calculados se puede establecer que el rango de valores dentro del que se espera que se encuentre la media de edad para la población de interés se ubique entre el límite inferior de 42.1072474 y el límite superior calculado de 42.7563526, con un Nivel de Confianza del 95%.

Otra manera de calcular un IC es a partir del script MeanCI()que es parte de la librería DescTools; para ello se debe cargar esta última librería y correr el script posteriormente.

IC_EDAD <- MeanCI(x = muestra $ EDAD, # Variable de la que se calcula su media (estimador puntual)
                  conf.level = 0.95, # Nivel de confianza
                  na.rm = FALSE) # Argumento para remover los valores perdidos
IC_EDAD
##     mean   lwr.ci   upr.ci 
## 42.43180 42.10721 42.75639

Con el fin de evaluar la pertinencia del IC construido, se puede comparar con los datos originales, suponiendo que son los datos de una población entera. Para ello se calcula el valor de la media poblacional para determinar si el IC construido logra capturar dicho parámetro. Este valor se deberá guardar como un objeto param, y se le denominará mu.

param <- datos_covid %>%
  summarise(mu = mean(EDAD))
param
##         mu
## 1 42.57663

Pregunta: ¿El IC construido logra capturar el promedio de edad de los pacientes en la población en México?

1.3. Niveles de confianza.

A partir del uso de R y sus herramientas se pueden construir diversas muestras aleatorias para, también, entender la manera en que pueden variar los valores de la media y los IC entre sí.

Los pasos básicos a seguir son:

  • Construir una muestra.
  • Calcular la muestra y la desviación estándar para dicha muestra y guardarlas para calcular, posteriormente, los límites inferior y superior de los IC.
  • Repetir estos 50 veces.

Para llevarlo a cabo se usa el script rep_sample_n para construir 50 muestras aleatorias de tamaño n = 60 de una población y, posteriormente, se calcularán los límites inferiores y superiores de los IC. Con la siguiente fórmula se puede activar dicha función.

rep_sample_n <- function(tbl, size, replace = FALSE, reps = 1)
{
  n <- nrow(tbl)
  i <- unlist(replicate(reps, sample.int(n, size, replace = replace),
                        simplify = FALSE))
  rep_tbl <- cbind(replicate = rep(1:reps,rep(size,reps)), tbl[i,])
  dplyr::group_by(rep_tbl, replicate)
} #Activación de la función "rep_sample_n()"

set.seed(1234)
ci <- datos_covid %>% 
  rep_sample_n(size = 60, reps = 50, replace = TRUE) ##creación de 50 muestras de n = 60, esto da un tamaño de muestra de 3000 (= 60 casos x 50 muestras)

Ahora se calculan los límites inferior y superior de cada una de las 50 muestras para, así, construir sus Intervalos de Confianza respectivos:

ci <- ci %>% #Esta opción servirá para guardar a los IC como un nuevo objeto de formato 'tabla'
  summarise(lim_inferior=mean(EDAD) - (z_95*(sd(EDAD) / sqrt(3000))), #límite inferior
            lim_superior=mean(EDAD) + (z_95*(sd(EDAD) / sqrt(3000)))) #límite superior

Ahora se puede hacer una revisión “rápida” a los primeros cinco IC:

ci %>%
  slice(1:5)
## # A tibble: 5 × 3
##   replicate lim_inferior lim_superior
##       <int>        <dbl>        <dbl>
## 1         1         38.3         39.4
## 2         2         42.5         43.5
## 3         3         42.5         43.7
## 4         4         41.6         42.8
## 5         5         39.3         40.3

A partir del objeto que reúne los límites inferiores y superiores de IC para 50 muestras se puede crear una gráfica que ayude a su visualización y comparación.

El primer paso para la construcción de dicha gráfica consiste en crear una variable nueva en el objeto ci recién creado, que indique si el intervalo captura o no a la media poblacional. Hay que notar que “capturar” dicho valor significa que el límite inferior del IC se ubicará por debajo del valor del parámetro y el límite superior del IC se encontrará por arriba de dicho valor poblacional.

Para crear la variable nueva se usará el script mutate() de la librería dplyr.

ci <- ci %>%
  mutate(captura_mu = ifelse(lim_inferior < param $ mu & lim_superior > param $ mu, "si", "no"))

Vistazo a las primeras cinco filas:

ci %>%
  slice(1:5)
## # A tibble: 5 × 4
##   replicate lim_inferior lim_superior captura_mu
##       <int>        <dbl>        <dbl> <chr>     
## 1         1         38.3         39.4 no        
## 2         2         42.5         43.5 si        
## 3         3         42.5         43.7 si        
## 4         4         41.6         42.8 si        
## 5         5         39.3         40.3 no

La función ifelse es un script alternativo para realizar la transformación de una nueva variable a partir de una previamente existente. Dicha función requiere tres argumentos: el primero consiste en un argumento lógico, el segundo es el valor deseado si el argumento lógico corresponde a un resultado verdadero y, el tercer argumento corresponde al nuevo valor residual que se desea asignar en caso de que el argumento lógico sea un resultado falso.

Ahora se cuenta con la información necesaria para crear el gráfico, pero se deben re organizar los datos para facilitar su visualización. Específicamente se necesita organizar los datos en un nuevo data frame donde cada fila o renglón represente un límite, en contraposición a un intervalo.

De manera que se desean manipular estos datos:

replicate lim_inferior lim_superior captura_mu
1 41.21044 41.95623 no
2 46.93813 47.52854 no
3 46.91318 47.55349 no

Para que se re ordenen de la siguiente manera:

id replicate tipo limite captura_mu
1 1 inferior 41.21044 no
2 2 inferior 46.93813 no
3 3 inferior 46.91318 no
4 1 superior 41.95623 no
5 2 superior 47.52854 no
6 3 superior 47.55349 no

Esto se logra a partir del siguiente script:

ci_data <- gather(ci, type, bound, lim_inferior : lim_superior)

Finalmente se construye el gráfico de los IC usando la librería ggplot:

ggplot(data = ci_data, aes(x = bound, y = replicate, 
                           group = replicate, color = captura_mu)) +
  geom_point(size = 2) +  # añade puntos al final de cada recta, de tamaño = 2
  geom_line() +           # conecta los puntos mediante líneas
  geom_vline(xintercept = param $ mu, color = "darkgray") # dibuja una línea vertical en el valor del parámetro "mu"

Pregunta:

¿Cuál proporción de los IC construidos incluye al valor del parámetro? ¿Esta proporción es exactamente igual al Nivel de Confianza de los intervalos? Si no lo es, explica las razones.

2. Intervalos de confianza para una proporción.

En el caso de trabajar con una variable categórica, la construcción de un Intervalo de Confianza se realiza a partir de la proporción de la categoría de interés sobre la que se desea realizar la estimación hacia la población.

Para realizar la construcción de los IC, a continuación se utilizará la matriz de datos de la encuesta Latinobarómetro, en la ola para el año 2018 y que está disponible en su página web. Latinobarómetro Esta se importa desde un formato ‘.sav’ para lo que se utiliza la librería haven().

datos_lb <- haven::read_sav("~/Dropbox/R/Latinobarometro_2018_Esp_Spss_v20190303.sav")

Y ahora se solicitan las dimensiones del data frame para conocer su tamaño:

dim(datos_lb)
## [1] 20204   395

De esta manera se sabe que se cuentan con 20204 filas y 395 columnas o variables.

Además se solicita un listado de los nombres de la variables que integran al data frame. Aquí se pide un vistazo a los primero 6 valores, de las 395 columnas.

head(names(datos_lb))
## [1] "NUMINVES" "IDENPA"   "NUMENTRE" "REG"      "CIUDAD"   "TAMCIUD"

A partir de este listado se identifica que los nombres de las variables están codificados, y para conocer sus significados se debe consultar del Libro de Códigos de la base de datos, que viene incluido en el paquete de datos que se descarga desde la página de Latinobarómetro.

En el libro de códigos se puede observar que la mayoría de las variables que la integran son de tipo categóricas, y a su vez se reconoce que no todas son de tipo binomial (cuentan con solo dos categorías o valores posibles).

Al realizar el análisis para calcular los IC se debe reconocer, inicialmente la distribución de los valores categóricos que integran a cada variable. A continuación se realiza un primer acercamiento a la exploración de la variable P12STGBS que corresponde al ítem de Apoyo a la Democracia, y sus valores posibles son 3 categorías:

  1. La democracia es preferible a cualquier otra forma de gobierno.
  2. En algunas circunstancias, un gobierno autoritario puede ser preferible.
  3. A la gente como uno, nos da lo mismo un régimen democrático que uno no democrático.

Tabla de frecuencias absolutas:

table(datos_lb $ P12STGBS)
## 
##    1    2    3 
## 9723 2950 5654

Tabla de frecuencias relativas:

prop.table(table(datos_lb $ P12STGBS))
## 
##         1         2         3 
## 0.5305287 0.1609647 0.3085066

La librería DescTools() cuenta con distintas funciones para construir IC para variables categóricas binominales y multinomiales que facilitan el trabajo analítico.

En el caso de una variable categórica binominal, en donde se desea estimar el IC primero se debe identificar la categoría de interés. En el caso de la variable P12STGBS se considera que la categoría de interés consiste en aquella codificada con el valor de “1”, que corresponde a la etiqueta “1.- La democracia es preferible a cualquier otra forma de gobierno.”

La función para solicitar el IC para esta categoría es:

BinomCI(x = 9723, #frecuencia absoluta para la categoría de interés
        n = 18327,#casos válidos
        conf.level = 0.95, #nivel de confianza
        method = "clopper-pearson") ##Intervalo de confianza para una categoría
##            est    lwr.ci    upr.ci
## [1,] 0.5305287 0.5232717 0.5377761

De esta manera se sabe que la proporción de encuestados que apoyan a la democracia es del 53.05% en la muestra, y esta es nuestra mejor estimación puntual para el apoyo a la democracia que se espera encontrar en la población latinoamericana. Pero también se espera, con un 95% de confianza, que el promedio de la población de ciudadanos latinoamericanos que apoyan a la democracia se encuentre entre un 52.32% y 53.77%.

En el caso de una variable categórica multinomial, la librería DescTools()también cuenta con una función específica para calcular el IC para cada una de las diversas categorías. Esta función esMultinomCI(x =, conf.level =, sides =, method =), y se aplicará a las 3 categorías que integran a la variable P12STGBS

observados <- c(9723, 2950, 5654) #se crea un objeto con las frecuencias absolutas para las 3 categorías

MultinomCI(observados, #se llama al objeto con las frecuencias absolutas para 3 categorías
           conf.level = 0.95, # definición del nivel de confianza
           method = "sisonglaz") # método para el cálculo del IC multinomial
##            est    lwr.ci    upr.ci
## [1,] 0.5305287 0.5228352 0.5382768
## [2,] 0.1609647 0.1532711 0.1687127
## [3,] 0.3085066 0.3008130 0.3162546

3. Ejercicios.

  1. ¿La distribución de los datos en una muestra aleatoria deben iguales a otras distribuciones en otras muestras que se recolectaron de la misma población: Verdadero o Falso?

  2. ¿Qué significa una confianza del 95%?

  1. 95% de las veces el promedio de la población se encontrará dentro del intervalo.
  2. 95% de las muestras aleatorias del mismo tamaño generarán IC que contengan al valor verdadero de la población.
  3. 95% de la población tendrá el mismo IC.
  4. Se está 95% confidente de que la media muestral se encuentra dentro del IC.
  1. ¿Cuál es el valor crítico apropiado para un Nivel de Confianza del 99%?
  1. 0.01
  2. 0.99
  3. 1.96
  4. 2.33
  5. 2.58
  1. Calcula 50 IC con un Nivel de Confianza del 99%. No se necesita generar nuevas muestras, solamente se requiere calcular nuevos IC basados en las medias y desviaciones estándar de las muestras previamente generadas. Grafica todos los intervalos y calcula la proporción de IC que incluyen al valor del parámetro de la media poblacional.

  2. A partir del ejercicio anterior, ¿se esperaría que el 99% de los intervalos contengan el valor del parámetro estimado?

  1. Cierto
  2. Falso
LS0tCnRpdGxlOiAiSW50ZXJ2YWxvcyBkZSBjb25maWFuemEgcGFyYSB1biBlc3RhZMOtc3RpY28iCmF1dGhvcjogIkd1c3Rhdm8gTWFydMOtbmV6IFZhbGRlcyIKZGF0ZTogIjIwMjMtMTAtMjUiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiBUUlVFCiAgICB0b2NfZGVwdGg6IDUKICAgIHRvY19mbG9hdDogVFJVRQogICAgbnVtYmVyX3NlY3Rpb246IEZBTFNFCiAgICB0aGVtZTogImNvc21vIgogICAgY29kZV9kb3dubG9hZDogVFJVRQogICAgY29kZV9mb2xkaW5nOiBzaG93CmVkaXRvcl9vcHRpb25zOiAKICBtYXJrZG93bjogCiAgICB3cmFwOiA3MgotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmBgYAoKIyMgMC4gRGVmaW5pY2nDs24gZGVsIGFtYmllbnRlIGRlIHRyYWJham8uCgpBbCBjb21lbnphciBzaWVtcHJlIGVzIGltcG9ydGFudGUgZXN0YWJsZWNlciBlbCBpZGlvbWEgYWRlY3VhZG8gcGFyYSBxdWUgZWwgcHJvZ3JhbWEgcmVjb25vemNhIGNhcmFjdGVyZXMgZXNwZWNpYWxlcy4gRW4gZWwgY2FzbyBkZSBkZWZpbmlyIGFsIGlkaW9tYSBlc3Bhw7FvbCwgbGEgaW5zdHJ1Y2Npw7NuIGEgdXRpbGl6YXIgZXM6CgpgYGB7ciBpZGlvbWF9ClN5cy5zZXRsb2NhbGUoIkxDX0FMTCIsICJlc19FUyIpICNhbHRlcm5hdGl2YSAxClN5cy5zZXRlbnYoTEFORyA9ICJlcyIpICNhbHRlcm5hdGl2YSAyCmBgYAoKVGFtYmnDqW4gZXMgaW1wb3J0YW50ZSBpbnN0YWxhciBsYXMgbGlicmVyw61hcyBxdWUgc2UgdXRpbGl6YXLDoW4gcG9zdGVyaW9ybWVudGU6CgpgYGB7ciBsaWJyZXJpYX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoRGVzY1Rvb2xzKQpsaWJyYXJ5KGhhdmVuKQpgYGAKCkFkZW3DoXMgZXMgbXV5IHJlbGV2YW50ZSBlc3RhYmxlY2VyIGxhIHViaWNhY2nDs24gZGVsIGRpcmVjdG9yaW8gZGUgdHJhYmFqbywgY29uIGVsIGZpbiBxdWUgZWwgcHJvZ3JhbWEgaWRlbnRpZmlxdWUgbGEgY2FycGV0YSBkZSBsYSBxdWUgZXh0cmFlcsOhIHksIHRhbWJpw6luLCBkb25kZSBndWFyZGFyw6EgbGEgaW5mb3JtYWNpw7NuIHNvbGljaXRhZGEuCgpgYGB7ciBkaXJlY3RvcmlvfQpnZXR3ZCgpICMjZGlyZWN0b3JpbyBhY3R1YWwKc2V0d2QoIn4vRHJvcGJveC9SIikgIyNFc3RhIHBlcm1pdGUgY2FtYmlhciB5IGRlZmluaXIgZWwgZGlyZWN0b3JpbyBkZXNlYWRvCmxpc3QuZmlsZXMoKSAjI0VzdGEgcGVybWl0ZSBlbmxpc3RhciBsb3MgYXJjaGl2b3MgZGVudHJvIGRlbCBkaXJlY3RvcmlvCmBgYAoKVW5hIHZleiBlc3RhYmxlY2lkbyBlbCBkaXJlY3RvcmlvIGRlIHRyYWJham8sIHNlIGRlYmUgY2FyZ2FyIGxhIGJhc2UgZGUgZGF0b3MgbyBkYXRhIGZyYW1lIGVuIGVsIGFtYmllbnRlIGRlbCBwcm9ncmFtYSwgZGUgbGEgcXVlIHNlIGFuYWxpemFyw6EgbGEgaW5mb3JtYWNpw7NuLiBQYXJhIGVsbG8gaGFicsOhIHF1ZSAiY2FyZ2FyIiBsYSBpbmZvcm1hY2nDs24gc29icmUgbG9zIHBhY2llbnRlcyBpbmZlY3RhZG9zIHBvciBDT1ZJRC0xOSByZXBvcnRhZG9zIHBvciBsYSBTZWNyZXRhcsOtYSBkZSBTYWx1ZCBkZWwgZ29iaWVybm8gZmVkZXJhbCBtZXhpY2Fuby4KCmBgYHtyIGNhcmdhX2RhdG9zfQpkYXRvc19jb3ZpZCA8LSByZWFkLmNzdigifi9Ecm9wYm94L1IvMjAwNjEzQ09WSUQxOU1FWElDTy5jc3YiLCBoZWFkZXIgPSBUUlVFKSAjcnV0YSBkZSBhY2Nlc28gYSBsb3MgZGF0b3MsICdoZWFkZXIgPSBUUlVFJyBlbiBjYXNvIGRlIHF1ZSBlbCBhcmNoaXZvIGN1ZW50ZSBjb24gbm9tYnJlcyBkZSBsYXMgdmFyaWFibGVzLgpgYGAKCgojIyAxLiBJbmZlcmVuY2lhIHBvciBpbnRlcnZhbG9zLgoKTG9zICoqKkludGVydmFsb3MgZGUgQ29uZmlhbnphKioqIChJQykgc29uIG90cmEgdMOpY25pY2EgZGUgZXN0aW1hY2nDs24gZGVudHJvIGRlbCDDoW1iaXRvIGRlIGxhIGVzdGFkw61zdGljYSBpbmZlcmVuY2lhbC4gRXN0b3MgY29ycmVzcG9uZGVuIGEgdW4gcmFuZ28gZGUgdmFsb3JlcyBnZW5lcmFkb3MgYSBwYXJ0aXIgZGUgZGF0b3MgZGUgdW5hIG11ZXN0cmEgeSBkZW50cm8gZGVsIHF1ZSBzZSBlc3RpbWEgcXVlIHNlIGVuY29udHJhcsOhIGVsICJ2ZXJkYWRlcm8iIHZhbG9yIGRlIGxhIHBvYmxhY2nDs24uIApBIGRpZmVyZW5jaWEgZGVsIHByb2Nlc28gZGUgZXN0aW1hY2nDs24gcHVudHVhbCwgZWwgY3VhbCBjb21wYXJhIHVuIHZhbG9yIGVzcGVjw61maWNvICh1biBlc3RhZMOtc3RpY28gY29tbywgcG9yIGVqLiwgbGEgbWVkaWEgZGUgdW5hIHZhcmlhYmxlKSBhIHBhcnRpciBkZSB1biB2YWxvciBjYWxjdWxhZG8gZnJlbnRlIGEgdW4gdmFsb3IgY3LDrXRpY28sIGV2YWx1YWRvIGEgcGFydGlyIGRlIHN1cyBwcm9iYWJpbGlkYWRlcyBjb3JyZXNwb25kaWVudGVzLCBlbCBJQyBhc3VtZSBxdWUgZGVudHJvIGRlbCBjb25qdW50byBkZSB2YWxvcmVzIHF1ZSBhYmFyY2EsIHVuYSBwYXJ0ZSBzZSBpbnRlZ3JhIHBvciB1biAqKk1hcmdlbiBkZSBFcnJvcioqIChNRSkgZW4gdG9ybm8gYWwgdmFsb3IgcHVudHVhbCBkZWwgKiplc3RhZMOtc3RpY28gcHVudHVhbCoqLiAgWSBkZSBsYSB1bmnDs24gZGUgYW1ib3MgKE1FIHkgZXN0YWTDrXN0aWNvIHB1bnR1YWwsIHBvciBlai4gbGEgbWVkaWEsIG1lZGlhbmEgbyBwcm9wb3JjacOzbiksIHNlIGN1ZW50YSBjb24gdW4gKipOaXZlbCBkZSBDb25maWFuemEqKiBxdWUgcGVybWl0ZSBpbmZlcmlyIHF1ZSBlbiBzdSBpbnRlcmlvciBzZSBjb250ZW5kcsOhIGFsIHBhcsOhbWV0cm8gZGUgaW50ZXLDqXMuCgpEZWJpZG8gYSBsYSBuYXR1cmFsZXMgZGVsIElDICh1biByYW5nbyksIGVzdGUgcGVybWl0ZSBpbmNsdWlyIGVuIHN1IGludGVyaW9yIGEgdW4gY29uanVudG8gZGUgcHJvYmFiaWxpZGFkZXMgYXNvY2lhZGFzIGEgbG9zIHZhbG9yZXMgcHVudHVhbGVzIHF1ZSBsbyBpbnRlZ3Jhbi4gRXN0byBhdW1lbnRhIGxhIHByb2JhYmlsaWRhZCBkZSwgYSBzdSB2ZXosIGluZmVyaXIgZWwgdmFsb3IgZGVsIHBhcsOhbWV0cm8gZGUgaW50ZXLDqXMgYSBkaWZlcmVuY2lhIGRlIGxhIHTDqWNuaWNhIGRlIGVzdGltYWNpw7NuIHB1bnR1YWwuCgpGw7NybXVsYSBkZSB1biBJQyBhIHBhcnRpciBkZWwgZXN0YWTDrXN0aWNvIHB1bnR1YWwgZGUgbGEgKm1lZGlhKiBkZSB1bmEgbXVlc3RyYToKJCQgXGJhcnt4fSBccG0gTUUgJCQKClBvciBzdSBwYXJ0ZSwgZWwgKipNRSoqIHNlIGNvbnN0cnV5ZSBhIHBhcnRpciBkZSBkb3MgZWxlbWVudG9zOiAKCiAgaS4gVW4gKk5pdmVsIGRlIENvbmZpYW56YSogKGRlZmluaWRvIGVuIHVuaWRhZGVzICRaJCkgcXVlIHNlIGNvcnJlc3BvbmRlIGNvbiBsYSBwcm9wb3JjacOzbiBvIHByb2JhYmlsaWRhZCBxdWUgZWwgYW5hbGlzdGEgY29uc2lkZXJhIChhcmJpdHJhcmlhbWVudGUpIHBlcnRpbmVudGUgcGFyYSBhY2VwdGFyIHF1ZSBlbiBlbCByYW5nbyBkZSBpbnRlcsOpcyBzZSBpbmNsdXllIGFsIHBhcsOhbWV0cm8gZGUgaW50ZXLDqXMgeSwgYWRlbcOhcywgZnVlcmEgZGUgZWxsbyBzZSBlbmN1ZW50cmEgZWwgdGFtYcOxbyBkZSBlcnJvciBlc3BlcmFkbyB5IGFjZXB0YWRvLiAKICBpaS4gRWwgc2VndW5kbyBlbGVtZW50byBjb25zaXN0ZSBlbiBlbCAqRXJyb3IgRXN0w6FuZGFyKiAoRVMpLCBxdWUgc2UgcmVmaWVyZSBhIGxhIHZhcmlhY2nDs24gZGUgdW5hIG11ZXN0cmEgcmVzcGVjdG8gZGUgdW5hIGRpc3RyaWJ1Y2nDs24gbXVlc3RyYWwsIGRvbmRlIHNlIGFzdW1lIHF1ZSBsYXMgbXVlc3RyYXMgZGUgw6lzdGEgw7psdGltYSBzb24gZGVsIG1pc21vIHRhbWHDsW8gcXVlIGxhIHByaW1lcmEuCgpEb25kZSBlbCAqTUUqIGVzIGlndWFsIGE6ICQkTUUgPSB6XlxzdGFyIFxmcmFje3N9e1xzcXJ0e259fSQkCgpBIHBhcnRpciBkZSBsb3MgZWxlbWVudG9zIHF1ZSBpbnRlZ3JhbiBhbCAqKklDKio6IHVuICplc3RpbWFkb3IgcHVudHVhbCogZGUgaW50ZXLDqXMgcGFyYSBlbCBhbsOhbGlzaXMgZGVsIGNvbXBvcnRhbWllbnRvIGRlIHVuYSBwb2JsYWNpw7NuLCB1biAqTml2ZWwgZGUgQ29uZmlhbnphKiBkZWZpbmlkbyBwb3IgZWwgYW5hbGlzdGEgeSBlbCAqRXJyb3IgRXN0w6FuZGFyKiBkZSBsYSBtdWVzdHJhLCBzZSBjYWxjdWxhbiBkb3MgdmFsb3JlcyAqYWxlYXRvcmlvcyogcXVlIGRlZmluZW4gbG9zIGzDrW1pdGVzIGRlbCByYW5nbyBkZSB2YWxvcmVzIGRlbCBJQzogc3UgdmFsb3IgbcOtbmltbyB5IHN1IHZhbG9yIG3DoXhpbW8uCgpEZSBtYW5lcmEgcXVlIGVsIElDLCBjYWxjdWxhZG8gYSBwYXJ0aXIgZGVsIHZhbG9yIGRlIGxhIG1lZGlhIGRlIHVuYSBtdWVzdHJhLCBlcyBpZ3VhbCBhbCB2YWxvciBtw61uaW1vIHkgYWwgdmFsb3IgbcOheGltbyBkZXJpdmFkbyBkZTogJCRcYmFye3h9IFxwbSB6XlxzdGFyIFxmcmFje3N9e1xzcXJ0e259fSQkCgoKIyMjIDEuMS4gTXVlc3RyYSBlIEludGVydmFsb3MgZGUgQ29uZmlhbnphLgoKUGFyYSBjb21lbnphciBsYSBkZW1vc3RyYWNpw7NuIHNvYnJlIGxhIGNvbnN0cnVjY2nDs24gZGUgbG9zIElDIHkgc3UgdXRpbGlkYWQsIGEgY29udGludWFjacOzbiBzZSB0cmFiYWphcsOhIHNvYnJlIHVuYSBzdWJtdWVzdHJhIG9idGVuaWRhIGRlIGxhIGJhc2UgZGUgZGF0b3Mgc29icmUgcGFjaWVudGVzIGluZmVjdGFkb3MgY29uIENPVklELTE5IHF1ZSBlbGFib3LDsyBsYSBTZWNyZXRhcsOtYSBkZSBTYWx1ZCBkZWwgR29iaWVybm8gRmVkZXJhbCBkZSBNw6l4aWNvLiBFc3RvIGNvbiBlbCBmaW4gZGUgZXN0YWJsZWNlciwgcHJpbWVybywgcXVlIHVuIGFuYWxpc3RhIHN1ZWxlIHRyYWJhamFyIGNvbiBtdWVzdHJhcyBkZSBwb2JsYWNpb25lcyBlbiBsYSBncmFuIG1heW9yw61hIGRlIGxvcyBjYXNvcywgeSBlc3RvIHN1cG9uZSBxdWUsIHNlZ3VuZG8sIGNhZGEgbXVlc3RyYSBwdWVkZSBtb3N0cmFyIHZhcmlhY2lvbmVzIGVuIGN1YW50byBhIGxvcyB2YWxvcmVzIGNhbGN1bGFkb3MgcGFyYSB1biBtaXNtbyBlc3RhZMOtc3RpY28uIExvIHF1ZSBzdXBvbmUgdW4gcmV0byBwYXJhIGFwcm94aW1hcnNlIGFsIGVzdGltYXIgZWwgdmFsb3IgZGVsIHBhcsOhbWV0cm8gZGUgaW50ZXLDqXMgZW4gbGEgcG9ibGFjacOzbiAtZXN0byBlcyBsbyDDumx0aW1vIHF1ZSBzZSBkZXNlYSBjb25vY2VyIGVuIGxvcyBhbsOhbGlzaXMgY3VhbnRpdGF0aXZvcy4KCkEgY29udGludWFjacOzbiBzZSBjb21lbnphcsOhIGNvbiBsYSBjb25zdHJ1Y2Npw7NuIGRlIHVuYSBzdWJtdWVzdHJhLCBwYXJhIGxvIHF1ZSBzZSBkZWJlcsOhLCBpbmljaWFsbWVudGUsIGVzdGFibGVjZXIgZWwgdmFsb3IgZGUgImFycmFucXVlIiBvICJzZW1pbGxhIiBlbiBSLCB5IGEgcGFydGlyIGRlbCBxdWUgc2UgaW50ZWdyYXLDoW4gbG9zIGNhc29zIGFsZWF0b3JpYW1lbnRlLiBEZWZpbmlyIGRpY2hvIHZhbG9yIGluaWNpYWwgcGVybWl0ZSBxdWUgbG9zIGFuw6FsaXNpcyBzZWFuIHBvc3Rlcmlvcm1lbnRlIHJlcHJvZHVjaWJsZXMgeSBhcnJpYmVuIGFsIG1pc21vIHJlc3VsdGFkby4KCgojIyMjIDEuMS4xLiBJbnRlZ3JhY2nDs24gZGUgdW5hIG11ZXN0cmEgYWxlYXRvcmlhLgoKRGljaG8gdmFsb3IgInNlbWlsbGEiIGVzIHVuIG7Dum1lcm8gY29tcGxldGFtZW50ZSBhcmJpdHJhcmlvIHF1ZSBlcyBkZWZpbmlkbyBwb3IgZWwgYW5hbGlzdGEsIHkgc3UgdXRpbGlkYWQgZXN0w6EgZW4gZGVmaW5pciBlbCB2YWxvciBpbmljaWFsIHF1ZSBzZXJ2aXLDoSBwYXJhIGVsIHByb2Nlc28gZGUgYWxlYXRvcml6YWNpw7NuIHBvc3Rlcmlvci4gRXN0byBwZXJtaXRpcsOhIHF1ZSBsYXMgc3VibXVlc3RyYXMgcXVlIHNlIGNvbnN0cnV5ZW4sIHBvc3Rlcmlvcm1lbnRlLCByZWdpc3RyYXLDoW4gbG9zIG1pc21vcyBjYXNvcyB5IHZhbG9yZXMgZW50cmUgc8OtLgoKYGBge3Igc2VlZH0Kc2V0LnNlZWQoNTQzMjEpCmBgYAoKQSBwYXJ0aXIgZGUgbG9zIGRhdG9zIHNvYnJlIGxvcyBwYWNpZW50ZXMgaW5mZWN0YWRvcyBjb24gQ09WSUQtMTkgcXVlIGhhIGVsYWJvcmFkbyBsYSBTU0EgZGVsIGdvYmllcm5vIGZlZGVyYWwgbWV4aWNhbm8sIHNlIGRlYmVyw6EgaW50ZWdyYXIgdW5hIHN1Ym11ZXN0cmEgY29uIDEwLDAwMCBjYXNvcy4gUGFyYSBlbGxvIHNlIHVzYXLDoSBlbCBzY3JpcHQgYHNhbXBsZV9uICgpYCBkZSBsYSBwYXF1ZXRlcsOtYSBgZHBseXJgLCBwb3IgbG8gcXVlIGRlYmVyw6Egc2VyIGluc3RhbGFkYSBwcmV2aWFtZW50ZS4gRXN0YSBsaWJyZXLDrWEgc2UgaW5jbHV5ZSBkZW50cm8gZGVsIHBhcXVldGUgZGUgb3RyYSBsaWJyZXLDrWEgbcOhcyBhbXBsaWEsIHF1ZSBlcyBgdGlkeXZlcnNlKClgLgoKYGBge3Igc3VibXVlc3RyYX0Kbl9tdWVzdHJhIDwtIDEwMDAwICNvYmpldG8gcXVlIGRlZmluZSBlbCB0YW1hw7FvIGRlIGxhIG11ZXN0cmEKbXVlc3RyYSA8LSBzYW1wbGVfbihkYXRvc19jb3ZpZCwgbl9tdWVzdHJhKSAjc2NyaXB0IHBhcmEgaW50ZWdyYXIgbGEgbXVlc3RyYS4KYGBgCgpEZSBlc3RhIG1hbmVyYSwgZW4gZWwgcmVjdWFkcm8gZGVsICJhbWJpZW50ZSIgZGUgUiBTdHVkaW8gYWhvcmEgYXBhcmVjZW4gbnVldm9zIGRhdG9zIGNvbiBlbCBub21icmUgZGUgIm11ZXN0cmEiLCBxdWUgc2UgYWNhYmEgZGUgaW50ZWdyYXIgZGUgbWFuZXJhIGFsZWF0b3JpYS4KCgpQcmVndW50YToKRGVzY3JpYmUgbGEgZGlzdHJpYnVjacOzbiBkZSBsYSB2YXJpYWJsZSBFREFEIGVuIGxhIG11ZXN0cmEgcmVjacOpbiBpbnRlZ3JhZGEuIMK/Q3XDoWwgZXMgZWwgdmFsb3IgcHJvbWVkaW8geSBjdcOhbnRvIHNlIGRlc3bDrWFuIGVsIHJlc3RvIGRlIGxvcyBjYXNvcz8KCgojIyMjIDEuMS4yLiBFbGVtZW50b3MgZGVsIEludGVydmFsbyBkZSBDb25maWFuemEuCgpMb3MgdmFsb3JlcyBkZSBsb3MgZXN0YWTDrXN0aWNvcyBvYnRlbmlkb3MgZGUgdW5hIG11ZXN0cmEgc3VlbGVuIHNlciBudWVzdHJvICJtZWpvciIsIG8gZW4gb2Nhc2lvbmVzIGVsIMO6bmljbywgZXN0aW1hZG9yIHBhcmEgY29ub2NlciB1biBwYXLDoW1ldHJvIGRlIGludGVyw6lzIGVuIHVuYSBwb2JsYWNpw7NuLiBEZSBlc3RhIG1hbmVyYSwgYSBwYXJ0aXIgZGUgbGFzIGRpdmVyc2FzIHTDqWNuaWNhcyBkZSBsYSBlc3RhZMOtc3RpY2EgaW5mZXJlbmNpYWwsIGRpY2hvcyBlc3RhZMOtc3RpY29zIHNpcnZlbiBjb21vICplc3RpbWFkb3JlcyBwdW50dWFsZXMqIGRlbCBwYXLDoW1ldHJvIHBvYmxhY2lvbmFsLgoKUG9yIGVqZW1wbG8sIGVsIGVzdGFkw61zdGljbyBkZSBsYSBtZWRpYSAoJFxiYXJ7eH0kKSBkZSB1bmEgdmFyaWFibGUgZW4gdW5hIG11ZXN0cmEgbm9zIHBlcm1pdGUgYWNlcmNhcm5vcyBhbCB2YWxvciBkZSBsYSBtZWRpYSBlbiBsYSBwb2JsYWNpw7NuICgkXG11JCkuIFNpbiBlbWJhcmdvIGVsIHZhbG9yIGRlbCAqZXN0YWTDrXN0aWNvKiBzb2xvIHRpZW5lIGFzb2NpYWRvIHVuIHNvbG8gdmFsb3IgZGUgcHJvYmFiaWxpZGFkLCB5IGEgcGFydGlyIGRlIGNvbXBhcmFyIHN1IHZhbG9yIGNvcnJlc3BvbmRpZW50ZSBlbiB1bmEgZGlzdHJpYnVjacOzbiBtdWVzdHJhbCAoZWwgKmN1YW50aWwqIGNvcnJlc3BvbmRpZW50ZSBzZWfDum4gZWwgKmVzdGFkw61zdGljbyBkZSBwcnVlYmEqIHV0aWxpemFkbyBwYXJhIGV2YWx1YXIgc3UgKnBvc2ljacOzbiopIGNvbiByZXNwZWN0byBhbCAqdmFsb3IgY3LDrXRpY28qIGRldGVybWluYWRvIGEgcGFydGlyIGRlbCBtaXNtbyAqZXN0YWTDrXN0aWNvIGRlIHBydWViYSosIGVzIHF1ZSBzZSBwdWVkZSBkZXRlcm1pbmFyIHNpIGRpY2hvIHZhbG9yIG11ZXN0cmFsIHNlIGFwcm94aW1hIHByb2JhYmlsw61zdGljYW1lbnRlIGFsIHZhbG9yIHBvYmxhY2lvbmFsLgoKRXN0ZSBwcm9jZXNvIGRlIGNvbXBhcmFjacOzbiwgcXVlIHNlIGRlbm9taW5hICoqcHJ1ZWJhIGRlIHNpZ25pZmljYW5jaWEqKiwgc2UgcmVwb3J0YSBhIHBhcnRpciBkZSB1biBzb2xvIHZhbG9yIChxdWUgZW4gb2Nhc2lvbmVzIHNlIHJlZHVjZSBhbCAqcC12YWxvciogZGVsICp2YWxvciBvYnRlbmlkbyBvIGNhbGN1bGFkbyogZGVsIGVzdGFkw61zdGljbyBtdWVzdHJhbCksIHkgbm8gbmVjZXNhcmlhbWVudGUgcGVybWl0ZSBpZGVudGlmaWNhciBlbCB0YW1hw7FvIGRlIGxhIGluY2VydGlkdW1icmUgcXVlIGNvbnRpZW5lIGVsIHZhbG9yIGNhbGN1bGFkby4KCkxhIHV0aWxpZGFkIGRlIGxvcyBJQyByYWRpY2EgZW4gcXVlLCBwYXJ0aWVuZG8gZGUgdW4gKnB1bnRvIGRlIHJlZmVyZW5jaWEqIC1hIHBhcnRpciBkZWwgdmFsb3IgZGVsICplc3RhZMOtc3RpY28gZGUgaW50ZXLDqXMqLSBzZSBwdWVkZSBlc3RpbWFyIHVuICpyYW5nbyogZGUgdmFsb3JlcyBwb3NpYmxlcyBxdWUgcHVlZGUgYWRvcHRhciBlbCAqcGFyw6FtZXRybyBkZSBpbnRlcsOpcyogYSBsYSB2ZXogcXVlIHNlIGluY2x1eWUgZWwgZ3JhZG8gZGUgaW5jZXJ0aWR1bWJyZSBlbiBsYSBlc3RpbWFjacOzbiBtaXNtYS4gIERlIG1hbmVyYSBxdWUgZWwgSUMgb2ZyZWNlIG1heW9yIGluZm9ybWFjacOzbiBhbCBhbmFsaXN0YSBzb2JyZSBlbCBwcm9jZXNvIGRlIGVzdGltYWNpw7NuOiAKCiAgaS4gcHJlc2VudGEgZWwgdmFsb3IgZGUgZXN0aW1hY2nDs24gcHVudHVhbCB5LCAKICBpaS4gZWwgdGFtYcOxbyBkZSBpbmNlcnRpZHVtYnJlIGNvbnRlbmlkYSBlbiBsYSBlc3RpbWFjacOzbi4gCgpEaWNobyB0YW1hw7FvIGRlIGluY2VydGlkdW1icmUgY29udGVuaWRhIGVuIGVsIHJhbmdvIGVzdGFibGVjaWRvIHBvciBlbCBJQyB0YW1iacOpbiBwZXJtaXRlIGluY2x1aXIgdW5hIG1heW9yIGNhbnRpZGFkIGRlIHZhbG9yZXMgcG9zaWJsZXMgcXVlIHB1ZWRlIGFkb3B0YXIgZWwgcGFyw6FtZXRybyBkZSBpbnRlcsOpcyB5LCBhIHN1IHZleiwgaW5jb3Jwb3JhciB1bmEgY2FudGlkYWQgbWF5b3IgZGUgcHJvYmFiaWxpZGFkZXMgYXNvY2lhZGFzIGEgZXN0b3MgdmFsb3JlcyBwb3NpYmxlcy4KCkNvbW8gc2UgdmlvIGFycmliYSwgbG9zIGVsZW1lbnRvcyBxdWUgaW50ZWdyYW4gYSB1biBJQyBzb246IAoKICAxLiAqZXN0aW1hZG9yIHB1bnR1YWwqIHF1ZSBwdWVkZSBzZXIgYWxnw7puICptb21lbnRvKiBvICptZWRpZGEgZGUgdGVuZGVuY2lhIGNlbnRyYWwqIChtZWRpYSwgbWVkaWFuYSwgcHJvcG9yY2nDs24pLCAKICAyLiAqbWFyZ2VuIGRlIGVycm9yKiwgcXVlIHN1cG9uZSBsYSB2YXJpYWNpw7NuIHF1ZSBleGlzdGlyw6EgZW4gdG9ybm8gYWwgKmVzdGltYWRvciBwdW50dWFsKi4KCkVsICptYXJnZW4gZGUgZXJyb3IqIC1jb21vIHRhbWJpw6luIHNlIGRlc2NyaWJpw7MgYXJyaWJhLSBzZSBpbnRlZ3JhIGNvbiBkb3MgZWxlbWVudG9zOiAKCiAgaS4gZWwgKmVycm9yIGVzdMOhbmRhciBvIHTDrXBpY28qIGRlIGxhIG11ZXN0cmEgY29uIHJlc3BlY3RvIGEgbGEgZGlzdHJpYnVjacOzbiBtdWVzdHJhbCwgeSAKICBpaS4gZWwgKm5pdmVsIGRlIGNvbmZpYW56YSogZXN0YWJsZWNpZG8gcG9yIGVsIGFuYWxpc3RhIHByZXZpYW1lbnRlLCB5IHF1ZSBkZXBlbmRlIGRlbCB0aXBvIGRlICpkaXN0cmlidWNpw7NuIGRlIHByb2JhYmlsaWRhZGVzKiBkZWwgKmVzdGFkw61zdGljbyBkZSBwcnVlYmEqIHV0aWxpemFkbyBwYXJhIGVsIGFuw6FsaXNpcyAoJHosIHQsIEYsIFxjaGleMiwgciQpLgoKCiMjIyMjIDEuMS4yLjEuIEPDoWxjdWxvIGRlbCBlc3RpbWFkb3IgcHVudHVhbCBwYXJhIHVuYSB2YXJpYWJsZSBjb250aW51YS4KCkVuIGVsIGNhc28gZGUgdHJhYmFqYXIgY29uIHVuYSB2YXJpYWJsZSBkZWwgdGlwbyAqKmNvbnRpbnVhKiogeSBjb24gdW5hIGRpc3RyaWJ1Y2nDs24gcGFyZWNpZGEgYSB1bmEgKm5vcm1hbCosIGxhIG1lZGlhIHN1ZWxlIHNlciBlbCBlc3RpbWFkb3IgcHVudHVhbCBtw6FzIHBlcnRpbmVudGUuIFBhcmEgZWxsbyBzZSBjYWxjdWxhcsOhIGxhIG1lZGlhIGRlIGxhIHZhcmlhYmxlIEVEQUQgZGUgbG9zIHBhY2llbnRlcyBlbiBsYSBzdWJtdWVzdHJhIGNvbnN0cnVpZGEgcHJldmlhbWVudGUuCgpgYGB7ciBtZWRpYX0KeF9iYXJyYSA8LSBtZWFuKG11ZXN0cmEgJCBFREFEKQp4X2JhcnJhCmBgYAoKCiMjIyMjIDEuMS4yLjIuIERldGVybWluYWNpw7NuIGRlbCAqTml2ZWwgZGUgQ29uZmlhbnphKiB5IHN1IGN1YW50aWwgY29ycmVzcG9uZGllbnRlLgoKRWwgKipOaXZlbCBkZSBDb25maWFuemEqKiBlcyB1bmEgcHJvcG9yY2nDs24gZGVmaW5pZGEgcHJldmlhbWVudGUgcG9yIGVsIGFuYWxpc3RhLCBtZWRpYW50ZSBsYSBxdWUgZGVmaW5lIGN1w6FsIGVzIGVsIHBvcmNlbnRhamUgZGUgY2Fzb3MsIHkgcHJvYmFiaWxpZGFkZXMsIHF1ZSBkZXNlYSBpbmNsdWlyIGVuIGVsIHJhbmdvIGRlIHZhbG9yZXMgcXVlIGJ1c2NhIGVzdGltYXIuIEVzdGUgbml2ZWwgZGUgY29uZmlhbnphIHNlIGRldGVybWluYSBhIHBhcnRpciBkZSBpZGVudGlmaWNhciBlbCAqdmFsb3IgY3LDrXRpY28qIGFzb2NpYWRvIGFsICpOaXZlbCBkZSBDb25maWFuemEqIGRlc2VhZG8uIFBhcmEgZWxsbyBzZSB1dGlsaXphcsOhIGVsIHNjcmlwdCBgcW5vcm0oKWAuCgpFbCAqKk5pdmVsIGRlIENvbmZpYW56YSoqIG5vIGVzIGxvIG1pc21vIHF1ZSB1biAqcGVyY2VudGlsKiBhbCBtb21lbnRvIGRlIGRlZmluaXIgZWwgKnZhbG9yIGNyw610aWNvKiBkZWwgSUMuIEVsICpwZXJjZW50aWwqIHNlIHJlZmllcmUgYWwgYWN1bXVsYWRvIGRlIHByb2JhYmlsaWRhZGVzIHViaWNhZG9zIGEgbGEgaXpxdWllcmRhIGRlbCAqdmFsb3IgY3LDrXRpY28qIG1pZW50cmFzIHF1ZSBlbCAqKk5pdmVsIGRlIENvbmZpYW56YSoqIGRlZmluZSBlbCB0YW1hw7FvIGRlbCByYW5nbyBkZSB2YWxvcmVzLCB5IHN1cyBwcm9iYWJpbGlkYWRlcyBhc29jaWFkYXMsIGVuIHRvcm5vIGEgKGEgc3UgaXpxdWllcmRhIHkgZGVyZWNoYSkgZGVsICplc3RpbWFkb3IgcHVudHVhbCogc2VsZWNjaW9uYWRvLiBEZSBtYW5lcmEgcXVlIGVsICoqTml2ZWwgZGUgQ29uZmlhbnphKiogc2UgcmVmaWVyZSBhIHVuIHBvcmNlbnRhamUgZGUgY2Fzb3MgdWJpY2Fkb3MgYWwgY2VudHJvIGRlIGxhIGRpc3RyaWJ1Y2nDs24uCgpQb3IgZWplbXBsbywgdW4gKipOaXZlbCBkZSBDb25maWFuemEqKiBkZWwgOTUlIHNlIHJlZmllcmUgYWwgOTUlIGRlIGxvcyBjYXNvcyB1YmljYWRvcyBlbiB0b3JubyBhbCBjZW50cm8gZGUgbGEgZGlzdHJpYnVjacOzbiwgbWllbnRyYXMgcXVlIHVuIHZhbG9yIGNyw610aWNvIGFzb2NpYWRvIGNvbiBlc3RhIMOhcmVhIHNlIGNvcnJlc3BvbmRlIGNvbiBlbCBwZXJjZW50aWwgMC45NzUgcHVlcyBhIGxhIGRlcmVjaGEgZGUgZGljaG8gdmFsb3IgY3LDrXRpY28gcXVlZGFyw6EgZWwgMi41JSBkZSBsb3MgY2Fzb3MgeSwgc2ltw6l0cmljYW1lbnRlLCBxdWVkYXLDoSBlbCAyLjUlIGEgbGEgaXpxdWllcmRhIGRlIGxhIGRpc3RyaWJ1Y2nDs24uIEVuIHRvdGFsLCBsYSBzdW1hIGRlIGVzdG9zIHZhbG9yZXMgZXh0cmVtb3Mgc2Vyw6EgZGUgNSUgbyB1bmEgcHJvcG9yY2nDs24gZGUgMC4wNSAoYWxmYSkuCgpMYSBtYW5lcmEgZGUgaWRlbnRpZmljYXIgZWwgdmFsb3IgZGVsIGN1YW50aWwgY29ycmVzcG9uZGllbnRlIGEgdW4gKipOaXZlbCBkZSBDb25maWFuemEqKiBkZWwgOTUlIHBhcmEgZWwgSUMgZXMgbGEgc2lndWllbnRlOgoKYGBge3IgY3VhbnRpbF85NzV9CnpfOTUgPC0gcW5vcm0oMC45NzUpICNzZSB1c2EgbGEgcHJvcG9yY2nDs24gMC45NzUgcG9yIHF1ZSBhIHN1IGRlcmVjaGEgc2UgZXhjbHV5ZSBhbCAwLjAyNSBkZSBsb3MgY2Fzb3MgeSwgZGUgbWFuZXJhIHNpbcOpdHJpY2EgdGFtYmnDqW4gc2UgZXhjbHVpcsOhIGFsIDAuMDI1IGRlIGxvcyBjYXNvcyBhIGxhIGl6cXVpZXJkYSBkZWwgcmFuZ28uCnpfOTUgI3VuaWRhZGVzIGRlIGRlc3ZpYWNpw7NuIGVzdMOhbmRhciBvICJaIgpgYGAKCkVuIGVsIGNhc28gZGUgdHJhYmFqYXIgY29uIHVuICoqTml2ZWwgZGUgQ29uZmlhbnphKiogZGVsIDk5JSwgc2UgcmVmaWVyZSBhbCA5OSUgZGUgbG9zIGNhc29zIHViaWNhZG9zIGVuIHRvcm5vIGFsIGNlbnRybyBkZSBsYSBkaXN0cmlidWNpw7NuLCB5IHN1IHZhbG9yIGNyw610aWNvIGNvcnJlc3BvbmRpZW50ZSBjb25zaXN0ZSBlbiBlbCBwZXJjZW50aWwgMC45OTUgcHVlcyBhIGxhIGRlcmVjaGEgZGUgZGljaG8gdmFsb3IgY3LDrXRpY28gcXVlZGFyw6EgZWwgMC41JSBkZSBsb3MgY2Fzb3MgeSwgc2ltw6l0cmljYW1lbnRlLCBxdWVkYXLDoSBlbCAwLjUlIGEgbGEgaXpxdWllcmRhIGRlIGxhIGRpc3RyaWJ1Y2nDs24uIEVuIHRvcmFsLCBsYSBzdW1hIGRlIGVzdG9zIHZhbG9yZXMgZXh0cmVtb3Mgc2Vyw6EgZGUgMSUgbyB1bmEgcHJvcG9yY2nDs24gZGUgMC4wMSAoYWxmYSkuCgpgYGB7ciBjdWFudGlsXzk5NX0Kel85OSA8LSBxbm9ybSgwLjk5NSkgI3NlIHVzYSBsYSBwcm9wb3JjacOzbiAwLjk3NSBwb3IgcXVlIGEgc3UgZGVyZWNoYSBzZSBleGNsdXllIGFsIDAuMDI1IGRlIGxvcyBjYXNvcyB5LCBkZSBtYW5lcmEgc2ltw6l0cmljYSB0YW1iacOpbiBzZSBleGNsdWlyw6EgYWwgMC4wMjUgZGUgbG9zIGNhc29zIGEgbGEgaXpxdWllcmRhIGRlbCByYW5nby4Kel85OSAjdW5pZGFkZXMgZGUgZGVzdmlhY2nDs24gZXN0w6FuZGFyIG8gIloiCmBgYAoKCiMjIyMjIDEuMS4yLjMuIEPDoWxjdWxvIGRlbCAqRXJyb3IgRXN0w6FuZGFyKiBkZSBsYSBtdWVzdHJhLgoKRWwgKiplcnJvciBlc3TDoW5kYXIqKiBwZXJtaXRlIGlkZW50aWZpY2FyIGxhIHZhcmlhY2nDs24gcXVlIGV4aXN0ZSBlbiBsYSBtdWVzdHJhIGFuYWxpemFkYSBjb24gcmVzcGVjdG8gZGUgbGEgKmRpc3RyaWJ1Y2nDs24gbXVlc3RyYWwqIGRlIG90cmFzIG11ZXN0cmFzIChoaXBvdMOpdGljYXMpIGRlbCBtaXNtbyB0YW1hw7FvICgkbiQpIHF1ZSBsYSBtdWVzdHJhIG9yaWdpbmFsLiBFc3RlIHZhbG9yIGF5dWRhIGEgZXN0YWJsZWNlciBzaSBlbCBlc3RpbWFkb3IgdXRpbGl6YWRvICgkXGJhcnt4fSQpIGVzIHVuIGJ1ZW4gZXN0aW1hZG9yIHBhcmEgYWNlcmNhcnNlIGFsIHBhcsOhbWV0cm8gcG9ibGFjaW9uYWwgZGUgaW50ZXLDqXMuCgpMYSBtYW5lcmEgZGUgY2FsY3VsYXIgZWwgKiplcnJvciBlc3TDoW5kYXIqKiBjb25zaXN0ZSBlbiBkaXZpZGlyIGxhICpkZXN2aWFjacOzbiBlc3TDoW5kYXIqIGRlIGxhIHZhcmlhYmxlIGFuYWxpemFkYSBlbnRyZSBsYSByYcOteiBjdWFkcmFkYSBkZWwgdGFtYcOxbyBkZSBsYSBtdWVzdHJhIHV0aWxpemFkYSAoJFxmcmFje3N9e1xzcXJ0e259fSQpLgoKYGBge3IgZXJyb3Jfc3RkfQplcnJvcl9zdGQ8LShzZChtdWVzdHJhJEVEQUQpIC8gI2Rlc3ZpYWNpw7NuIGVzdMOhbmRhciBkZSBsYSB2YXJpYWJsZSBFREFEIGVuIGxhIG11ZXN0cmEKICAgICAgICAgICAgICBzcXJ0KG5fbXVlc3RyYSkpICNyYcOteiBjdWFkcmFkYSBkZWwgdGFtYcOxbyBkZSBsYSBtdWVzdHJhCmVycm9yX3N0ZApgYGAKCk90cmEgbWFuZXJhIGRlIGNhbGN1bGFyIGVsIEVycm9yIEVzdMOhbmRhciBiYWpvIGxhIGxpYmVyYXLDrWEgYERlc2NUb29scygpYCBlczoKCmBgYHtyfQpTRSA8LSBNZWFuU0UobXVlc3RyYSAkIEVEQUQsIHNkID0gTlVMTCwgbmEucm0gPSBUUlVFKQpTRQpgYGAKCgojIyMgMS4yLiBJbnRlZ3JhY2nDs24gZGVsIEludGVydmFsbyBkZSBDb25maWFuemEgYSBwYXJ0aXIgZGUgbGEgbWVkaWEuCgpVbmEgdmV6IGNhbGN1bGFkb3MgbG9zIGVsZW1lbnRvcyBkZWwgSUMsIHNlIHB1ZWRlIGludGVncmFyIGVsIHJhbmdvIGRlIHZhbG9yZXMgcXVlIGxvIGludGVncmFyw6FuLiBEZWJpZG8gYSBxdWUgZWwgSUMgZXMgdW4gKnJhbmdvKiwgZXN0ZSBzZSBkZWZpbmUgcG9yIGRvcyAqdmFsb3JlcyBhbGVhdG9yaW9zKjogCgogIGkuIGVsICpsw61taXRlIGluZmVyaW9yKiBjb24gdW4gKipOaXZlbCBkZSBDb25maWFuemEqKiBkZWwgOTUlLCBzZSBwdWVkZW4gY2FsY3VsYXIgbWFudWFsbWVudGUgZGUgbGEgc2lndWllbnRlIGZvcm1hOgoKYGBge3IgbGltX2luZn0KbGltX2luZiA8LSB4X2JhcnJhIC0gKHpfOTUgKiBlcnJvcl9zdGQpCmxpbV9pbmYKYGBgCgogIGlpLiBMYSBtYW5lcmEgZGUgY2FsY3VsYXIgZWwgbMOtbWl0ZSBzdXBlcmlvciBjb24gdW4gKipOaXZlbCBkZSBDb25maWFuemEqKiBkZWwgOTUlIGVzOgoKYGBge3IgbGltX3N1cH0KbGltX3N1cCA8LSB4X2JhcnJhICsgKHpfOTUgKiBlcnJvcl9zdGQpCmxpbV9zdXAKYGBgCgogIGlpaS4gSW50ZWdyYWNpw7NuIGRlbCAqKkludGVydmFsbyBkZSBDb25maWFuemEqKjoKCkEgcGFydGlyIGRlIGFtYm9zIGzDrW1pdGVzIGNhbGN1bGFkb3Mgc2UgcHVlZGUgZXN0YWJsZWNlciBxdWUgZWwgcmFuZ28gZGUgdmFsb3JlcyBkZW50cm8gZGVsIHF1ZSBzZSBlc3BlcmEgcXVlIHNlIGVuY3VlbnRyZSBsYSBtZWRpYSBkZSBlZGFkIHBhcmEgbGEgcG9ibGFjacOzbiBkZSBpbnRlcsOpcyBzZSB1YmlxdWUgZW50cmUgZWwgbMOtbWl0ZSBpbmZlcmlvciBkZSBgciBsaW1faW5mYCB5IGVsIGzDrW1pdGUgc3VwZXJpb3IgY2FsY3VsYWRvIGRlIGByIGxpbV9zdXBgLCBjb24gdW4gKipOaXZlbCBkZSBDb25maWFuemEqKiBkZWwgOTUlLgoKT3RyYSBtYW5lcmEgZGUgY2FsY3VsYXIgdW4gSUMgZXMgYSBwYXJ0aXIgZGVsIHNjcmlwdCBgTWVhbkNJKClgcXVlIGVzIHBhcnRlIGRlIGxhIGxpYnJlcsOtYSBgRGVzY1Rvb2xzYDsgcGFyYSBlbGxvIHNlIGRlYmUgY2FyZ2FyIGVzdGEgw7psdGltYSBsaWJyZXLDrWEgeSBjb3JyZXIgZWwgc2NyaXB0IHBvc3Rlcmlvcm1lbnRlLgoKYGBge3IgSUN9CklDX0VEQUQgPC0gTWVhbkNJKHggPSBtdWVzdHJhICQgRURBRCwgIyBWYXJpYWJsZSBkZSBsYSBxdWUgc2UgY2FsY3VsYSBzdSBtZWRpYSAoZXN0aW1hZG9yIHB1bnR1YWwpCiAgICAgICAgICAgICAgICAgIGNvbmYubGV2ZWwgPSAwLjk1LCAjIE5pdmVsIGRlIGNvbmZpYW56YQogICAgICAgICAgICAgICAgICBuYS5ybSA9IEZBTFNFKSAjIEFyZ3VtZW50byBwYXJhIHJlbW92ZXIgbG9zIHZhbG9yZXMgcGVyZGlkb3MKSUNfRURBRApgYGAKCgpDb24gZWwgZmluIGRlIGV2YWx1YXIgbGEgcGVydGluZW5jaWEgZGVsIElDIGNvbnN0cnVpZG8sIHNlIHB1ZWRlIGNvbXBhcmFyIGNvbiBsb3MgZGF0b3Mgb3JpZ2luYWxlcywgc3Vwb25pZW5kbyBxdWUgc29uIGxvcyBkYXRvcyBkZSB1bmEgcG9ibGFjacOzbiBlbnRlcmEuIFBhcmEgZWxsbyBzZSBjYWxjdWxhIGVsIHZhbG9yIGRlIGxhIG1lZGlhIHBvYmxhY2lvbmFsIHBhcmEgZGV0ZXJtaW5hciBzaSBlbCBJQyBjb25zdHJ1aWRvIGxvZ3JhIGNhcHR1cmFyIGRpY2hvIHBhcsOhbWV0cm8uIEVzdGUgdmFsb3Igc2UgZGViZXLDoSBndWFyZGFyIGNvbW8gdW4gb2JqZXRvIGBwYXJhbWAsIHkgc2UgbGUgZGVub21pbmFyw6EgYG11YC4KCgpgYGB7ciBwb2JfbWVhbn0KcGFyYW0gPC0gZGF0b3NfY292aWQgJT4lCiAgc3VtbWFyaXNlKG11ID0gbWVhbihFREFEKSkKcGFyYW0KYGBgCgpQcmVndW50YToKwr9FbCBJQyBjb25zdHJ1aWRvIGxvZ3JhIGNhcHR1cmFyIGVsIHByb21lZGlvIGRlIGVkYWQgZGUgbG9zIHBhY2llbnRlcyBlbiBsYSBwb2JsYWNpw7NuIGVuIE3DqXhpY28/CgoKIyMjIDEuMy4gTml2ZWxlcyBkZSBjb25maWFuemEuCgpBIHBhcnRpciBkZWwgdXNvIGRlIFIgeSBzdXMgaGVycmFtaWVudGFzIHNlIHB1ZWRlbiBjb25zdHJ1aXIgZGl2ZXJzYXMgbXVlc3RyYXMgYWxlYXRvcmlhcyBwYXJhLCB0YW1iacOpbiwgZW50ZW5kZXIgbGEgbWFuZXJhIGVuIHF1ZSBwdWVkZW4gdmFyaWFyIGxvcyB2YWxvcmVzIGRlIGxhIG1lZGlhIHkgbG9zIElDIGVudHJlIHPDrS4KCkxvcyBwYXNvcyBiw6FzaWNvcyBhIHNlZ3VpciBzb246CgogICogQ29uc3RydWlyIHVuYSBtdWVzdHJhLgogICogQ2FsY3VsYXIgbGEgbXVlc3RyYSB5IGxhIGRlc3ZpYWNpw7NuIGVzdMOhbmRhciBwYXJhIGRpY2hhIG11ZXN0cmEgeSBndWFyZGFybGFzIHBhcmEgY2FsY3VsYXIsIHBvc3Rlcmlvcm1lbnRlLCBsb3MgbMOtbWl0ZXMgaW5mZXJpb3IgeSBzdXBlcmlvciBkZSBsb3MgSUMuCiAgKiBSZXBldGlyIGVzdG9zIDUwIHZlY2VzLgoKUGFyYSBsbGV2YXJsbyBhIGNhYm8gc2UgdXNhIGVsIHNjcmlwdCBgcmVwX3NhbXBsZV9uYCBwYXJhIGNvbnN0cnVpciA1MCBtdWVzdHJhcyBhbGVhdG9yaWFzIGRlIHRhbWHDsW8gYG4gPSA2MGAgZGUgdW5hIHBvYmxhY2nDs24geSwgcG9zdGVyaW9ybWVudGUsIHNlIGNhbGN1bGFyw6FuIGxvcyBsw61taXRlcyBpbmZlcmlvcmVzIHkgc3VwZXJpb3JlcyBkZSBsb3MgSUMuIENvbiBsYSBzaWd1aWVudGUgZsOzcm11bGEgc2UgcHVlZGUgYWN0aXZhciBkaWNoYSBmdW5jacOzbi4KCmBgYHtyIGNhbGN1bGF0ZV81MF9jaXN9CnJlcF9zYW1wbGVfbiA8LSBmdW5jdGlvbih0YmwsIHNpemUsIHJlcGxhY2UgPSBGQUxTRSwgcmVwcyA9IDEpCnsKICBuIDwtIG5yb3codGJsKQogIGkgPC0gdW5saXN0KHJlcGxpY2F0ZShyZXBzLCBzYW1wbGUuaW50KG4sIHNpemUsIHJlcGxhY2UgPSByZXBsYWNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgc2ltcGxpZnkgPSBGQUxTRSkpCiAgcmVwX3RibCA8LSBjYmluZChyZXBsaWNhdGUgPSByZXAoMTpyZXBzLHJlcChzaXplLHJlcHMpKSwgdGJsW2ksXSkKICBkcGx5cjo6Z3JvdXBfYnkocmVwX3RibCwgcmVwbGljYXRlKQp9ICNBY3RpdmFjacOzbiBkZSBsYSBmdW5jacOzbiAicmVwX3NhbXBsZV9uKCkiCgpzZXQuc2VlZCgxMjM0KQpjaSA8LSBkYXRvc19jb3ZpZCAlPiUgCiAgcmVwX3NhbXBsZV9uKHNpemUgPSA2MCwgcmVwcyA9IDUwLCByZXBsYWNlID0gVFJVRSkgIyNjcmVhY2nDs24gZGUgNTAgbXVlc3RyYXMgZGUgbiA9IDYwLCBlc3RvIGRhIHVuIHRhbWHDsW8gZGUgbXVlc3RyYSBkZSAzMDAwICg9IDYwIGNhc29zIHggNTAgbXVlc3RyYXMpCmBgYAoKQWhvcmEgc2UgY2FsY3VsYW4gbG9zIGzDrW1pdGVzIGluZmVyaW9yIHkgc3VwZXJpb3IgZGUgY2FkYSB1bmEgZGUgbGFzIDUwIG11ZXN0cmFzIHBhcmEsIGFzw60sIGNvbnN0cnVpciBzdXMgSW50ZXJ2YWxvcyBkZSBDb25maWFuemEgcmVzcGVjdGl2b3M6CgpgYGB7ciBJQ181MF9tdWVzdHJhc30KY2kgPC0gY2kgJT4lICNFc3RhIG9wY2nDs24gc2Vydmlyw6EgcGFyYSBndWFyZGFyIGEgbG9zIElDIGNvbW8gdW4gbnVldm8gb2JqZXRvIGRlIGZvcm1hdG8gJ3RhYmxhJwogIHN1bW1hcmlzZShsaW1faW5mZXJpb3I9bWVhbihFREFEKSAtICh6Xzk1KihzZChFREFEKSAvIHNxcnQoMzAwMCkpKSwgI2zDrW1pdGUgaW5mZXJpb3IKICAgICAgICAgICAgbGltX3N1cGVyaW9yPW1lYW4oRURBRCkgKyAoel85NSooc2QoRURBRCkgLyBzcXJ0KDMwMDApKSkpICNsw61taXRlIHN1cGVyaW9yCmBgYAoKCkFob3JhIHNlIHB1ZWRlIGhhY2VyIHVuYSByZXZpc2nDs24gInLDoXBpZGEiIGEgbG9zIHByaW1lcm9zIGNpbmNvIElDOgoKYGBge3IgZmlyc3RfZml2ZV9pbnRlcnZhbHN9CmNpICU+JQogIHNsaWNlKDE6NSkKYGBgCgoKQSBwYXJ0aXIgZGVsIG9iamV0byBxdWUgcmXDum5lIGxvcyBsw61taXRlcyBpbmZlcmlvcmVzIHkgc3VwZXJpb3JlcyBkZSBJQyBwYXJhIDUwIG11ZXN0cmFzIHNlIHB1ZWRlIGNyZWFyIHVuYSBncsOhZmljYSBxdWUgYXl1ZGUgYSBzdSB2aXN1YWxpemFjacOzbiB5IGNvbXBhcmFjacOzbi4KCkVsIHByaW1lciBwYXNvIHBhcmEgbGEgY29uc3RydWNjacOzbiBkZSBkaWNoYSBncsOhZmljYSBjb25zaXN0ZSBlbiBjcmVhciB1bmEgdmFyaWFibGUgbnVldmEgZW4gZWwgb2JqZXRvIGBjaWAgcmVjacOpbiBjcmVhZG8sIHF1ZSBpbmRpcXVlIHNpIGVsIGludGVydmFsbyBjYXB0dXJhIG8gbm8gYSBsYSBtZWRpYSBwb2JsYWNpb25hbC4gSGF5IHF1ZSBub3RhciBxdWUgImNhcHR1cmFyIiBkaWNobyB2YWxvciBzaWduaWZpY2EgcXVlIGVsIGzDrW1pdGUgaW5mZXJpb3IgZGVsIElDIHNlIHViaWNhcsOhIHBvciBkZWJham8gZGVsIHZhbG9yIGRlbCBwYXLDoW1ldHJvIHkgZWwgbMOtbWl0ZSBzdXBlcmlvciBkZWwgSUMgc2UgZW5jb250cmFyw6EgcG9yIGFycmliYSBkZSBkaWNobyB2YWxvciBwb2JsYWNpb25hbC4KClBhcmEgY3JlYXIgbGEgdmFyaWFibGUgbnVldmEgc2UgdXNhcsOhIGVsIHNjcmlwdCBgbXV0YXRlKClgIGRlIGxhIGxpYnJlcsOtYSBgZHBseXJgLgoKCmBgYHtyIGNhcHR1cmFfbXV9CmNpIDwtIGNpICU+JQogIG11dGF0ZShjYXB0dXJhX211ID0gaWZlbHNlKGxpbV9pbmZlcmlvciA8IHBhcmFtICQgbXUgJiBsaW1fc3VwZXJpb3IgPiBwYXJhbSAkIG11LCAic2kiLCAibm8iKSkKYGBgCgpWaXN0YXpvIGEgbGFzIHByaW1lcmFzIGNpbmNvIGZpbGFzOgoKYGBge3Igc2xpY2VfY2l9CmNpICU+JQogIHNsaWNlKDE6NSkKYGBgCgpMYSBmdW5jacOzbiBgaWZlbHNlYCBlcyB1biBzY3JpcHQgYWx0ZXJuYXRpdm8gcGFyYSByZWFsaXphciBsYSB0cmFuc2Zvcm1hY2nDs24gZGUgdW5hIG51ZXZhIHZhcmlhYmxlIGEgcGFydGlyIGRlIHVuYSBwcmV2aWFtZW50ZSBleGlzdGVudGUuIERpY2hhIGZ1bmNpw7NuIHJlcXVpZXJlIHRyZXMgYXJndW1lbnRvczogZWwgcHJpbWVybyBjb25zaXN0ZSBlbiB1biBhcmd1bWVudG8gbMOzZ2ljbywgZWwgc2VndW5kbyBlcyBlbCB2YWxvciBkZXNlYWRvIHNpIGVsIGFyZ3VtZW50byBsw7NnaWNvIGNvcnJlc3BvbmRlIGEgdW4gcmVzdWx0YWRvIHZlcmRhZGVybyB5LCBlbCB0ZXJjZXIgYXJndW1lbnRvIGNvcnJlc3BvbmRlIGFsIG51ZXZvIHZhbG9yIHJlc2lkdWFsIHF1ZSBzZSBkZXNlYSBhc2lnbmFyIGVuIGNhc28gZGUgcXVlIGVsIGFyZ3VtZW50byBsw7NnaWNvIHNlYSB1biByZXN1bHRhZG8gZmFsc28uCgpBaG9yYSBzZSBjdWVudGEgY29uIGxhIGluZm9ybWFjacOzbiBuZWNlc2FyaWEgcGFyYSBjcmVhciBlbCBncsOhZmljbywgcGVybyBzZSBkZWJlbiByZSBvcmdhbml6YXIgbG9zIGRhdG9zIHBhcmEgZmFjaWxpdGFyIHN1IHZpc3VhbGl6YWNpw7NuLiBFc3BlY8OtZmljYW1lbnRlIHNlIG5lY2VzaXRhIG9yZ2FuaXphciBsb3MgZGF0b3MgZW4gdW4gbnVldm8gZGF0YSBmcmFtZSBkb25kZSBjYWRhIGZpbGEgbyByZW5nbMOzbiByZXByZXNlbnRlIHVuIGzDrW1pdGUsIGVuIGNvbnRyYXBvc2ljacOzbiBhIHVuIGludGVydmFsby4KCkRlIG1hbmVyYSBxdWUgc2UgZGVzZWFuIG1hbmlwdWxhciBlc3RvcyBkYXRvczoKCnwgcmVwbGljYXRlIHwgbGltX2luZmVyaW9yIHwgbGltX3N1cGVyaW9yIHwgY2FwdHVyYV9tdSB8Cnw6LS0tLS0tLS0tOnw6LS0tLS0tLS0tLS0tOnw6LS0tLS0tLS0tLS0tOnw6LS0tLS0tLS0tLTp8CnwgMSAgICAgICAgIHwgNDEuMjEwNDQgICAgIHwgNDEuOTU2MjMgICAgIHwgbm8gICAgICAgICB8CnwgMiAgICAgICAgIHwgNDYuOTM4MTMgICAgIHwgNDcuNTI4NTQgICAgIHwgbm8gICAgICAgICB8CnwgMyAgICAgICAgIHwgNDYuOTEzMTggICAgIHwgNDcuNTUzNDkgICAgIHwgbm8gICAgICAgICB8CgpQYXJhIHF1ZSBzZSByZSBvcmRlbmVuIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6Cgp8IGlkIHwgcmVwbGljYXRlIHwgdGlwbyAgICAgfCBsaW1pdGUgICB8IGNhcHR1cmFfbXUgfAp8Oi0tOnw6LS0tLS0tLS0tOnw6LS0tLS0tLS06fDotLS0tLS0tLTp8Oi0tLS0tLS0tLS06fAp8IDEgIHwgMSAgICAgICAgIHwgaW5mZXJpb3IgfCA0MS4yMTA0NCB8IG5vICAgICAgICAgfAp8IDIgIHwgMiAgICAgICAgIHwgaW5mZXJpb3IgfCA0Ni45MzgxMyB8IG5vICAgICAgICAgfAp8IDMgIHwgMyAgICAgICAgIHwgaW5mZXJpb3IgfCA0Ni45MTMxOCB8IG5vICAgICAgICAgfAp8IDQgIHwgMSAgICAgICAgIHwgc3VwZXJpb3IgfCA0MS45NTYyMyB8IG5vICAgICAgICAgfAp8IDUgIHwgMiAgICAgICAgIHwgc3VwZXJpb3IgfCA0Ny41Mjg1NCB8IG5vICAgICAgICAgfAp8IDYgIHwgMyAgICAgICAgIHwgc3VwZXJpb3IgfCA0Ny41NTM0OSB8IG5vICAgICAgICAgfAoKCkVzdG8gc2UgbG9ncmEgYSBwYXJ0aXIgZGVsIHNpZ3VpZW50ZSBzY3JpcHQ6CgpgYGB7ciBjaV9ncmFmaWNhfQpjaV9kYXRhIDwtIGdhdGhlcihjaSwgdHlwZSwgYm91bmQsIGxpbV9pbmZlcmlvciA6IGxpbV9zdXBlcmlvcikKYGBgCgoKRmluYWxtZW50ZSBzZSBjb25zdHJ1eWUgZWwgZ3LDoWZpY28gZGUgbG9zIElDIHVzYW5kbyBsYSBsaWJyZXLDrWEgYGdncGxvdGA6CgoKYGBge3IgZ3JhZmljYV9jaX0KZ2dwbG90KGRhdGEgPSBjaV9kYXRhLCBhZXMoeCA9IGJvdW5kLCB5ID0gcmVwbGljYXRlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSByZXBsaWNhdGUsIGNvbG9yID0gY2FwdHVyYV9tdSkpICsKICBnZW9tX3BvaW50KHNpemUgPSAyKSArICAjIGHDsWFkZSBwdW50b3MgYWwgZmluYWwgZGUgY2FkYSByZWN0YSwgZGUgdGFtYcOxbyA9IDIKICBnZW9tX2xpbmUoKSArICAgICAgICAgICAjIGNvbmVjdGEgbG9zIHB1bnRvcyBtZWRpYW50ZSBsw61uZWFzCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gcGFyYW0gJCBtdSwgY29sb3IgPSAiZGFya2dyYXkiKSAjIGRpYnVqYSB1bmEgbMOtbmVhIHZlcnRpY2FsIGVuIGVsIHZhbG9yIGRlbCBwYXLDoW1ldHJvICJtdSIKYGBgCgoKUHJlZ3VudGE6CgrCv0N1w6FsIHByb3BvcmNpw7NuIGRlIGxvcyBJQyBjb25zdHJ1aWRvcyBpbmNsdXllIGFsIHZhbG9yIGRlbCBwYXLDoW1ldHJvPwrCv0VzdGEgcHJvcG9yY2nDs24gZXMgZXhhY3RhbWVudGUgaWd1YWwgYWwgTml2ZWwgZGUgQ29uZmlhbnphIGRlIGxvcyBpbnRlcnZhbG9zPyBTaSBubyBsbyBlcywgZXhwbGljYSBsYXMgcmF6b25lcy4KCgojIyAyLiBJbnRlcnZhbG9zIGRlIGNvbmZpYW56YSBwYXJhIHVuYSBwcm9wb3JjacOzbi4KCkVuIGVsIGNhc28gZGUgdHJhYmFqYXIgY29uIHVuYSB2YXJpYWJsZSBjYXRlZ8OzcmljYSwgbGEgY29uc3RydWNjacOzbiBkZSB1biBJbnRlcnZhbG8gZGUgQ29uZmlhbnphIHNlIHJlYWxpemEgYSBwYXJ0aXIgZGUgbGEgcHJvcG9yY2nDs24gZGUgbGEgY2F0ZWdvcsOtYSBkZSBpbnRlcsOpcyBzb2JyZSBsYSBxdWUgc2UgZGVzZWEgcmVhbGl6YXIgbGEgZXN0aW1hY2nDs24gaGFjaWEgbGEgcG9ibGFjacOzbi4KClBhcmEgcmVhbGl6YXIgbGEgY29uc3RydWNjacOzbiBkZSBsb3MgSUMsIGEgY29udGludWFjacOzbiBzZSB1dGlsaXphcsOhIGxhIG1hdHJpeiBkZSBkYXRvcyBkZSBsYSBlbmN1ZXN0YSBMYXRpbm9iYXLDs21ldHJvLCBlbiBsYSBvbGEgcGFyYSBlbCBhw7FvIDIwMTggeSBxdWUgZXN0w6EgZGlzcG9uaWJsZSBlbiBzdSBww6FnaW5hIHdlYi4gW0xhdGlub2JhcsOzbWV0cm9dKDxodHRwczovL3d3dy5sYXRpbm9iYXJvbWV0cm8ub3JnL2xhdENvbnRlbnRzLmpzcD4pIEVzdGEgc2UgaW1wb3J0YSBkZXNkZSB1biBmb3JtYXRvICcuc2F2JyBwYXJhIGxvIHF1ZSBzZSB1dGlsaXphIGxhIGxpYnJlcsOtYSBgaGF2ZW4oKWAuCgpgYGB7ciBjYXJnYV9kYXRvc19sYn0KZGF0b3NfbGIgPC0gaGF2ZW46OnJlYWRfc2F2KCJ+L0Ryb3Bib3gvUi9MYXRpbm9iYXJvbWV0cm9fMjAxOF9Fc3BfU3Bzc192MjAxOTAzMDMuc2F2IikKYGBgCgpZIGFob3JhIHNlIHNvbGljaXRhbiBsYXMgZGltZW5zaW9uZXMgZGVsIGRhdGEgZnJhbWUgcGFyYSBjb25vY2VyIHN1IHRhbWHDsW86CmBgYHtyIGRpbV9sYn0KZGltKGRhdG9zX2xiKQpgYGAKCkRlIGVzdGEgbWFuZXJhIHNlIHNhYmUgcXVlIHNlIGN1ZW50YW4gY29uIDIwMjA0IGZpbGFzIHkgMzk1IGNvbHVtbmFzIG8gdmFyaWFibGVzLgoKQWRlbcOhcyBzZSBzb2xpY2l0YSB1biBsaXN0YWRvIGRlIGxvcyBub21icmVzIGRlIGxhIHZhcmlhYmxlcyBxdWUgaW50ZWdyYW4gYWwgZGF0YSBmcmFtZS4gQXF1w60gc2UgcGlkZSB1biB2aXN0YXpvIGEgbG9zIHByaW1lcm8gNiB2YWxvcmVzLCBkZSBsYXMgMzk1IGNvbHVtbmFzLgoKYGBge3J9CmhlYWQobmFtZXMoZGF0b3NfbGIpKQpgYGAKCkEgcGFydGlyIGRlIGVzdGUgbGlzdGFkbyBzZSBpZGVudGlmaWNhIHF1ZSBsb3Mgbm9tYnJlcyBkZSBsYXMgdmFyaWFibGVzIGVzdMOhbiBjb2RpZmljYWRvcywgeSBwYXJhIGNvbm9jZXIgc3VzIHNpZ25pZmljYWRvcyBzZSBkZWJlIGNvbnN1bHRhciBkZWwgKkxpYnJvIGRlIEPDs2RpZ29zKiBkZSBsYSBiYXNlIGRlIGRhdG9zLCBxdWUgdmllbmUgaW5jbHVpZG8gZW4gZWwgcGFxdWV0ZSBkZSBkYXRvcyBxdWUgc2UgZGVzY2FyZ2EgZGVzZGUgbGEgcMOhZ2luYSBkZSBMYXRpbm9iYXLDs21ldHJvLgoKRW4gZWwgbGlicm8gZGUgY8OzZGlnb3Mgc2UgcHVlZGUgb2JzZXJ2YXIgcXVlIGxhIG1heW9yw61hIGRlIGxhcyB2YXJpYWJsZXMgcXVlIGxhIGludGVncmFuIHNvbiBkZSB0aXBvIGNhdGVnw7NyaWNhcywgeSBhIHN1IHZleiBzZSByZWNvbm9jZSBxdWUgbm8gdG9kYXMgc29uIGRlIHRpcG8gKmJpbm9taWFsKiAoY3VlbnRhbiBjb24gc29sbyBkb3MgY2F0ZWdvcsOtYXMgbyB2YWxvcmVzIHBvc2libGVzKS4KCkFsIHJlYWxpemFyIGVsIGFuw6FsaXNpcyBwYXJhIGNhbGN1bGFyIGxvcyBJQyBzZSBkZWJlIHJlY29ub2NlciwgaW5pY2lhbG1lbnRlIGxhIGRpc3RyaWJ1Y2nDs24gZGUgbG9zIHZhbG9yZXMgY2F0ZWfDs3JpY29zIHF1ZSBpbnRlZ3JhbiBhIGNhZGEgdmFyaWFibGUuIEEgY29udGludWFjacOzbiBzZSByZWFsaXphIHVuIHByaW1lciBhY2VyY2FtaWVudG8gYSBsYSBleHBsb3JhY2nDs24gZGUgbGEgdmFyaWFibGUgKlAxMlNUR0JTKiBxdWUgY29ycmVzcG9uZGUgYWwgw610ZW0gZGUgKkFwb3lvIGEgbGEgRGVtb2NyYWNpYSosIHkgc3VzIHZhbG9yZXMgcG9zaWJsZXMgc29uIDMgY2F0ZWdvcsOtYXM6CgogIDEuIExhIGRlbW9jcmFjaWEgZXMgcHJlZmVyaWJsZSBhIGN1YWxxdWllciBvdHJhIGZvcm1hIGRlIGdvYmllcm5vLgogIDIuIEVuIGFsZ3VuYXMgY2lyY3Vuc3RhbmNpYXMsIHVuIGdvYmllcm5vIGF1dG9yaXRhcmlvIHB1ZWRlIHNlciBwcmVmZXJpYmxlLgogIDMuIEEgbGEgZ2VudGUgY29tbyB1bm8sIG5vcyBkYSBsbyBtaXNtbyB1biByZcyBZ2ltZW4gZGVtb2NyYcyBdGljbyBxdWUgdW5vIG5vIGRlbW9jcmHMgXRpY28uCgpUYWJsYSBkZSBmcmVjdWVuY2lhcyBhYnNvbHV0YXM6CgpgYGB7ciB0YWJsZV9sYn0KdGFibGUoZGF0b3NfbGIgJCBQMTJTVEdCUykKYGBgCgpUYWJsYSBkZSBmcmVjdWVuY2lhcyByZWxhdGl2YXM6CgpgYGB7ciBwcm9wX3RhYmxlX2xifQpwcm9wLnRhYmxlKHRhYmxlKGRhdG9zX2xiICQgUDEyU1RHQlMpKQpgYGAKCkxhIGxpYnJlcsOtYSBgRGVzY1Rvb2xzKClgIGN1ZW50YSBjb24gZGlzdGludGFzIGZ1bmNpb25lcyBwYXJhIGNvbnN0cnVpciBJQyBwYXJhIHZhcmlhYmxlcyBjYXRlZ8OzcmljYXMgKmJpbm9taW5hbGVzKiB5ICptdWx0aW5vbWlhbGVzKiBxdWUgZmFjaWxpdGFuIGVsIHRyYWJham8gYW5hbMOtdGljby4KCkVuIGVsIGNhc28gZGUgdW5hIHZhcmlhYmxlIGNhdGVnw7NyaWNhIGJpbm9taW5hbCwgZW4gZG9uZGUgc2UgZGVzZWEgZXN0aW1hciBlbCBJQyBwcmltZXJvIHNlIGRlYmUgaWRlbnRpZmljYXIgbGEgY2F0ZWdvcsOtYSBkZSBpbnRlcsOpcy4gRW4gZWwgY2FzbyBkZSBsYSB2YXJpYWJsZSBQMTJTVEdCUyBzZSBjb25zaWRlcmEgcXVlIGxhIGNhdGVnb3LDrWEgZGUgaW50ZXLDqXMgY29uc2lzdGUgZW4gYXF1ZWxsYSBjb2RpZmljYWRhIGNvbiBlbCB2YWxvciBkZSAiMSIsIHF1ZSBjb3JyZXNwb25kZSBhIGxhIGV0aXF1ZXRhICIxLi0gTGEgZGVtb2NyYWNpYSBlcyBwcmVmZXJpYmxlIGEgY3VhbHF1aWVyIG90cmEgZm9ybWEgZGUgZ29iaWVybm8uIgoKTGEgZnVuY2nDs24gcGFyYSBzb2xpY2l0YXIgZWwgSUMgcGFyYSBlc3RhIGNhdGVnb3LDrWEgZXM6CmBgYHtyIENJX2Jpbm9taWFsfQpCaW5vbUNJKHggPSA5NzIzLCAjZnJlY3VlbmNpYSBhYnNvbHV0YSBwYXJhIGxhIGNhdGVnb3LDrWEgZGUgaW50ZXLDqXMKICAgICAgICBuID0gMTgzMjcsI2Nhc29zIHbDoWxpZG9zCiAgICAgICAgY29uZi5sZXZlbCA9IDAuOTUsICNuaXZlbCBkZSBjb25maWFuemEKICAgICAgICBtZXRob2QgPSAiY2xvcHBlci1wZWFyc29uIikgIyNJbnRlcnZhbG8gZGUgY29uZmlhbnphIHBhcmEgdW5hIGNhdGVnb3LDrWEKYGBgCgpEZSBlc3RhIG1hbmVyYSBzZSBzYWJlIHF1ZSBsYSBwcm9wb3JjacOzbiBkZSBlbmN1ZXN0YWRvcyBxdWUgYXBveWFuIGEgbGEgZGVtb2NyYWNpYSBlcyBkZWwgNTMuMDUlIGVuIGxhIG11ZXN0cmEsIHkgZXN0YSBlcyBudWVzdHJhIG1lam9yIGVzdGltYWNpw7NuIHB1bnR1YWwgcGFyYSBlbCBhcG95byBhIGxhIGRlbW9jcmFjaWEgcXVlIHNlIGVzcGVyYSBlbmNvbnRyYXIgZW4gbGEgcG9ibGFjacOzbiBsYXRpbm9hbWVyaWNhbmEuIFBlcm8gdGFtYmnDqW4gc2UgZXNwZXJhLCBjb24gdW4gOTUlIGRlIGNvbmZpYW56YSwgcXVlIGVsIHByb21lZGlvIGRlIGxhIHBvYmxhY2nDs24gZGUgY2l1ZGFkYW5vcyBsYXRpbm9hbWVyaWNhbm9zIHF1ZSBhcG95YW4gYSBsYSBkZW1vY3JhY2lhIHNlIGVuY3VlbnRyZSBlbnRyZSB1biA1Mi4zMiUgeSA1My43NyUuCgpFbiBlbCBjYXNvIGRlIHVuYSB2YXJpYWJsZSBjYXRlZ8OzcmljYSBtdWx0aW5vbWlhbCwgbGEgbGlicmVyw61hIGBEZXNjVG9vbHMoKWB0YW1iacOpbiBjdWVudGEgY29uIHVuYSBmdW5jacOzbiBlc3BlY8OtZmljYSBwYXJhIGNhbGN1bGFyIGVsIElDIHBhcmEgY2FkYSB1bmEgZGUgbGFzIGRpdmVyc2FzIGNhdGVnb3LDrWFzLiBFc3RhIGZ1bmNpw7NuIGVzYE11bHRpbm9tQ0koeCA9LCBjb25mLmxldmVsID0sIHNpZGVzID0sIG1ldGhvZCA9KWAsIHkgc2UgYXBsaWNhcsOhIGEgbGFzIDMgY2F0ZWdvcsOtYXMgcXVlIGludGVncmFuIGEgbGEgdmFyaWFibGUgUDEyU1RHQlMKCmBgYHtyfQpvYnNlcnZhZG9zIDwtIGMoOTcyMywgMjk1MCwgNTY1NCkgI3NlIGNyZWEgdW4gb2JqZXRvIGNvbiBsYXMgZnJlY3VlbmNpYXMgYWJzb2x1dGFzIHBhcmEgbGFzIDMgY2F0ZWdvcsOtYXMKCk11bHRpbm9tQ0kob2JzZXJ2YWRvcywgI3NlIGxsYW1hIGFsIG9iamV0byBjb24gbGFzIGZyZWN1ZW5jaWFzIGFic29sdXRhcyBwYXJhIDMgY2F0ZWdvcsOtYXMKICAgICAgICAgICBjb25mLmxldmVsID0gMC45NSwgIyBkZWZpbmljacOzbiBkZWwgbml2ZWwgZGUgY29uZmlhbnphCiAgICAgICAgICAgbWV0aG9kID0gInNpc29uZ2xheiIpICMgbcOpdG9kbyBwYXJhIGVsIGPDoWxjdWxvIGRlbCBJQyBtdWx0aW5vbWlhbApgYGAKCgojIyAzLiBFamVyY2ljaW9zLgoxLiDCv0xhIGRpc3RyaWJ1Y2nDs24gZGUgbG9zIGRhdG9zIGVuIHVuYSBtdWVzdHJhIGFsZWF0b3JpYSBkZWJlbiBpZ3VhbGVzIGEgb3RyYXMgZGlzdHJpYnVjaW9uZXMgZW4gb3RyYXMgbXVlc3RyYXMgcXVlIHNlIHJlY29sZWN0YXJvbiBkZSBsYSBtaXNtYSBwb2JsYWNpw7NuOiBWZXJkYWRlcm8gbyBGYWxzbz8KCjIuIMK/UXXDqSBzaWduaWZpY2EgdW5hIGNvbmZpYW56YSBkZWwgOTUlPwphLiA5NSUgZGUgbGFzIHZlY2VzIGVsIHByb21lZGlvIGRlIGxhIHBvYmxhY2nDs24gc2UgZW5jb250cmFyw6EgZGVudHJvIGRlbCBpbnRlcnZhbG8uCmIuIDk1JSBkZSBsYXMgbXVlc3RyYXMgYWxlYXRvcmlhcyBkZWwgbWlzbW8gdGFtYcOxbyBnZW5lcmFyw6FuIElDIHF1ZSBjb250ZW5nYW4gYWwgdmFsb3IgdmVyZGFkZXJvIGRlIGxhIHBvYmxhY2nDs24uCmMuIDk1JSBkZSBsYSBwb2JsYWNpw7NuIHRlbmRyw6EgZWwgbWlzbW8gSUMuCmQuIFNlIGVzdMOhIDk1JSBjb25maWRlbnRlIGRlIHF1ZSBsYSBtZWRpYSBtdWVzdHJhbCBzZSBlbmN1ZW50cmEgZGVudHJvIGRlbCBJQy4KCjMuIMK/Q3XDoWwgZXMgZWwgdmFsb3IgY3LDrXRpY28gYXByb3BpYWRvIHBhcmEgdW4gTml2ZWwgZGUgQ29uZmlhbnphIGRlbCA5OSU/CmEuIDAuMDEgCmIuIDAuOTkgIApjLiAxLjk2IApkLiAyLjMzIAplLiAyLjU4IAoKNC4gQ2FsY3VsYSA1MCBJQyBjb24gdW4gTml2ZWwgZGUgQ29uZmlhbnphIGRlbCA5OSUuIE5vIHNlIG5lY2VzaXRhIGdlbmVyYXIgbnVldmFzIG11ZXN0cmFzLCBzb2xhbWVudGUgc2UgcmVxdWllcmUgY2FsY3VsYXIgbnVldm9zIElDIGJhc2Fkb3MgZW4gbGFzIG1lZGlhcyB5IGRlc3ZpYWNpb25lcyBlc3TDoW5kYXIgZGUgbGFzIG11ZXN0cmFzIHByZXZpYW1lbnRlIGdlbmVyYWRhcy4gR3JhZmljYSB0b2RvcyBsb3MgaW50ZXJ2YWxvcyB5IGNhbGN1bGEgbGEgcHJvcG9yY2nDs24gZGUgSUMgcXVlIGluY2x1eWVuIGFsIHZhbG9yIGRlbCBwYXLDoW1ldHJvIGRlIGxhIG1lZGlhIHBvYmxhY2lvbmFsLgoKNS4gQSBwYXJ0aXIgZGVsIGVqZXJjaWNpbyBhbnRlcmlvciwgwr9zZSBlc3BlcmFyw61hIHF1ZSBlbCA5OSUgZGUgbG9zIGludGVydmFsb3MgY29udGVuZ2FuIGVsIHZhbG9yIGRlbCBwYXLDoW1ldHJvIGVzdGltYWRvPwphLiBDaWVydG8KYi4gRmFsc28K