Fase 1 [Descripciones Multivariantes]

1.1 Objetivos Globales

El objetivo principal de este estudio es realizar un análisis exhaustivo de un conjunto de datos que contiene diagnósticos de enfermedades cardiovasculares en países de Latinoamérica, utilizando herramientas de estadística descriptiva multivariante. Este análisis se enfocará en llevar a cabo cálculos, crear visualizaciones y realizar interpretaciones con el propósito de comprender más profundamente la prevalencia y distribución de estas enfermedades en la región.

Se espera que este análisis proporcione una comprensión más profunda de la situación de las enfermedades cardiovasculares en Latinoamérica, lo que permitirá identificar áreas con mayor prevalencia, factores asociados y posibles disparidades regionales. Estos resultados tendrán aplicaciones prácticas importantes, ya que podrían utilizarse para informar políticas de salud pública y dirigir futuras investigaciones en este ámbito.

1.2 Descripción de los datos

Fuente del conjunto de datos

El conjunto de datos de trabajo se obtuvo totalmente de Kaggle: https://www.kaggle.com/.Es conveniente anotar que Kaggle es una compañía subsidiaria de Google LLC que mantiene una comunidad online de científicos de datos y profesionales del aprendizaje automático. Esta empresa permite a sus usuarios a encontrar y publicar conjuntos de datos, explorar y crear modelos en un entorno de ciencia de datos basado en la web, trabajar con otros científicos de datos e ingenieros de aprendizaje automático y participar en concursos para resolver desafíos de ciencia de datos

Contexto del Conjunto de Datos

El conjunto de datos proporciona información detallada sobre los niveles de obesidad en individuos de países como México, Perú y Colombia, abarcando un rango de edades comprendido entre los 14 y 61 años. Estos datos son especialmente valiosos ya que incluyen una amplia variedad de hábitos alimentarios y condiciones físicas de los encuestados. La recolección de datos se realizó a través de encuestas anónimas vía web, lo que garantiza la confidencialidad de los participantes y la integridad de los datos recopilados. Este contexto del conjunto de datos proporciona una base sólida para llevar a cabo un análisis exhaustivo de los factores relacionados con la presencia de enfermedades cardiovasculares en estos países latinoamericanos.

Descripción del conjunto de datos

El conjunto de datos contiene 18 campos y 2000 registros. Uno de los campos es una variable nominal dicotómica que determina si el agua es apta para el consumo humano. De los registros; tres son de naturaleza cualitativa, que brindan la ubicación espacial donde se levantó el resgistro; el resto son numéricos estrictamente positivos. La lista siguiente los describe de izquierdda a derecha, como aparecen en el conjunto de datos que los contiene. Se establece para cada campo: tipo de variable y escala de medición con base en la nomenclatura (tipo_de_variable::escala_de_medición[ordenamiento]):

-SEXO: Cualitativa[Nominal]: Esta variable registra el sexo de cada individuo en el conjunto de datos. Se representa mediante dos categorías:

• M: Masculino • F: Femenino.

-EDAD Cuantitativa[razón]: Esta variable registra la edad de cada individuo en el conjunto de datos. Se expresa en años y abarca un rango que va desde los 14 hasta los 61 años.

-ALTURA Cuantitativa[razón]: Esta variable registra la altura del individuo en el conjunto de datos. Se expresa en metros y representa la medida desde la cabeza hasta los pies de cada individuo.

-PESO Cuantitativa[razón]: Esta variable registra el peso del individuo en el conjunto de datos. Se expresa en kilogramos y representa la masa corporal de cada individuo.

-HISTORIAL_FAMILIAR_SOBREPESO Cualitativa[Nominal]: Esta variable registra si el individuo tiene antecedentes familiares de sobrepeso. Se representa mediante dos categorías:

• SI: Individuos que tienen familiares diagnosticados con sobrepeso. • NO: Individuos que no tienen familiares diagnosticados con sobrepeso.

-FAVC Cualitativa[Nominal]: Esta variable registra si el individuo tiene un consumo frecuente de alimentos ricos en calorías. Se representa mediante dos categorías:

• SI: Individuos que tienen un consumo frecuente de alimentos ricos en calorías. • NO: Individuos que no tienen un consumo frecuente de alimentos ricos en calorías.

-FCVCCualitativo[Ordinal]: Esta variable registra la frecuencia con la que cada individuo consume vegetales en un día típico. Se representa mediante tres categorías numéricas:

• 1: Indica que el individuo consume vegetales una vez al día. • 2: Indica que el individuo consume vegetales dos veces al día. • 3: Indica que el individuo consume vegetales tres o más veces al día.

-NCP Cualitativa[Ordinal]: Esta variable registra el número de comidas principales que el individuo consume en un día típico. Se representa mediante cuatro categorías numéricas:

• 1: Indica que el individuo tiene una comida principal al día. • 2: Indica que el individuo tiene dos comidas principales al día. • 3: Indica que el individuo tiene tres comidas principales al día. • 4: Indica que el individuo tiene cuatro o más comidas principales al día.

-CAEC Cualitativa[Ordinal]: Esta variable registra el consumo de alimentos entre comidas de cada individuo. Se representa mediante cuatro categorías:

• ALGUNAS VECES • SIEMPRE • FRECUENTEMENTE • NO

-FUMA Cualitativa[Nominal]: Esta variable registra si el individuo fuma o no. Se representa mediante dos categorías:

• SI: Indica que el individuo fuma. • NO: Indica que el individuo no fuma.

-H2O Cualitativa[Ordinal]: Esta variable registra la cantidad de agua que el individuo consume en un día típico. Se representa mediante tres categorías numéricas:

• 1: Indica que el individuo consume 1 litro de agua al día. • 2: Indica que el individuo consume 2 litros de agua al día. • 3: Indica que el individuo consume 3 o más litros de agua al día.

-SCC Cualitativa[Nominal]: Esta variable registra si el individuo monitorea o no su consumo de calorías. Se representa mediante dos categorías:

• SI: Indica que el individuo monitorea su consumo de calorías. • NO: Indica que el individuo no monitorea su consumo de calorías.

-FAF Cualitativa[Ordinal]: Esta variable registra la frecuencia de actividad física que cada individuo realiza en un día típico, medida en horas por día. Se representa mediante cuatro categorías numéricas:

• 0: Indica que el individuo no realiza actividad física en el día. • 1: Indica que el individuo realiza actividad física durante una hora al día. • 2: Indica que el individuo realiza actividad física durante dos horas al día. • 3: Indica que el individuo realiza actividad física durante tres o más horas al día.

-TUE Cualitativa[Ordinal]: Esta variable registra el tiempo de uso de dispositivos tecnológicos de cada individuo. Se representa mediante tres categorías numéricas:

• Frecuentemente • Siempre • Nunca

-CALC Cualitativa[Ordinal]: Esta variable registra el consumo de alcohol de cada individuo. Se representa mediante las siguientes categorías:

• SI: Si consume Alcohol • NO: No consume Alcohol

-MEDIO_TRANS Cualitativa[Nominal]: Esta variable registra el medio de transporte utilizado por el individuo. Se representa mediante las siguientes categorías:

• TRANSPORTE_PUBLICO • CICLA • AUTOMÓVIL • CAMINANDO • MOTOCICLETA

-IMC Cualitativa[Nominal]: Esta variable registra el Índice de masa corporal de cada individuo Se representa mediante las siguientes categorías:

• BAJO_PESO • PESO_NORMAL • SOBRE_PESO_NIVEL_I • SOBRE_PESO_NIVEL_II • OBESIDAD_TIPO_I • OBESIDAD_TIPO_II

-ENFERMEDAD_CARDIACA Cualitativa[Nominal]: Esta variable registra si el individuo padece o no de una enfermedad cardiaca. Se representa mediante dos categorías no numéricas:

• SI: Si padece de una enfermedad cardiaca • NO: No padece de una enfermedad cardiaca

Estructura del Conjunto de Datos

str(Obesity_Dataset)
## tibble [2,000 × 18] (S3: tbl_df/tbl/data.frame)
##  $ SEXO                        : chr [1:2000] "F" "F" "M" "M" ...
##  $ EDAD                        : num [1:2000] 21 21 23 27 22 29 23 22 24 22 ...
##  $ ALTURA                      : num [1:2000] 1.62 1.52 1.8 1.8 1.78 1.62 1.5 1.64 1.78 1.72 ...
##  $ PESO                        : num [1:2000] 64 56 77 87 89.8 53 55 53 64 68 ...
##  $ HISTORIAL_FAMILIAR_SOBREPESO: chr [1:2000] "SI" "SI" "SI" "NO" ...
##  $ FAVC                        : chr [1:2000] "NO" "NO" "NO" "NO" ...
##  $ FCVC                        : num [1:2000] 2 3 2 3 2 2 3 2 3 2 ...
##  $ NCP                         : num [1:2000] 3 3 3 3 1 3 3 3 3 3 ...
##  $ CAEC                        : chr [1:2000] "ALGUNAS_VECES" "ALGUNAS_VECES" "ALGUNAS_VECES" "ALGUNAS_VECES" ...
##  $ FUMAS                       : chr [1:2000] "NO" "SI" "NO" "NO" ...
##  $ H2O                         : num [1:2000] 2 3 2 2 2 2 2 2 2 2 ...
##  $ SCC                         : chr [1:2000] "NO" "SI" "NO" "NO" ...
##  $ FAF                         : num [1:2000] 0 3 2 2 0 0 1 3 1 1 ...
##  $ TUE                         : chr [1:2000] "SIEMPRE" "FRECUENTEMENTE" "SIEMPRE" "FRECUENTEMENTE" ...
##  $ CALC                        : chr [1:2000] "NO" "SI" "SI" "SI" ...
##  $ MEDIO_TRANS                 : chr [1:2000] "TRANSPORTE_PÚBLICO" "TRANSPORTE_PÚBLICO" "TRANSPORTE_PÚBLICO" "CAMINANDO" ...
##  $ IMC                         : chr [1:2000] "PESO_NORMAL" "PESO_NORMAL" "PESO_NORMAL" "SOBRE _PESO_NIVEL_I" ...
##  $ ENFERMEDAD_CARDIACA         : chr [1:2000] "NO" "NO" "NO" "SI" ...

Visualización del Conjunto de Datos

Obesity_Dataset
## # A tibble: 2,000 × 18
##    SEXO   EDAD ALTURA  PESO HISTORIAL_FAMILIAR_S…¹ FAVC   FCVC   NCP CAEC  FUMAS
##    <chr> <dbl>  <dbl> <dbl> <chr>                  <chr> <dbl> <dbl> <chr> <chr>
##  1 F        21   1.62  64   SI                     NO        2     3 ALGU… NO   
##  2 F        21   1.52  56   SI                     NO        3     3 ALGU… SI   
##  3 M        23   1.8   77   SI                     NO        2     3 ALGU… NO   
##  4 M        27   1.8   87   NO                     NO        3     3 ALGU… NO   
##  5 M        22   1.78  89.8 NO                     NO        2     1 ALGU… NO   
##  6 M        29   1.62  53   NO                     SI        2     3 ALGU… NO   
##  7 F        23   1.5   55   SI                     SI        3     3 ALGU… NO   
##  8 M        22   1.64  53   NO                     NO        2     3 ALGU… NO   
##  9 M        24   1.78  64   SI                     SI        3     3 ALGU… NO   
## 10 M        22   1.72  68   SI                     SI        2     3 ALGU… NO   
## # ℹ 1,990 more rows
## # ℹ abbreviated name: ¹​HISTORIAL_FAMILIAR_SOBREPESO
## # ℹ 8 more variables: H2O <dbl>, SCC <chr>, FAF <dbl>, TUE <chr>, CALC <chr>,
## #   MEDIO_TRANS <chr>, IMC <chr>, ENFERMEDAD_CARDIACA <chr>

1.3 Estimaciones Multivariadas

Como se menciona en [@AMEDAristizabal2017] la de media, varianza y covarianza conforman un conjunto de medidas fundamentales para describir describir el comportamiento posicional, dispersivo y correlacional de variables aleatorias. En este sentido, el conjunto de datos de trabajo que posee siete variables aleatorias numéricas, y que está representado matricialmente, estima las medidas anteriores a partir de vectores y matrices en el estudio descriptivo multivariable.

El vector de medias indica el comportamiento posicional en el sentido de valor esperado o punto medio para cada variable en relación con todos sus registros. La matriz de varianzas-covarianzas estima las dispersiones, en su diagonal principal, de cada variable del conjunto de datos respecto de cada media obtenida del vector de medias. Además, por encima o por debajo de la diagonal principal, se estiman las covarianzas entre las combinaciones de los posibles pares de variables del conjunto de datos. Para más detalles se puede consultar a [@AMEDAristizabal2017].

Lo anterior, para el conjunto de datos de trabajo, se desarrolla en la sección 3.2.

Planteamiento del Problema

Con base en el conjunto de datos descrito en la sección 2 se calcularán e intepretarán, para las variables numéricas, el vector de medias, la matriz de varianzas-covarianzas y la matriz de correlaciones. Se recuerda que las variables numéricas (en escalada de medición de razón) son: EDAD, ALTURA, PESO, FCVC,NCP,H2O Y FAF

Desarrollo del Análisis

La navegación a través de las pestañas muestra el cálculo de los siguientes objetos: Vector de Medias \(\bar x\), Matriz de Varianzas-Covarianzas \(S\) y Matriz de Correlaciones \(R\).•

El análisis de Vector de Medias y Boxplots nos proporcionan una visión general de la distribución y los valores centrales de cada variable en el conjunto de datos, lo que nos ayuda a comprender mejor la naturaleza y la variabilidad de los datos:

•EDAD: La mediana de la edad es de aproximadamente 24.35 años. En el boxplot correspondiente, podemos ver que la distribución de la edad parece estar centrada alrededor de este valor, con la mayoría de las observaciones concentradas en torno a la mediana. Hay algunas observaciones más dispersas hacia edades más altas, pero en general, la distribución parece ser relativamente simétrica.

•ALTURA: La mediana de la altura es de aproximadamente 1.70 metros. En el boxplot de la altura, vemos que la distribución está centrada alrededor de este valor, con la mayoría de las observaciones concentradas en torno a la mediana. Algunas observaciones están dispersas tanto por encima como por debajo de la mediana, pero la distribución parece ser relativamente simétrica.

•PESO: La mediana del peso es de aproximadamente 84.74 kilogramos. En el boxplot del peso, observamos que la distribución está centrada alrededor de este valor, con la mayoría de las observaciones concentradas en torno a la mediana. Hay algunas observaciones dispersas tanto por encima como por debajo de la mediana, pero en general, la distribución parece ser relativamente simétrica.

•FCVC: La mediana es de aproximadamente 2.39. En el boxplot correspondiente, vemos que la distribución parece estar más sesgada hacia valores más bajos, con la mayoría de las observaciones concentradas en el extremo inferior de la distribución. Sin embargo, también hay algunas observaciones dispersas hacia valores más altos, aunque menos comunes.

•NCP: La mediana es de aproximadamente 2.67. En el boxplot de NCP, vemos que la distribución parece estar más o menos simétricamente distribuida alrededor de la mediana, con la mayoría de las observaciones concentradas en torno a este valor. Hay algunas observaciones dispersas tanto por encima como por debajo de la mediana, pero en general, la distribución parece ser relativamente uniforme.

•H2O: La mediana es de aproximadamente 1.99 litros. En el boxplot correspondiente, vemos que la distribución parece estar más sesgada hacia valores más bajos, con la mayoría de las observaciones concentradas en el extremo inferior de la distribución. Sin embargo, también hay algunas observaciones dispersas hacia valores más altos.

•FAF: La mediana es de aproximadamente 1.03. En el boxplot de FAF, observamos que la distribución está sesgada hacia valores más bajos, con la mayoría de las observaciones concentradas en el extremo inferior de la distribución. Hay algunas observaciones dispersas hacia valores más altos, pero son menos comunes en comparación con las observaciones de baja actividad física.

El análisis de la Matriz de Covarianza revela importantes relaciones entre las variables estudiadas en el conjunto de datos:

•EDAD y ALTURA: Ambas tienen varianzas relativamente bajas, lo que indica que no varían mucho entre los individuos en el conjunto de datos.

•PESO: Tiene una varianza mucho más alta en comparación con la edad y la altura, lo que sugiere que el peso varía considerablemente entre los individuos en el conjunto de datos.

•FCVC: Tiene una covarianza positiva débil con la edad, lo que sugiere una relación leve pero positiva entre la edad y la cantidad de verduras/frutas consumidas diariamente.

•NCP: Tiene una covarianza negativa con la edad, lo que sugiere una relación inversa entre la edad y el número de comidas principales al día. Esto indica que a medida que la edad aumenta, el número de comidas principales al día tiende a disminuir.

•H2O: También tiene una covarianza negativa con la edad, lo que sugiere una relación inversa entre la edad y la cantidad de agua consumida diariamente. Similar al punto anterior, esto indica que a medida que la edad aumenta, la cantidad de agua consumida tiende a disminuir.

•FAF: Tiene una covarianza negativa fuerte con la edad, lo que sugiere una relación inversa fuerte entre la edad y la actividad física semanal. Esto indica que a medida que la edad aumenta, la actividad física tiende a disminuir significativamente.

En resumen, el análisis sugiere que la edad está relacionada de manera inversa con el número de comidas principales al día, la cantidad de agua consumida diariamente y la actividad física, mientras que está relacionada positivamente con la cantidad de verduras/frutas consumidas diariamente. Además, el peso varía considerablemente entre los individuos en el conjunto de datos.

El análisis de matriz de correlaciones proporciona información sobre el grado y la dirección de la relación entre diferentes variables en el conjunto de datos:

•EDAD, ALTURA y PESO: Como era de esperar, la correlación de cada variable consigo misma es 1, lo que indica una correlación perfecta entre la variable y sí misma.

•FCVC: La correlación positiva débil (aproximadamente 0.05) entre la edad y la cantidad de verduras/frutas consumidas diariamente sugiere que, en general, a medida que las personas envejecen, tienden a consumir ligeramente más verduras/frutas.

•NCP: La correlación negativa débil (aproximadamente -0.22) entre la edad y el número de comidas principales al día indica que, en promedio, a medida que las personas envejecen, tienden a tener un menor número de comidas principales al día.

•H2O: Similarmente, la correlación negativa débil (aproximadamente -0.11) entre la edad y la cantidad de agua consumida diariamente sugiere que, en promedio, a medida que las personas envejecen, tienden a consumir ligeramente menos agua.

•FAF: La correlación negativa moderada a fuerte (aproximadamente -0.72) entre la edad y la actividad física semanal indica que hay una relación significativa entre estas dos variables, con las personas mayores participando en menos actividad física semanal en comparación con las personas más jóvenes.

En resumen,el análisis de la matriz de correlaciones refuerza las conclusiones anteriores sobre la relación entre la edad y varios aspectos de la salud y el estilo de vida, como los hábitos alimenticios y la actividad física.

Vector de Medias y Boxplots

apply(Obesity_Dataset[,-c(1,5,6,9,10,12,14,15,16,17,18)], 2, mean)
##      EDAD    ALTURA      PESO      FCVC       NCP       H2O       FAF 
## 24.352500  1.702794 84.741886  2.391500  2.670500  1.997500  1.029000
Obesity_Dataset_Reducido = Obesity_Dataset[,-c(1,5,6,9,10,12,14,15,16,17,18)]
par(mfrow = c(1, ncol(Obesity_Dataset_Reducido)))
invisible(lapply(1:ncol(Obesity_Dataset_Reducido), function(i) boxplot(Obesity_Dataset_Reducido[, i])))

Matriz de Varianzas-Covarianzas

round(cov(Obesity_Dataset[,-c(1,5,6,9,10,12,14,15,16,17,18)]),2)
##         EDAD ALTURA   PESO  FCVC   NCP   H2O   FAF
## EDAD   42.22  -0.01  38.87  0.05 -0.22 -0.11 -0.72
## ALTURA -0.01   0.01   1.19  0.00  0.02  0.01  0.02
## PESO   38.87   1.19 648.63  1.77  1.70  2.90 -0.91
## FCVC    0.05   0.00   1.77  0.34 -0.01  0.02  0.02
## NCP    -0.22   0.02   1.70 -0.01  0.69  0.03  0.11
## H2O    -0.11   0.01   2.90  0.02  0.03  0.47  0.09
## FAF    -0.72   0.02  -0.91  0.02  0.11  0.09  0.80

Matriz de Correlaciones

round(cor(Obesity_Dataset[,-c(1,5,6,9,10,12,14,15,16,17,18)]),2)
##         EDAD ALTURA  PESO  FCVC   NCP   H2O   FAF
## EDAD    1.00  -0.01  0.23  0.01 -0.04 -0.02 -0.12
## ALTURA -0.01   1.00  0.49 -0.04  0.25  0.19  0.27
## PESO    0.23   0.49  1.00  0.12  0.08  0.17 -0.04
## FCVC    0.01  -0.04  0.12  1.00 -0.01  0.04  0.04
## NCP    -0.04   0.25  0.08 -0.01  1.00  0.06  0.14
## H2O    -0.02   0.19  0.17  0.04  0.06  1.00  0.14
## FAF    -0.12   0.27 -0.04  0.04  0.14  0.14  1.00

1.4 Gráficas Multivariadas

En la guía de clase de [@AMEDAristizabal2017] se menciona que, en general, los gráficos multivariados cumplen dos objetivos esenciales: primero, ayudan a comparar el comportamiento de poblaciones de estudio con base en variables categóricas y suavizan la comprensión de la estructura de correlación entre varias variables. En este sentido, el conjunto de datos de trabajo tendrá apoyo descritivo gráfico a través de tres diagramas: uno conjunto que integra dispersión, distribución y correlaciones; otro basado en la renderización de polígonos, y por último, uno que recurre a las caras de Chernoff.

Planteamiento del Problema

Con base en el conjunto de datos descrito en la [sección 2] (#sec_2) se calcularán e intepretarán, para las variables numéricas, las gráficas multivariadas de diagrama de correlaciones, matriz de diagrama de dispersión, diagrama de estrellas y caras de Chernoff. Se recuerda que las variables numéricas (en escalada de medición de razón) son: EDAD, ALTURA, PESO, FCVC,NCP,H2O,FAF Y TUE

Desarrollo del Análisis

La navegación a través de pestañas que nos permite RStudio mostrará las gráficas multivariadas de: Diagrama Conjunto de Dispersión, Distribución y Correlaciones (sin agrupación SA y con agrupación CA; teniendo en cuenta las 11 variables categóricas: SEXO, HISTORIAL_FAMILIAR_SOBREPESO: HFS, FAVC, CAEC, FUMAS, SCC, TUE, CALC, MEDIO_TRANSPORTE: MT, IMC, ENFERMEDAD_CARDIACA :EC) Diagrama de Estrellas y Caras de Chernoff

Basándonos en la pestaña Diagrama Conjunto de Dispersión, Distribución y Correlaciones [SA],INTERPRETAR

De manera complementaria, basándonos en las pestañas Diagrama Conjunto de Dispersión, Distribución y Correlaciones [CA], pero en sus versiones en grupos de las variables categóricas: SEXO, HISTORIAL_FAMILIAR_SOBREPESO, FAVC, CAEC, FUMAS,SCC, TUE, CALC, MEDIO_TRANSPORTE, IMCy ENFERMEDAD_CARDIACA, se puede apreciar INTERPRETAR

En base a la pestaña Diagrama de Estrellas, se puede notar la presencia de la variable PESO en todas estrellas con diferentes longitudes, esto sugiere que el peso es una característica destacada y variable en tus datos. Las diferentes longitudes indican una amplia variabilidad en los pesos entre las personas encuestadas,ademas, la variable EDAD está presente en casi todas las estrellas, pero su impacto en la forma de estas es menor en comparación con otras variables, como PESO. uno de los patrones que se observa es que a medida que la variable PESO aumenta, la variable H2O tiende a disminuir, y viceversa. Esto sugiere una relación inversa entre ambas variables en los datos analizados. Es decir, parece que hay una tendencia DE que las personas con mayor peso tienden a consumir menos agua, y aquellas con menor peso tiendan a consumir más.

La diversidad de características representadas por las caras de Chernoff se ve reflejada la complejidad y la variabilidad del conjunto de datos que estamos estudiando. La presencia de diferentes expresiones faciales sugiere una amplia gama de perfiles demográficos y de salud entre las personas encuestadas. Por ejemplo, las diferentes formas de los ojos, la boca y la nariz representan variaciones en variables como SEXO, EDAD, ALTURA, PESO y factores de riesgo de salud, como HISTORIAL_FAMILIAR_SOBREPESO, FAVC y FAF. La distribución diversa de estas características resalta la importancia de considerar múltiples factores al estudiar la salud y el bienestar de la población representada en los datos.

Diagrama Conjunto de Dispersión, Distribución y Correlaciones[SA]

ggpairs(Obesity_Dataset[,-c(1,5,6,9,10,12,14,15,16,17,18)])

Diagrama Conjunto de Dispersión, Distribución y Correlaciones[CA:SEXO]

ggpairs(Obesity_Dataset, columns = c(2,3,4,7,8,11,13), aes(color = SEXO, alpha = 0.5), upper = list(continuous = wrap("cor", size = 2.5)))

Diagrama Conjunto de Dispersión, Distribución y Correlaciones[CA:HFS]

ggpairs(Obesity_Dataset, columns = c(2,3,4,7,8,11,13), aes(color = HISTORIAL_FAMILIAR_SOBREPESO, alpha = 0.5), upper = list(continuous = wrap("cor", size = 2.5)))

Diagrama Conjunto de Dispersión, Distribución y Correlaciones[CA:FAVC]

ggpairs(Obesity_Dataset, columns = c(2,3,4,7,8,11,13), aes(color = FAVC, alpha = 0.5), upper = list(continuous = wrap("cor", size = 2.5)))

Diagrama Conjunto de Dispersión, Distribución y Correlaciones[CA:CAEC]

ggpairs(Obesity_Dataset, columns = c(2,3,4,7,8,11,13), aes(color = CAEC, alpha = 0.5), upper = list(continuous = wrap("cor", size = 2.5)))

Diagrama Conjunto de Dispersión, Distribución y Correlaciones[CA:FUMAS]

ggpairs(Obesity_Dataset, columns = c(2,3,4,7,8,11,13), aes(color = FUMAS, alpha = 0.5), upper = list(continuous = wrap("cor", size = 2.5)))

Diagrama Conjunto de Dispersión, Distribución y Correlaciones[CA:SCC]

ggpairs(Obesity_Dataset, columns = c(2,3,4,7,8,11,13), aes(color = SCC, alpha = 0.5), upper = list(continuous = wrap("cor", size = 2.5)))

Diagrama Conjunto de Dispersión, Distribución y Correlaciones[CA:TUE]

ggpairs(Obesity_Dataset, columns = c(2,3,4,7,8,11,13), aes(color = TUE, alpha = 0.5), upper = list(continuous = wrap("cor", size = 2.5)))

Diagrama Conjunto de Dispersión, Distribución y Correlaciones[CA:CALC]

ggpairs(Obesity_Dataset, columns = c(2,3,4,7,8,11,13), aes(color = CALC, alpha = 0.5), upper = list(continuous = wrap("cor", size = 2.5)))

Diagrama Conjunto de Dispersión, Distribución y Correlaciones[CA:MT]

ggpairs(Obesity_Dataset, columns = c(2,3,4,7,8,11,13), aes(color = MEDIO_TRANS, alpha = 0.5), upper = list(continuous = wrap("cor", size = 2.5)))
## Warning in cor(x, y): the standard deviation is zero

## Warning in cor(x, y): the standard deviation is zero

## Warning in cor(x, y): the standard deviation is zero

## Warning in cor(x, y): the standard deviation is zero

## Warning in cor(x, y): the standard deviation is zero

## Warning in cor(x, y): the standard deviation is zero

Diagrama Conjunto de Dispersión, Distribución y Correlaciones[CA:IMC]

ggpairs(Obesity_Dataset, columns = c(2,3,4,7,8,11,13), aes(color = IMC, alpha = 0.5), upper = list(continuous = wrap("cor", size = 2.5)))
## Warning in cor(x, y): the standard deviation is zero

## Warning in cor(x, y): the standard deviation is zero

## Warning in cor(x, y): the standard deviation is zero

## Warning in cor(x, y): the standard deviation is zero

## Warning in cor(x, y): the standard deviation is zero

## Warning in cor(x, y): the standard deviation is zero

## Warning in cor(x, y): the standard deviation is zero

## Warning in cor(x, y): the standard deviation is zero

## Warning in cor(x, y): the standard deviation is zero

## Warning in cor(x, y): the standard deviation is zero

## Warning in cor(x, y): the standard deviation is zero

Diagrama Conjunto de Dispersión, Distribución y Correlaciones[CA:EC]

ggpairs(Obesity_Dataset, columns = c(2,3,4,7,8,11,13), aes(color = ENFERMEDAD_CARDIACA, alpha = 0.5), upper = list(continuous = wrap("cor", size = 2.5)))

Diagrama de Estrellas

set.seed(780728)
Obesity_Dataset_Muestreado = Obesity_Dataset[sample(1:nrow(Obesity_Dataset),23),-c(1,5,6,9,10,12,14,15,16,17,18)]
stars(Obesity_Dataset_Muestreado, len = 1, cex = 0.4, key.loc = c(10, 2), draw.segments = TRUE)

Caras de Chernoff

set.seed(780728)
Obesity_Dataset_Muestreado = Obesity_Dataset[sample(1:nrow(Obesity_Dataset),23),-c(1,5,6,9,10,12,14,15,16,17,18)]
faces(Obesity_Dataset_Muestreado)

## effect of variables:
##  modified item       Var     
##  "height of face   " "EDAD"  
##  "width of face    " "ALTURA"
##  "structure of face" "PESO"  
##  "height of mouth  " "FCVC"  
##  "width of mouth   " "NCP"   
##  "smiling          " "H2O"   
##  "height of eyes   " "FAF"   
##  "width of eyes    " "EDAD"  
##  "height of hair   " "ALTURA"
##  "width of hair   "  "PESO"  
##  "style of hair   "  "FCVC"  
##  "height of nose  "  "NCP"   
##  "width of nose   "  "H2O"   
##  "width of ear    "  "FAF"   
##  "height of ear   "  "EDAD"

1.5 Normalidad Multivariada

Como menciona [@CPEMPorras2016] para indagar o establecer el tipo de distribución multivariada de un conjunto de datos se puede recurrir a procedimientos descriptivos, como los gráficos, o a procedimientos inferenciales, como las pruebas estadísticas. En este sentido, se alcanza generalización de resultados al usar las estos últimos, si bien los primeros apoyan a las interpretaciones.

En este apartado se contempla el uso de procedimientos inferenciales para determinar si el conjunto de datos de trabajo, en relación con sus variables numéricas, se distribuye normal multivariado (DNM). Las pruebas de normalidad multivariada (PNM) a las que será sometido son: Mardia, Henze-Zirkler, Doornik-Hansen y Royston. Para estas pruebas de normalidad los test obedecen a un nivel de significancia \(\alpha = 0.05\) y a las hipótesis:\[H_0: \text {Las variables tienen una DNM}\] \[H_1: \text {Las variables NO tienen una DNM}\]

La prueba de Mardia se basa en extensiones de asimetría y curtosis, el cuadrado de la distancia de Mahalanobis, la cantidad de variables \(p\) por tratar y la cantidad de registros \(n\). Además, considera que la prueba estadística para la asimetría tiene una distribución \(\chi^2\) y la prueba estadística para la curtosis se distirbuye aproximadamente normal. Los detalles sobre los parámetros de las distribuciones pueden consultarse en el trabajo de [@CPEMPorras2016].

La prueba de Henze-Zirkler se basa en la distancia funcional, dado que si el conjunto de datos presenta una distribución normal multivariada, el estadístico de la prueba se distribuye aproximadamente como una lognormal, cuyos parámetros de media \(\mu\) y varianza \(\sigma^2\) pueden ser consultados en [@CPEMPorras2016].

La prueba de Doornik-Hansen está basada en la asimetría y la curtosis de un conjunto de datos multivariados, que se transforma para garantizar la independencia. Es considerada más potente que la prueba de Shapiro-Wilk para casos multivariados. Su estadístico de prueba está definido como la suma de las transformaciones al cuadrado de la asimetría y la curtosis, y sigue, aproximadamente, una distribución \(\chi^2\). Los detalles de la prueba pueden ser consultados en [@OTUMNDoornik_Hansen2008].

La prueba de Royston recurre a las pruebas Shapiro-Wilk o Shapiro-Francia para probar la normalidad multivariada. Así, si la curtosis es mayor que 3, la prueba de Royston usa Shapiro-Francia para distribuciones leptocurticas. Mientras que para distribuciones platicurticas usa Shapiro-Wilk. En ella los parámetros son obtenidos por aproximaciones polinomiales, esto puede ser consultado en [@CPEMPorras2016].

Planteamiento del Problema

Con base en el conjunto de datos descrito en la sección 2 se hará una prueba estadística de normalidad multivariada, con un nivel de significancia \(\alpha=0.05\), para establecer si sus datos métricos provienen de una población normal multivariada. Se recuerda que las variables numéricas del conjunto de datos (en escalada de medición de razón) son:EDAD, ALTURA, PESO, FCVC,NCP,H2O,FAFY TUE.

Se utilizará una de las pruebas de normalidad multivariada mencionadas anteriormente, como la prueba de Mardia, Henze-Zirkler, Doornik-Hansen o Royston, dependiendo de la distribución de las variables y la curtosis observada. El objetivo es evaluar si estas variables siguen una distribución normal conjunta en el espacio multivariado.

El procedimiento implicará calcular el estadístico de prueba específico (por ejemplo, basado en asimetría y curtosis) y compararlo con su distribución teórica bajo la hipótesis nula de normalidad multivariada. Se establecerá un criterio de rechazo de la hipótesis nula si el valor \(p-value\) asociado al estadístico de prueba es menor que \(\alpha\).

Una conclusión positiva (no rechazo de la hipótesis nula) indicaría evidencia de que las variables analizadas siguen una distribución normal multivariada. Por el contrario, un rechazo de la hipótesis nula sugeriría que al menos una de las variables no sigue una distribución normal, lo que podría tener implicaciones en el análisis posterior de los datos.

Desarrollo del Análisis

La exploración a través de las diferentes pruebas de normalidad multivariada indica que el conjunto de datos, considerando sus variables numéricas, no sigue una distribución normal multivariada. Aquí están los hallazgos clave de cada prueba:

Prueba de Mardia:Después de realizar un análisis exhaustivo de los resultados obtenidos, se destaca que los valores \(p\) asociados con las pruebas de asimetría (Skewness) y curtosis (Kurtosis) son claramente inferiores al nivel de significancia predeterminado de \(\alpha = 0.05\). Este hallazgo revela una discrepancia significativa entre las distribuciones observadas y la hipótesis de normalidad multivariante propuesta para las variables examinadas en el conjunto de datos.

Prueba de Henze-Zirkler:Basándonos en los resultados de la Prueba de Henze-Zirkler, observamos que el valor \(p\) asociado es menor, lo que indica que es significativamente menor que el nivel de significancia de \(\alpha = 0.05\). Este resultado nos lleva a concluir que no hay suficiente evidencia para respaldar la hipótesis de normalidad multivariante para las variables del conjunto de datos segun la prueba.

Prueba de Doornik-Hansen:Basándonos en los resultados de la Prueba de Doornik-Hansen, donde se obtuvo un valor \(p\) menor al nivel de significancia de \(\alpha = 0.05\), se evidencia una discrepancia significativa con respecto a la hipótesis de normalidad multivariante para las variables examinadas en el conjunto de datos.

Prueba de Royston: Después de realizar un análisis de los resultados de la prueba de normalidad multivariada de Royston indica una falta significativa de normalidad multivariada, por lo tanto, se rechaza la hipótesis nula de normalidad para todas las variables, incluyendo EDAD, ALTURA, PESO, FCVC, NCP, H2O y FAF, ya que el valor de \(p\) de la prueba es inferior al nivel de significancia de \(\alpha = 0.05\). Se asume que los datos pueden no ser adecuados para técnicas estadísticas que asumen normalidad.

En resumen los resultados de las pruebas de normalidad multivariante, incluyendo la Prueba de Mardia, la Prueba de Henze-Zirkler, la Prueba de Doornik-Hansen y la Prueba de Royston, indican una falta de evidencia para respaldar la hipótesis de normalidad en los datos. Esto sugiere que las variables analizadas no siguen una distribución multivariante normal, lo que podría comprometer la validez de los análisis estadísticos posteriores que asumen normalidad. Esta falta de normalidad multivariante resalta la importancia de interpretar los resultados subsiguientes con precaución.

PNM Mardia

mvn(Obesity_Dataset[,-c(1,5,6,9,10,12,14,15,16,17,18)], mvnTest="mardia")
## $multivariateNormality
##              Test         Statistic             p value Result
## 1 Mardia Skewness  2254.11905818491                   0     NO
## 2 Mardia Kurtosis -2.57805049523411 0.00993594774014772     NO
## 3             MVN              <NA>                <NA>     NO
## 
## $univariateNormality
##               Test  Variable Statistic   p value Normality
## 1 Anderson-Darling   EDAD      81.2363  <0.001      NO    
## 2 Anderson-Darling  ALTURA      4.1077  <0.001      NO    
## 3 Anderson-Darling   PESO      12.8635  <0.001      NO    
## 4 Anderson-Darling   FCVC     254.3557  <0.001      NO    
## 5 Anderson-Darling    NCP     300.7671  <0.001      NO    
## 6 Anderson-Darling    H2O     175.0430  <0.001      NO    
## 7 Anderson-Darling    FAF     119.4207  <0.001      NO    
## 
## $Descriptives
##           n      Mean     Std.Dev    Median   Min    Max  25th       75th
## EDAD   2000 24.352500  6.49748816 23.000000 14.00  61.00 20.00  26.000000
## ALTURA 2000  1.702794  0.09467057  1.701994  1.45   1.98  1.63   1.770625
## PESO   2000 84.741886 25.46828311 82.000000 39.00 173.00 65.00 104.974220
## FCVC   2000  2.391500  0.58343633  2.000000  1.00   3.00  2.00   3.000000
## NCP    2000  2.670500  0.82841589  3.000000  1.00   4.00  3.00   3.000000
## H2O    2000  1.997500  0.68390614  2.000000  1.00   3.00  2.00   2.000000
## FAF    2000  1.029000  0.89641552  1.000000  0.00   3.00  0.00   2.000000
##                Skew   Kurtosis
## EDAD    1.490467061  2.5553126
## ALTURA -0.040133674 -0.5936325
## PESO    0.317450528 -0.5932652
## FCVC   -0.342917405 -0.7235588
## NCP    -0.991495771  0.1614442
## H2O     0.003145596 -0.8630781
## FAF     0.438831169 -0.7121633

PNM Henze-Zirkler

mvn(Obesity_Dataset[,-c(1,5,6,9,10,12,14,15,16,17,18)], mvnTest="hz")
## $multivariateNormality
##            Test       HZ p value MVN
## 1 Henze-Zirkler 9.579415       0  NO
## 
## $univariateNormality
##               Test  Variable Statistic   p value Normality
## 1 Anderson-Darling   EDAD      81.2363  <0.001      NO    
## 2 Anderson-Darling  ALTURA      4.1077  <0.001      NO    
## 3 Anderson-Darling   PESO      12.8635  <0.001      NO    
## 4 Anderson-Darling   FCVC     254.3557  <0.001      NO    
## 5 Anderson-Darling    NCP     300.7671  <0.001      NO    
## 6 Anderson-Darling    H2O     175.0430  <0.001      NO    
## 7 Anderson-Darling    FAF     119.4207  <0.001      NO    
## 
## $Descriptives
##           n      Mean     Std.Dev    Median   Min    Max  25th       75th
## EDAD   2000 24.352500  6.49748816 23.000000 14.00  61.00 20.00  26.000000
## ALTURA 2000  1.702794  0.09467057  1.701994  1.45   1.98  1.63   1.770625
## PESO   2000 84.741886 25.46828311 82.000000 39.00 173.00 65.00 104.974220
## FCVC   2000  2.391500  0.58343633  2.000000  1.00   3.00  2.00   3.000000
## NCP    2000  2.670500  0.82841589  3.000000  1.00   4.00  3.00   3.000000
## H2O    2000  1.997500  0.68390614  2.000000  1.00   3.00  2.00   2.000000
## FAF    2000  1.029000  0.89641552  1.000000  0.00   3.00  0.00   2.000000
##                Skew   Kurtosis
## EDAD    1.490467061  2.5553126
## ALTURA -0.040133674 -0.5936325
## PESO    0.317450528 -0.5932652
## FCVC   -0.342917405 -0.7235588
## NCP    -0.991495771  0.1614442
## H2O     0.003145596 -0.8630781
## FAF     0.438831169 -0.7121633

PNM Doornik-Hansen

mvn(Obesity_Dataset[,-c(1,5,6,9,10,12,14,15,16,17,18)], mvnTest="dh")
## $multivariateNormality
##             Test        E df p value MVN
## 1 Doornik-Hansen 17404.04 14       0  NO
## 
## $univariateNormality
##               Test  Variable Statistic   p value Normality
## 1 Anderson-Darling   EDAD      81.2363  <0.001      NO    
## 2 Anderson-Darling  ALTURA      4.1077  <0.001      NO    
## 3 Anderson-Darling   PESO      12.8635  <0.001      NO    
## 4 Anderson-Darling   FCVC     254.3557  <0.001      NO    
## 5 Anderson-Darling    NCP     300.7671  <0.001      NO    
## 6 Anderson-Darling    H2O     175.0430  <0.001      NO    
## 7 Anderson-Darling    FAF     119.4207  <0.001      NO    
## 
## $Descriptives
##           n      Mean     Std.Dev    Median   Min    Max  25th       75th
## EDAD   2000 24.352500  6.49748816 23.000000 14.00  61.00 20.00  26.000000
## ALTURA 2000  1.702794  0.09467057  1.701994  1.45   1.98  1.63   1.770625
## PESO   2000 84.741886 25.46828311 82.000000 39.00 173.00 65.00 104.974220
## FCVC   2000  2.391500  0.58343633  2.000000  1.00   3.00  2.00   3.000000
## NCP    2000  2.670500  0.82841589  3.000000  1.00   4.00  3.00   3.000000
## H2O    2000  1.997500  0.68390614  2.000000  1.00   3.00  2.00   2.000000
## FAF    2000  1.029000  0.89641552  1.000000  0.00   3.00  0.00   2.000000
##                Skew   Kurtosis
## EDAD    1.490467061  2.5553126
## ALTURA -0.040133674 -0.5936325
## PESO    0.317450528 -0.5932652
## FCVC   -0.342917405 -0.7235588
## NCP    -0.991495771  0.1614442
## H2O     0.003145596 -0.8630781
## FAF     0.438831169 -0.7121633

PNM ROYSTON

mvn(Obesity_Dataset[,-c(1,5,6,9,10,12,14,15,16,17,18)], mvnTest="royston")
## $multivariateNormality
##      Test        H       p value MVN
## 1 Royston 1087.789 1.410348e-230  NO
## 
## $univariateNormality
##               Test  Variable Statistic   p value Normality
## 1 Anderson-Darling   EDAD      81.2363  <0.001      NO    
## 2 Anderson-Darling  ALTURA      4.1077  <0.001      NO    
## 3 Anderson-Darling   PESO      12.8635  <0.001      NO    
## 4 Anderson-Darling   FCVC     254.3557  <0.001      NO    
## 5 Anderson-Darling    NCP     300.7671  <0.001      NO    
## 6 Anderson-Darling    H2O     175.0430  <0.001      NO    
## 7 Anderson-Darling    FAF     119.4207  <0.001      NO    
## 
## $Descriptives
##           n      Mean     Std.Dev    Median   Min    Max  25th       75th
## EDAD   2000 24.352500  6.49748816 23.000000 14.00  61.00 20.00  26.000000
## ALTURA 2000  1.702794  0.09467057  1.701994  1.45   1.98  1.63   1.770625
## PESO   2000 84.741886 25.46828311 82.000000 39.00 173.00 65.00 104.974220
## FCVC   2000  2.391500  0.58343633  2.000000  1.00   3.00  2.00   3.000000
## NCP    2000  2.670500  0.82841589  3.000000  1.00   4.00  3.00   3.000000
## H2O    2000  1.997500  0.68390614  2.000000  1.00   3.00  2.00   2.000000
## FAF    2000  1.029000  0.89641552  1.000000  0.00   3.00  0.00   2.000000
##                Skew   Kurtosis
## EDAD    1.490467061  2.5553126
## ALTURA -0.040133674 -0.5936325
## PESO    0.317450528 -0.5932652
## FCVC   -0.342917405 -0.7235588
## NCP    -0.991495771  0.1614442
## H2O     0.003145596 -0.8630781
## FAF     0.438831169 -0.7121633

##Fase 2 [Componentes Principales]

###2.1. Objetivos ###2.2. Selección de Componentes ###2.3. Calidad de Representación ###2.4. Contribuciones ###2.5. Interpretación de Componentes

##Fase 3 [Correspondencias]

###3.1. Objetivos ###3.1. Correspondencias Simples ###3.2. Correspondencias Múltiples

##Fase 4 [Análisis de Regresión]

###4.1. Objetivos ###4.1. Regresión Lineal Simple ###4.2. Regresión Lineal Múltiple ###4.3. Regresión Logística

LS0tDQp0aXRsZTogPGNlbnRlcj4gIkVzdHVkaW8gRGVzY3JpcHRpdm8gTXVsdGl2YXJpYW50ZSBiYXNhZG8gZW4gdW4gQ29uanVudG8gZGUgRGF0b3MgcXVlIHJlZ2lzdHJhIERpYWduw7NzdGljb3MgZGUgRW5mZXJtZWRhZGVzIENhcmRpb3Zhc2N1bGFyZXMgZW4gcGFpc2VzIGRlIExhdGlub2FtZXJpY2EiPC9jZW50ZXI+DQphdXRob3I6ICJQb3I6IEc3OjprZXZpbi5zYW50aWFnby5jcnV6OjplbWVyc29uLnphc2lwYTo6YXJpYWRuYS52aWxsYTo6QGNvcnJlb3VuaXZhbGxlLmVkdS5jbyINCmRhdGU6ICIyOS0wNC0yMDI0Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogVFJVRQ0KICAgIHRvY19mbG9hdDogVFJVRQ0KICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUNCiAgICB0aGVtZTogdW5pdGVkDQotLS0NCjwhLS0gQ29uZmlndXJhY2nDs24gR2xvYmFsIGRlIFIgLS0+DQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoY29ycnBsb3QpDQpsaWJyYXJ5KEdHYWxseSkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoYW5kcmV3cykNCmxpYnJhcnkodGNsdGspDQpsaWJyYXJ5KGFwbHBhY2spDQpsaWJyYXJ5KGdyYXBoaWNzKQ0KbGlicmFyeShjb3JycGxvdCkNCmxpYnJhcnkoTVZOKQ0KbGlicmFyeShyZXNoYXBlMikNCmxpYnJhcnkoRmFjdG9NaW5lUikNCmxpYnJhcnkoZmFjdG9leHRyYSkNCmxpYnJhcnkocHN5Y2gpDQpsaWJyYXJ5KEZhY3RvQ2xhc3MpDQpsaWJyYXJ5KGNsdXN0ZXIpDQpsaWJyYXJ5KGRlbmRleHRlbmQpDQpsaWJyYXJ5KG1hZ3JpdHRyKQ0KbGlicmFyeShOYkNsdXN0KQ0KDQoNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCg0KT2Jlc2l0eV9EYXRhc2V0IDwtIHJlYWRfZXhjZWwoIkM6L1VzZXJzL2FyaWFkL0Rvd25sb2Fkcy9EQVRPU19PQkVTSURBRF9HNy54bHN4IikNClZpZXcoT2Jlc2l0eV9EYXRhc2V0KQ0KDQpgYGANCg0KIyBGYXNlIDEgW0Rlc2NyaXBjaW9uZXMgTXVsdGl2YXJpYW50ZXNdDQoNCiMjICoqMS4xIE9iamV0aXZvcyBHbG9iYWxlcyoqDQoNCkVsIG9iamV0aXZvIHByaW5jaXBhbCBkZSBlc3RlIGVzdHVkaW8gZXMgcmVhbGl6YXIgdW4gYW7DoWxpc2lzIGV4aGF1c3Rpdm8gZGUgdW4gY29uanVudG8gZGUgZGF0b3MgcXVlIGNvbnRpZW5lIGRpYWduw7NzdGljb3MgZGUgZW5mZXJtZWRhZGVzIGNhcmRpb3Zhc2N1bGFyZXMgZW4gcGHDrXNlcyBkZSBMYXRpbm9hbcOpcmljYSwgdXRpbGl6YW5kbyBoZXJyYW1pZW50YXMgZGUgZXN0YWTDrXN0aWNhIGRlc2NyaXB0aXZhIG11bHRpdmFyaWFudGUuIEVzdGUgYW7DoWxpc2lzIHNlIGVuZm9jYXLDoSBlbiBsbGV2YXIgYSBjYWJvIGPDoWxjdWxvcywgY3JlYXIgdmlzdWFsaXphY2lvbmVzIHkgcmVhbGl6YXIgaW50ZXJwcmV0YWNpb25lcyBjb24gZWwgcHJvcMOzc2l0byBkZSBjb21wcmVuZGVyIG3DoXMgcHJvZnVuZGFtZW50ZSBsYSBwcmV2YWxlbmNpYSB5IGRpc3RyaWJ1Y2nDs24gZGUgZXN0YXMgZW5mZXJtZWRhZGVzIGVuIGxhIHJlZ2nDs24uDQoNClNlIGVzcGVyYSBxdWUgZXN0ZSBhbsOhbGlzaXMgcHJvcG9yY2lvbmUgdW5hIGNvbXByZW5zacOzbiBtw6FzIHByb2Z1bmRhIGRlIGxhIHNpdHVhY2nDs24gZGUgbGFzIGVuZmVybWVkYWRlcyBjYXJkaW92YXNjdWxhcmVzIGVuIExhdGlub2Ftw6lyaWNhLCBsbyBxdWUgcGVybWl0aXLDoSBpZGVudGlmaWNhciDDoXJlYXMgY29uIG1heW9yIHByZXZhbGVuY2lhLCBmYWN0b3JlcyBhc29jaWFkb3MgeSBwb3NpYmxlcyBkaXNwYXJpZGFkZXMgcmVnaW9uYWxlcy4gRXN0b3MgcmVzdWx0YWRvcyB0ZW5kcsOhbiBhcGxpY2FjaW9uZXMgcHLDoWN0aWNhcyBpbXBvcnRhbnRlcywgeWEgcXVlIHBvZHLDrWFuIHV0aWxpemFyc2UgcGFyYSBpbmZvcm1hciBwb2zDrXRpY2FzIGRlIHNhbHVkIHDDumJsaWNhIHkgZGlyaWdpciBmdXR1cmFzIGludmVzdGlnYWNpb25lcyBlbiBlc3RlIMOhbWJpdG8uDQoNCiMjICoqMS4yIERlc2NyaXBjacOzbiBkZSBsb3MgZGF0b3MqKiB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQpGdWVudGUgZGVsIGNvbmp1bnRvIGRlIGRhdG9zDQoNCkVsIGNvbmp1bnRvIGRlIGRhdG9zIGRlIHRyYWJham8gc2Ugb2J0dXZvIHRvdGFsbWVudGUgZGUgKipLYWdnbGUqKjogPGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vPi5FcyBjb252ZW5pZW50ZSBhbm90YXIgcXVlICoqS2FnZ2xlKiogZXMgdW5hIGNvbXBhw7HDrWEgc3Vic2lkaWFyaWEgZGUgR29vZ2xlIExMQyBxdWUgbWFudGllbmUgdW5hIGNvbXVuaWRhZCBvbmxpbmUgZGUgY2llbnTDrWZpY29zIGRlIGRhdG9zIHkgcHJvZmVzaW9uYWxlcyBkZWwgYXByZW5kaXphamUgYXV0b23DoXRpY28uIEVzdGEgZW1wcmVzYSBwZXJtaXRlIGEgc3VzIHVzdWFyaW9zIGEgZW5jb250cmFyIHkgcHVibGljYXIgY29uanVudG9zIGRlIGRhdG9zLCBleHBsb3JhciB5IGNyZWFyIG1vZGVsb3MgZW4gdW4gZW50b3JubyBkZSBjaWVuY2lhIGRlIGRhdG9zIGJhc2FkbyBlbiBsYSB3ZWIsIHRyYWJhamFyIGNvbiBvdHJvcyBjaWVudMOtZmljb3MgZGUgZGF0b3MgZSBpbmdlbmllcm9zIGRlIGFwcmVuZGl6YWplIGF1dG9tw6F0aWNvIHkgcGFydGljaXBhciBlbiBjb25jdXJzb3MgcGFyYSByZXNvbHZlciBkZXNhZsOtb3MgZGUgY2llbmNpYSBkZSBkYXRvcw0KDQpDb250ZXh0byBkZWwgQ29uanVudG8gZGUgRGF0b3MNCg0KRWwgY29uanVudG8gZGUgZGF0b3MgcHJvcG9yY2lvbmEgaW5mb3JtYWNpw7NuIGRldGFsbGFkYSBzb2JyZSBsb3Mgbml2ZWxlcyBkZSBvYmVzaWRhZCBlbiBpbmRpdmlkdW9zIGRlIHBhw61zZXMgY29tbyBNw6l4aWNvLCBQZXLDuiB5IENvbG9tYmlhLCBhYmFyY2FuZG8gdW4gcmFuZ28gZGUgZWRhZGVzIGNvbXByZW5kaWRvIGVudHJlIGxvcyAxNCB5IDYxIGHDsW9zLiBFc3RvcyBkYXRvcyBzb24gZXNwZWNpYWxtZW50ZSB2YWxpb3NvcyB5YSBxdWUgaW5jbHV5ZW4gdW5hIGFtcGxpYSB2YXJpZWRhZCBkZSBow6FiaXRvcyBhbGltZW50YXJpb3MgeSBjb25kaWNpb25lcyBmw61zaWNhcyBkZSBsb3MgZW5jdWVzdGFkb3MuIExhIHJlY29sZWNjacOzbiBkZSBkYXRvcyBzZSByZWFsaXrDsyBhIHRyYXbDqXMgZGUgZW5jdWVzdGFzIGFuw7NuaW1hcyB2w61hIHdlYiwgbG8gcXVlIGdhcmFudGl6YSBsYSBjb25maWRlbmNpYWxpZGFkIGRlIGxvcyBwYXJ0aWNpcGFudGVzIHkgbGEgaW50ZWdyaWRhZCBkZSBsb3MgZGF0b3MgcmVjb3BpbGFkb3MuIEVzdGUgY29udGV4dG8gZGVsIGNvbmp1bnRvIGRlIGRhdG9zIHByb3BvcmNpb25hIHVuYSBiYXNlIHPDs2xpZGEgcGFyYSBsbGV2YXIgYSBjYWJvIHVuIGFuw6FsaXNpcyBleGhhdXN0aXZvIGRlIGxvcyBmYWN0b3JlcyByZWxhY2lvbmFkb3MgY29uIGxhIHByZXNlbmNpYSBkZSBlbmZlcm1lZGFkZXMgY2FyZGlvdmFzY3VsYXJlcyBlbiBlc3RvcyBwYcOtc2VzIGxhdGlub2FtZXJpY2Fub3MuDQoNCkRlc2NyaXBjacOzbiBkZWwgY29uanVudG8gZGUgZGF0b3MNCg0KRWwgY29uanVudG8gZGUgZGF0b3MgY29udGllbmUgMTggY2FtcG9zIHkgMjAwMCByZWdpc3Ryb3MuIFVubyBkZSBsb3MgY2FtcG9zIGVzIHVuYSB2YXJpYWJsZSBub21pbmFsIGRpY290w7NtaWNhIHF1ZSBkZXRlcm1pbmEgc2kgZWwgYWd1YSBlcyBhcHRhIHBhcmEgZWwgY29uc3VtbyBodW1hbm8uIERlIGxvcyByZWdpc3Ryb3M7IHRyZXMgc29uIGRlIG5hdHVyYWxlemEgY3VhbGl0YXRpdmEsIHF1ZSBicmluZGFuIGxhIHViaWNhY2nDs24gZXNwYWNpYWwgZG9uZGUgc2UgbGV2YW50w7MgZWwgcmVzZ2lzdHJvOyBlbCByZXN0byBzb24gbnVtw6lyaWNvcyBlc3RyaWN0YW1lbnRlIHBvc2l0aXZvcy4gTGEgbGlzdGEgc2lndWllbnRlIGxvcyBkZXNjcmliZSBkZSBpenF1aWVyZGRhIGEgZGVyZWNoYSwgY29tbyBhcGFyZWNlbiBlbiBlbCBjb25qdW50byBkZSBkYXRvcyBxdWUgbG9zIGNvbnRpZW5lLiBTZSBlc3RhYmxlY2UgcGFyYSBjYWRhIGNhbXBvOiB0aXBvIGRlIHZhcmlhYmxlIHkgZXNjYWxhIGRlIG1lZGljacOzbiBjb24gYmFzZSBlbiBsYSBub21lbmNsYXR1cmEgKHRpcG9fZGVfdmFyaWFibGU6OmVzY2FsYV9kZV9tZWRpY2nDs25bb3JkZW5hbWllbnRvXSk6DQoNCi0qKlNFWE8qKjogQ3VhbGl0YXRpdmFbTm9taW5hbF06IEVzdGEgdmFyaWFibGUgcmVnaXN0cmEgZWwgc2V4byBkZSBjYWRhIGluZGl2aWR1byBlbiBlbCBjb25qdW50byBkZSBkYXRvcy4gU2UgcmVwcmVzZW50YSBtZWRpYW50ZSBkb3MgY2F0ZWdvcsOtYXM6DQoNCuKAoiBNOiBNYXNjdWxpbm8gDQrigKIgRjogRmVtZW5pbm8uIA0KDQotKipFREFEKiogQ3VhbnRpdGF0aXZhW3JhesOzbl06IEVzdGEgdmFyaWFibGUgcmVnaXN0cmEgbGEgZWRhZCBkZSBjYWRhIGluZGl2aWR1byBlbiBlbCBjb25qdW50byBkZSBkYXRvcy4gU2UgZXhwcmVzYSBlbiBhw7FvcyB5IGFiYXJjYSB1biByYW5nbyBxdWUgdmEgZGVzZGUgbG9zIDE0IGhhc3RhIGxvcyA2MSBhw7Fvcy4NCg0KLSoqQUxUVVJBKiogQ3VhbnRpdGF0aXZhW3JhesOzbl06IEVzdGEgdmFyaWFibGUgcmVnaXN0cmEgbGEgYWx0dXJhIGRlbCBpbmRpdmlkdW8gZW4gZWwgY29uanVudG8gZGUgZGF0b3MuIFNlIGV4cHJlc2EgZW4gbWV0cm9zIHkgcmVwcmVzZW50YSBsYSBtZWRpZGEgZGVzZGUgbGEgY2FiZXphIGhhc3RhIGxvcyBwaWVzIGRlIGNhZGEgaW5kaXZpZHVvLg0KDQotKipQRVNPKiogQ3VhbnRpdGF0aXZhW3JhesOzbl06IEVzdGEgdmFyaWFibGUgcmVnaXN0cmEgZWwgcGVzbyBkZWwgaW5kaXZpZHVvIGVuIGVsIGNvbmp1bnRvIGRlIGRhdG9zLiBTZSBleHByZXNhIGVuIGtpbG9ncmFtb3MgeSByZXByZXNlbnRhIGxhIG1hc2EgY29ycG9yYWwgZGUgY2FkYSBpbmRpdmlkdW8uDQoNCi0qKkhJU1RPUklBTF9GQU1JTElBUl9TT0JSRVBFU08qKiBDdWFsaXRhdGl2YVtOb21pbmFsXTogRXN0YSB2YXJpYWJsZSByZWdpc3RyYSBzaSBlbCBpbmRpdmlkdW8gdGllbmUgYW50ZWNlZGVudGVzIGZhbWlsaWFyZXMgZGUgc29icmVwZXNvLiBTZSByZXByZXNlbnRhIG1lZGlhbnRlIGRvcyBjYXRlZ29yw61hczogDQoNCuKAoiBTSTogSW5kaXZpZHVvcyBxdWUgdGllbmVuIGZhbWlsaWFyZXMgZGlhZ25vc3RpY2Fkb3MgY29uIHNvYnJlcGVzby4NCuKAoiBOTzogSW5kaXZpZHVvcyBxdWUgbm8gdGllbmVuIGZhbWlsaWFyZXMgZGlhZ25vc3RpY2Fkb3MgY29uIHNvYnJlcGVzby4gDQoNCi0qKkZBVkMqKiBDdWFsaXRhdGl2YVtOb21pbmFsXTogRXN0YSB2YXJpYWJsZSByZWdpc3RyYSBzaSBlbCBpbmRpdmlkdW8gdGllbmUgdW4gY29uc3VtbyBmcmVjdWVudGUgZGUgYWxpbWVudG9zIHJpY29zIGVuIGNhbG9yw61hcy4gU2UgcmVwcmVzZW50YSBtZWRpYW50ZSBkb3MgY2F0ZWdvcsOtYXM6IA0KDQrigKIgU0k6IEluZGl2aWR1b3MgcXVlIHRpZW5lbiB1biBjb25zdW1vIGZyZWN1ZW50ZSBkZSBhbGltZW50b3Mgcmljb3MgZW4gY2Fsb3LDrWFzLg0K4oCiIE5POiBJbmRpdmlkdW9zIHF1ZSBubyB0aWVuZW4gdW4gY29uc3VtbyBmcmVjdWVudGUgZGUgYWxpbWVudG9zIHJpY29zIGVuIGNhbG9yw61hcy4gDQoNCi0qKkZDVkMqKkN1YWxpdGF0aXZvW09yZGluYWxdOiBFc3RhIHZhcmlhYmxlIHJlZ2lzdHJhIGxhIGZyZWN1ZW5jaWEgY29uIGxhIHF1ZSBjYWRhIGluZGl2aWR1byBjb25zdW1lIHZlZ2V0YWxlcyBlbiB1biBkw61hIHTDrXBpY28uIFNlIHJlcHJlc2VudGEgbWVkaWFudGUgdHJlcyBjYXRlZ29yw61hcyBudW3DqXJpY2FzOg0KDQrigKIgMTogSW5kaWNhIHF1ZSBlbCBpbmRpdmlkdW8gY29uc3VtZSB2ZWdldGFsZXMgdW5hIHZleiBhbCBkw61hLg0K4oCiIDI6IEluZGljYSBxdWUgZWwgaW5kaXZpZHVvIGNvbnN1bWUgdmVnZXRhbGVzIGRvcyB2ZWNlcyBhbCBkw61hLg0K4oCiIDM6IEluZGljYSBxdWUgZWwgaW5kaXZpZHVvIGNvbnN1bWUgdmVnZXRhbGVzIHRyZXMgbyBtw6FzIHZlY2VzIGFsIGTDrWEuDQoNCi0qKk5DUCoqIEN1YWxpdGF0aXZhW09yZGluYWxdOiBFc3RhIHZhcmlhYmxlIHJlZ2lzdHJhIGVsIG7Dum1lcm8gZGUgY29taWRhcyBwcmluY2lwYWxlcyBxdWUgZWwgaW5kaXZpZHVvIGNvbnN1bWUgZW4gdW4gZMOtYSB0w61waWNvLiBTZSByZXByZXNlbnRhIG1lZGlhbnRlIGN1YXRybyBjYXRlZ29yw61hcyBudW3DqXJpY2FzOg0KDQrigKIgMTogSW5kaWNhIHF1ZSBlbCBpbmRpdmlkdW8gdGllbmUgdW5hIGNvbWlkYSBwcmluY2lwYWwgYWwgZMOtYS4NCuKAoiAyOiBJbmRpY2EgcXVlIGVsIGluZGl2aWR1byB0aWVuZSBkb3MgY29taWRhcyBwcmluY2lwYWxlcyBhbCBkw61hLg0K4oCiIDM6IEluZGljYSBxdWUgZWwgaW5kaXZpZHVvIHRpZW5lIHRyZXMgY29taWRhcyBwcmluY2lwYWxlcyBhbCBkw61hLg0K4oCiIDQ6IEluZGljYSBxdWUgZWwgaW5kaXZpZHVvIHRpZW5lIGN1YXRybyBvIG3DoXMgY29taWRhcyBwcmluY2lwYWxlcyBhbCBkw61hLg0KDQotKipDQUVDKiogQ3VhbGl0YXRpdmFbT3JkaW5hbF06IEVzdGEgdmFyaWFibGUgcmVnaXN0cmEgZWwgY29uc3VtbyBkZSBhbGltZW50b3MgZW50cmUgY29taWRhcyBkZSBjYWRhIGluZGl2aWR1by4gU2UgcmVwcmVzZW50YSBtZWRpYW50ZSBjdWF0cm8gY2F0ZWdvcsOtYXM6DQoNCuKAoglBTEdVTkFTIFZFQ0VTDQrigKIJU0lFTVBSRQ0K4oCiCUZSRUNVRU5URU1FTlRFIA0K4oCiCU5PDQoNCi0qKkZVTUEqKiBDdWFsaXRhdGl2YVtOb21pbmFsXTogRXN0YSB2YXJpYWJsZSByZWdpc3RyYSBzaSBlbCBpbmRpdmlkdW8gZnVtYSBvIG5vLiBTZSByZXByZXNlbnRhIG1lZGlhbnRlIGRvcyBjYXRlZ29yw61hczoNCg0K4oCiIFNJOiBJbmRpY2EgcXVlIGVsIGluZGl2aWR1byBmdW1hLg0K4oCiIE5POiBJbmRpY2EgcXVlIGVsIGluZGl2aWR1byBubyBmdW1hLg0KDQotKipIMk8qKiBDdWFsaXRhdGl2YVtPcmRpbmFsXTogRXN0YSB2YXJpYWJsZSByZWdpc3RyYSBsYSBjYW50aWRhZCBkZSBhZ3VhIHF1ZSBlbCBpbmRpdmlkdW8gY29uc3VtZSBlbiB1biBkw61hIHTDrXBpY28uIFNlIHJlcHJlc2VudGEgbWVkaWFudGUgdHJlcyBjYXRlZ29yw61hcyBudW3DqXJpY2FzOg0KDQrigKIgMTogSW5kaWNhIHF1ZSBlbCBpbmRpdmlkdW8gY29uc3VtZSAxIGxpdHJvIGRlIGFndWEgYWwgZMOtYS4NCuKAoiAyOiBJbmRpY2EgcXVlIGVsIGluZGl2aWR1byBjb25zdW1lIDIgbGl0cm9zIGRlIGFndWEgYWwgZMOtYS4NCuKAoiAzOiBJbmRpY2EgcXVlIGVsIGluZGl2aWR1byBjb25zdW1lIDMgbyBtw6FzIGxpdHJvcyBkZSBhZ3VhIGFsIGTDrWEuDQoNCi0qKlNDQyoqIEN1YWxpdGF0aXZhW05vbWluYWxdOiBFc3RhIHZhcmlhYmxlIHJlZ2lzdHJhIHNpIGVsIGluZGl2aWR1byBtb25pdG9yZWEgbyBubyBzdSBjb25zdW1vIGRlIGNhbG9yw61hcy4gU2UgcmVwcmVzZW50YSBtZWRpYW50ZSBkb3MgY2F0ZWdvcsOtYXM6DQoNCuKAoiBTSTogSW5kaWNhIHF1ZSBlbCBpbmRpdmlkdW8gbW9uaXRvcmVhIHN1IGNvbnN1bW8gZGUgY2Fsb3LDrWFzLg0K4oCiIE5POiBJbmRpY2EgcXVlIGVsIGluZGl2aWR1byBubyBtb25pdG9yZWEgc3UgY29uc3VtbyBkZSBjYWxvcsOtYXMuDQoNCi0qKkZBRioqIEN1YWxpdGF0aXZhW09yZGluYWxdOiBFc3RhIHZhcmlhYmxlIHJlZ2lzdHJhIGxhIGZyZWN1ZW5jaWEgZGUgYWN0aXZpZGFkIGbDrXNpY2EgcXVlIGNhZGEgaW5kaXZpZHVvIHJlYWxpemEgZW4gdW4gZMOtYSB0w61waWNvLCBtZWRpZGEgZW4gaG9yYXMgcG9yIGTDrWEuIFNlIHJlcHJlc2VudGEgbWVkaWFudGUgY3VhdHJvIGNhdGVnb3LDrWFzIG51bcOpcmljYXM6DQoNCuKAoiAwOiBJbmRpY2EgcXVlIGVsIGluZGl2aWR1byBubyByZWFsaXphIGFjdGl2aWRhZCBmw61zaWNhIGVuIGVsIGTDrWEuDQrigKIgMTogSW5kaWNhIHF1ZSBlbCBpbmRpdmlkdW8gcmVhbGl6YSBhY3RpdmlkYWQgZsOtc2ljYSBkdXJhbnRlIHVuYSBob3JhIGFsIGTDrWEuDQrigKIgMjogSW5kaWNhIHF1ZSBlbCBpbmRpdmlkdW8gcmVhbGl6YSBhY3RpdmlkYWQgZsOtc2ljYSBkdXJhbnRlIGRvcyBob3JhcyBhbCBkw61hLg0K4oCiIDM6IEluZGljYSBxdWUgZWwgaW5kaXZpZHVvIHJlYWxpemEgYWN0aXZpZGFkIGbDrXNpY2EgZHVyYW50ZSB0cmVzIG8gbcOhcyBob3JhcyBhbCBkw61hLg0KDQotKipUVUUqKiBDdWFsaXRhdGl2YVtPcmRpbmFsXTogRXN0YSB2YXJpYWJsZSByZWdpc3RyYSBlbCB0aWVtcG8gZGUgdXNvIGRlIGRpc3Bvc2l0aXZvcyB0ZWNub2zDs2dpY29zIGRlIGNhZGEgaW5kaXZpZHVvLiBTZSByZXByZXNlbnRhIG1lZGlhbnRlIHRyZXMgY2F0ZWdvcsOtYXMgbnVtw6lyaWNhczoNCg0K4oCiIEZyZWN1ZW50ZW1lbnRlDQrigKIgU2llbXByZQ0K4oCiIE51bmNhDQoNCi0qKkNBTEMqKiBDdWFsaXRhdGl2YVtPcmRpbmFsXTogRXN0YSB2YXJpYWJsZSByZWdpc3RyYSBlbCBjb25zdW1vIGRlIGFsY29ob2wgZGUgY2FkYSBpbmRpdmlkdW8uIFNlIHJlcHJlc2VudGEgbWVkaWFudGUgbGFzIHNpZ3VpZW50ZXMgY2F0ZWdvcsOtYXM6DQoNCuKAoglTSTogU2kgY29uc3VtZSBBbGNvaG9sDQrigKIgTk86IE5vIGNvbnN1bWUgQWxjb2hvbA0KDQotKipNRURJT19UUkFOUyoqIEN1YWxpdGF0aXZhW05vbWluYWxdOiBFc3RhIHZhcmlhYmxlIHJlZ2lzdHJhIGVsIG1lZGlvIGRlIHRyYW5zcG9ydGUgdXRpbGl6YWRvIHBvciBlbCBpbmRpdmlkdW8uIFNlIHJlcHJlc2VudGEgbWVkaWFudGUgbGFzIHNpZ3VpZW50ZXMgY2F0ZWdvcsOtYXM6DQoNCuKAoiBUUkFOU1BPUlRFX1BVQkxJQ08NCuKAoiBDSUNMQQ0K4oCiIEFVVE9Nw5NWSUwNCuKAoiBDQU1JTkFORE8NCuKAoiBNT1RPQ0lDTEVUQQ0KDQotKipJTUMqKiBDdWFsaXRhdGl2YVtOb21pbmFsXTogRXN0YSB2YXJpYWJsZSByZWdpc3RyYSBlbCDDjW5kaWNlIGRlIG1hc2EgY29ycG9yYWwgZGUgY2FkYSBpbmRpdmlkdW8gU2UgcmVwcmVzZW50YSBtZWRpYW50ZSBsYXMgc2lndWllbnRlcyBjYXRlZ29yw61hczoNCg0K4oCiCUJBSk9fUEVTTw0K4oCiCVBFU09fTk9STUFMDQrigKIJU09CUkVfUEVTT19OSVZFTF9JDQrigKIJU09CUkVfUEVTT19OSVZFTF9JSQ0K4oCiCU9CRVNJREFEX1RJUE9fSQ0K4oCiCU9CRVNJREFEX1RJUE9fSUkNCg0KLSoqRU5GRVJNRURBRF9DQVJESUFDQSoqIEN1YWxpdGF0aXZhW05vbWluYWxdOiBFc3RhIHZhcmlhYmxlIHJlZ2lzdHJhIHNpIGVsIGluZGl2aWR1byBwYWRlY2UgbyBubyBkZSB1bmEgZW5mZXJtZWRhZCBjYXJkaWFjYS4gU2UgcmVwcmVzZW50YSBtZWRpYW50ZSBkb3MgY2F0ZWdvcsOtYXMgbm8gbnVtw6lyaWNhczoNCg0K4oCiIFNJOiBTaSBwYWRlY2UgZGUgdW5hIGVuZmVybWVkYWQgY2FyZGlhY2ENCuKAoiBOTzogTm8gcGFkZWNlIGRlIHVuYSBlbmZlcm1lZGFkIGNhcmRpYWNhDQoNCg0KIyMjIEVzdHJ1Y3R1cmEgZGVsIENvbmp1bnRvIGRlIERhdG9zDQpgYGB7ciBFc3RydWN0dXRhX0Nvbmp1bnRvX2RlX0RhdG9zLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCnN0cihPYmVzaXR5X0RhdGFzZXQpDQpgYGANCiMjIyBWaXN1YWxpemFjacOzbiBkZWwgQ29uanVudG8gZGUgRGF0b3MNCmBgYHtyIFZpc3VhbGl6YWNpb25fQ29uanVudG9fZGVfRGF0b3N9DQpPYmVzaXR5X0RhdGFzZXQNCmBgYA0KDQojIyAqKjEuMyBFc3RpbWFjaW9uZXMgTXVsdGl2YXJpYWRhcyoqIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNCkNvbW8gc2UgbWVuY2lvbmEgZW4gW0BBTUVEQXJpc3RpemFiYWwyMDE3XSBsYSBkZSBtZWRpYSwgdmFyaWFuemEgeSBjb3ZhcmlhbnphIGNvbmZvcm1hbiB1biBjb25qdW50byBkZSBtZWRpZGFzIGZ1bmRhbWVudGFsZXMgcGFyYSBkZXNjcmliaXIgZGVzY3JpYmlyIGVsIGNvbXBvcnRhbWllbnRvCXBvc2ljaW9uYWwsIGRpc3BlcnNpdm8geSBjb3JyZWxhY2lvbmFsIGRlCXZhcmlhYmxlcwlhbGVhdG9yaWFzLiBFbiBlc3RlIHNlbnRpZG8sIGVsIGNvbmp1bnRvIGRlIGRhdG9zIGRlIHRyYWJham8gcXVlIHBvc2VlIHNpZXRlIHZhcmlhYmxlcyBhbGVhdG9yaWFzIG51bcOpcmljYXMsIHkgcXVlIGVzdMOhIHJlcHJlc2VudGFkbyBtYXRyaWNpYWxtZW50ZSwgZXN0aW1hIGxhcyBtZWRpZGFzIGFudGVyaW9yZXMgYSBwYXJ0aXIgZGUgdmVjdG9yZXMgeSBtYXRyaWNlcyBlbiBlbCBlc3R1ZGlvIGRlc2NyaXB0aXZvIG11bHRpdmFyaWFibGUuDQoNCkVsIHZlY3RvciBkZSBtZWRpYXMgaW5kaWNhIGVsIGNvbXBvcnRhbWllbnRvIHBvc2ljaW9uYWwgZW4gZWwgc2VudGlkbyBkZSB2YWxvciBlc3BlcmFkbyBvIHB1bnRvIG1lZGlvIHBhcmEgY2FkYSB2YXJpYWJsZSBlbiByZWxhY2nDs24gY29uIHRvZG9zIHN1cyByZWdpc3Ryb3MuIExhIG1hdHJpeiBkZSB2YXJpYW56YXMtY292YXJpYW56YXMgZXN0aW1hIGxhcyBkaXNwZXJzaW9uZXMsIGVuIHN1IGRpYWdvbmFsIHByaW5jaXBhbCwgZGUgY2FkYSB2YXJpYWJsZSBkZWwgY29uanVudG8gZGUgZGF0b3MgcmVzcGVjdG8gZGUgY2FkYSBtZWRpYSBvYnRlbmlkYSBkZWwgdmVjdG9yIGRlIG1lZGlhcy4gQWRlbcOhcywgcG9yIGVuY2ltYSBvIHBvciBkZWJham8gZGUgbGEgZGlhZ29uYWwgcHJpbmNpcGFsLCBzZSBlc3RpbWFuIGxhcyBjb3ZhcmlhbnphcyBlbnRyZSBsYXMgY29tYmluYWNpb25lcyBkZSBsb3MgcG9zaWJsZXMgcGFyZXMgZGUgdmFyaWFibGVzIGRlbCBjb25qdW50byBkZSBkYXRvcy4gUGFyYSBtw6FzIGRldGFsbGVzIHNlIHB1ZWRlIGNvbnN1bHRhciBhIFtAQU1FREFyaXN0aXphYmFsMjAxN10uDQoNCkxvIGFudGVyaW9yLCBwYXJhIGVsIGNvbmp1bnRvIGRlIGRhdG9zIGRlIHRyYWJham8sIHNlIGRlc2Fycm9sbGEgZW4gbGEgW3NlY2Npw7NuIDMuMi5dKCNzZWMzXzIpDQoNClBsYW50ZWFtaWVudG8gZGVsIFByb2JsZW1hDQoNCkNvbiBiYXNlIGVuIGVsIGNvbmp1bnRvIGRlIGRhdG9zIGRlc2NyaXRvIGVuIGxhIHNlY2Npw7NuIDIgc2UgY2FsY3VsYXLDoW4gZSBpbnRlcHJldGFyw6FuLCBwYXJhIGxhcyB2YXJpYWJsZXMgbnVtw6lyaWNhcywgZWwgdmVjdG9yIGRlIG1lZGlhcywgbGEgbWF0cml6IGRlIHZhcmlhbnphcy1jb3ZhcmlhbnphcyB5IGxhIG1hdHJpeiBkZSBjb3JyZWxhY2lvbmVzLiBTZSByZWN1ZXJkYSBxdWUgbGFzIHZhcmlhYmxlcyBudW3DqXJpY2FzIChlbiBlc2NhbGFkYSBkZSBtZWRpY2nDs24gZGUgcmF6w7NuKSBzb246ICAqKkVEQUQqKiwgKipBTFRVUkEqKiwgKipQRVNPKiosICoqRkNWQyoqLCoqTkNQKiosKipIMk8qKiBZICoqRkFGKiogDQoNCkRlc2Fycm9sbG8gZGVsIEFuw6FsaXNpcw0KDQpMYSBuYXZlZ2FjacOzbiBhIHRyYXbDqXMgZGUgbGFzIHBlc3Rhw7FhcyBtdWVzdHJhIGVsIGPDoWxjdWxvIGRlIGxvcyBzaWd1aWVudGVzIG9iamV0b3M6ICoqVmVjdG9yIGRlIE1lZGlhcyoqICRcYmFyIHgkLCAqKk1hdHJpeiBkZSBWYXJpYW56YXMtQ292YXJpYW56YXMqKiAkUyQgeSAqKk1hdHJpeiBkZSBDb3JyZWxhY2lvbmVzKiogJFIkLuKAogkNCg0KRWwgYW7DoWxpc2lzIGRlICoqVmVjdG9yIGRlIE1lZGlhcyB5IEJveHBsb3RzKiogIG5vcyBwcm9wb3JjaW9uYW4gdW5hIHZpc2nDs24gZ2VuZXJhbCBkZSBsYSBkaXN0cmlidWNpw7NuIHkgbG9zIHZhbG9yZXMgY2VudHJhbGVzIGRlIGNhZGEgdmFyaWFibGUgZW4gZWwgY29uanVudG8gZGUgZGF0b3MsIGxvIHF1ZSBub3MgYXl1ZGEgYSBjb21wcmVuZGVyIG1lam9yIGxhIG5hdHVyYWxlemEgeSBsYSB2YXJpYWJpbGlkYWQgZGUgbG9zIGRhdG9zOg0KDQrigKIqKkVEQUQqKjogTGEgbWVkaWFuYSBkZSBsYSBlZGFkIGVzIGRlIGFwcm94aW1hZGFtZW50ZSAyNC4zNSBhw7Fvcy4gRW4gZWwgYm94cGxvdCBjb3JyZXNwb25kaWVudGUsIHBvZGVtb3MgdmVyIHF1ZSBsYSBkaXN0cmlidWNpw7NuIGRlIGxhIGVkYWQgcGFyZWNlIGVzdGFyIGNlbnRyYWRhIGFscmVkZWRvciBkZSBlc3RlIHZhbG9yLCBjb24gbGEgbWF5b3LDrWEgZGUgbGFzIG9ic2VydmFjaW9uZXMgY29uY2VudHJhZGFzIGVuIHRvcm5vIGEgbGEgbWVkaWFuYS4gSGF5IGFsZ3VuYXMgb2JzZXJ2YWNpb25lcyBtw6FzIGRpc3BlcnNhcyBoYWNpYSBlZGFkZXMgbcOhcyBhbHRhcywgcGVybyBlbiBnZW5lcmFsLCBsYSBkaXN0cmlidWNpw7NuIHBhcmVjZSBzZXIgcmVsYXRpdmFtZW50ZSBzaW3DqXRyaWNhLg0KDQrigKIqKkFMVFVSQSoqOiBMYSBtZWRpYW5hIGRlIGxhIGFsdHVyYSBlcyBkZSBhcHJveGltYWRhbWVudGUgMS43MCBtZXRyb3MuIEVuIGVsIGJveHBsb3QgZGUgbGEgYWx0dXJhLCB2ZW1vcyBxdWUgbGEgZGlzdHJpYnVjacOzbiBlc3TDoSBjZW50cmFkYSBhbHJlZGVkb3IgZGUgZXN0ZSB2YWxvciwgY29uIGxhIG1heW9yw61hIGRlIGxhcyBvYnNlcnZhY2lvbmVzIGNvbmNlbnRyYWRhcyBlbiB0b3JubyBhIGxhIG1lZGlhbmEuIEFsZ3VuYXMgb2JzZXJ2YWNpb25lcyBlc3TDoW4gZGlzcGVyc2FzIHRhbnRvIHBvciBlbmNpbWEgY29tbyBwb3IgZGViYWpvIGRlIGxhIG1lZGlhbmEsIHBlcm8gbGEgZGlzdHJpYnVjacOzbiBwYXJlY2Ugc2VyIHJlbGF0aXZhbWVudGUgc2ltw6l0cmljYS4NCg0K4oCiKipQRVNPKio6IExhIG1lZGlhbmEgZGVsIHBlc28gZXMgZGUgYXByb3hpbWFkYW1lbnRlIDg0Ljc0IGtpbG9ncmFtb3MuIEVuIGVsIGJveHBsb3QgZGVsIHBlc28sIG9ic2VydmFtb3MgcXVlIGxhIGRpc3RyaWJ1Y2nDs24gZXN0w6EgY2VudHJhZGEgYWxyZWRlZG9yIGRlIGVzdGUgdmFsb3IsIGNvbiBsYSBtYXlvcsOtYSBkZSBsYXMgb2JzZXJ2YWNpb25lcyBjb25jZW50cmFkYXMgZW4gdG9ybm8gYSBsYSBtZWRpYW5hLiBIYXkgYWxndW5hcyBvYnNlcnZhY2lvbmVzIGRpc3BlcnNhcyB0YW50byBwb3IgZW5jaW1hIGNvbW8gcG9yIGRlYmFqbyBkZSBsYSBtZWRpYW5hLCBwZXJvIGVuIGdlbmVyYWwsIGxhIGRpc3RyaWJ1Y2nDs24gcGFyZWNlIHNlciByZWxhdGl2YW1lbnRlIHNpbcOpdHJpY2EuDQoNCuKAoioqRkNWQyoqOiBMYSBtZWRpYW5hIGVzIGRlIGFwcm94aW1hZGFtZW50ZSAyLjM5LiBFbiBlbCBib3hwbG90IGNvcnJlc3BvbmRpZW50ZSwgdmVtb3MgcXVlIGxhIGRpc3RyaWJ1Y2nDs24gcGFyZWNlIGVzdGFyIG3DoXMgc2VzZ2FkYSBoYWNpYSB2YWxvcmVzIG3DoXMgYmFqb3MsIGNvbiBsYSBtYXlvcsOtYSBkZSBsYXMgb2JzZXJ2YWNpb25lcyBjb25jZW50cmFkYXMgZW4gZWwgZXh0cmVtbyBpbmZlcmlvciBkZSBsYSBkaXN0cmlidWNpw7NuLiBTaW4gZW1iYXJnbywgdGFtYmnDqW4gaGF5IGFsZ3VuYXMgb2JzZXJ2YWNpb25lcyBkaXNwZXJzYXMgaGFjaWEgdmFsb3JlcyBtw6FzIGFsdG9zLCBhdW5xdWUgbWVub3MgY29tdW5lcy4NCg0K4oCiKipOQ1AqKjogTGEgbWVkaWFuYSBlcyBkZSBhcHJveGltYWRhbWVudGUgMi42Ny4gRW4gZWwgYm94cGxvdCBkZSBOQ1AsIHZlbW9zIHF1ZSBsYSBkaXN0cmlidWNpw7NuIHBhcmVjZSBlc3RhciBtw6FzIG8gbWVub3Mgc2ltw6l0cmljYW1lbnRlIGRpc3RyaWJ1aWRhIGFscmVkZWRvciBkZSBsYSBtZWRpYW5hLCBjb24gbGEgbWF5b3LDrWEgZGUgbGFzIG9ic2VydmFjaW9uZXMgY29uY2VudHJhZGFzIGVuIHRvcm5vIGEgZXN0ZSB2YWxvci4gSGF5IGFsZ3VuYXMgb2JzZXJ2YWNpb25lcyBkaXNwZXJzYXMgdGFudG8gcG9yIGVuY2ltYSBjb21vIHBvciBkZWJham8gZGUgbGEgbWVkaWFuYSwgcGVybyBlbiBnZW5lcmFsLCBsYSBkaXN0cmlidWNpw7NuIHBhcmVjZSBzZXIgcmVsYXRpdmFtZW50ZSB1bmlmb3JtZS4NCg0K4oCiKipIMk8qKjogTGEgbWVkaWFuYSBlcyBkZSBhcHJveGltYWRhbWVudGUgMS45OSBsaXRyb3MuIEVuIGVsIGJveHBsb3QgY29ycmVzcG9uZGllbnRlLCB2ZW1vcyBxdWUgbGEgZGlzdHJpYnVjacOzbiBwYXJlY2UgZXN0YXIgbcOhcyBzZXNnYWRhIGhhY2lhIHZhbG9yZXMgbcOhcyBiYWpvcywgY29uIGxhIG1heW9yw61hIGRlIGxhcyBvYnNlcnZhY2lvbmVzIGNvbmNlbnRyYWRhcyBlbiBlbCBleHRyZW1vIGluZmVyaW9yIGRlIGxhIGRpc3RyaWJ1Y2nDs24uIFNpbiBlbWJhcmdvLCB0YW1iacOpbiBoYXkgYWxndW5hcyBvYnNlcnZhY2lvbmVzIGRpc3BlcnNhcyBoYWNpYSB2YWxvcmVzIG3DoXMgYWx0b3MuDQoNCuKAoioqRkFGKio6IExhIG1lZGlhbmEgZXMgZGUgYXByb3hpbWFkYW1lbnRlIDEuMDMuIEVuIGVsIGJveHBsb3QgZGUgRkFGLCBvYnNlcnZhbW9zIHF1ZSBsYSBkaXN0cmlidWNpw7NuIGVzdMOhIHNlc2dhZGEgaGFjaWEgdmFsb3JlcyBtw6FzIGJham9zLCBjb24gbGEgbWF5b3LDrWEgZGUgbGFzIG9ic2VydmFjaW9uZXMgY29uY2VudHJhZGFzIGVuIGVsIGV4dHJlbW8gaW5mZXJpb3IgZGUgbGEgZGlzdHJpYnVjacOzbi4gSGF5IGFsZ3VuYXMgb2JzZXJ2YWNpb25lcyBkaXNwZXJzYXMgaGFjaWEgdmFsb3JlcyBtw6FzIGFsdG9zLCBwZXJvIHNvbiBtZW5vcyBjb211bmVzIGVuIGNvbXBhcmFjacOzbiBjb24gbGFzIG9ic2VydmFjaW9uZXMgZGUgYmFqYSBhY3RpdmlkYWQgZsOtc2ljYS4NCg0KRWwgYW7DoWxpc2lzIGRlIGxhICoqTWF0cml6IGRlIENvdmFyaWFuemEqKiByZXZlbGEgaW1wb3J0YW50ZXMgcmVsYWNpb25lcyBlbnRyZSBsYXMgdmFyaWFibGVzIGVzdHVkaWFkYXMgZW4gZWwgY29uanVudG8gZGUgZGF0b3M6DQoNCuKAoioqRURBRCoqIHkgKipBTFRVUkEqKjogQW1iYXMgdGllbmVuIHZhcmlhbnphcyByZWxhdGl2YW1lbnRlIGJhamFzLCBsbyBxdWUgaW5kaWNhIHF1ZSBubyB2YXLDrWFuIG11Y2hvIGVudHJlIGxvcyBpbmRpdmlkdW9zIGVuIGVsIGNvbmp1bnRvIGRlIGRhdG9zLg0KDQrigKIqKlBFU08qKjogVGllbmUgdW5hIHZhcmlhbnphIG11Y2hvIG3DoXMgYWx0YSBlbiBjb21wYXJhY2nDs24gY29uIGxhIGVkYWQgeSBsYSBhbHR1cmEsIGxvIHF1ZSBzdWdpZXJlIHF1ZSBlbCBwZXNvIHZhcsOtYSBjb25zaWRlcmFibGVtZW50ZSBlbnRyZSBsb3MgaW5kaXZpZHVvcyBlbiBlbCBjb25qdW50byBkZSBkYXRvcy4NCg0K4oCiKipGQ1ZDKio6IFRpZW5lIHVuYSBjb3ZhcmlhbnphIHBvc2l0aXZhIGTDqWJpbCBjb24gbGEgZWRhZCwgbG8gcXVlIHN1Z2llcmUgdW5hIHJlbGFjacOzbiBsZXZlIHBlcm8gcG9zaXRpdmEgZW50cmUgbGEgZWRhZCB5IGxhIGNhbnRpZGFkIGRlIHZlcmR1cmFzL2ZydXRhcyBjb25zdW1pZGFzIGRpYXJpYW1lbnRlLg0KDQrigKIqKk5DUCoqOiBUaWVuZSB1bmEgY292YXJpYW56YSBuZWdhdGl2YSBjb24gbGEgZWRhZCwgbG8gcXVlIHN1Z2llcmUgdW5hIHJlbGFjacOzbiBpbnZlcnNhIGVudHJlIGxhIGVkYWQgeSBlbCBuw7ptZXJvIGRlIGNvbWlkYXMgcHJpbmNpcGFsZXMgYWwgZMOtYS4gRXN0byBpbmRpY2EgcXVlIGEgbWVkaWRhIHF1ZSBsYSBlZGFkIGF1bWVudGEsIGVsIG7Dum1lcm8gZGUgY29taWRhcyBwcmluY2lwYWxlcyBhbCBkw61hIHRpZW5kZSBhIGRpc21pbnVpci4NCg0K4oCiKipIMk8qKjogVGFtYmnDqW4gdGllbmUgdW5hIGNvdmFyaWFuemEgbmVnYXRpdmEgY29uIGxhIGVkYWQsIGxvIHF1ZSBzdWdpZXJlIHVuYSByZWxhY2nDs24gaW52ZXJzYSBlbnRyZSBsYSBlZGFkIHkgbGEgY2FudGlkYWQgZGUgYWd1YSBjb25zdW1pZGEgZGlhcmlhbWVudGUuIFNpbWlsYXIgYWwgcHVudG8gYW50ZXJpb3IsIGVzdG8gaW5kaWNhIHF1ZSBhIG1lZGlkYSBxdWUgbGEgZWRhZCBhdW1lbnRhLCBsYSBjYW50aWRhZCBkZSBhZ3VhIGNvbnN1bWlkYSB0aWVuZGUgYSBkaXNtaW51aXIuDQoNCuKAoioqRkFGKio6IFRpZW5lIHVuYSBjb3ZhcmlhbnphIG5lZ2F0aXZhIGZ1ZXJ0ZSBjb24gbGEgZWRhZCwgbG8gcXVlIHN1Z2llcmUgdW5hIHJlbGFjacOzbiBpbnZlcnNhIGZ1ZXJ0ZSBlbnRyZSBsYSBlZGFkIHkgbGEgYWN0aXZpZGFkIGbDrXNpY2Egc2VtYW5hbC4gRXN0byBpbmRpY2EgcXVlIGEgbWVkaWRhIHF1ZSBsYSBlZGFkIGF1bWVudGEsIGxhIGFjdGl2aWRhZCBmw61zaWNhIHRpZW5kZSBhIGRpc21pbnVpciBzaWduaWZpY2F0aXZhbWVudGUuDQoNCkVuIHJlc3VtZW4sIGVsIGFuw6FsaXNpcyBzdWdpZXJlIHF1ZSBsYSBlZGFkIGVzdMOhIHJlbGFjaW9uYWRhIGRlIG1hbmVyYSBpbnZlcnNhIGNvbiBlbCBuw7ptZXJvIGRlIGNvbWlkYXMgcHJpbmNpcGFsZXMgYWwgZMOtYSwgbGEgY2FudGlkYWQgZGUgYWd1YSBjb25zdW1pZGEgZGlhcmlhbWVudGUgeSBsYSBhY3RpdmlkYWQgZsOtc2ljYSwgbWllbnRyYXMgcXVlIGVzdMOhIHJlbGFjaW9uYWRhIHBvc2l0aXZhbWVudGUgY29uIGxhIGNhbnRpZGFkIGRlIHZlcmR1cmFzL2ZydXRhcyBjb25zdW1pZGFzIGRpYXJpYW1lbnRlLiBBZGVtw6FzLCBlbCBwZXNvIHZhcsOtYSBjb25zaWRlcmFibGVtZW50ZSBlbnRyZSBsb3MgaW5kaXZpZHVvcyBlbiBlbCBjb25qdW50byBkZSBkYXRvcy4NCg0KRWwgYW7DoWxpc2lzIGRlICoqbWF0cml6IGRlIGNvcnJlbGFjaW9uZXMqKiBwcm9wb3JjaW9uYSBpbmZvcm1hY2nDs24gc29icmUgZWwgZ3JhZG8geSBsYSBkaXJlY2Npw7NuIGRlIGxhIHJlbGFjacOzbiBlbnRyZSBkaWZlcmVudGVzIHZhcmlhYmxlcyBlbiBlbCBjb25qdW50byBkZSBkYXRvczoNCg0K4oCiKipFREFEKiosICoqQUxUVVJBKiogeSAqKlBFU08qKjogQ29tbyBlcmEgZGUgZXNwZXJhciwgbGEgY29ycmVsYWNpw7NuIGRlIGNhZGEgdmFyaWFibGUgY29uc2lnbyBtaXNtYSBlcyAxLCBsbyBxdWUgaW5kaWNhIHVuYSBjb3JyZWxhY2nDs24gcGVyZmVjdGEgZW50cmUgbGEgdmFyaWFibGUgeSBzw60gbWlzbWEuDQoNCuKAoioqRkNWQyoqOiBMYSBjb3JyZWxhY2nDs24gcG9zaXRpdmEgZMOpYmlsIChhcHJveGltYWRhbWVudGUgMC4wNSkgZW50cmUgbGEgZWRhZCB5IGxhIGNhbnRpZGFkIGRlIHZlcmR1cmFzL2ZydXRhcyBjb25zdW1pZGFzIGRpYXJpYW1lbnRlIHN1Z2llcmUgcXVlLCBlbiBnZW5lcmFsLCBhIG1lZGlkYSBxdWUgbGFzIHBlcnNvbmFzIGVudmVqZWNlbiwgdGllbmRlbiBhIGNvbnN1bWlyIGxpZ2VyYW1lbnRlIG3DoXMgdmVyZHVyYXMvZnJ1dGFzLg0KDQrigKIqKk5DUCoqOiBMYSBjb3JyZWxhY2nDs24gbmVnYXRpdmEgZMOpYmlsIChhcHJveGltYWRhbWVudGUgLTAuMjIpIGVudHJlIGxhIGVkYWQgeSBlbCBuw7ptZXJvIGRlIGNvbWlkYXMgcHJpbmNpcGFsZXMgYWwgZMOtYSBpbmRpY2EgcXVlLCBlbiBwcm9tZWRpbywgYSBtZWRpZGEgcXVlIGxhcyBwZXJzb25hcyBlbnZlamVjZW4sIHRpZW5kZW4gYSB0ZW5lciB1biBtZW5vciBuw7ptZXJvIGRlIGNvbWlkYXMgcHJpbmNpcGFsZXMgYWwgZMOtYS4NCg0K4oCiKipIMk8qKjogU2ltaWxhcm1lbnRlLCBsYSBjb3JyZWxhY2nDs24gbmVnYXRpdmEgZMOpYmlsIChhcHJveGltYWRhbWVudGUgLTAuMTEpIGVudHJlIGxhIGVkYWQgeSBsYSBjYW50aWRhZCBkZSBhZ3VhIGNvbnN1bWlkYSBkaWFyaWFtZW50ZSBzdWdpZXJlIHF1ZSwgZW4gcHJvbWVkaW8sIGEgbWVkaWRhIHF1ZSBsYXMgcGVyc29uYXMgZW52ZWplY2VuLCB0aWVuZGVuIGEgY29uc3VtaXIgbGlnZXJhbWVudGUgbWVub3MgYWd1YS4NCg0K4oCiKipGQUYqKjogTGEgY29ycmVsYWNpw7NuIG5lZ2F0aXZhIG1vZGVyYWRhIGEgZnVlcnRlIChhcHJveGltYWRhbWVudGUgLTAuNzIpIGVudHJlIGxhIGVkYWQgeSBsYSBhY3RpdmlkYWQgZsOtc2ljYSBzZW1hbmFsIGluZGljYSBxdWUgaGF5IHVuYSByZWxhY2nDs24gc2lnbmlmaWNhdGl2YSBlbnRyZSBlc3RhcyBkb3MgdmFyaWFibGVzLCBjb24gbGFzIHBlcnNvbmFzIG1heW9yZXMgcGFydGljaXBhbmRvIGVuIG1lbm9zIGFjdGl2aWRhZCBmw61zaWNhIHNlbWFuYWwgZW4gY29tcGFyYWNpw7NuIGNvbiBsYXMgcGVyc29uYXMgbcOhcyBqw7N2ZW5lcy4NCg0KRW4gcmVzdW1lbixlbCBhbsOhbGlzaXMgZGUgbGEgbWF0cml6IGRlIGNvcnJlbGFjaW9uZXMgcmVmdWVyemEgbGFzIGNvbmNsdXNpb25lcyBhbnRlcmlvcmVzIHNvYnJlIGxhIHJlbGFjacOzbiBlbnRyZSBsYSBlZGFkIHkgdmFyaW9zIGFzcGVjdG9zIGRlIGxhIHNhbHVkIHkgZWwgZXN0aWxvIGRlIHZpZGEsIGNvbW8gbG9zIGjDoWJpdG9zIGFsaW1lbnRpY2lvcyB5IGxhIGFjdGl2aWRhZCBmw61zaWNhLg0KDQojIyMgVmVjdG9yIGRlIE1lZGlhcyB5IEJveHBsb3RzDQpgYGB7ciBWZWN0b3JfZGVfTWVkaWFzX3lfQm94cGxvdHMsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KYXBwbHkoT2Jlc2l0eV9EYXRhc2V0WywtYygxLDUsNiw5LDEwLDEyLDE0LDE1LDE2LDE3LDE4KV0sIDIsIG1lYW4pDQpPYmVzaXR5X0RhdGFzZXRfUmVkdWNpZG8gPSBPYmVzaXR5X0RhdGFzZXRbLC1jKDEsNSw2LDksMTAsMTIsMTQsMTUsMTYsMTcsMTgpXQ0KcGFyKG1mcm93ID0gYygxLCBuY29sKE9iZXNpdHlfRGF0YXNldF9SZWR1Y2lkbykpKQ0KaW52aXNpYmxlKGxhcHBseSgxOm5jb2woT2Jlc2l0eV9EYXRhc2V0X1JlZHVjaWRvKSwgZnVuY3Rpb24oaSkgYm94cGxvdChPYmVzaXR5X0RhdGFzZXRfUmVkdWNpZG9bLCBpXSkpKQ0KYGBgDQoNCiMjIyBNYXRyaXogZGUgVmFyaWFuemFzLUNvdmFyaWFuemFzDQpgYGB7ciBtYXRyaXpfZGVfVmFyaWFuemFzX0NvdmFyaWFuemFzLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCnJvdW5kKGNvdihPYmVzaXR5X0RhdGFzZXRbLC1jKDEsNSw2LDksMTAsMTIsMTQsMTUsMTYsMTcsMTgpXSksMikNCmBgYA0KDQojIyMgTWF0cml6IGRlIENvcnJlbGFjaW9uZXMNCmBgYHtyIG1hdHJpel9kZV9Db3JyZWxhY2lvbmVzLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCnJvdW5kKGNvcihPYmVzaXR5X0RhdGFzZXRbLC1jKDEsNSw2LDksMTAsMTIsMTQsMTUsMTYsMTcsMTgpXSksMikNCmBgYA0KDQojIyAqKjEuNCBHcsOhZmljYXMgTXVsdGl2YXJpYWRhcyoqICB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQpFbiBsYSBndcOtYSBkZSBjbGFzZSBkZSBbQEFNRURBcmlzdGl6YWJhbDIwMTddIHNlIG1lbmNpb25hIHF1ZSwgZW4gZ2VuZXJhbCwgbG9zIGdyw6FmaWNvcyBtdWx0aXZhcmlhZG9zIGN1bXBsZW4gZG9zIG9iamV0aXZvcyBlc2VuY2lhbGVzOiBwcmltZXJvLCBheXVkYW4gYSBjb21wYXJhcgllbAljb21wb3J0YW1pZW50bwlkZQlwb2JsYWNpb25lcyBkZSBlc3R1ZGlvIGNvbiBiYXNlIGVuIHZhcmlhYmxlcyBjYXRlZ8OzcmljYXMgeSBzdWF2aXphbiBsYSBjb21wcmVuc2nDs24gZGUgbGEgZXN0cnVjdHVyYSBkZSBjb3JyZWxhY2nDs24gZW50cmUJdmFyaWFzIHZhcmlhYmxlcy4gRW4gZXN0ZSBzZW50aWRvLCBlbCBjb25qdW50byBkZSBkYXRvcyBkZSB0cmFiYWpvIHRlbmRyw6EgYXBveW8gZGVzY3JpdGl2byBncsOhZmljbyBhIHRyYXbDqXMgZGUgdHJlcyBkaWFncmFtYXM6IHVubyBjb25qdW50byBxdWUgaW50ZWdyYSBkaXNwZXJzacOzbiwgZGlzdHJpYnVjacOzbiB5IGNvcnJlbGFjaW9uZXM7IG90cm8gYmFzYWRvIGVuIGxhIHJlbmRlcml6YWNpw7NuIGRlIHBvbMOtZ29ub3MsIHkgcG9yIMO6bHRpbW8sIHVubyBxdWUgcmVjdXJyZSBhIGxhcyBjYXJhcyBkZSBDaGVybm9mZi4NCg0KUGxhbnRlYW1pZW50byBkZWwgUHJvYmxlbWENCg0KQ29uIGJhc2UgZW4gZWwgY29uanVudG8gZGUgZGF0b3MgZGVzY3JpdG8gZW4gbGEgW3NlY2Npw7NuIDJdICgjc2VjXzIpIHNlIGNhbGN1bGFyw6FuIGUgaW50ZXByZXRhcsOhbiwgcGFyYSBsYXMgdmFyaWFibGVzIG51bcOpcmljYXMsIGxhcyBncsOhZmljYXMgbXVsdGl2YXJpYWRhcyBkZSBkaWFncmFtYSBkZSBjb3JyZWxhY2lvbmVzLCBtYXRyaXogZGUgZGlhZ3JhbWEgZGUgZGlzcGVyc2nDs24sIGRpYWdyYW1hIGRlIGVzdHJlbGxhcyB5IGNhcmFzIGRlIENoZXJub2ZmLiBTZSByZWN1ZXJkYSBxdWUgbGFzIHZhcmlhYmxlcyBudW3DqXJpY2FzIChlbiBlc2NhbGFkYSBkZSBtZWRpY2nDs24gZGUgcmF6w7NuKSBzb246ICoqRURBRCoqLCAqKkFMVFVSQSoqLCAqKlBFU08qKiwgKipGQ1ZDKiosKipOQ1AqKiwqKkgyTyoqLCoqRkFGKiogWSAqKlRVRSoqDQoNCkRlc2Fycm9sbG8gZGVsIEFuw6FsaXNpcw0KDQpMYSBuYXZlZ2FjacOzbiBhIHRyYXbDqXMgZGUgcGVzdGHDsWFzIHF1ZSBub3MgcGVybWl0ZSBSU3R1ZGlvIG1vc3RyYXLDoSBsYXMgZ3LDoWZpY2FzIG11bHRpdmFyaWFkYXMgZGU6ICoqRGlhZ3JhbWEgQ29uanVudG8gZGUgRGlzcGVyc2nDs24sIERpc3RyaWJ1Y2nDs24geSBDb3JyZWxhY2lvbmVzKiogKHNpbiBhZ3J1cGFjacOzbiAqKlNBKiogeSBjb24gYWdydXBhY2nDs24gKipDQSoqOyB0ZW5pZW5kbyBlbiBjdWVudGEgbGFzIDExIHZhcmlhYmxlcyBjYXRlZ8OzcmljYXM6IFNFWE8sIEhJU1RPUklBTF9GQU1JTElBUl9TT0JSRVBFU086IEhGUywgRkFWQywgQ0FFQywgRlVNQVMsIFNDQywgVFVFLCBDQUxDLCBNRURJT19UUkFOU1BPUlRFOiBNVCwgSU1DLCBFTkZFUk1FREFEX0NBUkRJQUNBIDpFQykgKipEaWFncmFtYSBkZSBFc3RyZWxsYXMqKiB5ICoqQ2FyYXMgZGUgQ2hlcm5vZmYqKg0KDQpCYXPDoW5kb25vcyBlbiBsYSBwZXN0YcOxYSAqKkRpYWdyYW1hIENvbmp1bnRvIGRlIERpc3BlcnNpw7NuLCBEaXN0cmlidWNpw7NuIHkgQ29ycmVsYWNpb25lcyBbU0FdKiosSU5URVJQUkVUQVINCg0KRGUgbWFuZXJhIGNvbXBsZW1lbnRhcmlhLCBiYXPDoW5kb25vcyBlbiBsYXMgcGVzdGHDsWFzICoqRGlhZ3JhbWEgQ29uanVudG8gZGUgRGlzcGVyc2nDs24sIERpc3RyaWJ1Y2nDs24geSBDb3JyZWxhY2lvbmVzIFtDQV0qKiwgcGVybyBlbiBzdXMgdmVyc2lvbmVzIGVuIGdydXBvcyBkZSBsYXMgdmFyaWFibGVzIGNhdGVnw7NyaWNhczogICoqU0VYTyoqLCAqKkhJU1RPUklBTF9GQU1JTElBUl9TT0JSRVBFU08qKiwgKipGQVZDKiosICoqQ0FFQyoqLCAqKkZVTUFTKiosKipTQ0MqKiwgKipUVUUqKiwgKipDQUxDKiosICoqTUVESU9fVFJBTlNQT1JURSoqLCAqKklNQyoqeSAqKkVORkVSTUVEQURfQ0FSRElBQ0EqKiwgc2UgcHVlZGUgYXByZWNpYXIgSU5URVJQUkVUQVINCg0KRW4gYmFzZSBhIGxhIHBlc3Rhw7FhICoqRGlhZ3JhbWEgZGUgRXN0cmVsbGFzKiosIHNlIHB1ZWRlIG5vdGFyIGxhIHByZXNlbmNpYSBkZSBsYSB2YXJpYWJsZSAqKlBFU08qKiBlbiB0b2RhcyBlc3RyZWxsYXMgY29uIGRpZmVyZW50ZXMgbG9uZ2l0dWRlcywgZXN0byBzdWdpZXJlIHF1ZSBlbCBwZXNvIGVzIHVuYSBjYXJhY3RlcsOtc3RpY2EgZGVzdGFjYWRhIHkgdmFyaWFibGUgZW4gdHVzIGRhdG9zLiBMYXMgZGlmZXJlbnRlcyBsb25naXR1ZGVzIGluZGljYW4gdW5hIGFtcGxpYSB2YXJpYWJpbGlkYWQgZW4gbG9zIHBlc29zIGVudHJlIGxhcyBwZXJzb25hcyBlbmN1ZXN0YWRhcyxhZGVtYXMsIGxhIHZhcmlhYmxlICoqRURBRCoqIGVzdMOhIHByZXNlbnRlIGVuIGNhc2kgdG9kYXMgbGFzIGVzdHJlbGxhcywgcGVybyBzdSBpbXBhY3RvIGVuIGxhIGZvcm1hIGRlIGVzdGFzIGVzIG1lbm9yIGVuIGNvbXBhcmFjacOzbiBjb24gb3RyYXMgdmFyaWFibGVzLCBjb21vICoqUEVTTyoqLiB1bm8gZGUgbG9zIHBhdHJvbmVzIHF1ZSBzZSBvYnNlcnZhIGVzIHF1ZSBhIG1lZGlkYSBxdWUgbGEgdmFyaWFibGUgKipQRVNPKiogYXVtZW50YSwgbGEgdmFyaWFibGUgKipIMk8qKiB0aWVuZGUgYSBkaXNtaW51aXIsIHkgdmljZXZlcnNhLiBFc3RvIHN1Z2llcmUgdW5hIHJlbGFjacOzbiBpbnZlcnNhIGVudHJlIGFtYmFzIHZhcmlhYmxlcyBlbiBsb3MgZGF0b3MgYW5hbGl6YWRvcy4gRXMgZGVjaXIsIHBhcmVjZSBxdWUgaGF5IHVuYSB0ZW5kZW5jaWEgREUgcXVlIGxhcyBwZXJzb25hcyBjb24gbWF5b3IgcGVzbyB0aWVuZGVuIGEgY29uc3VtaXIgbWVub3MgYWd1YSwgeSBhcXVlbGxhcyBjb24gbWVub3IgcGVzbyB0aWVuZGFuIGEgY29uc3VtaXIgbcOhcy4gDQoNCkxhIGRpdmVyc2lkYWQgZGUgY2FyYWN0ZXLDrXN0aWNhcyByZXByZXNlbnRhZGFzIHBvciBsYXMgKipjYXJhcyBkZSBDaGVybm9mZioqIHNlIHZlIHJlZmxlamFkYSBsYSBjb21wbGVqaWRhZCB5IGxhIHZhcmlhYmlsaWRhZCBkZWwgY29uanVudG8gZGUgZGF0b3MgcXVlIGVzdGFtb3MgZXN0dWRpYW5kby4gTGEgcHJlc2VuY2lhIGRlIGRpZmVyZW50ZXMgZXhwcmVzaW9uZXMgZmFjaWFsZXMgc3VnaWVyZSB1bmEgYW1wbGlhIGdhbWEgZGUgcGVyZmlsZXMgZGVtb2dyw6FmaWNvcyB5IGRlIHNhbHVkIGVudHJlIGxhcyBwZXJzb25hcyBlbmN1ZXN0YWRhcy4gUG9yIGVqZW1wbG8sIGxhcyBkaWZlcmVudGVzIGZvcm1hcyBkZSBsb3Mgb2pvcywgbGEgYm9jYSB5IGxhIG5hcml6IHJlcHJlc2VudGFuIHZhcmlhY2lvbmVzIGVuIHZhcmlhYmxlcyBjb21vICoqU0VYTyoqLCAqKkVEQUQqKiwgKipBTFRVUkEqKiwgKipQRVNPKiogeSBmYWN0b3JlcyBkZSByaWVzZ28gZGUgc2FsdWQsIGNvbW8gKipISVNUT1JJQUxfRkFNSUxJQVJfU09CUkVQRVNPKiosICoqRkFWQyoqIHkgKipGQUYqKi4gTGEgZGlzdHJpYnVjacOzbiBkaXZlcnNhIGRlIGVzdGFzIGNhcmFjdGVyw61zdGljYXMgcmVzYWx0YSBsYSBpbXBvcnRhbmNpYSBkZSBjb25zaWRlcmFyIG3Dumx0aXBsZXMgZmFjdG9yZXMgYWwgZXN0dWRpYXIgbGEgc2FsdWQgeSBlbCBiaWVuZXN0YXIgZGUgbGEgcG9ibGFjacOzbiByZXByZXNlbnRhZGEgZW4gbG9zIGRhdG9zLg0KDQojIyMgRGlhZ3JhbWEgQ29uanVudG8gZGUgRGlzcGVyc2nDs24sIERpc3RyaWJ1Y2nDs24geSBDb3JyZWxhY2lvbmVzW1NBXQ0KYGBge3IgRGlhZ3JhbWFfQ29uanVudG9fRERDX1NBLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCmdncGFpcnMoT2Jlc2l0eV9EYXRhc2V0WywtYygxLDUsNiw5LDEwLDEyLDE0LDE1LDE2LDE3LDE4KV0pDQpgYGANCg0KIyMjIERpYWdyYW1hIENvbmp1bnRvIGRlIERpc3BlcnNpw7NuLCBEaXN0cmlidWNpw7NuIHkgQ29ycmVsYWNpb25lc1tDQTpTRVhPXQ0KYGBge3IgRGlhZ3JhbWFfQ29uanVudG9fRERDX0NBX1NFWCwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpnZ3BhaXJzKE9iZXNpdHlfRGF0YXNldCwgY29sdW1ucyA9IGMoMiwzLDQsNyw4LDExLDEzKSwgYWVzKGNvbG9yID0gU0VYTywgYWxwaGEgPSAwLjUpLCB1cHBlciA9IGxpc3QoY29udGludW91cyA9IHdyYXAoImNvciIsIHNpemUgPSAyLjUpKSkNCmBgYA0KDQojIyMgRGlhZ3JhbWEgQ29uanVudG8gZGUgRGlzcGVyc2nDs24sIERpc3RyaWJ1Y2nDs24geSBDb3JyZWxhY2lvbmVzW0NBOkhGU10NCmBgYHtyIERpYWdyYW1hX0Nvbmp1bnRvX0REQ19DQV9IRlMsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KZ2dwYWlycyhPYmVzaXR5X0RhdGFzZXQsIGNvbHVtbnMgPSBjKDIsMyw0LDcsOCwxMSwxMyksIGFlcyhjb2xvciA9IEhJU1RPUklBTF9GQU1JTElBUl9TT0JSRVBFU08sIGFscGhhID0gMC41KSwgdXBwZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSB3cmFwKCJjb3IiLCBzaXplID0gMi41KSkpDQpgYGANCg0KIyMjIERpYWdyYW1hIENvbmp1bnRvIGRlIERpc3BlcnNpw7NuLCBEaXN0cmlidWNpw7NuIHkgQ29ycmVsYWNpb25lc1tDQTpGQVZDXQ0KYGBge3IgRGlhZ3JhbWFfQ29uanVudG9fRERDX0NBX0ZBVkMsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KZ2dwYWlycyhPYmVzaXR5X0RhdGFzZXQsIGNvbHVtbnMgPSBjKDIsMyw0LDcsOCwxMSwxMyksIGFlcyhjb2xvciA9IEZBVkMsIGFscGhhID0gMC41KSwgdXBwZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSB3cmFwKCJjb3IiLCBzaXplID0gMi41KSkpDQpgYGANCg0KIyMjIERpYWdyYW1hIENvbmp1bnRvIGRlIERpc3BlcnNpw7NuLCBEaXN0cmlidWNpw7NuIHkgQ29ycmVsYWNpb25lc1tDQTpDQUVDXQ0KYGBge3IgRGlhZ3JhbWFfQ29uanVudG9fRERDX0NBX0NBRUMsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KZ2dwYWlycyhPYmVzaXR5X0RhdGFzZXQsIGNvbHVtbnMgPSBjKDIsMyw0LDcsOCwxMSwxMyksIGFlcyhjb2xvciA9IENBRUMsIGFscGhhID0gMC41KSwgdXBwZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSB3cmFwKCJjb3IiLCBzaXplID0gMi41KSkpDQpgYGANCg0KIyMjIERpYWdyYW1hIENvbmp1bnRvIGRlIERpc3BlcnNpw7NuLCBEaXN0cmlidWNpw7NuIHkgQ29ycmVsYWNpb25lc1tDQTpGVU1BU10NCmBgYHtyIERpYWdyYW1hX0Nvbmp1bnRvX0REQ19DQV9GVU1BUywgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpnZ3BhaXJzKE9iZXNpdHlfRGF0YXNldCwgY29sdW1ucyA9IGMoMiwzLDQsNyw4LDExLDEzKSwgYWVzKGNvbG9yID0gRlVNQVMsIGFscGhhID0gMC41KSwgdXBwZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSB3cmFwKCJjb3IiLCBzaXplID0gMi41KSkpDQpgYGANCg0KIyMjIERpYWdyYW1hIENvbmp1bnRvIGRlIERpc3BlcnNpw7NuLCBEaXN0cmlidWNpw7NuIHkgQ29ycmVsYWNpb25lc1tDQTpTQ0NdDQpgYGB7ciBEaWFncmFtYV9Db25qdW50b19ERENfQ0FfU0NDLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCmdncGFpcnMoT2Jlc2l0eV9EYXRhc2V0LCBjb2x1bW5zID0gYygyLDMsNCw3LDgsMTEsMTMpLCBhZXMoY29sb3IgPSBTQ0MsIGFscGhhID0gMC41KSwgdXBwZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSB3cmFwKCJjb3IiLCBzaXplID0gMi41KSkpDQpgYGANCg0KIyMjIERpYWdyYW1hIENvbmp1bnRvIGRlIERpc3BlcnNpw7NuLCBEaXN0cmlidWNpw7NuIHkgQ29ycmVsYWNpb25lc1tDQTpUVUVdDQpgYGB7ciBEaWFncmFtYV9Db25qdW50b19ERENfQ0FfVFVFLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCmdncGFpcnMoT2Jlc2l0eV9EYXRhc2V0LCBjb2x1bW5zID0gYygyLDMsNCw3LDgsMTEsMTMpLCBhZXMoY29sb3IgPSBUVUUsIGFscGhhID0gMC41KSwgdXBwZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSB3cmFwKCJjb3IiLCBzaXplID0gMi41KSkpDQpgYGANCg0KIyMjIERpYWdyYW1hIENvbmp1bnRvIGRlIERpc3BlcnNpw7NuLCBEaXN0cmlidWNpw7NuIHkgQ29ycmVsYWNpb25lc1tDQTpDQUxDXQ0KYGBge3IgRGlhZ3JhbWFfQ29uanVudG9fRERDX0NBX0NBTEMsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KZ2dwYWlycyhPYmVzaXR5X0RhdGFzZXQsIGNvbHVtbnMgPSBjKDIsMyw0LDcsOCwxMSwxMyksIGFlcyhjb2xvciA9IENBTEMsIGFscGhhID0gMC41KSwgdXBwZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSB3cmFwKCJjb3IiLCBzaXplID0gMi41KSkpDQpgYGANCg0KIyMjIERpYWdyYW1hIENvbmp1bnRvIGRlIERpc3BlcnNpw7NuLCBEaXN0cmlidWNpw7NuIHkgQ29ycmVsYWNpb25lc1tDQTpNVF0NCmBgYHtyIERpYWdyYW1hX0Nvbmp1bnRvX0REQ19DQV9NVCwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpnZ3BhaXJzKE9iZXNpdHlfRGF0YXNldCwgY29sdW1ucyA9IGMoMiwzLDQsNyw4LDExLDEzKSwgYWVzKGNvbG9yID0gTUVESU9fVFJBTlMsIGFscGhhID0gMC41KSwgdXBwZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSB3cmFwKCJjb3IiLCBzaXplID0gMi41KSkpDQpgYGANCg0KIyMjIERpYWdyYW1hIENvbmp1bnRvIGRlIERpc3BlcnNpw7NuLCBEaXN0cmlidWNpw7NuIHkgQ29ycmVsYWNpb25lc1tDQTpJTUNdDQpgYGB7ciBEaWFncmFtYV9Db25qdW50b19ERENfQ0FfSU1DLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCmdncGFpcnMoT2Jlc2l0eV9EYXRhc2V0LCBjb2x1bW5zID0gYygyLDMsNCw3LDgsMTEsMTMpLCBhZXMoY29sb3IgPSBJTUMsIGFscGhhID0gMC41KSwgdXBwZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSB3cmFwKCJjb3IiLCBzaXplID0gMi41KSkpDQpgYGANCg0KIyMjIERpYWdyYW1hIENvbmp1bnRvIGRlIERpc3BlcnNpw7NuLCBEaXN0cmlidWNpw7NuIHkgQ29ycmVsYWNpb25lc1tDQTpFQ10NCmBgYHtyIERpYWdyYW1hX0Nvbmp1bnRvX0REQ19DQV9FQywgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpnZ3BhaXJzKE9iZXNpdHlfRGF0YXNldCwgY29sdW1ucyA9IGMoMiwzLDQsNyw4LDExLDEzKSwgYWVzKGNvbG9yID0gRU5GRVJNRURBRF9DQVJESUFDQSwgYWxwaGEgPSAwLjUpLCB1cHBlciA9IGxpc3QoY29udGludW91cyA9IHdyYXAoImNvciIsIHNpemUgPSAyLjUpKSkNCmBgYA0KDQojIyMgRGlhZ3JhbWEgZGUgRXN0cmVsbGFzIA0KYGBge3IgZGlhZ3JhbWFfZGVfRXN0cmVsbGFzLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCnNldC5zZWVkKDc4MDcyOCkNCk9iZXNpdHlfRGF0YXNldF9NdWVzdHJlYWRvID0gT2Jlc2l0eV9EYXRhc2V0W3NhbXBsZSgxOm5yb3coT2Jlc2l0eV9EYXRhc2V0KSwyMyksLWMoMSw1LDYsOSwxMCwxMiwxNCwxNSwxNiwxNywxOCldDQpzdGFycyhPYmVzaXR5X0RhdGFzZXRfTXVlc3RyZWFkbywgbGVuID0gMSwgY2V4ID0gMC40LCBrZXkubG9jID0gYygxMCwgMiksIGRyYXcuc2VnbWVudHMgPSBUUlVFKQ0KYGBgDQoNCiMjIyBDYXJhcyBkZSBDaGVybm9mZg0KYGBge3IgY2FyYXNfZGVfQ2hlcm5vZmYsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0Kc2V0LnNlZWQoNzgwNzI4KQ0KT2Jlc2l0eV9EYXRhc2V0X011ZXN0cmVhZG8gPSBPYmVzaXR5X0RhdGFzZXRbc2FtcGxlKDE6bnJvdyhPYmVzaXR5X0RhdGFzZXQpLDIzKSwtYygxLDUsNiw5LDEwLDEyLDE0LDE1LDE2LDE3LDE4KV0NCmZhY2VzKE9iZXNpdHlfRGF0YXNldF9NdWVzdHJlYWRvKQ0KYGBgDQoNCiMjICoqMS41IE5vcm1hbGlkYWQgTXVsdGl2YXJpYWRhKiogey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KQ29tbyBtZW5jaW9uYSBbQENQRU1Qb3JyYXMyMDE2XSBwYXJhIGluZGFnYXIgbyBlc3RhYmxlY2VyIGVsIHRpcG8gZGUgZGlzdHJpYnVjacOzbiBtdWx0aXZhcmlhZGEgZGUgdW4gY29uanVudG8gZGUgZGF0b3Mgc2UgcHVlZGUgcmVjdXJyaXIgYSBwcm9jZWRpbWllbnRvcyBkZXNjcmlwdGl2b3MsIGNvbW8gbG9zIGdyw6FmaWNvcywgbyBhIHByb2NlZGltaWVudG9zIGluZmVyZW5jaWFsZXMsIGNvbW8gbGFzIHBydWViYXMgZXN0YWTDrXN0aWNhcy4gRW4gZXN0ZSBzZW50aWRvLCBzZSBhbGNhbnphIGdlbmVyYWxpemFjacOzbiBkZSByZXN1bHRhZG9zIGFsIHVzYXIgbGFzIGVzdG9zIMO6bHRpbW9zLCBzaSBiaWVuIGxvcyBwcmltZXJvcyBhcG95YW4gYSBsYXMgaW50ZXJwcmV0YWNpb25lcy4NCg0KRW4gZXN0ZSBhcGFydGFkbyBzZSBjb250ZW1wbGEgZWwgdXNvIGRlIHByb2NlZGltaWVudG9zIGluZmVyZW5jaWFsZXMgcGFyYSBkZXRlcm1pbmFyIHNpIGVsIGNvbmp1bnRvIGRlIGRhdG9zIGRlIHRyYWJham8sIGVuIHJlbGFjacOzbiBjb24gc3VzIHZhcmlhYmxlcyBudW3DqXJpY2FzLCBzZSBkaXN0cmlidXllIG5vcm1hbCBtdWx0aXZhcmlhZG8gKEROTSkuIExhcyBwcnVlYmFzIGRlIG5vcm1hbGlkYWQgbXVsdGl2YXJpYWRhIChQTk0pIGEgbGFzIHF1ZSBzZXLDoSBzb21ldGlkbyBzb246IE1hcmRpYSwgSGVuemUtWmlya2xlciwgRG9vcm5pay1IYW5zZW4geSBSb3lzdG9uLiBQYXJhIGVzdGFzIHBydWViYXMgZGUgbm9ybWFsaWRhZCBsb3MgdGVzdCBvYmVkZWNlbiBhIHVuIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgJFxhbHBoYSA9IDAuMDUkIHkgYSBsYXMgaGlww7N0ZXNpczokJEhfMDogXHRleHQge0xhcyB2YXJpYWJsZXMgdGllbmVuIHVuYSBETk19JCQgJCRIXzE6IFx0ZXh0IHtMYXMgdmFyaWFibGVzIE5PIHRpZW5lbiB1bmEgRE5NfSQkIA0KDQpMYSBwcnVlYmEgZGUgTWFyZGlhIHNlIGJhc2EgZW4gZXh0ZW5zaW9uZXMgZGUgYXNpbWV0csOtYSB5IGN1cnRvc2lzLCBlbCBjdWFkcmFkbyBkZSBsYSBkaXN0YW5jaWEgZGUgTWFoYWxhbm9iaXMsIGxhIGNhbnRpZGFkIGRlIHZhcmlhYmxlcyAkcCQgcG9yIHRyYXRhciB5IGxhIGNhbnRpZGFkIGRlIHJlZ2lzdHJvcyAkbiQuIEFkZW3DoXMsIGNvbnNpZGVyYSBxdWUgbGEgcHJ1ZWJhIGVzdGFkw61zdGljYSBwYXJhIGxhIGFzaW1ldHLDrWEgdGllbmUgdW5hIGRpc3RyaWJ1Y2nDs24gJFxjaGleMiQgeSBsYSBwcnVlYmEgZXN0YWTDrXN0aWNhIHBhcmEgbGEgY3VydG9zaXMgc2UgZGlzdGlyYnV5ZSBhcHJveGltYWRhbWVudGUgbm9ybWFsLiBMb3MgZGV0YWxsZXMgc29icmUgbG9zIHBhcsOhbWV0cm9zIGRlIGxhcyBkaXN0cmlidWNpb25lcyBwdWVkZW4gY29uc3VsdGFyc2UgZW4gZWwgdHJhYmFqbyBkZSBbQENQRU1Qb3JyYXMyMDE2XS4NCg0KTGEgcHJ1ZWJhIGRlIEhlbnplLVppcmtsZXIgc2UgYmFzYSBlbiBsYSBkaXN0YW5jaWEgZnVuY2lvbmFsLCBkYWRvIHF1ZSBzaSBlbCBjb25qdW50byBkZSBkYXRvcyBwcmVzZW50YSB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwgbXVsdGl2YXJpYWRhLCBlbCBlc3RhZMOtc3RpY28gZGUgbGEgcHJ1ZWJhIHNlIGRpc3RyaWJ1eWUgYXByb3hpbWFkYW1lbnRlIGNvbW8gdW5hIGxvZ25vcm1hbCwgY3V5b3MgcGFyw6FtZXRyb3MgZGUgbWVkaWEgJFxtdSQgeSB2YXJpYW56YSAkXHNpZ21hXjIkIHB1ZWRlbiBzZXIgY29uc3VsdGFkb3MgZW4gW0BDUEVNUG9ycmFzMjAxNl0uDQoNCkxhIHBydWViYSBkZSBEb29ybmlrLUhhbnNlbiBlc3TDoSBiYXNhZGEgZW4gbGEgYXNpbWV0csOtYSB5IGxhIGN1cnRvc2lzIGRlIHVuIGNvbmp1bnRvIGRlIGRhdG9zIG11bHRpdmFyaWFkb3MsIHF1ZSBzZSB0cmFuc2Zvcm1hIHBhcmEgZ2FyYW50aXphciBsYSBpbmRlcGVuZGVuY2lhLiBFcyBjb25zaWRlcmFkYSBtw6FzIHBvdGVudGUgcXVlIGxhIHBydWViYSBkZSBTaGFwaXJvLVdpbGsgcGFyYSBjYXNvcyBtdWx0aXZhcmlhZG9zLiBTdSBlc3RhZMOtc3RpY28gZGUgcHJ1ZWJhIGVzdMOhIGRlZmluaWRvIGNvbW8gbGEgc3VtYSBkZSBsYXMgdHJhbnNmb3JtYWNpb25lcyBhbCBjdWFkcmFkbyBkZSBsYSBhc2ltZXRyw61hIHkgbGEgY3VydG9zaXMsIHkgc2lndWUsIGFwcm94aW1hZGFtZW50ZSwgdW5hIGRpc3RyaWJ1Y2nDs24gJFxjaGleMiQuIExvcyBkZXRhbGxlcyBkZSBsYSBwcnVlYmEgcHVlZGVuIHNlciBjb25zdWx0YWRvcyBlbiBbQE9UVU1ORG9vcm5pa19IYW5zZW4yMDA4XS4NCg0KTGEgcHJ1ZWJhIGRlIFJveXN0b24gcmVjdXJyZSBhIGxhcyBwcnVlYmFzIFNoYXBpcm8tV2lsayBvIFNoYXBpcm8tRnJhbmNpYSBwYXJhIHByb2JhciBsYSBub3JtYWxpZGFkIG11bHRpdmFyaWFkYS4gQXPDrSwgc2kgIGxhIGN1cnRvc2lzIGVzIG1heW9yIHF1ZSAzLCBsYSBwcnVlYmEgZGUgUm95c3RvbiB1c2EgU2hhcGlyby1GcmFuY2lhIHBhcmEgZGlzdHJpYnVjaW9uZXMgbGVwdG9jdXJ0aWNhcy4gTWllbnRyYXMgcXVlIHBhcmEgZGlzdHJpYnVjaW9uZXMgcGxhdGljdXJ0aWNhcyB1c2EgU2hhcGlyby1XaWxrLiBFbiBlbGxhIGxvcyBwYXLDoW1ldHJvcyBzb24gb2J0ZW5pZG9zIHBvciBhcHJveGltYWNpb25lcyBwb2xpbm9taWFsZXMsIGVzdG8gcHVlZGUgc2VyIGNvbnN1bHRhZG8gZW4gW0BDUEVNUG9ycmFzMjAxNl0uDQoNClBsYW50ZWFtaWVudG8gZGVsIFByb2JsZW1hDQoNCkNvbiBiYXNlIGVuIGVsIGNvbmp1bnRvIGRlIGRhdG9zIGRlc2NyaXRvIGVuIGxhIFtzZWNjacOzbiAyXSgjc2VjMikgc2UgaGFyw6EgdW5hIHBydWViYSBlc3RhZMOtc3RpY2EgZGUgbm9ybWFsaWRhZCBtdWx0aXZhcmlhZGEsIGNvbiB1biBuaXZlbCBkZSBzaWduaWZpY2FuY2lhICRcYWxwaGE9MC4wNSQsIHBhcmEgZXN0YWJsZWNlciBzaSBzdXMgZGF0b3MgbcOpdHJpY29zIHByb3ZpZW5lbiBkZSB1bmEgcG9ibGFjacOzbiBub3JtYWwgbXVsdGl2YXJpYWRhLiBTZSByZWN1ZXJkYSBxdWUgbGFzIHZhcmlhYmxlcyBudW3DqXJpY2FzIGRlbCBjb25qdW50byBkZSBkYXRvcyAoZW4gZXNjYWxhZGEgZGUgbWVkaWNpw7NuIGRlIHJhesOzbikgc29uOioqRURBRCoqLCAqKkFMVFVSQSoqLCAqKlBFU08qKiwgKipGQ1ZDKiosKipOQ1AqKiwqKkgyTyoqLCoqRkFGKipZICoqVFVFKiouDQoNClNlIHV0aWxpemFyw6EgdW5hIGRlIGxhcyBwcnVlYmFzIGRlIG5vcm1hbGlkYWQgbXVsdGl2YXJpYWRhIG1lbmNpb25hZGFzIGFudGVyaW9ybWVudGUsIGNvbW8gbGEgcHJ1ZWJhIGRlIE1hcmRpYSwgSGVuemUtWmlya2xlciwgRG9vcm5pay1IYW5zZW4gbyBSb3lzdG9uLCBkZXBlbmRpZW5kbyBkZSBsYSBkaXN0cmlidWNpw7NuIGRlIGxhcyB2YXJpYWJsZXMgeSBsYSBjdXJ0b3NpcyBvYnNlcnZhZGEuIEVsIG9iamV0aXZvIGVzIGV2YWx1YXIgc2kgZXN0YXMgdmFyaWFibGVzIHNpZ3VlbiB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwgY29uanVudGEgZW4gZWwgZXNwYWNpbyBtdWx0aXZhcmlhZG8uDQoNCkVsIHByb2NlZGltaWVudG8gaW1wbGljYXLDoSBjYWxjdWxhciBlbCBlc3RhZMOtc3RpY28gZGUgcHJ1ZWJhIGVzcGVjw61maWNvIChwb3IgZWplbXBsbywgYmFzYWRvIGVuIGFzaW1ldHLDrWEgeSBjdXJ0b3NpcykgeSBjb21wYXJhcmxvIGNvbiBzdSBkaXN0cmlidWNpw7NuIHRlw7NyaWNhIGJham8gbGEgaGlww7N0ZXNpcyBudWxhIGRlIG5vcm1hbGlkYWQgbXVsdGl2YXJpYWRhLiBTZSBlc3RhYmxlY2Vyw6EgdW4gY3JpdGVyaW8gZGUgcmVjaGF6byBkZSBsYSBoaXDDs3Rlc2lzIG51bGEgc2kgZWwgdmFsb3IgJHAtdmFsdWUkIGFzb2NpYWRvIGFsIGVzdGFkw61zdGljbyBkZSBwcnVlYmEgZXMgbWVub3IgcXVlICRcYWxwaGEkLg0KDQpVbmEgY29uY2x1c2nDs24gcG9zaXRpdmEgKG5vIHJlY2hhem8gZGUgbGEgaGlww7N0ZXNpcyBudWxhKSBpbmRpY2Fyw61hIGV2aWRlbmNpYSBkZSBxdWUgbGFzIHZhcmlhYmxlcyBhbmFsaXphZGFzIHNpZ3VlbiB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwgbXVsdGl2YXJpYWRhLiBQb3IgZWwgY29udHJhcmlvLCB1biByZWNoYXpvIGRlIGxhIGhpcMOzdGVzaXMgbnVsYSBzdWdlcmlyw61hIHF1ZSBhbCBtZW5vcyB1bmEgZGUgbGFzIHZhcmlhYmxlcyBubyBzaWd1ZSB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwsIGxvIHF1ZSBwb2Ryw61hIHRlbmVyIGltcGxpY2FjaW9uZXMgZW4gZWwgYW7DoWxpc2lzIHBvc3RlcmlvciBkZSBsb3MgZGF0b3MuDQoNCkRlc2Fycm9sbG8gZGVsIEFuw6FsaXNpcw0KDQpMYSBleHBsb3JhY2nDs24gYSB0cmF2w6lzIGRlIGxhcyBkaWZlcmVudGVzIHBydWViYXMgZGUgbm9ybWFsaWRhZCBtdWx0aXZhcmlhZGEgaW5kaWNhIHF1ZSBlbCBjb25qdW50byBkZSBkYXRvcywgY29uc2lkZXJhbmRvIHN1cyB2YXJpYWJsZXMgbnVtw6lyaWNhcywgbm8gc2lndWUgdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIG11bHRpdmFyaWFkYS4gQXF1w60gZXN0w6FuIGxvcyBoYWxsYXpnb3MgY2xhdmUgZGUgY2FkYSBwcnVlYmE6DQoNCioqUHJ1ZWJhIGRlIE1hcmRpYSoqOkRlc3B1w6lzIGRlIHJlYWxpemFyIHVuIGFuw6FsaXNpcyBleGhhdXN0aXZvIGRlIGxvcyByZXN1bHRhZG9zIG9idGVuaWRvcywgc2UgZGVzdGFjYSBxdWUgbG9zIHZhbG9yZXMgJHAkIGFzb2NpYWRvcyBjb24gbGFzIHBydWViYXMgZGUgYXNpbWV0csOtYSAoU2tld25lc3MpIHkgY3VydG9zaXMgKEt1cnRvc2lzKSBzb24gY2xhcmFtZW50ZSBpbmZlcmlvcmVzIGFsIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgcHJlZGV0ZXJtaW5hZG8gZGUgJFxhbHBoYSA9IDAuMDUkLiBFc3RlIGhhbGxhemdvIHJldmVsYSB1bmEgZGlzY3JlcGFuY2lhIHNpZ25pZmljYXRpdmEgZW50cmUgbGFzIGRpc3RyaWJ1Y2lvbmVzIG9ic2VydmFkYXMgeSBsYSBoaXDDs3Rlc2lzIGRlIG5vcm1hbGlkYWQgbXVsdGl2YXJpYW50ZSBwcm9wdWVzdGEgcGFyYSBsYXMgdmFyaWFibGVzIGV4YW1pbmFkYXMgZW4gZWwgY29uanVudG8gZGUgZGF0b3MuDQoNCioqUHJ1ZWJhIGRlIEhlbnplLVppcmtsZXIqKjpCYXPDoW5kb25vcyBlbiBsb3MgcmVzdWx0YWRvcyBkZSBsYSBQcnVlYmEgZGUgSGVuemUtWmlya2xlciwgb2JzZXJ2YW1vcyBxdWUgZWwgdmFsb3IgJHAkIGFzb2NpYWRvIGVzIG1lbm9yLCBsbyBxdWUgaW5kaWNhIHF1ZSBlcyBzaWduaWZpY2F0aXZhbWVudGUgbWVub3IgcXVlIGVsIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgZGUgJFxhbHBoYSA9IDAuMDUkLiBFc3RlIHJlc3VsdGFkbyBub3MgbGxldmEgYSBjb25jbHVpciBxdWUgbm8gaGF5IHN1ZmljaWVudGUgZXZpZGVuY2lhIHBhcmEgcmVzcGFsZGFyIGxhIGhpcMOzdGVzaXMgZGUgbm9ybWFsaWRhZCBtdWx0aXZhcmlhbnRlIHBhcmEgbGFzIHZhcmlhYmxlcyBkZWwgY29uanVudG8gZGUgZGF0b3Mgc2VndW4gbGEgcHJ1ZWJhLg0KDQoqKlBydWViYSBkZSBEb29ybmlrLUhhbnNlbioqOkJhc8OhbmRvbm9zIGVuIGxvcyByZXN1bHRhZG9zIGRlIGxhIFBydWViYSBkZSBEb29ybmlrLUhhbnNlbiwgZG9uZGUgc2Ugb2J0dXZvIHVuIHZhbG9yICRwJCBtZW5vciBhbCBuaXZlbCBkZSBzaWduaWZpY2FuY2lhIGRlICRcYWxwaGEgPSAwLjA1JCwgc2UgZXZpZGVuY2lhIHVuYSBkaXNjcmVwYW5jaWEgc2lnbmlmaWNhdGl2YSBjb24gcmVzcGVjdG8gYSBsYSBoaXDDs3Rlc2lzIGRlIG5vcm1hbGlkYWQgbXVsdGl2YXJpYW50ZSBwYXJhIGxhcyB2YXJpYWJsZXMgZXhhbWluYWRhcyBlbiBlbCBjb25qdW50byBkZSBkYXRvcy4gDQoNCioqUHJ1ZWJhIGRlIFJveXN0b24qKjogRGVzcHXDqXMgZGUgcmVhbGl6YXIgdW4gYW7DoWxpc2lzIGRlIGxvcyByZXN1bHRhZG9zIGRlIGxhIHBydWViYSBkZSBub3JtYWxpZGFkIG11bHRpdmFyaWFkYSBkZSBSb3lzdG9uIGluZGljYSB1bmEgZmFsdGEgc2lnbmlmaWNhdGl2YSBkZSBub3JtYWxpZGFkIG11bHRpdmFyaWFkYSwgcG9yIGxvIHRhbnRvLCBzZSByZWNoYXphIGxhIGhpcMOzdGVzaXMgbnVsYSBkZSBub3JtYWxpZGFkIHBhcmEgdG9kYXMgbGFzIHZhcmlhYmxlcywgaW5jbHV5ZW5kbyBFREFELCBBTFRVUkEsIFBFU08sIEZDVkMsIE5DUCwgSDJPIHkgRkFGLCB5YSBxdWUgZWwgdmFsb3IgZGUgJHAkIGRlIGxhIHBydWViYSBlcyBpbmZlcmlvciBhbCBuaXZlbCBkZSBzaWduaWZpY2FuY2lhIGRlICRcYWxwaGEgPSAwLjA1JC4gU2UgYXN1bWUgcXVlIGxvcyBkYXRvcyBwdWVkZW4gbm8gc2VyIGFkZWN1YWRvcyBwYXJhIHTDqWNuaWNhcyBlc3RhZMOtc3RpY2FzIHF1ZSBhc3VtZW4gbm9ybWFsaWRhZC4NCg0KRW4gcmVzdW1lbiBsb3MgcmVzdWx0YWRvcyBkZSBsYXMgcHJ1ZWJhcyBkZSBub3JtYWxpZGFkIG11bHRpdmFyaWFudGUsIGluY2x1eWVuZG8gbGEgUHJ1ZWJhIGRlIE1hcmRpYSwgbGEgUHJ1ZWJhIGRlIEhlbnplLVppcmtsZXIsIGxhIFBydWViYSBkZSBEb29ybmlrLUhhbnNlbiB5IGxhIFBydWViYSBkZSBSb3lzdG9uLCBpbmRpY2FuIHVuYSBmYWx0YSBkZSBldmlkZW5jaWEgcGFyYSByZXNwYWxkYXIgbGEgaGlww7N0ZXNpcyBkZSBub3JtYWxpZGFkIGVuIGxvcyBkYXRvcy4gRXN0byBzdWdpZXJlIHF1ZSBsYXMgdmFyaWFibGVzIGFuYWxpemFkYXMgbm8gc2lndWVuIHVuYSBkaXN0cmlidWNpw7NuIG11bHRpdmFyaWFudGUgbm9ybWFsLCBsbyBxdWUgcG9kcsOtYSBjb21wcm9tZXRlciBsYSB2YWxpZGV6IGRlIGxvcyBhbsOhbGlzaXMgZXN0YWTDrXN0aWNvcyBwb3N0ZXJpb3JlcyBxdWUgYXN1bWVuIG5vcm1hbGlkYWQuIEVzdGEgZmFsdGEgZGUgbm9ybWFsaWRhZCBtdWx0aXZhcmlhbnRlIHJlc2FsdGEgbGEgaW1wb3J0YW5jaWEgZGUgaW50ZXJwcmV0YXIgbG9zIHJlc3VsdGFkb3Mgc3Vic2lndWllbnRlcyBjb24gcHJlY2F1Y2nDs24uDQoNCiMjIyBQTk0gTWFyZGlhDQpgYGB7ciBQTk1fTWFyZGlhLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCm12bihPYmVzaXR5X0RhdGFzZXRbLC1jKDEsNSw2LDksMTAsMTIsMTQsMTUsMTYsMTcsMTgpXSwgbXZuVGVzdD0ibWFyZGlhIikNCmBgYA0KDQojIyMgUE5NIEhlbnplLVppcmtsZXINCmBgYHtyIFBOTV9IZW56ZV9aaXJrbGVyLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCm12bihPYmVzaXR5X0RhdGFzZXRbLC1jKDEsNSw2LDksMTAsMTIsMTQsMTUsMTYsMTcsMTgpXSwgbXZuVGVzdD0iaHoiKQ0KYGBgDQoNCiMjIyBQTk0gRG9vcm5pay1IYW5zZW4NCmBgYHtyIFBOTV9Eb29ybmlrX0hhbnNlbiwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQptdm4oT2Jlc2l0eV9EYXRhc2V0WywtYygxLDUsNiw5LDEwLDEyLDE0LDE1LDE2LDE3LDE4KV0sIG12blRlc3Q9ImRoIikNCmBgYA0KDQojIyMgUE5NIFJPWVNUT04gDQpgYGB7ciBQTk1fUm95c3RvbiwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQptdm4oT2Jlc2l0eV9EYXRhc2V0WywtYygxLDUsNiw5LDEwLDEyLDE0LDE1LDE2LDE3LDE4KV0sIG12blRlc3Q9InJveXN0b24iKQ0KYGBgDQoNCiMjRmFzZSAyIFtDb21wb25lbnRlcyBQcmluY2lwYWxlc10NCg0KIyMjMi4xLiBPYmpldGl2b3MNCiMjIzIuMi4gU2VsZWNjacOzbiBkZSBDb21wb25lbnRlcw0KIyMjMi4zLiBDYWxpZGFkIGRlIFJlcHJlc2VudGFjacOzbg0KIyMjMi40LiBDb250cmlidWNpb25lcw0KIyMjMi41LiBJbnRlcnByZXRhY2nDs24gZGUgQ29tcG9uZW50ZXMNCg0KIyNGYXNlIDMgW0NvcnJlc3BvbmRlbmNpYXNdDQoNCiMjIzMuMS4gT2JqZXRpdm9zDQojIyMzLjEuIENvcnJlc3BvbmRlbmNpYXMgU2ltcGxlcw0KIyMjMy4yLiBDb3JyZXNwb25kZW5jaWFzIE3Dumx0aXBsZXMNCg0KIyNGYXNlIDQgW0Fuw6FsaXNpcyBkZSBSZWdyZXNpw7NuXQ0KDQojIyM0LjEuIE9iamV0aXZvcw0KIyMjNC4xLiBSZWdyZXNpw7NuIExpbmVhbCBTaW1wbGUNCiMjIzQuMi4gUmVncmVzacOzbiBMaW5lYWwgTcO6bHRpcGxlDQojIyM0LjMuIFJlZ3Jlc2nDs24gTG9nw61zdGljYQ0K