Fase 1 [Descripcion Multivariante]

1.1 Objetivos del Estudio

Estudiar, desde el punto de vista de la estadĆ­stica descriptiva multivariante (calculos, visualizaciones e interpretaciones) a un conjunto de datos relacionados con la insuficiencia cardĆ­aca.

1.2 Descripcion del conjunto de datos

Fuente del conjunto de Datos

El conjunto de datos de trabajo se obtuvo totalmente de Kaggle: Insuficiencia cardiaca. Es conveniente anotar que Kaggle es una compaƱia 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 encontrar y publicar conjuntos de datos, explorar y crear modelos en un entorno de ciencia de datos basado en la web, trabajar con otros cientificos de datos e ingenieros de aprendizaje automatico y participar en concursos para resolver desafios de ciencia de datos.

Contexto del conjunto de Datos

El conjunto registra datos sobre 11 campos relacionados con el estado de salud, comportamientos y resultados de chequeos mƩdicos generales. Este conjunto de datos fue actualizado por ultima vez en septiembre del 2021.

Descripcion del conjunto de Datos

El conjunto de datos contiene 12 campos y 917 registros. En donde uno de los campos tiene valores negativos en los registros; también existen otros 3 campos en donde sus registros son de naturaleza politómica, otros 4 campos de naturaleza dicotómica y el resto de campos son de naturaleza estrictamente numérica positiva. La lista a continuación harÔ una descripción en el mismo orden de los campo que seria de izquierda a derecha, también se harÔ una descripción del tipo de variable y su escala medición con base en esta nomenclatura (tipo de variable::escala de medición [ordenamiento]).

• Edad (cuantitativa::razón): Registra la edad del paciente en aƱos.

• Sexo (cualitativa::nominal): Registra el sexo de cada paciente de la siguiente forma: M (paciente del sexo masculino) y F (paciente del sexo femenino).

• Tipo_dolor_pecho (cualitativa::nominal): Registra el tipo de dolor en el pecho que presenta el paciente, el cual se clasifica en el conjunto de datos de la siguiente forma: Anginia atĆ­pica, dolor no anginoso, anginia atĆ­pica y asintomĆ”tico. Se recalcar que los criterios de estas categorĆ­as no fueron proporcionados.

• PA_reposo (cuantitativa::razón): Registra la presión arterial en reposo y la unidad de medida a utilizar es milĆ­metro de mercurio (mm Hg).La escala de este campo desde 80 hasta 200.

• Colesterol (cuantitativa::razón): Registra el nivel de colesterol sĆ©rico de cada paciente utilizando una unidad de medida de miligramo por decilitro (mg/dl) y la escala que utiliza va desde 40 hasta 603.

• AZ_Ayunas (cuantitativa::razón): Registra el nivel de azĆŗcar en la sangre en ayunas de los pacientes, la cual utiliza una escala de medida de miligramo por decilitro (mg/dl) desde 80 hasta 400.

• ECG_reposo (cualitativa::nominal): Registra el resultado del electrocardiograma en reposo el cual tiene 3 categorias: Normal, ST (anomalia en las ondas st-t) y LVH (Hipertrofia ventricular izquierda).

• FrecC_Max (cuantitativa::razón): Registra la frecuencia cardiaca mĆ”xima de los pacientes, y se mide en latidos por minuto (lpm) y la escala del campo esta entre 60 y 202.

• Anginia_Ejercicio (cualitativa::nominal): Registra la angina o dolor en la caja torĆ”cica inducida por el ejercicio y esta tiene dos clasificaciones N (no presenta), y Y (si presenta).

• Oldpeak (cuantitativa::razón): Registra el valor numĆ©rico de la depresión del segmento ST en un electrocardiograma y se mide en milĆ­metros (mm) el cual tiene una escala que va desde -26 hasta 62.

• Pendi_Segme_ST_Ejercicio (cualitativa::nominal): Registra la pendiente del segmento ST cuando se esta realizando el mĆ”ximo ejercicio y este tiene 3 clasificaciones: Ascendente, descendente y plano.

• Clase_salida (cualitativa::nominal): Registra si el paciente se diagnostica con una enfermedad cardiaca o si sale en condiciones normales, este campo tiene dos clasificaciones 0 (para salida normal) y 1 (para salida con enfermedad cardiaca).

Por Ćŗltimo, se recalca que el conjunto de datos fue reescrito, y en algunos casos en las variables cuantitativas como el azĆŗcar en sangre que originalmente era una variable cualitativa con registros 0 (menor o igual a 120 mg/dl) y 1 (mayor a 120 mg/dl) a una cuantitiva de escala razon.

Estructura del Conjunto de Datos

str(heart_diseases_Dataset)
## tibble [917 Ɨ 12] (S3: tbl_df/tbl/data.frame)
##  $ Edad                    : num [1:917] 40 49 37 48 54 39 45 54 37 48 ...
##  $ Sexo                    : chr [1:917] "M" "F" "M" "F" ...
##  $ Tipo_dolor_pecho        : chr [1:917] "angina atipica" "dolor no anginoso" "angina atipica" "asintomatico" ...
##  $ PA_reposo               : num [1:917] 140 160 130 138 150 120 130 110 140 120 ...
##  $ Colesterol              : num [1:917] 289 180 283 214 195 339 237 208 207 284 ...
##  $ AZ_Ayunas               : num [1:917] 92 122 109 112 97 109 85 98 95 100 ...
##  $ ECG_reposo              : chr [1:917] "Normal" "Normal" "ST" "Normal" ...
##  $ FrecC_Max               : num [1:917] 172 156 98 108 122 170 170 142 130 120 ...
##  $ Angina_Ejercicio        : chr [1:917] "N" "N" "N" "Y" ...
##  $ Oldpeak                 : num [1:917] 0 1 0 15 0 0 0 0 15 0 ...
##  $ Pendi_Segme_ST_Ejercicio: chr [1:917] "ascendente" "plano" "ascendente" "plano" ...
##  $ Clase_salida            : chr [1:917] "Normal" "Enfermedad cardiaca" "Normal" "Enfermedad cardiaca" ...

Visualización del Conjunto de datos

heart_diseases_Dataset
## # A tibble: 917 Ɨ 12
##     Edad Sexo  Tipo_dolor_pecho  PA_reposo Colesterol AZ_Ayunas ECG_reposo
##    <dbl> <chr> <chr>                 <dbl>      <dbl>     <dbl> <chr>     
##  1    40 M     angina atipica          140        289        92 Normal    
##  2    49 F     dolor no anginoso       160        180       122 Normal    
##  3    37 M     angina atipica          130        283       109 ST        
##  4    48 F     asintomatico            138        214       112 Normal    
##  5    54 M     dolor no anginoso       150        195        97 Normal    
##  6    39 M     dolor no anginoso       120        339       109 Normal    
##  7    45 F     angina atipica          130        237        85 Normal    
##  8    54 M     angina atipica          110        208        98 Normal    
##  9    37 M     asintomatico            140        207        95 Normal    
## 10    48 F     angina atipica          120        284       100 Normal    
## # ℹ 907 more rows
## # ℹ 5 more variables: FrecC_Max <dbl>, Angina_Ejercicio <chr>, Oldpeak <dbl>,
## #   Pendi_Segme_ST_Ejercicio <chr>, Clase_salida <chr>

1.3 Estimaciones Multivariantes

Las medidas de media, varianza y covarianza constituyen un conjunto fundamental para describir el comportamiento posicional, dispersivo y correlacional de variables aleatorias. En el contexto de un conjunto de datos que contiene seis variables aleatorias numƩricas y se representa matricialmente, estas medidas se calculan utilizando vectores y matrices en el anƔlisis descriptivo multivariable.

El vector de medias describe el comportamiento posicional de cada variable en relación con todos sus registros, representando el valor esperado o punto medio para cada variable.

La matriz de varianzas-covarianzas proporciona información sobre las dispersiones de cada variable en relación con sus medias. En su diagonal principal, se encuentran las varianzas de cada variable respecto a su media. Por encima o por debajo de la diagonal principal, se encuentran las covarianzas que estiman las relaciones lineales entre todas las combinaciones posibles de pares de variables en el conjunto de datos.

Planteamiento del Problema

Con base en el cojunto de datos mencionado anteriormente lo que se pretendera es calcular e interpretar este conjunto, para las variables estrictamente numericas, como: el vector de medias, la varianza-covarianza y la matriz de correlacionadas. Para recordar cuales fueron las variables numericas (con una escala de medicion de razon) son: Edad, PA_reposo, Colesterol, AZ_Ayunas, FrecC_Max y Oldpeak

Desarrollo del AnƔlisis

En base a la navegacion de pestaƱas que nos permite RStudio se calculo los siguientes tres objetos: Vector de Medias, Matriz de Varianzas-Cobarianzas y Matriz de Correlaciones.

BasÔndonos en la pestaña Vector de Medias, se observa que en general los datos registrados para cada una de las variables tienden a presentar colas derechas en sus distribuciones, lo que hace que las medias estimadas tiendan a ser altas. AdemÔs, en relación con la mediana, solo la variable Colesterol y Oldpeak muestran un sesgo notable en comparación con las demÔs. También se ha observado que todos los casos atípicos se encuentran en el extremo superior. Si revisamos los rangos de las variables estudiadas, podemos encontrar que las medias son bajas en comparación con los extremos superiores de cada rango.

Basandonos en la pestaƱa Matriz de Varianza-Covarianza Se puede interpretar que en general, las relaciones entre las variables tomadas por pares en su mayoria tienden a ser de proporcionalidad indirecta y en la diagonal de la matriz podemos observar como varian los datos dentro de su propia clasificacion.

Basandonos en la pestaƱa Matriz de Correlaciones y al considerar los resultados de la Matriz de Varianzas-Covarianzas se puede verificar que los coeficientes de correlacion son negativos y positivos entre las variables: Edad, PA_reposo, Colesterol, AZ_Ayunas, FrecC_Max y Oldpeak. Estas correlaciones eran de esperarse en el conjunto estudiado.

Vector de Medias

apply(heart_diseases_Dataset[,-c(2,3,7,9,11,12)], 2, mean)
##       Edad  PA_reposo Colesterol  AZ_Ayunas  FrecC_Max    Oldpeak 
##   53.50927  132.54089  210.95856  140.54853  136.78953    5.38277
heart_diseases_Dataset_Reducido =heart_diseases_Dataset[,-c(2,3,7,9,11,12)]
par(mfrow = c(1, ncol(heart_diseases_Dataset_Reducido)))
invisible(lapply(1:ncol(heart_diseases_Dataset_Reducido), function(i) boxplot(heart_diseases_Dataset_Reducido[, i])))

Matriz de Varianzas y Covarianzas

round(cov(heart_diseases_Dataset[,-c(2,3,7,9,11, 12)]),2)
##              Edad PA_reposo Colesterol AZ_Ayunas FrecC_Max Oldpeak
## Edad        89.07     44.69     -77.67    126.27    -91.88   18.83
## PA_reposo   44.69    323.99     103.07    116.81    -50.28   16.31
## Colesterol -77.67    103.07    6865.61  -1271.61    501.51   13.56
## AZ_Ayunas  126.27    116.81   -1271.61   6233.09   -240.75   51.56
## FrecC_Max  -91.88    -50.28     501.51   -240.75    648.57  -17.86
## Oldpeak     18.83     16.31      13.56     51.56    -17.86   76.97

Matriz de correlaciones

round(cor(heart_diseases_Dataset[,-c(2,3,7,9,11,12)]),2)
##             Edad PA_reposo Colesterol AZ_Ayunas FrecC_Max Oldpeak
## Edad        1.00      0.26      -0.10      0.17     -0.38    0.23
## PA_reposo   0.26      1.00       0.07      0.08     -0.11    0.10
## Colesterol -0.10      0.07       1.00     -0.19      0.24    0.02
## AZ_Ayunas   0.17      0.08      -0.19      1.00     -0.12    0.07
## FrecC_Max  -0.38     -0.11       0.24     -0.12      1.00   -0.08
## Oldpeak     0.23      0.10       0.02      0.07     -0.08    1.00

1.4 Graficas Multivariadas

Se menciona que en términos generales, los grÔficos multivariados cumplen dos objetivos escenciales: en primer lugar, ayudan a comparar el comportamiento de poblaciones de estudio basÔndose en variables categóricas, y en segundo lugar, facilitan la comprensión de la estructura de correlación entre múltiples variables. En este contexto, el conjunto de datos en cuestión serÔ respaldado visualmente a través de tres tipos de diagramas: uno que integra dispersión, distribución y correlaciones; otro que utiliza la renderización de polígonos; y finalmente, uno que emplea caras de Chernoff para representación grÔfica.

Planteamiento del Problema

Con base en el conjunto de datos descrito en la fase 1 seccion 1.2, se calcularÔn e interpretarÔn diversas grÔficas multivariadas para las variables numéricas. Las variables numéricas utilizadas (en una escala de medición de razón) incluyen: Edad, PA_reposo, Colesterol, AZ_Ayunas, FrecC_Max y Oldpeak.

A continuación, se realizarÔn las siguientes grÔficas multivariadas:

  • Diagrama de Correlaciones: Este diagrama mostrarĆ” las relaciones de correlación entre pares de variables numĆ©ricas. Las lĆ­neas o colores indicarĆ”n la fuerza y dirección de la correlación entre cada par de variables. Esto ayudarĆ” a identificar patrones de asociación lineal entre las variables.

  • Matriz de Diagrama de Dispersión: La matriz de diagrama de dispersión representarĆ” grĆ”ficamente la relación entre todas las combinaciones posibles de variables numĆ©ricas. Cada celda de la matriz mostrarĆ” un diagrama de dispersión que ilustra la relación entre un par especĆ­fico de variables. Esto permitirĆ” visualizar simultĆ”neamente mĆŗltiples relaciones entre las variables.

  • Diagrama de Estrellas: Este tipo de diagrama se utiliza para mostrar relaciones complejas entre mĆŗltiples variables. Cada variable se representa como un eje en un grĆ”fico radial, y los puntos o lĆ­neas conectadas indicarĆ”n las observaciones de datos. Esto facilita la identificación de patrones o agrupaciones en los datos multivariados.

  • Caras de Chernoff: Las caras de Chernoff son un mĆ©todo visual Ćŗnico para representar mĆŗltiples variables numĆ©ricas mediante la modificación de las caracterĆ­sticas faciales (como forma de ojos, boca, etc.) para reflejar los valores de las variables. Cada cara representa una observación en el conjunto de datos y permite una visualización intuitiva de las diferencias y similitudes entre las observaciones basadas en mĆŗltiples caracterĆ­sticas.

Estas grÔficas multivariadas proporcionarÔn una visión completa y detallada de la estructura de los datos numéricos, ayudando a identificar patrones, asociaciones y posibles agrupaciones en el conjunto de datos descrito en la sección 1.2.

Desarollo del Analisis

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 6 variables categóricas: Sexo: SEX, Tipo_dolor_pecho: TIP, ECG_reposo: ECG, Angina_Ejercicio: ANE, Pendi_Segme_ST_Ejercicio: PST, Clase_salida: CS), Diagrama de Estrellas y Caras de Chernoff.

BasÔndonos en la pestaña Diagrama Conjunto de Dispersión, Distribución y Correlaciones [SA], donde podemos observar que existen dos correlaciones, una positiva mÔs alta, superior a \(0.2\), y una negativa mÔs baja, inferior a \(-0.1\). En general, dependiendo de con quién se correlacionen, nos pueden dar resultados positivos o negativos. Ahora, el significado de esto nos indica el nivel de proporcionalidad (directa o indirecta) que tienen las variables cuando se relacionan unas con otras. Sin embargo, es importante destacar que ninguna de estas variables es extremadamente explicativa por sí sola. Aunque muestran correlaciones altas y bajas, lo que sugiere un cierto nivel de relación entre ellas, ninguna de ellas puede explicar completamente este fenómeno, lo cual sugiere que también hay influencia de otros factores externos para poder diagnosticar si existe insuficiencia cardíaca o no en el paciente.

De manera complementaria, basÔndonos en las pestañas Diagrama Conjunto de Dispersión, Distribución y Correlaciones, pero en sus versiones en grupos de las variables categóricas: Sexo, Tipo_dolor_pecho, ECG_reposo, Angina_Ejercicio, Pendi_Segme_ST_Ejercicio y Clase_salida, se puede apreciar que en la comparativa entre distintas categorías, el Sexo no muestra tanta relevancia como para elevar de manera tan significativa la probabilidad de que a un paciente se le diagnostique insuficiencia cardíaca, a diferencia de lo que ocurre con la categoría Pendi_Segme_ST_Ejercicio, que se muestra de manera diferente a lo mencionado anteriormente. Es decir, que un paciente que muestra una pendiente anómala en el momento en que se le realiza su evaluación cardíaca, este resultado puede resultar mÔs significativo en el diagnóstico de insuficiencia cardíaca. Por otro lado, la categoría Angina_Ejercicio también puede dar una correlación significativa entre la insuficiencia cardíaca y los padecimientos resultantes al realizar ejercicio.

En base a la pestaƱa Diagrama de Estrellas, se puede interpretar que hay una gran variedad bastante notable entre los pacientes y, en tƩrminos de datos, hay ciertas relaciones pero no son lo suficientemente altas como para separar en grupos, en general presentan una alta variablilidad

AdemÔs complementariamente Diagramas de Estrellas, la pestaña Caras de Chernoff revela la gran diversidad entre los pacientes. Con bastante claridad, las Caras de Chernoff, desde el número 1 hasta el 23, muestran una gran variabilidad, lo que hace imposible separarlos en grupos similares. Este hallazgo coincide con lo observado en el Diagrama de Estrellas.

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

ggpairs(heart_diseases_Dataset[,-c(2,3,7,9,11,12)])

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

ggpairs(heart_diseases_Dataset, columns = c(1,4,5,6,8,10), aes(color = Sexo, alpha = 0.5), upper = list(continuous = wrap("cor", size = 2.5)))

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

ggpairs(heart_diseases_Dataset, columns = c(1,4,5,6,8,10), aes(color = Tipo_dolor_pecho, alpha = 0.5), upper = list(continuous = wrap("cor", size = 2.5)))

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

ggpairs(heart_diseases_Dataset, columns = c(1,4,5,6,8,10), aes(color = ECG_reposo, alpha = 0.5), upper = list(continuous = wrap("cor", size = 2.5)))

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

ggpairs(heart_diseases_Dataset, columns = c(1,4,5,6,8,10), aes(color = Angina_Ejercicio, alpha = 0.5), upper = list(continuous = wrap("cor", size = 2.5)))

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

ggpairs(heart_diseases_Dataset, columns = c(1,4,5,6,8,10), aes(color = Pendi_Segme_ST_Ejercicio, alpha = 0.5), upper = list(continuous = wrap("cor", size = 2.5)))

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

ggpairs(heart_diseases_Dataset, columns = c(1,4,5,6,8,10), aes(color = Clase_salida, alpha = 0.5), upper = list(continuous = wrap("cor", size = 2.5)))

Diagrama de Estrellas

set.seed(780728)
heart_diseases_Dataset_Muestreado = heart_diseases_Dataset[sample(1:nrow(heart_diseases_Dataset),23),-c(2,3,7,9,11,12)]
stars(heart_diseases_Dataset_Muestreado, len = 1, cex = 0.4, key.loc = c(10, 2), draw.segments = TRUE)

Caras de Chernoff

set.seed(780728)
heart_diseases_Dataset_Muestreado = heart_diseases_Dataset[sample(1:nrow(heart_diseases_Dataset),23),-c(2,3,7,9,11,12)]
faces(heart_diseases_Dataset_Muestreado)

## effect of variables:
##  modified item       Var         
##  "height of face   " "Edad"      
##  "width of face    " "PA_reposo" 
##  "structure of face" "Colesterol"
##  "height of mouth  " "AZ_Ayunas" 
##  "width of mouth   " "FrecC_Max" 
##  "smiling          " "Oldpeak"   
##  "height of eyes   " "Edad"      
##  "width of eyes    " "PA_reposo" 
##  "height of hair   " "Colesterol"
##  "width of hair   "  "AZ_Ayunas" 
##  "style of hair   "  "FrecC_Max" 
##  "height of nose  "  "Oldpeak"   
##  "width of nose   "  "Edad"      
##  "width of ear    "  "PA_reposo" 
##  "height of ear   "  "Colesterol"

1.5 Normalidad Multivariada

Para investigar o determinar el tipo de distribución multivariada de un conjunto de datos, se pueden utilizar procedimientos descriptivos, como grÔficos, o procedimientos inferenciales, como pruebas estadísticas. En este contexto, se logra una generalización de resultados al emplear estos últimos, aunque los primeros respaldan las interpretaciones.

En esta sección se considera el uso de procedimientos inferenciales para determinar si el conjunto de datos con respecto a sus variables numéricas, sigue una distribución normal multivariada (DNM). Se aplicarÔn pruebas de normalidad multivariada (PNM) que incluyen las pruebas de Mardia, Henze-Zirkler, Doornik-Hansen y Royston. Estas pruebas de normalidad se llevarÔn a cabo con un nivel de significancia \(\alpha = 0.05\) y bajo las siguientes hipótesis:\[H_0: \text {El conjunto de datos sigue una distribución normal multivariada.}\] \[H_1: \text {El conjunto de datos NO sigue una distribución normal multivariada.}\]

La prueba de Mardia se fundamenta en extensiones de asimetría y curtosis, el cuadrado de la distancia de Mahalanobis, la cantidad de variables \(p\) en anÔlisis y la cantidad de registros \(n\). En este contexto, la prueba estadística para la asimetría sigue una distribución \(\chi^2\), mientras que la prueba estadística para la curtosis se aproxima a una distribución normal.

La prueba de Henze-Zirkler se fundamenta en la distancia funcional. Si el conjunto de datos sigue una distribución normal multivariada, el estadístico de la prueba se distribuye aproximadamente como una log-normal, con parÔmetros de media \(\mu\) y varianza \(\sigma^2\).

La prueba de Doornik-Hansen se basa en la asimetría y la curtosis de un conjunto de datos multivariados, los cuales se transforman para asegurar la independencia. Esta prueba se considera mÔs potente que la prueba de Shapiro-Wilk en casos multivariados. El 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\).

La prueba de Royston utiliza las pruebas de Shapiro-Wilk o Shapiro-Francia para evaluar la normalidad multivariada. Si la curtosis es mayor que 3, la prueba de Royston emplea Shapiro-Francia para distribuciones leptocúrticas. Por otro lado, para distribuciones platicúrticas utiliza Shapiro-Wilk. En esta prueba, los parÔmetros son obtenidos mediante aproximaciones polinomiales.

Planteamiento del Problema

Con base en el conjunto de datos descrito en la fase 1 sección 1.2, se realizarÔ una prueba estadística de normalidad multivariada con un nivel de significancia \(\alpha=0.05\), para determinar si los datos métricos provienen de una población normal multivariada. Las variables numéricas del conjunto de datos (en escala de medición de razón) son: Edad, PA_reposo, Colesterol, AZ_Ayunas, FrecC_Max y Oldpeak.

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:

  1. Prueba de Mardia: Los valores \(p\) asociados con las pruebas de asimetría (Skewness) y curtosis (Kurtosis) son menores que el nivel de significancia \(\alpha = 0.05\). Esto sugiere que no hay suficiente evidencia para sostener la hipótesis de normalidad multivariada para las variables del conjunto de datos.

  2. Prueba de Henze-Zirkler: El estadístico de prueba no se distribuye aproximadamente como log-normal, ya que el valor \(p\) es menor que \(\alpha = 0.05\). Por lo tanto, no hay apoyo para que el conjunto de datos siga una distribución normal multivariada según esta prueba.

  3. Prueba de Doornik-Hansen: El estadístico de prueba no sigue una distribución \(\chi^2\) aproximadamente, dado que el valor \(p\) es menor que \(\alpha = 0.05\). Esto sugiere que las evidencias no respaldan la normalidad multivariada del conjunto de datos.

  4. Prueba de Royston: El conjunto de datos, reducido a sus variables numéricas, no sigue una distribución normal multivariada según esta prueba, ya que el valor \(p\) es menor que \(\alpha = 0.05\).

En resumen, con un nivel de significancia de \(0.05\), las pruebas indican consistentemente que el conjunto de datos analizado, con respecto a sus variables numéricas, no sigue una distribución normal multivariada. Este hallazgo es importante para la interpretación y el anÔlisis subsiguiente de los datos.

PNM Mardia

mvn(heart_diseases_Dataset[,-c(2,3,7,9,11,12)], mvnTest="mardia")
## $multivariateNormality
##              Test        Statistic               p value Result
## 1 Mardia Skewness 1330.39701506226 2.03529324264984e-241     NO
## 2 Mardia Kurtosis 15.8588696120447                     0     NO
## 3             MVN             <NA>                  <NA>     NO
## 
## $univariateNormality
##               Test   Variable Statistic   p value Normality
## 1 Anderson-Darling    Edad       2.7693  <0.001      NO    
## 2 Anderson-Darling PA_reposo     7.4597  <0.001      NO    
## 3 Anderson-Darling Colesterol    7.0365  <0.001      NO    
## 4 Anderson-Darling AZ_Ayunas   124.7066  <0.001      NO    
## 5 Anderson-Darling FrecC_Max     1.6082   4e-04      NO    
## 6 Anderson-Darling  Oldpeak    101.4988  <0.001      NO    
## 
## $Descriptives
##              n      Mean   Std.Dev Median Min Max 25th 75th       Skew
## Edad       917  53.50927  9.437636     54  28  77   47   60 -0.1946831
## PA_reposo  917 132.54089 17.999749    130  80 200  120  140  0.6052097
## Colesterol 917 210.95856 82.858974    219  40 603  163  264  0.1055706
## AZ_Ayunas  917 140.54853 78.949925    109  80 400   95  124  1.8483617
## FrecC_Max  917 136.78953 25.467129    138  60 202  120  156 -0.1419928
## Oldpeak    917   5.38277  8.773387      1 -26  62    0    8  1.9282516
##              Kurtosis
## Edad       -0.3990863
## PA_reposo   0.7727619
## Colesterol  0.7795042
## AZ_Ayunas   2.2250249
## FrecC_Max  -0.4585589
## Oldpeak     5.0171989

PNM Henze-Zirkler

mvn(heart_diseases_Dataset[,-c(2,3,7,9,11,12)], mvnTest="hz")
## $multivariateNormality
##            Test       HZ p value MVN
## 1 Henze-Zirkler 6.525351       0  NO
## 
## $univariateNormality
##               Test   Variable Statistic   p value Normality
## 1 Anderson-Darling    Edad       2.7693  <0.001      NO    
## 2 Anderson-Darling PA_reposo     7.4597  <0.001      NO    
## 3 Anderson-Darling Colesterol    7.0365  <0.001      NO    
## 4 Anderson-Darling AZ_Ayunas   124.7066  <0.001      NO    
## 5 Anderson-Darling FrecC_Max     1.6082   4e-04      NO    
## 6 Anderson-Darling  Oldpeak    101.4988  <0.001      NO    
## 
## $Descriptives
##              n      Mean   Std.Dev Median Min Max 25th 75th       Skew
## Edad       917  53.50927  9.437636     54  28  77   47   60 -0.1946831
## PA_reposo  917 132.54089 17.999749    130  80 200  120  140  0.6052097
## Colesterol 917 210.95856 82.858974    219  40 603  163  264  0.1055706
## AZ_Ayunas  917 140.54853 78.949925    109  80 400   95  124  1.8483617
## FrecC_Max  917 136.78953 25.467129    138  60 202  120  156 -0.1419928
## Oldpeak    917   5.38277  8.773387      1 -26  62    0    8  1.9282516
##              Kurtosis
## Edad       -0.3990863
## PA_reposo   0.7727619
## Colesterol  0.7795042
## AZ_Ayunas   2.2250249
## FrecC_Max  -0.4585589
## Oldpeak     5.0171989

PNM Doornik-Hansen

mvn(heart_diseases_Dataset[,-c(2,3,7,9,11,12)], mvnTest="dh")
## $multivariateNormality
##             Test        E df      p value MVN
## 1 Doornik-Hansen 359.3139 12 1.517767e-69  NO
## 
## $univariateNormality
##               Test   Variable Statistic   p value Normality
## 1 Anderson-Darling    Edad       2.7693  <0.001      NO    
## 2 Anderson-Darling PA_reposo     7.4597  <0.001      NO    
## 3 Anderson-Darling Colesterol    7.0365  <0.001      NO    
## 4 Anderson-Darling AZ_Ayunas   124.7066  <0.001      NO    
## 5 Anderson-Darling FrecC_Max     1.6082   4e-04      NO    
## 6 Anderson-Darling  Oldpeak    101.4988  <0.001      NO    
## 
## $Descriptives
##              n      Mean   Std.Dev Median Min Max 25th 75th       Skew
## Edad       917  53.50927  9.437636     54  28  77   47   60 -0.1946831
## PA_reposo  917 132.54089 17.999749    130  80 200  120  140  0.6052097
## Colesterol 917 210.95856 82.858974    219  40 603  163  264  0.1055706
## AZ_Ayunas  917 140.54853 78.949925    109  80 400   95  124  1.8483617
## FrecC_Max  917 136.78953 25.467129    138  60 202  120  156 -0.1419928
## Oldpeak    917   5.38277  8.773387      1 -26  62    0    8  1.9282516
##              Kurtosis
## Edad       -0.3990863
## PA_reposo   0.7727619
## Colesterol  0.7795042
## AZ_Ayunas   2.2250249
## FrecC_Max  -0.4585589
## Oldpeak     5.0171989

PNM Royston

mvn(heart_diseases_Dataset[,-c(2,3,7,9,11,12)], mvnTest="royston")
## $multivariateNormality
##      Test        H      p value MVN
## 1 Royston 459.6305 3.937501e-96  NO
## 
## $univariateNormality
##               Test   Variable Statistic   p value Normality
## 1 Anderson-Darling    Edad       2.7693  <0.001      NO    
## 2 Anderson-Darling PA_reposo     7.4597  <0.001      NO    
## 3 Anderson-Darling Colesterol    7.0365  <0.001      NO    
## 4 Anderson-Darling AZ_Ayunas   124.7066  <0.001      NO    
## 5 Anderson-Darling FrecC_Max     1.6082   4e-04      NO    
## 6 Anderson-Darling  Oldpeak    101.4988  <0.001      NO    
## 
## $Descriptives
##              n      Mean   Std.Dev Median Min Max 25th 75th       Skew
## Edad       917  53.50927  9.437636     54  28  77   47   60 -0.1946831
## PA_reposo  917 132.54089 17.999749    130  80 200  120  140  0.6052097
## Colesterol 917 210.95856 82.858974    219  40 603  163  264  0.1055706
## AZ_Ayunas  917 140.54853 78.949925    109  80 400   95  124  1.8483617
## FrecC_Max  917 136.78953 25.467129    138  60 202  120  156 -0.1419928
## Oldpeak    917   5.38277  8.773387      1 -26  62    0    8  1.9282516
##              Kurtosis
## Edad       -0.3990863
## PA_reposo   0.7727619
## Colesterol  0.7795042
## AZ_Ayunas   2.2250249
## FrecC_Max  -0.4585589
## Oldpeak     5.0171989

Fase 2 [Componentes Principales]

2.1. Objetivos

En términos generales, esta segunda etapa del estudio presentarÔ cÔlculos, visualizaciones e interpretaciones basadas en el conjunto de datos tratado en la fase 1. Esta vez, el enfoque se centrarÔ en el anÔlisis de componentes principales de las variables cuantitativas, lo que incluirÔ la selección, calidad de representación, contribuciones e interpretación.

2.2. Selección de Componentes

El AnÔlisis de Componentes Principales (ACP) reestructura un conjunto de datos multivariado al reducir el número de variables, sin necesidad de asumir ninguna distribución de probabilidad para ellas. Esta reducción se logra mediante combinaciones lineales de las variables originales, que capturan la mayor variabilidad posible presente en el conjunto de datos. Así, el ACP crea nuevas variables, conocidas como componentes principales, que son estadísticamente independientes (basadas en el supuesto de normalidad) y no estÔn correlacionadas.

El ACP se desarrolla a través de las siguientes fases: generación de nuevas variables, reducción dimensional del espacio de datos, eliminación de variables de poco aporte e interpretación de los componentes resultantes en el contexto del problema del cual se obtuvieron los datos.

Planteamiento del Problema

Con base en las variables cuantitativas del conjunto de datos descrito en la fase anterior, primero se debe establecer el porcentaje de varianza explicado por cada dimensión una vez procesado el ACP. Posteriormente, utilizando el autovalor medio o un diagrama de sedimentación, se decidirÔ cuÔntos componentes retener.

Desarrollo del AnƔlisis

Con base a la navegacion en pestaƱas se puede apreciar que el conjunto de datos, relacionado con sus variables numericas puede ser representado por unos conjuntos mas pequeƱos que llegan a retener el \(79,21\) \(\%\) de la variabilidad del conjunto, estas en particular:

La Matriz ACP muestra en total seis dimenciones en donde la primera retiene un \(23,32\) \(\%\), la siguiente un \(19,72\) \(\%\) y las demas de manera respectiva \(15,26\) \(\%\) y \(14,91\) \(\%\) dandonos un total de \(79,21\) \(\%\) como habiamos mencionado antes, En este sentido la representatividad de la combinacion lineal por dimenciones individuales es relativamente baja pero si tomamos de la dimencion 1 a 4 son significativamente altas a comparacion del resto. Como esta matriz no identifica la relacion con las variables originales se seguira indagando para indentificar las variables que mas contribuyes a las 4 primeras dimensiones que tengan el valor propio mas alto.

La Matriz de Correlaciones permite continuar con el proceso de las descripciones de las combinaciones lineales que conforman las dimensiones de mayor interés: Dimencion 1 a 4. Así mismo esta matriz como se describio en secciones pasadas, ayudara a verificar que la intencidad de correlaciones es relativamente aceptable y positiva entre las variables: PA_reposo, Edad, FrecC_Max y Colesterol, lo cual muestra una relacion con el fenomeno que se esta estudiando, por lo tanto, se podira esperar que estas variables participen de manera significativa en la combinación Lineal que define a la dimencion 1 a 4.

La pestaña de Valores y Vectores Propios muestra estos elementos calculados a partir de la matriz de correlaciones del conjunto de datos. En este contexto, se asegura que la suma de los valores propios sea igual a la dimensión de dicha matriz y a la variabilidad total del conjunto, lo que permite calcular fÔcilmente las proporciones de retención de variabilidad. AdemÔs, la matriz de vectores propios define, para cada componente y en relación con cada variable del conjunto de datos, los coeficientes de la combinación lineal que la conforman, por ejemplo, ajustados a dos cifras decimales, la componente 1 estaria representada por la combinacion lineal (donde \(E\) es Edad, \(P\) es PA_reposo, \(C\) es Colesterol, \(A\) es AZ_Ayunas, \(F\) es FrecC_Max y \(O\) es Oldpeak, y ademas son variables estandarizadas): de esta mismma forma se haran con los componenetes 1 a 4 quedando de la siguiente forma: \[Componente_1 = 0.58*E+0.33*P-0,29*C+0,35*A-0,51*F+0.30*O\]

\[Componente_2 = 0,19*E+0,50*P+0,67*C-0,28*A+0,19*F+0,39*O\] \[Componente_3 = 0,17*E+0,21*P+0,02*C-0,60*A-0,45*F-0,60*O\] \[Componente_4 = 0,09*E-0,56*P-0,08*C-0,54*A+-0.25*F+0,56*O\] Se escogen estas 4 porque en el ACP forman el \(79,21\) \(\%\) y juntas representan una versión mÔs compacta y rica del conjunto original, y hasta este punto se puede observar que el numero de dimensiones resultantes es equivalente al numero de variables tratadas, sin contar las variables nuevas ya que estan son incorreladas entre si, ver la pestaña Correlaciones comparadas.

Por último, tanto el GrÔfico de Cattell como el GrÔfico de Cattell-Kaiser, que representan el codo y la sedimentación respectivamente, ayudan a decidir cuÔntas componentes retener en la reducción de dimensionalidad, asegurando que se conserve una cantidad suficiente de variabilidad para abordar el problema en cuestión. No obstante, es importante destacar que se sugiere tomar decisiones basadas en criterios mÔs comunes en lugar de criterios de aceptación universal.

El GrÔfico de Cattell revela que los cambios en la pendiente indican una alta capacidad explicativa de las dimensiones en comparación con las demÔs. Por otro lado, el GrÔfico de Cattell-Kaiser, al combinar el grÔfico anterior con el criterio de Kaiser en la misma visualización, respalda la idea de retener solo 2 dimensión y no 4 como se habia propuesto, enfatizando que esta elección debe conservar un porcentaje adecuado de variabilidad para el anÔlisis del problema en cuestión.

Matriz ACP

get_eigenvalue(PCA(heart_diseases_Dataset[,-c(2,3,7,9,11,12)], ncp = 6, scale.unit = TRUE, graph = F))
##       eigenvalue variance.percent cumulative.variance.percent
## Dim.1  1.7592474        29.320790                    29.32079
## Dim.2  1.1830382        19.717303                    49.03809
## Dim.3  0.9155510        15.259183                    64.29728
## Dim.4  0.8946274        14.910457                    79.20773
## Dim.5  0.6954416        11.590693                    90.79843
## Dim.6  0.5520944         9.201574                   100.00000

Matriz de Correlaciones

round(cor(heart_diseases_Dataset[,-c(2,3,7,9,11,12)]),2)
##             Edad PA_reposo Colesterol AZ_Ayunas FrecC_Max Oldpeak
## Edad        1.00      0.26      -0.10      0.17     -0.38    0.23
## PA_reposo   0.26      1.00       0.07      0.08     -0.11    0.10
## Colesterol -0.10      0.07       1.00     -0.19      0.24    0.02
## AZ_Ayunas   0.17      0.08      -0.19      1.00     -0.12    0.07
## FrecC_Max  -0.38     -0.11       0.24     -0.12      1.00   -0.08
## Oldpeak     0.23      0.10       0.02      0.07     -0.08    1.00

Valores y Vectores Propios

princomp(heart_diseases_Dataset[,-c(2,3,7,9,11,12)], cor = TRUE)$sdev^2
##    Comp.1    Comp.2    Comp.3    Comp.4    Comp.5    Comp.6 
## 1.7592474 1.1830382 0.9155510 0.8946274 0.6954416 0.5520944
princomp(heart_diseases_Dataset[,-c(2,3,7,9,11,12)], cor = TRUE)$loadings[ ,1:6]
##                Comp.1     Comp.2      Comp.3      Comp.4     Comp.5     Comp.6
## Edad        0.5776364  0.1872497  0.16574216  0.09472231  0.2633580  0.7248955
## PA_reposo   0.3266561  0.5023551  0.21376899 -0.56185201 -0.4950656 -0.1856618
## Colesterol -0.2889849  0.6695748  0.01694501 -0.08358424  0.6561984 -0.1740330
## AZ_Ayunas   0.3487904 -0.2783312 -0.60487484 -0.54444940  0.3509656 -0.1241026
## FrecC_Max  -0.5149622  0.1897350 -0.44646771 -0.24897437 -0.2818786  0.5983622
## Oldpeak     0.2987956  0.3883024 -0.60111416  0.55673179 -0.2287442 -0.1906041

Correlaciones Comparadas

par(mfrow=c(1,2))
corrplot::corrplot(cor(heart_diseases_Dataset[,-c(2,3,7,9,11,12)]), method = "color", type = "upper", number.cex = 0.4)
corrplot::corrplot(cor(princomp(heart_diseases_Dataset[,-c(2,3,7,9,11,12)], cor = TRUE)$scores), method = "color", type = "upper", number.cex = 0.4)

GrƔfico de Cattell

fviz_eig(PCA(heart_diseases_Dataset[,-c(2,3,7,9,11,12)], scale.unit = T, graph = F), addlabels = T, ylim=c(0,90), main = "")

GrƔfico de Cattell-Kaiser

scree(heart_diseases_Dataset[,-c(2,3,7,9,11,12)],factors = FALSE, pc = TRUE, main ="")

2.3. Calidad de Representación

Después de reducir la dimensionalidad del conjunto de datos y proyectar las variables estandarizadas en la hiperesfera de correlaciones, es esencial iniciar la interpretación de los componentes teniendo en cuenta estas correlaciones. Esto nos permite entender cómo las variables originales se relacionan entre sí y cómo estas relaciones se reflejan en los componentes principales. Esta comprensión nos ayuda a inferir patrones y estructuras importantes en los datos. AdemÔs, es crucial evaluar la calidad de las representaciones de los componentes, asegurÔndonos de que conserven la información crucial del conjunto de datos original y sean útiles para el anÔlisis subsiguiente, garantizando así una comprensión precisa y útil de la estructura de los datos.

Planteamiento del Problema

Con base en el conjunto de datos descrito en la fase 1 se requiere determinar la calidad de representación de las variables cuantitativas en relación con la cantidad de dimensiones calculadas que retienen la mayor cantidad de variabilidad. Para obtener mÔs información al respecto, se recomienda consultar la sección 2.2 del documento.

Desarrollo del AnƔlisis

Explorar las pestañas revela, que reducir la dimensionalidad del conjunto de datos permite analizar las calidades de representación. Esto se evalúa en función de la escala de contribuciones relativas, basada en un cociente de proyecciones con propiedades aditivas y una respuesta en una escala continua de 0 a 1. Así, en particular:

El Círculo de correlaciones nos muestra de manera visual cómo se comportan las seis variables de interés. En este caso, cuatro de ellas estÔn bastante próximas a las fronteras del círculo unitario y cerca de los dos ejes principales, dependiendo de la variable que se tome como referencia. Esto indica que estas variables tienen una buena representación en el plano de los componentes principales. AdemÔs, podemos observar tanto correlaciones positivas como negativas entre ellas. Un aspecto importante a destacar es la correlación existente entre las variables. Un ejemplo representativo es la relación entre PA_reposo y Oldpeak. Estas dos variables muestran cómo las correlaciones pueden variar significativamente, reflejando relaciones complejas que pueden ser positivas o negativas dependiendo de su posición relativa en el círculo.

La Matriz de Representación muestra algunos valores signicativamente cercanos a 0 y pocos cercanos a 1,los valores anteriormente mencionados son los cocientes de las proyecciones coseno cuadrado que estan relacionados con la dimensión 1. así de la misma manera la Calidad de Representación en cuanto se relaciona con la componente 1 esta encabezada Edad y cierra con Colesterol cabe recalcar que en la dimension 2 se obtine una mejor representacion por parte del Colesterol, por lo tanto lo que nos dice esto es que la representacion relacionada con la primera dimension se ve afectada. Tambien es importante mencionar que la escala que muestra la Calidad de Representación indica su escala un piso alto de \(0.04\).

Por último, las Coordenadas Individuales permiten identificar, aunque de manera menos intuitiva, los perfiles de los registros individuales, en este caso los pacientes, en relación con las dimensiones mÔs importantes que retienen la mayor parte de la variabilidad: las componentes 1 y 2. Estas coordenadas nos ayudan a entender cómo se distribuyen y agrupan los pacientes en el espacio definido por estas componentes principales. Por ejemplo, al analizar los registros 1, 6, 17 y 20, podemos observar que los registros anteriormente mencionados presentan perfiles similares. Esta observación se mantiene incluso cuando consideramos otras variables como la peor representada. Este anÔlisis sugiere que las principales diferencias y similitudes entre estos registros se capturan de manera efectiva a través de las componentes 1 y 2.

CĆ­rculo de Correlaciones

fviz_pca_var(PCA(heart_diseases_Dataset[,-c(2,3,7,9,11,12)], scale.unit = T, graph = F),col.var="#3B83BD", repel = T, col.circle = "#CDCDCD", ggtheme = theme_bw())

Matriz de Representación

(get_pca_var(PCA(heart_diseases_Dataset[,-c(2,3,7,9,11,12)], ncp = 6, scale.unit = TRUE, graph = F)))$cos2
##                Dim.1      Dim.2        Dim.3       Dim.4      Dim.5       Dim.6
## Edad       0.5869973 0.04148021 0.0251506119 0.008026879 0.04823403 0.290111004
## PA_reposo  0.1877191 0.29855232 0.0418380998 0.282413903 0.17044573 0.019030872
## Colesterol 0.1469188 0.53039205 0.0002628851 0.006250157 0.29945457 0.016721547
## AZ_Ayunas  0.2140208 0.09164794 0.3349759121 0.265190061 0.08566229 0.008503053
## FrecC_Max  0.4665280 0.04258863 0.1824999061 0.055456374 0.05525670 0.197670404
## Oldpeak    0.1570636 0.17837703 0.3308235854 0.277290021 0.03638823 0.020057559

Calidad de Representación

fviz_pca_var(PCA(heart_diseases_Dataset[,-c(2,3,7,9,11,12)], ncp = 6, scale.unit = TRUE, graph = F), col.var="cos2", gradient.cols=c("#00AFBB","#E7B800","#FC4E07"), repel = TRUE)

Coordenadas Individuales

head((PCA(heart_diseases_Dataset[,-c(2,3,7,9,11,12)], ncp = 6, scale.unit = TRUE, graph = F))$ind$coord, n = 23L)
##         Dim.1       Dim.2        Dim.3       Dim.4         Dim.5       Dim.6
## 1  -2.0745726  0.76644699  0.009227874  0.79858453 -0.4295182466 -0.25808450
## 2  -0.2895121  0.44149242 -0.346393583  1.20981991 -1.3077699147  0.01117777
## 3  -0.8466390 -0.23244178 -0.985698628 -0.09620251  0.6094854060 -2.13917590
## 4   0.5351111  0.37964288 -0.033227936 -0.86031274 -0.3389857782 -1.32706703
## 5   0.3260574  0.17324290 -1.175071823  0.42085244 -0.4827020407 -0.27111234
## 6  -2.5578366  0.51750272  0.349457699  0.33219744  0.5868934249 -0.30735765
## 7  -1.7589753  0.17580935 -0.037903336  0.31571282 -0.4357491967  0.30264406
## 8  -0.8458294 -0.69305982 -0.343944020 -0.61275276  0.5040290251  0.58297405
## 9  -0.5980179  0.38448539  0.393303433 -0.59655370 -1.0758632563 -1.63443788
## 10 -0.8429563 -0.08949189 -0.743457451 -0.36487444  0.9160561373 -0.66137655
## 11 -1.5165263 -0.46190515 -0.252835121  0.21322041 -0.4794341960 -0.94249379
## 12  0.9231004 -0.44359735 -1.400312147 -0.49500497 -0.0644372390 -0.32566049
## 13 -1.6516759 -0.70393272 -0.184087642 -0.15899785 -0.2771234148 -0.58619841
## 14 -0.6632656  0.31674827 -0.653407515  0.25549002 -0.2990938923 -0.22012789
## 15 -1.3461761 -0.84700088 -0.188829742 -0.29917130  0.1639075188 -0.53355797
## 16 -0.4357071  0.75095454  0.876526211 -0.94335531  0.3707367228  0.16743651
## 17 -2.3047020 -0.90058769  0.299305439 -0.28463015 -0.3391489529 -0.04464171
## 18 -1.8583487 -0.45384180 -0.002599241 -0.09626023 -0.4685229681  0.21812171
## 19 -0.4701640 -0.57341891 -0.652691545 -1.25062637  1.3769438016  0.65914534
## 20 -2.1503982 -0.09410554  0.508481756  0.05656228  0.0006864491 -0.69947908
## 21 -1.6826551 -1.12582727  0.087750216 -0.68906606  0.6621182939 -0.21586985
## 22 -1.2074402 -0.72329648 -0.297915574 -0.36363041 -0.3155482275 -0.24273915
## 23 -1.2035596 -0.38569260  0.164190710  0.26222677 -0.2042976920  0.54523574

2.4. Contribuciones

La interpretación de los resultados en el anÔlisis de componentes principales (ACP) se ve enriquecida por el cÔlculo de diversas métricas, tales como coordenadas, contribuciones y cosenos cuadrados. Estos indicadores son fundamentales para comprender la relación entre las variables originales y los componentes principales generados. Es crucial que las variables estén claramente conceptualizadas, contextualizadas en el marco del problema de estudio, para poder interpretar con precisión sus contribuciones a los componentes.

El cÔlculo de las contribuciones de cada variable a cada componente permite entender el grado de influencia de cada una en la formación de los componentes principales. Este anÔlisis facilita la identificación de aquellas variables que mÔs contribuyen a la estructura de cada componente y, por ende, a la variabilidad general de los datos. AdemÔs, proporciona insights sobre las relaciones subyacentes entre las variables y cómo estas se reflejan en los componentes.

Planteamiento del Problema

Con base en las variables cuantitativas del conjunto de datos descrito en la fase 1 se requiere determinar las contribuciones que cada variable realiza en la construcción de cada componente. Este anÔlisis permitirÔ comprender el papel de cada variable en la estructura subyacente de los datos y su impacto en la formación de los componentes principales. Mediante el cÔlculo de estas contribuciones, serÔ posible identificar qué variables tienen una influencia mÔs significativa en cada componente, lo que facilitarÔ la interpretación de los resultados del anÔlisis de componentes principales y proporcionarÔ información valiosa para el estudio del problema en cuestión.

Desarrollo del AnƔlisis

Con base a travƩs de las pestaƱas de navegacion nos permite reconocer las representaciones numericas y graficas de las contribuciones de cada variable del conjunto de datos de manera porcentual a la construcion de cada componente. Entonces en particular llegamos a encontrar lo siguiente:

La Matriz de contribuciones nos muestra en terminos numericos la retencion de la variabilidad que tiene cada variable en su respectiva componente, de la misma se haran diagramas de barras que nos expliquen de manera visual las Contribuciones a D1 hasta Contribuciones a D6 y esta misma se hara a travƩs de la naevagacion de pestaƱas. Tambien de manera complementaria cada grafico tendra su propia linea que nos ayudara a identificar la contribucion media, esto nos ayudara a identificar las variables que contribuyan de mejor manera a sus repectivas dimenciones.

  • En Contribuciones a D1 se visualizan que las variables que estan por encima de la contribucion media son: Edad y FrecC_Max que retiene aproximadamente el \(59,89\) \(%\) de la variabilidad de la componente 1.

  • En Contribuciones a D2 se visualizan que las variables que estan por encima de la contribucion media son: Colesterol y PA_reposo que retiene aproximadamente el \(70,07\) \(%\) de la variabilidad de la componente 2.

  • En Contribuciones a D3 se visualizan que las variables que estan por encima de la contribucion media son: AZ_Ayunas, Oldpeak y FrecC_Max que retiene aproximadamente el \(91,63\) \(%\) de la variabilidad de la componente 3.

  • En Contribuciones a D4 se visualizan que las variables que estan por encima de la contribucion media son: PA_reposo, Oldpeak y AZ_Ayunas que retiene aproximadamente el \(92.21\) \(%\) de la variabilidad de la componente 4.

  • En Contribuciones a D5 se visualizan que las variables que estan por encima de la contribucion media son: Colesterol y PA_reposo que retiene aproximadamente el \(67,57\) \(%\) de la variabilidad de la componente 5.

  • Por ultimo tenenemos la pestaƱa Contribuciones a D6 se visualizan que las variables que estan por encima de la contribucion media son: Edad y FrecC_Max que retiene aproximadamente el \(88,35\) \(%\) de la variabilidad de la componente 6.

Con los datos procesados hasta este momento podemos seguir con el siguiente paso que seria la interpretacion de cada componenete.

Matriz de Contribuciones

(get_pca_var(PCA(heart_diseases_Dataset[,-c(2,3,7,9,11,12)], ncp = 6, scale.unit = TRUE, graph = F)))$contrib
##                Dim.1     Dim.2       Dim.3      Dim.4     Dim.5     Dim.6
## Edad       33.366385  3.506244  2.74704652  0.8972315  6.935741 52.547351
## PA_reposo  10.670419 25.236068  4.56971810 31.5677683 24.508995  3.447032
## Colesterol  8.351229 44.833046  0.02871332  0.6986325 43.059631  3.028748
## AZ_Ayunas  12.165472  7.746828 36.58735690 29.6425152 12.317683  1.540145
## FrecC_Max  26.518611  3.599937 19.93334135  6.1988236  7.945556 35.803730
## Oldpeak     8.927884 15.077876 36.13382381 30.9950290  5.232393  3.632994

Contribuciones a D1

fviz_contrib(PCA(heart_diseases_Dataset[,-c(2,3,7,9,11,12)], ncp = 6, scale.unit = TRUE, graph = F), choice = "var", axes = 1, top = 10)

Contribuciones a D2

fviz_contrib(PCA(heart_diseases_Dataset[,-c(2,3,7,9,11,12)], ncp = 6, scale.unit = TRUE, graph = F), choice = "var", axes = 2, top = 10)

Contribuciones a D3

fviz_contrib(PCA(heart_diseases_Dataset[,-c(2,3,7,9,11,12)], ncp = 6, scale.unit = TRUE, graph = F), choice = "var", axes = 3, top = 10)

Contribuciones a D4

fviz_contrib(PCA(heart_diseases_Dataset[,-c(2,3,7,9,11,12)], ncp = 6, scale.unit = TRUE, graph = F), choice = "var", axes = 4, top = 10)

Contribuciones a D5

fviz_contrib(PCA(heart_diseases_Dataset[,-c(2,3,7,9,11,12)], ncp = 6, scale.unit = TRUE, graph = F), choice = "var", axes = 5, top = 10)

Contribuciones a D6

fviz_contrib(PCA(heart_diseases_Dataset[,-c(2,3,7,9,11,12)], ncp = 6, scale.unit = TRUE, graph = F), choice = "var", axes = 6, top = 10)

2.5. Interpretación de componentes

Se sabe que a partir de las coordenadas de los registros dimensionalmente reducidos, es posible ubicarlos en un plano de factores para anÔlisis e interpretación. En este proceso, las variables reducidas actúan como las componentes principales, que se representan como ejes en el plano, mientras que los valores que toman son los puntajes de las componentes. Como se explica en el mismo trabajo, las distancias entre los puntos definidos por los puntajes de las componentes tienen un significado relevante al ayudar a establecer semejanzas de perfiles en las observaciones realizadas.

Es importante destacar que los valores semejantes de las variables pueden darse solo en algunas de ellas, sin que sea necesario que suceda en todas. Sin embargo, se espera que las distancias en el espacio dimensional original de las observaciones queden bien representadas en el espacio reducido de las componentes. Este proceso de reducción dimensional conserva la estructura subyacente de las relaciones entre las observaciones, lo que permite una representación mÔs compacta y comprensible de los datos mientras se mantienen las distancias relevantes para la interpretación de semejanzas y diferencias entre observaciones.

Planteamiento del Problema

Con base en las variables cuantitativas del conjunto de datos descrito en la fase 1 se requiere definir e interpretar sus componentes principales. La definición de cada componente principal implica comprender cómo se combinan linealmente las variables originales para formarlos, así como su contribución relativa a la variabilidad total de los datos. Por otro lado, la interpretación de los componentes implica analizar qué aspectos o patrones de los datos representan, y cómo se relacionan con el problema o fenómeno estudiado.

Desarrollo del AnƔlisis

La navegación a través de las pestañas permite visualizar objetos grÔficos y matriciales que, al incluir lo hecho en las secciones anteriores, ayudan a robustecer la interpretación de las componentes calculadas. Como se mostró en la sección 2.3, la cantidad de componentes seleccionadas se redujo (según el criterio de Kaiser) a dos, y se estableció que la componente 1 y 2 retiene el \(49\) \(%\) de la variabilidad de los datos. Así, en el círculo de correlaciones de la sección 2.4 se observa que la representación de las variables conjugadas en la componente 1 y 2 la configura como una de tipo tamaño, lo que puede interpretarse como una especie de índice de proporcionalidad directa. Esto también se respalda con el hecho de que todas las variables presentan calidades de representación entre 0.4 y 0.6. En consecuencia, cuanto mayor sea el valor de las variables, mayor serÔ la probabilidad de que el paciente se le diagnostique insuficiencia cardiaca. Así, dada la naturaleza de las variables, estas componentes puede representar para un paciente la probabilidad de sufrir problemas cardiacos. Al respecto:

Las pestaƱas de Biplot Variables y Registros Totales en S (Sexo), TDP (Tipo_dolor_pecho), ECG (ECG_reposo), AE (Angina_Ejercicio), PST (Pendi_Segme_ST_Ejercicio) y CS (Clase_salida), se muestran con base en las agrupaciones que estas variables categoricas cualitativas se prestan para establecer la representacion en una dimencionalidad reducida en el plano de factores de registros y dimenciones con base en los puntajes por componentes. En este sentido, es posible apreciar que las agrupaciones con base en Clase_salida y Angina_Ejercicio capturan diferencias acentuadas en la distribucion de las observaciones, contrario al resto de agrupaciones anteriormente mensionadas.

Por ultimo, para mostar de manera mas facil la ubicacion en el plano de componentes (en particular, siempre esta conformado por las dos componentes por el interes que sucitan) y, asi mismo, las semejanzas de perfiles de correlacion entre cada variable, se dispone de las pestaƱas de Coordenadas Individuales [Subconjunto CS] y Biplot de Variables y Registros [Subconjunto CS]. Estas muestran, con base en un subconjunto de 61 registros muestreados de manera aleatoria simple, los puntajes por componente y el biplot de ese subconjunto, con base en la agrupacion provista por la variable categorica Clase_salida, sin perder una cantidad significativa de detalles. Esto, se insiste con el fin de visualizar los datos de mejor manera ya que el conjunto original posee mas de 900 registros y genera una dificualdad en la identificacion visual.

Biplot de Variables y Registros [Total S]

data_HD <- heart_diseases_Dataset[,-c(3,7,9,11,12)]
data_All <- cbind(heart_diseases_Dataset[,-c(2,3,7,9,11,12)], data_HD$Sexo)
fviz_pca_biplot(PCA(data_All, ncp = 6, scale.unit = TRUE, graph = F, quali.sup = 7), axes = c(1, 2), repel = TRUE, habillage = 7)

Biplot de Variables y Registros [Total TDP]

data_HD <- heart_diseases_Dataset[,-c(2,7,9,11,12)]
data_All <- cbind(heart_diseases_Dataset[,-c(2,3,7,9,11,12)], data_HD$Tipo_dolor_pecho)
fviz_pca_biplot(PCA(data_All, ncp = 6, scale.unit = TRUE, graph = F, quali.sup = 7), axes = c(1, 2), repel = TRUE, habillage = 7)

Biplot de Variables y Registros [Total ECG]

data_HD <- heart_diseases_Dataset[,-c(2,3,9,11,12)]
data_All <- cbind(heart_diseases_Dataset[,-c(2,3,7,9,11,12)], data_HD$ECG_reposo)
fviz_pca_biplot(PCA(data_All, ncp = 6, scale.unit = TRUE, graph = F, quali.sup = 7), axes = c(1, 2), repel = TRUE, habillage = 7)

Biplot de Variables y Registros [Total AE]

data_HD <- heart_diseases_Dataset[,-c(2,3,7,11,12)]
data_All <- cbind(heart_diseases_Dataset[,-c(2,3,7,9,11,12)], data_HD$Angina_Ejercicio)
fviz_pca_biplot(PCA(data_All, ncp = 6, scale.unit = TRUE, graph = F, quali.sup = 7), axes = c(1, 2), repel = TRUE, habillage = 7)

Biplot de Variables y Registros [Total PSSE]

data_HD <- heart_diseases_Dataset[,-c(2,3,7,9,12)]
data_All <- cbind(heart_diseases_Dataset[,-c(2,3,7,9,11,12)], data_HD$Pendi_Segme_ST_Ejercicio)
fviz_pca_biplot(PCA(data_All, ncp = 6, scale.unit = TRUE, graph = F, quali.sup = 7), axes = c(1, 2), repel = TRUE, habillage = 7)

Biplot de Variables y Registros [Total CS]

data_HD <- heart_diseases_Dataset[,-c(2,3,7,9,11)]
data_All <- cbind(heart_diseases_Dataset[,-c(2,3,7,9,11,12)], data_HD$Clase_salida)
fviz_pca_biplot(PCA(data_All, ncp = 6, scale.unit = TRUE, graph = F, quali.sup = 7), axes = c(1, 2), repel = TRUE, habillage = 7)

Coordenadas Individuales [Subconjunto CS]

set.seed(780728)
data_61_HD <- heart_diseases_Dataset[sample(1:nrow(heart_diseases_Dataset),61),-c(2,3,7,9,11)]
set.seed(780728)
data_61 <- cbind(heart_diseases_Dataset[sample(1:nrow(heart_diseases_Dataset),61),-c(2,3,7,9,11,12)], data_61_HD$Clase_salida)
head(PCA(data_61, ncp = 6, scale.unit = T, graph = F, quali.sup = 7)$ind$coord, n = 61L)
##          Dim.1        Dim.2       Dim.3       Dim.4       Dim.5       Dim.6
## 1   0.55854136 -0.015910010  2.55820760 -0.23511977 -0.93029910 -1.45684946
## 2   1.13696122  0.054712778 -0.78132994 -0.95249261  1.11732238 -0.39405787
## 3  -1.52620507 -0.106554514 -0.15662412  1.02498076 -0.02252833 -0.21550983
## 4   0.44406833  2.384642044  0.12572117 -0.65472060 -2.12516548  0.44237233
## 5   1.40425851 -0.663404925 -0.51811628 -1.83571571  0.04924307 -0.32077657
## 6  -1.60406673 -0.371429541  0.59642586  0.13853442  0.63843117  0.59254226
## 7  -0.14583240  0.768092867 -0.84650985 -0.46672270 -0.60098248 -0.24494774
## 8  -0.47418483  0.082834291  0.05551959 -1.36212705 -0.52161261  0.67880454
## 9  -1.00259945 -1.619082122  0.30303647 -0.21473776 -0.08333087 -0.20905487
## 10  0.11605793  0.103431902 -0.73511408 -1.62320226 -1.19461724  0.58982899
## 11 -2.41836764  0.915732091  0.12688408  0.54838579 -0.63259375  0.83311552
## 12 -0.80896616  0.176442461  0.21576542 -0.66992953 -0.35083059  1.18913549
## 13  2.23546348 -2.633541989  1.31076163  0.43399177 -1.31529051  0.04908444
## 14 -1.29482427 -1.412528871  0.55102729  0.34392086  0.38775536  0.05018932
## 15 -0.82075189  0.368059423  0.33798096 -0.44367263  0.71548309  0.93310137
## 16  0.74182564 -0.164390756 -0.73596169 -0.93787347  0.25254014  0.08926713
## 17  0.27728830 -0.645326124  0.09180417  0.72665333  0.75583231  0.37085936
## 18  0.01526031  0.672166823  0.46496814 -0.58637446  0.70103646  1.25422167
## 19  0.75805337  0.110128262 -0.81117419 -1.46993462  0.04412278  0.22418287
## 20 -1.39060049 -0.721065453  0.67123118 -0.29111271  0.64250636  0.20487969
## 21 -1.93951953 -0.886761862  0.05795576  0.58531909 -0.46806205 -0.63129669
## 22  0.65984886  0.405535995 -0.64578650  0.23299686  1.07473784 -0.69874560
## 23  0.59032645 -1.533831556 -0.15728874  1.03523093 -0.36691333  0.86812888
## 24 -0.48442083 -1.293114316  0.02129009 -0.89419238  0.03124815 -0.26057307
## 25 -0.76301602  0.534559728 -0.38186530  0.18336419  0.39936093  0.16087822
## 26  0.46894593  1.813010422 -0.25225232 -0.74345713 -0.30667938  0.29924466
## 27 -0.65120803 -0.082099424  0.06894299  0.26614946  0.37515951  0.06758962
## 28 -0.28996053 -0.495342057 -0.21904876 -0.27526685  0.35198805  0.01123825
## 29 -2.23359595 -1.184207506  0.28010116 -0.07102325 -1.36361868 -0.18011047
## 30  0.11616013  1.747504992 -1.17327185 -0.01838953  0.01663929  0.54999472
## 31 -1.87635059 -0.994126993  0.28824563  0.04326530 -0.43841382 -0.25188799
## 32 -0.66780962  1.096042881 -0.72602777  0.61343576  0.80397740 -0.23373338
## 33  0.53836682  0.038682766  0.16760247 -1.00525987  1.54068274  0.91470026
## 34  0.83106567  1.227865019  0.17188471 -0.81281674 -1.63626735 -0.51093177
## 35  1.40098174 -0.485674407 -0.94843508 -1.01501678  0.96859366 -0.56327331
## 36  0.61796699 -0.246056639 -1.54810837 -0.64432964 -0.34761095 -1.92020423
## 37 -2.39362121 -1.656655898  0.73503478  0.37782089 -0.54740764 -0.19631137
## 38  1.48863356 -1.141826648 -0.43357676  1.13322684  0.46676564  0.19230755
## 39  1.67892095 -1.297810516 -0.23261688  0.59384402  0.81273251  0.36272741
## 40 -0.67903331  0.434718949  0.36567421 -0.15120207  0.06804151  0.25622615
## 41 -1.63250373 -3.085301434 -0.44663519  0.02818511  0.63679694 -0.42142955
## 42  0.97836636  2.445140846  3.17256984  0.60531984  0.14993696 -0.81035506
## 43 -0.70333619 -0.004349406 -0.19785640 -0.17291137  0.32742078  0.13411447
## 44  2.05160351  0.307933850  1.33527177 -0.96830790  1.56940682 -0.03928967
## 45  0.71470820  2.185972498  1.86716284  0.79983829  0.06040591 -0.63918440
## 46 -1.64815145 -0.884073369  0.28928473  0.10861140  0.14707816 -0.31585334
## 47  3.55750471  0.039227262 -0.81288499  1.41306953  0.17421551 -0.89264279
## 48 -1.17154123  0.693540388 -0.75281082 -0.11323964 -1.05430438 -0.01521446
## 49  0.54598398  0.091931221 -0.97591214 -0.68337004  0.05705810 -0.25043117
## 50 -0.59451677 -0.113403024  0.86715318 -0.29621670 -0.46893453  0.27006755
## 51  2.09483760 -1.615382089 -0.50233304  1.99164118  0.08283898  1.02360627
## 52 -0.17809752  0.668894607 -0.38172603 -0.22935159  0.65491521 -0.11399294
## 53 -1.77087364  0.103090232 -0.50535141  1.15550776 -0.39169039 -0.80831895
## 54 -1.52422644  2.451864644 -1.35383487  2.34170150  0.39875678 -0.69578652
## 55  0.08601282  0.138581216 -1.26378265 -0.64986948 -0.72038382 -0.80121489
## 56  2.59464758 -0.238455007  2.00551087 -0.16302103  0.40247856 -0.71760066
## 57 -0.83255171  0.215008949  1.15857700  0.25955909  1.14657166 -0.01296365
## 58 -0.42816162  2.918762552 -1.31448479  1.13590482  0.54484818  0.60882886
## 59  2.24311259 -0.724651338 -1.94065240  1.06529779 -1.11602118 -0.37008539
## 60  3.41479136 -0.473735232  0.49568429  1.30813645 -1.69783489  1.79186073
## 61 -0.41166939  1.595981065  0.99409331  0.15708485  0.13446445  0.17952906

Biplot de Variables y Registros [Subconjunto UR]

set.seed(780728)
data_61_HD <- heart_diseases_Dataset[sample(1:nrow(heart_diseases_Dataset),61),-c(2,3,7,9,11)]
set.seed(780728)
data_61 <- cbind(heart_diseases_Dataset[sample(1:nrow(heart_diseases_Dataset),61),-c(2,3,7,9,11,12)], data_61_HD$Clase_salida)
fviz_pca_biplot(PCA(data_61, ncp = 6, scale.unit = T, graph = F, quali.sup = 7), axes = c(1, 2), repel = T, habillage = 7)

Fase 3 [Correspondencias]

3.1. Objetivos

En términos generales, esta tercera etapa de estudio presentarÔ cÔlculos, visualizaciones e interpretaciones basadas en el conjunto de datos tratado en las fases 1 y 2. En esta fase, se utilizarÔ un enfoque de anÔlisis de correspondencias simples y múltiples aplicado a las variables cualitativas. Este anÔlisis incluirÔ la construcción de tablas de contingencia y tablas disyuntivas completas, así como la evaluación de las calidades de representación, contribuciones y las correspondientes interpretaciones. Es importante recordar que el conjunto de datos de trabajo estÔ descrito en la sección 2 y los fundamentos teóricos se encuentran en la sección 1.

3.2. Correspondencias Simples

Se sabe que el anÔlisis de correspondencias simple (ACS) busca representar en un espacio multidimensional reducido la relación existente entre las categorías de un par de variables categóricas. En este sentido, el ACS muestra las distancias entre los niveles de dos variables categóricas y, en consecuencia, ayuda a visualizar tablas de contingencia. AdemÔs, se establece que el número mÔximo de dimensiones que expliquen la asociación entre las variables fila y columna es igual a uno menos el menor número de categorías de alguna de las variables involucradas. Por lo tanto, el anÔlisis de correspondencias permite describir la proximidad existente entre los perfiles de los objetos observados.

El ACS, que basa sus cÔlculos en tablas de contingencia, puede extenderse a mÔs de dos variables categóricas, lo cual se conoce como anÔlisis de correspondencias múltiples (ACM), basado en una estructura llamada tabla disyuntiva completa.

Esta sección trata el anÔlisis de correspondencias simples basÔndose en pares de variables categóricas del conjunto de datos descrito.

Planteamiento del problema

A partir de las variables cualitativas del conjunto de datos descrito, se requiere desarrollar un anƔlisis de correspondencias simple. Este anƔlisis se basarƔ en tablas de contingencia y de frecuencias relativas, y se apoyarƔ en grƔficos de perfiles y de puntos superpuestos en el primer plano factorial.

Desarrollo del anƔlisis

Con base en la navegacion en pestaƱas esta nos permitira visualizar objetos matriciales y graficos que nos ayudaran a darle peso a la interpretacion del anƔlisis de correspondecias simples o binarias entre cada par de variables categoricas que mostraron mayor relevancia en el biplot de la seccion 2.5 del conjunto de datos: Sexo, Anginia_Ejerccio y Clase_salida. Por ser una baja cantidad de variables se trabajara con las parejas combinadas sin repeticion de estas tres variables.

La pestaña AC Parejas Totales agrupa los calculos para totas las combinaciones de parejas variables. En particular en Contingencias para darnos un ejemplo haremos una lectura de las tablas de contigencia: La tabla de contingencia Sexo vs. Angina_Ejercicio se encontro que 43 pacientes de un total de 193 del sexo femenino presentaron dolor anginoso a la hora realizar ejercicio; ademas, de los 546 pacientes que no presentaron dolor anginoso a la hora de hacer ejercicio 150 son del sexo femenino y 396 del sexo masculino, de un total de 917 pasientes. En la tabla de contingencia Sexo vs. Clase_salida se encontro que de un total de 724 pasientes del sexo masculino, 457 presentaron una salida con enfermedad cardiaca. ademas, de los 917 pasientes, 507 presentaron salida con enfermedad cardiaca y 410 con una salida normal. En la tabla de contingencia Angina_Ejercicio vs. Clase_salida se encontro que de los 371 que presentaron anginia a la hora de realizar ejercicio 316 pacientes tuvieron una salida con enfermedad cardiaca; ademas, de los 546 pasientes que no presentaron anginia solo 355 tuvieron una salida normal.

Si tomamos como base las tablas de contingencia antes mencionadas, se presenta a traves de una subpestañas la Probabilidades las proporciones relativas en terminos de los pares de variables que se examinaron con anterioridad. En concordancia con esto, a nivel de ejemplo se presenta algunas lecturas de los resultados: en la tabla de probabilidades sexo vs. Angina_Ejercicio el \(40,46\) \(%\) aproximadamente presento angina por ejercicio de los cuales el \(35,77\) \(%\) aproximadamente son de sexo masculino; ademas, encontramos que el \(78,95\) \(%\) aproximadamente son pasientes del sexo masculino en el conjunto de datos, en la tabla de probabiidades Sexo vs. Clase_salida se encontro que de un \(55,26\) \(%\) aproximadamente el \(49,94\) \(%\) son de sexo masculino; ademas, el \(78,95\) \(%\) de los pasientes son de sexo masculino, la tabla de probabilidades Angina_Ejercicio vs. Clase_salida se encontro que el \(40,46\) \(%\) de los pacientes tuvo angina por ejercicio adicional a ello \(34,46\) \(%\) son de sexo masculino.

De la misma forma que ocurrio con las tablas de probabilidades, en la subpestaña Frecuencias [CPF y CPC] las frecuencias condicionadas por filas y columnas de manera respectiva, se calcularon con base en las tablas de contingencia Siguiendo con esto mismo se hara una lectora como ejemplo de los resultados: segun la matriz de frecuencias CPF de Sexo vs. Angina_Ejercicio el \(77,72\) \(%\) de los pacientes de sexo femenino no muestras angina por ejercicio mientras que el \(22,28\) \(%\) si la presenta, en el caso de los pacientes de sexo masculino el \(54,7\) \(%\) no la presenta y el \(45,30\) \(%\) si presenta angina por ejercicio; por otro lado en la CPC tenemos a los pacientes de sexo masuculino que presentan un \(88,41\) \(%\) de presentar anginia por ejercicio; por otro lado el \(77,53\) \(%\) de los pacientes que no presentan angina por ejercicio son de sexo masculino y el \(27,47\) \(%\) son de sexo femenino, ahora en le caso de los pacientes que la presentan el \(88,41\) \(%\) son de sexo masculino, esto nos indica que hay mas prevalencia de sufir de angina por ejercicio segun el sexo del paciente, segun la matriz de frecuencias CPF Sexo vs. Clase_salida en cuanto a pacientes de sexo masuculino el \(63,12\) \(%\) presentaron una salida con enfermedad cardiaca, el caso de los pacientes de sexo femenino el \(74,09\) \(%\) presentaron una salida normal; por otro lado en la CPC tenemos que el \(90,14\) \(%\) de los pacientes que salieron con enferdad cardiaca fueron de sexo masculino y para el sexo femenino el \(34,88\) \(%\) tuvo una salida normal, segun la matriz de frecuencias CPF de Angina_Ejercicio vs. Clase_salida el \(85,18\) \(%\) de los que presentaron angina por ejercicio y presentaron una salida con enfermedad cardiaca, y el \(65,02\) \(%\) de los que no presentaron angina por ejercicio y tuvieron una salida normal, por otro lado la CPC tenemos que de los que tuvieron una clase de salida con enfermedad cardiaca el \(62,33\) \(%\) presento angina por ejercicio mientras que el \(37,67\) \(%\) que tuvo esta salida no presento angina por ejercicio.

Con base en las matrices de frecuencia se entienden los perfiles condicionados por filas y columnas que se muestran en la subpestaƱa Perfiles [CPF y CPC]. Los graficos de perfiles se muestran en el mismo orden de lo anteriormente mensionado. Sin embargo, en los graficos de perfiles se pueden cotejar las proporciones contra un individuo promedio o un perfil promedio el cual se va a etiquetar como marg. Con esto dicho, los perfiles fila y columna que corresponden a las variables Sexo y Angina_Ejercicio muestran ua distribucion marginal un poco alejadas entre si; es decir, si son calculadas las proporciones totales seran un poco distintas entre si, por ejemplo: (Perfiles Fila) la proporcion de pacientes de sexo masculino y femenino que si presentaron angina por ejercicio son \(22,47\) \(%\) y \(45,30\) \(%\) respectivamente; ademas, (perfiles columna) la proporcion de pasientes de sexo masculino que no presentaron y si presentaron angina por ejercicio son \(72,53\) \(%\) y \(88,41\) \(%\) respectivamente. De la misma forma, los perfiles fila y columna que corresponden con las variables Sexo y Clase_salida muestran una distribucion marginal un poco alejadas entre si, por ejemplo: (perfiles fila) las proporciones de pasientes de sexo masculino y femenino que presentaron una salida con enfermedad cardiaca son \(63,12\) \(%\) y \(25,91\) \(%\) de manera respectiva; ademas, (Perfiles Columna) la proporcion de pacientes de sexo masculino que presentaron una clase de salida por enfermedad cardiaca y normal es \(90,14\) \(%\) y \(65,12\) \(%\) de manera respectiva, de la misma forma los perfiles fila y columna que corresponden con las variables Angina_Ejercicio y Clase_salida muestran una distribucion marginal un poco alejadas entre si, por ejemplo: (Perfiles Fila) las proporciones de pasientes que presentaron y no presentaron angina por ejercicio y tubieron una salida con enfermedad cardiaca son \(85,18\) \(%\) y \(34,98\) \(%\) de manera respectiva, ademas, (perfiles Columna) la proporcion de pasientes que si presentaron angina por ejercicio y tuvieron una salida con enfermedad cardiaca y normal son \(62,33\) \(%\) y \(13,41\) \(%\) respectivamente.

Con base en las descripciones hechas es posible anticipar que los pares de variables categoricas Sexo vs Clase_salida y Angina_Ejercicio vs Clase_salida sean independientes. Este conclucion se apoya en los resultados de la prueba de hipótesis visualizada a través de la subpestaña con ese mismo nombre. Para estas prubebas a un nivel de significancia \(\alpha = 0.05\), las hipótesis formuladas fueron:\[H_0: \text {Las variables categóricas son independientes}\] \[H_1: \text {las variables categóricas son dependientes}\] De la misma forma, el par de variables que tuvo a favor de a dependencia fueron Angina_Ejercicio y Clase_salida, en esta prueba \(p-valor\) resultó menor o igual que el nivel de significancia y, comparativamente, el valor del estadístico \(\chi^2\) fue grande. Por lo tanto, el par de variables que continuaron en anÔlisis fueron estas últimas.

A través de la pestaña AC Pareja Única se despliegan las subpestañas relacionadas con el anÔlisis de correspondencias entre las variables seleccionadas. En la sección de Contingencias y Residuales [ANG-CS] (donde ANG representa Angina_Ejercicio y CS Clase_salida) se pueden visualizar las tablas de contingencia, valores esperados y residuales de la pareja de variables en curso. En las dos primeras tablas, se observa que el recuento observado y el recuento esperado bajo la hipótesis nula son significativamente diferentes, lo que refuerza la dependencia entre las variables. El rango_observado representa los recuentos asociados con cada categoría de datos, mientras que el rango_esperado indica los recuentos esperados bajo la hipótesis nula. AdemÔs, el anÔlisis de residuales de Pearson y estandarizados muestra que las mayores desviaciones respecto a los valores esperados ocurren entre las universidades de cinco, cuatro, dos y una estrella. En la subpestaña Contribuciones [ANG-CS], se puede apreciar que el valor de aquellos que no presentaron Angina_ejercicio es mÔs bajo en comparación con los que sí la presentaron; sin embargo, los valores no estÔn muy alejados en general, lo que indica que ambos grupos aportan una contribución significativa al comportamiento del conjunto de datos.

Por ultimo, el resultado que sera definitivo del analisis de correspondencias simples se muestra en la subpestaƱa Correspondecias Simples Unidimencionales [ANG-CS]. En este apartado se establece qeu solo una dimension absorbe toda la variabilidad de la pareja, por lo que la representacion bidimensional en le plano de factores es imposible de realizar. Sin embargo, es posible hacer una interpretacion unidimensional de los resultados obtenidos. Al ser requeridas las variables de soporte del AC, primero por columnas y luego por filas, las coordenadas proyectadas de la variable Clase_salida en relacion con las categoria normal se presenta en el lado positivo del eje, mientras tanto la categoria enfermedad cardiaca se encuentra en lado negativo del eje, Asi mismo presentando una mayor contribucion la categoria normal, aunque cabe recalcar que la categoria enfermedad cardiaca tambien presenta una buena contribucion pero es menor a la otra categoria es decir son bastante equilibradas, ademas, es determinante que la calidad de representacion alcanza el maximo con cada una de las variables. Un comportamiento semenjante a lo mensionado de manera anterior se puede apreciar con la variable fila Angina_ejercicio su calidad de representacion es maxima, las coordenadas de sus categorias se interponen en el eje unidimensional y sus contribuciones son bastante equilibradas. De lo mencionado se puede interpretar que presenta asociacion relevante, positiva y negativa entre filas y columnas, las cotegorias (de las respectivas variables) Sin angina por ejercicio con salida normal y con angina por ejercicio con enfermedad cardiaca

AC Parejas Totales

Contingencias

addmargins(table(heart_diseases_Dataset$Sexo, heart_diseases_Dataset$Angina_Ejercicio))
##      
##         N   Y Sum
##   F   150  43 193
##   M   396 328 724
##   Sum 546 371 917
addmargins(table(heart_diseases_Dataset$Sexo, heart_diseases_Dataset$Clase_salida))
##      
##       Enfermedad cardiaca Normal Sum
##   F                    50    143 193
##   M                   457    267 724
##   Sum                 507    410 917
addmargins(table(heart_diseases_Dataset$Angina_Ejercicio, heart_diseases_Dataset$Clase_salida))
##      
##       Enfermedad cardiaca Normal Sum
##   N                   191    355 546
##   Y                   316     55 371
##   Sum                 507    410 917

Probabilidades

addmargins(prop.table(table(heart_diseases_Dataset$Sexo, heart_diseases_Dataset$Angina_Ejercicio))*100)
##      
##                N          Y        Sum
##   F    16.357688   4.689204  21.046892
##   M    43.184297  35.768811  78.953108
##   Sum  59.541985  40.458015 100.000000
addmargins(prop.table(table(heart_diseases_Dataset$Sexo, heart_diseases_Dataset$Clase_salida))*100)
##      
##       Enfermedad cardiaca     Normal        Sum
##   F              5.452563  15.594329  21.046892
##   M             49.836423  29.116685  78.953108
##   Sum           55.288986  44.711014 100.000000
addmargins(prop.table(table(heart_diseases_Dataset$Angina_Ejercicio, heart_diseases_Dataset$Clase_salida))*100)
##      
##       Enfermedad cardiaca     Normal        Sum
##   N             20.828790  38.713195  59.541985
##   Y             34.460196   5.997819  40.458015
##   Sum           55.288986  44.711014 100.000000

Frecuencias [CPF y CPC]

round(addmargins(prop.table(table(heart_diseases_Dataset$Sexo, heart_diseases_Dataset$Angina_Ejercicio), 1)*100, 2), 2)
##    
##          N      Y    Sum
##   F  77.72  22.28 100.00
##   M  54.70  45.30 100.00
round(addmargins(prop.table(table(heart_diseases_Dataset$Sexo, heart_diseases_Dataset$Angina_Ejercicio), 2)*100, 1), 2)
##      
##            N      Y
##   F    27.47  11.59
##   M    72.53  88.41
##   Sum 100.00 100.00
round(addmargins(prop.table(table(heart_diseases_Dataset$Sexo, heart_diseases_Dataset$Clase_salida), 1)*100, 2), 2)
##    
##     Enfermedad cardiaca Normal    Sum
##   F               25.91  74.09 100.00
##   M               63.12  36.88 100.00
round(addmargins(prop.table(table(heart_diseases_Dataset$Sexo, heart_diseases_Dataset$Clase_salida), 2)*100, 1), 2)
##      
##       Enfermedad cardiaca Normal
##   F                  9.86  34.88
##   M                 90.14  65.12
##   Sum              100.00 100.00
round(addmargins(prop.table(table(heart_diseases_Dataset$Angina_Ejercicio, heart_diseases_Dataset$Clase_salida), 1)*100, 2), 2)
##    
##     Enfermedad cardiaca Normal    Sum
##   N               34.98  65.02 100.00
##   Y               85.18  14.82 100.00
round(addmargins(prop.table(table(heart_diseases_Dataset$Angina_Ejercicio, heart_diseases_Dataset$Clase_salida), 2)*100, 1), 2)
##      
##       Enfermedad cardiaca Normal
##   N                 37.67  86.59
##   Y                 62.33  13.41
##   Sum              100.00 100.00

Perfiles [CPF y CPC]

plotct(table(heart_diseases_Dataset$Sexo, heart_diseases_Dataset$Angina_Ejercicio),"row")

plotct(table(heart_diseases_Dataset$Sexo, heart_diseases_Dataset$Angina_Ejercicio),"col")

plotct(table(heart_diseases_Dataset$Sexo, heart_diseases_Dataset$Clase_salida),"row")

plotct(table(heart_diseases_Dataset$Sexo, heart_diseases_Dataset$Clase_salida),"col")

plotct(table(heart_diseases_Dataset$Angina_Ejercicio, heart_diseases_Dataset$Clase_salida),"row")

plotct(table(heart_diseases_Dataset$Angina_Ejercicio, heart_diseases_Dataset$Clase_salida),"col")

Pruebas de Hipótesis

chisq.test(table(heart_diseases_Dataset$Sexo, heart_diseases_Dataset$Angina_Ejercicio))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(heart_diseases_Dataset$Sexo, heart_diseases_Dataset$Angina_Ejercicio)
## X-squared = 32.583, df = 1, p-value = 1.142e-08
chisq.test(table(heart_diseases_Dataset$Sexo, heart_diseases_Dataset$Clase_salida))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(heart_diseases_Dataset$Sexo, heart_diseases_Dataset$Clase_salida)
## X-squared = 83.871, df = 1, p-value < 2.2e-16
chisq.test(table(heart_diseases_Dataset$Angina_Ejercicio, heart_diseases_Dataset$Clase_salida))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(heart_diseases_Dataset$Angina_Ejercicio, heart_diseases_Dataset$Clase_salida)
## X-squared = 223.11, df = 1, p-value < 2.2e-16

AC Pareja Única

Contingencias y Residuales [AGE-CS]

chisq.test(table(heart_diseases_Dataset$Angina_Ejercicio, heart_diseases_Dataset$Clase_salida))$observed
##    
##     Enfermedad cardiaca Normal
##   N                 191    355
##   Y                 316     55
chisq.test(table(heart_diseases_Dataset$Angina_Ejercicio, heart_diseases_Dataset$Clase_salida))$expected 
##    
##     Enfermedad cardiaca   Normal
##   N            301.8779 244.1221
##   Y            205.1221 165.8779
chisq.test(table(heart_diseases_Dataset$Angina_Ejercicio, heart_diseases_Dataset$Clase_salida))$residuals
##    
##     Enfermedad cardiaca    Normal
##   N           -6.381595  7.096452
##   Y            7.741740 -8.608959
chisq.test(table(heart_diseases_Dataset$Angina_Ejercicio, heart_diseases_Dataset$Clase_salida))$stdres
##    
##     Enfermedad cardiaca    Normal
##   N           -15.00444  15.00444
##   Y            15.00444 -15.00444

Contribuciones [ANG-CS]

chisq.test(table(heart_diseases_Dataset$Angina_Ejercicio, heart_diseases_Dataset$Clase_salida))$residuals^2/chisq.test(table(heart_diseases_Dataset$Angina_Ejercicio, heart_diseases_Dataset$Clase_salida))$statistic*100
##    
##     Enfermedad cardiaca   Normal
##   N            18.25344 22.57194
##   Y            26.86356 33.21908

Correspondencia Simple Unidimensional [ANG-CS]

CA(table(heart_diseases_Dataset$Angina_Ejercicio, heart_diseases_Dataset$Clase_salida), graph = FALSE)$eig
##       eigenvalue percentage of variance cumulative percentage of variance
## dim 1  0.2455105                    100                               100
CA(table(heart_diseases_Dataset$Angina_Ejercicio, heart_diseases_Dataset$Clase_salida), graph = FALSE)$col
## $coord
##                           [,1]
## Enfermedad cardiaca -0.4455772
## Normal               0.5509942
## 
## $contrib
##                         [,1]
## Enfermedad cardiaca 44.71101
## Normal              55.28899
## 
## $cos2
##                     [,1]
## Enfermedad cardiaca    1
## Normal                 1
## 
## $inertia
## [1] 0.1097702 0.1357402
CA(table(heart_diseases_Dataset$Angina_Ejercicio, heart_diseases_Dataset$Clase_salida), graph = FALSE)$row
## $coord
##          N          Y 
##  0.4084375 -0.6010967 
## 
## $contrib
##        N        Y 
## 40.45802 59.54198 
## 
## $cos2
## N Y 
## 1 1 
## 
## $inertia
## [1] 0.09932866 0.14618180

3.3. Correspondecias MĆŗltiples

Se afirma que el AnÔlisis de Correspondencias Simples (ACS) puede ampliarse desde tablas de contingencia hacia tablas disyuntivas completas. En estas últimas, las filas representan objetos a los que se les registran características de interés a través de las columnas, que recopilan las modalidades de las variables categóricas estudiadas. De esta manera, el AnÔlisis de Correspondencias Múltiple (ACM) es el ACS aplicado a una tabla disyuntiva completa. Por lo tanto, en el ACM, una variable categórica asigna a cada objeto de una población una modalidad específica, dividiéndolos de manera exclusiva y exhaustiva.

Esta sección se desarrolla como una alternativa para completar el anÔlisis de correspondencias simples, que resultó insuficiente debido a la unidimensionalidad en la representación de los datos al proyectar las variables categóricas que cumplían con la hipótesis de dependencia. Por lo tanto, se espera que el tratamiento conjunto de todas las variables categóricas proporcione una representación en el primer plano factorial.

Planteamiento del Problema

Con base en las variables cualitativas del conjunto de datos descrito, se requiere desarrollar un anÔlisis de correspondencias múltiples (ACM) para lograr una representación grÔfica en el primer plano factorial, ya que esto no fue posible mediante el anÔlisis de correspondencias simple (ACS).

El ACM permitirÔ analizar conjuntamente todas las variables categóricas del conjunto de datos, proporcionando una representación mÔs completa y multidimensional. Se utilizarÔn tablas disyuntivas completas para este anÔlisis y se generarÔn grÔficos que representen los perfiles y puntos superpuestos en el primer plano factorial, facilitando así una interpretación mÔs clara y detallada de las relaciones entre las variables categóricas y los objetos estudiados.

Desarrollo del AnƔlisis

Con base en la navegacion a través de pestañas se permitira visualizar objetos matriciales y graficos que ayuden a desarrollar e interpretar los resultados del anÔlisis de correspondecias múltiples (ACM) entre las variables categoricas del conjunto de datos.

La pestaƱa ACM muestra la multidimencionalidad que se esperaba,comparada con la unidimensional del ACS de la fase 3 al trabajar de manera conjunta con las 6 variables categoricas del conjunto de datos: Sexo, Tipo_dolor_pecho, ECG_reposo, Angina_Ejercicio, Pendi_Segme_ST_Ejercicio y Clase_salida. Muestran ademas que las dimensiones del plan principal explican el \(37,59\) \(%\) del conjunto (sera este plano que se continuara con las interpretaciones del ACM). Ademas, la evidente baja de concentracion de absorcion de varianza por parte de algunas dimensiones se vera reflejado en las distacias de los perfiles de las variables categoricas.

En la pestaña Biplot ACM se mostraran las semenjazas de los perfiles de los pacientes de manera grafica por este motivo a partir de este se creo el Biplot ACM [Reducido] que facilitara la comprension de los resultados, en concordancia con esto los puntos azules sobrepuestos indican coordenadas de convergencia y las asociaciones entre algunas categorias de las variables y conjuntos de pasientes. Cabe reclacar que las sememjanzas entre categorias de variables estan representadas por sus coordenadas respecto a los semiejes dimensionales, mas que por la proximidad de estos entre si, esto concuerda con los resultados obtenidos en la fase 3. Por ejemplo, en semejanza a nivel de las categorias de las variables destacan los grupos: observaciones numeradas en el lado derecho del grÔfico, cercanas a modalidades como angina típica y Angina_Ejersicio_N, sugieren que estas observaciones tienen características relacionadas con estas modalidades. Por otro lado, observaciones numeradas en el lado izquierdo del grÔfico, cercanas a modalidades como Enfermedad cardíaca y ECG en reposo_LVH, indican una asociación con estas condiciones. En general se pueden visualizar facilmente las asociaciones entre las categorias de las variables y los grupos de pacientes afines a estas.

Seguidamente, la pestaƱa Calidad de Representacion muestra que las categorias de la variable Clase_salida fueron las mejores representadas, en posicion a las categorias desendentes de la variable Pendi_Segme_ST_Ejercicio. El resto quedo en un rango en un rango bajo-alto de calidad de representacion. Como la calidad de representacion en subespacios de dimensiones reducidas se mide en porcentajes de inercia con repecto al total del acercania de un punto repecto al origen del plano factorial indica una baja representacion en el, de manera complementaria la matriz de calidad de representaciones evidencia numerica de las contribuciones de cada dimension tomando como ejemplo la 1 teniendo la contribucion mas alta de \(0,73\).

Tambien de manera complementaria, la pestaƱa Contribuciones muestra que para las dimenciones del primer plano factorial, y en concordancia con lo antes mencionado la categoria de la variable Clase_salida: normal y enfermedad cardiaca quedan por encima de la linea media de la primera dimension, pero de manera particular, la categoria de Tipo_dolor_pecho: angina atipica se encuentra un poco mas arriba de la linea media en las dos primeras dimenciones, cosa que no ocurre con la primera variable mencionada, En ese sentido en la pestaƱa Biplot con contribuciones se visualiza una representacion en el primer plano factorial semejante a la obtenida en la pestaƱa Calidad de Representaciones.

ACM

round(MCA(heart_diseases_Dataset[1:917, -c(1,4,5,6,8,10)], graph = FALSE)$eig,2)
##        eigenvalue percentage of variance cumulative percentage of variance
## dim 1        0.44                  26.22                             26.22
## dim 2        0.19                  11.37                             37.59
## dim 3        0.17                  10.36                             47.96
## dim 4        0.16                   9.89                             57.85
## dim 5        0.16                   9.67                             67.52
## dim 6        0.16                   9.43                             76.96
## dim 7        0.14                   8.41                             85.36
## dim 8        0.10                   5.93                             91.30
## dim 9        0.09                   5.44                             96.74
## dim 10       0.05                   3.26                            100.00

Biplot ACM

fviz_mca_biplot(MCA(heart_diseases_Dataset[1:917, -c(1,4,5,6,8,10)], graph = FALSE), repel = TRUE)

Biplot ACM [Reducido]

set.seed(780728)
fviz_mca_biplot(MCA(heart_diseases_Dataset[sample(1:nrow(heart_diseases_Dataset),150), -c(1,4,5,6,8,10)], graph = FALSE), repel = TRUE)

Calidad de Representación

fviz_mca_var(MCA(heart_diseases_Dataset[1:917, -c(1,4,5,6,8,10)], graph = FALSE), col.var ="cos2", gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), repel = TRUE)

MCA(heart_diseases_Dataset[1:917, -c(1,4,5,6,8,10)], graph = FALSE)$var$cos2
##                                         Dim 1        Dim 2        Dim 3
## F                                0.1733053996 1.165236e-02 0.0450171827
## M                                0.1733053996 1.165236e-02 0.0450171827
## angina atipica                   0.3238946018 1.553950e-01 0.0746789380
## angina tipica                    0.0075263309 3.360387e-01 0.0814224737
## asintomatico                     0.4855875046 3.194743e-02 0.0070496922
## dolor no anginoso                0.0649938918 7.937301e-02 0.2593093186
## ECG_reposo_LVH                   0.0004140751 5.260410e-01 0.0116631482
## ECG_reposo_Normal                0.0266934484 2.467054e-01 0.0676042458
## ECG_reposo_ST                    0.0329513132 1.570603e-02 0.1867725248
## Angina_Ejercicio.N               0.5431374271 1.483601e-02 0.0002465765
## Angina_Ejercicio.Y               0.5431374271 1.483601e-02 0.0002465765
## ascendente                       0.5902330512 1.426892e-02 0.0201714935
## descendente                      0.0406801756 5.519248e-02 0.3723242915
## plano                            0.4340536342 3.011041e-07 0.2019123077
## Clase_salida_Enfermedad cardiaca 0.7337250662 9.484742e-05 0.0019903810
## Clase_salida_Normal              0.7337250662 9.484742e-05 0.0019903810
##                                         Dim 4        Dim 5
## F                                0.0001932359 0.0037435604
## M                                0.0001932359 0.0037435604
## angina atipica                   0.0384898912 0.0138189370
## angina tipica                    0.3538838909 0.0180390268
## asintomatico                     0.0062927454 0.0268773726
## dolor no anginoso                0.3527293847 0.0563399087
## ECG_reposo_LVH                   0.0005794692 0.0306929063
## ECG_reposo_Normal                0.0350302800 0.2720974461
## ECG_reposo_ST                    0.0429200170 0.6801257328
## Angina_Ejercicio.N               0.0083368055 0.0052494001
## Angina_Ejercicio.Y               0.0083368055 0.0052494001
## ascendente                       0.0019596869 0.0025643025
## descendente                      0.2501756081 0.1893266477
## plano                            0.0881365118 0.0288905904
## Clase_salida_Enfermedad cardiaca 0.0081818339 0.0005200968
## Clase_salida_Normal              0.0081818339 0.0005200968

Contribuciones

fviz_contrib(MCA(heart_diseases_Dataset[1:917, -c(1,4,5,6,8,10)], graph = FALSE), choice = "var", axes = 1, top = 15)

fviz_contrib(MCA(heart_diseases_Dataset[1:917, -c(1,4,5,6,8,10)], graph = FALSE), choice = "var", axes = 2, top = 15)

fviz_contrib(MCA(heart_diseases_Dataset[1:917, -c(1,4,5,6,8,10)], graph = FALSE), choice = "var", axes = 3, top = 15)

fviz_contrib(MCA(heart_diseases_Dataset[1:917, -c(1,4,5,6,8,10)], graph = FALSE), choice = "var", axes = 4, top = 15)

fviz_contrib(MCA(heart_diseases_Dataset[1:917, -c(1,4,5,6,8,10)], graph = FALSE), choice = "var", axes = 5, top = 15)

Biplot con Contribuciones

fviz_mca_var(MCA(heart_diseases_Dataset[1:917, -c(1,4,5,6,8,10)], graph = FALSE), col.var ="contrib", gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), repel = TRUE)

Fase 4 [AnÔlisis de Regresión]

4.1. Objetivos

En términos generales, este estudio explorarÔ la relación entre dos o mÔs variables mediante la obtención de información sobre una de ellas basada en el conocimiento de los valores de las demÔs. La relación establecida entre ellas serÔ de naturaleza no determinística, es decir, se formularÔn relaciones probabilísticas y se desarrollarÔn procedimientos para hacer inferencias sobre los modelos utilizados en este estudio, al mismo tiempo que se obtienen medidas cuantitativas del grado de relación entre las variables. Los modelos analizados pueden considerarse casos especiales del modelo lineal generalizado: Regresión Lineal Simple, Regresión Lineal Múltiple y Regresión Logística. En cada sección se describirÔ teóricamente cada modelo y se aplicarÔ a un conjunto de datos específico. Se reconoce que el anÔlisis de regresión es un proceso de naturaleza estadística utilizado para estimar relaciones entre variables (una dependiente o de respuesta y otras independientes o predictoras) mediante técnicas de modelado y anÔlisis que permiten comprender cómo varía el valor de la variable dependiente al cambiar el valor de una o mÔs variables independientes. Los modelos de anÔlisis de regresión estudiados en este documento serÔn: lineal (simple y múltiple) y logístico, todos ellos entendidos como casos del modelo de regresión lineal generalizado.

4.2. Regresión Lineal Simple

Este modelo, que eventualmente serÔ llamado en este estudio como RLS, estÔ conformado por dos variables estadísticas \(x\) y \(Y\), donde \(Y\) se asume que estÔ influida por \(x\). La relación estÔ dada matemÔticamente por: \[Y = \beta_0 + \beta_1 x + \varepsilon \hspace{10mm} \hspace{10mm}(1)\] donde:

  • \(Y\): es una variable de respuesta de naturaleza aleatoria.
  • \(x\): es una variable predictora de naturaleza no aleatoria.
  • \(\varepsilon\): es una variable aleatoria no observable.
  • \(\beta_0\) y \(\beta_1\): son parĆ”metros reales desconocidos del modelo.

En comparación con el modelo lineal simple determinístico \(y = \beta_0 + \beta_1 x\), el probablístico supone que el valor esperado de \(Y\) es una función lineal de \(x\), pero que con \(x\) fija, la variable \(Y\) difiere de su valor esperado en una cantidad aleatoria \(\varepsilon\). AdemÔs, la cantidad \(\varepsilon\) en la ecuación de modelo \((1)\) se supone normalmente distribuida con \(E(\varepsilon)=0\) y \(V(\varepsilon)=\sigma^2\). La variable aleatoria \(\varepsilon\) también se conoce como término de error aleatorio o desviación aleatoria en el modelo.

Complementariamente, casi nunca serÔn conocidos los valores \(\beta_0\), \(\beta_1\) y \(\sigma^2\), a cambio estarÔ disponible una muestra de datos compuesta de pares ordenados \((x_1,y_1)... (x_n,y_n)\) con la que los parÔmetros del modelo y la línea de regresión verdadera pueden ser estimados, bajo el supuesto de independencia de las observaciones. Así, \(y_i\) es el valor observado de una variable aleatoria \(Y_i\), donde \(Y_i=\beta_0+\beta_1x_i+\varepsilon_i\) y las \(n\) desviaciones \(\varepsilon_1\), \(\varepsilon_2\), \(...\), \(\varepsilon_n\) son variables independientes.

De acuerdo con el modelo, los puntos observados estarÔn distribuidos aleatoriamente alrededor de la línea de regresión verdadera. En este sentido, la estimación de \(y=\beta_0+\beta_1x\) deberÔ ser una línea que se ajuste lo mejor posible a los puntos muestra. Tal línea deberÔ poseer la característica de que las distancias verticales (desviaciones) de los puntos observados a la línea misma son pequeñas. La medida de la bondad de ajuste serÔ la suma de los cuadrados de estas desviaciones. En consecuencia, la línea que mejor se ajusta serÔ la que tenga la suma mÔs pequeña posible de desviaciones al cuadrado. El resultado que implica las ideas expuestas se conoce como: principio de los mínimos cuadrados y se remonta a los matemÔticos Carl Friedrich Gauss y Adrien-Marie Legendre, entre el último lustro del siglo XVIII y el primero del siglo XIX.

El principio de los mínimos cuadrados establece que la desviación vertical del punto \((x_i,y_i)\) con respecto a la línea \(y=b_0+b_1x\) es \(y_i-(b_0+b_1x)\) y la suma de las desviaciones verticales al cuadrado de los puntos \((x_i,y_i)\) a la línea es \(f(b_0,b_1)=\sum_{i=1}^n (y_i-(b_0+b_1x_i))^2\). Así, las estimaciones puntuales de \(\beta_0\) y \(\beta_1\), representadas como \(\hat{\beta}_0\) y \(\hat{\beta}_1\) y llamadas estimaciones de mínimos cuadrados, son los valores que minimizan a \(f(b_0,b_1)\); es decir, \(f(\hat{\beta}_0,\hat{\beta}_1)\leq f(b_0,b_1)\) para cualesquiera \(\beta_0\) y \(\beta_1\). Por lo tanto, la línea de regresión estimada o línea de mínimos cuadrados es \(y=\hat{\beta}_0+\hat{\beta}_1x\).

Luego de calcular y resolver las ecuaciones en derivadas parciales de \(f(b_0,b_1)\) respecto a \(b_0\) y \(b_1\) igualadas a cero, se obtiene un sistemas de ecuaciones llamadas normales que son lineales en \(b_0\) y \(b_1\) y para las cuales, siempre que por lo menos dos de las \(x_i\) sean diferentes, las estimaciones de los mínimos cuadrados son la única solución del sistema. En consecuencia, la estimación de los mínimos cuadrados de \(\beta_1\) de la línea de regresión verdadera es: \[\hat{\beta}_1=\dfrac{\sum_{i=1}^n(x_i-\bar{x})(y_i-\bar{y})}{\sum_{i=1}^n(x_i-\bar{x})^2}=\dfrac{S_{xy}}{S_{xx}}\hspace{10mm}(2)\] y la estimación de los mínimos cuadrados de \(\beta_0\) de la línea de regresión verdadera es: \[\hat{\beta}_0=\dfrac{\sum_{i=1}^ny_i-\hat{\beta}_1\sum_{i=1}^nx_i}{n}=\bar{y}-\hat{\beta}_1\bar{x}\hspace{10mm}(3)\] Para hacer los cÔlculos que las ecuaciones anteriores demandan es necesario reducir al mínimo los efectos de redondeo. También, antes de calcular \(\hat{\beta}_1\) y \(\hat{\beta}_0\) se debe examir grÔficamente el conjunto de datos por usar para percibir la factibilidad de uso de un modelo probabilístico lineal, es decir, si grÔficamente los puntos estÔn lejos de tender a aglomerarse en torno a una línea recta con aproximadamente el mismo grado de dispersión de todas las \(x_i\), entonces deben ser indagados otros modelos.

Es indispensable mencionar que la línea de mínimos cuadrados debe usarse restringidamente para predecir valores de \(x\) lejanos del rango de los datos, porque la relación ajustada puede carecer de validez para ellos.

Ahora, el parÔmetro \(\sigma^2\) que determina la cantidad de variabilidad es inherente en el modelo de regresión descrito: su valor conducirÔ a establecer que los valores observados estarÔn dispersos en mayor o menor medida en torno a la línea de regresión verdadera. Así, los residuos \(y_i - \hat{y_i}\) son las desviaciones verticales con respecto a la línea estimada. Si todos los residuos son pequeños comparados con cero, entonces la variabilidad de los valores \(y\) observados se debería en una elevada medida a la relación lineal entre \(x\) y \(y\), mientras que si los residuos son grandes comparados con cero, entonces queda sugerida una variabilidad inherente en \(y\) con respecto a la cantidad debida a la relación lineal. Así, la estimación de \(\sigma^2\) en un anÔlisis de regresión estÔ basada en el cÔlculo de la suma de cuadrados residuales (o suma de cuadrados del error SCE) que se reduce a: \[SCE=\sum_{i=1}^ny_i^2-\hat{\beta}_0\sum_{i=1}^ny_i-\hat{\beta}_1\sum_{i=1}^nx_iy_i\hspace{10mm}(4)\] \[\hat\sigma^2=s^2=\dfrac{SCE}{n-2}\hspace{10mm}(5)\] Si se ha entendido que la cantidad SCE establece una medida de cuÔnta variación de \(y\) es inexplicada por el modelo; es decir, sin atribución a la relación lineal, se entenderÔ también que existe otra cantidad llamada la suma total de los cuadrados STC, que permite obtener una medida de la cantidad de variación total en los valores \(y\) observados: \[STC=\sum_{i=1}^ny_i^2-\frac{(\sum_{i=1}^ny_i)^2}{n}\hspace{10mm}(6)\] Si se formula la razón \(SCE/STC\) se calcula la proporción de variación total inexplicada por el modelo de regresión lineal simple; por lo tanto, se llega a la definición del coeficiente de determinación \(r^2\): \[r^2=1-\frac{SCE}{STC}\hspace{10mm}(7)\] que se interpreta como la proporción de variación \(y\) observada que puede ser explicada por el modelo de regresión lineal simple; es decir, aquella atribuida a una relación lineal aproximada entre \(x\) y \(y\): mientras mÔs cercano a 1 sea \(r^2\), mÔs exitoso es el modelo de regresión lineal simple al explicar la variación de \(y\). Una forma alternativa de calcular el coeficiente de determinación se basa en la suma de cuadrados debidad a la regresión SCR (o al modelo de regresión SCM), que es la cantidad de variación total que es explicada por el modelo. Con base en ella el coeficiente de determinación se expresa como: \[r^2=1-\frac{SCE}{STC}=\frac{STC-SCE}{STC}=\frac{SCR}{STC}\hspace{10mm}(8)\]Como se sabe, cualquier cantidad calculada a partir de datos muestrales varía de una cantidad a otra, en este sentido, los procedimientos inferenciales estandarizan un estimador restando su valor medio y luego dividiéndolo entre su desviación estÔndar estimada. En particular, para un modelo supuesto de regresión lineal simple se implica que las variables estÔndares: \(t_{(n-2)}=\dfrac{\hat{\beta}_0-\beta_0}{\hat{\sigma} \sqrt{1/n+\bar{x}^2/S_{xx}}}\) y \(t_{(n-2)}=\dfrac{\hat{\beta}_1-\beta_1}{ \hat{\sigma} \sqrt{1/S_{xx}}}\) tienen distribuciones \(t\) con \(n-2\) grados de libertad. De esto se deduce que los intervalos de confianza de \(100*(1-\alpha)\%\) para la pendiente \(\beta_1\) y el intercepto \(\beta_0\) de la línea de regrasión verdadera son: \[\hat{\beta}_0 \pm t_{\alpha/2, n-2} \cdot \hat{\sigma} \sqrt{1/n+\bar{x}^2/S_{xx}}\hspace{10mm}(9)\] \[\hat{\beta}_1 \pm t_{\alpha/2, n-2} \cdot \hat{\sigma} \sqrt{1/S_{xx}} \hspace{10mm} (10)\]estos intervalos estÔn centarados en la en la estimación puntual de cada parÔmetro y la cantidad abarcada a cada lado de la estimación depende del nivel de confianza deseado y de la cantidad de variabilidad del estimador.

Dado lo anterior, para los procedimientos de prueba de hipótesis, y como se procede habitualmente, las hipótesis nulas respecto a los beta del modelo de regresión lineal simple serĆ”n enunciados de igualdad. Los valores nulos para \(\beta_0\) y \(\beta_1\) se representan respectivamente como \(\beta_{00}\) (ā€œbeta cero ceroā€) y \(\beta_{10}\) (ā€œbeta uno ceroā€). AdemĆ”s, como los estadĆ­sticos de prueba tienen distribuciones \(t\) con \(n-2\) grados de libertad cuando \(H_0\) es verdadera, la probabilidad de error Tipo I permanece al nivel deseado \(\alpha\) usando un valor crĆ­tico \(t\) adecuado. AsĆ­, las hipótesis comĆŗnmente usadas para \(\beta_0\)son: \[H_0: \beta_0 = \beta_{00}\hspace{10mm}(11)\] \[H_1: \beta_0 \neq \beta_{00}\hspace{10mm}(12)\]cuyo estadĆ­stico de prueba es: \[t_{(n-2)}=\dfrac{\hat{\beta}_0-\beta_{00}}{\hat{\sigma} \sqrt{1/n+\bar{x}^2/S_{xx}}}\hspace{10mm}(13)\]y para \(\beta_1\) son: \[H_0: \beta_1 = \beta_{10}\hspace{10mm}(14)\] \[H_1: \beta_1 \neq \beta_{10}\hspace{10mm}(15)\]cuyo estadĆ­stico de prueba es:\[t_{(n-2)}=\dfrac{\hat{\beta}_1-\beta_{10}}{\hat{\sigma} \sqrt{1/S_{xx}}}\hspace{10mm}(16)\]el par de hipótesis definidas por \(14\), \(15\) y \(16\) se conoce como la prueba de utilidad del modelo de regresión lineal simple, donde: la región de rechazo de \(H_0\) para una prueba a nivel \(\alpha\) a favor de \(H_1: \beta_1>\beta_{10}\) es \(t\geq t_{\alpha,n-2}\); la región de rechazo de \(H_0\) para una prueba a nivel \(\alpha\) a favor de \(H_1: \beta_1<\beta_{10}\) es \(t\leq -t_{\alpha,n-2}\); y la región de rechazo de \(H_0\) para una prueba a nivel \(\alpha\) a favor de \(H_1: \beta_1\neq\beta_{10}\) es \(t\leq -t_{\alpha/2,n-2}\) o \(t\geq t_{\alpha/2,n-2}\). AdemĆ”s, se sabe que la prueba de utilidad del modelo de regresión simple puede ser probada con una tabla ANOVA: rechazando \(H_0\) si \(f\geq F_{\alpha,1,n-2}\). La prueba \(F\) da exactamente el mismo resultado que la prueba \(t\) de utilidad del modelo de regresión lineal simple.

Por último, se entiende que en un modelo de regresión lineal simple un valor futuro de \(Y\) no es parÔmetro sino una variable aleatoria, por lo que se debe hacer referencia a un intervalo de valores factibles para un valor futuro de \(Y\), al cual se le llama intervalo de predicción. Cuando se predice con base en el modelo de regresión lineal simple, el error de predicción es \(Y-( \hat{\beta}_0+ \hat{\beta}_1 x^*)\) que corresponde con una diferencia entre dos variables aleatorias, por lo que, en comparación con una estimación, habrÔ mÔs incertidumbre en ese; por lo tanto, un intervalo de predicción serÔ mÔs ancho que un intervalo de confianza. AdemÔs, a partir de la varianza del error de predicción se puede establecer que la variable estandarizada: \[T=\dfrac{Y-(\hat{\beta}_0+ \hat{\beta}_1 x^*)}{S \displaystyle\sqrt{1+\dfrac{1}{n} + \dfrac{(x^*-\bar{x})^2}{S_{xx}}}}\hspace{10mm}(17)\] tiene una distribución \(t\) con \(n-2\) grados de libertad, a partir de la cual se obtine un intervalo de predicción de \(100*(1-\alpha)\%\) para una observación \(Y\) futura que se harÔ cuando \(x=x^*\) igual a: \[\hat{\beta}_0+\hat{\beta}_1 x^*\pm t_{n-2,\alpha/2}\cdot s \displaystyle\sqrt{1+\dfrac{1}{n}+\dfrac{(x^*-\bar{x})^2}{S_{xx}}}\hspace{10mm}(18)\] La interpretación del nivel de predicción de \(100*(1-\alpha)\%\) establece que al usar \((18)\) repetidamente, los intervalos resultantes contendrÔn los valores \(y\) observados el \(100*(1-\alpha)\%\) del tiempo. AdemÔs, el número \(1\) en la raíz cuadrada hace que el intervalo de predicción sea mÔs ancho que intervalos de confianza como \((9)\) y \((10)\). Asimismo, a medida que \(n\to\infty\) el ancho del intervalo no tiende a cero, porque la incertidumbre en la predicción serÔ permanente, incluso al tener conocimiento perfecto sobre \(\beta_0\) y \(\beta_1\).

Planteamiento del Problema

Con base en el conjunto de datos descrito en la fase 2 se formularÔ un modelo de regresión lineal simple para estudiar la relación lineal supuesta entre las varaibles definidas por los campos: FrecC_Max (Variable dependiente) y Colesterol (variable independiente).

Desarrollo del AnƔlisis

En el siguiente desarrollo del anƔlisis se hara en R Stutio y este mismo contara con varias secciones que se presentaran a continuacion.

4.2.1. Resumen estadĆ­stico de las variables por estudiar.

En base a la navegacion a travƩs de pestaƱas muestra el resumen estadistico de las variables de interes: FrecC_Max (Variable dependiente) y Colesterol (variable independiente) junto con sus repectivos diagramas de caja. AdemƔs de manera complementaria se incluye el diagrama de dispersion de sus valores conjuntos donde se comparan con las dos combinaciones posibles entre estas variables.

En base en la pestaƱa Resumen de Colesterol se puede apreciar que la variable Colesterol presenta un sesgo lijeramente negativo con un rango cuartilico muy ancho entre el tercer y cuarto cuartil esto debido a la presencia de valores atipicos lo cuales tambien estan generando el sesgo. En comparacion segun la pestaƱa Resumen de FrecC_Max, la variable FrecC_Max se puede apreciar que tiene un sesgo mas simetrico que el anterior dado que su media y mediana se encuentran en valores extremadamente cercanas entre si lo cual nos indica que no muestra valores atipicos y esto lo podemos comprobar de manera grafica.

De manera complementaria en Diagrama de Dispersion Colesterol vs.Ā FrecC_Max se puede observar que existe una correlacion positiva de naturaleza aparentemente lineal entre las variables Colesterol y FrecC_Max, cabe recalcar que tambien existe una variante donde las posiciones de las variables se invierten. Si se observa el grafico de Diagramas Totales de Dispersion (en donde se excluyen las variables cualitativas::nominales) es razonable mencionar que hay otro par de variables que muestran una correlacion mas internsa entre las mismas PA_reposo y Edad.

Resumen de Colesterol

summary(heart_diseases_Dataset$Colesterol)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##      40     163     219     211     264     603
boxplot(heart_diseases_Dataset$Colesterol, main = "Diagrama de Caja de Colesterol", col = c("orange"))

Resumen de FrecC_Max

summary(heart_diseases_Dataset$FrecC_Max)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    60.0   120.0   138.0   136.8   156.0   202.0
boxplot(heart_diseases_Dataset$FrecC_Max, main = "Diagrama de Caja de FrecC_Max", col = c("orange"))

Diagrama de Dispersión Colesterol vs. FrecC_Max

plot(heart_diseases_Dataset$Colesterol, heart_diseases_Dataset$FrecC_Max , main = "Diagrama de Dispersión Colesterol vs. FrecC_Max")

Diagrama de Dispersión FrecC_Max vs. Colesterol

plot(heart_diseases_Dataset$FrecC_Max, heart_diseases_Dataset$Colesterol, main = "Diagrama de Dispersión FrecC_Max vs. Colesterol")

Diagramas Totales de Dispersión

pairs(~Edad + PA_reposo + Colesterol + AZ_Ayunas + FrecC_Max + Oldpeak, data = heart_diseases_Dataset)

4.2.2. Formulación del modelo de RLS entre las variables de estudio

En base a la navegacion a travƩs de la pestaƱas se muestran los coeficientes del modelo de regrecion linela simple, su resumen estadistico y su tabla ANOVA. Se menciona de nuevo que las variables de interes son FrecC_Max (variable dependiente) y Colesterol (variable independiente).

Se considero las dos posibles combinaciones pero finalmente se utilizaran los resultados de la pestaƱa Coeficientes del Modelo RLS FRE/CO y a traves de este se pudo establecer que el modelo de regresion lineal simple que relaciona a las varaibles de interes, las cuales se resumiran como \(FRECM\) y \(COL\), se tiene la formulacion: \(FRECM = 121,37957942 +0,07304729*COL\) \((19)\) Para este modelo se obvia la interpretacion del intercepto por caracter de sentido dado que para FrecC_Max se obtendria un valor moderado si el sucede un valor nulo en Colesterol lo que es medicamente imposible, y la ultima situacion en especial carece de sentido, sin embargo, el coeficiente lineal muestra una correlacion de proporcionalidad directa entre las dos variables de interes, aunque con un crecimiento medianamente moderado en FrecC_Max por cada unidad marginal de Colesterol.

De manera complementaria, la pestaƱa de Resumen Estadistico del Modelo RLS FRE/CO se consta que a cualquier nivel de significancia las evidencias a favor son un poco bajas pero esto era de esperar dado el nivle de correlacion existente entre las variables de interes. Ademas, el nivel de del coeficiente de determinacion esta a favor de la correlacion con un resultado bajo del \(5,55\) \(%\) de la variabilidad de FrecC_Max es explicado por Colesterol, en resumen lo que nos indica este resultado nos sugiere que el colesterol no es un predictor fuerte de la frecuencia cardiaca maxima y que hay otros factores influyendo en esta como era de esperarse dado el contexto en el que se encuentra, estos resultados eran de esperarse dado el fenomeno medico que se esta estudiando, y lo anteriormente mencionado quedo confirmado a traves de la pestaƱa Tabla ANOVA para el Modelo RLS FREC/CO

Coeficientes del Modelo RLS CO/FRE

modelo_RL_Simple_CO_FRE = lm(heart_diseases_Dataset$Colesterol~heart_diseases_Dataset$FrecC_Max)
coef(modelo_RL_Simple_CO_FRE)
##                      (Intercept) heart_diseases_Dataset$FrecC_Max 
##                      105.1852444                        0.7732559

Coeficientes del Modelo RLS FRE/CO

modelo_RL_Simple_FRE_CO = lm(heart_diseases_Dataset$FrecC_Max~heart_diseases_Dataset$Colesterol)
coef(modelo_RL_Simple_FRE_CO)
##                       (Intercept) heart_diseases_Dataset$Colesterol 
##                      121.37957942                        0.07304729

Resumen EstadĆ­stico del Modelo RLS CO/FRE

summary(modelo_RL_Simple_CO_FRE)
## 
## Call:
## lm(formula = heart_diseases_Dataset$Colesterol ~ heart_diseases_Dataset$FrecC_Max)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -178.17  -53.71    4.48   52.29  401.16 
## 
## Coefficients:
##                                  Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                      105.1852    14.5368   7.236 9.79e-13 ***
## heart_diseases_Dataset$FrecC_Max   0.7733     0.1045   7.401 3.06e-13 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 80.53 on 915 degrees of freedom
## Multiple R-squared:  0.05648,    Adjusted R-squared:  0.05545 
## F-statistic: 54.78 on 1 and 915 DF,  p-value: 3.057e-13

Resumen EstadĆ­stico del Modelo RLS FRE/CO

summary(modelo_RL_Simple_FRE_CO)
## 
## Call:
## lm(formula = heart_diseases_Dataset$FrecC_Max ~ heart_diseases_Dataset$Colesterol)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -68.246 -17.251   0.774  18.175  65.719 
## 
## Coefficients:
##                                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                       121.37958    2.23678  54.265  < 2e-16 ***
## heart_diseases_Dataset$Colesterol   0.07305    0.00987   7.401 3.06e-13 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 24.75 on 915 degrees of freedom
## Multiple R-squared:  0.05648,    Adjusted R-squared:  0.05545 
## F-statistic: 54.78 on 1 and 915 DF,  p-value: 3.057e-13

Tabla ANOVA para el Modelo RLS FRE/CO

anova(modelo_RL_Simple_FRE_CO)
## Analysis of Variance Table
## 
## Response: heart_diseases_Dataset$FrecC_Max
##                                    Df Sum Sq Mean Sq F value    Pr(>F)    
## heart_diseases_Dataset$Colesterol   1  33557   33557  54.777 3.057e-13 ***
## Residuals                         915 560537     613                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

4.2.3. AnƔlisis del modelo RLS

En base a la navegacion a traves de pestaƱas muestran el intervalo de confianza para \(\beta_1\) y para la prediccion del modelo de regresion linal, ambos estarƔn al \(95\) \(%\). Se volvera a recapitular sobre cuales son las variables de interes que son: FrecC_Max (variable dependiente) y Colesterol (variable independiente).

El analisis del modelo RLS muestra que no muestra un gran aporte como en cuanto a la variable predictora posiblemente por diversos factores aun asi fue relevante estimar FrecC_Max a partir de Colesterol. Esto debido a que el intervalo de confianza de \(COL\) en el modelo excluye al cero:

\(0,05367739 < \beta_1 < 0,09241719\) \((20)\)

Por ultimo, la pestaƱa Predicciones y Intervalos de Prediccion muestran los calculos con base en el modelo, bajo un intervalo de predicccion al \(95\) \(%\), de las predicciones de todas las pestaƱas del conjunto de datos para la variable FrecC_MAx. Cabe recalcar que estos intervalos resultan mas anchos que en aquellos calculados en la pestaƱa Predicciones y sus intervalos de confianza y esta misma como lo dice su nombre a un mismo nivel de significancia.

Intervalo de Confianza para B1

confint(modelo_RL_Simple_FRE_CO, level = 0.95)
##                                          2.5 %       97.5 %
## (Intercept)                       116.98975820 125.76940064
## heart_diseases_Dataset$Colesterol   0.05367739   0.09241719

Predicciones y sus Intervalos de Predicción

predict(modelo_RL_Simple_FRE_CO, data.frame(seq(1,917)), interval='prediction', level = 0.95)
##          fit       lwr      upr
## 1   142.4902  93.86505 191.1154
## 2   134.5281  85.92270 183.1335
## 3   142.0520  93.43024 190.6737
## 4   137.0117  88.40997 185.6134
## 5   135.6238  87.02113 184.2265
## 6   146.1426  97.47768 194.8075
## 7   138.6918  90.08748 187.2961
## 8   136.5734  87.97169 185.1751
## 9   136.5004  87.89862 185.1021
## 10  142.1250  93.50273 190.7473
## 11  136.7926  88.19087 185.3942
## 12  133.3593  84.74913 181.9695
## 13  136.2812  87.67935 184.8831
## 14  138.4726  89.86891 187.0764
## 15  136.7926  88.19087 185.3942
## 16  141.3215  92.70495 189.9380
## 17  135.6968  87.09430 184.2994
## 18  136.0621  87.46001 184.6642
## 19  139.4953  90.88832 188.1023
## 20  140.8832  92.26940 189.4970
## 21  137.6691  89.06688 186.2714
## 22  134.8203  86.21579 183.4248
## 23  136.0621  87.46001 184.6642
## 24  142.4172  93.79261 191.0418
## 25  137.0847  88.48299 185.6865
## 26  136.6465  88.04476 185.2482
## 27  140.3719  91.76090 188.9828
## 28  142.1250  93.50273 190.7473
## 29  155.5657 106.70966 204.4218
## 30  135.1125  86.50875 183.7162
## 31  159.2181 110.25385 208.1823
## 32  133.5785  84.96933 182.1876
## 33  137.7422  89.13983 186.3445
## 34  133.9437  85.33617 182.5513
## 35  134.9664  86.36228 183.5705
## 36  139.9336  91.32475 188.5424
## 37  143.7321  95.09551 192.3686
## 38  139.6414  91.03383 188.2490
## 39  134.3090  85.70281 182.9151
## 40  137.9613  89.35863 186.5640
## 41  138.1805  89.57737 186.7835
## 42  142.8555  94.22718 191.4838
## 43  140.6641  92.05152 189.2766
## 44  140.2988  91.68823 188.9094
## 45  134.1629  85.55618 182.7695
## 46  144.6086  95.96272 193.2545
## 47  137.6691  89.06688 186.2714
## 48  137.1578  88.55601 185.7596
## 49  146.2157  97.54974 194.8816
## 50  142.4902  93.86505 191.1154
## 51  138.3996  89.79603 187.0032
## 52  136.3543  87.75245 184.9561
## 53  137.7422  89.13983 186.3445
## 54  139.2762  90.67000 187.8823
## 55  134.5281  85.92270 183.1335
## 56  135.5508  86.94795 184.1536
## 57  141.1023  92.48721 189.7175
## 58  136.9387  88.33695 185.5404
## 59  148.0418  99.34865 196.7350
## 60  146.3618  97.69383 195.0297
## 61  139.8605  91.25203 188.4691
## 62  139.9336  91.32475 188.5424
## 63  137.7422  89.13983 186.3445
## 64  141.6137  92.99516 190.2322
## 65  136.1351  87.53313 184.7371
## 66  140.3719  91.76090 188.9828
## 67  143.0746  94.44437 191.7049
## 68  137.8152  89.21277 186.4177
## 69  139.3492  90.74278 187.9556
## 70  151.4751 102.71762 200.2325
## 71  140.7371  92.12415 189.3501
## 72  137.0847  88.48299 185.6865
## 73  134.6742  86.06926 183.2791
## 74  137.3039  88.70201 185.9058
## 75  140.9563  92.34201 189.5705
## 76  133.2863  84.67572 181.8969
## 77  160.0216 111.03104 209.0122
## 78  133.5785  84.96933 182.1876
## 79  128.6843  80.03512 177.3335
## 80  136.4273  87.82554 185.0291
## 81  141.6137  92.99516 190.2322
## 82  138.7648  90.16032 187.3693
## 83  137.6691  89.06688 186.2714
## 84  135.6968  87.09430 184.2994
## 85  136.9387  88.33695 185.5404
## 86  131.5332  82.91148 180.1548
## 87  140.5910  91.97887 189.2032
## 88  137.1578  88.55601 185.7596
## 89  142.6363  94.00993 191.2628
## 90  138.1074  89.50446 186.7104
## 91  136.5734  87.97169 185.1751
## 92  143.8051  95.16782 192.4424
## 93  136.7195  88.11782 185.3212
## 94  145.4121  96.75670 194.0676
## 95  134.6742  86.06926 183.2791
## 96  140.5910  91.97887 189.2032
## 97  136.5004  87.89862 185.1021
## 98  132.1175  83.50005 180.7350
## 99  127.5886  78.92571 176.2515
## 100 141.0293  92.41461 189.6440
## 101 141.4676  92.85007 190.0851
## 102 134.4550  85.84941 183.0607
## 103 150.0141 101.28608 198.7422
## 104 155.4196 106.56750 204.2717
## 105 134.9664  86.36228 183.5705
## 106 140.3719  91.76090 188.9828
## 107 139.9336  91.32475 188.5424
## 108 137.0117  88.40997 185.6134
## 109 130.8027  82.17507 179.4303
## 110 138.9840  90.37880 187.5891
## 111 135.1125  86.50875 183.7162
## 112 140.0066  91.39746 188.6158
## 113 141.5406  92.92262 190.1586
## 114 143.0746  94.44437 191.7049
## 115 136.5004  87.89862 185.1021
## 116 139.3492  90.74278 187.9556
## 117 141.9789  93.35775 190.6001
## 118 146.0696  97.40562 194.7335
## 119 133.0671  84.45543 181.6789
## 120 132.7750  84.16161 181.3883
## 121 139.4953  90.88832 188.1023
## 122 141.2484  92.63237 189.8645
## 123 138.9109  90.30598 187.5159
## 124 150.0872 101.35773 198.8166
## 125 138.1805  89.57737 186.7835
## 126 139.3492  90.74278 187.9556
## 127 133.1402  84.52887 181.7515
## 128 133.2863  84.67572 181.8969
## 129 138.1805  89.57737 186.7835
## 130 138.0344  89.43155 186.6372
## 131 142.7094  94.08236 191.3364
## 132 136.1351  87.53313 184.7371
## 133 149.7219 100.99941 198.4445
## 134 138.1805  89.57737 186.7835
## 135 142.8555  94.22718 191.4838
## 136 140.7371  92.12415 189.3501
## 137 137.0847  88.48299 185.6865
## 138 138.9840  90.37880 187.5891
## 139 133.5054  84.89594 182.1149
## 140 139.4223  90.81556 188.0290
## 141 145.5582  96.90095 194.2155
## 142 146.2887  97.62179 194.9556
## 143 142.6363  94.00993 191.2628
## 144 139.1301  90.52442 187.7357
## 145 141.7598  93.14022 190.3793
## 146 141.3215  92.70495 189.9380
## 147 135.8429  87.24061 184.4453
## 148 139.5684  90.96108 188.1756
## 149 133.6515  85.04271 182.2603
## 150 165.4271 116.23573 214.6185
## 151 137.0847  88.48299 185.6865
## 152 132.9941  84.38199 181.6062
## 153 141.4676  92.85007 190.0851
## 154 141.1023  92.48721 189.7175
## 155 142.6363  94.00993 191.2628
## 156 146.3618  97.69383 195.0297
## 157 135.2586  86.65518 183.8620
## 158 134.8933  86.28904 183.4976
## 159 142.5633  93.93750 191.1891
## 160 135.6238  87.02113 184.2265
## 161 140.6641  92.05152 189.2766
## 162 136.8656  88.26391 185.4673
## 163 140.5910  91.97887 189.2032
## 164 135.6968  87.09430 184.2994
## 165 137.8152  89.21277 186.4177
## 166 141.2484  92.63237 189.8645
## 167 138.2535  89.65026 186.8567
## 168 138.7648  90.16032 187.3693
## 169 137.5961  88.99392 186.1982
## 170 134.4550  85.84941 183.0607
## 171 139.1301  90.52442 187.7357
## 172 138.5457  89.94177 187.1496
## 173 144.7547  96.10715 193.4023
## 174 135.0394  86.43552 183.6433
## 175 140.8102  92.19678 189.4235
## 176 142.4172  93.79261 191.0418
## 177 137.1578  88.55601 185.7596
## 178 142.3442  93.72015 190.9682
## 179 135.5508  86.94795 184.1536
## 180 138.7648  90.16032 187.3693
## 181 137.8152  89.21277 186.4177
## 182 137.7422  89.13983 186.3445
## 183 150.8907 102.14537 199.6360
## 184 138.7648  90.16032 187.3693
## 185 144.1703  95.52925 192.8114
## 186 136.7926  88.19087 185.3942
## 187 139.7144  91.10657 188.3223
## 188 138.6918  90.08748 187.2961
## 189 145.3391  96.68456 193.9936
## 190 142.1981  93.57521 190.8209
## 191 141.8328  93.21274 190.4529
## 192 136.6465  88.04476 185.2482
## 193 139.2762  90.67000 187.8823
## 194 135.4047  86.80158 184.0077
## 195 134.8203  86.21579 183.4248
## 196 135.4777  86.87477 184.0806
## 197 143.0746  94.44437 191.7049
## 198 140.9563  92.34201 189.5705
## 199 139.3492  90.74278 187.9556
## 200 143.8781  95.24012 192.5162
## 201 139.5684  90.96108 188.1756
## 202 138.1805  89.57737 186.7835
## 203 132.1175  83.50005 180.7350
## 204 137.3769  88.77500 185.9789
## 205 134.8203  86.21579 183.4248
## 206 137.0847  88.48299 185.6865
## 207 143.8781  95.24012 192.5162
## 208 140.1527  91.54286 188.7626
## 209 131.0218  82.39607 179.6476
## 210 137.1578  88.55601 185.7596
## 211 140.5910  91.97887 189.2032
## 212 142.4172  93.79261 191.0418
## 213 141.5406  92.92262 190.1586
## 214 137.3769  88.77500 185.9789
## 215 137.8883  89.28570 186.4908
## 216 138.6918  90.08748 187.2961
## 217 141.8328  93.21274 190.4529
## 218 137.2308  88.62901 185.8327
## 219 135.6968  87.09430 184.2994
## 220 140.5910  91.97887 189.2032
## 221 137.5961  88.99392 186.1982
## 222 143.5129  94.87853 192.1473
## 223 135.6238  87.02113 184.2265
## 224 143.1477  94.51675 191.7786
## 225 140.0797  91.47017 188.6892
## 226 140.6641  92.05152 189.2766
## 227 135.6238  87.02113 184.2265
## 228 129.9261  81.29036 178.5619
## 229 142.9285  94.29959 191.5575
## 230 134.0168  85.40951 182.6240
## 231 144.3895  95.74602 193.0329
## 232 141.9059  93.28525 190.5265
## 233 141.4676  92.85007 190.0851
## 234 139.6414  91.03383 188.2490
## 235 143.9512  95.31242 192.5900
## 236 135.9890  87.38688 184.5912
## 237 145.9235  97.26147 194.5855
## 238 142.9285  94.29959 191.5575
## 239 147.3114  98.62966 195.9931
## 240 135.4777  86.87477 184.0806
## 241 145.1930  96.54025 193.8457
## 242 135.8429  87.24061 184.4453
## 243 142.7094  94.08236 191.3364
## 244 140.8102  92.19678 189.4235
## 245 140.9563  92.34201 189.5705
## 246 133.8707  85.26281 182.4785
## 247 138.6918  90.08748 187.2961
## 248 141.4676  92.85007 190.0851
## 249 137.3769  88.77500 185.9789
## 250 146.2887  97.62179 194.9556
## 251 157.2458 108.34234 206.1493
## 252 140.3719  91.76090 188.9828
## 253 142.7094  94.08236 191.3364
## 254 141.1754  92.55979 189.7910
## 255 139.4953  90.88832 188.1023
## 256 141.3945  92.77751 190.0116
## 257 150.1602 101.42937 198.8911
## 258 133.0671  84.45543 181.6789
## 259 135.9890  87.38688 184.5912
## 260 144.7547  96.10715 193.4023
## 261 141.4676  92.85007 190.0851
## 262 137.5230  88.92095 186.1251
## 263 138.2535  89.65026 186.8567
## 264 130.5835  81.95400 179.2131
## 265 135.4777  86.87477 184.0806
## 266 143.6590  95.02319 192.2948
## 267 143.1477  94.51675 191.7786
## 268 137.4500  88.84798 186.0520
## 269 139.0570  90.45162 187.6624
## 270 138.5457  89.94177 187.1496
## 271 137.8152  89.21277 186.4177
## 272 135.8429  87.24061 184.4453
## 273 136.0621  87.46001 184.6642
## 274 137.4500  88.84798 186.0520
## 275 142.9285  94.29959 191.5575
## 276 136.9387  88.33695 185.5404
## 277 133.0671  84.45543 181.6789
## 278 137.6691  89.06688 186.2714
## 279 146.7270  98.05392 195.4001
## 280 139.8605  91.25203 188.4691
## 281 139.3492  90.74278 187.9556
## 282 137.5961  88.99392 186.1982
## 283 137.4500  88.84798 186.0520
## 284 146.5078  97.83789 195.1778
## 285 147.5305  98.84544 196.2156
## 286 135.2586  86.65518 183.8620
## 287 133.7246  85.11609 182.3331
## 288 134.6011  85.99599 183.2063
## 289 143.8781  95.24012 192.5162
## 290 133.5054  84.89594 182.1149
## 291 136.7926  88.19087 185.3942
## 292 140.1527  91.54286 188.7626
## 293 134.6742  86.06926 183.2791
## 294 125.8355  77.14705 174.5239
## 295 130.3644  81.73285 178.9959
## 296 130.4374  81.80658 179.0683
## 297 125.3241  76.62744 174.0208
## 298 125.9085  77.22125 174.5958
## 299 128.1730  79.51761 176.8283
## 300 125.8355  77.14705 174.5239
## 301 130.3644  81.73285 178.9959
## 302 130.4374  81.80658 179.0683
## 303 130.2183  81.58539 178.8512
## 304 129.9261  81.29036 178.5619
## 305 124.3745  75.66146 173.0876
## 306 124.5206  75.81016 173.2311
## 307 127.8077  79.14773 176.4678
## 308 129.6339  80.99521 178.2726
## 309 125.4702  76.77594 174.1645
## 310 129.7070  81.06901 178.3449
## 311 125.1780  76.47892 173.8772
## 312 129.6339  80.99521 178.2726
## 313 130.1453  81.51164 178.7789
## 314 124.8128  76.10746 173.5181
## 315 129.8531  81.21658 178.4895
## 316 129.2687  80.62610 177.9113
## 317 129.2687  80.62610 177.9113
## 318 130.2183  81.58539 178.8512
## 319 126.2737  77.59213 174.9554
## 320 129.9261  81.29036 178.5619
## 321 130.5105  81.88029 179.1407
## 322 129.9261  81.29036 178.5619
## 323 130.7296  82.10139 179.3579
## 324 129.3417  80.69994 177.9835
## 325 128.2460  79.59156 176.9005
## 326 124.5937  75.88449 173.3028
## 327 128.4652  79.81338 177.1170
## 328 129.8531  81.21658 178.4895
## 329 125.5433  76.85018 174.2364
## 330 127.7347  79.07373 176.3957
## 331 130.8027  82.17507 179.4303
## 332 129.4878  80.84759 178.1281
## 333 129.2687  80.62610 177.9113
## 334 124.4476  75.73581 173.1593
## 335 128.6843  80.03512 177.3335
## 336 126.7851  78.11104 175.4591
## 337 128.6113  79.96121 177.2613
## 338 127.5886  78.92571 176.2515
## 339 125.3241  76.62744 174.0208
## 340 129.9261  81.29036 178.5619
## 341 127.5886  78.92571 176.2515
## 342 129.5609  80.92140 178.2004
## 343 129.3417  80.69994 177.9835
## 344 125.1780  76.47892 173.8772
## 345 127.5886  78.92571 176.2515
## 346 124.4476  75.73581 173.1593
## 347 130.5835  81.95400 179.2131
## 348 125.6163  76.92441 174.3082
## 349 130.4374  81.80658 179.0683
## 350 124.4476  75.73581 173.1593
## 351 125.1780  76.47892 173.8772
## 352 127.7347  79.07373 176.3957
## 353 126.9312  78.25923 175.6031
## 354 126.0546  77.36963 174.7396
## 355 129.8531  81.21658 178.4895
## 356 126.4198  77.74043 175.0993
## 357 129.8531  81.21658 178.4895
## 358 127.8077  79.14773 176.4678
## 359 127.0773  78.40739 175.7471
## 360 126.8581  78.18514 175.5311
## 361 125.1780  76.47892 173.8772
## 362 130.8027  82.17507 179.4303
## 363 126.1277  77.44380 174.8115
## 364 128.3921  79.73945 177.0448
## 365 124.5937  75.88449 173.3028
## 366 128.9765  80.33067 177.6223
## 367 127.1503  78.48146 175.8192
## 368 124.3015  75.58710 173.0158
## 369 125.9816  77.29544 174.6677
## 370 127.6616  78.99972 176.3236
## 371 125.6894  76.99863 174.3801
## 372 125.2511  76.55318 173.9490
## 373 127.7347  79.07373 176.3957
## 374 128.7574  80.10902 177.4057
## 375 125.6163  76.92441 174.3082
## 376 128.5382  79.88730 177.1891
## 377 126.7120  78.03693 175.3871
## 378 124.9589  76.25607 173.6617
## 379 127.4425  78.77766 176.1074
## 380 126.4929  77.81457 175.1712
## 381 126.2737  77.59213 174.9554
## 382 129.9992  81.36413 178.6342
## 383 124.3745  75.66146 173.0876
## 384 125.1050  76.40464 173.8053
## 385 126.2007  77.51797 174.8834
## 386 127.9538  79.29571 176.6120
## 387 128.3921  79.73945 177.0448
## 388 129.2687  80.62610 177.9113
## 389 128.4652  79.81338 177.1170
## 390 128.6843  80.03512 177.3335
## 391 128.2460  79.59156 176.9005
## 392 129.2687  80.62610 177.9113
## 393 128.1730  79.51761 176.8283
## 394 130.4374  81.80658 179.0683
## 395 126.8581  78.18514 175.5311
## 396 125.9085  77.22125 174.5958
## 397 127.8808  79.22172 176.5399
## 398 126.0546  77.36963 174.7396
## 399 127.6616  78.99972 176.3236
## 400 128.5382  79.88730 177.1891
## 401 127.7347  79.07373 176.3957
## 402 129.1956  80.55225 177.8390
## 403 128.1730  79.51761 176.8283
## 404 124.5937  75.88449 173.3028
## 405 129.1226  80.47840 177.7668
## 406 129.8531  81.21658 178.4895
## 407 126.7120  78.03693 175.3871
## 408 127.5156  78.85169 176.1794
## 409 130.7296  82.10139 179.3579
## 410 128.9035  80.25679 177.5501
## 411 125.4702  76.77594 174.1645
## 412 124.5206  75.81016 173.2311
## 413 125.6894  76.99863 174.3801
## 414 129.0495  80.40454 177.6946
## 415 130.7296  82.10139 179.3579
## 416 126.4198  77.74043 175.0993
## 417 129.0495  80.40454 177.6946
## 418 124.5206  75.81016 173.2311
## 419 130.7296  82.10139 179.3579
## 420 127.4425  78.77766 176.1074
## 421 129.0495  80.40454 177.6946
## 422 124.4476  75.73581 173.1593
## 423 126.5659  77.88870 175.2432
## 424 125.9816  77.29544 174.6677
## 425 129.5609  80.92140 178.2004
## 426 125.1050  76.40464 173.8053
## 427 128.6113  79.96121 177.2613
## 428 128.6113  79.96121 177.2613
## 429 130.8027  82.17507 179.4303
## 430 130.7296  82.10139 179.3579
## 431 130.6566  82.02770 179.2855
## 432 126.9312  78.25923 175.6031
## 433 127.8808  79.22172 176.5399
## 434 126.7120  78.03693 175.3871
## 435 127.0773  78.40739 175.7471
## 436 126.0546  77.36963 174.7396
## 437 126.8581  78.18514 175.5311
## 438 129.7070  81.06901 178.3449
## 439 124.4476  75.73581 173.1593
## 440 129.5609  80.92140 178.2004
## 441 128.3921  79.73945 177.0448
## 442 126.9312  78.25923 175.6031
## 443 125.9085  77.22125 174.5958
## 444 126.0546  77.36963 174.7396
## 445 130.4374  81.80658 179.0683
## 446 128.0999  79.44365 176.7562
## 447 124.8128  76.10746 173.5181
## 448 126.6390  77.96282 175.3151
## 449 124.6667  75.95882 173.3746
## 450 129.7070  81.06901 178.3449
## 451 129.2687  80.62610 177.9113
## 452 125.6894  76.99863 174.3801
## 453 124.8128  76.10746 173.5181
## 454 129.2687  80.62610 177.9113
## 455 125.0319  76.33036 173.7335
## 456 125.1050  76.40464 173.8053
## 457 126.0546  77.36963 174.7396
## 458 126.6390  77.96282 175.3151
## 459 124.8128  76.10746 173.5181
## 460 126.0546  77.36963 174.7396
## 461 130.6566  82.02770 179.2855
## 462 130.0722  81.43789 178.7065
## 463 128.0269  79.36968 176.6841
## 464 125.9816  77.29544 174.6677
## 465 138.9109  90.30598 187.5159
## 466 130.5835  81.95400 179.2131
## 467 131.8253  83.20583 180.4449
## 468 129.5609  80.92140 178.2004
## 469 134.6742  86.06926 183.2791
## 470 128.7574  80.10902 177.4057
## 471 132.4097  83.79416 181.0253
## 472 135.0394  86.43552 183.6433
## 473 130.2183  81.58539 178.8512
## 474 131.9714  83.35296 180.5899
## 475 133.4324  84.82254 182.0422
## 476 134.2359  85.62950 182.8423
## 477 130.3644  81.73285 178.9959
## 478 129.9992  81.36413 178.6342
## 479 128.9035  80.25679 177.5501
## 480 134.1629  85.55618 182.7695
## 481 135.1125  86.50875 183.7162
## 482 132.4828  83.86766 181.0979
## 483 130.2183  81.58539 178.8512
## 484 128.7574  80.10902 177.4057
## 485 134.1629  85.55618 182.7695
## 486 137.0117  88.40997 185.6134
## 487 137.0117  88.40997 185.6134
## 488 139.7875  91.17931 188.3957
## 489 137.4500  88.84798 186.0520
## 490 137.0117  88.40997 185.6134
## 491 136.2082  87.60625 184.8101
## 492 133.0671  84.45543 181.6789
## 493 128.7574  80.10902 177.4057
## 494 132.2636  83.64712 180.8801
## 495 129.9261  81.29036 178.5619
## 496 130.4374  81.80658 179.0683
## 497 131.8984  83.27940 180.5174
## 498 131.8253  83.20583 180.4449
## 499 143.0746  94.44437 191.7049
## 500 139.4953  90.88832 188.1023
## 501 143.8781  95.24012 192.5162
## 502 136.5734  87.97169 185.1751
## 503 137.9613  89.35863 186.5640
## 504 136.7195  88.11782 185.3212
## 505 139.2762  90.67000 187.8823
## 506 137.8152  89.21277 186.4177
## 507 138.9109  90.30598 187.5159
## 508 131.2410  82.61701 179.8649
## 509 134.9664  86.36228 183.5705
## 510 133.7976  85.18945 182.4058
## 511 130.8757  82.24875 179.5027
## 512 132.3367  83.72064 180.9527
## 513 131.8253  83.20583 180.4449
## 514 133.1402  84.52887 181.7515
## 515 130.2913  81.65912 178.9236
## 516 133.3593  84.74913 181.9695
## 517 133.7976  85.18945 182.4058
## 518 133.2132  84.60230 181.8242
## 519 143.6590  95.02319 192.2948
## 520 137.6691  89.06688 186.2714
## 521 141.9789  93.35775 190.6001
## 522 146.8731  98.19790 195.5483
## 523 133.0671  84.45543 181.6789
## 524 133.0671  84.45543 181.6789
## 525 138.6187  90.01463 187.2229
## 526 144.1703  95.52925 192.8114
## 527 142.0520  93.43024 190.6737
## 528 131.7523  83.13225 180.3723
## 529 136.7926  88.19087 185.3942
## 530 137.3039  88.70201 185.9058
## 531 143.7321  95.09551 192.3686
## 532 134.9664  86.36228 183.5705
## 533 139.7875  91.17931 188.3957
## 534 137.5961  88.99392 186.1982
## 535 129.7800  81.14280 178.4172
## 536 135.1125  86.50875 183.7162
## 537 140.2258  91.61555 188.8360
## 538 136.1351  87.53313 184.7371
## 539 135.7699  87.16745 184.3723
## 540 136.2812  87.67935 184.8831
## 541 129.6339  80.99521 178.2726
## 542 141.3945  92.77751 190.0116
## 543 135.4047  86.80158 184.0077
## 544 143.1477  94.51675 191.7786
## 545 141.2484  92.63237 189.8645
## 546 137.4500  88.84798 186.0520
## 547 135.9890  87.38688 184.5912
## 548 140.4449  91.83357 189.0563
## 549 134.6011  85.99599 183.2063
## 550 140.3719  91.76090 188.9828
## 551 137.4500  88.84798 186.0520
## 552 137.5230  88.92095 186.1251
## 553 137.1578  88.55601 185.7596
## 554 134.1629  85.55618 182.7695
## 555 137.3769  88.77500 185.9789
## 556 144.0242  95.38470 192.6638
## 557 136.5734  87.97169 185.1751
## 558 138.3266  89.72315 186.9299
## 559 141.3215  92.70495 189.9380
## 560 136.2082  87.60625 184.8101
## 561 134.6742  86.06926 183.2791
## 562 141.3945  92.77751 190.0116
## 563 136.2812  87.67935 184.8831
## 564 141.1023  92.48721 189.7175
## 565 142.7094  94.08236 191.3364
## 566 133.8707  85.26281 182.4785
## 567 137.5230  88.92095 186.1251
## 568 142.4902  93.86505 191.1154
## 569 137.2308  88.62901 185.8327
## 570 137.6691  89.06688 186.2714
## 571 129.4148  80.77377 178.0558
## 572 135.4777  86.87477 184.0806
## 573 130.3644  81.73285 178.9959
## 574 136.7195  88.11782 185.3212
## 575 141.9789  93.35775 190.6001
## 576 133.7976  85.18945 182.4058
## 577 148.3340  99.63603 197.0320
## 578 134.0168  85.40951 182.6240
## 579 142.4902  93.86505 191.1154
## 580 132.4828  83.86766 181.0979
## 581 136.5734  87.97169 185.1751
## 582 137.1578  88.55601 185.7596
## 583 141.1754  92.55979 189.7910
## 584 139.2031  90.59722 187.8090
## 585 142.1981  93.57521 190.8209
## 586 139.1301  90.52442 187.7357
## 587 138.9109  90.30598 187.5159
## 588 137.3769  88.77500 185.9789
## 589 138.6918  90.08748 187.2961
## 590 133.4324  84.82254 182.0422
## 591 136.9387  88.33695 185.5404
## 592 142.3442  93.72015 190.9682
## 593 140.2258  91.61555 188.8360
## 594 140.0797  91.47017 188.6892
## 595 134.9664  86.36228 183.5705
## 596 140.6641  92.05152 189.2766
## 597 134.8933  86.28904 183.4976
## 598 137.8883  89.28570 186.4908
## 599 136.2082  87.60625 184.8101
## 600 136.5004  87.89862 185.1021
## 601 142.1250  93.50273 190.7473
## 602 145.9965  97.33355 194.6595
## 603 144.0242  95.38470 192.6638
## 604 139.9336  91.32475 188.5424
## 605 140.2258  91.61555 188.8360
## 606 139.9336  91.32475 188.5424
## 607 143.2938  94.66148 191.9260
## 608 133.7976  85.18945 182.4058
## 609 144.0242  95.38470 192.6638
## 610 145.7043  97.04518 194.3635
## 611 131.5332  82.91148 180.1548
## 612 137.6691  89.06688 186.2714
## 613 149.5028 100.78432 198.2213
## 614 139.9336  91.32475 188.5424
## 615 144.9008  96.25155 193.5501
## 616 162.5783 113.49783 211.6587
## 617 140.4449  91.83357 189.0563
## 618 140.5910  91.97887 189.2032
## 619 141.0293  92.41461 189.6440
## 620 134.3090  85.70281 182.9151
## 621 140.0797  91.47017 188.6892
## 622 138.8379  90.23316 187.4426
## 623 142.7824  94.15477 191.4101
## 624 151.1098 102.36002 199.8596
## 625 138.4726  89.86891 187.0764
## 626 137.8883  89.28570 186.4908
## 627 138.5457  89.94177 187.1496
## 628 138.4726  89.86891 187.0764
## 629 143.5129  94.87853 192.1473
## 630 132.2636  83.64712 180.8801
## 631 144.0973  95.45698 192.7376
## 632 136.2082  87.60625 184.8101
## 633 136.7926  88.19087 185.3942
## 634 135.9160  87.31375 184.5182
## 635 138.1074  89.50446 186.7104
## 636 139.2762  90.67000 187.8823
## 637 143.5129  94.87853 192.1473
## 638 136.2812  87.67935 184.8831
## 639 142.4172  93.79261 191.0418
## 640 141.4676  92.85007 190.0851
## 641 139.1301  90.52442 187.7357
## 642 142.9285  94.29959 191.5575
## 643 138.1805  89.57737 186.7835
## 644 140.7371  92.12415 189.3501
## 645 138.1074  89.50446 186.7104
## 646 138.0344  89.43155 186.6372
## 647 137.0847  88.48299 185.6865
## 648 145.1930  96.54025 193.8457
## 649 135.9890  87.38688 184.5912
## 650 140.0797  91.47017 188.6892
## 651 136.5004  87.89862 185.1021
## 652 141.3215  92.70495 189.9380
## 653 134.5281  85.92270 183.1335
## 654 137.5961  88.99392 186.1982
## 655 137.6691  89.06688 186.2714
## 656 136.6465  88.04476 185.2482
## 657 138.3996  89.79603 187.0032
## 658 135.7699  87.16745 184.3723
## 659 137.3039  88.70201 185.9058
## 660 136.7926  88.19087 185.3942
## 661 132.2636  83.64712 180.8801
## 662 135.7699  87.16745 184.3723
## 663 139.3492  90.74278 187.9556
## 664 137.8152  89.21277 186.4177
## 665 144.3895  95.74602 193.0329
## 666 136.3543  87.75245 184.9561
## 667 151.8403 103.07502 200.6056
## 668 135.6238  87.02113 184.2265
## 669 138.4726  89.86891 187.0764
## 670 135.8429  87.24061 184.4453
## 671 133.5054  84.89594 182.1149
## 672 134.3820  85.77612 182.9879
## 673 139.5684  90.96108 188.1756
## 674 141.9059  93.28525 190.5265
## 675 130.5835  81.95400 179.2131
## 676 143.6590  95.02319 192.2948
## 677 137.8883  89.28570 186.4908
## 678 138.9109  90.30598 187.5159
## 679 138.3996  89.79603 187.0032
## 680 141.5406  92.92262 190.1586
## 681 140.4449  91.83357 189.0563
## 682 144.6817  96.03494 193.3284
## 683 139.0570  90.45162 187.6624
## 684 139.1301  90.52442 187.7357
## 685 140.3719  91.76090 188.9828
## 686 147.2383  98.55772 195.9189
## 687 139.2762  90.67000 187.8823
## 688 135.7699  87.16745 184.3723
## 689 137.6691  89.06688 186.2714
## 690 143.9512  95.31242 192.5900
## 691 136.5734  87.97169 185.1751
## 692 135.9160  87.31375 184.5182
## 693 136.6465  88.04476 185.2482
## 694 138.6187  90.01463 187.2229
## 695 137.3039  88.70201 185.9058
## 696 135.8429  87.24061 184.4453
## 697 141.1023  92.48721 189.7175
## 698 137.0117  88.40997 185.6134
## 699 136.0621  87.46001 184.6642
## 700 139.2031  90.59722 187.8090
## 701 136.5734  87.97169 185.1751
## 702 141.1023  92.48721 189.7175
## 703 143.7321  95.09551 192.3686
## 704 139.1301  90.52442 187.7357
## 705 137.5230  88.92095 186.1251
## 706 145.4852  96.82883 194.1415
## 707 140.8102  92.19678 189.4235
## 708 136.4273  87.82554 185.0291
## 709 136.8656  88.26391 185.4673
## 710 141.4676  92.85007 190.0851
## 711 143.4399  94.80619 192.0735
## 712 138.4726  89.86891 187.0764
## 713 144.2434  95.60152 192.8852
## 714 139.2031  90.59722 187.8090
## 715 131.6792  83.05867 180.2998
## 716 138.6918  90.08748 187.2961
## 717 141.0293  92.41461 189.6440
## 718 142.4902  93.86505 191.1154
## 719 139.9336  91.32475 188.5424
## 720 141.3945  92.77751 190.0116
## 721 137.5961  88.99392 186.1982
## 722 140.2258  91.61555 188.8360
## 723 134.3090  85.70281 182.9151
## 724 133.0671  84.45543 181.6789
## 725 145.2660  96.61241 193.9197
## 726 138.5457  89.94177 187.1496
## 727 143.6590  95.02319 192.2948
## 728 143.5860  94.95086 192.2210
## 729 142.9285  94.29959 191.5575
## 730 141.1754  92.55979 189.7910
## 731 139.5684  90.96108 188.1756
## 732 142.4172  93.79261 191.0418
## 733 137.8883  89.28570 186.4908
## 734 142.0520  93.43024 190.6737
## 735 135.1125  86.50875 183.7162
## 736 142.2711  93.64768 190.8945
## 737 141.3945  92.77751 190.0116
## 738 147.6766  98.98925 196.3640
## 739 141.3215  92.70495 189.9380
## 740 136.0621  87.46001 184.6642
## 741 140.8832  92.26940 189.4970
## 742 135.6968  87.09430 184.2994
## 743 136.0621  87.46001 184.6642
## 744 138.1805  89.57737 186.7835
## 745 141.0293  92.41461 189.6440
## 746 136.8656  88.26391 185.4673
## 747 137.8883  89.28570 186.4908
## 748 139.3492  90.74278 187.9556
## 749 138.3266  89.72315 186.9299
## 750 134.3090  85.70281 182.9151
## 751 141.6137  92.99516 190.2322
## 752 139.5684  90.96108 188.1756
## 753 136.7195  88.11782 185.3212
## 754 136.5004  87.89862 185.1021
## 755 136.8656  88.26391 185.4673
## 756 141.1754  92.55979 189.7910
## 757 138.3996  89.79603 187.0032
## 758 136.9387  88.33695 185.5404
## 759 142.0520  93.43024 190.6737
## 760 141.9789  93.35775 190.6001
## 761 138.1805  89.57737 186.7835
## 762 133.5785  84.96933 182.1876
## 763 137.7422  89.13983 186.3445
## 764 140.9563  92.34201 189.5705
## 765 139.6414  91.03383 188.2490
## 766 137.3769  88.77500 185.9789
## 767 140.8832  92.26940 189.4970
## 768 143.5129  94.87853 192.1473
## 769 140.0797  91.47017 188.6892
## 770 136.2812  87.67935 184.8831
## 771 137.2308  88.62901 185.8327
## 772 143.8781  95.24012 192.5162
## 773 135.4777  86.87477 184.0806
## 774 138.0344  89.43155 186.6372
## 775 138.2535  89.65026 186.8567
## 776 139.2031  90.59722 187.8090
## 777 140.5180  91.90623 189.1297
## 778 140.2988  91.68823 188.9094
## 779 136.7926  88.19087 185.3942
## 780 145.1199  96.46809 193.7718
## 781 139.9336  91.32475 188.5424
## 782 135.7699  87.16745 184.3723
## 783 138.6187  90.01463 187.2229
## 784 141.9789  93.35775 190.6001
## 785 138.4726  89.86891 187.0764
## 786 139.9336  91.32475 188.5424
## 787 143.2207  94.58912 191.8523
## 788 136.7926  88.19087 185.3942
## 789 134.6742  86.06926 183.2791
## 790 142.8555  94.22718 191.4838
## 791 143.1477  94.51675 191.7786
## 792 138.2535  89.65026 186.8567
## 793 139.9336  91.32475 188.5424
## 794 135.6968  87.09430 184.2994
## 795 138.9109  90.30598 187.5159
## 796 151.2559 102.50308 200.0088
## 797 133.9437  85.33617 182.5513
## 798 140.7371  92.12415 189.3501
## 799 139.3492  90.74278 187.9556
## 800 144.3895  95.74602 193.0329
## 801 134.8203  86.21579 183.4248
## 802 138.3996  89.79603 187.0032
## 803 150.1602 101.42937 198.8911
## 804 141.0293  92.41461 189.6440
## 805 138.8379  90.23316 187.4426
## 806 134.0898  85.48285 182.6968
## 807 143.9512  95.31242 192.5900
## 808 141.9789  93.35775 190.6001
## 809 140.0066  91.39746 188.6158
## 810 139.6414  91.03383 188.2490
## 811 139.4953  90.88832 188.1023
## 812 137.0117  88.40997 185.6134
## 813 138.8379  90.23316 187.4426
## 814 143.5860  94.95086 192.2210
## 815 141.6137  92.99516 190.2322
## 816 143.2938  94.66148 191.9260
## 817 140.2258  91.61555 188.8360
## 818 143.2207  94.58912 191.8523
## 819 142.4902  93.86505 191.1154
## 820 143.1477  94.51675 191.7786
## 821 144.6086  95.96272 193.2545
## 822 138.9109  90.30598 187.5159
## 823 143.9512  95.31242 192.5900
## 824 139.6414  91.03383 188.2490
## 825 142.4172  93.79261 191.0418
## 826 139.2762  90.67000 187.8823
## 827 136.9387  88.33695 185.5404
## 828 137.1578  88.55601 185.7596
## 829 136.2812  87.67935 184.8831
## 830 136.2812  87.67935 184.8831
## 831 139.7875  91.17931 188.3957
## 832 137.9613  89.35863 186.5640
## 833 140.2258  91.61555 188.8360
## 834 137.4500  88.84798 186.0520
## 835 138.8379  90.23316 187.4426
## 836 139.9336  91.32475 188.5424
## 837 133.6515  85.04271 182.2603
## 838 145.4852  96.82883 194.1415
## 839 134.7472  86.14253 183.3519
## 840 136.2082  87.60625 184.8101
## 841 140.5910  91.97887 189.2032
## 842 146.2887  97.62179 194.9556
## 843 142.0520  93.43024 190.6737
## 844 134.9664  86.36228 183.5705
## 845 143.8051  95.16782 192.4424
## 846 137.3769  88.77500 185.9789
## 847 140.3719  91.76090 188.9828
## 848 140.0066  91.39746 188.6158
## 849 138.2535  89.65026 186.8567
## 850 133.3593  84.74913 181.9695
## 851 138.4726  89.86891 187.0764
## 852 134.3090  85.70281 182.9151
## 853 140.1527  91.54286 188.7626
## 854 145.1199  96.46809 193.7718
## 855 141.3945  92.77751 190.0116
## 856 144.8278  96.17935 193.4762
## 857 140.6641  92.05152 189.2766
## 858 140.9563  92.34201 189.5705
## 859 143.8781  95.24012 192.5162
## 860 139.8605  91.25203 188.4691
## 861 139.4953  90.88832 188.1023
## 862 141.0293  92.41461 189.6440
## 863 134.8933  86.28904 183.4976
## 864 141.9789  93.35775 190.6001
## 865 135.1125  86.50875 183.7162
## 866 137.3769  88.77500 185.9789
## 867 142.5633  93.93750 191.1891
## 868 134.1629  85.55618 182.7695
## 869 136.8656  88.26391 185.4673
## 870 143.4399  94.80619 192.0735
## 871 139.1301  90.52442 187.7357
## 872 147.1653  98.48577 195.8448
## 873 145.8504  97.18938 194.5115
## 874 139.4223  90.81556 188.0290
## 875 146.2157  97.54974 194.8816
## 876 136.4273  87.82554 185.0291
## 877 142.1250  93.50273 190.7473
## 878 140.8102  92.19678 189.4235
## 879 138.1074  89.50446 186.7104
## 880 135.9160  87.31375 184.5182
## 881 140.5910  91.97887 189.2032
## 882 142.8555  94.22718 191.4838
## 883 135.4047  86.80158 184.0077
## 884 142.2711  93.64768 190.8945
## 885 137.1578  88.55601 185.7596
## 886 137.6691  89.06688 186.2714
## 887 139.4223  90.81556 188.0290
## 888 136.2812  87.67935 184.8831
## 889 136.2812  87.67935 184.8831
## 890 137.9613  89.35863 186.5640
## 891 141.6867  93.06769 190.3058
## 892 137.4500  88.84798 186.0520
## 893 138.3266  89.72315 186.9299
## 894 135.7699  87.16745 184.3723
## 895 145.8504  97.18938 194.5115
## 896 139.8605  91.25203 188.4691
## 897 136.3543  87.75245 184.9561
## 898 135.4047  86.80158 184.0077
## 899 136.2082  87.60625 184.8101
## 900 144.6086  95.96272 193.2545
## 901 137.8152  89.21277 186.4177
## 902 137.4500  88.84798 186.0520
## 903 137.5230  88.92095 186.1251
## 904 138.9109  90.30598 187.5159
## 905 136.8656  88.26391 185.4673
## 906 146.3618  97.69383 195.0297
## 907 133.7246  85.11609 182.3331
## 908 135.0394  86.43552 183.6433
## 909 135.7699  87.16745 184.3723
## 910 132.8480  84.23508 181.4609
## 911 134.2359  85.62950 182.8423
## 912 138.9840  90.37880 187.5891
## 913 140.6641  92.05152 189.2766
## 914 135.4777  86.87477 184.0806
## 915 130.9488  82.32241 179.5751
## 916 138.6187  90.01463 187.2229
## 917 134.1629  85.55618 182.7695

Predicciones y sus Intervalos de Confianza

predict(modelo_RL_Simple_FRE_CO, data.frame(seq(1,917)), interval='confidence', level = 0.95)
##          fit      lwr      upr
## 1   142.4902 140.2861 144.6944
## 2   134.5281 132.8156 136.2406
## 3   142.0520 139.9258 144.1781
## 4   137.0117 135.4065 138.6169
## 5   135.6238 133.9902 137.2574
## 6   146.1426 143.1889 149.0963
## 7   138.6918 137.0103 140.3733
## 8   136.5734 134.9683 138.1785
## 9   136.5004 134.8944 138.1063
## 10  142.1250 139.9861 144.2639
## 11  136.7926 135.1885 138.3967
## 12  133.3593 131.5153 135.2034
## 13  136.2812 134.6715 137.8910
## 14  138.4726 136.8076 140.1377
## 15  136.7926 135.1885 138.3967
## 16  141.3215 139.3172 143.3258
## 17  135.6968 134.0668 137.3269
## 18  136.0621 134.4464 137.6777
## 19  139.4953 137.7381 141.2526
## 20  140.8832 138.9463 142.8201
## 21  137.6691 136.0482 139.2901
## 22  134.8203 133.1333 136.5072
## 23  136.0621 134.4464 137.6777
## 24  142.4172 140.2263 144.6081
## 25  137.0847 135.4787 138.6908
## 26  136.6465 135.0419 138.2510
## 27  140.3719 138.5076 142.2361
## 28  142.1250 139.9861 144.2639
## 29  155.5657 150.3348 160.7966
## 30  135.1125 133.4479 136.7771
## 31  159.2181 153.0582 165.3780
## 32  133.5785 131.7624 135.3946
## 33  137.7422 136.1183 139.3660
## 34  133.9437 132.1710 135.7164
## 35  134.9664 133.2910 136.6417
## 36  139.9336 138.1258 141.7414
## 37  143.7321 141.2903 146.1738
## 38  139.6414 137.8680 141.4148
## 39  134.3090 132.5752 136.0427
## 40  137.9613 136.3274 139.5952
## 41  138.1805 136.5345 139.8264
## 42  142.8555 140.5838 145.1271
## 43  140.6641 138.7592 142.5690
## 44  140.2988 138.4444 142.1533
## 45  134.1629 132.4141 135.9116
## 46  144.6086 141.9872 147.2301
## 47  137.6691 136.0482 139.2901
## 48  137.1578 135.5507 138.7649
## 49  146.2157 143.2457 149.1856
## 50  142.4902 140.2861 144.6944
## 51  138.3996 136.7397 140.0595
## 52  136.3543 134.7460 137.9625
## 53  137.7422 136.1183 139.3660
## 54  139.2762 137.5418 141.0105
## 55  134.5281 132.8156 136.2406
## 56  135.5508 133.9134 137.1881
## 57  141.1023 139.1323 143.0724
## 58  136.9387 135.3341 138.5432
## 59  148.0418 144.6542 151.4295
## 60  146.3618 143.3591 149.3644
## 61  139.8605 138.0616 141.6595
## 62  139.9336 138.1258 141.7414
## 63  137.7422 136.1183 139.3660
## 64  141.6137 139.5620 143.6654
## 65  136.1351 134.5217 137.7486
## 66  140.3719 138.5076 142.2361
## 67  143.0746 140.7615 145.3878
## 68  137.8152 136.1882 139.4422
## 69  139.3492 137.6074 141.0910
## 70  151.4751 147.2635 155.6867
## 71  140.7371 138.8217 142.6525
## 72  137.0847 135.4787 138.6908
## 73  134.6742 132.9748 136.3735
## 74  137.3039 135.6940 138.9138
## 75  140.9563 139.0085 142.9040
## 76  133.2863 131.4326 135.1400
## 77  160.0216 153.6557 166.3874
## 78  133.5785 131.7624 135.3946
## 79  128.6843 126.0024 131.3662
## 80  136.4273 134.8204 138.0343
## 81  141.6137 139.5620 143.6654
## 82  138.7648 137.0774 140.4523
## 83  137.6691 136.0482 139.2901
## 84  135.6968 134.0668 137.3269
## 85  136.9387 135.3341 138.5432
## 86  131.5332 129.4081 133.6582
## 87  140.5910 138.6965 142.4856
## 88  137.1578 135.5507 138.7649
## 89  142.6363 140.4055 144.8672
## 90  138.1074 136.4657 139.7491
## 91  136.5734 134.9683 138.1785
## 92  143.8051 141.3487 146.2615
## 93  136.7195 135.1153 138.3237
## 94  145.4121 142.6191 148.2052
## 95  134.6742 132.9748 136.3735
## 96  140.5910 138.6965 142.4856
## 97  136.5004 134.8944 138.1063
## 98  132.1175 130.0907 134.1443
## 99  127.5886 124.6687 130.5085
## 100 141.0293 139.0705 142.9881
## 101 141.4676 139.4398 143.4954
## 102 134.4550 132.7356 136.1744
## 103 150.0141 146.1579 153.8703
## 104 155.4196 150.2256 160.6137
## 105 134.9664 133.2910 136.6417
## 106 140.3719 138.5076 142.2361
## 107 139.9336 138.1258 141.7414
## 108 137.0117 135.4065 138.6169
## 109 130.8027 128.5458 133.0595
## 110 138.9840 137.2776 140.6904
## 111 135.1125 133.4479 136.7771
## 112 140.0066 138.1898 141.8235
## 113 141.5406 139.5009 143.5803
## 114 143.0746 140.7615 145.3878
## 115 136.5004 134.8944 138.1063
## 116 139.3492 137.6074 141.0910
## 117 141.9789 139.8655 144.0924
## 118 146.0696 143.1321 149.0070
## 119 133.0671 131.1837 134.9506
## 120 132.7750 130.8498 134.7002
## 121 139.4953 137.7381 141.2526
## 122 141.2484 139.2557 143.2412
## 123 138.9109 137.2111 140.6108
## 124 150.0872 146.2133 153.9610
## 125 138.1805 136.5345 139.8264
## 126 139.3492 137.6074 141.0910
## 127 133.1402 131.2668 135.0136
## 128 133.2863 131.4326 135.1400
## 129 138.1805 136.5345 139.8264
## 130 138.0344 136.3967 139.6721
## 131 142.7094 140.4650 144.9538
## 132 136.1351 134.5217 137.7486
## 133 149.7219 145.9360 153.5078
## 134 138.1805 136.5345 139.8264
## 135 142.8555 140.5838 145.1271
## 136 140.7371 138.8217 142.6525
## 137 137.0847 135.4787 138.6908
## 138 138.9840 137.2776 140.6904
## 139 133.5054 131.6802 135.3307
## 140 139.4223 137.6728 141.1717
## 141 145.5582 142.7334 148.3831
## 142 146.2887 143.3024 149.2750
## 143 142.6363 140.4055 144.8672
## 144 139.1301 137.4101 140.8500
## 145 141.7598 139.6837 143.8359
## 146 141.3215 139.3172 143.3258
## 147 135.8429 134.2193 137.4666
## 148 139.5684 137.8031 141.3336
## 149 133.6515 131.8445 135.4586
## 150 165.4271 157.6657 173.1885
## 151 137.0847 135.4787 138.6908
## 152 132.9941 131.1004 134.8878
## 153 141.4676 139.4398 143.4954
## 154 141.1023 139.1323 143.0724
## 155 142.6363 140.4055 144.8672
## 156 146.3618 143.3591 149.3644
## 157 135.2586 133.6039 136.9132
## 158 134.8933 133.2123 136.5744
## 159 142.5633 140.3458 144.7808
## 160 135.6238 133.9902 137.2574
## 161 140.6641 138.7592 142.5690
## 162 136.8656 135.2614 138.4698
## 163 140.5910 138.6965 142.4856
## 164 135.6968 134.0668 137.3269
## 165 137.8152 136.1882 139.4422
## 166 141.2484 139.2557 143.2412
## 167 138.2535 136.6031 139.9039
## 168 138.7648 137.0774 140.4523
## 169 137.5961 135.9778 139.2144
## 170 134.4550 132.7356 136.1744
## 171 139.1301 137.4101 140.8500
## 172 138.5457 136.8754 140.2160
## 173 144.7547 142.1025 147.4069
## 174 135.0394 133.3695 136.7093
## 175 140.8102 138.8841 142.7362
## 176 142.4172 140.2263 144.6081
## 177 137.1578 135.5507 138.7649
## 178 142.3442 140.1664 144.5219
## 179 135.5508 133.9134 137.1881
## 180 138.7648 137.0774 140.4523
## 181 137.8152 136.1882 139.4422
## 182 137.7422 136.1183 139.3660
## 183 150.8907 146.8219 154.9594
## 184 138.7648 137.0774 140.4523
## 185 144.1703 141.6398 146.7009
## 186 136.7926 135.1885 138.3967
## 187 139.7144 137.9327 141.4962
## 188 138.6918 137.0103 140.3733
## 189 145.3391 142.5619 148.1163
## 190 142.1981 140.0463 144.3498
## 191 141.8328 139.7444 143.9213
## 192 136.6465 135.0419 138.2510
## 193 139.2762 137.5418 141.0105
## 194 135.4047 133.7591 137.0503
## 195 134.8203 133.1333 136.5072
## 196 135.4777 133.8363 137.1191
## 197 143.0746 140.7615 145.3878
## 198 140.9563 139.0085 142.9040
## 199 139.3492 137.6074 141.0910
## 200 143.8781 141.4070 146.3492
## 201 139.5684 137.8031 141.3336
## 202 138.1805 136.5345 139.8264
## 203 132.1175 130.0907 134.1443
## 204 137.3769 135.7653 138.9886
## 205 134.8203 133.1333 136.5072
## 206 137.0847 135.4787 138.6908
## 207 143.8781 141.4070 146.3492
## 208 140.1527 138.3174 141.9881
## 209 131.0218 128.8055 133.2382
## 210 137.1578 135.5507 138.7649
## 211 140.5910 138.6965 142.4856
## 212 142.4172 140.2263 144.6081
## 213 141.5406 139.5009 143.5803
## 214 137.3769 135.7653 138.9886
## 215 137.8883 136.2579 139.5186
## 216 138.6918 137.0103 140.3733
## 217 141.8328 139.7444 143.9213
## 218 137.2308 135.6225 138.8392
## 219 135.6968 134.0668 137.3269
## 220 140.5910 138.6965 142.4856
## 221 137.5961 135.9778 139.2144
## 222 143.5129 141.1147 145.9112
## 223 135.6238 133.9902 137.2574
## 224 143.1477 140.8205 145.4748
## 225 140.0797 138.2537 141.9057
## 226 140.6641 138.7592 142.5690
## 227 135.6238 133.9902 137.2574
## 228 129.9261 127.5001 132.3521
## 229 142.9285 140.6431 145.2139
## 230 134.0168 132.2522 135.7813
## 231 144.3895 141.8137 146.9652
## 232 141.9059 139.8050 144.0068
## 233 141.4676 139.4398 143.4954
## 234 139.6414 137.8680 141.4148
## 235 143.9512 141.4653 146.4371
## 236 135.9890 134.3710 137.6071
## 237 145.9235 143.0184 148.8285
## 238 142.9285 140.6431 145.2139
## 239 147.3114 144.0930 150.5297
## 240 135.4777 133.8363 137.1191
## 241 145.1930 142.4473 147.9387
## 242 135.8429 134.2193 137.4666
## 243 142.7094 140.4650 144.9538
## 244 140.8102 138.8841 142.7362
## 245 140.9563 139.0085 142.9040
## 246 133.8707 132.0896 135.6517
## 247 138.6918 137.0103 140.3733
## 248 141.4676 139.4398 143.4954
## 249 137.3769 135.7653 138.9886
## 250 146.2887 143.3024 149.2750
## 251 157.2458 151.5892 162.9024
## 252 140.3719 138.5076 142.2361
## 253 142.7094 140.4650 144.9538
## 254 141.1754 139.1941 143.1567
## 255 139.4953 137.7381 141.2526
## 256 141.3945 139.3785 143.4105
## 257 150.1602 146.2687 154.0517
## 258 133.0671 131.1837 134.9506
## 259 135.9890 134.3710 137.6071
## 260 144.7547 142.1025 147.4069
## 261 141.4676 139.4398 143.4954
## 262 137.5230 135.9072 139.1389
## 263 138.2535 136.6031 139.9039
## 264 130.5835 128.2854 132.8816
## 265 135.4777 133.8363 137.1191
## 266 143.6590 141.2318 146.0862
## 267 143.1477 140.8205 145.4748
## 268 137.4500 135.8364 139.0636
## 269 139.0570 137.3439 140.7701
## 270 138.5457 136.8754 140.2160
## 271 137.8152 136.1882 139.4422
## 272 135.8429 134.2193 137.4666
## 273 136.0621 134.4464 137.6777
## 274 137.4500 135.8364 139.0636
## 275 142.9285 140.6431 145.2139
## 276 136.9387 135.3341 138.5432
## 277 133.0671 131.1837 134.9506
## 278 137.6691 136.0482 139.2901
## 279 146.7270 143.6420 149.8119
## 280 139.8605 138.0616 141.6595
## 281 139.3492 137.6074 141.0910
## 282 137.5961 135.9778 139.2144
## 283 137.4500 135.8364 139.0636
## 284 146.5078 143.4724 149.5433
## 285 147.5305 144.2617 150.7993
## 286 135.2586 133.6039 136.9132
## 287 133.7246 131.9263 135.5228
## 288 134.6011 132.8953 136.3070
## 289 143.8781 141.4070 146.3492
## 290 133.5054 131.6802 135.3307
## 291 136.7926 135.1885 138.3967
## 292 140.1527 138.3174 141.9881
## 293 134.6742 132.9748 136.3735
## 294 125.8355 122.5173 129.1536
## 295 130.3644 128.0243 132.7045
## 296 130.4374 128.1114 132.7634
## 297 125.3241 121.8866 128.7616
## 298 125.9085 122.6073 129.2097
## 299 128.1730 125.3813 130.9647
## 300 125.8355 122.5173 129.1536
## 301 130.3644 128.0243 132.7045
## 302 130.4374 128.1114 132.7634
## 303 130.2183 127.8499 132.5867
## 304 129.9261 127.5001 132.3521
## 305 124.3745 120.7124 128.0366
## 306 124.5206 120.8933 128.1479
## 307 127.8077 124.9362 130.6793
## 308 129.6339 127.1493 132.1186
## 309 125.4702 122.0669 128.8735
## 310 129.7070 127.2371 132.1768
## 311 125.1780 121.7062 128.6498
## 312 129.6339 127.1493 132.1186
## 313 130.1453 127.7626 132.5280
## 314 124.8128 121.2548 128.3708
## 315 129.8531 127.4125 132.2936
## 316 129.2687 126.7093 131.8281
## 317 129.2687 126.7093 131.8281
## 318 130.2183 127.8499 132.5867
## 319 126.2737 123.0568 129.4907
## 320 129.9261 127.5001 132.3521
## 321 130.5105 128.1985 132.8225
## 322 129.9261 127.5001 132.3521
## 323 130.7296 128.4591 133.0001
## 324 129.3417 126.7974 131.8860
## 325 128.2460 125.4701 131.0219
## 326 124.5937 120.9837 128.2036
## 327 128.4652 125.7365 131.1938
## 328 129.8531 127.4125 132.2936
## 329 125.5433 122.1571 128.9295
## 330 127.7347 124.8471 130.6223
## 331 130.8027 128.5458 133.0595
## 332 129.4878 126.9735 132.0022
## 333 129.2687 126.7093 131.8281
## 334 124.4476 120.8029 128.0923
## 335 128.6843 126.0024 131.3662
## 336 126.7851 123.6849 129.8852
## 337 128.6113 125.9138 131.3087
## 338 127.5886 124.6687 130.5085
## 339 125.3241 121.8866 128.7616
## 340 129.9261 127.5001 132.3521
## 341 127.5886 124.6687 130.5085
## 342 129.5609 127.0614 132.0603
## 343 129.3417 126.7974 131.8860
## 344 125.1780 121.7062 128.6498
## 345 127.5886 124.6687 130.5085
## 346 124.4476 120.8029 128.0923
## 347 130.5835 128.2854 132.8816
## 348 125.6163 122.2472 128.9855
## 349 130.4374 128.1114 132.7634
## 350 124.4476 120.8029 128.0923
## 351 125.1780 121.7062 128.6498
## 352 127.7347 124.8471 130.6223
## 353 126.9312 123.8641 129.9982
## 354 126.0546 122.7872 129.3220
## 355 129.8531 127.4125 132.2936
## 356 126.4198 123.2364 129.6033
## 357 129.8531 127.4125 132.2936
## 358 127.8077 124.9362 130.6793
## 359 127.0773 124.0432 130.1114
## 360 126.8581 123.7745 129.9417
## 361 125.1780 121.7062 128.6498
## 362 130.8027 128.5458 133.0595
## 363 126.1277 122.8771 129.3782
## 364 128.3921 125.6478 131.1365
## 365 124.5937 120.9837 128.2036
## 366 128.9765 126.3563 131.5967
## 367 127.1503 124.1326 130.1680
## 368 124.3015 120.6220 127.9810
## 369 125.9816 122.6972 129.2659
## 370 127.6616 124.7579 130.5654
## 371 125.6894 122.3372 129.0415
## 372 125.2511 121.7964 128.7057
## 373 127.7347 124.8471 130.6223
## 374 128.7574 126.0910 131.4237
## 375 125.6163 122.2472 128.9855
## 376 128.5382 125.8252 131.2512
## 377 126.7120 123.5953 129.8288
## 378 124.9589 121.4355 128.4823
## 379 127.4425 124.4902 130.3948
## 380 126.4929 123.3262 129.6596
## 381 126.2737 123.0568 129.4907
## 382 129.9992 127.5877 132.4106
## 383 124.3745 120.7124 128.0366
## 384 125.1050 121.6160 128.5940
## 385 126.2007 122.9670 129.4344
## 386 127.9538 125.1144 130.7933
## 387 128.3921 125.6478 131.1365
## 388 129.2687 126.7093 131.8281
## 389 128.4652 125.7365 131.1938
## 390 128.6843 126.0024 131.3662
## 391 128.2460 125.4701 131.0219
## 392 129.2687 126.7093 131.8281
## 393 128.1730 125.3813 130.9647
## 394 130.4374 128.1114 132.7634
## 395 126.8581 123.7745 129.9417
## 396 125.9085 122.6073 129.2097
## 397 127.8808 125.0253 130.7363
## 398 126.0546 122.7872 129.3220
## 399 127.6616 124.7579 130.5654
## 400 128.5382 125.8252 131.2512
## 401 127.7347 124.8471 130.6223
## 402 129.1956 126.6212 131.7701
## 403 128.1730 125.3813 130.9647
## 404 124.5937 120.9837 128.2036
## 405 129.1226 126.5329 131.7123
## 406 129.8531 127.4125 132.2936
## 407 126.7120 123.5953 129.8288
## 408 127.5156 124.5795 130.4516
## 409 130.7296 128.4591 133.0001
## 410 128.9035 126.2679 131.5390
## 411 125.4702 122.0669 128.8735
## 412 124.5206 120.8933 128.1479
## 413 125.6894 122.3372 129.0415
## 414 129.0495 126.4446 131.6544
## 415 130.7296 128.4591 133.0001
## 416 126.4198 123.2364 129.6033
## 417 129.0495 126.4446 131.6544
## 418 124.5206 120.8933 128.1479
## 419 130.7296 128.4591 133.0001
## 420 127.4425 124.4902 130.3948
## 421 129.0495 126.4446 131.6544
## 422 124.4476 120.8029 128.0923
## 423 126.5659 123.4159 129.7159
## 424 125.9816 122.6972 129.2659
## 425 129.5609 127.0614 132.0603
## 426 125.1050 121.6160 128.5940
## 427 128.6113 125.9138 131.3087
## 428 128.6113 125.9138 131.3087
## 429 130.8027 128.5458 133.0595
## 430 130.7296 128.4591 133.0001
## 431 130.6566 128.3723 132.9409
## 432 126.9312 123.8641 129.9982
## 433 127.8808 125.0253 130.7363
## 434 126.7120 123.5953 129.8288
## 435 127.0773 124.0432 130.1114
## 436 126.0546 122.7872 129.3220
## 437 126.8581 123.7745 129.9417
## 438 129.7070 127.2371 132.1768
## 439 124.4476 120.8029 128.0923
## 440 129.5609 127.0614 132.0603
## 441 128.3921 125.6478 131.1365
## 442 126.9312 123.8641 129.9982
## 443 125.9085 122.6073 129.2097
## 444 126.0546 122.7872 129.3220
## 445 130.4374 128.1114 132.7634
## 446 128.0999 125.2923 130.9075
## 447 124.8128 121.2548 128.3708
## 448 126.6390 123.5056 129.7723
## 449 124.6667 121.0741 128.2593
## 450 129.7070 127.2371 132.1768
## 451 129.2687 126.7093 131.8281
## 452 125.6894 122.3372 129.0415
## 453 124.8128 121.2548 128.3708
## 454 129.2687 126.7093 131.8281
## 455 125.0319 121.5257 128.5382
## 456 125.1050 121.6160 128.5940
## 457 126.0546 122.7872 129.3220
## 458 126.6390 123.5056 129.7723
## 459 124.8128 121.2548 128.3708
## 460 126.0546 122.7872 129.3220
## 461 130.6566 128.3723 132.9409
## 462 130.0722 127.6751 132.4693
## 463 128.0269 125.2034 130.8504
## 464 125.9816 122.6972 129.2659
## 465 138.9109 137.2111 140.6108
## 466 130.5835 128.2854 132.8816
## 467 131.8253 129.7503 133.9004
## 468 129.5609 127.0614 132.0603
## 469 134.6742 132.9748 136.3735
## 470 128.7574 126.0910 131.4237
## 471 132.4097 130.4293 134.3901
## 472 135.0394 133.3695 136.7093
## 473 130.2183 127.8499 132.5867
## 474 131.9714 129.9207 134.0221
## 475 133.4324 131.5978 135.2669
## 476 134.2359 132.4947 135.9771
## 477 130.3644 128.0243 132.7045
## 478 129.9992 127.5877 132.4106
## 479 128.9035 126.2679 131.5390
## 480 134.1629 132.4141 135.9116
## 481 135.1125 133.4479 136.7771
## 482 132.4828 130.5137 134.4519
## 483 130.2183 127.8499 132.5867
## 484 128.7574 126.0910 131.4237
## 485 134.1629 132.4141 135.9116
## 486 137.0117 135.4065 138.6169
## 487 137.0117 135.4065 138.6169
## 488 139.7875 137.9972 141.5778
## 489 137.4500 135.8364 139.0636
## 490 137.0117 135.4065 138.6169
## 491 136.2082 134.5967 137.8197
## 492 133.0671 131.1837 134.9506
## 493 128.7574 126.0910 131.4237
## 494 132.2636 130.2603 134.2670
## 495 129.9261 127.5001 132.3521
## 496 130.4374 128.1114 132.7634
## 497 131.8984 129.8356 133.9612
## 498 131.8253 129.7503 133.9004
## 499 143.0746 140.7615 145.3878
## 500 139.4953 137.7381 141.2526
## 501 143.8781 141.4070 146.3492
## 502 136.5734 134.9683 138.1785
## 503 137.9613 136.3274 139.5952
## 504 136.7195 135.1153 138.3237
## 505 139.2762 137.5418 141.0105
## 506 137.8152 136.1882 139.4422
## 507 138.9109 137.2111 140.6108
## 508 131.2410 129.0643 133.4176
## 509 134.9664 133.2910 136.6417
## 510 133.7976 132.0081 135.5872
## 511 130.8757 128.6325 133.1190
## 512 132.3367 130.3449 134.3285
## 513 131.8253 129.7503 133.9004
## 514 133.1402 131.2668 135.0136
## 515 130.2913 127.9371 132.6455
## 516 133.3593 131.5153 135.2034
## 517 133.7976 132.0081 135.5872
## 518 133.2132 131.3498 135.0767
## 519 143.6590 141.2318 146.0862
## 520 137.6691 136.0482 139.2901
## 521 141.9789 139.8655 144.0924
## 522 146.8731 143.7550 149.9912
## 523 133.0671 131.1837 134.9506
## 524 133.0671 131.1837 134.9506
## 525 138.6187 136.9429 140.2946
## 526 144.1703 141.6398 146.7009
## 527 142.0520 139.9258 144.1781
## 528 131.7523 129.6649 133.8397
## 529 136.7926 135.1885 138.3967
## 530 137.3039 135.6940 138.9138
## 531 143.7321 141.2903 146.1738
## 532 134.9664 133.2910 136.6417
## 533 139.7875 137.9972 141.5778
## 534 137.5961 135.9778 139.2144
## 535 129.7800 127.3248 132.2352
## 536 135.1125 133.4479 136.7771
## 537 140.2258 138.3810 142.0706
## 538 136.1351 134.5217 137.7486
## 539 135.7699 134.1432 137.3966
## 540 136.2812 134.6715 137.8910
## 541 129.6339 127.1493 132.1186
## 542 141.3945 139.3785 143.4105
## 543 135.4047 133.7591 137.0503
## 544 143.1477 140.8205 145.4748
## 545 141.2484 139.2557 143.2412
## 546 137.4500 135.8364 139.0636
## 547 135.9890 134.3710 137.6071
## 548 140.4449 138.5707 142.3191
## 549 134.6011 132.8953 136.3070
## 550 140.3719 138.5076 142.2361
## 551 137.4500 135.8364 139.0636
## 552 137.5230 135.9072 139.1389
## 553 137.1578 135.5507 138.7649
## 554 134.1629 132.4141 135.9116
## 555 137.3769 135.7653 138.9886
## 556 144.0242 141.5235 146.5249
## 557 136.5734 134.9683 138.1785
## 558 138.3266 136.6715 139.9816
## 559 141.3215 139.3172 143.3258
## 560 136.2082 134.5967 137.8197
## 561 134.6742 132.9748 136.3735
## 562 141.3945 139.3785 143.4105
## 563 136.2812 134.6715 137.8910
## 564 141.1023 139.1323 143.0724
## 565 142.7094 140.4650 144.9538
## 566 133.8707 132.0896 135.6517
## 567 137.5230 135.9072 139.1389
## 568 142.4902 140.2861 144.6944
## 569 137.2308 135.6225 138.8392
## 570 137.6691 136.0482 139.2901
## 571 129.4148 126.8855 131.9441
## 572 135.4777 133.8363 137.1191
## 573 130.3644 128.0243 132.7045
## 574 136.7195 135.1153 138.3237
## 575 141.9789 139.8655 144.0924
## 576 133.7976 132.0081 135.5872
## 577 148.3340 144.8780 151.7901
## 578 134.0168 132.2522 135.7813
## 579 142.4902 140.2861 144.6944
## 580 132.4828 130.5137 134.4519
## 581 136.5734 134.9683 138.1785
## 582 137.1578 135.5507 138.7649
## 583 141.1754 139.1941 143.1567
## 584 139.2031 137.4761 140.9302
## 585 142.1981 140.0463 144.3498
## 586 139.1301 137.4101 140.8500
## 587 138.9109 137.2111 140.6108
## 588 137.3769 135.7653 138.9886
## 589 138.6918 137.0103 140.3733
## 590 133.4324 131.5978 135.2669
## 591 136.9387 135.3341 138.5432
## 592 142.3442 140.1664 144.5219
## 593 140.2258 138.3810 142.0706
## 594 140.0797 138.2537 141.9057
## 595 134.9664 133.2910 136.6417
## 596 140.6641 138.7592 142.5690
## 597 134.8933 133.2123 136.5744
## 598 137.8883 136.2579 139.5186
## 599 136.2082 134.5967 137.8197
## 600 136.5004 134.8944 138.1063
## 601 142.1250 139.9861 144.2639
## 602 145.9965 143.0753 148.9178
## 603 144.0242 141.5235 146.5249
## 604 139.9336 138.1258 141.7414
## 605 140.2258 138.3810 142.0706
## 606 139.9336 138.1258 141.7414
## 607 143.2938 140.9384 145.6491
## 608 133.7976 132.0081 135.5872
## 609 144.0242 141.5235 146.5249
## 610 145.7043 142.8475 148.5611
## 611 131.5332 129.4081 133.6582
## 612 137.6691 136.0482 139.2901
## 613 149.5028 145.7694 153.2361
## 614 139.9336 138.1258 141.7414
## 615 144.9008 142.2177 147.5840
## 616 162.5783 155.5543 169.6022
## 617 140.4449 138.5707 142.3191
## 618 140.5910 138.6965 142.4856
## 619 141.0293 139.0705 142.9881
## 620 134.3090 132.5752 136.0427
## 621 140.0797 138.2537 141.9057
## 622 138.8379 137.1443 140.5314
## 623 142.7824 140.5245 145.0404
## 624 151.1098 146.9876 155.2320
## 625 138.4726 136.8076 140.1377
## 626 137.8883 136.2579 139.5186
## 627 138.5457 136.8754 140.2160
## 628 138.4726 136.8076 140.1377
## 629 143.5129 141.1147 145.9112
## 630 132.2636 130.2603 134.2670
## 631 144.0973 141.5817 146.6129
## 632 136.2082 134.5967 137.8197
## 633 136.7926 135.1885 138.3967
## 634 135.9160 134.2953 137.5367
## 635 138.1074 136.4657 139.7491
## 636 139.2762 137.5418 141.0105
## 637 143.5129 141.1147 145.9112
## 638 136.2812 134.6715 137.8910
## 639 142.4172 140.2263 144.6081
## 640 141.4676 139.4398 143.4954
## 641 139.1301 137.4101 140.8500
## 642 142.9285 140.6431 145.2139
## 643 138.1805 136.5345 139.8264
## 644 140.7371 138.8217 142.6525
## 645 138.1074 136.4657 139.7491
## 646 138.0344 136.3967 139.6721
## 647 137.0847 135.4787 138.6908
## 648 145.1930 142.4473 147.9387
## 649 135.9890 134.3710 137.6071
## 650 140.0797 138.2537 141.9057
## 651 136.5004 134.8944 138.1063
## 652 141.3215 139.3172 143.3258
## 653 134.5281 132.8156 136.2406
## 654 137.5961 135.9778 139.2144
## 655 137.6691 136.0482 139.2901
## 656 136.6465 135.0419 138.2510
## 657 138.3996 136.7397 140.0595
## 658 135.7699 134.1432 137.3966
## 659 137.3039 135.6940 138.9138
## 660 136.7926 135.1885 138.3967
## 661 132.2636 130.2603 134.2670
## 662 135.7699 134.1432 137.3966
## 663 139.3492 137.6074 141.0910
## 664 137.8152 136.1882 139.4422
## 665 144.3895 141.8137 146.9652
## 666 136.3543 134.7460 137.9625
## 667 151.8403 147.5390 156.1416
## 668 135.6238 133.9902 137.2574
## 669 138.4726 136.8076 140.1377
## 670 135.8429 134.2193 137.4666
## 671 133.5054 131.6802 135.3307
## 672 134.3820 132.6555 136.1085
## 673 139.5684 137.8031 141.3336
## 674 141.9059 139.8050 144.0068
## 675 130.5835 128.2854 132.8816
## 676 143.6590 141.2318 146.0862
## 677 137.8883 136.2579 139.5186
## 678 138.9109 137.2111 140.6108
## 679 138.3996 136.7397 140.0595
## 680 141.5406 139.5009 143.5803
## 681 140.4449 138.5707 142.3191
## 682 144.6817 142.0449 147.3185
## 683 139.0570 137.3439 140.7701
## 684 139.1301 137.4101 140.8500
## 685 140.3719 138.5076 142.2361
## 686 147.2383 144.0368 150.4399
## 687 139.2762 137.5418 141.0105
## 688 135.7699 134.1432 137.3966
## 689 137.6691 136.0482 139.2901
## 690 143.9512 141.4653 146.4371
## 691 136.5734 134.9683 138.1785
## 692 135.9160 134.2953 137.5367
## 693 136.6465 135.0419 138.2510
## 694 138.6187 136.9429 140.2946
## 695 137.3039 135.6940 138.9138
## 696 135.8429 134.2193 137.4666
## 697 141.1023 139.1323 143.0724
## 698 137.0117 135.4065 138.6169
## 699 136.0621 134.4464 137.6777
## 700 139.2031 137.4761 140.9302
## 701 136.5734 134.9683 138.1785
## 702 141.1023 139.1323 143.0724
## 703 143.7321 141.2903 146.1738
## 704 139.1301 137.4101 140.8500
## 705 137.5230 135.9072 139.1389
## 706 145.4852 142.6763 148.2941
## 707 140.8102 138.8841 142.7362
## 708 136.4273 134.8204 138.0343
## 709 136.8656 135.2614 138.4698
## 710 141.4676 139.4398 143.4954
## 711 143.4399 141.0560 145.8238
## 712 138.4726 136.8076 140.1377
## 713 144.2434 141.6978 146.7889
## 714 139.2031 137.4761 140.9302
## 715 131.6792 129.5794 133.7791
## 716 138.6918 137.0103 140.3733
## 717 141.0293 139.0705 142.9881
## 718 142.4902 140.2861 144.6944
## 719 139.9336 138.1258 141.7414
## 720 141.3945 139.3785 143.4105
## 721 137.5961 135.9778 139.2144
## 722 140.2258 138.3810 142.0706
## 723 134.3090 132.5752 136.0427
## 724 133.0671 131.1837 134.9506
## 725 145.2660 142.5046 148.0274
## 726 138.5457 136.8754 140.2160
## 727 143.6590 141.2318 146.0862
## 728 143.5860 141.1733 145.9986
## 729 142.9285 140.6431 145.2139
## 730 141.1754 139.1941 143.1567
## 731 139.5684 137.8031 141.3336
## 732 142.4172 140.2263 144.6081
## 733 137.8883 136.2579 139.5186
## 734 142.0520 139.9258 144.1781
## 735 135.1125 133.4479 136.7771
## 736 142.2711 140.1064 144.4358
## 737 141.3945 139.3785 143.4105
## 738 147.6766 144.3740 150.9792
## 739 141.3215 139.3172 143.3258
## 740 136.0621 134.4464 137.6777
## 741 140.8832 138.9463 142.8201
## 742 135.6968 134.0668 137.3269
## 743 136.0621 134.4464 137.6777
## 744 138.1805 136.5345 139.8264
## 745 141.0293 139.0705 142.9881
## 746 136.8656 135.2614 138.4698
## 747 137.8883 136.2579 139.5186
## 748 139.3492 137.6074 141.0910
## 749 138.3266 136.6715 139.9816
## 750 134.3090 132.5752 136.0427
## 751 141.6137 139.5620 143.6654
## 752 139.5684 137.8031 141.3336
## 753 136.7195 135.1153 138.3237
## 754 136.5004 134.8944 138.1063
## 755 136.8656 135.2614 138.4698
## 756 141.1754 139.1941 143.1567
## 757 138.3996 136.7397 140.0595
## 758 136.9387 135.3341 138.5432
## 759 142.0520 139.9258 144.1781
## 760 141.9789 139.8655 144.0924
## 761 138.1805 136.5345 139.8264
## 762 133.5785 131.7624 135.3946
## 763 137.7422 136.1183 139.3660
## 764 140.9563 139.0085 142.9040
## 765 139.6414 137.8680 141.4148
## 766 137.3769 135.7653 138.9886
## 767 140.8832 138.9463 142.8201
## 768 143.5129 141.1147 145.9112
## 769 140.0797 138.2537 141.9057
## 770 136.2812 134.6715 137.8910
## 771 137.2308 135.6225 138.8392
## 772 143.8781 141.4070 146.3492
## 773 135.4777 133.8363 137.1191
## 774 138.0344 136.3967 139.6721
## 775 138.2535 136.6031 139.9039
## 776 139.2031 137.4761 140.9302
## 777 140.5180 138.6337 142.4023
## 778 140.2988 138.4444 142.1533
## 779 136.7926 135.1885 138.3967
## 780 145.1199 142.3900 147.8499
## 781 139.9336 138.1258 141.7414
## 782 135.7699 134.1432 137.3966
## 783 138.6187 136.9429 140.2946
## 784 141.9789 139.8655 144.0924
## 785 138.4726 136.8076 140.1377
## 786 139.9336 138.1258 141.7414
## 787 143.2207 140.8795 145.5619
## 788 136.7926 135.1885 138.3967
## 789 134.6742 132.9748 136.3735
## 790 142.8555 140.5838 145.1271
## 791 143.1477 140.8205 145.4748
## 792 138.2535 136.6031 139.9039
## 793 139.9336 138.1258 141.7414
## 794 135.6968 134.0668 137.3269
## 795 138.9109 137.2111 140.6108
## 796 151.2559 147.0980 155.4138
## 797 133.9437 132.1710 135.7164
## 798 140.7371 138.8217 142.6525
## 799 139.3492 137.6074 141.0910
## 800 144.3895 141.8137 146.9652
## 801 134.8203 133.1333 136.5072
## 802 138.3996 136.7397 140.0595
## 803 150.1602 146.2687 154.0517
## 804 141.0293 139.0705 142.9881
## 805 138.8379 137.1443 140.5314
## 806 134.0898 132.3332 135.8464
## 807 143.9512 141.4653 146.4371
## 808 141.9789 139.8655 144.0924
## 809 140.0066 138.1898 141.8235
## 810 139.6414 137.8680 141.4148
## 811 139.4953 137.7381 141.2526
## 812 137.0117 135.4065 138.6169
## 813 138.8379 137.1443 140.5314
## 814 143.5860 141.1733 145.9986
## 815 141.6137 139.5620 143.6654
## 816 143.2938 140.9384 145.6491
## 817 140.2258 138.3810 142.0706
## 818 143.2207 140.8795 145.5619
## 819 142.4902 140.2861 144.6944
## 820 143.1477 140.8205 145.4748
## 821 144.6086 141.9872 147.2301
## 822 138.9109 137.2111 140.6108
## 823 143.9512 141.4653 146.4371
## 824 139.6414 137.8680 141.4148
## 825 142.4172 140.2263 144.6081
## 826 139.2762 137.5418 141.0105
## 827 136.9387 135.3341 138.5432
## 828 137.1578 135.5507 138.7649
## 829 136.2812 134.6715 137.8910
## 830 136.2812 134.6715 137.8910
## 831 139.7875 137.9972 141.5778
## 832 137.9613 136.3274 139.5952
## 833 140.2258 138.3810 142.0706
## 834 137.4500 135.8364 139.0636
## 835 138.8379 137.1443 140.5314
## 836 139.9336 138.1258 141.7414
## 837 133.6515 131.8445 135.4586
## 838 145.4852 142.6763 148.2941
## 839 134.7472 133.0542 136.4403
## 840 136.2082 134.5967 137.8197
## 841 140.5910 138.6965 142.4856
## 842 146.2887 143.3024 149.2750
## 843 142.0520 139.9258 144.1781
## 844 134.9664 133.2910 136.6417
## 845 143.8051 141.3487 146.2615
## 846 137.3769 135.7653 138.9886
## 847 140.3719 138.5076 142.2361
## 848 140.0066 138.1898 141.8235
## 849 138.2535 136.6031 139.9039
## 850 133.3593 131.5153 135.2034
## 851 138.4726 136.8076 140.1377
## 852 134.3090 132.5752 136.0427
## 853 140.1527 138.3174 141.9881
## 854 145.1199 142.3900 147.8499
## 855 141.3945 139.3785 143.4105
## 856 144.8278 142.1601 147.4954
## 857 140.6641 138.7592 142.5690
## 858 140.9563 139.0085 142.9040
## 859 143.8781 141.4070 146.3492
## 860 139.8605 138.0616 141.6595
## 861 139.4953 137.7381 141.2526
## 862 141.0293 139.0705 142.9881
## 863 134.8933 133.2123 136.5744
## 864 141.9789 139.8655 144.0924
## 865 135.1125 133.4479 136.7771
## 866 137.3769 135.7653 138.9886
## 867 142.5633 140.3458 144.7808
## 868 134.1629 132.4141 135.9116
## 869 136.8656 135.2614 138.4698
## 870 143.4399 141.0560 145.8238
## 871 139.1301 137.4101 140.8500
## 872 147.1653 143.9805 150.3501
## 873 145.8504 142.9615 148.7394
## 874 139.4223 137.6728 141.1717
## 875 146.2157 143.2457 149.1856
## 876 136.4273 134.8204 138.0343
## 877 142.1250 139.9861 144.2639
## 878 140.8102 138.8841 142.7362
## 879 138.1074 136.4657 139.7491
## 880 135.9160 134.2953 137.5367
## 881 140.5910 138.6965 142.4856
## 882 142.8555 140.5838 145.1271
## 883 135.4047 133.7591 137.0503
## 884 142.2711 140.1064 144.4358
## 885 137.1578 135.5507 138.7649
## 886 137.6691 136.0482 139.2901
## 887 139.4223 137.6728 141.1717
## 888 136.2812 134.6715 137.8910
## 889 136.2812 134.6715 137.8910
## 890 137.9613 136.3274 139.5952
## 891 141.6867 139.6229 143.7506
## 892 137.4500 135.8364 139.0636
## 893 138.3266 136.6715 139.9816
## 894 135.7699 134.1432 137.3966
## 895 145.8504 142.9615 148.7394
## 896 139.8605 138.0616 141.6595
## 897 136.3543 134.7460 137.9625
## 898 135.4047 133.7591 137.0503
## 899 136.2082 134.5967 137.8197
## 900 144.6086 141.9872 147.2301
## 901 137.8152 136.1882 139.4422
## 902 137.4500 135.8364 139.0636
## 903 137.5230 135.9072 139.1389
## 904 138.9109 137.2111 140.6108
## 905 136.8656 135.2614 138.4698
## 906 146.3618 143.3591 149.3644
## 907 133.7246 131.9263 135.5228
## 908 135.0394 133.3695 136.7093
## 909 135.7699 134.1432 137.3966
## 910 132.8480 130.9335 134.7626
## 911 134.2359 132.4947 135.9771
## 912 138.9840 137.2776 140.6904
## 913 140.6641 138.7592 142.5690
## 914 135.4777 133.8363 137.1191
## 915 130.9488 128.7190 133.1785
## 916 138.6187 136.9429 140.2946
## 917 134.1629 132.4141 135.9116

4.3. Regresión Lineal Múltiple

Este modelo, que puede inicialmente pensarse como una extensión de la regresión lineal simple para facilitar su comprensión, y que eventualmente serÔ llamado en este estudio como RLM, tiene como ecuación general aditiva:

\[y_i=\beta_0+\beta_1 x_{i1}+\cdots+\beta_k x_{ik}+\varepsilon_i, \hspace{3mm}i=1,2,\dots,n\hspace{10mm}(21)\]

donde \(E(\epsilon)=0\) y \(V(\epsilon)=\sigma^2\). También, para hacer pruebas de hipótesis y calcular intervalos de confianza y de predicción, se supone que \(\epsilon\) estÔ normalmente distribuida. Complementariamente, con base en el enfoque de los mínimos cuadrados ordinarios, la estimación de sus parÔmetros se plantea en términos de la minimización de una función de ensayo desde la cual se observan los cuadrados de las desviaciones de la variable estudiada. La función de ensayo se representa como \(f(b_0,b_1,...,b_k)= \sum_{j}[y_i-(b_0+b_1x_{1j}+b_2x_{2j}+...+b_kx_{kj})]^2\). Esto conduce a un conjunto de ecuaciones normales lineales en \(b_0,b_1,...,b_k\), que al ser resueltas entregan las estimaciones de mínimos cuadrados de \(\hat{\beta_0},\hat{\beta_1},...,, \hat{\beta_k}\).

Complementariamente, la proporción de variación total explicada por el modelo de regresión múltiple a través del coeficiente de determinación múltiple se ajusta, generalmente, con base en el número de parÔmetros del modelo.

AdemÔs, una prueba de utilidad del modelo de regresión lineal múltiple consiste en una prueba de hipótesis basada en un estadístico que tiene una distribución \(F\) particular cuando \(H_0\) es verdadera, esto de expresa en el par:

\[H_0:\beta_1=\beta_2=\cdots=\beta_k=0\hspace{10mm}(22)\] \[H_1: \text {al menos una }\beta_i\neq 0\hspace{5mm}(i=1,...,k)\hspace{10mm}(23)\]

el valor del estadĆ­stico de prueba es:

\[f=\frac{R^2/k}{(1-R^2)(n-(k+1))}=\frac{SCR/k}{SCE/(n-(k+1))}=\frac{RMC}{CME}\hspace{10mm}(24)\]

donde \(SCR=STC-SCE\), que es la suma de cuadrados de regresión, y la región de rechazo para una prueba de nivel \(\alpha\) es:

\[f\geq F_{\alpha, k,n-(k+1)}\hspace{10mm}(25)\]

Por Ćŗltimo, un intervalo de confianza al \(100(1-\alpha)\%\) para \(\beta_i\) es:

\[\hat\beta_i\pm t_{\alpha/2,n-(k+1)}\cdot s_{\hat\beta_{i}}\hspace{10mm}(26)\] y un intervalo de confianza al mismo nivel de significancia para un valor futuro estĆ” dado por:

\[\hat y\pm t_{\alpha/2,n-(k+1)}\cdot \sqrt{s^2+s^2_{\hat Y}}\hspace{10mm}(27)\]

Para cerrar, es necesario mencionar que eventualmente surgen problemas en los anÔlisis de regresión múltiple que implican considerar técnicas de solución relacionadas con transformaciones de no-linealidad, estandarización y selección de variables, identificación de observaciones influyentes, multicolinealidad, entre otras.

Planteaminto del problema

Basandonos en el conjunto descrito en la fase 1 se formulara un modelo de regresion linal multiple para estudiar la relacion linal multiple supuesta entre las varaibles definidas por los campos: FrecC_Max (Variable dependiente) y las demas como variables independientes: Edad, PA_reposo, Colesterol, AS_Ayunas, Oldpeak, Sexo, ipo_dolor_pecho, ECG_reposo, Angina_Ejercicio, Pendi_Segme_ST_Ejercicio y Clase_salida

Desarrollo del anƔlisis

En el siguiente desarrollo del anƔlisis se hara en R Stutio y este mismo contara con varias secciones que se presentaran a continuacion.

4.3.1. Resumen estadĆ­stico de las variables de estudio

En base a la navegacion a travƩs de pestaƱas muestran un resumen estadistico de todas la variables del conjunto de datos, Sin embargo, para las variables qeu son de naturaleza Cuantitativas::Razon el resumen se hara de manera tradiconal, pero para las variables que son de naturaleza Cualitativas::Nominal el resumen estadistico solo considerara conteos, proporciones y diagramas de barra. Se recalca de nuevo que la variable dependiente es FrecC_Max.

Resumen Variables Cuantitativas

summary(heart_diseases_Dataset$Edad)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   28.00   47.00   54.00   53.51   60.00   77.00
summary(heart_diseases_Dataset$PA_reposo)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    80.0   120.0   130.0   132.5   140.0   200.0
summary(heart_diseases_Dataset$Colesterol)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##      40     163     219     211     264     603
summary(heart_diseases_Dataset$AS_Ayunas)
## Warning: Unknown or uninitialised column: `AS_Ayunas`.
## Length  Class   Mode 
##      0   NULL   NULL
summary(heart_diseases_Dataset$FrecC_Max)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    60.0   120.0   138.0   136.8   156.0   202.0
summary(heart_diseases_Dataset$Oldpeak)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## -26.000   0.000   1.000   5.383   8.000  62.000

Resumen Variables Cualitativas

table(heart_diseases_Dataset$Sexo)
## 
##   F   M 
## 193 724
prop.table(table(heart_diseases_Dataset$Sexo))
## 
##         F         M 
## 0.2104689 0.7895311
barplot(table(heart_diseases_Dataset$Sexo))

table(heart_diseases_Dataset$Tipo_dolor_pecho)
## 
##    angina atipica     angina tipica      asintomatico dolor no anginoso 
##               173                46               496               202
prop.table(table(heart_diseases_Dataset$Tipo_dolor_pecho))
## 
##    angina atipica     angina tipica      asintomatico dolor no anginoso 
##        0.18865867        0.05016358        0.54089422        0.22028353
barplot(table(heart_diseases_Dataset$Tipo_dolor_pecho))

table(heart_diseases_Dataset$ECG_reposo)
## 
##    LVH Normal     ST 
##    188    551    178
prop.table(table(heart_diseases_Dataset$ECG_reposo))
## 
##       LVH    Normal        ST 
## 0.2050164 0.6008724 0.1941112
barplot(table(heart_diseases_Dataset$ECG_reposo))

table(heart_diseases_Dataset$Angina_Ejercicio)
## 
##   N   Y 
## 546 371
prop.table(table(heart_diseases_Dataset$Angina_Ejercicio))
## 
##         N         Y 
## 0.5954198 0.4045802
barplot(table(heart_diseases_Dataset$Angina_Ejercicio))

table(heart_diseases_Dataset$Pendi_Segme_ST_Ejercicio)
## 
##  ascendente descendente       plano 
##         395          63         459
prop.table(table(heart_diseases_Dataset$Pendi_Segme_ST_Ejercicio))
## 
##  ascendente descendente       plano 
##  0.43075245  0.06870229  0.50054526
barplot(table(heart_diseases_Dataset$Pendi_Segme_ST_Ejercicio))

table(heart_diseases_Dataset$Clase_salida)
## 
## Enfermedad cardiaca              Normal 
##                 507                 410
prop.table(table(heart_diseases_Dataset$Clase_salida))
## 
## Enfermedad cardiaca              Normal 
##           0.5528899           0.4471101
barplot(table(heart_diseases_Dataset$Clase_salida))

Diagramas de Dispersión Variables Cuantitativas

pairs(~Edad + PA_reposo + Colesterol + AZ_Ayunas + FrecC_Max + Oldpeak, data = heart_diseases_Dataset)

4.3.2. Formulación del modelo de RLM entre las variables de estudio

En base a la navegacion a traves de las pestaƱas muestra el resumen y la tabla ANOVA del modelo de regresion lineal multiple total y los coeficientes tanto del modelo mencionado anteriormente como el logrado luego de reducirlo. Con base en la exploracion de lo datos mencionados anteriormente y la tabla ANOVA del modelo total se formularan para comparaciones del modelo RLM: uno que incluye a todas las variables del conjunto de datos y se excluyeron las variables PA_reposo, Colesterol y AS_Ayunas .Se menciona de nuevo que FrecC_Max es la variable dependiente

Antes de continuar cabe reclacar que se hicieron las siguientes modificaciones en cuanto a las variables Cualitativas en donde se modifico su etiquetado por uno numerico: Sexo (0: M y 1: F), Tipo_dolor_pecho (1: angina tƭpica, 2: angina atƭpica, 3: dolor no anginoso y 4: asintomƔtico), ECG_reposo (1: Normal, 2: ST y 3: LVH), Angina_Ejercicio (0: N y 1: Y), Pendi_Segme_ST_Ejercicio (1: ascendente, 2: Plano y 3: descendente) y Clase_salida (0: Normal y 1: Enfermedad cardƭaca) el conjunto de datos se llamara Prediccion_Insuficiencia_cardiaca_Var_MOD.

Al considerar los resultados que se presentan en la pestaƱa de Coeficientes del Modelo RLM Total se puede establecer que el modelo de regresion linal multiple que relaciona a la variable de interes, las cuales se resumirian como: \(FRECM\) (FrecC_Max), \(ED\) (Edad), \(PAR\) (PA_reposo), \(COL\) (Colesterol), \(ASY\) (AS_Ayunas), \(OLD\) (Oldpeak), \(S_1\) (Sexo::1), \(T_2\) (Tipo_dolor_pecho::2) \(T_3\) (Tipo_dolor_pecho::3) \(T_4\) (Tipo_dolor_pecho::4), \(E_2\) (ECG_reposo::2), \(E_3\) (ECG_reposo::3), \(A_1\) (Angina_Ejercicio::1), \(P_2\) (Pendi_Segme_ST_Ejercicio::2), \(P_3\) (Pendi_Segme_ST_Ejercicio::3) y \(C_1\) (Clase_salida::1), tiene la formualcion (con unos coeficientes redondeados a 4 cifras decimales por tema de estetica)

\(FRECM = 184,9992-0,7925*ED-0,0054*PAR+0,0381*COL+0,0062*ASY+0,2071*OLD+3,2926*S_1-4,2267*T_2\) \(-4,2704*T_3-11,2141*T_4-1,3551*E_2+8,0578*E_3-6,9187*A_1-9,3213*P_2-5,7960*P_3-2,7596*C_1\) \((28)\)

Para este modelo se obvian las interpretaciones en que las variables fucen cero ya que por la naturaleza de alguna de estas carece de sentido y la interpretacion del intercepto si que tiene sentido ya que trabajamos con una frecuencia cardiaca aunque el valor que tomaria seria muy alto comparado con lo normal.

Por otro lado, luego de revisar el resumen estadistico y la tabal ANOVA del modelo RLM total (con nombre de pestaƱa homonimo a este), se puede establecer, con el apoyo de los resumenes estadisticos de las variables de estudio, que pueden excluirse directamente del modelo por baja significancia a las variables PA_reposo, Colesterol y AS_Ayunas. Esto implico que se calculase un modelo reducidocon la formulacion (Con base ne las mismas consideraciones de edicion del modelo total):

\(FRECM = 193,8626-0,8124*ED+0,2313*OLD+4,4319*S_1-3,5217*T_2-4,4422*T_3-11,2238*T_4\) \(-2,1197*E_2+9,3526*E_3-6,5243*A_1-8,990*P_2-6,2565*P_3-3.6201*C_1\) \((29)\)

Resumen y ANOVA del Modelo RLM Total

summary(lm(heart_diseases_Dataset_VR_MOD$FrecC_Max~heart_diseases_Dataset_VR_MOD$Edad+heart_diseases_Dataset_VR_MOD$PA_reposo+heart_diseases_Dataset_VR_MOD$Colesterol+heart_diseases_Dataset_VR_MOD$AZ_Ayunas+heart_diseases_Dataset_VR_MOD$Oldpeak+as.factor(heart_diseases_Dataset_VR_MOD$Sexo)+as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)+as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)+as.factor(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio)+as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio)+as.factor(heart_diseases_Dataset_VR_MOD$Clase_salida)))
## 
## Call:
## lm(formula = heart_diseases_Dataset_VR_MOD$FrecC_Max ~ heart_diseases_Dataset_VR_MOD$Edad + 
##     heart_diseases_Dataset_VR_MOD$PA_reposo + heart_diseases_Dataset_VR_MOD$Colesterol + 
##     heart_diseases_Dataset_VR_MOD$AZ_Ayunas + heart_diseases_Dataset_VR_MOD$Oldpeak + 
##     as.factor(heart_diseases_Dataset_VR_MOD$Sexo) + as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho) + 
##     as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo) + as.factor(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio) + 
##     as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio) + 
##     as.factor(heart_diseases_Dataset_VR_MOD$Clase_salida))
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -71.435 -12.249   0.991  14.600  55.542 
## 
## Coefficients:
##                                                                      Estimate
## (Intercept)                                                        184.999165
## heart_diseases_Dataset_VR_MOD$Edad                                  -0.792522
## heart_diseases_Dataset_VR_MOD$PA_reposo                             -0.005399
## heart_diseases_Dataset_VR_MOD$Colesterol                             0.038062
## heart_diseases_Dataset_VR_MOD$AZ_Ayunas                              0.006255
## heart_diseases_Dataset_VR_MOD$Oldpeak                                0.207178
## as.factor(heart_diseases_Dataset_VR_MOD$Sexo)1                       3.292589
## as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)2          -4.226743
## as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)3          -4.270412
## as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)4         -11.214059
## as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)2                -1.355094
## as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)3                 8.057764
## as.factor(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio)1          -6.918709
## as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio)2  -9.321259
## as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio)3  -5.795977
## as.factor(heart_diseases_Dataset_VR_MOD$Clase_salida)1              -2.759563
##                                                                    Std. Error
## (Intercept)                                                          6.988841
## heart_diseases_Dataset_VR_MOD$Edad                                   0.081304
## heart_diseases_Dataset_VR_MOD$PA_reposo                              0.040041
## heart_diseases_Dataset_VR_MOD$Colesterol                             0.008985
## heart_diseases_Dataset_VR_MOD$AZ_Ayunas                              0.009161
## heart_diseases_Dataset_VR_MOD$Oldpeak                                0.086784
## as.factor(heart_diseases_Dataset_VR_MOD$Sexo)1                       1.792769
## as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)2           3.543471
## as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)3           3.410477
## as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)4           3.318489
## as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)2                 1.836158
## as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)3                 1.827431
## as.factor(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio)1           1.723821
## as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio)2   1.867817
## as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio)3   3.163740
## as.factor(heart_diseases_Dataset_VR_MOD$Clase_salida)1               2.079388
##                                                                    t value
## (Intercept)                                                         26.471
## heart_diseases_Dataset_VR_MOD$Edad                                  -9.748
## heart_diseases_Dataset_VR_MOD$PA_reposo                             -0.135
## heart_diseases_Dataset_VR_MOD$Colesterol                             4.236
## heart_diseases_Dataset_VR_MOD$AZ_Ayunas                              0.683
## heart_diseases_Dataset_VR_MOD$Oldpeak                                2.387
## as.factor(heart_diseases_Dataset_VR_MOD$Sexo)1                       1.837
## as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)2          -1.193
## as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)3          -1.252
## as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)4          -3.379
## as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)2                -0.738
## as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)3                 4.409
## as.factor(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio)1          -4.014
## as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio)2  -4.990
## as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio)3  -1.832
## as.factor(heart_diseases_Dataset_VR_MOD$Clase_salida)1              -1.327
##                                                                    Pr(>|t|)    
## (Intercept)                                                         < 2e-16 ***
## heart_diseases_Dataset_VR_MOD$Edad                                  < 2e-16 ***
## heart_diseases_Dataset_VR_MOD$PA_reposo                            0.892773    
## heart_diseases_Dataset_VR_MOD$Colesterol                           2.51e-05 ***
## heart_diseases_Dataset_VR_MOD$AZ_Ayunas                            0.494876    
## heart_diseases_Dataset_VR_MOD$Oldpeak                              0.017179 *  
## as.factor(heart_diseases_Dataset_VR_MOD$Sexo)1                     0.066599 .  
## as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)2         0.233252    
## as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)3         0.210842    
## as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)4         0.000758 ***
## as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)2               0.460704    
## as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)3               1.16e-05 ***
## as.factor(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio)1         6.48e-05 ***
## as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio)2 7.23e-07 ***
## as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio)3 0.067281 .  
## as.factor(heart_diseases_Dataset_VR_MOD$Clase_salida)1             0.184811    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 20.64 on 901 degrees of freedom
## Multiple R-squared:  0.3537, Adjusted R-squared:  0.343 
## F-statistic: 32.87 on 15 and 901 DF,  p-value: < 2.2e-16
anova(lm(heart_diseases_Dataset_VR_MOD$FrecC_Max~heart_diseases_Dataset_VR_MOD$Edad+heart_diseases_Dataset_VR_MOD$PA_reposo+heart_diseases_Dataset_VR_MOD$Colesterol+heart_diseases_Dataset_VR_MOD$AZ_Ayunas+heart_diseases_Dataset_VR_MOD$Oldpeak+as.factor(heart_diseases_Dataset_VR_MOD$Sexo)+as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)+as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)+as.factor(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio)+as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio)+as.factor(heart_diseases_Dataset_VR_MOD$Clase_salida)))
## Analysis of Variance Table
## 
## Response: heart_diseases_Dataset_VR_MOD$FrecC_Max
##                                                                    Df Sum Sq
## heart_diseases_Dataset_VR_MOD$Edad                                  1  86820
## heart_diseases_Dataset_VR_MOD$PA_reposo                             1     53
## heart_diseases_Dataset_VR_MOD$Colesterol                            1  24392
## heart_diseases_Dataset_VR_MOD$AZ_Ayunas                             1    193
## heart_diseases_Dataset_VR_MOD$Oldpeak                               1      0
## as.factor(heart_diseases_Dataset_VR_MOD$Sexo)                       1   9686
## as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)           3  41729
## as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)                 2  11966
## as.factor(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio)           1  17954
## as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio)   2  16594
## as.factor(heart_diseases_Dataset_VR_MOD$Clase_salida)               1    751
## Residuals                                                         901 383956
##                                                                   Mean Sq
## heart_diseases_Dataset_VR_MOD$Edad                                  86820
## heart_diseases_Dataset_VR_MOD$PA_reposo                                53
## heart_diseases_Dataset_VR_MOD$Colesterol                            24392
## heart_diseases_Dataset_VR_MOD$AZ_Ayunas                               193
## heart_diseases_Dataset_VR_MOD$Oldpeak                                   0
## as.factor(heart_diseases_Dataset_VR_MOD$Sexo)                        9686
## as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)           13910
## as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)                  5983
## as.factor(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio)           17954
## as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio)    8297
## as.factor(heart_diseases_Dataset_VR_MOD$Clase_salida)                 751
## Residuals                                                             426
##                                                                    F value
## heart_diseases_Dataset_VR_MOD$Edad                                203.7327
## heart_diseases_Dataset_VR_MOD$PA_reposo                             0.1246
## heart_diseases_Dataset_VR_MOD$Colesterol                           57.2385
## heart_diseases_Dataset_VR_MOD$AZ_Ayunas                             0.4539
## heart_diseases_Dataset_VR_MOD$Oldpeak                               0.0006
## as.factor(heart_diseases_Dataset_VR_MOD$Sexo)                      22.7302
## as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)          32.6407
## as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)                14.0398
## as.factor(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio)          42.1314
## as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio)  19.4701
## as.factor(heart_diseases_Dataset_VR_MOD$Clase_salida)               1.7612
## Residuals                                                                 
##                                                                      Pr(>F)    
## heart_diseases_Dataset_VR_MOD$Edad                                < 2.2e-16 ***
## heart_diseases_Dataset_VR_MOD$PA_reposo                              0.7242    
## heart_diseases_Dataset_VR_MOD$Colesterol                          9.522e-14 ***
## heart_diseases_Dataset_VR_MOD$AZ_Ayunas                              0.5006    
## heart_diseases_Dataset_VR_MOD$Oldpeak                                0.9799    
## as.factor(heart_diseases_Dataset_VR_MOD$Sexo)                     2.173e-06 ***
## as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)         < 2.2e-16 ***
## as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)               9.901e-07 ***
## as.factor(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio)         1.407e-10 ***
## as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio) 5.271e-09 ***
## as.factor(heart_diseases_Dataset_VR_MOD$Clase_salida)                0.1848    
## Residuals                                                                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Coeficientes del Modelo RLM Total

coefficients(lm(heart_diseases_Dataset_VR_MOD$FrecC_Max~heart_diseases_Dataset_VR_MOD$Edad+heart_diseases_Dataset_VR_MOD$PA_reposo+heart_diseases_Dataset_VR_MOD$Colesterol+heart_diseases_Dataset_VR_MOD$AZ_Ayunas+heart_diseases_Dataset_VR_MOD$Oldpeak+as.factor(heart_diseases_Dataset_VR_MOD$Sexo)+as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)+as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)+as.factor(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio)+as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio)+as.factor(heart_diseases_Dataset_VR_MOD$Clase_salida)))
##                                                        (Intercept) 
##                                                      184.999164912 
##                                 heart_diseases_Dataset_VR_MOD$Edad 
##                                                       -0.792522115 
##                            heart_diseases_Dataset_VR_MOD$PA_reposo 
##                                                       -0.005398864 
##                           heart_diseases_Dataset_VR_MOD$Colesterol 
##                                                        0.038061776 
##                            heart_diseases_Dataset_VR_MOD$AZ_Ayunas 
##                                                        0.006255459 
##                              heart_diseases_Dataset_VR_MOD$Oldpeak 
##                                                        0.207177645 
##                     as.factor(heart_diseases_Dataset_VR_MOD$Sexo)1 
##                                                        3.292588647 
##         as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)2 
##                                                       -4.226743236 
##         as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)3 
##                                                       -4.270412166 
##         as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)4 
##                                                      -11.214058889 
##               as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)2 
##                                                       -1.355094124 
##               as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)3 
##                                                        8.057764318 
##         as.factor(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio)1 
##                                                       -6.918709208 
## as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio)2 
##                                                       -9.321259141 
## as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio)3 
##                                                       -5.795977024 
##             as.factor(heart_diseases_Dataset_VR_MOD$Clase_salida)1 
##                                                       -2.759563310

Coeficientes del Modelo RLM Reducido

coefficients(lm(heart_diseases_Dataset_VR_MOD$FrecC_Max~heart_diseases_Dataset_VR_MOD$Edad+heart_diseases_Dataset_VR_MOD$Oldpeak+as.factor(heart_diseases_Dataset_VR_MOD$Sexo)+as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)+as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)+as.factor(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio)+as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio)+as.factor(heart_diseases_Dataset_VR_MOD$Clase_salida)))
##                                                        (Intercept) 
##                                                        193.8625671 
##                                 heart_diseases_Dataset_VR_MOD$Edad 
##                                                         -0.8124233 
##                              heart_diseases_Dataset_VR_MOD$Oldpeak 
##                                                          0.2313500 
##                     as.factor(heart_diseases_Dataset_VR_MOD$Sexo)1 
##                                                          4.4318673 
##         as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)2 
##                                                         -3.5216920 
##         as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)3 
##                                                         -4.4422221 
##         as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)4 
##                                                        -11.2238106 
##               as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)2 
##                                                         -2.1196904 
##               as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)3 
##                                                          9.3525525 
##         as.factor(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio)1 
##                                                         -6.5242607 
## as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio)2 
##                                                         -8.9903956 
## as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio)3 
##                                                         -6.2564802 
##             as.factor(heart_diseases_Dataset_VR_MOD$Clase_salida)1 
##                                                         -3.6201479

4.3.3. AnƔlisis del modelo RLM

En base a travez de la navegacion de pestañas, en primera parte Mejor Modelo Iterado según AIC muestra que la desicion de de que excluir dos variables (PA_reposo, y AS_Ayunas) de las tres propuestas tambien nos mustra que desidio excluir la variable Clase_salida y la cambio por Colesterol esto cabe recalcar que fue un cambio curioso si lo miramos lo que aporta la variable al modelo, tambien se debe mencionar que todo esto se hizo en la cuarta iteracion. Ademas el algoritmo tambien construyo un modelo basado en casi las mismas variables del modelo reducido lo cual fundamenta la inspeccion de las variables en la partes precedentes.

De manera complementaria, en la pestaƱa de Bondades de Ajuste, Significancias y Criterios de Informacion Comparados se presenta de manera paralela los modelos generados. La consideracion de todas las variables del cojunto de datos presento una bondad de ajuste con base en el coeficiente de determinacion multiple qeu solo se redujo hablando en terminos absolutos en \(0,013\) puntos (es decir se paso de explicar el \(35,4\) \(%\) de la variabilidad a un \(34,1\) \(%\)) en comparacion con el modelo reducido y el iterado; ademas, las significancias global e individuales de estos evidencias que ambos modelos son similares pero no iguales, tiene cierto grado de diferencia, aportan una cantidad significante de informacion relevante para la variable dependiente FrecC_Max, porque para los valores criticos obtenidos para las pruebas \(F\) (para la significancia glogal) y \(t\) (para las significancias individuales), los \(p-value\) en la mayoria de los casos resultaron siempre menores para cualquier nivel de significancia \(\alpha\) incluido dentro de los tradiciones commo por ejemplo, \(\alpha\ = 0,01\).

Por ultimo, los criterios de informacion AIC y BIC muestran efectivamente que los modelos son similares reducido e iterado la relacion entre el sesgo y la varianza en sus formulaciones respectivas, es decir, entre sus semejanzas y complejidades, resulta modelo total: \(AIC_{IteradoSTEP}=8168,475<8172,424=AIC_{RLMTotal}<8184,6238=AIC_{RLMReducido}\) y \(BIC_{IteradoSTEP}=8235,971<8252,133=BIC_{RLMReducido}<8254,383=BIC_{RLMTotal}\).

Y tambien demuestran que el modelo iterado por el metodo STEP tiene los valores mas bajos tanto en el AIC como de BIC en comparacion con el modelo total y reducido, es decir que le modelo iterado por el metod STEP proporcion un mejor ajuste de los datos.

Mejor Modelo Iterado segĆŗn AIC

modelo_Iterado_STEP = step(lm(heart_diseases_Dataset_VR_MOD$FrecC_Max~heart_diseases_Dataset_VR_MOD$Edad+heart_diseases_Dataset_VR_MOD$PA_reposo+heart_diseases_Dataset_VR_MOD$Colesterol+heart_diseases_Dataset_VR_MOD$AZ_Ayunas+heart_diseases_Dataset_VR_MOD$Oldpeak+as.factor(heart_diseases_Dataset_VR_MOD$Sexo)+as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)+as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)+as.factor(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio)+as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio)+as.factor(heart_diseases_Dataset_VR_MOD$Clase_salida)))
## Start:  AIC=5568.09
## heart_diseases_Dataset_VR_MOD$FrecC_Max ~ heart_diseases_Dataset_VR_MOD$Edad + 
##     heart_diseases_Dataset_VR_MOD$PA_reposo + heart_diseases_Dataset_VR_MOD$Colesterol + 
##     heart_diseases_Dataset_VR_MOD$AZ_Ayunas + heart_diseases_Dataset_VR_MOD$Oldpeak + 
##     as.factor(heart_diseases_Dataset_VR_MOD$Sexo) + as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho) + 
##     as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo) + as.factor(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio) + 
##     as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio) + 
##     as.factor(heart_diseases_Dataset_VR_MOD$Clase_salida)
## 
##                                                                     Df
## - heart_diseases_Dataset_VR_MOD$PA_reposo                            1
## - heart_diseases_Dataset_VR_MOD$AZ_Ayunas                            1
## - as.factor(heart_diseases_Dataset_VR_MOD$Clase_salida)              1
## <none>                                                                
## - as.factor(heart_diseases_Dataset_VR_MOD$Sexo)                      1
## - heart_diseases_Dataset_VR_MOD$Oldpeak                              1
## - as.factor(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio)          1
## - heart_diseases_Dataset_VR_MOD$Colesterol                           1
## - as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)          3
## - as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)                2
## - as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio)  2
## - heart_diseases_Dataset_VR_MOD$Edad                                 1
##                                                                     Sum of Sq
## - heart_diseases_Dataset_VR_MOD$PA_reposo                                   8
## - heart_diseases_Dataset_VR_MOD$AZ_Ayunas                                 199
## - as.factor(heart_diseases_Dataset_VR_MOD$Clase_salida)                   751
## <none>                                                                       
## - as.factor(heart_diseases_Dataset_VR_MOD$Sexo)                          1437
## - heart_diseases_Dataset_VR_MOD$Oldpeak                                  2429
## - as.factor(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio)              6865
## - heart_diseases_Dataset_VR_MOD$Colesterol                               7648
## - as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)              9507
## - as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)                    9739
## - as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio)     10682
## - heart_diseases_Dataset_VR_MOD$Edad                                    40491
##                                                                        RSS
## - heart_diseases_Dataset_VR_MOD$PA_reposo                           383964
## - heart_diseases_Dataset_VR_MOD$AZ_Ayunas                           384155
## - as.factor(heart_diseases_Dataset_VR_MOD$Clase_salida)             384707
## <none>                                                              383956
## - as.factor(heart_diseases_Dataset_VR_MOD$Sexo)                     385394
## - heart_diseases_Dataset_VR_MOD$Oldpeak                             386385
## - as.factor(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio)         390821
## - heart_diseases_Dataset_VR_MOD$Colesterol                          391604
## - as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)         393463
## - as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)               393695
## - as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio) 394638
## - heart_diseases_Dataset_VR_MOD$Edad                                424447
##                                                                        AIC
## - heart_diseases_Dataset_VR_MOD$PA_reposo                           5566.1
## - heart_diseases_Dataset_VR_MOD$AZ_Ayunas                           5566.6
## - as.factor(heart_diseases_Dataset_VR_MOD$Clase_salida)             5567.9
## <none>                                                              5568.1
## - as.factor(heart_diseases_Dataset_VR_MOD$Sexo)                     5569.5
## - heart_diseases_Dataset_VR_MOD$Oldpeak                             5571.9
## - as.factor(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio)         5582.3
## - heart_diseases_Dataset_VR_MOD$Colesterol                          5584.2
## - as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)         5584.5
## - as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)               5587.1
## - as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio) 5589.3
## - heart_diseases_Dataset_VR_MOD$Edad                                5658.0
## 
## Step:  AIC=5566.11
## heart_diseases_Dataset_VR_MOD$FrecC_Max ~ heart_diseases_Dataset_VR_MOD$Edad + 
##     heart_diseases_Dataset_VR_MOD$Colesterol + heart_diseases_Dataset_VR_MOD$AZ_Ayunas + 
##     heart_diseases_Dataset_VR_MOD$Oldpeak + as.factor(heart_diseases_Dataset_VR_MOD$Sexo) + 
##     as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho) + 
##     as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo) + as.factor(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio) + 
##     as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio) + 
##     as.factor(heart_diseases_Dataset_VR_MOD$Clase_salida)
## 
##                                                                     Df
## - heart_diseases_Dataset_VR_MOD$AZ_Ayunas                            1
## - as.factor(heart_diseases_Dataset_VR_MOD$Clase_salida)              1
## <none>                                                                
## - as.factor(heart_diseases_Dataset_VR_MOD$Sexo)                      1
## - heart_diseases_Dataset_VR_MOD$Oldpeak                              1
## - as.factor(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio)          1
## - heart_diseases_Dataset_VR_MOD$Colesterol                           1
## - as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)          3
## - as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)                2
## - as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio)  2
## - heart_diseases_Dataset_VR_MOD$Edad                                 1
##                                                                     Sum of Sq
## - heart_diseases_Dataset_VR_MOD$AZ_Ayunas                                 195
## - as.factor(heart_diseases_Dataset_VR_MOD$Clase_salida)                   754
## <none>                                                                       
## - as.factor(heart_diseases_Dataset_VR_MOD$Sexo)                          1436
## - heart_diseases_Dataset_VR_MOD$Oldpeak                                  2422
## - as.factor(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio)              6979
## - heart_diseases_Dataset_VR_MOD$Colesterol                               7682
## - as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)              9508
## - as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)                    9749
## - as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio)     10686
## - heart_diseases_Dataset_VR_MOD$Edad                                    42783
##                                                                        RSS
## - heart_diseases_Dataset_VR_MOD$AZ_Ayunas                           384159
## - as.factor(heart_diseases_Dataset_VR_MOD$Clase_salida)             384717
## <none>                                                              383964
## - as.factor(heart_diseases_Dataset_VR_MOD$Sexo)                     385400
## - heart_diseases_Dataset_VR_MOD$Oldpeak                             386386
## - as.factor(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio)         390943
## - heart_diseases_Dataset_VR_MOD$Colesterol                          391645
## - as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)         393472
## - as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)               393713
## - as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio) 394650
## - heart_diseases_Dataset_VR_MOD$Edad                                426747
##                                                                        AIC
## - heart_diseases_Dataset_VR_MOD$AZ_Ayunas                           5564.6
## - as.factor(heart_diseases_Dataset_VR_MOD$Clase_salida)             5565.9
## <none>                                                              5566.1
## - as.factor(heart_diseases_Dataset_VR_MOD$Sexo)                     5567.5
## - heart_diseases_Dataset_VR_MOD$Oldpeak                             5569.9
## - as.factor(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio)         5580.6
## - heart_diseases_Dataset_VR_MOD$Colesterol                          5582.3
## - as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)         5582.5
## - as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)               5585.1
## - as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio) 5587.3
## - heart_diseases_Dataset_VR_MOD$Edad                                5661.0
## 
## Step:  AIC=5564.57
## heart_diseases_Dataset_VR_MOD$FrecC_Max ~ heart_diseases_Dataset_VR_MOD$Edad + 
##     heart_diseases_Dataset_VR_MOD$Colesterol + heart_diseases_Dataset_VR_MOD$Oldpeak + 
##     as.factor(heart_diseases_Dataset_VR_MOD$Sexo) + as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho) + 
##     as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo) + as.factor(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio) + 
##     as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio) + 
##     as.factor(heart_diseases_Dataset_VR_MOD$Clase_salida)
## 
##                                                                     Df
## - as.factor(heart_diseases_Dataset_VR_MOD$Clase_salida)              1
## <none>                                                                
## - as.factor(heart_diseases_Dataset_VR_MOD$Sexo)                      1
## - heart_diseases_Dataset_VR_MOD$Oldpeak                              1
## - as.factor(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio)          1
## - heart_diseases_Dataset_VR_MOD$Colesterol                           1
## - as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)          3
## - as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)                2
## - as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio)  2
## - heart_diseases_Dataset_VR_MOD$Edad                                 1
##                                                                     Sum of Sq
## - as.factor(heart_diseases_Dataset_VR_MOD$Clase_salida)                   657
## <none>                                                                       
## - as.factor(heart_diseases_Dataset_VR_MOD$Sexo)                          1413
## - heart_diseases_Dataset_VR_MOD$Oldpeak                                  2426
## - as.factor(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio)              7268
## - heart_diseases_Dataset_VR_MOD$Colesterol                               7500
## - as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)              9507
## - as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)                    9640
## - as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio)     10714
## - heart_diseases_Dataset_VR_MOD$Edad                                    42629
##                                                                        RSS
## - as.factor(heart_diseases_Dataset_VR_MOD$Clase_salida)             384816
## <none>                                                              384159
## - as.factor(heart_diseases_Dataset_VR_MOD$Sexo)                     385572
## - heart_diseases_Dataset_VR_MOD$Oldpeak                             386585
## - as.factor(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio)         391427
## - heart_diseases_Dataset_VR_MOD$Colesterol                          391659
## - as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)         393666
## - as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)               393799
## - as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio) 394873
## - heart_diseases_Dataset_VR_MOD$Edad                                426788
##                                                                        AIC
## - as.factor(heart_diseases_Dataset_VR_MOD$Clase_salida)             5564.1
## <none>                                                              5564.6
## - as.factor(heart_diseases_Dataset_VR_MOD$Sexo)                     5565.9
## - heart_diseases_Dataset_VR_MOD$Oldpeak                             5568.3
## - as.factor(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio)         5579.8
## - heart_diseases_Dataset_VR_MOD$Colesterol                          5580.3
## - as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)         5581.0
## - as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)               5583.3
## - as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio) 5585.8
## - heart_diseases_Dataset_VR_MOD$Edad                                5659.1
## 
## Step:  AIC=5564.14
## heart_diseases_Dataset_VR_MOD$FrecC_Max ~ heart_diseases_Dataset_VR_MOD$Edad + 
##     heart_diseases_Dataset_VR_MOD$Colesterol + heart_diseases_Dataset_VR_MOD$Oldpeak + 
##     as.factor(heart_diseases_Dataset_VR_MOD$Sexo) + as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho) + 
##     as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo) + as.factor(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio) + 
##     as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio)
## 
##                                                                     Df
## <none>                                                                
## - as.factor(heart_diseases_Dataset_VR_MOD$Sexo)                      1
## - heart_diseases_Dataset_VR_MOD$Oldpeak                              1
## - heart_diseases_Dataset_VR_MOD$Colesterol                           1
## - as.factor(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio)          1
## - as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)                2
## - as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)          3
## - as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio)  2
## - heart_diseases_Dataset_VR_MOD$Edad                                 1
##                                                                     Sum of Sq
## <none>                                                                       
## - as.factor(heart_diseases_Dataset_VR_MOD$Sexo)                          1904
## - heart_diseases_Dataset_VR_MOD$Oldpeak                                  2192
## - heart_diseases_Dataset_VR_MOD$Colesterol                               8186
## - as.factor(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio)              8293
## - as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)                    9659
## - as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)             12145
## - as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio)     16515
## - heart_diseases_Dataset_VR_MOD$Edad                                    44153
##                                                                        RSS
## <none>                                                              384816
## - as.factor(heart_diseases_Dataset_VR_MOD$Sexo)                     386720
## - heart_diseases_Dataset_VR_MOD$Oldpeak                             387008
## - heart_diseases_Dataset_VR_MOD$Colesterol                          393002
## - as.factor(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio)         393110
## - as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)               394475
## - as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)         396961
## - as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio) 401332
## - heart_diseases_Dataset_VR_MOD$Edad                                428969
##                                                                        AIC
## <none>                                                              5564.1
## - as.factor(heart_diseases_Dataset_VR_MOD$Sexo)                     5566.7
## - heart_diseases_Dataset_VR_MOD$Oldpeak                             5567.3
## - heart_diseases_Dataset_VR_MOD$Colesterol                          5581.4
## - as.factor(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio)         5581.7
## - as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)               5582.9
## - as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)         5586.6
## - as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio) 5598.7
## - heart_diseases_Dataset_VR_MOD$Edad                                5661.7
coefficients(modelo_Iterado_STEP)
##                                                        (Intercept) 
##                                                       184.92620045 
##                                 heart_diseases_Dataset_VR_MOD$Edad 
##                                                        -0.79953564 
##                           heart_diseases_Dataset_VR_MOD$Colesterol 
##                                                         0.03858603 
##                              heart_diseases_Dataset_VR_MOD$Oldpeak 
##                                                         0.19561423 
##                     as.factor(heart_diseases_Dataset_VR_MOD$Sexo)1 
##                                                         3.71107944 
##         as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)2 
##                                                        -4.13451811 
##         as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)3 
##                                                        -4.23820806 
##         as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)4 
##                                                       -11.78892978 
##               as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)2 
##                                                        -1.32079476 
##               as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)3 
##                                                         8.02554534 
##         as.factor(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio)1 
##                                                        -7.41921884 
## as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio)2 
##                                                       -10.36377817 
## as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio)3 
##                                                        -6.37187993

Bondades de Ajuste, Significancias y Criterios de Información Comparados

modelo_RLM_TOTAL = lm(heart_diseases_Dataset_VR_MOD$FrecC_Max~heart_diseases_Dataset_VR_MOD$Edad+heart_diseases_Dataset_VR_MOD$PA_reposo+heart_diseases_Dataset_VR_MOD$Colesterol+heart_diseases_Dataset_VR_MOD$AZ_Ayunas+heart_diseases_Dataset_VR_MOD$Oldpeak+as.factor(heart_diseases_Dataset_VR_MOD$Sexo)+as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)+as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)+as.factor(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio)+as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio)+as.factor(heart_diseases_Dataset_VR_MOD$Clase_salida))

modelo_RLM_REDUCIDO = lm(heart_diseases_Dataset_VR_MOD$FrecC_Max~heart_diseases_Dataset_VR_MOD$Edad+heart_diseases_Dataset_VR_MOD$Oldpeak+as.factor(heart_diseases_Dataset_VR_MOD$Sexo)+as.factor(heart_diseases_Dataset_VR_MOD$Tipo_dolor_pecho)+as.factor(heart_diseases_Dataset_VR_MOD$ECG_reposo)+as.factor(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio)+as.factor(heart_diseases_Dataset_VR_MOD$Pendi_Segme_ST_Ejercicio)+as.factor(heart_diseases_Dataset_VR_MOD$Clase_salida))

stargazer(modelo_RLM_TOTAL, modelo_RLM_REDUCIDO, modelo_Iterado_STEP, type = "text", df = TRUE)
## 
## =====================================================================================================
##                                                       Dependent variable:                            
##                            --------------------------------------------------------------------------
##                                                            FrecC_Max                                 
##                                      (1)                      (2)                      (3)           
## -----------------------------------------------------------------------------------------------------
## Edad                              -0.793***                -0.812***                -0.800***        
##                                    (0.081)                  (0.079)                  (0.079)         
##                                                                                                      
## PA_reposo                           -0.005                                                           
##                                    (0.040)                                                           
##                                                                                                      
## Colesterol                         0.038***                                          0.039***        
##                                    (0.009)                                           (0.009)         
##                                                                                                      
## AZ_Ayunas                           0.006                                                            
##                                    (0.009)                                                           
##                                                                                                      
## Oldpeak                            0.207**                  0.231***                 0.196**         
##                                    (0.087)                  (0.087)                  (0.086)         
##                                                                                                      
## Sexo)1                              3.293*                  4.432**                  3.711**         
##                                    (1.793)                  (1.785)                  (1.755)         
##                                                                                                      
## Tipo_dolor_pecho)2                  -4.227                   -3.522                   -4.135         
##                                    (3.543)                  (3.564)                  (3.535)         
##                                                                                                      
## Tipo_dolor_pecho)3                  -4.270                   -4.442                   -4.238         
##                                    (3.410)                  (3.432)                  (3.400)         
##                                                                                                      
## Tipo_dolor_pecho)4                -11.214***               -11.224***               -11.789***       
##                                    (3.318)                  (3.338)                  (3.281)         
##                                                                                                      
## ECG_reposo)2                        -1.355                   -2.120                   -1.321         
##                                    (1.836)                  (1.832)                  (1.827)         
##                                                                                                      
## ECG_reposo)3                       8.058***                 9.353***                 8.026***        
##                                    (1.827)                  (1.815)                  (1.826)         
##                                                                                                      
## Angina_Ejercicio)1                -6.919***                -6.524***                -7.419***        
##                                    (1.724)                  (1.717)                  (1.681)         
##                                                                                                      
## Pendi_Segme_ST_Ejercicio)2        -9.321***                -8.990***                -10.364***       
##                                    (1.868)                  (1.882)                  (1.670)         
##                                                                                                      
## Pendi_Segme_ST_Ejercicio)3         -5.796*                  -6.256**                 -6.372**        
##                                    (3.164)                  (3.179)                  (3.105)         
##                                                                                                      
## Clase_salida)1                      -2.760                  -3.620*                                  
##                                    (2.079)                  (2.056)                                  
##                                                                                                      
## Constant                          184.999***               193.863***               184.926***       
##                                    (6.989)                  (5.172)                  (5.525)         
##                                                                                                      
## -----------------------------------------------------------------------------------------------------
## Observations                         917                      917                      917           
## R2                                  0.354                    0.341                    0.352          
## Adjusted R2                         0.343                    0.332                    0.344          
## Residual Std. Error           20.643 (df = 901)        20.815 (df = 904)        20.632 (df = 904)    
## F Statistic                32.874*** (df = 15; 901) 38.937*** (df = 12; 904) 40.969*** (df = 12; 904)
## =====================================================================================================
## Note:                                                                     *p<0.1; **p<0.05; ***p<0.01
AIC(modelo_RLM_TOTAL, modelo_RLM_REDUCIDO, modelo_Iterado_STEP)
##                     df      AIC
## modelo_RLM_TOTAL    17 8172.424
## modelo_RLM_REDUCIDO 14 8184.638
## modelo_Iterado_STEP 14 8168.475
BIC(modelo_RLM_TOTAL, modelo_RLM_REDUCIDO, modelo_Iterado_STEP)
##                     df      BIC
## modelo_RLM_TOTAL    17 8254.383
## modelo_RLM_REDUCIDO 14 8252.133
## modelo_Iterado_STEP 14 8235.971

4.4. Regresión Logística Simple

Este modelo, eventualmente llamado RLogS, difiere del modelo de regresión lineal simple al relacionar una variable categórica dicotómica (con valores posibles \(1\) (éxito) y \(0\) (fracaso)) dependiente \(y\) con el valor de probabilidad \(p(x)\in [0, 1]\) que depende de alguna variable cuantitativa \(x\).

Como se mencionó en la sección 1, los modelos de regresión usados en este estudio pueden ser vistos como casos particulares del Modelo Lineal Generalizado (GLM). Este modelo extiende el modelo lineal general al relacionar la variable dependiente linealmente con sus factores y covariables a través de alguna función de enlace, permitiendo que la variable dependiente tenga una distribución diferente a la normal. AdemÔs de los modelos usados en este estudio, el GLM también cubre modelos loglineales para datos de recuento, modelos log-log complementarios para datos de supervivencia censurados por intervalos, y otros modelos estadísticos a través de la formulación general del modelo.

Como el GLM permite especificar distribuciones diferentes a la normal y una función de enlace diferente a la identidad, se pueden trabajar con muchas combinaciones posibles de distribuciones y funciones de enlace, varias de las cuales pueden ser adecuadas para un conjunto de datos en particular. La elección de la combinación estarÔ orientada por consideraciones teóricas a priori, la naturaleza de las variables, la experiencia del investigador y los resultados al comparar combinaciones.

En este caso, se trabajarÔ con una distribución binomial (adecuada para variables que representan una respuesta binaria) con función de enlace logit:

\[\pi(x)=\dfrac{e^{\beta_0+\beta_1 x}}{1+ e^{\beta_0 +\beta_1 x}}= \dfrac{1}{1+ e^{-(\beta_0+\beta_1 x)}}\hspace{10mm}(30)\]

Este enfoque, conocido como regresión logĆ­stica binaria, es apropiado para la distribución binomial. El tĆ©rmino ā€œlogĆ­sticoā€ se refiere a que la función de enlace constituye un refinamiento del modelo exponencial de crecimiento, descrito por la función sigmoidea, de una magnitud asociada con un conjunto \(C\).

Para facilitar las interpretaciones, la función de enlace \(\pi(x)\) proviene de una razón de probabilidades (conocida en inglés como ODDS ratio (OR)), que a su vez es el argumento de un logaritmo: \(\log\left(\frac{\pi(x)}{1-\pi(x)}\right)\). Así, se modela la probabilidad de que la variable de respuesta pertenezca al nivel de referencia \(1\) en función del valor de los predictores. La transformación conserva la monotonicidad de sentidos y convierte el intervalo de probabilidad \([0,1]\) a \((-\infty,\infty)\).

Las propiedades entre las probabilidades complementarias de éxito y fracaso, sus razones y la función de enlace logit son:

\(p(Ʃxito)=p(fracaso)\) \(OR=1\) \(Logit\left(OR\right)=0\)
\(p(Ʃxito)<p(fracaso)\) \(OR<1\) \(Logit\left(OR\right)<0\)
\(p(Ʃxito)>p(fracaso)\) \(OR>1\) \(Logit\left(OR\right)>0\)

Es importante tener en cuenta que la transformación Logit carece de sentido para la certeza del éxito o del fracaso.

Plantemiento del problema

Tomando como base el conjunto de datos descrito en la fase 2 se formulara un modelo de regresion logistica simple para estudiar la relacion logistica supuesta entre las variables definidas por campos: FrecC_Max (variable independiente) y Clase_salida (varaible dependiente), con base en una distribucion binomial y la funcion de enlace \(Logit\).

Desarrollo del AnƔlisis

En el siguiente desarrollo del anƔlisis se hara en R Stutio y este mismo contara con varias secciones que se presentaran a continuacion.

4.4.1. Resumen estadĆ­stico de las variables de estudio

En base a la navegacion de las pestaƱas se muestra el resumen estadistico de la variable independiente FrecC_Max, se presenta su bloxpot e histograma. De la variable dependiente Clase_salida se mostrara su diagrama de barras, asi como su media y mediana. Ademas, se exhibira un diagrama de Cajas conjunto entre aquellas variables que mencionamos.

En base en la pestaƱa Resumen y Bloxplot de FrecC_Max se puede comentar que la variable FrecC_Max como se menciono en la seccion 4.2.1. presenta un sesgo mas simetrico dado que su media y mediana se encuentran en valores extremadamente cercanas entre si lo cual nos indica que no muestra valores atipicos. Lo anterior mencionado tambien es contable a traves de la pestaƱa Histograma de FrecC_Mac.

Continuando, segun la pestaƱa Resumen y Diagrama de Barras de Clase_salida la variable cualitativa::nominal Clase_salida muestra una mayor proporcionalidad para los casos 1 (Enfermedad Caridiaca), que para los caso 0 (Normal): \(55,29\) \(%\) y \(44,71\) \(%\), repespectivamente.

Complementariamente, el Resumen y el Diagrama de Cajas Conjunto muestran que las observaciones son consistentes con el contexto del problema. Es decir, para los casos con Clase_salida = 0 (Normal), los valores de FrecC_Max son mayores en comparación con los casos con Clase_salida = 1 (Enfermedad Cardiaca). AdemÔs, ambos grupos muestran sesgo, aunque la asimetría negativa es mÔs notoria para el grupo con Clase_salida = 1.

En cuanto a la dispersión, se observan diferencias opuestas entre los grupos: el grupo con Clase_salida = 0 muestra una mayor dispersión en el rango intercuartílico hacia la mitad superior de los datos, mientras que el grupo con Clase_salida = 1 muestra una dispersión mÔs centrada pero con ligera asimetría negativa. Los atípicos en ambos grupos se presentan en los extremos inferiores de las distribuciones, sugiriendo que los valores bajos de FrecC_Max son mÔs extraños.

Resumen y Boxplot de FrecC_Max

summary(heart_diseases_Dataset_VR_MOD$FrecC_Max)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    60.0   120.0   138.0   136.8   156.0   202.0
boxplot(heart_diseases_Dataset_VR_MOD$FrecC_Max, main = "Diagrama de Caja de FrecC_Max", col = c("orange"))

Histograma de FrecC_Max

summary(heart_diseases_Dataset_VR_MOD$FrecC_Max)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    60.0   120.0   138.0   136.8   156.0   202.0
hist(heart_diseases_Dataset_VR_MOD$FrecC_Max, main = "Histograma de FrecC_Max", col = c("gold"))

Resumen y Diagrama de Barras de Clase_salida

table(heart_diseases_Dataset_VR_MOD$Clase_salida)
## 
##   0   1 
## 410 507
prop.table(table(heart_diseases_Dataset_VR_MOD$Clase_salida))
## 
##         0         1 
## 0.4471101 0.5528899
barplot(table(heart_diseases_Dataset_VR_MOD$Clase_salida))

Resumen y Diagrama de Cajas Conjunto

tapply(heart_diseases_Dataset_VR_MOD$FrecC_Max, heart_diseases_Dataset_VR_MOD$Clase_salida, mean)
##        0        1 
## 148.1512 127.6016
tapply(heart_diseases_Dataset_VR_MOD$FrecC_Max, heart_diseases_Dataset_VR_MOD$Clase_salida, median)
##   0   1 
## 150 126
boxplot(heart_diseases_Dataset_VR_MOD$FrecC_Max~heart_diseases_Dataset_VR_MOD$Clase_salida, main = "Boxplot Conjunto: FrecC_MAx - Clase_salida", col = c("orange", "gold"))

4.4.2. Formulación del modelo de RLogS entre las variables de estudio

En base a la navegacion a traves de pestaƱas se muestran los coeficientes del modelo RLogS y su resumen estadistico. Se menciona de nuevo las variables que son de interes: FrecC_Max (Variable independiente) y Clase_salida (Variable dependiente).

La pestaña Coeficientes del Modelo RLogS nos permite establecer que el modelo RLogS selcciona a \(\pi(x)\) con \(x\) a través de la función de enlace \(Logit\) de la siguiente manera:\[\frac{\pi(x)}{1-\pi(x)}=e^{5,34123645-0,03714453\cdot x}\hspace{10mm}(31)\]

De la misma forma, la pestaƱa Resumen Estadistico del Modelo RLogS muestra para efectos de comparacion, los resumenes del modelo estuadiado y uno alternativo tomando como base la variable cualitativa::nominal Angina_Ejercicio. Con base en el criterio de informacion que nos proporciona el Akaike (AIC por sus siglas en ingles), del cual se sabe que es una medida de bondad de ajuste de un modelo estadistico que describe la relacion entre el sesgo y la varianza en la formulacion del modelo, es decir, entre su exatitud y complejidad, se verifica que en base a los resultados podemos verificar que el mejor modelo es con la variable Clase_salida que con la variable Angina_Ejercicio por una diferencia muy corta, porque: \(AIC_C = 1105,2 < 1108,7 = AIC_A\). Tambien, para apoyar que el modelo basado en la variable Clase_salida es mejor que el modelo basado en la variable Angina_Ejercicio, el cociente entre la desviacion nula (Null Deviance) y la desviacion recidual (Residual Desviance), observable en la pestaƱa Resumen Estadistico del Modelo RLogS, es un poco mayor en el modelo propuesto que en el de comparacion.

Coeficientes del Modelo RLogS

modelo_RLog_Simple = glm(heart_diseases_Dataset_VR_MOD$Clase_salida~heart_diseases_Dataset_VR_MOD$FrecC_Max, family = "binomial", data = data.frame(heart_diseases_Dataset_VR_MOD$Clase_salida, heart_diseases_Dataset_VR_MOD$FrecC_Max))
coef(modelo_RLog_Simple)
##                             (Intercept) heart_diseases_Dataset_VR_MOD$FrecC_Max 
##                              5.34123645                             -0.03714453

Resumen EstadĆ­stico del Modelo RLogS

summary(modelo_RLog_Simple)
## 
## Call:
## glm(formula = heart_diseases_Dataset_VR_MOD$Clase_salida ~ heart_diseases_Dataset_VR_MOD$FrecC_Max, 
##     family = "binomial", data = data.frame(heart_diseases_Dataset_VR_MOD$Clase_salida, 
##         heart_diseases_Dataset_VR_MOD$FrecC_Max))
## 
## Coefficients:
##                                          Estimate Std. Error z value Pr(>|z|)
## (Intercept)                              5.341236   0.461831   11.56   <2e-16
## heart_diseases_Dataset_VR_MOD$FrecC_Max -0.037145   0.003277  -11.34   <2e-16
##                                            
## (Intercept)                             ***
## heart_diseases_Dataset_VR_MOD$FrecC_Max ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1261.0  on 916  degrees of freedom
## Residual deviance: 1101.2  on 915  degrees of freedom
## AIC: 1105.2
## 
## Number of Fisher Scoring iterations: 3
modelo_RLog_Simple_AN = glm(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio~heart_diseases_Dataset_VR_MOD$FrecC_Max, family = "binomial", data = data.frame(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio, heart_diseases_Dataset_VR_MOD$FrecC_Max))
summary(modelo_RLog_Simple_AN)
## 
## Call:
## glm(formula = heart_diseases_Dataset_VR_MOD$Angina_Ejercicio ~ 
##     heart_diseases_Dataset_VR_MOD$FrecC_Max, family = "binomial", 
##     data = data.frame(heart_diseases_Dataset_VR_MOD$Angina_Ejercicio, 
##         heart_diseases_Dataset_VR_MOD$FrecC_Max))
## 
## Coefficients:
##                                          Estimate Std. Error z value Pr(>|z|)
## (Intercept)                              4.127853   0.430926   9.579   <2e-16
## heart_diseases_Dataset_VR_MOD$FrecC_Max -0.033427   0.003178 -10.518   <2e-16
##                                            
## (Intercept)                             ***
## heart_diseases_Dataset_VR_MOD$FrecC_Max ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1237.6  on 916  degrees of freedom
## Residual deviance: 1104.7  on 915  degrees of freedom
## AIC: 1108.7
## 
## Number of Fisher Scoring iterations: 4

4.4.3. AnƔlisis del modelo RLogS

En base a pestaƱas se motraran los resultados de algunas predicciones obtenidas a traves del modelo RLogS para identificar en sus respuestas la correspondencia de sentido en las razones de probabilidades ODDS a favor o en contra del evento considerando: \(\frac{\pi}{1-\pi}\) y \(\frac{1-\pi}{\pi}\), respectivamente. Se menciona de nuevo que las variables de interes son FrecC_Max (variable independiente) y Clase_salida (varaible dependiente).

La pestaƱa Variable Predictora igual a Cero plantea dos situaciones interpretativas. La primera nos permite comprender el coeficiente del factor en el cual esta presente la variable predictora, y una probabilidad cercana a cero de que un caso sea favorable pero dado el contexto de la variable predictora esta es imposible que se torne cero por lo tanto carece de sentido, la segunda situacion conlleva una interpretacion mas delicada: como la variable **FrecC_Max se mide en el intervalo \([60 , 202]\) una medida de unidad razonable para el aumento seria de una unidad ejemplo: pasar de \(99\) ppm a \(100\) ppm implicando un aumanto de una unidad de medida. Asi, se entiende que el cociente de probabilidades en relacion con la variable predictora en le modelo RLogS refleja un incremento acumulado de \(\approx 0,9635\) veces desde \(60\) hasta \(202\) con incrementos de \(1\).

Con base en lo anterior, a traves de la pestaƱa Probabilidades Estimadas se puede apreciar entre los registros \(422\) y \(540\) un delta de cambio absoluto igual a \(0,0156032\) (equivalente a un icremento relativo del \(\approx 2,21\) \(%\)) al incrementar la variable predictora en una unidad como se definio en el parrafo anterior.

Por ultimo, el grafico de curva logistica, en la pestaƱa Grafica del modelo RLogS, nos permite visualizar y comprender el comportamiento de las variables involucradas en el modelo propuesto; es decir, los casos favorables en relacion con la variable Clase_salida presenta una menor probabilidad a medida de que la FrecC_Max es mayor.

Variable Predictora igual a Cero

coef(modelo_RLog_Simple)
##                             (Intercept) heart_diseases_Dataset_VR_MOD$FrecC_Max 
##                              5.34123645                             -0.03714453
round(exp(coef(modelo_RLog_Simple)),6)
##                             (Intercept) heart_diseases_Dataset_VR_MOD$FrecC_Max 
##                              208.770686                                0.963537

Probabilidades Estimadas

predict(modelo_RLog_Simple, data.frame(seq(1, 917)), type = "response")
##         1         2         3         4         5         6         7         8 
## 0.2596818 0.3885739 0.8456747 0.7907789 0.6920250 0.2742164 0.2742164 0.5166720 
##         9        10        11        12        13        14        15        16 
## 0.6253800 0.7076282 0.5166720 0.8407645 0.4888216 0.5351922 0.5627758 0.4426427 
##        17        18        19        20        21        22        23        24 
## 0.3047550 0.3126817 0.6677819 0.3539117 0.5166720 0.5166720 0.3207195 0.4426427 
##        25        26        27        28        29        30        31        32 
## 0.5536158 0.2191733 0.7651363 0.7227576 0.6511006 0.4888216 0.6253800 0.7515245 
##        33        34        35        36        37        38        39        40 
## 0.6920250 0.6253800 0.4063629 0.3974345 0.8918387 0.5166720 0.4610405 0.6253800 
##        41        42        43        44        45        46        47        48 
## 0.6253800 0.8357285 0.2892468 0.2742164 0.7076282 0.7076282 0.2892468 0.2742164 
##        49        50        51        52        53        54        55        56 
## 0.1834183 0.2742164 0.6998845 0.8456747 0.6920250 0.4426427 0.5351922 0.2742164 
##        57        58        59        60        61        62        63        64 
## 0.4153536 0.5351922 0.5899767 0.8551231 0.2456567 0.2388387 0.4981059 0.6677819 
##        65        66        67        68        69        70        71        72 
## 0.4888216 0.6253800 0.4981059 0.1834183 0.9084941 0.2742164 0.4888216 0.5809622 
##        73        74        75        76        77        78        79        80 
## 0.4426427 0.7445237 0.6426159 0.7373946 0.6253800 0.4426427 0.5536158 0.2742164 
##        81        82        83        84        85        86        87        88 
## 0.3539117 0.4063629 0.7445237 0.3126817 0.6677819 0.8640860 0.7651363 0.5166720 
##        89        90        91        92        93        94        95        96 
## 0.3974345 0.7782225 0.3539117 0.5351922 0.4610405 0.8725771 0.2067252 0.5351922 
##        97        98        99       100       101       102       103       104 
## 0.5536158 0.3539117 0.5351922 0.4981059 0.7445237 0.8357285 0.6253800 0.4244010 
##       105       106       107       108       109       110       111       112 
## 0.6759704 0.5351922 0.7782225 0.2892468 0.5809622 0.8028046 0.6759704 0.8725771 
##       113       114       115       116       117       118       119       120 
## 0.6677819 0.4426427 0.5809622 0.4426427 0.2742164 0.6253800 0.1779202 0.2067252 
##       121       122       123       124       125       126       127       128 
## 0.2742164 0.5444192 0.5351922 0.7782225 0.4426427 0.7782225 0.1523581 0.2388387 
##       129       130       131       132       133       134       135       136 
## 0.5351922 0.4244010 0.6253800 0.4426427 0.6920250 0.6759704 0.7076282 0.2388387 
##       137       138       139       140       141       142       143       144 
## 0.2388387 0.4795451 0.7227576 0.6253800 0.8640860 0.6677819 0.3710769 0.3974345 
##       145       146       147       148       149       150       151       152 
## 0.4426427 0.6078200 0.3974345 0.2321517 0.3539117 0.6677819 0.7076282 0.8357285 
##       153       154       155       156       157       158       159       160 
## 0.4426427 0.5351922 0.3539117 0.4426427 0.4426427 0.6253800 0.8357285 0.6253800 
##       161       162       163       164       165       166       167       168 
## 0.7152534 0.8551231 0.2456567 0.4426427 0.5351922 0.2388387 0.5351922 0.7227576 
##       169       170       171       172       173       174       175       176 
## 0.8357285 0.3539117 0.3539117 0.1622018 0.3371149 0.2596818 0.5899767 0.5809622 
##       177       178       179       180       181       182       183       184 
## 0.8086188 0.4426427 0.4426427 0.8806110 0.7076282 0.4426427 0.6759704 0.5351922 
##       185       186       187       188       189       190       191       192 
## 0.6253800 0.8725771 0.7782225 0.5536158 0.7782225 0.7076282 0.7076282 0.7373946 
##       193       194       195       196       197       198       199       200 
## 0.3539117 0.7782225 0.2067252 0.7373946 0.6078200 0.5718933 0.7373946 0.8456747 
##       201       202       203       204       205       206       207       208 
## 0.4426427 0.4426427 0.4795451 0.4426427 0.8357285 0.5351922 0.2067252 0.5351922 
##       209       210       211       212       213       214       215       216 
## 0.1779202 0.5351922 0.7782225 0.5351922 0.6426159 0.3207195 0.8456747 0.2742164 
##       217       218       219       220       221       222       223       224 
## 0.4426427 0.5627758 0.4426427 0.2742164 0.7651363 0.4426427 0.6677819 0.1779202 
##       225       226       227       228       229       230       231       232 
## 0.5627758 0.4426427 0.5351922 0.5899767 0.2742164 0.1834183 0.3710769 0.2969424 
##       233       234       235       236       237       238       239       240 
## 0.6340408 0.5166720 0.5351922 0.3539117 0.7227576 0.5718933 0.8407645 0.8252737 
##       241       242       243       244       245       246       247       248 
## 0.3974345 0.5166720 0.5073915 0.7227576 0.8198527 0.5627758 0.4426427 0.4426427 
##       249       250       251       252       253       254       255       256 
## 0.6253800 0.7076282 0.5809622 0.7445237 0.7445237 0.4244010 0.8551231 0.6253800 
##       257       258       259       260       261       262       263       264 
## 0.4426427 0.2596818 0.7076282 0.3974345 0.3126817 0.5536158 0.7445237 0.6677819 
##       265       266       267       268       269       270       271       272 
## 0.4888216 0.2388387 0.7782225 0.4426427 0.8766502 0.4888216 0.5351922 0.3126817 
##       273       274       275       276       277       278       279       280 
## 0.6253800 0.5899767 0.2067252 0.8357285 0.4426427 0.6594907 0.6594907 0.3974345 
##       281       282       283       284       285       286       287       288 
## 0.5809622 0.6920250 0.3539117 0.3539117 0.2742164 0.7076282 0.5351922 0.6078200 
##       289       290       291       292       293       294       295       296 
## 0.3885739 0.2067252 0.5536158 0.5809622 0.4610405 0.8683896 0.6511006 0.7782225 
##       297       298       299       300       301       302       303       304 
## 0.5444192 0.6166380 0.8725771 0.4518252 0.4518252 0.4426427 0.7076282 0.6840526 
##       305       306       307       308       309       310       311       312 
## 0.6594907 0.6511006 0.3974345 0.7076282 0.5536158 0.1948076 0.4063629 0.7782225 
##       313       314       315       316       317       318       319       320 
## 0.2321517 0.4063629 0.5259410 0.6840526 0.4610405 0.6998845 0.9228067 0.5718933 
##       321       322       323       324       325       326       327       328 
## 0.2388387 0.7845671 0.3047550 0.6426159 0.5989311 0.6426159 0.5536158 0.7152534 
##       329       330       331       332       333       334       335       336 
## 0.9084941 0.6253800 0.5073915 0.9084941 0.2128829 0.4981059 0.2742164 0.5899767 
##       337       338       339       340       341       342       343       344 
## 0.7515245 0.4063629 0.4518252 0.4888216 0.6920250 0.7515245 0.7583957 0.7076282 
##       345       346       347       348       349       350       351       352 
## 0.8143013 0.6253800 0.7445237 0.6426159 0.8143013 0.6677819 0.7076282 0.5351922 
##       353       354       355       356       357       358       359       360 
## 0.8357285 0.8357285 0.8725771 0.6677819 0.7583957 0.8596644 0.6426159 0.7445237 
##       361       362       363       364       365       366       367       368 
## 0.9350408 0.6759704 0.8407645 0.4610405 0.8504604 0.5351922 0.7301386 0.7076282 
##       369       370       371       372       373       374       375       376 
## 0.7076282 0.8953700 0.9526252 0.7907789 0.8456747 0.7445237 0.8086188 0.6998845 
##       377       378       379       380       381       382       383       384 
## 0.7227576 0.6920250 0.3797863 0.3885739 0.8407645 0.7076282 0.4888216 0.3885739 
##       385       386       387       388       389       390       391       392 
## 0.3974345 0.8086188 0.8407645 0.5809622 0.9053590 0.4888216 0.9574081 0.8725771 
##       393       394       395       396       397       398       399       400 
## 0.7445237 0.7076282 0.8456747 0.4426427 0.5073915 0.8086188 0.6920250 0.9394098 
##       401       402       403       404       405       406       407       408 
## 0.7782225 0.3288651 0.9454505 0.6426159 0.7076282 0.6253800 0.8357285 0.9350408 
##       409       410       411       412       413       414       415       416 
## 0.8640860 0.6920250 0.9201188 0.4426427 0.8198527 0.8456747 0.7782225 0.8806110 
##       417       418       419       420       421       422       423       424 
## 0.7651363 0.6511006 0.5351922 0.4518252 0.8407645 0.7076282 0.8086188 0.5351922 
##       425       426       427       428       429       430       431       432 
## 0.5259410 0.3797863 0.5351922 0.7301386 0.7076282 0.7076282 0.4610405 0.8953700 
##       433       434       435       436       437       438       439       440 
## 0.9021280 0.6677819 0.7076282 0.7227576 0.6759704 0.8028046 0.7717454 0.7373946 
##       441       442       443       444       445       446       447       448 
## 0.2067252 0.6340408 0.6677819 0.5351922 0.7076282 0.6759704 0.7301386 0.7782225 
##       449       450       451       452       453       454       455       456 
## 0.8086188 0.7782225 0.6920250 0.7227576 0.5989311 0.6840526 0.6166380 0.9144854 
##       457       458       459       460       461       462       463       464 
## 0.3126817 0.8953700 0.7717454 0.7227576 0.9021280 0.7301386 0.7968580 0.6426159 
##       465       466       467       468       469       470       471       472 
## 0.3539117 0.6677819 0.6253800 0.8504604 0.3454651 0.8028046 0.6253800 0.5351922 
##       473       474       475       476       477       478       479       480 
## 0.6920250 0.6253800 0.7076282 0.5444192 0.7907789 0.4610405 0.6840526 0.7782225 
##       481       482       483       484       485       486       487       488 
## 0.7227576 0.6677819 0.8028046 0.7651363 0.6426159 0.2067252 0.4981059 0.5809622 
##       489       490       491       492       493       494       495       496 
## 0.5351922 0.8252737 0.7907789 0.4888216 0.6511006 0.7782225 0.5351922 0.9414899 
##       497       498       499       500       501       502       503       504 
## 0.4610405 0.6253800 0.6253800 0.5351922 0.5536158 0.5351922 0.5536158 0.7651363 
##       505       506       507       508       509       510       511       512 
## 0.6166380 0.7651363 0.9144854 0.4426427 0.7782225 0.6594907 0.8882032 0.4153536 
##       513       514       515       516       517       518       519       520 
## 0.4426427 0.7076282 0.3539117 0.6078200 0.7076282 0.7782225 0.6998845 0.6426159 
##       521       522       523       524       525       526       527       528 
## 0.5809622 0.7076282 0.7301386 0.4426427 0.4981059 0.7583957 0.5809622 0.6511006 
##       529       530       531       532       533       534       535       536 
## 0.7845671 0.6426159 0.7445237 0.8252737 0.5351922 0.5809622 0.6920250 0.7152534 
##       537       538       539       540       541       542       543       544 
## 0.6253800 0.7651363 0.8357285 0.6920250 0.7076282 0.8086188 0.6340408 0.7076282 
##       545       546       547       548       549       550       551       552 
## 0.5444192 0.3371149 0.8357285 0.5351922 0.5809622 0.9327478 0.8953700 0.7907789 
##       553       554       555       556       557       558       559       560 
## 0.7373946 0.3539117 0.7227576 0.7651363 0.6920250 0.6759704 0.8252737 0.5627758 
##       561       562       563       564       565       566       567       568 
## 0.5259410 0.4063629 0.6594907 0.3539117 0.7445237 0.6426159 0.7445237 0.8086188 
##       569       570       571       572       573       574       575       576 
## 0.7782225 0.7152534 0.7845671 0.5809622 0.6253800 0.7651363 0.6594907 0.7076282 
##       577       578       579       580       581       582       583       584 
## 0.7782225 0.7152534 0.7782225 0.6253800 0.3624504 0.9021280 0.6594907 0.7373946 
##       585       586       587       588       589       590       591       592 
## 0.7076282 0.6920250 0.3126817 0.6920250 0.8640860 0.5989311 0.7782225 0.4426427 
##       593       594       595       596       597       598       599       600 
## 0.6253800 0.7583957 0.5351922 0.8357285 0.5718933 0.6511006 0.8456747 0.8551231 
##       601       602       603       604       605       606       607       608 
## 0.6840526 0.8456747 0.7651363 0.4334993 0.8551231 0.7907789 0.6426159 0.5536158 
##       609       610       611       612       613       614       615       616 
## 0.6594907 0.4063629 0.5627758 0.8357285 0.5809622 0.8683896 0.7845671 0.3539117 
##       617       618       619       620       621       622       623       624 
## 0.5259410 0.8086188 0.6998845 0.5351922 0.5166720 0.5166720 0.2742164 0.4063629 
##       625       626       627       628       629       630       631       632 
## 0.3454651 0.7717454 0.2067252 0.4888216 0.3624504 0.6677819 0.7076282 0.3974345 
##       633       634       635       636       637       638       639       640 
## 0.4981059 0.2191733 0.6340408 0.2067252 0.2007002 0.5073915 0.3624504 0.5444192 
##       641       642       643       644       645       646       647       648 
## 0.4244010 0.3797863 0.3126817 0.6253800 0.4426427 0.5536158 0.2742164 0.5351922 
##       649       650       651       652       653       654       655       656 
## 0.6594907 0.4426427 0.5536158 0.6677819 0.4426427 0.1725521 0.2007002 0.3288651 
##       657       658       659       660       661       662       663       664 
## 0.2128829 0.3885739 0.5899767 0.3126817 0.6594907 0.2255963 0.7076282 0.7515245 
##       665       666       667       668       669       670       671       672 
## 0.6677819 0.1834183 0.3797863 0.2128829 0.2388387 0.2892468 0.6677819 0.8551231 
##       673       674       675       676       677       678       679       680 
## 0.5073915 0.8198527 0.2526048 0.5166720 0.2816707 0.2668862 0.4426427 0.7651363 
##       681       682       683       684       685       686       687       688 
## 0.1725521 0.4244010 0.4518252 0.4244010 0.5351922 0.3288651 0.5073915 0.7373946 
##       689       690       691       692       693       694       695       696 
## 0.5166720 0.4702826 0.4610405 0.2128829 0.2526048 0.2191733 0.8086188 0.6253800 
##       697       698       699       700       701       702       703       704 
## 0.7717454 0.2892468 0.6594907 0.2191733 0.5351922 0.4888216 0.3288651 0.6426159 
##       705       706       707       708       709       710       711       712 
## 0.3207195 0.2816707 0.7845671 0.7907789 0.2892468 0.7227576 0.4334993 0.3885739 
##       713       714       715       716       717       718       719       720 
## 0.5989311 0.3371149 0.2388387 0.9372608 0.3288651 0.6759704 0.4702826 0.3047550 
##       721       722       723       724       725       726       727       728 
## 0.5073915 0.3797863 0.3371149 0.5536158 0.7301386 0.4153536 0.3454651 0.2742164 
##       729       730       731       732       733       734       735       736 
## 0.3371149 0.3371149 0.4981059 0.5989311 0.7515245 0.8198527 0.5444192 0.7373946 
##       737       738       739       740       741       742       743       744 
## 0.8882032 0.4334993 0.4244010 0.3288651 0.8407645 0.2816707 0.3710769 0.3539117 
##       745       746       747       748       749       750       751       752 
## 0.2816707 0.6078200 0.2191733 0.8551231 0.3126817 0.3539117 0.2596818 0.4981059 
##       753       754       755       756       757       758       759       760 
## 0.1430097 0.2892468 0.6078200 0.1948076 0.3288651 0.6677819 0.1298882 0.8596644 
##       761       762       763       764       765       766       767       768 
## 0.3539117 0.7515245 0.2526048 0.2596818 0.2128829 0.3710769 0.2969424 0.6920250 
##       769       770       771       772       773       774       775       776 
## 0.4518252 0.2596818 0.7717454 0.2742164 0.3371149 0.3126817 0.1948076 0.4063629 
##       777       778       779       780       781       782       783       784 
## 0.3974345 0.6253800 0.3454651 0.4063629 0.3624504 0.4244010 0.4244010 0.2456567 
##       785       786       787       788       789       790       791       792 
## 0.6166380 0.4795451 0.6677819 0.7445237 0.2456567 0.8028046 0.6920250 0.4702826 
##       793       794       795       796       797       798       799       800 
## 0.3288651 0.3288651 0.1341442 0.4426427 0.3710769 0.6920250 0.2526048 0.3371149 
##       801       802       803       804       805       806       807       808 
## 0.8086188 0.4702826 0.3797863 0.7651363 0.3539117 0.6677819 0.3885739 0.3885739 
##       809       810       811       812       813       814       815       816 
## 0.2388387 0.3454651 0.6920250 0.3710769 0.4334993 0.3371149 0.4334993 0.2668862 
##       817       818       819       820       821       822       823       824 
## 0.5259410 0.2526048 0.4888216 0.2191733 0.3539117 0.4063629 0.6166380 0.1673130 
##       825       826       827       828       829       830       831       832 
## 0.3624504 0.3047550 0.3126817 0.6166380 0.1032189 0.2596818 0.2596818 0.4063629 
##       833       834       835       836       837       838       839       840 
## 0.4702826 0.2742164 0.6594907 0.6511006 0.2456567 0.6078200 0.1948076 0.6078200 
##       841       842       843       844       845       846       847       848 
## 0.8504604 0.5718933 0.3371149 0.1523581 0.4795451 0.5351922 0.1779202 0.3454651 
##       849       850       851       852       853       854       855       856 
## 0.4795451 0.4888216 0.3539117 0.7076282 0.3885739 0.2596818 0.4426427 0.1948076 
##       857       858       859       860       861       862       863       864 
## 0.5073915 0.3539117 0.5166720 0.4981059 0.3710769 0.4610405 0.3974345 0.5166720 
##       865       866       867       868       869       870       871       872 
## 0.7583957 0.1622018 0.4153536 0.6840526 0.3797863 0.3371149 0.5627758 0.6078200 
##       873       874       875       876       877       878       879       880 
## 0.3710769 0.2668862 0.2596818 0.6078200 0.3539117 0.2668862 0.2892468 0.3371149 
##       881       882       883       884       885       886       887       888 
## 0.2526048 0.4153536 0.4610405 0.7907789 0.7445237 0.2816707 0.5073915 0.3885739 
##       889       890       891       892       893       894       895       896 
## 0.3371149 0.3974345 0.4244010 0.4244010 0.3207195 0.6166380 0.5073915 0.2128829 
##       897       898       899       900       901       902       903       904 
## 0.6253800 0.2456567 0.3454651 0.5351922 0.4795451 0.4981059 0.3288651 0.2816707 
##       905       906       907       908       909       910       911       912 
## 0.4426427 0.3047550 0.4981059 0.4981059 0.5718933 0.1948076 0.8806110 0.6840526 
##       913       914       915       916       917 
## 0.6078200 0.5259410 0.7445237 0.2456567 0.2526048

GrƔfica del Modelo RLogS

Clase_salida <- heart_diseases_Dataset_VR_MOD$Clase_salida
FrecC_Max <- heart_diseases_Dataset_VR_MOD$FrecC_Max
dataPlot <- data.frame(FrecC_Max, Clase_salida)
plot(Clase_salida~FrecC_Max, data = dataPlot, main = "Modelo RLogS: FrecC_Max - Clase_salida", xlab = "FrecC_Max", ylab = "Clase_salida = 0 | Clase_salida = 1", col = "gold", pch = "I")
curve(predict(glm(Clase_salida~FrecC_Max, family = "binomial", data = dataPlot), data.frame(FrecC_Max = x), type = "response"), col = "orange", lwd = 3, add = TRUE)

Conclucion

Complementariamente a los analisis que fueron expuestos en las fases anteriores de estudio de cada modelo tratado en este trabajo es importante hacer una mencion global sobre el problema que se esta tratando abordar considerando a la luz de todo lo obtenido:

Para que a un paciente se le diagnostique de insuficiencia cardiaca, para el cual el genero es poco significativo, la frecuencia cardiaca maxima y la angina porducida por el ejercicio como ejemplo segun su valor puede ayudar a que el paciente se le diagnostique insuficiencia cardiaca. Sin embargo, las variables de trabajo usadas en este estudio solo explican en conjunto, aproximadamente el \(35\) \(%\) de la variabilidad de la variable objetivo, este valor no es suficiente para decir con certeza si un paciente se le diagnostica insuficiencia cardiaca o no, dado que el \(75\) \(%\) restante queda sujeto a especulaciones como si tiene problemas cardiacos hereditarios en su nucleo familiar, la cantidad de ejercicio que realiza por dia, como estos y otros parametros que no se cuentan en el conjunto de datos que se estudio, sin embargo que resultaria interesenta de estudiar para tener un resultado mas preciso sobre el problema que se aborda.

Por último, es importante resaltar el aspecto técnico relacionado con el procesamiento estadístico hecho en este estudio a nivel de robustez, eficiencia e integración que R, RStudio y RMarkdown ofrecen al usuario para que este se pueda enfocar en él sin pasar mayores inconvenientes con el soporte documental para presentarlo.

LS0tDQp0aXRsZTogIkVzdHVkaW8gZGVzY3JpcHRpdm8gbXVsdGl2YXJpYW50ZSBjb24gYmFzZSBlbiB1biBjb25qdW50byBkZSBkYXRvcyBxdWUgcmVnaXN0cmEgaW5mb3JtYWNpw7NuIHJlbGFjaW9uYWRhIGNvbiBsYSBpbnN1ZmljaWVuY2lhIGNhcmRpYWNhIg0KYXV0aG9yOiAiUG9yOiBHMjo6am9obi50YWdhcmE6Omp1bGlhbi5lc3RlYmFuLmJldGFuY291cnQ6Omp1bGlhbi5hbmRyZXMuZ2FsbGVnbzo6QGNvcnJlb3VuaXZhbGxlLmVkdS5jbyINCmRhdGU6ICIyMDI0LTAzLTIwIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogVFJVRQ0KICAgIHRvY19mbG9hdDogVFJVRQ0KICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUNCiAgICB0aGVtZTogdW5pdGVkDQotLS0NCjwhLS0gQ29uZmlndXJhY2nDs24gR2xvYmFsIGRlIFIgLS0+LS0tDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoY29ycnBsb3QpDQpsaWJyYXJ5KEdHYWxseSkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoYW5kcmV3cykNCmxpYnJhcnkodGNsdGspDQpsaWJyYXJ5KGFwbHBhY2spDQpsaWJyYXJ5KGdyYXBoaWNzKQ0KbGlicmFyeShjb3JycGxvdCkNCmxpYnJhcnkoTVZOKQ0KbGlicmFyeShyZXNoYXBlMikNCmxpYnJhcnkoRmFjdG9NaW5lUikNCmxpYnJhcnkoZmFjdG9leHRyYSkNCmxpYnJhcnkocHN5Y2gpDQpsaWJyYXJ5KEZhY3RvQ2xhc3MpDQpsaWJyYXJ5KGNsdXN0ZXIpDQpsaWJyYXJ5KGRlbmRleHRlbmQpDQpsaWJyYXJ5KG1hZ3JpdHRyKQ0KbGlicmFyeShOYkNsdXN0KQ0KbGlicmFyeShzdGFyZ2F6ZXIpDQoNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvPVRSVUUpDQoNCmhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQgPC0gcmVhZF9leGNlbCgifi9QcmVkaWNjaW9uX0luc3VmaWNpZW5jaWFfY2FyZGlhY2EueGxzeCIpDQpoZWFydF9kaXNlYXNlc19EYXRhc2V0X1ZSX01PRCA8LSByZWFkX2V4Y2VsKCJ+L1ByZWRpY2Npb25fSW5zdWZpY2llbmNpYV9jYXJkaWFjYV9WYXJfTU9ELnhsc3giKQ0KYGBgDQoNCiMgKipGYXNlIDEgW0Rlc2NyaXBjaW9uIE11bHRpdmFyaWFudGVdICoqDQoNCiMjICoqMS4xIE9iamV0aXZvcyBkZWwgRXN0dWRpbyoqDQoNCkVzdHVkaWFyLCBkZXNkZSBlbCBwdW50byBkZSB2aXN0YSBkZSBsYSBlc3RhZMOtc3RpY2EgZGVzY3JpcHRpdmEgbXVsdGl2YXJpYW50ZSAoY2FsY3Vsb3MsIHZpc3VhbGl6YWNpb25lcyBlIGludGVycHJldGFjaW9uZXMpIGEgdW4gY29uanVudG8gZGUgZGF0b3MgcmVsYWNpb25hZG9zIGNvbiANCmxhIGluc3VmaWNpZW5jaWEgY2FyZMOtYWNhLg0KDQoNCiMjICoqMS4yIERlc2NyaXBjaW9uIGRlbCBjb25qdW50byBkZSBkYXRvcyoqIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNCioqRnVlbnRlIGRlbCBjb25qdW50byBkZSBEYXRvcyoqDQoNCkVsIGNvbmp1bnRvIGRlIGRhdG9zIGRlIHRyYWJham8gc2Ugb2J0dXZvIHRvdGFsbWVudGUgZGUgKipLYWdnbGUqKjoNCjxhIGhyZWY9Imh0dHBzOi8vd3d3LmthZ2dsZS5jb20vZGF0YXNldHMvZmVkZXNvcmlhbm8vaGVhcnQtZmFpbHVyZS1wcmVkaWN0aW9uL2Rvd25sb2FkP2RhdGFzZXRWZXJzaW9uTnVtYmVyPTEiPkluc3VmaWNpZW5jaWEgY2FyZGlhY2E8L2E+LiBFcyBjb252ZW5pZW50ZSBhbm90YXIgcXVlICoqS2FnZ2xlKiogZXMgdW5hIGNvbXBhw7FpYSBzdWJzaWRpYXJpYSBkZSBHb29nbGUgTExDIHF1ZSBtYW50aWVuZSB1bmEgY29tdW5pZGFkIG9ubGluZSBkZSBjaWVudMOtZmljb3MgZGUgZGF0b3MgeSBwcm9mZXNpb25hbGVzIGRlbCBhcHJlbmRpemFqZSBhdXRvbcOhdGljbywgRXN0YSBlbXByZXNhIHBlcm1pdGUgYSBzdXMgdXN1YXJpb3MgZW5jb250cmFyIHkgcHVibGljYXIgY29uanVudG9zIGRlIGRhdG9zLCBleHBsb3JhciB5IGNyZWFyIG1vZGVsb3MgZW4gdW4gZW50b3JubyBkZSBjaWVuY2lhIGRlIGRhdG9zIGJhc2FkbyBlbiBsYSB3ZWIsIHRyYWJhamFyIGNvbiBvdHJvcyBjaWVudGlmaWNvcyBkZSBkYXRvcyBlIGluZ2VuaWVyb3MgZGUgYXByZW5kaXphamUgYXV0b21hdGljbyB5IHBhcnRpY2lwYXIgZW4gY29uY3Vyc29zIHBhcmEgcmVzb2x2ZXIgZGVzYWZpb3MgZGUgY2llbmNpYSBkZSBkYXRvcy4NCg0KKipDb250ZXh0byBkZWwgY29uanVudG8gZGUgRGF0b3MqKiANCg0KRWwgY29uanVudG8gcmVnaXN0cmEgZGF0b3Mgc29icmUgMTEgY2FtcG9zIHJlbGFjaW9uYWRvcyBjb24gZWwgZXN0YWRvIGRlIHNhbHVkLCBjb21wb3J0YW1pZW50b3MgeSByZXN1bHRhZG9zIGRlIGNoZXF1ZW9zIG3DqWRpY29zIGdlbmVyYWxlcy4gRXN0ZSBjb25qdW50byBkZSBkYXRvcyBmdWUgYWN0dWFsaXphZG8gcG9yIHVsdGltYSB2ZXogZW4gc2VwdGllbWJyZSBkZWwgMjAyMS4NCg0KKipEZXNjcmlwY2lvbiBkZWwgY29uanVudG8gZGUgRGF0b3MqKg0KDQpFbCBjb25qdW50byBkZSBkYXRvcyBjb250aWVuZSAxMiBjYW1wb3MgeSA5MTcgcmVnaXN0cm9zLiBFbiBkb25kZSB1bm8gZGUgbG9zIGNhbXBvcyB0aWVuZSB2YWxvcmVzIG5lZ2F0aXZvcyBlbiBsb3MgcmVnaXN0cm9zOyB0YW1iacOpbiBleGlzdGVuIG90cm9zIDMgY2FtcG9zIGVuIGRvbmRlIHN1cyByZWdpc3Ryb3Mgc29uIGRlIG5hdHVyYWxlemEgcG9saXTDs21pY2EsIG90cm9zIDQgY2FtcG9zIGRlIG5hdHVyYWxlemEgZGljb3TDs21pY2EgIHkgZWwgcmVzdG8gZGUgY2FtcG9zIHNvbiBkZSBuYXR1cmFsZXphIGVzdHJpY3RhbWVudGUgbnVtw6lyaWNhIHBvc2l0aXZhLiBMYSBsaXN0YSBhIGNvbnRpbnVhY2nDs24gaGFyw6EgdW5hIGRlc2NyaXBjacOzbiBlbiBlbCBtaXNtbyBvcmRlbiBkZSBsb3MgY2FtcG8gcXVlIHNlcmlhIGRlIGl6cXVpZXJkYSBhIGRlcmVjaGEsIHRhbWJpw6luIHNlIGhhcsOhIHVuYSBkZXNjcmlwY2nDs24gZGVsIHRpcG8gZGUgdmFyaWFibGUgeSBzdSBlc2NhbGEgbWVkaWNpw7NuIGNvbiBiYXNlIGVuIGVzdGEgbm9tZW5jbGF0dXJhICh0aXBvIGRlIHZhcmlhYmxlOjplc2NhbGEgZGUgbWVkaWNpw7NuIFtvcmRlbmFtaWVudG9dKS4NCg0K4oCiCSoqRWRhZCoqIChjdWFudGl0YXRpdmE6OnJhesOzbik6IFJlZ2lzdHJhIGxhIGVkYWQgZGVsIHBhY2llbnRlIGVuIGHDsW9zLg0KDQrigKIJKipTZXhvKiogKGN1YWxpdGF0aXZhOjpub21pbmFsKTogUmVnaXN0cmEgZWwgc2V4byBkZSBjYWRhIHBhY2llbnRlIGRlIGxhIHNpZ3VpZW50ZSBmb3JtYTogKipNKiogKHBhY2llbnRlIGRlbCBzZXhvIG1hc2N1bGlubykgeSAqKkYqKiAocGFjaWVudGUgZGVsIHNleG8gZmVtZW5pbm8pLg0KDQrigKIJKipUaXBvX2RvbG9yX3BlY2hvKiogKGN1YWxpdGF0aXZhOjpub21pbmFsKTogUmVnaXN0cmEgZWwgdGlwbyBkZSBkb2xvciBlbiBlbCBwZWNobyBxdWUgcHJlc2VudGEgZWwgcGFjaWVudGUsIGVsIGN1YWwgc2UgY2xhc2lmaWNhIGVuIGVsIGNvbmp1bnRvIGRlIGRhdG9zIGRlIGxhIHNpZ3VpZW50ZSBmb3JtYTogQW5naW5pYSBhdMOtcGljYSwgZG9sb3Igbm8gYW5naW5vc28sIGFuZ2luaWEgYXTDrXBpY2EgeSBhc2ludG9tw6F0aWNvLiBTZSByZWNhbGNhciBxdWUgbG9zIGNyaXRlcmlvcyBkZSBlc3RhcyBjYXRlZ29yw61hcyBubyBmdWVyb24gcHJvcG9yY2lvbmFkb3MuDQoNCuKAogkqKlBBX3JlcG9zbyoqIChjdWFudGl0YXRpdmE6OnJhesOzbik6IFJlZ2lzdHJhIGxhIHByZXNpw7NuIGFydGVyaWFsIGVuIHJlcG9zbyB5IGxhIHVuaWRhZCBkZSBtZWRpZGEgYSB1dGlsaXphciBlcyBtaWzDrW1ldHJvIGRlIG1lcmN1cmlvIChtbSAgSGcpLkxhIGVzY2FsYSBkZSBlc3RlIGNhbXBvIGRlc2RlIDgwIGhhc3RhIDIwMC4NCg0K4oCiCSoqQ29sZXN0ZXJvbCoqIChjdWFudGl0YXRpdmE6OnJhesOzbik6IFJlZ2lzdHJhIGVsIG5pdmVsIGRlIGNvbGVzdGVyb2wgc8OpcmljbyBkZSBjYWRhIHBhY2llbnRlIHV0aWxpemFuZG8gdW5hIHVuaWRhZCBkZSBtZWRpZGEgZGUgbWlsaWdyYW1vIHBvciBkZWNpbGl0cm8gKG1nL2RsKSB5IGxhIGVzY2FsYSBxdWUgdXRpbGl6YSB2YSBkZXNkZSA0MCBoYXN0YSA2MDMuDQoNCuKAogkqKkFaX0F5dW5hcyoqIChjdWFudGl0YXRpdmE6OnJhesOzbik6IFJlZ2lzdHJhIGVsIG5pdmVsIGRlIGF6w7pjYXIgZW4gbGEgc2FuZ3JlIGVuIGF5dW5hcyBkZSBsb3MgcGFjaWVudGVzLCBsYSBjdWFsIHV0aWxpemEgdW5hIGVzY2FsYSBkZSBtZWRpZGEgZGUgbWlsaWdyYW1vIHBvciBkZWNpbGl0cm8gKG1nL2RsKSBkZXNkZSA4MCBoYXN0YSA0MDAuDQoNCuKAogkqKkVDR19yZXBvc28qKiAoY3VhbGl0YXRpdmE6Om5vbWluYWwpOiBSZWdpc3RyYSBlbCByZXN1bHRhZG8gZGVsIGVsZWN0cm9jYXJkaW9ncmFtYSBlbiByZXBvc28gZWwgY3VhbCB0aWVuZSAzIGNhdGVnb3JpYXM6IE5vcm1hbCwgU1QgKGFub21hbGlhIGVuIGxhcyBvbmRhcyBzdC10KSB5IExWSCAoSGlwZXJ0cm9maWEgdmVudHJpY3VsYXIgaXpxdWllcmRhKS4NCg0K4oCiCSoqRnJlY0NfTWF4KiogKGN1YW50aXRhdGl2YTo6cmF6w7NuKTogUmVnaXN0cmEgbGEgZnJlY3VlbmNpYSBjYXJkaWFjYSBtw6F4aW1hIGRlIGxvcyBwYWNpZW50ZXMsIHkgc2UgbWlkZSBlbiBsYXRpZG9zIHBvciBtaW51dG8gKGxwbSkgeSBsYSBlc2NhbGEgZGVsIGNhbXBvIGVzdGEgZW50cmUgNjAgeSAyMDIuDQoNCuKAogkqKkFuZ2luaWFfRWplcmNpY2lvKiogKGN1YWxpdGF0aXZhOjpub21pbmFsKTogUmVnaXN0cmEgbGEgYW5naW5hIG8gZG9sb3IgZW4gbGEgY2FqYSB0b3LDoWNpY2EgaW5kdWNpZGEgcG9yIGVsIGVqZXJjaWNpbyB5IGVzdGEgdGllbmUgZG9zIGNsYXNpZmljYWNpb25lcyAqKk4qKiAobm8gcHJlc2VudGEpLCB5ICoqWSoqIChzaSBwcmVzZW50YSkuDQoNCuKAogkqKk9sZHBlYWsqKiAoY3VhbnRpdGF0aXZhOjpyYXrDs24pOiBSZWdpc3RyYSBlbCB2YWxvciBudW3DqXJpY28gZGUgbGEgZGVwcmVzacOzbiBkZWwgc2VnbWVudG8gU1QgZW4gdW4gZWxlY3Ryb2NhcmRpb2dyYW1hIHkgc2UgbWlkZSBlbiBtaWzDrW1ldHJvcyAobW0pIGVsIGN1YWwgdGllbmUgdW5hIGVzY2FsYSBxdWUgdmEgZGVzZGUgLTI2IGhhc3RhIDYyLg0KDQrigKIJKipQZW5kaV9TZWdtZV9TVF9FamVyY2ljaW8qKiAoY3VhbGl0YXRpdmE6Om5vbWluYWwpOiBSZWdpc3RyYSBsYSBwZW5kaWVudGUgZGVsIHNlZ21lbnRvIFNUIGN1YW5kbyBzZSBlc3RhIHJlYWxpemFuZG8gZWwgbcOheGltbyBlamVyY2ljaW8gIHkgZXN0ZSB0aWVuZSAzIGNsYXNpZmljYWNpb25lczogQXNjZW5kZW50ZSwgZGVzY2VuZGVudGUgeSBwbGFuby4NCg0K4oCiCSoqQ2xhc2Vfc2FsaWRhKiogKGN1YWxpdGF0aXZhOjpub21pbmFsKTogUmVnaXN0cmEgc2kgZWwgcGFjaWVudGUgc2UgZGlhZ25vc3RpY2EgY29uIHVuYSBlbmZlcm1lZGFkIGNhcmRpYWNhIG8gc2kgc2FsZSBlbiBjb25kaWNpb25lcyBub3JtYWxlcywgZXN0ZSBjYW1wbyB0aWVuZSBkb3MgY2xhc2lmaWNhY2lvbmVzICoqMCoqIChwYXJhIHNhbGlkYSBub3JtYWwpIHkgKioxKiogKHBhcmEgc2FsaWRhIGNvbiBlbmZlcm1lZGFkIGNhcmRpYWNhKS4NCg0KUG9yIMO6bHRpbW8sIHNlIHJlY2FsY2EgcXVlIGVsIGNvbmp1bnRvIGRlIGRhdG9zIGZ1ZSByZWVzY3JpdG8sIHkgZW4gYWxndW5vcyBjYXNvcyBlbiBsYXMgdmFyaWFibGVzIGN1YW50aXRhdGl2YXMgY29tbyBlbCBhesO6Y2FyIGVuIHNhbmdyZSBxdWUgb3JpZ2luYWxtZW50ZSBlcmEgdW5hIHZhcmlhYmxlIGN1YWxpdGF0aXZhIGNvbiByZWdpc3Ryb3MgKiowKiogKG1lbm9yIG8gaWd1YWwgYSAxMjAgbWcvZGwpIHkgKioxKiogKG1heW9yIGEgMTIwIG1nL2RsKSBhIHVuYSBjdWFudGl0aXZhIGRlIGVzY2FsYSByYXpvbi4NCg0KIyMjIEVzdHJ1Y3R1cmEgZGVsIENvbmp1bnRvIGRlIERhdG9zIA0KYGBge3IgRXN0cnVjdHVyYV9Db25qdW50b19kZV9EYXRvcywgZmlnLmFsaWduPSdjZW50ZXInfQ0Kc3RyKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQpDQpgYGANCg0KIyMjIFZpc3VhbGl6YWNpw7NuIGRlbCBDb25qdW50byBkZSBkYXRvcw0KYGBge3IgVmlzdWFsaXphY2lvbl9Db25qdW50b19kZV9EYXRvcywgZmlnLmFsaWduPSdjZW50ZXInfQ0KaGVhcnRfZGlzZWFzZXNfRGF0YXNldA0KYGBgDQoNCiMjICoqMS4zIEVzdGltYWNpb25lcyBNdWx0aXZhcmlhbnRlcyAqKiB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQpMYXMgbWVkaWRhcyBkZSBtZWRpYSwgdmFyaWFuemEgeSBjb3ZhcmlhbnphIGNvbnN0aXR1eWVuIHVuIGNvbmp1bnRvIGZ1bmRhbWVudGFsIHBhcmEgZGVzY3JpYmlyIGVsIGNvbXBvcnRhbWllbnRvIHBvc2ljaW9uYWwsIGRpc3BlcnNpdm8geSBjb3JyZWxhY2lvbmFsIGRlIHZhcmlhYmxlcyBhbGVhdG9yaWFzLiBFbiBlbCBjb250ZXh0byBkZSB1biBjb25qdW50byBkZSBkYXRvcyBxdWUgY29udGllbmUgc2VpcyB2YXJpYWJsZXMgYWxlYXRvcmlhcyBudW3DqXJpY2FzIHkgc2UgcmVwcmVzZW50YSBtYXRyaWNpYWxtZW50ZSwgZXN0YXMgbWVkaWRhcyBzZSBjYWxjdWxhbiB1dGlsaXphbmRvIHZlY3RvcmVzIHkgbWF0cmljZXMgZW4gZWwgYW7DoWxpc2lzIGRlc2NyaXB0aXZvIG11bHRpdmFyaWFibGUuDQoNCkVsIHZlY3RvciBkZSBtZWRpYXMgZGVzY3JpYmUgZWwgY29tcG9ydGFtaWVudG8gcG9zaWNpb25hbCBkZSBjYWRhIHZhcmlhYmxlIGVuIHJlbGFjacOzbiBjb24gdG9kb3Mgc3VzIHJlZ2lzdHJvcywgcmVwcmVzZW50YW5kbyBlbCB2YWxvciBlc3BlcmFkbyBvIHB1bnRvIG1lZGlvIHBhcmEgY2FkYSB2YXJpYWJsZS4NCg0KTGEgbWF0cml6IGRlIHZhcmlhbnphcy1jb3ZhcmlhbnphcyBwcm9wb3JjaW9uYSBpbmZvcm1hY2nDs24gc29icmUgbGFzIGRpc3BlcnNpb25lcyBkZSBjYWRhIHZhcmlhYmxlIGVuIHJlbGFjacOzbiBjb24gc3VzIG1lZGlhcy4gRW4gc3UgZGlhZ29uYWwgcHJpbmNpcGFsLCBzZSBlbmN1ZW50cmFuIGxhcyB2YXJpYW56YXMgZGUgY2FkYSB2YXJpYWJsZSByZXNwZWN0byBhIHN1IG1lZGlhLiBQb3IgZW5jaW1hIG8gcG9yIGRlYmFqbyBkZSBsYSBkaWFnb25hbCBwcmluY2lwYWwsIHNlIGVuY3VlbnRyYW4gbGFzIGNvdmFyaWFuemFzIHF1ZSBlc3RpbWFuIGxhcyByZWxhY2lvbmVzIGxpbmVhbGVzIGVudHJlIHRvZGFzIGxhcyBjb21iaW5hY2lvbmVzIHBvc2libGVzIGRlIHBhcmVzIGRlIHZhcmlhYmxlcyBlbiBlbCBjb25qdW50byBkZSBkYXRvcy4NCg0KKipQbGFudGVhbWllbnRvIGRlbCBQcm9ibGVtYSoqDQoNCkNvbiBiYXNlIGVuIGVsIGNvanVudG8gZGUgZGF0b3MgbWVuY2lvbmFkbyBhbnRlcmlvcm1lbnRlIGxvIHF1ZSBzZSBwcmV0ZW5kZXJhIGVzIGNhbGN1bGFyIGUgaW50ZXJwcmV0YXIgZXN0ZSBjb25qdW50bywgcGFyYSBsYXMgdmFyaWFibGVzIGVzdHJpY3RhbWVudGUgbnVtZXJpY2FzLCBjb21vOiBlbCB2ZWN0b3IgZGUgbWVkaWFzLCBsYSB2YXJpYW56YS1jb3ZhcmlhbnphIHkgbGEgbWF0cml6IGRlIGNvcnJlbGFjaW9uYWRhcy4gUGFyYSByZWNvcmRhciBjdWFsZXMgZnVlcm9uIGxhcyB2YXJpYWJsZXMgbnVtZXJpY2FzIChjb24gdW5hIGVzY2FsYSBkZSBtZWRpY2lvbiBkZSByYXpvbikgc29uOiAqKkVkYWQqKiwgKipQQV9yZXBvc28qKiwgKipDb2xlc3Rlcm9sKiosICoqQVpfQXl1bmFzKiosICoqRnJlY0NfTWF4KiogeSAqKk9sZHBlYWsqKg0KDQoqKkRlc2Fycm9sbG8gZGVsIEFuw6FsaXNpcyAqKg0KDQpFbiBiYXNlIGEgbGEgbmF2ZWdhY2lvbiBkZSBwZXN0YcOxYXMgcXVlIG5vcyBwZXJtaXRlIFJTdHVkaW8gc2UgY2FsY3VsbyBsb3Mgc2lndWllbnRlcyB0cmVzIG9iamV0b3M6ICoqVmVjdG9yIGRlIE1lZGlhcyoqLCAqKk1hdHJpeiBkZSBWYXJpYW56YXMtQ29iYXJpYW56YXMqKiB5ICoqTWF0cml6IGRlIENvcnJlbGFjaW9uZXMqKi4NCg0KQmFzw6FuZG9ub3MgZW4gbGEgcGVzdGHDsWEgKipWZWN0b3IgZGUgTWVkaWFzKiosIHNlIG9ic2VydmEgcXVlIGVuIGdlbmVyYWwgbG9zIGRhdG9zIHJlZ2lzdHJhZG9zIHBhcmEgY2FkYSB1bmEgZGUgbGFzIHZhcmlhYmxlcyB0aWVuZGVuIGEgcHJlc2VudGFyIGNvbGFzIGRlcmVjaGFzIGVuIHN1cyBkaXN0cmlidWNpb25lcywgbG8gcXVlIGhhY2UgcXVlIGxhcyBtZWRpYXMgZXN0aW1hZGFzIHRpZW5kYW4gYSBzZXIgYWx0YXMuIEFkZW3DoXMsIGVuIHJlbGFjacOzbiBjb24gbGEgbWVkaWFuYSwgc29sbyBsYSB2YXJpYWJsZSAqKkNvbGVzdGVyb2wqKiB5ICoqT2xkcGVhayoqIG11ZXN0cmFuIHVuIHNlc2dvIG5vdGFibGUgZW4gY29tcGFyYWNpw7NuIGNvbiBsYXMgZGVtw6FzLiBUYW1iacOpbiBzZSBoYSBvYnNlcnZhZG8gcXVlIHRvZG9zIGxvcyBjYXNvcyBhdMOtcGljb3Mgc2UgZW5jdWVudHJhbiBlbiBlbCBleHRyZW1vIHN1cGVyaW9yLiBTaSByZXZpc2Ftb3MgbG9zIHJhbmdvcyBkZSBsYXMgdmFyaWFibGVzIGVzdHVkaWFkYXMsIHBvZGVtb3MgZW5jb250cmFyIHF1ZSBsYXMgbWVkaWFzIHNvbiBiYWphcyBlbiBjb21wYXJhY2nDs24gY29uIGxvcyBleHRyZW1vcyBzdXBlcmlvcmVzIGRlIGNhZGEgcmFuZ28uDQoNCkJhc2FuZG9ub3MgZW4gbGEgcGVzdGHDsWEgKipNYXRyaXogZGUgVmFyaWFuemEtQ292YXJpYW56YSoqIFNlIHB1ZWRlIGludGVycHJldGFyIHF1ZSBlbiBnZW5lcmFsLCBsYXMgcmVsYWNpb25lcyBlbnRyZSBsYXMgdmFyaWFibGVzIHRvbWFkYXMgcG9yIHBhcmVzIGVuIHN1IG1heW9yaWEgdGllbmRlbiBhIHNlciBkZSBwcm9wb3JjaW9uYWxpZGFkIGluZGlyZWN0YSB5IGVuIGxhIGRpYWdvbmFsIGRlIGxhIG1hdHJpeiBwb2RlbW9zIG9ic2VydmFyIGNvbW8gdmFyaWFuIGxvcyBkYXRvcyBkZW50cm8gZGUgc3UgcHJvcGlhIGNsYXNpZmljYWNpb24uDQoNCkJhc2FuZG9ub3MgZW4gbGEgcGVzdGHDsWEgKipNYXRyaXogZGUgQ29ycmVsYWNpb25lcyoqIHkgYWwgY29uc2lkZXJhciBsb3MgcmVzdWx0YWRvcyBkZSBsYSAqKk1hdHJpeiBkZSBWYXJpYW56YXMtQ292YXJpYW56YXMqKiBzZSBwdWVkZSB2ZXJpZmljYXIgcXVlIGxvcyBjb2VmaWNpZW50ZXMgZGUgY29ycmVsYWNpb24gc29uIG5lZ2F0aXZvcyB5IHBvc2l0aXZvcyBlbnRyZSBsYXMgdmFyaWFibGVzOiAqKkVkYWQqKiwgKipQQV9yZXBvc28qKiwgKipDb2xlc3Rlcm9sKiosICoqQVpfQXl1bmFzKiosICoqRnJlY0NfTWF4KiogeSAqKk9sZHBlYWsqKi4gRXN0YXMgY29ycmVsYWNpb25lcyBlcmFuIGRlIGVzcGVyYXJzZSBlbiBlbCBjb25qdW50byBlc3R1ZGlhZG8uDQoNCiMjIyBWZWN0b3IgZGUgTWVkaWFzICAgDQoNCmBgYHtyIFZlY3Rvcl9kZV9tZWRpYXMsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KYXBwbHkoaGVhcnRfZGlzZWFzZXNfRGF0YXNldFssLWMoMiwzLDcsOSwxMSwxMildLCAyLCBtZWFuKQ0KaGVhcnRfZGlzZWFzZXNfRGF0YXNldF9SZWR1Y2lkbyA9aGVhcnRfZGlzZWFzZXNfRGF0YXNldFssLWMoMiwzLDcsOSwxMSwxMildDQpwYXIobWZyb3cgPSBjKDEsIG5jb2woaGVhcnRfZGlzZWFzZXNfRGF0YXNldF9SZWR1Y2lkbykpKQ0KaW52aXNpYmxlKGxhcHBseSgxOm5jb2woaGVhcnRfZGlzZWFzZXNfRGF0YXNldF9SZWR1Y2lkbyksIGZ1bmN0aW9uKGkpIGJveHBsb3QoaGVhcnRfZGlzZWFzZXNfRGF0YXNldF9SZWR1Y2lkb1ssIGldKSkpDQpgYGANCg0KIyMjIE1hdHJpeiBkZSBWYXJpYW56YXMgeSBDb3Zhcmlhbnphcw0KYGBge3IgTWF0cml6X2RlX1Zhcmlhbnphc195X0NvdmFyaWFuemFzLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCnJvdW5kKGNvdihoZWFydF9kaXNlYXNlc19EYXRhc2V0WywtYygyLDMsNyw5LDExLCAxMildKSwyKQ0KYGBgDQoNCiMjIyBNYXRyaXogZGUgY29ycmVsYWNpb25lcw0KYGBge3IgTWF0cml6X2RlX0NvcnJlbGFjaW9uZXMsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0Kcm91bmQoY29yKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRbLC1jKDIsMyw3LDksMTEsMTIpXSksMikNCmBgYA0KDQojIyAqKjEuNCBHcmFmaWNhcyBNdWx0aXZhcmlhZGFzICoqIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQpTZSBtZW5jaW9uYSBxdWUgZW4gdMOpcm1pbm9zIGdlbmVyYWxlcywgbG9zIGdyw6FmaWNvcyBtdWx0aXZhcmlhZG9zIGN1bXBsZW4gZG9zIG9iamV0aXZvcyBlc2NlbmNpYWxlczogZW4gcHJpbWVyIGx1Z2FyLCBheXVkYW4gYSBjb21wYXJhciBlbCBjb21wb3J0YW1pZW50byBkZSBwb2JsYWNpb25lcyBkZSBlc3R1ZGlvIGJhc8OhbmRvc2UgZW4gdmFyaWFibGVzIGNhdGVnw7NyaWNhcywgeSBlbiBzZWd1bmRvIGx1Z2FyLCBmYWNpbGl0YW4gbGEgY29tcHJlbnNpw7NuIGRlIGxhIGVzdHJ1Y3R1cmEgZGUgY29ycmVsYWNpw7NuIGVudHJlIG3Dumx0aXBsZXMgdmFyaWFibGVzLiBFbiBlc3RlIGNvbnRleHRvLCBlbCBjb25qdW50byBkZSBkYXRvcyBlbiBjdWVzdGnDs24gc2Vyw6EgcmVzcGFsZGFkbyB2aXN1YWxtZW50ZSBhIHRyYXbDqXMgZGUgdHJlcyB0aXBvcyBkZSBkaWFncmFtYXM6IHVubyBxdWUgaW50ZWdyYSBkaXNwZXJzacOzbiwgZGlzdHJpYnVjacOzbiB5IGNvcnJlbGFjaW9uZXM7IG90cm8gcXVlIHV0aWxpemEgbGEgcmVuZGVyaXphY2nDs24gZGUgcG9sw61nb25vczsgeSBmaW5hbG1lbnRlLCB1bm8gcXVlIGVtcGxlYSBjYXJhcyBkZSBDaGVybm9mZiBwYXJhIHJlcHJlc2VudGFjacOzbiBncsOhZmljYS4NCg0KKipQbGFudGVhbWllbnRvIGRlbCBQcm9ibGVtYSoqDQoNCkNvbiBiYXNlIGVuIGVsIGNvbmp1bnRvIGRlIGRhdG9zIGRlc2NyaXRvIGVuIGxhIGZhc2UgMSBzZWNjaW9uIDEuMiwgc2UgY2FsY3VsYXLDoW4gZSBpbnRlcnByZXRhcsOhbiBkaXZlcnNhcyBncsOhZmljYXMgbXVsdGl2YXJpYWRhcyBwYXJhIGxhcyB2YXJpYWJsZXMgbnVtw6lyaWNhcy4gTGFzIHZhcmlhYmxlcyBudW3DqXJpY2FzIHV0aWxpemFkYXMgKGVuIHVuYSBlc2NhbGEgZGUgbWVkaWNpw7NuIGRlIHJhesOzbikgaW5jbHV5ZW46ICoqRWRhZCoqLCAqKlBBX3JlcG9zbyoqLCAqKkNvbGVzdGVyb2wqKiwgKipBWl9BeXVuYXMqKiwgKipGcmVjQ19NYXgqKiB5ICoqT2xkcGVhayoqLg0KDQpBIGNvbnRpbnVhY2nDs24sIHNlIHJlYWxpemFyw6FuIGxhcyBzaWd1aWVudGVzIGdyw6FmaWNhcyBtdWx0aXZhcmlhZGFzOg0KDQotICoqRGlhZ3JhbWEgZGUgQ29ycmVsYWNpb25lczoqKiBFc3RlIGRpYWdyYW1hIG1vc3RyYXLDoSBsYXMgcmVsYWNpb25lcyBkZSBjb3JyZWxhY2nDs24gZW50cmUgcGFyZXMgZGUgdmFyaWFibGVzIG51bcOpcmljYXMuIExhcyBsw61uZWFzIG8gY29sb3JlcyBpbmRpY2Fyw6FuIGxhIGZ1ZXJ6YSB5IGRpcmVjY2nDs24gZGUgbGEgY29ycmVsYWNpw7NuIGVudHJlIGNhZGEgcGFyIGRlIHZhcmlhYmxlcy4gRXN0byBheXVkYXLDoSBhIGlkZW50aWZpY2FyIHBhdHJvbmVzIGRlIGFzb2NpYWNpw7NuIGxpbmVhbCBlbnRyZSBsYXMgdmFyaWFibGVzLg0KDQotICoqTWF0cml6IGRlIERpYWdyYW1hIGRlIERpc3BlcnNpw7NuKio6IExhIG1hdHJpeiBkZSBkaWFncmFtYSBkZSBkaXNwZXJzacOzbiByZXByZXNlbnRhcsOhIGdyw6FmaWNhbWVudGUgbGEgcmVsYWNpw7NuIGVudHJlIHRvZGFzIGxhcyBjb21iaW5hY2lvbmVzIHBvc2libGVzIGRlIHZhcmlhYmxlcyBudW3DqXJpY2FzLiBDYWRhIGNlbGRhIGRlIGxhIG1hdHJpeiBtb3N0cmFyw6EgdW4gZGlhZ3JhbWEgZGUgZGlzcGVyc2nDs24gcXVlIGlsdXN0cmEgbGEgcmVsYWNpw7NuIGVudHJlIHVuIHBhciBlc3BlY8OtZmljbyBkZSB2YXJpYWJsZXMuIEVzdG8gcGVybWl0aXLDoSB2aXN1YWxpemFyIHNpbXVsdMOhbmVhbWVudGUgbcO6bHRpcGxlcyByZWxhY2lvbmVzIGVudHJlIGxhcyB2YXJpYWJsZXMuDQoNCi0gKipEaWFncmFtYSBkZSBFc3RyZWxsYXM6KiogRXN0ZSB0aXBvIGRlIGRpYWdyYW1hIHNlIHV0aWxpemEgcGFyYSBtb3N0cmFyIHJlbGFjaW9uZXMgY29tcGxlamFzIGVudHJlIG3Dumx0aXBsZXMgdmFyaWFibGVzLiBDYWRhIHZhcmlhYmxlIHNlIHJlcHJlc2VudGEgY29tbyB1biBlamUgZW4gdW4gZ3LDoWZpY28gcmFkaWFsLCB5IGxvcyBwdW50b3MgbyBsw61uZWFzIGNvbmVjdGFkYXMgaW5kaWNhcsOhbiBsYXMgb2JzZXJ2YWNpb25lcyBkZSBkYXRvcy4gRXN0byBmYWNpbGl0YSBsYSBpZGVudGlmaWNhY2nDs24gZGUgcGF0cm9uZXMgbyBhZ3J1cGFjaW9uZXMgZW4gbG9zIGRhdG9zIG11bHRpdmFyaWFkb3MuDQoNCi0gKipDYXJhcyBkZSBDaGVybm9mZjoqKiBMYXMgY2FyYXMgZGUgQ2hlcm5vZmYgc29uIHVuIG3DqXRvZG8gdmlzdWFsIMO6bmljbyBwYXJhIHJlcHJlc2VudGFyIG3Dumx0aXBsZXMgdmFyaWFibGVzIG51bcOpcmljYXMgbWVkaWFudGUgbGEgbW9kaWZpY2FjacOzbiBkZSBsYXMgY2FyYWN0ZXLDrXN0aWNhcyBmYWNpYWxlcyAoY29tbyBmb3JtYSBkZSBvam9zLCBib2NhLCBldGMuKSBwYXJhIHJlZmxlamFyIGxvcyB2YWxvcmVzIGRlIGxhcyB2YXJpYWJsZXMuIENhZGEgY2FyYSByZXByZXNlbnRhIHVuYSBvYnNlcnZhY2nDs24gZW4gZWwgY29uanVudG8gZGUgZGF0b3MgeSBwZXJtaXRlIHVuYSB2aXN1YWxpemFjacOzbiBpbnR1aXRpdmEgZGUgbGFzIGRpZmVyZW5jaWFzIHkgc2ltaWxpdHVkZXMgZW50cmUgbGFzIG9ic2VydmFjaW9uZXMgYmFzYWRhcyBlbiBtw7psdGlwbGVzIGNhcmFjdGVyw61zdGljYXMuDQoNCkVzdGFzIGdyw6FmaWNhcyBtdWx0aXZhcmlhZGFzIHByb3BvcmNpb25hcsOhbiB1bmEgdmlzacOzbiBjb21wbGV0YSB5IGRldGFsbGFkYSBkZSBsYSBlc3RydWN0dXJhIGRlIGxvcyBkYXRvcyBudW3DqXJpY29zLCBheXVkYW5kbyBhIGlkZW50aWZpY2FyIHBhdHJvbmVzLCBhc29jaWFjaW9uZXMgeSBwb3NpYmxlcyBhZ3J1cGFjaW9uZXMgZW4gZWwgY29uanVudG8gZGUgZGF0b3MgZGVzY3JpdG8gZW4gbGEgc2VjY2nDs24gMS4yLg0KDQoqKkRlc2Fyb2xsbyBkZWwgQW5hbGlzaXMgKioNCg0KTGEgbmF2ZWdhY2nDs24gYSB0cmF2w6lzIGRlIHBlc3Rhw7FhcyBxdWUgbm9zIHBlcm1pdGUgUlN0dWRpbyBtb3N0cmFyw6EgbGFzIGdyw6FmaWNhcyBtdWx0aXZhcmlhZGFzIGRlOiAqKkRpYWdyYW1hIENvbmp1bnRvIGRlIERpc3BlcnNpw7NuLCBEaXN0cmlidWNpw7NuIHkgQ29ycmVsYWNpb25lcyoqIChzaW4gYWdydXBhY2nDs24gKipTQSoqIHkgY29uIGFncnVwYWNpw7NuICoqQ0EqKjsgdGVuaWVuZG8gZW4gY3VlbnRhIGxhcyA2IHZhcmlhYmxlcyBjYXRlZ8OzcmljYXM6IFNleG86IFNFWCwgVGlwb19kb2xvcl9wZWNobzogVElQLCBFQ0dfcmVwb3NvOiBFQ0csIEFuZ2luYV9FamVyY2ljaW86IEFORSwgUGVuZGlfU2VnbWVfU1RfRWplcmNpY2lvOiBQU1QsIENsYXNlX3NhbGlkYTogQ1MpLCAqKkRpYWdyYW1hIGRlIEVzdHJlbGxhcyoqIHkgKipDYXJhcyBkZSBDaGVybm9mZioqLg0KDQpCYXPDoW5kb25vcyBlbiBsYSBwZXN0YcOxYSAqKkRpYWdyYW1hIENvbmp1bnRvIGRlIERpc3BlcnNpw7NuLCBEaXN0cmlidWNpw7NuIHkgQ29ycmVsYWNpb25lcyBbU0FdKiosIGRvbmRlIHBvZGVtb3Mgb2JzZXJ2YXIgcXVlIGV4aXN0ZW4gZG9zIGNvcnJlbGFjaW9uZXMsIHVuYSBwb3NpdGl2YSBtw6FzIGFsdGEsIHN1cGVyaW9yIGEgJDAuMiQsIHkgdW5hIG5lZ2F0aXZhIG3DoXMgYmFqYSwgaW5mZXJpb3IgYSAkLTAuMSQuIEVuIGdlbmVyYWwsIGRlcGVuZGllbmRvIGRlIGNvbiBxdWnDqW4gc2UgY29ycmVsYWNpb25lbiwgbm9zIHB1ZWRlbiBkYXIgcmVzdWx0YWRvcyBwb3NpdGl2b3MgbyBuZWdhdGl2b3MuIEFob3JhLCBlbCBzaWduaWZpY2FkbyBkZSBlc3RvIG5vcyBpbmRpY2EgZWwgbml2ZWwgZGUgcHJvcG9yY2lvbmFsaWRhZCAoZGlyZWN0YSBvIGluZGlyZWN0YSkgcXVlIHRpZW5lbiBsYXMgdmFyaWFibGVzIGN1YW5kbyBzZSByZWxhY2lvbmFuIHVuYXMgY29uIG90cmFzLiBTaW4gZW1iYXJnbywgZXMgaW1wb3J0YW50ZSBkZXN0YWNhciBxdWUgbmluZ3VuYSBkZSBlc3RhcyB2YXJpYWJsZXMgZXMgZXh0cmVtYWRhbWVudGUgZXhwbGljYXRpdmEgcG9yIHPDrSBzb2xhLiBBdW5xdWUgbXVlc3RyYW4gY29ycmVsYWNpb25lcyBhbHRhcyB5IGJhamFzLCBsbyBxdWUgc3VnaWVyZSB1biBjaWVydG8gbml2ZWwgZGUgcmVsYWNpw7NuIGVudHJlIGVsbGFzLCBuaW5ndW5hIGRlIGVsbGFzIHB1ZWRlIGV4cGxpY2FyIGNvbXBsZXRhbWVudGUgZXN0ZSBmZW7Ds21lbm8sIGxvIGN1YWwgc3VnaWVyZSBxdWUgdGFtYmnDqW4gaGF5IGluZmx1ZW5jaWEgZGUgb3Ryb3MgZmFjdG9yZXMgZXh0ZXJub3MgcGFyYSBwb2RlciBkaWFnbm9zdGljYXIgc2kgZXhpc3RlIGluc3VmaWNpZW5jaWEgY2FyZMOtYWNhIG8gbm8gZW4gZWwgcGFjaWVudGUuDQoNCkRlIG1hbmVyYSBjb21wbGVtZW50YXJpYSwgYmFzw6FuZG9ub3MgZW4gbGFzIHBlc3Rhw7FhcyAqKkRpYWdyYW1hIENvbmp1bnRvIGRlIERpc3BlcnNpw7NuLCBEaXN0cmlidWNpw7NuIHkgQ29ycmVsYWNpb25lcyoqLCBwZXJvIGVuIHN1cyB2ZXJzaW9uZXMgZW4gZ3J1cG9zIGRlIGxhcyB2YXJpYWJsZXMgY2F0ZWfDs3JpY2FzOiAgKipTZXhvKiosICoqVGlwb19kb2xvcl9wZWNobyoqLCAqKkVDR19yZXBvc28qKiwgKipBbmdpbmFfRWplcmNpY2lvKiosICoqUGVuZGlfU2VnbWVfU1RfRWplcmNpY2lvKiogeSAqKkNsYXNlX3NhbGlkYSoqLCBzZSBwdWVkZSBhcHJlY2lhciBxdWUgZW4gbGEgY29tcGFyYXRpdmEgZW50cmUgZGlzdGludGFzIGNhdGVnb3LDrWFzLCBlbCAqKlNleG8qKiBubyBtdWVzdHJhIHRhbnRhIHJlbGV2YW5jaWEgY29tbyBwYXJhIGVsZXZhciBkZSBtYW5lcmEgdGFuIHNpZ25pZmljYXRpdmEgbGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSBhIHVuIHBhY2llbnRlIHNlIGxlIGRpYWdub3N0aXF1ZSBpbnN1ZmljaWVuY2lhIGNhcmTDrWFjYSwgYSBkaWZlcmVuY2lhIGRlIGxvIHF1ZSBvY3VycmUgY29uIGxhIGNhdGVnb3LDrWEgKipQZW5kaV9TZWdtZV9TVF9FamVyY2ljaW8qKiwgcXVlIHNlIG11ZXN0cmEgZGUgbWFuZXJhIGRpZmVyZW50ZSBhIGxvIG1lbmNpb25hZG8gYW50ZXJpb3JtZW50ZS4gRXMgZGVjaXIsIHF1ZSB1biBwYWNpZW50ZSBxdWUgbXVlc3RyYSB1bmEgcGVuZGllbnRlIGFuw7NtYWxhIGVuIGVsIG1vbWVudG8gZW4gcXVlIHNlIGxlIHJlYWxpemEgc3UgZXZhbHVhY2nDs24gY2FyZMOtYWNhLCBlc3RlIHJlc3VsdGFkbyBwdWVkZSByZXN1bHRhciBtw6FzIHNpZ25pZmljYXRpdm8gZW4gZWwgZGlhZ27Ds3N0aWNvIGRlIGluc3VmaWNpZW5jaWEgY2FyZMOtYWNhLiBQb3Igb3RybyBsYWRvLCBsYSBjYXRlZ29yw61hICoqQW5naW5hX0VqZXJjaWNpbyoqIHRhbWJpw6luIHB1ZWRlIGRhciB1bmEgY29ycmVsYWNpw7NuIHNpZ25pZmljYXRpdmEgZW50cmUgbGEgaW5zdWZpY2llbmNpYSBjYXJkw61hY2EgeSBsb3MgcGFkZWNpbWllbnRvcyByZXN1bHRhbnRlcyBhbCByZWFsaXphciBlamVyY2ljaW8uDQoNCkVuIGJhc2UgYSBsYSBwZXN0YcOxYSAqKkRpYWdyYW1hIGRlIEVzdHJlbGxhcyoqLCBzZSBwdWVkZSBpbnRlcnByZXRhciBxdWUgaGF5IHVuYSBncmFuIHZhcmllZGFkIGJhc3RhbnRlIG5vdGFibGUgZW50cmUgbG9zIHBhY2llbnRlcyB5LCBlbiB0w6lybWlub3MgZGUgZGF0b3MsIGhheSBjaWVydGFzIHJlbGFjaW9uZXMgcGVybyBubyBzb24gbG8gc3VmaWNpZW50ZW1lbnRlIGFsdGFzIGNvbW8gcGFyYSBzZXBhcmFyIGVuIGdydXBvcywgZW4gZ2VuZXJhbCBwcmVzZW50YW4gdW5hIGFsdGEgdmFyaWFibGlsaWRhZA0KDQpBZGVtw6FzIGNvbXBsZW1lbnRhcmlhbWVudGUgKipEaWFncmFtYXMgZGUgRXN0cmVsbGFzKiosIGxhIHBlc3Rhw7FhICoqQ2FyYXMgZGUgQ2hlcm5vZmYqKiByZXZlbGEgbGEgZ3JhbiBkaXZlcnNpZGFkIGVudHJlIGxvcyBwYWNpZW50ZXMuIENvbiBiYXN0YW50ZSBjbGFyaWRhZCwgbGFzIENhcmFzIGRlIENoZXJub2ZmLCBkZXNkZSBlbCBuw7ptZXJvIDEgaGFzdGEgZWwgMjMsIG11ZXN0cmFuIHVuYSBncmFuIHZhcmlhYmlsaWRhZCwgbG8gcXVlIGhhY2UgaW1wb3NpYmxlIHNlcGFyYXJsb3MgZW4gZ3J1cG9zIHNpbWlsYXJlcy4gRXN0ZSBoYWxsYXpnbyBjb2luY2lkZSBjb24gbG8gb2JzZXJ2YWRvIGVuIGVsIERpYWdyYW1hIGRlIEVzdHJlbGxhcy4NCg0KIyMjIERpYWdyYW1hIENvbmp1bnRvIGRlIERpc3BlcnNpw7NuLCBEaXN0cmlidWNpw7NuIHkgQ29ycmVsYWNpb25lcyBbU0FdDQpgYGB7ciBEaWFncmFtYV9Db25qdW50b19ERENfU0EsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KZ2dwYWlycyhoZWFydF9kaXNlYXNlc19EYXRhc2V0WywtYygyLDMsNyw5LDExLDEyKV0pDQpgYGANCg0KIyMjIERpYWdyYW1hIENvbmp1bnRvIGRlIERpc3BlcnNpw7NuLCBEaXN0cmlidWNpw7NuIHkgQ29ycmVsYWNpb25lcyBbQ0E6U0VYXQ0KYGBge3IgRGlhZ3JhbWFfQ29uanVudG9fRERDX0NBX1NFWCwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpnZ3BhaXJzKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQsIGNvbHVtbnMgPSBjKDEsNCw1LDYsOCwxMCksIGFlcyhjb2xvciA9IFNleG8sIGFscGhhID0gMC41KSwgdXBwZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSB3cmFwKCJjb3IiLCBzaXplID0gMi41KSkpDQpgYGANCg0KIyMjIERpYWdyYW1hIENvbmp1bnRvIGRlIERpc3BlcnNpw7NuLCBEaXN0cmlidWNpw7NuIHkgQ29ycmVsYWNpb25lcyBbQ0E6VElQXQ0KYGBge3IgRGlhZ3JhbWFfQ29uanVudG9fRERDX0NBX1RJUCwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpnZ3BhaXJzKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQsIGNvbHVtbnMgPSBjKDEsNCw1LDYsOCwxMCksIGFlcyhjb2xvciA9IFRpcG9fZG9sb3JfcGVjaG8sIGFscGhhID0gMC41KSwgdXBwZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSB3cmFwKCJjb3IiLCBzaXplID0gMi41KSkpDQpgYGANCg0KIyMjIERpYWdyYW1hIENvbmp1bnRvIGRlIERpc3BlcnNpw7NuLCBEaXN0cmlidWNpw7NuIHkgQ29ycmVsYWNpb25lcyBbQ0E6RUNHXQ0KYGBge3IgRGlhZ3JhbWFfQ29uanVudG9fRERDX0NBX0VDRywgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpnZ3BhaXJzKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQsIGNvbHVtbnMgPSBjKDEsNCw1LDYsOCwxMCksIGFlcyhjb2xvciA9IEVDR19yZXBvc28sIGFscGhhID0gMC41KSwgdXBwZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSB3cmFwKCJjb3IiLCBzaXplID0gMi41KSkpDQpgYGANCg0KIyMjIERpYWdyYW1hIENvbmp1bnRvIGRlIERpc3BlcnNpw7NuLCBEaXN0cmlidWNpw7NuIHkgQ29ycmVsYWNpb25lcyBbQ0E6QU5FXQ0KYGBge3IgRGlhZ3JhbWFfQ29uanVudG9fRERDX0NBX0FORSwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpnZ3BhaXJzKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQsIGNvbHVtbnMgPSBjKDEsNCw1LDYsOCwxMCksIGFlcyhjb2xvciA9IEFuZ2luYV9FamVyY2ljaW8sIGFscGhhID0gMC41KSwgdXBwZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSB3cmFwKCJjb3IiLCBzaXplID0gMi41KSkpDQpgYGANCg0KIyMjIERpYWdyYW1hIENvbmp1bnRvIGRlIERpc3BlcnNpw7NuLCBEaXN0cmlidWNpw7NuIHkgQ29ycmVsYWNpb25lcyBbQ0E6UFNUXQ0KYGBge3IgRGlhZ3JhbWFfQ29uanVudG9fRERDX0NBX1BTVCwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpnZ3BhaXJzKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQsIGNvbHVtbnMgPSBjKDEsNCw1LDYsOCwxMCksIGFlcyhjb2xvciA9IFBlbmRpX1NlZ21lX1NUX0VqZXJjaWNpbywgYWxwaGEgPSAwLjUpLCB1cHBlciA9IGxpc3QoY29udGludW91cyA9IHdyYXAoImNvciIsIHNpemUgPSAyLjUpKSkNCmBgYA0KDQojIyMgRGlhZ3JhbWEgQ29uanVudG8gZGUgRGlzcGVyc2nDs24sIERpc3RyaWJ1Y2nDs24geSBDb3JyZWxhY2lvbmVzIFtDQTpDU10NCmBgYHtyIERpYWdyYW1hX0Nvbmp1bnRvX0REQ19DQV9DUywgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpnZ3BhaXJzKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQsIGNvbHVtbnMgPSBjKDEsNCw1LDYsOCwxMCksIGFlcyhjb2xvciA9IENsYXNlX3NhbGlkYSwgYWxwaGEgPSAwLjUpLCB1cHBlciA9IGxpc3QoY29udGludW91cyA9IHdyYXAoImNvciIsIHNpemUgPSAyLjUpKSkNCmBgYA0KDQojIyMgRGlhZ3JhbWEgZGUgRXN0cmVsbGFzDQpgYGB7ciBEaWFncmFtYV9kZV9Fc3RyZWxsYXMsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0Kc2V0LnNlZWQoNzgwNzI4KQ0KaGVhcnRfZGlzZWFzZXNfRGF0YXNldF9NdWVzdHJlYWRvID0gaGVhcnRfZGlzZWFzZXNfRGF0YXNldFtzYW1wbGUoMTpucm93KGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQpLDIzKSwtYygyLDMsNyw5LDExLDEyKV0NCnN0YXJzKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRfTXVlc3RyZWFkbywgbGVuID0gMSwgY2V4ID0gMC40LCBrZXkubG9jID0gYygxMCwgMiksIGRyYXcuc2VnbWVudHMgPSBUUlVFKQ0KYGBgDQoNCiMjIyBDYXJhcyBkZSBDaGVybm9mZg0KYGBge3IgQ2FyYXNfZGVfQ2hlcm5vZmYsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0Kc2V0LnNlZWQoNzgwNzI4KQ0KaGVhcnRfZGlzZWFzZXNfRGF0YXNldF9NdWVzdHJlYWRvID0gaGVhcnRfZGlzZWFzZXNfRGF0YXNldFtzYW1wbGUoMTpucm93KGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQpLDIzKSwtYygyLDMsNyw5LDExLDEyKV0NCmZhY2VzKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRfTXVlc3RyZWFkbykNCmBgYA0KDQojIyAqKjEuNSBOb3JtYWxpZGFkIE11bHRpdmFyaWFkYSAgKiogey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KUGFyYSBpbnZlc3RpZ2FyIG8gZGV0ZXJtaW5hciBlbCB0aXBvIGRlIGRpc3RyaWJ1Y2nDs24gbXVsdGl2YXJpYWRhIGRlIHVuIGNvbmp1bnRvIGRlIGRhdG9zLCBzZSBwdWVkZW4gdXRpbGl6YXIgcHJvY2VkaW1pZW50b3MgZGVzY3JpcHRpdm9zLCBjb21vIGdyw6FmaWNvcywgbyBwcm9jZWRpbWllbnRvcyBpbmZlcmVuY2lhbGVzLCBjb21vIHBydWViYXMgZXN0YWTDrXN0aWNhcy4gRW4gZXN0ZSBjb250ZXh0bywgc2UgbG9ncmEgdW5hIGdlbmVyYWxpemFjacOzbiBkZSByZXN1bHRhZG9zIGFsIGVtcGxlYXIgZXN0b3Mgw7psdGltb3MsIGF1bnF1ZSBsb3MgcHJpbWVyb3MgcmVzcGFsZGFuIGxhcyBpbnRlcnByZXRhY2lvbmVzLg0KDQpFbiBlc3RhIHNlY2Npw7NuIHNlIGNvbnNpZGVyYSBlbCB1c28gZGUgcHJvY2VkaW1pZW50b3MgaW5mZXJlbmNpYWxlcyBwYXJhIGRldGVybWluYXIgc2kgZWwgY29uanVudG8gZGUgZGF0b3MgY29uIHJlc3BlY3RvIGEgc3VzIHZhcmlhYmxlcyBudW3DqXJpY2FzLCBzaWd1ZSB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwgbXVsdGl2YXJpYWRhIChETk0pLiBTZSBhcGxpY2Fyw6FuIHBydWViYXMgZGUgbm9ybWFsaWRhZCBtdWx0aXZhcmlhZGEgKFBOTSkgcXVlIGluY2x1eWVuIGxhcyBwcnVlYmFzIGRlIE1hcmRpYSwgSGVuemUtWmlya2xlciwgRG9vcm5pay1IYW5zZW4geSBSb3lzdG9uLiBFc3RhcyBwcnVlYmFzIGRlIG5vcm1hbGlkYWQgc2UgbGxldmFyw6FuIGEgY2FibyBjb24gdW4gbml2ZWwgZGUgc2lnbmlmaWNhbmNpYSAkXGFscGhhID0gMC4wNSQgeSBiYWpvIGxhcyBzaWd1aWVudGVzIGhpcMOzdGVzaXM6JCRIXzA6IFx0ZXh0IHtFbCBjb25qdW50byBkZSBkYXRvcyBzaWd1ZSB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwgbXVsdGl2YXJpYWRhLn0kJCAkJEhfMTogXHRleHQge0VsIGNvbmp1bnRvIGRlIGRhdG9zIE5PIHNpZ3VlIHVuYSBkaXN0cmlidWNpw7NuIG5vcm1hbCBtdWx0aXZhcmlhZGEufSQkIA0KDQpMYSBwcnVlYmEgZGUgTWFyZGlhIHNlIGZ1bmRhbWVudGEgZW4gZXh0ZW5zaW9uZXMgZGUgYXNpbWV0csOtYSB5IGN1cnRvc2lzLCBlbCBjdWFkcmFkbyBkZSBsYSBkaXN0YW5jaWEgZGUgTWFoYWxhbm9iaXMsIGxhIGNhbnRpZGFkIGRlIHZhcmlhYmxlcyAkcCQgZW4gYW7DoWxpc2lzIHkgbGEgY2FudGlkYWQgZGUgcmVnaXN0cm9zICRuJC4gRW4gZXN0ZSBjb250ZXh0bywgbGEgcHJ1ZWJhIGVzdGFkw61zdGljYSBwYXJhIGxhIGFzaW1ldHLDrWEgc2lndWUgdW5hIGRpc3RyaWJ1Y2nDs24gJFxjaGleMiQsIG1pZW50cmFzIHF1ZSBsYSBwcnVlYmEgZXN0YWTDrXN0aWNhIHBhcmEgbGEgY3VydG9zaXMgc2UgYXByb3hpbWEgYSB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwuDQoNCkxhIHBydWViYSBkZSBIZW56ZS1aaXJrbGVyIHNlIGZ1bmRhbWVudGEgZW4gbGEgZGlzdGFuY2lhIGZ1bmNpb25hbC4gU2kgZWwgY29uanVudG8gZGUgZGF0b3Mgc2lndWUgdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIG11bHRpdmFyaWFkYSwgZWwgZXN0YWTDrXN0aWNvIGRlIGxhIHBydWViYSBzZSBkaXN0cmlidXllIGFwcm94aW1hZGFtZW50ZSBjb21vIHVuYSBsb2ctbm9ybWFsLCBjb24gcGFyw6FtZXRyb3MgZGUgbWVkaWENCiRcbXUkIHkgdmFyaWFuemEgJFxzaWdtYV4yJC4NCg0KTGEgcHJ1ZWJhIGRlIERvb3JuaWstSGFuc2VuIHNlIGJhc2EgZW4gbGEgYXNpbWV0csOtYSB5IGxhIGN1cnRvc2lzIGRlIHVuIGNvbmp1bnRvIGRlIGRhdG9zIG11bHRpdmFyaWFkb3MsIGxvcyBjdWFsZXMgc2UgdHJhbnNmb3JtYW4gcGFyYSBhc2VndXJhciBsYSBpbmRlcGVuZGVuY2lhLiBFc3RhIHBydWViYSBzZSBjb25zaWRlcmEgbcOhcyBwb3RlbnRlIHF1ZSBsYSBwcnVlYmEgZGUgU2hhcGlyby1XaWxrIGVuIGNhc29zIG11bHRpdmFyaWFkb3MuIEVsIGVzdGFkw61zdGljbyBkZSBwcnVlYmEgZXN0w6EgZGVmaW5pZG8gY29tbyBsYSBzdW1hIGRlIGxhcyB0cmFuc2Zvcm1hY2lvbmVzIGFsIGN1YWRyYWRvIGRlIGxhIGFzaW1ldHLDrWEgeSBsYSBjdXJ0b3NpcywgeSBzaWd1ZSBhcHJveGltYWRhbWVudGUgdW5hIGRpc3RyaWJ1Y2nDs24gJFxjaGleMiQuDQoNCkxhIHBydWViYSBkZSBSb3lzdG9uIHV0aWxpemEgbGFzIHBydWViYXMgZGUgU2hhcGlyby1XaWxrIG8gU2hhcGlyby1GcmFuY2lhIHBhcmEgZXZhbHVhciBsYSBub3JtYWxpZGFkIG11bHRpdmFyaWFkYS4gU2kgbGEgY3VydG9zaXMgZXMgbWF5b3IgcXVlIDMsIGxhIHBydWViYSBkZSBSb3lzdG9uIGVtcGxlYSBTaGFwaXJvLUZyYW5jaWEgcGFyYSBkaXN0cmlidWNpb25lcyBsZXB0b2PDunJ0aWNhcy4gUG9yIG90cm8gbGFkbywgcGFyYSBkaXN0cmlidWNpb25lcyBwbGF0aWPDunJ0aWNhcyB1dGlsaXphIFNoYXBpcm8tV2lsay4gRW4gZXN0YSBwcnVlYmEsIGxvcyBwYXLDoW1ldHJvcyBzb24gb2J0ZW5pZG9zIG1lZGlhbnRlIGFwcm94aW1hY2lvbmVzIHBvbGlub21pYWxlcy4NCg0KKipQbGFudGVhbWllbnRvIGRlbCBQcm9ibGVtYSoqDQoNCkNvbiBiYXNlIGVuIGVsIGNvbmp1bnRvIGRlIGRhdG9zIGRlc2NyaXRvIGVuIGxhIGZhc2UgMSBzZWNjacOzbiAxLjIsIHNlIHJlYWxpemFyw6EgdW5hIHBydWViYSBlc3RhZMOtc3RpY2EgZGUgbm9ybWFsaWRhZCBtdWx0aXZhcmlhZGEgY29uIHVuIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgJFxhbHBoYT0wLjA1JCwgcGFyYSBkZXRlcm1pbmFyIHNpIGxvcyBkYXRvcyBtw6l0cmljb3MgcHJvdmllbmVuIGRlIHVuYSBwb2JsYWNpw7NuIG5vcm1hbCBtdWx0aXZhcmlhZGEuIExhcyB2YXJpYWJsZXMgbnVtw6lyaWNhcyBkZWwgY29uanVudG8gZGUgZGF0b3MgKGVuIGVzY2FsYSBkZSBtZWRpY2nDs24gZGUgcmF6w7NuKSBzb246ICoqRWRhZCoqLCAqKlBBX3JlcG9zbyoqLCAqKkNvbGVzdGVyb2wqKiwgKipBWl9BeXVuYXMqKiwgKipGcmVjQ19NYXgqKiB5ICoqT2xkcGVhayoqLg0KDQpTZSB1dGlsaXphcsOhIHVuYSBkZSBsYXMgcHJ1ZWJhcyBkZSBub3JtYWxpZGFkIG11bHRpdmFyaWFkYSBtZW5jaW9uYWRhcyBhbnRlcmlvcm1lbnRlLCBjb21vIGxhIHBydWViYSBkZSBNYXJkaWEsIEhlbnplLVppcmtsZXIsIERvb3JuaWstSGFuc2VuIG8gUm95c3RvbiwgZGVwZW5kaWVuZG8gZGUgbGEgZGlzdHJpYnVjacOzbiBkZSBsYXMgdmFyaWFibGVzIHkgbGEgY3VydG9zaXMgb2JzZXJ2YWRhLiBFbCBvYmpldGl2byBlcyBldmFsdWFyIHNpIGVzdGFzIHZhcmlhYmxlcyBzaWd1ZW4gdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGNvbmp1bnRhIGVuIGVsIGVzcGFjaW8gbXVsdGl2YXJpYWRvLg0KDQpFbCBwcm9jZWRpbWllbnRvIGltcGxpY2Fyw6EgY2FsY3VsYXIgZWwgZXN0YWTDrXN0aWNvIGRlIHBydWViYSBlc3BlY8OtZmljbyAocG9yIGVqZW1wbG8sIGJhc2FkbyBlbiBhc2ltZXRyw61hIHkgY3VydG9zaXMpIHkgY29tcGFyYXJsbyBjb24gc3UgZGlzdHJpYnVjacOzbiB0ZcOzcmljYSBiYWpvIGxhIGhpcMOzdGVzaXMgbnVsYSBkZSBub3JtYWxpZGFkIG11bHRpdmFyaWFkYS4gU2UgZXN0YWJsZWNlcsOhIHVuIGNyaXRlcmlvIGRlIHJlY2hhem8gZGUgbGEgaGlww7N0ZXNpcyBudWxhIHNpIGVsIHZhbG9yICRwLXZhbHVlJCBhc29jaWFkbyBhbCBlc3RhZMOtc3RpY28gZGUgcHJ1ZWJhIGVzIG1lbm9yIHF1ZSAkXGFscGhhJC4NCg0KVW5hIGNvbmNsdXNpw7NuIHBvc2l0aXZhIChubyByZWNoYXpvIGRlIGxhIGhpcMOzdGVzaXMgbnVsYSkgaW5kaWNhcsOtYSBldmlkZW5jaWEgZGUgcXVlIGxhcyB2YXJpYWJsZXMgYW5hbGl6YWRhcyBzaWd1ZW4gdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIG11bHRpdmFyaWFkYS4gUG9yIGVsIGNvbnRyYXJpbywgdW4gcmVjaGF6byBkZSBsYSBoaXDDs3Rlc2lzIG51bGEgc3VnZXJpcsOtYSBxdWUgYWwgbWVub3MgdW5hIGRlIGxhcyB2YXJpYWJsZXMgbm8gc2lndWUgdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsLCBsbyBxdWUgcG9kcsOtYSB0ZW5lciBpbXBsaWNhY2lvbmVzIGVuIGVsIGFuw6FsaXNpcyBwb3N0ZXJpb3IgZGUgbG9zIGRhdG9zLg0KDQoqKkRlc2Fycm9sbG8gZGVsIEFuw6FsaXNpcyoqDQoNCkxhIGV4cGxvcmFjacOzbiBhIHRyYXbDqXMgZGUgbGFzIGRpZmVyZW50ZXMgcHJ1ZWJhcyBkZSBub3JtYWxpZGFkIG11bHRpdmFyaWFkYSBpbmRpY2EgcXVlIGVsIGNvbmp1bnRvIGRlIGRhdG9zLCBjb25zaWRlcmFuZG8gc3VzIHZhcmlhYmxlcyBudW3DqXJpY2FzLCBubyBzaWd1ZSB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwgbXVsdGl2YXJpYWRhLiBBcXXDrSBlc3TDoW4gbG9zIGhhbGxhemdvcyBjbGF2ZSBkZSBjYWRhIHBydWViYToNCg0KMS4gKipQcnVlYmEgZGUgTWFyZGlhKio6IExvcyB2YWxvcmVzICRwJCBhc29jaWFkb3MgY29uIGxhcyBwcnVlYmFzIGRlIGFzaW1ldHLDrWEgKFNrZXduZXNzKSB5IGN1cnRvc2lzIChLdXJ0b3Npcykgc29uIG1lbm9yZXMgcXVlIGVsIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgJFxhbHBoYSA9IDAuMDUkLiBFc3RvIHN1Z2llcmUgcXVlIG5vIGhheSBzdWZpY2llbnRlIGV2aWRlbmNpYSBwYXJhIHNvc3RlbmVyIGxhIGhpcMOzdGVzaXMgZGUgbm9ybWFsaWRhZCBtdWx0aXZhcmlhZGEgcGFyYSBsYXMgdmFyaWFibGVzIGRlbCBjb25qdW50byBkZSBkYXRvcy4NCg0KMi4gKipQcnVlYmEgZGUgSGVuemUtWmlya2xlcioqOiBFbCBlc3RhZMOtc3RpY28gZGUgcHJ1ZWJhIG5vIHNlIGRpc3RyaWJ1eWUgYXByb3hpbWFkYW1lbnRlIGNvbW8gbG9nLW5vcm1hbCwgeWEgcXVlIGVsIHZhbG9yICRwJCBlcyBtZW5vciBxdWUgJFxhbHBoYSA9IDAuMDUkLiBQb3IgbG8gdGFudG8sIG5vIGhheSBhcG95byBwYXJhIHF1ZSBlbCBjb25qdW50byBkZSBkYXRvcyBzaWdhIHVuYSBkaXN0cmlidWNpw7NuIG5vcm1hbCBtdWx0aXZhcmlhZGEgc2Vnw7puIGVzdGEgcHJ1ZWJhLg0KDQozLiAqKlBydWViYSBkZSBEb29ybmlrLUhhbnNlbioqOiBFbCBlc3RhZMOtc3RpY28gZGUgcHJ1ZWJhIG5vIHNpZ3VlIHVuYSBkaXN0cmlidWNpw7NuICRcY2hpXjIkIGFwcm94aW1hZGFtZW50ZSwgZGFkbyBxdWUgZWwgdmFsb3IgJHAkIGVzIG1lbm9yIHF1ZSAkXGFscGhhID0gMC4wNSQuIEVzdG8gc3VnaWVyZSBxdWUgbGFzIGV2aWRlbmNpYXMgbm8gcmVzcGFsZGFuIGxhIG5vcm1hbGlkYWQgbXVsdGl2YXJpYWRhIGRlbCBjb25qdW50byBkZSBkYXRvcy4NCg0KNC4gKipQcnVlYmEgZGUgUm95c3RvbioqOiBFbCBjb25qdW50byBkZSBkYXRvcywgcmVkdWNpZG8gYSBzdXMgdmFyaWFibGVzIG51bcOpcmljYXMsIG5vIHNpZ3VlIHVuYSBkaXN0cmlidWNpw7NuIG5vcm1hbCBtdWx0aXZhcmlhZGEgc2Vnw7puIGVzdGEgcHJ1ZWJhLCB5YSBxdWUgZWwgdmFsb3IgJHAkIGVzIG1lbm9yIHF1ZSAkXGFscGhhID0gMC4wNSQuDQoNCkVuIHJlc3VtZW4sIGNvbiB1biBuaXZlbCBkZSBzaWduaWZpY2FuY2lhIGRlICQwLjA1JCwgbGFzIHBydWViYXMgaW5kaWNhbiBjb25zaXN0ZW50ZW1lbnRlIHF1ZSBlbCBjb25qdW50byBkZSBkYXRvcyBhbmFsaXphZG8sIGNvbiByZXNwZWN0byBhIHN1cyB2YXJpYWJsZXMgbnVtw6lyaWNhcywgbm8gc2lndWUgdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIG11bHRpdmFyaWFkYS4gRXN0ZSBoYWxsYXpnbyBlcyBpbXBvcnRhbnRlIHBhcmEgbGEgaW50ZXJwcmV0YWNpw7NuIHkgZWwgYW7DoWxpc2lzIHN1YnNpZ3VpZW50ZSBkZSBsb3MgZGF0b3MuDQoNCiMjIyBQTk0gTWFyZGlhDQpgYGB7ciBQTk1fTWFyZGlhLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCm12bihoZWFydF9kaXNlYXNlc19EYXRhc2V0WywtYygyLDMsNyw5LDExLDEyKV0sIG12blRlc3Q9Im1hcmRpYSIpDQpgYGANCg0KIyMjIFBOTSBIZW56ZS1aaXJrbGVyDQpgYGB7ciBQTk1fSGVuemVfWmlya2xlciwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQptdm4oaGVhcnRfZGlzZWFzZXNfRGF0YXNldFssLWMoMiwzLDcsOSwxMSwxMildLCBtdm5UZXN0PSJoeiIpDQpgYGANCg0KIyMjIFBOTSBEb29ybmlrLUhhbnNlbg0KYGBge3IgUE5NX0Rvb3JuaWtfSGFuc2VuLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCm12bihoZWFydF9kaXNlYXNlc19EYXRhc2V0WywtYygyLDMsNyw5LDExLDEyKV0sIG12blRlc3Q9ImRoIikNCmBgYA0KDQojIyMgUE5NIFJveXN0b24NCmBgYHtyIFBOTV9Sb3lzdG9uLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCm12bihoZWFydF9kaXNlYXNlc19EYXRhc2V0WywtYygyLDMsNyw5LDExLDEyKV0sIG12blRlc3Q9InJveXN0b24iKQ0KYGBgDQojICoqRmFzZSAyIFtDb21wb25lbnRlcyBQcmluY2lwYWxlc10qKg0KDQojIyAqKjIuMS4gT2JqZXRpdm9zKioNCg0KRW4gdMOpcm1pbm9zIGdlbmVyYWxlcywgZXN0YSBzZWd1bmRhIGV0YXBhIGRlbCBlc3R1ZGlvIHByZXNlbnRhcsOhIGPDoWxjdWxvcywgdmlzdWFsaXphY2lvbmVzIGUgaW50ZXJwcmV0YWNpb25lcyBiYXNhZGFzIGVuIGVsIGNvbmp1bnRvIGRlIGRhdG9zIHRyYXRhZG8gZW4gbGEgKipmYXNlIDEuKiogRXN0YSB2ZXosIGVsIGVuZm9xdWUgc2UgY2VudHJhcsOhIGVuIGVsIGFuw6FsaXNpcyBkZSBjb21wb25lbnRlcyBwcmluY2lwYWxlcyBkZSBsYXMgdmFyaWFibGVzIGN1YW50aXRhdGl2YXMsIGxvIHF1ZSBpbmNsdWlyw6EgbGEgc2VsZWNjacOzbiwgY2FsaWRhZCBkZSByZXByZXNlbnRhY2nDs24sIGNvbnRyaWJ1Y2lvbmVzIGUgaW50ZXJwcmV0YWNpw7NuLg0KDQojIyAqKjIuMi4gU2VsZWNjacOzbiBkZSBDb21wb25lbnRlcyoqIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNCkVsIEFuw6FsaXNpcyBkZSBDb21wb25lbnRlcyBQcmluY2lwYWxlcyAoQUNQKSByZWVzdHJ1Y3R1cmEgdW4gY29uanVudG8gZGUgZGF0b3MgbXVsdGl2YXJpYWRvIGFsIHJlZHVjaXIgZWwgbsO6bWVybyBkZSB2YXJpYWJsZXMsIHNpbiBuZWNlc2lkYWQgZGUgYXN1bWlyIG5pbmd1bmEgZGlzdHJpYnVjacOzbiBkZSBwcm9iYWJpbGlkYWQgcGFyYSBlbGxhcy4gRXN0YSByZWR1Y2Npw7NuIHNlIGxvZ3JhIG1lZGlhbnRlIGNvbWJpbmFjaW9uZXMgbGluZWFsZXMgZGUgbGFzIHZhcmlhYmxlcyBvcmlnaW5hbGVzLCBxdWUgY2FwdHVyYW4gbGEgbWF5b3IgdmFyaWFiaWxpZGFkIHBvc2libGUgcHJlc2VudGUgZW4gZWwgY29uanVudG8gZGUgZGF0b3MuIEFzw60sIGVsIEFDUCBjcmVhIG51ZXZhcyB2YXJpYWJsZXMsIGNvbm9jaWRhcyBjb21vIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzLCBxdWUgc29uIGVzdGFkw61zdGljYW1lbnRlIGluZGVwZW5kaWVudGVzIChiYXNhZGFzIGVuIGVsIHN1cHVlc3RvIGRlIG5vcm1hbGlkYWQpIHkgbm8gZXN0w6FuIGNvcnJlbGFjaW9uYWRhcy4NCg0KRWwgQUNQIHNlIGRlc2Fycm9sbGEgYSB0cmF2w6lzIGRlIGxhcyBzaWd1aWVudGVzIGZhc2VzOiBnZW5lcmFjacOzbiBkZSBudWV2YXMgdmFyaWFibGVzLCByZWR1Y2Npw7NuIGRpbWVuc2lvbmFsIGRlbCBlc3BhY2lvIGRlIGRhdG9zLCBlbGltaW5hY2nDs24gZGUgdmFyaWFibGVzIGRlIHBvY28gYXBvcnRlIGUgaW50ZXJwcmV0YWNpw7NuIGRlIGxvcyBjb21wb25lbnRlcyByZXN1bHRhbnRlcyBlbiBlbCBjb250ZXh0byBkZWwgcHJvYmxlbWEgZGVsIGN1YWwgc2Ugb2J0dXZpZXJvbiBsb3MgZGF0b3MuDQoNCioqUGxhbnRlYW1pZW50byBkZWwgUHJvYmxlbWEqKg0KDQpDb24gYmFzZSBlbiBsYXMgdmFyaWFibGVzIGN1YW50aXRhdGl2YXMgZGVsIGNvbmp1bnRvIGRlIGRhdG9zIGRlc2NyaXRvIGVuIGxhIGZhc2UgYW50ZXJpb3IsIHByaW1lcm8gc2UgZGViZSBlc3RhYmxlY2VyIGVsIHBvcmNlbnRhamUgZGUgdmFyaWFuemEgZXhwbGljYWRvIHBvciBjYWRhIGRpbWVuc2nDs24gdW5hIHZleiBwcm9jZXNhZG8gZWwgQUNQLiBQb3N0ZXJpb3JtZW50ZSwgdXRpbGl6YW5kbyBlbCBhdXRvdmFsb3IgbWVkaW8gbyB1biBkaWFncmFtYSBkZSBzZWRpbWVudGFjacOzbiwgc2UgZGVjaWRpcsOhIGN1w6FudG9zIGNvbXBvbmVudGVzIHJldGVuZXIuDQoNCioqRGVzYXJyb2xsbyBkZWwgQW7DoWxpc2lzKioNCg0KQ29uIGJhc2UgYSBsYSBuYXZlZ2FjaW9uIGVuIHBlc3Rhw7FhcyBzZSBwdWVkZSBhcHJlY2lhciBxdWUgZWwgY29uanVudG8gZGUgZGF0b3MsIHJlbGFjaW9uYWRvIGNvbiBzdXMgdmFyaWFibGVzIG51bWVyaWNhcyBwdWVkZSBzZXIgcmVwcmVzZW50YWRvIHBvciB1bm9zIGNvbmp1bnRvcyBtYXMgcGVxdWXDsW9zIHF1ZSBsbGVnYW4gYSByZXRlbmVyIGVsICQ3OSwyMSQgJFwlJCBkZSBsYSB2YXJpYWJpbGlkYWQgZGVsIGNvbmp1bnRvLCBlc3RhcyBlbiBwYXJ0aWN1bGFyOg0KDQpMYSAqKk1hdHJpeiBBQ1AqKiBtdWVzdHJhIGVuIHRvdGFsIHNlaXMgZGltZW5jaW9uZXMgZW4gZG9uZGUgbGEgcHJpbWVyYSByZXRpZW5lIHVuICQyMywzMiQgJFwlJCwgbGEgc2lndWllbnRlIHVuICQxOSw3MiQgJFwlJCB5IGxhcyBkZW1hcyBkZSBtYW5lcmEgcmVzcGVjdGl2YSAkMTUsMjYkICRcJSQgeSAkMTQsOTEkICRcJSQgZGFuZG9ub3MgdW4gdG90YWwgZGUgJDc5LDIxJCAkXCUkIGNvbW8gaGFiaWFtb3MgbWVuY2lvbmFkbyBhbnRlcywgRW4gZXN0ZSBzZW50aWRvIGxhIHJlcHJlc2VudGF0aXZpZGFkIGRlIGxhIGNvbWJpbmFjaW9uIGxpbmVhbCBwb3IgZGltZW5jaW9uZXMgaW5kaXZpZHVhbGVzIGVzIHJlbGF0aXZhbWVudGUgYmFqYSBwZXJvIHNpIHRvbWFtb3MgZGUgbGEgZGltZW5jaW9uIDEgYSA0IHNvbiBzaWduaWZpY2F0aXZhbWVudGUgYWx0YXMgYSBjb21wYXJhY2lvbiBkZWwgcmVzdG8uIENvbW8gZXN0YSBtYXRyaXogbm8gaWRlbnRpZmljYSBsYSByZWxhY2lvbiBjb24gbGFzIHZhcmlhYmxlcyBvcmlnaW5hbGVzIHNlIHNlZ3VpcmEgaW5kYWdhbmRvIHBhcmEgaW5kZW50aWZpY2FyIGxhcyB2YXJpYWJsZXMgcXVlIG1hcyBjb250cmlidXllcyBhIGxhcyA0IHByaW1lcmFzIGRpbWVuc2lvbmVzIHF1ZSB0ZW5nYW4gZWwgdmFsb3IgcHJvcGlvIG1hcyBhbHRvLg0KDQpMYSAqKk1hdHJpeiBkZSBDb3JyZWxhY2lvbmVzKiogcGVybWl0ZSBjb250aW51YXIgY29uIGVsIHByb2Nlc28gZGUgbGFzIGRlc2NyaXBjaW9uZXMgZGUgbGFzIGNvbWJpbmFjaW9uZXMgbGluZWFsZXMgcXVlIGNvbmZvcm1hbiBsYXMgZGltZW5zaW9uZXMgZGUgbWF5b3IgaW50ZXLDqXM6IERpbWVuY2lvbiAxIGEgNC4gQXPDrSBtaXNtbyBlc3RhIG1hdHJpeiBjb21vIHNlIGRlc2NyaWJpbyBlbiBzZWNjaW9uZXMgcGFzYWRhcywgYXl1ZGFyYSBhIHZlcmlmaWNhciBxdWUgbGEgaW50ZW5jaWRhZCBkZSBjb3JyZWxhY2lvbmVzIGVzIHJlbGF0aXZhbWVudGUgYWNlcHRhYmxlIHkgcG9zaXRpdmEgZW50cmUgbGFzIHZhcmlhYmxlczogKipQQV9yZXBvc28sIEVkYWQsIEZyZWNDX01heCoqIHkgKipDb2xlc3Rlcm9sKiosIGxvIGN1YWwgbXVlc3RyYSB1bmEgcmVsYWNpb24gY29uIGVsIGZlbm9tZW5vIHF1ZSBzZSBlc3RhIGVzdHVkaWFuZG8sIHBvciBsbyB0YW50bywgc2UgcG9kaXJhIGVzcGVyYXIgcXVlIGVzdGFzIHZhcmlhYmxlcyBwYXJ0aWNpcGVuIGRlIG1hbmVyYSBzaWduaWZpY2F0aXZhIGVuIGxhIGNvbWJpbmFjacOzbiBMaW5lYWwgcXVlIGRlZmluZSBhIGxhIGRpbWVuY2lvbiAxIGEgNC4NCg0KTGEgcGVzdGHDsWEgZGUgKipWYWxvcmVzIHkgVmVjdG9yZXMgUHJvcGlvcyoqIG11ZXN0cmEgZXN0b3MgZWxlbWVudG9zIGNhbGN1bGFkb3MgYSBwYXJ0aXIgZGUgbGEgbWF0cml6IGRlIGNvcnJlbGFjaW9uZXMgZGVsIGNvbmp1bnRvIGRlIGRhdG9zLiBFbiBlc3RlIGNvbnRleHRvLCBzZSBhc2VndXJhIHF1ZSBsYSBzdW1hIGRlIGxvcyB2YWxvcmVzIHByb3Bpb3Mgc2VhIGlndWFsIGEgbGEgZGltZW5zacOzbiBkZSBkaWNoYSBtYXRyaXogeSBhIGxhIHZhcmlhYmlsaWRhZCB0b3RhbCBkZWwgY29uanVudG8sIGxvIHF1ZSBwZXJtaXRlIGNhbGN1bGFyIGbDoWNpbG1lbnRlIGxhcyBwcm9wb3JjaW9uZXMgZGUgcmV0ZW5jacOzbiBkZSB2YXJpYWJpbGlkYWQuIEFkZW3DoXMsIGxhIG1hdHJpeiBkZSB2ZWN0b3JlcyBwcm9waW9zIGRlZmluZSwgcGFyYSBjYWRhIGNvbXBvbmVudGUgeSBlbiByZWxhY2nDs24gY29uIGNhZGEgdmFyaWFibGUgZGVsIGNvbmp1bnRvIGRlIGRhdG9zLCBsb3MgY29lZmljaWVudGVzIGRlIGxhIGNvbWJpbmFjacOzbiBsaW5lYWwgcXVlIGxhIGNvbmZvcm1hbiwgcG9yIGVqZW1wbG8sIGFqdXN0YWRvcyBhIGRvcyBjaWZyYXMgZGVjaW1hbGVzLCBsYSBjb21wb25lbnRlIDEgZXN0YXJpYSByZXByZXNlbnRhZGEgcG9yIGxhIGNvbWJpbmFjaW9uIGxpbmVhbCAoZG9uZGUgJEUkIGVzIEVkYWQsICRQJCBlcyBQQV9yZXBvc28sICRDJCBlcyBDb2xlc3Rlcm9sLCAkQSQgZXMgQVpfQXl1bmFzLCAkRiQgZXMgRnJlY0NfTWF4IHkgJE8kIGVzIE9sZHBlYWssIHkgYWRlbWFzIHNvbiB2YXJpYWJsZXMgZXN0YW5kYXJpemFkYXMpOiBkZSBlc3RhIG1pc21tYSBmb3JtYSBzZSBoYXJhbiBjb24gbG9zIGNvbXBvbmVuZXRlcyAxIGEgNCBxdWVkYW5kbyBkZSBsYSBzaWd1aWVudGUgZm9ybWE6DQokJENvbXBvbmVudGVfMSA9IDAuNTgqRSswLjMzKlAtMCwyOSpDKzAsMzUqQS0wLDUxKkYrMC4zMCpPJCQgDQoNCiQkQ29tcG9uZW50ZV8yID0gMCwxOSpFKzAsNTAqUCswLDY3KkMtMCwyOCpBKzAsMTkqRiswLDM5Kk8kJA0KJCRDb21wb25lbnRlXzMgPSAwLDE3KkUrMCwyMSpQKzAsMDIqQy0wLDYwKkEtMCw0NSpGLTAsNjAqTyQkDQokJENvbXBvbmVudGVfNCA9IDAsMDkqRS0wLDU2KlAtMCwwOCpDLTAsNTQqQSstMC4yNSpGKzAsNTYqTyQkDQpTZSBlc2NvZ2VuIGVzdGFzIDQgcG9ycXVlIGVuIGVsICoqQUNQKiogZm9ybWFuIGVsICQ3OSwyMSQgJFwlJCB5IGp1bnRhcyByZXByZXNlbnRhbiB1bmEgdmVyc2nDs24gbcOhcyBjb21wYWN0YSB5IHJpY2EgZGVsIGNvbmp1bnRvIG9yaWdpbmFsLCB5IGhhc3RhIGVzdGUgcHVudG8gc2UgcHVlZGUgb2JzZXJ2YXIgcXVlIGVsIG51bWVybyBkZSBkaW1lbnNpb25lcyByZXN1bHRhbnRlcyBlcyBlcXVpdmFsZW50ZSBhbCBudW1lcm8gZGUgdmFyaWFibGVzIHRyYXRhZGFzLCBzaW4gY29udGFyIGxhcyB2YXJpYWJsZXMgbnVldmFzIHlhIHF1ZSBlc3RhbiBzb24gaW5jb3JyZWxhZGFzIGVudHJlIHNpLCB2ZXIgbGEgcGVzdGHDsWEgKipDb3JyZWxhY2lvbmVzIGNvbXBhcmFkYXMqKi4gDQoNClBvciDDumx0aW1vLCB0YW50byBlbCBHcsOhZmljbyBkZSBDYXR0ZWxsIGNvbW8gZWwgR3LDoWZpY28gZGUgQ2F0dGVsbC1LYWlzZXIsIHF1ZSByZXByZXNlbnRhbiBlbCBjb2RvIHkgbGEgc2VkaW1lbnRhY2nDs24gcmVzcGVjdGl2YW1lbnRlLCBheXVkYW4gYSBkZWNpZGlyIGN1w6FudGFzIGNvbXBvbmVudGVzIHJldGVuZXIgZW4gbGEgcmVkdWNjacOzbiBkZSBkaW1lbnNpb25hbGlkYWQsIGFzZWd1cmFuZG8gcXVlIHNlIGNvbnNlcnZlIHVuYSBjYW50aWRhZCBzdWZpY2llbnRlIGRlIHZhcmlhYmlsaWRhZCBwYXJhIGFib3JkYXIgZWwgcHJvYmxlbWEgZW4gY3Vlc3Rpw7NuLiBObyBvYnN0YW50ZSwgZXMgaW1wb3J0YW50ZSBkZXN0YWNhciBxdWUgc2Ugc3VnaWVyZSB0b21hciBkZWNpc2lvbmVzIGJhc2FkYXMgZW4gY3JpdGVyaW9zIG3DoXMgY29tdW5lcyBlbiBsdWdhciBkZSBjcml0ZXJpb3MgZGUgYWNlcHRhY2nDs24gdW5pdmVyc2FsLg0KDQpFbCBHcsOhZmljbyBkZSBDYXR0ZWxsIHJldmVsYSBxdWUgbG9zIGNhbWJpb3MgZW4gbGEgcGVuZGllbnRlIGluZGljYW4gdW5hIGFsdGEgY2FwYWNpZGFkIGV4cGxpY2F0aXZhIGRlIGxhcyBkaW1lbnNpb25lcyBlbiBjb21wYXJhY2nDs24gY29uIGxhcyBkZW3DoXMuIFBvciBvdHJvIGxhZG8sIGVsIEdyw6FmaWNvIGRlIENhdHRlbGwtS2Fpc2VyLCBhbCBjb21iaW5hciBlbCBncsOhZmljbyBhbnRlcmlvciBjb24gZWwgY3JpdGVyaW8gZGUgS2Fpc2VyIGVuIGxhIG1pc21hIHZpc3VhbGl6YWNpw7NuLCByZXNwYWxkYSBsYSBpZGVhIGRlIHJldGVuZXIgc29sbyAyIGRpbWVuc2nDs24geSBubyA0IGNvbW8gc2UgaGFiaWEgcHJvcHVlc3RvLCBlbmZhdGl6YW5kbyBxdWUgZXN0YSBlbGVjY2nDs24gZGViZSBjb25zZXJ2YXIgdW4gcG9yY2VudGFqZSBhZGVjdWFkbyBkZSB2YXJpYWJpbGlkYWQgcGFyYSBlbCBhbsOhbGlzaXMgZGVsIHByb2JsZW1hIGVuIGN1ZXN0acOzbi4NCg0KIyMjIE1hdHJpeiBBQ1ANCmBgYHtyIE1hdHJpel9BQ1AsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KZ2V0X2VpZ2VudmFsdWUoUENBKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRbLC1jKDIsMyw3LDksMTEsMTIpXSwgbmNwID0gNiwgc2NhbGUudW5pdCA9IFRSVUUsIGdyYXBoID0gRikpDQpgYGANCg0KIyMjIE1hdHJpeiBkZSBDb3JyZWxhY2lvbmVzDQpgYGB7ciBtYXRyaXpfZGVfQ29ycmVsYWNpb25lcywgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpyb3VuZChjb3IoaGVhcnRfZGlzZWFzZXNfRGF0YXNldFssLWMoMiwzLDcsOSwxMSwxMildKSwyKQ0KYGBgDQoNCiMjIyBWYWxvcmVzIHkgVmVjdG9yZXMgUHJvcGlvcw0KYGBge3IgVmFsb3Jlc195X1ZlY3RvcmVzX1Byb3Bpb3MsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KcHJpbmNvbXAoaGVhcnRfZGlzZWFzZXNfRGF0YXNldFssLWMoMiwzLDcsOSwxMSwxMildLCBjb3IgPSBUUlVFKSRzZGV2XjINCnByaW5jb21wKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRbLC1jKDIsMyw3LDksMTEsMTIpXSwgY29yID0gVFJVRSkkbG9hZGluZ3NbICwxOjZdDQpgYGANCg0KIyMjIENvcnJlbGFjaW9uZXMgQ29tcGFyYWRhcw0KYGBge3IgQ29ycmVsYWNpb25lc19Db21wYXJhZGFzLCBmaWcuYWxpZ249J2NlbnRlcid9DQpwYXIobWZyb3c9YygxLDIpKQ0KY29ycnBsb3Q6OmNvcnJwbG90KGNvcihoZWFydF9kaXNlYXNlc19EYXRhc2V0WywtYygyLDMsNyw5LDExLDEyKV0pLCBtZXRob2QgPSAiY29sb3IiLCB0eXBlID0gInVwcGVyIiwgbnVtYmVyLmNleCA9IDAuNCkNCmNvcnJwbG90Ojpjb3JycGxvdChjb3IocHJpbmNvbXAoaGVhcnRfZGlzZWFzZXNfRGF0YXNldFssLWMoMiwzLDcsOSwxMSwxMildLCBjb3IgPSBUUlVFKSRzY29yZXMpLCBtZXRob2QgPSAiY29sb3IiLCB0eXBlID0gInVwcGVyIiwgbnVtYmVyLmNleCA9IDAuNCkNCmBgYA0KDQojIyMgR3LDoWZpY28gZGUgQ2F0dGVsbA0KYGBge3IgR3JhZmljb19kZV9DYXR0ZWxsLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCmZ2aXpfZWlnKFBDQShoZWFydF9kaXNlYXNlc19EYXRhc2V0WywtYygyLDMsNyw5LDExLDEyKV0sIHNjYWxlLnVuaXQgPSBULCBncmFwaCA9IEYpLCBhZGRsYWJlbHMgPSBULCB5bGltPWMoMCw5MCksIG1haW4gPSAiIikNCmBgYA0KDQojIyMgR3LDoWZpY28gZGUgQ2F0dGVsbC1LYWlzZXINCmBgYHtyIEdyYWZpY29fZGVfQ2F0dGVsbF9LYWlzZXIsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0Kc2NyZWUoaGVhcnRfZGlzZWFzZXNfRGF0YXNldFssLWMoMiwzLDcsOSwxMSwxMildLGZhY3RvcnMgPSBGQUxTRSwgcGMgPSBUUlVFLCBtYWluID0iIikNCmBgYA0KDQojIyAqKjIuMy4gQ2FsaWRhZCBkZSBSZXByZXNlbnRhY2nDs24qKiB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQpEZXNwdcOpcyBkZSByZWR1Y2lyIGxhIGRpbWVuc2lvbmFsaWRhZCBkZWwgY29uanVudG8gZGUgZGF0b3MgeSBwcm95ZWN0YXIgbGFzIHZhcmlhYmxlcyBlc3RhbmRhcml6YWRhcyBlbiBsYSBoaXBlcmVzZmVyYSBkZSBjb3JyZWxhY2lvbmVzLCBlcyBlc2VuY2lhbCBpbmljaWFyIGxhIGludGVycHJldGFjacOzbiBkZSBsb3MgY29tcG9uZW50ZXMgdGVuaWVuZG8gZW4gY3VlbnRhIGVzdGFzIGNvcnJlbGFjaW9uZXMuIEVzdG8gbm9zIHBlcm1pdGUgZW50ZW5kZXIgY8OzbW8gbGFzIHZhcmlhYmxlcyBvcmlnaW5hbGVzIHNlIHJlbGFjaW9uYW4gZW50cmUgc8OtIHkgY8OzbW8gZXN0YXMgcmVsYWNpb25lcyBzZSByZWZsZWphbiBlbiBsb3MgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMuIEVzdGEgY29tcHJlbnNpw7NuIG5vcyBheXVkYSBhIGluZmVyaXIgcGF0cm9uZXMgeSBlc3RydWN0dXJhcyBpbXBvcnRhbnRlcyBlbiBsb3MgZGF0b3MuIEFkZW3DoXMsIGVzIGNydWNpYWwgZXZhbHVhciBsYSBjYWxpZGFkIGRlIGxhcyByZXByZXNlbnRhY2lvbmVzIGRlIGxvcyBjb21wb25lbnRlcywgYXNlZ3Vyw6FuZG9ub3MgZGUgcXVlIGNvbnNlcnZlbiBsYSBpbmZvcm1hY2nDs24gY3J1Y2lhbCBkZWwgY29uanVudG8gZGUgZGF0b3Mgb3JpZ2luYWwgeSBzZWFuIMO6dGlsZXMgcGFyYSBlbCBhbsOhbGlzaXMgc3Vic2lndWllbnRlLCBnYXJhbnRpemFuZG8gYXPDrSB1bmEgY29tcHJlbnNpw7NuIHByZWNpc2EgeSDDunRpbCBkZSBsYSBlc3RydWN0dXJhIGRlIGxvcyBkYXRvcy4NCg0KKipQbGFudGVhbWllbnRvIGRlbCBQcm9ibGVtYSoqDQoNCkNvbiBiYXNlIGVuIGVsIGNvbmp1bnRvIGRlIGRhdG9zIGRlc2NyaXRvIGVuIGxhIGZhc2UgMSBzZSByZXF1aWVyZSBkZXRlcm1pbmFyIGxhIGNhbGlkYWQgZGUgcmVwcmVzZW50YWNpw7NuIGRlIGxhcyB2YXJpYWJsZXMgY3VhbnRpdGF0aXZhcyBlbiByZWxhY2nDs24gY29uIGxhIGNhbnRpZGFkIGRlIGRpbWVuc2lvbmVzIGNhbGN1bGFkYXMgcXVlIHJldGllbmVuIGxhIG1heW9yIGNhbnRpZGFkIGRlIHZhcmlhYmlsaWRhZC4gUGFyYSBvYnRlbmVyIG3DoXMgaW5mb3JtYWNpw7NuIGFsIHJlc3BlY3RvLCBzZSByZWNvbWllbmRhIGNvbnN1bHRhciBsYSAqKnNlY2Npw7NuIDIuMioqIGRlbCBkb2N1bWVudG8uDQoNCioqRGVzYXJyb2xsbyBkZWwgQW7DoWxpc2lzKioNCg0KRXhwbG9yYXIgbGFzIHBlc3Rhw7FhcyByZXZlbGEsIHF1ZSByZWR1Y2lyIGxhIGRpbWVuc2lvbmFsaWRhZCBkZWwgY29uanVudG8gZGUgZGF0b3MgcGVybWl0ZSBhbmFsaXphciBsYXMgY2FsaWRhZGVzIGRlIHJlcHJlc2VudGFjacOzbi4gRXN0byBzZSBldmFsw7phIGVuIGZ1bmNpw7NuIGRlIGxhIGVzY2FsYSBkZSBjb250cmlidWNpb25lcyByZWxhdGl2YXMsIGJhc2FkYSBlbiB1biBjb2NpZW50ZSBkZSBwcm95ZWNjaW9uZXMgY29uIHByb3BpZWRhZGVzIGFkaXRpdmFzIHkgdW5hIHJlc3B1ZXN0YSBlbiB1bmEgZXNjYWxhIGNvbnRpbnVhIGRlIDAgYSAxLiBBc8OtLCBlbiBwYXJ0aWN1bGFyOg0KDQpFbCAqKkPDrXJjdWxvIGRlIGNvcnJlbGFjaW9uZXMqKiBub3MgbXVlc3RyYSBkZSBtYW5lcmEgdmlzdWFsIGPDs21vIHNlIGNvbXBvcnRhbiBsYXMgc2VpcyB2YXJpYWJsZXMgZGUgaW50ZXLDqXMuIEVuIGVzdGUgY2FzbywgY3VhdHJvIGRlIGVsbGFzIGVzdMOhbiBiYXN0YW50ZSBwcsOzeGltYXMgYSBsYXMgZnJvbnRlcmFzIGRlbCBjw61yY3VsbyB1bml0YXJpbyB5IGNlcmNhIGRlIGxvcyBkb3MgZWplcyBwcmluY2lwYWxlcywgZGVwZW5kaWVuZG8gZGUgbGEgdmFyaWFibGUgcXVlIHNlIHRvbWUgY29tbyByZWZlcmVuY2lhLiBFc3RvIGluZGljYSBxdWUgZXN0YXMgdmFyaWFibGVzIHRpZW5lbiB1bmEgYnVlbmEgcmVwcmVzZW50YWNpw7NuIGVuIGVsIHBsYW5vIGRlIGxvcyBjb21wb25lbnRlcyBwcmluY2lwYWxlcy4gQWRlbcOhcywgcG9kZW1vcyBvYnNlcnZhciB0YW50byBjb3JyZWxhY2lvbmVzIHBvc2l0aXZhcyBjb21vIG5lZ2F0aXZhcyBlbnRyZSBlbGxhcy4gVW4gYXNwZWN0byBpbXBvcnRhbnRlIGEgZGVzdGFjYXIgZXMgbGEgY29ycmVsYWNpw7NuIGV4aXN0ZW50ZSBlbnRyZSBsYXMgdmFyaWFibGVzLiBVbiBlamVtcGxvIHJlcHJlc2VudGF0aXZvIGVzIGxhIHJlbGFjacOzbiBlbnRyZSAqKlBBX3JlcG9zbyoqIHkgKipPbGRwZWFrKiouIEVzdGFzIGRvcyB2YXJpYWJsZXMgbXVlc3RyYW4gY8OzbW8gbGFzIGNvcnJlbGFjaW9uZXMgcHVlZGVuIHZhcmlhciBzaWduaWZpY2F0aXZhbWVudGUsIHJlZmxlamFuZG8gcmVsYWNpb25lcyBjb21wbGVqYXMgcXVlIHB1ZWRlbiBzZXIgcG9zaXRpdmFzIG8gbmVnYXRpdmFzIGRlcGVuZGllbmRvIGRlIHN1IHBvc2ljacOzbiByZWxhdGl2YSBlbiBlbCBjw61yY3Vsby4NCg0KTGEgKipNYXRyaXogZGUgUmVwcmVzZW50YWNpw7NuKiogbXVlc3RyYSBhbGd1bm9zIHZhbG9yZXMgc2lnbmljYXRpdmFtZW50ZSBjZXJjYW5vcyBhIDAgeSBwb2NvcyBjZXJjYW5vcyBhIDEsbG9zIHZhbG9yZXMgYW50ZXJpb3JtZW50ZSBtZW5jaW9uYWRvcyBzb24gbG9zIGNvY2llbnRlcyBkZSBsYXMgcHJveWVjY2lvbmVzIGNvc2VubyBjdWFkcmFkbyBxdWUgZXN0YW4gcmVsYWNpb25hZG9zIGNvbiBsYSBkaW1lbnNpw7NuIDEuIGFzw60gZGUgbGEgbWlzbWEgbWFuZXJhIGxhICoqQ2FsaWRhZCBkZSBSZXByZXNlbnRhY2nDs24qKiBlbiBjdWFudG8gc2UgcmVsYWNpb25hIGNvbiBsYSBjb21wb25lbnRlIDEgZXN0YSBlbmNhYmV6YWRhICoqRWRhZCoqIHkgY2llcnJhIGNvbiAqKkNvbGVzdGVyb2wqKiBjYWJlIHJlY2FsY2FyIHF1ZSBlbiBsYSBkaW1lbnNpb24gMiBzZSBvYnRpbmUgdW5hIG1lam9yIHJlcHJlc2VudGFjaW9uIHBvciBwYXJ0ZSBkZWwgKipDb2xlc3Rlcm9sKiosIHBvciBsbyB0YW50byBsbyBxdWUgbm9zIGRpY2UgZXN0byBlcyBxdWUgbGEgcmVwcmVzZW50YWNpb24gcmVsYWNpb25hZGEgY29uIGxhIHByaW1lcmEgZGltZW5zaW9uIHNlIHZlIGFmZWN0YWRhLiBUYW1iaWVuIGVzIGltcG9ydGFudGUgbWVuY2lvbmFyIHF1ZSBsYSBlc2NhbGEgcXVlIG11ZXN0cmEgbGEgKipDYWxpZGFkIGRlIFJlcHJlc2VudGFjacOzbioqIGluZGljYSBzdSBlc2NhbGEgdW4gcGlzbyBhbHRvIGRlICQwLjA0JC4NCg0KUG9yIMO6bHRpbW8sIGxhcyAqKkNvb3JkZW5hZGFzIEluZGl2aWR1YWxlcyoqIHBlcm1pdGVuIGlkZW50aWZpY2FyLCBhdW5xdWUgZGUgbWFuZXJhIG1lbm9zIGludHVpdGl2YSwgbG9zIHBlcmZpbGVzIGRlIGxvcyByZWdpc3Ryb3MgaW5kaXZpZHVhbGVzLCBlbiBlc3RlIGNhc28gbG9zIHBhY2llbnRlcywgZW4gcmVsYWNpw7NuIGNvbiBsYXMgZGltZW5zaW9uZXMgbcOhcyBpbXBvcnRhbnRlcyBxdWUgcmV0aWVuZW4gbGEgbWF5b3IgcGFydGUgZGUgbGEgdmFyaWFiaWxpZGFkOiBsYXMgY29tcG9uZW50ZXMgMSB5IDIuIEVzdGFzIGNvb3JkZW5hZGFzIG5vcyBheXVkYW4gYSBlbnRlbmRlciBjw7NtbyBzZSBkaXN0cmlidXllbiB5IGFncnVwYW4gbG9zIHBhY2llbnRlcyBlbiBlbCBlc3BhY2lvIGRlZmluaWRvIHBvciBlc3RhcyBjb21wb25lbnRlcyBwcmluY2lwYWxlcy4NClBvciBlamVtcGxvLCBhbCBhbmFsaXphciBsb3MgcmVnaXN0cm9zIDEsIDYsIDE3IHkgMjAsIHBvZGVtb3Mgb2JzZXJ2YXIgcXVlIGxvcyByZWdpc3Ryb3MgYW50ZXJpb3JtZW50ZSBtZW5jaW9uYWRvcyBwcmVzZW50YW4gcGVyZmlsZXMgc2ltaWxhcmVzLiBFc3RhIG9ic2VydmFjacOzbiBzZSBtYW50aWVuZSBpbmNsdXNvIGN1YW5kbyBjb25zaWRlcmFtb3Mgb3RyYXMgdmFyaWFibGVzIGNvbW8gbGEgcGVvciByZXByZXNlbnRhZGEuIEVzdGUgYW7DoWxpc2lzIHN1Z2llcmUgcXVlIGxhcyBwcmluY2lwYWxlcyBkaWZlcmVuY2lhcyB5IHNpbWlsaXR1ZGVzIGVudHJlIGVzdG9zIHJlZ2lzdHJvcyBzZSBjYXB0dXJhbiBkZSBtYW5lcmEgZWZlY3RpdmEgYSB0cmF2w6lzIGRlIGxhcyBjb21wb25lbnRlcyAxIHkgMi4NCg0KIyMjIEPDrXJjdWxvIGRlIENvcnJlbGFjaW9uZXMNCmBgYHtyIENpcmN1bG9fZGVfQ29ycmVsYWNpb25lcywgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpmdml6X3BjYV92YXIoUENBKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRbLC1jKDIsMyw3LDksMTEsMTIpXSwgc2NhbGUudW5pdCA9IFQsIGdyYXBoID0gRiksY29sLnZhcj0iIzNCODNCRCIsIHJlcGVsID0gVCwgY29sLmNpcmNsZSA9ICIjQ0RDRENEIiwgZ2d0aGVtZSA9IHRoZW1lX2J3KCkpDQpgYGANCg0KIyMjIE1hdHJpeiBkZSBSZXByZXNlbnRhY2nDs24NCmBgYHtyIE1hdHJpel9kZV9SZXByZXNzZW50YWNpb25fQ09TMiwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQooZ2V0X3BjYV92YXIoUENBKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRbLC1jKDIsMyw3LDksMTEsMTIpXSwgbmNwID0gNiwgc2NhbGUudW5pdCA9IFRSVUUsIGdyYXBoID0gRikpKSRjb3MyDQpgYGANCg0KIyMjIENhbGlkYWQgZGUgUmVwcmVzZW50YWNpw7NuDQpgYGB7ciBDYWxpZGFkX2RlX2xhX1JlcHJlc2VudGFjaW9uLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCmZ2aXpfcGNhX3ZhcihQQ0EoaGVhcnRfZGlzZWFzZXNfRGF0YXNldFssLWMoMiwzLDcsOSwxMSwxMildLCBuY3AgPSA2LCBzY2FsZS51bml0ID0gVFJVRSwgZ3JhcGggPSBGKSwgY29sLnZhcj0iY29zMiIsIGdyYWRpZW50LmNvbHM9YygiIzAwQUZCQiIsIiNFN0I4MDAiLCIjRkM0RTA3IiksIHJlcGVsID0gVFJVRSkNCmBgYA0KDQojIyMgQ29vcmRlbmFkYXMgSW5kaXZpZHVhbGVzDQpgYGB7ciBDb29yZGVuYWRhc19SZWdpc3Ryb3MsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KaGVhZCgoUENBKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRbLC1jKDIsMyw3LDksMTEsMTIpXSwgbmNwID0gNiwgc2NhbGUudW5pdCA9IFRSVUUsIGdyYXBoID0gRikpJGluZCRjb29yZCwgbiA9IDIzTCkNCmBgYA0KDQojIyAqKjIuNC4gQ29udHJpYnVjaW9uZXMqKiB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQpMYSBpbnRlcnByZXRhY2nDs24gZGUgbG9zIHJlc3VsdGFkb3MgZW4gZWwgYW7DoWxpc2lzIGRlIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzIChBQ1ApIHNlIHZlIGVucmlxdWVjaWRhIHBvciBlbCBjw6FsY3VsbyBkZSBkaXZlcnNhcyBtw6l0cmljYXMsIHRhbGVzIGNvbW8gY29vcmRlbmFkYXMsIGNvbnRyaWJ1Y2lvbmVzIHkgY29zZW5vcyBjdWFkcmFkb3MuIEVzdG9zIGluZGljYWRvcmVzIHNvbiBmdW5kYW1lbnRhbGVzIHBhcmEgY29tcHJlbmRlciBsYSByZWxhY2nDs24gZW50cmUgbGFzIHZhcmlhYmxlcyBvcmlnaW5hbGVzIHkgbG9zIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzIGdlbmVyYWRvcy4gRXMgY3J1Y2lhbCBxdWUgbGFzIHZhcmlhYmxlcyBlc3TDqW4gY2xhcmFtZW50ZSBjb25jZXB0dWFsaXphZGFzLCBjb250ZXh0dWFsaXphZGFzIGVuIGVsIG1hcmNvIGRlbCBwcm9ibGVtYSBkZSBlc3R1ZGlvLCBwYXJhIHBvZGVyIGludGVycHJldGFyIGNvbiBwcmVjaXNpw7NuIHN1cyBjb250cmlidWNpb25lcyBhIGxvcyBjb21wb25lbnRlcy4NCg0KRWwgY8OhbGN1bG8gZGUgbGFzIGNvbnRyaWJ1Y2lvbmVzIGRlIGNhZGEgdmFyaWFibGUgYSBjYWRhIGNvbXBvbmVudGUgcGVybWl0ZSBlbnRlbmRlciBlbCBncmFkbyBkZSBpbmZsdWVuY2lhIGRlIGNhZGEgdW5hIGVuIGxhIGZvcm1hY2nDs24gZGUgbG9zIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzLiBFc3RlIGFuw6FsaXNpcyBmYWNpbGl0YSBsYSBpZGVudGlmaWNhY2nDs24gZGUgYXF1ZWxsYXMgdmFyaWFibGVzIHF1ZSBtw6FzIGNvbnRyaWJ1eWVuIGEgbGEgZXN0cnVjdHVyYSBkZSBjYWRhIGNvbXBvbmVudGUgeSwgcG9yIGVuZGUsIGEgbGEgdmFyaWFiaWxpZGFkIGdlbmVyYWwgZGUgbG9zIGRhdG9zLiBBZGVtw6FzLCBwcm9wb3JjaW9uYSBpbnNpZ2h0cyBzb2JyZSBsYXMgcmVsYWNpb25lcyBzdWJ5YWNlbnRlcyBlbnRyZSBsYXMgdmFyaWFibGVzIHkgY8OzbW8gZXN0YXMgc2UgcmVmbGVqYW4gZW4gbG9zIGNvbXBvbmVudGVzLg0KDQoqKlBsYW50ZWFtaWVudG8gZGVsIFByb2JsZW1hKioNCg0KQ29uIGJhc2UgZW4gbGFzIHZhcmlhYmxlcyBjdWFudGl0YXRpdmFzIGRlbCBjb25qdW50byBkZSBkYXRvcyBkZXNjcml0byBlbiBsYSBmYXNlIDEgc2UgcmVxdWllcmUgZGV0ZXJtaW5hciBsYXMgY29udHJpYnVjaW9uZXMgcXVlIGNhZGEgdmFyaWFibGUgcmVhbGl6YSBlbiBsYSBjb25zdHJ1Y2Npw7NuIGRlIGNhZGEgY29tcG9uZW50ZS4gRXN0ZSBhbsOhbGlzaXMgcGVybWl0aXLDoSBjb21wcmVuZGVyIGVsIHBhcGVsIGRlIGNhZGEgdmFyaWFibGUgZW4gbGEgZXN0cnVjdHVyYSBzdWJ5YWNlbnRlIGRlIGxvcyBkYXRvcyB5IHN1IGltcGFjdG8gZW4gbGEgZm9ybWFjacOzbiBkZSBsb3MgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMuIE1lZGlhbnRlIGVsIGPDoWxjdWxvIGRlIGVzdGFzIGNvbnRyaWJ1Y2lvbmVzLCBzZXLDoSBwb3NpYmxlIGlkZW50aWZpY2FyIHF1w6kgdmFyaWFibGVzIHRpZW5lbiB1bmEgaW5mbHVlbmNpYSBtw6FzIHNpZ25pZmljYXRpdmEgZW4gY2FkYSBjb21wb25lbnRlLCBsbyBxdWUgZmFjaWxpdGFyw6EgbGEgaW50ZXJwcmV0YWNpw7NuIGRlIGxvcyByZXN1bHRhZG9zIGRlbCBhbsOhbGlzaXMgZGUgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMgeSBwcm9wb3JjaW9uYXLDoSBpbmZvcm1hY2nDs24gdmFsaW9zYSBwYXJhIGVsIGVzdHVkaW8gZGVsIHByb2JsZW1hIGVuIGN1ZXN0acOzbi4NCg0KKipEZXNhcnJvbGxvIGRlbCBBbsOhbGlzaXMqKg0KDQpDb24gYmFzZSBhIHRyYXbDqXMgZGUgbGFzIHBlc3Rhw7FhcyBkZSBuYXZlZ2FjaW9uIG5vcyBwZXJtaXRlIHJlY29ub2NlciBsYXMgcmVwcmVzZW50YWNpb25lcyBudW1lcmljYXMgeSBncmFmaWNhcyBkZSBsYXMgY29udHJpYnVjaW9uZXMgZGUgY2FkYSB2YXJpYWJsZSBkZWwgY29uanVudG8gZGUgZGF0b3MgZGUgbWFuZXJhIHBvcmNlbnR1YWwgYSBsYSBjb25zdHJ1Y2lvbiBkZSBjYWRhIGNvbXBvbmVudGUuIEVudG9uY2VzIGVuIHBhcnRpY3VsYXIgbGxlZ2Ftb3MgYSBlbmNvbnRyYXIgbG8gc2lndWllbnRlOg0KDQpMYSAqKk1hdHJpeiBkZSBjb250cmlidWNpb25lcyoqIG5vcyBtdWVzdHJhIGVuIHRlcm1pbm9zIG51bWVyaWNvcyBsYSByZXRlbmNpb24gZGUgbGEgdmFyaWFiaWxpZGFkIHF1ZSB0aWVuZSBjYWRhIHZhcmlhYmxlIGVuIHN1IHJlc3BlY3RpdmEgY29tcG9uZW50ZSwgZGUgbGEgbWlzbWEgc2UgaGFyYW4gZGlhZ3JhbWFzIGRlIGJhcnJhcyBxdWUgbm9zIGV4cGxpcXVlbiBkZSBtYW5lcmEgdmlzdWFsIGxhcyAqKkNvbnRyaWJ1Y2lvbmVzIGEgRDEqKiBoYXN0YSAqKkNvbnRyaWJ1Y2lvbmVzIGEgRDYqKiB5IGVzdGEgbWlzbWEgc2UgaGFyYSBhIHRyYXbDqXMgZGUgbGEgbmFldmFnYWNpb24gZGUgcGVzdGHDsWFzLiBUYW1iaWVuIGRlIG1hbmVyYSBjb21wbGVtZW50YXJpYSBjYWRhIGdyYWZpY28gdGVuZHJhIHN1IHByb3BpYSBsaW5lYSBxdWUgbm9zIGF5dWRhcmEgYSBpZGVudGlmaWNhciBsYSBjb250cmlidWNpb24gbWVkaWEsIGVzdG8gbm9zIGF5dWRhcmEgYSBpZGVudGlmaWNhciBsYXMgdmFyaWFibGVzIHF1ZSBjb250cmlidXlhbiBkZSBtZWpvciBtYW5lcmEgYSBzdXMgcmVwZWN0aXZhcyBkaW1lbmNpb25lcy4NCg0KLSBFbiAqKkNvbnRyaWJ1Y2lvbmVzIGEgRDEqKiBzZSB2aXN1YWxpemFuIHF1ZSBsYXMgdmFyaWFibGVzIHF1ZSBlc3RhbiBwb3IgZW5jaW1hIGRlIGxhIGNvbnRyaWJ1Y2lvbiBtZWRpYSBzb246ICoqRWRhZCoqIHkgKipGcmVjQ19NYXgqKiBxdWUgcmV0aWVuZSBhcHJveGltYWRhbWVudGUgZWwgJDU5LDg5JCAkJSQgZGUgbGEgdmFyaWFiaWxpZGFkIGRlIGxhIGNvbXBvbmVudGUgMS4NCg0KLSBFbiAqKkNvbnRyaWJ1Y2lvbmVzIGEgRDIqKiBzZSB2aXN1YWxpemFuIHF1ZSBsYXMgdmFyaWFibGVzIHF1ZSBlc3RhbiBwb3IgZW5jaW1hIGRlIGxhIGNvbnRyaWJ1Y2lvbiBtZWRpYSBzb246ICoqQ29sZXN0ZXJvbCoqIHkgKipQQV9yZXBvc28qKiBxdWUgcmV0aWVuZSBhcHJveGltYWRhbWVudGUgZWwgJDcwLDA3JCAkJSQgZGUgbGEgdmFyaWFiaWxpZGFkIGRlIGxhIGNvbXBvbmVudGUgMi4NCg0KLSBFbiAqKkNvbnRyaWJ1Y2lvbmVzIGEgRDMqKiBzZSB2aXN1YWxpemFuIHF1ZSBsYXMgdmFyaWFibGVzIHF1ZSBlc3RhbiBwb3IgZW5jaW1hIGRlIGxhIGNvbnRyaWJ1Y2lvbiBtZWRpYSBzb246ICoqQVpfQXl1bmFzKiosICoqT2xkcGVhayoqIHkgKipGcmVjQ19NYXgqKiBxdWUgcmV0aWVuZSBhcHJveGltYWRhbWVudGUgZWwgJDkxLDYzJCAkJSQgZGUgbGEgdmFyaWFiaWxpZGFkIGRlIGxhIGNvbXBvbmVudGUgMy4NCg0KLSBFbiAqKkNvbnRyaWJ1Y2lvbmVzIGEgRDQqKiBzZSB2aXN1YWxpemFuIHF1ZSBsYXMgdmFyaWFibGVzIHF1ZSBlc3RhbiBwb3IgZW5jaW1hIGRlIGxhIGNvbnRyaWJ1Y2lvbiBtZWRpYSBzb246ICoqUEFfcmVwb3NvKiosICoqT2xkcGVhayoqIHkgKipBWl9BeXVuYXMqKiBxdWUgcmV0aWVuZSBhcHJveGltYWRhbWVudGUgZWwgJDkyLjIxJCAkJSQgZGUgbGEgdmFyaWFiaWxpZGFkIGRlIGxhIGNvbXBvbmVudGUgNC4NCg0KLSBFbiAqKkNvbnRyaWJ1Y2lvbmVzIGEgRDUqKiBzZSB2aXN1YWxpemFuIHF1ZSBsYXMgdmFyaWFibGVzIHF1ZSBlc3RhbiBwb3IgZW5jaW1hIGRlIGxhIGNvbnRyaWJ1Y2lvbiBtZWRpYSBzb246ICoqQ29sZXN0ZXJvbCoqIHkgKipQQV9yZXBvc28qKiBxdWUgcmV0aWVuZSBhcHJveGltYWRhbWVudGUgZWwgJDY3LDU3JCAkJSQgZGUgbGEgdmFyaWFiaWxpZGFkIGRlIGxhIGNvbXBvbmVudGUgNS4NCg0KLSBQb3IgdWx0aW1vIHRlbmVuZW1vcyBsYSBwZXN0YcOxYSAqKkNvbnRyaWJ1Y2lvbmVzIGEgRDYqKiBzZSB2aXN1YWxpemFuIHF1ZSBsYXMgdmFyaWFibGVzIHF1ZSBlc3RhbiBwb3IgZW5jaW1hIGRlIGxhIGNvbnRyaWJ1Y2lvbiBtZWRpYSBzb246ICoqRWRhZCoqIHkgKipGcmVjQ19NYXgqKiBxdWUgcmV0aWVuZSBhcHJveGltYWRhbWVudGUgZWwgJDg4LDM1JCAkJSQgZGUgbGEgdmFyaWFiaWxpZGFkIGRlIGxhIGNvbXBvbmVudGUgNi4NCg0KQ29uIGxvcyBkYXRvcyBwcm9jZXNhZG9zIGhhc3RhIGVzdGUgbW9tZW50byBwb2RlbW9zIHNlZ3VpciBjb24gZWwgc2lndWllbnRlIHBhc28gcXVlIHNlcmlhIGxhIGludGVycHJldGFjaW9uIGRlIGNhZGEgY29tcG9uZW5ldGUuDQoNCiMjIyBNYXRyaXogZGUgQ29udHJpYnVjaW9uZXMNCmBgYHtyIE1hdHJpel9kZV9Db250cmlidWNpb25lcywgZmlnLmFsaWduID0gJ2NlbnRlcid9DQooZ2V0X3BjYV92YXIoUENBKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRbLC1jKDIsMyw3LDksMTEsMTIpXSwgbmNwID0gNiwgc2NhbGUudW5pdCA9IFRSVUUsIGdyYXBoID0gRikpKSRjb250cmliDQpgYGANCg0KIyMjIENvbnRyaWJ1Y2lvbmVzIGEgRDENCmBgYHtyIENvbnRyaWJ1Y2lvbmVzX0RJTV8xLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCmZ2aXpfY29udHJpYihQQ0EoaGVhcnRfZGlzZWFzZXNfRGF0YXNldFssLWMoMiwzLDcsOSwxMSwxMildLCBuY3AgPSA2LCBzY2FsZS51bml0ID0gVFJVRSwgZ3JhcGggPSBGKSwgY2hvaWNlID0gInZhciIsIGF4ZXMgPSAxLCB0b3AgPSAxMCkNCmBgYA0KDQojIyMgQ29udHJpYnVjaW9uZXMgYSBEMg0KYGBge3IgQ29udHJpYnVjaW9uZXNfRElNXzIsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KZnZpel9jb250cmliKFBDQShoZWFydF9kaXNlYXNlc19EYXRhc2V0WywtYygyLDMsNyw5LDExLDEyKV0sIG5jcCA9IDYsIHNjYWxlLnVuaXQgPSBUUlVFLCBncmFwaCA9IEYpLCBjaG9pY2UgPSAidmFyIiwgYXhlcyA9IDIsIHRvcCA9IDEwKQ0KYGBgDQoNCiMjIyBDb250cmlidWNpb25lcyBhIEQzDQpgYGB7ciBDb250cmlidWNpb25lc19ESU1fMywgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpmdml6X2NvbnRyaWIoUENBKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRbLC1jKDIsMyw3LDksMTEsMTIpXSwgbmNwID0gNiwgc2NhbGUudW5pdCA9IFRSVUUsIGdyYXBoID0gRiksIGNob2ljZSA9ICJ2YXIiLCBheGVzID0gMywgdG9wID0gMTApDQpgYGANCg0KIyMjIENvbnRyaWJ1Y2lvbmVzIGEgRDQNCmBgYHtyIENvbnRyaWJ1Y2lvbmVzX0RJTV80LCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCmZ2aXpfY29udHJpYihQQ0EoaGVhcnRfZGlzZWFzZXNfRGF0YXNldFssLWMoMiwzLDcsOSwxMSwxMildLCBuY3AgPSA2LCBzY2FsZS51bml0ID0gVFJVRSwgZ3JhcGggPSBGKSwgY2hvaWNlID0gInZhciIsIGF4ZXMgPSA0LCB0b3AgPSAxMCkNCmBgYA0KDQojIyMgQ29udHJpYnVjaW9uZXMgYSBENQ0KYGBge3IgQ29udHJpYnVjaW9uZXNfRElNXzUsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KZnZpel9jb250cmliKFBDQShoZWFydF9kaXNlYXNlc19EYXRhc2V0WywtYygyLDMsNyw5LDExLDEyKV0sIG5jcCA9IDYsIHNjYWxlLnVuaXQgPSBUUlVFLCBncmFwaCA9IEYpLCBjaG9pY2UgPSAidmFyIiwgYXhlcyA9IDUsIHRvcCA9IDEwKQ0KYGBgDQoNCiMjIyBDb250cmlidWNpb25lcyBhIEQ2DQpgYGB7ciBDb250cmlidWNpb25lc19ESU1fNiwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpmdml6X2NvbnRyaWIoUENBKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRbLC1jKDIsMyw3LDksMTEsMTIpXSwgbmNwID0gNiwgc2NhbGUudW5pdCA9IFRSVUUsIGdyYXBoID0gRiksIGNob2ljZSA9ICJ2YXIiLCBheGVzID0gNiwgdG9wID0gMTApDQpgYGANCg0KIyMgKioyLjUuIEludGVycHJldGFjacOzbiBkZSBjb21wb25lbnRlcyoqIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNClNlIHNhYmUgcXVlIGEgcGFydGlyIGRlIGxhcyBjb29yZGVuYWRhcyBkZSBsb3MgcmVnaXN0cm9zIGRpbWVuc2lvbmFsbWVudGUgcmVkdWNpZG9zLCBlcyBwb3NpYmxlIHViaWNhcmxvcyBlbiB1biBwbGFubyBkZSBmYWN0b3JlcyBwYXJhIGFuw6FsaXNpcyBlIGludGVycHJldGFjacOzbi4gRW4gZXN0ZSBwcm9jZXNvLCBsYXMgdmFyaWFibGVzIHJlZHVjaWRhcyBhY3TDumFuIGNvbW8gbGFzIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzLCBxdWUgc2UgcmVwcmVzZW50YW4gY29tbyBlamVzIGVuIGVsIHBsYW5vLCBtaWVudHJhcyBxdWUgbG9zIHZhbG9yZXMgcXVlIHRvbWFuIHNvbiBsb3MgcHVudGFqZXMgZGUgbGFzIGNvbXBvbmVudGVzLiBDb21vIHNlIGV4cGxpY2EgZW4gZWwgbWlzbW8gdHJhYmFqbywgbGFzIGRpc3RhbmNpYXMgZW50cmUgbG9zIHB1bnRvcyBkZWZpbmlkb3MgcG9yIGxvcyBwdW50YWplcyBkZSBsYXMgY29tcG9uZW50ZXMgdGllbmVuIHVuIHNpZ25pZmljYWRvIHJlbGV2YW50ZSBhbCBheXVkYXIgYSBlc3RhYmxlY2VyIHNlbWVqYW56YXMgZGUgcGVyZmlsZXMgZW4gbGFzIG9ic2VydmFjaW9uZXMgcmVhbGl6YWRhcy4NCg0KRXMgaW1wb3J0YW50ZSBkZXN0YWNhciBxdWUgbG9zIHZhbG9yZXMgc2VtZWphbnRlcyBkZSBsYXMgdmFyaWFibGVzIHB1ZWRlbiBkYXJzZSBzb2xvIGVuIGFsZ3VuYXMgZGUgZWxsYXMsIHNpbiBxdWUgc2VhIG5lY2VzYXJpbyBxdWUgc3VjZWRhIGVuIHRvZGFzLiBTaW4gZW1iYXJnbywgc2UgZXNwZXJhIHF1ZSBsYXMgZGlzdGFuY2lhcyBlbiBlbCBlc3BhY2lvIGRpbWVuc2lvbmFsIG9yaWdpbmFsIGRlIGxhcyBvYnNlcnZhY2lvbmVzIHF1ZWRlbiBiaWVuIHJlcHJlc2VudGFkYXMgZW4gZWwgZXNwYWNpbyByZWR1Y2lkbyBkZSBsYXMgY29tcG9uZW50ZXMuIEVzdGUgcHJvY2VzbyBkZSByZWR1Y2Npw7NuIGRpbWVuc2lvbmFsIGNvbnNlcnZhIGxhIGVzdHJ1Y3R1cmEgc3VieWFjZW50ZSBkZSBsYXMgcmVsYWNpb25lcyBlbnRyZSBsYXMgb2JzZXJ2YWNpb25lcywgbG8gcXVlIHBlcm1pdGUgdW5hIHJlcHJlc2VudGFjacOzbiBtw6FzIGNvbXBhY3RhIHkgY29tcHJlbnNpYmxlIGRlIGxvcyBkYXRvcyBtaWVudHJhcyBzZSBtYW50aWVuZW4gbGFzIGRpc3RhbmNpYXMgcmVsZXZhbnRlcyBwYXJhIGxhIGludGVycHJldGFjacOzbiBkZSBzZW1lamFuemFzIHkgZGlmZXJlbmNpYXMgZW50cmUgb2JzZXJ2YWNpb25lcy4NCg0KKipQbGFudGVhbWllbnRvIGRlbCBQcm9ibGVtYSoqDQoNCkNvbiBiYXNlIGVuIGxhcyB2YXJpYWJsZXMgY3VhbnRpdGF0aXZhcyBkZWwgY29uanVudG8gZGUgZGF0b3MgZGVzY3JpdG8gZW4gbGEgZmFzZSAxIHNlIHJlcXVpZXJlIGRlZmluaXIgZSBpbnRlcnByZXRhciBzdXMgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMuIExhIGRlZmluaWNpw7NuIGRlIGNhZGEgY29tcG9uZW50ZSBwcmluY2lwYWwgaW1wbGljYSBjb21wcmVuZGVyIGPDs21vIHNlIGNvbWJpbmFuIGxpbmVhbG1lbnRlIGxhcyB2YXJpYWJsZXMgb3JpZ2luYWxlcyBwYXJhIGZvcm1hcmxvcywgYXPDrSBjb21vIHN1IGNvbnRyaWJ1Y2nDs24gcmVsYXRpdmEgYSBsYSB2YXJpYWJpbGlkYWQgdG90YWwgZGUgbG9zIGRhdG9zLiBQb3Igb3RybyBsYWRvLCBsYSBpbnRlcnByZXRhY2nDs24gZGUgbG9zIGNvbXBvbmVudGVzIGltcGxpY2EgYW5hbGl6YXIgcXXDqSBhc3BlY3RvcyBvIHBhdHJvbmVzIGRlIGxvcyBkYXRvcyByZXByZXNlbnRhbiwgeSBjw7NtbyBzZSByZWxhY2lvbmFuIGNvbiBlbCBwcm9ibGVtYSBvIGZlbsOzbWVubyBlc3R1ZGlhZG8uDQoNCioqRGVzYXJyb2xsbyBkZWwgQW7DoWxpc2lzKioNCg0KTGEgbmF2ZWdhY2nDs24gYSB0cmF2w6lzIGRlIGxhcyBwZXN0YcOxYXMgcGVybWl0ZSB2aXN1YWxpemFyIG9iamV0b3MgZ3LDoWZpY29zIHkgbWF0cmljaWFsZXMgcXVlLCBhbCBpbmNsdWlyIGxvIGhlY2hvIGVuIGxhcyBzZWNjaW9uZXMgYW50ZXJpb3JlcywgYXl1ZGFuIGEgcm9idXN0ZWNlciBsYSBpbnRlcnByZXRhY2nDs24gZGUgbGFzIGNvbXBvbmVudGVzIGNhbGN1bGFkYXMuIENvbW8gc2UgbW9zdHLDsyBlbiBsYSAqKnNlY2Npw7NuIDIuMyoqLCBsYSBjYW50aWRhZCBkZSBjb21wb25lbnRlcyBzZWxlY2Npb25hZGFzIHNlIHJlZHVqbyAoc2Vnw7puIGVsIGNyaXRlcmlvIGRlIEthaXNlcikgYSBkb3MsIHkgc2UgZXN0YWJsZWNpw7MgcXVlIGxhIGNvbXBvbmVudGUgMSB5IDIgcmV0aWVuZSBlbCAkNDkkICQlJCBkZSBsYSB2YXJpYWJpbGlkYWQgZGUgbG9zIGRhdG9zLiBBc8OtLCBlbiBlbCBjw61yY3VsbyBkZSBjb3JyZWxhY2lvbmVzIGRlIGxhICoqc2VjY2nDs24gMi40Kiogc2Ugb2JzZXJ2YSBxdWUgbGEgcmVwcmVzZW50YWNpw7NuIGRlIGxhcyB2YXJpYWJsZXMgY29uanVnYWRhcyBlbiBsYSBjb21wb25lbnRlIDEgeSAyIGxhIGNvbmZpZ3VyYSBjb21vIHVuYSBkZSB0aXBvIHRhbWHDsW8sIGxvIHF1ZSBwdWVkZSBpbnRlcnByZXRhcnNlIGNvbW8gdW5hIGVzcGVjaWUgZGUgw61uZGljZSBkZSBwcm9wb3JjaW9uYWxpZGFkIGRpcmVjdGEuIEVzdG8gdGFtYmnDqW4gc2UgcmVzcGFsZGEgY29uIGVsIGhlY2hvIGRlIHF1ZSB0b2RhcyBsYXMgdmFyaWFibGVzIHByZXNlbnRhbiBjYWxpZGFkZXMgZGUgcmVwcmVzZW50YWNpw7NuIGVudHJlICoqMC40KiogeSAqKjAuNioqLiBFbiBjb25zZWN1ZW5jaWEsIGN1YW50byBtYXlvciBzZWEgZWwgdmFsb3IgZGUgbGFzIHZhcmlhYmxlcywgbWF5b3Igc2Vyw6EgbGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSBlbCBwYWNpZW50ZSBzZSBsZSBkaWFnbm9zdGlxdWUgaW5zdWZpY2llbmNpYSBjYXJkaWFjYS4gQXPDrSwgZGFkYSBsYSBuYXR1cmFsZXphIGRlIGxhcyB2YXJpYWJsZXMsIGVzdGFzIGNvbXBvbmVudGVzIHB1ZWRlIHJlcHJlc2VudGFyIHBhcmEgdW4gcGFjaWVudGUgbGEgcHJvYmFiaWxpZGFkIGRlIHN1ZnJpciBwcm9ibGVtYXMgY2FyZGlhY29zLiBBbCByZXNwZWN0bzoNCg0KTGFzIHBlc3Rhw7FhcyBkZSAqKkJpcGxvdCBWYXJpYWJsZXMgeSBSZWdpc3Ryb3MgVG90YWxlcyoqIGVuICoqUyoqIChTZXhvKSwgKipURFAqKiAoVGlwb19kb2xvcl9wZWNobyksICoqRUNHKiogKEVDR19yZXBvc28pLCAqKkFFKiogKEFuZ2luYV9FamVyY2ljaW8pLCAqKlBTVCoqIChQZW5kaV9TZWdtZV9TVF9FamVyY2ljaW8pIHkgKipDUyoqIChDbGFzZV9zYWxpZGEpLCBzZSBtdWVzdHJhbiBjb24gYmFzZSBlbiBsYXMgYWdydXBhY2lvbmVzIHF1ZSBlc3RhcyB2YXJpYWJsZXMgY2F0ZWdvcmljYXMgY3VhbGl0YXRpdmFzIHNlIHByZXN0YW4gcGFyYSBlc3RhYmxlY2VyIGxhIHJlcHJlc2VudGFjaW9uIGVuIHVuYSBkaW1lbmNpb25hbGlkYWQgcmVkdWNpZGEgZW4gZWwgcGxhbm8gZGUgZmFjdG9yZXMgZGUgcmVnaXN0cm9zIHkgZGltZW5jaW9uZXMgY29uIGJhc2UgZW4gbG9zIHB1bnRhamVzIHBvciBjb21wb25lbnRlcy4gRW4gZXN0ZSBzZW50aWRvLCBlcyBwb3NpYmxlIGFwcmVjaWFyIHF1ZSBsYXMgYWdydXBhY2lvbmVzIGNvbiBiYXNlIGVuICoqQ2xhc2Vfc2FsaWRhKiogeSAqKkFuZ2luYV9FamVyY2ljaW8qKiBjYXB0dXJhbiBkaWZlcmVuY2lhcyBhY2VudHVhZGFzIGVuIGxhIGRpc3RyaWJ1Y2lvbiBkZSBsYXMgb2JzZXJ2YWNpb25lcywgY29udHJhcmlvIGFsIHJlc3RvIGRlIGFncnVwYWNpb25lcyBhbnRlcmlvcm1lbnRlIG1lbnNpb25hZGFzLg0KDQpQb3IgdWx0aW1vLCBwYXJhIG1vc3RhciBkZSBtYW5lcmEgbWFzIGZhY2lsIGxhIHViaWNhY2lvbiBlbiBlbCBwbGFubyBkZSBjb21wb25lbnRlcyAoZW4gcGFydGljdWxhciwgc2llbXByZSBlc3RhIGNvbmZvcm1hZG8gcG9yIGxhcyBkb3MgY29tcG9uZW50ZXMgcG9yIGVsIGludGVyZXMgcXVlIHN1Y2l0YW4pIHksIGFzaSBtaXNtbywgbGFzIHNlbWVqYW56YXMgZGUgcGVyZmlsZXMgZGUgY29ycmVsYWNpb24gZW50cmUgY2FkYSB2YXJpYWJsZSwgc2UgZGlzcG9uZSBkZSBsYXMgcGVzdGHDsWFzIGRlICoqQ29vcmRlbmFkYXMgSW5kaXZpZHVhbGVzIFtTdWJjb25qdW50byBDU10qKiB5ICoqQmlwbG90IGRlIFZhcmlhYmxlcyB5IFJlZ2lzdHJvcyBbU3ViY29uanVudG8gQ1NdKiouIEVzdGFzIG11ZXN0cmFuLCBjb24gYmFzZSBlbiB1biBzdWJjb25qdW50byBkZSA2MSByZWdpc3Ryb3MgbXVlc3RyZWFkb3MgZGUgbWFuZXJhIGFsZWF0b3JpYSBzaW1wbGUsIGxvcyBwdW50YWplcyBwb3IgY29tcG9uZW50ZSB5IGVsIGJpcGxvdCBkZSBlc2Ugc3ViY29uanVudG8sIGNvbiBiYXNlIGVuIGxhIGFncnVwYWNpb24gcHJvdmlzdGEgcG9yIGxhIHZhcmlhYmxlIGNhdGVnb3JpY2EgKipDbGFzZV9zYWxpZGEqKiwgc2luIHBlcmRlciB1bmEgY2FudGlkYWQgc2lnbmlmaWNhdGl2YSBkZSBkZXRhbGxlcy4gRXN0bywgc2UgaW5zaXN0ZSBjb24gZWwgZmluIGRlIHZpc3VhbGl6YXIgbG9zIGRhdG9zIGRlIG1lam9yIG1hbmVyYSB5YSBxdWUgZWwgY29uanVudG8gb3JpZ2luYWwgcG9zZWUgbWFzIGRlIDkwMCByZWdpc3Ryb3MgeSBnZW5lcmEgdW5hIGRpZmljdWFsZGFkIGVuIGxhIGlkZW50aWZpY2FjaW9uIHZpc3VhbC4NCg0KIyMjIEJpcGxvdCBkZSBWYXJpYWJsZXMgeSBSZWdpc3Ryb3MgW1RvdGFsIFNdDQpgYGB7ciBCaXBsb3RfZGVfVmFyaWFibGVzX3lfUmVnaXN0cm9zX1RvdGFsX1MsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KZGF0YV9IRCA8LSBoZWFydF9kaXNlYXNlc19EYXRhc2V0WywtYygzLDcsOSwxMSwxMildDQpkYXRhX0FsbCA8LSBjYmluZChoZWFydF9kaXNlYXNlc19EYXRhc2V0WywtYygyLDMsNyw5LDExLDEyKV0sIGRhdGFfSEQkU2V4bykNCmZ2aXpfcGNhX2JpcGxvdChQQ0EoZGF0YV9BbGwsIG5jcCA9IDYsIHNjYWxlLnVuaXQgPSBUUlVFLCBncmFwaCA9IEYsIHF1YWxpLnN1cCA9IDcpLCBheGVzID0gYygxLCAyKSwgcmVwZWwgPSBUUlVFLCBoYWJpbGxhZ2UgPSA3KQ0KYGBgDQoNCiMjIyBCaXBsb3QgZGUgVmFyaWFibGVzIHkgUmVnaXN0cm9zIFtUb3RhbCBURFBdDQpgYGB7ciBCaXBsb3RfZGVfVmFyaWFibGVzX3lfUmVnaXN0cm9zX1RvdGFsX1REUCwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpkYXRhX0hEIDwtIGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRbLC1jKDIsNyw5LDExLDEyKV0NCmRhdGFfQWxsIDwtIGNiaW5kKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRbLC1jKDIsMyw3LDksMTEsMTIpXSwgZGF0YV9IRCRUaXBvX2RvbG9yX3BlY2hvKQ0KZnZpel9wY2FfYmlwbG90KFBDQShkYXRhX0FsbCwgbmNwID0gNiwgc2NhbGUudW5pdCA9IFRSVUUsIGdyYXBoID0gRiwgcXVhbGkuc3VwID0gNyksIGF4ZXMgPSBjKDEsIDIpLCByZXBlbCA9IFRSVUUsIGhhYmlsbGFnZSA9IDcpDQpgYGANCg0KIyMjIEJpcGxvdCBkZSBWYXJpYWJsZXMgeSBSZWdpc3Ryb3MgW1RvdGFsIEVDR10NCmBgYHtyIEJpcGxvdF9kZV9WYXJpYWJsZXNfeV9SZWdpc3Ryb3NfVG90YWxfRUNHLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCmRhdGFfSEQgPC0gaGVhcnRfZGlzZWFzZXNfRGF0YXNldFssLWMoMiwzLDksMTEsMTIpXQ0KZGF0YV9BbGwgPC0gY2JpbmQoaGVhcnRfZGlzZWFzZXNfRGF0YXNldFssLWMoMiwzLDcsOSwxMSwxMildLCBkYXRhX0hEJEVDR19yZXBvc28pDQpmdml6X3BjYV9iaXBsb3QoUENBKGRhdGFfQWxsLCBuY3AgPSA2LCBzY2FsZS51bml0ID0gVFJVRSwgZ3JhcGggPSBGLCBxdWFsaS5zdXAgPSA3KSwgYXhlcyA9IGMoMSwgMiksIHJlcGVsID0gVFJVRSwgaGFiaWxsYWdlID0gNykNCmBgYA0KDQojIyMgQmlwbG90IGRlIFZhcmlhYmxlcyB5IFJlZ2lzdHJvcyBbVG90YWwgQUVdDQpgYGB7ciBCaXBsb3RfZGVfVmFyaWFibGVzX3lfUmVnaXN0cm9zX1RvdGFsX0FFLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCmRhdGFfSEQgPC0gaGVhcnRfZGlzZWFzZXNfRGF0YXNldFssLWMoMiwzLDcsMTEsMTIpXQ0KZGF0YV9BbGwgPC0gY2JpbmQoaGVhcnRfZGlzZWFzZXNfRGF0YXNldFssLWMoMiwzLDcsOSwxMSwxMildLCBkYXRhX0hEJEFuZ2luYV9FamVyY2ljaW8pDQpmdml6X3BjYV9iaXBsb3QoUENBKGRhdGFfQWxsLCBuY3AgPSA2LCBzY2FsZS51bml0ID0gVFJVRSwgZ3JhcGggPSBGLCBxdWFsaS5zdXAgPSA3KSwgYXhlcyA9IGMoMSwgMiksIHJlcGVsID0gVFJVRSwgaGFiaWxsYWdlID0gNykNCmBgYA0KDQojIyMgQmlwbG90IGRlIFZhcmlhYmxlcyB5IFJlZ2lzdHJvcyBbVG90YWwgUFNTRV0NCmBgYHtyIEJpcGxvdF9kZV9WYXJpYWJsZXNfeV9SZWdpc3Ryb3NfVG90YWxfUFNTRSwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpkYXRhX0hEIDwtIGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRbLC1jKDIsMyw3LDksMTIpXQ0KZGF0YV9BbGwgPC0gY2JpbmQoaGVhcnRfZGlzZWFzZXNfRGF0YXNldFssLWMoMiwzLDcsOSwxMSwxMildLCBkYXRhX0hEJFBlbmRpX1NlZ21lX1NUX0VqZXJjaWNpbykNCmZ2aXpfcGNhX2JpcGxvdChQQ0EoZGF0YV9BbGwsIG5jcCA9IDYsIHNjYWxlLnVuaXQgPSBUUlVFLCBncmFwaCA9IEYsIHF1YWxpLnN1cCA9IDcpLCBheGVzID0gYygxLCAyKSwgcmVwZWwgPSBUUlVFLCBoYWJpbGxhZ2UgPSA3KQ0KYGBgDQoNCiMjIyBCaXBsb3QgZGUgVmFyaWFibGVzIHkgUmVnaXN0cm9zIFtUb3RhbCBDU10NCmBgYHtyIEJpcGxvdF9kZV9WYXJpYWJsZXNfeV9SZWdpc3Ryb3NfVG90YWxfQ1MsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KZGF0YV9IRCA8LSBoZWFydF9kaXNlYXNlc19EYXRhc2V0WywtYygyLDMsNyw5LDExKV0NCmRhdGFfQWxsIDwtIGNiaW5kKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRbLC1jKDIsMyw3LDksMTEsMTIpXSwgZGF0YV9IRCRDbGFzZV9zYWxpZGEpDQpmdml6X3BjYV9iaXBsb3QoUENBKGRhdGFfQWxsLCBuY3AgPSA2LCBzY2FsZS51bml0ID0gVFJVRSwgZ3JhcGggPSBGLCBxdWFsaS5zdXAgPSA3KSwgYXhlcyA9IGMoMSwgMiksIHJlcGVsID0gVFJVRSwgaGFiaWxsYWdlID0gNykNCmBgYA0KDQojIyMgQ29vcmRlbmFkYXMgSW5kaXZpZHVhbGVzIFtTdWJjb25qdW50byBDU10NCmBgYHtyIENvb3JkZW5hZGFzX0luZGl2aWR1YWxlc19TdWJjb25qdW50bywgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpzZXQuc2VlZCg3ODA3MjgpDQpkYXRhXzYxX0hEIDwtIGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRbc2FtcGxlKDE6bnJvdyhoZWFydF9kaXNlYXNlc19EYXRhc2V0KSw2MSksLWMoMiwzLDcsOSwxMSldDQpzZXQuc2VlZCg3ODA3MjgpDQpkYXRhXzYxIDwtIGNiaW5kKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRbc2FtcGxlKDE6bnJvdyhoZWFydF9kaXNlYXNlc19EYXRhc2V0KSw2MSksLWMoMiwzLDcsOSwxMSwxMildLCBkYXRhXzYxX0hEJENsYXNlX3NhbGlkYSkNCmhlYWQoUENBKGRhdGFfNjEsIG5jcCA9IDYsIHNjYWxlLnVuaXQgPSBULCBncmFwaCA9IEYsIHF1YWxpLnN1cCA9IDcpJGluZCRjb29yZCwgbiA9IDYxTCkNCmBgYA0KDQojIyMgQmlwbG90IGRlIFZhcmlhYmxlcyB5IFJlZ2lzdHJvcyBbU3ViY29uanVudG8gVVJdDQpgYGB7ciBCaXBsb3RfZGVfVmFyaWFibGVzX3lfUmVnaXN0cm9zX1N1YmNvbmp1bnRvLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCnNldC5zZWVkKDc4MDcyOCkNCmRhdGFfNjFfSEQgPC0gaGVhcnRfZGlzZWFzZXNfRGF0YXNldFtzYW1wbGUoMTpucm93KGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQpLDYxKSwtYygyLDMsNyw5LDExKV0NCnNldC5zZWVkKDc4MDcyOCkNCmRhdGFfNjEgPC0gY2JpbmQoaGVhcnRfZGlzZWFzZXNfRGF0YXNldFtzYW1wbGUoMTpucm93KGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQpLDYxKSwtYygyLDMsNyw5LDExLDEyKV0sIGRhdGFfNjFfSEQkQ2xhc2Vfc2FsaWRhKQ0KZnZpel9wY2FfYmlwbG90KFBDQShkYXRhXzYxLCBuY3AgPSA2LCBzY2FsZS51bml0ID0gVCwgZ3JhcGggPSBGLCBxdWFsaS5zdXAgPSA3KSwgYXhlcyA9IGMoMSwgMiksIHJlcGVsID0gVCwgaGFiaWxsYWdlID0gNykNCmBgYA0KDQojICoqRmFzZSAzIFtDb3JyZXNwb25kZW5jaWFzXSoqDQoNCiMjICoqMy4xLiBPYmpldGl2b3MqKg0KDQpFbiB0w6lybWlub3MgZ2VuZXJhbGVzLCBlc3RhIHRlcmNlcmEgZXRhcGEgZGUgZXN0dWRpbyBwcmVzZW50YXLDoSBjw6FsY3Vsb3MsIHZpc3VhbGl6YWNpb25lcyBlIGludGVycHJldGFjaW9uZXMgYmFzYWRhcyBlbiBlbCBjb25qdW50byBkZSBkYXRvcyB0cmF0YWRvIGVuIGxhcyAqKmZhc2VzIDEgeSAyKiouIEVuIGVzdGEgZmFzZSwgc2UgdXRpbGl6YXLDoSB1biBlbmZvcXVlIGRlIGFuw6FsaXNpcyBkZSBjb3JyZXNwb25kZW5jaWFzIHNpbXBsZXMgeSBtw7psdGlwbGVzIGFwbGljYWRvIGEgbGFzIHZhcmlhYmxlcyBjdWFsaXRhdGl2YXMuIEVzdGUgYW7DoWxpc2lzIGluY2x1aXLDoSBsYSBjb25zdHJ1Y2Npw7NuIGRlIHRhYmxhcyBkZSBjb250aW5nZW5jaWEgeSB0YWJsYXMgZGlzeXVudGl2YXMgY29tcGxldGFzLCBhc8OtIGNvbW8gbGEgZXZhbHVhY2nDs24gZGUgbGFzIGNhbGlkYWRlcyBkZSByZXByZXNlbnRhY2nDs24sIGNvbnRyaWJ1Y2lvbmVzIHkgbGFzIGNvcnJlc3BvbmRpZW50ZXMgaW50ZXJwcmV0YWNpb25lcy4gRXMgaW1wb3J0YW50ZSByZWNvcmRhciBxdWUgZWwgY29uanVudG8gZGUgZGF0b3MgZGUgdHJhYmFqbyBlc3TDoSBkZXNjcml0byBlbiBsYSBzZWNjacOzbiAyIHkgbG9zIGZ1bmRhbWVudG9zIHRlw7NyaWNvcyBzZSBlbmN1ZW50cmFuIGVuIGxhIHNlY2Npw7NuIDEuDQoNCiMjICoqMy4yLiBDb3JyZXNwb25kZW5jaWFzIFNpbXBsZXMqKiB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQpTZSBzYWJlIHF1ZSBlbCAqKmFuw6FsaXNpcyBkZSBjb3JyZXNwb25kZW5jaWFzIHNpbXBsZSAoQUNTKSoqIGJ1c2NhIHJlcHJlc2VudGFyIGVuIHVuIGVzcGFjaW8gbXVsdGlkaW1lbnNpb25hbCByZWR1Y2lkbyBsYSByZWxhY2nDs24gZXhpc3RlbnRlIGVudHJlIGxhcyBjYXRlZ29yw61hcyBkZSB1biBwYXIgZGUgdmFyaWFibGVzIGNhdGVnw7NyaWNhcy4gRW4gZXN0ZSBzZW50aWRvLCBlbCBBQ1MgbXVlc3RyYSBsYXMgZGlzdGFuY2lhcyBlbnRyZSBsb3Mgbml2ZWxlcyBkZSBkb3MgdmFyaWFibGVzIGNhdGVnw7NyaWNhcyB5LCBlbiBjb25zZWN1ZW5jaWEsIGF5dWRhIGEgdmlzdWFsaXphciB0YWJsYXMgZGUgY29udGluZ2VuY2lhLiBBZGVtw6FzLCBzZSBlc3RhYmxlY2UgcXVlIGVsIG7Dum1lcm8gbcOheGltbyBkZSBkaW1lbnNpb25lcyBxdWUgZXhwbGlxdWVuIGxhIGFzb2NpYWNpw7NuIGVudHJlIGxhcyB2YXJpYWJsZXMgZmlsYSB5IGNvbHVtbmEgZXMgaWd1YWwgYSB1bm8gbWVub3MgZWwgbWVub3IgbsO6bWVybyBkZSBjYXRlZ29yw61hcyBkZSBhbGd1bmEgZGUgbGFzIHZhcmlhYmxlcyBpbnZvbHVjcmFkYXMuIFBvciBsbyB0YW50bywgZWwgYW7DoWxpc2lzIGRlIGNvcnJlc3BvbmRlbmNpYXMgcGVybWl0ZSBkZXNjcmliaXIgbGEgcHJveGltaWRhZCBleGlzdGVudGUgZW50cmUgbG9zIHBlcmZpbGVzIGRlIGxvcyBvYmpldG9zIG9ic2VydmFkb3MuDQoNCkVsIEFDUywgcXVlIGJhc2Egc3VzIGPDoWxjdWxvcyBlbiB0YWJsYXMgZGUgY29udGluZ2VuY2lhLCBwdWVkZSBleHRlbmRlcnNlIGEgbcOhcyBkZSBkb3MgdmFyaWFibGVzIGNhdGVnw7NyaWNhcywgbG8gY3VhbCBzZSBjb25vY2UgY29tbyBhbsOhbGlzaXMgZGUgY29ycmVzcG9uZGVuY2lhcyBtw7psdGlwbGVzIChBQ00pLCBiYXNhZG8gZW4gdW5hIGVzdHJ1Y3R1cmEgbGxhbWFkYSB0YWJsYSBkaXN5dW50aXZhIGNvbXBsZXRhLg0KDQpFc3RhIHNlY2Npw7NuIHRyYXRhIGVsIGFuw6FsaXNpcyBkZSBjb3JyZXNwb25kZW5jaWFzIHNpbXBsZXMgYmFzw6FuZG9zZSBlbiBwYXJlcyBkZSB2YXJpYWJsZXMgY2F0ZWfDs3JpY2FzIGRlbCBjb25qdW50byBkZSBkYXRvcyBkZXNjcml0by4NCg0KKipQbGFudGVhbWllbnRvIGRlbCBwcm9ibGVtYSoqDQoNCkEgcGFydGlyIGRlIGxhcyB2YXJpYWJsZXMgY3VhbGl0YXRpdmFzIGRlbCBjb25qdW50byBkZSBkYXRvcyBkZXNjcml0bywgc2UgcmVxdWllcmUgZGVzYXJyb2xsYXIgdW4gYW7DoWxpc2lzIGRlIGNvcnJlc3BvbmRlbmNpYXMgc2ltcGxlLiBFc3RlIGFuw6FsaXNpcyBzZSBiYXNhcsOhIGVuIHRhYmxhcyBkZSBjb250aW5nZW5jaWEgeSBkZSBmcmVjdWVuY2lhcyByZWxhdGl2YXMsIHkgc2UgYXBveWFyw6EgZW4gZ3LDoWZpY29zIGRlIHBlcmZpbGVzIHkgZGUgcHVudG9zIHN1cGVycHVlc3RvcyBlbiBlbCBwcmltZXIgcGxhbm8gZmFjdG9yaWFsLg0KDQoqKkRlc2Fycm9sbG8gZGVsIGFuw6FsaXNpcyoqDQoNCkNvbiBiYXNlIGVuIGxhIG5hdmVnYWNpb24gZW4gcGVzdGHDsWFzIGVzdGEgbm9zIHBlcm1pdGlyYSB2aXN1YWxpemFyIG9iamV0b3MgbWF0cmljaWFsZXMgeSBncmFmaWNvcyBxdWUgbm9zIGF5dWRhcmFuIGEgZGFybGUgcGVzbyBhIGxhIGludGVycHJldGFjaW9uIGRlbCBhbsOhbGlzaXMgZGUgY29ycmVzcG9uZGVjaWFzIHNpbXBsZXMgbyBiaW5hcmlhcyBlbnRyZSBjYWRhIHBhciBkZSB2YXJpYWJsZXMgY2F0ZWdvcmljYXMgcXVlIG1vc3RyYXJvbiBtYXlvciByZWxldmFuY2lhIGVuIGVsIGJpcGxvdCBkZSBsYSAqKnNlY2Npb24gMi41KiogZGVsIGNvbmp1bnRvIGRlIGRhdG9zOiAqKlNleG8qKiwgKipBbmdpbmlhX0VqZXJjY2lvKiogeSAqKkNsYXNlX3NhbGlkYSoqLiBQb3Igc2VyIHVuYSBiYWphIGNhbnRpZGFkIGRlIHZhcmlhYmxlcyBzZSB0cmFiYWphcmEgY29uIGxhcyBwYXJlamFzIGNvbWJpbmFkYXMgc2luIHJlcGV0aWNpb24gZGUgZXN0YXMgdHJlcyB2YXJpYWJsZXMuDQoNCkxhIHBlc3Rhw7FhICoqQUMgUGFyZWphcyBUb3RhbGVzKiogYWdydXBhIGxvcyBjYWxjdWxvcyBwYXJhIHRvdGFzIGxhcyBjb21iaW5hY2lvbmVzIGRlIHBhcmVqYXMgdmFyaWFibGVzLiBFbiBwYXJ0aWN1bGFyIGVuICoqQ29udGluZ2VuY2lhcyoqIHBhcmEgZGFybm9zIHVuIGVqZW1wbG8gaGFyZW1vcyB1bmEgbGVjdHVyYSBkZSBsYXMgdGFibGFzIGRlIGNvbnRpZ2VuY2lhOiBMYSB0YWJsYSBkZSBjb250aW5nZW5jaWEgKipTZXhvKiogdnMuICoqQW5naW5hX0VqZXJjaWNpbyoqIHNlIGVuY29udHJvIHF1ZSA0MyBwYWNpZW50ZXMgZGUgdW4gdG90YWwgZGUgMTkzIGRlbCBzZXhvIGZlbWVuaW5vIHByZXNlbnRhcm9uIGRvbG9yIGFuZ2lub3NvIGEgbGEgaG9yYSByZWFsaXphciBlamVyY2ljaW87IGFkZW1hcywgZGUgbG9zIDU0NiBwYWNpZW50ZXMgcXVlIG5vIHByZXNlbnRhcm9uIGRvbG9yIGFuZ2lub3NvIGEgbGEgaG9yYSBkZSBoYWNlciBlamVyY2ljaW8gMTUwIHNvbiBkZWwgc2V4byBmZW1lbmlubyB5IDM5NiBkZWwgc2V4byBtYXNjdWxpbm8sIGRlIHVuIHRvdGFsIGRlIDkxNyBwYXNpZW50ZXMuIEVuIGxhIHRhYmxhIGRlIGNvbnRpbmdlbmNpYSAqKlNleG8qKiB2cy4gKipDbGFzZV9zYWxpZGEqKiBzZSBlbmNvbnRybyBxdWUgZGUgdW4gdG90YWwgZGUgNzI0IHBhc2llbnRlcyBkZWwgc2V4byBtYXNjdWxpbm8sIDQ1NyBwcmVzZW50YXJvbiB1bmEgc2FsaWRhIGNvbiBlbmZlcm1lZGFkIGNhcmRpYWNhLiBhZGVtYXMsIGRlIGxvcyA5MTcgcGFzaWVudGVzLCA1MDcgcHJlc2VudGFyb24gc2FsaWRhIGNvbiBlbmZlcm1lZGFkIGNhcmRpYWNhIHkgNDEwIGNvbiB1bmEgc2FsaWRhIG5vcm1hbC4gRW4gbGEgdGFibGEgZGUgY29udGluZ2VuY2lhICoqQW5naW5hX0VqZXJjaWNpbyoqIHZzLiAqKkNsYXNlX3NhbGlkYSoqIHNlIGVuY29udHJvIHF1ZSBkZSBsb3MgMzcxIHF1ZSBwcmVzZW50YXJvbiBhbmdpbmlhIGEgbGEgaG9yYSBkZSByZWFsaXphciBlamVyY2ljaW8gMzE2IHBhY2llbnRlcyB0dXZpZXJvbiB1bmEgc2FsaWRhIGNvbiBlbmZlcm1lZGFkIGNhcmRpYWNhOyBhZGVtYXMsIGRlIGxvcyA1NDYgcGFzaWVudGVzIHF1ZSBubyBwcmVzZW50YXJvbiBhbmdpbmlhIHNvbG8gMzU1IHR1dmllcm9uIHVuYSBzYWxpZGEgbm9ybWFsLg0KDQpTaSB0b21hbW9zIGNvbW8gYmFzZSBsYXMgdGFibGFzIGRlIGNvbnRpbmdlbmNpYSBhbnRlcyBtZW5jaW9uYWRhcywgc2UgcHJlc2VudGEgYSB0cmF2ZXMgZGUgdW5hIHN1YnBlc3Rhw7FhcyBsYSAqKlByb2JhYmlsaWRhZGVzKiogbGFzIHByb3BvcmNpb25lcyByZWxhdGl2YXMgZW4gdGVybWlub3MgZGUgbG9zIHBhcmVzIGRlIHZhcmlhYmxlcyBxdWUgc2UgZXhhbWluYXJvbiBjb24gYW50ZXJpb3JpZGFkLiBFbiBjb25jb3JkYW5jaWEgY29uIGVzdG8sIGEgbml2ZWwgZGUgZWplbXBsbyBzZSBwcmVzZW50YSBhbGd1bmFzIGxlY3R1cmFzIGRlIGxvcyByZXN1bHRhZG9zOiBlbiBsYSB0YWJsYSBkZSBwcm9iYWJpbGlkYWRlcyAqKnNleG8qKiB2cy4gKipBbmdpbmFfRWplcmNpY2lvKiogZWwgJDQwLDQ2JCAkJSQgYXByb3hpbWFkYW1lbnRlIHByZXNlbnRvIGFuZ2luYSBwb3IgZWplcmNpY2lvIGRlIGxvcyBjdWFsZXMgZWwgJDM1LDc3JCAkJSQgYXByb3hpbWFkYW1lbnRlIHNvbiBkZSBzZXhvIG1hc2N1bGlubzsgYWRlbWFzLCBlbmNvbnRyYW1vcyBxdWUgZWwgJDc4LDk1JCAkJSQgYXByb3hpbWFkYW1lbnRlIHNvbiBwYXNpZW50ZXMgZGVsIHNleG8gbWFzY3VsaW5vIGVuIGVsIGNvbmp1bnRvIGRlIGRhdG9zLCBlbiBsYSB0YWJsYSBkZSBwcm9iYWJpaWRhZGVzICoqU2V4byoqIHZzLiAqKkNsYXNlX3NhbGlkYSoqIHNlIGVuY29udHJvIHF1ZSBkZSB1biAkNTUsMjYkICQlJCBhcHJveGltYWRhbWVudGUgZWwgJDQ5LDk0JCAkJSQgc29uIGRlIHNleG8gbWFzY3VsaW5vOyBhZGVtYXMsIGVsICQ3OCw5NSQgJCUkIGRlIGxvcyBwYXNpZW50ZXMgc29uIGRlIHNleG8gbWFzY3VsaW5vLCBsYSB0YWJsYSBkZSBwcm9iYWJpbGlkYWRlcyAqKkFuZ2luYV9FamVyY2ljaW8qKiB2cy4gKipDbGFzZV9zYWxpZGEqKiBzZSBlbmNvbnRybyBxdWUgZWwgJDQwLDQ2JCAkJSQgZGUgbG9zIHBhY2llbnRlcyB0dXZvIGFuZ2luYSBwb3IgZWplcmNpY2lvIGFkaWNpb25hbCBhIGVsbG8gJDM0LDQ2JCAkJSQgc29uIGRlIHNleG8gbWFzY3VsaW5vLg0KDQpEZSBsYSBtaXNtYSBmb3JtYSBxdWUgb2N1cnJpbyBjb24gbGFzIHRhYmxhcyBkZSBwcm9iYWJpbGlkYWRlcywgZW4gbGEgc3VicGVzdGHDsWEgKipGcmVjdWVuY2lhcyBbQ1BGIHkgQ1BDXSoqIGxhcyBmcmVjdWVuY2lhcyBjb25kaWNpb25hZGFzIHBvciBmaWxhcyB5IGNvbHVtbmFzIGRlIG1hbmVyYSByZXNwZWN0aXZhLCBzZSBjYWxjdWxhcm9uIGNvbiBiYXNlIGVuIGxhcyB0YWJsYXMgZGUgY29udGluZ2VuY2lhIFNpZ3VpZW5kbyBjb24gZXN0byBtaXNtbyBzZSBoYXJhIHVuYSBsZWN0b3JhIGNvbW8gZWplbXBsbyBkZSBsb3MgcmVzdWx0YWRvczogc2VndW4gbGEgbWF0cml6IGRlIGZyZWN1ZW5jaWFzIENQRiBkZSAqKlNleG8qKiB2cy4gKipBbmdpbmFfRWplcmNpY2lvKiogZWwgJDc3LDcyJCAkJSQgZGUgbG9zIHBhY2llbnRlcyBkZSBzZXhvIGZlbWVuaW5vIG5vIG11ZXN0cmFzIGFuZ2luYSBwb3IgZWplcmNpY2lvIG1pZW50cmFzIHF1ZSBlbCAkMjIsMjgkICQlJCBzaSBsYSBwcmVzZW50YSwgZW4gZWwgY2FzbyBkZSBsb3MgcGFjaWVudGVzIGRlIHNleG8gbWFzY3VsaW5vIGVsICQ1NCw3JCAkJSQgbm8gbGEgcHJlc2VudGEgeSBlbCAkNDUsMzAkICQlJCBzaSBwcmVzZW50YSBhbmdpbmEgcG9yIGVqZXJjaWNpbzsgcG9yIG90cm8gbGFkbyBlbiBsYSBDUEMgdGVuZW1vcyBhIGxvcyBwYWNpZW50ZXMgZGUgc2V4byBtYXN1Y3VsaW5vIHF1ZSBwcmVzZW50YW4gdW4gJDg4LDQxJCAkJSQgZGUgcHJlc2VudGFyIGFuZ2luaWEgcG9yIGVqZXJjaWNpbzsgcG9yIG90cm8gbGFkbyBlbCAkNzcsNTMkICQlJCBkZSBsb3MgcGFjaWVudGVzIHF1ZSBubyBwcmVzZW50YW4gYW5naW5hIHBvciBlamVyY2ljaW8gc29uIGRlIHNleG8gbWFzY3VsaW5vIHkgZWwgJDI3LDQ3JCAkJSQgc29uIGRlIHNleG8gZmVtZW5pbm8sIGFob3JhIGVuIGxlIGNhc28gZGUgbG9zIHBhY2llbnRlcyBxdWUgbGEgcHJlc2VudGFuIGVsICQ4OCw0MSQgJCUkIHNvbiBkZSBzZXhvIG1hc2N1bGlubywgZXN0byBub3MgaW5kaWNhIHF1ZSBoYXkgbWFzIHByZXZhbGVuY2lhIGRlIHN1ZmlyIGRlIGFuZ2luYSBwb3IgZWplcmNpY2lvIHNlZ3VuIGVsIHNleG8gZGVsIHBhY2llbnRlLCBzZWd1biBsYSBtYXRyaXogZGUgZnJlY3VlbmNpYXMgQ1BGICoqU2V4byoqIHZzLiAqKkNsYXNlX3NhbGlkYSoqIGVuIGN1YW50byBhIHBhY2llbnRlcyBkZSBzZXhvIG1hc3VjdWxpbm8gIGVsICQ2MywxMiQgJCUkIHByZXNlbnRhcm9uIHVuYSBzYWxpZGEgY29uIGVuZmVybWVkYWQgY2FyZGlhY2EsIGVsIGNhc28gZGUgbG9zIHBhY2llbnRlcyBkZSBzZXhvIGZlbWVuaW5vIGVsICQ3NCwwOSQgJCUkIHByZXNlbnRhcm9uIHVuYSBzYWxpZGEgbm9ybWFsOyBwb3Igb3RybyBsYWRvIGVuIGxhIENQQyB0ZW5lbW9zIHF1ZSBlbCAkOTAsMTQkICQlJCBkZSBsb3MgcGFjaWVudGVzIHF1ZSBzYWxpZXJvbiBjb24gZW5mZXJkYWQgY2FyZGlhY2EgZnVlcm9uIGRlIHNleG8gbWFzY3VsaW5vIHkgcGFyYSBlbCBzZXhvIGZlbWVuaW5vIGVsICQzNCw4OCQgJCUkIHR1dm8gdW5hIHNhbGlkYSBub3JtYWwsIHNlZ3VuIGxhIG1hdHJpeiBkZSBmcmVjdWVuY2lhcyBDUEYgZGUgKipBbmdpbmFfRWplcmNpY2lvKiogdnMuICoqQ2xhc2Vfc2FsaWRhKiogZWwgJDg1LDE4JCAkJSQgZGUgbG9zIHF1ZSBwcmVzZW50YXJvbiBhbmdpbmEgcG9yIGVqZXJjaWNpbyB5IHByZXNlbnRhcm9uIHVuYSBzYWxpZGEgY29uIGVuZmVybWVkYWQgY2FyZGlhY2EsIHkgZWwgJDY1LDAyJCAkJSQgZGUgbG9zIHF1ZSBubyBwcmVzZW50YXJvbiBhbmdpbmEgcG9yIGVqZXJjaWNpbyB5IHR1dmllcm9uIHVuYSBzYWxpZGEgbm9ybWFsLCBwb3Igb3RybyBsYWRvIGxhIENQQyB0ZW5lbW9zIHF1ZSBkZSBsb3MgcXVlIHR1dmllcm9uIHVuYSBjbGFzZSBkZSBzYWxpZGEgY29uIGVuZmVybWVkYWQgY2FyZGlhY2EgZWwgJDYyLDMzJCAkJSQgcHJlc2VudG8gYW5naW5hIHBvciBlamVyY2ljaW8gbWllbnRyYXMgcXVlIGVsICQzNyw2NyQgJCUkIHF1ZSB0dXZvIGVzdGEgc2FsaWRhIG5vIHByZXNlbnRvIGFuZ2luYSBwb3IgZWplcmNpY2lvLg0KDQpDb24gYmFzZSBlbiBsYXMgbWF0cmljZXMgZGUgZnJlY3VlbmNpYSBzZSBlbnRpZW5kZW4gbG9zIHBlcmZpbGVzIGNvbmRpY2lvbmFkb3MgcG9yIGZpbGFzIHkgY29sdW1uYXMgcXVlIHNlIG11ZXN0cmFuIGVuIGxhIHN1YnBlc3Rhw7FhICoqUGVyZmlsZXMgW0NQRiB5IENQQ10qKi4gTG9zIGdyYWZpY29zIGRlIHBlcmZpbGVzIHNlIG11ZXN0cmFuIGVuIGVsIG1pc21vIG9yZGVuIGRlIGxvIGFudGVyaW9ybWVudGUgbWVuc2lvbmFkby4gU2luIGVtYmFyZ28sIGVuIGxvcyBncmFmaWNvcyBkZSBwZXJmaWxlcyBzZSBwdWVkZW4gY290ZWphciBsYXMgcHJvcG9yY2lvbmVzIGNvbnRyYSB1biBpbmRpdmlkdW8gcHJvbWVkaW8gbyB1biBwZXJmaWwgcHJvbWVkaW8gZWwgY3VhbCBzZSB2YSBhIGV0aXF1ZXRhciBjb21vICoqbWFyZyoqLiBDb24gZXN0byBkaWNobywgbG9zIHBlcmZpbGVzIGZpbGEgeSBjb2x1bW5hIHF1ZSBjb3JyZXNwb25kZW4gYSBsYXMgdmFyaWFibGVzICoqU2V4byoqIHkgKipBbmdpbmFfRWplcmNpY2lvKiogbXVlc3RyYW4gdWEgZGlzdHJpYnVjaW9uIG1hcmdpbmFsIHVuIHBvY28gYWxlamFkYXMgZW50cmUgc2k7IGVzIGRlY2lyLCBzaSBzb24gY2FsY3VsYWRhcyBsYXMgcHJvcG9yY2lvbmVzIHRvdGFsZXMgc2VyYW4gdW4gcG9jbyBkaXN0aW50YXMgZW50cmUgc2ksIHBvciBlamVtcGxvOiAoUGVyZmlsZXMgRmlsYSkgbGEgcHJvcG9yY2lvbiBkZSBwYWNpZW50ZXMgZGUgc2V4byBtYXNjdWxpbm8geSBmZW1lbmlubyBxdWUgc2kgcHJlc2VudGFyb24gYW5naW5hIHBvciBlamVyY2ljaW8gc29uICQyMiw0NyQgJCUkIHkgJDQ1LDMwJCAkJSQgcmVzcGVjdGl2YW1lbnRlOyBhZGVtYXMsIChwZXJmaWxlcyBjb2x1bW5hKSBsYSBwcm9wb3JjaW9uIGRlIHBhc2llbnRlcyBkZSBzZXhvIG1hc2N1bGlubyBxdWUgbm8gcHJlc2VudGFyb24geSBzaSBwcmVzZW50YXJvbiBhbmdpbmEgcG9yIGVqZXJjaWNpbyBzb24gJDcyLDUzJCAkJSQgeSAkODgsNDEkICQlJCByZXNwZWN0aXZhbWVudGUuIERlIGxhIG1pc21hIGZvcm1hLCBsb3MgcGVyZmlsZXMgZmlsYSB5IGNvbHVtbmEgcXVlIGNvcnJlc3BvbmRlbiBjb24gbGFzIHZhcmlhYmxlcyAqKlNleG8qKiB5ICoqQ2xhc2Vfc2FsaWRhKiogbXVlc3RyYW4gdW5hIGRpc3RyaWJ1Y2lvbiBtYXJnaW5hbCB1biBwb2NvIGFsZWphZGFzIGVudHJlIHNpLCBwb3IgZWplbXBsbzogKHBlcmZpbGVzIGZpbGEpIGxhcyBwcm9wb3JjaW9uZXMgZGUgcGFzaWVudGVzIGRlIHNleG8gbWFzY3VsaW5vIHkgZmVtZW5pbm8gcXVlIHByZXNlbnRhcm9uIHVuYSBzYWxpZGEgY29uIGVuZmVybWVkYWQgY2FyZGlhY2Egc29uICQ2MywxMiQgJCUkIHkgJDI1LDkxJCAkJSQgZGUgbWFuZXJhIHJlc3BlY3RpdmE7IGFkZW1hcywgKFBlcmZpbGVzIENvbHVtbmEpIGxhIHByb3BvcmNpb24gZGUgcGFjaWVudGVzIGRlIHNleG8gbWFzY3VsaW5vIHF1ZSBwcmVzZW50YXJvbiB1bmEgY2xhc2UgZGUgc2FsaWRhIHBvciBlbmZlcm1lZGFkIGNhcmRpYWNhIHkgbm9ybWFsIGVzICQ5MCwxNCQgJCUkIHkgJDY1LDEyJCAkJSQgZGUgbWFuZXJhIHJlc3BlY3RpdmEsIGRlIGxhIG1pc21hIGZvcm1hIGxvcyBwZXJmaWxlcyBmaWxhIHkgY29sdW1uYSBxdWUgY29ycmVzcG9uZGVuIGNvbiBsYXMgdmFyaWFibGVzICoqQW5naW5hX0VqZXJjaWNpbyoqIHkgKipDbGFzZV9zYWxpZGEqKiBtdWVzdHJhbiB1bmEgZGlzdHJpYnVjaW9uIG1hcmdpbmFsIHVuIHBvY28gYWxlamFkYXMgZW50cmUgc2ksIHBvciBlamVtcGxvOiAoUGVyZmlsZXMgRmlsYSkgbGFzIHByb3BvcmNpb25lcyBkZSBwYXNpZW50ZXMgcXVlIHByZXNlbnRhcm9uIHkgbm8gcHJlc2VudGFyb24gYW5naW5hIHBvciBlamVyY2ljaW8geSB0dWJpZXJvbiB1bmEgc2FsaWRhIGNvbiBlbmZlcm1lZGFkIGNhcmRpYWNhIHNvbiAkODUsMTgkICQlJCB5ICQzNCw5OCQgJCUkIGRlIG1hbmVyYSByZXNwZWN0aXZhLCBhZGVtYXMsIChwZXJmaWxlcyBDb2x1bW5hKSBsYSBwcm9wb3JjaW9uIGRlIHBhc2llbnRlcyBxdWUgc2kgcHJlc2VudGFyb24gYW5naW5hIHBvciBlamVyY2ljaW8geSB0dXZpZXJvbiB1bmEgc2FsaWRhIGNvbiBlbmZlcm1lZGFkIGNhcmRpYWNhIHkgbm9ybWFsIHNvbiAkNjIsMzMkICQlJCB5ICQxMyw0MSQgJCUkIHJlc3BlY3RpdmFtZW50ZS4NCg0KQ29uIGJhc2UgZW4gbGFzIGRlc2NyaXBjaW9uZXMgaGVjaGFzIGVzIHBvc2libGUgYW50aWNpcGFyIHF1ZSBsb3MgcGFyZXMgZGUgdmFyaWFibGVzIGNhdGVnb3JpY2FzICoqU2V4byoqIHZzICoqQ2xhc2Vfc2FsaWRhKiogeSAqKkFuZ2luYV9FamVyY2ljaW8qKiB2cyAqKkNsYXNlX3NhbGlkYSoqIHNlYW4gaW5kZXBlbmRpZW50ZXMuIEVzdGUgY29uY2x1Y2lvbiBzZSBhcG95YSBlbiBsb3MgcmVzdWx0YWRvcyBkZSBsYSBwcnVlYmEgZGUgaGlww7N0ZXNpcyB2aXN1YWxpemFkYSBhIHRyYXbDqXMgIGRlIGxhIHN1YnBlc3Rhw7FhIGNvbiBlc2UgbWlzbW8gbm9tYnJlLiBQYXJhIGVzdGFzIHBydWJlYmFzIGEgdW4gbml2ZWwgZGUgc2lnbmlmaWNhbmNpYSAkXGFscGhhID0gMC4wNSQsIGxhcyBoaXDDs3Rlc2lzIGZvcm11bGFkYXMgZnVlcm9uOiQkSF8wOiBcdGV4dCB7TGFzIHZhcmlhYmxlcyBjYXRlZ8OzcmljYXMgc29uIGluZGVwZW5kaWVudGVzfSQkICQkSF8xOiBcdGV4dCB7bGFzIHZhcmlhYmxlcyBjYXRlZ8OzcmljYXMgc29uIGRlcGVuZGllbnRlc30kJCBEZSBsYSBtaXNtYSBmb3JtYSwgZWwgcGFyIGRlIHZhcmlhYmxlcyBxdWUgdHV2byBhIGZhdm9yIGRlIGEgZGVwZW5kZW5jaWEgZnVlcm9uICoqQW5naW5hX0VqZXJjaWNpbyoqIHkgKipDbGFzZV9zYWxpZGEqKiwgZW4gZXN0YSBwcnVlYmEgJHAtdmFsb3IkIHJlc3VsdMOzIG1lbm9yIG8gaWd1YWwgcXVlIGVsIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgeSwgY29tcGFyYXRpdmFtZW50ZSwgZWwgdmFsb3IgZGVsIGVzdGFkw61zdGljbyAkXGNoaV4yJCBmdWUgZ3JhbmRlLiBQb3IgbG8gdGFudG8sIGVsIHBhciBkZSB2YXJpYWJsZXMgcXVlIGNvbnRpbnVhcm9uIGVuIGFuw6FsaXNpcyBmdWVyb24gZXN0YXMgw7psdGltYXMuDQoNCkEgdHJhdsOpcyBkZSBsYSBwZXN0YcOxYSAqKkFDIFBhcmVqYSDDmm5pY2EqKiBzZSBkZXNwbGllZ2FuIGxhcyBzdWJwZXN0YcOxYXMgcmVsYWNpb25hZGFzIGNvbiBlbCBhbsOhbGlzaXMgZGUgY29ycmVzcG9uZGVuY2lhcyBlbnRyZSBsYXMgdmFyaWFibGVzIHNlbGVjY2lvbmFkYXMuIEVuIGxhIHNlY2Npw7NuIGRlICoqQ29udGluZ2VuY2lhcyB5IFJlc2lkdWFsZXMgW0FORy1DU10qKiAoZG9uZGUgKipBTkcqKiByZXByZXNlbnRhIEFuZ2luYV9FamVyY2ljaW8geSAqKkNTKiogQ2xhc2Vfc2FsaWRhKSBzZSBwdWVkZW4gdmlzdWFsaXphciBsYXMgdGFibGFzIGRlIGNvbnRpbmdlbmNpYSwgdmFsb3JlcyBlc3BlcmFkb3MgeSByZXNpZHVhbGVzIGRlIGxhIHBhcmVqYSBkZSB2YXJpYWJsZXMgZW4gY3Vyc28uIEVuIGxhcyBkb3MgcHJpbWVyYXMgdGFibGFzLCBzZSBvYnNlcnZhIHF1ZSBlbCByZWN1ZW50byBvYnNlcnZhZG8geSBlbCByZWN1ZW50byBlc3BlcmFkbyBiYWpvIGxhIGhpcMOzdGVzaXMgbnVsYSBzb24gc2lnbmlmaWNhdGl2YW1lbnRlIGRpZmVyZW50ZXMsIGxvIHF1ZSByZWZ1ZXJ6YSBsYSBkZXBlbmRlbmNpYSBlbnRyZSBsYXMgdmFyaWFibGVzLiBFbCAqKnJhbmdvX29ic2VydmFkbyoqIHJlcHJlc2VudGEgbG9zIHJlY3VlbnRvcyBhc29jaWFkb3MgY29uIGNhZGEgY2F0ZWdvcsOtYSBkZSBkYXRvcywgbWllbnRyYXMgcXVlIGVsICoqcmFuZ29fZXNwZXJhZG8qKiBpbmRpY2EgbG9zIHJlY3VlbnRvcyBlc3BlcmFkb3MgYmFqbyBsYSBoaXDDs3Rlc2lzIG51bGEuIEFkZW3DoXMsIGVsIGFuw6FsaXNpcyBkZSByZXNpZHVhbGVzIGRlIFBlYXJzb24geSBlc3RhbmRhcml6YWRvcyBtdWVzdHJhIHF1ZSBsYXMgbWF5b3JlcyBkZXN2aWFjaW9uZXMgcmVzcGVjdG8gYSBsb3MgdmFsb3JlcyBlc3BlcmFkb3Mgb2N1cnJlbiBlbnRyZSBsYXMgdW5pdmVyc2lkYWRlcyBkZSBjaW5jbywgY3VhdHJvLCBkb3MgeSB1bmEgZXN0cmVsbGEuIEVuIGxhIHN1YnBlc3Rhw7FhICoqQ29udHJpYnVjaW9uZXMgW0FORy1DU10qKiwgc2UgcHVlZGUgYXByZWNpYXIgcXVlIGVsIHZhbG9yIGRlIGFxdWVsbG9zIHF1ZSBubyBwcmVzZW50YXJvbiAqKkFuZ2luYV9lamVyY2ljaW8qKiBlcyBtw6FzIGJham8gZW4gY29tcGFyYWNpw7NuIGNvbiBsb3MgcXVlIHPDrSBsYSBwcmVzZW50YXJvbjsgc2luIGVtYmFyZ28sIGxvcyB2YWxvcmVzIG5vIGVzdMOhbiBtdXkgYWxlamFkb3MgZW4gZ2VuZXJhbCwgbG8gcXVlIGluZGljYSBxdWUgYW1ib3MgZ3J1cG9zIGFwb3J0YW4gdW5hIGNvbnRyaWJ1Y2nDs24gc2lnbmlmaWNhdGl2YSBhbCBjb21wb3J0YW1pZW50byBkZWwgY29uanVudG8gZGUgZGF0b3MuDQoNClBvciB1bHRpbW8sIGVsIHJlc3VsdGFkbyBxdWUgc2VyYSBkZWZpbml0aXZvIGRlbCBhbmFsaXNpcyBkZSBjb3JyZXNwb25kZW5jaWFzIHNpbXBsZXMgc2UgbXVlc3RyYSBlbiBsYSBzdWJwZXN0YcOxYSAqKkNvcnJlc3BvbmRlY2lhcyBTaW1wbGVzIFVuaWRpbWVuY2lvbmFsZXMgW0FORy1DU10qKi4gRW4gZXN0ZSBhcGFydGFkbyBzZSBlc3RhYmxlY2UgcWV1IHNvbG8gdW5hIGRpbWVuc2lvbiBhYnNvcmJlIHRvZGEgbGEgdmFyaWFiaWxpZGFkIGRlIGxhIHBhcmVqYSwgcG9yIGxvIHF1ZSBsYSByZXByZXNlbnRhY2lvbiBiaWRpbWVuc2lvbmFsIGVuIGxlIHBsYW5vIGRlIGZhY3RvcmVzIGVzIGltcG9zaWJsZSBkZSByZWFsaXphci4gU2luIGVtYmFyZ28sIGVzIHBvc2libGUgaGFjZXIgdW5hIGludGVycHJldGFjaW9uIHVuaWRpbWVuc2lvbmFsIGRlIGxvcyByZXN1bHRhZG9zIG9idGVuaWRvcy4gQWwgc2VyIHJlcXVlcmlkYXMgbGFzIHZhcmlhYmxlcyBkZSBzb3BvcnRlIGRlbCBBQywgcHJpbWVybyBwb3IgY29sdW1uYXMgeSBsdWVnbyBwb3IgZmlsYXMsIGxhcyBjb29yZGVuYWRhcyBwcm95ZWN0YWRhcyBkZSBsYSB2YXJpYWJsZSAqKkNsYXNlX3NhbGlkYSoqIGVuIHJlbGFjaW9uIGNvbiBsYXMgY2F0ZWdvcmlhIG5vcm1hbCBzZSBwcmVzZW50YSBlbiBlbCBsYWRvIHBvc2l0aXZvIGRlbCBlamUsIG1pZW50cmFzIHRhbnRvIGxhIGNhdGVnb3JpYSBlbmZlcm1lZGFkIGNhcmRpYWNhIHNlIGVuY3VlbnRyYSBlbiBsYWRvIG5lZ2F0aXZvIGRlbCBlamUsIEFzaSBtaXNtbyBwcmVzZW50YW5kbyB1bmEgbWF5b3IgY29udHJpYnVjaW9uIGxhIGNhdGVnb3JpYSBub3JtYWwsIGF1bnF1ZSBjYWJlIHJlY2FsY2FyIHF1ZSBsYSBjYXRlZ29yaWEgZW5mZXJtZWRhZCBjYXJkaWFjYSB0YW1iaWVuIHByZXNlbnRhIHVuYSBidWVuYSBjb250cmlidWNpb24gcGVybyBlcyBtZW5vciBhIGxhIG90cmEgY2F0ZWdvcmlhIGVzIGRlY2lyIHNvbiBiYXN0YW50ZSBlcXVpbGlicmFkYXMsIGFkZW1hcywgZXMgZGV0ZXJtaW5hbnRlIHF1ZSBsYSBjYWxpZGFkIGRlIHJlcHJlc2VudGFjaW9uIGFsY2FuemEgZWwgbWF4aW1vIGNvbiBjYWRhIHVuYSBkZSBsYXMgdmFyaWFibGVzLiBVbiBjb21wb3J0YW1pZW50byBzZW1lbmphbnRlIGEgbG8gbWVuc2lvbmFkbyBkZSBtYW5lcmEgYW50ZXJpb3Igc2UgcHVlZGUgYXByZWNpYXIgY29uIGxhIHZhcmlhYmxlIGZpbGEgKipBbmdpbmFfZWplcmNpY2lvKiogc3UgY2FsaWRhZCBkZSByZXByZXNlbnRhY2lvbiBlcyBtYXhpbWEsIGxhcyBjb29yZGVuYWRhcyBkZSBzdXMgY2F0ZWdvcmlhcyBzZSBpbnRlcnBvbmVuIGVuIGVsIGVqZSB1bmlkaW1lbnNpb25hbCB5IHN1cyBjb250cmlidWNpb25lcyBzb24gYmFzdGFudGUgZXF1aWxpYnJhZGFzLiBEZSBsbyBtZW5jaW9uYWRvIHNlIHB1ZWRlIGludGVycHJldGFyIHF1ZSBwcmVzZW50YSBhc29jaWFjaW9uIHJlbGV2YW50ZSwgcG9zaXRpdmEgeSBuZWdhdGl2YSBlbnRyZSBmaWxhcyB5IGNvbHVtbmFzLCBsYXMgY290ZWdvcmlhcyAoZGUgbGFzIHJlc3BlY3RpdmFzIHZhcmlhYmxlcykgU2luIGFuZ2luYSBwb3IgZWplcmNpY2lvIGNvbiBzYWxpZGEgbm9ybWFsIHkgY29uIGFuZ2luYSBwb3IgZWplcmNpY2lvIGNvbiBlbmZlcm1lZGFkIGNhcmRpYWNhDQoNCiMjIyBBQyBQYXJlamFzIFRvdGFsZXMgey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KIyMjIyBDb250aW5nZW5jaWFzDQpgYGB7ciBUYWJsYXNfZGVfQ29udGluZ2VuY2lhLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCmFkZG1hcmdpbnModGFibGUoaGVhcnRfZGlzZWFzZXNfRGF0YXNldCRTZXhvLCBoZWFydF9kaXNlYXNlc19EYXRhc2V0JEFuZ2luYV9FamVyY2ljaW8pKQ0KYWRkbWFyZ2lucyh0YWJsZShoZWFydF9kaXNlYXNlc19EYXRhc2V0JFNleG8sIGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkQ2xhc2Vfc2FsaWRhKSkNCmFkZG1hcmdpbnModGFibGUoaGVhcnRfZGlzZWFzZXNfRGF0YXNldCRBbmdpbmFfRWplcmNpY2lvLCBoZWFydF9kaXNlYXNlc19EYXRhc2V0JENsYXNlX3NhbGlkYSkpDQpgYGANCg0KIyMjIyBQcm9iYWJpbGlkYWRlcw0KYGBge3IgVGFibGFzX2RlX1Byb2JhYmlsaWRhZGVzLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCmFkZG1hcmdpbnMocHJvcC50YWJsZSh0YWJsZShoZWFydF9kaXNlYXNlc19EYXRhc2V0JFNleG8sIGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkQW5naW5hX0VqZXJjaWNpbykpKjEwMCkNCmFkZG1hcmdpbnMocHJvcC50YWJsZSh0YWJsZShoZWFydF9kaXNlYXNlc19EYXRhc2V0JFNleG8sIGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkQ2xhc2Vfc2FsaWRhKSkqMTAwKQ0KYWRkbWFyZ2lucyhwcm9wLnRhYmxlKHRhYmxlKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkQW5naW5hX0VqZXJjaWNpbywgaGVhcnRfZGlzZWFzZXNfRGF0YXNldCRDbGFzZV9zYWxpZGEpKSoxMDApDQpgYGANCg0KIyMjIyBGcmVjdWVuY2lhcyBbQ1BGIHkgQ1BDXQ0KYGBge3IgVGFibGFzX2RlX0ZyZWN1ZW5jaWFzX0NvbmRpY2lvbmFkYXMsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0Kcm91bmQoYWRkbWFyZ2lucyhwcm9wLnRhYmxlKHRhYmxlKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkU2V4bywgaGVhcnRfZGlzZWFzZXNfRGF0YXNldCRBbmdpbmFfRWplcmNpY2lvKSwgMSkqMTAwLCAyKSwgMikNCnJvdW5kKGFkZG1hcmdpbnMocHJvcC50YWJsZSh0YWJsZShoZWFydF9kaXNlYXNlc19EYXRhc2V0JFNleG8sIGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkQW5naW5hX0VqZXJjaWNpbyksIDIpKjEwMCwgMSksIDIpDQoNCnJvdW5kKGFkZG1hcmdpbnMocHJvcC50YWJsZSh0YWJsZShoZWFydF9kaXNlYXNlc19EYXRhc2V0JFNleG8sIGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkQ2xhc2Vfc2FsaWRhKSwgMSkqMTAwLCAyKSwgMikNCnJvdW5kKGFkZG1hcmdpbnMocHJvcC50YWJsZSh0YWJsZShoZWFydF9kaXNlYXNlc19EYXRhc2V0JFNleG8sIGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkQ2xhc2Vfc2FsaWRhKSwgMikqMTAwLCAxKSwgMikNCg0Kcm91bmQoYWRkbWFyZ2lucyhwcm9wLnRhYmxlKHRhYmxlKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkQW5naW5hX0VqZXJjaWNpbywgaGVhcnRfZGlzZWFzZXNfRGF0YXNldCRDbGFzZV9zYWxpZGEpLCAxKSoxMDAsIDIpLCAyKQ0Kcm91bmQoYWRkbWFyZ2lucyhwcm9wLnRhYmxlKHRhYmxlKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkQW5naW5hX0VqZXJjaWNpbywgaGVhcnRfZGlzZWFzZXNfRGF0YXNldCRDbGFzZV9zYWxpZGEpLCAyKSoxMDAsIDEpLCAyKQ0KYGBgDQoNCiMjIyMgUGVyZmlsZXMgW0NQRiB5IENQQ10NCmBgYHtyIEdyYWZpY29zX2RlX1BlcmZpbGVzLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCnBsb3RjdCh0YWJsZShoZWFydF9kaXNlYXNlc19EYXRhc2V0JFNleG8sIGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkQW5naW5hX0VqZXJjaWNpbyksInJvdyIpDQpwbG90Y3QodGFibGUoaGVhcnRfZGlzZWFzZXNfRGF0YXNldCRTZXhvLCBoZWFydF9kaXNlYXNlc19EYXRhc2V0JEFuZ2luYV9FamVyY2ljaW8pLCJjb2wiKQ0KDQpwbG90Y3QodGFibGUoaGVhcnRfZGlzZWFzZXNfRGF0YXNldCRTZXhvLCBoZWFydF9kaXNlYXNlc19EYXRhc2V0JENsYXNlX3NhbGlkYSksInJvdyIpDQpwbG90Y3QodGFibGUoaGVhcnRfZGlzZWFzZXNfRGF0YXNldCRTZXhvLCBoZWFydF9kaXNlYXNlc19EYXRhc2V0JENsYXNlX3NhbGlkYSksImNvbCIpDQoNCnBsb3RjdCh0YWJsZShoZWFydF9kaXNlYXNlc19EYXRhc2V0JEFuZ2luYV9FamVyY2ljaW8sIGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkQ2xhc2Vfc2FsaWRhKSwicm93IikNCnBsb3RjdCh0YWJsZShoZWFydF9kaXNlYXNlc19EYXRhc2V0JEFuZ2luYV9FamVyY2ljaW8sIGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkQ2xhc2Vfc2FsaWRhKSwiY29sIikNCmBgYA0KDQojIyMjIFBydWViYXMgZGUgSGlww7N0ZXNpcw0KYGBge3IgUHJ1ZWJhc19kZV9Db3JyZXNwb25kZW5jaWEsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KY2hpc3EudGVzdCh0YWJsZShoZWFydF9kaXNlYXNlc19EYXRhc2V0JFNleG8sIGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkQW5naW5hX0VqZXJjaWNpbykpDQpjaGlzcS50ZXN0KHRhYmxlKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkU2V4bywgaGVhcnRfZGlzZWFzZXNfRGF0YXNldCRDbGFzZV9zYWxpZGEpKQ0KY2hpc3EudGVzdCh0YWJsZShoZWFydF9kaXNlYXNlc19EYXRhc2V0JEFuZ2luYV9FamVyY2ljaW8sIGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkQ2xhc2Vfc2FsaWRhKSkNCmBgYA0KDQojIyMgQUMgUGFyZWphIMOabmljYSB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQojIyMjIENvbnRpbmdlbmNpYXMgeSBSZXNpZHVhbGVzIFtBR0UtQ1NdDQpgYGB7ciBDb250aW5nZW5jaWFzX3lfUmVzaWR1YWxlc19BTkctQ1MsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KY2hpc3EudGVzdCh0YWJsZShoZWFydF9kaXNlYXNlc19EYXRhc2V0JEFuZ2luYV9FamVyY2ljaW8sIGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkQ2xhc2Vfc2FsaWRhKSkkb2JzZXJ2ZWQNCmNoaXNxLnRlc3QodGFibGUoaGVhcnRfZGlzZWFzZXNfRGF0YXNldCRBbmdpbmFfRWplcmNpY2lvLCBoZWFydF9kaXNlYXNlc19EYXRhc2V0JENsYXNlX3NhbGlkYSkpJGV4cGVjdGVkIA0KY2hpc3EudGVzdCh0YWJsZShoZWFydF9kaXNlYXNlc19EYXRhc2V0JEFuZ2luYV9FamVyY2ljaW8sIGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkQ2xhc2Vfc2FsaWRhKSkkcmVzaWR1YWxzDQpjaGlzcS50ZXN0KHRhYmxlKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkQW5naW5hX0VqZXJjaWNpbywgaGVhcnRfZGlzZWFzZXNfRGF0YXNldCRDbGFzZV9zYWxpZGEpKSRzdGRyZXMNCmBgYA0KDQojIyMjIENvbnRyaWJ1Y2lvbmVzIFtBTkctQ1NdDQpgYGB7ciBDb250cmlidWNpb25lc19BTkctQ1MsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KY2hpc3EudGVzdCh0YWJsZShoZWFydF9kaXNlYXNlc19EYXRhc2V0JEFuZ2luYV9FamVyY2ljaW8sIGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkQ2xhc2Vfc2FsaWRhKSkkcmVzaWR1YWxzXjIvY2hpc3EudGVzdCh0YWJsZShoZWFydF9kaXNlYXNlc19EYXRhc2V0JEFuZ2luYV9FamVyY2ljaW8sIGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkQ2xhc2Vfc2FsaWRhKSkkc3RhdGlzdGljKjEwMA0KYGBgDQoNCiMjIyMgQ29ycmVzcG9uZGVuY2lhIFNpbXBsZSBVbmlkaW1lbnNpb25hbCBbQU5HLUNTXQ0KYGBge3IgQmlwbG90X0NvcnJlc3BvbmRlbmNpYV9TaW1wbGVfQU5HLUNTLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCkNBKHRhYmxlKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkQW5naW5hX0VqZXJjaWNpbywgaGVhcnRfZGlzZWFzZXNfRGF0YXNldCRDbGFzZV9zYWxpZGEpLCBncmFwaCA9IEZBTFNFKSRlaWcNCkNBKHRhYmxlKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkQW5naW5hX0VqZXJjaWNpbywgaGVhcnRfZGlzZWFzZXNfRGF0YXNldCRDbGFzZV9zYWxpZGEpLCBncmFwaCA9IEZBTFNFKSRjb2wNCkNBKHRhYmxlKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkQW5naW5hX0VqZXJjaWNpbywgaGVhcnRfZGlzZWFzZXNfRGF0YXNldCRDbGFzZV9zYWxpZGEpLCBncmFwaCA9IEZBTFNFKSRyb3cNCmBgYA0KDQojIyAqKjMuMy4gQ29ycmVzcG9uZGVjaWFzIE3Dumx0aXBsZXMqKiB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQpTZSBhZmlybWEgcXVlIGVsIEFuw6FsaXNpcyBkZSBDb3JyZXNwb25kZW5jaWFzIFNpbXBsZXMgKEFDUykgcHVlZGUgYW1wbGlhcnNlIGRlc2RlIHRhYmxhcyBkZSBjb250aW5nZW5jaWEgaGFjaWEgdGFibGFzIGRpc3l1bnRpdmFzIGNvbXBsZXRhcy4gRW4gZXN0YXMgw7psdGltYXMsIGxhcyBmaWxhcyByZXByZXNlbnRhbiBvYmpldG9zIGEgbG9zIHF1ZSBzZSBsZXMgcmVnaXN0cmFuIGNhcmFjdGVyw61zdGljYXMgZGUgaW50ZXLDqXMgYSB0cmF2w6lzIGRlIGxhcyBjb2x1bW5hcywgcXVlIHJlY29waWxhbiBsYXMgbW9kYWxpZGFkZXMgZGUgbGFzIHZhcmlhYmxlcyBjYXRlZ8OzcmljYXMgZXN0dWRpYWRhcy4gRGUgZXN0YSBtYW5lcmEsIGVsIEFuw6FsaXNpcyBkZSBDb3JyZXNwb25kZW5jaWFzIE3Dumx0aXBsZSAoQUNNKSBlcyBlbCBBQ1MgYXBsaWNhZG8gYSB1bmEgdGFibGEgZGlzeXVudGl2YSBjb21wbGV0YS4gUG9yIGxvIHRhbnRvLCBlbiBlbCBBQ00sIHVuYSB2YXJpYWJsZSBjYXRlZ8OzcmljYSBhc2lnbmEgYSBjYWRhIG9iamV0byBkZSB1bmEgcG9ibGFjacOzbiB1bmEgbW9kYWxpZGFkIGVzcGVjw61maWNhLCBkaXZpZGnDqW5kb2xvcyBkZSBtYW5lcmEgZXhjbHVzaXZhIHkgZXhoYXVzdGl2YS4NCg0KRXN0YSBzZWNjacOzbiBzZSBkZXNhcnJvbGxhIGNvbW8gdW5hIGFsdGVybmF0aXZhIHBhcmEgY29tcGxldGFyIGVsIGFuw6FsaXNpcyBkZSBjb3JyZXNwb25kZW5jaWFzIHNpbXBsZXMsIHF1ZSByZXN1bHTDsyBpbnN1ZmljaWVudGUgZGViaWRvIGEgbGEgdW5pZGltZW5zaW9uYWxpZGFkIGVuIGxhIHJlcHJlc2VudGFjacOzbiBkZSBsb3MgZGF0b3MgYWwgcHJveWVjdGFyIGxhcyB2YXJpYWJsZXMgY2F0ZWfDs3JpY2FzIHF1ZSBjdW1wbMOtYW4gY29uIGxhIGhpcMOzdGVzaXMgZGUgZGVwZW5kZW5jaWEuIFBvciBsbyB0YW50bywgc2UgZXNwZXJhIHF1ZSBlbCB0cmF0YW1pZW50byBjb25qdW50byBkZSB0b2RhcyBsYXMgdmFyaWFibGVzIGNhdGVnw7NyaWNhcyBwcm9wb3JjaW9uZSB1bmEgcmVwcmVzZW50YWNpw7NuIGVuIGVsIHByaW1lciBwbGFubyBmYWN0b3JpYWwuDQoNCioqUGxhbnRlYW1pZW50byBkZWwgUHJvYmxlbWEqKg0KDQpDb24gYmFzZSBlbiBsYXMgdmFyaWFibGVzIGN1YWxpdGF0aXZhcyBkZWwgY29uanVudG8gZGUgZGF0b3MgZGVzY3JpdG8sIHNlIHJlcXVpZXJlIGRlc2Fycm9sbGFyIHVuIGFuw6FsaXNpcyBkZSBjb3JyZXNwb25kZW5jaWFzIG3Dumx0aXBsZXMgKEFDTSkgcGFyYSBsb2dyYXIgdW5hIHJlcHJlc2VudGFjacOzbiBncsOhZmljYSBlbiBlbCBwcmltZXIgcGxhbm8gZmFjdG9yaWFsLCB5YSBxdWUgZXN0byBubyBmdWUgcG9zaWJsZSBtZWRpYW50ZSBlbCBhbsOhbGlzaXMgZGUgY29ycmVzcG9uZGVuY2lhcyBzaW1wbGUgKEFDUykuIA0KDQpFbCBBQ00gcGVybWl0aXLDoSBhbmFsaXphciBjb25qdW50YW1lbnRlIHRvZGFzIGxhcyB2YXJpYWJsZXMgY2F0ZWfDs3JpY2FzIGRlbCBjb25qdW50byBkZSBkYXRvcywgcHJvcG9yY2lvbmFuZG8gdW5hIHJlcHJlc2VudGFjacOzbiBtw6FzIGNvbXBsZXRhIHkgbXVsdGlkaW1lbnNpb25hbC4gU2UgdXRpbGl6YXLDoW4gdGFibGFzIGRpc3l1bnRpdmFzIGNvbXBsZXRhcyBwYXJhIGVzdGUgYW7DoWxpc2lzIHkgc2UgZ2VuZXJhcsOhbiBncsOhZmljb3MgcXVlIHJlcHJlc2VudGVuIGxvcyBwZXJmaWxlcyB5IHB1bnRvcyBzdXBlcnB1ZXN0b3MgZW4gZWwgcHJpbWVyIHBsYW5vIGZhY3RvcmlhbCwgZmFjaWxpdGFuZG8gYXPDrSB1bmEgaW50ZXJwcmV0YWNpw7NuIG3DoXMgY2xhcmEgeSBkZXRhbGxhZGEgZGUgbGFzIHJlbGFjaW9uZXMgZW50cmUgbGFzIHZhcmlhYmxlcyBjYXRlZ8OzcmljYXMgeSBsb3Mgb2JqZXRvcyBlc3R1ZGlhZG9zLg0KDQoqKkRlc2Fycm9sbG8gZGVsIEFuw6FsaXNpcyoqDQoNCkNvbiBiYXNlIGVuIGxhIG5hdmVnYWNpb24gYSB0cmF2w6lzIGRlIHBlc3Rhw7FhcyBzZSBwZXJtaXRpcmEgdmlzdWFsaXphciBvYmpldG9zIG1hdHJpY2lhbGVzIHkgZ3JhZmljb3MgcXVlIGF5dWRlbiBhIGRlc2Fycm9sbGFyIGUgaW50ZXJwcmV0YXIgbG9zIHJlc3VsdGFkb3MgZGVsIGFuw6FsaXNpcyBkZSBjb3JyZXNwb25kZWNpYXMgbcO6bHRpcGxlcyAoQUNNKSBlbnRyZSBsYXMgdmFyaWFibGVzIGNhdGVnb3JpY2FzIGRlbCBjb25qdW50byBkZSBkYXRvcy4NCg0KTGEgcGVzdGHDsWEgKipBQ00qKiBtdWVzdHJhIGxhIG11bHRpZGltZW5jaW9uYWxpZGFkIHF1ZSBzZSBlc3BlcmFiYSxjb21wYXJhZGEgY29uIGxhIHVuaWRpbWVuc2lvbmFsIGRlbCBBQ1MgZGUgbGEgKipmYXNlIDMqKiBhbCB0cmFiYWphciBkZSBtYW5lcmEgY29uanVudGEgY29uIGxhcyA2IHZhcmlhYmxlcyBjYXRlZ29yaWNhcyBkZWwgY29uanVudG8gZGUgZGF0b3M6ICoqU2V4bywgVGlwb19kb2xvcl9wZWNobywgRUNHX3JlcG9zbywgQW5naW5hX0VqZXJjaWNpbywgUGVuZGlfU2VnbWVfU1RfRWplcmNpY2lvIHkgQ2xhc2Vfc2FsaWRhKiouIE11ZXN0cmFuIGFkZW1hcyBxdWUgbGFzIGRpbWVuc2lvbmVzIGRlbCBwbGFuIHByaW5jaXBhbCBleHBsaWNhbiBlbCAkMzcsNTkkICQlJCBkZWwgY29uanVudG8gKHNlcmEgZXN0ZSBwbGFubyBxdWUgc2UgY29udGludWFyYSBjb24gbGFzIGludGVycHJldGFjaW9uZXMgZGVsIEFDTSkuIEFkZW1hcywgbGEgZXZpZGVudGUgYmFqYSBkZSBjb25jZW50cmFjaW9uIGRlIGFic29yY2lvbiBkZSB2YXJpYW56YSBwb3IgcGFydGUgZGUgYWxndW5hcyBkaW1lbnNpb25lcyBzZSB2ZXJhIHJlZmxlamFkbyBlbiBsYXMgZGlzdGFjaWFzIGRlIGxvcyBwZXJmaWxlcyBkZSBsYXMgdmFyaWFibGVzIGNhdGVnb3JpY2FzLg0KDQpFbiBsYSBwZXN0YcOxYSAqKkJpcGxvdCBBQ00qKiBzZSBtb3N0cmFyYW4gbGFzIHNlbWVuamF6YXMgZGUgbG9zIHBlcmZpbGVzIGRlIGxvcyBwYWNpZW50ZXMgZGUgbWFuZXJhIGdyYWZpY2EgcG9yIGVzdGUgbW90aXZvIGEgcGFydGlyIGRlIGVzdGUgc2UgY3JlbyBlbCAqKkJpcGxvdCBBQ00gW1JlZHVjaWRvXSoqIHF1ZSBmYWNpbGl0YXJhIGxhIGNvbXByZW5zaW9uIGRlIGxvcyByZXN1bHRhZG9zLCBlbiBjb25jb3JkYW5jaWEgY29uIGVzdG8gbG9zIHB1bnRvcyBhenVsZXMgc29icmVwdWVzdG9zIGluZGljYW4gY29vcmRlbmFkYXMgZGUgY29udmVyZ2VuY2lhIHkgbGFzIGFzb2NpYWNpb25lcyBlbnRyZSBhbGd1bmFzIGNhdGVnb3JpYXMgZGUgbGFzIHZhcmlhYmxlcyB5IGNvbmp1bnRvcyBkZSBwYXNpZW50ZXMuIENhYmUgcmVjbGFjYXIgcXVlIGxhcyBzZW1lbWphbnphcyBlbnRyZSBjYXRlZ29yaWFzIGRlIHZhcmlhYmxlcyBlc3RhbiByZXByZXNlbnRhZGFzIHBvciBzdXMgY29vcmRlbmFkYXMgcmVzcGVjdG8gYSBsb3Mgc2VtaWVqZXMgZGltZW5zaW9uYWxlcywgbWFzIHF1ZSBwb3IgbGEgcHJveGltaWRhZCBkZSBlc3RvcyBlbnRyZSBzaSwgZXN0byBjb25jdWVyZGEgY29uIGxvcyByZXN1bHRhZG9zIG9idGVuaWRvcyBlbiBsYSAqKmZhc2UgMyoqLiBQb3IgZWplbXBsbywgZW4gc2VtZWphbnphIGEgbml2ZWwgZGUgbGFzIGNhdGVnb3JpYXMgZGUgbGFzIHZhcmlhYmxlcyBkZXN0YWNhbiBsb3MgZ3J1cG9zOiBvYnNlcnZhY2lvbmVzIG51bWVyYWRhcyBlbiBlbCBsYWRvIGRlcmVjaG8gZGVsIGdyw6FmaWNvLCBjZXJjYW5hcyBhIG1vZGFsaWRhZGVzIGNvbW8gKiphbmdpbmEgdMOtcGljYSoqIHkgKipBbmdpbmFfRWplcnNpY2lvX04qKiwgc3VnaWVyZW4gcXVlIGVzdGFzIG9ic2VydmFjaW9uZXMgdGllbmVuIGNhcmFjdGVyw61zdGljYXMgcmVsYWNpb25hZGFzIGNvbiBlc3RhcyBtb2RhbGlkYWRlcy4gUG9yIG90cm8gbGFkbywgb2JzZXJ2YWNpb25lcyBudW1lcmFkYXMgZW4gZWwgbGFkbyBpenF1aWVyZG8gZGVsIGdyw6FmaWNvLCBjZXJjYW5hcyBhIG1vZGFsaWRhZGVzIGNvbW8gKipFbmZlcm1lZGFkIGNhcmTDrWFjYSoqIHkgKipFQ0cgZW4gcmVwb3NvX0xWSCoqLCBpbmRpY2FuIHVuYSBhc29jaWFjacOzbiBjb24gZXN0YXMgY29uZGljaW9uZXMuIEVuIGdlbmVyYWwgc2UgcHVlZGVuIHZpc3VhbGl6YXIgZmFjaWxtZW50ZSBsYXMgYXNvY2lhY2lvbmVzIGVudHJlIGxhcyBjYXRlZ29yaWFzIGRlIGxhcyB2YXJpYWJsZXMgeSBsb3MgZ3J1cG9zIGRlIHBhY2llbnRlcyBhZmluZXMgYSBlc3Rhcy4NCg0KU2VndWlkYW1lbnRlLCBsYSBwZXN0YcOxYSAqKkNhbGlkYWQgZGUgUmVwcmVzZW50YWNpb24qKiBtdWVzdHJhIHF1ZSBsYXMgY2F0ZWdvcmlhcyBkZSBsYSB2YXJpYWJsZSAqKkNsYXNlX3NhbGlkYSoqIGZ1ZXJvbiBsYXMgbWVqb3JlcyByZXByZXNlbnRhZGFzLCBlbiBwb3NpY2lvbiBhIGxhcyBjYXRlZ29yaWFzIGRlc2VuZGVudGVzIGRlIGxhIHZhcmlhYmxlICoqUGVuZGlfU2VnbWVfU1RfRWplcmNpY2lvKiouIEVsIHJlc3RvIHF1ZWRvIGVuIHVuIHJhbmdvIGVuIHVuIHJhbmdvIGJham8tYWx0byBkZSBjYWxpZGFkIGRlIHJlcHJlc2VudGFjaW9uLiBDb21vIGxhIGNhbGlkYWQgZGUgcmVwcmVzZW50YWNpb24gZW4gc3ViZXNwYWNpb3MgZGUgZGltZW5zaW9uZXMgcmVkdWNpZGFzIHNlIG1pZGUgZW4gcG9yY2VudGFqZXMgZGUgaW5lcmNpYSBjb24gcmVwZWN0byBhbCB0b3RhbCBkZWwgIGFjZXJjYW5pYSBkZSB1biBwdW50byByZXBlY3RvIGFsIG9yaWdlbiBkZWwgcGxhbm8gZmFjdG9yaWFsIGluZGljYSB1bmEgYmFqYSByZXByZXNlbnRhY2lvbiBlbiBlbCwgZGUgbWFuZXJhIGNvbXBsZW1lbnRhcmlhIGxhIG1hdHJpeiBkZSBjYWxpZGFkIGRlIHJlcHJlc2VudGFjaW9uZXMgZXZpZGVuY2lhIG51bWVyaWNhIGRlIGxhcyBjb250cmlidWNpb25lcyBkZSBjYWRhIGRpbWVuc2lvbiB0b21hbmRvIGNvbW8gZWplbXBsbyBsYSAxIHRlbmllbmRvIGxhIGNvbnRyaWJ1Y2lvbiBtYXMgYWx0YSBkZSAkMCw3MyQuDQoNClRhbWJpZW4gZGUgbWFuZXJhIGNvbXBsZW1lbnRhcmlhLCBsYSBwZXN0YcOxYSAqKkNvbnRyaWJ1Y2lvbmVzKiogbXVlc3RyYSBxdWUgcGFyYSBsYXMgZGltZW5jaW9uZXMgZGVsIHByaW1lciBwbGFubyBmYWN0b3JpYWwsIHkgZW4gY29uY29yZGFuY2lhIGNvbiBsbyBhbnRlcyBtZW5jaW9uYWRvIGxhIGNhdGVnb3JpYSBkZSBsYSB2YXJpYWJsZSAqKkNsYXNlX3NhbGlkYSoqOiBub3JtYWwgeSBlbmZlcm1lZGFkIGNhcmRpYWNhIHF1ZWRhbiBwb3IgZW5jaW1hIGRlIGxhIGxpbmVhIG1lZGlhIGRlIGxhIHByaW1lcmEgZGltZW5zaW9uLCBwZXJvIGRlIG1hbmVyYSBwYXJ0aWN1bGFyLCBsYSBjYXRlZ29yaWEgZGUgKipUaXBvX2RvbG9yX3BlY2hvKio6IGFuZ2luYSBhdGlwaWNhIHNlIGVuY3VlbnRyYSB1biBwb2NvIG1hcyBhcnJpYmEgIGRlIGxhIGxpbmVhIG1lZGlhIGVuIGxhcyBkb3MgcHJpbWVyYXMgZGltZW5jaW9uZXMsIGNvc2EgcXVlIG5vIG9jdXJyZSBjb24gbGEgcHJpbWVyYSB2YXJpYWJsZSBtZW5jaW9uYWRhLCBFbiBlc2Ugc2VudGlkbyBlbiBsYSBwZXN0YcOxYSAqKkJpcGxvdCBjb24gY29udHJpYnVjaW9uZXMqKiBzZSB2aXN1YWxpemEgdW5hIHJlcHJlc2VudGFjaW9uIGVuIGVsIHByaW1lciBwbGFubyBmYWN0b3JpYWwgc2VtZWphbnRlIGEgbGEgb2J0ZW5pZGEgZW4gbGEgcGVzdGHDsWEgKipDYWxpZGFkIGRlIFJlcHJlc2VudGFjaW9uZXMqKi4NCg0KIyMjIEFDTQ0KYGBge3IgQUNNLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCnJvdW5kKE1DQShoZWFydF9kaXNlYXNlc19EYXRhc2V0WzE6OTE3LCAtYygxLDQsNSw2LDgsMTApXSwgZ3JhcGggPSBGQUxTRSkkZWlnLDIpDQpgYGANCg0KIyMjIEJpcGxvdCBBQ00NCmBgYHtyIEJpcGxvdF9BQ00sIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KZnZpel9tY2FfYmlwbG90KE1DQShoZWFydF9kaXNlYXNlc19EYXRhc2V0WzE6OTE3LCAtYygxLDQsNSw2LDgsMTApXSwgZ3JhcGggPSBGQUxTRSksIHJlcGVsID0gVFJVRSkNCmBgYA0KDQojIyMgQmlwbG90IEFDTSBbUmVkdWNpZG9dDQpgYGB7ciBCaXBsb3RfQUNNX1JlZHVjaW9kbywgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpzZXQuc2VlZCg3ODA3MjgpDQpmdml6X21jYV9iaXBsb3QoTUNBKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRbc2FtcGxlKDE6bnJvdyhoZWFydF9kaXNlYXNlc19EYXRhc2V0KSwxNTApLCAtYygxLDQsNSw2LDgsMTApXSwgZ3JhcGggPSBGQUxTRSksIHJlcGVsID0gVFJVRSkNCmBgYA0KDQojIyMgQ2FsaWRhZCBkZSBSZXByZXNlbnRhY2nDs24NCmBgYHtyIENhbGlkYWRfZGVfUmVwcmVzZW50YWNpb25fQUNNLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCmZ2aXpfbWNhX3ZhcihNQ0EoaGVhcnRfZGlzZWFzZXNfRGF0YXNldFsxOjkxNywgLWMoMSw0LDUsNiw4LDEwKV0sIGdyYXBoID0gRkFMU0UpLCBjb2wudmFyID0iY29zMiIsIGdyYWRpZW50LmNvbHMgPSBjKCIjMDBBRkJCIiwgIiNFN0I4MDAiLCAiI0ZDNEUwNyIpLCByZXBlbCA9IFRSVUUpDQpNQ0EoaGVhcnRfZGlzZWFzZXNfRGF0YXNldFsxOjkxNywgLWMoMSw0LDUsNiw4LDEwKV0sIGdyYXBoID0gRkFMU0UpJHZhciRjb3MyDQpgYGANCg0KIyMjIENvbnRyaWJ1Y2lvbmVzDQpgYGB7ciBDb250cmlidWNpb25lc19BQ00sIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KZnZpel9jb250cmliKE1DQShoZWFydF9kaXNlYXNlc19EYXRhc2V0WzE6OTE3LCAtYygxLDQsNSw2LDgsMTApXSwgZ3JhcGggPSBGQUxTRSksIGNob2ljZSA9ICJ2YXIiLCBheGVzID0gMSwgdG9wID0gMTUpDQpmdml6X2NvbnRyaWIoTUNBKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRbMTo5MTcsIC1jKDEsNCw1LDYsOCwxMCldLCBncmFwaCA9IEZBTFNFKSwgY2hvaWNlID0gInZhciIsIGF4ZXMgPSAyLCB0b3AgPSAxNSkNCmZ2aXpfY29udHJpYihNQ0EoaGVhcnRfZGlzZWFzZXNfRGF0YXNldFsxOjkxNywgLWMoMSw0LDUsNiw4LDEwKV0sIGdyYXBoID0gRkFMU0UpLCBjaG9pY2UgPSAidmFyIiwgYXhlcyA9IDMsIHRvcCA9IDE1KQ0KZnZpel9jb250cmliKE1DQShoZWFydF9kaXNlYXNlc19EYXRhc2V0WzE6OTE3LCAtYygxLDQsNSw2LDgsMTApXSwgZ3JhcGggPSBGQUxTRSksIGNob2ljZSA9ICJ2YXIiLCBheGVzID0gNCwgdG9wID0gMTUpDQpmdml6X2NvbnRyaWIoTUNBKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRbMTo5MTcsIC1jKDEsNCw1LDYsOCwxMCldLCBncmFwaCA9IEZBTFNFKSwgY2hvaWNlID0gInZhciIsIGF4ZXMgPSA1LCB0b3AgPSAxNSkNCmBgYA0KDQojIyMgQmlwbG90IGNvbiBDb250cmlidWNpb25lcw0KYGBge3IgQmlwbG90X2Nvbl9Db250cmlidWNpb25lc19BQ00sIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KZnZpel9tY2FfdmFyKE1DQShoZWFydF9kaXNlYXNlc19EYXRhc2V0WzE6OTE3LCAtYygxLDQsNSw2LDgsMTApXSwgZ3JhcGggPSBGQUxTRSksIGNvbC52YXIgPSJjb250cmliIiwgZ3JhZGllbnQuY29scyA9IGMoIiMwMEFGQkIiLCAiI0U3QjgwMCIsICIjRkM0RTA3IiksIHJlcGVsID0gVFJVRSkNCmBgYA0KDQojICoqRmFzZSA0IFtBbsOhbGlzaXMgZGUgUmVncmVzacOzbl0qKg0KDQojIyAqKjQuMS4gT2JqZXRpdm9zKioNCg0KRW4gdMOpcm1pbm9zIGdlbmVyYWxlcywgZXN0ZSBlc3R1ZGlvIGV4cGxvcmFyw6EgbGEgcmVsYWNpw7NuIGVudHJlIGRvcyBvIG3DoXMgdmFyaWFibGVzIG1lZGlhbnRlIGxhIG9idGVuY2nDs24gZGUgaW5mb3JtYWNpw7NuIHNvYnJlIHVuYSBkZSBlbGxhcyBiYXNhZGEgZW4gZWwgY29ub2NpbWllbnRvIGRlIGxvcyB2YWxvcmVzIGRlIGxhcyBkZW3DoXMuIExhIHJlbGFjacOzbiBlc3RhYmxlY2lkYSBlbnRyZSBlbGxhcyBzZXLDoSBkZSBuYXR1cmFsZXphIG5vIGRldGVybWluw61zdGljYSwgZXMgZGVjaXIsIHNlIGZvcm11bGFyw6FuIHJlbGFjaW9uZXMgcHJvYmFiaWzDrXN0aWNhcyB5IHNlIGRlc2Fycm9sbGFyw6FuIHByb2NlZGltaWVudG9zIHBhcmEgaGFjZXIgaW5mZXJlbmNpYXMgc29icmUgbG9zIG1vZGVsb3MgdXRpbGl6YWRvcyBlbiBlc3RlIGVzdHVkaW8sIGFsIG1pc21vIHRpZW1wbyBxdWUgc2Ugb2J0aWVuZW4gbWVkaWRhcyBjdWFudGl0YXRpdmFzIGRlbCBncmFkbyBkZSByZWxhY2nDs24gZW50cmUgbGFzIHZhcmlhYmxlcy4gTG9zIG1vZGVsb3MgYW5hbGl6YWRvcyBwdWVkZW4gY29uc2lkZXJhcnNlIGNhc29zIGVzcGVjaWFsZXMgZGVsIG1vZGVsbyBsaW5lYWwgZ2VuZXJhbGl6YWRvOiBSZWdyZXNpw7NuIExpbmVhbCBTaW1wbGUsIFJlZ3Jlc2nDs24gTGluZWFsIE3Dumx0aXBsZSB5IFJlZ3Jlc2nDs24gTG9nw61zdGljYS4gRW4gY2FkYSBzZWNjacOzbiBzZSBkZXNjcmliaXLDoSB0ZcOzcmljYW1lbnRlIGNhZGEgbW9kZWxvIHkgc2UgYXBsaWNhcsOhIGEgdW4gY29uanVudG8gZGUgZGF0b3MgZXNwZWPDrWZpY28uIFNlIHJlY29ub2NlIHF1ZSBlbCBhbsOhbGlzaXMgZGUgcmVncmVzacOzbiBlcyB1biBwcm9jZXNvIGRlIG5hdHVyYWxlemEgZXN0YWTDrXN0aWNhIHV0aWxpemFkbyBwYXJhIGVzdGltYXIgcmVsYWNpb25lcyBlbnRyZSB2YXJpYWJsZXMgKHVuYSBkZXBlbmRpZW50ZSBvIGRlIHJlc3B1ZXN0YSB5IG90cmFzIGluZGVwZW5kaWVudGVzIG8gcHJlZGljdG9yYXMpIG1lZGlhbnRlIHTDqWNuaWNhcyBkZSBtb2RlbGFkbyB5IGFuw6FsaXNpcyBxdWUgcGVybWl0ZW4gY29tcHJlbmRlciBjw7NtbyB2YXLDrWEgZWwgdmFsb3IgZGUgbGEgdmFyaWFibGUgZGVwZW5kaWVudGUgYWwgY2FtYmlhciBlbCB2YWxvciBkZSB1bmEgbyBtw6FzIHZhcmlhYmxlcyBpbmRlcGVuZGllbnRlcy4gTG9zIG1vZGVsb3MgZGUgYW7DoWxpc2lzIGRlIHJlZ3Jlc2nDs24gZXN0dWRpYWRvcyBlbiBlc3RlIGRvY3VtZW50byBzZXLDoW46IGxpbmVhbCAoc2ltcGxlIHkgbcO6bHRpcGxlKSB5IGxvZ8Otc3RpY28sIHRvZG9zIGVsbG9zIGVudGVuZGlkb3MgY29tbyBjYXNvcyBkZWwgbW9kZWxvIGRlIHJlZ3Jlc2nDs24gbGluZWFsIGdlbmVyYWxpemFkby4NCg0KIyMgKio0LjIuIFJlZ3Jlc2nDs24gTGluZWFsIFNpbXBsZSoqDQoNCkVzdGUgbW9kZWxvLCBxdWUgZXZlbnR1YWxtZW50ZSBzZXLDoSBsbGFtYWRvIGVuIGVzdGUgZXN0dWRpbyBjb21vICoqUkxTKiosIGVzdMOhIGNvbmZvcm1hZG8gcG9yIGRvcyB2YXJpYWJsZXMgZXN0YWTDrXN0aWNhcyAkeCQgeSAkWSQsIGRvbmRlICRZJCBzZSBhc3VtZSBxdWUgZXN0w6EgaW5mbHVpZGEgcG9yICR4JC4gTGEgcmVsYWNpw7NuIGVzdMOhIGRhZGEgbWF0ZW3DoXRpY2FtZW50ZSBwb3I6ICQkWSA9IFxiZXRhXzAgKyBcYmV0YV8xIHggKyBcdmFyZXBzaWxvbiBcaHNwYWNlezEwbW19IFxoc3BhY2V7MTBtbX0oMSkkJCBkb25kZToNCg0KKyAkWSQ6IGVzIHVuYSB2YXJpYWJsZSBkZSByZXNwdWVzdGEgZGUgbmF0dXJhbGV6YSBhbGVhdG9yaWEuDQorICR4JDogZXMgdW5hIHZhcmlhYmxlIHByZWRpY3RvcmEgZGUgbmF0dXJhbGV6YSBubyBhbGVhdG9yaWEuDQorICRcdmFyZXBzaWxvbiQ6IGVzIHVuYSB2YXJpYWJsZSBhbGVhdG9yaWEgbm8gb2JzZXJ2YWJsZS4NCisgJFxiZXRhXzAkIHkgJFxiZXRhXzEkOiBzb24gcGFyw6FtZXRyb3MgcmVhbGVzIGRlc2Nvbm9jaWRvcyBkZWwgbW9kZWxvLg0KDQpFbiBjb21wYXJhY2nDs24gY29uIGVsIG1vZGVsbyBsaW5lYWwgc2ltcGxlIGRldGVybWluw61zdGljbyAkeSA9IFxiZXRhXzAgKyBcYmV0YV8xIHgkLCBlbCBwcm9iYWJsw61zdGljbyBzdXBvbmUgcXVlIGVsIHZhbG9yIGVzcGVyYWRvIGRlICRZJCBlcyB1bmEgZnVuY2nDs24gbGluZWFsIGRlICR4JCwgcGVybyBxdWUgY29uICR4JCBmaWphLCBsYSB2YXJpYWJsZSAkWSQgZGlmaWVyZSBkZSBzdSB2YWxvciBlc3BlcmFkbyBlbiB1bmEgY2FudGlkYWQgYWxlYXRvcmlhICRcdmFyZXBzaWxvbiQuIEFkZW3DoXMsIGxhIGNhbnRpZGFkICRcdmFyZXBzaWxvbiQgZW4gbGEgZWN1YWNpw7NuIGRlIG1vZGVsbyAkKDEpJCBzZSBzdXBvbmUgbm9ybWFsbWVudGUgZGlzdHJpYnVpZGEgY29uICRFKFx2YXJlcHNpbG9uKT0wJCB5ICRWKFx2YXJlcHNpbG9uKT1cc2lnbWFeMiQuIExhIHZhcmlhYmxlIGFsZWF0b3JpYSAkXHZhcmVwc2lsb24kIHRhbWJpw6luIHNlIGNvbm9jZSBjb21vIHTDqXJtaW5vIGRlIGVycm9yIGFsZWF0b3JpbyBvIGRlc3ZpYWNpw7NuIGFsZWF0b3JpYSBlbiBlbCBtb2RlbG8uDQoNCkNvbXBsZW1lbnRhcmlhbWVudGUsIGNhc2kgbnVuY2Egc2Vyw6FuIGNvbm9jaWRvcyBsb3MgdmFsb3JlcyAkXGJldGFfMCQsICRcYmV0YV8xJCB5ICRcc2lnbWFeMiQsIGEgY2FtYmlvIGVzdGFyw6EgZGlzcG9uaWJsZSB1bmEgbXVlc3RyYSBkZSBkYXRvcyBjb21wdWVzdGEgZGUgcGFyZXMgb3JkZW5hZG9zICQoeF8xLHlfMSkuLi4gKHhfbix5X24pJCBjb24gbGEgcXVlIGxvcyBwYXLDoW1ldHJvcyBkZWwgbW9kZWxvIHkgbGEgbMOtbmVhIGRlIHJlZ3Jlc2nDs24gdmVyZGFkZXJhIHB1ZWRlbiBzZXIgZXN0aW1hZG9zLCBiYWpvIGVsIHN1cHVlc3RvIGRlIGluZGVwZW5kZW5jaWEgZGUgbGFzIG9ic2VydmFjaW9uZXMuIEFzw60sICR5X2kkIGVzIGVsIHZhbG9yIG9ic2VydmFkbyBkZSB1bmEgdmFyaWFibGUgYWxlYXRvcmlhICRZX2kkLCBkb25kZSAkWV9pPVxiZXRhXzArXGJldGFfMXhfaStcdmFyZXBzaWxvbl9pJCB5IGxhcyAkbiQgZGVzdmlhY2lvbmVzICRcdmFyZXBzaWxvbl8xJCwgJFx2YXJlcHNpbG9uXzIkLCAkLi4uJCwgJFx2YXJlcHNpbG9uX24kIHNvbiB2YXJpYWJsZXMgaW5kZXBlbmRpZW50ZXMuDQoNCkRlIGFjdWVyZG8gY29uIGVsIG1vZGVsbywgbG9zIHB1bnRvcyBvYnNlcnZhZG9zIGVzdGFyw6FuIGRpc3RyaWJ1aWRvcyBhbGVhdG9yaWFtZW50ZSBhbHJlZGVkb3IgZGUgbGEgbMOtbmVhIGRlIHJlZ3Jlc2nDs24gdmVyZGFkZXJhLiBFbiBlc3RlIHNlbnRpZG8sIGxhIGVzdGltYWNpw7NuIGRlICR5PVxiZXRhXzArXGJldGFfMXgkIGRlYmVyw6Egc2VyIHVuYSBsw61uZWEgcXVlIHNlIGFqdXN0ZSBsbyBtZWpvciBwb3NpYmxlIGEgbG9zIHB1bnRvcyBtdWVzdHJhLiBUYWwgbMOtbmVhIGRlYmVyw6EgcG9zZWVyIGxhIGNhcmFjdGVyw61zdGljYSBkZSBxdWUgbGFzIGRpc3RhbmNpYXMgdmVydGljYWxlcyAoZGVzdmlhY2lvbmVzKSBkZSBsb3MgcHVudG9zIG9ic2VydmFkb3MgYSBsYSBsw61uZWEgbWlzbWEgc29uICoqX3BlcXVlw7Fhc18qKi4gTGEgbWVkaWRhIGRlIGxhIGJvbmRhZCBkZSBhanVzdGUgc2Vyw6EgbGEgc3VtYSBkZSBsb3MgY3VhZHJhZG9zIGRlIGVzdGFzIGRlc3ZpYWNpb25lcy4gRW4gY29uc2VjdWVuY2lhLCBsYSBsw61uZWEgcXVlIG1lam9yIHNlIGFqdXN0YSBzZXLDoSBsYSBxdWUgdGVuZ2EgbGEgc3VtYSBtw6FzIHBlcXVlw7FhIHBvc2libGUgZGUgZGVzdmlhY2lvbmVzIGFsIGN1YWRyYWRvLiBFbCByZXN1bHRhZG8gcXVlIGltcGxpY2EgbGFzIGlkZWFzIGV4cHVlc3RhcyBzZSBjb25vY2UgY29tbzogcHJpbmNpcGlvIGRlIGxvcyBtw61uaW1vcyBjdWFkcmFkb3MgeSBzZSByZW1vbnRhIGEgbG9zIG1hdGVtw6F0aWNvcyBDYXJsIEZyaWVkcmljaCBHYXVzcyB5IEFkcmllbi1NYXJpZSBMZWdlbmRyZSwgZW50cmUgZWwgw7psdGltbyBsdXN0cm8gZGVsIHNpZ2xvIFhWSUlJIHkgZWwgcHJpbWVybyBkZWwgc2lnbG8gWElYLg0KDQpFbCBwcmluY2lwaW8gZGUgbG9zIG3DrW5pbW9zIGN1YWRyYWRvcyBlc3RhYmxlY2UgcXVlIGxhIGRlc3ZpYWNpw7NuIHZlcnRpY2FsIGRlbCBwdW50byAkKHhfaSx5X2kpJCBjb24gcmVzcGVjdG8gYSBsYSBsw61uZWEgJHk9Yl8wK2JfMXgkIGVzICR5X2ktKGJfMCtiXzF4KSQgeSBsYSBzdW1hIGRlIGxhcyBkZXN2aWFjaW9uZXMgdmVydGljYWxlcyBhbCBjdWFkcmFkbyBkZSBsb3MgcHVudG9zICQoeF9pLHlfaSkkIGEgbGEgbMOtbmVhIGVzICRmKGJfMCxiXzEpPVxzdW1fe2k9MX1ebiAoeV9pLShiXzArYl8xeF9pKSleMiQuIEFzw60sIGxhcyBlc3RpbWFjaW9uZXMgcHVudHVhbGVzIGRlICRcYmV0YV8wJCB5ICRcYmV0YV8xJCwgcmVwcmVzZW50YWRhcyBjb21vICRcaGF0e1xiZXRhfV8wJCB5ICRcaGF0e1xiZXRhfV8xJCB5IGxsYW1hZGFzIGVzdGltYWNpb25lcyBkZSBtw61uaW1vcyBjdWFkcmFkb3MsIHNvbiBsb3MgdmFsb3JlcyBxdWUgbWluaW1pemFuIGEgJGYoYl8wLGJfMSkkOyBlcyBkZWNpciwgJGYoXGhhdHtcYmV0YX1fMCxcaGF0e1xiZXRhfV8xKVxsZXEgZihiXzAsYl8xKSQgcGFyYSBjdWFsZXNxdWllcmEgJFxiZXRhXzAkIHkgJFxiZXRhXzEkLiBQb3IgbG8gdGFudG8sIGxhIGzDrW5lYSBkZSByZWdyZXNpw7NuIGVzdGltYWRhIG8gbMOtbmVhIGRlIG3DrW5pbW9zIGN1YWRyYWRvcyBlcyAkeT1caGF0e1xiZXRhfV8wK1xoYXR7XGJldGF9XzF4JC4NCg0KTHVlZ28gZGUgY2FsY3VsYXIgeSByZXNvbHZlciBsYXMgZWN1YWNpb25lcyBlbiBkZXJpdmFkYXMgcGFyY2lhbGVzIGRlICRmKGJfMCxiXzEpJCByZXNwZWN0byBhICRiXzAkIHkgJGJfMSQgaWd1YWxhZGFzIGEgY2Vybywgc2Ugb2J0aWVuZSB1biBzaXN0ZW1hcyBkZSBlY3VhY2lvbmVzIGxsYW1hZGFzIG5vcm1hbGVzIHF1ZSBzb24gbGluZWFsZXMgZW4gJGJfMCQgeSAkYl8xJCB5IHBhcmEgbGFzIGN1YWxlcywgc2llbXByZSBxdWUgcG9yIGxvIG1lbm9zIGRvcyBkZSBsYXMgJHhfaSQgc2VhbiBkaWZlcmVudGVzLCBsYXMgZXN0aW1hY2lvbmVzIGRlIGxvcyBtw61uaW1vcyBjdWFkcmFkb3Mgc29uIGxhIMO6bmljYSBzb2x1Y2nDs24gZGVsIHNpc3RlbWEuIEVuIGNvbnNlY3VlbmNpYSwgbGEgZXN0aW1hY2nDs24gZGUgbG9zIG3DrW5pbW9zIGN1YWRyYWRvcyBkZSAkXGJldGFfMSQgZGUgbGEgbMOtbmVhIGRlIHJlZ3Jlc2nDs24gdmVyZGFkZXJhIGVzOiAkJFxoYXR7XGJldGF9XzE9XGRmcmFje1xzdW1fe2k9MX1ebih4X2ktXGJhcnt4fSkoeV9pLVxiYXJ7eX0pfXtcc3VtX3tpPTF9Xm4oeF9pLVxiYXJ7eH0pXjJ9PVxkZnJhY3tTX3t4eX19e1Nfe3h4fX1caHNwYWNlezEwbW19KDIpJCQgeSBsYSBlc3RpbWFjacOzbiBkZSBsb3MgbcOtbmltb3MgY3VhZHJhZG9zIGRlICRcYmV0YV8wJCBkZSBsYSBsw61uZWEgZGUgcmVncmVzacOzbiB2ZXJkYWRlcmEgZXM6ICQkXGhhdHtcYmV0YX1fMD1cZGZyYWN7XHN1bV97aT0xfV5ueV9pLVxoYXR7XGJldGF9XzFcc3VtX3tpPTF9Xm54X2l9e259PVxiYXJ7eX0tXGhhdHtcYmV0YX1fMVxiYXJ7eH1caHNwYWNlezEwbW19KDMpJCQgUGFyYSBoYWNlciBsb3MgY8OhbGN1bG9zIHF1ZSBsYXMgZWN1YWNpb25lcyBhbnRlcmlvcmVzIGRlbWFuZGFuIGVzIG5lY2VzYXJpbyByZWR1Y2lyIGFsIG3DrW5pbW8gbG9zIGVmZWN0b3MgZGUgcmVkb25kZW8uIFRhbWJpw6luLCBhbnRlcyBkZSBjYWxjdWxhciAkXGhhdHtcYmV0YX1fMSQgeSAkXGhhdHtcYmV0YX1fMCQgc2UgZGViZSBleGFtaXIgZ3LDoWZpY2FtZW50ZSBlbCBjb25qdW50byBkZSBkYXRvcyBwb3IgdXNhciBwYXJhIHBlcmNpYmlyIGxhIGZhY3RpYmlsaWRhZCBkZSB1c28gZGUgdW4gbW9kZWxvIHByb2JhYmlsw61zdGljbyBsaW5lYWwsIGVzIGRlY2lyLCBzaSBncsOhZmljYW1lbnRlIGxvcyBwdW50b3MgZXN0w6FuIGxlam9zIGRlIHRlbmRlciBhIGFnbG9tZXJhcnNlIGVuIHRvcm5vIGEgdW5hIGzDrW5lYSByZWN0YSBjb24gYXByb3hpbWFkYW1lbnRlIGVsIG1pc21vIGdyYWRvIGRlIGRpc3BlcnNpw7NuIGRlIHRvZGFzIGxhcyAkeF9pJCwgZW50b25jZXMgZGViZW4gc2VyIGluZGFnYWRvcyBvdHJvcyBtb2RlbG9zLg0KDQpFcyBpbmRpc3BlbnNhYmxlIG1lbmNpb25hciBxdWUgbGEgbMOtbmVhIGRlIG3DrW5pbW9zIGN1YWRyYWRvcyBkZWJlIHVzYXJzZSByZXN0cmluZ2lkYW1lbnRlIHBhcmEgcHJlZGVjaXIgdmFsb3JlcyBkZSAkeCQgKipfbGVqYW5vc18qKiBkZWwgcmFuZ28gZGUgbG9zIGRhdG9zLCBwb3JxdWUgbGEgcmVsYWNpw7NuIGFqdXN0YWRhIHB1ZWRlIGNhcmVjZXIgZGUgdmFsaWRleiBwYXJhIGVsbG9zLg0KDQpBaG9yYSwgZWwgcGFyw6FtZXRybyAkXHNpZ21hXjIkIHF1ZSBkZXRlcm1pbmEgbGEgY2FudGlkYWQgZGUgdmFyaWFiaWxpZGFkIGVzIGluaGVyZW50ZSBlbiBlbCBtb2RlbG8gZGUgcmVncmVzacOzbiBkZXNjcml0bzogc3UgdmFsb3IgY29uZHVjaXLDoSBhIGVzdGFibGVjZXIgcXVlIGxvcyB2YWxvcmVzIG9ic2VydmFkb3MgZXN0YXLDoW4gZGlzcGVyc29zIGVuIG1heW9yIG8gbWVub3IgbWVkaWRhIGVuIHRvcm5vIGEgbGEgbMOtbmVhIGRlIHJlZ3Jlc2nDs24gdmVyZGFkZXJhLiBBc8OtLCBsb3MgcmVzaWR1b3MgJHlfaSAtIFxoYXR7eV9pfSQgc29uIGxhcyBkZXN2aWFjaW9uZXMgdmVydGljYWxlcyBjb24gcmVzcGVjdG8gYSBsYSBsw61uZWEgZXN0aW1hZGEuIFNpIHRvZG9zIGxvcyByZXNpZHVvcyBzb24gcGVxdWXDsW9zIGNvbXBhcmFkb3MgY29uIGNlcm8sIGVudG9uY2VzIGxhIHZhcmlhYmlsaWRhZCBkZSBsb3MgdmFsb3JlcyAkeSQgb2JzZXJ2YWRvcyBzZSBkZWJlcsOtYSBlbiB1bmEgZWxldmFkYSBtZWRpZGEgYSBsYSByZWxhY2nDs24gbGluZWFsIGVudHJlICR4JCB5ICR5JCwgbWllbnRyYXMgcXVlIHNpIGxvcyByZXNpZHVvcyBzb24gZ3JhbmRlcyBjb21wYXJhZG9zIGNvbiBjZXJvLCBlbnRvbmNlcyBxdWVkYSBzdWdlcmlkYSB1bmEgdmFyaWFiaWxpZGFkIGluaGVyZW50ZSBlbiAkeSQgY29uIHJlc3BlY3RvIGEgbGEgY2FudGlkYWQgZGViaWRhIGEgbGEgcmVsYWNpw7NuIGxpbmVhbC4gQXPDrSwgbGEgZXN0aW1hY2nDs24gZGUgJFxzaWdtYV4yJCBlbiB1biBhbsOhbGlzaXMgZGUgcmVncmVzacOzbiBlc3TDoSBiYXNhZGEgZW4gZWwgY8OhbGN1bG8gZGUgbGEgc3VtYSBkZSBjdWFkcmFkb3MgcmVzaWR1YWxlcyAobyBzdW1hIGRlIGN1YWRyYWRvcyBkZWwgZXJyb3IgU0NFKSBxdWUgc2UgcmVkdWNlIGE6ICQkU0NFPVxzdW1fe2k9MX1ebnlfaV4yLVxoYXR7XGJldGF9XzBcc3VtX3tpPTF9Xm55X2ktXGhhdHtcYmV0YX1fMVxzdW1fe2k9MX1ebnhfaXlfaVxoc3BhY2V7MTBtbX0oNCkkJCAkJFxoYXRcc2lnbWFeMj1zXjI9XGRmcmFje1NDRX17bi0yfVxoc3BhY2V7MTBtbX0oNSkkJCBTaSBzZSBoYSBlbnRlbmRpZG8gcXVlIGxhIGNhbnRpZGFkIFNDRSBlc3RhYmxlY2UgdW5hIG1lZGlkYSBkZSBjdcOhbnRhIHZhcmlhY2nDs24gZGUgJHkkIGVzIGluZXhwbGljYWRhIHBvciBlbCBtb2RlbG87IGVzIGRlY2lyLCBzaW4gYXRyaWJ1Y2nDs24gYSBsYSByZWxhY2nDs24gbGluZWFsLCBzZSBlbnRlbmRlcsOhIHRhbWJpw6luIHF1ZSBleGlzdGUgb3RyYSBjYW50aWRhZCBsbGFtYWRhIGxhIHN1bWEgdG90YWwgZGUgbG9zIGN1YWRyYWRvcyBTVEMsIHF1ZSBwZXJtaXRlIG9idGVuZXIgdW5hIG1lZGlkYSBkZSBsYSBjYW50aWRhZCBkZSB2YXJpYWNpw7NuIHRvdGFsIGVuIGxvcyB2YWxvcmVzICR5JCBvYnNlcnZhZG9zOiAkJFNUQz1cc3VtX3tpPTF9Xm55X2leMi1cZnJhY3soXHN1bV97aT0xfV5ueV9pKV4yfXtufVxoc3BhY2V7MTBtbX0oNikkJCBTaSBzZSBmb3JtdWxhIGxhIHJhesOzbiAkU0NFL1NUQyQgc2UgY2FsY3VsYSBsYSBwcm9wb3JjacOzbiBkZSB2YXJpYWNpw7NuIHRvdGFsIGluZXhwbGljYWRhIHBvciBlbCBtb2RlbG8gZGUgcmVncmVzacOzbiBsaW5lYWwgc2ltcGxlOyBwb3IgbG8gdGFudG8sIHNlIGxsZWdhIGEgbGEgZGVmaW5pY2nDs24gZGVsIGNvZWZpY2llbnRlIGRlIGRldGVybWluYWNpw7NuICRyXjIkOiAkJHJeMj0xLVxmcmFje1NDRX17U1RDfVxoc3BhY2V7MTBtbX0oNykkJCBxdWUgc2UgaW50ZXJwcmV0YSBjb21vIGxhIHByb3BvcmNpw7NuIGRlIHZhcmlhY2nDs24gJHkkIG9ic2VydmFkYSBxdWUgcHVlZGUgc2VyIGV4cGxpY2FkYSBwb3IgZWwgbW9kZWxvIGRlIHJlZ3Jlc2nDs24gbGluZWFsIHNpbXBsZTsgZXMgZGVjaXIsIGFxdWVsbGEgYXRyaWJ1aWRhIGEgdW5hIHJlbGFjacOzbiBsaW5lYWwgYXByb3hpbWFkYSBlbnRyZSAkeCQgeSAkeSQ6IG1pZW50cmFzIG3DoXMgY2VyY2FubyBhIDEgc2VhICRyXjIkLCBtw6FzIGV4aXRvc28gZXMgZWwgbW9kZWxvIGRlIHJlZ3Jlc2nDs24gbGluZWFsIHNpbXBsZSBhbCBleHBsaWNhciBsYSB2YXJpYWNpw7NuIGRlICR5JC4gVW5hIGZvcm1hIGFsdGVybmF0aXZhIGRlIGNhbGN1bGFyIGVsIGNvZWZpY2llbnRlIGRlIGRldGVybWluYWNpw7NuIHNlIGJhc2EgZW4gbGEgc3VtYSBkZSBjdWFkcmFkb3MgZGViaWRhZCBhIGxhIHJlZ3Jlc2nDs24gU0NSIChvIGFsIG1vZGVsbyBkZSByZWdyZXNpw7NuIFNDTSksIHF1ZSBlcyBsYSBjYW50aWRhZCBkZSB2YXJpYWNpw7NuIHRvdGFsIHF1ZSBlcyBleHBsaWNhZGEgcG9yIGVsIG1vZGVsby4gQ29uIGJhc2UgZW4gZWxsYSBlbCBjb2VmaWNpZW50ZSBkZSBkZXRlcm1pbmFjacOzbiBzZSBleHByZXNhIGNvbW86ICQkcl4yPTEtXGZyYWN7U0NFfXtTVEN9PVxmcmFje1NUQy1TQ0V9e1NUQ309XGZyYWN7U0NSfXtTVEN9XGhzcGFjZXsxMG1tfSg4KSQkQ29tbyBzZSBzYWJlLCBjdWFscXVpZXIgY2FudGlkYWQgY2FsY3VsYWRhIGEgcGFydGlyIGRlIGRhdG9zIG11ZXN0cmFsZXMgdmFyw61hIGRlIHVuYSBjYW50aWRhZCBhIG90cmEsIGVuIGVzdGUgc2VudGlkbywgbG9zIHByb2NlZGltaWVudG9zIGluZmVyZW5jaWFsZXMgZXN0YW5kYXJpemFuIHVuIGVzdGltYWRvciByZXN0YW5kbyBzdSB2YWxvciBtZWRpbyB5IGx1ZWdvIGRpdmlkacOpbmRvbG8gZW50cmUgc3UgZGVzdmlhY2nDs24gZXN0w6FuZGFyIGVzdGltYWRhLiBFbiBwYXJ0aWN1bGFyLCBwYXJhIHVuIG1vZGVsbyBzdXB1ZXN0byBkZSByZWdyZXNpw7NuIGxpbmVhbCBzaW1wbGUgc2UgaW1wbGljYSBxdWUgbGFzIHZhcmlhYmxlcyBlc3TDoW5kYXJlczogJHRfeyhuLTIpfT1cZGZyYWN7XGhhdHtcYmV0YX1fMC1cYmV0YV8wfXtcaGF0e1xzaWdtYX0gXHNxcnR7MS9uK1xiYXJ7eH1eMi9TX3t4eH19fSQgeSAkdF97KG4tMil9PVxkZnJhY3tcaGF0e1xiZXRhfV8xLVxiZXRhXzF9eyBcaGF0e1xzaWdtYX0gXHNxcnR7MS9TX3t4eH19fSQgdGllbmVuIGRpc3RyaWJ1Y2lvbmVzICR0JCBjb24gJG4tMiQgZ3JhZG9zIGRlIGxpYmVydGFkLiBEZSBlc3RvIHNlIGRlZHVjZSBxdWUgbG9zIGludGVydmFsb3MgZGUgY29uZmlhbnphIGRlICQxMDAqKDEtXGFscGhhKVwlJCBwYXJhIGxhIHBlbmRpZW50ZSAkXGJldGFfMSQgeSBlbCBpbnRlcmNlcHRvICRcYmV0YV8wJCBkZSBsYSBsw61uZWEgZGUgcmVncmFzacOzbiB2ZXJkYWRlcmEgc29uOiAkJFxoYXR7XGJldGF9XzAgXHBtIHRfe1xhbHBoYS8yLCBuLTJ9IFxjZG90ICBcaGF0e1xzaWdtYX0gXHNxcnR7MS9uK1xiYXJ7eH1eMi9TX3t4eH19XGhzcGFjZXsxMG1tfSg5KSQkICQkXGhhdHtcYmV0YX1fMSBccG0gdF97XGFscGhhLzIsIG4tMn0gXGNkb3QgIFxoYXR7XHNpZ21hfSBcc3FydHsxL1Nfe3h4fX0gXGhzcGFjZXsxMG1tfSAgKDEwKSQkZXN0b3MgaW50ZXJ2YWxvcyBlc3TDoW4gY2VudGFyYWRvcyBlbiBsYSBlbiBsYSBlc3RpbWFjacOzbiBwdW50dWFsIGRlIGNhZGEgcGFyw6FtZXRybyB5IGxhIGNhbnRpZGFkIGFiYXJjYWRhIGEgY2FkYSBsYWRvIGRlIGxhIGVzdGltYWNpw7NuIGRlcGVuZGUgZGVsIG5pdmVsIGRlIGNvbmZpYW56YSBkZXNlYWRvIHkgZGUgbGEgY2FudGlkYWQgZGUgdmFyaWFiaWxpZGFkIGRlbCBlc3RpbWFkb3IuDQoNCkRhZG8gbG8gYW50ZXJpb3IsIHBhcmEgbG9zIHByb2NlZGltaWVudG9zIGRlIHBydWViYSBkZSBoaXDDs3Rlc2lzLCB5IGNvbW8gc2UgcHJvY2VkZSBoYWJpdHVhbG1lbnRlLCBsYXMgaGlww7N0ZXNpcyBudWxhcyByZXNwZWN0byBhIGxvcyBiZXRhIGRlbCBtb2RlbG8gZGUgcmVncmVzacOzbiBsaW5lYWwgc2ltcGxlIHNlcsOhbiBlbnVuY2lhZG9zIGRlIGlndWFsZGFkLiBMb3MgdmFsb3JlcyBudWxvcyBwYXJhICRcYmV0YV8wJCB5ICRcYmV0YV8xJCBzZSByZXByZXNlbnRhbiByZXNwZWN0aXZhbWVudGUgY29tbyAkXGJldGFfezAwfSQgKCJiZXRhIGNlcm8gY2VybyIpIHkgJFxiZXRhX3sxMH0kICgiYmV0YSB1bm8gY2VybyIpLiBBZGVtw6FzLCBjb21vIGxvcyBlc3RhZMOtc3RpY29zIGRlIHBydWViYSB0aWVuZW4gZGlzdHJpYnVjaW9uZXMgJHQkIGNvbiAkbi0yJCBncmFkb3MgZGUgbGliZXJ0YWQgY3VhbmRvICRIXzAkIGVzIHZlcmRhZGVyYSwgbGEgcHJvYmFiaWxpZGFkIGRlIGVycm9yIFRpcG8gSSBwZXJtYW5lY2UgYWwgbml2ZWwgZGVzZWFkbyAkXGFscGhhJCB1c2FuZG8gdW4gdmFsb3IgY3LDrXRpY28gJHQkIGFkZWN1YWRvLiBBc8OtLCBsYXMgaGlww7N0ZXNpcyBjb23Dum5tZW50ZSB1c2FkYXMgcGFyYSAkXGJldGFfMCRzb246ICQkSF8wOiBcYmV0YV8wID0gXGJldGFfezAwfVxoc3BhY2V7MTBtbX0oMTEpJCQgJCRIXzE6IFxiZXRhXzAgXG5lcSBcYmV0YV97MDB9XGhzcGFjZXsxMG1tfSgxMikkJGN1eW8gZXN0YWTDrXN0aWNvIGRlIHBydWViYSBlczogJCR0X3sobi0yKX09XGRmcmFje1xoYXR7XGJldGF9XzAtXGJldGFfezAwfX17XGhhdHtcc2lnbWF9IFxzcXJ0ezEvbitcYmFye3h9XjIvU197eHh9fX1caHNwYWNlezEwbW19KDEzKSQkeSBwYXJhICRcYmV0YV8xJCBzb246DQokJEhfMDogXGJldGFfMSA9IFxiZXRhX3sxMH1caHNwYWNlezEwbW19KDE0KSQkIA0KJCRIXzE6IFxiZXRhXzEgXG5lcSBcYmV0YV97MTB9XGhzcGFjZXsxMG1tfSgxNSkkJGN1eW8gZXN0YWTDrXN0aWNvIGRlIHBydWViYSBlczokJHRfeyhuLTIpfT1cZGZyYWN7XGhhdHtcYmV0YX1fMS1cYmV0YV97MTB9fXtcaGF0e1xzaWdtYX0gXHNxcnR7MS9TX3t4eH19fVxoc3BhY2V7MTBtbX0oMTYpJCRlbCBwYXIgZGUgaGlww7N0ZXNpcyBkZWZpbmlkYXMgcG9yICQxNCQsICQxNSQgeSAkMTYkIHNlIGNvbm9jZSBjb21vIGxhIHBydWViYSBkZSB1dGlsaWRhZCBkZWwgbW9kZWxvIGRlIHJlZ3Jlc2nDs24gbGluZWFsIHNpbXBsZSwgZG9uZGU6IGxhIHJlZ2nDs24gZGUgcmVjaGF6byBkZSAkSF8wJCBwYXJhIHVuYSBwcnVlYmEgYSBuaXZlbCAkXGFscGhhJCBhIGZhdm9yIGRlICRIXzE6IFxiZXRhXzE+XGJldGFfezEwfSQgZXMgJHRcZ2VxIHRfe1xhbHBoYSxuLTJ9JDsgbGEgcmVnacOzbiBkZSByZWNoYXpvIGRlICRIXzAkIHBhcmEgdW5hIHBydWViYSBhIG5pdmVsICRcYWxwaGEkIGEgZmF2b3IgZGUgJEhfMTogXGJldGFfMTxcYmV0YV97MTB9JCBlcyAkdFxsZXEgLXRfe1xhbHBoYSxuLTJ9JDsgeSBsYSByZWdpw7NuIGRlIHJlY2hhem8gZGUgJEhfMCQgcGFyYSB1bmEgcHJ1ZWJhIGEgbml2ZWwgJFxhbHBoYSQgYSBmYXZvciBkZSAkSF8xOiBcYmV0YV8xXG5lcVxiZXRhX3sxMH0kIGVzICR0XGxlcSAtdF97XGFscGhhLzIsbi0yfSQgbyAkdFxnZXEgdF97XGFscGhhLzIsbi0yfSQuIEFkZW3DoXMsIHNlIHNhYmUgcXVlIGxhIHBydWViYSBkZSB1dGlsaWRhZCBkZWwgbW9kZWxvIGRlIHJlZ3Jlc2nDs24gc2ltcGxlIHB1ZWRlIHNlciBwcm9iYWRhIGNvbiB1bmEgdGFibGEgQU5PVkE6IHJlY2hhemFuZG8gJEhfMCQgc2kgJGZcZ2VxIEZfe1xhbHBoYSwxLG4tMn0kLiBMYSBwcnVlYmEgJEYkIGRhIGV4YWN0YW1lbnRlIGVsIG1pc21vIHJlc3VsdGFkbyBxdWUgbGEgcHJ1ZWJhICR0JCBkZSB1dGlsaWRhZCBkZWwgbW9kZWxvIGRlIHJlZ3Jlc2nDs24gbGluZWFsIHNpbXBsZS4NCg0KUG9yIMO6bHRpbW8sIHNlIGVudGllbmRlIHF1ZSBlbiB1biBtb2RlbG8gZGUgcmVncmVzacOzbiBsaW5lYWwgc2ltcGxlIHVuIHZhbG9yIGZ1dHVybyBkZSAkWSQgbm8gZXMgcGFyw6FtZXRybyBzaW5vIHVuYSB2YXJpYWJsZSBhbGVhdG9yaWEsIHBvciBsbyBxdWUgc2UgZGViZSBoYWNlciByZWZlcmVuY2lhIGEgdW4gaW50ZXJ2YWxvIGRlIHZhbG9yZXMgZmFjdGlibGVzIHBhcmEgdW4gdmFsb3IgZnV0dXJvIGRlICRZJCwgYWwgY3VhbCBzZSBsZSBsbGFtYSBpbnRlcnZhbG8gZGUgcHJlZGljY2nDs24uIEN1YW5kbyBzZSBwcmVkaWNlIGNvbiBiYXNlIGVuIGVsIG1vZGVsbyBkZSByZWdyZXNpw7NuIGxpbmVhbCBzaW1wbGUsIGVsIGVycm9yIGRlIHByZWRpY2Npw7NuIGVzICRZLSggXGhhdHtcYmV0YX1fMCsgXGhhdHtcYmV0YX1fMSB4XiopJCBxdWUgY29ycmVzcG9uZGUgY29uIHVuYSBkaWZlcmVuY2lhIGVudHJlIGRvcyB2YXJpYWJsZXMgYWxlYXRvcmlhcywgcG9yIGxvIHF1ZSwgZW4gY29tcGFyYWNpw7NuIGNvbiB1bmEgZXN0aW1hY2nDs24sIGhhYnLDoSBtw6FzIGluY2VydGlkdW1icmUgZW4gZXNlOyBwb3IgbG8gdGFudG8sIHVuIGludGVydmFsbyBkZSBwcmVkaWNjacOzbiBzZXLDoSBtw6FzIGFuY2hvIHF1ZSB1biBpbnRlcnZhbG8gZGUgY29uZmlhbnphLiBBZGVtw6FzLCBhIHBhcnRpciBkZSBsYSB2YXJpYW56YSBkZWwgZXJyb3IgZGUgcHJlZGljY2nDs24gc2UgcHVlZGUgZXN0YWJsZWNlciBxdWUgbGEgdmFyaWFibGUgZXN0YW5kYXJpemFkYTogJCRUPVxkZnJhY3tZLShcaGF0e1xiZXRhfV8wKyBcaGF0e1xiZXRhfV8xIHheKil9e1MgXGRpc3BsYXlzdHlsZVxzcXJ0ezErXGRmcmFjezF9e259ICArIFxkZnJhY3soeF4qLVxiYXJ7eH0pXjJ9e1Nfe3h4fX19fVxoc3BhY2V7MTBtbX0oMTcpJCQgdGllbmUgdW5hIGRpc3RyaWJ1Y2nDs24gJHQkIGNvbiAkbi0yJCBncmFkb3MgZGUgbGliZXJ0YWQsIGEgcGFydGlyIGRlIGxhIGN1YWwgc2Ugb2J0aW5lIHVuIGludGVydmFsbyBkZSBwcmVkaWNjacOzbiBkZSAkMTAwKigxLVxhbHBoYSlcJSQgcGFyYSB1bmEgb2JzZXJ2YWNpw7NuICRZJCBmdXR1cmEgcXVlIHNlIGhhcsOhIGN1YW5kbyAkeD14XiokIGlndWFsIGE6ICQkXGhhdHtcYmV0YX1fMCtcaGF0e1xiZXRhfV8xIHheKlxwbSB0X3tuLTIsXGFscGhhLzJ9XGNkb3QgcyBcZGlzcGxheXN0eWxlXHNxcnR7MStcZGZyYWN7MX17bn0rXGRmcmFjeyh4XiotXGJhcnt4fSleMn17U197eHh9fX1caHNwYWNlezEwbW19KDE4KSQkIExhIGludGVycHJldGFjacOzbiBkZWwgbml2ZWwgZGUgcHJlZGljY2nDs24gZGUgJDEwMCooMS1cYWxwaGEpXCUkIGVzdGFibGVjZSBxdWUgYWwgdXNhciAkKDE4KSQgcmVwZXRpZGFtZW50ZSwgbG9zIGludGVydmFsb3MgcmVzdWx0YW50ZXMgY29udGVuZHLDoW4gbG9zIHZhbG9yZXMgJHkkIG9ic2VydmFkb3MgZWwgJDEwMCooMS1cYWxwaGEpXCUkIGRlbCB0aWVtcG8uIEFkZW3DoXMsIGVsIG7Dum1lcm8gJDEkIGVuIGxhIHJhw616IGN1YWRyYWRhIGhhY2UgcXVlIGVsIGludGVydmFsbyBkZSBwcmVkaWNjacOzbiBzZWEgbcOhcyBhbmNobyBxdWUgaW50ZXJ2YWxvcyBkZSBjb25maWFuemEgY29tbyAkKDkpJCB5ICQoMTApJC4gQXNpbWlzbW8sIGEgbWVkaWRhIHF1ZSAkblx0b1xpbmZ0eSQgZWwgYW5jaG8gZGVsIGludGVydmFsbyBubyB0aWVuZGUgYSBjZXJvLCBwb3JxdWUgbGEgaW5jZXJ0aWR1bWJyZSBlbiBsYSBwcmVkaWNjacOzbiBzZXLDoSBwZXJtYW5lbnRlLCBpbmNsdXNvIGFsIHRlbmVyIGNvbm9jaW1pZW50byBwZXJmZWN0byBzb2JyZSAkXGJldGFfMCQgeSAkXGJldGFfMSQuDQoNCioqUGxhbnRlYW1pZW50byBkZWwgUHJvYmxlbWEqKg0KDQpDb24gYmFzZSBlbiBlbCBjb25qdW50byBkZSBkYXRvcyBkZXNjcml0byBlbiBsYSAqKmZhc2UgMioqIHNlIGZvcm11bGFyw6EgdW4gbW9kZWxvIGRlIHJlZ3Jlc2nDs24gbGluZWFsIHNpbXBsZSBwYXJhIGVzdHVkaWFyIGxhIHJlbGFjacOzbiBsaW5lYWwgc3VwdWVzdGEgZW50cmUgbGFzIHZhcmFpYmxlcyBkZWZpbmlkYXMgcG9yIGxvcyBjYW1wb3M6ICoqRnJlY0NfTWF4KiogKFZhcmlhYmxlIGRlcGVuZGllbnRlKSB5ICoqQ29sZXN0ZXJvbCoqICh2YXJpYWJsZSBpbmRlcGVuZGllbnRlKS4NCg0KKipEZXNhcnJvbGxvIGRlbCBBbsOhbGlzaXMqKg0KDQpFbiBlbCBzaWd1aWVudGUgZGVzYXJyb2xsbyBkZWwgYW7DoWxpc2lzIHNlIGhhcmEgZW4gUiBTdHV0aW8geSBlc3RlIG1pc21vIGNvbnRhcmEgY29uIHZhcmlhcyBzZWNjaW9uZXMgcXVlIHNlIHByZXNlbnRhcmFuIGEgY29udGludWFjaW9uLg0KDQojIyMgKio0LjIuMS4gUmVzdW1lbiBlc3RhZMOtc3RpY28gZGUgbGFzIHZhcmlhYmxlcyBwb3IgZXN0dWRpYXIuKiogey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KRW4gYmFzZSBhIGxhIG5hdmVnYWNpb24gYSB0cmF2w6lzIGRlIHBlc3Rhw7FhcyBtdWVzdHJhIGVsIHJlc3VtZW4gZXN0YWRpc3RpY28gZGUgbGFzIHZhcmlhYmxlcyBkZSBpbnRlcmVzOiAqKkZyZWNDX01heCoqIChWYXJpYWJsZSBkZXBlbmRpZW50ZSkgeSAqKkNvbGVzdGVyb2wqKiAodmFyaWFibGUgaW5kZXBlbmRpZW50ZSkganVudG8gY29uIHN1cyByZXBlY3Rpdm9zIGRpYWdyYW1hcyBkZSBjYWphLiBBZGVtw6FzICBkZSBtYW5lcmEgY29tcGxlbWVudGFyaWEgc2UgaW5jbHV5ZSBlbCBkaWFncmFtYSBkZSBkaXNwZXJzaW9uIGRlIHN1cyB2YWxvcmVzIGNvbmp1bnRvcyBkb25kZSBzZSBjb21wYXJhbiBjb24gbGFzIGRvcyBjb21iaW5hY2lvbmVzIHBvc2libGVzIGVudHJlIGVzdGFzIHZhcmlhYmxlcy4NCg0KRW4gYmFzZSBlbiBsYSBwZXN0YcOxYSAqKlJlc3VtZW4gZGUgQ29sZXN0ZXJvbCoqIHNlIHB1ZWRlIGFwcmVjaWFyIHF1ZSBsYSB2YXJpYWJsZSAqKkNvbGVzdGVyb2wqKiBwcmVzZW50YSB1biBzZXNnbyBsaWplcmFtZW50ZSBuZWdhdGl2byBjb24gdW4gcmFuZ28gY3VhcnRpbGljbyBtdXkgYW5jaG8gZW50cmUgZWwgdGVyY2VyIHkgY3VhcnRvIGN1YXJ0aWwgZXN0byBkZWJpZG8gYSBsYSBwcmVzZW5jaWEgZGUgdmFsb3JlcyBhdGlwaWNvcyBsbyBjdWFsZXMgdGFtYmllbiBlc3RhbiBnZW5lcmFuZG8gZWwgc2VzZ28uIEVuIGNvbXBhcmFjaW9uIHNlZ3VuIGxhIHBlc3Rhw7FhICoqUmVzdW1lbiBkZSBGcmVjQ19NYXgqKiwgbGEgdmFyaWFibGUgKipGcmVjQ19NYXgqKiBzZSBwdWVkZSBhcHJlY2lhciBxdWUgdGllbmUgdW4gc2VzZ28gbWFzIHNpbWV0cmljbyBxdWUgZWwgYW50ZXJpb3IgZGFkbyBxdWUgc3UgbWVkaWEgeSBtZWRpYW5hIHNlIGVuY3VlbnRyYW4gZW4gdmFsb3JlcyBleHRyZW1hZGFtZW50ZSBjZXJjYW5hcyBlbnRyZSBzaSBsbyBjdWFsIG5vcyBpbmRpY2EgcXVlIG5vIG11ZXN0cmEgdmFsb3JlcyBhdGlwaWNvcyB5IGVzdG8gbG8gcG9kZW1vcyBjb21wcm9iYXIgZGUgbWFuZXJhIGdyYWZpY2EuDQoNCkRlIG1hbmVyYSBjb21wbGVtZW50YXJpYSBlbiAqKkRpYWdyYW1hIGRlIERpc3BlcnNpb24gQ29sZXN0ZXJvbCB2cy4gRnJlY0NfTWF4Kiogc2UgcHVlZGUgb2JzZXJ2YXIgcXVlIGV4aXN0ZSB1bmEgY29ycmVsYWNpb24gcG9zaXRpdmEgZGUgbmF0dXJhbGV6YSBhcGFyZW50ZW1lbnRlIGxpbmVhbCBlbnRyZSBsYXMgdmFyaWFibGVzICoqQ29sZXN0ZXJvbCoqIHkgKipGcmVjQ19NYXgqKiwgY2FiZSByZWNhbGNhciBxdWUgdGFtYmllbiBleGlzdGUgdW5hIHZhcmlhbnRlIGRvbmRlIGxhcyBwb3NpY2lvbmVzIGRlIGxhcyB2YXJpYWJsZXMgc2UgaW52aWVydGVuLiBTaSBzZSBvYnNlcnZhIGVsIGdyYWZpY28gZGUgKipEaWFncmFtYXMgVG90YWxlcyBkZSBEaXNwZXJzaW9uKiogKGVuIGRvbmRlIHNlIGV4Y2x1eWVuIGxhcyB2YXJpYWJsZXMgY3VhbGl0YXRpdmFzOjpub21pbmFsZXMpIGVzIHJhem9uYWJsZSBtZW5jaW9uYXIgcXVlIGhheSBvdHJvIHBhciBkZSB2YXJpYWJsZXMgcXVlIG11ZXN0cmFuIHVuYSBjb3JyZWxhY2lvbiBtYXMgaW50ZXJuc2EgZW50cmUgbGFzIG1pc21hcyAqKlBBX3JlcG9zbyoqIHkgKipFZGFkKiouDQoNCiMjIyMgUmVzdW1lbiBkZSBDb2xlc3Rlcm9sDQpgYGB7ciByZXN1bWVuX0NvbGVzdGVyb2wsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0Kc3VtbWFyeShoZWFydF9kaXNlYXNlc19EYXRhc2V0JENvbGVzdGVyb2wpDQpib3hwbG90KGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkQ29sZXN0ZXJvbCwgbWFpbiA9ICJEaWFncmFtYSBkZSBDYWphIGRlIENvbGVzdGVyb2wiLCBjb2wgPSBjKCJvcmFuZ2UiKSkNCmBgYA0KDQojIyMjIFJlc3VtZW4gZGUgRnJlY0NfTWF4DQpgYGB7ciByZXN1bWVuX0ZyZWNDX01heCwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpzdW1tYXJ5KGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkRnJlY0NfTWF4KQ0KYm94cGxvdChoZWFydF9kaXNlYXNlc19EYXRhc2V0JEZyZWNDX01heCwgbWFpbiA9ICJEaWFncmFtYSBkZSBDYWphIGRlIEZyZWNDX01heCIsIGNvbCA9IGMoIm9yYW5nZSIpKQ0KYGBgDQoNCiMjIyMgRGlhZ3JhbWEgZGUgRGlzcGVyc2nDs24gQ29sZXN0ZXJvbCB2cy4gRnJlY0NfTWF4IA0KYGBge3IgZGlzcGVyc2lvbl9DT19GUkUsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KcGxvdChoZWFydF9kaXNlYXNlc19EYXRhc2V0JENvbGVzdGVyb2wsIGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkRnJlY0NfTWF4ICwgbWFpbiA9ICJEaWFncmFtYSBkZSBEaXNwZXJzacOzbiBDb2xlc3Rlcm9sIHZzLiBGcmVjQ19NYXgiKQ0KYGBgDQoNCiMjIyMgRGlhZ3JhbWEgZGUgRGlzcGVyc2nDs24gRnJlY0NfTWF4IHZzLiBDb2xlc3Rlcm9sDQpgYGB7ciBkaXNwZXJzaW9uX0ZSRV9DTywgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpwbG90KGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkRnJlY0NfTWF4LCBoZWFydF9kaXNlYXNlc19EYXRhc2V0JENvbGVzdGVyb2wsIG1haW4gPSAiRGlhZ3JhbWEgZGUgRGlzcGVyc2nDs24gRnJlY0NfTWF4IHZzLiBDb2xlc3Rlcm9sIikNCmBgYA0KDQojIyMjIERpYWdyYW1hcyBUb3RhbGVzIGRlIERpc3BlcnNpw7NuDQpgYGB7ciBkaXNwZXJzaW9uZXNfVG90YWxlcywgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpwYWlycyh+RWRhZCArIFBBX3JlcG9zbyArIENvbGVzdGVyb2wgKyBBWl9BeXVuYXMgKyBGcmVjQ19NYXggKyBPbGRwZWFrLCBkYXRhID0gaGVhcnRfZGlzZWFzZXNfRGF0YXNldCkNCmBgYA0KDQojIyMgKio0LjIuMi4gRm9ybXVsYWNpw7NuIGRlbCBtb2RlbG8gZGUgUkxTIGVudHJlIGxhcyB2YXJpYWJsZXMgZGUgZXN0dWRpbyoqIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNCkVuIGJhc2UgYSBsYSBuYXZlZ2FjaW9uIGEgdHJhdsOpcyBkZSBsYSBwZXN0YcOxYXMgc2UgbXVlc3RyYW4gbG9zIGNvZWZpY2llbnRlcyBkZWwgbW9kZWxvIGRlIHJlZ3JlY2lvbiBsaW5lbGEgc2ltcGxlLCBzdSByZXN1bWVuIGVzdGFkaXN0aWNvIHkgc3UgdGFibGEgQU5PVkEuIFNlIG1lbmNpb25hIGRlIG51ZXZvIHF1ZSBsYXMgdmFyaWFibGVzIGRlIGludGVyZXMgc29uICoqRnJlY0NfTWF4KiogKHZhcmlhYmxlIGRlcGVuZGllbnRlKSB5ICoqQ29sZXN0ZXJvbCoqICh2YXJpYWJsZSBpbmRlcGVuZGllbnRlKS4NCg0KU2UgY29uc2lkZXJvIGxhcyBkb3MgcG9zaWJsZXMgY29tYmluYWNpb25lcyBwZXJvIGZpbmFsbWVudGUgc2UgdXRpbGl6YXJhbiBsb3MgcmVzdWx0YWRvcyBkZSBsYSBwZXN0YcOxYSAqKkNvZWZpY2llbnRlcyBkZWwgTW9kZWxvIFJMUyBGUkUvQ08qKiB5IGEgdHJhdmVzIGRlIGVzdGUgc2UgcHVkbyBlc3RhYmxlY2VyIHF1ZSBlbCBtb2RlbG8gZGUgcmVncmVzaW9uIGxpbmVhbCBzaW1wbGUgcXVlIHJlbGFjaW9uYSBhIGxhcyB2YXJhaWJsZXMgZGUgaW50ZXJlcywgbGFzIGN1YWxlcyBzZSByZXN1bWlyYW4gY29tbyAkRlJFQ00kIHkgJENPTCQsIHNlIHRpZW5lIGxhIGZvcm11bGFjaW9uOg0KJEZSRUNNID0gMTIxLDM3OTU3OTQyICswLDA3MzA0NzI5KkNPTCQgICAgICAgJCgxOSkkDQpQYXJhIGVzdGUgbW9kZWxvIHNlIG9idmlhIGxhIGludGVycHJldGFjaW9uIGRlbCBpbnRlcmNlcHRvIHBvciBjYXJhY3RlciBkZSBzZW50aWRvIGRhZG8gcXVlIHBhcmEgKipGcmVjQ19NYXgqKiBzZSBvYnRlbmRyaWEgdW4gdmFsb3IgbW9kZXJhZG8gc2kgZWwgc3VjZWRlIHVuIHZhbG9yIG51bG8gZW4gKipDb2xlc3Rlcm9sKiogbG8gcXVlIGVzIG1lZGljYW1lbnRlIGltcG9zaWJsZSwgeSBsYSB1bHRpbWEgc2l0dWFjaW9uIGVuIGVzcGVjaWFsIGNhcmVjZSBkZSBzZW50aWRvLCBzaW4gZW1iYXJnbywgZWwgY29lZmljaWVudGUgbGluZWFsIG11ZXN0cmEgdW5hIGNvcnJlbGFjaW9uIGRlIHByb3BvcmNpb25hbGlkYWQgZGlyZWN0YSBlbnRyZSBsYXMgZG9zIHZhcmlhYmxlcyBkZSBpbnRlcmVzLCBhdW5xdWUgY29uIHVuIGNyZWNpbWllbnRvIG1lZGlhbmFtZW50ZSBtb2RlcmFkbyBlbiAqKkZyZWNDX01heCoqIHBvciBjYWRhIHVuaWRhZCBtYXJnaW5hbCBkZSAqKkNvbGVzdGVyb2wqKi4NCg0KRGUgbWFuZXJhIGNvbXBsZW1lbnRhcmlhLCBsYSBwZXN0YcOxYSBkZSAqKlJlc3VtZW4gRXN0YWRpc3RpY28gZGVsIE1vZGVsbyBSTFMgRlJFL0NPKiogc2UgY29uc3RhIHF1ZSBhIGN1YWxxdWllciBuaXZlbCBkZSBzaWduaWZpY2FuY2lhIGxhcyBldmlkZW5jaWFzIGEgZmF2b3Igc29uIHVuIHBvY28gYmFqYXMgcGVybyBlc3RvIGVyYSBkZSBlc3BlcmFyIGRhZG8gZWwgbml2bGUgZGUgY29ycmVsYWNpb24gZXhpc3RlbnRlIGVudHJlIGxhcyB2YXJpYWJsZXMgZGUgaW50ZXJlcy4gQWRlbWFzLCBlbCBuaXZlbCBkZSBkZWwgY29lZmljaWVudGUgZGUgZGV0ZXJtaW5hY2lvbiBlc3RhIGEgZmF2b3IgZGUgbGEgY29ycmVsYWNpb24gY29uIHVuIHJlc3VsdGFkbyBiYWpvIGRlbCAkNSw1NSQgJCUkIGRlIGxhIHZhcmlhYmlsaWRhZCBkZSAqKkZyZWNDX01heCoqIGVzIGV4cGxpY2FkbyBwb3IgKipDb2xlc3Rlcm9sKiosIGVuIHJlc3VtZW4gbG8gcXVlIG5vcyBpbmRpY2EgZXN0ZSByZXN1bHRhZG8gbm9zIHN1Z2llcmUgcXVlIGVsIGNvbGVzdGVyb2wgbm8gZXMgdW4gcHJlZGljdG9yIGZ1ZXJ0ZSBkZSBsYSBmcmVjdWVuY2lhIGNhcmRpYWNhIG1heGltYSB5IHF1ZSBoYXkgb3Ryb3MgZmFjdG9yZXMgaW5mbHV5ZW5kbyBlbiBlc3RhIGNvbW8gZXJhIGRlIGVzcGVyYXJzZSBkYWRvIGVsIGNvbnRleHRvIGVuIGVsIHF1ZSBzZSBlbmN1ZW50cmEsIGVzdG9zIHJlc3VsdGFkb3MgZXJhbiBkZSBlc3BlcmFyc2UgZGFkbyBlbCBmZW5vbWVubyBtZWRpY28gcXVlIHNlIGVzdGEgZXN0dWRpYW5kbywgeSBsbyBhbnRlcmlvcm1lbnRlIG1lbmNpb25hZG8gcXVlZG8gY29uZmlybWFkbyBhIHRyYXZlcyBkZSBsYSBwZXN0YcOxYSAqKlRhYmxhIEFOT1ZBIHBhcmEgZWwgTW9kZWxvIFJMUyBGUkVDL0NPKioNCg0KIyMjIyBDb2VmaWNpZW50ZXMgZGVsIE1vZGVsbyBSTFMgQ08vRlJFDQpgYGB7ciBjb2VmaWNpZW50ZXNfUmVncmVzaW9uX0xpbmVhbF9TaW1wbGVfQ08vRlJFLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCm1vZGVsb19STF9TaW1wbGVfQ09fRlJFID0gbG0oaGVhcnRfZGlzZWFzZXNfRGF0YXNldCRDb2xlc3Rlcm9sfmhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkRnJlY0NfTWF4KQ0KY29lZihtb2RlbG9fUkxfU2ltcGxlX0NPX0ZSRSkNCmBgYA0KDQojIyMjIENvZWZpY2llbnRlcyBkZWwgTW9kZWxvIFJMUyBGUkUvQ08NCmBgYHtyIGNvZWZpY2llbnRlc19SZWdyZXNpb25fTGluZWFsX1NpbXBsZV9GUkUvQ08sIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KbW9kZWxvX1JMX1NpbXBsZV9GUkVfQ08gPSBsbShoZWFydF9kaXNlYXNlc19EYXRhc2V0JEZyZWNDX01heH5oZWFydF9kaXNlYXNlc19EYXRhc2V0JENvbGVzdGVyb2wpDQpjb2VmKG1vZGVsb19STF9TaW1wbGVfRlJFX0NPKQ0KYGBgDQoNCiMjIyMgUmVzdW1lbiBFc3RhZMOtc3RpY28gZGVsIE1vZGVsbyBSTFMgQ08vRlJFDQpgYGB7ciByZXN1bWVuX1JlZ3Jlc2lvbl9MaW5lYWxfU2ltcGxlX0NPL0ZSRSwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpzdW1tYXJ5KG1vZGVsb19STF9TaW1wbGVfQ09fRlJFKQ0KYGBgDQoNCiMjIyMgUmVzdW1lbiBFc3RhZMOtc3RpY28gZGVsIE1vZGVsbyBSTFMgRlJFL0NPDQpgYGB7ciByZXN1bWVuX1JlZ3Jlc2lvbl9MaW5lYWxfU2ltcGxlX0ZSRS9DTywgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpzdW1tYXJ5KG1vZGVsb19STF9TaW1wbGVfRlJFX0NPKQ0KYGBgDQojIyMjIFRhYmxhIEFOT1ZBIHBhcmEgZWwgTW9kZWxvIFJMUyBGUkUvQ08NCmBgYHtyIEFOT1ZBX1JlZ3Jlc2lvbl9MaW5lYWxfU2ltcGxlX0ZSRV9DTywgZmlnLmFsaWduID0gJ2NlbnRlcid9DQphbm92YShtb2RlbG9fUkxfU2ltcGxlX0ZSRV9DTykNCmBgYA0KDQojIyMgKio0LjIuMy4gQW7DoWxpc2lzIGRlbCBtb2RlbG8gUkxTKiogey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KRW4gYmFzZSBhIGxhIG5hdmVnYWNpb24gYSB0cmF2ZXMgZGUgcGVzdGHDsWFzIG11ZXN0cmFuIGVsIGludGVydmFsbyBkZSBjb25maWFuemEgcGFyYSAkXGJldGFfMSQgeSBwYXJhIGxhIHByZWRpY2Npb24gZGVsIG1vZGVsbyBkZSByZWdyZXNpb24gbGluYWwsIGFtYm9zIGVzdGFyw6FuIGFsICQ5NSQgJCUkLiBTZSB2b2x2ZXJhIGEgcmVjYXBpdHVsYXIgc29icmUgY3VhbGVzIHNvbiBsYXMgdmFyaWFibGVzIGRlIGludGVyZXMgcXVlIHNvbjogKipGcmVjQ19NYXgqKiAodmFyaWFibGUgZGVwZW5kaWVudGUpIHkgKipDb2xlc3Rlcm9sKiogKHZhcmlhYmxlIGluZGVwZW5kaWVudGUpLg0KDQpFbCBhbmFsaXNpcyBkZWwgbW9kZWxvIFJMUyBtdWVzdHJhIHF1ZSBubyBtdWVzdHJhIHVuIGdyYW4gYXBvcnRlIGNvbW8gZW4gY3VhbnRvIGEgbGEgdmFyaWFibGUgcHJlZGljdG9yYSBwb3NpYmxlbWVudGUgcG9yIGRpdmVyc29zIGZhY3RvcmVzIGF1biBhc2kgZnVlIHJlbGV2YW50ZSBlc3RpbWFyICoqRnJlY0NfTWF4KiogYSBwYXJ0aXIgZGUgKipDb2xlc3Rlcm9sKiouIEVzdG8gZGViaWRvIGEgcXVlIGVsIGludGVydmFsbyBkZSBjb25maWFuemEgZGUgJENPTCQgZW4gZWwgbW9kZWxvIGV4Y2x1eWUgYWwgY2VybzoNCg0KJDAsMDUzNjc3MzkgPCBcYmV0YV8xIDwgMCwwOTI0MTcxOSQgICAgICAkKDIwKSQNCg0KUG9yIHVsdGltbywgbGEgcGVzdGHDsWEgKipQcmVkaWNjaW9uZXMgeSBJbnRlcnZhbG9zIGRlIFByZWRpY2Npb24qKiBtdWVzdHJhbiBsb3MgY2FsY3Vsb3MgY29uIGJhc2UgZW4gZWwgbW9kZWxvLCBiYWpvIHVuIGludGVydmFsbyBkZSBwcmVkaWNjY2lvbiBhbCAkOTUkICQlJCwgZGUgbGFzIHByZWRpY2Npb25lcyBkZSB0b2RhcyBsYXMgcGVzdGHDsWFzIGRlbCBjb25qdW50byBkZSBkYXRvcyBwYXJhIGxhIHZhcmlhYmxlICoqRnJlY0NfTUF4KiouIENhYmUgcmVjYWxjYXIgcXVlIGVzdG9zIGludGVydmFsb3MgcmVzdWx0YW4gbWFzIGFuY2hvcyBxdWUgZW4gYXF1ZWxsb3MgY2FsY3VsYWRvcyBlbiBsYSBwZXN0YcOxYSAqKlByZWRpY2Npb25lcyB5IHN1cyBpbnRlcnZhbG9zIGRlIGNvbmZpYW56YSoqIHkgZXN0YSBtaXNtYSBjb21vIGxvIGRpY2Ugc3Ugbm9tYnJlIGEgdW4gbWlzbW8gbml2ZWwgZGUgc2lnbmlmaWNhbmNpYS4NCg0KIyMjIyBJbnRlcnZhbG8gZGUgQ29uZmlhbnphIHBhcmEgQjENCmBgYHtyIEludGVydmFsb19Db25maWFuemFfQjEsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KY29uZmludChtb2RlbG9fUkxfU2ltcGxlX0ZSRV9DTywgbGV2ZWwgPSAwLjk1KQ0KYGBgDQoNCiMjIyMgUHJlZGljY2lvbmVzIHkgc3VzIEludGVydmFsb3MgZGUgUHJlZGljY2nDs24NCmBgYHtyIEludGVydmFsb3NfUHJlZGljY2lvbl9QLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCnByZWRpY3QobW9kZWxvX1JMX1NpbXBsZV9GUkVfQ08sIGRhdGEuZnJhbWUoc2VxKDEsOTE3KSksIGludGVydmFsPSdwcmVkaWN0aW9uJywgbGV2ZWwgPSAwLjk1KQ0KYGBgDQoNCiMjIyMgUHJlZGljY2lvbmVzIHkgc3VzIEludGVydmFsb3MgZGUgQ29uZmlhbnphDQpgYGB7ciBJbnRlcnZhbG9zX1ByZWRpY2Npb25fQywgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpwcmVkaWN0KG1vZGVsb19STF9TaW1wbGVfRlJFX0NPLCBkYXRhLmZyYW1lKHNlcSgxLDkxNykpLCBpbnRlcnZhbD0nY29uZmlkZW5jZScsIGxldmVsID0gMC45NSkNCmBgYA0KDQojIyAqKjQuMy4gUmVncmVzacOzbiBMaW5lYWwgTcO6bHRpcGxlKioNCg0KRXN0ZSBtb2RlbG8sIHF1ZSBwdWVkZSBpbmljaWFsbWVudGUgcGVuc2Fyc2UgY29tbyB1bmEgZXh0ZW5zacOzbiBkZSBsYSByZWdyZXNpw7NuIGxpbmVhbCBzaW1wbGUgcGFyYSBmYWNpbGl0YXIgc3UgY29tcHJlbnNpw7NuLCB5IHF1ZSBldmVudHVhbG1lbnRlIHNlcsOhIGxsYW1hZG8gZW4gZXN0ZSBlc3R1ZGlvIGNvbW8gKipSTE0qKiwgdGllbmUgY29tbyBlY3VhY2nDs24gZ2VuZXJhbCBhZGl0aXZhOg0KDQokJHlfaT1cYmV0YV8wK1xiZXRhXzEgeF97aTF9K1xjZG90cytcYmV0YV9rIHhfe2lrfStcdmFyZXBzaWxvbl9pLCBcaHNwYWNlezNtbX1pPTEsMixcZG90cyxuXGhzcGFjZXsxMG1tfSgyMSkkJCANCg0KZG9uZGUgJEUoXGVwc2lsb24pPTAkIHkgJFYoXGVwc2lsb24pPVxzaWdtYV4yJC4gVGFtYmnDqW4sIHBhcmEgaGFjZXIgcHJ1ZWJhcyBkZSBoaXDDs3Rlc2lzIHkgY2FsY3VsYXIgaW50ZXJ2YWxvcyBkZSBjb25maWFuemEgeSBkZSBwcmVkaWNjacOzbiwgc2Ugc3Vwb25lIHF1ZSAkXGVwc2lsb24kIGVzdMOhIG5vcm1hbG1lbnRlIGRpc3RyaWJ1aWRhLiBDb21wbGVtZW50YXJpYW1lbnRlLCBjb24gYmFzZSBlbiBlbCBlbmZvcXVlIGRlIGxvcyBtw61uaW1vcyBjdWFkcmFkb3Mgb3JkaW5hcmlvcywgbGEgZXN0aW1hY2nDs24gZGUgc3VzIHBhcsOhbWV0cm9zIHNlIHBsYW50ZWEgZW4gdMOpcm1pbm9zIGRlIGxhIG1pbmltaXphY2nDs24gZGUgdW5hIGZ1bmNpw7NuIGRlIGVuc2F5byBkZXNkZSBsYSBjdWFsIHNlIG9ic2VydmFuIGxvcyBjdWFkcmFkb3MgZGUgbGFzIGRlc3ZpYWNpb25lcyBkZSBsYSB2YXJpYWJsZSBlc3R1ZGlhZGEuIExhIGZ1bmNpw7NuIGRlIGVuc2F5byBzZSByZXByZXNlbnRhIGNvbW8gJGYoYl8wLGJfMSwuLi4sYl9rKT0gXHN1bV97an1beV9pLShiXzArYl8xeF97MWp9K2JfMnhfezJqfSsuLi4rYl9reF97a2p9KV1eMiQuIEVzdG8gY29uZHVjZSBhIHVuIGNvbmp1bnRvIGRlIGVjdWFjaW9uZXMgbm9ybWFsZXMgbGluZWFsZXMgZW4gJGJfMCxiXzEsLi4uLGJfayQsIHF1ZSBhbCBzZXIgcmVzdWVsdGFzIGVudHJlZ2FuIGxhcyBlc3RpbWFjaW9uZXMgZGUgbcOtbmltb3MgY3VhZHJhZG9zIGRlICRcaGF0e1xiZXRhXzB9LFxoYXR7XGJldGFfMX0sLi4uLCwgXGhhdHtcYmV0YV9rfSQuDQoNCkNvbXBsZW1lbnRhcmlhbWVudGUsIGxhIHByb3BvcmNpw7NuIGRlIHZhcmlhY2nDs24gdG90YWwgZXhwbGljYWRhIHBvciBlbCBtb2RlbG8gZGUgcmVncmVzacOzbiBtw7psdGlwbGUgYSB0cmF2w6lzIGRlbCBjb2VmaWNpZW50ZSBkZSBkZXRlcm1pbmFjacOzbiBtw7psdGlwbGUgc2UgYWp1c3RhLCBnZW5lcmFsbWVudGUsIGNvbiBiYXNlIGVuIGVsIG7Dum1lcm8gZGUgcGFyw6FtZXRyb3MgZGVsIG1vZGVsby4NCg0KQWRlbcOhcywgdW5hIHBydWViYSBkZSB1dGlsaWRhZCBkZWwgbW9kZWxvIGRlIHJlZ3Jlc2nDs24gbGluZWFsIG3Dumx0aXBsZSBjb25zaXN0ZSBlbiB1bmEgcHJ1ZWJhIGRlIGhpcMOzdGVzaXMgYmFzYWRhIGVuIHVuIGVzdGFkw61zdGljbyBxdWUgdGllbmUgdW5hIGRpc3RyaWJ1Y2nDs24gJEYkIHBhcnRpY3VsYXIgY3VhbmRvICRIXzAkIGVzIHZlcmRhZGVyYSwgZXN0byBkZSBleHByZXNhIGVuIGVsIHBhcjoNCg0KJCRIXzA6XGJldGFfMT1cYmV0YV8yPVxjZG90cz1cYmV0YV9rPTBcaHNwYWNlezEwbW19KDIyKSQkDQokJEhfMTogXHRleHQge2FsIG1lbm9zIHVuYSB9XGJldGFfaVxuZXEgMFxoc3BhY2V7NW1tfShpPTEsLi4uLGspXGhzcGFjZXsxMG1tfSgyMykkJCANCg0KZWwgdmFsb3IgZGVsIGVzdGFkw61zdGljbyBkZSBwcnVlYmEgZXM6DQoNCiQkZj1cZnJhY3tSXjIva317KDEtUl4yKShuLShrKzEpKX09XGZyYWN7U0NSL2t9e1NDRS8obi0oaysxKSl9PVxmcmFje1JNQ317Q01FfVxoc3BhY2V7MTBtbX0oMjQpJCQgDQoNCmRvbmRlICRTQ1I9U1RDLVNDRSQsIHF1ZSBlcyBsYSBzdW1hIGRlIGN1YWRyYWRvcyBkZSByZWdyZXNpw7NuLCB5IGxhIHJlZ2nDs24gZGUgcmVjaGF6byBwYXJhIHVuYSBwcnVlYmEgZGUgbml2ZWwgJFxhbHBoYSQgZXM6IA0KDQokJGZcZ2VxIEZfe1xhbHBoYSwgayxuLShrKzEpfVxoc3BhY2V7MTBtbX0oMjUpJCQgDQoNClBvciDDumx0aW1vLCB1biBpbnRlcnZhbG8gZGUgY29uZmlhbnphIGFsICQxMDAoMS1cYWxwaGEpXCUkIHBhcmEgJFxiZXRhX2kkIGVzOiANCg0KJCRcaGF0XGJldGFfaVxwbSB0X3tcYWxwaGEvMixuLShrKzEpfVxjZG90IHNfe1xoYXRcYmV0YV97aX19XGhzcGFjZXsxMG1tfSgyNikkJCANCnkgdW4gaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSBhbCBtaXNtbyBuaXZlbCBkZSBzaWduaWZpY2FuY2lhIHBhcmEgdW4gdmFsb3IgZnV0dXJvIGVzdMOhIGRhZG8gcG9yOiANCg0KJCRcaGF0IHlccG0gdF97XGFscGhhLzIsbi0oaysxKX1cY2RvdCBcc3FydHtzXjIrc14yX3tcaGF0IFl9fVxoc3BhY2V7MTBtbX0oMjcpJCQgDQoNClBhcmEgY2VycmFyLCBlcyBuZWNlc2FyaW8gbWVuY2lvbmFyIHF1ZSBldmVudHVhbG1lbnRlIHN1cmdlbiBwcm9ibGVtYXMgZW4gbG9zIGFuw6FsaXNpcyBkZSByZWdyZXNpw7NuIG3Dumx0aXBsZSBxdWUgaW1wbGljYW4gY29uc2lkZXJhciB0w6ljbmljYXMgZGUgc29sdWNpw7NuIHJlbGFjaW9uYWRhcyBjb24gdHJhbnNmb3JtYWNpb25lcyBkZSBuby1saW5lYWxpZGFkLCBlc3RhbmRhcml6YWNpw7NuIHkgc2VsZWNjacOzbiBkZSB2YXJpYWJsZXMsIGlkZW50aWZpY2FjacOzbiBkZSBvYnNlcnZhY2lvbmVzIGluZmx1eWVudGVzLCBtdWx0aWNvbGluZWFsaWRhZCwgZW50cmUgb3RyYXMuDQoNCioqUGxhbnRlYW1pbnRvIGRlbCBwcm9ibGVtYSoqDQoNCkJhc2FuZG9ub3MgZW4gZWwgY29uanVudG8gZGVzY3JpdG8gZW4gbGEgKipmYXNlIDEqKiBzZSBmb3JtdWxhcmEgdW4gbW9kZWxvIGRlIHJlZ3Jlc2lvbiBsaW5hbCBtdWx0aXBsZSBwYXJhIGVzdHVkaWFyIGxhIHJlbGFjaW9uIGxpbmFsIG11bHRpcGxlIHN1cHVlc3RhIGVudHJlIGxhcyB2YXJhaWJsZXMgZGVmaW5pZGFzIHBvciBsb3MgY2FtcG9zOiAqKkZyZWNDX01heCoqIChWYXJpYWJsZSBkZXBlbmRpZW50ZSkgeSBsYXMgZGVtYXMgY29tbyB2YXJpYWJsZXMgaW5kZXBlbmRpZW50ZXM6ICoqRWRhZCwgUEFfcmVwb3NvLCBDb2xlc3Rlcm9sLCBBU19BeXVuYXMsIE9sZHBlYWssIFNleG8sIGlwb19kb2xvcl9wZWNobywgRUNHX3JlcG9zbywgQW5naW5hX0VqZXJjaWNpbywgUGVuZGlfU2VnbWVfU1RfRWplcmNpY2lvIHkgQ2xhc2Vfc2FsaWRhKioNCg0KKipEZXNhcnJvbGxvIGRlbCBhbsOhbGlzaXMqKg0KDQpFbiBlbCBzaWd1aWVudGUgZGVzYXJyb2xsbyBkZWwgYW7DoWxpc2lzIHNlIGhhcmEgZW4gUiBTdHV0aW8geSBlc3RlIG1pc21vIGNvbnRhcmEgY29uIHZhcmlhcyBzZWNjaW9uZXMgcXVlIHNlIHByZXNlbnRhcmFuIGEgY29udGludWFjaW9uLg0KDQojIyMgKio0LjMuMS4gUmVzdW1lbiBlc3RhZMOtc3RpY28gZGUgbGFzIHZhcmlhYmxlcyBkZSBlc3R1ZGlvKiogey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KRW4gYmFzZSBhIGxhIG5hdmVnYWNpb24gYSB0cmF2w6lzIGRlIHBlc3Rhw7FhcyBtdWVzdHJhbiB1biByZXN1bWVuIGVzdGFkaXN0aWNvIGRlIHRvZGFzIGxhIHZhcmlhYmxlcyBkZWwgY29uanVudG8gZGUgZGF0b3MsIFNpbiBlbWJhcmdvLCBwYXJhIGxhcyB2YXJpYWJsZXMgcWV1IHNvbiBkZSBuYXR1cmFsZXphICoqQ3VhbnRpdGF0aXZhczo6UmF6b24qKiBlbCByZXN1bWVuIHNlIGhhcmEgZGUgbWFuZXJhIHRyYWRpY29uYWwsIHBlcm8gcGFyYSBsYXMgdmFyaWFibGVzIHF1ZSBzb24gZGUgbmF0dXJhbGV6YSAqKkN1YWxpdGF0aXZhczo6Tm9taW5hbCoqIGVsIHJlc3VtZW4gZXN0YWRpc3RpY28gc29sbyBjb25zaWRlcmFyYSBjb250ZW9zLCBwcm9wb3JjaW9uZXMgeSBkaWFncmFtYXMgZGUgYmFycmEuIFNlIHJlY2FsY2EgZGUgbnVldm8gcXVlIGxhIHZhcmlhYmxlIGRlcGVuZGllbnRlIGVzICoqRnJlY0NfTWF4KiouDQoNCiMjIyMgUmVzdW1lbiBWYXJpYWJsZXMgQ3VhbnRpdGF0aXZhcw0KYGBge3IgcmVzdW1lbl9WYXJpYWJsZXNfQ3VhbnRpdGF0aXZhcywgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpzdW1tYXJ5KGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkRWRhZCkNCnN1bW1hcnkoaGVhcnRfZGlzZWFzZXNfRGF0YXNldCRQQV9yZXBvc28pDQpzdW1tYXJ5KGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkQ29sZXN0ZXJvbCkNCnN1bW1hcnkoaGVhcnRfZGlzZWFzZXNfRGF0YXNldCRBU19BeXVuYXMpDQpzdW1tYXJ5KGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkRnJlY0NfTWF4KQ0Kc3VtbWFyeShoZWFydF9kaXNlYXNlc19EYXRhc2V0JE9sZHBlYWspDQpgYGANCg0KIyMjIyBSZXN1bWVuIFZhcmlhYmxlcyBDdWFsaXRhdGl2YXMNCmBgYHtyIHJlc3VtZW5fVmFyaWFibGVzX0N1YWxpdGF0aXZhcywgZmlnLmFsaWduID0gJ2NlbnRlcid9DQp0YWJsZShoZWFydF9kaXNlYXNlc19EYXRhc2V0JFNleG8pDQpwcm9wLnRhYmxlKHRhYmxlKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkU2V4bykpDQpiYXJwbG90KHRhYmxlKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkU2V4bykpDQp0YWJsZShoZWFydF9kaXNlYXNlc19EYXRhc2V0JFRpcG9fZG9sb3JfcGVjaG8pDQpwcm9wLnRhYmxlKHRhYmxlKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkVGlwb19kb2xvcl9wZWNobykpDQpiYXJwbG90KHRhYmxlKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkVGlwb19kb2xvcl9wZWNobykpDQp0YWJsZShoZWFydF9kaXNlYXNlc19EYXRhc2V0JEVDR19yZXBvc28pDQpwcm9wLnRhYmxlKHRhYmxlKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkRUNHX3JlcG9zbykpDQpiYXJwbG90KHRhYmxlKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkRUNHX3JlcG9zbykpDQp0YWJsZShoZWFydF9kaXNlYXNlc19EYXRhc2V0JEFuZ2luYV9FamVyY2ljaW8pDQpwcm9wLnRhYmxlKHRhYmxlKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkQW5naW5hX0VqZXJjaWNpbykpDQpiYXJwbG90KHRhYmxlKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXQkQW5naW5hX0VqZXJjaWNpbykpDQp0YWJsZShoZWFydF9kaXNlYXNlc19EYXRhc2V0JFBlbmRpX1NlZ21lX1NUX0VqZXJjaWNpbykNCnByb3AudGFibGUodGFibGUoaGVhcnRfZGlzZWFzZXNfRGF0YXNldCRQZW5kaV9TZWdtZV9TVF9FamVyY2ljaW8pKQ0KYmFycGxvdCh0YWJsZShoZWFydF9kaXNlYXNlc19EYXRhc2V0JFBlbmRpX1NlZ21lX1NUX0VqZXJjaWNpbykpDQp0YWJsZShoZWFydF9kaXNlYXNlc19EYXRhc2V0JENsYXNlX3NhbGlkYSkNCnByb3AudGFibGUodGFibGUoaGVhcnRfZGlzZWFzZXNfRGF0YXNldCRDbGFzZV9zYWxpZGEpKQ0KYmFycGxvdCh0YWJsZShoZWFydF9kaXNlYXNlc19EYXRhc2V0JENsYXNlX3NhbGlkYSkpDQpgYGANCg0KIyMjIyBEaWFncmFtYXMgZGUgRGlzcGVyc2nDs24gVmFyaWFibGVzIEN1YW50aXRhdGl2YXMNCmBgYHtyIGRpc3BlcnNpb25lc19WYXJpYWJsZXNfQ3VhbnRpdGF0aXZhcywgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpwYWlycyh+RWRhZCArIFBBX3JlcG9zbyArIENvbGVzdGVyb2wgKyBBWl9BeXVuYXMgKyBGcmVjQ19NYXggKyBPbGRwZWFrLCBkYXRhID0gaGVhcnRfZGlzZWFzZXNfRGF0YXNldCkNCmBgYA0KDQojIyMgKio0LjMuMi4gRm9ybXVsYWNpw7NuIGRlbCBtb2RlbG8gZGUgUkxNIGVudHJlIGxhcyB2YXJpYWJsZXMgZGUgZXN0dWRpbyoqIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNCkVuIGJhc2UgYSBsYSBuYXZlZ2FjaW9uIGEgdHJhdmVzIGRlIGxhcyBwZXN0YcOxYXMgbXVlc3RyYSBlbCByZXN1bWVuIHkgbGEgdGFibGEgQU5PVkEgZGVsIG1vZGVsbyBkZSByZWdyZXNpb24gbGluZWFsIG11bHRpcGxlIHRvdGFsIHkgbG9zIGNvZWZpY2llbnRlcyB0YW50byBkZWwgbW9kZWxvIG1lbmNpb25hZG8gYW50ZXJpb3JtZW50ZSBjb21vIGVsIGxvZ3JhZG8gbHVlZ28gZGUgcmVkdWNpcmxvLiBDb24gYmFzZSBlbiBsYSBleHBsb3JhY2lvbiBkZSBsbyBkYXRvcyBtZW5jaW9uYWRvcyBhbnRlcmlvcm1lbnRlIHkgbGEgdGFibGEgQU5PVkEgZGVsIG1vZGVsbyB0b3RhbCBzZSBmb3JtdWxhcmFuIHBhcmEgY29tcGFyYWNpb25lcyBkZWwgbW9kZWxvIFJMTTogdW5vIHF1ZSBpbmNsdXllIGEgdG9kYXMgbGFzIHZhcmlhYmxlcyBkZWwgY29uanVudG8gZGUgZGF0b3MgeSBzZSBleGNsdXllcm9uIGxhcyB2YXJpYWJsZXMgKipQQV9yZXBvc28sIENvbGVzdGVyb2wqKiB5ICoqQVNfQXl1bmFzKiogIC5TZSBtZW5jaW9uYSBkZSBudWV2byBxdWUgKipGcmVjQ19NYXgqKiBlcyBsYSB2YXJpYWJsZSBkZXBlbmRpZW50ZQ0KDQpBbnRlcyBkZSBjb250aW51YXIgY2FiZSByZWNsYWNhciBxdWUgc2UgaGljaWVyb24gbGFzIHNpZ3VpZW50ZXMgbW9kaWZpY2FjaW9uZXMgZW4gY3VhbnRvIGEgbGFzIHZhcmlhYmxlcyBDdWFsaXRhdGl2YXMgZW4gZG9uZGUgc2UgbW9kaWZpY28gc3UgZXRpcXVldGFkbyBwb3IgdW5vIG51bWVyaWNvOiAqKlNleG8qKiAoMDogTSB5IDE6IEYpLCAqKlRpcG9fZG9sb3JfcGVjaG8qKiAoMTogYW5naW5hIHTDrXBpY2EsIDI6IGFuZ2luYSBhdMOtcGljYSwgMzogZG9sb3Igbm8gYW5naW5vc28geSA0OiBhc2ludG9tw6F0aWNvKSwgKipFQ0dfcmVwb3NvKiogKDE6IE5vcm1hbCwgMjogU1QgeSAzOiBMVkgpLCAqKkFuZ2luYV9FamVyY2ljaW8qKiAoMDogTiB5IDE6IFkpLCAqKlBlbmRpX1NlZ21lX1NUX0VqZXJjaWNpbyoqICgxOiBhc2NlbmRlbnRlLCAyOiBQbGFubyB5IDM6IGRlc2NlbmRlbnRlKSB5ICoqQ2xhc2Vfc2FsaWRhKiogKDA6IE5vcm1hbCB5IDE6IEVuZmVybWVkYWQgY2FyZMOtYWNhKSBlbCBjb25qdW50byBkZSBkYXRvcyBzZSBsbGFtYXJhICoqUHJlZGljY2lvbl9JbnN1ZmljaWVuY2lhX2NhcmRpYWNhX1Zhcl9NT0QqKi4NCg0KQWwgY29uc2lkZXJhciBsb3MgcmVzdWx0YWRvcyBxdWUgc2UgcHJlc2VudGFuIGVuIGxhIHBlc3Rhw7FhIGRlICoqQ29lZmljaWVudGVzIGRlbCBNb2RlbG8gUkxNIFRvdGFsKiogc2UgcHVlZGUgZXN0YWJsZWNlciBxdWUgZWwgbW9kZWxvIGRlIHJlZ3Jlc2lvbiBsaW5hbCBtdWx0aXBsZSBxdWUgcmVsYWNpb25hIGEgbGEgdmFyaWFibGUgZGUgaW50ZXJlcywgbGFzIGN1YWxlcyBzZSByZXN1bWlyaWFuIGNvbW86ICRGUkVDTSQgKCoqRnJlY0NfTWF4KiopLCAkRUQkICgqKkVkYWQqKiksICRQQVIkICgqKlBBX3JlcG9zbyoqKSwgJENPTCQgKCoqQ29sZXN0ZXJvbCoqKSwgJEFTWSQgKCoqQVNfQXl1bmFzKiopLCAkT0xEJCAoKipPbGRwZWFrKiopLCAkU18xJCAoKipTZXhvOjoxKiopLCAkVF8yJCAoKipUaXBvX2RvbG9yX3BlY2hvOjoyKiopICRUXzMkICgqKlRpcG9fZG9sb3JfcGVjaG86OjMqKikgJFRfNCQgKCoqVGlwb19kb2xvcl9wZWNobzo6NCoqKSwgJEVfMiQgKCoqRUNHX3JlcG9zbzo6MioqKSwgJEVfMyQgKCoqRUNHX3JlcG9zbzo6MyoqKSwgJEFfMSQgKCoqQW5naW5hX0VqZXJjaWNpbzo6MSoqKSwgJFBfMiQgKCoqUGVuZGlfU2VnbWVfU1RfRWplcmNpY2lvOjoyKiopLCAkUF8zJCAoKipQZW5kaV9TZWdtZV9TVF9FamVyY2ljaW86OjMqKikgIHkgJENfMSQgKCoqQ2xhc2Vfc2FsaWRhOjoxKiopLCB0aWVuZSBsYSBmb3JtdWFsY2lvbiAoY29uIHVub3MgY29lZmljaWVudGVzIHJlZG9uZGVhZG9zIGEgNCBjaWZyYXMgZGVjaW1hbGVzIHBvciB0ZW1hIGRlIGVzdGV0aWNhKQ0KDQokRlJFQ00gPSAxODQsOTk5Mi0wLDc5MjUqRUQtMCwwMDU0KlBBUiswLDAzODEqQ09MKzAsMDA2MipBU1krMCwyMDcxKk9MRCszLDI5MjYqU18xLTQsMjI2NypUXzIkDQogICQtNCwyNzA0KlRfMy0xMSwyMTQxKlRfNC0xLDM1NTEqRV8yKzgsMDU3OCpFXzMtNiw5MTg3KkFfMS05LDMyMTMqUF8yLTUsNzk2MCpQXzMtMiw3NTk2KkNfMSQgICAgICQoMjgpJA0KDQpQYXJhIGVzdGUgbW9kZWxvIHNlIG9idmlhbiBsYXMgaW50ZXJwcmV0YWNpb25lcyBlbiBxdWUgbGFzIHZhcmlhYmxlcyBmdWNlbiBjZXJvIHlhIHF1ZSBwb3IgbGEgbmF0dXJhbGV6YSBkZSBhbGd1bmEgZGUgZXN0YXMgY2FyZWNlIGRlIHNlbnRpZG8geSBsYSBpbnRlcnByZXRhY2lvbiBkZWwgaW50ZXJjZXB0byBzaSBxdWUgdGllbmUgc2VudGlkbyB5YSBxdWUgdHJhYmFqYW1vcyBjb24gdW5hIGZyZWN1ZW5jaWEgY2FyZGlhY2EgYXVucXVlIGVsIHZhbG9yIHF1ZSB0b21hcmlhIHNlcmlhIG11eSBhbHRvIGNvbXBhcmFkbyBjb24gbG8gbm9ybWFsLg0KDQpQb3Igb3RybyBsYWRvLCBsdWVnbyBkZSByZXZpc2FyIGVsIHJlc3VtZW4gZXN0YWRpc3RpY28geSBsYSB0YWJhbCBBTk9WQSBkZWwgbW9kZWxvIFJMTSB0b3RhbCAoY29uIG5vbWJyZSBkZSBwZXN0YcOxYSBob21vbmltbyBhIGVzdGUpLCBzZSBwdWVkZSBlc3RhYmxlY2VyLCBjb24gZWwgYXBveW8gZGUgbG9zIHJlc3VtZW5lcyBlc3RhZGlzdGljb3MgZGUgbGFzIHZhcmlhYmxlcyBkZSBlc3R1ZGlvLCBxdWUgcHVlZGVuIGV4Y2x1aXJzZSBkaXJlY3RhbWVudGUgZGVsIG1vZGVsbyBwb3IgYmFqYSBzaWduaWZpY2FuY2lhIGEgbGFzIHZhcmlhYmxlcyAqKlBBX3JlcG9zbywgQ29sZXN0ZXJvbCoqIHkgKipBU19BeXVuYXMqKi4gRXN0byBpbXBsaWNvIHF1ZSBzZSBjYWxjdWxhc2UgdW4gbW9kZWxvIHJlZHVjaWRvY29uIGxhIGZvcm11bGFjaW9uIChDb24gYmFzZSBuZSBsYXMgbWlzbWFzIGNvbnNpZGVyYWNpb25lcyBkZSBlZGljaW9uIGRlbCBtb2RlbG8gdG90YWwpOg0KDQokRlJFQ00gPSAxOTMsODYyNi0wLDgxMjQqRUQrMCwyMzEzKk9MRCs0LDQzMTkqU18xLTMsNTIxNypUXzItNCw0NDIyKlRfMy0xMSwyMjM4KlRfNCQNCiAgICAgICAgICAgICAgICAgICQtMiwxMTk3KkVfMis5LDM1MjYqRV8zLTYsNTI0MypBXzEtOCw5OTAqUF8yLTYsMjU2NSpQXzMtMy42MjAxKkNfMSQgICAgICAgJCgyOSkkDQoNCiMjIyMgUmVzdW1lbiB5IEFOT1ZBIGRlbCBNb2RlbG8gUkxNIFRvdGFsDQpgYGB7ciwgcmVzdW1lbl95X0FOT1ZBX1JMTV9Ub3RhbCwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpzdW1tYXJ5KGxtKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRfVlJfTU9EJEZyZWNDX01heH5oZWFydF9kaXNlYXNlc19EYXRhc2V0X1ZSX01PRCRFZGFkK2hlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRfVlJfTU9EJFBBX3JlcG9zbytoZWFydF9kaXNlYXNlc19EYXRhc2V0X1ZSX01PRCRDb2xlc3Rlcm9sK2hlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRfVlJfTU9EJEFaX0F5dW5hcytoZWFydF9kaXNlYXNlc19EYXRhc2V0X1ZSX01PRCRPbGRwZWFrK2FzLmZhY3RvcihoZWFydF9kaXNlYXNlc19EYXRhc2V0X1ZSX01PRCRTZXhvKSthcy5mYWN0b3IoaGVhcnRfZGlzZWFzZXNfRGF0YXNldF9WUl9NT0QkVGlwb19kb2xvcl9wZWNobykrYXMuZmFjdG9yKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRfVlJfTU9EJEVDR19yZXBvc28pK2FzLmZhY3RvcihoZWFydF9kaXNlYXNlc19EYXRhc2V0X1ZSX01PRCRBbmdpbmFfRWplcmNpY2lvKSthcy5mYWN0b3IoaGVhcnRfZGlzZWFzZXNfRGF0YXNldF9WUl9NT0QkUGVuZGlfU2VnbWVfU1RfRWplcmNpY2lvKSthcy5mYWN0b3IoaGVhcnRfZGlzZWFzZXNfRGF0YXNldF9WUl9NT0QkQ2xhc2Vfc2FsaWRhKSkpDQphbm92YShsbShoZWFydF9kaXNlYXNlc19EYXRhc2V0X1ZSX01PRCRGcmVjQ19NYXh+aGVhcnRfZGlzZWFzZXNfRGF0YXNldF9WUl9NT0QkRWRhZCtoZWFydF9kaXNlYXNlc19EYXRhc2V0X1ZSX01PRCRQQV9yZXBvc28raGVhcnRfZGlzZWFzZXNfRGF0YXNldF9WUl9NT0QkQ29sZXN0ZXJvbCtoZWFydF9kaXNlYXNlc19EYXRhc2V0X1ZSX01PRCRBWl9BeXVuYXMraGVhcnRfZGlzZWFzZXNfRGF0YXNldF9WUl9NT0QkT2xkcGVhaythcy5mYWN0b3IoaGVhcnRfZGlzZWFzZXNfRGF0YXNldF9WUl9NT0QkU2V4bykrYXMuZmFjdG9yKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRfVlJfTU9EJFRpcG9fZG9sb3JfcGVjaG8pK2FzLmZhY3RvcihoZWFydF9kaXNlYXNlc19EYXRhc2V0X1ZSX01PRCRFQ0dfcmVwb3NvKSthcy5mYWN0b3IoaGVhcnRfZGlzZWFzZXNfRGF0YXNldF9WUl9NT0QkQW5naW5hX0VqZXJjaWNpbykrYXMuZmFjdG9yKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRfVlJfTU9EJFBlbmRpX1NlZ21lX1NUX0VqZXJjaWNpbykrYXMuZmFjdG9yKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRfVlJfTU9EJENsYXNlX3NhbGlkYSkpKQ0KYGBgDQoNCiMjIyMgQ29lZmljaWVudGVzIGRlbCBNb2RlbG8gUkxNIFRvdGFsDQpgYGB7ciwgY29lZmljaWVudGVzX1JMTV9Ub3RhbCwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpjb2VmZmljaWVudHMobG0oaGVhcnRfZGlzZWFzZXNfRGF0YXNldF9WUl9NT0QkRnJlY0NfTWF4fmhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRfVlJfTU9EJEVkYWQraGVhcnRfZGlzZWFzZXNfRGF0YXNldF9WUl9NT0QkUEFfcmVwb3NvK2hlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRfVlJfTU9EJENvbGVzdGVyb2wraGVhcnRfZGlzZWFzZXNfRGF0YXNldF9WUl9NT0QkQVpfQXl1bmFzK2hlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRfVlJfTU9EJE9sZHBlYWsrYXMuZmFjdG9yKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRfVlJfTU9EJFNleG8pK2FzLmZhY3RvcihoZWFydF9kaXNlYXNlc19EYXRhc2V0X1ZSX01PRCRUaXBvX2RvbG9yX3BlY2hvKSthcy5mYWN0b3IoaGVhcnRfZGlzZWFzZXNfRGF0YXNldF9WUl9NT0QkRUNHX3JlcG9zbykrYXMuZmFjdG9yKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRfVlJfTU9EJEFuZ2luYV9FamVyY2ljaW8pK2FzLmZhY3RvcihoZWFydF9kaXNlYXNlc19EYXRhc2V0X1ZSX01PRCRQZW5kaV9TZWdtZV9TVF9FamVyY2ljaW8pK2FzLmZhY3RvcihoZWFydF9kaXNlYXNlc19EYXRhc2V0X1ZSX01PRCRDbGFzZV9zYWxpZGEpKSkNCmBgYA0KDQojIyMjIENvZWZpY2llbnRlcyBkZWwgTW9kZWxvIFJMTSBSZWR1Y2lkbw0KYGBge3IgY29lZmljaWVudGVzX1JMTV9SZWR1Y2lkbywgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpjb2VmZmljaWVudHMobG0oaGVhcnRfZGlzZWFzZXNfRGF0YXNldF9WUl9NT0QkRnJlY0NfTWF4fmhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRfVlJfTU9EJEVkYWQraGVhcnRfZGlzZWFzZXNfRGF0YXNldF9WUl9NT0QkT2xkcGVhaythcy5mYWN0b3IoaGVhcnRfZGlzZWFzZXNfRGF0YXNldF9WUl9NT0QkU2V4bykrYXMuZmFjdG9yKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRfVlJfTU9EJFRpcG9fZG9sb3JfcGVjaG8pK2FzLmZhY3RvcihoZWFydF9kaXNlYXNlc19EYXRhc2V0X1ZSX01PRCRFQ0dfcmVwb3NvKSthcy5mYWN0b3IoaGVhcnRfZGlzZWFzZXNfRGF0YXNldF9WUl9NT0QkQW5naW5hX0VqZXJjaWNpbykrYXMuZmFjdG9yKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRfVlJfTU9EJFBlbmRpX1NlZ21lX1NUX0VqZXJjaWNpbykrYXMuZmFjdG9yKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRfVlJfTU9EJENsYXNlX3NhbGlkYSkpKQ0KYGBgDQoNCiMjIyAqKjQuMy4zLiBBbsOhbGlzaXMgZGVsIG1vZGVsbyBSTE0qKiB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQpFbiBiYXNlIGEgdHJhdmV6IGRlIGxhIG5hdmVnYWNpb24gZGUgcGVzdGHDsWFzLCBlbiBwcmltZXJhIHBhcnRlICoqTWVqb3IgTW9kZWxvIEl0ZXJhZG8gc2Vnw7puIEFJQyoqIG11ZXN0cmEgcXVlIGxhIGRlc2ljaW9uIGRlIGRlIHF1ZSBleGNsdWlyIGRvcyB2YXJpYWJsZXMgKCoqUEFfcmVwb3NvLCoqIHkgKipBU19BeXVuYXMqKikgZGUgbGFzIHRyZXMgcHJvcHVlc3RhcyB0YW1iaWVuIG5vcyBtdXN0cmEgcXVlIGRlc2lkaW8gZXhjbHVpciBsYSB2YXJpYWJsZSAqKkNsYXNlX3NhbGlkYSoqIHkgbGEgY2FtYmlvIHBvciAqKkNvbGVzdGVyb2wqKiBlc3RvIGNhYmUgcmVjYWxjYXIgcXVlIGZ1ZSB1biBjYW1iaW8gY3VyaW9zbyBzaSBsbyBtaXJhbW9zIGxvIHF1ZSBhcG9ydGEgbGEgdmFyaWFibGUgYWwgbW9kZWxvLCB0YW1iaWVuIHNlIGRlYmUgbWVuY2lvbmFyIHF1ZSB0b2RvIGVzdG8gc2UgaGl6byBlbiBsYSBjdWFydGEgaXRlcmFjaW9uLiBBZGVtYXMgZWwgYWxnb3JpdG1vIHRhbWJpZW4gY29uc3RydXlvIHVuIG1vZGVsbyBiYXNhZG8gZW4gY2FzaSBsYXMgbWlzbWFzIHZhcmlhYmxlcyBkZWwgbW9kZWxvIHJlZHVjaWRvIGxvIGN1YWwgZnVuZGFtZW50YSBsYSBpbnNwZWNjaW9uIGRlIGxhcyB2YXJpYWJsZXMgZW4gbGEgcGFydGVzIHByZWNlZGVudGVzLg0KDQpEZSBtYW5lcmEgY29tcGxlbWVudGFyaWEsIGVuIGxhIHBlc3Rhw7FhIGRlICoqQm9uZGFkZXMgZGUgQWp1c3RlLCBTaWduaWZpY2FuY2lhcyB5IENyaXRlcmlvcyBkZSBJbmZvcm1hY2lvbiBDb21wYXJhZG9zKiogc2UgcHJlc2VudGEgZGUgbWFuZXJhIHBhcmFsZWxhIGxvcyBtb2RlbG9zIGdlbmVyYWRvcy4gTGEgY29uc2lkZXJhY2lvbiBkZSB0b2RhcyBsYXMgdmFyaWFibGVzIGRlbCBjb2p1bnRvIGRlIGRhdG9zIHByZXNlbnRvIHVuYSBib25kYWQgZGUgYWp1c3RlIGNvbiBiYXNlIGVuIGVsIGNvZWZpY2llbnRlIGRlIGRldGVybWluYWNpb24gbXVsdGlwbGUgcWV1IHNvbG8gc2UgcmVkdWpvIGhhYmxhbmRvIGVuIHRlcm1pbm9zIGFic29sdXRvcyBlbiAkMCwwMTMkIHB1bnRvcyAoZXMgZGVjaXIgc2UgcGFzbyBkZSBleHBsaWNhciBlbCAkMzUsNCQgJCUkIGRlIGxhIHZhcmlhYmlsaWRhZCBhIHVuICQzNCwxJCAkJSQpIGVuIGNvbXBhcmFjaW9uIGNvbiBlbCBtb2RlbG8gcmVkdWNpZG8geSBlbCBpdGVyYWRvOyBhZGVtYXMsIGxhcyBzaWduaWZpY2FuY2lhcyBnbG9iYWwgZSBpbmRpdmlkdWFsZXMgZGUgZXN0b3MgZXZpZGVuY2lhcyBxdWUgYW1ib3MgbW9kZWxvcyBzb24gc2ltaWxhcmVzIHBlcm8gbm8gaWd1YWxlcywgdGllbmUgY2llcnRvIGdyYWRvIGRlIGRpZmVyZW5jaWEsIGFwb3J0YW4gdW5hIGNhbnRpZGFkIHNpZ25pZmljYW50ZSBkZSBpbmZvcm1hY2lvbiByZWxldmFudGUgcGFyYSBsYSB2YXJpYWJsZSBkZXBlbmRpZW50ZSAqKkZyZWNDX01heCoqLCBwb3JxdWUgcGFyYSBsb3MgdmFsb3JlcyBjcml0aWNvcyBvYnRlbmlkb3MgcGFyYSBsYXMgcHJ1ZWJhcyAkRiQgKHBhcmEgbGEgc2lnbmlmaWNhbmNpYSBnbG9nYWwpIHkgJHQkIChwYXJhIGxhcyBzaWduaWZpY2FuY2lhcyBpbmRpdmlkdWFsZXMpLCBsb3MgJHAtdmFsdWUkIGVuIGxhIG1heW9yaWEgZGUgbG9zIGNhc29zIHJlc3VsdGFyb24gc2llbXByZSBtZW5vcmVzIHBhcmEgY3VhbHF1aWVyIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgJFxhbHBoYSQgaW5jbHVpZG8gZGVudHJvIGRlIGxvcyB0cmFkaWNpb25lcyBjb21tbyBwb3IgZWplbXBsbywgJFxhbHBoYVwgPSAwLDAxJC4NCg0KUG9yIHVsdGltbywgbG9zIGNyaXRlcmlvcyBkZSBpbmZvcm1hY2lvbiAqKkFJQyoqIHkgKipCSUMqKiBtdWVzdHJhbiBlZmVjdGl2YW1lbnRlIHF1ZSBsb3MgbW9kZWxvcyBzb24gc2ltaWxhcmVzIHJlZHVjaWRvIGUgaXRlcmFkbyBsYSByZWxhY2lvbiBlbnRyZSBlbCBzZXNnbyB5IGxhIHZhcmlhbnphIGVuIHN1cyBmb3JtdWxhY2lvbmVzIHJlc3BlY3RpdmFzLCBlcyBkZWNpciwgZW50cmUgc3VzIHNlbWVqYW56YXMgeSBjb21wbGVqaWRhZGVzLCByZXN1bHRhIG1vZGVsbyB0b3RhbDoNCiRBSUNfe0l0ZXJhZG9TVEVQfT04MTY4LDQ3NTw4MTcyLDQyND1BSUNfe1JMTVRvdGFsfTw4MTg0LDYyMzg9QUlDX3tSTE1SZWR1Y2lkb30kIA0KeSANCiRCSUNfe0l0ZXJhZG9TVEVQfT04MjM1LDk3MTw4MjUyLDEzMz1CSUNfe1JMTVJlZHVjaWRvfTw4MjU0LDM4Mz1CSUNfe1JMTVRvdGFsfSQuDQoNClkgdGFtYmllbiBkZW11ZXN0cmFuIHF1ZSBlbCBtb2RlbG8gaXRlcmFkbyBwb3IgZWwgbWV0b2RvICoqU1RFUCoqIHRpZW5lIGxvcyB2YWxvcmVzIG1hcyBiYWpvcyB0YW50byBlbiBlbCAqKkFJQyoqIGNvbW8gZGUgKipCSUMqKiBlbiBjb21wYXJhY2lvbiBjb24gZWwgbW9kZWxvIHRvdGFsIHkgcmVkdWNpZG8sIGVzIGRlY2lyIHF1ZSBsZSBtb2RlbG8gaXRlcmFkbyBwb3IgZWwgbWV0b2QgKipTVEVQKiogcHJvcG9yY2lvbiB1biBtZWpvciBhanVzdGUgZGUgbG9zIGRhdG9zLg0KDQojIyMjIE1lam9yIE1vZGVsbyBJdGVyYWRvIHNlZ8O6biBBSUMNCmBgYHtyLCBtZWpvcl9Nb2RlbG9fQUlDLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCm1vZGVsb19JdGVyYWRvX1NURVAgPSBzdGVwKGxtKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRfVlJfTU9EJEZyZWNDX01heH5oZWFydF9kaXNlYXNlc19EYXRhc2V0X1ZSX01PRCRFZGFkK2hlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRfVlJfTU9EJFBBX3JlcG9zbytoZWFydF9kaXNlYXNlc19EYXRhc2V0X1ZSX01PRCRDb2xlc3Rlcm9sK2hlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRfVlJfTU9EJEFaX0F5dW5hcytoZWFydF9kaXNlYXNlc19EYXRhc2V0X1ZSX01PRCRPbGRwZWFrK2FzLmZhY3RvcihoZWFydF9kaXNlYXNlc19EYXRhc2V0X1ZSX01PRCRTZXhvKSthcy5mYWN0b3IoaGVhcnRfZGlzZWFzZXNfRGF0YXNldF9WUl9NT0QkVGlwb19kb2xvcl9wZWNobykrYXMuZmFjdG9yKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRfVlJfTU9EJEVDR19yZXBvc28pK2FzLmZhY3RvcihoZWFydF9kaXNlYXNlc19EYXRhc2V0X1ZSX01PRCRBbmdpbmFfRWplcmNpY2lvKSthcy5mYWN0b3IoaGVhcnRfZGlzZWFzZXNfRGF0YXNldF9WUl9NT0QkUGVuZGlfU2VnbWVfU1RfRWplcmNpY2lvKSthcy5mYWN0b3IoaGVhcnRfZGlzZWFzZXNfRGF0YXNldF9WUl9NT0QkQ2xhc2Vfc2FsaWRhKSkpDQpjb2VmZmljaWVudHMobW9kZWxvX0l0ZXJhZG9fU1RFUCkNCmBgYA0KDQojIyMjIEJvbmRhZGVzIGRlIEFqdXN0ZSwgU2lnbmlmaWNhbmNpYXMgeSBDcml0ZXJpb3MgZGUgSW5mb3JtYWNpw7NuIENvbXBhcmFkb3MNCmBgYHtyfQ0KbW9kZWxvX1JMTV9UT1RBTCA9IGxtKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRfVlJfTU9EJEZyZWNDX01heH5oZWFydF9kaXNlYXNlc19EYXRhc2V0X1ZSX01PRCRFZGFkK2hlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRfVlJfTU9EJFBBX3JlcG9zbytoZWFydF9kaXNlYXNlc19EYXRhc2V0X1ZSX01PRCRDb2xlc3Rlcm9sK2hlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRfVlJfTU9EJEFaX0F5dW5hcytoZWFydF9kaXNlYXNlc19EYXRhc2V0X1ZSX01PRCRPbGRwZWFrK2FzLmZhY3RvcihoZWFydF9kaXNlYXNlc19EYXRhc2V0X1ZSX01PRCRTZXhvKSthcy5mYWN0b3IoaGVhcnRfZGlzZWFzZXNfRGF0YXNldF9WUl9NT0QkVGlwb19kb2xvcl9wZWNobykrYXMuZmFjdG9yKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRfVlJfTU9EJEVDR19yZXBvc28pK2FzLmZhY3RvcihoZWFydF9kaXNlYXNlc19EYXRhc2V0X1ZSX01PRCRBbmdpbmFfRWplcmNpY2lvKSthcy5mYWN0b3IoaGVhcnRfZGlzZWFzZXNfRGF0YXNldF9WUl9NT0QkUGVuZGlfU2VnbWVfU1RfRWplcmNpY2lvKSthcy5mYWN0b3IoaGVhcnRfZGlzZWFzZXNfRGF0YXNldF9WUl9NT0QkQ2xhc2Vfc2FsaWRhKSkNCg0KbW9kZWxvX1JMTV9SRURVQ0lETyA9IGxtKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRfVlJfTU9EJEZyZWNDX01heH5oZWFydF9kaXNlYXNlc19EYXRhc2V0X1ZSX01PRCRFZGFkK2hlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRfVlJfTU9EJE9sZHBlYWsrYXMuZmFjdG9yKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRfVlJfTU9EJFNleG8pK2FzLmZhY3RvcihoZWFydF9kaXNlYXNlc19EYXRhc2V0X1ZSX01PRCRUaXBvX2RvbG9yX3BlY2hvKSthcy5mYWN0b3IoaGVhcnRfZGlzZWFzZXNfRGF0YXNldF9WUl9NT0QkRUNHX3JlcG9zbykrYXMuZmFjdG9yKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRfVlJfTU9EJEFuZ2luYV9FamVyY2ljaW8pK2FzLmZhY3RvcihoZWFydF9kaXNlYXNlc19EYXRhc2V0X1ZSX01PRCRQZW5kaV9TZWdtZV9TVF9FamVyY2ljaW8pK2FzLmZhY3RvcihoZWFydF9kaXNlYXNlc19EYXRhc2V0X1ZSX01PRCRDbGFzZV9zYWxpZGEpKQ0KDQpzdGFyZ2F6ZXIobW9kZWxvX1JMTV9UT1RBTCwgbW9kZWxvX1JMTV9SRURVQ0lETywgbW9kZWxvX0l0ZXJhZG9fU1RFUCwgdHlwZSA9ICJ0ZXh0IiwgZGYgPSBUUlVFKQ0KQUlDKG1vZGVsb19STE1fVE9UQUwsIG1vZGVsb19STE1fUkVEVUNJRE8sIG1vZGVsb19JdGVyYWRvX1NURVApDQpCSUMobW9kZWxvX1JMTV9UT1RBTCwgbW9kZWxvX1JMTV9SRURVQ0lETywgbW9kZWxvX0l0ZXJhZG9fU1RFUCkNCmBgYA0KDQojIyAqKjQuNC4gUmVncmVzacOzbiBMb2fDrXN0aWNhIFNpbXBsZSoqDQoNCkVzdGUgbW9kZWxvLCBldmVudHVhbG1lbnRlIGxsYW1hZG8gKipSTG9nUyoqLCBkaWZpZXJlIGRlbCBtb2RlbG8gZGUgcmVncmVzacOzbiBsaW5lYWwgc2ltcGxlIGFsIHJlbGFjaW9uYXIgdW5hIHZhcmlhYmxlIGNhdGVnw7NyaWNhIGRpY290w7NtaWNhIChjb24gdmFsb3JlcyBwb3NpYmxlcyAkMSQgKMOpeGl0bykgeSAkMCQgKGZyYWNhc28pKSBkZXBlbmRpZW50ZSAkeSQgY29uIGVsIHZhbG9yIGRlIHByb2JhYmlsaWRhZCAkcCh4KVxpbiBbMCwgMV0kIHF1ZSBkZXBlbmRlIGRlIGFsZ3VuYSB2YXJpYWJsZSBjdWFudGl0YXRpdmEgJHgkLg0KDQpDb21vIHNlIG1lbmNpb27DsyBlbiBsYSBzZWNjacOzbiAqKjEqKiwgbG9zIG1vZGVsb3MgZGUgcmVncmVzacOzbiB1c2Fkb3MgZW4gZXN0ZSBlc3R1ZGlvIHB1ZWRlbiBzZXIgdmlzdG9zIGNvbW8gY2Fzb3MgcGFydGljdWxhcmVzIGRlbCBNb2RlbG8gTGluZWFsIEdlbmVyYWxpemFkbyAoKipHTE0qKikuIEVzdGUgbW9kZWxvIGV4dGllbmRlIGVsIG1vZGVsbyBsaW5lYWwgZ2VuZXJhbCBhbCByZWxhY2lvbmFyIGxhIHZhcmlhYmxlIGRlcGVuZGllbnRlIGxpbmVhbG1lbnRlIGNvbiBzdXMgZmFjdG9yZXMgeSBjb3ZhcmlhYmxlcyBhIHRyYXbDqXMgZGUgYWxndW5hIGZ1bmNpw7NuIGRlIGVubGFjZSwgcGVybWl0aWVuZG8gcXVlIGxhIHZhcmlhYmxlIGRlcGVuZGllbnRlIHRlbmdhIHVuYSBkaXN0cmlidWNpw7NuIGRpZmVyZW50ZSBhIGxhIG5vcm1hbC4gQWRlbcOhcyBkZSBsb3MgbW9kZWxvcyB1c2Fkb3MgZW4gZXN0ZSBlc3R1ZGlvLCBlbCAqKkdMTSoqIHRhbWJpw6luIGN1YnJlIG1vZGVsb3MgbG9nbGluZWFsZXMgcGFyYSBkYXRvcyBkZSByZWN1ZW50bywgbW9kZWxvcyBsb2ctbG9nIGNvbXBsZW1lbnRhcmlvcyBwYXJhIGRhdG9zIGRlIHN1cGVydml2ZW5jaWEgY2Vuc3VyYWRvcyBwb3IgaW50ZXJ2YWxvcywgeSBvdHJvcyBtb2RlbG9zIGVzdGFkw61zdGljb3MgYSB0cmF2w6lzIGRlIGxhIGZvcm11bGFjacOzbiBnZW5lcmFsIGRlbCBtb2RlbG8uDQoNCkNvbW8gZWwgKipHTE0qKiBwZXJtaXRlIGVzcGVjaWZpY2FyIGRpc3RyaWJ1Y2lvbmVzIGRpZmVyZW50ZXMgYSBsYSBub3JtYWwgeSB1bmEgZnVuY2nDs24gZGUgZW5sYWNlIGRpZmVyZW50ZSBhIGxhIGlkZW50aWRhZCwgc2UgcHVlZGVuIHRyYWJhamFyIGNvbiBtdWNoYXMgY29tYmluYWNpb25lcyBwb3NpYmxlcyBkZSBkaXN0cmlidWNpb25lcyB5IGZ1bmNpb25lcyBkZSBlbmxhY2UsIHZhcmlhcyBkZSBsYXMgY3VhbGVzIHB1ZWRlbiBzZXIgYWRlY3VhZGFzIHBhcmEgdW4gY29uanVudG8gZGUgZGF0b3MgZW4gcGFydGljdWxhci4gTGEgZWxlY2Npw7NuIGRlIGxhIGNvbWJpbmFjacOzbiBlc3RhcsOhIG9yaWVudGFkYSBwb3IgY29uc2lkZXJhY2lvbmVzIHRlw7NyaWNhcyBhIHByaW9yaSwgbGEgbmF0dXJhbGV6YSBkZSBsYXMgdmFyaWFibGVzLCBsYSBleHBlcmllbmNpYSBkZWwgaW52ZXN0aWdhZG9yIHkgbG9zIHJlc3VsdGFkb3MgYWwgY29tcGFyYXIgY29tYmluYWNpb25lcy4NCg0KRW4gZXN0ZSBjYXNvLCBzZSB0cmFiYWphcsOhIGNvbiB1bmEgZGlzdHJpYnVjacOzbiBiaW5vbWlhbCAoYWRlY3VhZGEgcGFyYSB2YXJpYWJsZXMgcXVlIHJlcHJlc2VudGFuIHVuYSByZXNwdWVzdGEgYmluYXJpYSkgY29uIGZ1bmNpw7NuIGRlIGVubGFjZSBsb2dpdDoNCg0KJCRccGkoeCk9XGRmcmFje2Vee1xiZXRhXzArXGJldGFfMSB4fX17MSsgZV57XGJldGFfMCArXGJldGFfMSB4fX09ICBcZGZyYWN7MX17MSsgZV57LShcYmV0YV8wK1xiZXRhXzEgeCl9fVxoc3BhY2V7MTBtbX0oMzApJCQNCg0KRXN0ZSBlbmZvcXVlLCBjb25vY2lkbyBjb21vIHJlZ3Jlc2nDs24gbG9nw61zdGljYSBiaW5hcmlhLCBlcyBhcHJvcGlhZG8gcGFyYSBsYSBkaXN0cmlidWNpw7NuIGJpbm9taWFsLiBFbCB0w6lybWlubyAibG9nw61zdGljbyIgc2UgcmVmaWVyZSBhIHF1ZSBsYSBmdW5jacOzbiBkZSBlbmxhY2UgY29uc3RpdHV5ZSB1biByZWZpbmFtaWVudG8gZGVsIG1vZGVsbyBleHBvbmVuY2lhbCBkZSBjcmVjaW1pZW50bywgZGVzY3JpdG8gcG9yIGxhIGZ1bmNpw7NuIHNpZ21vaWRlYSwgZGUgdW5hIG1hZ25pdHVkIGFzb2NpYWRhIGNvbiB1biBjb25qdW50byAkQyQuDQoNClBhcmEgZmFjaWxpdGFyIGxhcyBpbnRlcnByZXRhY2lvbmVzLCBsYSBmdW5jacOzbiBkZSBlbmxhY2UgJFxwaSh4KSQgcHJvdmllbmUgZGUgdW5hIHJhesOzbiBkZSBwcm9iYWJpbGlkYWRlcyAoY29ub2NpZGEgZW4gaW5nbMOpcyBjb21vIE9ERFMgcmF0aW8gKE9SKSksIHF1ZSBhIHN1IHZleiBlcyBlbCBhcmd1bWVudG8gZGUgdW4gbG9nYXJpdG1vOiAkXGxvZ1xsZWZ0KFxmcmFje1xwaSh4KX17MS1ccGkoeCl9XHJpZ2h0KSQuIEFzw60sIHNlIG1vZGVsYSBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIGxhIHZhcmlhYmxlIGRlIHJlc3B1ZXN0YSBwZXJ0ZW5lemNhIGFsIG5pdmVsIGRlIHJlZmVyZW5jaWEgJDEkIGVuIGZ1bmNpw7NuIGRlbCB2YWxvciBkZSBsb3MgcHJlZGljdG9yZXMuIExhIHRyYW5zZm9ybWFjacOzbiBjb25zZXJ2YSBsYSBtb25vdG9uaWNpZGFkIGRlIHNlbnRpZG9zIHkgY29udmllcnRlIGVsIGludGVydmFsbyBkZSBwcm9iYWJpbGlkYWQgJFswLDFdJCBhICQoLVxpbmZ0eSxcaW5mdHkpJC4NCg0KTGFzIHByb3BpZWRhZGVzIGVudHJlIGxhcyBwcm9iYWJpbGlkYWRlcyBjb21wbGVtZW50YXJpYXMgZGUgw6l4aXRvIHkgZnJhY2Fzbywgc3VzIHJhem9uZXMgeSBsYSBmdW5jacOzbiBkZSBlbmxhY2UgbG9naXQgc29uOg0KDQp8fHx8DQo6LTp8Oi06fDotOnwNCiRwKMOpeGl0byk9cChmcmFjYXNvKSR8JE9SPTEkfCRMb2dpdFxsZWZ0KE9SXHJpZ2h0KT0wJA0KJHAow6l4aXRvKTxwKGZyYWNhc28pJHwkT1I8MSR8JExvZ2l0XGxlZnQoT1JccmlnaHQpPDAkDQokcCjDqXhpdG8pPnAoZnJhY2FzbykkfCRPUj4xJHwkTG9naXRcbGVmdChPUlxyaWdodCk+MCQNCnx8fHwNCg0KRXMgaW1wb3J0YW50ZSB0ZW5lciBlbiBjdWVudGEgcXVlIGxhIHRyYW5zZm9ybWFjacOzbiBMb2dpdCBjYXJlY2UgZGUgc2VudGlkbyBwYXJhIGxhIGNlcnRlemEgZGVsIMOpeGl0byBvIGRlbCBmcmFjYXNvLg0KDQoqKlBsYW50ZW1pZW50byBkZWwgcHJvYmxlbWEqKg0KDQpUb21hbmRvIGNvbW8gYmFzZSBlbCBjb25qdW50byBkZSBkYXRvcyBkZXNjcml0byBlbiBsYSAqKmZhc2UgMioqIHNlIGZvcm11bGFyYSB1biBtb2RlbG8gZGUgcmVncmVzaW9uIGxvZ2lzdGljYSBzaW1wbGUgcGFyYSBlc3R1ZGlhciBsYSByZWxhY2lvbiBsb2dpc3RpY2Egc3VwdWVzdGEgZW50cmUgbGFzIHZhcmlhYmxlcyBkZWZpbmlkYXMgcG9yIGNhbXBvczogKipGcmVjQ19NYXgqKiAodmFyaWFibGUgaW5kZXBlbmRpZW50ZSkgeSAqKkNsYXNlX3NhbGlkYSoqICh2YXJhaWJsZSBkZXBlbmRpZW50ZSksIGNvbiBiYXNlIGVuIHVuYSBkaXN0cmlidWNpb24gYmlub21pYWwgeSBsYSBmdW5jaW9uIGRlIGVubGFjZSAkTG9naXQkLg0KDQoqKkRlc2Fycm9sbG8gZGVsIEFuw6FsaXNpcyoqDQoNCkVuIGVsIHNpZ3VpZW50ZSBkZXNhcnJvbGxvIGRlbCBhbsOhbGlzaXMgc2UgaGFyYSBlbiBSIFN0dXRpbyB5IGVzdGUgbWlzbW8gY29udGFyYSBjb24gdmFyaWFzIHNlY2Npb25lcyBxdWUgc2UgcHJlc2VudGFyYW4gYSBjb250aW51YWNpb24uDQoNCiMjIyAqKjQuNC4xLiBSZXN1bWVuIGVzdGFkw61zdGljbyBkZSBsYXMgdmFyaWFibGVzIGRlIGVzdHVkaW8qKiB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQpFbiBiYXNlIGEgbGEgbmF2ZWdhY2lvbiBkZSBsYXMgcGVzdGHDsWFzIHNlIG11ZXN0cmEgZWwgcmVzdW1lbiBlc3RhZGlzdGljbyBkZSBsYSB2YXJpYWJsZSBpbmRlcGVuZGllbnRlICoqRnJlY0NfTWF4KiosIHNlIHByZXNlbnRhIHN1IGJsb3hwb3QgZSBoaXN0b2dyYW1hLiBEZSBsYSB2YXJpYWJsZSBkZXBlbmRpZW50ZSAqKkNsYXNlX3NhbGlkYSoqIHNlIG1vc3RyYXJhIHN1IGRpYWdyYW1hIGRlIGJhcnJhcywgYXNpIGNvbW8gc3UgbWVkaWEgeSBtZWRpYW5hLiBBZGVtYXMsIHNlIGV4aGliaXJhIHVuIGRpYWdyYW1hIGRlIENhamFzIGNvbmp1bnRvIGVudHJlIGFxdWVsbGFzIHZhcmlhYmxlcyBxdWUgbWVuY2lvbmFtb3MuDQoNCkVuIGJhc2UgZW4gbGEgcGVzdGHDsWEgKipSZXN1bWVuIHkgQmxveHBsb3QgZGUgRnJlY0NfTWF4Kiogc2UgcHVlZGUgY29tZW50YXIgcXVlIGxhIHZhcmlhYmxlICoqRnJlY0NfTWF4KiogY29tbyBzZSBtZW5jaW9ubyBlbiBsYSBzZWNjaW9uICoqNC4yLjEuKiogcHJlc2VudGEgdW4gc2VzZ28gbWFzIHNpbWV0cmljbyBkYWRvIHF1ZSBzdSBtZWRpYSB5IG1lZGlhbmEgc2UgZW5jdWVudHJhbiBlbiB2YWxvcmVzIGV4dHJlbWFkYW1lbnRlIGNlcmNhbmFzIGVudHJlIHNpIGxvIGN1YWwgbm9zIGluZGljYSBxdWUgbm8gbXVlc3RyYSB2YWxvcmVzIGF0aXBpY29zLiBMbyBhbnRlcmlvciBtZW5jaW9uYWRvIHRhbWJpZW4gZXMgY29udGFibGUgYSB0cmF2ZXMgZGUgbGEgcGVzdGHDsWEgKipIaXN0b2dyYW1hIGRlIEZyZWNDX01hYyoqLg0KDQpDb250aW51YW5kbywgc2VndW4gbGEgcGVzdGHDsWEgKipSZXN1bWVuIHkgRGlhZ3JhbWEgZGUgQmFycmFzIGRlIENsYXNlX3NhbGlkYSoqIGxhIHZhcmlhYmxlIGN1YWxpdGF0aXZhOjpub21pbmFsICoqQ2xhc2Vfc2FsaWRhKiogbXVlc3RyYSB1bmEgbWF5b3IgcHJvcG9yY2lvbmFsaWRhZCBwYXJhIGxvcyBjYXNvcyAxIChFbmZlcm1lZGFkIENhcmlkaWFjYSksIHF1ZSBwYXJhIGxvcyBjYXNvIDAgKE5vcm1hbCk6ICQ1NSwyOSQgJCUkIHkgJDQ0LDcxJCAkJSQsIHJlcGVzcGVjdGl2YW1lbnRlLg0KDQpDb21wbGVtZW50YXJpYW1lbnRlLCBlbCAqKlJlc3VtZW4geSBlbCBEaWFncmFtYSBkZSBDYWphcyBDb25qdW50byoqIG11ZXN0cmFuIHF1ZSBsYXMgb2JzZXJ2YWNpb25lcyBzb24gY29uc2lzdGVudGVzIGNvbiBlbCBjb250ZXh0byBkZWwgcHJvYmxlbWEuIEVzIGRlY2lyLCBwYXJhIGxvcyBjYXNvcyBjb24gKipDbGFzZV9zYWxpZGEgPSAwKiogKE5vcm1hbCksIGxvcyB2YWxvcmVzIGRlICoqRnJlY0NfTWF4Kiogc29uIG1heW9yZXMgZW4gY29tcGFyYWNpw7NuIGNvbiBsb3MgY2Fzb3MgY29uICoqQ2xhc2Vfc2FsaWRhID0gMSoqIChFbmZlcm1lZGFkIENhcmRpYWNhKS4gQWRlbcOhcywgYW1ib3MgZ3J1cG9zIG11ZXN0cmFuIHNlc2dvLCBhdW5xdWUgbGEgYXNpbWV0csOtYSBuZWdhdGl2YSBlcyBtw6FzIG5vdG9yaWEgcGFyYSBlbCBncnVwbyBjb24gKipDbGFzZV9zYWxpZGEgPSAxKiouDQoNCkVuIGN1YW50byBhIGxhIGRpc3BlcnNpw7NuLCBzZSBvYnNlcnZhbiBkaWZlcmVuY2lhcyBvcHVlc3RhcyBlbnRyZSBsb3MgZ3J1cG9zOiBlbCBncnVwbyBjb24gKipDbGFzZV9zYWxpZGEgPSAwKiogbXVlc3RyYSB1bmEgbWF5b3IgZGlzcGVyc2nDs24gZW4gZWwgcmFuZ28gaW50ZXJjdWFydMOtbGljbyBoYWNpYSBsYSBtaXRhZCBzdXBlcmlvciBkZSBsb3MgZGF0b3MsIG1pZW50cmFzIHF1ZSBlbCBncnVwbyBjb24gKipDbGFzZV9zYWxpZGEgPSAxKiogbXVlc3RyYSB1bmEgZGlzcGVyc2nDs24gbcOhcyBjZW50cmFkYSBwZXJvIGNvbiBsaWdlcmEgYXNpbWV0csOtYSBuZWdhdGl2YS4gTG9zIGF0w61waWNvcyBlbiBhbWJvcyBncnVwb3Mgc2UgcHJlc2VudGFuIGVuIGxvcyBleHRyZW1vcyBpbmZlcmlvcmVzIGRlIGxhcyBkaXN0cmlidWNpb25lcywgc3VnaXJpZW5kbyBxdWUgbG9zIHZhbG9yZXMgYmFqb3MgZGUgKipGcmVjQ19NYXgqKiBzb24gbcOhcyBleHRyYcOxb3MuDQoNCiMjIyMgUmVzdW1lbiB5IEJveHBsb3QgZGUgRnJlY0NfTWF4DQpgYGB7ciByZXN1bWVuX0ZyZWNDX01heF8yLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCnN1bW1hcnkoaGVhcnRfZGlzZWFzZXNfRGF0YXNldF9WUl9NT0QkRnJlY0NfTWF4KQ0KYm94cGxvdChoZWFydF9kaXNlYXNlc19EYXRhc2V0X1ZSX01PRCRGcmVjQ19NYXgsIG1haW4gPSAiRGlhZ3JhbWEgZGUgQ2FqYSBkZSBGcmVjQ19NYXgiLCBjb2wgPSBjKCJvcmFuZ2UiKSkNCmBgYA0KDQojIyMjIEhpc3RvZ3JhbWEgZGUgRnJlY0NfTWF4DQpgYGB7ciBoaXN0b2dyYW1hX0ZyZWNDX01heCwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpzdW1tYXJ5KGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRfVlJfTU9EJEZyZWNDX01heCkNCmhpc3QoaGVhcnRfZGlzZWFzZXNfRGF0YXNldF9WUl9NT0QkRnJlY0NfTWF4LCBtYWluID0gIkhpc3RvZ3JhbWEgZGUgRnJlY0NfTWF4IiwgY29sID0gYygiZ29sZCIpKQ0KYGBgDQoNCiMjIyMgUmVzdW1lbiB5IERpYWdyYW1hIGRlIEJhcnJhcyBkZSBDbGFzZV9zYWxpZGENCmBgYHtyIHJlc3VtZW5fQ2xhc2Vfc2FsaWRhLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCnRhYmxlKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRfVlJfTU9EJENsYXNlX3NhbGlkYSkNCnByb3AudGFibGUodGFibGUoaGVhcnRfZGlzZWFzZXNfRGF0YXNldF9WUl9NT0QkQ2xhc2Vfc2FsaWRhKSkNCmJhcnBsb3QodGFibGUoaGVhcnRfZGlzZWFzZXNfRGF0YXNldF9WUl9NT0QkQ2xhc2Vfc2FsaWRhKSkNCmBgYA0KDQojIyMjIFJlc3VtZW4geSBEaWFncmFtYSBkZSBDYWphcyBDb25qdW50bw0KYGBge3IgYm94cGxvdF9Db25qdW50b19GcmVjQ19NQXgtQ2xhc2Vfc2FsaWRhLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCnRhcHBseShoZWFydF9kaXNlYXNlc19EYXRhc2V0X1ZSX01PRCRGcmVjQ19NYXgsIGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRfVlJfTU9EJENsYXNlX3NhbGlkYSwgbWVhbikNCnRhcHBseShoZWFydF9kaXNlYXNlc19EYXRhc2V0X1ZSX01PRCRGcmVjQ19NYXgsIGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRfVlJfTU9EJENsYXNlX3NhbGlkYSwgbWVkaWFuKQ0KYm94cGxvdChoZWFydF9kaXNlYXNlc19EYXRhc2V0X1ZSX01PRCRGcmVjQ19NYXh+aGVhcnRfZGlzZWFzZXNfRGF0YXNldF9WUl9NT0QkQ2xhc2Vfc2FsaWRhLCBtYWluID0gIkJveHBsb3QgQ29uanVudG86IEZyZWNDX01BeCAtIENsYXNlX3NhbGlkYSIsIGNvbCA9IGMoIm9yYW5nZSIsICJnb2xkIikpDQpgYGANCg0KIyMjICoqNC40LjIuIEZvcm11bGFjacOzbiBkZWwgbW9kZWxvIGRlIFJMb2dTIGVudHJlIGxhcyB2YXJpYWJsZXMgZGUgZXN0dWRpbyoqIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNCkVuIGJhc2UgYSBsYSBuYXZlZ2FjaW9uIGEgdHJhdmVzIGRlIHBlc3Rhw7FhcyBzZSBtdWVzdHJhbiBsb3MgY29lZmljaWVudGVzIGRlbCBtb2RlbG8gKipSTG9nUyoqIHkgc3UgcmVzdW1lbiBlc3RhZGlzdGljby4gU2UgbWVuY2lvbmEgZGUgbnVldm8gbGFzIHZhcmlhYmxlcyBxdWUgc29uIGRlIGludGVyZXM6ICoqRnJlY0NfTWF4KiogKFZhcmlhYmxlIGluZGVwZW5kaWVudGUpIHkgKipDbGFzZV9zYWxpZGEqKiAoVmFyaWFibGUgZGVwZW5kaWVudGUpLg0KDQpMYSBwZXN0YcOxYSAqKkNvZWZpY2llbnRlcyBkZWwgTW9kZWxvIFJMb2dTKiogbm9zIHBlcm1pdGUgZXN0YWJsZWNlciBxdWUgZWwgbW9kZWxvIFJMb2dTIHNlbGNjaW9uYSBhICRccGkoeCkkIGNvbiAkeCQgYSB0cmF2w6lzIGRlIGxhIGZ1bmNpw7NuIGRlIGVubGFjZSAkTG9naXQkIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6JCRcZnJhY3tccGkoeCl9ezEtXHBpKHgpfT1lXns1LDM0MTIzNjQ1LTAsMDM3MTQ0NTNcY2RvdCB4fVxoc3BhY2V7MTBtbX0oMzEpJCQNCg0KRGUgbGEgbWlzbWEgZm9ybWEsIGxhIHBlc3Rhw7FhICoqUmVzdW1lbiBFc3RhZGlzdGljbyBkZWwgTW9kZWxvIFJMb2dTKiogbXVlc3RyYSBwYXJhIGVmZWN0b3MgZGUgY29tcGFyYWNpb24sIGxvcyByZXN1bWVuZXMgZGVsIG1vZGVsbyBlc3R1YWRpYWRvIHkgdW5vIGFsdGVybmF0aXZvIHRvbWFuZG8gY29tbyBiYXNlIGxhIHZhcmlhYmxlIGN1YWxpdGF0aXZhOjpub21pbmFsICoqQW5naW5hX0VqZXJjaWNpbyoqLiBDb24gYmFzZSBlbiBlbCBjcml0ZXJpbyBkZSBpbmZvcm1hY2lvbiBxdWUgbm9zIHByb3BvcmNpb25hIGVsIEFrYWlrZSAoQUlDIHBvciBzdXMgc2lnbGFzIGVuIGluZ2xlcyksIGRlbCBjdWFsIHNlIHNhYmUgcXVlIGVzIHVuYSBtZWRpZGEgZGUgYm9uZGFkIGRlIGFqdXN0ZSBkZSB1biBtb2RlbG8gZXN0YWRpc3RpY28gcXVlIGRlc2NyaWJlIGxhIHJlbGFjaW9uIGVudHJlIGVsIHNlc2dvIHkgbGEgdmFyaWFuemEgZW4gbGEgZm9ybXVsYWNpb24gZGVsIG1vZGVsbywgZXMgZGVjaXIsIGVudHJlIHN1IGV4YXRpdHVkIHkgY29tcGxlamlkYWQsIHNlIHZlcmlmaWNhIHF1ZSBlbiBiYXNlIGEgbG9zIHJlc3VsdGFkb3MgcG9kZW1vcyB2ZXJpZmljYXIgcXVlIGVsIG1lam9yIG1vZGVsbyBlcyBjb24gbGEgdmFyaWFibGUgKipDbGFzZV9zYWxpZGEqKiBxdWUgY29uIGxhIHZhcmlhYmxlICoqQW5naW5hX0VqZXJjaWNpbyoqIHBvciB1bmEgZGlmZXJlbmNpYSBtdXkgY29ydGEsIHBvcnF1ZToNCiRBSUNfQyA9IDExMDUsMiA8IDExMDgsNyA9IEFJQ19BJC4gVGFtYmllbiwgcGFyYSBhcG95YXIgcXVlIGVsIG1vZGVsbyBiYXNhZG8gZW4gbGEgdmFyaWFibGUgKipDbGFzZV9zYWxpZGEqKiBlcyBtZWpvciBxdWUgZWwgbW9kZWxvIGJhc2FkbyBlbiBsYSB2YXJpYWJsZSAqKkFuZ2luYV9FamVyY2ljaW8qKiwgZWwgY29jaWVudGUgZW50cmUgbGEgZGVzdmlhY2lvbiBudWxhIChOdWxsIERldmlhbmNlKSB5IGxhIGRlc3ZpYWNpb24gcmVjaWR1YWwgKFJlc2lkdWFsIERlc3ZpYW5jZSksIG9ic2VydmFibGUgZW4gbGEgcGVzdGHDsWEgKipSZXN1bWVuIEVzdGFkaXN0aWNvIGRlbCBNb2RlbG8gUkxvZ1MqKiwgZXMgdW4gcG9jbyBtYXlvciBlbiBlbCBtb2RlbG8gcHJvcHVlc3RvIHF1ZSBlbiBlbCBkZSBjb21wYXJhY2lvbi4NCg0KIyMjIyBDb2VmaWNpZW50ZXMgZGVsIE1vZGVsbyBSTG9nUw0KYGBge3IgY29lZmljaWVudGVzX1JlZ3Jlc2lvbl9Mb2dpc3RpY2FfU2ltcGxlLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCm1vZGVsb19STG9nX1NpbXBsZSA9IGdsbShoZWFydF9kaXNlYXNlc19EYXRhc2V0X1ZSX01PRCRDbGFzZV9zYWxpZGF+aGVhcnRfZGlzZWFzZXNfRGF0YXNldF9WUl9NT0QkRnJlY0NfTWF4LCBmYW1pbHkgPSAiYmlub21pYWwiLCBkYXRhID0gZGF0YS5mcmFtZShoZWFydF9kaXNlYXNlc19EYXRhc2V0X1ZSX01PRCRDbGFzZV9zYWxpZGEsIGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRfVlJfTU9EJEZyZWNDX01heCkpDQpjb2VmKG1vZGVsb19STG9nX1NpbXBsZSkNCmBgYA0KDQojIyMjIFJlc3VtZW4gRXN0YWTDrXN0aWNvIGRlbCBNb2RlbG8gUkxvZ1MNCmBgYHtyIHJlc3VtZW5fUmVncmVzaW9uX0xvZ2lzdGljYV9TaW1wbGUsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0Kc3VtbWFyeShtb2RlbG9fUkxvZ19TaW1wbGUpDQptb2RlbG9fUkxvZ19TaW1wbGVfQU4gPSBnbG0oaGVhcnRfZGlzZWFzZXNfRGF0YXNldF9WUl9NT0QkQW5naW5hX0VqZXJjaWNpb35oZWFydF9kaXNlYXNlc19EYXRhc2V0X1ZSX01PRCRGcmVjQ19NYXgsIGZhbWlseSA9ICJiaW5vbWlhbCIsIGRhdGEgPSBkYXRhLmZyYW1lKGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRfVlJfTU9EJEFuZ2luYV9FamVyY2ljaW8sIGhlYXJ0X2Rpc2Vhc2VzX0RhdGFzZXRfVlJfTU9EJEZyZWNDX01heCkpDQpzdW1tYXJ5KG1vZGVsb19STG9nX1NpbXBsZV9BTikNCmBgYA0KDQojIyMgKio0LjQuMy4gQW7DoWxpc2lzIGRlbCBtb2RlbG8gUkxvZ1MqKiB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQpFbiBiYXNlIGEgcGVzdGHDsWFzIHNlIG1vdHJhcmFuIGxvcyByZXN1bHRhZG9zIGRlIGFsZ3VuYXMgcHJlZGljY2lvbmVzIG9idGVuaWRhcyBhIHRyYXZlcyBkZWwgbW9kZWxvIFJMb2dTIHBhcmEgaWRlbnRpZmljYXIgZW4gc3VzIHJlc3B1ZXN0YXMgbGEgY29ycmVzcG9uZGVuY2lhIGRlIHNlbnRpZG8gZW4gbGFzIHJhem9uZXMgZGUgcHJvYmFiaWxpZGFkZXMgT0REUyBhIGZhdm9yIG8gZW4gY29udHJhIGRlbCBldmVudG8gY29uc2lkZXJhbmRvOiAkXGZyYWN7XHBpfXsxLVxwaX0kIHkgJFxmcmFjezEtXHBpfXtccGl9JCwgcmVzcGVjdGl2YW1lbnRlLiAgU2UgbWVuY2lvbmEgZGUgbnVldm8gcXVlIGxhcyB2YXJpYWJsZXMgZGUgaW50ZXJlcyBzb24gKipGcmVjQ19NYXgqKiAodmFyaWFibGUgaW5kZXBlbmRpZW50ZSkgeSAqKkNsYXNlX3NhbGlkYSoqICh2YXJhaWJsZSBkZXBlbmRpZW50ZSkuDQoNCkxhIHBlc3Rhw7FhICoqVmFyaWFibGUgUHJlZGljdG9yYSBpZ3VhbCBhIENlcm8qKiBwbGFudGVhIGRvcyBzaXR1YWNpb25lcyBpbnRlcnByZXRhdGl2YXMuIExhIHByaW1lcmEgIG5vcyBwZXJtaXRlIGNvbXByZW5kZXIgZWwgY29lZmljaWVudGUgZGVsIGZhY3RvciBlbiBlbCBjdWFsIGVzdGEgcHJlc2VudGUgbGEgdmFyaWFibGUgcHJlZGljdG9yYSwgeSB1bmEgcHJvYmFiaWxpZGFkIGNlcmNhbmEgYSBjZXJvIGRlIHF1ZSB1biBjYXNvIHNlYSBmYXZvcmFibGUgcGVybyBkYWRvIGVsIGNvbnRleHRvIGRlIGxhIHZhcmlhYmxlIHByZWRpY3RvcmEgZXN0YSBlcyBpbXBvc2libGUgcXVlIHNlIHRvcm5lIGNlcm8gcG9yIGxvIHRhbnRvIGNhcmVjZSBkZSBzZW50aWRvLCBsYSBzZWd1bmRhIHNpdHVhY2lvbiBjb25sbGV2YSB1bmEgaW50ZXJwcmV0YWNpb24gbWFzIGRlbGljYWRhOiBjb21vIGxhIHZhcmlhYmxlICoqRnJlY0NfTWF4IHNlIG1pZGUgZW4gZWwgaW50ZXJ2YWxvICRbNjAgLCAyMDJdJCB1bmEgbWVkaWRhIGRlIHVuaWRhZCByYXpvbmFibGUgcGFyYSBlbCBhdW1lbnRvIHNlcmlhIGRlIHVuYSB1bmlkYWQgZWplbXBsbzogcGFzYXIgZGUgJDk5JCBwcG0gYSAkMTAwJCBwcG0gaW1wbGljYW5kbyB1biBhdW1hbnRvIGRlIHVuYSB1bmlkYWQgZGUgbWVkaWRhLiBBc2ksIHNlIGVudGllbmRlIHF1ZSBlbCBjb2NpZW50ZSBkZSBwcm9iYWJpbGlkYWRlcyBlbiByZWxhY2lvbiBjb24gbGEgdmFyaWFibGUgcHJlZGljdG9yYSBlbiBsZSBtb2RlbG8gUkxvZ1MgcmVmbGVqYSB1biBpbmNyZW1lbnRvIGFjdW11bGFkbyBkZSAkXGFwcHJveCAwLDk2MzUkIHZlY2VzIGRlc2RlICQ2MCQgaGFzdGEgJDIwMiQgY29uIGluY3JlbWVudG9zIGRlICQxJC4NCg0KQ29uIGJhc2UgZW4gbG8gYW50ZXJpb3IsIGEgdHJhdmVzIGRlIGxhIHBlc3Rhw7FhICoqUHJvYmFiaWxpZGFkZXMgRXN0aW1hZGFzKiogc2UgcHVlZGUgYXByZWNpYXIgZW50cmUgbG9zIHJlZ2lzdHJvcyAkNDIyJCB5ICQ1NDAkIHVuIGRlbHRhIGRlIGNhbWJpbyBhYnNvbHV0byBpZ3VhbCBhICQwLDAxNTYwMzIkIChlcXVpdmFsZW50ZSBhIHVuIGljcmVtZW50byByZWxhdGl2byBkZWwgJFxhcHByb3ggMiwyMSQgJCUkKSBhbCBpbmNyZW1lbnRhciBsYSB2YXJpYWJsZSBwcmVkaWN0b3JhIGVuIHVuYSB1bmlkYWQgY29tbyBzZSBkZWZpbmlvIGVuIGVsIHBhcnJhZm8gYW50ZXJpb3IuDQoNClBvciB1bHRpbW8sIGVsIGdyYWZpY28gZGUgY3VydmEgbG9naXN0aWNhLCBlbiBsYSBwZXN0YcOxYSAqKkdyYWZpY2EgZGVsIG1vZGVsbyBSTG9nUyoqLCBub3MgcGVybWl0ZSB2aXN1YWxpemFyIHkgY29tcHJlbmRlciBlbCBjb21wb3J0YW1pZW50byBkZSBsYXMgdmFyaWFibGVzIGludm9sdWNyYWRhcyBlbiBlbCBtb2RlbG8gcHJvcHVlc3RvOyBlcyBkZWNpciwgbG9zIGNhc29zIGZhdm9yYWJsZXMgZW4gcmVsYWNpb24gY29uIGxhIHZhcmlhYmxlICoqQ2xhc2Vfc2FsaWRhKiogcHJlc2VudGEgdW5hIG1lbm9yIHByb2JhYmlsaWRhZCBhIG1lZGlkYSBkZSBxdWUgbGEgKipGcmVjQ19NYXgqKiBlcyBtYXlvci4NCg0KIyMjIyBWYXJpYWJsZSBQcmVkaWN0b3JhIGlndWFsIGEgQ2Vybw0KYGBge3IgdmFyaWFibGVfUHJlZGljdG9yYV9DZXJvLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCmNvZWYobW9kZWxvX1JMb2dfU2ltcGxlKQ0Kcm91bmQoZXhwKGNvZWYobW9kZWxvX1JMb2dfU2ltcGxlKSksNikNCmBgYA0KDQojIyMjIFByb2JhYmlsaWRhZGVzIEVzdGltYWRhcw0KYGBge3IgcHJvYmFiaWxpZGFkZXNfRXN0aW1hZGFzLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCnByZWRpY3QobW9kZWxvX1JMb2dfU2ltcGxlLCBkYXRhLmZyYW1lKHNlcSgxLCA5MTcpKSwgdHlwZSA9ICJyZXNwb25zZSIpDQpgYGANCg0KIyMjIyBHcsOhZmljYSBkZWwgTW9kZWxvIFJMb2dTDQpgYGB7ciBncmFmaWNhX01vZGVsb19STG9nUywgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpDbGFzZV9zYWxpZGEgPC0gaGVhcnRfZGlzZWFzZXNfRGF0YXNldF9WUl9NT0QkQ2xhc2Vfc2FsaWRhDQpGcmVjQ19NYXggPC0gaGVhcnRfZGlzZWFzZXNfRGF0YXNldF9WUl9NT0QkRnJlY0NfTWF4DQpkYXRhUGxvdCA8LSBkYXRhLmZyYW1lKEZyZWNDX01heCwgQ2xhc2Vfc2FsaWRhKQ0KcGxvdChDbGFzZV9zYWxpZGF+RnJlY0NfTWF4LCBkYXRhID0gZGF0YVBsb3QsIG1haW4gPSAiTW9kZWxvIFJMb2dTOiBGcmVjQ19NYXggLSBDbGFzZV9zYWxpZGEiLCB4bGFiID0gIkZyZWNDX01heCIsIHlsYWIgPSAiQ2xhc2Vfc2FsaWRhID0gMCB8IENsYXNlX3NhbGlkYSA9IDEiLCBjb2wgPSAiZ29sZCIsIHBjaCA9ICJJIikNCmN1cnZlKHByZWRpY3QoZ2xtKENsYXNlX3NhbGlkYX5GcmVjQ19NYXgsIGZhbWlseSA9ICJiaW5vbWlhbCIsIGRhdGEgPSBkYXRhUGxvdCksIGRhdGEuZnJhbWUoRnJlY0NfTWF4ID0geCksIHR5cGUgPSAicmVzcG9uc2UiKSwgY29sID0gIm9yYW5nZSIsIGx3ZCA9IDMsIGFkZCA9IFRSVUUpDQpgYGANCg0KIyAqKkNvbmNsdWNpb24qKg0KDQpDb21wbGVtZW50YXJpYW1lbnRlIGEgbG9zIGFuYWxpc2lzIHF1ZSBmdWVyb24gZXhwdWVzdG9zIGVuIGxhcyBmYXNlcyBhbnRlcmlvcmVzIGRlIGVzdHVkaW8gZGUgY2FkYSBtb2RlbG8gdHJhdGFkbyBlbiBlc3RlIHRyYWJham8gZXMgaW1wb3J0YW50ZSBoYWNlciB1bmEgbWVuY2lvbiBnbG9iYWwgc29icmUgZWwgcHJvYmxlbWEgcXVlIHNlIGVzdGEgdHJhdGFuZG8gYWJvcmRhciBjb25zaWRlcmFuZG8gYSBsYSBsdXogZGUgdG9kbyBsbyBvYnRlbmlkbzoNCg0KUGFyYSBxdWUgYSB1biBwYWNpZW50ZSBzZSBsZSBkaWFnbm9zdGlxdWUgZGUgaW5zdWZpY2llbmNpYSBjYXJkaWFjYSwgcGFyYSBlbCBjdWFsIGVsIGdlbmVybyBlcyBwb2NvIHNpZ25pZmljYXRpdm8sIGxhIGZyZWN1ZW5jaWEgY2FyZGlhY2EgbWF4aW1hIHkgbGEgYW5naW5hIHBvcmR1Y2lkYSBwb3IgZWwgZWplcmNpY2lvIGNvbW8gZWplbXBsbyBzZWd1biBzdSB2YWxvciBwdWVkZSBheXVkYXIgYSBxdWUgZWwgcGFjaWVudGUgc2UgbGUgZGlhZ25vc3RpcXVlIGluc3VmaWNpZW5jaWEgY2FyZGlhY2EuIFNpbiBlbWJhcmdvLCBsYXMgdmFyaWFibGVzIGRlIHRyYWJham8gdXNhZGFzIGVuIGVzdGUgZXN0dWRpbyBzb2xvIGV4cGxpY2FuIGVuIGNvbmp1bnRvLCBhcHJveGltYWRhbWVudGUgZWwgJDM1JCAkJSQgZGUgbGEgdmFyaWFiaWxpZGFkIGRlIGxhIHZhcmlhYmxlIG9iamV0aXZvLCBlc3RlIHZhbG9yIG5vIGVzIHN1ZmljaWVudGUgcGFyYSBkZWNpciBjb24gY2VydGV6YSBzaSB1biBwYWNpZW50ZSBzZSBsZSBkaWFnbm9zdGljYSBpbnN1ZmljaWVuY2lhIGNhcmRpYWNhIG8gbm8sIGRhZG8gcXVlIGVsICQ3NSQgJCUkIHJlc3RhbnRlIHF1ZWRhIHN1amV0byBhIGVzcGVjdWxhY2lvbmVzIGNvbW8gc2kgdGllbmUgcHJvYmxlbWFzIGNhcmRpYWNvcyBoZXJlZGl0YXJpb3MgZW4gc3UgbnVjbGVvIGZhbWlsaWFyLCBsYSBjYW50aWRhZCBkZSBlamVyY2ljaW8gcXVlIHJlYWxpemEgcG9yIGRpYSwgY29tbyBlc3RvcyB5IG90cm9zIHBhcmFtZXRyb3MgcXVlIG5vIHNlIGN1ZW50YW4gZW4gZWwgY29uanVudG8gZGUgZGF0b3MgcXVlIHNlIGVzdHVkaW8sIHNpbiBlbWJhcmdvIHF1ZSByZXN1bHRhcmlhIGludGVyZXNlbnRhIGRlIGVzdHVkaWFyIHBhcmEgdGVuZXIgdW4gcmVzdWx0YWRvIG1hcyBwcmVjaXNvIHNvYnJlIGVsIHByb2JsZW1hIHF1ZSBzZSBhYm9yZGEuDQoNClBvciDDumx0aW1vLCBlcyBpbXBvcnRhbnRlIHJlc2FsdGFyIGVsIGFzcGVjdG8gdMOpY25pY28gcmVsYWNpb25hZG8gY29uIGVsIHByb2Nlc2FtaWVudG8gZXN0YWTDrXN0aWNvIGhlY2hvIGVuIGVzdGUgZXN0dWRpbyBhIG5pdmVsIGRlIHJvYnVzdGV6LCBlZmljaWVuY2lhIGUgaW50ZWdyYWNpw7NuIHF1ZSBSLCBSU3R1ZGlvIHkgUk1hcmtkb3duIG9mcmVjZW4gYWwgdXN1YXJpbyBwYXJhIHF1ZSBlc3RlIHNlIHB1ZWRhIGVuZm9jYXIgZW4gw6lsIHNpbiBwYXNhciBtYXlvcmVzIGluY29udmVuaWVudGVzIGNvbiBlbCBzb3BvcnRlIGRvY3VtZW50YWwgcGFyYSBwcmVzZW50YXJsby4=