Fase 1 [Descripciones Multivariantes]

esta primera etapa de estudio mostrará cálculos, visualizaciones e interpretaciones con base en un conjunto de datos cualitativos y cuantitativos. Con base a los conocimientos previos provenientes de las clases del curso de Gestión de Datos dictado por el docente Giancarlo Libreros Londoño para el aprendizaje significativo, en modalidad presencial (cohorte 2023-4) de la Universidad del Valle (sede Zarzal-Valle); utilizando el siguiente software para obtener el conjunto de datos: https://www.kaggle.com/datasets?tags=12127-Software. El trabajo hecho en gestion de datos que puede ser consultado temporalmente a través de: https://rpubs.com/DFVV00/1253020. Por último, este trabajo fue procesado con R versión 4.4.1 (2024-06-15 ucrt) mediado por RStudio RStudio 2024.09.1+394 “Cranberry Hibiscus” Release (a1fe401fc08c232d470278d1bc362d05d79753d9, 2024-11-03) for windows Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) RStudio/2024.09.1+394 Chrome/124.0.6367.243 Electron/30.4.0 Safari/537.36, Quarto 1.5.57 en una plataforma x86_64-w64-mingw32.

1.1 Objetivos:

El objetivo de este proyecto es aplicar técnicas de análisis multivariado para gestionar el conjunto de datos aprobado, correspondiente al impacto del trabajo remoto y la salud mental. El propósito es organizar y procesar eficazmente la información, desarrollando habilidades en la gestión y análisis de datos. Este trabajo se enmarca dentro del curso de Gestión de Datos.

Entre las principales referencias se incluyen el libro Análisis estadístico de datos multivariados del profesor (Díaz Morales & Morales Rivera, 2012), de la Universidad Nacional de Colombia, y el texto Análisis multivariante aplicado con R de (Aldás & Uriel, 2017) en su segunda edición, el cual aportara herramientas clave para realizar análisis avanzados utilizando este software.

1.2 descripción de los datos:

contexto del conjunto de datos:

El conjunto de datos contiene 20 campos y 5000 registros. Uno de los campos es simplemente un identificador numérico secuencial de los registros , otro de naturaleza dicotomica , 11 de naturaleza politomica y el resto son numéricos estrictamente positivos. La lista siguiente los describe en el mismo orden, de izquierda a derecha, como aparecen en el rango de datos que los contiene y se establece para cada campo, excepto el campo “Identificacion de persona”, el tipo de variable y su escala de medición con base en la nomenclatura (tipo_de_variable::escala_de_medición[ordenamiento]):

descripción del conjunto de datos:

  • employee_ID: (identificador) Registra un número secuenciado a partir de 1 para identificar el registro de cada persona consignado en la base datos de forma única.

  • Age: (cuantitativa::razon) Registra la edad medida en años de la persona.

  • Gender: (cualitativa::nominal) Registra el sexo del estudiante del cual se registraron los datos , en el caso de este campo toma dos posibles valores, masculino y femenino.

  • Years_of_experience: (Cuantitativa::razón) registra los años de experiencia de cada trabajador.

  • Job_role: (cualitativa::nominal) Registra la ocupacion, trabajo u oficio de cada persona.

  • Work_location: (cualitativa::nominal) agrupa a los empleados en categorías, En este caso, la variable describe el entorno laboral en el que los empleados realizan sus actividades profesionales entregando tres valores remoto; hibrido y presencial.

  • Hours_worked_per_week: (cuantitativa::razon) esta variable mide la cantidad total de horas que un empleado trabaja en una semana.

  • Number_of_virtual_meetings: (cuantitativa::razón) registra el numero de sesiones virtuales a la semana de cada trabajador.

  • Work_life_balance_rating: (cuantitativa::ordinal) Esta variable mide la percepción de los empleados sobre su equilibrio entre la vida laboral y personal, utilizando una escala de calificación del uno al cinco que permite evaluar su satisfacción en este aspecto

  • Stress_level: (cualitativa::ordinal) Esta variable mide la percepción de los empleados sobre su nivel de estrés en el trabajo, utilizando categorías que reflejan diferentes grados de estrés mediante tres valores bajo, medio y alto.

  • Access_to_mental_health_resources: (cualitativo::nominal) Esta variable mide si los empleados tienen acceso a recursos de salud mental proporcionados por la empresa, lo cual puede incluir servicios como terapia, asesoramiento, programas de bienestar mental y otros recursos relacionados,tiene respuesta dicotómica obteniendo solo dos valores “sí” expresado en el conjunto de datos como “1” y el “no” como “0”.

  • satisfaction_with_remote_work: (cualitativa::ordinal) Esta variable mide el nivel de satisfacción de los empleados respecto a su experiencia de trabajo remoto, utilizando categorías que reflejan diferentes grados de satisfacción como insatisfecho, neutral y satisfecho.

  • Company_support_for_remote_work: (cuantitativa::ordinal) Esta variable mide el nivel de apoyo que los empleados perciben recibir de su empresa en relación con el trabajo remoto, utilizando una escala de calificación del uno al cinco que refleja diferentes grados de apoyo.

en el conjunto no se presentaron espacios vacíos, incoherencias o errores y las variables dicotomicas fueron reemplazadas por 1 o 0 respectivamente.

Estructura del conjunto de datos original

str(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_original)
## tibble [5,000 × 20] (S3: tbl_df/tbl/data.frame)
##  $ Employee_ID                      : chr [1:5000] "EMP0001" "EMP0002" "EMP0003" "EMP0004" ...
##  $ Age                              : num [1:5000] 32 40 59 27 49 59 31 42 56 30 ...
##  $ Gender                           : chr [1:5000] "Male" "Female" "Male" "Male" ...
##  $ Job_Role                         : chr [1:5000] "HR" "Data Scientist" "Software Engineer" "Software Engineer" ...
##  $ Industry                         : chr [1:5000] "Healthcare" "IT" "Education" "Finance" ...
##  $ Years_of_Experience              : num [1:5000] 13 3 22 20 32 31 24 6 9 28 ...
##  $ Work_Location                    : chr [1:5000] "Hybrid" "Remote" "Hybrid" "Onsite" ...
##  $ Hours_Worked_Per_Week            : num [1:5000] 47 52 46 32 35 39 51 54 24 57 ...
##  $ Number_of_Virtual_Meetings       : num [1:5000] 7 4 11 8 12 3 7 7 4 6 ...
##  $ Work_Life_Balance_Rating         : num [1:5000] 2 1 5 4 2 4 3 3 2 1 ...
##  $ Stress_Level                     : chr [1:5000] "Medium" "Medium" "Medium" "High" ...
##  $ Mental_Health_Condition          : chr [1:5000] "Depression" "Anxiety" "Anxiety" "Depression" ...
##  $ Access_to_Mental_Health_Resources: num [1:5000] 0 0 0 1 1 0 1 0 1 1 ...
##  $ Productivity_Change              : chr [1:5000] "Decrease" "Increase" "No Change" "Increase" ...
##  $ Social_Isolation_Rating          : num [1:5000] 1 3 4 3 3 5 5 5 2 2 ...
##  $ Satisfaction_with_Remote_Work    : chr [1:5000] "Unsatisfied" "Satisfied" "Unsatisfied" "Unsatisfied" ...
##  $ Company_Support_for_Remote_Work  : num [1:5000] 1 2 5 3 3 1 3 4 4 1 ...
##  $ Physical_Activity                : chr [1:5000] "Weekly" "Weekly" "None" "None" ...
##  $ Sleep_Quality                    : chr [1:5000] "Good" "Good" "Poor" "Poor" ...
##  $ Region                           : chr [1:5000] "Europe" "Asia" "North America" "Europe" ...

Conjunto de datos inicial

(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_original)
## # A tibble: 5,000 × 20
##    Employee_ID   Age Gender Job_Role  Industry Years_of_Experience Work_Location
##    <chr>       <dbl> <chr>  <chr>     <chr>                  <dbl> <chr>        
##  1 EMP0001        32 Male   HR        Healthc…                  13 Hybrid       
##  2 EMP0002        40 Female Data Sci… IT                         3 Remote       
##  3 EMP0003        59 Male   Software… Educati…                  22 Hybrid       
##  4 EMP0004        27 Male   Software… Finance                   20 Onsite       
##  5 EMP0005        49 Male   Sales     Consult…                  32 Onsite       
##  6 EMP0006        59 Male   Sales     IT                        31 Hybrid       
##  7 EMP0007        31 Female Sales     IT                        24 Remote       
##  8 EMP0008        42 Male   Data Sci… Manufac…                   6 Onsite       
##  9 EMP0009        56 Female Data Sci… Healthc…                   9 Hybrid       
## 10 EMP0010        30 Female HR        IT                        28 Hybrid       
## # ℹ 4,990 more rows
## # ℹ 13 more variables: Hours_Worked_Per_Week <dbl>,
## #   Number_of_Virtual_Meetings <dbl>, Work_Life_Balance_Rating <dbl>,
## #   Stress_Level <chr>, Mental_Health_Condition <chr>,
## #   Access_to_Mental_Health_Resources <dbl>, Productivity_Change <chr>,
## #   Social_Isolation_Rating <dbl>, Satisfaction_with_Remote_Work <chr>,
## #   Company_Support_for_Remote_Work <dbl>, Physical_Activity <chr>, …

Estructura del Conjunto de Datos Reescrito

str(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado)
## tibble [5,000 × 11] (S3: tbl_df/tbl/data.frame)
##  $ Employee_ID                      : chr [1:5000] "EMP0001" "EMP0002" "EMP0003" "EMP0004" ...
##  $ Age                              : num [1:5000] 32 40 59 27 49 59 31 42 56 30 ...
##  $ Gender                           : chr [1:5000] "Male" "Female" "Male" "Male" ...
##  $ Job_Role                         : chr [1:5000] "HR" "Data Scientist" "Software Engineer" "Software Engineer" ...
##  $ Years_of_Experience              : num [1:5000] 13 3 22 20 32 31 24 6 9 28 ...
##  $ Work_Location                    : chr [1:5000] "Hybrid" "Remote" "Hybrid" "Onsite" ...
##  $ Hours_Worked_Per_Week            : num [1:5000] 47 52 46 32 35 39 51 54 24 57 ...
##  $ Number_of_Virtual_Meetings       : num [1:5000] 7 4 11 8 12 3 7 7 4 6 ...
##  $ Access_to_Mental_Health_Resources: num [1:5000] 0 0 0 1 1 0 1 0 1 1 ...
##  $ Productivity_Change              : chr [1:5000] "Decrease" "Increase" "No change" "Increase" ...
##  $ Sleep_Quality                    : chr [1:5000] "Good" "Good" "Poor" "Poor" ...

Conjunto de Datos Reescrito

(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado)
## # A tibble: 5,000 × 11
##    Employee_ID   Age Gender Job_Role          Years_of_Experience Work_Location
##    <chr>       <dbl> <chr>  <chr>                           <dbl> <chr>        
##  1 EMP0001        32 Male   HR                                 13 Hybrid       
##  2 EMP0002        40 Female Data Scientist                      3 Remote       
##  3 EMP0003        59 Male   Software Engineer                  22 Hybrid       
##  4 EMP0004        27 Male   Software Engineer                  20 Onsite       
##  5 EMP0005        49 Male   Sales                              32 Onsite       
##  6 EMP0006        59 Male   Sales                              31 Hybrid       
##  7 EMP0007        31 Female Sales                              24 Remote       
##  8 EMP0008        42 Male   Data Scientist                      6 Onsite       
##  9 EMP0009        56 Female Data Scientist                      9 Hybrid       
## 10 EMP0010        30 Female HR                                 28 Hybrid       
## # ℹ 4,990 more rows
## # ℹ 5 more variables: Hours_Worked_Per_Week <dbl>,
## #   Number_of_Virtual_Meetings <dbl>, Access_to_Mental_Health_Resources <dbl>,
## #   Productivity_Change <chr>, Sleep_Quality <chr>

1.3 estimaciones multivariadas

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 cuatro 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 separados por la mediana.

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 conjunto de datos mencionado anteriormente lo que se pretendera es calcular e interpretar este conjunto, para las variables estrictamente numéricas, como: el vector de medias, la varianza-covarianza y la matriz de correlacionadas. Para recordar cuales fueron las variables numéricas (con una escala de medición de razón) son: Age, Years_of_experience, Hours_worked_per_week, y Number_of_virtual_meetings.

Desarrollo del Análisis

En base a la navegación de pestañas que nos permite RStudio se calculó los siguientes tres objetos: Vector de Medias, Matriz de Varianzas-Covarianzas 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 estar bastantes centradas en sus distribuciones, lo que implica que las medias estimadas sean mas o menos semejantes en comparación de la mediana, solo las variables

Basandonos en la pestaña Matriz de Varianza-Covarianza Se puede interpretar que las varianzas indican la dispersión de cada variable respecto a su promedio como vemos en la tabla proporcionada al ejecutar el codigo, por ejemplo la arrojada por Age es 127.6 al ser un valor alto significa que esta variable esta muy dispersa, por otro lado las covarianzas una positiva indican que ambas variables tienden a aumentar o disminuir, mientras una negativa sugiera que cuando una aumenta la otra disminuye, tenemos el ejemplo de la covarianza entre Age y Years_of_experience es -0,51, por otro lado la relación entre Years_of_experience y Number_of_virtual_meetings es 0.88, lo que indica que tienden a variar en la misma dirección

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 correlación son negativos y positivos entre las variables: Age, Years_of_experience, Hours_worked_per_week, Number_of_virtual_meetings. Estas correlaciones eran de esperarse en el conjunto estudiado dado la posible relación entre cada una.

Vector de Medias y Bloxplot

apply(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado[,-c(1,3,4,6,9,10,11)], 2, mean)
##                        Age        Years_of_Experience 
##                    40.9950                    17.8102 
##      Hours_Worked_Per_Week Number_of_Virtual_Meetings 
##                    39.6146                     7.5590
cdd_Impact_of_Remote_Work_on_Mental_Health_G11_muestreado = cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado[,-c(1,3,4,6,9,10,11)]
par(mfrow = c(1, ncol(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_muestreado)))
invisible(lapply(1:ncol(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_muestreado), function(i) boxplot(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_muestreado[, i])))

Matriz de varianzas y covarianzas

round(cov(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado[,-c(1,3,4,6,9,10,11)]),2)
##                               Age Years_of_Experience Hours_Worked_Per_Week
## Age                        127.60               -0.51                 -0.18
## Years_of_Experience         -0.51              100.41                 -2.20
## Hours_Worked_Per_Week       -0.18               -2.20                140.66
## Number_of_Virtual_Meetings   0.19                0.88                 -0.25
##                            Number_of_Virtual_Meetings
## Age                                              0.19
## Years_of_Experience                              0.88
## Hours_Worked_Per_Week                           -0.25
## Number_of_Virtual_Meetings                      21.49

Matriz de Correlaciones

round(cor(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado[,-c(1,3,4,6,9,10,11)]),3)
##                               Age Years_of_Experience Hours_Worked_Per_Week
## Age                         1.000              -0.004                -0.001
## Years_of_Experience        -0.004               1.000                -0.019
## Hours_Worked_Per_Week      -0.001              -0.019                 1.000
## Number_of_Virtual_Meetings  0.004               0.019                -0.005
##                            Number_of_Virtual_Meetings
## Age                                             0.004
## Years_of_Experience                             0.019
## Hours_Worked_Per_Week                          -0.005
## Number_of_Virtual_Meetings                      1.000

1.4 gráficas multivariadas

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

Con base en el conjunto de datos descrito en la sección 1.2 se calcularán e intepretarán, para las variables numéricas, las gráficas multivariadas de diagrama de correlaciones, matriz de diagrama de dispersión, diagrama de estrellas y caras de Chernoff. Se recuerda que las variables numéricas (en escalada de medición de razón) son: Age, Years_of_experience, Hours_worked_per_week, Number_of_virtual_meetings.

Diagrama Conjuto de Dispersión, Distribución y Correlaciones

set.seed(780728)
cdd_Impact_of_Remote_Work_on_Mental_Health_G11_muestreado = cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado[sample(1:nrow(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado),400),-c(1,3,4,6,9,10,11)]
ggpairs(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_muestreado)

Diagrama de estrellas

set.seed(780720)
cdd_Impact_of_Remote_Work_on_Mental_Health_G11_muestreado = cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado[sample(1:nrow(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado),20),-c(1,3,4,6,9,10,11)]
stars(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_muestreado, len = 0.5, cex = 0.5, key.loc = c(3,4,5,6), draw.segments = TRUE)

Caras de Chernoff

set.seed(780728)
cdd_Impact_of_Remote_Work_on_Mental_Health_G11_muestreado = cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado[sample(1:nrow(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado),23),-c(1,3,4,6,9,10,11)]
faces(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_muestreado)

## effect of variables:
##  modified item       Var                         
##  "height of face   " "Age"                       
##  "width of face    " "Years_of_Experience"       
##  "structure of face" "Hours_Worked_Per_Week"     
##  "height of mouth  " "Number_of_Virtual_Meetings"
##  "width of mouth   " "Age"                       
##  "smiling          " "Years_of_Experience"       
##  "height of eyes   " "Hours_Worked_Per_Week"     
##  "width of eyes    " "Number_of_Virtual_Meetings"
##  "height of hair   " "Age"                       
##  "width of hair   "  "Years_of_Experience"       
##  "style of hair   "  "Hours_Worked_Per_Week"     
##  "height of nose  "  "Number_of_Virtual_Meetings"
##  "width of nose   "  "Age"                       
##  "width of ear    "  "Years_of_Experience"       
##  "height of ear   "  "Hours_Worked_Per_Week"

1.5 normalidad multivariada

En el análisis de datos multivariados relacionados con el impacto del trabajo remoto y la salud mental, es fundamental evaluar la normalidad de las variables para garantizar la validez de los modelos estadísticos que se aplicarán. En este estudio, se dispone de un conjunto de datos con aproximadamente 5,000 registros, incluyendo variables tanto cualitativas como cuantitativas. Se llevarán a cabo diferentes pruebas de normalidad multivariada, tales como las pruebas de Mardia, Henze-Zirkler, Doornik-Hansen y Royston, con el fin de determinar si las variables cuantitativas siguen una distribución normal multivariada, lo cual es crucial para la aplicación de técnicas estadísticas avanzadas.

En el desarrollo de las pruebas de normalidad multivariada, se han considerado cuatro variables cuantitativas: Age, Years_of_experience, Hours_worked_per_week y Number_of_virtual_meetings. Las pruebas se realizaron tanto en el conjunto completo de datos como en un subconjunto de 400 observaciones para evaluar posibles diferencias en la distribución. Las pruebas aplicadas, como Mardia, Henze-Zirkler, Doornik-Hansen y Royston, han permitido examinar distintos aspectos de la normalidad, incluyendo la asimetría y la curtosis de las distribuciones. Los resultados muestran parámetros descriptivos como la media, desviación estándar, mediana, y asimetría de cada variable, ofreciendo una visión detallada sobre el comportamiento de los datos y su adherencia a los supuestos de normalidad.

Los análisis realizados revelan que, aunque algunas de las variables presentan desviaciones respecto a la normalidad ideal, las pruebas sugieren comportamientos distintos dependiendo de la muestra analizada. La falta de normalidad en algunos casos sugiere la necesidad de aplicar transformaciones a los datos o considerar métodos estadísticos robustos que no asuman normalidad multivariada. Estos hallazgos son esenciales para guiar el análisis posterior, como la aplicación de técnicas multivariadas, asegurando que los supuestos estadísticos sean adecuados para obtener conclusiones válidas y confiables en el contexto del estudio de la trabajo remoto y la salud mental.

PNM Mardia

mvn(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado[,-c(1,3,4,6,9,10,11)], mvnTest="mardia")
## $multivariateNormality
##              Test         Statistic           p value Result
## 1 Mardia Skewness  8.87403201942417 0.984320855901219    YES
## 2 Mardia Kurtosis -24.4508232183314                 0     NO
## 3             MVN              <NA>              <NA>     NO
## 
## $univariateNormality
##               Test                   Variable Statistic   p value Normality
## 1 Anderson-Darling            Age               58.3829  <0.001      NO    
## 2 Anderson-Darling    Years_of_Experience       59.3035  <0.001      NO    
## 3 Anderson-Darling   Hours_Worked_Per_Week      58.3981  <0.001      NO    
## 4 Anderson-Darling Number_of_Virtual_Meetings   66.5611  <0.001      NO    
## 
## $Descriptives
##                               n    Mean   Std.Dev Median Min Max 25th 75th
## Age                        5000 40.9950 11.296021     41  22  60   31   51
## Years_of_Experience        5000 17.8102 10.020412     18   1  35    9   26
## Hours_Worked_Per_Week      5000 39.6146 11.860194     40  20  60   29   50
## Number_of_Virtual_Meetings 5000  7.5590  4.636121      8   0  15    4   12
##                                    Skew  Kurtosis
## Age                        -0.020564124 -1.204454
## Years_of_Experience         0.007743975 -1.207130
## Hours_Worked_Per_Week       0.032296538 -1.204903
## Number_of_Virtual_Meetings -0.015113999 -1.203879

PNM Henze-Zirkler

mvn(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado[,-c(1,3,4,6,9,10,11)], mvnTest="hz")
## $multivariateNormality
##            Test       HZ p value MVN
## 1 Henze-Zirkler 10.08074       0  NO
## 
## $univariateNormality
##               Test                   Variable Statistic   p value Normality
## 1 Anderson-Darling            Age               58.3829  <0.001      NO    
## 2 Anderson-Darling    Years_of_Experience       59.3035  <0.001      NO    
## 3 Anderson-Darling   Hours_Worked_Per_Week      58.3981  <0.001      NO    
## 4 Anderson-Darling Number_of_Virtual_Meetings   66.5611  <0.001      NO    
## 
## $Descriptives
##                               n    Mean   Std.Dev Median Min Max 25th 75th
## Age                        5000 40.9950 11.296021     41  22  60   31   51
## Years_of_Experience        5000 17.8102 10.020412     18   1  35    9   26
## Hours_Worked_Per_Week      5000 39.6146 11.860194     40  20  60   29   50
## Number_of_Virtual_Meetings 5000  7.5590  4.636121      8   0  15    4   12
##                                    Skew  Kurtosis
## Age                        -0.020564124 -1.204454
## Years_of_Experience         0.007743975 -1.207130
## Hours_Worked_Per_Week       0.032296538 -1.204903
## Number_of_Virtual_Meetings -0.015113999 -1.203879

PNM Doornik-Hansen

mvn(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado[,-c(1,3,4,6,9,10,11)], mvnTest="dh")
## $multivariateNormality
##             Test        E df p value MVN
## 1 Doornik-Hansen 1761.553  8       0  NO
## 
## $univariateNormality
##               Test                   Variable Statistic   p value Normality
## 1 Anderson-Darling            Age               58.3829  <0.001      NO    
## 2 Anderson-Darling    Years_of_Experience       59.3035  <0.001      NO    
## 3 Anderson-Darling   Hours_Worked_Per_Week      58.3981  <0.001      NO    
## 4 Anderson-Darling Number_of_Virtual_Meetings   66.5611  <0.001      NO    
## 
## $Descriptives
##                               n    Mean   Std.Dev Median Min Max 25th 75th
## Age                        5000 40.9950 11.296021     41  22  60   31   51
## Years_of_Experience        5000 17.8102 10.020412     18   1  35    9   26
## Hours_Worked_Per_Week      5000 39.6146 11.860194     40  20  60   29   50
## Number_of_Virtual_Meetings 5000  7.5590  4.636121      8   0  15    4   12
##                                    Skew  Kurtosis
## Age                        -0.020564124 -1.204454
## Years_of_Experience         0.007743975 -1.207130
## Hours_Worked_Per_Week       0.032296538 -1.204903
## Number_of_Virtual_Meetings -0.015113999 -1.203879

PNM Royston

subset_data <- cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado[sample(nrow(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado), 400), -c(1,3,4,6,9,10,11)]
mvn(subset_data, mvnTest="royston")
## $multivariateNormality
##      Test        H      p value MVN
## 1 Royston 163.4475 2.663488e-34  NO
## 
## $univariateNormality
##               Test                   Variable Statistic   p value Normality
## 1 Anderson-Darling            Age                3.4968  <0.001      NO    
## 2 Anderson-Darling    Years_of_Experience        5.4696  <0.001      NO    
## 3 Anderson-Darling   Hours_Worked_Per_Week       5.5836  <0.001      NO    
## 4 Anderson-Darling Number_of_Virtual_Meetings    6.2630  <0.001      NO    
## 
## $Descriptives
##                              n    Mean   Std.Dev Median Min Max 25th 75th
## Age                        400 40.8000 10.972282     41  22  60   32   50
## Years_of_Experience        400 18.2350  9.837006     18   1  35   10   27
## Hours_Worked_Per_Week      400 39.9275 12.177972     40  20  60   29   51
## Number_of_Virtual_Meetings 400  7.6300  4.749156      8   0  15    3   12
##                                   Skew  Kurtosis
## Age                        -0.04642292 -1.104395
## Years_of_Experience         0.05249222 -1.244883
## Hours_Worked_Per_Week       0.06970159 -1.251568
## Number_of_Virtual_Meetings -0.05145374 -1.239707

Fase 2 [componentes principales]

2.1 objetivos

El objetivo principal de esta fase es descomponer las relaciones entre múltiples variables a través del análisis de Componentes Principales (ACP). Esto permitirá identificar las dimensiones clave que explican la mayor parte de la variabilidad de los datos, simplificando su interpretación sin perder información significativa.

El análisis de Componentes Principales utiliza transformaciones matemáticas para convertir variables originales correlacionadas en nuevas variables independientes (componentes principales). Estas nuevas dimensiones facilitan la visualización y el análisis de grandes conjuntos de datos, al tiempo que maximizan la varianza explicada por cada componente. En esta sección, se abordará la selección de componentes, la evaluación de su calidad, y su interpretación a través de gráficos como biplots y círculos de correlaciones.

2.2 selección de componentes

Se analiza datos sobre el trabajo remoto y la salud mental utilizando una técnica llamada Análisis de Componentes Principales (ACP). Esta técnica nos ayuda a simplificar la información al reducir el número de variables que estamos estudiando. En lugar de mirar muchas variables al mismo tiempo, el ACP nos permite concentrarnos en las más importantes que explican mejor la variación en los datos. Así, podemos entender mejor cómo se relacionan factores como la edad, los años de experiencia y la horas trabajadas a la semana con el trabajo remoto y la salud mental.

El código que estamos analizando utiliza el ACP para estudiar los datos. Primero, calcula cómo se relacionan entre sí las diferentes variables. Luego, extrae información sobre cuáles son las variables más importantes que influyen en los resultados. Se crean gráficos que nos ayudan a decidir cuántas de estas nuevas variables debemos conservar para hacer un análisis más claro. También se analiza qué tan bien estas nuevas variables representan los datos originales, asegurando que no perdamos información importante al simplificar.

El uso del Análisis de Componentes Principales en nuestro estudio sobre el trabajo remoto y la salud mental nos ha permitido identificar cuáles son las relaciones más relevantes entre las variables. Gracias a los gráficos que hemos creado, podemos ver cuántas de estas nuevas variables son necesarias para entender los datos.

Matriz ACP

get_eigenvalue(PCA(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado[,-c(1,3,4,6,9,10,11)], ncp = 6, scale.unit = TRUE, graph = F))
##       eigenvalue variance.percent cumulative.variance.percent
## Dim.1  1.0289855         25.72464                    25.72464
## Dim.2  1.0016178         25.04044                    50.76508
## Dim.3  0.9950404         24.87601                    75.64109
## Dim.4  0.9743564         24.35891                   100.00000

Matriz de Correlaciones

round(cor(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado [,-c(1,3,4,6,9,10,11)]),2)
##                            Age Years_of_Experience Hours_Worked_Per_Week
## Age                          1                0.00                  0.00
## Years_of_Experience          0                1.00                 -0.02
## Hours_Worked_Per_Week        0               -0.02                  1.00
## Number_of_Virtual_Meetings   0                0.02                  0.00
##                            Number_of_Virtual_Meetings
## Age                                              0.00
## Years_of_Experience                              0.02
## Hours_Worked_Per_Week                            0.00
## Number_of_Virtual_Meetings                       1.00

Valores y Vectores Propios

princomp(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado [,-c(1,3,4,6,9,10,11)], cor = TRUE)$sdev^2
##    Comp.1    Comp.2    Comp.3    Comp.4 
## 1.0289855 1.0016178 0.9950404 0.9743564
princomp(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado [,-c(1,3,4,6,9,10,11)], cor = TRUE)$loadings[ ,1:4]
##                                 Comp.1      Comp.2      Comp.3     Comp.4
## Age                         0.01506326  0.94975098  0.22430937  0.2177877
## Years_of_Experience        -0.67698529 -0.14227897 -0.05144909  0.7202781
## Hours_Worked_Per_Week       0.51570275  0.06211945 -0.72958115  0.4448631
## Number_of_Virtual_Meetings -0.52489494  0.27179209 -0.64401059 -0.4856591

Correlaciones Comparadas

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

Gráfico de Catell

fviz_eig(PCA(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado[,-c(1,3,4,6,9,10,11)], scale.unit = T, graph = F), addlabels = T, ylim=c(0,90), main = "")

Gráfico de Catell-Kaiser

scree(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado[,-c(1,3,4,6,9,10,11)],factors = FALSE, pc = TRUE, main ="")

2.3 calidad de representacion

Se explora las relaciones entre diferentes variables relacionadas con la Se explora las relaciones entre diferentes variables relacionadas con el trabajo remoto y la salud mental, como las anteriormente mencionadas. Los códigos implementados utilizan la librería factoMiner para realizar el PCA y visualizar los resultados mediante gráficos de círculo de correlaciones y matrices de representación. Este análisis permitirá identificar las variables que contribuyen más a la variabilidad de los datos y descubrir potenciales patrones o asociaciones entre ellas. Se espera que este análisis proporcione información relevante para una mejor comprensión de los factores relacionados con el trabajo remoto y la salud mental.

Primero, se genera un círculo de correlaciones que muestra la correlación entre las variables y los componentes principales. Las variables con vectores largos y cercanos al círculo tienen una alta correlación con los componentes principales. Los gráficos muestran la relación entre las variables, permitiendo identificar aquellas que contribuyen más a la varianza explicada por el PCA. Luego, se calcula una matriz de representación que muestra las coordenadas de las variables en el espacio de los componentes principales. Esta matriz proporciona información cuantitativa sobre la contribución de cada variable a cada componente principal. Finalmente, se visualiza una representación gráfica de las variables con un código de color que refleja el valor del coseno al cuadrado, indicando la calidad de representación de cada variable. Estos análisis gráficos y numéricos ayudan a comprender la estructura de los datos y las relaciones entre las variables.

Los gráficos y matrices generados permiten identificar las variables más influyentes en la variabilidad de los datos, mostrando, por ejemplo, las correlaciones entre la edad y otros factores importantes como los las horas trabajadas a la semana y los años de experiencia. La calidad de representación permite evaluar la significancia de las variables en este modelo reducido. El análisis facilita la interpretación de las relaciones complejas entre múltiples variables, facilitando la comprensión de los factores que contribuyen al trabajo remoto y ayudando a identificar áreas clave para futuras investigaciones en salud mental.por medio de variables claves como la edad, años de experiencia, horas trabajadas a la semana y el numero de sesiones virtuales. Los códigos implementados utilizan la librería factoMiner para realizar el PCA y visualizar los resultados mediante gráficos de círculo de correlaciones y matrices de representación. Este análisis permitirá identificar las variables que contribuyen más a la variabilidad de los datos y descubrir potenciales patrones o asociaciones entre ellas.

Circulo de Correlaciones

fviz_pca_var(PCA(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado[,-c(1,3,4,6,9,10,11)], scale.unit = T, graph = F),col.var="#3B83BD", repel = T, col.circle = "#CDCDCD", ggtheme = theme_bw())

Matriz de Representación

(get_pca_var(PCA(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado[,-c(1,3,4,6,9,10,11)], ncp = 6, scale.unit = TRUE, graph = F)))$cos2
##                                   Dim.1       Dim.2      Dim.3      Dim.4
## Age                        0.0002334787 0.903486207 0.05006515 0.04621516
## Years_of_Experience        0.4715933736 0.020276056 0.00263388 0.50549669
## Hours_Worked_Per_Week      0.2736579833 0.003865069 0.52964871 0.19282824
## Number_of_Virtual_Meetings 0.2835006153 0.073990446 0.41269264 0.22981630

Calidad de Representación

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

Coordenadas Individuales

head((PCA(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado[,-c(1,3,4,6,9,10,11)], ncp = 6, scale.unit = TRUE, graph = F))$ind$coord, n = 23L)
##          Dim.1       Dim.2       Dim.3       Dim.4
## 1  -0.69747478 -0.68214271  0.53063473 -0.18362798
## 2  -1.94093813 -0.01714662  0.21124049 -0.24639383
## 3   0.37102920  1.68968200  0.53482673  0.52740307
## 4   0.54768739 -1.22192066 -0.11801741 -0.44427594
## 5   1.65161703  0.70782185  0.24696130  0.53606084
## 6   0.37769970  1.05616579 -0.96101091  1.74993648
## 7  -0.12684461 -0.90148050  0.85306351  0.73791183
## 8  -1.48818593  0.29479452  0.72674534 -0.23143757
## 9  -0.33925945  1.09637110 -1.79829509 -0.55690765
## 10 -0.22938831 -1.06957037  1.12366481  1.33602499
## 11 -0.92494459 -0.88414213  0.03713476  0.57978359
## 12  1.97809238  0.50670515 -0.27214629  0.08799455
## 13 -0.38831219  0.02476317 -1.28941236 -1.86736120
## 14 -0.49700126  1.37041685  0.82273719 -1.09599798
## 15 -0.09604993 -0.19041796  1.79650349  0.64347096
## 16 -0.14610400  1.55474836  0.42514782 -0.25246269
## 17 -1.36545327 -0.31260026  1.04488308 -0.90519735
## 18  0.30625114  0.31783209 -0.16787965  0.09036279
## 19  0.79361681  0.38967616 -0.53533977  1.05839268
## 20 -1.59500653  1.47516589  0.31591083  1.10143501
## 21  1.11313558 -1.95864689 -1.68061557  0.79171198
## 22  0.11281235 -0.97044509  1.81614634  0.01454543
## 23 -1.28584665 -0.17019376  0.13492144  1.60730233

2.4 contribuciones

Se analiza un conjunto de datos relacionados con el trabajo remoto y la salud mental utilizando el Análisis de Componentes Principales (PCA) como técnica de reducción de dimensionalidad. El PCA permite identificar las variables que más contribuyen a la varianza en los datos, simplificando su interpretación y facilitando la identificación de patrones. En esta sección, nos centraremos en la visualización e interpretación de las contribuciones de cada variable a los cuatro primeros componentes principales, obtenidos mediante el código R proporcionado.

El código R implementado realiza un PCA sobre un subconjunto de variables de la tabla de datos (excluyendo las columnas 1,3,4,6,9,10,11). Se utiliza la función fviz_contrib del paquete factoExtra para generar gráficos de barras que muestran la contribución porcentual de cada variable a cada componente principal (Dim-1 a Dim-4). Estos gráficos permiten identificar las variables que tienen mayor peso en la formación de cada componente, indicando su importancia en la estructura de la varianza. Por ejemplo, en el gráfico de contribuciones a Dim-1, observamos que ‘years_of_experience’ y ‘Number_of_virtual_meetings’ tienen las mayores contribuciones, sugiriendo una fuerte influencia de estos factores en la varianza explicada por este primer componente. Un análisis similar se realiza para los restantes componentes, revelando la influencia relativa de las variables en diferentes dimensiones del conjunto de datos.

Se identifica las variables más influyentes en cada componente, lo que facilita la comprensión de las relaciones entre las variables y permite una interpretación más sencilla de los datos multidimensionales. Esta información puede ser utilizada para posteriores análisis, modelos predictivos o para la toma de decisiones en el contexto del trabajo remoto y la salud mental.

Matriz de Contribuciones

(get_pca_var(PCA(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado[,-c(1,3,4,6,9,10,11)], ncp = 6, scale.unit = TRUE, graph = F)))$contrib
##                                  Dim.1      Dim.2      Dim.3     Dim.4
## Age                         0.02269019 90.2026928  5.0314692  4.743148
## Years_of_Experience        45.83090783  2.0243306  0.2647008 51.880061
## Hours_Worked_Per_Week      26.59493222  0.3858826 53.2288660 19.790319
## Number_of_Virtual_Meetings 27.55146976  7.3870939 41.4749639 23.586472

Contribuciones a D1

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

Contribuciones a D2

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

Contribuciones a D3

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

Contribuciones a D4

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

2.5. Interpretación

El objetivo principal es determinar las relaciones entre diversas variables laborales, como la horas trabajadas a la semana y el numero de sesiones virtuales, y observar cómo se agrupan los trabajadores según su sexo y su el acceso a los servicios de salud mental. A través de visualizaciones como biplots, se busca facilitar la comprensión de los patrones presentes en los datos.

El código genera tres biplots utilizando el paquete factoextra, cada uno representando un análisis PCA sobre subconjuntos filtrados por sexo (masculino/femenino) y acceso a servicios de salud mental (sí/no). En cada biplot, los puntos representan individuos y las flechas indican las variables. La cercanía entre los puntos sugiere similitudes en sus perfiles, mientras que la proximidad a las flechas refleja una fuerte correlación con las variables. Este enfoque permite visualizar cómo las características de los hombres y mujeres difieren en relación con el trabajo remoto y la salud mental.

Los biplots permiten identificar patrones significativos y relaciones entre variables, lo que facilita una comprensión más profunda de los factores que influyen en el acceso a servicios de salud mental. Además, la segmentación por filtros ayuda a realizar un análisis más detallado de subgrupos específicos dentro de la población estudiada, enriqueciendo así el conocimiento sobre estas condiciónes laborales.

Biplot de Variables y Registros [Filtro Gender]

set.seed(780720)
cdd_Impact_of_Remote_Work_on_Mental_Health_G11_muestreado = cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado[sample(1:nrow(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado),150),-c(1,4,6,9,10,11)]
fviz_pca_biplot(PCA(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_muestreado, ncp = 4, scale.unit = TRUE, graph = F, quali.sup = "Gender"), axes = c(1, 2), repel = TRUE, habillage = "Gender")

Biplot de Variables Y Registros [Filtro Access to Mental Health Resources]

set.seed(780720)
cdd_Impact_of_Remote_Work_on_Mental_Health_G11_muestreado = cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado[sample(1:nrow(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado),150),-c(1,3,4,6,10,11)]
fviz_pca_biplot(PCA(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_muestreado, ncp = 4, scale.unit = TRUE, graph = F, quali.sup = "Access_to_Mental_Health_Resources"), axes = c(1, 2), repel = TRUE, habillage = "Access_to_Mental_Health_Resources")

Coordenadas Individuales [Subconjunto Filtro Gender]

set.seed(780720)
cdd_Impact_of_Remote_Work_on_Mental_Health_G11_muestreado = cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado[sample(1:nrow(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado),61),-c(1,4,6,9,10,11)]
head(PCA(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_muestreado, ncp = 4 , scale.unit = TRUE, graph = FALSE, quali.sup = "Gender")$ind$coord, n = 61L)
##           Dim.1       Dim.2        Dim.3        Dim.4
## 1   0.009397622 -1.42996462  0.488288109 -1.572694382
## 2  -1.552703046  0.23455148 -0.339315630  1.415356342
## 3  -0.425475335 -1.10582549  0.008652838  0.979950624
## 4   0.079523560 -0.66229641 -1.718099018 -0.131046512
## 5  -2.498996411 -1.08338589  0.567597100  1.177007203
## 6  -0.172081069  1.03676990  0.532592395 -0.864898423
## 7   0.897281502 -0.42087444  1.604705724  0.918258157
## 8  -1.137236039  1.84044184  1.338594174 -1.149816054
## 9   0.173759950  1.16957499  0.318434779  0.600335888
## 10  1.379516090 -1.08953131  0.729417417 -0.583751006
## 11 -1.847955838 -0.15781811  0.268566764  0.392308356
## 12  0.898751452  0.85110506 -0.552768798  0.983901528
## 13 -1.376875118  1.46999918 -1.016903317  0.007164094
## 14  0.469789024 -0.93295566 -1.210874329 -0.044681899
## 15  1.056565665  0.04306057  0.397031912 -0.989001654
## 16  1.368787524  0.36689830  0.064063735 -0.875066726
## 17 -0.797549513 -1.24574077 -1.168174167 -0.119805496
## 18  0.119900087 -0.92845261  1.395936442 -1.330806438
## 19  1.609614067 -0.95092516 -0.449155205  0.791413144
## 20  0.249764458 -0.62810569  1.801378596  0.465515094
## 21  0.174969770  0.95772013 -2.033036282  0.458233332
## 22  0.796733719  0.54527094  1.809972947  0.762562372
## 23 -0.657668539  1.46726250 -0.645688084  0.576588622
## 24 -0.411628268  2.09917611  0.053152851 -0.075397653
## 25  1.193993926 -0.25297641 -1.276692236  0.520965543
## 26  0.706696650  0.52475246 -1.265162846  0.171660582
## 27  0.142543268  0.77874784  0.297572986 -0.865774062
## 28 -1.449156121  0.84238730  1.643355376 -0.724721921
## 29 -0.924330770 -2.34253121 -0.589113241  0.515006375
## 30  2.352646167 -1.11291738  1.157075358  0.367178064
## 31  0.488077036 -1.21828142  1.818380147 -0.257531332
## 32  1.617390965 -0.70947469 -0.405363652  0.063559083
## 33  0.012614579 -0.89578481  1.361867300  0.397213311
## 34  1.157596190  0.37932169 -1.876327491 -0.106256865
## 35  1.278646572 -0.49639360 -0.028218594 -0.186102610
## 36 -1.674676949 -1.59677178 -0.038222007 -0.052642254
## 37 -1.006723754  1.11931636 -0.773224298 -0.242372065
## 38  1.026483114  2.76791956  0.823790292  0.524422342
## 39 -1.354244970 -0.80426384  0.007335345  1.284431296
## 40 -0.017851990  0.62121557  0.815843873 -0.839269588
## 41  0.582771050  0.12054646  0.737691033  1.550281327
## 42 -2.003855158  0.07356019 -0.337991843  0.355330515
## 43 -0.658356732  0.50443393 -1.116398078 -0.839158003
## 44  0.086924361 -0.56144028 -2.057183389 -0.249634166
## 45  1.645395849 -0.10460182 -1.200060528  0.302753325
## 46  0.098623289 -0.15062133  1.554900519 -0.875359002
## 47 -0.777729947 -1.36991371  0.472512482 -1.028101665
## 48  0.525096516  1.53067584  0.297019855  1.378506356
## 49 -0.822582455 -0.44544359 -0.525583276 -0.857232665
## 50  1.171695514  1.83491971  0.542791703  0.601367597
## 51  0.122308041  1.29373877 -0.212872590 -1.127654486
## 52  0.395649889 -0.78712793  0.052250112 -0.695798449
## 53 -2.044246449  0.61075308  0.874998749 -0.148704348
## 54  0.548221444  0.53877953 -0.345629335 -1.068723982
## 55 -0.166108256 -0.23657900  0.364000708 -1.142875781
## 56 -0.310224359  0.09101914  0.401312536  2.496299526
## 57  0.412181254  0.11457257 -0.824618291 -0.234554992
## 58 -1.945745004 -0.68016268 -0.036451529  0.604908838
## 59 -1.041837665  0.29874511 -1.548469392 -1.734963030
## 60  1.892415771 -0.68052751 -0.174757617  0.119558765
## 61  0.333513822 -1.04554696 -0.834729093  0.232359908

Biplot de Variables y Registros [Subconjunto Filtro gender]

set.seed(780720)
cdd_Impact_of_Remote_Work_on_Mental_Health_G11_muestreado = cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado[sample(1:nrow(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado),61),-c(1,4,6,9,10,11)]
fviz_pca_biplot(PCA(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_muestreado, ncp = 4, scale.unit = TRUE, graph = F, quali.sup = "Gender"), axes = c(1, 2), repel = TRUE, habillage = "Gender")

fviz_pca_biplot(PCA(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_muestreado, ncp = 4, scale.unit = T, graph = F, quali.sup = "Gender"), axes = c(1, 2), repel = T, habillage = "Gender")

Fase 3 [Correspondencias]

3.1 objetivos

En esta tercera fase del estudio, se presentarán cálculos, visualizaciones e interpretaciones basadas en el conjunto de datos trabajado en la fase 1 y fase 2. Sin embargo, esta fase se enfocará en aplicar análisis de correspondencias simples y múltiples sobre las variables cualitativas, abarcando la construcción de tablas de contingencia y disyuntivas completas, así como la evaluación de calidades de representación, contribuciones e interpretaciones

3.2 correspondencias simples

Analizaremos datos relacionados con el trabajo remoto y la salud mental, utilizando técnicas de análisis de correspondencia para explorar la relación entre variables categóricas como el sexo, cambio en la productividad , y la calidad del sueño. Los códigos más presentados se centran en la construcción y el análisis de tablas de contingencia, el cálculo de estadísticos de prueba de chi-cuadrado y la descomposición de la inercia para comprender la contribución de cada variable a la relación global. El objetivo es identificar patrones y asociaciones entre estas variables, contribuyendo a una mejor comprensión de los factores relacionados con el trabajo remoto y la salud mental.

Primero, se crea una tabla de contingencia que cruza variables como el sexo y acceso a salud mental en relación con el cambio de la productividad. Para analizar las relaciones entre las variables, se construyen tablas de contingencia, y con addmargins se calculan los totales marginales, brindando una visión general de las frecuencias de cada variable. Además, la función prop.table permite obtener probabilidades condicionales, mostrando la distribución proporcional de una variable dado el valor de otra.

Se aplican pruebas estadísticas, como la prueba de Chi-cuadrado (chisq.test), para evaluar la significancia de las asociaciones entre variables. Luego, se calculan los residuos, lo cual permite examinar las diferencias entre valores observados y esperados bajo la hipótesis de independencia.

El análisis también incluye un estudio de correspondencia simple y múltiple (CA), enfocado en la descomposición de la inercia y en la contribución de cada variable a la relación global. A través de este análisis, se identifican las variables que más influyen en la estructura de los datos, y los resultados como valores propios, coordenadas y contribuciones permiten una visualización gráfica de las asociaciones. Además, fviz_contrib se usa para visualizar la contribución de cada variable en un análisis de componentes principales (PCA), destacando las variables más influyentes.

El análisis determinado de esta fase permite comprender a profundidad la relación entre el sexo, el cambio en la productividad y el acceso a los servicios de salud mental. La prueba de Chi-cuadrado evalúa la significancia estadística de esta asociación, identificando si las diferencias observadas responden al azar o a una relación real en los datos. Además, el análisis de correspondencia, que incluye la descomposición de la inercia, visualiza y cuantifica la contribución de cada variable a esta asociación, lo cual facilita la identificación de patrones significativos.

Analisis de Correspondecia Por Parejas

Contigencias
addmargins(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Gender, cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Access_to_Mental_Health_Resources))
##         
##             0    1  Sum
##   Female 1278 1238 2516
##   Male   1275 1209 2484
##   Sum    2553 2447 5000
addmargins(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Productivity_Change, cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Productivity_Change))
##            
##             Decrease Increase No change  Sum
##   Decrease      1737        0         0 1737
##   Increase         0     1586         0 1586
##   No change        0        0      1677 1677
##   Sum           1737     1586      1677 5000
addmargins(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Gender, cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Productivity_Change))
##         
##          Decrease Increase No change  Sum
##   Female      875      809       832 2516
##   Male        862      777       845 2484
##   Sum        1737     1586      1677 5000
Probabilidades
addmargins(prop.table(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Gender, cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Access_to_Mental_Health_Resources))*100)
##         
##               0      1    Sum
##   Female  25.56  24.76  50.32
##   Male    25.50  24.18  49.68
##   Sum     51.06  48.94 100.00
addmargins(prop.table(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Sleep_Quality, cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Productivity_Change))*100)
##          
##           Decrease Increase No change    Sum
##   Average    11.30    10.44     10.82  32.56
##   Good       11.20    10.32     12.22  33.74
##   Poor       12.24    10.96     10.50  33.70
##   Sum        34.74    31.72     33.54 100.00
addmargins(prop.table(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Gender, cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Productivity_Change))*100)
##         
##          Decrease Increase No change    Sum
##   Female    17.50    16.18     16.64  50.32
##   Male      17.24    15.54     16.90  49.68
##   Sum       34.74    31.72     33.54 100.00
Frecuencias
round(addmargins(prop.table(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Gender, cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Access_to_Mental_Health_Resources), 1)*100, 2), 2)
##         
##               0      1    Sum
##   Female  50.79  49.21 100.00
##   Male    51.33  48.67 100.00
round(addmargins(prop.table(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Gender, cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Access_to_Mental_Health_Resources), 2)*100, 1), 2)
##         
##               0      1
##   Female  50.06  50.59
##   Male    49.94  49.41
##   Sum    100.00 100.00
round(addmargins(prop.table(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Sleep_Quality, cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Productivity_Change), 1)*100, 2), 2)
##          
##           Decrease Increase No change    Sum
##   Average    34.71    32.06     33.23 100.00
##   Good       33.20    30.59     36.22 100.00
##   Poor       36.32    32.52     31.16 100.00
round(addmargins(prop.table(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Sleep_Quality, cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Productivity_Change), 2)*100, 1), 2)
##          
##           Decrease Increase No change
##   Average    32.53    32.91     32.26
##   Good       32.24    32.53     36.43
##   Poor       35.23    34.55     31.31
##   Sum       100.00   100.00    100.00
round(addmargins(prop.table(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Gender, cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Productivity_Change), 1)*100, 2), 2)
##         
##          Decrease Increase No change    Sum
##   Female    34.78    32.15     33.07 100.00
##   Male      34.70    31.28     34.02 100.00
round(addmargins(prop.table(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Gender, cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Productivity_Change), 2)*100, 1), 2)
##         
##          Decrease Increase No change
##   Female    50.37    51.01     49.61
##   Male      49.63    48.99     50.39
##   Sum      100.00   100.00    100.00
Perfiles
plotct(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Gender, cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Access_to_Mental_Health_Resources),"row")

plotct(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Gender, cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Access_to_Mental_Health_Resources),"col")

plotct(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Sleep_Quality, cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Productivity_Change),"row")

plotct(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Sleep_Quality, cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Productivity_Change),"col")

plotct(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Gender, cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Productivity_Change),"row")

plotct(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Gender, cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Productivity_Change),"col")

Pruebas de Hipótesis
chisq.test(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Gender, cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Access_to_Mental_Health_Resources))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Gender,     cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Access_to_Mental_Health_Resources)
## X-squared = 0.12186, df = 1, p-value = 0.727
chisq.test(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Sleep_Quality, cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Productivity_Change))
## 
##  Pearson's Chi-squared test
## 
## data:  table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Sleep_Quality,     cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Productivity_Change)
## X-squared = 9.963, df = 4, p-value = 0.04106
chisq.test(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Gender, cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Productivity_Change))
## 
##  Pearson's Chi-squared test
## 
## data:  table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Gender,     cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Productivity_Change)
## X-squared = 0.63894, df = 2, p-value = 0.7265

Analisis de Correspondecia Pareja Unica

Contigencias y Residuales
chisq.test(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Gender, cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Productivity_Change))$observed
##         
##          Decrease Increase No change
##   Female      875      809       832
##   Male        862      777       845
chisq.test(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Gender, cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Productivity_Change))$expected 
##         
##          Decrease Increase No change
##   Female 874.0584 798.0752  843.8664
##   Male   862.9416 787.9248  833.1336
chisq.test(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Gender, cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Productivity_Change))$residuals
##         
##             Decrease    Increase   No change
##   Female  0.03184903  0.38671551 -0.40849066
##   Male   -0.03205352 -0.38919846  0.41111342
chisq.test(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Gender, cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Productivity_Change))$stdres
##         
##             Decrease    Increase   No change
##   Female  0.05593478  0.66397853 -0.71090435
##   Male   -0.05593478 -0.66397853  0.71090435
Contribuciones
chisq.test(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Gender,cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Productivity_Change))$residuals^2/chisq.test(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Gender, cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Productivity_Change))$statistic*100
##         
##            Decrease   Increase  No change
##   Female  0.1587556 23.4055963 26.1156481
##   Male    0.1608007 23.7071177 26.4520816
Correspondecia simple Unidimensional
CA(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Gender, cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Productivity_Change), graph = FALSE)$eig
##        eigenvalue percentage of variance cumulative percentage of variance
## dim 1 0.000127789                    100                               100
CA(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Gender, cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Productivity_Change), graph = FALSE)$col
## $coord
##                  [,1]
## Decrease   0.00108419
## Increase   0.01377683
## No change -0.01415223
## 
## $contrib
##                 [,1]
## Decrease   0.3195563
## Increase  47.1127140
## No change 52.5677297
## 
## $cos2
##           [,1]
## Decrease     1
## Increase     1
## No change    1
## 
## $inertia
## [1] 4.083578e-07 6.020486e-05 6.717577e-05
CA(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Gender, cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Productivity_Change), graph = FALSE)$row
## $coord
##      Female        Male 
##  0.01123226 -0.01137696 
## 
## $contrib
## Female   Male 
##  49.68  50.32 
## 
## $cos2
## Female   Male 
##      1      1 
## 
## $inertia
## [1] 6.348557e-05 6.430342e-05

3.3 correspondencias multiples

El análisis de correspondencias múltiples (ACM) es una técnica estadística multivariante útil para explorar y visualizar relaciones complejas entre variables categóricas. En el contexto del trabajo remoto y la salud mental, el ACM permite identificar patrones significativos entre factores como la flexibilidad laboral, la percepción de aislamiento, y los niveles de estrés reportados Para realizar el análisis, se utilizó el paquete FactoMineR, ampliamente empleado en R para análisis multivariado. Los datos considerados incluyen variables cualitativas como sexo, rol de trabajo, locación de trabajo, cambio de productividad y calidad del sueño. Los resultados del ACM destacan la importancia de intervenciones específicas

ACM

round(MCA(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado[1:50, -c(1,2,5,7,8,9)], graph = FALSE)$eig,2)
##        eigenvalue percentage of variance cumulative percentage of variance
## dim 1        0.33                  12.63                             12.63
## dim 2        0.31                  12.06                             24.69
## dim 3        0.28                  10.72                             35.40
## dim 4        0.26                  10.08                             45.49
## dim 5        0.25                   9.52                             55.01
## dim 6        0.21                   7.96                             62.97
## dim 7        0.20                   7.70                             70.67
## dim 8        0.17                   6.73                             77.40
## dim 9        0.16                   6.32                             83.72
## dim 10       0.13                   5.18                             88.90
## dim 11       0.12                   4.78                             93.68
## dim 12       0.10                   3.88                             97.56
## dim 13       0.06                   2.44                            100.00

Biplot ACM

fviz_mca_biplot(MCA(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado[1:100, -c(1,2,3,5,6,7,8,9,10,11)], graph = FALSE), repel = TRUE)

Calidad de Representación

fviz_mca_var(MCA(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado[1:100, -c(1,2,3,5,6,7,8,9,10,11)], graph = FALSE), col.var ="cos2", gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), repel = TRUE)

Contribuciones

fviz_contrib(MCA(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado[1:50, -c(1,2,5,7,8,9)], graph = FALSE), choice = "var", axes = 1, top = 15)

Biplot con Contribuciones

fviz_mca_var(MCA(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado[1:100, -c(1,2,3,5,6,7,8,9,10,11)], graph = FALSE), col.var ="contrib", gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), repel = TRUE)

Fase4 [Conglomerados]

4.1 objetivos

El principal objetivo del análisis de conglomerados es identificar agrupaciones naturales dentro de un conjunto de datos multivariados, maximizando la homogeniedad dentro de los clusters y la heterogeniedad entre ellos. Este enfoque permite simplificar y estructurar la información, facilitando su interpretación y uso estratégico.

Para lograr este objetivo, se utilizan técnicas que cuantifican las similitudes entre observaciones, estableciendo una estructura jerárquica o particional según el método seleccionado. Estas técnicas permiten detectar patrones en los datos que de otra manera pasarían desapercibidos, destacando relaciones importantes entre las observaciones y sus características.

Los objetivos del análisis de conglomerados se cumplieron al segmentar de manera eficiente las observaciones en grupos significativos, ofreciendo una visión más organizada del conjunto de datos. Estos resultados refuerzan la utilidad de este enfoque para simplificar datos complejos y apoyar decisiones basadas en patrones estructurales claros.

4.2 agrupación jerárquica

La agrupación jerárquica es una técnica de análisis de datos que permite identificar estructuras subyacentes agrupando observaciones con características similares. En el contexto del trabajo remoto y la salud mental, esta técnica facilita la clasificación de empleados en función de variables clave como el nivel de estrés, percepción de apoyo organizacional y satisfacción laboral.

En esta sección, se describe la implementación de la agrupación jerárquica en R, utilizando algoritmos de enlace y métricas de distancia, con el objetivo de revelar patrones significativos que informen estrategias de intervención.

El análisis se realizó utilizando el paquete cluster para calcular distancias y generar dendrogramas, complementado con factoextra para la visualización. Las variables empleadas fueron previamente estandarizadas para garantizar resultados comparables.

Campo clasificador

cdd_Impact_of_Remote_Work_on_Mental_Health_G11_original_job_role_promedio <- read_excel("Impact_of_Remote_Work_on_Mental_Health_G11_original_job_role_promedio.xlsx")
View(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_original_job_role_promedio)

Conjunto modificado

head(as.data.frame(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_original_job_role_promedio))
##              Job_Role   Age_S01 Years_of_Experience_S01
## 1                1.HR 0.4883490               0.4882517
## 2    2.Data Scientist 0.4928539               0.4872380
## 3 3.Software Engineer 0.5071434               0.4789030
## 4             4.Sales 0.5002154               0.4946232
## 5         5.Marketing 0.5146798               0.4798467
## 6          6.Designer 0.5091723               0.5172077
##   Hours_Worked_per_week_S01 Number_of_Virtual_Meetings_S01
## 1                 0.4915154                      0.5032588
## 2                 0.4738506                      0.4977969
## 3                 0.5067862                      0.5060478
## 4                 0.4965211                      0.5177808
## 5                 0.4933748                      0.4979014
## 6                 0.4720263                      0.5050254

disimilaridad

data_ = as.data.frame(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_original_job_role_promedio)[, -c(1)]
rownames(data_) = unclass(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_original_job_role_promedio$Job_role)
## Warning: Unknown or uninitialised column: `Job_role`.
fviz_dist(get_dist(data_, stand = T, method = "euclidean"), gradient = list(low = "#00AFBB", mid = "white", high = "#FC4E07"))

optimizacion de mojena

Union simple
hc_single = hclust(get_dist(data_, stand = T, method = "euclidean"), method = "single")

mojena = function(hc){
  n_hd = length(hc$height)
  alp_g = 0 ; alpha = hc$height[n_hd:1]
  for(i in 1:(n_hd-1)){
    alp_g[i] = mean(alpha[(n_hd-i+1):1])+1.25*sd(alpha[(n_hd-i+1):1])
  }
  nog = sum(alp_g<= alpha[-n_hd]) + 1
  plot(alpha[-n_hd], pch=20, col=(alp_g>alpha[-n_hd])+1, main = paste("Optimal number of groups =",nog),
       ylab = expression(alpha[g]), xlab="Nodes")}

mojena(hc_single)

union completa
hc_complete = hclust(get_dist(data_, stand = T, method = "euclidean"), method = "complete")

mojena = function(hc){
  n_hd = length(hc$height)
  alp_g = 0 ; alpha = hc$height[n_hd:1]
  for(i in 1:(n_hd-1)){
    alp_g[i] = mean(alpha[(n_hd-i+1):1])+1.25*sd(alpha[(n_hd-i+1):1])
  }
  nog = sum(alp_g<= alpha[-n_hd]) + 1
  plot(alpha[-n_hd], pch=20, col=(alp_g>alpha[-n_hd])+1, main = paste("Optimal number of groups =",nog),
       ylab = expression(alpha[g]), xlab="Nodes")}

mojena(hc_complete)

Union promedio
hc_average = hclust(get_dist(data_, stand = T, method = "euclidean"), method = "average")

mojena = function(hc){
  n_hd = length(hc$height)
  alp_g = 0 ; alpha = hc$height[n_hd:1]
  for(i in 1:(n_hd-1)){
    alp_g[i] = mean(alpha[(n_hd-i+1):1])+1.25*sd(alpha[(n_hd-i+1):1])
  }
  nog = sum(alp_g<= alpha[-n_hd]) + 1
  plot(alpha[-n_hd], pch=20, col=(alp_g>alpha[-n_hd])+1, main = paste("Optimal number of groups =",nog),
       ylab = expression(alpha[g]), xlab="Nodes")}

mojena(hc_average)

dendogramas optimizados

Enlace simple
suppressWarnings(fviz_dend(hc_single, k = 3, cex = 0.5, k_colors = "npg", color_labels_by_k = T, rect = T))

Enlace completo
fviz_dend(hc_complete, k = 3, cex = 0.5, k_colors = "npg", color_labels_by_k = T, rect = T)

Enlace promedio
fviz_dend(hc_average, k = 4, cex = 0.5, k_colors = "npg", color_labels_by_k = T, rect = T)

4.3 agrupación no-jerárquica

La agrupación no jerárquica, como el algoritmo k-means, es una técnica utilizada para particionar datos en un número predefinido de clústeres basados en similitudes. Este enfoque es particularmente útil en el análisis del impacto del trabajo remoto en la salud mental, ya que permite identificar grupos homogéneos de empleados en función de factores como el estrés laboral, la satisfacción personal y el apoyo organizacional. A continuación, se describe la implementación de esta técnica en R, con un énfasis en la selección del número óptimo de clústeres y la interpretación de los resultados. Para este análisis, se utilizó el algoritmo k-means, implementado con el paquete stats y visualizado con factoextra. Los datos se escalaron previamente para garantizar uniformidad entre las variables. Además, se empleó el método del codo para determinar el número óptimo de clústeres. Los resultados del análisis de agrupación no jerárquica destacan la importancia de personalizar las estrategias de apoyo según el perfil de cada clúster.

K-optimos

En esta sección al ejecutar el codigo obtenemos como resultado el siguiente error “more cluster centers than distinct data points” surge cuando el número de clústeres especificado en un análisis de agrupación no jerárquica, como k-means, supera la cantidad de observaciones únicas en el conjunto de datos. Esto suele ocurrir debido a la presencia de datos duplicados, insuficiencia de datos o variables constantes que resultan en redundancia. En estos casos, el algoritmo no puede asignar clústeres únicos a puntos que no tienen diferencias entre sí, generando un conflicto lógico en el modelo. Este problema destaca la importancia de preprocesar los datos adecuadamente, eliminando duplicados, revisando la variabilidad de las variables y ajustando el número de clústeres al tamaño real del conjunto de datos.

Resultados K-means

K-optimo [SMR 2]
set.seed(780728)
print(kmeans(data_, 3, nstart = 25))
## K-means clustering with 3 clusters of sizes 3, 1, 3
## 
## Cluster means:
##     Age_S01 Years_of_Experience_S01 Hours_Worked_per_week_S01
## 1 0.5121677               0.4795321                 0.4978453
## 2 0.5091723               0.5172077                 0.4720263
## 3 0.4938061               0.4900376                 0.4872957
##   Number_of_Virtual_Meetings_S01
## 1                      0.5006169
## 2                      0.5050254
## 3                      0.5062789
## 
## Clustering vector:
## [1] 3 3 1 3 1 2 1
## 
## Within cluster sum of squares by cluster:
## [1] 0.000202612 0.000000000 0.000600865
##  (between_SS / total_SS =  73.1 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"
K-optimo [sil 4]
set.seed(780728)
print(kmeans(data_, 2, nstart = 25))
## K-means clustering with 2 clusters of sizes 6, 1
## 
## Cluster means:
##     Age_S01 Years_of_Experience_S01 Hours_Worked_per_week_S01
## 1 0.5029869               0.4847849                 0.4925705
## 2 0.5091723               0.5172077                 0.4720263
##   Number_of_Virtual_Meetings_S01
## 1                      0.5034479
## 2                      0.5050254
## 
## Clustering vector:
## [1] 1 1 1 1 1 2 1
## 
## Within cluster sum of squares by cluster:
## [1] 0.001689775 0.000000000
##  (between_SS / total_SS =  43.4 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"

Graficos K-means

K-optimo [Sil_Ma_Rul 2]
fviz_cluster(kmeans(data_, 2, nstart = 25), data = data_, palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#E7B801"), ellipse.type = "euclid", star.plot = TRUE, repel = TRUE, ggtheme = theme_minimal()
)
## Too few points to calculate an ellipse

K-optimo [Elb 3]

fviz_cluster(kmeans(data_, 3, nstart = 25), data = data_, palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#E7B801"), ellipse.type = "euclid", star.plot = TRUE, repel = TRUE, ggtheme = theme_minimal()
)
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse

Fase 5 [Análisis de regresión]

5.1 Objetivos

El análisis de regresión es una herramienta estadística fundamental cuyo principal objetivo es entender y modelar la relación entre una variable dependiente, también conocida como variable respuesta, y una o más variables independientes, llamadas predictoras. Este análisis permite explorar cómo las variables independientes afectan a la variable dependiente, proporcionando información sobre la dirección y la magnitud de estas relaciones. A través de esta herramienta, es posible identificar patrones, establecer tendencias y obtener conclusiones significativas basadas en los datos.

Uno de los objetivos centrales del análisis de regresión es la predicción, es decir, usar el modelo desarrollado para estimar o prever el valor de la variable dependiente en función de los valores conocidos de las variables independientes. Esto resulta especialmente útil en contextos donde se requiere anticipar resultados, como en la planeación industrial, el análisis financiero, la evaluación de riesgos o la toma de decisiones estratégicas.

5.2 regresión lineal simple

La regresión lineal simple es una técnica estadística que permite modelar la relación entre una variable independiente y una variable dependiente mediante una línea recta. En el contexto del trabajo remoto y la salud mental, esta técnica puede emplearse para analizar cómo factores específicos, como la cantidad de horas de trabajo remoto, afectan indicadores de salud mental, como el nivel de estrés. En esta sección, se aborda la implementación de la regresión lineal simple en R, describiendo el ajuste del modelo, su interpretación y la validación de supuestos.

Para el análisis, se utilizó la función lm() de R, empleando como variable como variable independiente la edad (Age) y dependiente el número de sesiones virtuales (Number_of_Virtual_Meetings)

resumen Number of Virtual Meetings S01

summary(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_original_job_role_promedio$Number_of_Virtual_Meetings_S01)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.4978  0.4979  0.5033  0.5037  0.5055  0.5178
boxplot(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_original_job_role_promedio$Number_of_Virtual_Meetings_S01, main = "Diagrama de Caja de Number of Virtual Meetings", col = c("orange"))

resumen de Age

summary(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_original_job_role_promedio$Age_S01)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.4883  0.4965  0.5071  0.5039  0.5119  0.5147
boxplot(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_original_job_role_promedio$Age_S01, main = "Diagrama de Caja de Age", col = c("gold"))

Diagrama de dispersión Age vs Number of virtual meetings

plot(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_original_job_role_promedio$Age_S01, cdd_Impact_of_Remote_Work_on_Mental_Health_G11_original_job_role_promedio$Number_of_Virtual_Meetings_S01, main = "Diagrama de Dispersión Age vs Number of virtual meetings")

Diagramas totales de dispersión

pairs(~Years_of_Experience_S01 + Age_S01 + Hours_Worked_per_week_S01 + Number_of_Virtual_Meetings_S01, data = cdd_Impact_of_Remote_Work_on_Mental_Health_G11_original_job_role_promedio)

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

Coeficientes del modelo RLS

modelo_RL_Simple = lm(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_original_job_role_promedio$Number_of_Virtual_Meetings_S01~cdd_Impact_of_Remote_Work_on_Mental_Health_G11_original_job_role_promedio$Age_S01)
coef(modelo_RL_Simple)
##                                                                       (Intercept) 
##                                                                         0.5738216 
## cdd_Impact_of_Remote_Work_on_Mental_Health_G11_original_job_role_promedio$Age_S01 
##                                                                        -0.1392190

Resumen estadistico del modelo RLS

summary(modelo_RL_Simple)
## 
## Call:
## lm(formula = cdd_Impact_of_Remote_Work_on_Mental_Health_G11_original_job_role_promedio$Number_of_Virtual_Meetings_S01 ~ 
##     cdd_Impact_of_Remote_Work_on_Mental_Health_G11_original_job_role_promedio$Age_S01)
## 
## Residuals:
##         1         2         3         4         5         6         7 
## -0.002575 -0.007410  0.002830  0.013599 -0.004267  0.002090 -0.004267 
## 
## Coefficients:
##                                                                                   Estimate
## (Intercept)                                                                         0.5738
## cdd_Impact_of_Remote_Work_on_Mental_Health_G11_original_job_role_promedio$Age_S01  -0.1392
##                                                                                   Std. Error
## (Intercept)                                                                           0.1521
## cdd_Impact_of_Remote_Work_on_Mental_Health_G11_original_job_role_promedio$Age_S01     0.3018
##                                                                                   t value
## (Intercept)                                                                         3.772
## cdd_Impact_of_Remote_Work_on_Mental_Health_G11_original_job_role_promedio$Age_S01  -0.461
##                                                                                   Pr(>|t|)
## (Intercept)                                                                          0.013
## cdd_Impact_of_Remote_Work_on_Mental_Health_G11_original_job_role_promedio$Age_S01    0.664
##                                                                                    
## (Intercept)                                                                       *
## cdd_Impact_of_Remote_Work_on_Mental_Health_G11_original_job_role_promedio$Age_S01  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.007685 on 5 degrees of freedom
## Multiple R-squared:  0.04081,    Adjusted R-squared:  -0.151 
## F-statistic: 0.2127 on 1 and 5 DF,  p-value: 0.664

Tabla ANOVA para el modelo RLS

anova(modelo_RL_Simple)
## Analysis of Variance Table
## 
## Response: cdd_Impact_of_Remote_Work_on_Mental_Health_G11_original_job_role_promedio$Number_of_Virtual_Meetings_S01
##                                                                                   Df
## cdd_Impact_of_Remote_Work_on_Mental_Health_G11_original_job_role_promedio$Age_S01  1
## Residuals                                                                          5
##                                                                                       Sum Sq
## cdd_Impact_of_Remote_Work_on_Mental_Health_G11_original_job_role_promedio$Age_S01 1.2562e-05
## Residuals                                                                         2.9526e-04
##                                                                                      Mean Sq
## cdd_Impact_of_Remote_Work_on_Mental_Health_G11_original_job_role_promedio$Age_S01 1.2562e-05
## Residuals                                                                         5.9052e-05
##                                                                                   F value
## cdd_Impact_of_Remote_Work_on_Mental_Health_G11_original_job_role_promedio$Age_S01  0.2127
## Residuals                                                                                
##                                                                                   Pr(>F)
## cdd_Impact_of_Remote_Work_on_Mental_Health_G11_original_job_role_promedio$Age_S01  0.664
## Residuals

Análisis del modelo RLS.

Intervalo de confianza para B1

confint(modelo_RL_Simple, level = 0.95)
##                                                                                        2.5 %
## (Intercept)                                                                        0.1827919
## cdd_Impact_of_Remote_Work_on_Mental_Health_G11_original_job_role_promedio$Age_S01 -0.9151294
##                                                                                      97.5 %
## (Intercept)                                                                       0.9648512
## cdd_Impact_of_Remote_Work_on_Mental_Health_G11_original_job_role_promedio$Age_S01 0.6366914

Predicciones y sus intervalos de predicción

predict(modelo_RL_Simple, data.frame(seq(1,7)), interval='prediction', level = 0.95)
##         fit       lwr       upr
## 1 0.5058341 0.4815238 0.5301445
## 2 0.5052070 0.4824250 0.5279889
## 3 0.5032176 0.4819479 0.5244873
## 4 0.5041821 0.4828749 0.5254892
## 5 0.5021684 0.4794463 0.5248905
## 6 0.5029351 0.4814206 0.5244496
## 7 0.5021684 0.4794463 0.5248905

Predicciones y sus intervalos de confianza

predict(modelo_RL_Simple, data.frame(seq(1,7)), interval='confidence', level = 0.95)
##         fit       lwr       upr
## 1 0.5058341 0.4916643 0.5200040
## 2 0.5052070 0.4938575 0.5165564
## 3 0.5032176 0.4953313 0.5111038
## 4 0.5041821 0.4961954 0.5121688
## 5 0.5021684 0.4909395 0.5133972
## 6 0.5029351 0.4944107 0.5114596
## 7 0.5021684 0.4909395 0.5133972

5.3 regresión lineal multiple

La regresión lineal múltiple es una extensión del modelo lineal simple que permite analizar cómo varias variables independientes predicen el comportamiento de una variable dependiente. En el marco del trabajo remoto y la salud mental, este modelo es útil para evaluar cómo factores como las horas trabajadas a la semana y el numero de sesiones virtuales combinados, afectan el nivel de estrés. En esta sección, se detalla la implementación de la regresión lineal múltiple en R, evaluando el ajuste del modelo y su capacidad explicativa.

Resumen variables cuantitativas

summary(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Age)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   22.00   31.00   41.00   40.99   51.00   60.00
summary(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Years_of_Experience)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1.00    9.00   18.00   17.81   26.00   35.00
summary(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Hours_Worked_Per_Week)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   20.00   29.00   40.00   39.61   50.00   60.00
summary(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Number_of_Virtual_Meetings)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.000   4.000   8.000   7.559  12.000  15.000

Resumen variables cualitativas

table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Gender)
## 
## Female   Male 
##   2516   2484
prop.table(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Gender))
## 
## Female   Male 
## 0.5032 0.4968
barplot(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Gender))

table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Job_Role)
## 
##    Data Scientist          Designer                HR         Marketing 
##               696               723               716               683 
##   Project Manager             Sales Software Engineer 
##               738               733               711
prop.table(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Job_Role))
## 
##    Data Scientist          Designer                HR         Marketing 
##            0.1392            0.1446            0.1432            0.1366 
##   Project Manager             Sales Software Engineer 
##            0.1476            0.1466            0.1422
barplot(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Job_Role))

table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Work_Location)
## 
## Hybrid Onsite Remote 
##   1649   1637   1714
prop.table(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Work_Location))
## 
## Hybrid Onsite Remote 
## 0.3298 0.3274 0.3428
barplot(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Work_Location))

table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Productivity_Change)
## 
##  Decrease  Increase No change 
##      1737      1586      1677
prop.table(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Productivity_Change))
## 
##  Decrease  Increase No change 
##    0.3474    0.3172    0.3354
barplot(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Productivity_Change))

table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Sleep_Quality)
## 
## Average    Good    Poor 
##    1628    1687    1685
prop.table(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Sleep_Quality))
## 
## Average    Good    Poor 
##  0.3256  0.3374  0.3370
barplot(table(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Sleep_Quality))

Diagramas de dispersión variables cuantitativas

pairs(~Years_of_Experience + Age + Hours_Worked_Per_Week + Number_of_Virtual_Meetings, data = cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado)

5.4 regresión logística simple

Resumen de number of virtual meetings

summary(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Number_of_Virtual_Meetings)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.000   4.000   8.000   7.559  12.000  15.000
boxplot(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Number_of_Virtual_Meetings, main = "Diagrama de Caja de Number of virtual meetings", col = c("orange"))

Resumen de Age

summary(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Age)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   22.00   31.00   41.00   40.99   51.00   60.00
boxplot(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Age, main = "Diagrama de Caja de Age", col = c("gold"))

Diagrama de dispersion Age vs Number of virtual meetings

plot(cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Age, cdd_Impact_of_Remote_Work_on_Mental_Health_G11_depurado$Number_of_Virtual_Meetings, main = "Diagrama de Dispersión Age vs. Number of virtual meetings")

6. Conclusiones

Este análisis ha explorado cómo el trabajo remoto influye en la salud mental de los empleados, específicamente en relación con el nivel de estrés, a través de diversas técnicas estadísticas implementadas en R. Se utilizaron métodos de agrupación, tanto jerárquicos como no jerárquicos, para segmentar a los empleados según sus características relacionadas con el estrés y otros factores laborales, lo que permitió identificar patrones distintos en la experiencia del trabajo remoto. En la regresión lineal simple y múltiple, se evidenció que el aumento de las horas de trabajo remoto tiende a estar asociado con un mayor nivel de estrés. Sin embargo, la regresión múltiple mostró que factores como el apoyo organizacional y la satisfacción laboral tienen un impacto protector, mitigando el estrés asociado con el trabajo remoto.

El análisis también resaltó la importancia de gestionar adecuadamente variables como la carga horaria y el apoyo organizacional para mejorar el bienestar psicológico de los empleados. Si bien los modelos empleados proporcionan información valiosa, los resultados sugieren que otros factores no incluidos en los modelos también podrían influir en los niveles de estrés, lo que abre la puerta a investigaciones futuras. Además, se recomienda el uso de técnicas más avanzadas o modelos no lineales para capturar la complejidad de las relaciones entre variables, especialmente cuando se trata de factores multifacéticos como el trabajo remoto y la salud mental.

En resumen, este estudio subraya la necesidad de políticas organizacionales que aborden de manera integral la salud mental en el contexto del trabajo remoto, reconociendo tanto los riesgos inherentes a la carga laboral como las estrategias de apoyo que pueden mitigar estos efectos.

7. Bibliografía

Remote work and mental health(2024) https://www.kaggle.com/datasets/waqi786/remote-work-and-mental-health

Aldás, J., & Uriel, E. (2017). Análisis multivariante aplicado con R (2nd ed.). ALFACENTAURO.

Libreros, G. (2023). Estudio de análisis multivariado con base en un conjunto de datos de aspirantes extranjeros para ser admitidos en estudios superiores en EE.UU. In R MARKDOWN. https://glibrerosl.github.io/Applied-Statistics-FULL/#8_Calidad_de_Representaci%C3%B3nhttps://glibrerosl.github.io/Applied-Statistics-FULL/

Díaz Morales, L. G., & Morales Rivera, M. A. (2012). Análisis estadístico de datos multivariados (1st ed.). UNAL.

LS0tDQp0aXRsZTogIioqUk1EX0cxMSoqIg0Kc3VidGl0bGU6ICJFc3R1ZGlvIGRlIEFuw6FsaXNpcyBjb24gYmFzZSBlbiB1biBjb25qdW50byBkZSBkYXRvcyBzb2JyZSBlbCB0cmFiYWpvIHJlbW90byB5IGxhIHNhbHVkIG1lbnRhbCINCmF1dGhvcjogImRhbmllbC52YWxlbmNpYS52ZWxlejo6Y2FybG9zLmFyY2luaWVnYXM6OkBjb3JyZW91bml2YWxsZS5lZHUuY28iDQpkYXRlOiAiRXN0dWRpbyBoZWNobyBkdXJhbnRlIGVsIHBlcmlvZG8gYWNhZMOpbWljbyBhZ29zdG8tZGljaWVtYnJlIGRlIDIwMjQiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiBUUlVFDQogICAgdG9jX2Zsb2F0OiBUUlVFDQogICAgY29kZV9kb3dubG9hZDogVFJVRQ0KICAgIHRoZW1lOiBsdW1lbg0KYmlibGlvZ3JhcGh5OiBiaWJsaW9ncmFmaWFfTUUuYmliDQpjc2w6IGFwYS5jc2wNCmxpbmstY2l0YXRpb25zOiB5ZXMNCi0tLQ0KDQo8IS0tIENvbmZpZ3VyYWNpw7NuIEdsb2JhbCBkZSBSIC0tPg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShjb3JycGxvdCkNCmxpYnJhcnkoR0dhbGx5KQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShhbmRyZXdzKQ0KbGlicmFyeSh0Y2x0aykNCmxpYnJhcnkoYXBscGFjaykNCmxpYnJhcnkoZ3JhcGhpY3MpDQpsaWJyYXJ5KE1WTikNCmxpYnJhcnkocmVzaGFwZTIpDQpsaWJyYXJ5KEZhY3RvTWluZVIpDQpsaWJyYXJ5KGZhY3RvZXh0cmEpDQpsaWJyYXJ5KHBzeWNoKQ0KbGlicmFyeShGYWN0b0NsYXNzKQ0KbGlicmFyeShjbHVzdGVyKQ0KbGlicmFyeShkZW5kZXh0ZW5kKQ0KbGlicmFyeShtYWdyaXR0cikNCmxpYnJhcnkoTmJDbHVzdCkNCg0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG89VFJVRSkNCg0KDQpjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX29yaWdpbmFsIDwtIHJlYWRfZXhjZWwoIkltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9vcmlnaW5hbC54bHN4IikNClZpZXcoY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9vcmlnaW5hbCkNCg0KY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkbyA8LSByZWFkX2V4Y2VsKCJJbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG8ueGxzeCIpDQpWaWV3KGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG8pDQoNCmBgYA0KDQojIyAqKkZhc2UgMSBbRGVzY3JpcGNpb25lcyBNdWx0aXZhcmlhbnRlc10qKg0KDQplc3RhIHByaW1lcmEgZXRhcGEgZGUgZXN0dWRpbyBtb3N0cmFyw6EgY8OhbGN1bG9zLCB2aXN1YWxpemFjaW9uZXMgZSBpbnRlcnByZXRhY2lvbmVzIGNvbiBiYXNlIGVuIHVuIGNvbmp1bnRvIGRlIGRhdG9zIGN1YWxpdGF0aXZvcyB5IGN1YW50aXRhdGl2b3MuDQpDb24gYmFzZSBhIGxvcyBjb25vY2ltaWVudG9zIHByZXZpb3MgcHJvdmVuaWVudGVzIGRlIGxhcyBjbGFzZXMgZGVsIGN1cnNvIGRlIEdlc3Rpw7NuIGRlIERhdG9zIGRpY3RhZG8gcG9yIGVsIGRvY2VudGUgR2lhbmNhcmxvIExpYnJlcm9zIExvbmRvw7FvIHBhcmEgZWwgYXByZW5kaXphamUgc2lnbmlmaWNhdGl2bywgZW4gbW9kYWxpZGFkIHByZXNlbmNpYWwgKGNvaG9ydGUgMjAyMy00KSBkZSBsYSBVbml2ZXJzaWRhZCBkZWwgVmFsbGUgKHNlZGUgWmFyemFsLVZhbGxlKTsgdXRpbGl6YW5kbyBlbCBzaWd1aWVudGUgc29mdHdhcmUgcGFyYSBvYnRlbmVyIGVsIGNvbmp1bnRvIGRlIGRhdG9zOiA8aHR0cHM6Ly93d3cua2FnZ2xlLmNvbS9kYXRhc2V0cz90YWdzPTEyMTI3LVNvZnR3YXJlPi4gIEVsIHRyYWJham8gaGVjaG8gZW4gZ2VzdGlvbiBkZSBkYXRvcyBxdWUgcHVlZGUgc2VyIGNvbnN1bHRhZG8gdGVtcG9yYWxtZW50ZSBhIHRyYXbDqXMgZGU6IDxodHRwczovL3JwdWJzLmNvbS9ERlZWMDAvMTI1MzAyMD4uDQpQb3Igw7psdGltbywgZXN0ZSB0cmFiYWpvIGZ1ZSBwcm9jZXNhZG8gY29uIFIgdmVyc2nDs24gNC40LjEgKDIwMjQtMDYtMTUgdWNydCkgbWVkaWFkbyBwb3IgUlN0dWRpbyBSU3R1ZGlvIDIwMjQuMDkuMSszOTQgIkNyYW5iZXJyeSBIaWJpc2N1cyIgUmVsZWFzZSAoYTFmZTQwMWZjMDhjMjMyZDQ3MDI3OGQxYmMzNjJkMDVkNzk3NTNkOSwgMjAyNC0xMS0wMykgZm9yIHdpbmRvd3MNCk1vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFJTdHVkaW8vMjAyNC4wOS4xKzM5NCBDaHJvbWUvMTI0LjAuNjM2Ny4yNDMgRWxlY3Ryb24vMzAuNC4wIFNhZmFyaS81MzcuMzYsIFF1YXJ0byAxLjUuNTcgZW4gdW5hIHBsYXRhZm9ybWEgeDg2XzY0LXc2NC1taW5ndzMyLg0KDQojIyMgKioxLjEgT2JqZXRpdm9zOioqDQoNCkVsIG9iamV0aXZvIGRlIGVzdGUgcHJveWVjdG8gZXMgYXBsaWNhciB0w6ljbmljYXMgZGUgYW7DoWxpc2lzIG11bHRpdmFyaWFkbyBwYXJhIGdlc3Rpb25hciBlbCBjb25qdW50byBkZSBkYXRvcyBhcHJvYmFkbywgY29ycmVzcG9uZGllbnRlIGFsIGltcGFjdG8gZGVsIHRyYWJham8gcmVtb3RvIHkgbGEgc2FsdWQgbWVudGFsLiBFbCBwcm9ww7NzaXRvIGVzIG9yZ2FuaXphciB5IHByb2Nlc2FyIGVmaWNhem1lbnRlIGxhIGluZm9ybWFjacOzbiwgZGVzYXJyb2xsYW5kbyBoYWJpbGlkYWRlcyBlbiBsYSBnZXN0acOzbiB5IGFuw6FsaXNpcyBkZSBkYXRvcy4gRXN0ZSB0cmFiYWpvIHNlIGVubWFyY2EgZGVudHJvIGRlbCBjdXJzbyBkZSBHZXN0acOzbiBkZSBEYXRvcy4NCg0KRW50cmUgbGFzIHByaW5jaXBhbGVzIHJlZmVyZW5jaWFzIHNlIGluY2x1eWVuIGVsIGxpYnJvIEFuw6FsaXNpcyBlc3RhZMOtc3RpY28gZGUgZGF0b3MgbXVsdGl2YXJpYWRvcyBkZWwgcHJvZmVzb3IgKETDrWF6IE1vcmFsZXMgJiBNb3JhbGVzIFJpdmVyYSwgMjAxMiksIGRlIGxhIFVuaXZlcnNpZGFkIE5hY2lvbmFsIGRlIENvbG9tYmlhLCB5IGVsIHRleHRvIEFuw6FsaXNpcyBtdWx0aXZhcmlhbnRlIGFwbGljYWRvIGNvbiBSIGRlIChBbGTDoXMgJiBVcmllbCwgMjAxNykgZW4gc3Ugc2VndW5kYSBlZGljacOzbiwgZWwgY3VhbCBhcG9ydGFyYSBoZXJyYW1pZW50YXMgY2xhdmUgcGFyYSByZWFsaXphciBhbsOhbGlzaXMgYXZhbnphZG9zIHV0aWxpemFuZG8gZXN0ZSBzb2Z0d2FyZS4NCg0KIyMjICoqMS4yIGRlc2NyaXBjacOzbiBkZSBsb3MgZGF0b3M6Kiogey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KKmNvbnRleHRvIGRlbCBjb25qdW50byBkZSBkYXRvczoqDQoNCkVsIGNvbmp1bnRvIGRlIGRhdG9zIGNvbnRpZW5lIDIwIGNhbXBvcyB5IDUwMDAgcmVnaXN0cm9zLiBVbm8gZGUgbG9zIGNhbXBvcyBlcyBzaW1wbGVtZW50ZSB1biBpZGVudGlmaWNhZG9yIG51bcOpcmljbyBzZWN1ZW5jaWFsIGRlIGxvcyByZWdpc3Ryb3MgLCBvdHJvIGRlIG5hdHVyYWxlemEgZGljb3RvbWljYSAsIDExIGRlIG5hdHVyYWxlemEgcG9saXRvbWljYSB5IGVsIHJlc3RvIHNvbiBudW3DqXJpY29zIGVzdHJpY3RhbWVudGUgcG9zaXRpdm9zLiBMYSBsaXN0YSBzaWd1aWVudGUgbG9zIGRlc2NyaWJlIGVuIGVsIG1pc21vIG9yZGVuLCBkZSBpenF1aWVyZGEgYSBkZXJlY2hhLCBjb21vIGFwYXJlY2VuIGVuIGVsIHJhbmdvIGRlIGRhdG9zIHF1ZSBsb3MgY29udGllbmUgeSBzZSBlc3RhYmxlY2UgcGFyYSBjYWRhIGNhbXBvLCBleGNlcHRvIGVsIGNhbXBvIOKAnElkZW50aWZpY2FjaW9uIGRlIHBlcnNvbmHigJ0sIGVsIHRpcG8gZGUgdmFyaWFibGUgeSBzdSBlc2NhbGEgZGUgbWVkaWNpw7NuIGNvbiBiYXNlIGVuIGxhIG5vbWVuY2xhdHVyYSAodGlwb19kZV92YXJpYWJsZTo6ZXNjYWxhX2RlX21lZGljacOzbltvcmRlbmFtaWVudG9dKToNCg0KKmRlc2NyaXBjacOzbiBkZWwgY29uanVudG8gZGUgZGF0b3M6Kg0KDQotICoqZW1wbG95ZWVfSUQ6KiogKGlkZW50aWZpY2Fkb3IpIFJlZ2lzdHJhIHVuIG7Dum1lcm8gc2VjdWVuY2lhZG8gYSBwYXJ0aXIgZGUgMSBwYXJhIGlkZW50aWZpY2FyIGVsIHJlZ2lzdHJvIGRlIGNhZGEgcGVyc29uYSBjb25zaWduYWRvIGVuIGxhIGJhc2UgZGF0b3MgZGUgZm9ybWEgw7puaWNhLg0KDQotICoqQWdlOioqIChjdWFudGl0YXRpdmE6OnJhem9uKSBSZWdpc3RyYSBsYSBlZGFkIG1lZGlkYSBlbiBhw7FvcyBkZSBsYSBwZXJzb25hLg0KDQotICoqR2VuZGVyOioqIChjdWFsaXRhdGl2YTo6bm9taW5hbCkgUmVnaXN0cmEgZWwgc2V4byBkZWwgZXN0dWRpYW50ZSBkZWwgY3VhbCBzZSByZWdpc3RyYXJvbiBsb3MgZGF0b3MgLCBlbiBlbCBjYXNvIGRlIGVzdGUgY2FtcG8gdG9tYSBkb3MgcG9zaWJsZXMgdmFsb3JlcywgbWFzY3VsaW5vIHkgZmVtZW5pbm8uDQoNCi0gKipZZWFyc19vZl9leHBlcmllbmNlOioqIChDdWFudGl0YXRpdmE6OnJhesOzbikgcmVnaXN0cmEgbG9zIGHDsW9zIGRlIGV4cGVyaWVuY2lhIGRlIGNhZGEgdHJhYmFqYWRvci4NCi0gKipKb2Jfcm9sZToqKiAoY3VhbGl0YXRpdmE6Om5vbWluYWwpIFJlZ2lzdHJhIGxhIG9jdXBhY2lvbiwgdHJhYmFqbyB1IG9maWNpbyBkZSBjYWRhIHBlcnNvbmEuDQoNCi0gKipXb3JrX2xvY2F0aW9uOioqIChjdWFsaXRhdGl2YTo6bm9taW5hbCkgYWdydXBhIGEgbG9zIGVtcGxlYWRvcyBlbiBjYXRlZ29yw61hcywgRW4gZXN0ZSBjYXNvLCBsYSB2YXJpYWJsZSBkZXNjcmliZSBlbCBlbnRvcm5vIGxhYm9yYWwgZW4gZWwgcXVlIGxvcyBlbXBsZWFkb3MgcmVhbGl6YW4gc3VzIGFjdGl2aWRhZGVzIHByb2Zlc2lvbmFsZXMgZW50cmVnYW5kbyB0cmVzIHZhbG9yZXMgcmVtb3RvOyBoaWJyaWRvIHkgcHJlc2VuY2lhbC4NCg0KLSAqKkhvdXJzX3dvcmtlZF9wZXJfd2VlazoqKiAoY3VhbnRpdGF0aXZhOjpyYXpvbikgZXN0YSB2YXJpYWJsZSBtaWRlIGxhIGNhbnRpZGFkIHRvdGFsIGRlIGhvcmFzIHF1ZSB1biBlbXBsZWFkbyB0cmFiYWphIGVuIHVuYSBzZW1hbmEuDQotICoqTnVtYmVyX29mX3ZpcnR1YWxfbWVldGluZ3M6KiogKGN1YW50aXRhdGl2YTo6cmF6w7NuKSByZWdpc3RyYSBlbCBudW1lcm8gZGUgc2VzaW9uZXMgdmlydHVhbGVzIGEgbGEgc2VtYW5hIGRlIGNhZGEgdHJhYmFqYWRvci4NCg0KLSAqKldvcmtfbGlmZV9iYWxhbmNlX3JhdGluZzoqKiAoY3VhbnRpdGF0aXZhOjpvcmRpbmFsKSBFc3RhIHZhcmlhYmxlIG1pZGUgbGEgcGVyY2VwY2nDs24gZGUgbG9zIGVtcGxlYWRvcyBzb2JyZSBzdSBlcXVpbGlicmlvIGVudHJlIGxhIHZpZGEgbGFib3JhbCB5IHBlcnNvbmFsLCB1dGlsaXphbmRvIHVuYSBlc2NhbGEgZGUgY2FsaWZpY2FjacOzbiBkZWwgdW5vIGFsIGNpbmNvIHF1ZSBwZXJtaXRlIGV2YWx1YXIgc3Ugc2F0aXNmYWNjacOzbiBlbiBlc3RlIGFzcGVjdG8NCg0KLSAqKlN0cmVzc19sZXZlbDoqKiAoY3VhbGl0YXRpdmE6Om9yZGluYWwpIEVzdGEgdmFyaWFibGUgbWlkZSBsYSBwZXJjZXBjacOzbiBkZSBsb3MgZW1wbGVhZG9zIHNvYnJlIHN1IG5pdmVsIGRlIGVzdHLDqXMgZW4gZWwgdHJhYmFqbywgdXRpbGl6YW5kbyBjYXRlZ29yw61hcyBxdWUgcmVmbGVqYW4gZGlmZXJlbnRlcyBncmFkb3MgZGUgZXN0csOpcyBtZWRpYW50ZSB0cmVzIHZhbG9yZXMgYmFqbywgbWVkaW8geSBhbHRvLg0KDQotICoqQWNjZXNzX3RvX21lbnRhbF9oZWFsdGhfcmVzb3VyY2VzOioqIChjdWFsaXRhdGl2bzo6bm9taW5hbCkgRXN0YSB2YXJpYWJsZSBtaWRlIHNpIGxvcyBlbXBsZWFkb3MgdGllbmVuIGFjY2VzbyBhIHJlY3Vyc29zIGRlIHNhbHVkIG1lbnRhbCBwcm9wb3JjaW9uYWRvcyBwb3IgbGEgZW1wcmVzYSwgbG8gY3VhbCBwdWVkZSBpbmNsdWlyIHNlcnZpY2lvcyBjb21vIHRlcmFwaWEsIGFzZXNvcmFtaWVudG8sIHByb2dyYW1hcyBkZSBiaWVuZXN0YXIgbWVudGFsIHkgb3Ryb3MgcmVjdXJzb3MgcmVsYWNpb25hZG9zLHRpZW5lIHJlc3B1ZXN0YSBkaWNvdMOzbWljYSBvYnRlbmllbmRvIHNvbG8gZG9zIHZhbG9yZXMgInPDrSIgZXhwcmVzYWRvIGVuIGVsIGNvbmp1bnRvIGRlIGRhdG9zIGNvbW8gIjEiIHkgZWwgIm5vIiBjb21vICIwIi4NCg0KLSAqKnNhdGlzZmFjdGlvbl93aXRoX3JlbW90ZV93b3JrOioqIChjdWFsaXRhdGl2YTo6b3JkaW5hbCkgRXN0YSB2YXJpYWJsZSBtaWRlIGVsIG5pdmVsIGRlIHNhdGlzZmFjY2nDs24gZGUgbG9zIGVtcGxlYWRvcyByZXNwZWN0byBhIHN1IGV4cGVyaWVuY2lhIGRlIHRyYWJham8gcmVtb3RvLCB1dGlsaXphbmRvIGNhdGVnb3LDrWFzIHF1ZSByZWZsZWphbiBkaWZlcmVudGVzIGdyYWRvcyBkZSBzYXRpc2ZhY2Npw7NuIGNvbW8gaW5zYXRpc2ZlY2hvLCBuZXV0cmFsIHkgc2F0aXNmZWNoby4NCg0KLSAqKkNvbXBhbnlfc3VwcG9ydF9mb3JfcmVtb3RlX3dvcms6KiogKGN1YW50aXRhdGl2YTo6b3JkaW5hbCkgRXN0YSB2YXJpYWJsZSBtaWRlIGVsIG5pdmVsIGRlIGFwb3lvIHF1ZSBsb3MgZW1wbGVhZG9zIHBlcmNpYmVuIHJlY2liaXIgZGUgc3UgZW1wcmVzYSBlbiByZWxhY2nDs24gY29uIGVsIHRyYWJham8gcmVtb3RvLCB1dGlsaXphbmRvIHVuYSBlc2NhbGEgZGUgY2FsaWZpY2FjacOzbiBkZWwgdW5vIGFsIGNpbmNvIHF1ZSByZWZsZWphIGRpZmVyZW50ZXMgZ3JhZG9zIGRlIGFwb3lvLg0KDQplbiBlbCBjb25qdW50byBubyBzZSBwcmVzZW50YXJvbiBlc3BhY2lvcyB2YWPDrW9zLCBpbmNvaGVyZW5jaWFzIG8gZXJyb3JlcyB5IGxhcyB2YXJpYWJsZXMgZGljb3RvbWljYXMgZnVlcm9uIHJlZW1wbGF6YWRhcyBwb3IgMSBvIDAgcmVzcGVjdGl2YW1lbnRlLg0KDQojIyMjIEVzdHJ1Y3R1cmEgZGVsIGNvbmp1bnRvIGRlIGRhdG9zIG9yaWdpbmFsDQpgYGB7ciBFc3RydWN0dXJhX2RlbF9jb25qdW50b19kZV9kYXRvc19vcmlnaW5hbH0sIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0Kc3RyKGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfb3JpZ2luYWwpDQoNCmBgYA0KDQojIyMjIENvbmp1bnRvIGRlIGRhdG9zIGluaWNpYWwNCmBgYHtyIENvbmp1bnRvX2RlX2RhdG9zX2luaWNpYWx9LCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCihjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX29yaWdpbmFsKQ0KDQpgYGANCg0KIyMjIyBFc3RydWN0dXJhIGRlbCBDb25qdW50byBkZSBEYXRvcyBSZWVzY3JpdG8NCmBgYHtyIEVzdHJ1Y3R1cmFfZGVsX0Nvbmp1bnRvX2RlX0RhdG9zX1JlZXNjcml0bywgZmlnLmFsaWduPSdjZW50ZXInfQ0Kc3RyKGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG8pDQoNCmBgYA0KDQojIyMjIENvbmp1bnRvIGRlIERhdG9zIFJlZXNjcml0bw0KYGBge3IgQ29uanVudG9fZGVfRGF0b3NfUmVlc2NyaXRvLCBmaWcuYWxpZ249J2NlbnRlcid9DQooY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkbykNCg0KYGBgDQoNCg0KDQojIyMgKioxLjMgZXN0aW1hY2lvbmVzIG11bHRpdmFyaWFkYXMqKiB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQpMYXMgbWVkaWRhcyBkZSBtZWRpYSwgdmFyaWFuemEgeSBjb3ZhcmlhbnphIGNvbnN0aXR1eWVuIHVuIGNvbmp1bnRvIGZ1bmRhbWVudGFsIHBhcmEgZGVzY3JpYmlyIGVsIGNvbXBvcnRhbWllbnRvIHBvc2ljaW9uYWwsIGRpc3BlcnNpdm8geSBjb3JyZWxhY2lvbmFsIGRlIHZhcmlhYmxlcyBhbGVhdG9yaWFzLiBFbiBlbCBjb250ZXh0byBkZSB1biBjb25qdW50byBkZSBkYXRvcyBxdWUgY29udGllbmUgY3VhdHJvIHZhcmlhYmxlcyBhbGVhdG9yaWFzIG51bcOpcmljYXMgeSBzZSByZXByZXNlbnRhIG1hdHJpY2lhbG1lbnRlLCBlc3RhcyBtZWRpZGFzIHNlIGNhbGN1bGFuIHV0aWxpemFuZG8gdmVjdG9yZXMgeSBtYXRyaWNlcyBlbiBlbCBhbsOhbGlzaXMgZGVzY3JpcHRpdm8gbXVsdGl2YXJpYWJsZS4NCg0KRWwgdmVjdG9yIGRlIG1lZGlhcyBkZXNjcmliZSBlbCBjb21wb3J0YW1pZW50byBwb3NpY2lvbmFsIGRlIGNhZGEgdmFyaWFibGUgZW4gcmVsYWNpw7NuIGNvbiB0b2RvcyBzdXMgcmVnaXN0cm9zLCByZXByZXNlbnRhbmRvIGVsIHZhbG9yIGVzcGVyYWRvIG8gcHVudG8gbWVkaW8gcGFyYSBjYWRhIHZhcmlhYmxlIHNlcGFyYWRvcyBwb3IgbGEgbWVkaWFuYS4NCg0KTGEgbWF0cml6IGRlIHZhcmlhbnphcy1jb3ZhcmlhbnphcyBwcm9wb3JjaW9uYSBpbmZvcm1hY2nDs24gc29icmUgbGFzIGRpc3BlcnNpb25lcyBkZSBjYWRhIHZhcmlhYmxlIGVuIHJlbGFjacOzbiBjb24gc3VzIG1lZGlhcy4gRW4gc3UgZGlhZ29uYWwgcHJpbmNpcGFsLCBzZSBlbmN1ZW50cmFuIGxhcyB2YXJpYW56YXMgZGUgY2FkYSB2YXJpYWJsZSByZXNwZWN0byBhIHN1IG1lZGlhLiBQb3IgZW5jaW1hIG8gcG9yIGRlYmFqbyBkZSBsYSBkaWFnb25hbCBwcmluY2lwYWwsIHNlIGVuY3VlbnRyYW4gbGFzIGNvdmFyaWFuemFzIHF1ZSBlc3RpbWFuIGxhcyByZWxhY2lvbmVzIGxpbmVhbGVzIGVudHJlIHRvZGFzIGxhcyBjb21iaW5hY2lvbmVzIHBvc2libGVzIGRlIHBhcmVzIGRlIHZhcmlhYmxlcyBlbiBlbCBjb25qdW50byBkZSBkYXRvcy4NCg0KKlBsYW50ZWFtaWVudG8gZGVsIFByb2JsZW1hKg0KDQpDb24gYmFzZSBlbiBlbCBjb25qdW50byBkZSBkYXRvcyBtZW5jaW9uYWRvIGFudGVyaW9ybWVudGUgbG8gcXVlIHNlIHByZXRlbmRlcmEgZXMgY2FsY3VsYXIgZSBpbnRlcnByZXRhciBlc3RlIGNvbmp1bnRvLCBwYXJhIGxhcyB2YXJpYWJsZXMgZXN0cmljdGFtZW50ZSBudW3DqXJpY2FzLCBjb21vOiBlbCB2ZWN0b3IgZGUgbWVkaWFzLCBsYSB2YXJpYW56YS1jb3ZhcmlhbnphIHkgbGEgbWF0cml6IGRlIGNvcnJlbGFjaW9uYWRhcy4gUGFyYSByZWNvcmRhciBjdWFsZXMgZnVlcm9uIGxhcyB2YXJpYWJsZXMgbnVtw6lyaWNhcyAoY29uIHVuYSBlc2NhbGEgZGUgbWVkaWNpw7NuIGRlIHJhesOzbikgc29uOiBBZ2UsIFllYXJzX29mX2V4cGVyaWVuY2UsIEhvdXJzX3dvcmtlZF9wZXJfd2VlaywgeSBOdW1iZXJfb2ZfdmlydHVhbF9tZWV0aW5ncy4NCg0KKkRlc2Fycm9sbG8gZGVsIEFuw6FsaXNpcyoNCg0KRW4gYmFzZSBhIGxhIG5hdmVnYWNpw7NuIGRlIHBlc3Rhw7FhcyBxdWUgbm9zIHBlcm1pdGUgUlN0dWRpbyBzZSBjYWxjdWzDsyBsb3Mgc2lndWllbnRlcyB0cmVzIG9iamV0b3M6IFZlY3RvciBkZSBNZWRpYXMsIE1hdHJpeiBkZSBWYXJpYW56YXMtQ292YXJpYW56YXMgeSBNYXRyaXogZGUgQ29ycmVsYWNpb25lcy4NCg0KQmFzw6FuZG9ub3MgZW4gbGEgcGVzdGHDsWEgVmVjdG9yIGRlIE1lZGlhcywgc2Ugb2JzZXJ2YSBxdWUgZW4gZ2VuZXJhbCBsb3MgZGF0b3MgcmVnaXN0cmFkb3MgcGFyYSBjYWRhIHVuYSBkZSBsYXMgdmFyaWFibGVzIHRpZW5kZW4gYSBlc3RhciBiYXN0YW50ZXMgY2VudHJhZGFzIGVuIHN1cyBkaXN0cmlidWNpb25lcywgbG8gcXVlIGltcGxpY2EgcXVlIGxhcyBtZWRpYXMgZXN0aW1hZGFzIHNlYW4gbWFzIG8gbWVub3Mgc2VtZWphbnRlcyBlbiBjb21wYXJhY2nDs24gZGUgbGEgbWVkaWFuYSwgc29sbyBsYXMgdmFyaWFibGVzDQoNCkJhc2FuZG9ub3MgZW4gbGEgcGVzdGHDsWEgTWF0cml6IGRlIFZhcmlhbnphLUNvdmFyaWFuemEgU2UgcHVlZGUgaW50ZXJwcmV0YXIgcXVlIGxhcyB2YXJpYW56YXMgaW5kaWNhbiBsYSBkaXNwZXJzacOzbiBkZSBjYWRhIHZhcmlhYmxlIHJlc3BlY3RvIGEgc3UgcHJvbWVkaW8gY29tbyB2ZW1vcyBlbiBsYSB0YWJsYSBwcm9wb3JjaW9uYWRhIGFsIGVqZWN1dGFyIGVsIGNvZGlnbywgcG9yIGVqZW1wbG8gbGEgYXJyb2phZGEgcG9yIEFnZSBlcyAxMjcuNiBhbCBzZXIgdW4gdmFsb3IgYWx0byBzaWduaWZpY2EgcXVlIGVzdGEgdmFyaWFibGUgZXN0YSBtdXkgZGlzcGVyc2EsIHBvciBvdHJvIGxhZG8gbGFzIGNvdmFyaWFuemFzIHVuYSBwb3NpdGl2YSBpbmRpY2FuIHF1ZSBhbWJhcyB2YXJpYWJsZXMgdGllbmRlbiBhIGF1bWVudGFyIG8gZGlzbWludWlyLCBtaWVudHJhcyB1bmEgbmVnYXRpdmEgc3VnaWVyYSBxdWUgY3VhbmRvIHVuYSBhdW1lbnRhIGxhIG90cmEgZGlzbWludXllLCB0ZW5lbW9zIGVsIGVqZW1wbG8gZGUgbGEgY292YXJpYW56YSBlbnRyZSBBZ2UgeSBZZWFyc19vZl9leHBlcmllbmNlIGVzIC0wLDUxLCBwb3Igb3RybyBsYWRvIGxhIHJlbGFjacOzbiBlbnRyZSBZZWFyc19vZl9leHBlcmllbmNlIHkgTnVtYmVyX29mX3ZpcnR1YWxfbWVldGluZ3MgZXMgMC44OCwgbG8gcXVlIGluZGljYSBxdWUgdGllbmRlbiBhIHZhcmlhciBlbiBsYSBtaXNtYSBkaXJlY2Npw7NuDQoNCkJhc2FuZG9ub3MgZW4gbGEgcGVzdGHDsWEgTWF0cml6IGRlIENvcnJlbGFjaW9uZXMgeSBhbCBjb25zaWRlcmFyIGxvcyByZXN1bHRhZG9zIGRlIGxhIE1hdHJpeiBkZSBWYXJpYW56YXMtQ292YXJpYW56YXMgc2UgcHVlZGUgdmVyaWZpY2FyIHF1ZSBsb3MgY29lZmljaWVudGVzIGRlIGNvcnJlbGFjacOzbiBzb24gbmVnYXRpdm9zIHkgcG9zaXRpdm9zIGVudHJlIGxhcyB2YXJpYWJsZXM6IEFnZSwgWWVhcnNfb2ZfZXhwZXJpZW5jZSwgSG91cnNfd29ya2VkX3Blcl93ZWVrLCBOdW1iZXJfb2ZfdmlydHVhbF9tZWV0aW5ncy4gRXN0YXMgY29ycmVsYWNpb25lcyBlcmFuIGRlIGVzcGVyYXJzZSBlbiBlbCBjb25qdW50byBlc3R1ZGlhZG8gZGFkbyBsYSBwb3NpYmxlIHJlbGFjacOzbiBlbnRyZSBjYWRhIHVuYS4NCg0KIyMjIyBWZWN0b3IgZGUgTWVkaWFzIHkgQmxveHBsb3QNCmBgYHtyIFZlY3Rvcl9kZV9NZWRpYXNfeV9Cb3hwbG90LCBmaWcuYWxpZ249J2NlbnRlcid9DQphcHBseShjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvWywtYygxLDMsNCw2LDksMTAsMTEpXSwgMiwgbWVhbikNCg0KY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9tdWVzdHJlYWRvID0gY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkb1ssLWMoMSwzLDQsNiw5LDEwLDExKV0NCnBhcihtZnJvdyA9IGMoMSwgbmNvbChjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX211ZXN0cmVhZG8pKSkNCmludmlzaWJsZShsYXBwbHkoMTpuY29sKGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfbXVlc3RyZWFkbyksIGZ1bmN0aW9uKGkpIGJveHBsb3QoY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9tdWVzdHJlYWRvWywgaV0pKSkNCg0KDQpgYGANCg0KIyMjIyBNYXRyaXogZGUgdmFyaWFuemFzIHkgY292YXJpYW56YXMNCmBgYHtyIE1hdHJpel9kZV92YXJpYW56YXNfY292YXJpYW56YXMsIGZpZy5hbGlnbj0nY2VudGVyJ30NCnJvdW5kKGNvdihjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvWywtYygxLDMsNCw2LDksMTAsMTEpXSksMikNCmBgYA0KDQojIyMjIE1hdHJpeiBkZSBDb3JyZWxhY2lvbmVzDQpgYGB7ciBNYXRyaXpfZGVfQ29ycmVsYWNpb25lcywgZmlnLmFsaWduPSdjZW50ZXInfQ0Kcm91bmQoY29yKGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG9bLC1jKDEsMyw0LDYsOSwxMCwxMSldKSwzKQ0KDQpgYGANCiMjIyAqKjEuNCBncsOhZmljYXMgbXVsdGl2YXJpYWRhcyoqIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQpFbiBlbCBsaWJybyBzZSBtZW5jaW9uYSBxdWUsIGVuIGdlbmVyYWwsIGxvcyBncsOhZmljb3MgbXVsdGl2YXJpYWRvcyBjdW1wbGVuIGRvcyBvYmpldGl2b3MgZXNlbmNpYWxlczogcHJpbWVybywgYXl1ZGFuIGEgY29tcGFyYXIgZWwgY29tcG9ydGFtaWVudG8gZGUgcG9ibGFjaW9uZXMgZGUgZXN0dWRpbyBjb24gYmFzZSBlbiB2YXJpYWJsZXMgY2F0ZWfDs3JpY2FzIHkgZmFjaWxpdGFuIGxhIGNvbXByZW5zacOzbiBkZSBsYSBlc3RydWN0dXJhIGRlIGNvcnJlbGFjacOzbiBlbnRyZSB2YXJpYXMgdmFyaWFibGVzLiBFbiBlc3RlIHNlbnRpZG8sIGVsIGNvbmp1bnRvIGRlIGRhdG9zIGRlIHRyYWJham8gdGVuZHLDoSBhcG95byBkZXNjcmlwdGl2byBncsOhZmljbyBhIHRyYXbDqXMgZGUgdHJlcyBkaWFncmFtYXM6IHVuIGNvbmp1bnRvIHF1ZSBpbnRlZ3JhIGRpc3BlcnNpw7NuLCBkaXN0cmlidWNpw7NuIHkgY29ycmVsYWNpb25lczsgb3RybyBiYXNhZG8gZW4gbGEgcmVuZGVyaXphY2nDs24gZGUgcG9sw61nb25vczsgeSwgcG9yIMO6bHRpbW8sIHVubyBxdWUgcmVjdXJyZSBhIGxhcyBjYXJhcyBkZSBDaGVybm9mZi4NCg0KQ29uIGJhc2UgZW4gZWwgY29uanVudG8gZGUgZGF0b3MgZGVzY3JpdG8gZW4gbGEgc2VjY2nDs24gMS4yIHNlIGNhbGN1bGFyw6FuIGUgaW50ZXByZXRhcsOhbiwgcGFyYSBsYXMgdmFyaWFibGVzIG51bcOpcmljYXMsIGxhcyBncsOhZmljYXMgbXVsdGl2YXJpYWRhcyBkZSBkaWFncmFtYSBkZSBjb3JyZWxhY2lvbmVzLCBtYXRyaXogZGUgZGlhZ3JhbWEgZGUgZGlzcGVyc2nDs24sIGRpYWdyYW1hIGRlIGVzdHJlbGxhcyB5IGNhcmFzIGRlIENoZXJub2ZmLiBTZSByZWN1ZXJkYSBxdWUgbGFzIHZhcmlhYmxlcyBudW3DqXJpY2FzIChlbiBlc2NhbGFkYSBkZSBtZWRpY2nDs24gZGUgcmF6w7NuKSBzb246IEFnZSwgWWVhcnNfb2ZfZXhwZXJpZW5jZSwgSG91cnNfd29ya2VkX3Blcl93ZWVrLCBOdW1iZXJfb2ZfdmlydHVhbF9tZWV0aW5ncy4NCg0KIyMjIyBEaWFncmFtYSBDb25qdXRvIGRlIERpc3BlcnNpw7NuLCBEaXN0cmlidWNpw7NuIHkgQ29ycmVsYWNpb25lcw0KYGBge3IgRGlhZ3JhbWFfQ29uanVudG9fZGVfRGlzcGVyc2nDs25fRGlzdHJpYnVjacOzbl95X0NvcnJlbGFjaW9uZXNfMSwgZmlnLmFsaWduPSdjZW50ZXInfQ0Kc2V0LnNlZWQoNzgwNzI4KQ0KY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9tdWVzdHJlYWRvID0gY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkb1tzYW1wbGUoMTpucm93KGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG8pLDQwMCksLWMoMSwzLDQsNiw5LDEwLDExKV0NCmdncGFpcnMoY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9tdWVzdHJlYWRvKQ0KDQoNCmBgYA0KDQojIyMjIERpYWdyYW1hIGRlIGVzdHJlbGxhcw0KYGBge3IgRGlhZ3JhbWFfZGVfZXN0cmVsbGFzLCBmaWcuYWxpZ249J2NlbnRlcid9DQpzZXQuc2VlZCg3ODA3MjApDQpjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX211ZXN0cmVhZG8gPSBjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvW3NhbXBsZSgxOm5yb3coY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkbyksMjApLC1jKDEsMyw0LDYsOSwxMCwxMSldDQpzdGFycyhjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX211ZXN0cmVhZG8sIGxlbiA9IDAuNSwgY2V4ID0gMC41LCBrZXkubG9jID0gYygzLDQsNSw2KSwgZHJhdy5zZWdtZW50cyA9IFRSVUUpDQoNCg0KYGBgDQoNCiMjIyMgQ2FyYXMgZGUgQ2hlcm5vZmYNCmBgYHtyIENhcmFzX2RlX0NoZXJub2ZmLCBmaWcuYWxpZ249J2NlbnRlcid9DQpzZXQuc2VlZCg3ODA3MjgpDQpjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX211ZXN0cmVhZG8gPSBjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvW3NhbXBsZSgxOm5yb3coY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkbyksMjMpLC1jKDEsMyw0LDYsOSwxMCwxMSldDQpmYWNlcyhjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX211ZXN0cmVhZG8pDQoNCg0KYGBgDQoNCiMjIyAqKjEuNSBub3JtYWxpZGFkIG11bHRpdmFyaWFkYSoqIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQpFbiBlbCBhbsOhbGlzaXMgZGUgZGF0b3MgbXVsdGl2YXJpYWRvcyByZWxhY2lvbmFkb3MgY29uIGVsIGltcGFjdG8gZGVsIHRyYWJham8gcmVtb3RvIHkgbGEgc2FsdWQgbWVudGFsLCBlcyBmdW5kYW1lbnRhbCBldmFsdWFyIGxhIG5vcm1hbGlkYWQgZGUgbGFzIHZhcmlhYmxlcyBwYXJhIGdhcmFudGl6YXIgbGEgdmFsaWRleiBkZSBsb3MgbW9kZWxvcyBlc3RhZMOtc3RpY29zIHF1ZSBzZSBhcGxpY2Fyw6FuLiBFbiBlc3RlIGVzdHVkaW8sIHNlIGRpc3BvbmUgZGUgdW4gY29uanVudG8gZGUgZGF0b3MgY29uIGFwcm94aW1hZGFtZW50ZSA1LDAwMCByZWdpc3Ryb3MsIGluY2x1eWVuZG8gdmFyaWFibGVzIHRhbnRvIGN1YWxpdGF0aXZhcyBjb21vIGN1YW50aXRhdGl2YXMuIFNlIGxsZXZhcsOhbiBhIGNhYm8gZGlmZXJlbnRlcyBwcnVlYmFzIGRlIG5vcm1hbGlkYWQgbXVsdGl2YXJpYWRhLCB0YWxlcyBjb21vIGxhcyBwcnVlYmFzIGRlIE1hcmRpYSwgSGVuemUtWmlya2xlciwgRG9vcm5pay1IYW5zZW4geSBSb3lzdG9uLCBjb24gZWwgZmluIGRlIGRldGVybWluYXIgc2kgbGFzIHZhcmlhYmxlcyBjdWFudGl0YXRpdmFzIHNpZ3VlbiB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwgbXVsdGl2YXJpYWRhLCBsbyBjdWFsIGVzIGNydWNpYWwgcGFyYSBsYSBhcGxpY2FjacOzbiBkZSB0w6ljbmljYXMgZXN0YWTDrXN0aWNhcyBhdmFuemFkYXMuDQoNCkVuIGVsIGRlc2Fycm9sbG8gZGUgbGFzIHBydWViYXMgZGUgbm9ybWFsaWRhZCBtdWx0aXZhcmlhZGEsIHNlIGhhbiBjb25zaWRlcmFkbyBjdWF0cm8gdmFyaWFibGVzIGN1YW50aXRhdGl2YXM6IEFnZSwgWWVhcnNfb2ZfZXhwZXJpZW5jZSwgSG91cnNfd29ya2VkX3Blcl93ZWVrIHkgTnVtYmVyX29mX3ZpcnR1YWxfbWVldGluZ3MuIExhcyBwcnVlYmFzIHNlIHJlYWxpemFyb24gdGFudG8gZW4gZWwgY29uanVudG8gY29tcGxldG8gZGUgZGF0b3MgY29tbyBlbiB1biBzdWJjb25qdW50byBkZSA0MDAgb2JzZXJ2YWNpb25lcyBwYXJhIGV2YWx1YXIgcG9zaWJsZXMgZGlmZXJlbmNpYXMgZW4gbGEgZGlzdHJpYnVjacOzbi4gTGFzIHBydWViYXMgYXBsaWNhZGFzLCBjb21vIE1hcmRpYSwgSGVuemUtWmlya2xlciwgRG9vcm5pay1IYW5zZW4geSBSb3lzdG9uLCBoYW4gcGVybWl0aWRvIGV4YW1pbmFyIGRpc3RpbnRvcyBhc3BlY3RvcyBkZSBsYSBub3JtYWxpZGFkLCBpbmNsdXllbmRvIGxhIGFzaW1ldHLDrWEgeSBsYSBjdXJ0b3NpcyBkZSBsYXMgZGlzdHJpYnVjaW9uZXMuIExvcyByZXN1bHRhZG9zIG11ZXN0cmFuIHBhcsOhbWV0cm9zIGRlc2NyaXB0aXZvcyBjb21vIGxhIG1lZGlhLCBkZXN2aWFjacOzbiBlc3TDoW5kYXIsIG1lZGlhbmEsIHkgYXNpbWV0csOtYSBkZSBjYWRhIHZhcmlhYmxlLCBvZnJlY2llbmRvIHVuYSB2aXNpw7NuIGRldGFsbGFkYSBzb2JyZSBlbCBjb21wb3J0YW1pZW50byBkZSBsb3MgZGF0b3MgeSBzdSBhZGhlcmVuY2lhIGEgbG9zIHN1cHVlc3RvcyBkZSBub3JtYWxpZGFkLg0KDQpMb3MgYW7DoWxpc2lzIHJlYWxpemFkb3MgcmV2ZWxhbiBxdWUsIGF1bnF1ZSBhbGd1bmFzIGRlIGxhcyB2YXJpYWJsZXMgcHJlc2VudGFuIGRlc3ZpYWNpb25lcyByZXNwZWN0byBhIGxhIG5vcm1hbGlkYWQgaWRlYWwsIGxhcyBwcnVlYmFzIHN1Z2llcmVuIGNvbXBvcnRhbWllbnRvcyBkaXN0aW50b3MgZGVwZW5kaWVuZG8gZGUgbGEgbXVlc3RyYSBhbmFsaXphZGEuIExhIGZhbHRhIGRlIG5vcm1hbGlkYWQgZW4gYWxndW5vcyBjYXNvcyBzdWdpZXJlIGxhIG5lY2VzaWRhZCBkZSBhcGxpY2FyIHRyYW5zZm9ybWFjaW9uZXMgYSBsb3MgZGF0b3MgbyBjb25zaWRlcmFyIG3DqXRvZG9zIGVzdGFkw61zdGljb3Mgcm9idXN0b3MgcXVlIG5vIGFzdW1hbiBub3JtYWxpZGFkIG11bHRpdmFyaWFkYS4gRXN0b3MgaGFsbGF6Z29zIHNvbiBlc2VuY2lhbGVzIHBhcmEgZ3VpYXIgZWwgYW7DoWxpc2lzIHBvc3RlcmlvciwgY29tbyBsYSBhcGxpY2FjacOzbiBkZSB0w6ljbmljYXMgbXVsdGl2YXJpYWRhcywgYXNlZ3VyYW5kbyBxdWUgbG9zIHN1cHVlc3RvcyBlc3RhZMOtc3RpY29zIHNlYW4gYWRlY3VhZG9zIHBhcmEgb2J0ZW5lciBjb25jbHVzaW9uZXMgdsOhbGlkYXMgeSBjb25maWFibGVzIGVuIGVsIGNvbnRleHRvIGRlbCBlc3R1ZGlvIGRlIGxhIHRyYWJham8gcmVtb3RvIHkgbGEgc2FsdWQgbWVudGFsLg0KDQojIyMjIFBOTSBNYXJkaWENCmBgYHtyIFBOTV9NYXJkaWEsIGZpZy5hbGlnbj0nY2VudGVyJ30NCm12bihjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvWywtYygxLDMsNCw2LDksMTAsMTEpXSwgbXZuVGVzdD0ibWFyZGlhIikNCmBgYA0KDQojIyMjIFBOTSBIZW56ZS1aaXJrbGVyDQpgYGB7ciBQTk1fSGVuemUtWmlya2xlciwgZmlnLmFsaWduPSdjZW50ZXInfQ0KbXZuKGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG9bLC1jKDEsMyw0LDYsOSwxMCwxMSldLCBtdm5UZXN0PSJoeiIpDQpgYGANCg0KIyMjIyBQTk0gRG9vcm5pay1IYW5zZW4NCmBgYHtyIFBOTV9Eb29ybmlrLUhhbnNlbiwgZmlnLmFsaWduPSdjZW50ZXInfQ0KbXZuKGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG9bLC1jKDEsMyw0LDYsOSwxMCwxMSldLCBtdm5UZXN0PSJkaCIpDQoNCmBgYA0KDQojIyMjIFBOTSBSb3lzdG9uDQpgYGB7ciBQTk1fUm95c3RvbiwgZmlnLmFsaWduPSdjZW50ZXInfQ0Kc3Vic2V0X2RhdGEgPC0gY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkb1tzYW1wbGUobnJvdyhjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvKSwgNDAwKSwgLWMoMSwzLDQsNiw5LDEwLDExKV0NCm12bihzdWJzZXRfZGF0YSwgbXZuVGVzdD0icm95c3RvbiIpDQoNCg0KYGBgDQoNCg0KIyMgKipGYXNlIDIgW2NvbXBvbmVudGVzIHByaW5jaXBhbGVzXSoqDQoNCiMjIyAqKjIuMSBvYmpldGl2b3MqKg0KRWwgb2JqZXRpdm8gcHJpbmNpcGFsIGRlIGVzdGEgZmFzZSBlcyBkZXNjb21wb25lciBsYXMgcmVsYWNpb25lcyBlbnRyZSBtw7psdGlwbGVzIHZhcmlhYmxlcyBhIHRyYXbDqXMgZGVsIGFuw6FsaXNpcyBkZSBDb21wb25lbnRlcyBQcmluY2lwYWxlcyAoQUNQKS4gRXN0byBwZXJtaXRpcsOhIGlkZW50aWZpY2FyIGxhcyBkaW1lbnNpb25lcyBjbGF2ZSBxdWUgZXhwbGljYW4gbGEgbWF5b3IgcGFydGUgZGUgbGEgdmFyaWFiaWxpZGFkIGRlIGxvcyBkYXRvcywgc2ltcGxpZmljYW5kbyBzdSBpbnRlcnByZXRhY2nDs24gc2luIHBlcmRlciBpbmZvcm1hY2nDs24gc2lnbmlmaWNhdGl2YS4NCg0KRWwgYW7DoWxpc2lzIGRlIENvbXBvbmVudGVzIFByaW5jaXBhbGVzIHV0aWxpemEgdHJhbnNmb3JtYWNpb25lcyBtYXRlbcOhdGljYXMgcGFyYSBjb252ZXJ0aXIgdmFyaWFibGVzIG9yaWdpbmFsZXMgY29ycmVsYWNpb25hZGFzIGVuIG51ZXZhcyB2YXJpYWJsZXMgaW5kZXBlbmRpZW50ZXMgKGNvbXBvbmVudGVzIHByaW5jaXBhbGVzKS4gRXN0YXMgbnVldmFzIGRpbWVuc2lvbmVzIGZhY2lsaXRhbiBsYSB2aXN1YWxpemFjacOzbiB5IGVsIGFuw6FsaXNpcyBkZSBncmFuZGVzIGNvbmp1bnRvcyBkZSBkYXRvcywgYWwgdGllbXBvIHF1ZSBtYXhpbWl6YW4gbGEgdmFyaWFuemEgZXhwbGljYWRhIHBvciBjYWRhIGNvbXBvbmVudGUuIEVuIGVzdGEgc2VjY2nDs24sIHNlIGFib3JkYXLDoSBsYSBzZWxlY2Npw7NuIGRlIGNvbXBvbmVudGVzLCBsYSBldmFsdWFjacOzbiBkZSBzdSBjYWxpZGFkLCB5IHN1IGludGVycHJldGFjacOzbiBhIHRyYXbDqXMgZGUgZ3LDoWZpY29zIGNvbW8gYmlwbG90cyB5IGPDrXJjdWxvcyBkZSBjb3JyZWxhY2lvbmVzLg0KDQojIyMgKioyLjIgc2VsZWNjacOzbiBkZSBjb21wb25lbnRlcyoqIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNClNlIGFuYWxpemEgZGF0b3Mgc29icmUgZWwgdHJhYmFqbyByZW1vdG8geSBsYSBzYWx1ZCBtZW50YWwgdXRpbGl6YW5kbyB1bmEgdMOpY25pY2EgbGxhbWFkYSBBbsOhbGlzaXMgZGUgQ29tcG9uZW50ZXMgUHJpbmNpcGFsZXMgKEFDUCkuIEVzdGEgdMOpY25pY2Egbm9zIGF5dWRhIGEgc2ltcGxpZmljYXIgbGEgaW5mb3JtYWNpw7NuIGFsIHJlZHVjaXIgZWwgbsO6bWVybyBkZSB2YXJpYWJsZXMgcXVlIGVzdGFtb3MgZXN0dWRpYW5kby4gRW4gbHVnYXIgZGUgbWlyYXIgbXVjaGFzIHZhcmlhYmxlcyBhbCBtaXNtbyB0aWVtcG8sIGVsIEFDUCBub3MgcGVybWl0ZSBjb25jZW50cmFybm9zIGVuIGxhcyBtw6FzIGltcG9ydGFudGVzIHF1ZSBleHBsaWNhbiBtZWpvciBsYSB2YXJpYWNpw7NuIGVuIGxvcyBkYXRvcy4gQXPDrSwgcG9kZW1vcyBlbnRlbmRlciBtZWpvciBjw7NtbyBzZSByZWxhY2lvbmFuIGZhY3RvcmVzIGNvbW8gbGEgZWRhZCwgbG9zIGHDsW9zIGRlIGV4cGVyaWVuY2lhIHkgbGEgaG9yYXMgdHJhYmFqYWRhcyBhIGxhIHNlbWFuYSBjb24gZWwgdHJhYmFqbyByZW1vdG8geSBsYSBzYWx1ZCBtZW50YWwuDQoNCg0KRWwgY8OzZGlnbyBxdWUgZXN0YW1vcyBhbmFsaXphbmRvIHV0aWxpemEgZWwgQUNQIHBhcmEgZXN0dWRpYXIgbG9zIGRhdG9zLiBQcmltZXJvLCBjYWxjdWxhIGPDs21vIHNlIHJlbGFjaW9uYW4gZW50cmUgc8OtIGxhcyBkaWZlcmVudGVzIHZhcmlhYmxlcy4gTHVlZ28sIGV4dHJhZSBpbmZvcm1hY2nDs24gc29icmUgY3XDoWxlcyBzb24gbGFzIHZhcmlhYmxlcyBtw6FzIGltcG9ydGFudGVzIHF1ZSBpbmZsdXllbiBlbiBsb3MgcmVzdWx0YWRvcy4gU2UgY3JlYW4gZ3LDoWZpY29zIHF1ZSBub3MgYXl1ZGFuIGEgZGVjaWRpciBjdcOhbnRhcyBkZSBlc3RhcyBudWV2YXMgdmFyaWFibGVzIGRlYmVtb3MgY29uc2VydmFyIHBhcmEgaGFjZXIgdW4gYW7DoWxpc2lzIG3DoXMgY2xhcm8uIFRhbWJpw6luIHNlIGFuYWxpemEgcXXDqSB0YW4gYmllbiBlc3RhcyBudWV2YXMgdmFyaWFibGVzIHJlcHJlc2VudGFuIGxvcyBkYXRvcyBvcmlnaW5hbGVzLCBhc2VndXJhbmRvIHF1ZSBubyBwZXJkYW1vcyBpbmZvcm1hY2nDs24gaW1wb3J0YW50ZSBhbCBzaW1wbGlmaWNhci4NCg0KDQpFbCB1c28gZGVsIEFuw6FsaXNpcyBkZSBDb21wb25lbnRlcyBQcmluY2lwYWxlcyBlbiBudWVzdHJvIGVzdHVkaW8gc29icmUgZWwgdHJhYmFqbyByZW1vdG8geSBsYSBzYWx1ZCBtZW50YWwgbm9zIGhhIHBlcm1pdGlkbyBpZGVudGlmaWNhciBjdcOhbGVzIHNvbiBsYXMgcmVsYWNpb25lcyBtw6FzIHJlbGV2YW50ZXMgZW50cmUgbGFzIHZhcmlhYmxlcy4gR3JhY2lhcyBhIGxvcyBncsOhZmljb3MgcXVlIGhlbW9zIGNyZWFkbywgcG9kZW1vcyB2ZXIgY3XDoW50YXMgZGUgZXN0YXMgbnVldmFzIHZhcmlhYmxlcyBzb24gbmVjZXNhcmlhcyBwYXJhIGVudGVuZGVyIGxvcyBkYXRvcy4gDQoNCiMjIyMgTWF0cml6IEFDUA0KYGBge3IgTWF0cml6X0FDUCwgZmlnLmFsaWduPSdjZW50ZXInfQ0KZ2V0X2VpZ2VudmFsdWUoUENBKGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG9bLC1jKDEsMyw0LDYsOSwxMCwxMSldLCBuY3AgPSA2LCBzY2FsZS51bml0ID0gVFJVRSwgZ3JhcGggPSBGKSkNCg0KYGBgDQoNCiMjIyMgTWF0cml6IGRlIENvcnJlbGFjaW9uZXMNCmBgYHtyIE1hdHJpel9kZV9jb3JyZWxhY2lvbmVzLCBmaWcuYWxpZ249J2NlbnRlcid9DQpyb3VuZChjb3IoY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkbyBbLC1jKDEsMyw0LDYsOSwxMCwxMSldKSwyKQ0KYGBgDQoNCiMjIyMgVmFsb3JlcyB5IFZlY3RvcmVzIFByb3Bpb3MNCmBgYHtyIFZhbG9yZXNfeV9WZWN0b3Jlc19Qcm9waW9zLCBmaWcuYWxpZ249J2NlbnRlcid9DQpwcmluY29tcChjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvIFssLWMoMSwzLDQsNiw5LDEwLDExKV0sIGNvciA9IFRSVUUpJHNkZXZeMg0KDQpwcmluY29tcChjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvIFssLWMoMSwzLDQsNiw5LDEwLDExKV0sIGNvciA9IFRSVUUpJGxvYWRpbmdzWyAsMTo0XQ0KDQpgYGANCg0KIyMjIyBDb3JyZWxhY2lvbmVzIENvbXBhcmFkYXMNCmBgYHtyIENvcnJlbGFjaW9uZXNfQ29tcGFyYWRhcywgZmlnLmFsaWduPSdjZW50ZXInfQ0KcGFyKG1mcm93PWMoMSwyKSkNCmNvcnJwbG90Ojpjb3JycGxvdChjb3IoY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkb1ssLWMoMSwzLDQsNiw5LDEwLDExKV0pLCBtZXRob2QgPSAiY29sb3IiLCB0eXBlID0gInVwcGVyIiwgbnVtYmVyLmNleCA9IDAuNCkNCmNvcnJwbG90Ojpjb3JycGxvdChjb3IocHJpbmNvbXAoY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkb1ssLWMoMSwzLDQsNiw5LDEwLDExKV0sIGNvciA9IFRSVUUpJHNjb3JlcyksIG1ldGhvZCA9ICJjb2xvciIsIHR5cGUgPSAidXBwZXIiLCBudW1iZXIuY2V4ID0gMC40KQ0KYGBgDQoNCg0KIyMjIyBHcsOhZmljbyBkZSBDYXRlbGwNCmBgYHtyIEdyYWZpY29fZGVfQ2F0ZWxsLCBmaWcuYWxpZ249J2NlbnRlcid9DQpmdml6X2VpZyhQQ0EoY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkb1ssLWMoMSwzLDQsNiw5LDEwLDExKV0sIHNjYWxlLnVuaXQgPSBULCBncmFwaCA9IEYpLCBhZGRsYWJlbHMgPSBULCB5bGltPWMoMCw5MCksIG1haW4gPSAiIikNCg0KYGBgDQoNCiMjIyMgR3LDoWZpY28gZGUgQ2F0ZWxsLUthaXNlcg0KYGBge3IgR3JhZmljb19kZV9DYXRlbGwtS2Fpc2VyLCBmaWcuYWxpZ249J2NlbnRlcid9DQpzY3JlZShjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvWywtYygxLDMsNCw2LDksMTAsMTEpXSxmYWN0b3JzID0gRkFMU0UsIHBjID0gVFJVRSwgbWFpbiA9IiIpDQoNCmBgYA0KDQojIyMgKioyLjMgY2FsaWRhZCBkZSByZXByZXNlbnRhY2lvbioqIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNClNlIGV4cGxvcmEgbGFzIHJlbGFjaW9uZXMgZW50cmUgZGlmZXJlbnRlcyB2YXJpYWJsZXMgcmVsYWNpb25hZGFzIGNvbiBsYSBTZSBleHBsb3JhIGxhcyByZWxhY2lvbmVzIGVudHJlIGRpZmVyZW50ZXMgdmFyaWFibGVzIHJlbGFjaW9uYWRhcyBjb24gZWwgdHJhYmFqbyByZW1vdG8geSBsYSBzYWx1ZCBtZW50YWwsIGNvbW8gbGFzIGFudGVyaW9ybWVudGUgbWVuY2lvbmFkYXMuIExvcyBjw7NkaWdvcyBpbXBsZW1lbnRhZG9zIHV0aWxpemFuIGxhIGxpYnJlcsOtYSBmYWN0b01pbmVyIHBhcmEgcmVhbGl6YXIgZWwgUENBIHkgdmlzdWFsaXphciBsb3MgcmVzdWx0YWRvcyBtZWRpYW50ZSBncsOhZmljb3MgZGUgY8OtcmN1bG8gZGUgY29ycmVsYWNpb25lcyB5IG1hdHJpY2VzIGRlIHJlcHJlc2VudGFjacOzbi4gRXN0ZSBhbsOhbGlzaXMgcGVybWl0aXLDoSBpZGVudGlmaWNhciBsYXMgdmFyaWFibGVzIHF1ZSBjb250cmlidXllbiBtw6FzIGEgbGEgdmFyaWFiaWxpZGFkIGRlIGxvcyBkYXRvcyB5IGRlc2N1YnJpciBwb3RlbmNpYWxlcyBwYXRyb25lcyBvIGFzb2NpYWNpb25lcyBlbnRyZSBlbGxhcy4gU2UgZXNwZXJhIHF1ZSBlc3RlIGFuw6FsaXNpcyBwcm9wb3JjaW9uZSBpbmZvcm1hY2nDs24gcmVsZXZhbnRlIHBhcmEgdW5hIG1lam9yIGNvbXByZW5zacOzbiBkZSBsb3MgZmFjdG9yZXMgcmVsYWNpb25hZG9zIGNvbiBlbCB0cmFiYWpvIHJlbW90byB5IGxhIHNhbHVkIG1lbnRhbC4NCg0KUHJpbWVybywgc2UgZ2VuZXJhIHVuIGPDrXJjdWxvIGRlIGNvcnJlbGFjaW9uZXMgcXVlIG11ZXN0cmEgbGEgY29ycmVsYWNpw7NuIGVudHJlIGxhcyB2YXJpYWJsZXMgeSBsb3MgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMuIExhcyB2YXJpYWJsZXMgY29uIHZlY3RvcmVzIGxhcmdvcyB5IGNlcmNhbm9zIGFsIGPDrXJjdWxvIHRpZW5lbiB1bmEgYWx0YSBjb3JyZWxhY2nDs24gY29uIGxvcyBjb21wb25lbnRlcyBwcmluY2lwYWxlcy4gTG9zIGdyw6FmaWNvcyBtdWVzdHJhbiBsYSByZWxhY2nDs24gZW50cmUgbGFzIHZhcmlhYmxlcywgcGVybWl0aWVuZG8gaWRlbnRpZmljYXIgYXF1ZWxsYXMgcXVlIGNvbnRyaWJ1eWVuIG3DoXMgYSBsYSB2YXJpYW56YSBleHBsaWNhZGEgcG9yIGVsIFBDQS4gTHVlZ28sIHNlIGNhbGN1bGEgdW5hIG1hdHJpeiBkZSByZXByZXNlbnRhY2nDs24gcXVlIG11ZXN0cmEgbGFzIGNvb3JkZW5hZGFzIGRlIGxhcyB2YXJpYWJsZXMgZW4gZWwgZXNwYWNpbyBkZSBsb3MgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMuIEVzdGEgbWF0cml6IHByb3BvcmNpb25hIGluZm9ybWFjacOzbiBjdWFudGl0YXRpdmEgc29icmUgbGEgY29udHJpYnVjacOzbiBkZSBjYWRhIHZhcmlhYmxlIGEgY2FkYSBjb21wb25lbnRlIHByaW5jaXBhbC4gRmluYWxtZW50ZSwgc2UgdmlzdWFsaXphIHVuYSByZXByZXNlbnRhY2nDs24gZ3LDoWZpY2EgZGUgbGFzIHZhcmlhYmxlcyBjb24gdW4gY8OzZGlnbyBkZSBjb2xvciBxdWUgcmVmbGVqYSBlbCB2YWxvciBkZWwgY29zZW5vIGFsIGN1YWRyYWRvLCBpbmRpY2FuZG8gbGEgY2FsaWRhZCBkZSByZXByZXNlbnRhY2nDs24gZGUgY2FkYSB2YXJpYWJsZS4gRXN0b3MgYW7DoWxpc2lzIGdyw6FmaWNvcyB5IG51bcOpcmljb3MgYXl1ZGFuIGEgY29tcHJlbmRlciBsYSBlc3RydWN0dXJhIGRlIGxvcyBkYXRvcyB5IGxhcyByZWxhY2lvbmVzIGVudHJlIGxhcyB2YXJpYWJsZXMuDQoNCkxvcyBncsOhZmljb3MgeSBtYXRyaWNlcyBnZW5lcmFkb3MgcGVybWl0ZW4gaWRlbnRpZmljYXIgbGFzIHZhcmlhYmxlcyBtw6FzIGluZmx1eWVudGVzIGVuIGxhIHZhcmlhYmlsaWRhZCBkZSBsb3MgZGF0b3MsIG1vc3RyYW5kbywgcG9yIGVqZW1wbG8sIGxhcyBjb3JyZWxhY2lvbmVzIGVudHJlIGxhIGVkYWQgeSBvdHJvcyBmYWN0b3JlcyBpbXBvcnRhbnRlcyBjb21vIGxvcyBsYXMgaG9yYXMgdHJhYmFqYWRhcyBhIGxhIHNlbWFuYSAgeSBsb3MgYcOxb3MgZGUgZXhwZXJpZW5jaWEuIExhIGNhbGlkYWQgZGUgcmVwcmVzZW50YWNpw7NuIHBlcm1pdGUgZXZhbHVhciBsYSBzaWduaWZpY2FuY2lhIGRlIGxhcyB2YXJpYWJsZXMgZW4gZXN0ZSBtb2RlbG8gcmVkdWNpZG8uIEVsIGFuw6FsaXNpcyBmYWNpbGl0YSBsYSBpbnRlcnByZXRhY2nDs24gZGUgbGFzIHJlbGFjaW9uZXMgY29tcGxlamFzIGVudHJlIG3Dumx0aXBsZXMgdmFyaWFibGVzLCBmYWNpbGl0YW5kbyBsYSBjb21wcmVuc2nDs24gZGUgbG9zIGZhY3RvcmVzIHF1ZSBjb250cmlidXllbiBhbCB0cmFiYWpvIHJlbW90byB5IGF5dWRhbmRvIGEgaWRlbnRpZmljYXIgw6FyZWFzIGNsYXZlIHBhcmEgZnV0dXJhcyBpbnZlc3RpZ2FjaW9uZXMgZW4gc2FsdWQgbWVudGFsLnBvciBtZWRpbyBkZSB2YXJpYWJsZXMgY2xhdmVzIGNvbW8gbGEgZWRhZCwgYcOxb3MgZGUgZXhwZXJpZW5jaWEsIGhvcmFzIHRyYWJhamFkYXMgYSBsYSBzZW1hbmEgeSBlbCBudW1lcm8gZGUgc2VzaW9uZXMgdmlydHVhbGVzLiBMb3MgY8OzZGlnb3MgaW1wbGVtZW50YWRvcyB1dGlsaXphbiBsYSBsaWJyZXLDrWEgZmFjdG9NaW5lciBwYXJhIHJlYWxpemFyIGVsIFBDQSB5IHZpc3VhbGl6YXIgbG9zIHJlc3VsdGFkb3MgbWVkaWFudGUgZ3LDoWZpY29zIGRlIGPDrXJjdWxvIGRlIGNvcnJlbGFjaW9uZXMgeSBtYXRyaWNlcyBkZSByZXByZXNlbnRhY2nDs24uIEVzdGUgYW7DoWxpc2lzIHBlcm1pdGlyw6EgaWRlbnRpZmljYXIgbGFzIHZhcmlhYmxlcyBxdWUgY29udHJpYnV5ZW4gbcOhcyBhIGxhIHZhcmlhYmlsaWRhZCBkZSBsb3MgZGF0b3MgeSBkZXNjdWJyaXIgcG90ZW5jaWFsZXMgcGF0cm9uZXMgbyBhc29jaWFjaW9uZXMgZW50cmUgZWxsYXMuIA0KDQojIyMjIENpcmN1bG8gZGUgQ29ycmVsYWNpb25lcw0KYGBge3IgQ2lyY3Vsb19kZV9Db3JyZWxhY2lvbmVzLCBmaWcuYWxpZ249J2NlbnRlcid9DQpmdml6X3BjYV92YXIoUENBKGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG9bLC1jKDEsMyw0LDYsOSwxMCwxMSldLCBzY2FsZS51bml0ID0gVCwgZ3JhcGggPSBGKSxjb2wudmFyPSIjM0I4M0JEIiwgcmVwZWwgPSBULCBjb2wuY2lyY2xlID0gIiNDRENEQ0QiLCBnZ3RoZW1lID0gdGhlbWVfYncoKSkNCg0KYGBgDQoNCiMjIyMgTWF0cml6IGRlIFJlcHJlc2VudGFjacOzbg0KYGBge3IgTWF0cml6X2RlX1JlcHJlc2VudGFjaW9uLCBmaWcuYWxpZ249J2NlbnRlcid9DQooZ2V0X3BjYV92YXIoUENBKGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG9bLC1jKDEsMyw0LDYsOSwxMCwxMSldLCBuY3AgPSA2LCBzY2FsZS51bml0ID0gVFJVRSwgZ3JhcGggPSBGKSkpJGNvczINCg0KDQpgYGANCg0KIyMjIyBDYWxpZGFkIGRlIFJlcHJlc2VudGFjacOzbg0KYGBge3IgQ2FsaWRhZF9kZV9SZXByZXNlbnRhY2lvbiwgZmlnLmFsaWduPSdjZW50ZXInfQ0KZnZpel9wY2FfdmFyKFBDQShjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvWywtYygxLDMsNCw2LDksMTAsMTEpXSwgbmNwID0gNiwgc2NhbGUudW5pdCA9IFRSVUUsIGdyYXBoID0gRiksIGNvbC52YXI9ImNvczIiLCBncmFkaWVudC5jb2xzPWMoIiMwMEFGQkIiLCIjRTdCODAwIiwiI0ZDNEUwNyIpLCByZXBlbCA9IFRSVUUpDQoNCmBgYA0KDQojIyMjIENvb3JkZW5hZGFzIEluZGl2aWR1YWxlcw0KYGBge3IgQ29vcmRlbmFkYXNfSW5kaXZpZHVhbGVzLCBmaWcuYWxpZ249J2NlbnRlcid9DQpoZWFkKChQQ0EoY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkb1ssLWMoMSwzLDQsNiw5LDEwLDExKV0sIG5jcCA9IDYsIHNjYWxlLnVuaXQgPSBUUlVFLCBncmFwaCA9IEYpKSRpbmQkY29vcmQsIG4gPSAyM0wpDQoNCmBgYA0KDQojIyMgKioyLjQgY29udHJpYnVjaW9uZXMqKiB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQpTZSBhbmFsaXphIHVuIGNvbmp1bnRvIGRlIGRhdG9zIHJlbGFjaW9uYWRvcyBjb24gZWwgdHJhYmFqbyByZW1vdG8geSBsYSBzYWx1ZCBtZW50YWwgdXRpbGl6YW5kbyBlbCBBbsOhbGlzaXMgZGUgQ29tcG9uZW50ZXMgUHJpbmNpcGFsZXMgKFBDQSkgY29tbyB0w6ljbmljYSBkZSByZWR1Y2Npw7NuIGRlIGRpbWVuc2lvbmFsaWRhZC4gRWwgUENBIHBlcm1pdGUgaWRlbnRpZmljYXIgbGFzIHZhcmlhYmxlcyBxdWUgbcOhcyBjb250cmlidXllbiBhIGxhIHZhcmlhbnphIGVuIGxvcyBkYXRvcywgc2ltcGxpZmljYW5kbyBzdSBpbnRlcnByZXRhY2nDs24geSBmYWNpbGl0YW5kbyBsYSBpZGVudGlmaWNhY2nDs24gZGUgcGF0cm9uZXMuIEVuIGVzdGEgc2VjY2nDs24sIG5vcyBjZW50cmFyZW1vcyBlbiBsYSB2aXN1YWxpemFjacOzbiBlIGludGVycHJldGFjacOzbiBkZSBsYXMgY29udHJpYnVjaW9uZXMgZGUgY2FkYSB2YXJpYWJsZSBhIGxvcyBjdWF0cm8gcHJpbWVyb3MgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMsIG9idGVuaWRvcyBtZWRpYW50ZSBlbCBjw7NkaWdvIFIgcHJvcG9yY2lvbmFkby4NCg0KRWwgY8OzZGlnbyBSIGltcGxlbWVudGFkbyByZWFsaXphIHVuIFBDQSBzb2JyZSB1biBzdWJjb25qdW50byBkZSB2YXJpYWJsZXMgZGUgbGEgdGFibGEgZGUgZGF0b3MgIChleGNsdXllbmRvIGxhcyBjb2x1bW5hcyAxLDMsNCw2LDksMTAsMTEpLiBTZSB1dGlsaXphIGxhIGZ1bmNpw7NuIGZ2aXpfY29udHJpYiBkZWwgcGFxdWV0ZSBmYWN0b0V4dHJhIHBhcmEgZ2VuZXJhciBncsOhZmljb3MgZGUgYmFycmFzIHF1ZSBtdWVzdHJhbiBsYSBjb250cmlidWNpw7NuIHBvcmNlbnR1YWwgZGUgY2FkYSB2YXJpYWJsZSBhIGNhZGEgY29tcG9uZW50ZSBwcmluY2lwYWwgKERpbS0xIGEgRGltLTQpLiBFc3RvcyBncsOhZmljb3MgcGVybWl0ZW4gaWRlbnRpZmljYXIgbGFzIHZhcmlhYmxlcyBxdWUgdGllbmVuIG1heW9yIHBlc28gZW4gbGEgZm9ybWFjacOzbiBkZSBjYWRhIGNvbXBvbmVudGUsIGluZGljYW5kbyBzdSBpbXBvcnRhbmNpYSBlbiBsYSBlc3RydWN0dXJhIGRlIGxhIHZhcmlhbnphLiBQb3IgZWplbXBsbywgZW4gZWwgZ3LDoWZpY28gZGUgY29udHJpYnVjaW9uZXMgYSBEaW0tMSwgb2JzZXJ2YW1vcyBxdWUg4oCYeWVhcnNfb2ZfZXhwZXJpZW5jZeKAmSB5IOKAmE51bWJlcl9vZl92aXJ0dWFsX21lZXRpbmdz4oCZIHRpZW5lbiBsYXMgbWF5b3JlcyBjb250cmlidWNpb25lcywgc3VnaXJpZW5kbyB1bmEgZnVlcnRlIGluZmx1ZW5jaWEgZGUgZXN0b3MgZmFjdG9yZXMgZW4gbGEgdmFyaWFuemEgZXhwbGljYWRhIHBvciBlc3RlIHByaW1lciBjb21wb25lbnRlLiBVbiBhbsOhbGlzaXMgc2ltaWxhciBzZSByZWFsaXphIHBhcmEgbG9zIHJlc3RhbnRlcyBjb21wb25lbnRlcywgcmV2ZWxhbmRvIGxhIGluZmx1ZW5jaWEgcmVsYXRpdmEgZGUgbGFzIHZhcmlhYmxlcyBlbiBkaWZlcmVudGVzIGRpbWVuc2lvbmVzIGRlbCBjb25qdW50byBkZSBkYXRvcy4NCg0KU2UgaWRlbnRpZmljYSBsYXMgdmFyaWFibGVzIG3DoXMgaW5mbHV5ZW50ZXMgZW4gY2FkYSBjb21wb25lbnRlLCBsbyBxdWUgZmFjaWxpdGEgbGEgY29tcHJlbnNpw7NuIGRlIGxhcyByZWxhY2lvbmVzIGVudHJlIGxhcyB2YXJpYWJsZXMgeSBwZXJtaXRlIHVuYSBpbnRlcnByZXRhY2nDs24gbcOhcyBzZW5jaWxsYSBkZSBsb3MgZGF0b3MgbXVsdGlkaW1lbnNpb25hbGVzLiBFc3RhIGluZm9ybWFjacOzbiBwdWVkZSBzZXIgdXRpbGl6YWRhIHBhcmEgcG9zdGVyaW9yZXMgYW7DoWxpc2lzLCBtb2RlbG9zIHByZWRpY3Rpdm9zIG8gcGFyYSBsYSB0b21hIGRlIGRlY2lzaW9uZXMgZW4gZWwgY29udGV4dG8gZGVsIHRyYWJham8gcmVtb3RvIHkgbGEgc2FsdWQgbWVudGFsLg0KDQojIyMjIE1hdHJpeiBkZSBDb250cmlidWNpb25lcw0KYGBge3IgTWF0cml6X2RlX0NvbnRyaWJ1Y2lvbmVzLCBmaWcuYWxpZ249J2NlbnRlcid9DQooZ2V0X3BjYV92YXIoUENBKGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG9bLC1jKDEsMyw0LDYsOSwxMCwxMSldLCBuY3AgPSA2LCBzY2FsZS51bml0ID0gVFJVRSwgZ3JhcGggPSBGKSkpJGNvbnRyaWINCg0KDQpgYGANCg0KIyMjIyBDb250cmlidWNpb25lcyBhIEQxDQpgYGB7ciBDb250cmlidWNpb25lc19hX0QxLCBmaWcuYWxpZ249J2NlbnRlcid9DQpmdml6X2NvbnRyaWIoUENBKGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG9bLC1jKDEsMyw0LDYsOSwxMCwxMSldLCBuY3AgPSA0LCBzY2FsZS51bml0ID0gVFJVRSwgZ3JhcGggPSBGKSwgY2hvaWNlID0gInZhciIsIGF4ZXMgPSAxLCB0b3AgPSAxMCkNCg0KDQpgYGANCg0KIyMjIyBDb250cmlidWNpb25lcyBhIEQyDQpgYGB7ciBDb250cmlidWNpb25lc19hX0QyLCBmaWcuYWxpZ249J2NlbnRlcid9DQpmdml6X2NvbnRyaWIoUENBKGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG9bLC1jKDEsMyw0LDYsOSwxMCwxMSldLCBuY3AgPSA0LCBzY2FsZS51bml0ID0gVFJVRSwgZ3JhcGggPSBGKSwgY2hvaWNlID0gInZhciIsIGF4ZXMgPSAyLCB0b3AgPSAxMCkNCg0KDQpgYGANCg0KIyMjIyBDb250cmlidWNpb25lcyBhIEQzDQpgYGB7ciBDb250cmlidWNpb25lc19hX0QzLCBmaWcuYWxpZ249J2NlbnRlcid9DQpmdml6X2NvbnRyaWIoUENBKGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG9bLC1jKDEsMyw0LDYsOSwxMCwxMSldLCBuY3AgPSA2LCBzY2FsZS51bml0ID0gVFJVRSwgZ3JhcGggPSBGKSwgY2hvaWNlID0gInZhciIsIGF4ZXMgPSAzLCB0b3AgPSAxMCkNCg0KYGBgDQoNCiMjIyMgQ29udHJpYnVjaW9uZXMgYSBENA0KYGBge3IgQ29udHJpYnVjaW9uZXNfYV9ENCwgZmlnLmFsaWduPSdjZW50ZXInfQ0KZnZpel9jb250cmliKFBDQShjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvWywtYygxLDMsNCw2LDksMTAsMTEpXSwgbmNwID0gNiwgc2NhbGUudW5pdCA9IFRSVUUsIGdyYXBoID0gRiksIGNob2ljZSA9ICJ2YXIiLCBheGVzID0gNCwgdG9wID0gMTApDQoNCg0KYGBgDQoNCg0KIyMjICoqMi41LiBJbnRlcnByZXRhY2nDs24gKiogey50YWJzZXQgLnRhYnNldC1waWxsc30NCkVsIG9iamV0aXZvIHByaW5jaXBhbCBlcyBkZXRlcm1pbmFyIGxhcyByZWxhY2lvbmVzIGVudHJlIGRpdmVyc2FzIHZhcmlhYmxlcyBsYWJvcmFsZXMsIGNvbW8gbGEgaG9yYXMgdHJhYmFqYWRhcyBhIGxhIHNlbWFuYSB5IGVsIG51bWVybyBkZSBzZXNpb25lcyB2aXJ0dWFsZXMsIHkgb2JzZXJ2YXIgY8OzbW8gc2UgYWdydXBhbiBsb3MgdHJhYmFqYWRvcmVzIHNlZ8O6biBzdSBzZXhvIHkgc3UgZWwgYWNjZXNvIGEgbG9zIHNlcnZpY2lvcyBkZSBzYWx1ZCBtZW50YWwuIEEgdHJhdsOpcyBkZSB2aXN1YWxpemFjaW9uZXMgY29tbyBiaXBsb3RzLCBzZSBidXNjYSBmYWNpbGl0YXIgbGEgY29tcHJlbnNpw7NuIGRlIGxvcyBwYXRyb25lcyBwcmVzZW50ZXMgZW4gbG9zIGRhdG9zLg0KDQpFbCBjw7NkaWdvIGdlbmVyYSB0cmVzIGJpcGxvdHMgdXRpbGl6YW5kbyBlbCBwYXF1ZXRlIGZhY3RvZXh0cmEsIGNhZGEgdW5vIHJlcHJlc2VudGFuZG8gdW4gYW7DoWxpc2lzIFBDQSBzb2JyZSBzdWJjb25qdW50b3MgZmlsdHJhZG9zIHBvciBzZXhvIChtYXNjdWxpbm8vZmVtZW5pbm8pIHkgYWNjZXNvIGEgc2VydmljaW9zIGRlIHNhbHVkIG1lbnRhbCAoc8OtL25vKS4gRW4gY2FkYSBiaXBsb3QsIGxvcyBwdW50b3MgcmVwcmVzZW50YW4gaW5kaXZpZHVvcyB5IGxhcyBmbGVjaGFzIGluZGljYW4gbGFzIHZhcmlhYmxlcy4gTGEgY2VyY2Fuw61hIGVudHJlIGxvcyBwdW50b3Mgc3VnaWVyZSBzaW1pbGl0dWRlcyBlbiBzdXMgcGVyZmlsZXMsIG1pZW50cmFzIHF1ZSBsYSBwcm94aW1pZGFkIGEgbGFzIGZsZWNoYXMgcmVmbGVqYSB1bmEgZnVlcnRlIGNvcnJlbGFjacOzbiBjb24gbGFzIHZhcmlhYmxlcy4gRXN0ZSBlbmZvcXVlIHBlcm1pdGUgdmlzdWFsaXphciBjw7NtbyBsYXMgY2FyYWN0ZXLDrXN0aWNhcyBkZSBsb3MgaG9tYnJlcyB5IG11amVyZXMgZGlmaWVyZW4gZW4gcmVsYWNpw7NuIGNvbiBlbCB0cmFiYWpvIHJlbW90byB5IGxhIHNhbHVkIG1lbnRhbC4NCg0KTG9zIGJpcGxvdHMgcGVybWl0ZW4gaWRlbnRpZmljYXIgcGF0cm9uZXMgc2lnbmlmaWNhdGl2b3MgeSByZWxhY2lvbmVzIGVudHJlIHZhcmlhYmxlcywgbG8gcXVlIGZhY2lsaXRhIHVuYSBjb21wcmVuc2nDs24gbcOhcyBwcm9mdW5kYSBkZSBsb3MgZmFjdG9yZXMgcXVlIGluZmx1eWVuIGVuIGVsIGFjY2VzbyBhIHNlcnZpY2lvcyBkZSBzYWx1ZCBtZW50YWwuIEFkZW3DoXMsIGxhIHNlZ21lbnRhY2nDs24gcG9yIGZpbHRyb3MgYXl1ZGEgYSByZWFsaXphciB1biBhbsOhbGlzaXMgbcOhcyBkZXRhbGxhZG8gZGUgc3ViZ3J1cG9zIGVzcGVjw61maWNvcyBkZW50cm8gZGUgbGEgcG9ibGFjacOzbiBlc3R1ZGlhZGEsIGVucmlxdWVjaWVuZG8gYXPDrSBlbCBjb25vY2ltaWVudG8gc29icmUgZXN0YXMgY29uZGljacOzbmVzIGxhYm9yYWxlcy4NCg0KIyMjIyBCaXBsb3QgZGUgVmFyaWFibGVzIHkgUmVnaXN0cm9zIFtGaWx0cm8gR2VuZGVyXQ0KYGBge3IgQmlwbG90X2RlX1ZhcmlhYmxlc195X1JlZ2lzdHJvc19GaWx0cm9fR2VuZGVyLCBmaWcuYWxpZ249J2NlbnRlcid9DQpzZXQuc2VlZCg3ODA3MjApDQpjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX211ZXN0cmVhZG8gPSBjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvW3NhbXBsZSgxOm5yb3coY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkbyksMTUwKSwtYygxLDQsNiw5LDEwLDExKV0NCmZ2aXpfcGNhX2JpcGxvdChQQ0EoY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9tdWVzdHJlYWRvLCBuY3AgPSA0LCBzY2FsZS51bml0ID0gVFJVRSwgZ3JhcGggPSBGLCBxdWFsaS5zdXAgPSAiR2VuZGVyIiksIGF4ZXMgPSBjKDEsIDIpLCByZXBlbCA9IFRSVUUsIGhhYmlsbGFnZSA9ICJHZW5kZXIiKQ0KDQpgYGANCg0KIyMjIyBCaXBsb3QgZGUgVmFyaWFibGVzIFkgUmVnaXN0cm9zIFtGaWx0cm8gQWNjZXNzIHRvIE1lbnRhbCBIZWFsdGggUmVzb3VyY2VzXQ0KYGBge3IgQmlwbG90X2RlX1ZhcmlhYmxlc19ZX1JlZ2lzdHJvc19GaWx0cm9fQWNjZXNzX3RvX01lbnRhbF9IZWFsdGhfUmVzb3VyY2Vzc30NCnNldC5zZWVkKDc4MDcyMCkNCmNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfbXVlc3RyZWFkbyA9IGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG9bc2FtcGxlKDE6bnJvdyhjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvKSwxNTApLC1jKDEsMyw0LDYsMTAsMTEpXQ0KZnZpel9wY2FfYmlwbG90KFBDQShjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX211ZXN0cmVhZG8sIG5jcCA9IDQsIHNjYWxlLnVuaXQgPSBUUlVFLCBncmFwaCA9IEYsIHF1YWxpLnN1cCA9ICJBY2Nlc3NfdG9fTWVudGFsX0hlYWx0aF9SZXNvdXJjZXMiKSwgYXhlcyA9IGMoMSwgMiksIHJlcGVsID0gVFJVRSwgaGFiaWxsYWdlID0gIkFjY2Vzc190b19NZW50YWxfSGVhbHRoX1Jlc291cmNlcyIpDQpgYGANCg0KIyMjIyBDb29yZGVuYWRhcyBJbmRpdmlkdWFsZXMgW1N1YmNvbmp1bnRvIEZpbHRybyBHZW5kZXJdDQpgYGB7ciBDb29yZGVuYWRhc19JbmRpdmlkdWFsZXNfU3ViY29uanVudG9fRmlsdHJvX2dlbmRlciwgZmlnLmFsaWduPSdjZW50ZXInfQ0Kc2V0LnNlZWQoNzgwNzIwKQ0KY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9tdWVzdHJlYWRvID0gY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkb1tzYW1wbGUoMTpucm93KGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG8pLDYxKSwtYygxLDQsNiw5LDEwLDExKV0NCmhlYWQoUENBKGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfbXVlc3RyZWFkbywgbmNwID0gNCAsIHNjYWxlLnVuaXQgPSBUUlVFLCBncmFwaCA9IEZBTFNFLCBxdWFsaS5zdXAgPSAiR2VuZGVyIikkaW5kJGNvb3JkLCBuID0gNjFMKQ0KDQpgYGANCg0KIyMjIyBCaXBsb3QgZGUgVmFyaWFibGVzIHkgUmVnaXN0cm9zIFtTdWJjb25qdW50byBGaWx0cm8gZ2VuZGVyXQ0KYGBge3IgQmlwbG90X2RlX1ZhcmlhYmxlc195X1JlZ2lzdHJvc19TdWJjb25qdW50b19GaWx0cm9fR2VuZGVyLCBmaWcuYWxpZ249J2NlbnRlcid9DQpzZXQuc2VlZCg3ODA3MjApDQpjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX211ZXN0cmVhZG8gPSBjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvW3NhbXBsZSgxOm5yb3coY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkbyksNjEpLC1jKDEsNCw2LDksMTAsMTEpXQ0KZnZpel9wY2FfYmlwbG90KFBDQShjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX211ZXN0cmVhZG8sIG5jcCA9IDQsIHNjYWxlLnVuaXQgPSBUUlVFLCBncmFwaCA9IEYsIHF1YWxpLnN1cCA9ICJHZW5kZXIiKSwgYXhlcyA9IGMoMSwgMiksIHJlcGVsID0gVFJVRSwgaGFiaWxsYWdlID0gIkdlbmRlciIpDQpmdml6X3BjYV9iaXBsb3QoUENBKGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfbXVlc3RyZWFkbywgbmNwID0gNCwgc2NhbGUudW5pdCA9IFQsIGdyYXBoID0gRiwgcXVhbGkuc3VwID0gIkdlbmRlciIpLCBheGVzID0gYygxLCAyKSwgcmVwZWwgPSBULCBoYWJpbGxhZ2UgPSAiR2VuZGVyIikNCg0KYGBgDQoNCiMjICoqRmFzZSAzIFtDb3JyZXNwb25kZW5jaWFzXSoqDQojIyMgKiozLjEgb2JqZXRpdm9zKioNCg0KRW4gZXN0YSB0ZXJjZXJhIGZhc2UgZGVsIGVzdHVkaW8sIHNlIHByZXNlbnRhcsOhbiBjw6FsY3Vsb3MsIHZpc3VhbGl6YWNpb25lcyBlIGludGVycHJldGFjaW9uZXMgYmFzYWRhcyBlbiBlbCBjb25qdW50byBkZSBkYXRvcyB0cmFiYWphZG8gZW4gbGEgZmFzZSAxIHkgZmFzZSAyLiBTaW4gZW1iYXJnbywgZXN0YSBmYXNlIHNlIGVuZm9jYXLDoSBlbiBhcGxpY2FyIGFuw6FsaXNpcyBkZSBjb3JyZXNwb25kZW5jaWFzIHNpbXBsZXMgeSBtw7psdGlwbGVzIHNvYnJlIGxhcyB2YXJpYWJsZXMgY3VhbGl0YXRpdmFzLCBhYmFyY2FuZG8gbGEgY29uc3RydWNjacOzbiBkZSB0YWJsYXMgZGUgY29udGluZ2VuY2lhIHkgZGlzeXVudGl2YXMgY29tcGxldGFzLCBhc8OtIGNvbW8gbGEgZXZhbHVhY2nDs24gZGUgY2FsaWRhZGVzIGRlIHJlcHJlc2VudGFjacOzbiwgY29udHJpYnVjaW9uZXMgZSBpbnRlcnByZXRhY2lvbmVzDQoNCiMjIyAqKjMuMiBjb3JyZXNwb25kZW5jaWFzIHNpbXBsZXMqKiB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQpBbmFsaXphcmVtb3MgZGF0b3MgcmVsYWNpb25hZG9zIGNvbiBlbCB0cmFiYWpvIHJlbW90byB5IGxhIHNhbHVkIG1lbnRhbCwgdXRpbGl6YW5kbyB0w6ljbmljYXMgZGUgYW7DoWxpc2lzIGRlIGNvcnJlc3BvbmRlbmNpYSBwYXJhIGV4cGxvcmFyIGxhIHJlbGFjacOzbiBlbnRyZSB2YXJpYWJsZXMgY2F0ZWfDs3JpY2FzIGNvbW8gZWwgc2V4bywgY2FtYmlvIGVuIGxhIHByb2R1Y3RpdmlkYWQgLCB5IGxhIGNhbGlkYWQgZGVsIHN1ZcOxby4gTG9zIGPDs2RpZ29zIG3DoXMgcHJlc2VudGFkb3Mgc2UgY2VudHJhbiBlbiBsYSBjb25zdHJ1Y2Npw7NuIHkgZWwgYW7DoWxpc2lzIGRlIHRhYmxhcyBkZSBjb250aW5nZW5jaWEsIGVsIGPDoWxjdWxvIGRlIGVzdGFkw61zdGljb3MgZGUgcHJ1ZWJhIGRlIGNoaS1jdWFkcmFkbyB5IGxhIGRlc2NvbXBvc2ljacOzbiBkZSBsYSBpbmVyY2lhIHBhcmEgY29tcHJlbmRlciBsYSBjb250cmlidWNpw7NuIGRlIGNhZGEgdmFyaWFibGUgYSBsYSByZWxhY2nDs24gZ2xvYmFsLiBFbCBvYmpldGl2byBlcyBpZGVudGlmaWNhciBwYXRyb25lcyB5IGFzb2NpYWNpb25lcyBlbnRyZSBlc3RhcyB2YXJpYWJsZXMsIGNvbnRyaWJ1eWVuZG8gYSB1bmEgbWVqb3IgY29tcHJlbnNpw7NuIGRlIGxvcyBmYWN0b3JlcyByZWxhY2lvbmFkb3MgY29uIGVsIHRyYWJham8gcmVtb3RvIHkgbGEgc2FsdWQgbWVudGFsLg0KDQpQcmltZXJvLCBzZSBjcmVhIHVuYSB0YWJsYSBkZSBjb250aW5nZW5jaWEgcXVlIGNydXphIHZhcmlhYmxlcyBjb21vIGVsIHNleG8geSBhY2Nlc28gYSBzYWx1ZCBtZW50YWwgZW4gcmVsYWNpw7NuIGNvbiBlbCBjYW1iaW8gZGUgbGEgcHJvZHVjdGl2aWRhZC4gUGFyYSBhbmFsaXphciBsYXMgcmVsYWNpb25lcyBlbnRyZSBsYXMgdmFyaWFibGVzLCBzZSBjb25zdHJ1eWVuIHRhYmxhcyBkZSBjb250aW5nZW5jaWEsIHkgY29uIGFkZG1hcmdpbnMgc2UgY2FsY3VsYW4gbG9zIHRvdGFsZXMgbWFyZ2luYWxlcywgYnJpbmRhbmRvIHVuYSB2aXNpw7NuIGdlbmVyYWwgZGUgbGFzIGZyZWN1ZW5jaWFzIGRlIGNhZGEgdmFyaWFibGUuIEFkZW3DoXMsIGxhIGZ1bmNpw7NuIHByb3AudGFibGUgcGVybWl0ZSBvYnRlbmVyIHByb2JhYmlsaWRhZGVzIGNvbmRpY2lvbmFsZXMsIG1vc3RyYW5kbyBsYSBkaXN0cmlidWNpw7NuIHByb3BvcmNpb25hbCBkZSB1bmEgdmFyaWFibGUgZGFkbyBlbCB2YWxvciBkZSBvdHJhLg0KDQpTZSBhcGxpY2FuIHBydWViYXMgZXN0YWTDrXN0aWNhcywgY29tbyBsYSBwcnVlYmEgZGUgQ2hpLWN1YWRyYWRvIChjaGlzcS50ZXN0KSwgcGFyYSBldmFsdWFyIGxhIHNpZ25pZmljYW5jaWEgZGUgbGFzIGFzb2NpYWNpb25lcyBlbnRyZSB2YXJpYWJsZXMuIEx1ZWdvLCBzZSBjYWxjdWxhbiBsb3MgcmVzaWR1b3MsIGxvIGN1YWwgcGVybWl0ZSBleGFtaW5hciBsYXMgZGlmZXJlbmNpYXMgZW50cmUgdmFsb3JlcyBvYnNlcnZhZG9zIHkgZXNwZXJhZG9zIGJham8gbGEgaGlww7N0ZXNpcyBkZSBpbmRlcGVuZGVuY2lhLg0KDQpFbCBhbsOhbGlzaXMgdGFtYmnDqW4gaW5jbHV5ZSB1biBlc3R1ZGlvIGRlIGNvcnJlc3BvbmRlbmNpYSBzaW1wbGUgeSBtw7psdGlwbGUgKENBKSwgZW5mb2NhZG8gZW4gbGEgZGVzY29tcG9zaWNpw7NuIGRlIGxhIGluZXJjaWEgeSBlbiBsYSBjb250cmlidWNpw7NuIGRlIGNhZGEgdmFyaWFibGUgYSBsYSByZWxhY2nDs24gZ2xvYmFsLiBBIHRyYXbDqXMgZGUgZXN0ZSBhbsOhbGlzaXMsIHNlIGlkZW50aWZpY2FuIGxhcyB2YXJpYWJsZXMgcXVlIG3DoXMgaW5mbHV5ZW4gZW4gbGEgZXN0cnVjdHVyYSBkZSBsb3MgZGF0b3MsIHkgbG9zIHJlc3VsdGFkb3MgY29tbyB2YWxvcmVzIHByb3Bpb3MsIGNvb3JkZW5hZGFzIHkgY29udHJpYnVjaW9uZXMgcGVybWl0ZW4gdW5hIHZpc3VhbGl6YWNpw7NuIGdyw6FmaWNhIGRlIGxhcyBhc29jaWFjaW9uZXMuIEFkZW3DoXMsIGZ2aXpfY29udHJpYiBzZSB1c2EgcGFyYSB2aXN1YWxpemFyIGxhIGNvbnRyaWJ1Y2nDs24gZGUgY2FkYSB2YXJpYWJsZSBlbiB1biBhbsOhbGlzaXMgZGUgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMgKFBDQSksIGRlc3RhY2FuZG8gbGFzIHZhcmlhYmxlcyBtw6FzIGluZmx1eWVudGVzLg0KDQpFbCBhbsOhbGlzaXMgZGV0ZXJtaW5hZG8gZGUgZXN0YSBmYXNlIHBlcm1pdGUgY29tcHJlbmRlciBhIHByb2Z1bmRpZGFkIGxhIHJlbGFjacOzbiBlbnRyZSBlbCBzZXhvLCBlbCBjYW1iaW8gZW4gbGEgcHJvZHVjdGl2aWRhZCB5IGVsIGFjY2VzbyBhIGxvcyBzZXJ2aWNpb3MgZGUgc2FsdWQgbWVudGFsLiBMYSBwcnVlYmEgZGUgQ2hpLWN1YWRyYWRvIGV2YWzDumEgbGEgc2lnbmlmaWNhbmNpYSBlc3RhZMOtc3RpY2EgZGUgZXN0YSBhc29jaWFjacOzbiwgaWRlbnRpZmljYW5kbyBzaSBsYXMgZGlmZXJlbmNpYXMgb2JzZXJ2YWRhcyByZXNwb25kZW4gYWwgYXphciBvIGEgdW5hIHJlbGFjacOzbiByZWFsIGVuIGxvcyBkYXRvcy4gQWRlbcOhcywgZWwgYW7DoWxpc2lzIGRlIGNvcnJlc3BvbmRlbmNpYSwgcXVlIGluY2x1eWUgbGEgZGVzY29tcG9zaWNpw7NuIGRlIGxhIGluZXJjaWEsIHZpc3VhbGl6YSB5IGN1YW50aWZpY2EgbGEgY29udHJpYnVjacOzbiBkZSBjYWRhIHZhcmlhYmxlIGEgZXN0YSBhc29jaWFjacOzbiwgbG8gY3VhbCBmYWNpbGl0YSBsYSBpZGVudGlmaWNhY2nDs24gZGUgcGF0cm9uZXMgc2lnbmlmaWNhdGl2b3MuDQoNCiMjIyMgQW5hbGlzaXMgZGUgQ29ycmVzcG9uZGVjaWEgUG9yIFBhcmVqYXMgey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KIyMjIyMgQ29udGlnZW5jaWFzDQpgYGB7ciBDb250aWdlbmNpYXMsIGZpZy5hbGlnbj0nY2VudGVyJ30NCmFkZG1hcmdpbnModGFibGUoY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkbyRHZW5kZXIsIGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG8kQWNjZXNzX3RvX01lbnRhbF9IZWFsdGhfUmVzb3VyY2VzKSkNCmFkZG1hcmdpbnModGFibGUoY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkbyRQcm9kdWN0aXZpdHlfQ2hhbmdlLCBjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvJFByb2R1Y3Rpdml0eV9DaGFuZ2UpKQ0KYWRkbWFyZ2lucyh0YWJsZShjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvJEdlbmRlciwgY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkbyRQcm9kdWN0aXZpdHlfQ2hhbmdlKSkNCmBgYA0KDQojIyMjIyBQcm9iYWJpbGlkYWRlcw0KYGBge3IgUHJvYmFiaWxpZGFkZXMsIGZpZy5hbGlnbj0nY2VudGVyJ30NCmFkZG1hcmdpbnMocHJvcC50YWJsZSh0YWJsZShjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvJEdlbmRlciwgY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkbyRBY2Nlc3NfdG9fTWVudGFsX0hlYWx0aF9SZXNvdXJjZXMpKSoxMDApDQphZGRtYXJnaW5zKHByb3AudGFibGUodGFibGUoY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkbyRTbGVlcF9RdWFsaXR5LCBjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvJFByb2R1Y3Rpdml0eV9DaGFuZ2UpKSoxMDApDQphZGRtYXJnaW5zKHByb3AudGFibGUodGFibGUoY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkbyRHZW5kZXIsIGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG8kUHJvZHVjdGl2aXR5X0NoYW5nZSkpKjEwMCkNCg0KYGBgDQoNCiMjIyMjIEZyZWN1ZW5jaWFzDQpgYGB7ciBGcmVjdWVuY2lhcywgZmlnLmFsaWduPSdjZW50ZXInfQ0Kcm91bmQoYWRkbWFyZ2lucyhwcm9wLnRhYmxlKHRhYmxlKGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG8kR2VuZGVyLCBjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvJEFjY2Vzc190b19NZW50YWxfSGVhbHRoX1Jlc291cmNlcyksIDEpKjEwMCwgMiksIDIpDQpyb3VuZChhZGRtYXJnaW5zKHByb3AudGFibGUodGFibGUoY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkbyRHZW5kZXIsIGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG8kQWNjZXNzX3RvX01lbnRhbF9IZWFsdGhfUmVzb3VyY2VzKSwgMikqMTAwLCAxKSwgMikNCg0Kcm91bmQoYWRkbWFyZ2lucyhwcm9wLnRhYmxlKHRhYmxlKGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG8kU2xlZXBfUXVhbGl0eSwgY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkbyRQcm9kdWN0aXZpdHlfQ2hhbmdlKSwgMSkqMTAwLCAyKSwgMikNCnJvdW5kKGFkZG1hcmdpbnMocHJvcC50YWJsZSh0YWJsZShjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvJFNsZWVwX1F1YWxpdHksIGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG8kUHJvZHVjdGl2aXR5X0NoYW5nZSksIDIpKjEwMCwgMSksIDIpDQoNCnJvdW5kKGFkZG1hcmdpbnMocHJvcC50YWJsZSh0YWJsZShjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvJEdlbmRlciwgY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkbyRQcm9kdWN0aXZpdHlfQ2hhbmdlKSwgMSkqMTAwLCAyKSwgMikNCnJvdW5kKGFkZG1hcmdpbnMocHJvcC50YWJsZSh0YWJsZShjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvJEdlbmRlciwgY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkbyRQcm9kdWN0aXZpdHlfQ2hhbmdlKSwgMikqMTAwLCAxKSwgMikNCg0KYGBgDQoNCiMjIyMjIFBlcmZpbGVzDQpgYGB7ciBQZXJmaWxlcywgZmlnLmFsaWduPSdjZW50ZXInfQ0KcGxvdGN0KHRhYmxlKGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG8kR2VuZGVyLCBjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvJEFjY2Vzc190b19NZW50YWxfSGVhbHRoX1Jlc291cmNlcyksInJvdyIpDQpwbG90Y3QodGFibGUoY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkbyRHZW5kZXIsIGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG8kQWNjZXNzX3RvX01lbnRhbF9IZWFsdGhfUmVzb3VyY2VzKSwiY29sIikNCg0KcGxvdGN0KHRhYmxlKGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG8kU2xlZXBfUXVhbGl0eSwgY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkbyRQcm9kdWN0aXZpdHlfQ2hhbmdlKSwicm93IikNCnBsb3RjdCh0YWJsZShjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvJFNsZWVwX1F1YWxpdHksIGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG8kUHJvZHVjdGl2aXR5X0NoYW5nZSksImNvbCIpDQoNCnBsb3RjdCh0YWJsZShjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvJEdlbmRlciwgY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkbyRQcm9kdWN0aXZpdHlfQ2hhbmdlKSwicm93IikNCnBsb3RjdCh0YWJsZShjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvJEdlbmRlciwgY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkbyRQcm9kdWN0aXZpdHlfQ2hhbmdlKSwiY29sIikNCg0KYGBgDQoNCiMjIyMjIFBydWViYXMgZGUgSGlww7N0ZXNpcw0KYGBge3IgUHJ1ZWJhcyBkZSBIaXDDs3Rlc2lzLCBmaWcuYWxpZ249J2NlbnRlcid9DQpjaGlzcS50ZXN0KHRhYmxlKGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG8kR2VuZGVyLCBjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvJEFjY2Vzc190b19NZW50YWxfSGVhbHRoX1Jlc291cmNlcykpDQpjaGlzcS50ZXN0KHRhYmxlKGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG8kU2xlZXBfUXVhbGl0eSwgY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkbyRQcm9kdWN0aXZpdHlfQ2hhbmdlKSkNCmNoaXNxLnRlc3QodGFibGUoY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkbyRHZW5kZXIsIGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG8kUHJvZHVjdGl2aXR5X0NoYW5nZSkpDQoNCmBgYA0KDQojIyMjIEFuYWxpc2lzIGRlIENvcnJlc3BvbmRlY2lhIFBhcmVqYSBVbmljYSB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQojIyMjIyBDb250aWdlbmNpYXMgeSBSZXNpZHVhbGVzDQpgYGB7ciBDb250aWdlbmNpYXNfeV9SZXNpZHVhbGVzLCBmaWcuYWxpZ249J2NlbnRlcid9IA0KY2hpc3EudGVzdCh0YWJsZShjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvJEdlbmRlciwgY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkbyRQcm9kdWN0aXZpdHlfQ2hhbmdlKSkkb2JzZXJ2ZWQNCmNoaXNxLnRlc3QodGFibGUoY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkbyRHZW5kZXIsIGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG8kUHJvZHVjdGl2aXR5X0NoYW5nZSkpJGV4cGVjdGVkIA0KY2hpc3EudGVzdCh0YWJsZShjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvJEdlbmRlciwgY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkbyRQcm9kdWN0aXZpdHlfQ2hhbmdlKSkkcmVzaWR1YWxzDQpjaGlzcS50ZXN0KHRhYmxlKGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG8kR2VuZGVyLCBjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvJFByb2R1Y3Rpdml0eV9DaGFuZ2UpKSRzdGRyZXMNCg0KYGBgDQoNCiMjIyMjIENvbnRyaWJ1Y2lvbmVzDQpgYGB7ciBDb250cmlidWNpb25lcywgZmlnLmFsaWduPSdjZW50ZXInfQ0KY2hpc3EudGVzdCh0YWJsZShjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvJEdlbmRlcixjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvJFByb2R1Y3Rpdml0eV9DaGFuZ2UpKSRyZXNpZHVhbHNeMi9jaGlzcS50ZXN0KHRhYmxlKGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG8kR2VuZGVyLCBjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvJFByb2R1Y3Rpdml0eV9DaGFuZ2UpKSRzdGF0aXN0aWMqMTAwDQoNCg0KYGBgDQoNCiMjIyMjIENvcnJlc3BvbmRlY2lhIHNpbXBsZSBVbmlkaW1lbnNpb25hbA0KYGBge3IgQ29ycmVzcG9uZGVjaWFfc2ltcGxlX1VuaWRpbWVuc2lvbmFsLCBmaWcuYWxpZ249J2NlbnRlcid9DQpDQSh0YWJsZShjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvJEdlbmRlciwgY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkbyRQcm9kdWN0aXZpdHlfQ2hhbmdlKSwgZ3JhcGggPSBGQUxTRSkkZWlnDQpDQSh0YWJsZShjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvJEdlbmRlciwgY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkbyRQcm9kdWN0aXZpdHlfQ2hhbmdlKSwgZ3JhcGggPSBGQUxTRSkkY29sDQpDQSh0YWJsZShjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvJEdlbmRlciwgY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkbyRQcm9kdWN0aXZpdHlfQ2hhbmdlKSwgZ3JhcGggPSBGQUxTRSkkcm93DQoNCmBgYA0KDQoNCg0KIyMjICoqMy4zIGNvcnJlc3BvbmRlbmNpYXMgbXVsdGlwbGVzKiogey50YWJzZXQgLnRhYnNldC1waWxsc30NCkVsIGFuw6FsaXNpcyBkZSBjb3JyZXNwb25kZW5jaWFzIG3Dumx0aXBsZXMgKEFDTSkgZXMgdW5hIHTDqWNuaWNhIGVzdGFkw61zdGljYSBtdWx0aXZhcmlhbnRlIMO6dGlsIHBhcmEgZXhwbG9yYXIgeSB2aXN1YWxpemFyIHJlbGFjaW9uZXMgY29tcGxlamFzIGVudHJlIHZhcmlhYmxlcyBjYXRlZ8OzcmljYXMuIEVuIGVsIGNvbnRleHRvIGRlbCB0cmFiYWpvIHJlbW90byB5IGxhIHNhbHVkIG1lbnRhbCwgZWwgQUNNIHBlcm1pdGUgaWRlbnRpZmljYXIgcGF0cm9uZXMgc2lnbmlmaWNhdGl2b3MgZW50cmUgZmFjdG9yZXMgY29tbyBsYSBmbGV4aWJpbGlkYWQgbGFib3JhbCwgbGEgcGVyY2VwY2nDs24gZGUgYWlzbGFtaWVudG8sIHkgbG9zIG5pdmVsZXMgZGUgZXN0csOpcyByZXBvcnRhZG9zDQpQYXJhIHJlYWxpemFyIGVsIGFuw6FsaXNpcywgc2UgdXRpbGl6w7MgZWwgcGFxdWV0ZSBGYWN0b01pbmVSLCBhbXBsaWFtZW50ZSBlbXBsZWFkbyBlbiBSIHBhcmEgYW7DoWxpc2lzIG11bHRpdmFyaWFkby4gTG9zIGRhdG9zIGNvbnNpZGVyYWRvcyBpbmNsdXllbiB2YXJpYWJsZXMgY3VhbGl0YXRpdmFzIGNvbW8gc2V4bywgcm9sIGRlIHRyYWJham8sIGxvY2FjacOzbiBkZSB0cmFiYWpvLCBjYW1iaW8gZGUgcHJvZHVjdGl2aWRhZCB5IGNhbGlkYWQgZGVsIHN1ZcOxby4NCkxvcyByZXN1bHRhZG9zIGRlbCBBQ00gZGVzdGFjYW4gbGEgaW1wb3J0YW5jaWEgZGUgaW50ZXJ2ZW5jaW9uZXMgZXNwZWPDrWZpY2FzDQoNCiMjIyMgQUNNDQpgYGB7ciBBQ00sIGZpZy5hbGlnbj0nY2VudGVyJ30NCnJvdW5kKE1DQShjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvWzE6NTAsIC1jKDEsMiw1LDcsOCw5KV0sIGdyYXBoID0gRkFMU0UpJGVpZywyKQ0KDQpgYGANCg0KIyMjIyBCaXBsb3QgQUNNDQpgYGB7ciBCaXBsb3RfQUNNLCBmaWcuYWxpZ249J2NlbnRlcid9DQpmdml6X21jYV9iaXBsb3QoTUNBKGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG9bMToxMDAsIC1jKDEsMiwzLDUsNiw3LDgsOSwxMCwxMSldLCBncmFwaCA9IEZBTFNFKSwgcmVwZWwgPSBUUlVFKQ0KDQoNCmBgYA0KDQojIyMjIENhbGlkYWQgZGUgUmVwcmVzZW50YWNpw7NuDQpgYGB7ciBDYWxpZGFkX2RlX1JlcHJlc2VudGFjacOzbiwgZmlnLmFsaWduPSdjZW50ZXInfQ0KZnZpel9tY2FfdmFyKE1DQShjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvWzE6MTAwLCAtYygxLDIsMyw1LDYsNyw4LDksMTAsMTEpXSwgZ3JhcGggPSBGQUxTRSksIGNvbC52YXIgPSJjb3MyIiwgZ3JhZGllbnQuY29scyA9IGMoIiMwMEFGQkIiLCAiI0U3QjgwMCIsICIjRkM0RTA3IiksIHJlcGVsID0gVFJVRSkNCg0KYGBgDQoNCiMjIyMgQ29udHJpYnVjaW9uZXMNCmBgYHtyIENvbnRyaWJ1Y2lvbmVzXzEsIGZpZy5hbGlnbj0nY2VudGVyJ30NCmZ2aXpfY29udHJpYihNQ0EoY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkb1sxOjUwLCAtYygxLDIsNSw3LDgsOSldLCBncmFwaCA9IEZBTFNFKSwgY2hvaWNlID0gInZhciIsIGF4ZXMgPSAxLCB0b3AgPSAxNSkNCg0KYGBgDQoNCiMjIyMgQmlwbG90IGNvbiBDb250cmlidWNpb25lcyANCmBgYHtyIEJpcGxvdF9jb25fQ29udHJpYnVjaW9uZXMsIGZpZy5hbGlnbj0ncmlnaHQnfQ0KZnZpel9tY2FfdmFyKE1DQShjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvWzE6MTAwLCAtYygxLDIsMyw1LDYsNyw4LDksMTAsMTEpXSwgZ3JhcGggPSBGQUxTRSksIGNvbC52YXIgPSJjb250cmliIiwgZ3JhZGllbnQuY29scyA9IGMoIiMwMEFGQkIiLCAiI0U3QjgwMCIsICIjRkM0RTA3IiksIHJlcGVsID0gVFJVRSkNCg0KYGBgDQoNCiMjICoqRmFzZTQgW0Nvbmdsb21lcmFkb3NdKioNCg0KIyMjICoqNC4xIG9iamV0aXZvcyoqDQpFbCBwcmluY2lwYWwgb2JqZXRpdm8gZGVsIGFuw6FsaXNpcyBkZSBjb25nbG9tZXJhZG9zIGVzIGlkZW50aWZpY2FyIGFncnVwYWNpb25lcyBuYXR1cmFsZXMgZGVudHJvIGRlIHVuIGNvbmp1bnRvIGRlIGRhdG9zIG11bHRpdmFyaWFkb3MsIG1heGltaXphbmRvIGxhIGhvbW9nZW5pZWRhZCBkZW50cm8gZGUgbG9zIGNsdXN0ZXJzIHkgbGEgaGV0ZXJvZ2VuaWVkYWQgZW50cmUgZWxsb3MuIEVzdGUgZW5mb3F1ZSBwZXJtaXRlIHNpbXBsaWZpY2FyIHkgZXN0cnVjdHVyYXIgbGEgaW5mb3JtYWNpw7NuLCBmYWNpbGl0YW5kbyBzdSBpbnRlcnByZXRhY2nDs24geSB1c28gZXN0cmF0w6lnaWNvLg0KDQpQYXJhIGxvZ3JhciBlc3RlIG9iamV0aXZvLCBzZSB1dGlsaXphbiB0w6ljbmljYXMgcXVlIGN1YW50aWZpY2FuIGxhcyBzaW1pbGl0dWRlcyBlbnRyZSBvYnNlcnZhY2lvbmVzLCBlc3RhYmxlY2llbmRvIHVuYSBlc3RydWN0dXJhIGplcsOhcnF1aWNhIG8gcGFydGljaW9uYWwgc2Vnw7puIGVsIG3DqXRvZG8gc2VsZWNjaW9uYWRvLiBFc3RhcyB0w6ljbmljYXMgcGVybWl0ZW4gZGV0ZWN0YXIgcGF0cm9uZXMgZW4gbG9zIGRhdG9zIHF1ZSBkZSBvdHJhIG1hbmVyYSBwYXNhcsOtYW4gZGVzYXBlcmNpYmlkb3MsIGRlc3RhY2FuZG8gcmVsYWNpb25lcyBpbXBvcnRhbnRlcyBlbnRyZSBsYXMgb2JzZXJ2YWNpb25lcyB5IHN1cyBjYXJhY3RlcsOtc3RpY2FzLiANCg0KTG9zIG9iamV0aXZvcyBkZWwgYW7DoWxpc2lzIGRlIGNvbmdsb21lcmFkb3Mgc2UgY3VtcGxpZXJvbiBhbCBzZWdtZW50YXIgZGUgbWFuZXJhIGVmaWNpZW50ZSBsYXMgb2JzZXJ2YWNpb25lcyBlbiBncnVwb3Mgc2lnbmlmaWNhdGl2b3MsIG9mcmVjaWVuZG8gdW5hIHZpc2nDs24gbcOhcyBvcmdhbml6YWRhIGRlbCBjb25qdW50byBkZSBkYXRvcy4gRXN0b3MgcmVzdWx0YWRvcyByZWZ1ZXJ6YW4gbGEgdXRpbGlkYWQgZGUgZXN0ZSBlbmZvcXVlIHBhcmEgc2ltcGxpZmljYXIgZGF0b3MgY29tcGxlam9zIHkgYXBveWFyIGRlY2lzaW9uZXMgYmFzYWRhcyBlbiBwYXRyb25lcyBlc3RydWN0dXJhbGVzIGNsYXJvcy4NCg0KIyMjICoqNC4yIGFncnVwYWNpw7NuIGplcsOhcnF1aWNhKiogey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KTGEgYWdydXBhY2nDs24gamVyw6FycXVpY2EgZXMgdW5hIHTDqWNuaWNhIGRlIGFuw6FsaXNpcyBkZSBkYXRvcyBxdWUgcGVybWl0ZSBpZGVudGlmaWNhciBlc3RydWN0dXJhcyBzdWJ5YWNlbnRlcyBhZ3J1cGFuZG8gb2JzZXJ2YWNpb25lcyBjb24gY2FyYWN0ZXLDrXN0aWNhcyBzaW1pbGFyZXMuIEVuIGVsIGNvbnRleHRvIGRlbCB0cmFiYWpvIHJlbW90byB5IGxhIHNhbHVkIG1lbnRhbCwgZXN0YSB0w6ljbmljYSBmYWNpbGl0YSBsYSBjbGFzaWZpY2FjacOzbiBkZSBlbXBsZWFkb3MgZW4gZnVuY2nDs24gZGUgdmFyaWFibGVzIGNsYXZlIGNvbW8gZWwgbml2ZWwgZGUgZXN0csOpcywgcGVyY2VwY2nDs24gZGUgYXBveW8gb3JnYW5pemFjaW9uYWwgeSBzYXRpc2ZhY2Npw7NuIGxhYm9yYWwuIA0KDQpFbiBlc3RhIHNlY2Npw7NuLCBzZSBkZXNjcmliZSBsYSBpbXBsZW1lbnRhY2nDs24gZGUgbGEgYWdydXBhY2nDs24gamVyw6FycXVpY2EgZW4gUiwgdXRpbGl6YW5kbyBhbGdvcml0bW9zIGRlIGVubGFjZSB5IG3DqXRyaWNhcyBkZSBkaXN0YW5jaWEsIGNvbiBlbCBvYmpldGl2byBkZSByZXZlbGFyIHBhdHJvbmVzIHNpZ25pZmljYXRpdm9zIHF1ZSBpbmZvcm1lbiBlc3RyYXRlZ2lhcyBkZSBpbnRlcnZlbmNpw7NuLg0KDQpFbCBhbsOhbGlzaXMgc2UgcmVhbGl6w7MgdXRpbGl6YW5kbyBlbCBwYXF1ZXRlIGNsdXN0ZXIgcGFyYSBjYWxjdWxhciBkaXN0YW5jaWFzIHkgZ2VuZXJhciBkZW5kcm9ncmFtYXMsIGNvbXBsZW1lbnRhZG8gY29uIGZhY3RvZXh0cmEgcGFyYSBsYSB2aXN1YWxpemFjacOzbi4gTGFzIHZhcmlhYmxlcyBlbXBsZWFkYXMgZnVlcm9uIHByZXZpYW1lbnRlIGVzdGFuZGFyaXphZGFzIHBhcmEgZ2FyYW50aXphciByZXN1bHRhZG9zIGNvbXBhcmFibGVzLg0KDQojIyMjIENhbXBvIGNsYXNpZmljYWRvcg0KYGBge3IgQ2FtcG9fY2xhc2lmaWNhZG9yLCBmaWcuYWxpZ249J2NlbnRlcid9DQpjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX29yaWdpbmFsX2pvYl9yb2xlX3Byb21lZGlvIDwtIHJlYWRfZXhjZWwoIkltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9vcmlnaW5hbF9qb2Jfcm9sZV9wcm9tZWRpby54bHN4IikNClZpZXcoY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9vcmlnaW5hbF9qb2Jfcm9sZV9wcm9tZWRpbykNCg0KYGBgDQoNCiMjIyMgQ29uanVudG8gbW9kaWZpY2Fkbw0KYGBge3IgQ29uanVudG9fbW9kaWZpY2FkbywgZmlnLmFsaWduPSdjZW50ZXInfQ0KaGVhZChhcy5kYXRhLmZyYW1lKGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfb3JpZ2luYWxfam9iX3JvbGVfcHJvbWVkaW8pKQ0KYGBgDQoNCiMjIyMgZGlzaW1pbGFyaWRhZCANCmBgYHtyIGRpc2ltaWxhcmlkYWQsIGZpZy5hbGlnbj0nY2VudGVyJ30NCmRhdGFfID0gYXMuZGF0YS5mcmFtZShjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX29yaWdpbmFsX2pvYl9yb2xlX3Byb21lZGlvKVssIC1jKDEpXQ0Kcm93bmFtZXMoZGF0YV8pID0gdW5jbGFzcyhjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX29yaWdpbmFsX2pvYl9yb2xlX3Byb21lZGlvJEpvYl9yb2xlKQ0KZnZpel9kaXN0KGdldF9kaXN0KGRhdGFfLCBzdGFuZCA9IFQsIG1ldGhvZCA9ICJldWNsaWRlYW4iKSwgZ3JhZGllbnQgPSBsaXN0KGxvdyA9ICIjMDBBRkJCIiwgbWlkID0gIndoaXRlIiwgaGlnaCA9ICIjRkM0RTA3IikpDQoNCmBgYA0KDQojIyMjIG9wdGltaXphY2lvbiBkZSBtb2plbmEgey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KIyMjIyMgVW5pb24gc2ltcGxlDQpgYGB7ciBvcHRpbWl6YWNpb25fZGVfbW9qZW5hLCBmaWcuYWxpZ249J2NlbnRlcid9DQpoY19zaW5nbGUgPSBoY2x1c3QoZ2V0X2Rpc3QoZGF0YV8sIHN0YW5kID0gVCwgbWV0aG9kID0gImV1Y2xpZGVhbiIpLCBtZXRob2QgPSAic2luZ2xlIikNCg0KbW9qZW5hID0gZnVuY3Rpb24oaGMpew0KICBuX2hkID0gbGVuZ3RoKGhjJGhlaWdodCkNCiAgYWxwX2cgPSAwIDsgYWxwaGEgPSBoYyRoZWlnaHRbbl9oZDoxXQ0KICBmb3IoaSBpbiAxOihuX2hkLTEpKXsNCiAgICBhbHBfZ1tpXSA9IG1lYW4oYWxwaGFbKG5faGQtaSsxKToxXSkrMS4yNSpzZChhbHBoYVsobl9oZC1pKzEpOjFdKQ0KICB9DQogIG5vZyA9IHN1bShhbHBfZzw9IGFscGhhWy1uX2hkXSkgKyAxDQogIHBsb3QoYWxwaGFbLW5faGRdLCBwY2g9MjAsIGNvbD0oYWxwX2c+YWxwaGFbLW5faGRdKSsxLCBtYWluID0gcGFzdGUoIk9wdGltYWwgbnVtYmVyIG9mIGdyb3VwcyA9Iixub2cpLA0KICAgICAgIHlsYWIgPSBleHByZXNzaW9uKGFscGhhW2ddKSwgeGxhYj0iTm9kZXMiKX0NCg0KbW9qZW5hKGhjX3NpbmdsZSkNCg0KYGBgDQoNCiMjIyMjIHVuaW9uIGNvbXBsZXRhDQpgYGB7ciB1bmlvbl9jb21wbGV0YSwgZmlnLmFsaWduPSdjZW50ZXInfQ0KaGNfY29tcGxldGUgPSBoY2x1c3QoZ2V0X2Rpc3QoZGF0YV8sIHN0YW5kID0gVCwgbWV0aG9kID0gImV1Y2xpZGVhbiIpLCBtZXRob2QgPSAiY29tcGxldGUiKQ0KDQptb2plbmEgPSBmdW5jdGlvbihoYyl7DQogIG5faGQgPSBsZW5ndGgoaGMkaGVpZ2h0KQ0KICBhbHBfZyA9IDAgOyBhbHBoYSA9IGhjJGhlaWdodFtuX2hkOjFdDQogIGZvcihpIGluIDE6KG5faGQtMSkpew0KICAgIGFscF9nW2ldID0gbWVhbihhbHBoYVsobl9oZC1pKzEpOjFdKSsxLjI1KnNkKGFscGhhWyhuX2hkLWkrMSk6MV0pDQogIH0NCiAgbm9nID0gc3VtKGFscF9nPD0gYWxwaGFbLW5faGRdKSArIDENCiAgcGxvdChhbHBoYVstbl9oZF0sIHBjaD0yMCwgY29sPShhbHBfZz5hbHBoYVstbl9oZF0pKzEsIG1haW4gPSBwYXN0ZSgiT3B0aW1hbCBudW1iZXIgb2YgZ3JvdXBzID0iLG5vZyksDQogICAgICAgeWxhYiA9IGV4cHJlc3Npb24oYWxwaGFbZ10pLCB4bGFiPSJOb2RlcyIpfQ0KDQptb2plbmEoaGNfY29tcGxldGUpDQoNCmBgYA0KDQojIyMjIyBVbmlvbiBwcm9tZWRpbw0KYGBge3IgVW5pb25fcHJvbWVkaW8sIGZpZy5hbGlnbj0nY2VudGVyJ30NCmhjX2F2ZXJhZ2UgPSBoY2x1c3QoZ2V0X2Rpc3QoZGF0YV8sIHN0YW5kID0gVCwgbWV0aG9kID0gImV1Y2xpZGVhbiIpLCBtZXRob2QgPSAiYXZlcmFnZSIpDQoNCm1vamVuYSA9IGZ1bmN0aW9uKGhjKXsNCiAgbl9oZCA9IGxlbmd0aChoYyRoZWlnaHQpDQogIGFscF9nID0gMCA7IGFscGhhID0gaGMkaGVpZ2h0W25faGQ6MV0NCiAgZm9yKGkgaW4gMToobl9oZC0xKSl7DQogICAgYWxwX2dbaV0gPSBtZWFuKGFscGhhWyhuX2hkLWkrMSk6MV0pKzEuMjUqc2QoYWxwaGFbKG5faGQtaSsxKToxXSkNCiAgfQ0KICBub2cgPSBzdW0oYWxwX2c8PSBhbHBoYVstbl9oZF0pICsgMQ0KICBwbG90KGFscGhhWy1uX2hkXSwgcGNoPTIwLCBjb2w9KGFscF9nPmFscGhhWy1uX2hkXSkrMSwgbWFpbiA9IHBhc3RlKCJPcHRpbWFsIG51bWJlciBvZiBncm91cHMgPSIsbm9nKSwNCiAgICAgICB5bGFiID0gZXhwcmVzc2lvbihhbHBoYVtnXSksIHhsYWI9Ik5vZGVzIil9DQoNCm1vamVuYShoY19hdmVyYWdlKQ0KDQpgYGANCg0KDQojIyMjIGRlbmRvZ3JhbWFzIG9wdGltaXphZG9zIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNCiMjIyMjIEVubGFjZSBzaW1wbGUNCmBgYHtyIEVubGFjZV9zaW1wbGUsIGZpZy5hbGlnbj0nY2VudGVyJ30NCnN1cHByZXNzV2FybmluZ3MoZnZpel9kZW5kKGhjX3NpbmdsZSwgayA9IDMsIGNleCA9IDAuNSwga19jb2xvcnMgPSAibnBnIiwgY29sb3JfbGFiZWxzX2J5X2sgPSBULCByZWN0ID0gVCkpDQoNCmBgYA0KDQojIyMjIyBFbmxhY2UgY29tcGxldG8NCmBgYHtyIEVubGFjZV9jb21wbGV0bywgZmlnLmFsaWduPSdjZW50ZXInfQ0KZnZpel9kZW5kKGhjX2NvbXBsZXRlLCBrID0gMywgY2V4ID0gMC41LCBrX2NvbG9ycyA9ICJucGciLCBjb2xvcl9sYWJlbHNfYnlfayA9IFQsIHJlY3QgPSBUKQ0KDQpgYGANCg0KIyMjIyMgRW5sYWNlIHByb21lZGlvDQpgYGB7ciBFbmxhY2VfcHJvbWVkaW8sIGZpZy5hbGlnbj0nY2VudGVyJ30NCmZ2aXpfZGVuZChoY19hdmVyYWdlLCBrID0gNCwgY2V4ID0gMC41LCBrX2NvbG9ycyA9ICJucGciLCBjb2xvcl9sYWJlbHNfYnlfayA9IFQsIHJlY3QgPSBUKQ0KDQpgYGANCg0KIyMjICoqNC4zIGFncnVwYWNpw7NuIG5vLWplcsOhcnF1aWNhKiogey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KTGEgYWdydXBhY2nDs24gbm8gamVyw6FycXVpY2EsIGNvbW8gZWwgYWxnb3JpdG1vIGstbWVhbnMsIGVzIHVuYSB0w6ljbmljYSB1dGlsaXphZGEgcGFyYSBwYXJ0aWNpb25hciBkYXRvcyBlbiB1biBuw7ptZXJvIHByZWRlZmluaWRvIGRlIGNsw7pzdGVyZXMgYmFzYWRvcyBlbiBzaW1pbGl0dWRlcy4gRXN0ZSBlbmZvcXVlIGVzIHBhcnRpY3VsYXJtZW50ZSDDunRpbCBlbiBlbCBhbsOhbGlzaXMgZGVsIGltcGFjdG8gZGVsIHRyYWJham8gcmVtb3RvIGVuIGxhIHNhbHVkIG1lbnRhbCwgeWEgcXVlIHBlcm1pdGUgaWRlbnRpZmljYXIgZ3J1cG9zIGhvbW9nw6luZW9zIGRlIGVtcGxlYWRvcyBlbiBmdW5jacOzbiBkZSBmYWN0b3JlcyBjb21vIGVsIGVzdHLDqXMgbGFib3JhbCwgbGEgc2F0aXNmYWNjacOzbiBwZXJzb25hbCB5IGVsIGFwb3lvIG9yZ2FuaXphY2lvbmFsLiBBIGNvbnRpbnVhY2nDs24sIHNlIGRlc2NyaWJlIGxhIGltcGxlbWVudGFjacOzbiBkZSBlc3RhIHTDqWNuaWNhIGVuIFIsIGNvbiB1biDDqW5mYXNpcyBlbiBsYSBzZWxlY2Npw7NuIGRlbCBuw7ptZXJvIMOzcHRpbW8gZGUgY2zDunN0ZXJlcyB5IGxhIGludGVycHJldGFjacOzbiBkZSBsb3MgcmVzdWx0YWRvcy4NClBhcmEgZXN0ZSBhbsOhbGlzaXMsIHNlIHV0aWxpesOzIGVsIGFsZ29yaXRtbyBrLW1lYW5zLCBpbXBsZW1lbnRhZG8gY29uIGVsIHBhcXVldGUgc3RhdHMgeSB2aXN1YWxpemFkbyBjb24gZmFjdG9leHRyYS4gTG9zIGRhdG9zIHNlIGVzY2FsYXJvbiBwcmV2aWFtZW50ZSBwYXJhIGdhcmFudGl6YXIgdW5pZm9ybWlkYWQgZW50cmUgbGFzIHZhcmlhYmxlcy4gQWRlbcOhcywgc2UgZW1wbGXDsyBlbCBtw6l0b2RvIGRlbCBjb2RvIHBhcmEgZGV0ZXJtaW5hciBlbCBuw7ptZXJvIMOzcHRpbW8gZGUgY2zDunN0ZXJlcy4NCkxvcyByZXN1bHRhZG9zIGRlbCBhbsOhbGlzaXMgZGUgYWdydXBhY2nDs24gbm8gamVyw6FycXVpY2EgZGVzdGFjYW4gbGEgaW1wb3J0YW5jaWEgZGUgcGVyc29uYWxpemFyIGxhcyBlc3RyYXRlZ2lhcyBkZSBhcG95byBzZWfDum4gZWwgcGVyZmlsIGRlIGNhZGEgY2zDunN0ZXIuDQoNCiMjIyMgSy1vcHRpbW9zIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNCkVuIGVzdGEgc2VjY2nDs24gYWwgZWplY3V0YXIgZWwgY29kaWdvIG9idGVuZW1vcyBjb21vIHJlc3VsdGFkbyBlbCBzaWd1aWVudGUgZXJyb3IgIm1vcmUgY2x1c3RlciBjZW50ZXJzIHRoYW4gZGlzdGluY3QgZGF0YSBwb2ludHMiIHN1cmdlIGN1YW5kbyBlbCBuw7ptZXJvIGRlIGNsw7pzdGVyZXMgZXNwZWNpZmljYWRvIGVuIHVuIGFuw6FsaXNpcyBkZSBhZ3J1cGFjacOzbiBubyBqZXLDoXJxdWljYSwgY29tbyBrLW1lYW5zLCBzdXBlcmEgbGEgY2FudGlkYWQgZGUgb2JzZXJ2YWNpb25lcyDDum5pY2FzIGVuIGVsIGNvbmp1bnRvIGRlIGRhdG9zLiBFc3RvIHN1ZWxlIG9jdXJyaXIgZGViaWRvIGEgbGEgcHJlc2VuY2lhIGRlIGRhdG9zIGR1cGxpY2Fkb3MsIGluc3VmaWNpZW5jaWEgZGUgZGF0b3MgbyB2YXJpYWJsZXMgY29uc3RhbnRlcyBxdWUgcmVzdWx0YW4gZW4gcmVkdW5kYW5jaWEuIEVuIGVzdG9zIGNhc29zLCBlbCBhbGdvcml0bW8gbm8gcHVlZGUgYXNpZ25hciBjbMO6c3RlcmVzIMO6bmljb3MgYSBwdW50b3MgcXVlIG5vIHRpZW5lbiBkaWZlcmVuY2lhcyBlbnRyZSBzw60sIGdlbmVyYW5kbyB1biBjb25mbGljdG8gbMOzZ2ljbyBlbiBlbCBtb2RlbG8uIEVzdGUgcHJvYmxlbWEgZGVzdGFjYSBsYSBpbXBvcnRhbmNpYSBkZSBwcmVwcm9jZXNhciBsb3MgZGF0b3MgYWRlY3VhZGFtZW50ZSwgZWxpbWluYW5kbyBkdXBsaWNhZG9zLCByZXZpc2FuZG8gbGEgdmFyaWFiaWxpZGFkIGRlIGxhcyB2YXJpYWJsZXMgeSBhanVzdGFuZG8gZWwgbsO6bWVybyBkZSBjbMO6c3RlcmVzIGFsIHRhbWHDsW8gcmVhbCBkZWwgY29uanVudG8gZGUgZGF0b3MuDQoNCiMjIyMgUmVzdWx0YWRvcyBLLW1lYW5zIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNCiMjIyMjIEstb3B0aW1vIFtTTVIgMl0NCmBgYHtyIFNpbF9NYV9SdWwsIGZpZy5hbGlnbj0nY2VudGVyJ30NCnNldC5zZWVkKDc4MDcyOCkNCnByaW50KGttZWFucyhkYXRhXywgMywgbnN0YXJ0ID0gMjUpKQ0KDQoNCmBgYA0KDQojIyMjIyBLLW9wdGltbyBbc2lsIDRdDQpgYGB7ciBFbGIsIGZpZy5hbGlnbj0nY2VudGVyJ30NCnNldC5zZWVkKDc4MDcyOCkNCnByaW50KGttZWFucyhkYXRhXywgMiwgbnN0YXJ0ID0gMjUpKQ0KDQpgYGANCiMjIyMgR3JhZmljb3MgSy1tZWFucyB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQojIyMjIyBLLW9wdGltbyBbU2lsX01hX1J1bCAyXQ0KYGBge3IgR3JhZl9TaWxfTWFfUnVsLCBmaWcuYWxpZ249J2NlbnRlcid9DQpmdml6X2NsdXN0ZXIoa21lYW5zKGRhdGFfLCAyLCBuc3RhcnQgPSAyNSksIGRhdGEgPSBkYXRhXywgcGFsZXR0ZSA9IGMoIiMyRTlGREYiLCAiIzAwQUZCQiIsICIjRTdCODAwIiwgIiNFN0I4MDEiKSwgZWxsaXBzZS50eXBlID0gImV1Y2xpZCIsIHN0YXIucGxvdCA9IFRSVUUsIHJlcGVsID0gVFJVRSwgZ2d0aGVtZSA9IHRoZW1lX21pbmltYWwoKQ0KKQ0KYGBgDQoNCiMjIyMgSy1vcHRpbW8gW0VsYiAzXQ0KYGBge3IgZ3JhZl9FbGIsIGZpZy5hbGlnbj0nY2VudGVyJ30NCmZ2aXpfY2x1c3RlcihrbWVhbnMoZGF0YV8sIDMsIG5zdGFydCA9IDI1KSwgZGF0YSA9IGRhdGFfLCBwYWxldHRlID0gYygiIzJFOUZERiIsICIjMDBBRkJCIiwgIiNFN0I4MDAiLCAiI0U3QjgwMSIpLCBlbGxpcHNlLnR5cGUgPSAiZXVjbGlkIiwgc3Rhci5wbG90ID0gVFJVRSwgcmVwZWwgPSBUUlVFLCBnZ3RoZW1lID0gdGhlbWVfbWluaW1hbCgpDQopDQoNCmBgYA0KDQojIyAqKkZhc2UgNSBbQW7DoWxpc2lzIGRlIHJlZ3Jlc2nDs25dKioNCg0KIyMjICoqNS4xIE9iamV0aXZvcyoqDQoNCkVsIGFuw6FsaXNpcyBkZSByZWdyZXNpw7NuIGVzIHVuYSBoZXJyYW1pZW50YSBlc3RhZMOtc3RpY2EgZnVuZGFtZW50YWwgY3V5byBwcmluY2lwYWwgb2JqZXRpdm8gZXMgZW50ZW5kZXIgeSBtb2RlbGFyIGxhIHJlbGFjacOzbiBlbnRyZSB1bmEgdmFyaWFibGUgZGVwZW5kaWVudGUsIHRhbWJpw6luIGNvbm9jaWRhIGNvbW8gdmFyaWFibGUgcmVzcHVlc3RhLCB5IHVuYSBvIG3DoXMgdmFyaWFibGVzIGluZGVwZW5kaWVudGVzLCBsbGFtYWRhcyBwcmVkaWN0b3Jhcy4gRXN0ZSBhbsOhbGlzaXMgcGVybWl0ZSBleHBsb3JhciBjw7NtbyBsYXMgdmFyaWFibGVzIGluZGVwZW5kaWVudGVzIGFmZWN0YW4gYSBsYSB2YXJpYWJsZSBkZXBlbmRpZW50ZSwgcHJvcG9yY2lvbmFuZG8gaW5mb3JtYWNpw7NuIHNvYnJlIGxhIGRpcmVjY2nDs24geSBsYSBtYWduaXR1ZCBkZSBlc3RhcyByZWxhY2lvbmVzLiBBIHRyYXbDqXMgZGUgZXN0YSBoZXJyYW1pZW50YSwgZXMgcG9zaWJsZSBpZGVudGlmaWNhciBwYXRyb25lcywgZXN0YWJsZWNlciB0ZW5kZW5jaWFzIHkgb2J0ZW5lciBjb25jbHVzaW9uZXMgc2lnbmlmaWNhdGl2YXMgYmFzYWRhcyBlbiBsb3MgZGF0b3MuDQoNClVubyBkZSBsb3Mgb2JqZXRpdm9zIGNlbnRyYWxlcyBkZWwgYW7DoWxpc2lzIGRlIHJlZ3Jlc2nDs24gZXMgbGEgcHJlZGljY2nDs24sIGVzIGRlY2lyLCB1c2FyIGVsIG1vZGVsbyBkZXNhcnJvbGxhZG8gcGFyYSBlc3RpbWFyIG8gcHJldmVyIGVsIHZhbG9yIGRlIGxhIHZhcmlhYmxlIGRlcGVuZGllbnRlIGVuIGZ1bmNpw7NuIGRlIGxvcyB2YWxvcmVzIGNvbm9jaWRvcyBkZSBsYXMgdmFyaWFibGVzIGluZGVwZW5kaWVudGVzLiBFc3RvIHJlc3VsdGEgZXNwZWNpYWxtZW50ZSDDunRpbCBlbiBjb250ZXh0b3MgZG9uZGUgc2UgcmVxdWllcmUgYW50aWNpcGFyIHJlc3VsdGFkb3MsIGNvbW8gZW4gbGEgcGxhbmVhY2nDs24gaW5kdXN0cmlhbCwgZWwgYW7DoWxpc2lzIGZpbmFuY2llcm8sIGxhIGV2YWx1YWNpw7NuIGRlIHJpZXNnb3MgbyBsYSB0b21hIGRlIGRlY2lzaW9uZXMgZXN0cmF0w6lnaWNhcy4NCg0KIyMjICoqNS4yIHJlZ3Jlc2nDs24gbGluZWFsIHNpbXBsZSoqIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNCkxhIHJlZ3Jlc2nDs24gbGluZWFsIHNpbXBsZSBlcyB1bmEgdMOpY25pY2EgZXN0YWTDrXN0aWNhIHF1ZSBwZXJtaXRlIG1vZGVsYXIgbGEgcmVsYWNpw7NuIGVudHJlIHVuYSB2YXJpYWJsZSBpbmRlcGVuZGllbnRlIHkgdW5hIHZhcmlhYmxlIGRlcGVuZGllbnRlIG1lZGlhbnRlIHVuYSBsw61uZWEgcmVjdGEuIEVuIGVsIGNvbnRleHRvIGRlbCB0cmFiYWpvIHJlbW90byB5IGxhIHNhbHVkIG1lbnRhbCwgZXN0YSB0w6ljbmljYSBwdWVkZSBlbXBsZWFyc2UgcGFyYSBhbmFsaXphciBjw7NtbyBmYWN0b3JlcyBlc3BlY8OtZmljb3MsIGNvbW8gbGEgY2FudGlkYWQgZGUgaG9yYXMgZGUgdHJhYmFqbyByZW1vdG8sIGFmZWN0YW4gaW5kaWNhZG9yZXMgZGUgc2FsdWQgbWVudGFsLCBjb21vIGVsIG5pdmVsIGRlIGVzdHLDqXMuIEVuIGVzdGEgc2VjY2nDs24sIHNlIGFib3JkYSBsYSBpbXBsZW1lbnRhY2nDs24gZGUgbGEgcmVncmVzacOzbiBsaW5lYWwgc2ltcGxlIGVuIFIsIGRlc2NyaWJpZW5kbyBlbCBhanVzdGUgZGVsIG1vZGVsbywgc3UgaW50ZXJwcmV0YWNpw7NuIHkgbGEgdmFsaWRhY2nDs24gZGUgc3VwdWVzdG9zLg0KDQpQYXJhIGVsIGFuw6FsaXNpcywgc2UgdXRpbGl6w7MgbGEgZnVuY2nDs24gbG0oKSBkZSBSLCBlbXBsZWFuZG8gY29tbyB2YXJpYWJsZSBjb21vIHZhcmlhYmxlIGluZGVwZW5kaWVudGUgbGEgZWRhZCAoQWdlKSB5IGRlcGVuZGllbnRlIGVsIG7Dum1lcm8gZGUgc2VzaW9uZXMgdmlydHVhbGVzIChOdW1iZXJfb2ZfVmlydHVhbF9NZWV0aW5ncykgIA0KDQojIyMjIHJlc3VtZW4gTnVtYmVyIG9mIFZpcnR1YWwgTWVldGluZ3MgUzAxDQpgYGB7ciByZXN1bWVuX051bWJlcl9vZl9WaXJ0dWFsX01lZXRpbmdzX1MwMSwgZmlnLmFsaWduPSdjZW50ZXInfQ0Kc3VtbWFyeShjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX29yaWdpbmFsX2pvYl9yb2xlX3Byb21lZGlvJE51bWJlcl9vZl9WaXJ0dWFsX01lZXRpbmdzX1MwMSkNCg0KYGBgDQpgYGB7cn0NCmJveHBsb3QoY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9vcmlnaW5hbF9qb2Jfcm9sZV9wcm9tZWRpbyROdW1iZXJfb2ZfVmlydHVhbF9NZWV0aW5nc19TMDEsIG1haW4gPSAiRGlhZ3JhbWEgZGUgQ2FqYSBkZSBOdW1iZXIgb2YgVmlydHVhbCBNZWV0aW5ncyIsIGNvbCA9IGMoIm9yYW5nZSIpKQ0KYGBgDQoNCiMjIyMgcmVzdW1lbiBkZSBBZ2UgDQpgYGB7ciBBZ2VfUzAxLCBmaWcuYWxpZ249J2NlbnRlcid9DQpzdW1tYXJ5KGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfb3JpZ2luYWxfam9iX3JvbGVfcHJvbWVkaW8kQWdlX1MwMSkNCmBgYA0KYGBge3IgRGlhZ3JhbWFfZGVfY2FqYV9BZ2UsIGZpZy5hbGlnbj0nY2VudGVyJ30NCmJveHBsb3QoY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9vcmlnaW5hbF9qb2Jfcm9sZV9wcm9tZWRpbyRBZ2VfUzAxLCBtYWluID0gIkRpYWdyYW1hIGRlIENhamEgZGUgQWdlIiwgY29sID0gYygiZ29sZCIpKQ0KYGBgDQoNCiMjIyMgRGlhZ3JhbWEgZGUgZGlzcGVyc2nDs24gQWdlIHZzIE51bWJlciBvZiB2aXJ0dWFsIG1lZXRpbmdzDQpgYGB7ciBEaWFncmFtYV9kZV9kaXNwZXJzacOzbl9BZ2VfdnNfTnVtYmVyX29mX3ZpcnR1YWxfbWVldGluZ3MsIGZpZy5hbGlnbj0nY2VudGVyJ30NCnBsb3QoY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9vcmlnaW5hbF9qb2Jfcm9sZV9wcm9tZWRpbyRBZ2VfUzAxLCBjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX29yaWdpbmFsX2pvYl9yb2xlX3Byb21lZGlvJE51bWJlcl9vZl9WaXJ0dWFsX01lZXRpbmdzX1MwMSwgbWFpbiA9ICJEaWFncmFtYSBkZSBEaXNwZXJzacOzbiBBZ2UgdnMgTnVtYmVyIG9mIHZpcnR1YWwgbWVldGluZ3MiKQ0KYGBgDQoNCiMjIyMgRGlhZ3JhbWFzIHRvdGFsZXMgZGUgZGlzcGVyc2nDs24NCmBgYHtyIERpYWdyYW1hc190b3RhbGVzX2RlX2Rpc3BlcnNpw7NuLCBmaWcuYWxpZ249J2NlbnRlcid9DQpwYWlycyh+WWVhcnNfb2ZfRXhwZXJpZW5jZV9TMDEgKyBBZ2VfUzAxICsgSG91cnNfV29ya2VkX3Blcl93ZWVrX1MwMSArIE51bWJlcl9vZl9WaXJ0dWFsX01lZXRpbmdzX1MwMSwgZGF0YSA9IGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfb3JpZ2luYWxfam9iX3JvbGVfcHJvbWVkaW8pDQpgYGANCg0KKkZvcm11bGFjacOzbiBkZWwgbW9kZWxvIGRlIFJMUyBlbnRyZSBsYXMgdmFyaWFibGVzIGRlIGVzdHVkaW8qDQoNCiMjIyMgQ29lZmljaWVudGVzIGRlbCBtb2RlbG8gUkxTDQpgYGB7ciBDb2VmaWNpZW50ZXNfZGVsX21vZGVsb19STFMsIGZpZy5hbGlnbj0nY2VudGVyJ30NCm1vZGVsb19STF9TaW1wbGUgPSBsbShjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX29yaWdpbmFsX2pvYl9yb2xlX3Byb21lZGlvJE51bWJlcl9vZl9WaXJ0dWFsX01lZXRpbmdzX1MwMX5jZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX29yaWdpbmFsX2pvYl9yb2xlX3Byb21lZGlvJEFnZV9TMDEpDQpjb2VmKG1vZGVsb19STF9TaW1wbGUpDQpgYGANCg0KIyMjIyBSZXN1bWVuIGVzdGFkaXN0aWNvIGRlbCBtb2RlbG8gUkxTDQpgYGB7ciBSZXN1bWVuX2VzdGFkaXN0aWNvX2RlbF9tb2RlbG9fUkxTfQ0Kc3VtbWFyeShtb2RlbG9fUkxfU2ltcGxlKQ0KYGBgDQoNCiMjIyMgVGFibGEgQU5PVkEgcGFyYSBlbCBtb2RlbG8gUkxTDQpgYGB7ciBUYWJsYV9BTk9WQV9wYXJhX2VsX21vZGVsb19STFMsIGZpZy5hbGlnbj0nY2VudGVyJ30NCmFub3ZhKG1vZGVsb19STF9TaW1wbGUpDQpgYGANCiMjIyBBbsOhbGlzaXMgZGVsIG1vZGVsbyBSTFMuey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KIyMjIyBJbnRlcnZhbG8gZGUgY29uZmlhbnphIHBhcmEgQjENCmBgYHtyIEludGVydmFsb19kZV9jb25maWFuemFfcGFyYV9CMSwgZmlnLmFsaWduPSdjZW50ZXInfQ0KY29uZmludChtb2RlbG9fUkxfU2ltcGxlLCBsZXZlbCA9IDAuOTUpDQpgYGANCg0KIyMjIyBQcmVkaWNjaW9uZXMgeSAgc3VzIGludGVydmFsb3MgZGUgcHJlZGljY2nDs24NCmBgYHtyIFByZWRpY2Npb25lc195X3N1c19pbnRlcnZhbG9zX2RlX3ByZWRpY2Npw7NufQ0KcHJlZGljdChtb2RlbG9fUkxfU2ltcGxlLCBkYXRhLmZyYW1lKHNlcSgxLDcpKSwgaW50ZXJ2YWw9J3ByZWRpY3Rpb24nLCBsZXZlbCA9IDAuOTUpDQoNCmBgYA0KDQojIyMjIFByZWRpY2Npb25lcyB5IHN1cyBpbnRlcnZhbG9zIGRlIGNvbmZpYW56YQ0KYGBge3IgUHJlZGljY2lvbmVzX3lfc3VzX2ludGVydmFsb3NfZGVfY29uZmlhbnphLCBmaWcuYWxpZ249J2NlbnRlcid9DQpwcmVkaWN0KG1vZGVsb19STF9TaW1wbGUsIGRhdGEuZnJhbWUoc2VxKDEsNykpLCBpbnRlcnZhbD0nY29uZmlkZW5jZScsIGxldmVsID0gMC45NSkNCg0KDQpgYGANCg0KIyMjICoqNS4zIHJlZ3Jlc2nDs24gbGluZWFsIG11bHRpcGxlKiogey50YWJzZXQgLnRhYnNldC1waWxsc30NCkxhIHJlZ3Jlc2nDs24gbGluZWFsIG3Dumx0aXBsZSBlcyB1bmEgZXh0ZW5zacOzbiBkZWwgbW9kZWxvIGxpbmVhbCBzaW1wbGUgcXVlIHBlcm1pdGUgYW5hbGl6YXIgY8OzbW8gdmFyaWFzIHZhcmlhYmxlcyBpbmRlcGVuZGllbnRlcyBwcmVkaWNlbiBlbCBjb21wb3J0YW1pZW50byBkZSB1bmEgdmFyaWFibGUgZGVwZW5kaWVudGUuIEVuIGVsIG1hcmNvIGRlbCB0cmFiYWpvIHJlbW90byB5IGxhIHNhbHVkIG1lbnRhbCwgZXN0ZSBtb2RlbG8gZXMgw7p0aWwgcGFyYSBldmFsdWFyIGPDs21vIGZhY3RvcmVzIGNvbW8gbGFzIGhvcmFzIHRyYWJhamFkYXMgYSBsYSBzZW1hbmEgeSBlbCBudW1lcm8gZGUgc2VzaW9uZXMgdmlydHVhbGVzIGNvbWJpbmFkb3MsIGFmZWN0YW4gZWwgbml2ZWwgZGUgZXN0csOpcy4gRW4gZXN0YSBzZWNjacOzbiwgc2UgZGV0YWxsYSBsYSBpbXBsZW1lbnRhY2nDs24gZGUgbGEgcmVncmVzacOzbiBsaW5lYWwgbcO6bHRpcGxlIGVuIFIsIGV2YWx1YW5kbyBlbCBhanVzdGUgZGVsIG1vZGVsbyB5IHN1IGNhcGFjaWRhZCBleHBsaWNhdGl2YS4NCg0KIyMjIyBSZXN1bWVuIHZhcmlhYmxlcyBjdWFudGl0YXRpdmFzDQpgYGB7ciBSZXN1bWVuX3ZhcmlhYmxlc19jdWFudGl0YXRpdmFzXzEsIGZpZy5hbGlnbj0nY2VudGVyJ30NCnN1bW1hcnkoY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkbyRBZ2UpDQpgYGANCmBgYHtyIFJlc3VtZW5fdmFyaWFibGVzX2N1YW50aXRhdGl2YXNfMiwgZmlnLmFsaWduPSdjZW50ZXInfQ0Kc3VtbWFyeShjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvJFllYXJzX29mX0V4cGVyaWVuY2UpDQpgYGANCmBgYHtyIFJlc3VtZW5fdmFyaWFibGVzX2N1YW50aXRhdGl2YXNfMywgZmlnLmFsaWduPSdjZW50ZXInfQ0Kc3VtbWFyeShjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvJEhvdXJzX1dvcmtlZF9QZXJfV2VlaykNCmBgYA0KYGBge3IgUmVzdW1lbl92YXJpYWJsZXNfY3VhbnRpdGF0aXZhc180LCBmaWcuYWxpZ249J2NlbnRlcid9DQpzdW1tYXJ5KGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG8kTnVtYmVyX29mX1ZpcnR1YWxfTWVldGluZ3MpDQpgYGANCg0KIyMjIyBSZXN1bWVuIHZhcmlhYmxlcyBjdWFsaXRhdGl2YXMNCmBgYHtyIFJlc3VtZW4gdmFyaWFibGVzIGN1YWxpdGF0aXZhc18xLCBmaWcuYWxpZ249J2NlbnRlcid9DQp0YWJsZShjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvJEdlbmRlcikNCg0KYGBgDQpgYGB7ciBSZXN1bWVuIHZhcmlhYmxlcyBjdWFsaXRhdGl2YXNfMiwgZmlnLmFsaWduPSdjZW50ZXInfQ0KcHJvcC50YWJsZSh0YWJsZShjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvJEdlbmRlcikpDQpgYGANCmBgYHtyIFJlc3VtZW4gdmFyaWFibGVzIGN1YWxpdGF0aXZhc18zLCBmaWcuYWxpZ249J2NlbnRlcid9DQpiYXJwbG90KHRhYmxlKGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG8kR2VuZGVyKSkNCmBgYA0KDQpgYGB7ciBSZXN1bWVuIHZhcmlhYmxlcyBjdWFsaXRhdGl2YXNfNCwgZmlnLmFsaWduPSdjZW50ZXInfQ0KdGFibGUoY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkbyRKb2JfUm9sZSkNCg0KYGBgDQpgYGB7ciBSZXN1bWVuIHZhcmlhYmxlcyBjdWFsaXRhdGl2YXNfNSwgZmlnLmFsaWduPSdjZW50ZXInfQ0KcHJvcC50YWJsZSh0YWJsZShjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvJEpvYl9Sb2xlKSkNCmBgYA0KYGBge3IgUmVzdW1lbiB2YXJpYWJsZXMgY3VhbGl0YXRpdmFzXzYsIGZpZy5hbGlnbj0nY2VudGVyJ30NCmJhcnBsb3QodGFibGUoY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkbyRKb2JfUm9sZSkpDQpgYGANCg0KYGBge3IgUmVzdW1lbiB2YXJpYWJsZXMgY3VhbGl0YXRpdmFzXzcsIGZpZy5hbGlnbj0nY2VudGVyJ30NCnRhYmxlKGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG8kV29ya19Mb2NhdGlvbikNCg0KYGBgDQpgYGB7ciBSZXN1bWVuIHZhcmlhYmxlcyBjdWFsaXRhdGl2YXNfOCwgZmlnLmFsaWduPSdjZW50ZXInfQ0KcHJvcC50YWJsZSh0YWJsZShjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvJFdvcmtfTG9jYXRpb24pKQ0KYGBgDQpgYGB7ciBSZXN1bWVuIHZhcmlhYmxlcyBjdWFsaXRhdGl2YXNfOSwgZmlnLmFsaWduPSdjZW50ZXInfQ0KYmFycGxvdCh0YWJsZShjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvJFdvcmtfTG9jYXRpb24pKQ0KYGBgDQoNCmBgYHtyIFJlc3VtZW4gdmFyaWFibGVzIGN1YWxpdGF0aXZhc18xMCwgZmlnLmFsaWduPSdjZW50ZXInfQ0KdGFibGUoY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkbyRQcm9kdWN0aXZpdHlfQ2hhbmdlKQ0KDQpgYGANCmBgYHtyIFJlc3VtZW4gdmFyaWFibGVzIGN1YWxpdGF0aXZhc18xMSwgZmlnLmFsaWduPSdjZW50ZXInfQ0KcHJvcC50YWJsZSh0YWJsZShjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvJFByb2R1Y3Rpdml0eV9DaGFuZ2UpKQ0KYGBgDQpgYGB7ciBSZXN1bWVuIHZhcmlhYmxlcyBjdWFsaXRhdGl2YXNfMTIsIGZpZy5hbGlnbj0nY2VudGVyJ30NCmJhcnBsb3QodGFibGUoY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkbyRQcm9kdWN0aXZpdHlfQ2hhbmdlKSkNCmBgYA0KDQpgYGB7ciBSZXN1bWVuIHZhcmlhYmxlcyBjdWFsaXRhdGl2YXNfMTMsIGZpZy5hbGlnbj0nY2VudGVyJ30NCnRhYmxlKGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG8kU2xlZXBfUXVhbGl0eSkNCg0KYGBgDQpgYGB7ciBSZXN1bWVuIHZhcmlhYmxlcyBjdWFsaXRhdGl2YXNfMTQsIGZpZy5hbGlnbj0nY2VudGVyJ30NCnByb3AudGFibGUodGFibGUoY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkbyRTbGVlcF9RdWFsaXR5KSkNCmBgYA0KYGBge3IgUmVzdW1lbiB2YXJpYWJsZXMgY3VhbGl0YXRpdmFzXzE1LCBmaWcuYWxpZ249J2NlbnRlcid9DQpiYXJwbG90KHRhYmxlKGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG8kU2xlZXBfUXVhbGl0eSkpDQpgYGANCg0KIyMjIyBEaWFncmFtYXMgZGUgZGlzcGVyc2nDs24gdmFyaWFibGVzIGN1YW50aXRhdGl2YXMNCmBgYHtyIERpYWdyYW1hc19kZV9kaXNwZXJzacOzbl92YXJpYWJsZXNfY3VhbnRpdGF0aXZhc3N9DQpwYWlycyh+WWVhcnNfb2ZfRXhwZXJpZW5jZSArIEFnZSArIEhvdXJzX1dvcmtlZF9QZXJfV2VlayArIE51bWJlcl9vZl9WaXJ0dWFsX01lZXRpbmdzLCBkYXRhID0gY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkbykNCmBgYA0KDQojIyMgKio1LjQgcmVncmVzacOzbiBsb2fDrXN0aWNhIHNpbXBsZSoqIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNCiMjIyMgUmVzdW1lbiBkZSBudW1iZXIgb2YgdmlydHVhbCBtZWV0aW5ncyANCmBgYHtyIFJlc3VtZW5fZGVfbnVtYmVyX29mX3ZpcnR1YWxfbWVldGluZ3MsIGZpZy5hbGlnbj0nY2VudGVyJ30NCnN1bW1hcnkoY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkbyROdW1iZXJfb2ZfVmlydHVhbF9NZWV0aW5ncykNCg0KYGBgDQpgYGB7ciBkaWFncmFtYV9kZV9jYWphX251bWJlcl9vZl92aXJ0dWFsX21lZXRpbmdzLCBmaWcuYWxpZ249J2NlbnRlcid9DQpib3hwbG90KGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG8kTnVtYmVyX29mX1ZpcnR1YWxfTWVldGluZ3MsIG1haW4gPSAiRGlhZ3JhbWEgZGUgQ2FqYSBkZSBOdW1iZXIgb2YgdmlydHVhbCBtZWV0aW5ncyIsIGNvbCA9IGMoIm9yYW5nZSIpKQ0KYGBgDQoNCiMjIyMgUmVzdW1lbiBkZSBBZ2UNCmBgYHtyIFJlc3VtZW5fZGVfQWdlLCBmaWcuYWxpZ249J2NlbnRlcid9DQpzdW1tYXJ5KGNkZF9JbXBhY3Rfb2ZfUmVtb3RlX1dvcmtfb25fTWVudGFsX0hlYWx0aF9HMTFfZGVwdXJhZG8kQWdlKQ0KDQpgYGANCmBgYHtyIGRpYWdyYW1hX2RlX2NhamFfQWdlLGZpZy5hbGlnbj0nY2VudGVyJ30NCmJveHBsb3QoY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkbyRBZ2UsIG1haW4gPSAiRGlhZ3JhbWEgZGUgQ2FqYSBkZSBBZ2UiLCBjb2wgPSBjKCJnb2xkIikpDQoNCmBgYA0KDQojIyMjIERpYWdyYW1hIGRlIGRpc3BlcnNpb24gQWdlIHZzIE51bWJlciBvZiB2aXJ0dWFsIG1lZXRpbmdzDQpgYGB7ciBEaWFncmFtYV9kZV9kaXNwZXJzaW9uX0FnZV92c19OdW1iZXJfb2ZfdmlydHVhbF9tZWV0aW5ncywgZmlnLmFsaWduPSdjZW50ZXInfQ0KcGxvdChjZGRfSW1wYWN0X29mX1JlbW90ZV9Xb3JrX29uX01lbnRhbF9IZWFsdGhfRzExX2RlcHVyYWRvJEFnZSwgY2RkX0ltcGFjdF9vZl9SZW1vdGVfV29ya19vbl9NZW50YWxfSGVhbHRoX0cxMV9kZXB1cmFkbyROdW1iZXJfb2ZfVmlydHVhbF9NZWV0aW5ncywgbWFpbiA9ICJEaWFncmFtYSBkZSBEaXNwZXJzacOzbiBBZ2UgdnMuIE51bWJlciBvZiB2aXJ0dWFsIG1lZXRpbmdzIikNCmBgYA0KDQojIyAqKjYuIENvbmNsdXNpb25lcyoqDQoNCkVzdGUgYW7DoWxpc2lzIGhhIGV4cGxvcmFkbyBjw7NtbyBlbCB0cmFiYWpvIHJlbW90byBpbmZsdXllIGVuIGxhIHNhbHVkIG1lbnRhbCBkZSBsb3MgZW1wbGVhZG9zLCBlc3BlY8OtZmljYW1lbnRlIGVuIHJlbGFjacOzbiBjb24gZWwgbml2ZWwgZGUgZXN0csOpcywgYSB0cmF2w6lzIGRlIGRpdmVyc2FzIHTDqWNuaWNhcyBlc3RhZMOtc3RpY2FzIGltcGxlbWVudGFkYXMgZW4gUi4gU2UgdXRpbGl6YXJvbiBtw6l0b2RvcyBkZSBhZ3J1cGFjacOzbiwgdGFudG8gamVyw6FycXVpY29zIGNvbW8gbm8gamVyw6FycXVpY29zLCBwYXJhIHNlZ21lbnRhciBhIGxvcyBlbXBsZWFkb3Mgc2Vnw7puIHN1cyBjYXJhY3RlcsOtc3RpY2FzIHJlbGFjaW9uYWRhcyBjb24gZWwgZXN0csOpcyB5IG90cm9zIGZhY3RvcmVzIGxhYm9yYWxlcywgbG8gcXVlIHBlcm1pdGnDsyBpZGVudGlmaWNhciBwYXRyb25lcyBkaXN0aW50b3MgZW4gbGEgZXhwZXJpZW5jaWEgZGVsIHRyYWJham8gcmVtb3RvLiBFbiBsYSByZWdyZXNpw7NuIGxpbmVhbCBzaW1wbGUgeSBtw7psdGlwbGUsIHNlIGV2aWRlbmNpw7MgcXVlIGVsIGF1bWVudG8gZGUgbGFzIGhvcmFzIGRlIHRyYWJham8gcmVtb3RvIHRpZW5kZSBhIGVzdGFyIGFzb2NpYWRvIGNvbiB1biBtYXlvciBuaXZlbCBkZSBlc3Ryw6lzLiBTaW4gZW1iYXJnbywgbGEgcmVncmVzacOzbiBtw7psdGlwbGUgbW9zdHLDsyBxdWUgZmFjdG9yZXMgY29tbyBlbCBhcG95byBvcmdhbml6YWNpb25hbCB5IGxhIHNhdGlzZmFjY2nDs24gbGFib3JhbCB0aWVuZW4gdW4gaW1wYWN0byBwcm90ZWN0b3IsIG1pdGlnYW5kbyBlbCBlc3Ryw6lzIGFzb2NpYWRvIGNvbiBlbCB0cmFiYWpvIHJlbW90by4NCg0KRWwgYW7DoWxpc2lzIHRhbWJpw6luIHJlc2FsdMOzIGxhIGltcG9ydGFuY2lhIGRlIGdlc3Rpb25hciBhZGVjdWFkYW1lbnRlIHZhcmlhYmxlcyBjb21vIGxhIGNhcmdhIGhvcmFyaWEgeSBlbCBhcG95byBvcmdhbml6YWNpb25hbCBwYXJhIG1lam9yYXIgZWwgYmllbmVzdGFyIHBzaWNvbMOzZ2ljbyBkZSBsb3MgZW1wbGVhZG9zLiBTaSBiaWVuIGxvcyBtb2RlbG9zIGVtcGxlYWRvcyBwcm9wb3JjaW9uYW4gaW5mb3JtYWNpw7NuIHZhbGlvc2EsIGxvcyByZXN1bHRhZG9zIHN1Z2llcmVuIHF1ZSBvdHJvcyBmYWN0b3JlcyBubyBpbmNsdWlkb3MgZW4gbG9zIG1vZGVsb3MgdGFtYmnDqW4gcG9kcsOtYW4gaW5mbHVpciBlbiBsb3Mgbml2ZWxlcyBkZSBlc3Ryw6lzLCBsbyBxdWUgYWJyZSBsYSBwdWVydGEgYSBpbnZlc3RpZ2FjaW9uZXMgZnV0dXJhcy4gQWRlbcOhcywgc2UgcmVjb21pZW5kYSBlbCB1c28gZGUgdMOpY25pY2FzIG3DoXMgYXZhbnphZGFzIG8gbW9kZWxvcyBubyBsaW5lYWxlcyBwYXJhIGNhcHR1cmFyIGxhIGNvbXBsZWppZGFkIGRlIGxhcyByZWxhY2lvbmVzIGVudHJlIHZhcmlhYmxlcywgZXNwZWNpYWxtZW50ZSBjdWFuZG8gc2UgdHJhdGEgZGUgZmFjdG9yZXMgbXVsdGlmYWPDqXRpY29zIGNvbW8gZWwgdHJhYmFqbyByZW1vdG8geSBsYSBzYWx1ZCBtZW50YWwuDQoNCkVuIHJlc3VtZW4sIGVzdGUgZXN0dWRpbyBzdWJyYXlhIGxhIG5lY2VzaWRhZCBkZSBwb2zDrXRpY2FzIG9yZ2FuaXphY2lvbmFsZXMgcXVlIGFib3JkZW4gZGUgbWFuZXJhIGludGVncmFsIGxhIHNhbHVkIG1lbnRhbCBlbiBlbCBjb250ZXh0byBkZWwgdHJhYmFqbyByZW1vdG8sIHJlY29ub2NpZW5kbyB0YW50byBsb3Mgcmllc2dvcyBpbmhlcmVudGVzIGEgbGEgY2FyZ2EgbGFib3JhbCBjb21vIGxhcyBlc3RyYXRlZ2lhcyBkZSBhcG95byBxdWUgcHVlZGVuIG1pdGlnYXIgZXN0b3MgZWZlY3Rvcy4NCg0KIyMgKio3LiBCaWJsaW9ncmFmw61hKioNCg0KUmVtb3RlIHdvcmsgYW5kIG1lbnRhbCBoZWFsdGgoMjAyNCkgaHR0cHM6Ly93d3cua2FnZ2xlLmNvbS9kYXRhc2V0cy93YXFpNzg2L3JlbW90ZS13b3JrLWFuZC1tZW50YWwtaGVhbHRoDQoNCkFsZMOhcywgSi4sICYgVXJpZWwsIEUuICgyMDE3KS4gQW7DoWxpc2lzIG11bHRpdmFyaWFudGUgYXBsaWNhZG8gY29uIFIgKDJuZCBlZC4pLiBBTEZBQ0VOVEFVUk8uDQoNCkxpYnJlcm9zLCBHLiAoMjAyMykuIEVzdHVkaW8gZGUgYW7DoWxpc2lzIG11bHRpdmFyaWFkbyBjb24gYmFzZSBlbiB1biBjb25qdW50byBkZSBkYXRvcyBkZSBhc3BpcmFudGVzIGV4dHJhbmplcm9zIHBhcmEgc2VyIGFkbWl0aWRvcyBlbiBlc3R1ZGlvcyBzdXBlcmlvcmVzIGVuIEVFLlVVLiBJbiBSIE1BUktET1dOLiBodHRwczovL2dsaWJyZXJvc2wuZ2l0aHViLmlvL0FwcGxpZWQtU3RhdGlzdGljcy1GVUxMLyM4X0NhbGlkYWRfZGVfUmVwcmVzZW50YWNpJUMzJUIzbmh0dHBzOi8vZ2xpYnJlcm9zbC5naXRodWIuaW8vQXBwbGllZC1TdGF0aXN0aWNzLUZVTEwvDQoNCkTDrWF6IE1vcmFsZXMsIEwuIEcuLCAmIE1vcmFsZXMgUml2ZXJhLCBNLiBBLiAoMjAxMikuIEFuw6FsaXNpcyBlc3RhZMOtc3RpY28gZGUgZGF0b3MgbXVsdGl2YXJpYWRvcyAoMXN0IGVkLikuIFVOQUwuDQoNCg0K