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/es_ES"
Sys.setenv(LANG = "es_ES") #alternativa 2

También es importante instalar las librerías que se utilizarán posteriormente, para ello primero se guardan como un objeto:

paquetes <- c("tidyverse", "DescTools")

Posteriormente se “llaman” a las librerías mediante el script libraries() de la paquetería easypackages:

library(easypackages)
libraries(paquetes)
## Loading required package: 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
## Loading required package: DescTools
## 
## All packages loaded successfully

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

getwd() ##directorio actual
## [1] "/Users/gustavo/Dropbox/R/Rmarkdown"
setwd("~/Dropbox/R/Rmarkdown") ##Esta permite cambiar y definir el directorio deseado
list.files() ##Esta permite enlistar los archivos dentro del directorio
##   [1] "Actividad_1.html"                                      
##   [2] "Actividad_1.Rmd"                                       
##   [3] "Actividad_2_Exploracion_Descripcion.pdf"               
##   [4] "Actividad_2.html"                                      
##   [5] "Actividad_2.Rmd"                                       
##   [6] "Actividad_3_1_.html"                                   
##   [7] "Actividad_3_Estadistica_Descriptiva.pdf"               
##   [8] "Actividad_3-1-.html"                                   
##   [9] "Actividad_3(1).Rmd"                                    
##  [10] "Actividad_4_files"                                     
##  [11] "actividad_4_inferencia.Rmd"                            
##  [12] "Actividad_4. Probabilidad y Distribución Normal.pdf"   
##  [13] "Actividad_4._Probabilidad_Distribucion_Normal.pdf"     
##  [14] "Actividad_4.html"                                      
##  [15] "Actividad_4.Rmd"                                       
##  [16] "Actividad_5_Inferencia_Est.docx"                       
##  [17] "Actividad_5_Inferencia_Est.html"                       
##  [18] "Actividad_5_Inferencia_Est.pdf"                        
##  [19] "Actividad_5_Inferencia_Est.Rmd"                        
##  [20] "actividad_6_intervalos_confianza.html"                 
##  [21] "actividad_6_intervalos_confianza.Rmd"                  
##  [22] "Actividad_7_Contingencia_Correlacion.html"             
##  [23] "Actividad_7_Contingencia_Correlacion.Rmd"              
##  [24] "actividad_correlacion.html"                            
##  [25] "actividad_correlacion.Rmd"                             
##  [26] "actividad_regresion_lineal_simple.html"                
##  [27] "actividad_regresion_lineal_simple.Rmd"                 
##  [28] "actividad_regresion_lineal.html"                       
##  [29] "actividad_regresion_lineal.Rmd"                        
##  [30] "actividad_regresion_logit.html"                        
##  [31] "actividad_regresion_logit.Rmd"                         
##  [32] "add in ymlthis.png"                                    
##  [33] "adiciones a modelos OLS.Rmd"                           
##  [34] "adiciones-a-modelos-OLS.html"                          
##  [35] "analisis_clusters.html"                                
##  [36] "analisis_clusters.Rmd"                                 
##  [37] "apa.csl"                                               
##  [38] "bibliografia partidos_prueba.bib"                      
##  [39] "comandos chunks en rmd.Rmd"                            
##  [40] "comandos-chunks-en-rmd.html"                           
##  [41] "confidence_intervals_Coursera_2.rmd"                   
##  [42] "confidence_intervals_Coursera.rmd"                     
##  [43] "diseno yaml.Rmd"                                       
##  [44] "diseno-yaml.html"                                      
##  [45] "dist_normal.png"                                       
##  [46] "dist_z_t.png"                                          
##  [47] "distill.png"                                           
##  [48] "ha_h0.gif"                                             
##  [49] "inf_for_numerical_data.Rmd"                            
##  [50] "intervalo_confianza.png"                               
##  [51] "intro_MCA.html"                                        
##  [52] "intro_MCA.Rmd"                                         
##  [53] "intro_pca.html"                                        
##  [54] "intro_pca.Rmd"                                         
##  [55] "intro_to_data_Coursera.rmd"                            
##  [56] "intro_to_r_coursera_2.Rmd"                             
##  [57] "intro_to_r_Coursera.Rmd"                               
##  [58] "metodologia.bib"                                       
##  [59] "papaja.png"                                            
##  [60] "poblacion_muestra.png"                                 
##  [61] "potencia.png"                                          
##  [62] "presentacion_reg_logit_ordinal.html"                   
##  [63] "presentacion_reg_logit_ordinal.Rmd"                    
##  [64] "probability_Coursera.Rmd"                              
##  [65] "prueba chunks.Rmd"                                     
##  [66] "prueba de YAML.Rmd"                                    
##  [67] "prueba sintax markdown.Rmd"                            
##  [68] "prueba_uso_markdown_files"                             
##  [69] "prueba_uso_markdown.html"                              
##  [70] "prueba_uso_markdown.Rmd"                               
##  [71] "prueba-chunks_files"                                   
##  [72] "prueba-chunks.html"                                    
##  [73] "prueba-de-YAML.html"                                   
##  [74] "prueba-de-YAML.pdf"                                    
##  [75] "prueba-sintax-markdown.html"                           
##  [76] "pruebas_hipotesis_bivariadas.html"                     
##  [77] "pruebas_hipotesis_bivariadas.Rmd"                      
##  [78] "references.bib"                                        
##  [79] "regresion_efectos_fijos.html"                          
##  [80] "regresion_efectos_fijos.Rmd"                           
##  [81] "regresion_lineal_multiple.html"                        
##  [82] "regresion_lineal_multiple.Rmd"                         
##  [83] "regresion_lineal_simple_presentacion.html"             
##  [84] "regresion_lineal_simple_presentacion.Rmd"              
##  [85] "rsconnect"                                             
##  [86] "rticles.png"                                           
##  [87] "sampling_distributions_Coursera.rmd"                   
##  [88] "script_PCA.R"                                          
##  [89] "script_reg_lineal.R"                                   
##  [90] "sintax_markdown.html"                                  
##  [91] "sintax_markdown.Rmd"                                   
##  [92] "syllabus sistemas politicos comparados uabc 2022-2.Rmd"
##  [93] "syllabus-sistemas-politicos-comparados-uabc-2022-2.pdf"
##  [94] "vars_democ_latinob.png"                                
##  [95] "ventana_config_basica_yaml.png"                        
##  [96] "ventana_plantillas_articulos.png"                      
##  [97] "ventana_selec_plantilla_yaml.png"                      
##  [98] "zotero1.png"                                           
##  [99] "zotero2.png"                                           
## [100] "zotero3.png"

Una vez establecido el directorio de trabajo, se debe cargar la base de datos o data frame en el ambiente del programa, con el 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. Estadística inferencial y generación de conocimiento mediante inferencias

El proceso de generación de conocimiento, para conocer una realidad, usualmente procede mediante alguna de las dos vías tradicionales: mediante métodos deductivos o inductivos. En términos de King, Keohane y Verba (2000[1994]), las tradiciones cuantitativas y cualitativas también suponían formas distintas de acercarse a conocer la realidad, pero en el fondo ambas tradiciones se basan en una misma lógica inferencial.

Esto es, el proceso de conocimiento científico se apoya en el proceso de generación y evaluación mediante el uso de inferencias. Una inferencia consiste en conocer algo que se desconoce a partir de elementos (datos) conocidos, según King, Keohane y Verba (2000). Y estas tienden a traducirse en distintas herramientas (como lo son las hipótesis) que, en el análisis cuantitativo, se busca someter a evaluación frente a los datos (en gran medida provienen de muestras) disponibles con el fin de conocer a la realidad (poblacional) mediante estimaciones.

La estadística inferencial consiste en un conjunto de técnicas y herramientas de la estadística con las que se busca generar estimaciones sobre la realidad (poblacional) a partir de los datos disponibles (muestrales) que, al final, puedan generalizarse. De manera que “la inferencia pretende generalizar la información contenida en unos datos a un cuerpo de conocimientos más amplio.” (cobo2007?)

En este sentido, la lógica de la metodología estadística inferencial se apoya en la generalización mediante refutación empírica de las inferencias iniciales, por lo que, en el fondo, se trata de un método comparativo basado en las herramientas estadísticas que permiten evaluar mediante estimaciones.

Los tres usos principales (vilalta2016?) de la estadística inferencial consisten en: 1. Estimar si una muestra es representativa de una población. 2. Estimar si una muestra difiere de otra. 3. Estimar la probabilidad de que 2 eventos estén relacionados por azar.

1.1. Inferencias e hipótesis

Una inferencia consiste en un argumento que busca conocer algo que se desconoce (usualmente se refiere a una característica de la población) a partir de elementos conocidos (suele referirse a datos provenientes de una muestra), según King, Keohane y Verba (2000). Y a partir de la generación de inferencias y su evaluación consecuente, se busca generar estimaciones que permitan acercarse a conocer la realidad (poblacional).

Las hipótesis suelen ser la manera formal en que se traducen las inferencias (ya sean descriptivas o causales, según King, Keohane y Verba (2000)), y estas se integran con elementos específicos: 1. variables, y 2. relaciones entre las variables.

En el análisis cuantitativo, las hipótesis serán el punto de partida del análisis inferencial pues, a través de su evaluación empírica, es la manera en que se busca conocer a la realidad. Donde las hipótesis estadísticas que se generan tienen dos características básicas:

  1. Según su rol en la investigación pueden ser:
  • Hipótesis alternativas (\(H_a\)), esta presenta un enunciado integrado por una o más variables y, además, establece una relación sistemática entre éstas, por ejemplo: \[ Y = f(X)\]
  • Hipótesis nula (\(H_0\)), se integra por las mismas variables, pero aquí rechaza o niega la relación sistemática establecida previamente; “consiste en la negación o ausencia de diferencia [igualdad] de un efecto” (vilalta2016?): \[Y \neq f(X)\]
  1. Según el tipo de dirección en la relación entre variables:
  • Hipótesis unidireccionales se refieren a aquellas que plantean un sentido en la relación entre las variables tanto en la muestra como en la población. Además, estás hipótesis pueden plantear dos tipos de sentidos:
    • Hipótesis unidireccional hacia la derecha, en la que se plantea que el parámetro poblacional será un valor mayor al estadístico muestral (\(\mu > \bar{X}\)).
    • Hipótesis unidireccional hacia la izquierda, en la que se plantea que el parámetro poblacional será un valor menor al estadístico muestral (\(\mu < \bar{X}\))
  • Hipótesis bidireccionales que consisten en argumentos que plantean la existencia de una diferencia de las variables entre la muestra y la población. \[\mu \neq X\]

En términos de la distribución de probabilidad de los valores de una variable, el primer tipo de hipótesis se conocen también como hipótesis de “una cola” mientras que las segundas se refieren como hipótesis de “dos colas.”

1.2. Pruebas de hipótesis (nula) y error

La manera en que la estadística realiza el análisis y la interpretación de los datos empíricos es a través del conjunto de técnicas y herramientas que se agrupan bajo el nombre de “prueba de hipótesis”, que permiten interpretar la información obtenida a partir de responder a preguntas de investigación (vilalta2016?) mediante el uso de estimadores (puntuales o intervalos de confianza). Este método de evaluación de los datos también se conoce como prueba de significancia estadística (Fisher, 1925, 1926).

El método de la prueba de significancia o de hipótesis “busca, en esencia, probar si las mediciones provenientes de una muestra están en armonía con la hipótesis del investigador (Fisher, 1925). Cualquier diferencia observada entre el verdadero valor de un parámetro poblacional y un estadístico muestral empleado para estimarlo se sujeta a una probabilidad.” (vilalta2016?)

Si bien al intentar probar la significancia de nuestras hipótesis de investigación desde el ámbito de la estadística inferencial, y por tanto desde su asociación con las probabilidades de ocurrencia de un resultado esperado en la realidad, nos enfrentamos al problema “tradicional” de la evaluación de hipótesis. Y es que si bien se reconoce que toda hipótesis de trabajo siempre tendrá una probabilidad de ocurrencia y, por tanto, de ser verdadera para la realidad, esta posibilidad no permite, al final, establecer la veracidad de nuestras hipótesis.

Una manera alternativa (de tipo popperiana) para conocer la realidad consiste en el método de la refutación de hipótesis, que permite, al menos, descartar hipótesis que no se ajusten a los datos empíricos disponibles. A partir de este proceso de refutación, en la estadística inferencial se opta por el método de la “prueba de hipótesis nula” (PHN), en el que se desea y se busca refutar o rechazar probabilísticamente una hipótesis de no efecto o nula. (vilalta2016?) En la medida en que la hipótesis nula pueda ser refutada (y por ende también se refute el argumento de no efecto o no diferencia entre las variables), se puede aceptar que existe una mejor explicación de la realidad que suele ubicarse en la hipótesis alternativa (aquella que plantea la existencia de un efecto o diferencia entre variables en la población).

Dicha prueba de hipótesis o de significancia, como parte del proceso inferencial de generación de conocimiento, si bien busca evaluar las relaciones entre variables a partir de los datos muestrales para, posteriormente, generalizar los resultados hacia una realidad poblacional, reconoce que este proceso de generalización no es determinista sino, al contrario, parte de asumir la existencia del fenómeno de la incertidumbre presente en la realidad, que se puede reflejar en los datos muestrales.

Dichos errores en el análisis cuantitativo se pueden generar en distintos momentos del diseño de la investigación: * en el momento del muestreo y recopilación de los datos, * en la medición de la realidad, o * en la presencia de variables intervinientes que no fueron consideradas en la investigación. (vilalta2016?; cobo2007?; salkind2013?)

Reconocer la presencia de la incertidumbre y, también, la existencia de diversas fuentes de error dentro del diseño de las investigaciones permite, a su vez, asumir la existencia de un riesgo latente en el proceso de generalización del conocimiento en el análisis estadístico inferencial. Dicho riesgo o error en el proceso de estimación (inferencia estadística) puede ser de dos tipos: i. aleatorio, que se deben a fluctuaciones del azar en las distintas fases de la investigación, y ii. sistemático, o sesgos que tienden a repetirse de manera constante por el uso de diversas herramientas de investigación.

De acuerdo con Cobo (cobo2007?), “la estadística ayuda a cuantificar la magnitud de los primeros (errores aleatorios)” a partir del cálculo del tamaño del “error aleatorio.” Esto permite “saber con qué grado de certidumbre la diferencia observada entre un estadístico y un parámetro puede deberse a una fluctuación aleatoria.” (Stigler, 1986 citado en vilalta2016?)

1.3. Error aleatorio

El error aleatorio consiste en la diferencia existente entre ambos valores (estimadores) que se produce a raíz de analizar algo a partir de una muestra frente a analizarlo a partir de su población entera y, a su vez, permite evaluar el grado de certidumbre con el que se puede concluir algo para la población a partir de la información muestral disponible.

El error aleatorio, por tanto, “es la oscilación de los estadísticos obtenibles en las posibles muestras (siempre centrados en el parámetro de la población origen de la muestra).” (cobo2007?) Especialmente, la evaluación del tamaño del error aleatorio permite comparar la distancia existente de un estimador presente en una muestra respecto de su posición en una población. Pero a raíz del problema de carecer de información poblacional, ésta comparación suele llevarse a cabo entre el estimador de una muestra con su posición correspondiente ante una distribución muestral (el conjunto de diversas muestras de igual tamaño al tamaño de la muestra disponible).

A medida que el tamaño del error aleatorio del estimador utilizado en la muestra disponible tiende a ser pequeño (cercano a cero), se asume que la muestra utilizada es representativa de la población analizada.

El cálculo del error aleatorio se apoya en el índice del Error estándar (SE) o error típico de la media, que es el cociente resultante de dividir a la desviación estándar (\(\sigma\)) de una variable entre la raíz cuadrada del tamaño de muestra \(\sqrt{n}\): \[SE = \frac{\sigma_\bar{X}}{\sqrt{n}}\]

La forma manual de calcular el Error estándar (SE) se realiza aplicando las variables directamente en la fórmula referida:

SE_EDAD <- sd(datos_covid$EDAD, na.rm = TRUE) / sqrt(length(datos_covid$EDAD))
SE_EDAD
## [1] 0.02634047

Otra manera de obtener el Error Estándar para una variable continua de manera más directa es a través del script MeanSE(objeto, sd = NULL, na.rm = TRUE) de la librería DescTools(), de la siguiente manera:

SE_age <- MeanSE(datos_covid $ EDAD, sd = NULL, na.rm = TRUE)
SE_age
## [1] 0.02634047

El tamaño del error aleatorio existente entre la muestra y el conjunto de todas las muestras posibles del mismo tamaño (distribución muestral), a partir de comparar el estimador de la media para ambas, es de casi 0.03 desviaciones estándar. Lo que refiere que los datos de la muestra disponible son muy cercanos a los datos existentes en la distribución muestral, que es nuestra mejor aproximación a la población.

Finalmente, a partir de la definición operacional del error aleatorio, se observa que existe una relación inversa entre el tamaño de la muestra y el error típico, pues a medida que tiene a aumentar el primero, el segundo se reducirá y viceversa. (cobo2007?)

Pregunta: ¿Cuál será el tamaño del error estándar de la variable de EDAD de los pacientes con síntomas de covid-19 en caso que el tamaño de muestra (n) fuese de 800,000 individuos?

¿Cuál será el tamaño del error estándar de la variable de Edad de los pacientes con síntomas de covid-19 en caso que el tamaño de muestra (n) fuese de 100,000 individuos?

2. Estimación y significancia estadística

El proceso de la inferencia estadística que se apoya en las pruebas de hipótesis o significancia se apoya en las herramientas de la estimación de un parámetro a partir de un estadístico proveniente de una muestra. Y dicho proceso de estimación se puede realizar mediante dos instrumentos:

1. Estimadores puntuales, o

2. Intervalos de Confianza.

A partir de estos estimadores se buscan responder dos tipos de preguntas relacionadas con la prueba de una hipótesis:

1. ¿Se puede negar cierto valor del parámetro? Esta será respondida mendiante la PHN y su Nivel de Significancia estadística, y

2. ¿Qué valores del parámetro son creíbles? Esta será respondida mediante los Intervalos de Confianza y su nivel de confianza (esto se abordará en otra sesión).

2.1. Estimación puntual

Un estimador puntual “es la representación numérica de una característica de una población que se realiza a partir de una muestra. Es un estadístico muestral para estimar un valor de interés en una población o universo”. (vilalta2016?) A partir del supuesto del Teorema del Límite Central se asume que el ejemplo clásico de estimador puntual es la media aritmética de una muestra, que se trata como si fuera una variable aleatoria. Esto permite, también, que su cálculo se realice sobre la base de una distribución de probabilidades y, así, evaluar la hipótesis generada a partir de dicho estimador y, finalmente, interpretar su resultado a la luz de un criterio de decisión. Dicho criterio se refiere a la significancia estadística del estimador.

2.1.1. Prueba de significancia estadística de un estimador puntual (media)

La prueba de significancia estadística es una técnica de estadística inferencial que se usa “para juzgar si una propiedad que, se supone, cumple una población es compatible con lo observado en una muestra de la misma.” (cobo2007?) A partir de dicha comparación de las probabilidades calculadas para el valor observado en una muestra respecto del mismo valor correspondiente para el parámetro poblacional es que se busca establecer un criterio de decisión para aceptar o rechazar la hipótesis planteada para conocer la realidad (poblacional), reconociendo siempre la existencia de un error aleatorio, o el riesgo asociado con no estar 100% seguro de que lo observado en una muestra se debe a causas sistemáticas (tratamiento, variable independiente, causa esperada, etc.).” (salkind2013?)

Con el fin de evaluar dicha comparación de probabilidades, y para tomar una decisión al respecto considerando el riesgo del error aleatorio, se utiliza un criterio de decisión que consiste en el Nivel de significancia (representado por la letra griega \(\alpha\)). Este “es el grado de riesgo que se desea aceptar para rechazar la hipótesis nula (a partir de los datos muestrales) cuando es verdadera en la realidad (poblacional).” Y dicho grado de riesgo en el fondo consiste en una probabilidad condicional sobre el riesgo aceptable, de manera que: \[\alpha = P(\text{rechazar H0} | \text{H0 es verdadera})\]

2.1.2. Tipos de error en las pruebas de hipótesis

Debido a la naturaleza probabilística de las pruebas de hipótesis (nula) o de significancia estadística, lo que se busca es evaluar la probabilidad de ocurrencia de la hipótesis nula con el fin de tomar una decisión final sobre la verosimilitud de la misma.

Una característica probabilística de todo resultado o evento posible de la variable de interés consiste en que su probabilidad de ocurrencia, por más mínima que pueda ser, nunca será igual a 0 (ausencia del evento) o a 1 (presencia completa del evento). De manera que tanto la hipótesis alternativa así como la hipótesis nula siempre tienen asociada una probabilidad de ocurrencia.

Ante dicha situación, el nivel de significancia es el criterio de decisión que se utiliza para evaluar la ocurrencia del evento analizado y, también, para que el analista tome una decisión (aceptar o rechazar) sobre la hipótesis evaluada como la mejor explicación posible de la realidad.

Sin embargo, debido a la misma naturaleza probabilística de la pruebas de hipótesis (nula) o significancia estadística también se corre el riesgo de cometer errores al evaluar la probabilidad de ocurrencia de una hipótesis a partir de los datos muestrales, y también se pueden generar errores al momento en que el analista debe tomar una decisión sobre la hipótesis (nula) evaluada.

Al evaluar la hipótesis nula se debe considerar que, en la población dicha hipótesis puede ser verdadera o falsa, mientras que el analista debe decidir entre rechazar o no rechazar la hipótesis nula.

Ante esta combinación de posibilidades, se pueden generar dos tipos de error en las pruebas de significancia:

  1. Error tipo I, y
  2. Error tipo II.
Decisión del analista H0 Verdadera H0 Falsa
Aceptar Decisión correcta Error tipo II (beta)
Rechazar Error tipo I (alfa) Decisión correcta (poder = 1 - beta)
  1. El error tipo I se corresponde con el Nivel de Significancia, o que puede ser concebido también como un falso positivo. Y este consiste en la: \(P(rechazar H0 | H0 verdadera)\). Esta probabilidad la define el analista de manera discrecional y de antemano a la realización de la prueba de significancia; entre los valores estándar que se utilizan para evaluar dicho riesgo de error se suelen ubicar en 5% o 1% (Fisher, 1925). Esto es, se considera aceptable un error (o nivel de significancia: \(\alpha\)) del 5%, en donde se contempla que 1 de cada 20 casos el analista tome una decisión errada.

  2. El error tipo II consiste en la probabilidad de: \(P(aceptar H0 | H0 falsa)\), y que se conoce también como un falso negativo. Este suele representarse con el estimador \(\beta\), que está vinculado al tamaño de muestra (\(n\)) y, por tanto, no puede manipularse directamente por el analista. A su vez, la probabilidad inversa \(1-\beta\) se conoce como el poder estadístico de la prueba de hipótesis, y que consiste en adoptar una decisión correcta cuando \(P(\text{rechazar H0} | \text{H0 es falsa})\). (Murphy y Myers, 2004 citado en vilalta2016?)

2.2. Lógica de la prueba de hipótesis y p-value

Si bien el Nivel de Significancia consiste en el criterio utilizado por el analista para tomar una decisión sobre la inferencia generada en torno a una hipótesis nula, el estimador que se utiliza para evaluar la significancia estadística (probabilidad) asociada a dicha hipótesis consiste en el p-valor.

Este consiste en “la probabilidad de que se presente un valor del estadístico (media) más alejado de la hipótesis nula (en la población) que el observado (en la muestra).” (cobo2007?) O dicho de otra manera, es la “probabilidad de observar valores del estadístico igual o más extremos que el observado, en caso de que la hipótesis nula sea cierta.” (cobo2007?)

Su interpretación debe reconocer que “si el p-valor es pequeño, se dice que la hipótesis nula es inverosímil. (…) (O) Cuán inverosímil es el resultado observado si la hipótesis nula fuera cierta” o “Hasta qué punto el resultado observado (en la muestra) es probabilísticamente compatible con la hipótesis nula.” (cobo2007?)

La lógica de la PHN consiste en alcanzar resultados altamente significativos, o lo que es lo mismo “buscar la menor probabilidad de cometer un error tipo I” que permita, al final, rechazar a la hipótesis nula como la mejor explicación posible de la realidad.

De manera que “cada H0 tiene asociada un tipo particular de estadístico (z, t, F, u otro). Y cada estadístico tiene asociado un tipo especial de distribución de probabilidades con la que se puede comparar los datos de una muestra. La comparación entre las características de la muestra frente a los de la población, en la prueba de distribución permiten concluir si las características de la muestra son diferentes a lo que se esperaría obtener por azar (en la población, representada mediante la curva de distribución de probabilidades).” (salkind2013?)

Esto es, se compara el p-valor calculado y asociado a la probabilidad de ocurrencia de \(H_0\) con respecto al Nivel de significancia (\(\alpha\)) previamente definido, y a partir de ello se toma una decisión centrada en la Hipótesis nula (\(H_0\)).

2.2.1. Pasos de la prueba de hipótesis o significancia.

La prueba de significancia hace una pregunta concreta sobre el valor del parámetro en la población a partir de los datos observados en la muestra o si \(\pi = \bar{x}\). Y donde la hipótesis nula “es el punto de salida de la investigación, por lo que debe establecerse previo a la recolección de los datos.” (cobo2007?)

A partir de dicha prueba de significancia se busca “tomar una decisión (sobre H0), manteniendo los riesgos del error, controlados”, al mismo tiempo que se “aporta evidencia en contra de la hipótesis nula.” (cobo2007?)

La mecánica de las pruebas de significancia o de hipótesis siguen una serie de pasos, y estos tienden a variar según cada autor. A continuación se presentan una serie de 6 pasos, basados en la propuesta de Salkind (salkind2013?):

  1. Definición de la Hipótesis nula (\(H_0\)), esta consiste siempre en una “igualdad” o en la negación del efecto entre variables. Por ejemplo: \(\mu = \bar{x}\).

  2. Definición del Nivel de Significancia (\(\alpha\)) por el analista, que suele ubicarse en valores estándar de 5% o 1%.

  3. Selección del estadístico apropiado según la distribución de probabilidad de la variable analizada. Estos pueden corresponderse con la distribución de los estadísticos \(z, t, F, r\) u otro (Recomendación: uso del diagrama elaborado por Salkind (salkind2013?)).

  4. Cálculo (mediante fórmula) del valor del estadístico para la muestra (valor obtenido del p-valor), que consiste en una transformación de la unidad de medida de la variable original al valor correspondiente (estandarización de la variable) según el estadístico de distribución correspondiente y, así, calcular su probabilidad asociada.

  5. Comparar el valor obtenido del p-valor asociado a la probabilidad de ocurrencia de H0 en la población frente al Nivel de Significancia (\(\alpha\)) previamente definido por el analista, y ubicar si el p-value es menor al nivel de significancia..

  6. Decisión del analista sobre H0, que corresponde al rechazo o no rechazo de \(H_0\) a partir de la comparación realizada en el paso 5.

De manera que si: \[ \text{p-value} \geq \alpha : \text{No rechazo H0}\] \[ \text{p-value} < \alpha: \text{Rechazo H0}\]

3. Prueba de hipótesis para una variable.

Al trabajar con una variable con los datos de una muestra se puede realizar el proceso de estimación para conocer sí la primera nos permite acercarnos al valor correspondiente en la población (parámetro). Sin embargo es importante tener en cuenta el tipo de variable con la que se está trabajando el proceso de inferencia estadística (generalización), ya sea que se trate de una variable ccontinua o categórica. Pues para el primer caso se trabaja con el estadístico de la media mientras que para el segundo se evalúa la proporción del atributo de interés (nominal u ordinal).

3.1. Prueba de hipótesis para una variable continua.

En el caso de contar con una variable aleatoria de tipo continua, prácticamente puede considerarse que tiende a distribuirse como una normal (\(X -> N(\bar{X}, \sigma)\)) al cumplir, al menos, las siguientes condiciones:

  1. “n” grande (n > 30 casos) y
  2. se selecciona al 10% de la población en la muestra, o
  3. \(X\) tiene una distribución normal.

Entonces se considera que su media será un buen estimador para conocer el parámetro poblacional correspondiente.

3.1.1. Hipótesis de dos colas o “desigualdad”, donde \(\mu \neq \bar{x}\)

Siguiendo los pasos de la prueba de hipótesis, se establece que:

  1. Hipótesis nula: \(\mu = \bar{X}\); Hipótesis alternativa: \(\mu \neq \bar{X}\) (hipótesis de “dos colas”). A partir de esta hipótesis se desea evaluar si el promedio de edad calculado a partir de la muestra se parece al promedio de edad en la población.

  2. Nivel de significancia: \(\alpha = 0.05\). Nivel estándar para el ámbito de las Ciencias Sociales.

  3. Estadístico de prueba: \(Z\) para distribución de una muestra (distribución normal de probabilidades): \[z = \frac{(\bar{X} - \mu)}{\frac{\sigma}{\sqrt{n}}}\] Sin embargo se debe tomar en consideración que R no cuenta con un script en el sistema base para calcular directamente el p-valor asociado al cuantil “z”. Por ello se opta por utilizar el script t.test(), que se apoya en el cálculo del p-valor a partir del estadístico de distribución t de Student, cuya fórmula es muy parecida a la del estadístico “z”: \[t = \frac{(\bar{X} - \mu)}{\frac{s_\sigma}{\sqrt{n}}}\]

La diferencia principal entre ambas fórmulas radica en los elementos incluidos en el denominador: para el caso del estadístico “z”, el error estándar se calcula a partir del valor de la desviación estándar (\(\sigma\)) poblacional, mientras que en el caso de la fórmula del estadístico “t de Student” se calcula utilizando el valor de la desviación estándar (\(s_\sigma\)) para la muestra.

Sin embargo, a medida que el tamaño de muestra (\(n\)) tiende a aumentar, tanto \(\sigma\) como \(s_\sigma\) tenderán a acercarse entre sí y, por tanto, la forma de la distribución “t de Student” se parecerá cada vez más a la forma de una distribución normal “z”.

  1. Cálculo del p-valor.
options(scipen = 999) #comando para convertir los valores pequeños a decimales.
t.test(datos_covid $ EDAD,
       alternative = "two.sided", #Hipótesis de "dos colas" o de desigualdad
       mu = 42.56675, #Valor de contrastación, aquí se utilizó el valor de la distribución muestral
       paired = FALSE, #en caso de que la muestra sea "pareada"
       var.equal = FALSE, #supuesto de varianza homogénea si la muestra es pareda.
       conf.level = 0.95) #Nivel de confianza = 1 - Nivel de significancia.
## 
##  One Sample t-test
## 
## data:  datos_covid$EDAD
## t = 0.3749, df = 401754, p-value = 0.7077
## alternative hypothesis: true mean is not equal to 42.56675
## 95 percent confidence interval:
##  42.52500 42.62825
## sample estimates:
## mean of x 
##  42.57663

Valor obtenido en unidades t es de 0.3749, con 401754 grados de libertad. A partir del uso de ambos elementos se puede calcular la probabilidad correspondiente al p-valor, que es de 0.7077.

  1. Comparación del p-valor calculado frente al Nivel de significancia (\(\alpha\)). Al comparar el valor del p-valor asociado a la H0 (que es de 0.7077) con respecto al Nivel de significancia (alfa) (que es de 0.05). Con esto se puede establecer que el p-value es mayor que el Nivel de significancia.

  2. Decisión sobre la hipótesis nula

  1. El p-value asociado al valor de la media de edad en la muestra (0.7077) es mayor al nivel de significancia establecido (\(\alpha = 0.05\)), por lo que la probabilidad de observar a la hipótesis nula en la población es mayor al criterio de decisión.
  2. A partir de este criterio no se rechaza la H0 con los datos observados, por lo que se considera que H0 es la mejor explicación. O dicho de otra manera, se puede establecer que la media de edad de la muestra es similar a la media de edad de la población, con un nivel de confianza del 95%.

3.1.2. Hipótesis unilateral a la izquierda (una cola) o “menor que”, donde \(\mu < \bar{x}\)

Siguiendo los pasos de la prueba de hipótesis, se establece que:

  1. Hipótesis nula: \(\mu \geq \bar{X}\); Hipótesis alternativa: \(\mu < \bar{X}\) (hipótesis unilaterla a la izquierda). A partir de esta hipótesis se desea evaluar si el promedio de edad de la población es menor al promedio de edad calculado a partir de la muestra.

  2. Nivel de significancia: \(\alpha = 0.05\). Nivel estándar para el ámbito de las Ciencias Sociales.

  3. Estadístico de prueba: \(Z\) para distribución de una muestra (distribución normal de probabilidades), pero se opta por utilizar el estadístico “t de Student”, y por ende el script t.test().

  4. Calcular el p-valor

t.test(datos_covid $ EDAD,
       alternative = "less", #Hipótesis de una cola, "menor que"
       mu = 42.56675, #Valor de contrastación, aquí se utilizó el valor de la distribución muestral
       paired = FALSE, #en caso de que la muestra sea "pareada"
       var.equal = FALSE, #supuesto de varianza homogénea si la muestra es pareda.
       conf.level = 0.95) #Nivel de confianza = 1 - Nivel de significancia.
## 
##  One Sample t-test
## 
## data:  datos_covid$EDAD
## t = 0.3749, df = 401754, p-value = 0.6461
## alternative hypothesis: true mean is less than 42.56675
## 95 percent confidence interval:
##      -Inf 42.61995
## sample estimates:
## mean of x 
##  42.57663
  1. Comparación del p-valor calculado frente al Nivel de significancia (alfa). Al comparar el valor del p-valor asociado a la H0 (que es de 0.6461) con respecto al Nivel de significancia (alfa) (que es de 0.05). Con esto se puede establecer que el p-value es mayor que el Nivel de significancia.

  2. Decisión sobre la hipótesis nula.

  1. El p-value asociado al valor de la media de edad en la muestra (0.6461) es mayor al nivel de significancia establecido ($= 0.05), por lo que la probabilidad de observar a la hipótesis nula en la población es mayor al criterio de decisión.
  2. A partir de este criterio no se rechaza la H0 con los datos observados, por lo que se considera que H0 es la mejor explicación. O dicho de otra manera, se puede establecer que la media de edad de la población es mayor o igual a la media de edad en la muestra, con un nivel de confianza del 95%.

3.1.3. Hipótesis unilateral a la derecha (una cola) o “mayor que”, donde \(\mu > \bar{x}\)

Siguiendo los pasos de la prueba de hipótesis, se establece que:

  1. Hipótesis nula: \(\mu \leq \bar{X}\); Hipótesis alternativa: \(\mu > \bar{X}\) (hipótesis unilateral a la derecha). A partir de esta hipótesis se desea evaluar si el promedio de edad de la población es mayor al promedio de edad calculado a partir de la muestra.

  2. Nivel de significancia: \(\alpha = 0.05\). Nivel estándar para el ámbito de las Ciencias Sociales.

  3. Estadístico de prueba: \(Z\) para distribución de una muestra (distribución normal de probabilidades), pero se opta por utilizar el estadístico “t de Student”, y por ende el script t.test().

  4. Calcular el p-valor

t.test(datos_covid $ EDAD,
       alternative = "greater", #Hipótesis de una cola, "menor que"
       mu = 42.56675, #Valor de contrastación, aquí se utilizó el valor de la distribución muestral
       paired = FALSE, #en caso de que la muestra sea "pareada"
       var.equal = FALSE, #supuesto de varianza homogénea si la muestra es pareda.
       conf.level = 0.95) #Nivel de confianza = 1 - Nivel de significancia.
## 
##  One Sample t-test
## 
## data:  datos_covid$EDAD
## t = 0.3749, df = 401754, p-value = 0.3539
## alternative hypothesis: true mean is greater than 42.56675
## 95 percent confidence interval:
##  42.5333     Inf
## sample estimates:
## mean of x 
##  42.57663
  1. Comparación del p-valor calculado frente al Nivel de significancia (\(\alpha\)). Al comparar el valor del p-valor asociado a la H0 (que es de 0.3539) con respecto al Nivel de significancia (\(\alpha\)) (que es de 0.05). Con esto se puede establecer que el p-value es mayor que el Nivel de significancia.

  2. Decisión sobre la hipótesis nula.

  1. El p-value asociado al valor de la media de edad en la muestra (0.3539) es mayor al nivel de significancia establecido ($= 0.05), por lo que la probabilidad de observar a la hipótesis nula en la población es mayor al criterio de decisión.
  2. A partir de este criterio no se rechaza la H0 con los datos observados, por lo que se considera que H0 es la mejor explicación. O dicho de otra manera, se puede establecer que la media de edad de la población es mayor o igual a la media de edad en la muestra, con un nivel de confianza del 95%.

4. Prueba de hipótesis para una propoción

La estimación de un parámetro poblacional cuando se analiza una variable discreta y binomial (dos valores o atributos posibles solamente), se realiza mediante el estadístico de la proporción a partir de los datos de la muestra.

En este caso, el programa R cuenta con una función específica para calcular el estadístico calculado y su p-valor a partir del estadístico de distribución de probabilidades de Chi-cuadrada (\(\chi^2\)).

4.1. Hipótesis bilateral (dos colas) o “desigual”, donde \(\pi \neq p\)

Los pasos de la prueba de significancia para una proporción se plantean de la siguiente manera:

  1. Hipótesis nula: \(\pi = p\); Hipótesis alternativa: \(\pi \neq p\) (bidireccional) donde H0: \(\pi = 0.35\), Ha: \(\pi \neq 0.35\) pues se encontró que la frecuencia relativa de los casos con contagio de COVID-19 (valor 1 en la codificación de la variable) es de 35.51%.
prop.table(table(datos_covid $ RESULTADO))
## 
##         1         2         3 
## 0.3551667 0.5031400 0.1416933
  1. Nivel de significancia (\(\alpha\)) = 0.05

  2. Estadístico de prueba para una proporción: chi-cuadrado (\(\chi^2\)).

  3. Cálculo del p-valor, utilizando el comando prop.test():

prop.test(x = 142690, #cantidad de casos exitosos o donde ocurrió el evento de interés
          n = 401755, #tamaño de la muestra
          p = 0.35, #proporción que define al valor o hipótesis nula
          alternative = "two.sided", #tipo de hipótesis alternativa
          conf.level = 0.95, #nivel de confianza
          correct = TRUE)
## 
##  1-sample proportions test with continuity correction
## 
## data:  142690 out of 401755, null probability 0.35
## X-squared = 47.119, df = 1, p-value = 0.00000000000668
## alternative hypothesis: true p is not equal to 0.35
## 95 percent confidence interval:
##  0.3536870 0.3566491
## sample estimates:
##         p 
## 0.3551667

Aquí se observó que el valor del estadístico de prueba (\(\chi^2\)) calculado u observado es de 47.119 unidades de \(\chi^2\), con 1 grado de libertad, para lo que se obtuvo un p-valor de 0.00000000000668 para la hipótesis nula (p = 0.35).

  1. Comparación del p-valor frente al Nivel de significancia. Al comparar el valor del p-valor asociado a la H0 (que es de 0.00000000000668) con respecto al Nivel de significancia (\(\alpha\)) (que es de 0.05). Con esto se puede establecer que el p-value es menor que el Nivel de significancia.

  2. Decisión sobre la hipótesis nula.

  1. El p-value asociado al valor de la proporción de casos que dieron positivo en la prueba COVID-19 en la muestra (0.00000000000668) es menor al nivel de significancia establecido (\(\alpha = 0.05\)), por lo que la probabilidad de observar a la hipótesis nula en la población es menor al criterio de decisión.
  2. A partir de este criterio sí se rechaza la H0 con los datos observados, por lo que se considera que Ha es la mejor explicación. O dicho de otra manera, se puede establecer que la proporción de personas que darían positivo a la prueba COVID-19 en población es distinta la proporción de personas que dieron positivo en la prueba COVID-19 en la muestra, con un nivel de confianza del 95%.

4.2. Hipótesis unilateral a la izquierda (una cola) o “menor que”, donde \(\pi < p\)

Los pasos de la prueba de significancia para una proporción se plantean de la siguiente manera:

  1. Hipótesis nula: \(\pi \geq p\); Hipótesis alternativa: \(\pi < p\) (unidireccional a la izquierda), donde H0: \(\pi \geq 0.35\), Ha: \(\pi < 0.35\) pues se encontró que la frecuencia relativa de los casos con contagio de COVID-19 (valor 1 en la codificación de la variable) es de 35.51%.
prop.table(table(datos_covid $ RESULTADO))
## 
##         1         2         3 
## 0.3551667 0.5031400 0.1416933
  1. Nivel de significancia (\(\alpha\)) = 0.05

  2. Estadístico de prueba para una proporción: Chi^2 \(\chi^2\)

  3. Cálculo del p-valor, utilizando el comando prop.test():

prop.test(x = 142690, #cantidad de casos exitosos o donde ocurrió el evento de interés
          n = 401755, #tamaño de la muestra
          p = 0.35, #proporción que define al valor o hipótesis nula
          alternative = "less", #tipo de hipótesis alternativa
          conf.level = 0.95, #nivel de confianza
          correct = TRUE)
## 
##  1-sample proportions test with continuity correction
## 
## data:  142690 out of 401755, null probability 0.35
## X-squared = 47.119, df = 1, p-value = 1
## alternative hypothesis: true p is less than 0.35
## 95 percent confidence interval:
##  0.0000000 0.3564108
## sample estimates:
##         p 
## 0.3551667

Aquí se observó que el valor del estadístico de prueba (\(\chi^2\)) calculado u observado es de 47.119 unidades de \(\chi^2\), con 1 grado de libertad, para lo que se obtuvo un p-valor de 1 para la hipótesis nula (\(\pi \geq 0.35\)).

  1. Comparación del p-valor frente al Nivel de significancia. Al comparar el valor del p-valor asociado a la H0 (que es de 1) con respecto al Nivel de significancia (alfa) (que es de 0.05), se puede establecer que el p-value es mayor que el Nivel de significancia.

  2. Decisión sobre la hipótesis nula.

  1. El p-value asociado al valor de la proporción de casos que dieron positivo en la prueba COVID-19 en la muestra (1) es mayor al nivel de significancia establecido (\(\alpha = 0.05\)), por lo que la probabilidad de observar a la hipótesis nula en la población es mayar al criterio de decisión.
  2. A partir de este criterio no se rechaza la H0 con los datos observados, por lo que se considera que H0 es la mejor explicación. O dicho de otra manera, se puede establecer que la proporción de personas que darían positivo a la prueba COVID-19 en población es mayor o igual a la proporción de personas que dieron positivo en la prueba COVID-19 en la muestra, con un nivel de confianza del 95%.

5. Ejercicios

  1. Construir una hipótesis nula bidireccional y una unidireccional con X y Y
  2. Calcular el error estándar para una media de la variable edad para una submuestra de 10,000 casos, generada a partir del universo de casos contenidos en la variable EDAD de la base de datos COVID-19. Usar el valor seed = 4321.
  3. Realizar una prueba de hipótesis para una media de la variable EDAD a partir de la submuestra previamente generada y reportar: i. la HO, ii. si el valor del estadístico calculado es mayor o menor que el valor crítico, iii. el p-valor correspondiente, y iv. si se rechaza o no se rechaza H0.
  4. Realizar una prueba de hipótesis para una proporción de la variable RESULTADO a partir de la submuestra y reportar: i. la HO, ii. si el valor del estadístico calculado es mayor o menor que el valor crítico, iii. el p-valor correspondiente, y iv. si se rechaza o no se rechaza H0.

Referencias

King, Gary, Robert Keohane, and Sidney Verba. 2000. El Diseño de La Investigación Social: La Inferencia Científica En Los Estudios Cualitativos. Madrid: Alianza editorial.
LS0tCnRpdGxlOiAiSW5mZXJlbmNpYSB5IHNpZ25pZmljYW5jaWEgZXN0YWTDrXN0aWNhIHBhcmEgdW4gZXN0YWTDrXN0aWNvIgphdXRob3I6ICJHdXN0YXZvIE1hcnTDrW5leiBWYWxkZXMiCmRhdGU6ICIyMDIzLTA3LTEyIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogVFJVRQogICAgdG9jX2RlcHRoOiA1CiAgICB0b2NfZmxvYXQ6IFRSVUUKICAgIG51bWJlcl9zZWN0aW9uOiBGQUxTRQogICAgdGhlbWU6ICJjb3NtbyIKICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUKICAgIGNvZGVfZm9sZGluZzogc2hvdwplZGl0b3Jfb3B0aW9uczogCiAgbWFya2Rvd246IAogICAgd3JhcDogNzIKYmlibGlvZ3JhcGh5OiBtZXRvZG9sb2dpYS5iaWIKYXBhOiBhcGEuY3NsCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKYGBgCgojIyAwLiBEZWZpbmljacOzbiBkZWwgYW1iaWVudGUgZGUgdHJhYmFqby4KCkFsIGNvbWVuemFyIHNpZW1wcmUgZXMgaW1wb3J0YW50ZSBlc3RhYmxlY2VyIGVsIGlkaW9tYSBhZGVjdWFkbyBwYXJhIHF1ZQplbCBwcm9ncmFtYSByZWNvbm96Y2EgY2FyYWN0ZXJlcyBlc3BlY2lhbGVzLiBFbiBlbCBjYXNvIGRlIGRlZmluaXIgYWwKaWRpb21hIGVzcGHDsW9sLCBsYSBpbnN0cnVjY2nDs24gYSB1dGlsaXphciBlczoKCmBgYHtyIGlkaW9tYX0KU3lzLnNldGxvY2FsZSgiTENfQUxMIiwgImVzX0VTIikgI2FsdGVybmF0aXZhIDEKU3lzLnNldGVudihMQU5HID0gImVzX0VTIikgI2FsdGVybmF0aXZhIDIKYGBgCgpUYW1iacOpbiBlcyBpbXBvcnRhbnRlIGluc3RhbGFyIGxhcyBsaWJyZXLDrWFzIHF1ZSBzZSB1dGlsaXphcsOhbgpwb3N0ZXJpb3JtZW50ZSwgcGFyYSBlbGxvIHByaW1lcm8gc2UgZ3VhcmRhbiBjb21vIHVuIG9iamV0bzoKCmBgYHtyIGxpYnJlcmlhc30KcGFxdWV0ZXMgPC0gYygidGlkeXZlcnNlIiwgIkRlc2NUb29scyIpCmBgYAoKUG9zdGVyaW9ybWVudGUgc2UgImxsYW1hbiIgYSBsYXMgbGlicmVyw61hcyBtZWRpYW50ZSBlbCBzY3JpcHQKYGxpYnJhcmllcygpYCBkZSBsYSBwYXF1ZXRlcsOtYSBgZWFzeXBhY2thZ2VzYDoKCmBgYHtyIGVhc3lwYWNrYWdlc30KbGlicmFyeShlYXN5cGFja2FnZXMpCmxpYnJhcmllcyhwYXF1ZXRlcykKYGBgCgpBZGVtw6FzIGVzIG11eSByZWxldmFudGUgZXN0YWJsZWNlciBsYSB1YmljYWNpw7NuIGRlbCBkaXJlY3RvcmlvIGRlCnRyYWJham8sIHBhcmEgcXVlIGVsIHByb2dyYW1hIGlkZW50aWZpcXVlIGVsIGFyY2hpdm8gZGVsIHF1ZSBleHRyYWVyw6EgeSwKdGFtYmnDqW4sIGd1YXJkYXLDoSBsYSBpbmZvcm1hY2nDs24gc29saWNpdGFkYS4KCmBgYHtyIGRpcmVjdG9yaW99CmdldHdkKCkgIyNkaXJlY3RvcmlvIGFjdHVhbApzZXR3ZCgifi9Ecm9wYm94L1IvUm1hcmtkb3duIikgIyNFc3RhIHBlcm1pdGUgY2FtYmlhciB5IGRlZmluaXIgZWwgZGlyZWN0b3JpbyBkZXNlYWRvCmxpc3QuZmlsZXMoKSAjI0VzdGEgcGVybWl0ZSBlbmxpc3RhciBsb3MgYXJjaGl2b3MgZGVudHJvIGRlbCBkaXJlY3RvcmlvCmBgYAoKVW5hIHZleiBlc3RhYmxlY2lkbyBlbCBkaXJlY3RvcmlvIGRlIHRyYWJham8sIHNlIGRlYmUgY2FyZ2FyIGxhIGJhc2UgZGUKZGF0b3MgbyBkYXRhIGZyYW1lIGVuIGVsIGFtYmllbnRlIGRlbCBwcm9ncmFtYSwgY29uIGVsIHF1ZSBzZSBhbmFsaXphcsOhCmxhIGluZm9ybWFjacOzbi4gUGFyYSBlbGxvIGhhYnLDoSBxdWUgImNhcmdhciIgbGEgaW5mb3JtYWNpw7NuIHNvYnJlIGxvcwpwYWNpZW50ZXMgaW5mZWN0YWRvcyBwb3IgQ09WSUQtMTkgcmVwb3J0YWRvcyBwb3IgbGEgU2VjcmV0YXLDrWEgZGUgU2FsdWQKZGVsIGdvYmllcm5vIGZlZGVyYWwgbWV4aWNhbm8uCgpgYGB7ciBjYXJnYV9kYXRvc30KZGF0b3NfY292aWQgPC0gcmVhZC5jc3YoIn4vRHJvcGJveC9SLzIwMDYxM0NPVklEMTlNRVhJQ08uY3N2IiwgaGVhZGVyID0gVFJVRSkgI3J1dGEgZGUgYWNjZXNvIGEgbG9zIGRhdG9zLCAnaGVhZGVyID0gVFJVRScgZW4gY2FzbyBkZSBxdWUgZWwgYXJjaGl2byBjdWVudGUgY29uIG5vbWJyZXMgZGUgbGFzIHZhcmlhYmxlcy4KYGBgCgojIyAxLiBFc3RhZMOtc3RpY2EgaW5mZXJlbmNpYWwgeSBnZW5lcmFjacOzbiBkZSBjb25vY2ltaWVudG8gbWVkaWFudGUgaW5mZXJlbmNpYXMKCkVsIHByb2Nlc28gZGUgZ2VuZXJhY2nDs24gZGUgY29ub2NpbWllbnRvLCBwYXJhIGNvbm9jZXIgdW5hIHJlYWxpZGFkLAp1c3VhbG1lbnRlIHByb2NlZGUgbWVkaWFudGUgYWxndW5hIGRlIGxhcyBkb3MgdsOtYXMgdHJhZGljaW9uYWxlczoKbWVkaWFudGUgbcOpdG9kb3MgZGVkdWN0aXZvcyBvIGluZHVjdGl2b3MuIEVuIHTDqXJtaW5vcyBkZSBLaW5nLCBLZW9oYW5lIHkKVmVyYmEgKDIwMDBbMTk5NF0pLCBsYXMgdHJhZGljaW9uZXMgY3VhbnRpdGF0aXZhcyB5IGN1YWxpdGF0aXZhcyB0YW1iacOpbgpzdXBvbsOtYW4gZm9ybWFzIGRpc3RpbnRhcyBkZSBhY2VyY2Fyc2UgYSBjb25vY2VyIGxhIHJlYWxpZGFkLCBwZXJvIGVuIGVsCmZvbmRvIGFtYmFzIHRyYWRpY2lvbmVzIHNlIGJhc2FuIGVuIHVuYSBtaXNtYSBsw7NnaWNhIGluZmVyZW5jaWFsLgoKRXN0byBlcywgZWwgcHJvY2VzbyBkZSBjb25vY2ltaWVudG8gY2llbnTDrWZpY28gc2UgYXBveWEgZW4gZWwgcHJvY2VzbyBkZQpnZW5lcmFjacOzbiB5IGV2YWx1YWNpw7NuIG1lZGlhbnRlIGVsIHVzbyBkZSBpbmZlcmVuY2lhcy4gVW5hIGluZmVyZW5jaWEKY29uc2lzdGUgZW4gY29ub2NlciBhbGdvIHF1ZSBzZSBkZXNjb25vY2UgYSBwYXJ0aXIgZGUgZWxlbWVudG9zIChkYXRvcykKY29ub2NpZG9zLCBzZWfDum4gS2luZywgS2VvaGFuZSB5IFZlcmJhIFstQGtpbmdfZGlzZW5vXzIwMDBdLiBZIGVzdGFzCnRpZW5kZW4gYSB0cmFkdWNpcnNlIGVuIGRpc3RpbnRhcyBoZXJyYW1pZW50YXMgKGNvbW8gbG8gc29uIGxhcwpoaXDDs3Rlc2lzKSBxdWUsIGVuIGVsIGFuw6FsaXNpcyBjdWFudGl0YXRpdm8sIHNlIGJ1c2NhIHNvbWV0ZXIgYQpldmFsdWFjacOzbiBmcmVudGUgYSBsb3MgZGF0b3MgKGVuIGdyYW4gbWVkaWRhIHByb3ZpZW5lbiBkZSBtdWVzdHJhcykKZGlzcG9uaWJsZXMgY29uIGVsIGZpbiBkZSBjb25vY2VyIGEgbGEgcmVhbGlkYWQgKHBvYmxhY2lvbmFsKSBtZWRpYW50ZQplc3RpbWFjaW9uZXMuCgpMYSBlc3RhZMOtc3RpY2EgaW5mZXJlbmNpYWwgY29uc2lzdGUgZW4gdW4gY29uanVudG8gZGUgdMOpY25pY2FzIHkKaGVycmFtaWVudGFzIGRlIGxhIGVzdGFkw61zdGljYSBjb24gbGFzIHF1ZSBzZSBidXNjYSBnZW5lcmFyCioqZXN0aW1hY2lvbmVzKiogc29icmUgbGEgcmVhbGlkYWQgKHBvYmxhY2lvbmFsKSBhIHBhcnRpciBkZSBsb3MgZGF0b3MKZGlzcG9uaWJsZXMgKG11ZXN0cmFsZXMpIHF1ZSwgYWwgZmluYWwsIHB1ZWRhbiBnZW5lcmFsaXphcnNlLiBEZSBtYW5lcmEKcXVlICJsYSBpbmZlcmVuY2lhIHByZXRlbmRlIGdlbmVyYWxpemFyIGxhIGluZm9ybWFjacOzbiBjb250ZW5pZGEgZW4gdW5vcwpkYXRvcyBhIHVuIGN1ZXJwbyBkZSBjb25vY2ltaWVudG9zIG3DoXMgYW1wbGlvLiIgW0Bjb2JvMjAwNywgcC4gOTJdCgpFbiBlc3RlIHNlbnRpZG8sIGxhIGzDs2dpY2EgZGUgbGEgbWV0b2RvbG9nw61hIGVzdGFkw61zdGljYSBpbmZlcmVuY2lhbCBzZQphcG95YSBlbiBsYSBnZW5lcmFsaXphY2nDs24gbWVkaWFudGUgcmVmdXRhY2nDs24gZW1ww61yaWNhIGRlIGxhcwppbmZlcmVuY2lhcyBpbmljaWFsZXMsIHBvciBsbyBxdWUsIGVuIGVsIGZvbmRvLCBzZSB0cmF0YSBkZSB1biBtw6l0b2RvCmNvbXBhcmF0aXZvIGJhc2FkbyBlbiBsYXMgaGVycmFtaWVudGFzIGVzdGFkw61zdGljYXMgcXVlIHBlcm1pdGVuIGV2YWx1YXIKbWVkaWFudGUgZXN0aW1hY2lvbmVzLgoKTG9zIHRyZXMgdXNvcyBwcmluY2lwYWxlcyBbQHZpbGFsdGEyMDE2LCBwLiAxNDldIGRlIGxhIGVzdGFkw61zdGljYQppbmZlcmVuY2lhbCBjb25zaXN0ZW4gZW46IDEuIEVzdGltYXIgc2kgdW5hIG11ZXN0cmEgZXMgcmVwcmVzZW50YXRpdmEgZGUKdW5hIHBvYmxhY2nDs24uIDIuIEVzdGltYXIgc2kgdW5hIG11ZXN0cmEgZGlmaWVyZSBkZSBvdHJhLiAzLiBFc3RpbWFyIGxhCnByb2JhYmlsaWRhZCBkZSBxdWUgMiBldmVudG9zIGVzdMOpbiByZWxhY2lvbmFkb3MgcG9yIGF6YXIuCgojIyMgMS4xLiBJbmZlcmVuY2lhcyBlIGhpcMOzdGVzaXMKClVuYSBpbmZlcmVuY2lhIGNvbnNpc3RlIGVuIHVuIGFyZ3VtZW50byBxdWUgYnVzY2EgY29ub2NlciBhbGdvIHF1ZSBzZQpkZXNjb25vY2UgKHVzdWFsbWVudGUgc2UgcmVmaWVyZSBhIHVuYSBjYXJhY3RlcsOtc3RpY2EgZGUgbGEgcG9ibGFjacOzbikgYQpwYXJ0aXIgZGUgZWxlbWVudG9zIGNvbm9jaWRvcyAoc3VlbGUgcmVmZXJpcnNlIGEgZGF0b3MgcHJvdmVuaWVudGVzIGRlCnVuYSBtdWVzdHJhKSwgc2Vnw7puIEtpbmcsIEtlb2hhbmUgeSBWZXJiYSBbLUBraW5nX2Rpc2Vub18yMDAwXS4gWSBhCnBhcnRpciBkZSBsYSBnZW5lcmFjacOzbiBkZSBpbmZlcmVuY2lhcyB5IHN1IGV2YWx1YWNpw7NuIGNvbnNlY3VlbnRlLCBzZQpidXNjYSBnZW5lcmFyIGVzdGltYWNpb25lcyBxdWUgcGVybWl0YW4gYWNlcmNhcnNlIGEgY29ub2NlciBsYSByZWFsaWRhZAoocG9ibGFjaW9uYWwpLgoKTGFzIGhpcMOzdGVzaXMgc3VlbGVuIHNlciBsYSBtYW5lcmEgZm9ybWFsIGVuIHF1ZSBzZSB0cmFkdWNlbiBsYXMKaW5mZXJlbmNpYXMgKHlhIHNlYW4gZGVzY3JpcHRpdmFzIG8gY2F1c2FsZXMsIHNlZ8O6biBLaW5nLCBLZW9oYW5lIHkKVmVyYmEgWy1Aa2luZ19kaXNlbm9fMjAwMF0pLCB5IGVzdGFzIHNlIGludGVncmFuIGNvbiBlbGVtZW50b3MKZXNwZWPDrWZpY29zOiAxLiB2YXJpYWJsZXMsIHkgMi4gcmVsYWNpb25lcyBlbnRyZSBsYXMgdmFyaWFibGVzLgoKRW4gZWwgYW7DoWxpc2lzIGN1YW50aXRhdGl2bywgbGFzIGhpcMOzdGVzaXMgc2Vyw6FuIGVsIHB1bnRvIGRlIHBhcnRpZGEgZGVsCmFuw6FsaXNpcyBpbmZlcmVuY2lhbCBwdWVzLCBhIHRyYXbDqXMgZGUgc3UgZXZhbHVhY2nDs24gZW1ww61yaWNhLCBlcyBsYQptYW5lcmEgZW4gcXVlIHNlIGJ1c2NhIGNvbm9jZXIgYSBsYSByZWFsaWRhZC4gRG9uZGUgbGFzIGhpcMOzdGVzaXMKZXN0YWTDrXN0aWNhcyBxdWUgc2UgZ2VuZXJhbiB0aWVuZW4gZG9zIGNhcmFjdGVyw61zdGljYXMgYsOhc2ljYXM6CgoxLiAgU2Vnw7puIHN1IHJvbCBlbiBsYSBpbnZlc3RpZ2FjacOzbiBwdWVkZW4gc2VyOgoKLSAgIEhpcMOzdGVzaXMgYWx0ZXJuYXRpdmFzICgkSF9hJCksIGVzdGEgcHJlc2VudGEgdW4gZW51bmNpYWRvIGludGVncmFkbwogICAgcG9yIHVuYSBvIG3DoXMgdmFyaWFibGVzIHksIGFkZW3DoXMsIGVzdGFibGVjZSB1bmEgcmVsYWNpw7NuCiAgICBzaXN0ZW3DoXRpY2EgZW50cmUgw6lzdGFzLCBwb3IgZWplbXBsbzogJCQgWSA9IGYoWCkkJAotICAgSGlww7N0ZXNpcyBudWxhICgkSF8wJCksIHNlIGludGVncmEgcG9yIGxhcyBtaXNtYXMgdmFyaWFibGVzLCBwZXJvCiAgICBhcXXDrSByZWNoYXphIG8gbmllZ2EgbGEgcmVsYWNpw7NuIHNpc3RlbcOhdGljYSBlc3RhYmxlY2lkYQogICAgcHJldmlhbWVudGU7ICJjb25zaXN0ZSBlbiBsYSBuZWdhY2nDs24gbyBhdXNlbmNpYSBkZSBkaWZlcmVuY2lhCiAgICBbaWd1YWxkYWRdIGRlIHVuIGVmZWN0byIgW0B2aWxhbHRhMjAxNiwgcC4gMTQ2XTogJCRZIFxuZXEgZihYKSQkCgoyLiAgU2Vnw7puIGVsIHRpcG8gZGUgZGlyZWNjacOzbiBlbiBsYSByZWxhY2nDs24gZW50cmUgdmFyaWFibGVzOgoKLSAgIEhpcMOzdGVzaXMgdW5pZGlyZWNjaW9uYWxlcyBzZSByZWZpZXJlbiBhIGFxdWVsbGFzIHF1ZSBwbGFudGVhbiB1bgogICAgc2VudGlkbyBlbiBsYSByZWxhY2nDs24gZW50cmUgbGFzIHZhcmlhYmxlcyB0YW50byBlbiBsYSBtdWVzdHJhIGNvbW8KICAgIGVuIGxhIHBvYmxhY2nDs24uIEFkZW3DoXMsIGVzdMOhcyBoaXDDs3Rlc2lzIHB1ZWRlbiBwbGFudGVhciBkb3MgdGlwb3MKICAgIGRlIHNlbnRpZG9zOgogICAgLSAgIEhpcMOzdGVzaXMgdW5pZGlyZWNjaW9uYWwgaGFjaWEgbGEgZGVyZWNoYSwgZW4gbGEgcXVlIHNlIHBsYW50ZWEKICAgICAgICBxdWUgZWwgcGFyw6FtZXRybyBwb2JsYWNpb25hbCBzZXLDoSB1biB2YWxvciBtYXlvciBhbCBlc3RhZMOtc3RpY28KICAgICAgICBtdWVzdHJhbCAoJFxtdSA+IFxiYXJ7WH0kKS4KICAgIC0gICBIaXDDs3Rlc2lzIHVuaWRpcmVjY2lvbmFsIGhhY2lhIGxhIGl6cXVpZXJkYSwgZW4gbGEgcXVlIHNlCiAgICAgICAgcGxhbnRlYSBxdWUgZWwgcGFyw6FtZXRybyBwb2JsYWNpb25hbCBzZXLDoSB1biB2YWxvciBtZW5vciBhbAogICAgICAgIGVzdGFkw61zdGljbyBtdWVzdHJhbCAoJFxtdSA8IFxiYXJ7WH0kKQotICAgSGlww7N0ZXNpcyBiaWRpcmVjY2lvbmFsZXMgcXVlIGNvbnNpc3RlbiBlbiBhcmd1bWVudG9zIHF1ZSBwbGFudGVhbgogICAgbGEgZXhpc3RlbmNpYSBkZSB1bmEgZGlmZXJlbmNpYSBkZSBsYXMgdmFyaWFibGVzIGVudHJlIGxhIG11ZXN0cmEgeQogICAgbGEgcG9ibGFjacOzbi4gJCRcbXUgXG5lcSBYJCQKCkVuIHTDqXJtaW5vcyBkZSBsYSBkaXN0cmlidWNpw7NuIGRlIHByb2JhYmlsaWRhZCBkZSBsb3MgdmFsb3JlcyBkZSB1bmEKdmFyaWFibGUsIGVsIHByaW1lciB0aXBvIGRlIGhpcMOzdGVzaXMgc2UgY29ub2NlbiB0YW1iacOpbiBjb21vIGhpcMOzdGVzaXMKZGUgInVuYSBjb2xhIiBtaWVudHJhcyBxdWUgbGFzIHNlZ3VuZGFzIHNlIHJlZmllcmVuIGNvbW8gaGlww7N0ZXNpcyBkZQoiZG9zIGNvbGFzLiIKCiMjIyAxLjIuIFBydWViYXMgZGUgaGlww7N0ZXNpcyAobnVsYSkgeSBlcnJvcgoKTGEgbWFuZXJhIGVuIHF1ZSBsYSBlc3RhZMOtc3RpY2EgcmVhbGl6YSBlbCBhbsOhbGlzaXMgeSBsYSBpbnRlcnByZXRhY2nDs24KZGUgbG9zIGRhdG9zIGVtcMOtcmljb3MgZXMgYSB0cmF2w6lzIGRlbCBjb25qdW50byBkZSB0w6ljbmljYXMgeQpoZXJyYW1pZW50YXMgcXVlIHNlIGFncnVwYW4gYmFqbyBlbCBub21icmUgZGUgInBydWViYSBkZSBoaXDDs3Rlc2lzIiwgcXVlCnBlcm1pdGVuIGludGVycHJldGFyIGxhIGluZm9ybWFjacOzbiBvYnRlbmlkYSBhIHBhcnRpciBkZSByZXNwb25kZXIgYQpwcmVndW50YXMgZGUgaW52ZXN0aWdhY2nDs24gW0B2aWxhbHRhMjAxNiwgcC4gMTQ1XSBtZWRpYW50ZSBlbCB1c28gZGUKZXN0aW1hZG9yZXMgKHB1bnR1YWxlcyBvIGludGVydmFsb3MgZGUgY29uZmlhbnphKS4gRXN0ZSBtw6l0b2RvIGRlCmV2YWx1YWNpw7NuIGRlIGxvcyBkYXRvcyB0YW1iacOpbiBzZSBjb25vY2UgY29tbyBwcnVlYmEgZGUgc2lnbmlmaWNhbmNpYQplc3RhZMOtc3RpY2EgKEZpc2hlciwgMTkyNSwgMTkyNikuCgpFbCBtw6l0b2RvIGRlIGxhIHBydWViYSBkZSBzaWduaWZpY2FuY2lhIG8gZGUgaGlww7N0ZXNpcyAiYnVzY2EsIGVuCmVzZW5jaWEsIHByb2JhciBzaSBsYXMgbWVkaWNpb25lcyBwcm92ZW5pZW50ZXMgZGUgdW5hIG11ZXN0cmEgZXN0w6FuIGVuCmFybW9uw61hIGNvbiBsYSBoaXDDs3Rlc2lzIGRlbCBpbnZlc3RpZ2Fkb3IgKEZpc2hlciwgMTkyNSkuIEN1YWxxdWllcgpkaWZlcmVuY2lhIG9ic2VydmFkYSBlbnRyZSBlbCB2ZXJkYWRlcm8gdmFsb3IgZGUgdW4gcGFyw6FtZXRybwpwb2JsYWNpb25hbCB5IHVuIGVzdGFkw61zdGljbyBtdWVzdHJhbCBlbXBsZWFkbyBwYXJhIGVzdGltYXJsbyBzZSBzdWpldGEKYSB1bmEgcHJvYmFiaWxpZGFkLiIgW0B2aWxhbHRhMjAxNiwgcC4gMTQ2XQoKU2kgYmllbiBhbCBpbnRlbnRhciBwcm9iYXIgbGEgc2lnbmlmaWNhbmNpYSBkZSBudWVzdHJhcyBoaXDDs3Rlc2lzIGRlCmludmVzdGlnYWNpw7NuIGRlc2RlIGVsIMOhbWJpdG8gZGUgbGEgZXN0YWTDrXN0aWNhIGluZmVyZW5jaWFsLCB5IHBvciB0YW50bwpkZXNkZSBzdSBhc29jaWFjacOzbiBjb24gbGFzIHByb2JhYmlsaWRhZGVzIGRlIG9jdXJyZW5jaWEgZGUgdW4gcmVzdWx0YWRvCmVzcGVyYWRvIGVuIGxhIHJlYWxpZGFkLCBub3MgZW5mcmVudGFtb3MgYWwgcHJvYmxlbWEgInRyYWRpY2lvbmFsIiBkZSBsYQpldmFsdWFjacOzbiBkZSBoaXDDs3Rlc2lzLiBZIGVzIHF1ZSBzaSBiaWVuIHNlIHJlY29ub2NlIHF1ZSB0b2RhIGhpcMOzdGVzaXMKZGUgdHJhYmFqbyBzaWVtcHJlIHRlbmRyw6EgdW5hIHByb2JhYmlsaWRhZCBkZSBvY3VycmVuY2lhIHksIHBvciB0YW50bywKZGUgc2VyIHZlcmRhZGVyYSBwYXJhIGxhIHJlYWxpZGFkLCBlc3RhIHBvc2liaWxpZGFkIG5vIHBlcm1pdGUsIGFsCmZpbmFsLCBlc3RhYmxlY2VyIGxhIHZlcmFjaWRhZCBkZSBudWVzdHJhcyBoaXDDs3Rlc2lzLgoKVW5hIG1hbmVyYSBhbHRlcm5hdGl2YSAoZGUgdGlwbyBwb3BwZXJpYW5hKSBwYXJhIGNvbm9jZXIgbGEgcmVhbGlkYWQKY29uc2lzdGUgZW4gZWwgbcOpdG9kbyBkZSBsYSByZWZ1dGFjacOzbiBkZSBoaXDDs3Rlc2lzLCBxdWUgcGVybWl0ZSwgYWwKbWVub3MsIGRlc2NhcnRhciBoaXDDs3Rlc2lzIHF1ZSBubyBzZSBhanVzdGVuIGEgbG9zIGRhdG9zIGVtcMOtcmljb3MKZGlzcG9uaWJsZXMuIEEgcGFydGlyIGRlIGVzdGUgcHJvY2VzbyBkZSByZWZ1dGFjacOzbiwgZW4gbGEgZXN0YWTDrXN0aWNhCmluZmVyZW5jaWFsIHNlIG9wdGEgcG9yIGVsIG3DqXRvZG8gZGUgbGEgInBydWViYSBkZSBoaXDDs3Rlc2lzIG51bGEiCihQSE4pLCBlbiBlbCBxdWUgc2UgZGVzZWEgeSBzZSBidXNjYSByZWZ1dGFyIG8gcmVjaGF6YXIKcHJvYmFiaWzDrXN0aWNhbWVudGUgdW5hIGhpcMOzdGVzaXMgZGUgbm8gZWZlY3RvIG8gbnVsYS4gW0B2aWxhbHRhMjAxNiwgcC4KMTQ2XSBFbiBsYSBtZWRpZGEgZW4gcXVlIGxhIGhpcMOzdGVzaXMgbnVsYSBwdWVkYSBzZXIgcmVmdXRhZGEgKHkgcG9yCmVuZGUgdGFtYmnDqW4gc2UgcmVmdXRlIGVsIGFyZ3VtZW50byBkZSBubyBlZmVjdG8gbyBubyBkaWZlcmVuY2lhIGVudHJlCmxhcyB2YXJpYWJsZXMpLCBzZSBwdWVkZSBhY2VwdGFyIHF1ZSBleGlzdGUgdW5hIG1lam9yIGV4cGxpY2FjacOzbiBkZSBsYQpyZWFsaWRhZCBxdWUgc3VlbGUgdWJpY2Fyc2UgZW4gbGEgaGlww7N0ZXNpcyBhbHRlcm5hdGl2YSAoYXF1ZWxsYSBxdWUKcGxhbnRlYSBsYSBleGlzdGVuY2lhIGRlIHVuIGVmZWN0byBvIGRpZmVyZW5jaWEgZW50cmUgdmFyaWFibGVzIGVuIGxhCnBvYmxhY2nDs24pLgoKRGljaGEgcHJ1ZWJhIGRlIGhpcMOzdGVzaXMgbyBkZSBzaWduaWZpY2FuY2lhLCBjb21vIHBhcnRlIGRlbCBwcm9jZXNvCmluZmVyZW5jaWFsIGRlIGdlbmVyYWNpw7NuIGRlIGNvbm9jaW1pZW50bywgc2kgYmllbiBidXNjYSBldmFsdWFyIGxhcwpyZWxhY2lvbmVzIGVudHJlIHZhcmlhYmxlcyBhIHBhcnRpciBkZSBsb3MgZGF0b3MgbXVlc3RyYWxlcyBwYXJhLApwb3N0ZXJpb3JtZW50ZSwgZ2VuZXJhbGl6YXIgbG9zIHJlc3VsdGFkb3MgaGFjaWEgdW5hIHJlYWxpZGFkCnBvYmxhY2lvbmFsLCByZWNvbm9jZSBxdWUgZXN0ZSBwcm9jZXNvIGRlIGdlbmVyYWxpemFjacOzbiBubyBlcwpkZXRlcm1pbmlzdGEgc2lubywgYWwgY29udHJhcmlvLCBwYXJ0ZSBkZSBhc3VtaXIgbGEgZXhpc3RlbmNpYSBkZWwKZmVuw7NtZW5vIGRlIGxhIGluY2VydGlkdW1icmUgcHJlc2VudGUgZW4gbGEgcmVhbGlkYWQsIHF1ZSBzZSBwdWVkZQpyZWZsZWphciBlbiBsb3MgZGF0b3MgbXVlc3RyYWxlcy4KCkRpY2hvcyBlcnJvcmVzIGVuIGVsIGFuw6FsaXNpcyBjdWFudGl0YXRpdm8gc2UgcHVlZGVuIGdlbmVyYXIgZW4KZGlzdGludG9zIG1vbWVudG9zIGRlbCBkaXNlw7FvIGRlIGxhIGludmVzdGlnYWNpw7NuOiBcKiBlbiBlbCBtb21lbnRvIGRlbAptdWVzdHJlbyB5IHJlY29waWxhY2nDs24gZGUgbG9zIGRhdG9zLCBcKiBlbiBsYSBtZWRpY2nDs24gZGUgbGEgcmVhbGlkYWQsCm8gXCogZW4gbGEgcHJlc2VuY2lhIGRlIHZhcmlhYmxlcyBpbnRlcnZpbmllbnRlcyBxdWUgbm8gZnVlcm9uCmNvbnNpZGVyYWRhcyBlbiBsYSBpbnZlc3RpZ2FjacOzbi4gW0B2aWxhbHRhMjAxNjsgQGNvYm8yMDA3OwpAc2Fsa2luZDIwMTNdCgpSZWNvbm9jZXIgbGEgcHJlc2VuY2lhIGRlIGxhIGluY2VydGlkdW1icmUgeSwgdGFtYmnDqW4sIGxhIGV4aXN0ZW5jaWEgZGUKZGl2ZXJzYXMgZnVlbnRlcyBkZSBlcnJvciBkZW50cm8gZGVsIGRpc2XDsW8gZGUgbGFzIGludmVzdGlnYWNpb25lcwpwZXJtaXRlLCBhIHN1IHZleiwgYXN1bWlyIGxhIGV4aXN0ZW5jaWEgZGUgdW4gcmllc2dvIGxhdGVudGUgZW4gZWwKcHJvY2VzbyBkZSBnZW5lcmFsaXphY2nDs24gZGVsIGNvbm9jaW1pZW50byBlbiBlbCBhbsOhbGlzaXMgZXN0YWTDrXN0aWNvCmluZmVyZW5jaWFsLiBEaWNobyByaWVzZ28gbyBlcnJvciBlbiBlbCBwcm9jZXNvIGRlIGVzdGltYWNpw7NuCihpbmZlcmVuY2lhIGVzdGFkw61zdGljYSkgcHVlZGUgc2VyIGRlIGRvcyB0aXBvczogaS4gYWxlYXRvcmlvLCBxdWUgc2UKZGViZW4gYSBmbHVjdHVhY2lvbmVzIGRlbCBhemFyIGVuIGxhcyBkaXN0aW50YXMgZmFzZXMgZGUgbGEKaW52ZXN0aWdhY2nDs24sIHkgaWkuIHNpc3RlbcOhdGljbywgbyBzZXNnb3MgcXVlIHRpZW5kZW4gYSByZXBldGlyc2UgZGUKbWFuZXJhIGNvbnN0YW50ZSBwb3IgZWwgdXNvIGRlIGRpdmVyc2FzIGhlcnJhbWllbnRhcyBkZSBpbnZlc3RpZ2FjacOzbi4KCkRlIGFjdWVyZG8gY29uIENvYm8gWy1AY29ibzIwMDcsIHAuIDEwM10sICJsYSBlc3RhZMOtc3RpY2EgYXl1ZGEgYQpjdWFudGlmaWNhciBsYSBtYWduaXR1ZCBkZSBsb3MgcHJpbWVyb3MgKGVycm9yZXMgYWxlYXRvcmlvcykiIGEgcGFydGlyCmRlbCBjw6FsY3VsbyBkZWwgdGFtYcOxbyBkZWwgImVycm9yIGFsZWF0b3Jpby4iIEVzdG8gcGVybWl0ZSAic2FiZXIgY29uCnF1w6kgZ3JhZG8gZGUgY2VydGlkdW1icmUgbGEgZGlmZXJlbmNpYSBvYnNlcnZhZGEgZW50cmUgdW4gZXN0YWTDrXN0aWNvIHkKdW4gcGFyw6FtZXRybyBwdWVkZSBkZWJlcnNlIGEgdW5hIGZsdWN0dWFjacOzbiBhbGVhdG9yaWEuIiBbU3RpZ2xlciwgMTk4NgpjaXRhZG8gZW4gQHZpbGFsdGEyMDE2LCBwLiAxNDZdCgojIyMgMS4zLiBFcnJvciBhbGVhdG9yaW8KCkVsIGVycm9yIGFsZWF0b3JpbyBjb25zaXN0ZSBlbiBsYSBkaWZlcmVuY2lhIGV4aXN0ZW50ZSBlbnRyZSBhbWJvcwp2YWxvcmVzIChlc3RpbWFkb3JlcykgcXVlIHNlIHByb2R1Y2UgYSByYcOteiBkZSBhbmFsaXphciBhbGdvIGEgcGFydGlyIGRlCnVuYSBtdWVzdHJhIGZyZW50ZSBhIGFuYWxpemFybG8gYSBwYXJ0aXIgZGUgc3UgcG9ibGFjacOzbiBlbnRlcmEgeSwgYSBzdQp2ZXosIHBlcm1pdGUgZXZhbHVhciBlbCBncmFkbyBkZSBjZXJ0aWR1bWJyZSBjb24gZWwgcXVlIHNlIHB1ZWRlCmNvbmNsdWlyIGFsZ28gcGFyYSBsYSBwb2JsYWNpw7NuIGEgcGFydGlyIGRlIGxhIGluZm9ybWFjacOzbiBtdWVzdHJhbApkaXNwb25pYmxlLgoKRWwgZXJyb3IgYWxlYXRvcmlvLCBwb3IgdGFudG8sICJlcyBsYSBvc2NpbGFjacOzbiBkZSBsb3MgZXN0YWTDrXN0aWNvcwpvYnRlbmlibGVzIGVuIGxhcyBwb3NpYmxlcyBtdWVzdHJhcyAoc2llbXByZSBjZW50cmFkb3MgZW4gZWwgcGFyw6FtZXRybwpkZSBsYSBwb2JsYWNpw7NuIG9yaWdlbiBkZSBsYSBtdWVzdHJhKS4iIFtAY29ibzIwMDcsIHAuIDEwNV0KRXNwZWNpYWxtZW50ZSwgbGEgZXZhbHVhY2nDs24gZGVsIHRhbWHDsW8gZGVsIGVycm9yIGFsZWF0b3JpbyBwZXJtaXRlCmNvbXBhcmFyIGxhIGRpc3RhbmNpYSBleGlzdGVudGUgZGUgdW4gZXN0aW1hZG9yIHByZXNlbnRlIGVuIHVuYSBtdWVzdHJhCnJlc3BlY3RvIGRlIHN1IHBvc2ljacOzbiBlbiB1bmEgcG9ibGFjacOzbi4gUGVybyBhIHJhw616IGRlbCBwcm9ibGVtYSBkZQpjYXJlY2VyIGRlIGluZm9ybWFjacOzbiBwb2JsYWNpb25hbCwgw6lzdGEgY29tcGFyYWNpw7NuIHN1ZWxlIGxsZXZhcnNlIGEKY2FibyBlbnRyZSBlbCAqZXN0aW1hZG9yIGRlIHVuYSBtdWVzdHJhKiBjb24gc3UgcG9zaWNpw7NuIGNvcnJlc3BvbmRpZW50ZQphbnRlIHVuYSAqZGlzdHJpYnVjacOzbiBtdWVzdHJhbCogKGVsIGNvbmp1bnRvIGRlIGRpdmVyc2FzIG11ZXN0cmFzIGRlCmlndWFsIHRhbWHDsW8gYWwgdGFtYcOxbyBkZSBsYSBtdWVzdHJhIGRpc3BvbmlibGUpLgoKQSBtZWRpZGEgcXVlIGVsIHRhbWHDsW8gZGVsIGVycm9yIGFsZWF0b3JpbyBkZWwgZXN0aW1hZG9yIHV0aWxpemFkbyBlbiBsYQptdWVzdHJhIGRpc3BvbmlibGUgdGllbmRlIGEgc2VyIHBlcXVlw7FvIChjZXJjYW5vIGEgY2VybyksIHNlIGFzdW1lIHF1ZQpsYSBtdWVzdHJhIHV0aWxpemFkYSBlcyByZXByZXNlbnRhdGl2YSBkZSBsYSBwb2JsYWNpw7NuIGFuYWxpemFkYS4KCkVsIGPDoWxjdWxvIGRlbCBlcnJvciBhbGVhdG9yaW8gc2UgYXBveWEgZW4gZWwgw61uZGljZSBkZWwgKipFcnJvcgplc3TDoW5kYXIgKFNFKSoqIG8gKiplcnJvciB0w61waWNvIGRlIGxhIG1lZGlhKiosIHF1ZSBlcyBlbCBjb2NpZW50ZQpyZXN1bHRhbnRlIGRlIGRpdmlkaXIgYSBsYSBkZXN2aWFjacOzbiBlc3TDoW5kYXIgKCRcc2lnbWEkKSBkZSB1bmEKdmFyaWFibGUgZW50cmUgbGEgcmHDrXogY3VhZHJhZGEgZGVsIHRhbWHDsW8gZGUgbXVlc3RyYSAkXHNxcnR7bn0kOgokJFNFID0gXGZyYWN7XHNpZ21hX1xiYXJ7WH19e1xzcXJ0e259fSQkCgpMYSBmb3JtYSBtYW51YWwgZGUgY2FsY3VsYXIgZWwgKipFcnJvciBlc3TDoW5kYXIgKFNFKSoqIHNlIHJlYWxpemEKYXBsaWNhbmRvIGxhcyB2YXJpYWJsZXMgZGlyZWN0YW1lbnRlIGVuIGxhIGbDs3JtdWxhIHJlZmVyaWRhOgoKYGBge3IgZXJyb3Jfc3RkfQpTRV9FREFEIDwtIHNkKGRhdG9zX2NvdmlkJEVEQUQsIG5hLnJtID0gVFJVRSkgLyBzcXJ0KGxlbmd0aChkYXRvc19jb3ZpZCRFREFEKSkKU0VfRURBRApgYGAKCk90cmEgbWFuZXJhIGRlIG9idGVuZXIgZWwgKipFcnJvciBFc3TDoW5kYXIqKiBwYXJhIHVuYSB2YXJpYWJsZSBjb250aW51YQpkZSBtYW5lcmEgbcOhcyBkaXJlY3RhIGVzIGEgdHJhdsOpcyBkZWwgc2NyaXB0CmBNZWFuU0Uob2JqZXRvLCBzZCA9IE5VTEwsIG5hLnJtID0gVFJVRSlgIGRlIGxhIGxpYnJlcsOtYSBgRGVzY1Rvb2xzKClgLApkZSBsYSBzaWd1aWVudGUgbWFuZXJhOgoKYGBge3IgRVN9ClNFX2FnZSA8LSBNZWFuU0UoZGF0b3NfY292aWQgJCBFREFELCBzZCA9IE5VTEwsIG5hLnJtID0gVFJVRSkKU0VfYWdlCmBgYAoKRWwgdGFtYcOxbyBkZWwgZXJyb3IgYWxlYXRvcmlvIGV4aXN0ZW50ZSBlbnRyZSBsYSBtdWVzdHJhIHkgZWwgY29uanVudG8KZGUgdG9kYXMgbGFzIG11ZXN0cmFzIHBvc2libGVzIGRlbCBtaXNtbyB0YW1hw7FvIChkaXN0cmlidWNpw7NuIG11ZXN0cmFsKSwKYSBwYXJ0aXIgZGUgY29tcGFyYXIgZWwgZXN0aW1hZG9yIGRlIGxhIG1lZGlhIHBhcmEgYW1iYXMsIGVzIGRlIGNhc2kKMC4wMyBkZXN2aWFjaW9uZXMgZXN0w6FuZGFyLiBMbyBxdWUgcmVmaWVyZSBxdWUgbG9zIGRhdG9zIGRlIGxhIG11ZXN0cmEKZGlzcG9uaWJsZSBzb24gbXV5IGNlcmNhbm9zIGEgbG9zIGRhdG9zIGV4aXN0ZW50ZXMgZW4gbGEgZGlzdHJpYnVjacOzbgptdWVzdHJhbCwgcXVlIGVzIG51ZXN0cmEgbWVqb3IgYXByb3hpbWFjacOzbiBhIGxhIHBvYmxhY2nDs24uCgpGaW5hbG1lbnRlLCBhIHBhcnRpciBkZSBsYSBkZWZpbmljacOzbiBvcGVyYWNpb25hbCBkZWwgZXJyb3IgYWxlYXRvcmlvLApzZSBvYnNlcnZhIHF1ZSBleGlzdGUgdW5hIHJlbGFjacOzbiBpbnZlcnNhIGVudHJlIGVsIHRhbWHDsW8gZGUgbGEgbXVlc3RyYQp5IGVsIGVycm9yIHTDrXBpY28sIHB1ZXMgYSBtZWRpZGEgcXVlIHRpZW5lIGEgYXVtZW50YXIgZWwgcHJpbWVybywgZWwKc2VndW5kbyBzZSByZWR1Y2lyw6EgeSB2aWNldmVyc2EuIFtAY29ibzIwMDddCgpQcmVndW50YTogwr9DdcOhbCBzZXLDoSBlbCB0YW1hw7FvIGRlbCBlcnJvciBlc3TDoW5kYXIgZGUgbGEgdmFyaWFibGUgZGUgRURBRApkZSBsb3MgcGFjaWVudGVzIGNvbiBzw61udG9tYXMgZGUgY292aWQtMTkgZW4gY2FzbyBxdWUgZWwgdGFtYcOxbyBkZQptdWVzdHJhIChuKSBmdWVzZSBkZSA4MDAsMDAwIGluZGl2aWR1b3M/CgrCv0N1w6FsIHNlcsOhIGVsIHRhbWHDsW8gZGVsIGVycm9yIGVzdMOhbmRhciBkZSBsYSB2YXJpYWJsZSBkZSBFZGFkIGRlIGxvcwpwYWNpZW50ZXMgY29uIHPDrW50b21hcyBkZSBjb3ZpZC0xOSBlbiBjYXNvIHF1ZSBlbCB0YW1hw7FvIGRlIG11ZXN0cmEgKG4pCmZ1ZXNlIGRlIDEwMCwwMDAgaW5kaXZpZHVvcz8KCiMjIDIuIEVzdGltYWNpw7NuIHkgc2lnbmlmaWNhbmNpYSBlc3RhZMOtc3RpY2EKCkVsIHByb2Nlc28gZGUgbGEgaW5mZXJlbmNpYSBlc3RhZMOtc3RpY2EgcXVlIHNlIGFwb3lhIGVuIGxhcyBwcnVlYmFzIGRlCmhpcMOzdGVzaXMgbyBzaWduaWZpY2FuY2lhIHNlIGFwb3lhIGVuIGxhcyBoZXJyYW1pZW50YXMgZGUgbGEgZXN0aW1hY2nDs24KZGUgdW4gcGFyw6FtZXRybyBhIHBhcnRpciBkZSB1biBlc3RhZMOtc3RpY28gcHJvdmVuaWVudGUgZGUgdW5hIG11ZXN0cmEuIFkKZGljaG8gcHJvY2VzbyBkZSBlc3RpbWFjacOzbiBzZSBwdWVkZSByZWFsaXphciBtZWRpYW50ZSBkb3MgaW5zdHJ1bWVudG9zOgoKMVwuIEVzdGltYWRvcmVzIHB1bnR1YWxlcywgbwoKMlwuIEludGVydmFsb3MgZGUgQ29uZmlhbnphLgoKQSBwYXJ0aXIgZGUgZXN0b3MgZXN0aW1hZG9yZXMgc2UgYnVzY2FuIHJlc3BvbmRlciBkb3MgdGlwb3MgZGUgcHJlZ3VudGFzCnJlbGFjaW9uYWRhcyBjb24gbGEgcHJ1ZWJhIGRlIHVuYSBoaXDDs3Rlc2lzOgoKMVwuIMK/U2UgcHVlZGUgbmVnYXIgY2llcnRvIHZhbG9yIGRlbCBwYXLDoW1ldHJvPyBFc3RhIHNlcsOhIHJlc3BvbmRpZGEKbWVuZGlhbnRlIGxhIFBITiB5IHN1ICoqTml2ZWwgZGUgU2lnbmlmaWNhbmNpYSBlc3RhZMOtc3RpY2EqKiwgeQoKMlwuIMK/UXXDqSB2YWxvcmVzIGRlbCBwYXLDoW1ldHJvIHNvbiBjcmXDrWJsZXM/IEVzdGEgc2Vyw6EgcmVzcG9uZGlkYQptZWRpYW50ZSBsb3MgKipJbnRlcnZhbG9zIGRlIENvbmZpYW56YSoqIHkgc3Ugbml2ZWwgZGUgY29uZmlhbnphIChlc3RvCnNlIGFib3JkYXLDoSBlbiBvdHJhIHNlc2nDs24pLgoKIyMjIDIuMS4gRXN0aW1hY2nDs24gcHVudHVhbAoKVW4gKiplc3RpbWFkb3IgcHVudHVhbCoqICJlcyBsYSByZXByZXNlbnRhY2nDs24gbnVtw6lyaWNhIGRlIHVuYQpjYXJhY3RlcsOtc3RpY2EgZGUgdW5hIHBvYmxhY2nDs24gcXVlIHNlIHJlYWxpemEgYSBwYXJ0aXIgZGUgdW5hIG11ZXN0cmEuCkVzIHVuIGVzdGFkw61zdGljbyBtdWVzdHJhbCBwYXJhIGVzdGltYXIgdW4gdmFsb3IgZGUgaW50ZXLDqXMgZW4gdW5hCnBvYmxhY2nDs24gbyB1bml2ZXJzbyIuIFtAdmlsYWx0YTIwMTYsIHAuIDk0XSBBIHBhcnRpciBkZWwgc3VwdWVzdG8gZGVsCioqKlRlb3JlbWEgZGVsIEzDrW1pdGUgQ2VudHJhbCoqKiBzZSBhc3VtZSBxdWUgZWwgZWplbXBsbyBjbMOhc2ljbyBkZQplc3RpbWFkb3IgcHVudHVhbCBlcyBsYSBtZWRpYSBhcml0bcOpdGljYSBkZSB1bmEgbXVlc3RyYSwgcXVlIHNlIHRyYXRhCmNvbW8gc2kgZnVlcmEgdW5hIHZhcmlhYmxlIGFsZWF0b3JpYS4gRXN0byBwZXJtaXRlLCB0YW1iacOpbiwgcXVlIHN1CmPDoWxjdWxvIHNlIHJlYWxpY2Ugc29icmUgbGEgYmFzZSBkZSB1bmEgKmRpc3RyaWJ1Y2nDs24gZGUgcHJvYmFiaWxpZGFkZXMqCnksIGFzw60sIGV2YWx1YXIgbGEgaGlww7N0ZXNpcyBnZW5lcmFkYSBhIHBhcnRpciBkZSBkaWNobyBlc3RpbWFkb3IgeSwKZmluYWxtZW50ZSwgaW50ZXJwcmV0YXIgc3UgcmVzdWx0YWRvIGEgbGEgbHV6IGRlIHVuIGNyaXRlcmlvIGRlCmRlY2lzacOzbi4gRGljaG8gY3JpdGVyaW8gc2UgcmVmaWVyZSBhIGxhICoqc2lnbmlmaWNhbmNpYSBlc3RhZMOtc3RpY2EgZGVsCmVzdGltYWRvcioqLgoKIyMjIyAyLjEuMS4gUHJ1ZWJhIGRlIHNpZ25pZmljYW5jaWEgZXN0YWTDrXN0aWNhIGRlIHVuIGVzdGltYWRvciBwdW50dWFsIChtZWRpYSkKCkxhICoqcHJ1ZWJhIGRlIHNpZ25pZmljYW5jaWEgZXN0YWTDrXN0aWNhKiogZXMgdW5hIHTDqWNuaWNhIGRlIGVzdGFkw61zdGljYQppbmZlcmVuY2lhbCBxdWUgc2UgdXNhICJwYXJhIGp1emdhciBzaSB1bmEgcHJvcGllZGFkIHF1ZSwgc2Ugc3Vwb25lLApjdW1wbGUgdW5hIHBvYmxhY2nDs24gZXMgY29tcGF0aWJsZSBjb24gbG8gb2JzZXJ2YWRvIGVuIHVuYSBtdWVzdHJhIGRlIGxhCm1pc21hLiIgW0Bjb2JvMjAwNywgcC4gMTYwXSBBIHBhcnRpciBkZSBkaWNoYSBjb21wYXJhY2nDs24gZGUgbGFzCnByb2JhYmlsaWRhZGVzIGNhbGN1bGFkYXMgcGFyYSBlbCB2YWxvciBvYnNlcnZhZG8gZW4gdW5hIG11ZXN0cmEKcmVzcGVjdG8gZGVsIG1pc21vIHZhbG9yIGNvcnJlc3BvbmRpZW50ZSBwYXJhIGVsIHBhcsOhbWV0cm8gcG9ibGFjaW9uYWwKZXMgcXVlIHNlIGJ1c2NhIGVzdGFibGVjZXIgdW4gY3JpdGVyaW8gZGUgZGVjaXNpw7NuIHBhcmEgYWNlcHRhciBvCnJlY2hhemFyIGxhIGhpcMOzdGVzaXMgcGxhbnRlYWRhIHBhcmEgY29ub2NlciBsYSByZWFsaWRhZCAocG9ibGFjaW9uYWwpLApyZWNvbm9jaWVuZG8gc2llbXByZSBsYSBleGlzdGVuY2lhIGRlIHVuIGVycm9yIGFsZWF0b3JpbywgbyBlbCByaWVzZ28KYXNvY2lhZG8gY29uIG5vIGVzdGFyIDEwMCUgc2VndXJvIGRlIHF1ZSBsbyBvYnNlcnZhZG8gZW4gdW5hIG11ZXN0cmEgc2UKZGViZSBhIGNhdXNhcyBzaXN0ZW3DoXRpY2FzICh0cmF0YW1pZW50bywgdmFyaWFibGUgaW5kZXBlbmRpZW50ZSwgY2F1c2EKZXNwZXJhZGEsIGV0Yy4pLiIgW0BzYWxraW5kMjAxM10KCkNvbiBlbCBmaW4gZGUgZXZhbHVhciBkaWNoYSBjb21wYXJhY2nDs24gZGUgcHJvYmFiaWxpZGFkZXMsIHkgcGFyYSB0b21hcgp1bmEgZGVjaXNpw7NuIGFsIHJlc3BlY3RvIGNvbnNpZGVyYW5kbyBlbCByaWVzZ28gZGVsIGVycm9yIGFsZWF0b3Jpbywgc2UKdXRpbGl6YSB1biBjcml0ZXJpbyBkZSBkZWNpc2nDs24gcXVlIGNvbnNpc3RlIGVuIGVsICoqTml2ZWwgZGUKc2lnbmlmaWNhbmNpYSoqIChyZXByZXNlbnRhZG8gcG9yIGxhIGxldHJhIGdyaWVnYSAkXGFscGhhJCkuIEVzdGUgImVzIGVsCmdyYWRvIGRlIHJpZXNnbyBxdWUgc2UgZGVzZWEgYWNlcHRhciBwYXJhIHJlY2hhemFyIGxhIGhpcMOzdGVzaXMgbnVsYSAoYQpwYXJ0aXIgZGUgbG9zIGRhdG9zIG11ZXN0cmFsZXMpIGN1YW5kbyBlcyB2ZXJkYWRlcmEgZW4gbGEgcmVhbGlkYWQKKHBvYmxhY2lvbmFsKS4iIFkgZGljaG8gZ3JhZG8gZGUgcmllc2dvIGVuIGVsIGZvbmRvIGNvbnNpc3RlIGVuIHVuYQpwcm9iYWJpbGlkYWQgY29uZGljaW9uYWwgc29icmUgZWwgcmllc2dvIGFjZXB0YWJsZSwgZGUgbWFuZXJhIHF1ZToKJCRcYWxwaGEgPSBQKFx0ZXh0e3JlY2hhemFyIEgwfSB8IFx0ZXh0e0gwIGVzIHZlcmRhZGVyYX0pJCQKCiMjIyMgMi4xLjIuIFRpcG9zIGRlIGVycm9yIGVuIGxhcyBwcnVlYmFzIGRlIGhpcMOzdGVzaXMKCkRlYmlkbyBhIGxhIG5hdHVyYWxlemEgcHJvYmFiaWzDrXN0aWNhIGRlIGxhcyBwcnVlYmFzIGRlIGhpcMOzdGVzaXMgKG51bGEpCm8gZGUgc2lnbmlmaWNhbmNpYSBlc3RhZMOtc3RpY2EsIGxvIHF1ZSBzZSBidXNjYSBlcyBldmFsdWFyIGxhCnByb2JhYmlsaWRhZCBkZSBvY3VycmVuY2lhIGRlIGxhIGhpcMOzdGVzaXMgbnVsYSBjb24gZWwgZmluIGRlIHRvbWFyIHVuYQpkZWNpc2nDs24gZmluYWwgc29icmUgbGEgdmVyb3NpbWlsaXR1ZCBkZSBsYSBtaXNtYS4KClVuYSBjYXJhY3RlcsOtc3RpY2EgcHJvYmFiaWzDrXN0aWNhIGRlIHRvZG8gcmVzdWx0YWRvIG8gZXZlbnRvIHBvc2libGUgZGUKbGEgdmFyaWFibGUgZGUgaW50ZXLDqXMgY29uc2lzdGUgZW4gcXVlIHN1IHByb2JhYmlsaWRhZCBkZSBvY3VycmVuY2lhLApwb3IgbcOhcyBtw61uaW1hIHF1ZSBwdWVkYSBzZXIsIG51bmNhIHNlcsOhIGlndWFsIGEgMCAoYXVzZW5jaWEgZGVsIGV2ZW50bykKbyBhIDEgKHByZXNlbmNpYSBjb21wbGV0YSBkZWwgZXZlbnRvKS4gRGUgbWFuZXJhIHF1ZSB0YW50byBsYSBoaXDDs3Rlc2lzCmFsdGVybmF0aXZhIGFzw60gY29tbyBsYSBoaXDDs3Rlc2lzIG51bGEgc2llbXByZSB0aWVuZW4gYXNvY2lhZGEgdW5hCnByb2JhYmlsaWRhZCBkZSBvY3VycmVuY2lhLgo8IS0tLSBJTkNMVUlSIElNQUdFTiBERSBESVNUUklCVUNJw5NOIERFIEhJUMOTVEVTSVMtLS0+CgpBbnRlIGRpY2hhIHNpdHVhY2nDs24sIGVsICoqbml2ZWwgZGUgc2lnbmlmaWNhbmNpYSoqIGVzIGVsIGNyaXRlcmlvIGRlCmRlY2lzacOzbiBxdWUgc2UgdXRpbGl6YSBwYXJhIGV2YWx1YXIgbGEgb2N1cnJlbmNpYSBkZWwgZXZlbnRvIGFuYWxpemFkbwp5LCB0YW1iacOpbiwgcGFyYSBxdWUgZWwgYW5hbGlzdGEgdG9tZSB1bmEgKmRlY2lzacOzbiogKGFjZXB0YXIgbwpyZWNoYXphcikgc29icmUgbGEgaGlww7N0ZXNpcyBldmFsdWFkYSBjb21vIGxhIG1lam9yIGV4cGxpY2FjacOzbiBwb3NpYmxlCmRlIGxhIHJlYWxpZGFkLgoKU2luIGVtYmFyZ28sIGRlYmlkbyBhIGxhIG1pc21hIG5hdHVyYWxlemEgcHJvYmFiaWzDrXN0aWNhIGRlIGxhIHBydWViYXMKZGUgaGlww7N0ZXNpcyAobnVsYSkgbyBzaWduaWZpY2FuY2lhIGVzdGFkw61zdGljYSB0YW1iacOpbiBzZSBjb3JyZSBlbApyaWVzZ28gZGUgY29tZXRlciAqKmVycm9yZXMqKiBhbCBldmFsdWFyIGxhIHByb2JhYmlsaWRhZCBkZSBvY3VycmVuY2lhCmRlIHVuYSBoaXDDs3Rlc2lzIGEgcGFydGlyIGRlIGxvcyBkYXRvcyBtdWVzdHJhbGVzLCB5IHRhbWJpw6luIHNlIHB1ZWRlbgpnZW5lcmFyIGVycm9yZXMgYWwgbW9tZW50byBlbiBxdWUgZWwgYW5hbGlzdGEgZGViZSB0b21hciB1bmEgZGVjaXNpw7NuCnNvYnJlIGxhIGhpcMOzdGVzaXMgKG51bGEpIGV2YWx1YWRhLgoKQWwgZXZhbHVhciBsYSBoaXDDs3Rlc2lzIG51bGEgc2UgZGViZSBjb25zaWRlcmFyIHF1ZSwgZW4gbGEgKnBvYmxhY2nDs24qCmRpY2hhIGhpcMOzdGVzaXMgcHVlZGUgc2VyIHZlcmRhZGVyYSBvIGZhbHNhLCBtaWVudHJhcyBxdWUgZWwgYW5hbGlzdGEKZGViZSAqKmRlY2lkaXIqKiBlbnRyZSAqcmVjaGF6YXIqIG8gKm5vIHJlY2hhemFyKiBsYSBoaXDDs3Rlc2lzIG51bGEuCgpBbnRlIGVzdGEgY29tYmluYWNpw7NuIGRlIHBvc2liaWxpZGFkZXMsIHNlIHB1ZWRlbiBnZW5lcmFyICoqZG9zIHRpcG9zIGRlCmVycm9yKiogZW4gbGFzIHBydWViYXMgZGUgc2lnbmlmaWNhbmNpYToKCjEuICBFcnJvciB0aXBvIEksIHkKMi4gIEVycm9yIHRpcG8gSUkuCgp8IERlY2lzacOzbiBkZWwgYW5hbGlzdGEgfCBIMCBWZXJkYWRlcmEgICAgICAgIHwgSDAgRmFsc2EgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBBY2VwdGFyICAgICAgICAgICAgICAgfCBEZWNpc2nDs24gY29ycmVjdGEgICB8IEVycm9yIHRpcG8gSUkgKGJldGEpICAgICAgICAgICAgICAgICB8CnwgUmVjaGF6YXIgICAgICAgICAgICAgIHwgRXJyb3IgdGlwbyBJIChhbGZhKSB8IERlY2lzacOzbiBjb3JyZWN0YSAocG9kZXIgPSAxIC0gYmV0YSkgfAoKMS4gIEVsIGVycm9yIHRpcG8gSSBzZSBjb3JyZXNwb25kZSBjb24gZWwgKipOaXZlbCBkZSBTaWduaWZpY2FuY2lhKiosIG8KICAgIHF1ZSBwdWVkZSBzZXIgY29uY2ViaWRvIHRhbWJpw6luIGNvbW8gdW4gKmZhbHNvIHBvc2l0aXZvKi4gWSBlc3RlCiAgICBjb25zaXN0ZSBlbiBsYTogJFAocmVjaGF6YXIgSDAgfCBIMCB2ZXJkYWRlcmEpJC4gRXN0YSBwcm9iYWJpbGlkYWQKICAgIGxhIGRlZmluZSBlbCBhbmFsaXN0YSBkZSBtYW5lcmEgZGlzY3JlY2lvbmFsIHkgZGUgYW50ZW1hbm8gYSBsYQogICAgcmVhbGl6YWNpw7NuIGRlIGxhIHBydWViYSBkZSBzaWduaWZpY2FuY2lhOyBlbnRyZSBsb3MgdmFsb3JlcwogICAgZXN0w6FuZGFyIHF1ZSBzZSB1dGlsaXphbiBwYXJhIGV2YWx1YXIgZGljaG8gcmllc2dvIGRlIGVycm9yIHNlCiAgICBzdWVsZW4gdWJpY2FyIGVuIDUlIG8gMSUgKEZpc2hlciwgMTkyNSkuIEVzdG8gZXMsIHNlIGNvbnNpZGVyYQogICAgYWNlcHRhYmxlIHVuIGVycm9yIChvIG5pdmVsIGRlIHNpZ25pZmljYW5jaWE6ICRcYWxwaGEkKSBkZWwgNSUsIGVuCiAgICBkb25kZSBzZSBjb250ZW1wbGEgcXVlIDEgZGUgY2FkYSAyMCBjYXNvcyBlbCBhbmFsaXN0YSB0b21lIHVuYQogICAgZGVjaXNpw7NuIGVycmFkYS4KCjIuICBFbCBlcnJvciB0aXBvIElJIGNvbnNpc3RlIGVuIGxhIHByb2JhYmlsaWRhZCBkZToKICAgICRQKGFjZXB0YXIgSDAgfCBIMCBmYWxzYSkkLCB5IHF1ZSBzZSBjb25vY2UgdGFtYmnDqW4gY29tbyB1biAqZmFsc28KICAgIG5lZ2F0aXZvKi4gRXN0ZSBzdWVsZSByZXByZXNlbnRhcnNlIGNvbiBlbCBlc3RpbWFkb3IgJFxiZXRhJCwgcXVlCiAgICBlc3TDoSB2aW5jdWxhZG8gYWwgdGFtYcOxbyBkZSBtdWVzdHJhICgkbiQpIHksIHBvciB0YW50bywgbm8gcHVlZGUKICAgIG1hbmlwdWxhcnNlIGRpcmVjdGFtZW50ZSBwb3IgZWwgYW5hbGlzdGEuIEEgc3UgdmV6LCBsYSBwcm9iYWJpbGlkYWQKICAgIGludmVyc2EgJDEtXGJldGEkIHNlIGNvbm9jZSBjb21vIGVsICoqcG9kZXIgZXN0YWTDrXN0aWNvKiogZGUgbGEKICAgIHBydWViYSBkZSBoaXDDs3Rlc2lzLCB5IHF1ZSBjb25zaXN0ZSBlbiBhZG9wdGFyIHVuYSBkZWNpc2nDs24gY29ycmVjdGEKICAgIGN1YW5kbyAkUChcdGV4dHtyZWNoYXphciBIMH0gfCBcdGV4dHtIMCBlcyBmYWxzYX0pJC4gW011cnBoeSB5CiAgICBNeWVycywgMjAwNCBjaXRhZG8gZW4gQHZpbGFsdGEyMDE2LCBwLiAxNTVdCgojIyMgMi4yLiBMw7NnaWNhIGRlIGxhIHBydWViYSBkZSBoaXDDs3Rlc2lzIHkgcC12YWx1ZQoKU2kgYmllbiBlbCAqKk5pdmVsIGRlIFNpZ25pZmljYW5jaWEqKiBjb25zaXN0ZSBlbiBlbCBjcml0ZXJpbyB1dGlsaXphZG8KcG9yIGVsIGFuYWxpc3RhIHBhcmEgdG9tYXIgdW5hIGRlY2lzacOzbiBzb2JyZSBsYSBpbmZlcmVuY2lhIGdlbmVyYWRhIGVuCnRvcm5vIGEgdW5hIGhpcMOzdGVzaXMgbnVsYSwgZWwgZXN0aW1hZG9yIHF1ZSBzZSB1dGlsaXphIHBhcmEgZXZhbHVhciBsYQpzaWduaWZpY2FuY2lhIGVzdGFkw61zdGljYSAocHJvYmFiaWxpZGFkKSBhc29jaWFkYSBhIGRpY2hhIGhpcMOzdGVzaXMKY29uc2lzdGUgZW4gZWwgKipwLXZhbG9yKiouCgpFc3RlIGNvbnNpc3RlIGVuICJsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIHNlIHByZXNlbnRlIHVuIHZhbG9yIGRlbAplc3RhZMOtc3RpY28gKG1lZGlhKSBtw6FzIGFsZWphZG8gZGUgbGEgaGlww7N0ZXNpcyBudWxhIChlbiBsYSBwb2JsYWNpw7NuKQpxdWUgZWwgb2JzZXJ2YWRvIChlbiBsYSBtdWVzdHJhKS4iIFtAY29ibzIwMDcsIHAuIDE2MF0gTyBkaWNobyBkZSBvdHJhCm1hbmVyYSwgZXMgbGEgInByb2JhYmlsaWRhZCBkZSBvYnNlcnZhciB2YWxvcmVzIGRlbCBlc3RhZMOtc3RpY28gaWd1YWwgbwptw6FzIGV4dHJlbW9zIHF1ZSBlbCBvYnNlcnZhZG8sIGVuIGNhc28gZGUgcXVlIGxhIGhpcMOzdGVzaXMgbnVsYSBzZWEKY2llcnRhLiIgW0Bjb2JvMjAwNywgcC4gMTYwXQoKU3UgaW50ZXJwcmV0YWNpw7NuIGRlYmUgcmVjb25vY2VyIHF1ZSAic2kgZWwgKipwLXZhbG9yKiogZXMgcGVxdWXDsW8sIHNlCmRpY2UgcXVlIGxhIGhpcMOzdGVzaXMgbnVsYSBlcyBpbnZlcm9zw61taWwuICguLi4pIChPKSBDdcOhbiBpbnZlcm9zw61taWwgZXMKZWwgcmVzdWx0YWRvIG9ic2VydmFkbyBzaSBsYSBoaXDDs3Rlc2lzIG51bGEgZnVlcmEgY2llcnRhIiBvICJIYXN0YSBxdcOpCnB1bnRvIGVsIHJlc3VsdGFkbyBvYnNlcnZhZG8gKGVuIGxhIG11ZXN0cmEpIGVzIHByb2JhYmlsw61zdGljYW1lbnRlCmNvbXBhdGlibGUgY29uIGxhIGhpcMOzdGVzaXMgbnVsYS4iIFtAY29ibzIwMDcsIHAuIDE2MF0KCkxhIGzDs2dpY2EgZGUgbGEgUEhOIGNvbnNpc3RlIGVuIGFsY2FuemFyIHJlc3VsdGFkb3MgYWx0YW1lbnRlCnNpZ25pZmljYXRpdm9zLCBvIGxvIHF1ZSBlcyBsbyBtaXNtbyAiYnVzY2FyIGxhIG1lbm9yIHByb2JhYmlsaWRhZCBkZQpjb21ldGVyIHVuIGVycm9yIHRpcG8gSSIgcXVlIHBlcm1pdGEsIGFsIGZpbmFsLCByZWNoYXphciBhIGxhIGhpcMOzdGVzaXMKbnVsYSBjb21vIGxhIG1lam9yIGV4cGxpY2FjacOzbiBwb3NpYmxlIGRlIGxhIHJlYWxpZGFkLgoKRGUgbWFuZXJhIHF1ZSAiY2FkYSBIMCB0aWVuZSBhc29jaWFkYSB1biB0aXBvIHBhcnRpY3VsYXIgZGUgZXN0YWTDrXN0aWNvCih6LCB0LCBGLCB1IG90cm8pLiBZIGNhZGEgZXN0YWTDrXN0aWNvIHRpZW5lIGFzb2NpYWRvIHVuIHRpcG8gZXNwZWNpYWwgZGUKZGlzdHJpYnVjacOzbiBkZSBwcm9iYWJpbGlkYWRlcyBjb24gbGEgcXVlIHNlIHB1ZWRlIGNvbXBhcmFyIGxvcyBkYXRvcyBkZQp1bmEgbXVlc3RyYS4gTGEgY29tcGFyYWNpw7NuIGVudHJlIGxhcyBjYXJhY3RlcsOtc3RpY2FzIGRlIGxhIG11ZXN0cmEKZnJlbnRlIGEgbG9zIGRlIGxhIHBvYmxhY2nDs24sIGVuIGxhIHBydWViYSBkZSBkaXN0cmlidWNpw7NuIHBlcm1pdGVuCmNvbmNsdWlyIHNpIGxhcyBjYXJhY3RlcsOtc3RpY2FzIGRlIGxhIG11ZXN0cmEgc29uIGRpZmVyZW50ZXMgYSBsbyBxdWUgc2UKZXNwZXJhcsOtYSBvYnRlbmVyIHBvciBhemFyIChlbiBsYSBwb2JsYWNpw7NuLCByZXByZXNlbnRhZGEgbWVkaWFudGUgbGEKY3VydmEgZGUgZGlzdHJpYnVjacOzbiBkZSBwcm9iYWJpbGlkYWRlcykuIiBbQHNhbGtpbmQyMDEzXQoKRXN0byBlcywgc2UgY29tcGFyYSBlbCAqKnAtdmFsb3IqKiBjYWxjdWxhZG8geSBhc29jaWFkbyBhIGxhCnByb2JhYmlsaWRhZCBkZSBvY3VycmVuY2lhIGRlICRIXzAkIGNvbiByZXNwZWN0byBhbCAqKk5pdmVsIGRlCnNpZ25pZmljYW5jaWEqKiAoJFxhbHBoYSQpIHByZXZpYW1lbnRlIGRlZmluaWRvLCB5IGEgcGFydGlyIGRlIGVsbG8gc2UKdG9tYSB1bmEgZGVjaXNpw7NuIGNlbnRyYWRhIGVuIGxhICoqSGlww7N0ZXNpcyBudWxhKiogKCRIXzAkKS4KCiMjIyMgMi4yLjEuIFBhc29zIGRlIGxhIHBydWViYSBkZSBoaXDDs3Rlc2lzIG8gc2lnbmlmaWNhbmNpYS4KCkxhIHBydWViYSBkZSBzaWduaWZpY2FuY2lhIGhhY2UgdW5hIHByZWd1bnRhIGNvbmNyZXRhIHNvYnJlIGVsIHZhbG9yIGRlbApwYXLDoW1ldHJvIGVuIGxhIHBvYmxhY2nDs24gYSBwYXJ0aXIgZGUgbG9zIGRhdG9zIG9ic2VydmFkb3MgZW4gbGEgbXVlc3RyYQpvIHNpICRccGkgPSBcYmFye3h9JC4gWSBkb25kZSBsYSBoaXDDs3Rlc2lzIG51bGEgImVzIGVsIHB1bnRvIGRlIHNhbGlkYQpkZSBsYSBpbnZlc3RpZ2FjacOzbiwgcG9yIGxvIHF1ZSBkZWJlIGVzdGFibGVjZXJzZSBwcmV2aW8gYSBsYQpyZWNvbGVjY2nDs24gZGUgbG9zIGRhdG9zLiIgW0Bjb2JvMjAwNywgcC4gMTcwXQoKQSBwYXJ0aXIgZGUgZGljaGEgcHJ1ZWJhIGRlIHNpZ25pZmljYW5jaWEgc2UgYnVzY2EgInRvbWFyIHVuYSBkZWNpc2nDs24KKHNvYnJlIEgwKSwgbWFudGVuaWVuZG8gbG9zIHJpZXNnb3MgZGVsIGVycm9yLCBjb250cm9sYWRvcyIsIGFsIG1pc21vCnRpZW1wbyBxdWUgc2UgImFwb3J0YSBldmlkZW5jaWEgZW4gY29udHJhIGRlIGxhIGhpcMOzdGVzaXMgbnVsYS4iCltAY29ibzIwMDcsIHAuIDE3MS0xNzJdCgpMYSBtZWPDoW5pY2EgZGUgbGFzIHBydWViYXMgZGUgc2lnbmlmaWNhbmNpYSBvIGRlIGhpcMOzdGVzaXMgc2lndWVuIHVuYQpzZXJpZSBkZSBwYXNvcywgeSBlc3RvcyB0aWVuZGVuIGEgdmFyaWFyIHNlZ8O6biBjYWRhIGF1dG9yLiBBCmNvbnRpbnVhY2nDs24gc2UgcHJlc2VudGFuIHVuYSBzZXJpZSBkZSA2IHBhc29zLCBiYXNhZG9zIGVuIGxhIHByb3B1ZXN0YQpkZSBTYWxraW5kIFstQHNhbGtpbmQyMDEzXToKCjEuICAqKipEZWZpbmljacOzbioqKiBkZSBsYSAqKkhpcMOzdGVzaXMgbnVsYSoqICgkSF8wJCksIGVzdGEgY29uc2lzdGUKICAgIHNpZW1wcmUgZW4gdW5hICJpZ3VhbGRhZCIgbyBlbiBsYSBuZWdhY2nDs24gZGVsIGVmZWN0byBlbnRyZQogICAgdmFyaWFibGVzLiBQb3IgZWplbXBsbzogJFxtdSA9IFxiYXJ7eH0kLgoKMi4gICoqKkRlZmluaWNpw7NuKioqIGRlbCAqKk5pdmVsIGRlIFNpZ25pZmljYW5jaWEqKiAoJFxhbHBoYSQpIHBvciBlbAogICAgYW5hbGlzdGEsIHF1ZSBzdWVsZSB1YmljYXJzZSBlbiB2YWxvcmVzIGVzdMOhbmRhciBkZSA1JSBvIDElLgoKMy4gICoqKlNlbGVjY2nDs24qKiogZGVsICoqZXN0YWTDrXN0aWNvKiogYXByb3BpYWRvIHNlZ8O6biBsYSAqZGlzdHJpYnVjacOzbgogICAgZGUgcHJvYmFiaWxpZGFkKiBkZSBsYSB2YXJpYWJsZSBhbmFsaXphZGEuIEVzdG9zIHB1ZWRlbgogICAgY29ycmVzcG9uZGVyc2UgY29uIGxhIGRpc3RyaWJ1Y2nDs24gZGUgbG9zIGVzdGFkw61zdGljb3MgJHosIHQsIEYsIHIkCiAgICB1IG90cm8gKFJlY29tZW5kYWNpw7NuOiB1c28gZGVsIGRpYWdyYW1hIGVsYWJvcmFkbyBwb3IgU2Fsa2luZAogICAgWy1Ac2Fsa2luZDIwMTNdKS4KCjQuICAqKipDw6FsY3VsbyAobWVkaWFudGUgZsOzcm11bGEpKioqIGRlbCB2YWxvciBkZWwgZXN0YWTDrXN0aWNvIHBhcmEgbGEKICAgIG11ZXN0cmEgKHZhbG9yIG9idGVuaWRvIGRlbCAqKnAtdmFsb3IqKiksIHF1ZSBjb25zaXN0ZSBlbiB1bmEKICAgIHRyYW5zZm9ybWFjacOzbiBkZSBsYSB1bmlkYWQgZGUgbWVkaWRhIGRlIGxhIHZhcmlhYmxlIG9yaWdpbmFsIGFsCiAgICB2YWxvciBjb3JyZXNwb25kaWVudGUgKCplc3RhbmRhcml6YWNpw7NuIGRlIGxhIHZhcmlhYmxlKikgc2Vnw7puIGVsCiAgICBlc3RhZMOtc3RpY28gZGUgZGlzdHJpYnVjacOzbiBjb3JyZXNwb25kaWVudGUgeSwgYXPDrSwgY2FsY3VsYXIgc3UKICAgIHByb2JhYmlsaWRhZCBhc29jaWFkYS4KCjUuICAqKipDb21wYXJhcioqKiBlbCB2YWxvciBvYnRlbmlkbyBkZWwgKipwLXZhbG9yKiogYXNvY2lhZG8gYSBsYQogICAgcHJvYmFiaWxpZGFkIGRlIG9jdXJyZW5jaWEgZGUgSDAgZW4gbGEgcG9ibGFjacOzbiBmcmVudGUgYWwgKipOaXZlbAogICAgZGUgU2lnbmlmaWNhbmNpYSAoKiokXGFscGhhJCkgcHJldmlhbWVudGUgZGVmaW5pZG8gcG9yIGVsIGFuYWxpc3RhLAogICAgeSB1YmljYXIgc2kgZWwgcC12YWx1ZSBlcyBtZW5vciBhbCBuaXZlbCBkZSBzaWduaWZpY2FuY2lhLi4KCjYuICAqKipEZWNpc2nDs24qKiogZGVsIGFuYWxpc3RhIHNvYnJlIEgwLCBxdWUgY29ycmVzcG9uZGUgYWwgKnJlY2hhem8qIG8KICAgICpubyByZWNoYXpvKiBkZSAkSF8wJCBhIHBhcnRpciBkZSBsYSBjb21wYXJhY2nDs24gcmVhbGl6YWRhIGVuIGVsCiAgICBwYXNvIDUuCgpEZSBtYW5lcmEgcXVlIHNpOiAkJCBcdGV4dHtwLXZhbHVlfSBcZ2VxIFxhbHBoYSA6IFx0ZXh0e05vIHJlY2hhem8gSDB9JCQKJCQgXHRleHR7cC12YWx1ZX0gPCBcYWxwaGE6IFx0ZXh0e1JlY2hhem8gSDB9JCQKCiMjIDMuIFBydWViYSBkZSBoaXDDs3Rlc2lzIHBhcmEgdW5hIHZhcmlhYmxlLgoKQWwgdHJhYmFqYXIgY29uIHVuYSB2YXJpYWJsZSBjb24gbG9zIGRhdG9zIGRlIHVuYSBtdWVzdHJhIHNlIHB1ZWRlCnJlYWxpemFyIGVsIHByb2Nlc28gZGUgZXN0aW1hY2nDs24gcGFyYSBjb25vY2VyIHPDrSBsYSBwcmltZXJhIG5vcyBwZXJtaXRlCmFjZXJjYXJub3MgYWwgdmFsb3IgY29ycmVzcG9uZGllbnRlIGVuIGxhIHBvYmxhY2nDs24gKHBhcsOhbWV0cm8pLiBTaW4KZW1iYXJnbyBlcyBpbXBvcnRhbnRlIHRlbmVyIGVuIGN1ZW50YSBlbCB0aXBvIGRlIHZhcmlhYmxlIGNvbiBsYSBxdWUgc2UKZXN0w6EgdHJhYmFqYW5kbyBlbCBwcm9jZXNvIGRlIGluZmVyZW5jaWEgZXN0YWTDrXN0aWNhIChnZW5lcmFsaXphY2nDs24pLAp5YSBzZWEgcXVlIHNlIHRyYXRlIGRlIHVuYSB2YXJpYWJsZSBjY29udGludWEgbyBjYXRlZ8OzcmljYS4gUHVlcyBwYXJhIGVsCnByaW1lciBjYXNvIHNlIHRyYWJhamEgY29uIGVsIGVzdGFkw61zdGljbyBkZSBsYSBtZWRpYSBtaWVudHJhcyBxdWUgcGFyYQplbCBzZWd1bmRvIHNlIGV2YWzDumEgbGEgcHJvcG9yY2nDs24gZGVsIGF0cmlidXRvIGRlIGludGVyw6lzIChub21pbmFsIHUKb3JkaW5hbCkuCgojIyMgMy4xLiBQcnVlYmEgZGUgaGlww7N0ZXNpcyBwYXJhIHVuYSB2YXJpYWJsZSBjb250aW51YS4KCkVuIGVsIGNhc28gZGUgY29udGFyIGNvbiB1bmEgdmFyaWFibGUgYWxlYXRvcmlhIGRlIHRpcG8gKipjb250aW51YSoqLApwcsOhY3RpY2FtZW50ZSBwdWVkZSBjb25zaWRlcmFyc2UgcXVlIHRpZW5kZSBhIGRpc3RyaWJ1aXJzZSBjb21vIHVuYQoqbm9ybWFsKiAoJFggLT4gTihcYmFye1h9LCBcc2lnbWEpJCkgYWwgY3VtcGxpciwgYWwgbWVub3MsIGxhcwpzaWd1aWVudGVzIGNvbmRpY2lvbmVzOgoKaS4gICJuIiBncmFuZGUgKG4gXD4gMzAgY2Fzb3MpIHlcCmlpLiBzZSBzZWxlY2Npb25hIGFsIDEwJSBkZSBsYSBwb2JsYWNpw7NuIGVuIGxhIG11ZXN0cmEsIG8KaWlpLiAkWCQgdGllbmUgdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsLgoKRW50b25jZXMgc2UgY29uc2lkZXJhIHF1ZSBzdSAqbWVkaWEqIHNlcsOhIHVuIGJ1ZW4gZXN0aW1hZG9yIHBhcmEgY29ub2NlcgplbCBwYXLDoW1ldHJvIHBvYmxhY2lvbmFsIGNvcnJlc3BvbmRpZW50ZS4KCiMjIyMgMy4xLjEuIEhpcMOzdGVzaXMgZGUgZG9zIGNvbGFzIG8gImRlc2lndWFsZGFkIiwgZG9uZGUgJFxtdSBcbmVxIFxiYXJ7eH0kCgpTaWd1aWVuZG8gbG9zIHBhc29zIGRlIGxhIHBydWViYSBkZSBoaXDDs3Rlc2lzLCBzZSBlc3RhYmxlY2UgcXVlOgoKMS4gIEhpcMOzdGVzaXMgbnVsYTogJFxtdSA9IFxiYXJ7WH0kOyBIaXDDs3Rlc2lzIGFsdGVybmF0aXZhOgogICAgJFxtdSBcbmVxIFxiYXJ7WH0kIChoaXDDs3Rlc2lzIGRlICJkb3MgY29sYXMiKS4gQSBwYXJ0aXIgZGUgZXN0YQogICAgaGlww7N0ZXNpcyBzZSBkZXNlYSBldmFsdWFyIHNpIGVsIHByb21lZGlvIGRlIGVkYWQgY2FsY3VsYWRvIGEgcGFydGlyCiAgICBkZSBsYSBtdWVzdHJhIHNlIHBhcmVjZSBhbCBwcm9tZWRpbyBkZSBlZGFkIGVuIGxhIHBvYmxhY2nDs24uCgoyLiAgTml2ZWwgZGUgc2lnbmlmaWNhbmNpYTogJFxhbHBoYSA9IDAuMDUkLiBOaXZlbCBlc3TDoW5kYXIgcGFyYSBlbAogICAgw6FtYml0byBkZSBsYXMgQ2llbmNpYXMgU29jaWFsZXMuCgozLiAgRXN0YWTDrXN0aWNvIGRlIHBydWViYTogJFokIHBhcmEgZGlzdHJpYnVjacOzbiBkZSB1bmEgbXVlc3RyYQogICAgKGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGRlIHByb2JhYmlsaWRhZGVzKToKICAgICQkeiA9IFxmcmFjeyhcYmFye1h9IC0gXG11KX17XGZyYWN7XHNpZ21hfXtcc3FydHtufX19JCQgU2luIGVtYmFyZ28KICAgIHNlIGRlYmUgdG9tYXIgZW4gY29uc2lkZXJhY2nDs24gcXVlIGBSYCBubyBjdWVudGEgY29uIHVuIHNjcmlwdCBlbiBlbAogICAgc2lzdGVtYSBiYXNlIHBhcmEgY2FsY3VsYXIgZGlyZWN0YW1lbnRlIGVsIHAtdmFsb3IgYXNvY2lhZG8gYWwKICAgIGN1YW50aWwgInoiLiBQb3IgZWxsbyBzZSBvcHRhIHBvciB1dGlsaXphciBlbCBzY3JpcHQgYHQudGVzdCgpYCwgcXVlCiAgICBzZSBhcG95YSBlbiBlbCBjw6FsY3VsbyBkZWwgcC12YWxvciBhIHBhcnRpciBkZWwgZXN0YWTDrXN0aWNvIGRlCiAgICBkaXN0cmlidWNpw7NuICoqdCBkZSBTdHVkZW50KiosIGN1eWEgZsOzcm11bGEgZXMgbXV5IHBhcmVjaWRhIGEgbGEgZGVsCiAgICBlc3RhZMOtc3RpY28gInoiOgogICAgJCR0ID0gXGZyYWN7KFxiYXJ7WH0gLSBcbXUpfXtcZnJhY3tzX1xzaWdtYX17XHNxcnR7bn19fSQkCgpMYSBkaWZlcmVuY2lhIHByaW5jaXBhbCBlbnRyZSBhbWJhcyBmw7NybXVsYXMgcmFkaWNhIGVuIGxvcyBlbGVtZW50b3MKaW5jbHVpZG9zIGVuIGVsIGRlbm9taW5hZG9yOiBwYXJhIGVsIGNhc28gZGVsIGVzdGFkw61zdGljbyAieiIsIGVsIGVycm9yCmVzdMOhbmRhciBzZSBjYWxjdWxhIGEgcGFydGlyIGRlbCB2YWxvciBkZSBsYSBkZXN2aWFjacOzbiBlc3TDoW5kYXIKKCRcc2lnbWEkKSBwb2JsYWNpb25hbCwgbWllbnRyYXMgcXVlIGVuIGVsIGNhc28gZGUgbGEgZsOzcm11bGEgZGVsCmVzdGFkw61zdGljbyAidCBkZSBTdHVkZW50IiBzZSBjYWxjdWxhIHV0aWxpemFuZG8gZWwgdmFsb3IgZGUgbGEKZGVzdmlhY2nDs24gZXN0w6FuZGFyICgkc19cc2lnbWEkKSBwYXJhIGxhIG11ZXN0cmEuCgpTaW4gZW1iYXJnbywgYSBtZWRpZGEgcXVlIGVsIHRhbWHDsW8gZGUgbXVlc3RyYSAoJG4kKSB0aWVuZGUgYSBhdW1lbnRhciwKdGFudG8gJFxzaWdtYSQgY29tbyAkc19cc2lnbWEkIHRlbmRlcsOhbiBhIGFjZXJjYXJzZSBlbnRyZSBzw60geSwgcG9yCnRhbnRvLCBsYSBmb3JtYSBkZSBsYSBkaXN0cmlidWNpw7NuICJ0IGRlIFN0dWRlbnQiIHNlIHBhcmVjZXLDoSBjYWRhIHZlegptw6FzIGEgbGEgZm9ybWEgZGUgdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsICJ6Ii4KCjQuICBDw6FsY3VsbyBkZWwgKipwLXZhbG9yKiouCgpgYGB7ciB0X3Rlc3RfZWRhZF9kZXNpZ3VhbGRhZH0Kb3B0aW9ucyhzY2lwZW4gPSA5OTkpICNjb21hbmRvIHBhcmEgY29udmVydGlyIGxvcyB2YWxvcmVzIHBlcXVlw7FvcyBhIGRlY2ltYWxlcy4KdC50ZXN0KGRhdG9zX2NvdmlkICQgRURBRCwKICAgICAgIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIsICNIaXDDs3Rlc2lzIGRlICJkb3MgY29sYXMiIG8gZGUgZGVzaWd1YWxkYWQKICAgICAgIG11ID0gNDIuNTY2NzUsICNWYWxvciBkZSBjb250cmFzdGFjacOzbiwgYXF1w60gc2UgdXRpbGl6w7MgZWwgdmFsb3IgZGUgbGEgZGlzdHJpYnVjacOzbiBtdWVzdHJhbAogICAgICAgcGFpcmVkID0gRkFMU0UsICNlbiBjYXNvIGRlIHF1ZSBsYSBtdWVzdHJhIHNlYSAicGFyZWFkYSIKICAgICAgIHZhci5lcXVhbCA9IEZBTFNFLCAjc3VwdWVzdG8gZGUgdmFyaWFuemEgaG9tb2fDqW5lYSBzaSBsYSBtdWVzdHJhIGVzIHBhcmVkYS4KICAgICAgIGNvbmYubGV2ZWwgPSAwLjk1KSAjTml2ZWwgZGUgY29uZmlhbnphID0gMSAtIE5pdmVsIGRlIHNpZ25pZmljYW5jaWEuCmBgYAoKVmFsb3Igb2J0ZW5pZG8gZW4gdW5pZGFkZXMgdCBlcyBkZSAwLjM3NDksIGNvbiA0MDE3NTQgZ3JhZG9zIGRlCmxpYmVydGFkLiBBIHBhcnRpciBkZWwgdXNvIGRlIGFtYm9zIGVsZW1lbnRvcyBzZSBwdWVkZSBjYWxjdWxhciBsYQpwcm9iYWJpbGlkYWQgY29ycmVzcG9uZGllbnRlIGFsICoqcC12YWxvcioqLCBxdWUgZXMgZGUgMC43MDc3LgoKNS4gIENvbXBhcmFjacOzbiBkZWwgKipwLXZhbG9yKiogY2FsY3VsYWRvIGZyZW50ZSBhbCAqKk5pdmVsIGRlCiAgICBzaWduaWZpY2FuY2lhICgkXGFscGhhJCkqKi4gQWwgY29tcGFyYXIgZWwgdmFsb3IgZGVsICoqcC12YWxvcioqCiAgICBhc29jaWFkbyBhIGxhIEgwIChxdWUgZXMgZGUgMC43MDc3KSBjb24gcmVzcGVjdG8gYWwgKipOaXZlbCBkZQogICAgc2lnbmlmaWNhbmNpYSAoYWxmYSkqKiAocXVlIGVzIGRlIDAuMDUpLiBDb24gZXN0byBzZSBwdWVkZQogICAgZXN0YWJsZWNlciBxdWUgZWwgKipwLXZhbHVlKiogZXMgKm1heW9yIHF1ZSogZWwgKipOaXZlbCBkZQogICAgc2lnbmlmaWNhbmNpYSoqLgoKNi4gIERlY2lzacOzbiBzb2JyZSBsYSBoaXDDs3Rlc2lzIG51bGEKCmkuICBFbCBwLXZhbHVlIGFzb2NpYWRvIGFsIHZhbG9yIGRlIGxhIG1lZGlhIGRlIGVkYWQgZW4gbGEgbXVlc3RyYQogICAgKDAuNzA3NykgZXMgbWF5b3IgYWwgbml2ZWwgZGUgc2lnbmlmaWNhbmNpYSBlc3RhYmxlY2lkbyAoJFxhbHBoYSA9IDAuMDUkKSwgCiAgICBwb3IgbG8gcXVlIGxhIHByb2JhYmlsaWRhZCBkZSBvYnNlcnZhciBhIGxhIGhpcMOzdGVzaXMgbnVsYSBlbgogICAgbGEgcG9ibGFjacOzbiBlcyBtYXlvciBhbCBjcml0ZXJpbyBkZSBkZWNpc2nDs24uCmlpLiBBIHBhcnRpciBkZSBlc3RlIGNyaXRlcmlvICoqbm8gc2UgcmVjaGF6YSoqIGxhIEgwIGNvbiBsb3MgZGF0b3MKICAgIG9ic2VydmFkb3MsIHBvciBsbyBxdWUgc2UgY29uc2lkZXJhIHF1ZSBIMCBlcyBsYSBtZWpvciBleHBsaWNhY2nDs24uCiAgICBPIGRpY2hvIGRlIG90cmEgbWFuZXJhLCAqc2UgcHVlZGUgZXN0YWJsZWNlciBxdWUgbGEgbWVkaWEgZGUgZWRhZCBkZQogICAgbGEgbXVlc3RyYSBlcyBzaW1pbGFyIGEgbGEgbWVkaWEgZGUgZWRhZCBkZSBsYSBwb2JsYWNpw7NuLCBjb24gdW4KICAgIG5pdmVsIGRlIGNvbmZpYW56YSBkZWwgOTUlLioKCiMjIyMgMy4xLjIuIEhpcMOzdGVzaXMgdW5pbGF0ZXJhbCBhIGxhIGl6cXVpZXJkYSAodW5hIGNvbGEpIG8gIm1lbm9yIHF1ZSIsIGRvbmRlICRcbXUgPCBcYmFye3h9JAoKU2lndWllbmRvIGxvcyBwYXNvcyBkZSBsYSBwcnVlYmEgZGUgaGlww7N0ZXNpcywgc2UgZXN0YWJsZWNlIHF1ZToKCjEuICBIaXDDs3Rlc2lzIG51bGE6ICRcbXUgXGdlcSBcYmFye1h9JDsgSGlww7N0ZXNpcyBhbHRlcm5hdGl2YToKICAgICRcbXUgPCBcYmFye1h9JCAoaGlww7N0ZXNpcyB1bmlsYXRlcmxhIGEgbGEgaXpxdWllcmRhKS4gQSBwYXJ0aXIgZGUKICAgIGVzdGEgaGlww7N0ZXNpcyBzZSBkZXNlYSBldmFsdWFyIHNpIGVsIHByb21lZGlvIGRlIGVkYWQgZGUgbGEKICAgIHBvYmxhY2nDs24gZXMgbWVub3IgYWwgcHJvbWVkaW8gZGUgZWRhZCBjYWxjdWxhZG8gYSBwYXJ0aXIgZGUgbGEKICAgIG11ZXN0cmEuCgoyLiAgTml2ZWwgZGUgc2lnbmlmaWNhbmNpYTogJFxhbHBoYSA9IDAuMDUkLiBOaXZlbCBlc3TDoW5kYXIgcGFyYSBlbAogICAgw6FtYml0byBkZSBsYXMgQ2llbmNpYXMgU29jaWFsZXMuCgozLiAgRXN0YWTDrXN0aWNvIGRlIHBydWViYTogJFokIHBhcmEgZGlzdHJpYnVjacOzbiBkZSB1bmEgbXVlc3RyYQogICAgKGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGRlIHByb2JhYmlsaWRhZGVzKSwgcGVybyBzZSBvcHRhIHBvciB1dGlsaXphcgogICAgZWwgZXN0YWTDrXN0aWNvICJ0IGRlIFN0dWRlbnQiLCB5IHBvciBlbmRlIGVsIHNjcmlwdCBgdC50ZXN0KClgLgoKNC4gIENhbGN1bGFyIGVsICoqcC12YWxvcioqCgpgYGB7ciB0X3Rlc3RfZWRhZF9tZW5vcl9xdWV9CnQudGVzdChkYXRvc19jb3ZpZCAkIEVEQUQsCiAgICAgICBhbHRlcm5hdGl2ZSA9ICJsZXNzIiwgI0hpcMOzdGVzaXMgZGUgdW5hIGNvbGEsICJtZW5vciBxdWUiCiAgICAgICBtdSA9IDQyLjU2Njc1LCAjVmFsb3IgZGUgY29udHJhc3RhY2nDs24sIGFxdcOtIHNlIHV0aWxpesOzIGVsIHZhbG9yIGRlIGxhIGRpc3RyaWJ1Y2nDs24gbXVlc3RyYWwKICAgICAgIHBhaXJlZCA9IEZBTFNFLCAjZW4gY2FzbyBkZSBxdWUgbGEgbXVlc3RyYSBzZWEgInBhcmVhZGEiCiAgICAgICB2YXIuZXF1YWwgPSBGQUxTRSwgI3N1cHVlc3RvIGRlIHZhcmlhbnphIGhvbW9nw6luZWEgc2kgbGEgbXVlc3RyYSBlcyBwYXJlZGEuCiAgICAgICBjb25mLmxldmVsID0gMC45NSkgI05pdmVsIGRlIGNvbmZpYW56YSA9IDEgLSBOaXZlbCBkZSBzaWduaWZpY2FuY2lhLgpgYGAKCjUuICBDb21wYXJhY2nDs24gZGVsICoqcC12YWxvcioqIGNhbGN1bGFkbyBmcmVudGUgYWwgKipOaXZlbCBkZQogICAgc2lnbmlmaWNhbmNpYSAoYWxmYSkqKi4gQWwgY29tcGFyYXIgZWwgdmFsb3IgZGVsICoqcC12YWxvcioqCiAgICBhc29jaWFkbyBhIGxhIEgwIChxdWUgZXMgZGUgMC42NDYxKSBjb24gcmVzcGVjdG8gYWwgKipOaXZlbCBkZQogICAgc2lnbmlmaWNhbmNpYSAoYWxmYSkqKiAocXVlIGVzIGRlIDAuMDUpLiBDb24gZXN0byBzZSBwdWVkZQogICAgZXN0YWJsZWNlciBxdWUgZWwgKipwLXZhbHVlKiogZXMgKm1heW9yIHF1ZSogZWwgKipOaXZlbCBkZQogICAgc2lnbmlmaWNhbmNpYSoqLgoKNi4gIERlY2lzacOzbiBzb2JyZSBsYSBoaXDDs3Rlc2lzIG51bGEuCgpgYGB7PWh0bWx9CjwhLS0gLS0+CmBgYAppLiAgRWwgcC12YWx1ZSBhc29jaWFkbyBhbCB2YWxvciBkZSBsYSBtZWRpYSBkZSBlZGFkIGVuIGxhIG11ZXN0cmEKICAgICgwLjY0NjEpIGVzIG1heW9yIGFsIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgZXN0YWJsZWNpZG8gKFwkXGFscGhhID0KICAgIDAuMDUpLCBwb3IgbG8gcXVlIGxhIHByb2JhYmlsaWRhZCBkZSBvYnNlcnZhciBhIGxhIGhpcMOzdGVzaXMgbnVsYSBlbgogICAgbGEgcG9ibGFjacOzbiBlcyBtYXlvciBhbCBjcml0ZXJpbyBkZSBkZWNpc2nDs24uCmlpLiBBIHBhcnRpciBkZSBlc3RlIGNyaXRlcmlvICoqbm8gc2UgcmVjaGF6YSoqIGxhIEgwIGNvbiBsb3MgZGF0b3MKICAgIG9ic2VydmFkb3MsIHBvciBsbyBxdWUgc2UgY29uc2lkZXJhIHF1ZSBIMCBlcyBsYSBtZWpvciBleHBsaWNhY2nDs24uCiAgICBPIGRpY2hvIGRlIG90cmEgbWFuZXJhLCAqc2UgcHVlZGUgZXN0YWJsZWNlciBxdWUgbGEgbWVkaWEgZGUgZWRhZCBkZQogICAgbGEgcG9ibGFjacOzbiBlcyBtYXlvciBvIGlndWFsIGEgbGEgbWVkaWEgZGUgZWRhZCBlbiBsYSBtdWVzdHJhLCBjb24KICAgIHVuIG5pdmVsIGRlIGNvbmZpYW56YSBkZWwgOTUlLioKCiMjIyMgMy4xLjMuIEhpcMOzdGVzaXMgdW5pbGF0ZXJhbCBhIGxhIGRlcmVjaGEgKHVuYSBjb2xhKSBvICJtYXlvciBxdWUiLCBkb25kZSAkXG11ID4gXGJhcnt4fSQKClNpZ3VpZW5kbyBsb3MgcGFzb3MgZGUgbGEgcHJ1ZWJhIGRlIGhpcMOzdGVzaXMsIHNlIGVzdGFibGVjZSBxdWU6CgoxLiAgKkhpcMOzdGVzaXMgbnVsYSo6ICRcbXUgXGxlcSBcYmFye1h9JDsgKkhpcMOzdGVzaXMgYWx0ZXJuYXRpdmEqOgogICAgJFxtdSA+IFxiYXJ7WH0kIChoaXDDs3Rlc2lzIHVuaWxhdGVyYWwgYSBsYSBkZXJlY2hhKS4gQSBwYXJ0aXIgZGUKICAgIGVzdGEgaGlww7N0ZXNpcyBzZSBkZXNlYSBldmFsdWFyIHNpIGVsIHByb21lZGlvIGRlIGVkYWQgZGUgbGEKICAgIHBvYmxhY2nDs24gZXMgbWF5b3IgYWwgcHJvbWVkaW8gZGUgZWRhZCBjYWxjdWxhZG8gYSBwYXJ0aXIgZGUgbGEKICAgIG11ZXN0cmEuCgoyLiAgTml2ZWwgZGUgc2lnbmlmaWNhbmNpYTogJFxhbHBoYSA9IDAuMDUkLiBOaXZlbCBlc3TDoW5kYXIgcGFyYSBlbAogICAgw6FtYml0byBkZSBsYXMgQ2llbmNpYXMgU29jaWFsZXMuCgozLiAgRXN0YWTDrXN0aWNvIGRlIHBydWViYTogJFokIHBhcmEgZGlzdHJpYnVjacOzbiBkZSB1bmEgbXVlc3RyYQogICAgKGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGRlIHByb2JhYmlsaWRhZGVzKSwgcGVybyBzZSBvcHRhIHBvciB1dGlsaXphcgogICAgZWwgZXN0YWTDrXN0aWNvICJ0IGRlIFN0dWRlbnQiLCB5IHBvciBlbmRlIGVsIHNjcmlwdCBgdC50ZXN0KClgLgoKNC4gIENhbGN1bGFyIGVsICoqcC12YWxvcioqCgpgYGB7ciB0X3Rlc3RfZWRhZF9tYXlvcl9xdWV9CnQudGVzdChkYXRvc19jb3ZpZCAkIEVEQUQsCiAgICAgICBhbHRlcm5hdGl2ZSA9ICJncmVhdGVyIiwgI0hpcMOzdGVzaXMgZGUgdW5hIGNvbGEsICJtZW5vciBxdWUiCiAgICAgICBtdSA9IDQyLjU2Njc1LCAjVmFsb3IgZGUgY29udHJhc3RhY2nDs24sIGFxdcOtIHNlIHV0aWxpesOzIGVsIHZhbG9yIGRlIGxhIGRpc3RyaWJ1Y2nDs24gbXVlc3RyYWwKICAgICAgIHBhaXJlZCA9IEZBTFNFLCAjZW4gY2FzbyBkZSBxdWUgbGEgbXVlc3RyYSBzZWEgInBhcmVhZGEiCiAgICAgICB2YXIuZXF1YWwgPSBGQUxTRSwgI3N1cHVlc3RvIGRlIHZhcmlhbnphIGhvbW9nw6luZWEgc2kgbGEgbXVlc3RyYSBlcyBwYXJlZGEuCiAgICAgICBjb25mLmxldmVsID0gMC45NSkgI05pdmVsIGRlIGNvbmZpYW56YSA9IDEgLSBOaXZlbCBkZSBzaWduaWZpY2FuY2lhLgpgYGAKCjUuICBDb21wYXJhY2nDs24gZGVsICoqcC12YWxvcioqIGNhbGN1bGFkbyBmcmVudGUgYWwgKipOaXZlbCBkZQogICAgc2lnbmlmaWNhbmNpYSAoJFxhbHBoYSQpKiouIEFsIGNvbXBhcmFyIGVsIHZhbG9yIGRlbCAqKnAtdmFsb3IqKgogICAgYXNvY2lhZG8gYSBsYSBIMCAocXVlIGVzIGRlIDAuMzUzOSkgY29uIHJlc3BlY3RvIGFsICoqTml2ZWwgZGUKICAgIHNpZ25pZmljYW5jaWEgKCRcYWxwaGEkKSoqIChxdWUgZXMgZGUgMC4wNSkuIENvbiBlc3RvIHNlIHB1ZWRlCiAgICBlc3RhYmxlY2VyIHF1ZSBlbCAqKnAtdmFsdWUqKiBlcyAqbWF5b3IgcXVlKiBlbCAqKk5pdmVsIGRlCiAgICBzaWduaWZpY2FuY2lhKiouCgo2LiAgRGVjaXNpw7NuIHNvYnJlIGxhIGhpcMOzdGVzaXMgbnVsYS4KCmBgYHs9aHRtbH0KPCEtLSAtLT4KYGBgCmkuICBFbCBwLXZhbHVlIGFzb2NpYWRvIGFsIHZhbG9yIGRlIGxhIG1lZGlhIGRlIGVkYWQgZW4gbGEgbXVlc3RyYQogICAgKDAuMzUzOSkgZXMgbWF5b3IgYWwgbml2ZWwgZGUgc2lnbmlmaWNhbmNpYSBlc3RhYmxlY2lkbyAoXCRcYWxwaGEgPQogICAgMC4wNSksIHBvciBsbyBxdWUgbGEgcHJvYmFiaWxpZGFkIGRlIG9ic2VydmFyIGEgbGEgaGlww7N0ZXNpcyBudWxhIGVuCiAgICBsYSBwb2JsYWNpw7NuIGVzIG1heW9yIGFsIGNyaXRlcmlvIGRlIGRlY2lzacOzbi4KaWkuIEEgcGFydGlyIGRlIGVzdGUgY3JpdGVyaW8gKipubyBzZSByZWNoYXphKiogbGEgSDAgY29uIGxvcyBkYXRvcwogICAgb2JzZXJ2YWRvcywgcG9yIGxvIHF1ZSBzZSBjb25zaWRlcmEgcXVlIEgwIGVzIGxhIG1lam9yIGV4cGxpY2FjacOzbi4KICAgIE8gZGljaG8gZGUgb3RyYSBtYW5lcmEsICpzZSBwdWVkZSBlc3RhYmxlY2VyIHF1ZSBsYSBtZWRpYSBkZSBlZGFkIGRlCiAgICBsYSBwb2JsYWNpw7NuIGVzIG1heW9yIG8gaWd1YWwgYSBsYSBtZWRpYSBkZSBlZGFkIGVuIGxhIG11ZXN0cmEsIGNvbgogICAgdW4gbml2ZWwgZGUgY29uZmlhbnphIGRlbCA5NSUuKgoKIyMgNC4gUHJ1ZWJhIGRlIGhpcMOzdGVzaXMgcGFyYSB1bmEgcHJvcG9jacOzbgoKTGEgZXN0aW1hY2nDs24gZGUgdW4gcGFyw6FtZXRybyBwb2JsYWNpb25hbCBjdWFuZG8gc2UgYW5hbGl6YSB1bmEgdmFyaWFibGUKZGlzY3JldGEgeSBiaW5vbWlhbCAoZG9zIHZhbG9yZXMgbyBhdHJpYnV0b3MgcG9zaWJsZXMgc29sYW1lbnRlKSwgc2UKcmVhbGl6YSBtZWRpYW50ZSBlbCBlc3RhZMOtc3RpY28gZGUgbGEgcHJvcG9yY2nDs24gYSBwYXJ0aXIgZGUgbG9zIGRhdG9zCmRlIGxhIG11ZXN0cmEuCgpFbiBlc3RlIGNhc28sIGVsIHByb2dyYW1hIFIgY3VlbnRhIGNvbiB1bmEgZnVuY2nDs24gZXNwZWPDrWZpY2EgcGFyYQpjYWxjdWxhciBlbCBlc3RhZMOtc3RpY28gY2FsY3VsYWRvIHkgc3UgcC12YWxvciBhIHBhcnRpciBkZWwgZXN0YWTDrXN0aWNvCmRlIGRpc3RyaWJ1Y2nDs24gZGUgcHJvYmFiaWxpZGFkZXMgZGUgQ2hpLWN1YWRyYWRhICgkXGNoaV4yJCkuCgojIyMgNC4xLiBIaXDDs3Rlc2lzIGJpbGF0ZXJhbCAoZG9zIGNvbGFzKSBvICJkZXNpZ3VhbCIsIGRvbmRlICRccGkgXG5lcSBwJAoKTG9zIHBhc29zIGRlIGxhIHBydWViYSBkZSBzaWduaWZpY2FuY2lhIHBhcmEgdW5hIHByb3BvcmNpw7NuIHNlIHBsYW50ZWFuCmRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6CgoxLiAgSGlww7N0ZXNpcyBudWxhOiAkXHBpID0gcCQ7IEhpcMOzdGVzaXMgYWx0ZXJuYXRpdmE6ICRccGkgXG5lcSBwJAogICAgKGJpZGlyZWNjaW9uYWwpIGRvbmRlIEgwOiAkXHBpID0gMC4zNSQsIEhhOiAkXHBpIFxuZXEgMC4zNSQgcHVlcyBzZQogICAgZW5jb250csOzIHF1ZSBsYSBmcmVjdWVuY2lhIHJlbGF0aXZhIGRlIGxvcyBjYXNvcyBjb24gY29udGFnaW8gZGUKICAgIENPVklELTE5ICh2YWxvciAxIGVuIGxhIGNvZGlmaWNhY2nDs24gZGUgbGEgdmFyaWFibGUpIGVzIGRlIDM1LjUxJS4KCmBgYHtyIHRhYmxhX2ZyZWNfcmVzdWx0YWRvXzF9CnByb3AudGFibGUodGFibGUoZGF0b3NfY292aWQgJCBSRVNVTFRBRE8pKQpgYGAKCjIuICBOaXZlbCBkZSBzaWduaWZpY2FuY2lhICgkXGFscGhhJCkgPSAwLjA1CgozLiAgRXN0YWTDrXN0aWNvIGRlIHBydWViYSBwYXJhIHVuYSBwcm9wb3JjacOzbjogY2hpLWN1YWRyYWRvICgkXGNoaV4yJCkuCgo0LiAgQ8OhbGN1bG8gZGVsICoqcC12YWxvcioqLCB1dGlsaXphbmRvIGVsIGNvbWFuZG8gYHByb3AudGVzdCgpYDoKCmBgYHtyIHByb3BfdGVzdF9yZXN1bHRhZG9fZGVzaWd1YWx9CnByb3AudGVzdCh4ID0gMTQyNjkwLCAjY2FudGlkYWQgZGUgY2Fzb3MgZXhpdG9zb3MgbyBkb25kZSBvY3VycmnDsyBlbCBldmVudG8gZGUgaW50ZXLDqXMKICAgICAgICAgIG4gPSA0MDE3NTUsICN0YW1hw7FvIGRlIGxhIG11ZXN0cmEKICAgICAgICAgIHAgPSAwLjM1LCAjcHJvcG9yY2nDs24gcXVlIGRlZmluZSBhbCB2YWxvciBvIGhpcMOzdGVzaXMgbnVsYQogICAgICAgICAgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIiwgI3RpcG8gZGUgaGlww7N0ZXNpcyBhbHRlcm5hdGl2YQogICAgICAgICAgY29uZi5sZXZlbCA9IDAuOTUsICNuaXZlbCBkZSBjb25maWFuemEKICAgICAgICAgIGNvcnJlY3QgPSBUUlVFKQpgYGAKCkFxdcOtIHNlIG9ic2VydsOzIHF1ZSBlbCB2YWxvciBkZWwgZXN0YWTDrXN0aWNvIGRlIHBydWViYSAoJFxjaGleMiQpCmNhbGN1bGFkbyB1IG9ic2VydmFkbyBlcyBkZSA0Ny4xMTkgdW5pZGFkZXMgZGUgJFxjaGleMiQsIGNvbiAxIGdyYWRvIGRlCmxpYmVydGFkLCBwYXJhIGxvIHF1ZSBzZSBvYnR1dm8gdW4gcC12YWxvciBkZSAwLjAwMDAwMDAwMDAwNjY4IHBhcmEgbGEKaGlww7N0ZXNpcyBudWxhIChwID0gMC4zNSkuCgo1LiAgQ29tcGFyYWNpw7NuIGRlbCAqKnAtdmFsb3IqKiBmcmVudGUgYWwgKipOaXZlbCBkZSBzaWduaWZpY2FuY2lhKiouIEFsCiAgICBjb21wYXJhciBlbCB2YWxvciBkZWwgKipwLXZhbG9yKiogYXNvY2lhZG8gYSBsYSBIMCAocXVlIGVzIGRlCiAgICAwLjAwMDAwMDAwMDAwNjY4KSBjb24gcmVzcGVjdG8gYWwgKipOaXZlbCBkZSBzaWduaWZpY2FuY2lhICgkXGFscGhhJCkqKgogICAgKHF1ZSBlcyBkZSAwLjA1KS4gQ29uIGVzdG8gc2UgcHVlZGUgZXN0YWJsZWNlciBxdWUgZWwgKipwLXZhbHVlKiogZXMKICAgICptZW5vciBxdWUqIGVsICoqTml2ZWwgZGUgc2lnbmlmaWNhbmNpYSoqLgoKNi4gIERlY2lzacOzbiBzb2JyZSBsYSBoaXDDs3Rlc2lzIG51bGEuCgpgYGB7PWh0bWx9CjwhLS0gLS0+CmBgYAppLiAgRWwgcC12YWx1ZSBhc29jaWFkbyBhbCB2YWxvciBkZSBsYSBwcm9wb3JjacOzbiBkZSBjYXNvcyBxdWUgZGllcm9uCiAgICBwb3NpdGl2byBlbiBsYSBwcnVlYmEgQ09WSUQtMTkgZW4gbGEgbXVlc3RyYSAoMC4wMDAwMDAwMDAwMDY2OCkgZXMKICAgIG1lbm9yIGFsIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgZXN0YWJsZWNpZG8gKCRcYWxwaGEgPSAwLjA1JCksIHBvcgogICAgbG8gcXVlIGxhIHByb2JhYmlsaWRhZCBkZSBvYnNlcnZhciBhIGxhIGhpcMOzdGVzaXMgbnVsYSBlbiBsYQogICAgcG9ibGFjacOzbiBlcyBtZW5vciBhbCBjcml0ZXJpbyBkZSBkZWNpc2nDs24uCmlpLiBBIHBhcnRpciBkZSBlc3RlIGNyaXRlcmlvICoqc8OtIHNlIHJlY2hhemEqKiBsYSBIMCBjb24gbG9zIGRhdG9zCiAgICBvYnNlcnZhZG9zLCBwb3IgbG8gcXVlIHNlIGNvbnNpZGVyYSBxdWUgSGEgZXMgbGEgbWVqb3IgZXhwbGljYWNpw7NuLgogICAgTyBkaWNobyBkZSBvdHJhIG1hbmVyYSwgKnNlIHB1ZWRlIGVzdGFibGVjZXIgcXVlIGxhIHByb3BvcmNpw7NuIGRlCiAgICBwZXJzb25hcyBxdWUgZGFyw61hbiBwb3NpdGl2byBhIGxhIHBydWViYSBDT1ZJRC0xOSBlbiBwb2JsYWNpw7NuIGVzCiAgICBkaXN0aW50YSBsYSBwcm9wb3JjacOzbiBkZSBwZXJzb25hcyBxdWUgZGllcm9uIHBvc2l0aXZvIGVuIGxhIHBydWViYQogICAgQ09WSUQtMTkgZW4gbGEgbXVlc3RyYSwgY29uIHVuIG5pdmVsIGRlIGNvbmZpYW56YSBkZWwgOTUlLioKCiMjIyA0LjIuIEhpcMOzdGVzaXMgdW5pbGF0ZXJhbCBhIGxhIGl6cXVpZXJkYSAodW5hIGNvbGEpIG8gIm1lbm9yIHF1ZSIsIGRvbmRlICRccGkgPCBwJAoKTG9zIHBhc29zIGRlIGxhIHBydWViYSBkZSBzaWduaWZpY2FuY2lhIHBhcmEgdW5hIHByb3BvcmNpw7NuIHNlIHBsYW50ZWFuCmRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6CgoxLiAgSGlww7N0ZXNpcyBudWxhOiAkXHBpIFxnZXEgcCQ7IEhpcMOzdGVzaXMgYWx0ZXJuYXRpdmE6ICRccGkgPCBwJAogICAgKHVuaWRpcmVjY2lvbmFsIGEgbGEgaXpxdWllcmRhKSwgZG9uZGUgSDA6ICRccGkgXGdlcSAwLjM1JCwgSGE6CiAgICAkXHBpIDwgMC4zNSQgcHVlcyBzZSBlbmNvbnRyw7MgcXVlIGxhIGZyZWN1ZW5jaWEgcmVsYXRpdmEgZGUgbG9zCiAgICBjYXNvcyBjb24gY29udGFnaW8gZGUgQ09WSUQtMTkgKHZhbG9yIDEgZW4gbGEgY29kaWZpY2FjacOzbiBkZSBsYQogICAgdmFyaWFibGUpIGVzIGRlIDM1LjUxJS4KCmBgYHtyIHRhYmxhX2ZyZWNfcmVzdWx0YWRvXzJ9CnByb3AudGFibGUodGFibGUoZGF0b3NfY292aWQgJCBSRVNVTFRBRE8pKQpgYGAKCjIuICBOaXZlbCBkZSBzaWduaWZpY2FuY2lhICgkXGFscGhhJCkgPSAwLjA1CgozLiAgRXN0YWTDrXN0aWNvIGRlIHBydWViYSBwYXJhIHVuYSBwcm9wb3JjacOzbjogQ2hpXF4yICRcY2hpXjIkCgo0LiAgQ8OhbGN1bG8gZGVsICoqcC12YWxvcioqLCB1dGlsaXphbmRvIGVsIGNvbWFuZG8gYHByb3AudGVzdCgpYDoKCmBgYHtyIHByb3BfdGVzdF9yZXN1bHRhZG9fbWVub3J9CnByb3AudGVzdCh4ID0gMTQyNjkwLCAjY2FudGlkYWQgZGUgY2Fzb3MgZXhpdG9zb3MgbyBkb25kZSBvY3VycmnDsyBlbCBldmVudG8gZGUgaW50ZXLDqXMKICAgICAgICAgIG4gPSA0MDE3NTUsICN0YW1hw7FvIGRlIGxhIG11ZXN0cmEKICAgICAgICAgIHAgPSAwLjM1LCAjcHJvcG9yY2nDs24gcXVlIGRlZmluZSBhbCB2YWxvciBvIGhpcMOzdGVzaXMgbnVsYQogICAgICAgICAgYWx0ZXJuYXRpdmUgPSAibGVzcyIsICN0aXBvIGRlIGhpcMOzdGVzaXMgYWx0ZXJuYXRpdmEKICAgICAgICAgIGNvbmYubGV2ZWwgPSAwLjk1LCAjbml2ZWwgZGUgY29uZmlhbnphCiAgICAgICAgICBjb3JyZWN0ID0gVFJVRSkKYGBgCgpBcXXDrSBzZSBvYnNlcnbDsyBxdWUgZWwgdmFsb3IgZGVsIGVzdGFkw61zdGljbyBkZSBwcnVlYmEgKCRcY2hpXjIkKQpjYWxjdWxhZG8gdSBvYnNlcnZhZG8gZXMgZGUgNDcuMTE5IHVuaWRhZGVzIGRlICRcY2hpXjIkLCBjb24gMSBncmFkbyBkZQpsaWJlcnRhZCwgcGFyYSBsbyBxdWUgc2Ugb2J0dXZvIHVuIHAtdmFsb3IgZGUgMSBwYXJhIGxhIGhpcMOzdGVzaXMgbnVsYQooJFxwaSBcZ2VxIDAuMzUkKS4KCjUuICBDb21wYXJhY2nDs24gZGVsICoqcC12YWxvcioqIGZyZW50ZSBhbCAqKk5pdmVsIGRlIHNpZ25pZmljYW5jaWEqKi4gQWwKICAgIGNvbXBhcmFyIGVsIHZhbG9yIGRlbCAqKnAtdmFsb3IqKiBhc29jaWFkbyBhIGxhIEgwIChxdWUgZXMgZGUgMSkgY29uCiAgICByZXNwZWN0byBhbCAqKk5pdmVsIGRlIHNpZ25pZmljYW5jaWEgKGFsZmEpKiogKHF1ZSBlcyBkZSAwLjA1KSwgc2UKICAgIHB1ZWRlIGVzdGFibGVjZXIgcXVlIGVsICoqcC12YWx1ZSoqIGVzICptYXlvciBxdWUqIGVsICoqTml2ZWwgZGUKICAgIHNpZ25pZmljYW5jaWEqKi4KCjYuICBEZWNpc2nDs24gc29icmUgbGEgaGlww7N0ZXNpcyBudWxhLgoKYGBgez1odG1sfQo8IS0tIC0tPgpgYGAKaS4gIEVsIHAtdmFsdWUgYXNvY2lhZG8gYWwgdmFsb3IgZGUgbGEgcHJvcG9yY2nDs24gZGUgY2Fzb3MgcXVlIGRpZXJvbgogICAgcG9zaXRpdm8gZW4gbGEgcHJ1ZWJhIENPVklELTE5IGVuIGxhIG11ZXN0cmEgKDEpIGVzIG1heW9yIGFsIG5pdmVsCiAgICBkZSBzaWduaWZpY2FuY2lhIGVzdGFibGVjaWRvICgkXGFscGhhID0gMC4wNSQpLCBwb3IgbG8gcXVlIGxhCiAgICBwcm9iYWJpbGlkYWQgZGUgb2JzZXJ2YXIgYSBsYSBoaXDDs3Rlc2lzIG51bGEgZW4gbGEgcG9ibGFjacOzbiBlcwogICAgbWF5YXIgYWwgY3JpdGVyaW8gZGUgZGVjaXNpw7NuLgppaS4gQSBwYXJ0aXIgZGUgZXN0ZSBjcml0ZXJpbyAqKm5vIHNlIHJlY2hhemEqKiBsYSBIMCBjb24gbG9zIGRhdG9zCiAgICBvYnNlcnZhZG9zLCBwb3IgbG8gcXVlIHNlIGNvbnNpZGVyYSBxdWUgSDAgZXMgbGEgbWVqb3IgZXhwbGljYWNpw7NuLgogICAgTyBkaWNobyBkZSBvdHJhIG1hbmVyYSwgKnNlIHB1ZWRlIGVzdGFibGVjZXIgcXVlIGxhIHByb3BvcmNpw7NuIGRlCiAgICBwZXJzb25hcyBxdWUgZGFyw61hbiBwb3NpdGl2byBhIGxhIHBydWViYSBDT1ZJRC0xOSBlbiBwb2JsYWNpw7NuIGVzCiAgICBtYXlvciBvIGlndWFsIGEgbGEgcHJvcG9yY2nDs24gZGUgcGVyc29uYXMgcXVlIGRpZXJvbiBwb3NpdGl2byBlbiBsYQogICAgcHJ1ZWJhIENPVklELTE5IGVuIGxhIG11ZXN0cmEsIGNvbiB1biBuaXZlbCBkZSBjb25maWFuemEgZGVsIDk1JS4qCgojIyA1LiBFamVyY2ljaW9zCgoxLiAgQ29uc3RydWlyIHVuYSBoaXDDs3Rlc2lzIG51bGEgYmlkaXJlY2Npb25hbCB5IHVuYSB1bmlkaXJlY2Npb25hbCBjb24KICAgIFggeSBZCjIuICBDYWxjdWxhciBlbCBlcnJvciBlc3TDoW5kYXIgcGFyYSB1bmEgbWVkaWEgZGUgbGEgdmFyaWFibGUgZWRhZCBwYXJhCiAgICB1bmEgc3VibXVlc3RyYSBkZSAxMCwwMDAgY2Fzb3MsIGdlbmVyYWRhIGEgcGFydGlyIGRlbCB1bml2ZXJzbyBkZQogICAgY2Fzb3MgY29udGVuaWRvcyBlbiBsYSB2YXJpYWJsZSBFREFEIGRlIGxhIGJhc2UgZGUgZGF0b3MgQ09WSUQtMTkuCiAgICBVc2FyIGVsIHZhbG9yIHNlZWQgPSA0MzIxLgozLiAgUmVhbGl6YXIgdW5hIHBydWViYSBkZSBoaXDDs3Rlc2lzIHBhcmEgdW5hIG1lZGlhIGRlIGxhIHZhcmlhYmxlIEVEQUQKICAgIGEgcGFydGlyIGRlIGxhIHN1Ym11ZXN0cmEgcHJldmlhbWVudGUgZ2VuZXJhZGEgeSByZXBvcnRhcjogaS4gbGEKICAgIEhPLCBpaS4gc2kgZWwgdmFsb3IgZGVsIGVzdGFkw61zdGljbyBjYWxjdWxhZG8gZXMgbWF5b3IgbyBtZW5vciBxdWUKICAgIGVsIHZhbG9yIGNyw610aWNvLCBpaWkuIGVsIHAtdmFsb3IgY29ycmVzcG9uZGllbnRlLCB5IGl2LiBzaSBzZQogICAgcmVjaGF6YSBvIG5vIHNlIHJlY2hhemEgSDAuCjQuICBSZWFsaXphciB1bmEgcHJ1ZWJhIGRlIGhpcMOzdGVzaXMgcGFyYSB1bmEgcHJvcG9yY2nDs24gZGUgbGEgdmFyaWFibGUKICAgIFJFU1VMVEFETyBhIHBhcnRpciBkZSBsYSBzdWJtdWVzdHJhIHkgcmVwb3J0YXI6IGkuIGxhIEhPLCBpaS4gc2kgZWwKICAgIHZhbG9yIGRlbCBlc3RhZMOtc3RpY28gY2FsY3VsYWRvIGVzIG1heW9yIG8gbWVub3IgcXVlIGVsIHZhbG9yCiAgICBjcsOtdGljbywgaWlpLiBlbCBwLXZhbG9yIGNvcnJlc3BvbmRpZW50ZSwgeSBpdi4gc2kgc2UgcmVjaGF6YSBvIG5vCiAgICBzZSByZWNoYXphIEgwLgoKIyMgUmVmZXJlbmNpYXMK