Fase 1 [Descripciones Multivariables]

En la primera etapa del estudio, se llevarán a cabo cálculos, visualizaciones y un análisis detallado del conjunto de datos en el contexto de las operaciones de atención médica., que será descrito en la sección 1.2. Este proceso se abordará desde una perspectiva de estadística descriptiva multivariante, lo que permitirá no solo una visión general de los datos, sino también un análisis más enriquecido de las relaciones entre las diferentes variables involucradas.

1.1. Objetivos

El objetivo de este proyecto es aplicar técnicas de análisis multivariado para gestionar el conjunto de datos aprobado ER Wait Time, correspondientes a una simulación realista de las visitas de pacientes de las salas de urgencias, el proposito es organizar y procesar eficazmente la información, desarrollando habilidades en la gestión y análisis de datos.

1.2. Descripción de los datos

El conjunto de datos fue obtenido en su totalidad de Kaggle: (https://www.kaggle.com/datasets/rivalytics/er-wait-time). Kaggle es una plataforma en línea de ciencia de datos y aprendizaje automático, propiedad de Google LLC. Esta facilita la participación en competencias donde las empresas publican conjuntos de datos y problemas, permitiendo a los usuarios desarrollar modelos predictivos y competir. La plataforma también ofrece notebooks para compartir y colaborar en proyectos utilizando Python y R, así como una amplia colección de conjuntos de datos de acceso público. Además, Kaggle Learn, una sección de la plataforma dedicada a la educación y el aprendizaje en ciencia de datos y aprendizaje automático, proporciona tutoriales y cursos interactivos en temas como Python, SQL, visualización de datos y aprendizaje automático, dirigidos a principiantes y usuarios avanzados.

El conjunto de datos Tiempo de espera en urgencias, que simula las visitas de pacientes en salas de urgencias, se relaciona mediante la aplicación de áreas fundamentales de la Ingeniería Industrial: Diseño y Medicion del Trabajo(Work Desing & Measurement, area 1) donde analiza los tiempos y métodos de atención para optimizar tareas, reducir tiempos de espera y equilibrar la carga laboral del personal, luego en el area de Investigación y Análisis de Operaciones(Operations Research & Analysis, area 2) que construye modelos matemáticos a partir de los datos para mejorar el flujo de pacientes y la secuencia de atención, finalmente para garantizar la mejora continua, en el area Ingeniería de Calidad y Confiabilidad(Facilities Enginneering & Energy Management, area 4) utilizan los datos para monitorear que el servicio cumpla con los estándares definidos.

Consta de 14 campos y 5001 registros que reflejan información de estudios sobre tiempos de espera en urgencias, resultados de los pacientes y métricas de satisfacción, incorporando factores clave como los niveles de urgencia, las tendencias estacionales y la variabilidad horaria. 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 el tipo de variable y su escala de medición con base en la nomenclatura (tipo_de_variable::escala_de_medición[ordenamiento]):

  • nombre_hospital (cualitativa::nominal): La variable asigna un código único a cada paciente. Este código es estrictamente numérico y permite llevar un registro de los datos de ingreso del paciente para identificar a que hospital fue ingresado y asi registrarlo en el sistema. Los valores asignados y su interpretacion son:

  • 0: Northside Community Hospital

  • 1: Riverside Medical Center

  • 2: Springfield General Hospital

  • 3: St. Mary’s Regional Health

  • 4: Summit Health Center

  • zona (cualitativa::nominal): Esta variable asigna un codigo para representar el lugar proviente del paciente ingresado al hospital. Los valores asignados y su interpretacion son:

  • 0: Rural

  • 1: Urbano

  • dia_semana (cualitativa::ordinal): Representa el dia de la semana que fue ingresado el paciente al hospital. Los valores asignados y su interpretacion son:

  • 0: Lunes

  • 1: Martes

  • 2: Miercoles

  • 3: Jueves

  • 4: Viernes

  • 5: Sabado

  • 6: Domingo

  • tiempo_dia (cualitativa::ordinal): Esta variable indica el tiempo del dia el cual el paciente llega al hospital. Los valores asignados y su interpretacion son:

  • 0: Madrugada

  • 1: Medio Dia

  • 2: Tarde

  • 3: Noche

  • nivel_urgencia (cualitativa::ordinal): Representa el tipo de urgencia del paciente ingresado al hospital. Los valores asignados y su interpretacion son:

  • 0: Bajo

  • 1: Medio

  • 2: Alto

  • 3: Critico

  • relacion_enfermero_paciente (cuantitativa::razon): Esta variable nos indica cuantos enfermeros hay disponibles en el momento que ingresa el paciente al hospital.

  • especialista_disponible (cuantitativa::razon): Es la variable que indica la disponibilidad de especialistas por paciente ingresado en el hospital.

  • tamaño_instalacion_camas (cuantitativa::razon): Representa la disponibilidad de camillas que hay en el momento que el paciente ingresa al hospital.

  • tiempo_registro (cuantitativa::razon): Esta variable indica el tiempo en que el paciente fue registrado en el hospital. Esto evaluado en minutos.

  • tiempo_triage (cuantitativa::razon): Es la variable que inidica el tiempo por el cual el paciente se demora en ser atendido en el triage. El triage es un sistema de clasificación de pacientes en servicios de urgencias que evalúa la gravedad de su estado y la necesidad de atención médica. Esto evaluado en minutos.

  • tiempo_atencion_profesional_medico (cuantitativo::razon): Representa el tiempo por el cual el paciente es atendido por un profesional medico (medico general, pediatra, neurologo, cardiologo, etc.). Esto evaluado en minutos.

  • total_tiempo_espera (cuantitativa::razon): Esta variable representa el tiempo total de espera del paciente desde que entra, hasta ser evaluado o atendido en el hospital. Esto evaluado en minutos.

  • resultado_paciente (cualitativa::nominal): Es la variable que indica el resultado de la valoracion final del paciente. Los valores asignados y su interpretacion son:

  • 0: Admitido

  • 1: Dado de alta

  • 2: Se marcho sin ser atendido

  • satisfaccion_paciente (cualitativa::ordinal): Esta variable representa la calificacion de satisfaccion que tuvo el paciente en el hospital. Los valores asignados y su interpretacion son:

  • 1: Muy insatisfecho

  • 2: Insatisfecho

  • 3: Neutral

  • 4: Satisfecho

  • 5: Muy satisfecho

Estructura del Conjunto de Datos Original.

A partir de la estructura del conjunto de datos original, se observa que la base está conformada por 5.000 registros y 14 variables, lo que evidencia un volumen de información robusto y adecuado para realizar análisis estadísticos y modelaciones relacionadas con la atención en salas de urgencias. El conjunto integra tanto variables cualitativas como cuantitativas, permitiendo un abordaje integral del fenómeno estudiado. Entre las variables categóricas se incluyen el nombre del hospital, la zona (urbana o rural), el día de la semana, la temporada, el nivel de urgencia y el resultado del paciente, las cuales aportan contexto institucional, temporal y clínico. Por su parte, las variables numéricas recogen información clave sobre la capacidad instalada y el desempeño del servicio, tales como la relación enfermera–paciente, el número de especialistas disponibles, el tamaño de la instalación en camas y los diferentes tiempos del proceso de atención (registro, triage, atención médica y tiempo total de espera). Adicionalmente, la variable de satisfacción del paciente permite evaluar la percepción del usuario frente al servicio recibido. En conjunto, esta estructura de datos facilita el análisis de la eficiencia operativa, la calidad de la atención y la experiencia del paciente en los servicios de urgencias, constituyéndose en una base sólida para la toma de decisiones y la formulación de estrategias de mejora en el sistema de salud.

str(conjunto_datos_original)
## tibble [5,000 × 19] (S3: tbl_df/tbl/data.frame)
##  $ Visit ID                          : chr [1:5000] "HOSP-1-20240210-0001" "HOSP-3-20241128-0001" "HOSP-3-20240930-0002" "HOSP-2-20240227-0001" ...
##  $ Patient ID                        : chr [1:5000] "PAT-00001" "PAT-00002" "PAT-00003" "PAT-00004" ...
##  $ Hospital ID                       : chr [1:5000] "HOSP-1" "HOSP-3" "HOSP-3" "HOSP-2" ...
##  $ Hospital Name                     : chr [1:5000] "Springfield General Hospital" "Northside Community Hospital" "Northside Community Hospital" "Riverside Medical Center" ...
##  $ Region                            : chr [1:5000] "Urban" "Rural" "Rural" "Urban" ...
##  $ Visit Date                        : POSIXct[1:5000], format: "2024-02-10 20:20:56" "2024-11-28 02:07:47" ...
##  $ Day of Week                       : chr [1:5000] "Saturday" "Thursday" "Monday" "Tuesday" ...
##  $ Season                            : chr [1:5000] "Winter" "Fall" "Fall" "Winter" ...
##  $ Time of Day                       : chr [1:5000] "Late Morning" "Evening" "Evening" "Evening" ...
##  $ Urgency Level                     : chr [1:5000] "Medium" "Medium" "Low" "High" ...
##  $ Nurse-to-Patient Ratio            : num [1:5000] 4 4 5 4 4 3 4 3 4 1 ...
##  $ Specialist Availability           : num [1:5000] 3 0 1 5 8 7 2 2 3 4 ...
##  $ Facility Size (Beds)              : num [1:5000] 92 38 38 94 74 167 42 84 87 99 ...
##  $ Time to Registration (min)        : num [1:5000] 17 9 38 8 26 12 22 8 16 3 ...
##  $ Time to Triage (min)              : num [1:5000] 22 30 40 16 29 15 37 25 27 3 ...
##  $ Time to Medical Professional (min): num [1:5000] 66 30 125 64 63 36 57 48 35 5 ...
##  $ Total Wait Time (min)             : num [1:5000] 105 69 203 88 118 63 116 81 78 11 ...
##  $ Patient Outcome                   : chr [1:5000] "Discharged" "Discharged" "Discharged" "Discharged" ...
##  $ Patient Satisfaction              : num [1:5000] 1 3 1 2 1 3 1 2 2 5 ...

Visualizacion del Conjunto de Datos.

A partir de la estructura del conjunto de datos original, se observa que la base está conformada por 5.000 registros y 14 variables, lo que evidencia un volumen de información robusto y adecuado para realizar análisis estadísticos y modelaciones relacionadas con la atención en salas de urgencias. El conjunto integra tanto variables cualitativas como cuantitativas, permitiendo un abordaje integral del fenómeno estudiado. Entre las variables categóricas se incluyen el nombre del hospital, la zona (urbana o rural), el día de la semana, la temporada, el nivel de urgencia y el resultado del paciente, las cuales aportan contexto institucional, temporal y clínico. Por su parte, las variables numéricas recogen información clave sobre la capacidad instalada y el desempeño del servicio, tales como la relación enfermera–paciente, el número de especialistas disponibles, el tamaño de la instalación en camas y los diferentes tiempos del proceso de atención (registro, triage, atención médica y tiempo total de espera). Adicionalmente, la variable de satisfacción del paciente permite evaluar la percepción del usuario frente al servicio recibido. En conjunto, esta estructura de datos facilita el análisis de la eficiencia operativa, la calidad de la atención y la experiencia del paciente en los servicios de urgencias, constituyéndose en una base sólida para la toma de decisiones y la formulación de estrategias de mejora en el sistema de salud.

str(visita_pacientes_sala_urgencias_ETL)
## tibble [5,000 × 14] (S3: tbl_df/tbl/data.frame)
##  $ nombre_hospitales                 : chr [1:5000] "Springfield General Hospital" "Northside Community Hospital" "Northside Community Hospital" "Riverside Medical Center" ...
##  $ zona                              : chr [1:5000] "Urban" "Rural" "Rural" "Urban" ...
##  $ dia_semana                        : chr [1:5000] "Saturday" "Thursday" "Monday" "Tuesday" ...
##  $ temporada                         : chr [1:5000] "Late Morning" "Evening" "Evening" "Evening" ...
##  $ nivel_urgencia                    : chr [1:5000] "Medium" "Medium" "Low" "High" ...
##  $ relacion_enfermera_paciente       : num [1:5000] 4 4 5 4 4 3 4 3 4 1 ...
##  $ especialistas_disponibles         : num [1:5000] 3 0 1 5 8 7 2 2 3 4 ...
##  $ tamaño_instalacion_camas          : num [1:5000] 92 38 38 94 74 167 42 84 87 99 ...
##  $ tiempo_registro                   : num [1:5000] 17 9 38 8 26 12 22 8 16 3 ...
##  $ tiempo_triage                     : num [1:5000] 22 30 40 16 29 15 37 25 27 3 ...
##  $ tiempo_atencion_profesional_medico: num [1:5000] 66 30 125 64 63 36 57 48 35 5 ...
##  $ tiempo_total_espera               : num [1:5000] 105 69 203 88 118 63 116 81 78 11 ...
##  $ resultado_paciente                : chr [1:5000] "Discharged" "Discharged" "Discharged" "Discharged" ...
##  $ satisfaccion_paciente             : num [1:5000] 1 3 1 2 1 3 1 2 2 5 ...

1.3. Estimaciones Multivariada

El vector de medias y la matriz de varianzas-covarianzas conforman un conjunto de herramientas fundamentales para describir el comportamiento posicional, dispersivo y correlacional de las variables aleatorias en un conjunto de datos. Estas medidas son esenciales en el análisis multivariado, ya que permiten capturar tanto la tendencia central como las interdependencias entre las variables.

El vector de medias refleja el valor esperado o punto medio de cada variable, sintetizando la información de todos los registros disponibles en el conjunto de datos. Por su parte, la matriz de varianzas-covarianzas describe la variabilidad y las relaciones entre las variables. En su diagonal principal, estima las dispersiones individuales de cada variable respecto a su media, mientras que los elementos por encima o por debajo de esta diagonal representan las covarianzas entre pares de variables, mostrando las relaciones lineales existentes entre ellas.

Vector de Medias y Boxplots.

A partir del vector de medias y el análisis gráfico mediante boxplots, se obtienen resultados relevantes sobre el comportamiento promedio y la dispersión de las principales variables operativas del servicio de urgencias. En términos de recursos, la relación promedio enfermera–paciente se sitúa en 3,24, lo que sugiere una carga asistencial moderada para el personal de enfermería, mientras que el promedio de especialistas disponibles es de 3,88, evidenciando una disponibilidad relativamente estable de profesionales médicos.

El tamaño promedio de las instalaciones, cercano a 87 camas, refleja una capacidad hospitalaria considerable, aunque los boxplots muestran una variabilidad importante entre instituciones, lo que indica diferencias estructurales significativas. En relación con los tiempos del proceso de atención, el tiempo promedio de registro es de aproximadamente 11,7 minutos y el tiempo de triage alcanza en promedio 24,8 minutos, valores que, aunque razonables, presentan dispersión y presencia de valores atípicos, lo que sugiere posibles cuellos de botella en determinados periodos o centros hospitalarios. El tiempo promedio de atención médica profesional se ubica en 45,4 minutos, siendo uno de los componentes más relevantes del proceso asistencial. Como resultado de la acumulación de estas etapas, el tiempo total promedio de espera asciende a 81,9 minutos, con una amplia variabilidad observada en los boxplots, lo que evidencia desigualdades en la eficiencia operativa del servicio de urgencias.

Finalmente, la satisfacción promedio del paciente, con un valor de 2,77 en la escala utilizada, indica un nivel de satisfacción moderado, coherente con los tiempos de espera observados. La dispersión reflejada en el diagrama de cajas sugiere experiencias heterogéneas entre los pacientes, posiblemente asociadas a diferencias en recursos disponibles, carga asistencial y capacidad instalada. En conjunto, estos resultados permiten identificar oportunidades de mejora en la gestión del talento humano y en la optimización de los tiempos del proceso, con el fin de reducir la espera y mejorar la percepción del servicio por parte de los usuarios.

apply(visita_pacientes_sala_urgencias_ETL[,-c(1,2,3,4,5,13)], 2, mean)
##        relacion_enfermera_paciente          especialistas_disponibles 
##                             3.2382                             3.8750 
##           tamaño_instalacion_camas                    tiempo_registro 
##                            87.1188                            11.7042 
##                      tiempo_triage tiempo_atencion_profesional_medico 
##                            24.8270                            45.3854 
##                tiempo_total_espera              satisfaccion_paciente 
##                            81.9166                             2.7716
visita_pacientes_sala_urgencias_ETL_reducido = visita_pacientes_sala_urgencias_ETL[,-c(1,2,3,4,5,13)]
nombres_boxplots <- c("relacion_enfermera_paciente", "especialistas_disponibles", "tamaño_instalacion_camas", "tiempo_registro", "tiempo_triage", "tiempo_atencion_profesional_medico", "tiempo_total_espera", "satisfaccion_paciente")
par(mfrow = c(1, ncol(visita_pacientes_sala_urgencias_ETL_reducido)))
invisible(lapply(1:ncol(visita_pacientes_sala_urgencias_ETL_reducido), function(i) 
{
  boxplot(visita_pacientes_sala_urgencias_ETL_reducido[, i],
          main = nombres_boxplots[i])}))

Matriz de Varianzas-Covarianzas

A partir de la matriz de varianzas–covarianzas, se obtiene una visión detallada sobre la variabilidad individual de las variables y la relación conjunta entre los principales indicadores operativos y de percepción del servicio de urgencias. En primer lugar, las varianzas, observadas en la diagonal principal, muestran que las variables asociadas a los tiempos del proceso asistencial presentan la mayor dispersión. Destaca especialmente el tiempo total de espera, con una varianza elevada (4635,50), seguido del tiempo de atención profesional médica (1268,78) y del tiempo de triage (615,44), lo que evidencia una alta heterogeneidad en la duración de la atención entre pacientes y contextos hospitalarios. Esta variabilidad sugiere inconsistencias operativas y posibles cuellos de botella en el servicio.

En cuanto a las covarianzas, se identifican relaciones positivas significativas entre los distintos tiempos del proceso. El tiempo de triage presenta una covarianza alta con el tiempo de atención profesional médica (773,33) y con el tiempo total de espera (1610,68), lo que indica que incrementos en la duración del triage tienden a asociarse con mayores tiempos de espera global. De igual forma, el tiempo de atención médica muestra una covarianza elevada con el tiempo total de espera (2368,05), confirmando que esta etapa es un componente determinante en la acumulación del tiempo total que experimenta el paciente.

Por otro lado, las covarianzas entre los recursos disponibles (relación enfermera–paciente, especialistas disponibles y tamaño de la instalación en camas) y los tiempos del proceso son en general bajas o moderadas, lo que sugiere que, si bien los recursos influyen en la atención, su impacto no es uniforme y puede estar mediado por factores organizacionales o de gestión. Finalmente, la variable satisfacción del paciente presenta covarianzas negativas con los tiempos de atención, especialmente con el tiempo total de espera (-83,91) y el tiempo de atención profesional médica (-43,52), lo que indica que a mayores tiempos de espera y atención, menor es el nivel de satisfacción percibido. En conjunto, estos resultados refuerzan la importancia de optimizar los tiempos del proceso asistencial como estrategia clave para mejorar la eficiencia del servicio de urgencias y la experiencia del paciente.

round(cov(visita_pacientes_sala_urgencias_ETL[,-c(1,2,3,4,5,13)]),2)
##                                    relacion_enfermera_paciente
## relacion_enfermera_paciente                               1.44
## especialistas_disponibles                                 0.01
## tamaño_instalacion_camas                                  0.20
## tiempo_registro                                           8.17
## tiempo_triage                                            19.27
## tiempo_atencion_profesional_medico                       28.81
## tiempo_total_espera                                      56.25
## satisfaccion_paciente                                    -1.26
##                                    especialistas_disponibles
## relacion_enfermera_paciente                             0.01
## especialistas_disponibles                               9.26
## tamaño_instalacion_camas                               88.82
## tiempo_registro                                         0.21
## tiempo_triage                                          -0.04
## tiempo_atencion_profesional_medico                      1.20
## tiempo_total_espera                                     1.36
## satisfaccion_paciente                                  -0.06
##                                    tamaño_instalacion_camas tiempo_registro
## relacion_enfermera_paciente                            0.20            8.17
## especialistas_disponibles                             88.82            0.21
## tamaño_instalacion_camas                            3363.84            2.06
## tiempo_registro                                        2.06          108.94
## tiempo_triage                                        -18.21          221.91
## tiempo_atencion_profesional_medico                     2.02          325.93
## tiempo_total_espera                                  -14.13          656.78
## satisfaccion_paciente                                 -0.87          -12.28
##                                    tiempo_triage
## relacion_enfermera_paciente                19.27
## especialistas_disponibles                  -0.04
## tamaño_instalacion_camas                  -18.21
## tiempo_registro                           221.91
## tiempo_triage                             615.44
## tiempo_atencion_profesional_medico        773.33
## tiempo_total_espera                      1610.68
## satisfaccion_paciente                     -28.12
##                                    tiempo_atencion_profesional_medico
## relacion_enfermera_paciente                                     28.81
## especialistas_disponibles                                        1.20
## tamaño_instalacion_camas                                         2.02
## tiempo_registro                                                325.93
## tiempo_triage                                                  773.33
## tiempo_atencion_profesional_medico                            1268.78
## tiempo_total_espera                                           2368.05
## satisfaccion_paciente                                          -43.52
##                                    tiempo_total_espera satisfaccion_paciente
## relacion_enfermera_paciente                      56.25                 -1.26
## especialistas_disponibles                         1.36                 -0.06
## tamaño_instalacion_camas                        -14.13                 -0.87
## tiempo_registro                                 656.78                -12.28
## tiempo_triage                                  1610.68                -28.12
## tiempo_atencion_profesional_medico             2368.05                -43.52
## tiempo_total_espera                            4635.50                -83.91
## satisfaccion_paciente                           -83.91                  2.03

Matriz de Correlaciones

A partir del análisis de la matriz de correlaciones, se identifican relaciones lineales claras entre las variables asociadas a los recursos, los tiempos del proceso asistencial y la satisfacción del paciente en el servicio de urgencias. En primer lugar, se observa que la relación enfermera–paciente presenta correlaciones positivas moderadas a altas con los distintos tiempos de atención, destacándose su asociación con el tiempo total de espera (0,688), el tiempo de atención profesional médica (0,674), el tiempo de registro (0,652) y el tiempo de triage (0,647). Estos resultados indican que, a medida que aumenta la carga de pacientes por profesional de enfermería, tienden a incrementarse de manera consistente los tiempos del proceso asistencial.

Por su parte, las variables relacionadas con la disponibilidad de recursos estructurales, como el número de especialistas disponibles y el tamaño de la instalación en camas, muestran correlaciones bajas o cercanas a cero con los tiempos de atención, lo que sugiere que la sola existencia de mayor infraestructura o personal especializado no garantiza reducciones en los tiempos del servicio, sino que estos dependen en mayor medida de la organización y gestión de los procesos. No obstante, se identifica una correlación positiva moderada entre especialistas disponibles y tamaño de la instalación (0,503), lo que refleja coherencia entre la capacidad instalada y la dotación de personal médico.

En cuanto a los tiempos del proceso, se evidencian correlaciones muy altas y positivas entre el tiempo de registro, el tiempo de triage, el tiempo de atención profesional médica y el tiempo total de espera, destacándose la relación entre el tiempo de atención médica y el tiempo total de espera (0,976). Este resultado confirma que los retrasos en cualquiera de las etapas del proceso asistencial tienen un efecto acumulativo sobre el tiempo total que experimenta el paciente.

Finalmente, la satisfacción del paciente presenta correlaciones negativas altas con todos los tiempos de atención, especialmente con el tiempo total de espera (-0,865), el tiempo de atención profesional médica (-0,858) y el tiempo de registro (-0,826). Esto evidencia que el aumento en los tiempos de espera y atención impacta de manera directa y significativa en la percepción negativa del servicio. En conjunto, los resultados de la matriz de correlaciones refuerzan la necesidad de implementar estrategias orientadas a optimizar la gestión del personal de enfermería y a reducir los tiempos críticos del proceso asistencial, con el fin de mejorar tanto la eficiencia operativa como la satisfacción del paciente en las salas de urgencias.

round(cor(visita_pacientes_sala_urgencias_ETL[,-c(1,2,3,4,5,13)]),3)
##                                    relacion_enfermera_paciente
## relacion_enfermera_paciente                              1.000
## especialistas_disponibles                                0.003
## tamaño_instalacion_camas                                 0.003
## tiempo_registro                                          0.652
## tiempo_triage                                            0.647
## tiempo_atencion_profesional_medico                       0.674
## tiempo_total_espera                                      0.688
## satisfaccion_paciente                                   -0.739
##                                    especialistas_disponibles
## relacion_enfermera_paciente                            0.003
## especialistas_disponibles                              1.000
## tamaño_instalacion_camas                               0.503
## tiempo_registro                                        0.007
## tiempo_triage                                         -0.001
## tiempo_atencion_profesional_medico                     0.011
## tiempo_total_espera                                    0.007
## satisfaccion_paciente                                 -0.015
##                                    tamaño_instalacion_camas tiempo_registro
## relacion_enfermera_paciente                           0.003           0.652
## especialistas_disponibles                             0.503           0.007
## tamaño_instalacion_camas                              1.000           0.003
## tiempo_registro                                       0.003           1.000
## tiempo_triage                                        -0.013           0.857
## tiempo_atencion_profesional_medico                    0.001           0.877
## tiempo_total_espera                                  -0.004           0.924
## satisfaccion_paciente                                -0.011          -0.826
##                                    tiempo_triage
## relacion_enfermera_paciente                0.647
## especialistas_disponibles                 -0.001
## tamaño_instalacion_camas                  -0.013
## tiempo_registro                            0.857
## tiempo_triage                              1.000
## tiempo_atencion_profesional_medico         0.875
## tiempo_total_espera                        0.954
## satisfaccion_paciente                     -0.796
##                                    tiempo_atencion_profesional_medico
## relacion_enfermera_paciente                                     0.674
## especialistas_disponibles                                       0.011
## tamaño_instalacion_camas                                        0.001
## tiempo_registro                                                 0.877
## tiempo_triage                                                   0.875
## tiempo_atencion_profesional_medico                              1.000
## tiempo_total_espera                                             0.976
## satisfaccion_paciente                                          -0.858
##                                    tiempo_total_espera satisfaccion_paciente
## relacion_enfermera_paciente                      0.688                -0.739
## especialistas_disponibles                        0.007                -0.015
## tamaño_instalacion_camas                        -0.004                -0.011
## tiempo_registro                                  0.924                -0.826
## tiempo_triage                                    0.954                -0.796
## tiempo_atencion_profesional_medico               0.976                -0.858
## tiempo_total_espera                              1.000                -0.865
## satisfaccion_paciente                           -0.865                 1.000

1.4. Gráficas multivariadas

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

Con base en la pestaña Vector de Medias y Boxplots, se puede describir que, en general, los datos registrados para cada una de las variables tienden a presentar distribuciones con colas específicas.

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

A partir del diagrama conjunto de dispersión, distribución y correlaciones, se obtiene una visión integral del comportamiento individual de las variables y de las relaciones existentes entre los recursos, los tiempos del proceso asistencial y la satisfacción del paciente en la sala de urgencias. En la diagonal principal se observan las distribuciones univariadas, donde las variables asociadas a los tiempos de atención presentan distribuciones asimétricas hacia la derecha, lo que indica la presencia de casos con tiempos considerablemente más altos que el promedio. Esta característica es consistente con la naturaleza del servicio de urgencias, en el que se presentan episodios de congestión y alta demanda.

Los diagramas de dispersión refuerzan los resultados obtenidos previamente en la matriz de correlaciones, evidenciando relaciones lineales fuertes y positivas entre los distintos tiempos del proceso, especialmente entre el tiempo de registro, el tiempo de triage, el tiempo de atención profesional médica y el tiempo total de espera. La concentración de puntos en patrones ascendentes confirma que los retrasos en una etapa del proceso tienden a propagarse y acumularse en el tiempo total de espera del paciente, lo que pone de manifiesto la interdependencia operativa de estas fases.

En contraste, las variables relacionadas con la disponibilidad de recursos estructurales, como el número de especialistas disponibles y el tamaño de la instalación en camas, muestran nubes de puntos dispersas y sin una tendencia clara frente a los tiempos de atención, lo que coincide con las correlaciones bajas observadas. Esto sugiere que la infraestructura y el personal disponible, por sí solos, no determinan la eficiencia del servicio, sino que su impacto depende de la forma en que se gestionan los procesos internos. Finalmente, la satisfacción del paciente exhibe una relación inversa clara con los tiempos de atención, reflejada tanto en las correlaciones negativas como en los diagramas de dispersión con pendiente descendente. A mayores tiempos de espera y atención, menor es el nivel de satisfacción reportado, lo que confirma que la percepción del servicio está fuertemente condicionada por la oportunidad de la atención. En conjunto, el diagrama conjunto valida gráficamente los resultados estadísticos previos y refuerza la necesidad de enfocar las estrategias de mejora en la optimización de los tiempos críticos del proceso asistencial, más que únicamente en la ampliación de recursos físicos o humanos.

ggpairs(visita_pacientes_sala_urgencias_ETL[,-c(1,2,3,4,5,13)])

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

A partir del diagrama conjunto de dispersión, distribución y correlaciones [CA], se profundiza el análisis de la relación entre las etapas del proceso asistencial considerando la clasificación por nivel de urgencia. En las distribuciones univariadas se observa que los tiempos de registro, triage, atención profesional médica y tiempo total de espera presentan asimetría positiva en todos los niveles de urgencia, siendo más pronunciada en los casos de urgencia baja y media, lo que indica una mayor concentración de pacientes con tiempos prolongados en estos grupos. En contraste, los casos clasificados como críticos muestran distribuciones más concentradas en valores bajos, reflejando una priorización efectiva en la atención.

Los diagramas de dispersión evidencian relaciones lineales fuertes y positivas entre las distintas etapas del proceso asistencial, independientemente del nivel de urgencia. Sin embargo, la intensidad de estas relaciones varía según la clasificación clínica. Destaca que, para los pacientes críticos, las correlaciones entre tiempos son elevadas pero ligeramente inferiores a las observadas en los niveles de urgencia alta, media y baja, lo que sugiere una mayor estandarización y control del proceso en situaciones de mayor gravedad. Asimismo, se observa que los pacientes clasificados con urgencia alta y media presentan una mayor dispersión en los tiempos, particularmente en la relación entre tiempo de atención profesional médica y tiempo total de espera, lo que evidencia una mayor heterogeneidad en la gestión de estos casos. Por su parte, los pacientes de urgencia baja concentran los valores más altos de tiempo total de espera, lo que sugiere que estos casos tienden a postergarse frente a situaciones más graves, generando acumulación de tiempos.

En conjunto, este diagrama confirma que, aunque existe una estructura común de dependencia entre los tiempos del proceso asistencial, el nivel de urgencia modula de manera significativa la magnitud y variabilidad de dichas relaciones. Estos resultados resaltan la necesidad de fortalecer la gestión operativa y los mecanismos de triage, especialmente en los casos de urgencia media y baja, con el fin de reducir los tiempos de espera y mejorar la eficiencia del servicio sin comprometer la atención prioritaria de los pacientes críticos.

visita_pacientes_sala_urgencias_ETL$nivel_urgencia <- factor(visita_pacientes_sala_urgencias_ETL$nivel_urgencia)
levels= c (1,2,3,4)
labels= c ( "Low" , "Medium", "High", "Critical")
ggpairs(visita_pacientes_sala_urgencias_ETL, column = c(9,10,11,12), aes(color = nivel_urgencia, alpha = 0.5), upper = list(continuous = wrap("cor", size = 2.5)))

Diagrama de Estrellas

A partir del diagrama de estrellas, se obtiene una representación visual sintética del comportamiento conjunto de los tiempos del proceso asistencial en la sala de urgencias, permitiendo comparar simultáneamente múltiples variables para cada observación o grupo analizado. Cada estrella integra los valores del tiempo de registro, tiempo de triage, tiempo de atención profesional médica y tiempo total de espera, donde el tamaño y la extensión de cada eje reflejan la magnitud relativa de dichos tiempos.

El análisis visual evidencia una alta heterogeneidad en la forma y tamaño de las estrellas, lo que indica una variabilidad considerable en la experiencia de atención de los pacientes. Las estrellas de mayor tamaño, caracterizadas por ejes más extendidos, corresponden a casos con tiempos elevados en varias etapas del proceso, especialmente en el tiempo de atención profesional médica y el tiempo total de espera, lo que sugiere acumulación de demoras a lo largo del flujo asistencial. Por el contrario, las estrellas de menor tamaño representan atenciones más ágiles, con tiempos reducidos y una mayor eficiencia operativa.

En conjunto, el diagrama de estrellas permite identificar de manera clara patrones de eficiencia e ineficiencia en la atención de urgencias, facilitando la detección de casos extremos y de configuraciones típicas de tiempos prolongados. Estos resultados refuerzan la necesidad de focalizar las estrategias de mejora en las etapas críticas del proceso asistencial, con el objetivo de reducir la variabilidad en los tiempos de atención y mejorar la experiencia global del paciente.

set.seed(120522)
stars(visita_pacientes_sala_urgencias_ETL[sample(1:nrow(visita_pacientes_sala_urgencias_ETL),23),-c(1,2,3,4,5,6,7,8,13,14)], len = 1, cex = 0.4, key.loc = c(10, 2), 
draw.segments = TRUE)

Caras de Chernoff.

A partir del análisis de las caras de Chernoff, se obtiene una representación gráfica multivariada que permite sintetizar de forma intuitiva el comportamiento conjunto de los principales indicadores del proceso asistencial en la sala de urgencias. Cada rostro representa una observación o grupo de observaciones, mientras que los rasgos faciales —como la forma y tamaño de los ojos, la boca y la expresión general— codifican diferentes variables del estudio, tales como los tiempos de registro, triage, atención profesional médica, tiempo total de espera y nivel de satisfacción del paciente.

El análisis visual evidencia una predominancia de expresiones neutras a negativas, lo que sugiere que una proporción importante de los casos analizados presenta combinaciones de variables asociadas a tiempos de atención elevados y niveles de satisfacción bajos. Las caras con rasgos más tensos o expresiones menos favorables corresponden a observaciones en las que los tiempos de espera y atención son mayores, lo que refuerza la relación inversa previamente identificada entre la duración del proceso asistencial y la percepción del servicio por parte del paciente.

En conjunto, las caras de Chernoff permiten detectar patrones y casos atípicos de manera rápida y comprensible, complementando los análisis estadísticos y gráficos previos. Esta técnica visual confirma la necesidad de enfocar las estrategias de mejora en la reducción de los tiempos críticos del proceso asistencial, con el fin de aumentar la proporción de experiencias positivas y mejorar la satisfacción global de los pacientes atendidos en la sala de urgencias.

set.seed(120522)
visita_pacientes_sala_urgencia_Muestreado = visita_pacientes_sala_urgencias_ETL [sample(1:nrow(visita_pacientes_sala_urgencias_ETL),23),-c(1,2,3,4,5,6,7,8,13,14)]
faces(visita_pacientes_sala_urgencia_Muestreado)

## effect of variables:
##  modified item       Var                                 
##  "height of face   " "tiempo_registro"                   
##  "width of face    " "tiempo_triage"                     
##  "structure of face" "tiempo_atencion_profesional_medico"
##  "height of mouth  " "tiempo_total_espera"               
##  "width of mouth   " "tiempo_registro"                   
##  "smiling          " "tiempo_triage"                     
##  "height of eyes   " "tiempo_atencion_profesional_medico"
##  "width of eyes    " "tiempo_total_espera"               
##  "height of hair   " "tiempo_registro"                   
##  "width of hair   "  "tiempo_triage"                     
##  "style of hair   "  "tiempo_atencion_profesional_medico"
##  "height of nose  "  "tiempo_total_espera"               
##  "width of nose   "  "tiempo_registro"                   
##  "width of ear    "  "tiempo_triage"                     
##  "height of ear   "  "tiempo_atencion_profesional_medico"

1.5. Normalidad multivariada

Es posible analizar o determinar la distribución multivariada de un conjunto de datos mediante métodos descriptivos, como los gráficos, o inferenciales, como las pruebas estadísticas. Mientras que los procedimientos inferenciales permiten obtener conclusiones más generalizables, los gráficos resultan útiles como soporte para la interpretación de los resultados.

En este apartado se aborda la aplicación de procedimientos inferenciales para verificar si el conjunto de datos de trabajo, respecto a sus variables numéricas, sigue una distribución normal multivariada (DNM). Las pruebas de normalidad multivariada (PNM) que se aplicarán son: Mardia, Henze-Zirkler, Doornik-Hansen y Royston. Estas pruebas de normalidad se realizan bajo un nivel de significancia determinado \(\alpha = 0.05\) y a las hipótesis:\[H_0: \text {Las variables tienen una DNM}\] \[H_1: \text {Las variables NO tienen una DNM}\]

La prueba de Mardia se fundamenta en las extensiones de asimetría y curtosis, el cuadrado de la distancia de Mahalanobis, el número de variables \(p\) a analizar y el número de registros \(n\). Asimismo, se considera que la estadística de la prueba para la asimetría sigue una distribución \(\chi^2\), mientras que la estadística para la curtosis se distribuye de manera aproximada de forma normal.

La prueba de Henze-Zirkler se basa en la distancia funcional, ya que si el conjunto de datos sigue una distribución normal multivariada, el estadístico de la prueba se distribuye de manera aproximada como una lognormal, con parámetros de media \(\mu\) y varianza \(\sigma^2\).

La prueba de Doornik-Hansen se basa en la asimetría y la curtosis de un conjunto de datos multivariados, los cuales se transforman para asegurar la independencia. Se considera más potente que la prueba de Shapiro-Wilk en casos multivariados. El estadístico de la prueba se define como la suma de las transformaciones al cuadrado de la asimetría y la curtosis, y sigue aproximadamente una distribución \(\chi^2\).

Por otro lado, la prueba de Royston utiliza las pruebas de Shapiro-Wilk o Shapiro-Francia para evaluar la normalidad multivariada. Si la curtosis es mayor que 3, se emplea Shapiro-Francia para distribuciones leptocúrticas, mientras que para distribuciones platicúrticas se utiliza Shapiro-Wilk. Los parámetros en esta prueba se obtienen mediante aproximaciones polinomiales.

PNM Mardia

A partir de los resultados del test de normalidad multivariada de Mardia (PNM) y de las pruebas de normalidad univariada de Shapiro-Wilk, se evalúa el supuesto de normalidad de las variables asociadas a los tiempos del proceso asistencial en la sala de urgencias. En primer lugar, el test de Mardia evidencia valores extremadamente elevados tanto en el estadístico de asimetría (Skewness = 17399,62) como de curtosis (Kurtosis = 90,27), con valores p prácticamente nulos. Estos resultados conducen al rechazo de la hipótesis nula de normalidad multivariada, indicando que el conjunto de variables analizadas no sigue una distribución normal conjunta.

En conjunto, estos resultados confirman que los tiempos del proceso asistencial presentan distribuciones no normales, caracterizadas por una fuerte asimetría positiva y alta variabilidad. Esta situación es coherente con la naturaleza del servicio de urgencias, donde la ocurrencia de eventos extremos y periodos de congestión genera valores atípicos y colas largas. Desde el punto de vista metodológico, estos hallazgos justifican el uso de técnicas estadísticas no paramétricas, transformaciones de datos o métodos robustos para análisis posteriores, evitando supuestos de normalidad que no se cumplen y garantizando conclusiones más confiables sobre el desempeño del servicio.

set.seed(123)  # reproducibilidad

datos_pnm <- visita_pacientes_sala_urgencias_ETL |>
  dplyr::select(-c(1,2,3,4,5,6,7,8,13,14)) |>
  dplyr::slice_sample(n = 1000)

mardia(datos_pnm)
## $mv.test
##           Test   Statistic p-value Result
## 1     Skewness -21335.7538       1    YES
## 2     Kurtosis        41.8       0     NO
## 3 MV Normality        <NA>    <NA>     NO
## 
## $uv.shapiro
##                                    W      p-value UV.Normality
## tiempo_registro                    0.8884 0       No          
## tiempo_triage                      0.8354 0       No          
## tiempo_atencion_profesional_medico 0.8913 0       No          
## tiempo_total_espera                0.8858 0       No

PNM Henze-Zirkler.

set.seed(123)  # reproducibilidad

datos_pnm <- visita_pacientes_sala_urgencias_ETL |>
  dplyr::select(-c(1,2,3,4,5,6,7,8,13,14)) |>
  dplyr::slice_sample(n = 1000)

mhz(datos_pnm)
## $mv.test
## [1] 4000
## 
## $uv.shapiro
##                                    W      p-value UV.Normality
## tiempo_registro                    0.8884 0       No          
## tiempo_triage                      0.8354 0       No          
## tiempo_atencion_profesional_medico 0.8913 0       No          
## tiempo_total_espera                0.8858 0       No

PNM Doornik-Hansen

set.seed(123)  # reproducibilidad

datos_pnm <- visita_pacientes_sala_urgencias_ETL |>
  dplyr::select(-c(1,2,3,4,5,6,7,8,13,14)) |>
  dplyr::slice_sample(n = 1000)
msk(datos_pnm)
## $mv.test
##   Statistic     p-value      Result 
## -19588.5139           1         YES 
## 
## $uv.shapiro
##                                    W      p-value UV.Normality
## tiempo_registro                    0.8884 0       No          
## tiempo_triage                      0.8354 0       No          
## tiempo_atencion_profesional_medico 0.8913 0       No          
## tiempo_total_espera                0.8858 0       No

Fase 2 [Componentes Principales]

En esta segunda etapa del estudio, se presentarán cálculos, visualizaciones e interpretaciones basadas en el conjunto de datos analizado previamente en la Fase 1. Ahora, el enfoque se centrará en el análisis de componentes principales (ACP) aplicado a las variables cuantitativas, incluyendo aspectos como la selección de componentes, calidad de representación, contribuciones y su interpretación.

2.1. Objetivos

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

Estimado lector, si desea explorar los fundamentos de este análisis con mayor profundidad. Los detalles del conjunto de datos se encuentran descritos en la Sección 1.2, mientras que los principios teóricos que sustentan este estudio están cuidadosamente desarrollados en la denominada Fase 1. Una lectura detenida de estas secciones enriquecerá su comprensión y apreciación del trabajo presentado.

2.2. Selección de Componentes

Como señalan Díaz Morales y Morales Rivera (2012), el Análisis de Componentes Principales (ACP) permite reorganizar un conjunto de datos multivariado al reducir el número de variables, sin requerir suposiciones específicas sobre la distribución de probabilidad de estas. Esta reducción se alcanza mediante la creación de combinaciones lineales de las variables originales, diseñadas para captar la mayor variabilidad posible en los datos. De este modo, el ACP genera nuevas variables, denominadas componentes principales, que presentan independencia estadística y ausencia de correlación, siempre bajo el supuesto de normalidad.

Matriz ACP

A partir de los resultados de la matriz del Análisis de Componentes Principales (ACP), se observa que la estructura de la variabilidad de los datos está altamente concentrada en los primeros componentes. El primer componente principal (Dim. 1) presenta un valor propio de 3,73, explicando aproximadamente el 93,33 % de la varianza total, lo que indica que una sola dimensión resume de manera muy eficiente la mayor parte de la información contenida en las variables analizadas. Este resultado sugiere una fuerte interdependencia entre los indicadores del proceso asistencial, especialmente los relacionados con los tiempos de atención.

El segundo componente principal (Dim. 2) explica un 3,64 % adicional de la varianza, elevando la varianza acumulada al 96,96 %, lo que indica que su aporte es marginal en comparación con el primer componente, aunque puede capturar matices secundarios o variaciones específicas no explicadas completamente por la primera dimensión. El tercer componente (Dim. 3) aporta apenas un 3,04 %, alcanzando el 100 % de la varianza acumulada, mientras que el cuarto componente presenta un valor propio prácticamente nulo, lo que confirma su irrelevancia desde el punto de vista explicativo.

En conjunto, estos resultados evidencian que el sistema analizado posee una estructura esencialmente unidimensional, donde la mayor parte de la variabilidad puede ser representada por uno o, a lo sumo, dos componentes principales. Desde una perspectiva aplicada, esto permite reducir significativamente la dimensionalidad del problema sin pérdida sustancial de información, facilitando la interpretación, visualización y modelación de los datos. Asimismo, el dominio del primer componente sugiere que los tiempos del proceso asistencial se mueven de manera conjunta, reforzando los hallazgos previos sobre la fuerte correlación existente entre estas variables en el servicio de urgencias.

get_eigenvalue(PCA(visita_pacientes_sala_urgencias_ETL[,-c(1,2,3,4,5,6,7,8,13,14)], ncp = 6, scale.unit = TRUE, graph = F))
##         eigenvalue variance.percent cumulative.variance.percent
## Dim.1 3.733108e+00     9.332769e+01                    93.32769
## Dim.2 1.454390e-01     3.635974e+00                    96.96367
## Dim.3 1.214533e-01     3.036332e+00                   100.00000
## Dim.4 4.096964e-29     1.024241e-27                   100.00000

Matriz de Correlaciones

round(cor(visita_pacientes_sala_urgencias_ETL[,-c(1,2,3,4,5,6,7,8,13,14)]),2)
##                                    tiempo_registro tiempo_triage
## tiempo_registro                               1.00          0.86
## tiempo_triage                                 0.86          1.00
## tiempo_atencion_profesional_medico            0.88          0.88
## tiempo_total_espera                           0.92          0.95
##                                    tiempo_atencion_profesional_medico
## tiempo_registro                                                  0.88
## tiempo_triage                                                    0.88
## tiempo_atencion_profesional_medico                               1.00
## tiempo_total_espera                                              0.98
##                                    tiempo_total_espera
## tiempo_registro                                   0.92
## tiempo_triage                                     0.95
## tiempo_atencion_profesional_medico                0.98
## tiempo_total_espera                               1.00

Valores y Vectores Propios

A partir de los valores y vectores propios obtenidos del Análisis de Componentes Principales (ACP), se profundiza en la interpretación de la estructura interna de las variables asociadas a los tiempos del proceso asistencial en la sala de urgencias. Los valores propios muestran que el primer componente principal (Comp. 1) presenta una varianza de 3,73, concentrando la mayor parte de la información del sistema, mientras que el segundo (0,15) y tercer componente (0,12) aportan una proporción significativamente menor. El cuarto componente, con valor propio nulo, no contribuye a la explicación de la variabilidad, lo que confirma que la dimensionalidad efectiva del conjunto de datos es reducida.

El primer componente principal presenta cargas positivas y de magnitud similar para todas las variables: tiempo de registro (0,49), tiempo de triage (0,49), tiempo de atención profesional médica (0,50) y tiempo total de espera (0,52). Este patrón indica que el primer componente representa un factor global de duración del proceso asistencial, en el cual todas las etapas del servicio contribuyen de manera conjunta. El segundo componente principal está dominado por una carga positiva alta del tiempo de registro (0,77) y una carga negativa marcada del tiempo de triage (-0,62), lo que sugiere un contraste entre las fases iniciales del proceso. Este componente captura diferencias en la eficiencia relativa entre el registro administrativo y la clasificación clínica del paciente. Por su parte, el tercer componente muestra una oposición clara entre el tiempo de triage (0,52) y el tiempo de atención profesional médica (-0,75), reflejando variaciones en la transición entre la priorización clínica y la atención médica propiamente dicha. Finalmente, aunque el cuarto componente presenta algunas cargas elevadas, especialmente en el tiempo total de espera (-0,84), su valor propio cercano a cero indica que su aporte es estadísticamente irrelevante y no debe considerarse en la interpretación.

En conjunto, estos resultados confirman que los tiempos del proceso asistencial están fuertemente interrelacionados y que la mayor parte de su variabilidad puede resumirse en un factor principal de duración global, complementado por componentes secundarios que reflejan desbalances específicos entre las distintas etapas del servicio de urgencias.

princomp(visita_pacientes_sala_urgencias_ETL[,-c(1,2,3,4,5,6,7,8,13,14)], cor = TRUE)$sdev^2
##    Comp.1    Comp.2    Comp.3    Comp.4 
## 3.7331078 0.1454390 0.1214533 0.0000000
princomp(visita_pacientes_sala_urgencias_ETL[,-c(1,2,3,4,5,6,7,8,13,14)], cor = TRUE)$loadings[ ,1:4]
##                                       Comp.1      Comp.2     Comp.3     Comp.4
## tiempo_registro                    0.4897413  0.77213422  0.3840938  0.1281960
## tiempo_triage                      0.4937497 -0.62408956  0.5233342  0.3047044
## tiempo_atencion_profesional_medico 0.4996878 -0.01779123 -0.7473868  0.4375027
## tiempo_total_espera                0.5164076 -0.11834037 -0.1414437 -0.8362490

Correlaciones Comparadas

par(mfrow = c(1,2),
  mar = c(6, 6, 3, 2)
)

corrplot::corrplot(cor(visita_pacientes_sala_urgencias_ETL[, -c(1,2,3,4,5,6,7,8,13,14)]), method = "color",
  type = "upper", number.cex = 0.25, tl.cex = 0.7, tl.srt = 45)
corrplot::corrplot(cor(princomp(visita_pacientes_sala_urgencias_ETL[, -c(1,2,3,4,5,6,7,8,13,14)], cor = TRUE)$scores), method = "color", type = "upper", number.cex = 0.25, tl.cex = 0.8)

Gráfico de Cattell

El gráfico de Cattell (scree plot) permite evaluar visualmente la contribución de cada componente principal en la explicación de la variabilidad total de los datos correspondientes a los tiempos del proceso asistencial en la sala de urgencias. En el gráfico se observa claramente que el primer componente principal concentra la mayor proporción de varianza explicada, cercana al 93 %, lo que confirma su predominio absoluto en la estructura del conjunto de datos. Este resultado indica que una sola dimensión es capaz de resumir casi toda la información relevante contenida en las variables analizadas.

A partir del segundo componente, la varianza explicada disminuye de manera abrupta, situándose alrededor del 3,6 %, seguida por el tercer componente, que aporta aproximadamente un 3 %, mientras que el cuarto componente presenta una contribución prácticamente nula. Esta caída pronunciada genera un “codo” claramente definido después del primer componente, criterio clásico utilizado para determinar el número óptimo de componentes a retener en un Análisis de Componentes Principales.

En términos interpretativos, el gráfico de Cattell refuerza los resultados obtenidos previamente a partir de los valores propios y la varianza acumulada, confirmando que el sistema analizado posee una estructura esencialmente unidimensional.

fviz_eig(PCA(visita_pacientes_sala_urgencias_ETL[,-c(1,2,3,4,5,6,7,8,13,14)], scale.unit = T, graph = F), addlabels = T, ylim=c(0,90), main = "")
## Warning in geom_bar(stat = "identity", fill = barfill, color = barcolor, :
## Ignoring empty aesthetic: `width`.

Gráfico de Cattell-Kaiser

El gráfico de Cattell–Kaiser permite complementar el análisis del Análisis de Componentes Principales mediante la aplicación del criterio de Kaiser, el cual establece que solo deben retenerse aquellos componentes cuyo valor propio sea mayor que uno. En el gráfico se observa claramente que únicamente el primer componente principal presenta un valor propio superior a este umbral, mientras que los componentes restantes muestran valores propios muy cercanos a cero y claramente inferiores a uno.

La marcada caída del valor propio del primer al segundo componente confirma la existencia de una ruptura estructural en la explicación de la varianza, indicando que el primer componente concentra prácticamente toda la información relevante del conjunto de datos. La línea horizontal correspondiente al valor propio igual a uno refuerza visualmente este criterio, mostrando que solo el primer componente cumple con la condición necesaria para ser considerado significativo desde el punto de vista estadístico.

En términos interpretativos, el gráfico de Cattell–Kaiser ratifica los resultados obtenidos previamente mediante el gráfico de Cattell y la matriz de valores propios, confirmando que la estructura del sistema es esencialmente unidimensional. Esto implica que los tiempos del proceso asistencial pueden ser representados adecuadamente por un único factor latente, asociado a la duración global de la atención en la sala de urgencias.

scree(visita_pacientes_sala_urgencias_ETL[,-c(1,2,3,4,5,6,7,8,13,14)],factors = FALSE, pc = TRUE, main ="")

2.3. Calidad de Representación

Con base en la referencia de (Díaz Morales & Morales Rivera, 2012),se confirma que, tras reducir la dimensionalidad del conjunto de datos y entender que sus variables estandarizadas se representan gráficamente como proyecciones de una hiperesfera de correlaciones, es esencial iniciar la interpretación de las componentes a partir de esas correlaciones. Posteriormente, se debe evaluar la calidad de las representaciones obtenidas, considerando la reducción dimensional aplicada al conjunto de datos y su impacto en las variables.

Es necesario evaluar la calidad de la representación de las variables cuantitativas en relación con el número de dimensiones calculadas que capturan la mayor proporción de variabilidad; para más detalles, consultar la sección 2.3.

Círculo de Correlaciones

El círculo de correlaciones del Análisis de Componentes Principales (ACP) permite interpretar la relación entre las variables originales y los componentes retenidos, así como el grado en que estas contribuyen a la explicación de la variabilidad del sistema. En el plano definido por la Dimensión 1 (93,3 % de la varianza) y la Dimensión 2 (3,6 %) se observa que todas las variables analizadas se proyectan principalmente sobre el eje horizontal, lo que confirma el carácter dominante del primer componente principal.

Las variables tiempo de registro, tiempo de triage, tiempo de atención profesional médica y tiempo total de espera presentan vectores largos y orientados hacia la derecha, cercanos al borde del círculo, lo que indica una alta correlación positiva con la Dimensión 1. Este comportamiento sugiere que el primer componente representa un factor global de duración del proceso asistencial, en el cual todas las etapas de la atención contribuyen de manera conjunta. Por su parte, la Dimensión 2 captura una proporción muy reducida de la variabilidad y permite distinguir ligeros contrastes entre las variables. En particular, el tiempo de registro presenta una proyección positiva sobre este eje, mientras que el tiempo de triage y el tiempo total de espera muestran componentes negativos, lo que sugiere diferencias menores en la dinámica de las etapas iniciales del proceso.

En conjunto, el círculo de correlaciones confirma que los tiempos del proceso asistencial están altamente interrelacionados y que su comportamiento puede resumirse de forma eficiente en un único componente principal. Este resultado refuerza la validez de la reducción de dimensionalidad aplicada y proporciona una interpretación clara del ACP, orientada a la comprensión global de la eficiencia temporal en la atención de urgencias.

fviz_pca_var(PCA(visita_pacientes_sala_urgencias_ETL[,-c(1,2,3,4,5,6,7,8,13,14)], scale.unit = T, graph = F),col.var="#3B83BD", repel = T, col.circle = "#CDCDCD", ggtheme = theme_bw())
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## ℹ The deprecated feature was likely used in the ggpubr package.
##   Please report the issue at <https://github.com/kassambara/ggpubr/issues>.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: `aes_string()` was deprecated in ggplot2 3.0.0.
## ℹ Please use tidy evaluation idioms with `aes()`.
## ℹ See also `vignette("ggplot2-in-packages")` for more information.
## ℹ The deprecated feature was likely used in the factoextra package.
##   Please report the issue at <https://github.com/kassambara/factoextra/issues>.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

#### Matriz de Representación

(get_pca_var(PCA(visita_pacientes_sala_urgencias_ETL[,-c(1,2,3,4,5,6,7,8,13,14)], ncp = 5, scale.unit = TRUE, graph = F)))$cos2
##                                        Dim.1        Dim.2       Dim.3
## tiempo_registro                    0.8953728 8.670943e-02 0.017917761
## tiempo_triage                      0.9100899 5.664669e-02 0.033263456
## tiempo_atencion_profesional_medico 0.9321117 4.603548e-05 0.067842215
## tiempo_total_espera                0.9955334 2.036791e-03 0.002429834
##                                           Dim.4
## tiempo_registro                    6.733042e-31
## tiempo_triage                      3.803817e-30
## tiempo_atencion_profesional_medico 7.841941e-30
## tiempo_total_espera                2.865057e-29

Calidad de Representación

El análisis de la calidad de representación (cos²) en el plano factorial del Análisis de Componentes Principales (ACP) permite evaluar qué tan bien cada variable original es explicada por las dimensiones retenidas. En el gráfico se observa que todas las variables analizadas presentan valores elevados de cos², evidenciados por la intensidad del color y la proximidad de los vectores al borde del círculo de correlaciones, lo que indica una excelente representación en el plano definido por la Dimensión 1 (93,3 %) y la Dimensión 2 (3,6 %).

En particular, las variables tiempo de registro, tiempo de triage y tiempo total de espera muestran los valores de cos² más altos, lo que implica que su variabilidad está casi completamente explicada por los componentes principales, especialmente por la primera dimensión. Esto confirma que estas variables son fundamentales en la estructura del sistema y tienen una contribución directa al factor global de duración del proceso asistencial.

En conjunto, estos resultados confirman la idoneidad del ACP aplicado, ya que las variables clave del análisis están bien representadas en el espacio factorial, lo que permite realizar interpretaciones confiables y sustenta el uso del primer componente principal como indicador sintético del desempeño temporal del servicio de urgencias.

fviz_pca_var(PCA(visita_pacientes_sala_urgencias_ETL[,-c(1,2,3,4,5,6,7,8,13,14)], ncp = 5, scale.unit = TRUE, graph = F), col.var="cos2", gradient.cols=c("#00AFBB","#E7B800","#FC4E07"), repel = TRUE)

Coordenadas Individuales

A partir de las coordenadas individuales obtenidas del Análisis de Componentes Principales (ACP), se analiza la posición de las observaciones en el espacio factorial definido por las dimensiones principales, lo que permite identificar patrones, heterogeneidad y posibles casos atípicos en los tiempos del proceso asistencial. Los resultados muestran que la Dimensión 1, que concentra más del 93 % de la varianza total, es el eje que mayor capacidad tiene para discriminar entre las observaciones, mientras que las dimensiones restantes aportan información complementaria de menor relevancia.

Se observa que las coordenadas en la Dimensión 1 presentan una amplia dispersión, con valores positivos y negativos de magnitud considerable. Las observaciones con valores positivos elevados en esta dimensión corresponden a casos con tiempos de atención globalmente más altos, reflejando procesos asistenciales más prolongados. En contraste, las observaciones con valores negativos representan pacientes que experimentaron tiempos menores en las distintas etapas del proceso, lo que sugiere una atención más eficiente.

La Dimensión 2, aunque explica una proporción reducida de la variabilidad, permite identificar diferencias secundarias entre observaciones con perfiles temporales similares en la primera dimensión. Algunos individuos presentan valores moderados o altos en esta dimensión, lo que indica desbalances específicos entre etapas del proceso, como diferencias entre el tiempo de registro y el tiempo de triage. Sin embargo, estas variaciones tienen un impacto interpretativo limitado frente al peso dominante de la Dimensión 1. Finalmente, las Dimensiones 3 y 4 muestran coordenadas cercanas a cero para la mayoría de las observaciones, lo que confirma su baja capacidad discriminante y justifica que no sean consideradas en el análisis principal.

head((PCA(visita_pacientes_sala_urgencias_ETL[,-c(1,2,3,4,5,6,7,8,13,14)], ncp = 5, scale.unit = TRUE, graph = F))$ind$coord, n = 23L)
##          Dim.1       Dim.2        Dim.3         Dim.4
## 1   0.65656219  0.41251607 -0.345280417 -9.121692e-14
## 2  -0.33776448 -0.30008322  0.359301340  8.477002e-15
## 3   3.57145332  1.31352515 -0.634333214  6.515689e-15
## 4  -0.04222360 -0.07185050 -0.725810772 -6.297014e-15
## 5   1.27476206  0.88117419  0.169579832 -6.265470e-15
## 6  -0.45689123  0.30669673  0.039810536 -6.258508e-15
## 7   1.14694349  0.39043003  0.321205772 -6.340460e-15
## 8  -0.14065425 -0.27812371 -0.185640188 -6.268162e-15
## 9   0.06942845  0.27515332  0.430014987 -6.251288e-15
## 10 -1.94746206  0.04861314  0.213959768 -6.078430e-15
## 11  0.60650777  0.28596724 -0.526000630 -6.193656e-15
## 12  1.34406597  0.82015941 -0.045600262 -6.134320e-15
## 13  3.38934661 -0.45559323 -0.338304790 -6.123225e-15
## 14 -1.74023791 -0.27293254  0.097192204 -6.298696e-15
## 15  0.09643833 -0.03347138  0.267585846 -6.290904e-15
## 16  2.03464045  0.48872893  0.987495790 -6.176000e-15
## 17 -1.80555196 -0.14017624  0.163064792 -6.258030e-15
## 18 -1.87228302 -0.03706143  0.040861504 -6.179868e-15
## 19 -1.69747564 -0.15136542  0.047754711 -6.236794e-15
## 20 -0.65616016 -0.04381428 -0.498307900 -6.311267e-15
## 21 -1.86640789 -0.06172121  0.082943334 -6.205700e-15
## 22 -0.01447202 -0.08156517  0.006744176 -6.294297e-15
## 23 -1.88214802 -0.08414316  0.148087180 -6.196029e-15

2.4. Contribuciones y Biplots

Los autores (Díaz Morales & Morales Rivera, 2012) señalan que la interpretación de los resultados está estrechamente ligada al cálculo de elementos como coordenadas, contribuciones y cosenos cuadrados. Por lo tanto, es esencial que las variables estén bien conceptualizadas y contextualizadas para facilitar su comprensión. En este sentido, analizar la contribución de cada variable a una componente ayuda a interpretar los resultados, mostrando cómo cada una influye en la definición de las componentes generadas. Este análisis se lleva a cabo en esta sección para determinar el aporte de cada variable en la construcción de las componentes.

Matriz de Contribuciones

A partir de la matriz de contribuciones del Análisis de Componentes Principales (ACP), se identifica el grado de aporte de cada variable original a la construcción de las dimensiones factoriales, lo que permite interpretar con mayor precisión el significado de cada componente. En la Dimensión 1, que concentra la mayor parte de la varianza total, se observa una contribución equilibrada de las cuatro variables analizadas: tiempo de registro (23,98 %), tiempo de triage (24,38 %), tiempo de atención profesional médica (24,97 %) y tiempo total de espera (26,67 %). Este reparto homogéneo confirma que el primer componente representa un factor global de duración del proceso asistencial, en el cual todas las etapas influyen de manera similar.

En la Dimensión 2, la variable tiempo de registro presenta la mayor contribución (59,62 %), seguida por el tiempo de triage (38,95 %), mientras que el aporte del tiempo de atención profesional médica y del tiempo total de espera es marginal. Esto indica que esta dimensión captura principalmente diferencias en las etapas iniciales del proceso, reflejando contrastes entre el registro administrativo y la clasificación clínica del paciente. Por su parte, la Dimensión 3 está dominada por el tiempo de atención profesional médica (55,86 %) y el tiempo de triage (27,39 %), lo que sugiere que este componente representa variaciones asociadas a la gestión de la atención médica y la priorización clínica. Finalmente, la Dimensión 4, a pesar de su baja relevancia global, muestra una contribución muy elevada del tiempo total de espera (69,93 %), lo que indica que esta dimensión recoge variaciones residuales específicas de esta variable.

En conjunto, la matriz de contribuciones confirma que, aunque el primer componente principal sintetiza de forma eficiente la información de todas las variables, las dimensiones secundarias permiten identificar desbalances puntuales entre las distintas etapas del proceso asistencial.

(get_pca_var(PCA(visita_pacientes_sala_urgencias_ETL[,-c(1,2,3,4,5,6,7,8,12,13,14)], ncp = 5, scale.unit = TRUE, graph = F)))$contrib
##                                       Dim.1       Dim.2    Dim.3
## tiempo_registro                    33.19295 47.89168272 18.91537
## tiempo_triage                      33.15308 52.02638626 14.82054
## tiempo_atencion_profesional_medico 33.65397  0.08193102 66.26410

Contribuciones a D1

El análisis de las contribuciones de las variables a la Dimensión 1 (D1) del Análisis de Componentes Principales confirma que este componente está definido de manera balanceada por las principales etapas del proceso asistencial. En el gráfico se observa que el tiempo de atención profesional médica, el tiempo de registro y el tiempo de triage presentan contribuciones muy similares y superiores al umbral promedio (línea de referencia), lo que indica que estas variables participan de forma significativa en la construcción de la primera dimensión.

La contribución elevada y relativamente homogénea de estas variables sugiere que la Dimensión 1 representa un factor global de duración y eficiencia del proceso de atención en urgencias, en el cual las fases administrativas, de clasificación clínica y de atención médica tienen un peso comparable. Esto implica que los incrementos en esta dimensión no están asociados a una única etapa específica, sino al comportamiento conjunto del sistema, donde los tiempos tienden a aumentar de forma simultánea a lo largo del proceso.

En consecuencia, cualquier estrategia orientada a mejorar el desempeño del servicio debe considerar intervenciones coordinadas en las etapas de registro, triage y atención médica, ya que todas ellas contribuyen de manera decisiva al componente principal que explica la mayor parte de la variabilidad observada en los tiempos de atención.

fviz_contrib(PCA(visita_pacientes_sala_urgencias_ETL[,-c(1,2,3,4,5,6,7,8,12,13,14)], ncp = 6, scale.unit = TRUE, graph = F), choice = "var", axes = 1, top = 10)

Contribuciones a D2

El gráfico de contribuciones de las variables a la Dimensión 2 (D2) del Análisis de Componentes Principales muestra que esta dimensión está definida casi exclusivamente por las etapas iniciales del proceso asistencial. En particular, el tiempo de triage y el tiempo de registro presentan contribuciones muy superiores al umbral promedio, concentrando prácticamente la totalidad del aporte a esta dimensión. En contraste, el tiempo de atención profesional médica exhibe una contribución marginal, cercana a cero, lo que indica que su influencia en la construcción de la Dimensión 2 es mínima. Este patrón confirma que la Dimensión 2 no representa una prolongación general del proceso, sino más bien un contraste específico entre las fases administrativas y de clasificación clínica.

No obstante, dado que la Dimensión 2 explica una proporción reducida de la varianza total, su valor interpretativo es complementario frente al peso dominante de la Dimensión 1. Aun así, estos resultados aportan información relevante para la gestión del servicio, al señalar que las oportunidades de mejora específicas en los procesos de registro y triage pueden generar impactos diferenciados, especialmente en escenarios donde estas etapas constituyen cuellos de botella independientes del tiempo de atención médica.

fviz_contrib(PCA(visita_pacientes_sala_urgencias_ETL[,-c(1,2,3,4,5,6,7,8,12,13,14)], ncp = 6, scale.unit = TRUE, graph = F), choice = "var", axes = 2, top = 10)

Contribuciones a D3

El gráfico de contribuciones de las variables a la Dimensión 3 (D3) del Análisis de Componentes Principales muestra que esta dimensión está dominada principalmente por el tiempo de atención profesional médica, cuya contribución supera ampliamente el umbral promedio de referencia. Esto indica que la Dimensión 3 captura variaciones específicas asociadas a la duración de la consulta médica, diferenciando casos en los que esta etapa es particularmente prolongada o más breve respecto a las demás fases del proceso asistencial.

Las variables tiempo de registro y tiempo de triage presentan contribuciones notablemente menores y por debajo del umbral, lo que sugiere que su influencia en la construcción de esta dimensión es secundaria. En consecuencia, la Dimensión 3 puede interpretarse como un componente de especialización médica, reflejando diferencias en la complejidad clínica de los casos o en la carga de trabajo asociada a la atención profesional, independientemente de las etapas administrativas y de clasificación.

Sin embargo, es importante destacar que, a pesar de su interpretación específica, la Dimensión 3 explica una proporción reducida de la varianza total del conjunto de datos. Por ello, su valor analítico es complementario y no central en la descripción global del proceso asistencial.

fviz_contrib(PCA(visita_pacientes_sala_urgencias_ETL[,-c(1,2,3,4,5,6,7,8,12,13,14)], ncp = 6, scale.unit = TRUE, graph = F), choice = "var", axes = 3, top = 10)

Fase 3 [Correspondencias]

Según (Aldás & Uriel, 2017),el análisis de correspondencias simple (ACS) tiene como propósito reducir la dimensionalidad de las relaciones entre categorías de dos variables categóricas, representándolas en un espacio multidimensional. Este método permite analizar gráficamente las distancias entre las categorías de las variables, facilitando la interpretación de tablas de contingencia. El número máximo de dimensiones necesarias para explicar dichas relaciones corresponde a uno menos el número de categorías de la variable con menor cantidad de niveles.

Asimismo, el ACS, basado en tablas de contingencia, puede ampliarse para incluir más de dos variables categóricas, lo que se conoce como Análisis de correspondencias múltiples (ACM). Este enfoque utiliza una tabla disyuntiva completa, permitiendo explorar y representar relaciones más complejas entre múltiples variables categóricas.

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.

De acuerdo con (Díaz Morales & Morales Rivera, 2012), el análisis de correspondencias simple (ACS) puede ampliarse para trabajar con tablas disyuntivas completas. En este formato, las filas representan a los pacientes, mientras que las columnas describen las modalidades de las variables categóricas analizadas, como Target, ChestPain y FastingBloodSugar, asignando a cada paciente una categoría única para cada variable.

AC Parejas Totales

Contingencias

A partir del análisis de las tablas de contingencia, se identifican patrones relevantes en la relación entre el nivel de urgencia, el resultado del paciente, la temporada (franja horaria) y el día de la semana, lo que permite caracterizar el comportamiento operativo del servicio de urgencias desde una perspectiva descriptiva y relacional. En primer lugar, la relación entre nivel de urgencia y resultado del paciente evidencia diferencias claras en la dinámica de atención. Los pacientes clasificados como críticos y de alta urgencia presentan una distribución relativamente equilibrada entre ingresos hospitalarios (Admitted) y egresos (Discharged), sin registros de abandono sin atención en el nivel crítico, lo que indica una adecuada priorización clínica de los casos más graves. En contraste, los pacientes de urgencia baja concentran la mayor proporción de casos de abandono sin ser atendidos (Left Without Being Seen), con 198 eventos, lo que sugiere que los tiempos de espera prolongados afectan principalmente a este grupo. En el nivel medio, aunque predomina el egreso, también se observan abandonos, lo que refleja una presión operativa intermedia sobre el servicio.

Respecto a la relación entre nivel de urgencia y temporada, se observa que la franja de Evening (tarde-noche) concentra el mayor volumen de atenciones en todos los niveles de urgencia, seguida por la afternoon y la late morning. Este patrón indica una mayor demanda del servicio en horas vespertinas, independientemente de la gravedad del caso, lo que puede generar congestión y aumento de los tiempos de espera. La franja de early morning presenta el menor número de atenciones, lo que sugiere una ventana potencial para redistribuir recursos o programar refuerzos operativos en los periodos de mayor carga.

En conjunto, las tablas de contingencia evidencian que el funcionamiento del servicio de urgencias está fuertemente influenciado por la prioridad clínica, la franja horaria y el día de la semana, y que los principales problemas operativos como el abandono sin atención se concentran en pacientes de menor urgencia y en periodos de alta demanda.

addmargins(table(visita_pacientes_sala_urgencias_ETL$nivel_urgencia, visita_pacientes_sala_urgencias_ETL$resultado_paciente))
##           
##            Admitted Discharged Left Without Being Seen  Sum
##   Critical      626        616                       0 1242
##   High          632        613                       0 1245
##   Low           106        918                     198 1222
##   Medium        504        732                      55 1291
##   Sum          1868       2879                     253 5000
addmargins(table(visita_pacientes_sala_urgencias_ETL$nivel_urgencia, visita_pacientes_sala_urgencias_ETL$temporada))
##           
##            Afternoon Early Morning Evening Late Morning Night  Sum
##   Critical       384           116     413          197   132 1242
##   High           366           136     458          160   125 1245
##   Low            372           117     414          192   127 1222
##   Medium         380           104     440          221   146 1291
##   Sum           1502           473    1725          770   530 5000
addmargins(table(visita_pacientes_sala_urgencias_ETL$resultado_paciente, visita_pacientes_sala_urgencias_ETL$dia_semana))
##                          
##                           Friday Monday Saturday Sunday Thursday Tuesday
##   Admitted                   241    262      267    320      255     263
##   Discharged                 402    453      404    378      411     447
##   Left Without Being Seen     42     53       30     27       40      31
##   Sum                        685    768      701    725      706     741
##                          
##                           Wednesday  Sum
##   Admitted                      260 1868
##   Discharged                    384 2879
##   Left Without Being Seen        30  253
##   Sum                           674 5000
Probabilidades

A partir del análisis de las tablas de probabilidades (frecuencias relativas porcentuales) se profundiza la comprensión del comportamiento del servicio de urgencias, permitiendo interpretar los resultados en términos de probabilidad de ocurrencia de los distintos eventos analizados. En primer lugar, la relación entre nivel de urgencia y resultado del paciente muestra que el 57,58 % del total de atenciones culmina en egreso (Discharged), mientras que el 37,36 % corresponde a ingresos hospitalarios (Admitted) y solo el 5,06 % a abandono sin atención. Se evidencia que los pacientes críticos y de alta urgencia no presentan abandono sin ser atendidos, lo que confirma una priorización efectiva de los casos más graves.

En contraste, los pacientes de urgencia baja concentran la mayor probabilidad de abandono (3,96 % del total), seguido por los de urgencia media (1,10 %), lo que refuerza la relación entre menores niveles de prioridad clínica y mayor riesgo de deserción del servicio. Respecto a la relación entre nivel de urgencia y temporada, se observa que la franja Evening (tarde–noche) concentra la mayor probabilidad de atención, con un 34,50 % del total de los casos, seguida por la afternoon (30,04 %) y la late morning (15,40 %). Este patrón se mantiene de forma consistente en todos los niveles de urgencia, lo que confirma que la mayor presión operativa del servicio se presenta en horas vespertinas.

Finalmente, el análisis de resultado del paciente y día de la semana evidencia que los egresos son el evento más probable en todos los días, con una mayor concentración los lunes (9,06 %), martes (8,94 %) y jueves (8,22 %). Los ingresos hospitalarios se distribuyen de manera relativamente homogénea a lo largo de la semana, mientras que la probabilidad de abandono sin atención es mayor los lunes (1,06 %) y viernes (0,84 %), disminuyendo durante los fines de semana.

addmargins(prop.table(table(visita_pacientes_sala_urgencias_ETL$nivel_urgencia, visita_pacientes_sala_urgencias_ETL$resultado_paciente))*100)
##           
##            Admitted Discharged Left Without Being Seen    Sum
##   Critical    12.52      12.32                    0.00  24.84
##   High        12.64      12.26                    0.00  24.90
##   Low          2.12      18.36                    3.96  24.44
##   Medium      10.08      14.64                    1.10  25.82
##   Sum         37.36      57.58                    5.06 100.00
addmargins(prop.table(table(visita_pacientes_sala_urgencias_ETL$nivel_urgencia, visita_pacientes_sala_urgencias_ETL$temporada))*100)
##           
##            Afternoon Early Morning Evening Late Morning  Night    Sum
##   Critical      7.68          2.32    8.26         3.94   2.64  24.84
##   High          7.32          2.72    9.16         3.20   2.50  24.90
##   Low           7.44          2.34    8.28         3.84   2.54  24.44
##   Medium        7.60          2.08    8.80         4.42   2.92  25.82
##   Sum          30.04          9.46   34.50        15.40  10.60 100.00
addmargins(prop.table(table(visita_pacientes_sala_urgencias_ETL$resultado_paciente, visita_pacientes_sala_urgencias_ETL$dia_semana))*100)
##                          
##                           Friday Monday Saturday Sunday Thursday Tuesday
##   Admitted                  4.82   5.24     5.34   6.40     5.10    5.26
##   Discharged                8.04   9.06     8.08   7.56     8.22    8.94
##   Left Without Being Seen   0.84   1.06     0.60   0.54     0.80    0.62
##   Sum                      13.70  15.36    14.02  14.50    14.12   14.82
##                          
##                           Wednesday    Sum
##   Admitted                     5.20  37.36
##   Discharged                   7.68  57.58
##   Left Without Being Seen      0.60   5.06
##   Sum                         13.48 100.00
Frecuencias [CPF y CPC]

A partir del análisis de las frecuencias condicionales por fila (CPF) y por columna (CPC), se obtiene una interpretación más precisa del comportamiento del servicio de urgencias, al considerar las probabilidades condicionadas según nivel de urgencia, franja horaria y día de la semana.

En primer lugar, las frecuencias condicionales por fila (CPF) para la relación entre nivel de urgencia y resultado del paciente muestran diferencias claras en los desenlaces según la prioridad clínica. Los pacientes críticos y de alta urgencia presentan probabilidades prácticamente equilibradas entre admisión hospitalaria (50,40 % y 50,76 %, respectivamente) y egreso (49,60 % y 49,24 %), sin registros de abandono, lo que confirma una atención prioritaria y efectiva para los casos más graves. En contraste, los pacientes de urgencia baja exhiben una probabilidad elevada de abandono sin ser atendidos (16,20 %), mientras que en los casos de urgencia media este valor desciende a 4,26 %. Estos resultados evidencian que el riesgo de deserción se concentra en los pacientes con menor prioridad clínica, probablemente asociado a mayores tiempos de espera.

En cuanto a la relación entre nivel de urgencia y temporada, las CPF muestran que, independientemente del nivel de urgencia, la franja Evening (tarde–noche) concentra la mayor proporción de atenciones, con valores cercanos al 33–37 %, seguida por la afternoon. Las CPC confirman que la distribución de niveles de urgencia es relativamente homogénea dentro de cada franja horaria, aunque se observa una ligera mayor participación de casos medios y críticos en las horas de late morning y night, lo que puede asociarse a dinámicas específicas de demanda y disponibilidad de recursos.

Finalmente, el análisis de las frecuencias condicionales entre resultado del paciente y día de la semana muestra que, desde la perspectiva CPF, los ingresos hospitalarios se concentran especialmente los domingos (17,13 %) y sábados (14,29 %), mientras que los abandonos sin atención presentan mayores proporciones relativas los lunes (20,95 %) y viernes (16,60 %). Desde la óptica CPC, se evidencia que en todos los días predomina el egreso, con proporciones superiores al 50 %, mientras que el abandono se mantiene por debajo del 7 % diario, aunque con picos moderados a inicios y finales de semana.

round(addmargins(prop.table(table(visita_pacientes_sala_urgencias_ETL$nivel_urgencia, visita_pacientes_sala_urgencias_ETL$resultado_paciente), 1)*100, 2), 2)
##           
##            Admitted Discharged Left Without Being Seen    Sum
##   Critical    50.40      49.60                    0.00 100.00
##   High        50.76      49.24                    0.00 100.00
##   Low          8.67      75.12                   16.20 100.00
##   Medium      39.04      56.70                    4.26 100.00
round(addmargins(prop.table(table(visita_pacientes_sala_urgencias_ETL$nivel_urgencia, visita_pacientes_sala_urgencias_ETL$resultado_paciente), 2)*100, 1), 2)
##           
##            Admitted Discharged Left Without Being Seen
##   Critical    33.51      21.40                    0.00
##   High        33.83      21.29                    0.00
##   Low          5.67      31.89                   78.26
##   Medium      26.98      25.43                   21.74
##   Sum        100.00     100.00                  100.00
round(addmargins(prop.table(table(visita_pacientes_sala_urgencias_ETL$nivel_urgencia, visita_pacientes_sala_urgencias_ETL$temporada), 1)*100, 2), 2)
##           
##            Afternoon Early Morning Evening Late Morning  Night    Sum
##   Critical     30.92          9.34   33.25        15.86  10.63 100.00
##   High         29.40         10.92   36.79        12.85  10.04 100.00
##   Low          30.44          9.57   33.88        15.71  10.39 100.00
##   Medium       29.43          8.06   34.08        17.12  11.31 100.00
round(addmargins(prop.table(table(visita_pacientes_sala_urgencias_ETL$nivel_urgencia, visita_pacientes_sala_urgencias_ETL$temporada), 2)*100, 1), 2)
##           
##            Afternoon Early Morning Evening Late Morning  Night
##   Critical     25.57         24.52   23.94        25.58  24.91
##   High         24.37         28.75   26.55        20.78  23.58
##   Low          24.77         24.74   24.00        24.94  23.96
##   Medium       25.30         21.99   25.51        28.70  27.55
##   Sum         100.00        100.00  100.00       100.00 100.00
round(addmargins(prop.table(table(visita_pacientes_sala_urgencias_ETL$resultado_paciente,visita_pacientes_sala_urgencias_ETL$dia_semana), 1)*100, 2), 2)
##                          
##                           Friday Monday Saturday Sunday Thursday Tuesday
##   Admitted                 12.90  14.03    14.29  17.13    13.65   14.08
##   Discharged               13.96  15.73    14.03  13.13    14.28   15.53
##   Left Without Being Seen  16.60  20.95    11.86  10.67    15.81   12.25
##                          
##                           Wednesday    Sum
##   Admitted                    13.92 100.00
##   Discharged                  13.34 100.00
##   Left Without Being Seen     11.86 100.00
round(addmargins(prop.table(table(visita_pacientes_sala_urgencias_ETL$resultado_paciente,visita_pacientes_sala_urgencias_ETL$dia_semana), 2)*100, 1), 2)
##                          
##                           Friday Monday Saturday Sunday Thursday Tuesday
##   Admitted                 35.18  34.11    38.09  44.14    36.12   35.49
##   Discharged               58.69  58.98    57.63  52.14    58.22   60.32
##   Left Without Being Seen   6.13   6.90     4.28   3.72     5.67    4.18
##   Sum                     100.00 100.00   100.00 100.00   100.00  100.00
##                          
##                           Wednesday
##   Admitted                    38.58
##   Discharged                  56.97
##   Left Without Being Seen      4.45
##   Sum                        100.00
Perfiles [CPF y CPC]

A partir del análisis de los perfiles por frecuencias condicionales por fila (CPF) y por columna (CPC), representados mediante los gráficos de barras apiladas, se obtiene una caracterización clara y comparativa de la estructura del servicio de urgencias en función del nivel de urgencia, el resultado del paciente, la franja horaria y el día de la semana.

En primer lugar, los perfiles CPF entre nivel de urgencia y resultado del paciente muestran comportamientos claramente diferenciados. Los niveles crítico y alto presentan perfiles muy similares, con una distribución prácticamente equilibrada entre admisión hospitalaria y egreso, y ausencia total de abandono sin atención, lo que refleja una priorización clínica efectiva. En contraste, el nivel de urgencia baja exhibe un perfil dominado por el egreso y una fracción visible de abandono sin ser atendido, confirmando que este grupo es el más vulnerable a los efectos de la congestión del servicio. El nivel medio presenta un perfil intermedio, con predominio del egreso y una proporción moderada de abandono. Desde la perspectiva de los perfiles CPC, se observa que el resultado “Left Without Being Seen” está compuesto mayoritariamente por pacientes de urgencia baja, mientras que los resultados de admisión y egreso se distribuyen principalmente entre los niveles crítico, alto y medio.

En cuanto a los perfiles entre nivel de urgencia y temporada, los gráficos CPF muestran una estructura muy homogénea: en todos los niveles de urgencia predomina la franja Evening (tarde–noche), seguida por Afternoon y Late Morning, mientras que Early Morning y Night concentran las menores proporciones. Los perfiles CPC confirman que, dentro de cada franja horaria, la composición por niveles de urgencia es relativamente estable, lo que sugiere que la mayor carga operativa en la tarde–noche responde a un aumento generalizado de la demanda y no a un tipo específico de paciente.

plotct(table(visita_pacientes_sala_urgencias_ETL$nivel_urgencia, visita_pacientes_sala_urgencias_ETL$resultado_paciente),"row")

plotct(table(visita_pacientes_sala_urgencias_ETL$nivel_urgencia, visita_pacientes_sala_urgencias_ETL$resultado_paciente),"col")

plotct(table(visita_pacientes_sala_urgencias_ETL$nivel_urgencia, visita_pacientes_sala_urgencias_ETL$temporada),"row")

plotct(table(visita_pacientes_sala_urgencias_ETL$nivel_urgencia, visita_pacientes_sala_urgencias_ETL$temporada),"col")

plotct(table(visita_pacientes_sala_urgencias_ETL$resultado_paciente,visita_pacientes_sala_urgencias_ETL$dia_semana),"row")

plotct(table(visita_pacientes_sala_urgencias_ETL$resultado_paciente,visita_pacientes_sala_urgencias_ETL$dia_semana),"col")

Pruebas de Hipótesis

A partir de los resultados de las pruebas de hipótesis mediante el estadístico Chi-cuadrado de Pearson, se evalúa la existencia de asociaciones significativas entre las variables categóricas analizadas en el servicio de urgencias. En primer lugar, la prueba aplicada entre el nivel de urgencia y el resultado del paciente arroja un valor de χ² = 908,16, con 6 grados de libertad y un p-valor < 2,2e-16, lo que conduce al rechazo contundente de la hipótesis nula de independencia. Este resultado evidencia una asociación estadísticamente significativa y muy fuerte entre la prioridad clínica asignada al paciente y su desenlace (admisión, egreso o abandono sin atención).

Por el contrario, la prueba realizada entre el nivel de urgencia y la temporada (franja horaria) presenta un estadístico de χ² = 17,92, con 12 grados de libertad y un p-valor = 0,1183, superior al nivel de significancia habitual (α = 0,05). En este caso, no se rechaza la hipótesis nula, lo que indica que no existe evidencia estadística suficiente de asociación entre el nivel de urgencia y la franja horaria.

Finalmente, la prueba de independencia entre el resultado del paciente y el día de la semana arroja un valor de χ² = 30,73, con 12 grados de libertad y un p-valor = 0,00217, lo que implica el rechazo de la hipótesis nula. Esto indica la existencia de una asociación estadísticamente significativa entre el día de la semana y el desenlace del paciente.

chisq.test(table(visita_pacientes_sala_urgencias_ETL$nivel_urgencia, visita_pacientes_sala_urgencias_ETL$resultado_paciente))
## 
##  Pearson's Chi-squared test
## 
## data:  table(visita_pacientes_sala_urgencias_ETL$nivel_urgencia, visita_pacientes_sala_urgencias_ETL$resultado_paciente)
## X-squared = 908.16, df = 6, p-value < 2.2e-16
chisq.test(table(visita_pacientes_sala_urgencias_ETL$nivel_urgencia, visita_pacientes_sala_urgencias_ETL$temporada))
## 
##  Pearson's Chi-squared test
## 
## data:  table(visita_pacientes_sala_urgencias_ETL$nivel_urgencia, visita_pacientes_sala_urgencias_ETL$temporada)
## X-squared = 17.916, df = 12, p-value = 0.1183
chisq.test(table(visita_pacientes_sala_urgencias_ETL$resultado_paciente,visita_pacientes_sala_urgencias_ETL$dia_semana))
## 
##  Pearson's Chi-squared test
## 
## data:  table(visita_pacientes_sala_urgencias_ETL$resultado_paciente,     visita_pacientes_sala_urgencias_ETL$dia_semana)
## X-squared = 30.728, df = 12, p-value = 0.002167

AC Pareja Única

Contingencias y Residuales [T-CP]

A partir del análisis conjunto de las frecuencias observadas, esperadas y los residuales (simples y tipificados) de la prueba Chi-cuadrado entre el nivel de urgencia y el resultado del paciente, se identifican con claridad los patrones específicos que explican la fuerte asociación estadística previamente confirmada por la prueba de hipótesis.

En primer lugar, la comparación entre las frecuencias observadas y esperadas muestra desviaciones sustanciales en varias combinaciones. En los niveles crítico y alto, el número de pacientes admitidos es considerablemente mayor al esperado bajo el supuesto de independencia, mientras que los casos de abandono sin ser atendidos son nulos, a pesar de que el modelo esperaba alrededor de 63 casos en cada nivel. Esto indica una sobreprotección clínica deliberada hacia los pacientes de mayor gravedad, garantizando su atención y evitando la deserción del servicio. Por el contrario, el nivel de urgencia baja presenta el patrón opuesto. En este grupo se observa una frecuencia de abandono (198 casos) muy superior a la esperada (≈62 casos), así como una subrepresentación marcada de admisiones frente a lo que predeciría la independencia. Este comportamiento se refleja en los residuales positivos muy elevados para “Left Without Being Seen” y negativos para “Admitted”.

Los residuales tipificados refuerzan estas conclusiones, mostrando valores extremadamente altos en magnitud (|z| > 2) para las combinaciones críticas. Destacan los residuales positivos elevados en admisiones de pacientes críticos y altos, y los residuales negativos muy pronunciados en abandono para estos mismos niveles, lo que confirma que estas celdas contribuyen de manera decisiva al valor elevado del estadístico Chi-cuadrado.

chisq.test(table(visita_pacientes_sala_urgencias_ETL$nivel_urgencia, visita_pacientes_sala_urgencias_ETL$resultado_paciente))$observed
##           
##            Admitted Discharged Left Without Being Seen
##   Critical      626        616                       0
##   High          632        613                       0
##   Low           106        918                     198
##   Medium        504        732                      55
chisq.test(table(visita_pacientes_sala_urgencias_ETL$nivel_urgencia, visita_pacientes_sala_urgencias_ETL$resultado_paciente))$expected 
##           
##            Admitted Discharged Left Without Being Seen
##   Critical 464.0112   715.1436                 62.8452
##   High     465.1320   716.8710                 62.9970
##   Low      456.5392   703.6276                 61.8332
##   Medium   482.3176   743.3578                 65.3246
chisq.test(table(visita_pacientes_sala_urgencias_ETL$nivel_urgencia, visita_pacientes_sala_urgencias_ETL$resultado_paciente))$residuals
##           
##              Admitted Discharged Left Without Being Seen
##   Critical   7.520050  -3.707388               -7.927496
##   High       7.737220  -3.879483               -7.937065
##   Low      -16.405805   8.081602               17.316510
##   Medium     0.987281  -0.416577               -1.277423
chisq.test(table(visita_pacientes_sala_urgencias_ETL$nivel_urgencia, visita_pacientes_sala_urgencias_ETL$resultado_paciente))$stdres
##           
##               Admitted  Discharged Left Without Being Seen
##   Critical  10.9597714  -6.5658255              -9.3846495
##   High      11.2807794  -6.8733507              -9.3997294
##   Low      -23.8465582  14.2746717              20.4451255
##   Medium     1.4483433  -0.7426198              -1.5221829
Contribuciones [T-CP]

El análisis de las contribuciones de las celdas al estadístico Chi-cuadrado (T-CP) permite identificar con precisión qué combinaciones de nivel de urgencia y resultado del paciente explican la dependencia observada entre ambas variables.

Los resultados muestran que el nivel de urgencia bajo es el principal responsable de la asociación estadística. En particular, la combinación “Low – Left Without Being Seen” aporta aproximadamente 33,02 % del valor total del Chi-cuadrado, constituyéndose como la mayor contribución individual. De forma complementaria, la combinación “Low – Admitted” contribuye con cerca del 29,64 %, lo que indica una desviación muy marcada respecto a lo esperado bajo independencia. En conjunto, estas dos celdas concentran más del 60 % de la dependencia total, evidenciando que el comportamiento de los pacientes de baja urgencia es el principal factor estructural que rompe la independencia entre las variables.

En los niveles crítico y alto, las contribuciones se distribuyen principalmente entre los resultados Admitted y Left Without Being Seen, con valores cercanos al 6–7 % por celda. Aunque estas contribuciones son significativamente menores que las observadas en la urgencia baja, siguen siendo relevantes y reflejan una sobrerrepresentación de admisiones y una subrepresentación del abandono, coherente con la priorización clínica de estos pacientes. Por el contrario, el nivel de urgencia media presenta contribuciones prácticamente nulas en todas las categorías de resultado (inferiores al 0,2 %), lo que indica que su distribución de resultados es muy cercana a la esperada bajo independencia y, por tanto, no desempeña un papel determinante en la asociación global.

chisq.test(table(visita_pacientes_sala_urgencias_ETL$nivel_urgencia, visita_pacientes_sala_urgencias_ETL$resultado_paciente))$residuals^2/chisq.test(table(visita_pacientes_sala_urgencias_ETL$nivel_urgencia, visita_pacientes_sala_urgencias_ETL$resultado_paciente))$statistic*100
##           
##               Admitted  Discharged Left Without Being Seen
##   Critical  6.22702201  1.51347412              6.92007817
##   High      6.59187237  1.65724417              6.93679333
##   Low      29.63698336  7.19173641             33.01867393
##   Medium    0.10732984  0.01910862              0.17968367
Correspondencia Simple Unidimensional [R-UR]

El análisis de la Correspondencia Simple Unidimensional (R-UR) entre el nivel de urgencia y el resultado del paciente confirma que la relación entre ambas variables puede explicarse casi en su totalidad mediante una sola dimensión interpretativa. En efecto, la Dimensión 1 explica el 99,99 % de la inercia total, mientras que la Dimensión 2 aporta una proporción despreciable de variabilidad, lo que valida una representación esencialmente unidimensional de la asociación.

Desde el punto de vista de las categorías de resultado (columnas), las coordenadas sobre la Dimensión 1 muestran una clara oposición entre “Left Without Being Seen”, ubicado en el extremo positivo del eje, y “Admitted”, situado en el extremo negativo. El resultado “Discharged” aparece cercano al origen, indicando un comportamiento más promedio y menos discriminante. Las contribuciones confirman este patrón: “Left Without Being Seen” (47,06 %) y “Admitted” (42,57 %) son las categorías que más explican la estructura de la dimensión principal, mientras que “Discharged” tiene un aporte menor. Además, los valores de cos² cercanos a 1 indican que estas categorías están muy bien representadas en la Dimensión 1.

En cuanto a las categorías de nivel de urgencia (filas), la urgencia baja se posiciona claramente en el extremo positivo de la Dimensión 1 y aporta cerca del 69,85 % de la contribución total, consolidándose como el principal factor explicativo de la asociación. En el extremo opuesto se ubican los niveles crítico y alto, con coordenadas negativas y contribuciones moderadas, mientras que la urgencia media se mantiene próxima al origen, reflejando un comportamiento cercano al promedio y con escasa capacidad discriminante.

CA(table(visita_pacientes_sala_urgencias_ETL$nivel_urgencia, visita_pacientes_sala_urgencias_ETL$resultado_paciente), graph = FALSE)$eig
##         eigenvalue percentage of variance cumulative percentage of variance
## dim 1 1.816165e-01           99.991742663                          99.99174
## dim 2 1.499792e-05            0.008257337                         100.00000
CA(table(visita_pacientes_sala_urgencias_ETL$nivel_urgencia, visita_pacientes_sala_urgencias_ETL$resultado_paciente), graph = FALSE)$col
## $coord
##                              Dim 1        Dim 2
## Admitted                -0.4548842  0.002838829
## Discharged               0.1809405 -0.002888867
## Left Without Being Seen  1.2995889  0.011913499
## 
## $contrib
##                            Dim 1    Dim 2
## Admitted                42.56506 20.07494
## Discharged              10.37977 32.04023
## Left Without Being Seen 47.05516 47.88484
## 
## $cos2
##                             Dim 1        Dim 2
## Admitted                0.9999611 3.894573e-05
## Discharged              0.9997452 2.548431e-04
## Left Without Being Seen 0.9999160 8.402919e-05
## 
## $inertia
## [1] 0.07730818 0.01885619 0.08546711
CA(table(visita_pacientes_sala_urgencias_ETL$nivel_urgencia, visita_pacientes_sala_urgencias_ETL$resultado_paciente), graph = FALSE)$row
## $coord
##                Dim 1         Dim 2
## Critical -0.32741210 -0.0005062634
## High     -0.33279029  0.0048251257
## Low       0.72047500  0.0016500744
## Medium   -0.04605012 -0.0057280350
## 
## $contrib
##               Dim 1     Dim 2
## Critical 14.6617499  0.424496
## High     15.1839719 38.653201
## Low      69.8527953  4.436874
## Medium    0.3014828 56.485429
## 
## $cos2
##              Dim 1        Dim 2
## Critical 0.9999976 2.390907e-06
## High     0.9997898 2.101768e-04
## Low      0.9999948 5.245259e-06
## Medium   0.9847636 1.523638e-02
## 
## $inertia
## [1] 0.0266282172 0.0275823920 0.1268648510 0.0005560141

3.3. Correspondencias Múltiples {.tabset .tabset-pills}.

El análisis de correspondencias múltiples (ACM) se construye sobre esta tabla disyuntiva, aplicando el método de correspondencias de forma conjunta a todas las variables categóricas, particionando de manera exclusiva y exhaustiva a la población en función de sus características.

Esta sección se plantea como una solución complementaria al ACS, cuyo análisis en la sección3.2 estuvo limitado por la naturaleza unidimensional de los datos y la imposibilidad de una representación bidimensional significativa. Por ello, mediante el ACM y el tratamiento conjunto de todas las variables categóricas relacionadas, se busca construir una representación más completa en el primer plano factorial, ofreciendo una visión integral de las asociaciones clínicas más relevantes.

ACM

round(MCA(visita_pacientes_sala_urgencias_ETL[1:5000, -c(1,3,4,6,7,8,9,10,11,12,14)], graph = FALSE)$eig,2)
##       eigenvalue percentage of variance cumulative percentage of variance
## dim 1       0.48                  23.77                             23.77
## dim 2       0.34                  16.96                             40.73
## dim 3       0.33                  16.67                             57.40
## dim 4       0.33                  16.61                             74.00
## dim 5       0.33                  16.44                             90.44
## dim 6       0.19                   9.56                            100.00

Biplot ACM

El analisis de correspondencias multiples (ACM) Es una técnica excelente para encontrar patrones en datos categóricos como los de una sala de urgencias.

El diagrama biplot, que explica un 40.8% de la variabilidad total de los datos, revela una segmentación clara en la dinámica de la sala de urgencias, identificando tres perfiles de pacientes bien diferenciados: Existe una fuerte correlación entre los pacientes clasificados con prioridad “Critical” (Crítica) y “High” (Alta) con el desenlace de ser “Admitted” (Hospitalizados). Se observa un agrupamiento distinto de pacientes con prioridad “Medium” (Media) provenientes de zonas “Rurales”. Este grupo está fuertemente vinculado al estado “Discharged” (Dados de alta), indicando que la afluencia rural tiende a presentar patologías que se resuelven en la misma sala de urgencias sin requerir hospitalización. Las categorías de prioridad “Low” (Baja) se proyectan en la misma dirección que la categoría “Left Without Being Seen” (Se fue sin ser visto). Esto alerta sobre un posible problema operativo: los pacientes con menor urgencia podrían estar enfrentando tiempos de espera prolongados que los motivan a abandonar el servicio antes de recibir atención.

fviz_mca_biplot(MCA(visita_pacientes_sala_urgencias_ETL[1:5000, -c(1,3,4,6,7,8,9,10,11,12,14)], graph = FALSE), repel = TRUE)

Biplot ACM Reducido

Al analizar una sub-muestra representativa de 150 pacientes mediante un Biplot ACM, hemos logrado aislar comportamientos específicos. Mientras que la gran mayoría de los pacientes se agrupan en flujos de atención estándar (Ingreso por estado Crítico vs. Alta médica), destaca un grupo disociado en el cuadrante superior derecho.

Este grupo, representado por la categoría ‘Left Without Being Seen’, no comparte características ni con los pacientes graves ni con los leves dados de alta. La identificación de individuos específicos en este clúster (ej. pacientes ID 36, 105) sugiere que el abandono del servicio no es aleatorio, sino que responde a un perfil particular que requiere una auditoría operativa específica.

set.seed(780728)
fviz_mca_biplot(MCA(visita_pacientes_sala_urgencias_ETL[sample(1:nrow(visita_pacientes_sala_urgencias_ETL),150), -c(1,3,4,6,7,8,9,10,11,12,14)], graph = FALSE), repel = TRUE)

Contribuciones

Observando el gráfico de categorías, las variables coloreadas en naranja son las que tienen la mayor contribución.

Esto significa que lo que más diferencia a un paciente de otro en esta sala de urgencias no es su origen ni su triaje medio, sino si es ingresado o si abandona el servicio. El sistema está fuertemente polarizado por el resultado final de la atención. Gracias a la reducción de datos, hemos identificado individuos específicos que representan este fallo en la atención. Estos casos sirven como “pacientes trazadores” para realizar una auditoría y entender qué falló en sus procesos individuales.

El sistema muestra una alta coherencia en los casos graves: los pacientes “Critical” y “High” se agrupan densamente con la variable “Admitted” (cuadrante izquierdo), lo que indica que el triaje funciona correctamente para priorizar y hospitalizar a quien lo necesita. De igual forma, los pacientes “Rural” y “Medium” se asocian correctamente con el alta médica (“Discharged”), sugiriendo un flujo eficiente para patologías de complejidad media.

fviz_contrib(MCA(visita_pacientes_sala_urgencias_ETL[1:5000, -c(1,3,4,6,7,8,9,10,11,12,14)], graph = FALSE), choice = "var", axes = 1, top = 15)

fviz_contrib(MCA(visita_pacientes_sala_urgencias_ETL[1:5000, -c(1,3,4,6,7,8,9,10,11,12,14)], graph = FALSE), choice = "var", axes = 2, top = 15)

fviz_contrib(MCA(visita_pacientes_sala_urgencias_ETL[1:5000, -c(1,3,4,6,7,8,9,10,11,12,14)], graph = FALSE), choice = "var", axes = 3, top = 15)

Biplot con Contribuciones

fviz_mca_var(MCA(visita_pacientes_sala_urgencias_ETL[1:5000, -c(1,3,4,6,7,8,9,10,11,12,14)], graph = FALSE), col.var ="contrib", gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), repel = TRUE)

Calidad de Representación

fviz_mca_var(MCA(visita_pacientes_sala_urgencias_ETL[1:5000, -c(1,3,4,6,7,8,9,10,11,12,14)], graph = FALSE), col.var ="cos2", gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), repel = TRUE)

Fase 4 [Conglomerados]

El Profesor (EAMOTImo42023?), en su trabajo (al que se pueden remitir mediante el enlace), señalaba que los autores (Díaz Morales & Morales Rivera, 2012), basándose en el análisis de Everitt (1980) titulado Cluster Analysis, describen los conglomerados como zonas continuas en un espacio donde se concentra una alta densidad de puntos, separadas por áreas con menor densidad. Para identificar estas concentraciones, se emplean diferentes técnicas, destacándose los métodos jerárquicos. Estos inician con el cálculo de una matriz de distancias entre los elementos analizados, lo que permite agruparlos mediante un proceso de aglomeración. Este método comienza con conglomerados individuales y avanza hacia un único grupo final. A lo largo de este proceso, se generan fusiones y divisiones que establecen jerarquías basadas en similitudes, representadas gráficamente a través de un dendograma.

4.1. Objetivos

En esta cuarta etapa del estudio se presentarán cálculos, visualizaciones e interpretaciones, utilizando el conjunto de datos procesado en las fases previas (1, 2 y 3). El enfoque se centrará en el análisis de conglomerados, abarcando tanto su versión jerárquica mediante dendrogramas como la no jerárquica con K-medias.

4.2. Agrupación Jerárquica

La pestaña Disimilaridad ofrece una representación gráfica que muestra las relaciones de proximidad entre las categorías de la variable “Hospitals”. A través de una escala de colores que representa las distancias entre los registros, se evidencia que hospitales como el Lilavati Hospital and Research Centre y el Medanta - The Medicity se destacan por estar significativamente alejados del resto. Por otro lado, instituciones como el Apollo Hospitals, Chennai y el Fortis Memorial Research Institute, Gurugram presentan menor diferencia entre sí. Este comportamiento indica que los hospitales más similares tienden a formar agrupaciones dentro de las mismas jerarquías, mientras que aquellos con distancias más pronunciadas probablemente conformen grupos independientes, reflejando diferencias específicas dentro del análisis.

La pestaña Optimización de Mojena identifica el número óptimo de grupos para clasificar a los pacientes según tres estrategias jerárquicas. Tanto la unión simple como la unión completa concluyen que tres grupos son ideales, maximizando la cohesión interna y diferenciación externa. Por su lado, la unión promedio sugiere tres grupos como la configuración óptima, considerando distancias medias. Cada método se acompaña de su respectivo dendograma para visualizar las jerarquías y agrupaciones resultantes.

La pestaña Dendogramas Optimizados representa gráficamente los patrones observados en la sección de Disimilaridad, validando las agrupaciones entre pacientes con afecciones cardiovasculares según las similitudes detectadas en sus características, basadas en los hospitales de atención. Además, proporciona una visualización clara de las alturas jerárquicas, especialmente en los métodos de Enlace Completo y Enlace Promedio, que son determinantes para identificar el número óptimo de conglomerados.

Campo Clasificador

El campo clasificador de satisfacción del paciente permite caracterizar la percepción global del servicio de urgencias a partir de cinco categorías ordinales: muy insatisfecho, insatisfecho, neutral, satisfecho y muy satisfecho. Los resultados muestran una distribución heterogénea de las respuestas, con una marcada concentración en los niveles extremos.

En particular, la categoría “muy insatisfecho” representa la mayor proporción de respuestas, con 1.538 registros, lo que equivale aproximadamente al 30,75 % del total. Este resultado sugiere la existencia de una fracción considerable de pacientes con una percepción negativa del servicio, posiblemente asociada a factores como los tiempos de espera, la comunicación o la experiencia durante el proceso de atención. A esta categoría se suma el grupo “insatisfecho”, que aporta un 12,10 %, reforzando la evidencia de un nivel relevante de descontento entre los usuarios.

Por otro lado, la categoría “satisfecho” concentra 1.429 observaciones, correspondientes a cerca del 28,57 %, lo que indica que una proporción similar de pacientes evalúa positivamente el servicio recibido. Sin embargo, el nivel “muy satisfecho” alcanza únicamente el 11,10 %, lo que sugiere que, aunque existe satisfacción, esta no se traduce de manera consistente en evaluaciones altamente positivas. La categoría “neutral”, con un 17,46 %, refleja una percepción intermedia, posiblemente asociada a experiencias que cumplen expectativas mínimas sin generar una valoración claramente positiva o negativa.

Satisfaccion <- read_excel("C:/Users/Sebastian Valencia/Desktop/Gestion de datos/Satisfaccion.xlsx")
head(as.data.frame(Satisfaccion))
##   satisfaccion_paciente relacion relacion_acumulada
## 1      muy insatisfecho     1538          0.3075385
## 2          insatisfecho      605          0.1209758
## 3               neutral      873          0.1745651
## 4            satisfecho     1429          0.2857429
## 5        muy satisfecho      555          0.1109778

Disimilaridad

El mapa de calor de disimilaridad permite analizar el grado de diferencia existente entre las categorías del nivel de satisfacción del paciente, ofreciendo una visión relacional más profunda que la simple distribución de frecuencias. En este gráfico, los colores más intensos representan mayores niveles de disimilitud, mientras que los tonos más suaves indican mayor cercanía o similitud entre categorías. Los resultados evidencian que la categoría “muy insatisfecho” presenta los mayores niveles de disimilaridad frente a “muy satisfecho” y “satisfecho”, lo que confirma una polarización marcada en la percepción del servicio.

Por el contrario, las categorías “neutral”, “insatisfecho” y “satisfecho” muestran niveles de disimilaridad más moderados entre sí, lo que indica una zona intermedia de percepción, donde las experiencias no son extremas y pueden desplazarse hacia la satisfacción o la insatisfacción según factores operativos puntuales. Asimismo, la baja disimilaridad observada entre “satisfecho” y “muy satisfecho” indica coherencia dentro del polo positivo de la escala, aunque su distancia respecto a los niveles negativos revela que el sistema no está logrando transformar de manera consistente la experiencia del usuario desde la insatisfacción hacia la satisfacción plena.

data_ = as.data.frame(satisfaccion_promedio)[, -c(1)]
rownames(data_) = unclass(satisfaccion_promedio$satisfaccion_paciente)
fviz_dist(get_dist(data_, stand = T, method = "euclidean"), gradient = list(low = "#00AFBB", mid = "white", high = "#FC4E07"))

Optimización de Mojena

Unión Simple

El gráfico de Unión Simple indica que el número óptimo de grupos es igual a 2, lo que sugiere que la estructura subyacente de los datos de satisfacción del paciente puede describirse de manera adecuada mediante dos conglomerados claramente diferenciados. Este resultado implica que, más allá de la clasificación ordinal original en cinco niveles de satisfacción, las percepciones de los pacientes tienden a agruparse en dos grandes perfiles dominantes. La separación observada refleja una polarización en la experiencia del usuario, donde un primer grupo concentra a los pacientes con evaluaciones predominantemente negativas (muy insatisfechos e insatisfechos), mientras que el segundo grupo reúne a aquellos con percepciones neutrales a positivas (neutral, satisfecho y muy satisfecho).

Desde una perspectiva analítica y operativa, este resultado es relevante porque simplifica la interpretación del fenómeno de satisfacción: el servicio de urgencias no está enfrentando múltiples patrones complejos de percepción, sino dos grandes bloques de experiencia claramente contrastantes.

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)

Unión Completa

El gráfico correspondiente al método de Unión Completa confirma que el número óptimo de grupos es igual a 2, reforzando los resultados obtenidos previamente con el método de Unión Simple. Esta coincidencia entre ambos criterios de agrupamiento indica que la estructura de los datos de satisfacción del paciente es robusta y estable, y no depende del método de enlace utilizado en el análisis jerárquico.

La clara separación observada al pasar de uno a dos grupos sugiere que el principal patrón de diferenciación en las percepciones de los pacientes se produce en ese nivel de partición.

Desde una perspectiva interpretativa, estos dos conglomerados pueden asociarse nuevamente con un grupo de insatisfacción y un grupo de satisfacción, integrando las categorías intermedias dentro del grupo que presenta una percepción global menos negativa.

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)

Unión Promedio

El gráfico obtenido mediante el método de Unión Promedio confirma nuevamente que el número óptimo de grupos es igual a 2, en coherencia con los resultados de los métodos de Unión Simple y Unión Completa. Esta consistencia entre los distintos criterios de enlace refuerza la solidez del patrón de agrupamiento identificado en los datos de satisfacción del paciente.

La marcada diferencia en el valor del criterio de agrupamiento al pasar de uno a dos nodos indica que la principal ganancia explicativa se alcanza con la partición en dos conglomerados, mientras que la incorporación de un tercer grupo no aporta una mejora significativa.

Desde una perspectiva interpretativa, estos dos grupos pueden asociarse a un perfil predominantemente insatisfecho y a un perfil predominantemente satisfecho o neutral, integrando las categorías intermedias dentro del grupo de mayor cercanía perceptual.

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 = 3, cex = 0.5, k_colors = "npg", color_labels_by_k = T, rect = T)

4.3. Agrupación No-Jerárquica

Según (Díaz Morales & Morales Rivera, 2012), los métodos de aglomeración no jerárquicos, también conocidos como métodos de partición, se basan en una partición inicial del conjunto de datos, generando subconjuntos o grupos. A cada uno de estos grupos se le calcula un centroide, y posteriormente, las observaciones se asignan al conglomerado cuyo centroide se encuentra más cercano. Este proceso se repite recursivamente, recalculando los centroides y ajustando las asignaciones hasta que las observaciones ya no puedan cambiar de grupo. A diferencia de los métodos jerárquicos, este enfoque permite que una observación cambie de grupo durante el proceso.

El análisis del conjunto de datos se cerrará con el método no jerárquico de K-medias, que divide un conjunto de \(n\) objetos en \(k\) grupos. Este método selecciona los centroides de los grupos de manera que minimicen la distancia euclidiana entre cada objeto y su centroide más cercano. Las observaciones se asignan al conglomerado cuyo centroide esté más próximo, con el objetivo de reorganizar los objetos en grupos que presenten la menor variabilidad interna posible.

K-Óptimo

Elbow
fviz_nbclust(data_, kmeans, method = "wss", k.max = 3) + 
geom_vline(xintercept = 3, linetype = 2)

Silhouette
n_filas <- nrow(data_)
k_max <- min(5, n_filas - 1) # Ajusta según tus datos
fviz_nbclust(scale(data_), kmeans, method = "silhouette", k.max = k_max)

Gap Statistic
suppressWarnings(fviz_nbclust(scale(data_), kmeans, method = "gap_stat", k.max = k_max, nboot = 50))

Resultados K-Means

K-Óptimo [El_Ma-Rul 3]
set.seed(121124)
print(kmeans(data_, 3, nstart = 25))
## K-means clustering with 3 clusters of sizes 2, 2, 1
## 
## Cluster means:
##   promedio_tiempo_triage promedio_tiempo_atencion_profesional_medico
## 1                  20.45                                        41.8
## 2                   5.15                                        13.4
## 3                  54.40                                        89.2
##   promedio_tiempo_total_espera
## 1                        73.25
## 2                        21.25
## 3                       167.50
## 
## Clustering vector:
## muy insatisfecho     insatisfecho          neutral       satisfecho 
##                3                1                1                2 
##   muy satisfecho 
##                2 
## 
## Within cluster sum of squares by cluster:
## [1] 652.45 119.07   0.00
##  (between_SS / total_SS =  96.2 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"
K-Óptimo [sil 4]
set.seed(121124)
print(kmeans(data_, 4, nstart = 25))
## K-means clustering with 4 clusters of sizes 1, 2, 1, 1
## 
## Cluster means:
##   promedio_tiempo_triage promedio_tiempo_atencion_profesional_medico
## 1                  25.30                                        49.8
## 2                   5.15                                        13.4
## 3                  54.40                                        89.2
## 4                  15.60                                        33.8
##   promedio_tiempo_total_espera
## 1                        88.70
## 2                        21.25
## 3                       167.50
## 4                        57.80
## 
## Clustering vector:
## muy insatisfecho     insatisfecho          neutral       satisfecho 
##                3                1                4                2 
##   muy satisfecho 
##                2 
## 
## Within cluster sum of squares by cluster:
## [1]   0.00 119.07   0.00   0.00
##  (between_SS / total_SS =  99.4 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"

Gráficos K-Means

K-Óptimo [Elb_Ma-Rul 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

K-Óptimo [sil 4]
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

Fase 5 [Regresiones]

El análisis de regresión es una herramienta estadística empleada para identificar y evaluar las relaciones entre distintas variables. Este método permite explorar cómo una variable dependiente o de respuesta se ve afectada por los cambios en una o más variables independientes o predictoras, utilizando diversas técnicas de modelado y análisis. En este documento se abordarán los modelos de regresión lineal (en sus versiones simple y múltiple) y el modelo logístico, ambos considerados como casos específicos del modelo de regresión lineal generalizado.

5.1. Objetivos

Este estudio tiene como propósito establecer la relación entre dos o más variables mediante la obtención de información sobre una de ellas, basada en el conocimiento de los valores de las otras. Las relaciones establecidas son de carácter no determinístico, es decir, se plantearán relaciones probabilísticas y se implementarán procedimientos para realizar inferencias sobre los modelos utilizados. Además, se obtendrán medidas cuantitativas que indiquen el grado de relación entre las variables. Los modelos considerados en este trabajo corresponden a casos específicos del modelo lineal generalizado: Regresión Lineal Simple, Regresión Lineal Múltiple y Regresión Logística. Cada modelo será descrito teóricamente en su respectiva sección, y se aplicará a un conjunto de datos específico descrito en la sección 2.

5.2. Regresión Lineal Simple

Este modelo, que a partir de ahora se denominará como RLS, está compuesto por dos variables: una predictora y otra respuesta. Específicamente, la variable \(Y\) se considera influida por la variable predictora \(x\). La relación entre estas variables está descrita por la ecuación: \[Y = \beta_0 + \beta_1x + \varepsilon\]

Donde: - \(Y\): Es la variable dependiente (la que se desea predecir o explicar). - \(x\): Es la variable independiente (predictora). - \((\beta_0)\): Es el intercepto (valor de \(Y\) cuando \((x = 0)\). - \((\beta_1)\): Es la pendiente (indica cuánto cambia \(Y\) por cada unidad que cambia \((x)\). - \((\epsilon)\): Es el término de error, que captura las desviaciones entre los valores observados y los valores predichos por el modelo.

La relación entre la variable independiente y la variable dependiente en el modelo de regresión lineal simple debe cumplir ciertas suposiciones clave para que los resultados sean válidos. Estas son las siguientes: 1. La relación entre la variable independiente \(x\) y la variable dependiente \(Y\) debe ser lineal. 2. El término de error \(ε\) sigue una distribución normal y tiene una media igual a cero. 3. Las observaciones deben ser independientes entre sí, es decir, el valor de \(Y\) para un dato no influye en los valores de \(Y\) para otros datos. 4. La varianza del término de error \(ε\) debe ser constante para todos los valores de la variable independiente \(x\), una condición conocida como homocedasticidad. La varianza de \(\varepsilon\) es constante para todos los valores de \(x\).

Coeficientes del Modelo RLS
modelo_RL_Simple = lm(visita_pacientes_sala_urgencias_ETL$satisfaccion_paciente~visita_pacientes_sala_urgencias_ETL$tiempo_total_espera)
coef(modelo_RL_Simple)
##                                             (Intercept) 
##                                              4.25446015 
## visita_pacientes_sala_urgencias_ETL$tiempo_total_espera 
##                                             -0.01810207
Resumen Estadístico del Modelo RLS
summary(modelo_RL_Simple)
## 
## Call:
## lm(formula = visita_pacientes_sala_urgencias_ETL$satisfaccion_paciente ~ 
##     visita_pacientes_sala_urgencias_ETL$tiempo_total_espera)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1.6072 -0.5123  0.0039  0.3791  4.7467 
## 
## Coefficients:
##                                                           Estimate Std. Error
## (Intercept)                                              4.2544601  0.0158100
## visita_pacientes_sala_urgencias_ETL$tiempo_total_espera -0.0181021  0.0001484
##                                                         t value Pr(>|t|)    
## (Intercept)                                               269.1   <2e-16 ***
## visita_pacientes_sala_urgencias_ETL$tiempo_total_espera  -122.0   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.7145 on 4998 degrees of freedom
## Multiple R-squared:  0.7485, Adjusted R-squared:  0.7484 
## F-statistic: 1.487e+04 on 1 and 4998 DF,  p-value: < 2.2e-16
Tabla ANOVA para el Modelo RLS
anova(modelo_RL_Simple)
## Analysis of Variance Table
## 
## Response: visita_pacientes_sala_urgencias_ETL$satisfaccion_paciente
##                                                           Df Sum Sq Mean Sq
## visita_pacientes_sala_urgencias_ETL$tiempo_total_espera    1 7593.4  7593.4
## Residuals                                               4998 2551.8     0.5
##                                                         F value    Pr(>F)    
## visita_pacientes_sala_urgencias_ETL$tiempo_total_espera   14873 < 2.2e-16 ***
## Residuals                                                                    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

5.3. Regresión Lineal Múltiple.

Este modelo, que puede inicialmente pensarse como una extensión de la regresión lineal simple para facilitar su comprensión, y que eventualmente será llamado en este estudio como RLM, tiene como ecuación general aditiva:\[y_i=\beta_0+\beta_1 x_{i1}+\cdots+\beta_k x_{ik}+\varepsilon_i, \hspace{3mm}i=1,2,\dots,n\hspace{10mm}(21)\]

Donde: - $y_i $: Valor observado de la variable dependiente para la observación $ i $ - \(\beta_0\): Intercepto, valor de $ y $ cuando todas las $ x_j = 0 $. - \(\beta_1, \beta_2, \dots, \beta_k\): Coeficientes que indican cuánto cambia \(y\) por cada unidad que cambia \(x_j\), manteniendo constantes las demás variables. - $ _i $: Término de error para la observación \(i\). - $ E() = 0 $: Se asume que el error tiene media cero. - $ V() = ^2 $: La varianza del error es constante.

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

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

Además, una prueba de utilidad del modelo de regresión lineal múltiple consiste en una prueba de hipótesis basada en un estadístico que tiene una distribución \(F\) particular cuando \(H_0\) es verdadera, esto de expresa en el par:\[H_0:\beta_1=\beta_2=\cdots=\beta_k=0\hspace{10mm}(22)\] \[H_1: \text {al menos una }\beta_i\neq 0\hspace{5mm}(i=1,...,k)\hspace{10mm}(23)\] el valor del estadístico de prueba es:\[f=\frac{R^2/k}{(1-R^2)(n-(k+1))}=\frac{SCR/k}{SCE/(n-(k+1))}=\frac{RMC}{CME}\hspace{10mm}(24)\] donde \(SCR=STC-SCE\), que es la suma de cuadrados de regresión, y la región de rechazo para una prueba de nivel \(\alpha\) es: \[f\geq F_{\alpha, k,n-(k+1)}\hspace{10mm}(25)\] Por último, un intervalo de confianza al \(100(1-\alpha)\%\) para \(\beta_i\) es: \[\hat\beta_i\pm t_{\alpha/2,n-(k+1)}\cdot s_{\hat\beta_{i}}\hspace{10mm}(26)\] y un intervalo de confianza al mismo nivel de significancia para un valor futuro está dado por: \[\hat y\pm t_{\alpha/2,n-(k+1)}\cdot \sqrt{s^2+s^2_{\hat Y}}\hspace{10mm}(27)\] Para cerrar, es necesario mencionar que eventualmente surgen problemas en los análisis de regresión múltiple que implican considerar técnicas de solución relacionadas con transformaciones de no-linealidad, estandarización y selección de variables, identificación de observaciones influyentes, multicolinealidad, entre otras. (Según (EAMOTImo42023?) )

Con base en el conjunto de datos descrito en la sección 1.2, se formulará un modelo de regresión lineal múltiple para estudiar la relación lineal entre la variable dependiente Max Heart Rate y las variables cualitativas del conjunto de datos: chestpain,restingelectro,slope, noofmajorveseels,gender,excersiceangina,fastingbloodsugar y target como independientes. Este análisis permitirá evaluar cómo estas características categóricas influyen en los valores de frecuencia cardíaca máxima y determinar su impacto en el contexto del estudio.

Resumen Variables Cuantitativas
summary(visita_pacientes_sala_urgencias_ETL$relacion_enfermera_paciente)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   3.000   3.000   3.238   4.000   5.000
summary(visita_pacientes_sala_urgencias_ETL$especialistas_disponibles)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.000   1.000   3.000   3.875   6.000  10.000
summary(visita_pacientes_sala_urgencias_ETL$tiempo_registro)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     0.0     3.0     8.0    11.7    18.0    66.0
summary(visita_pacientes_sala_urgencias_ETL$tiempo_triage)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1.00    6.00   16.00   24.83   36.00  163.00
summary(visita_pacientes_sala_urgencias_ETL$tiempo_atencion_profesional_medico)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    2.00   17.00   35.00   45.39   66.00  233.00
summary(visita_pacientes_sala_urgencias_ETL$tiempo_total_espera)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    4.00   27.00   60.00   81.92  122.00  442.00
Resumen Variables Cualitativas
table(visita_pacientes_sala_urgencias_ETL$nombre_hospitales)
## 
## Northside Community Hospital     Riverside Medical Center 
##                          999                         1023 
## Springfield General Hospital   St. Mary’s Regional Health 
##                          994                          995 
##         Summit Health Center 
##                          989
prop.table(table(visita_pacientes_sala_urgencias_ETL$nombre_hospitales))
## 
## Northside Community Hospital     Riverside Medical Center 
##                       0.1998                       0.2046 
## Springfield General Hospital   St. Mary’s Regional Health 
##                       0.1988                       0.1990 
##         Summit Health Center 
##                       0.1978
barplot(table(visita_pacientes_sala_urgencias_ETL$nombre_hospitales))

table(visita_pacientes_sala_urgencias_ETL$zona)
## 
## Rural Urban 
##  1994  3006
prop.table(table(visita_pacientes_sala_urgencias_ETL$zona))
## 
##  Rural  Urban 
## 0.3988 0.6012
barplot(table(visita_pacientes_sala_urgencias_ETL$zona))

table(visita_pacientes_sala_urgencias_ETL$dia_semana)
## 
##    Friday    Monday  Saturday    Sunday  Thursday   Tuesday Wednesday 
##       685       768       701       725       706       741       674
prop.table(table(visita_pacientes_sala_urgencias_ETL$dia_semana))
## 
##    Friday    Monday  Saturday    Sunday  Thursday   Tuesday Wednesday 
##    0.1370    0.1536    0.1402    0.1450    0.1412    0.1482    0.1348
barplot(table(visita_pacientes_sala_urgencias_ETL$dia_semana))

table(visita_pacientes_sala_urgencias_ETL$temporada)
## 
##     Afternoon Early Morning       Evening  Late Morning         Night 
##          1502           473          1725           770           530
prop.table(table(visita_pacientes_sala_urgencias_ETL$temporada))
## 
##     Afternoon Early Morning       Evening  Late Morning         Night 
##        0.3004        0.0946        0.3450        0.1540        0.1060
barplot(table(visita_pacientes_sala_urgencias_ETL$temporada))

table(visita_pacientes_sala_urgencias_ETL$nivel_urgencia)
## 
## Critical     High      Low   Medium 
##     1242     1245     1222     1291
prop.table(table(visita_pacientes_sala_urgencias_ETL$nivel_urgencia))
## 
## Critical     High      Low   Medium 
##   0.2484   0.2490   0.2444   0.2582
barplot(table(visita_pacientes_sala_urgencias_ETL$nivel_urgencia))

table(visita_pacientes_sala_urgencias_ETL$resultado_paciente)
## 
##                Admitted              Discharged Left Without Being Seen 
##                    1868                    2879                     253
prop.table(table(visita_pacientes_sala_urgencias_ETL$resultado_paciente))
## 
##                Admitted              Discharged Left Without Being Seen 
##                  0.3736                  0.5758                  0.0506
barplot(table(visita_pacientes_sala_urgencias_ETL$resultado_paciente))

table(visita_pacientes_sala_urgencias_ETL$satisfaccion_paciente)
## 
##    1    2    3    4    5 
## 1538  605  873 1429  555
prop.table(table(visita_pacientes_sala_urgencias_ETL$satisfaccion_paciente))
## 
##      1      2      3      4      5 
## 0.3076 0.1210 0.1746 0.2858 0.1110
barplot(table(visita_pacientes_sala_urgencias_ETL$satisfaccion_paciente))

Diagramas de Dispersión Variables Cuantitativas
pairs(~relacion_enfermera_paciente + especialistas_disponibles + tiempo_registro + tiempo_triage + tiempo_atencion_profesional_medico + tiempo_total_espera, data = visita_pacientes_sala_urgencias_ETL)

5.4. Regresión Logística Simple

La regresión logística simple se utiliza para analizar la relación entre una variable categórica dependiente y una única variable independiente, permitiendo calcular las probabilidades de pertenencia a distintas categorías.

El modelo permite identificar relaciones significativas entre las variables estudiadas, facilitando la predicción precisa de afecciones cardiovasculares en pacientes específicos. Este enfoque destaca por su capacidad para comprender y modelar relaciones categóricas en datos de salud.

En el caso por tratar, se trabajará con base en una distribución binomial (adecuada para variables que representan una respuesta binaria) con función de enlace logit:\[\pi(x)=\dfrac{e^{\beta_0+\beta_1 x}}{1+ e^{\beta_0 +\beta_1 x}}= \dfrac{1}{1+ e^{-(\beta_0+\beta_1 x)}}\hspace{10mm}(30)\](del inglés logarithmic unit: unidad logarítmica (natural)); que además es apropiada únicamente para la distribución binomial), por lo cual un nombre más adecuado para la regresión podría ser regresión logística binaria. Cabe anotar que el término logístico hace referencia a que la función de enlace constituye, en cierto sentido, un refinamiento del modelo exponencial de crecimiento, descrito por la función sigmoidea, de una magnitud asociada con un conjunto \(C\). (según(EAMOTImo42023?)).

Para interpretar los resultados, la función de enlace \(pi(x)\) se asocia con la razón de probabilidades (ODDS ratio, OR en inglés), definida como el logaritmo: \(log\left(\frac{\pi(x)}{1-\pi(x)}\right)\). Esta función modela la probabilidad de que un paciente presente la afección (nivel de referencia \(1\)) en función de las variables predictoras. Además, la transformación de probabilidades a razones de probabilidad conserva la relación de orden y amplía el intervalo de probabilidad \([0,1]\) al rango \((-\infty, \infty)\). Estas propiedades son fundamentales para interpretar correctamente las relaciones entre éxito (afección presente) y fracaso (afección ausente) en este contexto.

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

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

Se entiende que la transformación \(Logit\) carece de sentido para la certeza del éxito o del fracaso.

Resumen y Boxplot Tiempo Total de Espera
summary(visita_pacientes_sala_urgencias_ETL$tiempo_total_espera)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    4.00   27.00   60.00   81.92  122.00  442.00
boxplot(visita_pacientes_sala_urgencias_ETL$tiempo_total_espera, main = "Diagrama de Caja del Tiempo Total de Espera", col = c("orange"))

Histograma de Tiempo Total de Espera
summary(visita_pacientes_sala_urgencias_ETL$tiempo_total_espera)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    4.00   27.00   60.00   81.92  122.00  442.00
hist(visita_pacientes_sala_urgencias_ETL$tiempo_total_espera, main = "Histograma de Tiempo Total de Espera", col = c("blue"))

Resumen y Diagrama de Barras de Satisfaccion Paciente
table(visita_pacientes_sala_urgencias_ETL$satisfaccion_paciente)
## 
##    1    2    3    4    5 
## 1538  605  873 1429  555
prop.table(table(visita_pacientes_sala_urgencias_ETL$satisfaccion_paciente))
## 
##      1      2      3      4      5 
## 0.3076 0.1210 0.1746 0.2858 0.1110
barplot(table(visita_pacientes_sala_urgencias_ETL$satisfaccion_paciente))

##### Resumen y Diagrama de Cajas Conjunto

tapply(visita_pacientes_sala_urgencias_ETL$tiempo_total_espera, visita_pacientes_sala_urgencias_ETL$satisfaccion_paciente, mean)
##         1         2         3         4         5 
## 167.53771  88.74711  57.75716  27.69769  14.80360
tapply(visita_pacientes_sala_urgencias_ETL$tiempo_total_espera, visita_pacientes_sala_urgencias_ETL$satisfaccion_paciente, median)
##   1   2   3   4   5 
## 155  89  58  27  14
boxplot(visita_pacientes_sala_urgencias_ETL$tiempo_total_espera~visita_pacientes_sala_urgencias_ETL$satisfaccion_paciente, main = "Boxplot Conjunto: Tiempo Total Espera-Satisfaccion paciente" , col = c("orange", "blue"))

##### Coeficientes del Modelo RLogS

# Librerías
library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
# --------------------------------------------------
# 1. Limpieza básica de los datos
# --------------------------------------------------

# Eliminar fila de resumen "Total" (CRÍTICO)
visita_pacientes_sala_urgencias_ETL <-
  visita_pacientes_sala_urgencias_ETL |>
  dplyr::filter(nombre_hospitales != "Total")

# --------------------------------------------------
# 2. Crear variable binaria de satisfacción
#    (1 = satisfecho, 0 = no satisfecho)
# --------------------------------------------------

visita_pacientes_sala_urgencias_ETL <- 
  visita_pacientes_sala_urgencias_ETL |>
  mutate(
    satisf_binaria = ifelse(satisfaccion_paciente >= 4, 1, 0)
  )

# Verificar distribución
table(visita_pacientes_sala_urgencias_ETL$satisf_binaria)
## 
##    0    1 
## 3016 1984
# --------------------------------------------------
# 3. Seleccionar variables del modelo
# --------------------------------------------------

datos_modelo <- visita_pacientes_sala_urgencias_ETL |>
  select(
    satisf_binaria,
    tiempo_total_espera
  ) |>
  na.omit()

# --------------------------------------------------
# 4. Estimar el modelo de regresión logística binaria
# --------------------------------------------------

modelo_RLog_simple <- glm(
  satisf_binaria ~ tiempo_total_espera,
  family = binomial(link = "logit"),
  data = datos_modelo
)
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
# --------------------------------------------------
# 5. Resultados del modelo
# --------------------------------------------------

summary(modelo_RLog_simple)
## 
## Call:
## glm(formula = satisf_binaria ~ tiempo_total_espera, family = binomial(link = "logit"), 
##     data = datos_modelo)
## 
## Coefficients:
##                     Estimate Std. Error z value Pr(>|z|)    
## (Intercept)         10.03966    0.42475   23.64   <2e-16 ***
## tiempo_total_espera -0.22561    0.00965  -23.38   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 6716.9  on 4999  degrees of freedom
## Residual deviance: 1070.5  on 4998  degrees of freedom
## AIC: 1074.5
## 
## Number of Fisher Scoring iterations: 10
# --------------------------------------------------
# 6. Odds Ratios e intervalos de confianza
# --------------------------------------------------

OR <- exp(cbind(
  OR = coef(modelo_RLog_simple),
  confint(modelo_RLog_simple)
))
## Waiting for profiling to be done...
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
OR
##                               OR        2.5 %       97.5 %
## (Intercept)         2.291757e+04 1.031706e+04 5.462370e+04
## tiempo_total_espera 7.980279e-01 7.824399e-01 8.126345e-01

6. Conclusiones

El análisis integral del conjunto de datos evidencia que el servicio de urgencias presenta una estructura operativa compleja, caracterizada por una alta interdependencia entre las distintas etapas del proceso asistencial y una marcada heterogeneidad en la experiencia de los pacientes. La base de datos, con 5.000 registros y una combinación adecuada de variables cualitativas y cuantitativas, permitió abordar el fenómeno desde una perspectiva estadística robusta, operacional y perceptual, proporcionando información valiosa para la toma de decisiones en el ámbito de la gestión hospitalaria.

Los resultados muestran de manera consistente que los tiempos del proceso asistencial (registro, triage, atención médica y tiempo total de espera) están fuertemente correlacionados, lo que implica que las demoras en una etapa se propagan y se acumulan a lo largo de todo el flujo de atención. Esta relación estructural se confirma tanto en los análisis de correlación y covarianza como en los diagramas de dispersión y en el Análisis de Componentes Principales (ACP), donde un único componente principal explica más del 93 % de la variabilidad total. En consecuencia, el desempeño temporal del servicio puede interpretarse de manera efectiva mediante un factor global de duración del proceso, más que como problemas aislados en etapas individuales.

Asimismo, se evidencia que los recursos estructurales, como el número de especialistas disponibles o el tamaño de la instalación en camas, presentan una influencia limitada sobre la reducción de los tiempos de atención cuando se consideran de manera aislada. En contraste, la relación enfermera–paciente muestra asociaciones más claras con los tiempos del proceso, lo que sugiere que la carga asistencial del personal de enfermería desempeña un papel clave en la eficiencia operativa del servicio. Estos hallazgos indican que la mejora del desempeño no depende únicamente de aumentar recursos, sino de optimizar la gestión y organización de los procesos internos.

El nivel de urgencia del paciente emerge como un determinante central del resultado de la atención. Las pruebas de hipótesis y los análisis de contingencia confirman una asociación estadísticamente significativa entre la prioridad clínica y el desenlace del paciente. Los casos críticos y de alta urgencia son atendidos de manera prioritaria, sin registros de abandono, lo que refleja un funcionamiento adecuado del sistema de triage. En contraste, los pacientes de urgencia baja concentran de forma desproporcionada el fenómeno de abandono sin ser atendidos, especialmente en periodos de alta demanda, lo que señala un problema estructural en la gestión de estos casos.

Desde la perspectiva temporal, se identifica que la franja tarde–noche concentra el mayor volumen de atenciones en todos los niveles de urgencia, mientras que el día de la semana también influye en los resultados del paciente, con variaciones significativas en los patrones de egreso, admisión y abandono. Estos hallazgos sugieren la necesidad de una planificación diferenciada de recursos y turnos, ajustada a los picos de demanda, más que a la gravedad de los casos.

En cuanto a la experiencia del usuario, los análisis de satisfacción revelan una polarización clara en la percepción del servicio, con una proporción considerable de pacientes muy insatisfechos y un grupo significativo de satisfechos, pero con baja presencia de evaluaciones altamente positivas. La satisfacción del paciente se relaciona de manera negativa y fuerte con los tiempos de espera, confirmando que la oportunidad en la atención es un factor determinante de la calidad percibida. Los análisis de disimilaridad y agrupamiento refuerzan esta conclusión, mostrando que las percepciones se organizan en dos grandes perfiles: uno predominantemente insatisfecho y otro neutral–satisfecho.

En síntesis, el estudio demuestra que el principal desafío del servicio de urgencias no radica en la gravedad de los casos críticos, sino en la gestión de los pacientes de urgencia baja y media, especialmente en contextos de alta demanda. La evidencia estadística y gráfica respalda la necesidad de implementar estrategias orientadas a la reducción de los tiempos de espera, la optimización del flujo asistencial y el fortalecimiento de los procesos de registro y triage, sin comprometer la atención prioritaria de los casos graves. Estas acciones permitirían no solo mejorar la eficiencia operativa del servicio, sino también elevar de manera sostenible la satisfacción del paciente y la calidad percibida de la atención en urgencias.

7. Bibliografía

Aldás, J., & Uriel, E. (2017). Análisis multivariante aplicado con R (2nd ed.). ALFACENTAURO.
Díaz Morales, L. G., & Morales Rivera, M. A. (2012). Análisis estadístico de datos multivariados (1st ed.). UNAL.
LS0tDQp0aXRsZTogIioqdGZjX2dkZF8yMDI1XzJfZ3J1cG9fNyoqIg0Kc3VidGl0bGU6ICJFc3R1ZGlvIGRlIEFuw6FsaXNpcyBNdWx0aXZhcmlhZG8gY29uIGJhc2UgZW4gdW4gY29uanVudG8gZGUgZGF0b3Mgc29icmUgbGEgc2ltdWxhY2lvbiByZWFsaXN0YXMgZGUgbGFzIHZpc2l0YXMgZGUgcGFjaWVudGVzIGVuIGxhIHNhbGEgZGUgdXJnZW5jaWFzIGRlIHVuIGhvc3BpdGFsLiINCmF1dGhvcjogIlBvcjogSnVhbiBTZWJhc3RpYW4gVmFsZW5jaWEgw5F1c3RlKGp1YW4ubnVzdGVAY29ycmVvdW5pdmFsbGUuZWR1LmNvKSxMZWlkaSBUYXRpYW5hIFNvbGFubyBDYXN0cm8gKGxlaWRpLnNvbGFub0Bjb3JyZW91bml2YWxsZS5lZHUuY28pLFNhbnRpYWdvIE9ydGl6IFNpbHZhKHNhbnRpYWdvLm9ydGl6LnNpbHZhQGNvcnJlb3VuaXZhbGxlLmVkdS5jbyksSmhvamFuIE1hbnVlbCBCZXRhbmNvdXJ0KGpob2phbi5iZXRhbmNvdXJ0QGNvcnJlb3VuaXZhbGxlLmVkdS5jbykuIg0KZGF0ZTogIlRyYWJham8gZWxhYm9yYWRvIGVuIGVsIHBlcmlvZG8gYWNhZMOpbWljbyAyMDI1LTIsZGVsIGN1cnNvIEdlc3Rpw7NuIGRlIERhdG9zIHBhcmEgaW5nZW5pZXLDrWEgSW5kdXN0cmlhbC4iDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiBUUlVFDQogICAgdG9jX2Zsb2F0OiBUUlVFDQogICAgY29kZV9kb3dubG9hZDogVFJVRQ0KICAgIHRoZW1lOiBsdW1lbg0KYmlibGlvZ3JhcGh5OiBiaWJsaW9ncmFmaWFfTUUuYmliDQpjc2w6IGFwYS5jc2wNCmxpbmstY2l0YXRpb25zOiB5ZXMNCi0tLQ0KPCEtLSBDb25maWd1cmFjacOzbiBHbG9iYWwgZGUgUiAtLT4NCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGNvcnJwbG90KQ0KbGlicmFyeShHR2FsbHkpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGFuZHJld3MpDQpsaWJyYXJ5KHRjbHRrKQ0KbGlicmFyeShhcGxwYWNrKQ0KbGlicmFyeShncmFwaGljcykNCmxpYnJhcnkocmVzaGFwZTIpDQpsaWJyYXJ5KGZhY3RvZXh0cmEpDQpsaWJyYXJ5KHBzeWNoKQ0KbGlicmFyeShGYWN0b0NsYXNzKQ0KbGlicmFyeShjbHVzdGVyKQ0KbGlicmFyeShkZW5kZXh0ZW5kKQ0KbGlicmFyeShtYWdyaXR0cikNCmxpYnJhcnkoTmJDbHVzdCkNCmxpYnJhcnkoc3RhcmdhemVyKQ0KbGlicmFyeShtdm5vcm1hbFRlc3QpDQpsaWJyYXJ5KEZhY3RvTWluZVIpDQoNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCg0KDQoNCmNvbmp1bnRvX2RhdG9zX29yaWdpbmFsIDwtIHJlYWRfZXhjZWwoIkM6L1VzZXJzL1NlYmFzdGlhbiBWYWxlbmNpYS9EZXNrdG9wL0dlc3Rpb24gZGUgZGF0b3MvY29uanVudG9fZGF0b3Nfb3JpZ2luYWwueGxzeCIpDQoNCg0KdmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19vcmlnaW5hbCA8LSByZWFkX2V4Y2VsKCJDOi9Vc2Vycy9TZWJhc3RpYW4gVmFsZW5jaWEvRGVza3RvcC9HZXN0aW9uIGRlIGRhdG9zL3Zpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXMueGxzeCIpDQoNCnZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMIDwtIHJlYWRfZXhjZWwoIkM6L1VzZXJzL1NlYmFzdGlhbiBWYWxlbmNpYS9EZXNrdG9wL0dlc3Rpb24gZGUgZGF0b3MvdmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhcy54bHN4IikNCg0KdmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc192MiA8LSByZWFkX2V4Y2VsKCJDOi9Vc2Vycy9TZWJhc3RpYW4gVmFsZW5jaWEvRGVza3RvcC9HZXN0aW9uIGRlIGRhdG9zL3Zpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfdjIueGxzeCIpDQoNClNhdGlzZmFjY2lvbiA8LSByZWFkX2V4Y2VsKCJDOi9Vc2Vycy9TZWJhc3RpYW4gVmFsZW5jaWEvRGVza3RvcC9HZXN0aW9uIGRlIGRhdG9zL1NhdGlzZmFjY2lvbi54bHN4IikNCg0Kc2F0aXNmYWNjaW9uX3Byb21lZGlvIDwtIHJlYWRfZXhjZWwoIkM6L1VzZXJzL1NlYmFzdGlhbiBWYWxlbmNpYS9EZXNrdG9wL0dlc3Rpb24gZGUgZGF0b3Mvc2F0aXNmYWNjaW9uX3Byb21lZGlvLnhsc3giKQ0KDQoNCg0Kc2V0LnNlZWQoNzgwNzI5KQ0KdmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVExfbXVlc3RyZWFkbyA8LSB2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTFsgc2FtcGxlKDE6bnJvdyh2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCksIDE1MCksIC1jKDEsMyw0LDcsMTAsMTIsMTMsMTQpXQ0KDQoNCmBgYA0KDQojIyAqKkZhc2UgMSBbRGVzY3JpcGNpb25lcyBNdWx0aXZhcmlhYmxlc10qKg0KDQpFbiBsYSBwcmltZXJhIGV0YXBhIGRlbCBlc3R1ZGlvLCBzZSBsbGV2YXLDoW4gYSBjYWJvIGPDoWxjdWxvcywgdmlzdWFsaXphY2lvbmVzIHkgdW4gYW7DoWxpc2lzIGRldGFsbGFkbyBkZWwgY29uanVudG8gZGUgZGF0b3MgZW4gZWwgY29udGV4dG8gZGUgbGFzIG9wZXJhY2lvbmVzIGRlIGF0ZW5jacOzbiBtw6lkaWNhLiwgcXVlIHNlcsOhIGRlc2NyaXRvIGVuIGxhIFtzZWNjacOzbiAxLjJdKCNzZWMxLjIpLiBFc3RlIHByb2Nlc28gc2UgYWJvcmRhcsOhIGRlc2RlIHVuYSBwZXJzcGVjdGl2YSBkZSBlc3RhZMOtc3RpY2EgZGVzY3JpcHRpdmEgbXVsdGl2YXJpYW50ZSwgbG8gcXVlIHBlcm1pdGlyw6Egbm8gc29sbyB1bmEgdmlzacOzbiBnZW5lcmFsIGRlIGxvcyBkYXRvcywgc2lubyB0YW1iacOpbiB1biBhbsOhbGlzaXMgbcOhcyBlbnJpcXVlY2lkbyBkZSBsYXMgcmVsYWNpb25lcyBlbnRyZSBsYXMgZGlmZXJlbnRlcyB2YXJpYWJsZXMgaW52b2x1Y3JhZGFzLg0KDQojIyMgMS4xLiBPYmpldGl2b3MgDQoNCkVsIG9iamV0aXZvIGRlIGVzdGUgcHJveWVjdG8gZXMgYXBsaWNhciB0w6ljbmljYXMgZGUgYW7DoWxpc2lzIG11bHRpdmFyaWFkbyBwYXJhIGdlc3Rpb25hciBlbCBjb25qdW50byBkZSBkYXRvcyBhcHJvYmFkbyBFUiBXYWl0IFRpbWUsIGNvcnJlc3BvbmRpZW50ZXMgYSB1bmEgc2ltdWxhY2nDs24gcmVhbGlzdGEgZGUgbGFzIHZpc2l0YXMgZGUgcGFjaWVudGVzIGRlIGxhcyBzYWxhcyBkZSB1cmdlbmNpYXMsIGVsIHByb3Bvc2l0byBlcyBvcmdhbml6YXIgeSBwcm9jZXNhciBlZmljYXptZW50ZSBsYSBpbmZvcm1hY2nDs24sIGRlc2Fycm9sbGFuZG8gaGFiaWxpZGFkZXMgZW4gbGEgZ2VzdGnDs24geSBhbsOhbGlzaXMgZGUgZGF0b3MuDQoNCjxhIG5hbWU9InNlYzEuMiI+PC9hPg0KDQojIyMgMS4yLiBEZXNjcmlwY2nDs24gZGUgbG9zIGRhdG9zIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNCkVsIGNvbmp1bnRvIGRlIGRhdG9zIGZ1ZSBvYnRlbmlkbyBlbiBzdSB0b3RhbGlkYWQgZGUgKipLYWdnbGUqKjogKGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vZGF0YXNldHMvcml2YWx5dGljcy9lci13YWl0LXRpbWUpLiBLYWdnbGUgZXMgdW5hIHBsYXRhZm9ybWEgZW4gbMOtbmVhIGRlIGNpZW5jaWEgZGUgZGF0b3MgeSBhcHJlbmRpemFqZSBhdXRvbcOhdGljbywgcHJvcGllZGFkIGRlIEdvb2dsZSBMTEMuIEVzdGEgZmFjaWxpdGEgbGEgcGFydGljaXBhY2nDs24gZW4gY29tcGV0ZW5jaWFzIGRvbmRlIGxhcyBlbXByZXNhcyBwdWJsaWNhbiBjb25qdW50b3MgZGUgZGF0b3MgeSBwcm9ibGVtYXMsIHBlcm1pdGllbmRvIGEgbG9zIHVzdWFyaW9zIGRlc2Fycm9sbGFyIG1vZGVsb3MgcHJlZGljdGl2b3MgeSBjb21wZXRpci4gTGEgcGxhdGFmb3JtYSB0YW1iacOpbiBvZnJlY2Ugbm90ZWJvb2tzIHBhcmEgY29tcGFydGlyIHkgY29sYWJvcmFyIGVuIHByb3llY3RvcyB1dGlsaXphbmRvIFB5dGhvbiB5IFIsIGFzw60gY29tbyB1bmEgYW1wbGlhIGNvbGVjY2nDs24gZGUgY29uanVudG9zIGRlIGRhdG9zIGRlIGFjY2VzbyBww7pibGljby4gQWRlbcOhcywgS2FnZ2xlIExlYXJuLCB1bmEgc2VjY2nDs24gZGUgbGEgcGxhdGFmb3JtYSBkZWRpY2FkYSBhIGxhIGVkdWNhY2nDs24geSBlbCBhcHJlbmRpemFqZSBlbiBjaWVuY2lhIGRlIGRhdG9zIHkgYXByZW5kaXphamUgYXV0b23DoXRpY28sIHByb3BvcmNpb25hIHR1dG9yaWFsZXMgeSBjdXJzb3MgaW50ZXJhY3Rpdm9zIGVuIHRlbWFzIGNvbW8gUHl0aG9uLCBTUUwsIHZpc3VhbGl6YWNpw7NuIGRlIGRhdG9zIHkgYXByZW5kaXphamUgYXV0b23DoXRpY28sIGRpcmlnaWRvcyBhIHByaW5jaXBpYW50ZXMgeSB1c3VhcmlvcyBhdmFuemFkb3MuDQoNCkVsIGNvbmp1bnRvIGRlIGRhdG9zICoqVGllbXBvIGRlIGVzcGVyYSBlbiB1cmdlbmNpYXMqKiwgcXVlIHNpbXVsYSBsYXMgdmlzaXRhcyBkZSBwYWNpZW50ZXMgZW4gc2FsYXMgZGUgdXJnZW5jaWFzLCBzZSByZWxhY2lvbmEgbWVkaWFudGUgbGEgYXBsaWNhY2nDs24gZGUgw6FyZWFzIGZ1bmRhbWVudGFsZXMgZGUgbGEgSW5nZW5pZXLDrWEgSW5kdXN0cmlhbDogKipEaXNlw7FvIHkgTWVkaWNpb24gZGVsIFRyYWJham8qKihXb3JrIERlc2luZyAmIE1lYXN1cmVtZW50LCBhcmVhIDEpIGRvbmRlIGFuYWxpemEgbG9zIHRpZW1wb3MgeSBtw6l0b2RvcyBkZSBhdGVuY2nDs24gcGFyYSBvcHRpbWl6YXIgdGFyZWFzLCByZWR1Y2lyIHRpZW1wb3MgZGUgZXNwZXJhIHkgZXF1aWxpYnJhciBsYSBjYXJnYSBsYWJvcmFsIGRlbCBwZXJzb25hbCwgbHVlZ28gZW4gZWwgYXJlYSBkZSAgKipJbnZlc3RpZ2FjacOzbiB5IEFuw6FsaXNpcyBkZSBPcGVyYWNpb25lcyoqKE9wZXJhdGlvbnMgUmVzZWFyY2ggJiBBbmFseXNpcywgYXJlYSAyKSBxdWUgY29uc3RydXllIG1vZGVsb3MgbWF0ZW3DoXRpY29zIGEgcGFydGlyIGRlIGxvcyBkYXRvcyBwYXJhIG1lam9yYXIgZWwgZmx1am8gZGUgcGFjaWVudGVzIHkgbGEgc2VjdWVuY2lhIGRlIGF0ZW5jacOzbiwgZmluYWxtZW50ZSBwYXJhIGdhcmFudGl6YXIgbGEgbWVqb3JhIGNvbnRpbnVhLCBlbiBlbCBhcmVhICoqSW5nZW5pZXLDrWEgZGUgQ2FsaWRhZCB5IENvbmZpYWJpbGlkYWQqKihGYWNpbGl0aWVzIEVuZ2lubmVlcmluZyAmIEVuZXJneSBNYW5hZ2VtZW50LCBhcmVhIDQpIHV0aWxpemFuIGxvcyBkYXRvcyBwYXJhIG1vbml0b3JlYXIgcXVlIGVsIHNlcnZpY2lvIGN1bXBsYSBjb24gbG9zIGVzdMOhbmRhcmVzIGRlZmluaWRvcy4NCg0KQ29uc3RhIGRlIDE0IGNhbXBvcyB5IDUwMDEgcmVnaXN0cm9zIHF1ZSByZWZsZWphbiBpbmZvcm1hY2nDs24gZGUgZXN0dWRpb3Mgc29icmUgdGllbXBvcyBkZSBlc3BlcmEgZW4gdXJnZW5jaWFzLCByZXN1bHRhZG9zIGRlIGxvcyBwYWNpZW50ZXMgeSBtw6l0cmljYXMgZGUgc2F0aXNmYWNjacOzbiwgaW5jb3Jwb3JhbmRvIGZhY3RvcmVzIGNsYXZlIGNvbW8gbG9zIG5pdmVsZXMgZGUgdXJnZW5jaWEsIGxhcyB0ZW5kZW5jaWFzIGVzdGFjaW9uYWxlcyB5IGxhIHZhcmlhYmlsaWRhZCBob3JhcmlhLiBMYSBsaXN0YSBzaWd1aWVudGUgbG9zIGRlc2NyaWJlIGVuIGVsIG1pc21vIG9yZGVuLCBkZSBpenF1aWVyZGEgYSBkZXJlY2hhLCBjb21vIGFwYXJlY2VuIGVuIGVsIHJhbmdvIGRlIGRhdG9zIHF1ZSBsb3MgY29udGllbmUgeSBzZSBlc3RhYmxlY2UgcGFyYSBjYWRhIGNhbXBvIGVsIHRpcG8gZGUgdmFyaWFibGUgeSBzdSBlc2NhbGEgZGUgbWVkaWNpw7NuIGNvbiBiYXNlIGVuIGxhIG5vbWVuY2xhdHVyYSAodGlwb19kZV92YXJpYWJsZTo6ZXNjYWxhX2RlX21lZGljacOzbltvcmRlbmFtaWVudG9dKToNCg0KLSAqKm5vbWJyZV9ob3NwaXRhbCoqIChjdWFsaXRhdGl2YTo6bm9taW5hbCk6IExhIHZhcmlhYmxlIGFzaWduYSB1biBjw7NkaWdvIMO6bmljbyBhIGNhZGEgcGFjaWVudGUuIEVzdGUgY8OzZGlnbyBlcyBlc3RyaWN0YW1lbnRlIG51bcOpcmljbyB5IHBlcm1pdGUgbGxldmFyIHVuIHJlZ2lzdHJvIGRlIGxvcyBkYXRvcyBkZSBpbmdyZXNvIGRlbCBwYWNpZW50ZSBwYXJhIGlkZW50aWZpY2FyIGEgcXVlIGhvc3BpdGFsIGZ1ZSBpbmdyZXNhZG8geSBhc2kgcmVnaXN0cmFybG8gZW4gZWwgc2lzdGVtYS4gTG9zIHZhbG9yZXMgYXNpZ25hZG9zIHkgc3UgaW50ZXJwcmV0YWNpb24gc29uOg0KDQotIDA6IE5vcnRoc2lkZSBDb21tdW5pdHkgSG9zcGl0YWwNCg0KLSAxOiBSaXZlcnNpZGUgTWVkaWNhbCBDZW50ZXINCg0KLSAyOiBTcHJpbmdmaWVsZCBHZW5lcmFsIEhvc3BpdGFsDQoNCi0gMzogU3QuIE1hcnnigJlzIFJlZ2lvbmFsIEhlYWx0aA0KDQotIDQ6IFN1bW1pdCBIZWFsdGggQ2VudGVyDQoNCi0gKip6b25hKiogKGN1YWxpdGF0aXZhOjpub21pbmFsKTogRXN0YSB2YXJpYWJsZSBhc2lnbmEgdW4gY29kaWdvIHBhcmEgcmVwcmVzZW50YXIgZWwgbHVnYXIgcHJvdmllbnRlIGRlbCBwYWNpZW50ZSBpbmdyZXNhZG8gYWwgaG9zcGl0YWwuIExvcyB2YWxvcmVzIGFzaWduYWRvcyB5IHN1IGludGVycHJldGFjaW9uIHNvbjoNCg0KLSAwOiBSdXJhbA0KDQotIDE6IFVyYmFubw0KDQotICoqZGlhX3NlbWFuYSoqIChjdWFsaXRhdGl2YTo6b3JkaW5hbCk6IFJlcHJlc2VudGEgZWwgZGlhIGRlIGxhIHNlbWFuYSBxdWUgZnVlIGluZ3Jlc2FkbyBlbCBwYWNpZW50ZSBhbCBob3NwaXRhbC4gTG9zIHZhbG9yZXMgYXNpZ25hZG9zIHkgc3UgaW50ZXJwcmV0YWNpb24gc29uOg0KDQotIDA6IEx1bmVzDQoNCi0gMTogTWFydGVzDQoNCi0gMjogTWllcmNvbGVzDQoNCi0gMzogSnVldmVzIA0KDQotIDQ6IFZpZXJuZXMNCg0KLSA1OiBTYWJhZG8NCg0KLSA2OiBEb21pbmdvDQoNCi0gKip0aWVtcG9fZGlhKiogKGN1YWxpdGF0aXZhOjpvcmRpbmFsKTogRXN0YSB2YXJpYWJsZSBpbmRpY2EgZWwgdGllbXBvIGRlbCBkaWEgZWwgY3VhbCBlbCBwYWNpZW50ZSBsbGVnYSBhbCBob3NwaXRhbC4gTG9zIHZhbG9yZXMgYXNpZ25hZG9zIHkgc3UgaW50ZXJwcmV0YWNpb24gc29uOg0KDQotIDA6IE1hZHJ1Z2FkYQ0KDQotIDE6IE1lZGlvIERpYQ0KDQotIDI6IFRhcmRlDQoNCi0gMzogTm9jaGUNCg0KLSAqKm5pdmVsX3VyZ2VuY2lhKiogKGN1YWxpdGF0aXZhOjpvcmRpbmFsKTogUmVwcmVzZW50YSBlbCB0aXBvIGRlIHVyZ2VuY2lhIGRlbCBwYWNpZW50ZSBpbmdyZXNhZG8gYWwgaG9zcGl0YWwuIExvcyB2YWxvcmVzIGFzaWduYWRvcyB5IHN1IGludGVycHJldGFjaW9uIHNvbjoNCg0KLSAwOiBCYWpvDQoNCi0gMTogTWVkaW8NCg0KLSAyOiBBbHRvDQoNCi0gMzogQ3JpdGljbw0KDQotICoqcmVsYWNpb25fZW5mZXJtZXJvX3BhY2llbnRlKiogKGN1YW50aXRhdGl2YTo6cmF6b24pOiBFc3RhIHZhcmlhYmxlIG5vcyBpbmRpY2EgY3VhbnRvcyBlbmZlcm1lcm9zIGhheSBkaXNwb25pYmxlcyBlbiBlbCBtb21lbnRvIHF1ZSBpbmdyZXNhIGVsIHBhY2llbnRlIGFsIGhvc3BpdGFsLg0KDQotICoqZXNwZWNpYWxpc3RhX2Rpc3BvbmlibGUqKiAoY3VhbnRpdGF0aXZhOjpyYXpvbik6IEVzIGxhIHZhcmlhYmxlIHF1ZSBpbmRpY2EgbGEgZGlzcG9uaWJpbGlkYWQgZGUgZXNwZWNpYWxpc3RhcyBwb3IgcGFjaWVudGUgaW5ncmVzYWRvIGVuIGVsIGhvc3BpdGFsLg0KDQotICoqdGFtYcOxb19pbnN0YWxhY2lvbl9jYW1hcyoqIChjdWFudGl0YXRpdmE6OnJhem9uKTogUmVwcmVzZW50YSBsYSBkaXNwb25pYmlsaWRhZCBkZSBjYW1pbGxhcyBxdWUgaGF5IGVuIGVsIG1vbWVudG8gcXVlIGVsIHBhY2llbnRlIGluZ3Jlc2EgYWwgaG9zcGl0YWwuDQoNCi0gKip0aWVtcG9fcmVnaXN0cm8qKiAoY3VhbnRpdGF0aXZhOjpyYXpvbik6IEVzdGEgdmFyaWFibGUgaW5kaWNhIGVsIHRpZW1wbyBlbiBxdWUgZWwgcGFjaWVudGUgZnVlIHJlZ2lzdHJhZG8gZW4gZWwgaG9zcGl0YWwuIEVzdG8gZXZhbHVhZG8gZW4gbWludXRvcy4NCg0KLSAqKnRpZW1wb190cmlhZ2UqKiAoY3VhbnRpdGF0aXZhOjpyYXpvbik6IEVzIGxhIHZhcmlhYmxlIHF1ZSBpbmlkaWNhIGVsIHRpZW1wbyBwb3IgZWwgY3VhbCBlbCBwYWNpZW50ZSBzZSBkZW1vcmEgZW4gc2VyIGF0ZW5kaWRvIGVuIGVsIHRyaWFnZS4gRWwgdHJpYWdlIGVzIHVuIHNpc3RlbWEgZGUgY2xhc2lmaWNhY2nDs24gZGUgcGFjaWVudGVzIGVuIHNlcnZpY2lvcyBkZSB1cmdlbmNpYXMgcXVlIGV2YWzDumEgbGEgZ3JhdmVkYWQgZGUgc3UgZXN0YWRvIHkgbGEgbmVjZXNpZGFkIGRlIGF0ZW5jacOzbiBtw6lkaWNhLiBFc3RvIGV2YWx1YWRvIGVuIG1pbnV0b3MuDQoNCi0gKip0aWVtcG9fYXRlbmNpb25fcHJvZmVzaW9uYWxfbWVkaWNvKiogKGN1YW50aXRhdGl2bzo6cmF6b24pOiBSZXByZXNlbnRhIGVsIHRpZW1wbyBwb3IgZWwgY3VhbCBlbCBwYWNpZW50ZSBlcyBhdGVuZGlkbyBwb3IgdW4gcHJvZmVzaW9uYWwgbWVkaWNvIChtZWRpY28gZ2VuZXJhbCwgcGVkaWF0cmEsIG5ldXJvbG9nbywgY2FyZGlvbG9nbywgZXRjLikuIEVzdG8gZXZhbHVhZG8gZW4gbWludXRvcy4NCg0KLSAqKnRvdGFsX3RpZW1wb19lc3BlcmEqKiAoY3VhbnRpdGF0aXZhOjpyYXpvbik6IEVzdGEgdmFyaWFibGUgcmVwcmVzZW50YSBlbCB0aWVtcG8gdG90YWwgZGUgZXNwZXJhIGRlbCBwYWNpZW50ZSBkZXNkZSBxdWUgZW50cmEsIGhhc3RhIHNlciBldmFsdWFkbyBvIGF0ZW5kaWRvIGVuIGVsIGhvc3BpdGFsLiBFc3RvIGV2YWx1YWRvIGVuIG1pbnV0b3MuDQoNCi0gKipyZXN1bHRhZG9fcGFjaWVudGUqKiAoY3VhbGl0YXRpdmE6Om5vbWluYWwpOiBFcyBsYSB2YXJpYWJsZSBxdWUgaW5kaWNhIGVsIHJlc3VsdGFkbyBkZSBsYSB2YWxvcmFjaW9uIGZpbmFsIGRlbCBwYWNpZW50ZS4gTG9zIHZhbG9yZXMgYXNpZ25hZG9zIHkgc3UgaW50ZXJwcmV0YWNpb24gc29uOg0KDQotIDA6IEFkbWl0aWRvDQoNCi0gMTogRGFkbyBkZSBhbHRhDQoNCi0gMjogU2UgbWFyY2hvIHNpbiBzZXIgYXRlbmRpZG8NCg0KLSAqKnNhdGlzZmFjY2lvbl9wYWNpZW50ZSoqIChjdWFsaXRhdGl2YTo6b3JkaW5hbCk6IEVzdGEgdmFyaWFibGUgcmVwcmVzZW50YSBsYSBjYWxpZmljYWNpb24gZGUgc2F0aXNmYWNjaW9uIHF1ZSB0dXZvIGVsIHBhY2llbnRlIGVuIGVsIGhvc3BpdGFsLiBMb3MgdmFsb3JlcyBhc2lnbmFkb3MgeSBzdSBpbnRlcnByZXRhY2lvbiBzb246DQoNCi0gMTogTXV5IGluc2F0aXNmZWNobw0KDQotIDI6IEluc2F0aXNmZWNobw0KDQotIDM6IE5ldXRyYWwNCg0KLSA0OiBTYXRpc2ZlY2hvDQoNCi0gNTogTXV5IHNhdGlzZmVjaG8NCg0KIyMjIyBFc3RydWN0dXJhIGRlbCBDb25qdW50byBkZSBEYXRvcyBPcmlnaW5hbC4gDQoNCkEgcGFydGlyIGRlIGxhIGVzdHJ1Y3R1cmEgZGVsIGNvbmp1bnRvIGRlIGRhdG9zIG9yaWdpbmFsLCBzZSBvYnNlcnZhIHF1ZSBsYSBiYXNlIGVzdMOhIGNvbmZvcm1hZGEgcG9yIDUuMDAwIHJlZ2lzdHJvcyB5IDE0IHZhcmlhYmxlcywgbG8gcXVlIGV2aWRlbmNpYSB1biB2b2x1bWVuIGRlIGluZm9ybWFjacOzbiByb2J1c3RvIHkgYWRlY3VhZG8gcGFyYSByZWFsaXphciBhbsOhbGlzaXMgZXN0YWTDrXN0aWNvcyB5IG1vZGVsYWNpb25lcyByZWxhY2lvbmFkYXMgY29uIGxhIGF0ZW5jacOzbiBlbiBzYWxhcyBkZSB1cmdlbmNpYXMuIEVsIGNvbmp1bnRvIGludGVncmEgdGFudG8gdmFyaWFibGVzIGN1YWxpdGF0aXZhcyBjb21vIGN1YW50aXRhdGl2YXMsIHBlcm1pdGllbmRvIHVuIGFib3JkYWplIGludGVncmFsIGRlbCBmZW7Ds21lbm8gZXN0dWRpYWRvLiBFbnRyZSBsYXMgdmFyaWFibGVzIGNhdGVnw7NyaWNhcyBzZSBpbmNsdXllbiBlbCBub21icmUgZGVsIGhvc3BpdGFsLCBsYSB6b25hICh1cmJhbmEgbyBydXJhbCksIGVsIGTDrWEgZGUgbGEgc2VtYW5hLCBsYSB0ZW1wb3JhZGEsIGVsIG5pdmVsIGRlIHVyZ2VuY2lhIHkgZWwgcmVzdWx0YWRvIGRlbCBwYWNpZW50ZSwgbGFzIGN1YWxlcyBhcG9ydGFuIGNvbnRleHRvIGluc3RpdHVjaW9uYWwsIHRlbXBvcmFsIHkgY2zDrW5pY28uIFBvciBzdSBwYXJ0ZSwgbGFzIHZhcmlhYmxlcyBudW3DqXJpY2FzIHJlY29nZW4gaW5mb3JtYWNpw7NuIGNsYXZlIHNvYnJlIGxhIGNhcGFjaWRhZCBpbnN0YWxhZGEgeSBlbCBkZXNlbXBlw7FvIGRlbCBzZXJ2aWNpbywgdGFsZXMgY29tbyBsYSByZWxhY2nDs24gZW5mZXJtZXJh4oCTcGFjaWVudGUsIGVsIG7Dum1lcm8gZGUgZXNwZWNpYWxpc3RhcyBkaXNwb25pYmxlcywgZWwgdGFtYcOxbyBkZSBsYSBpbnN0YWxhY2nDs24gZW4gY2FtYXMgeSBsb3MgZGlmZXJlbnRlcyB0aWVtcG9zIGRlbCBwcm9jZXNvIGRlIGF0ZW5jacOzbiAocmVnaXN0cm8sIHRyaWFnZSwgYXRlbmNpw7NuIG3DqWRpY2EgeSB0aWVtcG8gdG90YWwgZGUgZXNwZXJhKS4gQWRpY2lvbmFsbWVudGUsIGxhIHZhcmlhYmxlIGRlIHNhdGlzZmFjY2nDs24gZGVsIHBhY2llbnRlIHBlcm1pdGUgZXZhbHVhciBsYSBwZXJjZXBjacOzbiBkZWwgdXN1YXJpbyBmcmVudGUgYWwgc2VydmljaW8gcmVjaWJpZG8uIEVuIGNvbmp1bnRvLCBlc3RhIGVzdHJ1Y3R1cmEgZGUgZGF0b3MgZmFjaWxpdGEgZWwgYW7DoWxpc2lzIGRlIGxhIGVmaWNpZW5jaWEgb3BlcmF0aXZhLCBsYSBjYWxpZGFkIGRlIGxhIGF0ZW5jacOzbiB5IGxhIGV4cGVyaWVuY2lhIGRlbCBwYWNpZW50ZSBlbiBsb3Mgc2VydmljaW9zIGRlIHVyZ2VuY2lhcywgY29uc3RpdHV5w6luZG9zZSBlbiB1bmEgYmFzZSBzw7NsaWRhIHBhcmEgbGEgdG9tYSBkZSBkZWNpc2lvbmVzIHkgbGEgZm9ybXVsYWNpw7NuIGRlIGVzdHJhdGVnaWFzIGRlIG1lam9yYSBlbiBlbCBzaXN0ZW1hIGRlIHNhbHVkLg0KYGBge3IgRXN0cnVjdHVyYV9kZWxfQ29uanVudG9fZGVfRGF0b3NfT3JpZ2luYWwsIGZpZy5hbGlnbj0nY2VudGVyJ30NCnN0cihjb25qdW50b19kYXRvc19vcmlnaW5hbCkNCmBgYA0KDQoNCiMjIyMgVmlzdWFsaXphY2lvbiBkZWwgQ29uanVudG8gZGUgRGF0b3MuDQoNCkEgcGFydGlyIGRlIGxhIGVzdHJ1Y3R1cmEgZGVsIGNvbmp1bnRvIGRlIGRhdG9zIG9yaWdpbmFsLCBzZSBvYnNlcnZhIHF1ZSBsYSBiYXNlIGVzdMOhIGNvbmZvcm1hZGEgcG9yIDUuMDAwIHJlZ2lzdHJvcyB5IDE0IHZhcmlhYmxlcywgbG8gcXVlIGV2aWRlbmNpYSB1biB2b2x1bWVuIGRlIGluZm9ybWFjacOzbiByb2J1c3RvIHkgYWRlY3VhZG8gcGFyYSByZWFsaXphciBhbsOhbGlzaXMgZXN0YWTDrXN0aWNvcyB5IG1vZGVsYWNpb25lcyByZWxhY2lvbmFkYXMgY29uIGxhIGF0ZW5jacOzbiBlbiBzYWxhcyBkZSB1cmdlbmNpYXMuIEVsIGNvbmp1bnRvIGludGVncmEgdGFudG8gdmFyaWFibGVzIGN1YWxpdGF0aXZhcyBjb21vIGN1YW50aXRhdGl2YXMsIHBlcm1pdGllbmRvIHVuIGFib3JkYWplIGludGVncmFsIGRlbCBmZW7Ds21lbm8gZXN0dWRpYWRvLiBFbnRyZSBsYXMgdmFyaWFibGVzIGNhdGVnw7NyaWNhcyBzZSBpbmNsdXllbiBlbCBub21icmUgZGVsIGhvc3BpdGFsLCBsYSB6b25hICh1cmJhbmEgbyBydXJhbCksIGVsIGTDrWEgZGUgbGEgc2VtYW5hLCBsYSB0ZW1wb3JhZGEsIGVsIG5pdmVsIGRlIHVyZ2VuY2lhIHkgZWwgcmVzdWx0YWRvIGRlbCBwYWNpZW50ZSwgbGFzIGN1YWxlcyBhcG9ydGFuIGNvbnRleHRvIGluc3RpdHVjaW9uYWwsIHRlbXBvcmFsIHkgY2zDrW5pY28uIFBvciBzdSBwYXJ0ZSwgbGFzIHZhcmlhYmxlcyBudW3DqXJpY2FzIHJlY29nZW4gaW5mb3JtYWNpw7NuIGNsYXZlIHNvYnJlIGxhIGNhcGFjaWRhZCBpbnN0YWxhZGEgeSBlbCBkZXNlbXBlw7FvIGRlbCBzZXJ2aWNpbywgdGFsZXMgY29tbyBsYSByZWxhY2nDs24gZW5mZXJtZXJh4oCTcGFjaWVudGUsIGVsIG7Dum1lcm8gZGUgZXNwZWNpYWxpc3RhcyBkaXNwb25pYmxlcywgZWwgdGFtYcOxbyBkZSBsYSBpbnN0YWxhY2nDs24gZW4gY2FtYXMgeSBsb3MgZGlmZXJlbnRlcyB0aWVtcG9zIGRlbCBwcm9jZXNvIGRlIGF0ZW5jacOzbiAocmVnaXN0cm8sIHRyaWFnZSwgYXRlbmNpw7NuIG3DqWRpY2EgeSB0aWVtcG8gdG90YWwgZGUgZXNwZXJhKS4gQWRpY2lvbmFsbWVudGUsIGxhIHZhcmlhYmxlIGRlIHNhdGlzZmFjY2nDs24gZGVsIHBhY2llbnRlIHBlcm1pdGUgZXZhbHVhciBsYSBwZXJjZXBjacOzbiBkZWwgdXN1YXJpbyBmcmVudGUgYWwgc2VydmljaW8gcmVjaWJpZG8uIEVuIGNvbmp1bnRvLCBlc3RhIGVzdHJ1Y3R1cmEgZGUgZGF0b3MgZmFjaWxpdGEgZWwgYW7DoWxpc2lzIGRlIGxhIGVmaWNpZW5jaWEgb3BlcmF0aXZhLCBsYSBjYWxpZGFkIGRlIGxhIGF0ZW5jacOzbiB5IGxhIGV4cGVyaWVuY2lhIGRlbCBwYWNpZW50ZSBlbiBsb3Mgc2VydmljaW9zIGRlIHVyZ2VuY2lhcywgY29uc3RpdHV5w6luZG9zZSBlbiB1bmEgYmFzZSBzw7NsaWRhIHBhcmEgbGEgdG9tYSBkZSBkZWNpc2lvbmVzIHkgbGEgZm9ybXVsYWNpw7NuIGRlIGVzdHJhdGVnaWFzIGRlIG1lam9yYSBlbiBlbCBzaXN0ZW1hIGRlIHNhbHVkLg0KDQpgYGB7ciBWaXN1YWxpemFjaW9uX2RlbF9Db25qdW50b19kZV9EYXRvcywgZmlnLmFsaWduPSdjZW50ZXInfQ0Kc3RyKHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMKQ0KDQpgYGANCg0KIyMjIDEuMy4gRXN0aW1hY2lvbmVzIE11bHRpdmFyaWFkYSB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQpFbCAqKnZlY3RvciBkZSBtZWRpYXMqKiB5IGxhICoqbWF0cml6IGRlIHZhcmlhbnphcy1jb3ZhcmlhbnphcyoqIGNvbmZvcm1hbiB1biBjb25qdW50byBkZSBoZXJyYW1pZW50YXMgZnVuZGFtZW50YWxlcyBwYXJhIGRlc2NyaWJpciBlbCBjb21wb3J0YW1pZW50byBwb3NpY2lvbmFsLCBkaXNwZXJzaXZvIHkgY29ycmVsYWNpb25hbCBkZSBsYXMgdmFyaWFibGVzIGFsZWF0b3JpYXMgZW4gdW4gY29uanVudG8gZGUgZGF0b3MuIEVzdGFzIG1lZGlkYXMgc29uIGVzZW5jaWFsZXMgZW4gZWwgYW7DoWxpc2lzIG11bHRpdmFyaWFkbywgeWEgcXVlIHBlcm1pdGVuIGNhcHR1cmFyIHRhbnRvIGxhIHRlbmRlbmNpYSBjZW50cmFsIGNvbW8gbGFzIGludGVyZGVwZW5kZW5jaWFzIGVudHJlIGxhcyB2YXJpYWJsZXMuDQoNCkVsIHZlY3RvciBkZSBtZWRpYXMgcmVmbGVqYSBlbCB2YWxvciBlc3BlcmFkbyBvIHB1bnRvIG1lZGlvIGRlIGNhZGEgdmFyaWFibGUsIHNpbnRldGl6YW5kbyBsYSBpbmZvcm1hY2nDs24gZGUgdG9kb3MgbG9zIHJlZ2lzdHJvcyBkaXNwb25pYmxlcyBlbiBlbCBjb25qdW50byBkZSBkYXRvcy4gUG9yIHN1IHBhcnRlLCBsYSBtYXRyaXogZGUgdmFyaWFuemFzLWNvdmFyaWFuemFzIGRlc2NyaWJlIGxhIHZhcmlhYmlsaWRhZCB5IGxhcyByZWxhY2lvbmVzIGVudHJlIGxhcyB2YXJpYWJsZXMuIEVuIHN1IGRpYWdvbmFsIHByaW5jaXBhbCwgZXN0aW1hIGxhcyBkaXNwZXJzaW9uZXMgaW5kaXZpZHVhbGVzIGRlIGNhZGEgdmFyaWFibGUgcmVzcGVjdG8gYSBzdSBtZWRpYSwgbWllbnRyYXMgcXVlIGxvcyBlbGVtZW50b3MgcG9yIGVuY2ltYSBvIHBvciBkZWJham8gZGUgZXN0YSBkaWFnb25hbCByZXByZXNlbnRhbiBsYXMgY292YXJpYW56YXMgZW50cmUgcGFyZXMgZGUgdmFyaWFibGVzLCBtb3N0cmFuZG8gbGFzIHJlbGFjaW9uZXMgbGluZWFsZXMgZXhpc3RlbnRlcyBlbnRyZSBlbGxhcy4NCg0KIyMjIyBWZWN0b3IgZGUgTWVkaWFzIHkgQm94cGxvdHMuDQoNCkEgcGFydGlyIGRlbCB2ZWN0b3IgZGUgbWVkaWFzIHkgZWwgYW7DoWxpc2lzIGdyw6FmaWNvIG1lZGlhbnRlIGJveHBsb3RzLCBzZSBvYnRpZW5lbiByZXN1bHRhZG9zIHJlbGV2YW50ZXMgc29icmUgZWwgY29tcG9ydGFtaWVudG8gcHJvbWVkaW8geSBsYSBkaXNwZXJzacOzbiBkZSBsYXMgcHJpbmNpcGFsZXMgdmFyaWFibGVzIG9wZXJhdGl2YXMgZGVsIHNlcnZpY2lvIGRlIHVyZ2VuY2lhcy4gRW4gdMOpcm1pbm9zIGRlIHJlY3Vyc29zLCBsYSByZWxhY2nDs24gcHJvbWVkaW8gZW5mZXJtZXJh4oCTcGFjaWVudGUgc2Ugc2l0w7phIGVuIDMsMjQsIGxvIHF1ZSBzdWdpZXJlIHVuYSBjYXJnYSBhc2lzdGVuY2lhbCBtb2RlcmFkYSBwYXJhIGVsIHBlcnNvbmFsIGRlIGVuZmVybWVyw61hLCBtaWVudHJhcyBxdWUgZWwgcHJvbWVkaW8gZGUgZXNwZWNpYWxpc3RhcyBkaXNwb25pYmxlcyBlcyBkZSAzLDg4LCBldmlkZW5jaWFuZG8gdW5hIGRpc3BvbmliaWxpZGFkIHJlbGF0aXZhbWVudGUgZXN0YWJsZSBkZSBwcm9mZXNpb25hbGVzIG3DqWRpY29zLg0KDQpFbCB0YW1hw7FvIHByb21lZGlvIGRlIGxhcyBpbnN0YWxhY2lvbmVzLCBjZXJjYW5vIGEgODcgY2FtYXMsIHJlZmxlamEgdW5hIGNhcGFjaWRhZCBob3NwaXRhbGFyaWEgY29uc2lkZXJhYmxlLCBhdW5xdWUgbG9zIGJveHBsb3RzIG11ZXN0cmFuIHVuYSB2YXJpYWJpbGlkYWQgaW1wb3J0YW50ZSBlbnRyZSBpbnN0aXR1Y2lvbmVzLCBsbyBxdWUgaW5kaWNhIGRpZmVyZW5jaWFzIGVzdHJ1Y3R1cmFsZXMgc2lnbmlmaWNhdGl2YXMuDQpFbiByZWxhY2nDs24gY29uIGxvcyB0aWVtcG9zIGRlbCBwcm9jZXNvIGRlIGF0ZW5jacOzbiwgZWwgdGllbXBvIHByb21lZGlvIGRlIHJlZ2lzdHJvIGVzIGRlIGFwcm94aW1hZGFtZW50ZSAxMSw3IG1pbnV0b3MgeSBlbCB0aWVtcG8gZGUgdHJpYWdlIGFsY2FuemEgZW4gcHJvbWVkaW8gMjQsOCBtaW51dG9zLCB2YWxvcmVzIHF1ZSwgYXVucXVlIHJhem9uYWJsZXMsIHByZXNlbnRhbiBkaXNwZXJzacOzbiB5IHByZXNlbmNpYSBkZSB2YWxvcmVzIGF0w61waWNvcywgbG8gcXVlIHN1Z2llcmUgcG9zaWJsZXMgY3VlbGxvcyBkZSBib3RlbGxhIGVuIGRldGVybWluYWRvcyBwZXJpb2RvcyBvIGNlbnRyb3MgaG9zcGl0YWxhcmlvcy4gRWwgdGllbXBvIHByb21lZGlvIGRlIGF0ZW5jacOzbiBtw6lkaWNhIHByb2Zlc2lvbmFsIHNlIHViaWNhIGVuIDQ1LDQgbWludXRvcywgc2llbmRvIHVubyBkZSBsb3MgY29tcG9uZW50ZXMgbcOhcyByZWxldmFudGVzIGRlbCBwcm9jZXNvIGFzaXN0ZW5jaWFsLiBDb21vIHJlc3VsdGFkbyBkZSBsYSBhY3VtdWxhY2nDs24gZGUgZXN0YXMgZXRhcGFzLCBlbCB0aWVtcG8gdG90YWwgcHJvbWVkaW8gZGUgZXNwZXJhIGFzY2llbmRlIGEgODEsOSBtaW51dG9zLCBjb24gdW5hIGFtcGxpYSB2YXJpYWJpbGlkYWQgb2JzZXJ2YWRhIGVuIGxvcyBib3hwbG90cywgbG8gcXVlIGV2aWRlbmNpYSBkZXNpZ3VhbGRhZGVzIGVuIGxhIGVmaWNpZW5jaWEgb3BlcmF0aXZhIGRlbCBzZXJ2aWNpbyBkZSB1cmdlbmNpYXMuDQoNCkZpbmFsbWVudGUsIGxhIHNhdGlzZmFjY2nDs24gcHJvbWVkaW8gZGVsIHBhY2llbnRlLCBjb24gdW4gdmFsb3IgZGUgMiw3NyBlbiBsYSBlc2NhbGEgdXRpbGl6YWRhLCBpbmRpY2EgdW4gbml2ZWwgZGUgc2F0aXNmYWNjacOzbiBtb2RlcmFkbywgY29oZXJlbnRlIGNvbiBsb3MgdGllbXBvcyBkZSBlc3BlcmEgb2JzZXJ2YWRvcy4gTGEgZGlzcGVyc2nDs24gcmVmbGVqYWRhIGVuIGVsIGRpYWdyYW1hIGRlIGNhamFzIHN1Z2llcmUgZXhwZXJpZW5jaWFzIGhldGVyb2fDqW5lYXMgZW50cmUgbG9zIHBhY2llbnRlcywgcG9zaWJsZW1lbnRlIGFzb2NpYWRhcyBhIGRpZmVyZW5jaWFzIGVuIHJlY3Vyc29zIGRpc3BvbmlibGVzLCBjYXJnYSBhc2lzdGVuY2lhbCB5IGNhcGFjaWRhZCBpbnN0YWxhZGEuIEVuIGNvbmp1bnRvLCBlc3RvcyByZXN1bHRhZG9zIHBlcm1pdGVuIGlkZW50aWZpY2FyIG9wb3J0dW5pZGFkZXMgZGUgbWVqb3JhIGVuIGxhIGdlc3Rpw7NuIGRlbCB0YWxlbnRvIGh1bWFubyB5IGVuIGxhIG9wdGltaXphY2nDs24gZGUgbG9zIHRpZW1wb3MgZGVsIHByb2Nlc28sIGNvbiBlbCBmaW4gZGUgcmVkdWNpciBsYSBlc3BlcmEgeSBtZWpvcmFyIGxhIHBlcmNlcGNpw7NuIGRlbCBzZXJ2aWNpbyBwb3IgcGFydGUgZGUgbG9zIHVzdWFyaW9zLg0KDQpgYGB7ciBWZWN0b3JfZGVfTWVkaWFzX3lfQm94cGxvdHMsIGZpZy5hbGlnbj0nY2VudGVyJ30NCmFwcGx5KHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMWywtYygxLDIsMyw0LDUsMTMpXSwgMiwgbWVhbikNCnZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMX3JlZHVjaWRvID0gdmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVExbLC1jKDEsMiwzLDQsNSwxMyldDQpub21icmVzX2JveHBsb3RzIDwtIGMoInJlbGFjaW9uX2VuZmVybWVyYV9wYWNpZW50ZSIsICJlc3BlY2lhbGlzdGFzX2Rpc3BvbmlibGVzIiwgInRhbWHDsW9faW5zdGFsYWNpb25fY2FtYXMiLCAidGllbXBvX3JlZ2lzdHJvIiwgInRpZW1wb190cmlhZ2UiLCAidGllbXBvX2F0ZW5jaW9uX3Byb2Zlc2lvbmFsX21lZGljbyIsICJ0aWVtcG9fdG90YWxfZXNwZXJhIiwgInNhdGlzZmFjY2lvbl9wYWNpZW50ZSIpDQpwYXIobWZyb3cgPSBjKDEsIG5jb2wodmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVExfcmVkdWNpZG8pKSkNCmludmlzaWJsZShsYXBwbHkoMTpuY29sKHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMX3JlZHVjaWRvKSwgZnVuY3Rpb24oaSkgDQp7DQogIGJveHBsb3QodmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVExfcmVkdWNpZG9bLCBpXSwNCiAgICAgICAgICBtYWluID0gbm9tYnJlc19ib3hwbG90c1tpXSl9KSkNCmBgYA0KDQojIyMjIE1hdHJpeiBkZSBWYXJpYW56YXMtQ292YXJpYW56YXMgDQoNCkEgcGFydGlyIGRlIGxhIG1hdHJpeiBkZSB2YXJpYW56YXPigJNjb3Zhcmlhbnphcywgc2Ugb2J0aWVuZSB1bmEgdmlzacOzbiBkZXRhbGxhZGEgc29icmUgbGEgdmFyaWFiaWxpZGFkIGluZGl2aWR1YWwgZGUgbGFzIHZhcmlhYmxlcyB5IGxhIHJlbGFjacOzbiBjb25qdW50YSBlbnRyZSBsb3MgcHJpbmNpcGFsZXMgaW5kaWNhZG9yZXMgb3BlcmF0aXZvcyB5IGRlIHBlcmNlcGNpw7NuIGRlbCBzZXJ2aWNpbyBkZSB1cmdlbmNpYXMuIEVuIHByaW1lciBsdWdhciwgbGFzIHZhcmlhbnphcywgb2JzZXJ2YWRhcyBlbiBsYSBkaWFnb25hbCBwcmluY2lwYWwsIG11ZXN0cmFuIHF1ZSBsYXMgdmFyaWFibGVzIGFzb2NpYWRhcyBhIGxvcyB0aWVtcG9zIGRlbCBwcm9jZXNvIGFzaXN0ZW5jaWFsIHByZXNlbnRhbiBsYSBtYXlvciBkaXNwZXJzacOzbi4gRGVzdGFjYSBlc3BlY2lhbG1lbnRlIGVsIHRpZW1wbyB0b3RhbCBkZSBlc3BlcmEsIGNvbiB1bmEgdmFyaWFuemEgZWxldmFkYSAoNDYzNSw1MCksIHNlZ3VpZG8gZGVsIHRpZW1wbyBkZSBhdGVuY2nDs24gcHJvZmVzaW9uYWwgbcOpZGljYSAoMTI2OCw3OCkgeSBkZWwgdGllbXBvIGRlIHRyaWFnZSAoNjE1LDQ0KSwgbG8gcXVlIGV2aWRlbmNpYSB1bmEgYWx0YSBoZXRlcm9nZW5laWRhZCBlbiBsYSBkdXJhY2nDs24gZGUgbGEgYXRlbmNpw7NuIGVudHJlIHBhY2llbnRlcyB5IGNvbnRleHRvcyBob3NwaXRhbGFyaW9zLiBFc3RhIHZhcmlhYmlsaWRhZCBzdWdpZXJlIGluY29uc2lzdGVuY2lhcyBvcGVyYXRpdmFzIHkgcG9zaWJsZXMgY3VlbGxvcyBkZSBib3RlbGxhIGVuIGVsIHNlcnZpY2lvLg0KDQpFbiBjdWFudG8gYSBsYXMgY292YXJpYW56YXMsIHNlIGlkZW50aWZpY2FuIHJlbGFjaW9uZXMgcG9zaXRpdmFzIHNpZ25pZmljYXRpdmFzIGVudHJlIGxvcyBkaXN0aW50b3MgdGllbXBvcyBkZWwgcHJvY2Vzby4gRWwgdGllbXBvIGRlIHRyaWFnZSBwcmVzZW50YSB1bmEgY292YXJpYW56YSBhbHRhIGNvbiBlbCB0aWVtcG8gZGUgYXRlbmNpw7NuIHByb2Zlc2lvbmFsIG3DqWRpY2EgKDc3MywzMykgeSBjb24gZWwgdGllbXBvIHRvdGFsIGRlIGVzcGVyYSAoMTYxMCw2OCksIGxvIHF1ZSBpbmRpY2EgcXVlIGluY3JlbWVudG9zIGVuIGxhIGR1cmFjacOzbiBkZWwgdHJpYWdlIHRpZW5kZW4gYSBhc29jaWFyc2UgY29uIG1heW9yZXMgdGllbXBvcyBkZSBlc3BlcmEgZ2xvYmFsLiBEZSBpZ3VhbCBmb3JtYSwgZWwgdGllbXBvIGRlIGF0ZW5jacOzbiBtw6lkaWNhIG11ZXN0cmEgdW5hIGNvdmFyaWFuemEgZWxldmFkYSBjb24gZWwgdGllbXBvIHRvdGFsIGRlIGVzcGVyYSAoMjM2OCwwNSksIGNvbmZpcm1hbmRvIHF1ZSBlc3RhIGV0YXBhIGVzIHVuIGNvbXBvbmVudGUgZGV0ZXJtaW5hbnRlIGVuIGxhIGFjdW11bGFjacOzbiBkZWwgdGllbXBvIHRvdGFsIHF1ZSBleHBlcmltZW50YSBlbCBwYWNpZW50ZS4NCg0KUG9yIG90cm8gbGFkbywgbGFzIGNvdmFyaWFuemFzIGVudHJlIGxvcyByZWN1cnNvcyBkaXNwb25pYmxlcyAocmVsYWNpw7NuIGVuZmVybWVyYeKAk3BhY2llbnRlLCBlc3BlY2lhbGlzdGFzIGRpc3BvbmlibGVzIHkgdGFtYcOxbyBkZSBsYSBpbnN0YWxhY2nDs24gZW4gY2FtYXMpIHkgbG9zIHRpZW1wb3MgZGVsIHByb2Nlc28gc29uIGVuIGdlbmVyYWwgYmFqYXMgbyBtb2RlcmFkYXMsIGxvIHF1ZSBzdWdpZXJlIHF1ZSwgc2kgYmllbiBsb3MgcmVjdXJzb3MgaW5mbHV5ZW4gZW4gbGEgYXRlbmNpw7NuLCBzdSBpbXBhY3RvIG5vIGVzIHVuaWZvcm1lIHkgcHVlZGUgZXN0YXIgbWVkaWFkbyBwb3IgZmFjdG9yZXMgb3JnYW5pemFjaW9uYWxlcyBvIGRlIGdlc3Rpw7NuLiBGaW5hbG1lbnRlLCBsYSB2YXJpYWJsZSBzYXRpc2ZhY2Npw7NuIGRlbCBwYWNpZW50ZSBwcmVzZW50YSBjb3ZhcmlhbnphcyBuZWdhdGl2YXMgY29uIGxvcyB0aWVtcG9zIGRlIGF0ZW5jacOzbiwgZXNwZWNpYWxtZW50ZSBjb24gZWwgdGllbXBvIHRvdGFsIGRlIGVzcGVyYSAoLTgzLDkxKSB5IGVsIHRpZW1wbyBkZSBhdGVuY2nDs24gcHJvZmVzaW9uYWwgbcOpZGljYSAoLTQzLDUyKSwgbG8gcXVlIGluZGljYSBxdWUgYSBtYXlvcmVzIHRpZW1wb3MgZGUgZXNwZXJhIHkgYXRlbmNpw7NuLCBtZW5vciBlcyBlbCBuaXZlbCBkZSBzYXRpc2ZhY2Npw7NuIHBlcmNpYmlkby4gRW4gY29uanVudG8sIGVzdG9zIHJlc3VsdGFkb3MgcmVmdWVyemFuIGxhIGltcG9ydGFuY2lhIGRlIG9wdGltaXphciBsb3MgdGllbXBvcyBkZWwgcHJvY2VzbyBhc2lzdGVuY2lhbCBjb21vIGVzdHJhdGVnaWEgY2xhdmUgcGFyYSBtZWpvcmFyIGxhIGVmaWNpZW5jaWEgZGVsIHNlcnZpY2lvIGRlIHVyZ2VuY2lhcyB5IGxhIGV4cGVyaWVuY2lhIGRlbCBwYWNpZW50ZS4NCg0KYGBge3IgTWF0cml6X2RlX1Zhcmlhbnphcy1Db3ZhcmlhbnphcywgZmlnLmFsaWduPSdjZW50ZXInfQ0Kcm91bmQoY292KHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMWywtYygxLDIsMyw0LDUsMTMpXSksMikNCmBgYA0KDQojIyMjIE1hdHJpeiBkZSBDb3JyZWxhY2lvbmVzIA0KDQpBIHBhcnRpciBkZWwgYW7DoWxpc2lzIGRlIGxhIG1hdHJpeiBkZSBjb3JyZWxhY2lvbmVzLCBzZSBpZGVudGlmaWNhbiByZWxhY2lvbmVzIGxpbmVhbGVzIGNsYXJhcyBlbnRyZSBsYXMgdmFyaWFibGVzIGFzb2NpYWRhcyBhIGxvcyByZWN1cnNvcywgbG9zIHRpZW1wb3MgZGVsIHByb2Nlc28gYXNpc3RlbmNpYWwgeSBsYSBzYXRpc2ZhY2Npw7NuIGRlbCBwYWNpZW50ZSBlbiBlbCBzZXJ2aWNpbyBkZSB1cmdlbmNpYXMuIEVuIHByaW1lciBsdWdhciwgc2Ugb2JzZXJ2YSBxdWUgbGEgcmVsYWNpw7NuIGVuZmVybWVyYeKAk3BhY2llbnRlIHByZXNlbnRhIGNvcnJlbGFjaW9uZXMgcG9zaXRpdmFzIG1vZGVyYWRhcyBhIGFsdGFzIGNvbiBsb3MgZGlzdGludG9zIHRpZW1wb3MgZGUgYXRlbmNpw7NuLCBkZXN0YWPDoW5kb3NlIHN1IGFzb2NpYWNpw7NuIGNvbiBlbCB0aWVtcG8gdG90YWwgZGUgZXNwZXJhICgwLDY4OCksIGVsIHRpZW1wbyBkZSBhdGVuY2nDs24gcHJvZmVzaW9uYWwgbcOpZGljYSAoMCw2NzQpLCBlbCB0aWVtcG8gZGUgcmVnaXN0cm8gKDAsNjUyKSB5IGVsIHRpZW1wbyBkZSB0cmlhZ2UgKDAsNjQ3KS4gRXN0b3MgcmVzdWx0YWRvcyBpbmRpY2FuIHF1ZSwgYSBtZWRpZGEgcXVlIGF1bWVudGEgbGEgY2FyZ2EgZGUgcGFjaWVudGVzIHBvciBwcm9mZXNpb25hbCBkZSBlbmZlcm1lcsOtYSwgdGllbmRlbiBhIGluY3JlbWVudGFyc2UgZGUgbWFuZXJhIGNvbnNpc3RlbnRlIGxvcyB0aWVtcG9zIGRlbCBwcm9jZXNvIGFzaXN0ZW5jaWFsLg0KDQpQb3Igc3UgcGFydGUsIGxhcyB2YXJpYWJsZXMgcmVsYWNpb25hZGFzIGNvbiBsYSBkaXNwb25pYmlsaWRhZCBkZSByZWN1cnNvcyBlc3RydWN0dXJhbGVzLCBjb21vIGVsIG7Dum1lcm8gZGUgZXNwZWNpYWxpc3RhcyBkaXNwb25pYmxlcyB5IGVsIHRhbWHDsW8gZGUgbGEgaW5zdGFsYWNpw7NuIGVuIGNhbWFzLCBtdWVzdHJhbiBjb3JyZWxhY2lvbmVzIGJhamFzIG8gY2VyY2FuYXMgYSBjZXJvIGNvbiBsb3MgdGllbXBvcyBkZSBhdGVuY2nDs24sIGxvIHF1ZSBzdWdpZXJlIHF1ZSBsYSBzb2xhIGV4aXN0ZW5jaWEgZGUgbWF5b3IgaW5mcmFlc3RydWN0dXJhIG8gcGVyc29uYWwgZXNwZWNpYWxpemFkbyBubyBnYXJhbnRpemEgcmVkdWNjaW9uZXMgZW4gbG9zIHRpZW1wb3MgZGVsIHNlcnZpY2lvLCBzaW5vIHF1ZSBlc3RvcyBkZXBlbmRlbiBlbiBtYXlvciBtZWRpZGEgZGUgbGEgb3JnYW5pemFjacOzbiB5IGdlc3Rpw7NuIGRlIGxvcyBwcm9jZXNvcy4gTm8gb2JzdGFudGUsIHNlIGlkZW50aWZpY2EgdW5hIGNvcnJlbGFjacOzbiBwb3NpdGl2YSBtb2RlcmFkYSBlbnRyZSBlc3BlY2lhbGlzdGFzIGRpc3BvbmlibGVzIHkgdGFtYcOxbyBkZSBsYSBpbnN0YWxhY2nDs24gKDAsNTAzKSwgbG8gcXVlIHJlZmxlamEgY29oZXJlbmNpYSBlbnRyZSBsYSBjYXBhY2lkYWQgaW5zdGFsYWRhIHkgbGEgZG90YWNpw7NuIGRlIHBlcnNvbmFsIG3DqWRpY28uDQoNCkVuIGN1YW50byBhIGxvcyB0aWVtcG9zIGRlbCBwcm9jZXNvLCBzZSBldmlkZW5jaWFuIGNvcnJlbGFjaW9uZXMgbXV5IGFsdGFzIHkgcG9zaXRpdmFzIGVudHJlIGVsIHRpZW1wbyBkZSByZWdpc3RybywgZWwgdGllbXBvIGRlIHRyaWFnZSwgZWwgdGllbXBvIGRlIGF0ZW5jacOzbiBwcm9mZXNpb25hbCBtw6lkaWNhIHkgZWwgdGllbXBvIHRvdGFsIGRlIGVzcGVyYSwgZGVzdGFjw6FuZG9zZSBsYSByZWxhY2nDs24gZW50cmUgZWwgdGllbXBvIGRlIGF0ZW5jacOzbiBtw6lkaWNhIHkgZWwgdGllbXBvIHRvdGFsIGRlIGVzcGVyYSAoMCw5NzYpLiBFc3RlIHJlc3VsdGFkbyBjb25maXJtYSBxdWUgbG9zIHJldHJhc29zIGVuIGN1YWxxdWllcmEgZGUgbGFzIGV0YXBhcyBkZWwgcHJvY2VzbyBhc2lzdGVuY2lhbCB0aWVuZW4gdW4gZWZlY3RvIGFjdW11bGF0aXZvIHNvYnJlIGVsIHRpZW1wbyB0b3RhbCBxdWUgZXhwZXJpbWVudGEgZWwgcGFjaWVudGUuDQoNCkZpbmFsbWVudGUsIGxhIHNhdGlzZmFjY2nDs24gZGVsIHBhY2llbnRlIHByZXNlbnRhIGNvcnJlbGFjaW9uZXMgbmVnYXRpdmFzIGFsdGFzIGNvbiB0b2RvcyBsb3MgdGllbXBvcyBkZSBhdGVuY2nDs24sIGVzcGVjaWFsbWVudGUgY29uIGVsIHRpZW1wbyB0b3RhbCBkZSBlc3BlcmEgKC0wLDg2NSksIGVsIHRpZW1wbyBkZSBhdGVuY2nDs24gcHJvZmVzaW9uYWwgbcOpZGljYSAoLTAsODU4KSB5IGVsIHRpZW1wbyBkZSByZWdpc3RybyAoLTAsODI2KS4gRXN0byBldmlkZW5jaWEgcXVlIGVsIGF1bWVudG8gZW4gbG9zIHRpZW1wb3MgZGUgZXNwZXJhIHkgYXRlbmNpw7NuIGltcGFjdGEgZGUgbWFuZXJhIGRpcmVjdGEgeSBzaWduaWZpY2F0aXZhIGVuIGxhIHBlcmNlcGNpw7NuIG5lZ2F0aXZhIGRlbCBzZXJ2aWNpby4gRW4gY29uanVudG8sIGxvcyByZXN1bHRhZG9zIGRlIGxhIG1hdHJpeiBkZSBjb3JyZWxhY2lvbmVzIHJlZnVlcnphbiBsYSBuZWNlc2lkYWQgZGUgaW1wbGVtZW50YXIgZXN0cmF0ZWdpYXMgb3JpZW50YWRhcyBhIG9wdGltaXphciBsYSBnZXN0acOzbiBkZWwgcGVyc29uYWwgZGUgZW5mZXJtZXLDrWEgeSBhIHJlZHVjaXIgbG9zIHRpZW1wb3MgY3LDrXRpY29zIGRlbCBwcm9jZXNvIGFzaXN0ZW5jaWFsLCBjb24gZWwgZmluIGRlIG1lam9yYXIgdGFudG8gbGEgZWZpY2llbmNpYSBvcGVyYXRpdmEgY29tbyBsYSBzYXRpc2ZhY2Npw7NuIGRlbCBwYWNpZW50ZSBlbiBsYXMgc2FsYXMgZGUgdXJnZW5jaWFzLg0KDQpgYGB7ciBNYXRyaXpfZGVfQ29ycmVsYWNpb25lcywgZmlnLmFsaWduPSdjZW50ZXInfQ0Kcm91bmQoY29yKHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMWywtYygxLDIsMyw0LDUsMTMpXSksMykNCmBgYA0KDQojIyMgMS40LiBHcsOhZmljYXMgbXVsdGl2YXJpYWRhcyB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQpMYSBuYXZlZ2FjacOzbiBhIHRyYXbDqXMgZGUgbGFzIHBlc3Rhw7FhcyBtdWVzdHJhIGVsIGPDoWxjdWxvIGRlIGxvcyBzaWd1aWVudGVzIG9iamV0b3M6ICoqVmVjdG9yIGRlIE1lZGlhcyoqICRcYmFyIHgkICwqKk1hdHJpeiBkZSBWYXJpYW56YXMtQ292YXJpYW56YXMqKiAkUyQgeSAqKk1hdHJpeiBkZSBDb3JyZWxhY2lvbmVzKiogJFIkLg0KDQpDb24gYmFzZSBlbiBsYSBwZXN0YcOxYSAqKlZlY3RvciBkZSBNZWRpYXMqKiB5ICoqQm94cGxvdHMqKiwgc2UgcHVlZGUgZGVzY3JpYmlyIHF1ZSwgZW4gZ2VuZXJhbCwgbG9zIGRhdG9zIHJlZ2lzdHJhZG9zIHBhcmEgY2FkYSB1bmEgZGUgbGFzIHZhcmlhYmxlcyB0aWVuZGVuIGEgcHJlc2VudGFyIGRpc3RyaWJ1Y2lvbmVzIGNvbiBjb2xhcyBlc3BlY8OtZmljYXMuDQoNCiMjIyMgRGlhZ3JhbWEgQ29uanVudG8gZGUgRGlzcGVyc2nDs24sIERpc3RyaWJ1Y2nDs24geSBDb3JyZWxhY2lvbmVzIFtTQV0NCg0KQSBwYXJ0aXIgZGVsIGRpYWdyYW1hIGNvbmp1bnRvIGRlIGRpc3BlcnNpw7NuLCBkaXN0cmlidWNpw7NuIHkgY29ycmVsYWNpb25lcywgc2Ugb2J0aWVuZSB1bmEgdmlzacOzbiBpbnRlZ3JhbCBkZWwgY29tcG9ydGFtaWVudG8gaW5kaXZpZHVhbCBkZSBsYXMgdmFyaWFibGVzIHkgZGUgbGFzIHJlbGFjaW9uZXMgZXhpc3RlbnRlcyBlbnRyZSBsb3MgcmVjdXJzb3MsIGxvcyB0aWVtcG9zIGRlbCBwcm9jZXNvIGFzaXN0ZW5jaWFsIHkgbGEgc2F0aXNmYWNjacOzbiBkZWwgcGFjaWVudGUgZW4gbGEgc2FsYSBkZSB1cmdlbmNpYXMuIEVuIGxhIGRpYWdvbmFsIHByaW5jaXBhbCBzZSBvYnNlcnZhbiBsYXMgZGlzdHJpYnVjaW9uZXMgdW5pdmFyaWFkYXMsIGRvbmRlIGxhcyB2YXJpYWJsZXMgYXNvY2lhZGFzIGEgbG9zIHRpZW1wb3MgZGUgYXRlbmNpw7NuIHByZXNlbnRhbiBkaXN0cmlidWNpb25lcyBhc2ltw6l0cmljYXMgaGFjaWEgbGEgZGVyZWNoYSwgbG8gcXVlIGluZGljYSBsYSBwcmVzZW5jaWEgZGUgY2Fzb3MgY29uIHRpZW1wb3MgY29uc2lkZXJhYmxlbWVudGUgbcOhcyBhbHRvcyBxdWUgZWwgcHJvbWVkaW8uIEVzdGEgY2FyYWN0ZXLDrXN0aWNhIGVzIGNvbnNpc3RlbnRlIGNvbiBsYSBuYXR1cmFsZXphIGRlbCBzZXJ2aWNpbyBkZSB1cmdlbmNpYXMsIGVuIGVsIHF1ZSBzZSBwcmVzZW50YW4gZXBpc29kaW9zIGRlIGNvbmdlc3Rpw7NuIHkgYWx0YSBkZW1hbmRhLg0KDQpMb3MgZGlhZ3JhbWFzIGRlIGRpc3BlcnNpw7NuIHJlZnVlcnphbiBsb3MgcmVzdWx0YWRvcyBvYnRlbmlkb3MgcHJldmlhbWVudGUgZW4gbGEgbWF0cml6IGRlIGNvcnJlbGFjaW9uZXMsIGV2aWRlbmNpYW5kbyByZWxhY2lvbmVzIGxpbmVhbGVzIGZ1ZXJ0ZXMgeSBwb3NpdGl2YXMgZW50cmUgbG9zIGRpc3RpbnRvcyB0aWVtcG9zIGRlbCBwcm9jZXNvLCBlc3BlY2lhbG1lbnRlIGVudHJlIGVsIHRpZW1wbyBkZSByZWdpc3RybywgZWwgdGllbXBvIGRlIHRyaWFnZSwgZWwgdGllbXBvIGRlIGF0ZW5jacOzbiBwcm9mZXNpb25hbCBtw6lkaWNhIHkgZWwgdGllbXBvIHRvdGFsIGRlIGVzcGVyYS4gTGEgY29uY2VudHJhY2nDs24gZGUgcHVudG9zIGVuIHBhdHJvbmVzIGFzY2VuZGVudGVzIGNvbmZpcm1hIHF1ZSBsb3MgcmV0cmFzb3MgZW4gdW5hIGV0YXBhIGRlbCBwcm9jZXNvIHRpZW5kZW4gYSBwcm9wYWdhcnNlIHkgYWN1bXVsYXJzZSBlbiBlbCB0aWVtcG8gdG90YWwgZGUgZXNwZXJhIGRlbCBwYWNpZW50ZSwgbG8gcXVlIHBvbmUgZGUgbWFuaWZpZXN0byBsYSBpbnRlcmRlcGVuZGVuY2lhIG9wZXJhdGl2YSBkZSBlc3RhcyBmYXNlcy4NCg0KRW4gY29udHJhc3RlLCBsYXMgdmFyaWFibGVzIHJlbGFjaW9uYWRhcyBjb24gbGEgZGlzcG9uaWJpbGlkYWQgZGUgcmVjdXJzb3MgZXN0cnVjdHVyYWxlcywgY29tbyBlbCBuw7ptZXJvIGRlIGVzcGVjaWFsaXN0YXMgZGlzcG9uaWJsZXMgeSBlbCB0YW1hw7FvIGRlIGxhIGluc3RhbGFjacOzbiBlbiBjYW1hcywgbXVlc3RyYW4gbnViZXMgZGUgcHVudG9zIGRpc3BlcnNhcyB5IHNpbiB1bmEgdGVuZGVuY2lhIGNsYXJhIGZyZW50ZSBhIGxvcyB0aWVtcG9zIGRlIGF0ZW5jacOzbiwgbG8gcXVlIGNvaW5jaWRlIGNvbiBsYXMgY29ycmVsYWNpb25lcyBiYWphcyBvYnNlcnZhZGFzLiBFc3RvIHN1Z2llcmUgcXVlIGxhIGluZnJhZXN0cnVjdHVyYSB5IGVsIHBlcnNvbmFsIGRpc3BvbmlibGUsIHBvciBzw60gc29sb3MsIG5vIGRldGVybWluYW4gbGEgZWZpY2llbmNpYSBkZWwgc2VydmljaW8sIHNpbm8gcXVlIHN1IGltcGFjdG8gZGVwZW5kZSBkZSBsYSBmb3JtYSBlbiBxdWUgc2UgZ2VzdGlvbmFuIGxvcyBwcm9jZXNvcyBpbnRlcm5vcy4NCkZpbmFsbWVudGUsIGxhIHNhdGlzZmFjY2nDs24gZGVsIHBhY2llbnRlIGV4aGliZSB1bmEgcmVsYWNpw7NuIGludmVyc2EgY2xhcmEgY29uIGxvcyB0aWVtcG9zIGRlIGF0ZW5jacOzbiwgcmVmbGVqYWRhIHRhbnRvIGVuIGxhcyBjb3JyZWxhY2lvbmVzIG5lZ2F0aXZhcyBjb21vIGVuIGxvcyBkaWFncmFtYXMgZGUgZGlzcGVyc2nDs24gY29uIHBlbmRpZW50ZSBkZXNjZW5kZW50ZS4gQSBtYXlvcmVzIHRpZW1wb3MgZGUgZXNwZXJhIHkgYXRlbmNpw7NuLCBtZW5vciBlcyBlbCBuaXZlbCBkZSBzYXRpc2ZhY2Npw7NuIHJlcG9ydGFkbywgbG8gcXVlIGNvbmZpcm1hIHF1ZSBsYSBwZXJjZXBjacOzbiBkZWwgc2VydmljaW8gZXN0w6EgZnVlcnRlbWVudGUgY29uZGljaW9uYWRhIHBvciBsYSBvcG9ydHVuaWRhZCBkZSBsYSBhdGVuY2nDs24uIEVuIGNvbmp1bnRvLCBlbCBkaWFncmFtYSBjb25qdW50byB2YWxpZGEgZ3LDoWZpY2FtZW50ZSBsb3MgcmVzdWx0YWRvcyBlc3RhZMOtc3RpY29zIHByZXZpb3MgeSByZWZ1ZXJ6YSBsYSBuZWNlc2lkYWQgZGUgZW5mb2NhciBsYXMgZXN0cmF0ZWdpYXMgZGUgbWVqb3JhIGVuIGxhIG9wdGltaXphY2nDs24gZGUgbG9zIHRpZW1wb3MgY3LDrXRpY29zIGRlbCBwcm9jZXNvIGFzaXN0ZW5jaWFsLCBtw6FzIHF1ZSDDum5pY2FtZW50ZSBlbiBsYSBhbXBsaWFjacOzbiBkZSByZWN1cnNvcyBmw61zaWNvcyBvIGh1bWFub3MuDQoNCmBgYHtyIERpYWdyYW1hX0Nvbmp1bnRvX2RlX0Rpc3BlcnNpw7NuX0Rpc3RyaWJ1Y2nDs25fQ29ycmVsYWNpb25lcywgZmlnLmFsaWduPSdjZW50ZXInfQ0KZ2dwYWlycyh2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTFssLWMoMSwyLDMsNCw1LDEzKV0pDQpgYGANCg0KIyMjIyBEaWFncmFtYSBDb25qdW50byBkZSBEaXNwZXJzacOzbiwgRGlzdHJpYnVjacOzbiB5IENvcnJlbGFjaW9uZXMgW0NBXQ0KDQpBIHBhcnRpciBkZWwgZGlhZ3JhbWEgY29uanVudG8gZGUgZGlzcGVyc2nDs24sIGRpc3RyaWJ1Y2nDs24geSBjb3JyZWxhY2lvbmVzIFtDQV0sIHNlIHByb2Z1bmRpemEgZWwgYW7DoWxpc2lzIGRlIGxhIHJlbGFjacOzbiBlbnRyZSBsYXMgZXRhcGFzIGRlbCBwcm9jZXNvIGFzaXN0ZW5jaWFsIGNvbnNpZGVyYW5kbyBsYSBjbGFzaWZpY2FjacOzbiBwb3Igbml2ZWwgZGUgdXJnZW5jaWEuIEVuIGxhcyBkaXN0cmlidWNpb25lcyB1bml2YXJpYWRhcyBzZSBvYnNlcnZhIHF1ZSBsb3MgdGllbXBvcyBkZSByZWdpc3RybywgdHJpYWdlLCBhdGVuY2nDs24gcHJvZmVzaW9uYWwgbcOpZGljYSB5IHRpZW1wbyB0b3RhbCBkZSBlc3BlcmEgcHJlc2VudGFuIGFzaW1ldHLDrWEgcG9zaXRpdmEgZW4gdG9kb3MgbG9zIG5pdmVsZXMgZGUgdXJnZW5jaWEsIHNpZW5kbyBtw6FzIHByb251bmNpYWRhIGVuIGxvcyBjYXNvcyBkZSB1cmdlbmNpYSBiYWphIHkgbWVkaWEsIGxvIHF1ZSBpbmRpY2EgdW5hIG1heW9yIGNvbmNlbnRyYWNpw7NuIGRlIHBhY2llbnRlcyBjb24gdGllbXBvcyBwcm9sb25nYWRvcyBlbiBlc3RvcyBncnVwb3MuIEVuIGNvbnRyYXN0ZSwgbG9zIGNhc29zIGNsYXNpZmljYWRvcyBjb21vIGNyw610aWNvcyBtdWVzdHJhbiBkaXN0cmlidWNpb25lcyBtw6FzIGNvbmNlbnRyYWRhcyBlbiB2YWxvcmVzIGJham9zLCByZWZsZWphbmRvIHVuYSBwcmlvcml6YWNpw7NuIGVmZWN0aXZhIGVuIGxhIGF0ZW5jacOzbi4NCg0KTG9zIGRpYWdyYW1hcyBkZSBkaXNwZXJzacOzbiBldmlkZW5jaWFuIHJlbGFjaW9uZXMgbGluZWFsZXMgZnVlcnRlcyB5IHBvc2l0aXZhcyBlbnRyZSBsYXMgZGlzdGludGFzIGV0YXBhcyBkZWwgcHJvY2VzbyBhc2lzdGVuY2lhbCwgaW5kZXBlbmRpZW50ZW1lbnRlIGRlbCBuaXZlbCBkZSB1cmdlbmNpYS4gU2luIGVtYmFyZ28sIGxhIGludGVuc2lkYWQgZGUgZXN0YXMgcmVsYWNpb25lcyB2YXLDrWEgc2Vnw7puIGxhIGNsYXNpZmljYWNpw7NuIGNsw61uaWNhLiBEZXN0YWNhIHF1ZSwgcGFyYSBsb3MgcGFjaWVudGVzIGNyw610aWNvcywgbGFzIGNvcnJlbGFjaW9uZXMgZW50cmUgdGllbXBvcyBzb24gZWxldmFkYXMgcGVybyBsaWdlcmFtZW50ZSBpbmZlcmlvcmVzIGEgbGFzIG9ic2VydmFkYXMgZW4gbG9zIG5pdmVsZXMgZGUgdXJnZW5jaWEgYWx0YSwgbWVkaWEgeSBiYWphLCBsbyBxdWUgc3VnaWVyZSB1bmEgbWF5b3IgZXN0YW5kYXJpemFjacOzbiB5IGNvbnRyb2wgZGVsIHByb2Nlc28gZW4gc2l0dWFjaW9uZXMgZGUgbWF5b3IgZ3JhdmVkYWQuDQpBc2ltaXNtbywgc2Ugb2JzZXJ2YSBxdWUgbG9zIHBhY2llbnRlcyBjbGFzaWZpY2Fkb3MgY29uIHVyZ2VuY2lhIGFsdGEgeSBtZWRpYSBwcmVzZW50YW4gdW5hIG1heW9yIGRpc3BlcnNpw7NuIGVuIGxvcyB0aWVtcG9zLCBwYXJ0aWN1bGFybWVudGUgZW4gbGEgcmVsYWNpw7NuIGVudHJlIHRpZW1wbyBkZSBhdGVuY2nDs24gcHJvZmVzaW9uYWwgbcOpZGljYSB5IHRpZW1wbyB0b3RhbCBkZSBlc3BlcmEsIGxvIHF1ZSBldmlkZW5jaWEgdW5hIG1heW9yIGhldGVyb2dlbmVpZGFkIGVuIGxhIGdlc3Rpw7NuIGRlIGVzdG9zIGNhc29zLiBQb3Igc3UgcGFydGUsIGxvcyBwYWNpZW50ZXMgZGUgdXJnZW5jaWEgYmFqYSBjb25jZW50cmFuIGxvcyB2YWxvcmVzIG3DoXMgYWx0b3MgZGUgdGllbXBvIHRvdGFsIGRlIGVzcGVyYSwgbG8gcXVlIHN1Z2llcmUgcXVlIGVzdG9zIGNhc29zIHRpZW5kZW4gYSBwb3N0ZXJnYXJzZSBmcmVudGUgYSBzaXR1YWNpb25lcyBtw6FzIGdyYXZlcywgZ2VuZXJhbmRvIGFjdW11bGFjacOzbiBkZSB0aWVtcG9zLg0KDQpFbiBjb25qdW50bywgZXN0ZSBkaWFncmFtYSBjb25maXJtYSBxdWUsIGF1bnF1ZSBleGlzdGUgdW5hIGVzdHJ1Y3R1cmEgY29tw7puIGRlIGRlcGVuZGVuY2lhIGVudHJlIGxvcyB0aWVtcG9zIGRlbCBwcm9jZXNvIGFzaXN0ZW5jaWFsLCBlbCBuaXZlbCBkZSB1cmdlbmNpYSBtb2R1bGEgZGUgbWFuZXJhIHNpZ25pZmljYXRpdmEgbGEgbWFnbml0dWQgeSB2YXJpYWJpbGlkYWQgZGUgZGljaGFzIHJlbGFjaW9uZXMuIEVzdG9zIHJlc3VsdGFkb3MgcmVzYWx0YW4gbGEgbmVjZXNpZGFkIGRlIGZvcnRhbGVjZXIgbGEgZ2VzdGnDs24gb3BlcmF0aXZhIHkgbG9zIG1lY2FuaXNtb3MgZGUgdHJpYWdlLCBlc3BlY2lhbG1lbnRlIGVuIGxvcyBjYXNvcyBkZSB1cmdlbmNpYSBtZWRpYSB5IGJhamEsIGNvbiBlbCBmaW4gZGUgcmVkdWNpciBsb3MgdGllbXBvcyBkZSBlc3BlcmEgeSBtZWpvcmFyIGxhIGVmaWNpZW5jaWEgZGVsIHNlcnZpY2lvIHNpbiBjb21wcm9tZXRlciBsYSBhdGVuY2nDs24gcHJpb3JpdGFyaWEgZGUgbG9zIHBhY2llbnRlcyBjcsOtdGljb3MuDQoNCmBgYHtyIERpYWdyYW1hIENvbmp1bnRvX2RlX0Rpc3BlcnNpw7NuX0Rpc3RyaWJ1Y2nDs25feV9Db3JyZWxhY2lvbmVzX1tDQTpHRV0sIGZpZy5hbGlnbj0nY2VudGVyJ30NCnZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMJG5pdmVsX3VyZ2VuY2lhIDwtIGZhY3Rvcih2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCRuaXZlbF91cmdlbmNpYSkNCmxldmVscz0gYyAoMSwyLDMsNCkNCmxhYmVscz0gYyAoICJMb3ciICwgIk1lZGl1bSIsICJIaWdoIiwgIkNyaXRpY2FsIikNCmdncGFpcnModmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVEwsIGNvbHVtbiA9IGMoOSwxMCwxMSwxMiksIGFlcyhjb2xvciA9IG5pdmVsX3VyZ2VuY2lhLCBhbHBoYSA9IDAuNSksIHVwcGVyID0gbGlzdChjb250aW51b3VzID0gd3JhcCgiY29yIiwgc2l6ZSA9IDIuNSkpKQ0KYGBgDQoNCiMjIyMgRGlhZ3JhbWEgZGUgRXN0cmVsbGFzDQoNCkEgcGFydGlyIGRlbCBkaWFncmFtYSBkZSBlc3RyZWxsYXMsIHNlIG9idGllbmUgdW5hIHJlcHJlc2VudGFjacOzbiB2aXN1YWwgc2ludMOpdGljYSBkZWwgY29tcG9ydGFtaWVudG8gY29uanVudG8gZGUgbG9zIHRpZW1wb3MgZGVsIHByb2Nlc28gYXNpc3RlbmNpYWwgZW4gbGEgc2FsYSBkZSB1cmdlbmNpYXMsIHBlcm1pdGllbmRvIGNvbXBhcmFyIHNpbXVsdMOhbmVhbWVudGUgbcO6bHRpcGxlcyB2YXJpYWJsZXMgcGFyYSBjYWRhIG9ic2VydmFjacOzbiBvIGdydXBvIGFuYWxpemFkby4gQ2FkYSBlc3RyZWxsYSBpbnRlZ3JhIGxvcyB2YWxvcmVzIGRlbCB0aWVtcG8gZGUgcmVnaXN0cm8sIHRpZW1wbyBkZSB0cmlhZ2UsIHRpZW1wbyBkZSBhdGVuY2nDs24gcHJvZmVzaW9uYWwgbcOpZGljYSB5IHRpZW1wbyB0b3RhbCBkZSBlc3BlcmEsIGRvbmRlIGVsIHRhbWHDsW8geSBsYSBleHRlbnNpw7NuIGRlIGNhZGEgZWplIHJlZmxlamFuIGxhIG1hZ25pdHVkIHJlbGF0aXZhIGRlIGRpY2hvcyB0aWVtcG9zLg0KDQpFbCBhbsOhbGlzaXMgdmlzdWFsIGV2aWRlbmNpYSB1bmEgYWx0YSBoZXRlcm9nZW5laWRhZCBlbiBsYSBmb3JtYSB5IHRhbWHDsW8gZGUgbGFzIGVzdHJlbGxhcywgbG8gcXVlIGluZGljYSB1bmEgdmFyaWFiaWxpZGFkIGNvbnNpZGVyYWJsZSBlbiBsYSBleHBlcmllbmNpYSBkZSBhdGVuY2nDs24gZGUgbG9zIHBhY2llbnRlcy4gTGFzIGVzdHJlbGxhcyBkZSBtYXlvciB0YW1hw7FvLCBjYXJhY3Rlcml6YWRhcyBwb3IgZWplcyBtw6FzIGV4dGVuZGlkb3MsIGNvcnJlc3BvbmRlbiBhIGNhc29zIGNvbiB0aWVtcG9zIGVsZXZhZG9zIGVuIHZhcmlhcyBldGFwYXMgZGVsIHByb2Nlc28sIGVzcGVjaWFsbWVudGUgZW4gZWwgdGllbXBvIGRlIGF0ZW5jacOzbiBwcm9mZXNpb25hbCBtw6lkaWNhIHkgZWwgdGllbXBvIHRvdGFsIGRlIGVzcGVyYSwgbG8gcXVlIHN1Z2llcmUgYWN1bXVsYWNpw7NuIGRlIGRlbW9yYXMgYSBsbyBsYXJnbyBkZWwgZmx1am8gYXNpc3RlbmNpYWwuIFBvciBlbCBjb250cmFyaW8sIGxhcyBlc3RyZWxsYXMgZGUgbWVub3IgdGFtYcOxbyByZXByZXNlbnRhbiBhdGVuY2lvbmVzIG3DoXMgw6FnaWxlcywgY29uIHRpZW1wb3MgcmVkdWNpZG9zIHkgdW5hIG1heW9yIGVmaWNpZW5jaWEgb3BlcmF0aXZhLg0KDQpFbiBjb25qdW50bywgZWwgZGlhZ3JhbWEgZGUgZXN0cmVsbGFzIHBlcm1pdGUgaWRlbnRpZmljYXIgZGUgbWFuZXJhIGNsYXJhIHBhdHJvbmVzIGRlIGVmaWNpZW5jaWEgZSBpbmVmaWNpZW5jaWEgZW4gbGEgYXRlbmNpw7NuIGRlIHVyZ2VuY2lhcywgZmFjaWxpdGFuZG8gbGEgZGV0ZWNjacOzbiBkZSBjYXNvcyBleHRyZW1vcyB5IGRlIGNvbmZpZ3VyYWNpb25lcyB0w61waWNhcyBkZSB0aWVtcG9zIHByb2xvbmdhZG9zLiBFc3RvcyByZXN1bHRhZG9zIHJlZnVlcnphbiBsYSBuZWNlc2lkYWQgZGUgZm9jYWxpemFyIGxhcyBlc3RyYXRlZ2lhcyBkZSBtZWpvcmEgZW4gbGFzIGV0YXBhcyBjcsOtdGljYXMgZGVsIHByb2Nlc28gYXNpc3RlbmNpYWwsIGNvbiBlbCBvYmpldGl2byBkZSByZWR1Y2lyIGxhIHZhcmlhYmlsaWRhZCBlbiBsb3MgdGllbXBvcyBkZSBhdGVuY2nDs24geSBtZWpvcmFyIGxhIGV4cGVyaWVuY2lhIGdsb2JhbCBkZWwgcGFjaWVudGUuDQoNCmBgYHtyIGRpYWdyYW1hX2RlX0VzdHJlbGxhcywgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpzZXQuc2VlZCgxMjA1MjIpDQpzdGFycyh2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTFtzYW1wbGUoMTpucm93KHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMKSwyMyksLWMoMSwyLDMsNCw1LDYsNyw4LDEzLDE0KV0sIGxlbiA9IDEsIGNleCA9IDAuNCwga2V5LmxvYyA9IGMoMTAsIDIpLCANCmRyYXcuc2VnbWVudHMgPSBUUlVFKQ0KYGBgDQoNCiMjIyMgQ2FyYXMgZGUgQ2hlcm5vZmYuDQoNCkEgcGFydGlyIGRlbCBhbsOhbGlzaXMgZGUgbGFzIGNhcmFzIGRlIENoZXJub2ZmLCBzZSBvYnRpZW5lIHVuYSByZXByZXNlbnRhY2nDs24gZ3LDoWZpY2EgbXVsdGl2YXJpYWRhIHF1ZSBwZXJtaXRlIHNpbnRldGl6YXIgZGUgZm9ybWEgaW50dWl0aXZhIGVsIGNvbXBvcnRhbWllbnRvIGNvbmp1bnRvIGRlIGxvcyBwcmluY2lwYWxlcyBpbmRpY2Fkb3JlcyBkZWwgcHJvY2VzbyBhc2lzdGVuY2lhbCBlbiBsYSBzYWxhIGRlIHVyZ2VuY2lhcy4gQ2FkYSByb3N0cm8gcmVwcmVzZW50YSB1bmEgb2JzZXJ2YWNpw7NuIG8gZ3J1cG8gZGUgb2JzZXJ2YWNpb25lcywgbWllbnRyYXMgcXVlIGxvcyByYXNnb3MgZmFjaWFsZXMg4oCUY29tbyBsYSBmb3JtYSB5IHRhbWHDsW8gZGUgbG9zIG9qb3MsIGxhIGJvY2EgeSBsYSBleHByZXNpw7NuIGdlbmVyYWzigJQgY29kaWZpY2FuIGRpZmVyZW50ZXMgdmFyaWFibGVzIGRlbCBlc3R1ZGlvLCB0YWxlcyBjb21vIGxvcyB0aWVtcG9zIGRlIHJlZ2lzdHJvLCB0cmlhZ2UsIGF0ZW5jacOzbiBwcm9mZXNpb25hbCBtw6lkaWNhLCB0aWVtcG8gdG90YWwgZGUgZXNwZXJhIHkgbml2ZWwgZGUgc2F0aXNmYWNjacOzbiBkZWwgcGFjaWVudGUuDQoNCkVsIGFuw6FsaXNpcyB2aXN1YWwgZXZpZGVuY2lhIHVuYSBwcmVkb21pbmFuY2lhIGRlIGV4cHJlc2lvbmVzIG5ldXRyYXMgYSBuZWdhdGl2YXMsIGxvIHF1ZSBzdWdpZXJlIHF1ZSB1bmEgcHJvcG9yY2nDs24gaW1wb3J0YW50ZSBkZSBsb3MgY2Fzb3MgYW5hbGl6YWRvcyBwcmVzZW50YSBjb21iaW5hY2lvbmVzIGRlIHZhcmlhYmxlcyBhc29jaWFkYXMgYSB0aWVtcG9zIGRlIGF0ZW5jacOzbiBlbGV2YWRvcyB5IG5pdmVsZXMgZGUgc2F0aXNmYWNjacOzbiBiYWpvcy4gTGFzIGNhcmFzIGNvbiByYXNnb3MgbcOhcyB0ZW5zb3MgbyBleHByZXNpb25lcyBtZW5vcyBmYXZvcmFibGVzIGNvcnJlc3BvbmRlbiBhIG9ic2VydmFjaW9uZXMgZW4gbGFzIHF1ZSBsb3MgdGllbXBvcyBkZSBlc3BlcmEgeSBhdGVuY2nDs24gc29uIG1heW9yZXMsIGxvIHF1ZSByZWZ1ZXJ6YSBsYSByZWxhY2nDs24gaW52ZXJzYSBwcmV2aWFtZW50ZSBpZGVudGlmaWNhZGEgZW50cmUgbGEgZHVyYWNpw7NuIGRlbCBwcm9jZXNvIGFzaXN0ZW5jaWFsIHkgbGEgcGVyY2VwY2nDs24gZGVsIHNlcnZpY2lvIHBvciBwYXJ0ZSBkZWwgcGFjaWVudGUuDQoNCkVuIGNvbmp1bnRvLCBsYXMgY2FyYXMgZGUgQ2hlcm5vZmYgcGVybWl0ZW4gZGV0ZWN0YXIgcGF0cm9uZXMgeSBjYXNvcyBhdMOtcGljb3MgZGUgbWFuZXJhIHLDoXBpZGEgeSBjb21wcmVuc2libGUsIGNvbXBsZW1lbnRhbmRvIGxvcyBhbsOhbGlzaXMgZXN0YWTDrXN0aWNvcyB5IGdyw6FmaWNvcyBwcmV2aW9zLiBFc3RhIHTDqWNuaWNhIHZpc3VhbCBjb25maXJtYSBsYSBuZWNlc2lkYWQgZGUgZW5mb2NhciBsYXMgZXN0cmF0ZWdpYXMgZGUgbWVqb3JhIGVuIGxhIHJlZHVjY2nDs24gZGUgbG9zIHRpZW1wb3MgY3LDrXRpY29zIGRlbCBwcm9jZXNvIGFzaXN0ZW5jaWFsLCBjb24gZWwgZmluIGRlIGF1bWVudGFyIGxhIHByb3BvcmNpw7NuIGRlIGV4cGVyaWVuY2lhcyBwb3NpdGl2YXMgeSBtZWpvcmFyIGxhIHNhdGlzZmFjY2nDs24gZ2xvYmFsIGRlIGxvcyBwYWNpZW50ZXMgYXRlbmRpZG9zIGVuIGxhIHNhbGEgZGUgdXJnZW5jaWFzLg0KDQpgYGB7ciBjYXJhc19kZV9DaGVybm9mZiwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpzZXQuc2VlZCgxMjA1MjIpDQp2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFfTXVlc3RyZWFkbyA9IHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMIFtzYW1wbGUoMTpucm93KHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMKSwyMyksLWMoMSwyLDMsNCw1LDYsNyw4LDEzLDE0KV0NCmZhY2VzKHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYV9NdWVzdHJlYWRvKQ0KDQpgYGANCg0KIyMjIDEuNS4gTm9ybWFsaWRhZCBtdWx0aXZhcmlhZGEgey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KRXMgcG9zaWJsZSBhbmFsaXphciBvIGRldGVybWluYXIgbGEgZGlzdHJpYnVjacOzbiBtdWx0aXZhcmlhZGEgZGUgdW4gY29uanVudG8gZGUgZGF0b3MgbWVkaWFudGUgbcOpdG9kb3MgZGVzY3JpcHRpdm9zLCBjb21vIGxvcyBncsOhZmljb3MsIG8gaW5mZXJlbmNpYWxlcywgY29tbyBsYXMgcHJ1ZWJhcyBlc3RhZMOtc3RpY2FzLiBNaWVudHJhcyBxdWUgbG9zIHByb2NlZGltaWVudG9zIGluZmVyZW5jaWFsZXMgcGVybWl0ZW4gb2J0ZW5lciBjb25jbHVzaW9uZXMgbcOhcyBnZW5lcmFsaXphYmxlcywgbG9zIGdyw6FmaWNvcyByZXN1bHRhbiDDunRpbGVzIGNvbW8gc29wb3J0ZSBwYXJhIGxhIGludGVycHJldGFjacOzbiBkZSBsb3MgcmVzdWx0YWRvcy4NCg0KRW4gZXN0ZSBhcGFydGFkbyBzZSBhYm9yZGEgbGEgYXBsaWNhY2nDs24gZGUgcHJvY2VkaW1pZW50b3MgaW5mZXJlbmNpYWxlcyBwYXJhIHZlcmlmaWNhciBzaSBlbCBjb25qdW50byBkZSBkYXRvcyBkZSB0cmFiYWpvLCByZXNwZWN0byBhIHN1cyB2YXJpYWJsZXMgbnVtw6lyaWNhcywgc2lndWUgdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIG11bHRpdmFyaWFkYSAoRE5NKS4gTGFzIHBydWViYXMgZGUgbm9ybWFsaWRhZCBtdWx0aXZhcmlhZGEgKFBOTSkgcXVlIHNlIGFwbGljYXLDoW4gc29uOiBNYXJkaWEsIEhlbnplLVppcmtsZXIsIERvb3JuaWstSGFuc2VuIHkgUm95c3Rvbi4gRXN0YXMgcHJ1ZWJhcyBkZSBub3JtYWxpZGFkIHNlIHJlYWxpemFuIGJham8gdW4gbml2ZWwgZGUgc2lnbmlmaWNhbmNpYSBkZXRlcm1pbmFkbyAkXGFscGhhID0gMC4wNSQgeSBhIGxhcyBoaXDDs3Rlc2lzOiQkSF8wOiBcdGV4dCB7TGFzIHZhcmlhYmxlcyB0aWVuZW4gdW5hIEROTX0kJCAkJEhfMTogXHRleHQge0xhcyB2YXJpYWJsZXMgTk8gdGllbmVuIHVuYSBETk19JCQgDQoNCkxhICoqcHJ1ZWJhIGRlIE1hcmRpYSoqIHNlIGZ1bmRhbWVudGEgZW4gbGFzIGV4dGVuc2lvbmVzIGRlIGFzaW1ldHLDrWEgeSBjdXJ0b3NpcywgZWwgY3VhZHJhZG8gZGUgbGEgZGlzdGFuY2lhIGRlIE1haGFsYW5vYmlzLCBlbCBuw7ptZXJvIGRlIHZhcmlhYmxlcyAkcCQgYSBhbmFsaXphciB5IGVsIG7Dum1lcm8gZGUgcmVnaXN0cm9zICRuJC4gQXNpbWlzbW8sIHNlIGNvbnNpZGVyYSBxdWUgbGEgZXN0YWTDrXN0aWNhIGRlIGxhIHBydWViYSBwYXJhIGxhIGFzaW1ldHLDrWEgc2lndWUgdW5hIGRpc3RyaWJ1Y2nDs24gJFxjaGleMiQsIG1pZW50cmFzIHF1ZSBsYSBlc3RhZMOtc3RpY2EgcGFyYSBsYSBjdXJ0b3NpcyBzZSBkaXN0cmlidXllIGRlIG1hbmVyYSBhcHJveGltYWRhIGRlIGZvcm1hIG5vcm1hbC4gDQoNCkxhICoqcHJ1ZWJhIGRlIEhlbnplLVppcmtsZXIqKiBzZSBiYXNhIGVuIGxhIGRpc3RhbmNpYSBmdW5jaW9uYWwsIHlhIHF1ZSBzaSBlbCBjb25qdW50byBkZSBkYXRvcyBzaWd1ZSB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwgbXVsdGl2YXJpYWRhLCBlbCBlc3RhZMOtc3RpY28gZGUgbGEgcHJ1ZWJhIHNlIGRpc3RyaWJ1eWUgZGUgbWFuZXJhIGFwcm94aW1hZGEgY29tbyB1bmEgbG9nbm9ybWFsLCBjb24gcGFyw6FtZXRyb3MgZGUgbWVkaWEgJFxtdSQgeSB2YXJpYW56YSAkXHNpZ21hXjIkLiANCg0KTGEgKipwcnVlYmEgZGUgRG9vcm5pay1IYW5zZW4qKiBzZSBiYXNhIGVuIGxhIGFzaW1ldHLDrWEgeSBsYSBjdXJ0b3NpcyBkZSB1biBjb25qdW50byBkZSBkYXRvcyBtdWx0aXZhcmlhZG9zLCBsb3MgY3VhbGVzIHNlIHRyYW5zZm9ybWFuIHBhcmEgYXNlZ3VyYXIgbGEgaW5kZXBlbmRlbmNpYS4gU2UgY29uc2lkZXJhIG3DoXMgcG90ZW50ZSBxdWUgbGEgcHJ1ZWJhIGRlIFNoYXBpcm8tV2lsayBlbiBjYXNvcyBtdWx0aXZhcmlhZG9zLiBFbCBlc3RhZMOtc3RpY28gZGUgbGEgcHJ1ZWJhIHNlIGRlZmluZSBjb21vIGxhIHN1bWEgZGUgbGFzIHRyYW5zZm9ybWFjaW9uZXMgYWwgY3VhZHJhZG8gZGUgbGEgYXNpbWV0csOtYSB5IGxhIGN1cnRvc2lzLCB5IHNpZ3VlIGFwcm94aW1hZGFtZW50ZSB1bmEgZGlzdHJpYnVjacOzbiAkXGNoaV4yJC4gDQoNClBvciBvdHJvIGxhZG8sIGxhIHBydWViYSBkZSBSb3lzdG9uIHV0aWxpemEgbGFzICoqcHJ1ZWJhcyBkZSBTaGFwaXJvLVdpbGsgbyBTaGFwaXJvLUZyYW5jaWEqKiBwYXJhIGV2YWx1YXIgbGEgbm9ybWFsaWRhZCBtdWx0aXZhcmlhZGEuIFNpIGxhIGN1cnRvc2lzIGVzIG1heW9yIHF1ZSAzLCBzZSBlbXBsZWEgU2hhcGlyby1GcmFuY2lhIHBhcmEgZGlzdHJpYnVjaW9uZXMgbGVwdG9jw7pydGljYXMsIG1pZW50cmFzIHF1ZSBwYXJhIGRpc3RyaWJ1Y2lvbmVzIHBsYXRpY8O6cnRpY2FzIHNlIHV0aWxpemEgU2hhcGlyby1XaWxrLiBMb3MgcGFyw6FtZXRyb3MgZW4gZXN0YSBwcnVlYmEgc2Ugb2J0aWVuZW4gbWVkaWFudGUgYXByb3hpbWFjaW9uZXMgcG9saW5vbWlhbGVzLg0KDQojIyMjIFBOTSBNYXJkaWENCg0KQSBwYXJ0aXIgZGUgbG9zIHJlc3VsdGFkb3MgZGVsIHRlc3QgZGUgbm9ybWFsaWRhZCBtdWx0aXZhcmlhZGEgZGUgTWFyZGlhIChQTk0pIHkgZGUgbGFzIHBydWViYXMgZGUgbm9ybWFsaWRhZCB1bml2YXJpYWRhIGRlIFNoYXBpcm8tV2lsaywgc2UgZXZhbMO6YSBlbCBzdXB1ZXN0byBkZSBub3JtYWxpZGFkIGRlIGxhcyB2YXJpYWJsZXMgYXNvY2lhZGFzIGEgbG9zIHRpZW1wb3MgZGVsIHByb2Nlc28gYXNpc3RlbmNpYWwgZW4gbGEgc2FsYSBkZSB1cmdlbmNpYXMuIEVuIHByaW1lciBsdWdhciwgZWwgdGVzdCBkZSBNYXJkaWEgZXZpZGVuY2lhIHZhbG9yZXMgZXh0cmVtYWRhbWVudGUgZWxldmFkb3MgdGFudG8gZW4gZWwgZXN0YWTDrXN0aWNvIGRlIGFzaW1ldHLDrWEgKFNrZXduZXNzID0gMTczOTksNjIpIGNvbW8gZGUgY3VydG9zaXMgKEt1cnRvc2lzID0gOTAsMjcpLCBjb24gdmFsb3JlcyBwIHByw6FjdGljYW1lbnRlIG51bG9zLiBFc3RvcyByZXN1bHRhZG9zIGNvbmR1Y2VuIGFsIHJlY2hhem8gZGUgbGEgaGlww7N0ZXNpcyBudWxhIGRlIG5vcm1hbGlkYWQgbXVsdGl2YXJpYWRhLCBpbmRpY2FuZG8gcXVlIGVsIGNvbmp1bnRvIGRlIHZhcmlhYmxlcyBhbmFsaXphZGFzIG5vIHNpZ3VlIHVuYSBkaXN0cmlidWNpw7NuIG5vcm1hbCBjb25qdW50YS4NCg0KRW4gY29uanVudG8sIGVzdG9zIHJlc3VsdGFkb3MgY29uZmlybWFuIHF1ZSBsb3MgdGllbXBvcyBkZWwgcHJvY2VzbyBhc2lzdGVuY2lhbCBwcmVzZW50YW4gZGlzdHJpYnVjaW9uZXMgbm8gbm9ybWFsZXMsIGNhcmFjdGVyaXphZGFzIHBvciB1bmEgZnVlcnRlIGFzaW1ldHLDrWEgcG9zaXRpdmEgeSBhbHRhIHZhcmlhYmlsaWRhZC4gRXN0YSBzaXR1YWNpw7NuIGVzIGNvaGVyZW50ZSBjb24gbGEgbmF0dXJhbGV6YSBkZWwgc2VydmljaW8gZGUgdXJnZW5jaWFzLCBkb25kZSBsYSBvY3VycmVuY2lhIGRlIGV2ZW50b3MgZXh0cmVtb3MgeSBwZXJpb2RvcyBkZSBjb25nZXN0acOzbiBnZW5lcmEgdmFsb3JlcyBhdMOtcGljb3MgeSBjb2xhcyBsYXJnYXMuIERlc2RlIGVsIHB1bnRvIGRlIHZpc3RhIG1ldG9kb2zDs2dpY28sIGVzdG9zIGhhbGxhemdvcyBqdXN0aWZpY2FuIGVsIHVzbyBkZSB0w6ljbmljYXMgZXN0YWTDrXN0aWNhcyBubyBwYXJhbcOpdHJpY2FzLCB0cmFuc2Zvcm1hY2lvbmVzIGRlIGRhdG9zIG8gbcOpdG9kb3Mgcm9idXN0b3MgcGFyYSBhbsOhbGlzaXMgcG9zdGVyaW9yZXMsIGV2aXRhbmRvIHN1cHVlc3RvcyBkZSBub3JtYWxpZGFkIHF1ZSBubyBzZSBjdW1wbGVuIHkgZ2FyYW50aXphbmRvIGNvbmNsdXNpb25lcyBtw6FzIGNvbmZpYWJsZXMgc29icmUgZWwgZGVzZW1wZcOxbyBkZWwgc2VydmljaW8uDQoNCmBgYHtyIFBOTV9NYXJkaWEsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0Kc2V0LnNlZWQoMTIzKSAgIyByZXByb2R1Y2liaWxpZGFkDQoNCmRhdG9zX3BubSA8LSB2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCB8Pg0KICBkcGx5cjo6c2VsZWN0KC1jKDEsMiwzLDQsNSw2LDcsOCwxMywxNCkpIHw+DQogIGRwbHlyOjpzbGljZV9zYW1wbGUobiA9IDEwMDApDQoNCm1hcmRpYShkYXRvc19wbm0pDQpgYGANCg0KIyMjIyBQTk0gSGVuemUtWmlya2xlci4NCmBgYHtyIFBOTV9IZW56ZV9aaXJrbGVyLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCnNldC5zZWVkKDEyMykgICMgcmVwcm9kdWNpYmlsaWRhZA0KDQpkYXRvc19wbm0gPC0gdmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVEwgfD4NCiAgZHBseXI6OnNlbGVjdCgtYygxLDIsMyw0LDUsNiw3LDgsMTMsMTQpKSB8Pg0KICBkcGx5cjo6c2xpY2Vfc2FtcGxlKG4gPSAxMDAwKQ0KDQptaHooZGF0b3NfcG5tKQ0KYGBgDQoNCiMjIyMgUE5NIERvb3JuaWstSGFuc2VuDQpgYGB7ciBQTk1fRG9vcm5pa19IYW5zZW4sIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0Kc2V0LnNlZWQoMTIzKSAgIyByZXByb2R1Y2liaWxpZGFkDQoNCmRhdG9zX3BubSA8LSB2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCB8Pg0KICBkcGx5cjo6c2VsZWN0KC1jKDEsMiwzLDQsNSw2LDcsOCwxMywxNCkpIHw+DQogIGRwbHlyOjpzbGljZV9zYW1wbGUobiA9IDEwMDApDQptc2soZGF0b3NfcG5tKQ0KYGBgDQoNCjxhIG5hbWU9InNlYzIiPjwvYT4NCg0KIyMgKipGYXNlIDIgW0NvbXBvbmVudGVzIFByaW5jaXBhbGVzXSoqDQoNCkVuIGVzdGEgKipzZWd1bmRhIGV0YXBhKiogZGVsIGVzdHVkaW8sIHNlIHByZXNlbnRhcsOhbiBjw6FsY3Vsb3MsIHZpc3VhbGl6YWNpb25lcyBlIGludGVycHJldGFjaW9uZXMgYmFzYWRhcyBlbiBlbCBjb25qdW50byBkZSBkYXRvcyBhbmFsaXphZG8gcHJldmlhbWVudGUgZW4gbGEgW0Zhc2UgMV0oI3NlYzEpLiBBaG9yYSwgZWwgZW5mb3F1ZSBzZSBjZW50cmFyw6EgZW4gZWwgYW7DoWxpc2lzIGRlIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzIChBQ1ApIGFwbGljYWRvIGEgbGFzIHZhcmlhYmxlcyBjdWFudGl0YXRpdmFzLCBpbmNsdXllbmRvIGFzcGVjdG9zIGNvbW8gbGEgc2VsZWNjacOzbiBkZSBjb21wb25lbnRlcywgY2FsaWRhZCBkZSByZXByZXNlbnRhY2nDs24sIGNvbnRyaWJ1Y2lvbmVzIHkgc3UgaW50ZXJwcmV0YWNpw7NuLg0KDQojIyMgMi4xLiBPYmpldGl2b3MNCg0KRWwgKipBQ1AqKiBzZSBsb2dyYSBhIGxvIGxhcmdvIGRlIGxhcyBzaWd1aWVudGVzIGZhc2VzOiBnZW5lcmFjacOzbiBkZSBudWV2YXMgdmFyaWFibGVzLCByZWR1Y2Npw7NuIGRpbWVuc2lvbmFsIGRlbCBlc3BhY2lvIGRlIGxvcyBkYXRvcywgZWxpbWluYWNpw7NuIGRlIHZhcmlhYmxlcyBkZSBwb2NvIGFwb3J0ZSBlIGludGVycHJldGFjacOzbiBkZSBsb3MgY29tcG9uZW50ZXMgcmVzdWx0YW50ZXMgZW4gZWwgY29udGV4dG8gZGVsIHByb2JsZW1hIGRlbCBjdWFsIHNlIG9idHV2aWVyb24gbG9zIGRhdG8uDQoNCkVzdGltYWRvIGxlY3Rvciwgc2kgZGVzZWEgZXhwbG9yYXIgbG9zIGZ1bmRhbWVudG9zIGRlIGVzdGUgYW7DoWxpc2lzIGNvbiBtYXlvciBwcm9mdW5kaWRhZC4gTG9zIGRldGFsbGVzIGRlbCBjb25qdW50byBkZSBkYXRvcyBzZSBlbmN1ZW50cmFuIGRlc2NyaXRvcyBlbiBsYSBbU2VjY2nDs24gMS4yXSgjc2VjMS4yKSwgbWllbnRyYXMgcXVlIGxvcyBwcmluY2lwaW9zIHRlw7NyaWNvcyBxdWUgc3VzdGVudGFuIGVzdGUgZXN0dWRpbyBlc3TDoW4gY3VpZGFkb3NhbWVudGUgZGVzYXJyb2xsYWRvcyBlbiBsYSBkZW5vbWluYWRhIFtGYXNlIDFdKCNzZWMxKS4gVW5hIGxlY3R1cmEgZGV0ZW5pZGEgZGUgZXN0YXMgc2VjY2lvbmVzIGVucmlxdWVjZXLDoSBzdSBjb21wcmVuc2nDs24geSBhcHJlY2lhY2nDs24gZGVsIHRyYWJham8gcHJlc2VudGFkby4NCg0KIyMjIDIuMi4gU2VsZWNjacOzbiBkZSBDb21wb25lbnRlcyB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQpDb21vIHNlw7FhbGFuIETDrWF6IE1vcmFsZXMgeSBNb3JhbGVzIFJpdmVyYSAoMjAxMiksIGVsIEFuw6FsaXNpcyBkZSBDb21wb25lbnRlcyBQcmluY2lwYWxlcyAqKihBQ1ApKiogcGVybWl0ZSByZW9yZ2FuaXphciB1biBjb25qdW50byBkZSBkYXRvcyBtdWx0aXZhcmlhZG8gYWwgcmVkdWNpciBlbCBuw7ptZXJvIGRlIHZhcmlhYmxlcywgc2luIHJlcXVlcmlyIHN1cG9zaWNpb25lcyBlc3BlY8OtZmljYXMgc29icmUgbGEgZGlzdHJpYnVjacOzbiBkZSBwcm9iYWJpbGlkYWQgZGUgZXN0YXMuIEVzdGEgcmVkdWNjacOzbiBzZSBhbGNhbnphIG1lZGlhbnRlIGxhIGNyZWFjacOzbiBkZSBjb21iaW5hY2lvbmVzIGxpbmVhbGVzIGRlIGxhcyB2YXJpYWJsZXMgb3JpZ2luYWxlcywgZGlzZcOxYWRhcyBwYXJhIGNhcHRhciBsYSBtYXlvciB2YXJpYWJpbGlkYWQgcG9zaWJsZSBlbiBsb3MgZGF0b3MuIERlIGVzdGUgbW9kbywgZWwgKipBQ1AqKiBnZW5lcmEgbnVldmFzIHZhcmlhYmxlcywgZGVub21pbmFkYXMgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMsIHF1ZSBwcmVzZW50YW4gaW5kZXBlbmRlbmNpYSBlc3RhZMOtc3RpY2EgeSBhdXNlbmNpYSBkZSBjb3JyZWxhY2nDs24sIHNpZW1wcmUgYmFqbyBlbCBzdXB1ZXN0byBkZSBub3JtYWxpZGFkLg0KDQojIyMjIE1hdHJpeiBBQ1ANCg0KQSBwYXJ0aXIgZGUgbG9zIHJlc3VsdGFkb3MgZGUgbGEgbWF0cml6IGRlbCBBbsOhbGlzaXMgZGUgQ29tcG9uZW50ZXMgUHJpbmNpcGFsZXMgKEFDUCksIHNlIG9ic2VydmEgcXVlIGxhIGVzdHJ1Y3R1cmEgZGUgbGEgdmFyaWFiaWxpZGFkIGRlIGxvcyBkYXRvcyBlc3TDoSBhbHRhbWVudGUgY29uY2VudHJhZGEgZW4gbG9zIHByaW1lcm9zIGNvbXBvbmVudGVzLiBFbCBwcmltZXIgY29tcG9uZW50ZSBwcmluY2lwYWwgKERpbS4gMSkgcHJlc2VudGEgdW4gdmFsb3IgcHJvcGlvIGRlIDMsNzMsIGV4cGxpY2FuZG8gYXByb3hpbWFkYW1lbnRlIGVsIDkzLDMzICUgZGUgbGEgdmFyaWFuemEgdG90YWwsIGxvIHF1ZSBpbmRpY2EgcXVlIHVuYSBzb2xhIGRpbWVuc2nDs24gcmVzdW1lIGRlIG1hbmVyYSBtdXkgZWZpY2llbnRlIGxhIG1heW9yIHBhcnRlIGRlIGxhIGluZm9ybWFjacOzbiBjb250ZW5pZGEgZW4gbGFzIHZhcmlhYmxlcyBhbmFsaXphZGFzLiBFc3RlIHJlc3VsdGFkbyBzdWdpZXJlIHVuYSBmdWVydGUgaW50ZXJkZXBlbmRlbmNpYSBlbnRyZSBsb3MgaW5kaWNhZG9yZXMgZGVsIHByb2Nlc28gYXNpc3RlbmNpYWwsIGVzcGVjaWFsbWVudGUgbG9zIHJlbGFjaW9uYWRvcyBjb24gbG9zIHRpZW1wb3MgZGUgYXRlbmNpw7NuLg0KDQpFbCBzZWd1bmRvIGNvbXBvbmVudGUgcHJpbmNpcGFsIChEaW0uIDIpIGV4cGxpY2EgdW4gMyw2NCAlIGFkaWNpb25hbCBkZSBsYSB2YXJpYW56YSwgZWxldmFuZG8gbGEgdmFyaWFuemEgYWN1bXVsYWRhIGFsIDk2LDk2ICUsIGxvIHF1ZSBpbmRpY2EgcXVlIHN1IGFwb3J0ZSBlcyBtYXJnaW5hbCBlbiBjb21wYXJhY2nDs24gY29uIGVsIHByaW1lciBjb21wb25lbnRlLCBhdW5xdWUgcHVlZGUgY2FwdHVyYXIgbWF0aWNlcyBzZWN1bmRhcmlvcyBvIHZhcmlhY2lvbmVzIGVzcGVjw61maWNhcyBubyBleHBsaWNhZGFzIGNvbXBsZXRhbWVudGUgcG9yIGxhIHByaW1lcmEgZGltZW5zacOzbi4gRWwgdGVyY2VyIGNvbXBvbmVudGUgKERpbS4gMykgYXBvcnRhIGFwZW5hcyB1biAzLDA0ICUsIGFsY2FuemFuZG8gZWwgMTAwICUgZGUgbGEgdmFyaWFuemEgYWN1bXVsYWRhLCBtaWVudHJhcyBxdWUgZWwgY3VhcnRvIGNvbXBvbmVudGUgcHJlc2VudGEgdW4gdmFsb3IgcHJvcGlvIHByw6FjdGljYW1lbnRlIG51bG8sIGxvIHF1ZSBjb25maXJtYSBzdSBpcnJlbGV2YW5jaWEgZGVzZGUgZWwgcHVudG8gZGUgdmlzdGEgZXhwbGljYXRpdm8uDQoNCkVuIGNvbmp1bnRvLCBlc3RvcyByZXN1bHRhZG9zIGV2aWRlbmNpYW4gcXVlIGVsIHNpc3RlbWEgYW5hbGl6YWRvIHBvc2VlIHVuYSBlc3RydWN0dXJhIGVzZW5jaWFsbWVudGUgdW5pZGltZW5zaW9uYWwsIGRvbmRlIGxhIG1heW9yIHBhcnRlIGRlIGxhIHZhcmlhYmlsaWRhZCBwdWVkZSBzZXIgcmVwcmVzZW50YWRhIHBvciB1bm8gbywgYSBsbyBzdW1vLCBkb3MgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMuIERlc2RlIHVuYSBwZXJzcGVjdGl2YSBhcGxpY2FkYSwgZXN0byBwZXJtaXRlIHJlZHVjaXIgc2lnbmlmaWNhdGl2YW1lbnRlIGxhIGRpbWVuc2lvbmFsaWRhZCBkZWwgcHJvYmxlbWEgc2luIHDDqXJkaWRhIHN1c3RhbmNpYWwgZGUgaW5mb3JtYWNpw7NuLCBmYWNpbGl0YW5kbyBsYSBpbnRlcnByZXRhY2nDs24sIHZpc3VhbGl6YWNpw7NuIHkgbW9kZWxhY2nDs24gZGUgbG9zIGRhdG9zLiBBc2ltaXNtbywgZWwgZG9taW5pbyBkZWwgcHJpbWVyIGNvbXBvbmVudGUgc3VnaWVyZSBxdWUgbG9zIHRpZW1wb3MgZGVsIHByb2Nlc28gYXNpc3RlbmNpYWwgc2UgbXVldmVuIGRlIG1hbmVyYSBjb25qdW50YSwgcmVmb3J6YW5kbyBsb3MgaGFsbGF6Z29zIHByZXZpb3Mgc29icmUgbGEgZnVlcnRlIGNvcnJlbGFjacOzbiBleGlzdGVudGUgZW50cmUgZXN0YXMgdmFyaWFibGVzIGVuIGVsIHNlcnZpY2lvIGRlIHVyZ2VuY2lhcy4NCg0KYGBge3IgTWF0cml6X0FDUCwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpnZXRfZWlnZW52YWx1ZShQQ0EodmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVExbLC1jKDEsMiwzLDQsNSw2LDcsOCwxMywxNCldLCBuY3AgPSA2LCBzY2FsZS51bml0ID0gVFJVRSwgZ3JhcGggPSBGKSkNCmBgYA0KDQojIyMjIE1hdHJpeiBkZSBDb3JyZWxhY2lvbmVzDQpgYGB7ciBNYXRyaXpfZGVfQ29ycmVsYWNpb25lc19BQ1B9DQpyb3VuZChjb3IodmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVExbLC1jKDEsMiwzLDQsNSw2LDcsOCwxMywxNCldKSwyKQ0KYGBgDQoNCiMjIyMgVmFsb3JlcyB5IFZlY3RvcmVzIFByb3Bpb3MNCg0KQSBwYXJ0aXIgZGUgbG9zIHZhbG9yZXMgeSB2ZWN0b3JlcyBwcm9waW9zIG9idGVuaWRvcyBkZWwgQW7DoWxpc2lzIGRlIENvbXBvbmVudGVzIFByaW5jaXBhbGVzIChBQ1ApLCBzZSBwcm9mdW5kaXphIGVuIGxhIGludGVycHJldGFjacOzbiBkZSBsYSBlc3RydWN0dXJhIGludGVybmEgZGUgbGFzIHZhcmlhYmxlcyBhc29jaWFkYXMgYSBsb3MgdGllbXBvcyBkZWwgcHJvY2VzbyBhc2lzdGVuY2lhbCBlbiBsYSBzYWxhIGRlIHVyZ2VuY2lhcy4gTG9zIHZhbG9yZXMgcHJvcGlvcyBtdWVzdHJhbiBxdWUgZWwgcHJpbWVyIGNvbXBvbmVudGUgcHJpbmNpcGFsIChDb21wLiAxKSBwcmVzZW50YSB1bmEgdmFyaWFuemEgZGUgMyw3MywgY29uY2VudHJhbmRvIGxhIG1heW9yIHBhcnRlIGRlIGxhIGluZm9ybWFjacOzbiBkZWwgc2lzdGVtYSwgbWllbnRyYXMgcXVlIGVsIHNlZ3VuZG8gKDAsMTUpIHkgdGVyY2VyIGNvbXBvbmVudGUgKDAsMTIpIGFwb3J0YW4gdW5hIHByb3BvcmNpw7NuIHNpZ25pZmljYXRpdmFtZW50ZSBtZW5vci4gRWwgY3VhcnRvIGNvbXBvbmVudGUsIGNvbiB2YWxvciBwcm9waW8gbnVsbywgbm8gY29udHJpYnV5ZSBhIGxhIGV4cGxpY2FjacOzbiBkZSBsYSB2YXJpYWJpbGlkYWQsIGxvIHF1ZSBjb25maXJtYSBxdWUgbGEgZGltZW5zaW9uYWxpZGFkIGVmZWN0aXZhIGRlbCBjb25qdW50byBkZSBkYXRvcyBlcyByZWR1Y2lkYS4NCg0KRWwgcHJpbWVyIGNvbXBvbmVudGUgcHJpbmNpcGFsIHByZXNlbnRhIGNhcmdhcyBwb3NpdGl2YXMgeSBkZSBtYWduaXR1ZCBzaW1pbGFyIHBhcmEgdG9kYXMgbGFzIHZhcmlhYmxlczogdGllbXBvIGRlIHJlZ2lzdHJvICgwLDQ5KSwgdGllbXBvIGRlIHRyaWFnZSAoMCw0OSksIHRpZW1wbyBkZSBhdGVuY2nDs24gcHJvZmVzaW9uYWwgbcOpZGljYSAoMCw1MCkgeSB0aWVtcG8gdG90YWwgZGUgZXNwZXJhICgwLDUyKS4gRXN0ZSBwYXRyw7NuIGluZGljYSBxdWUgZWwgcHJpbWVyIGNvbXBvbmVudGUgcmVwcmVzZW50YSB1biBmYWN0b3IgZ2xvYmFsIGRlIGR1cmFjacOzbiBkZWwgcHJvY2VzbyBhc2lzdGVuY2lhbCwgZW4gZWwgY3VhbCB0b2RhcyBsYXMgZXRhcGFzIGRlbCBzZXJ2aWNpbyBjb250cmlidXllbiBkZSBtYW5lcmEgY29uanVudGEuIEVsIHNlZ3VuZG8gY29tcG9uZW50ZSBwcmluY2lwYWwgZXN0w6EgZG9taW5hZG8gcG9yIHVuYSBjYXJnYSBwb3NpdGl2YSBhbHRhIGRlbCB0aWVtcG8gZGUgcmVnaXN0cm8gKDAsNzcpIHkgdW5hIGNhcmdhIG5lZ2F0aXZhIG1hcmNhZGEgZGVsIHRpZW1wbyBkZSB0cmlhZ2UgKC0wLDYyKSwgbG8gcXVlIHN1Z2llcmUgdW4gY29udHJhc3RlIGVudHJlIGxhcyBmYXNlcyBpbmljaWFsZXMgZGVsIHByb2Nlc28uIEVzdGUgY29tcG9uZW50ZSBjYXB0dXJhIGRpZmVyZW5jaWFzIGVuIGxhIGVmaWNpZW5jaWEgcmVsYXRpdmEgZW50cmUgZWwgcmVnaXN0cm8gYWRtaW5pc3RyYXRpdm8geSBsYSBjbGFzaWZpY2FjacOzbiBjbMOtbmljYSBkZWwgcGFjaWVudGUuIFBvciBzdSBwYXJ0ZSwgZWwgdGVyY2VyIGNvbXBvbmVudGUgbXVlc3RyYSB1bmEgb3Bvc2ljacOzbiBjbGFyYSBlbnRyZSBlbCB0aWVtcG8gZGUgdHJpYWdlICgwLDUyKSB5IGVsIHRpZW1wbyBkZSBhdGVuY2nDs24gcHJvZmVzaW9uYWwgbcOpZGljYSAoLTAsNzUpLCByZWZsZWphbmRvIHZhcmlhY2lvbmVzIGVuIGxhIHRyYW5zaWNpw7NuIGVudHJlIGxhIHByaW9yaXphY2nDs24gY2zDrW5pY2EgeSBsYSBhdGVuY2nDs24gbcOpZGljYSBwcm9waWFtZW50ZSBkaWNoYS4gRmluYWxtZW50ZSwgYXVucXVlIGVsIGN1YXJ0byBjb21wb25lbnRlIHByZXNlbnRhIGFsZ3VuYXMgY2FyZ2FzIGVsZXZhZGFzLCBlc3BlY2lhbG1lbnRlIGVuIGVsIHRpZW1wbyB0b3RhbCBkZSBlc3BlcmEgKC0wLDg0KSwgc3UgdmFsb3IgcHJvcGlvIGNlcmNhbm8gYSBjZXJvIGluZGljYSBxdWUgc3UgYXBvcnRlIGVzIGVzdGFkw61zdGljYW1lbnRlIGlycmVsZXZhbnRlIHkgbm8gZGViZSBjb25zaWRlcmFyc2UgZW4gbGEgaW50ZXJwcmV0YWNpw7NuLiANCg0KRW4gY29uanVudG8sIGVzdG9zIHJlc3VsdGFkb3MgY29uZmlybWFuIHF1ZSBsb3MgdGllbXBvcyBkZWwgcHJvY2VzbyBhc2lzdGVuY2lhbCBlc3TDoW4gZnVlcnRlbWVudGUgaW50ZXJyZWxhY2lvbmFkb3MgeSBxdWUgbGEgbWF5b3IgcGFydGUgZGUgc3UgdmFyaWFiaWxpZGFkIHB1ZWRlIHJlc3VtaXJzZSBlbiB1biBmYWN0b3IgcHJpbmNpcGFsIGRlIGR1cmFjacOzbiBnbG9iYWwsIGNvbXBsZW1lbnRhZG8gcG9yIGNvbXBvbmVudGVzIHNlY3VuZGFyaW9zIHF1ZSByZWZsZWphbiBkZXNiYWxhbmNlcyBlc3BlY8OtZmljb3MgZW50cmUgbGFzIGRpc3RpbnRhcyBldGFwYXMgZGVsIHNlcnZpY2lvIGRlIHVyZ2VuY2lhcy4NCg0KYGBge3IgVmFsb3Jlc195X1ZlY3RvcmVzX1Byb3Bpb3MsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KcHJpbmNvbXAodmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVExbLC1jKDEsMiwzLDQsNSw2LDcsOCwxMywxNCldLCBjb3IgPSBUUlVFKSRzZGV2XjINCnByaW5jb21wKHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMWywtYygxLDIsMyw0LDUsNiw3LDgsMTMsMTQpXSwgY29yID0gVFJVRSkkbG9hZGluZ3NbICwxOjRdDQpgYGANCg0KIyMjIyBDb3JyZWxhY2lvbmVzIENvbXBhcmFkYXMNCmBgYHtyIENvcnJlbGFjaW9uZXNfQ29tcGFyYWRhcywgZmlnLmFsaWduPSdjZW50ZXInLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDZ9DQoNCnBhcihtZnJvdyA9IGMoMSwyKSwNCiAgbWFyID0gYyg2LCA2LCAzLCAyKQ0KKQ0KDQpjb3JycGxvdDo6Y29ycnBsb3QoY29yKHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMWywgLWMoMSwyLDMsNCw1LDYsNyw4LDEzLDE0KV0pLCBtZXRob2QgPSAiY29sb3IiLA0KICB0eXBlID0gInVwcGVyIiwgbnVtYmVyLmNleCA9IDAuMjUsIHRsLmNleCA9IDAuNywgdGwuc3J0ID0gNDUpDQpjb3JycGxvdDo6Y29ycnBsb3QoY29yKHByaW5jb21wKHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMWywgLWMoMSwyLDMsNCw1LDYsNyw4LDEzLDE0KV0sIGNvciA9IFRSVUUpJHNjb3JlcyksIG1ldGhvZCA9ICJjb2xvciIsIHR5cGUgPSAidXBwZXIiLCBudW1iZXIuY2V4ID0gMC4yNSwgdGwuY2V4ID0gMC44KQ0KYGBgDQoNCiMjIyMgR3LDoWZpY28gZGUgQ2F0dGVsbA0KDQpFbCBncsOhZmljbyBkZSBDYXR0ZWxsIChzY3JlZSBwbG90KSBwZXJtaXRlIGV2YWx1YXIgdmlzdWFsbWVudGUgbGEgY29udHJpYnVjacOzbiBkZSBjYWRhIGNvbXBvbmVudGUgcHJpbmNpcGFsIGVuIGxhIGV4cGxpY2FjacOzbiBkZSBsYSB2YXJpYWJpbGlkYWQgdG90YWwgZGUgbG9zIGRhdG9zIGNvcnJlc3BvbmRpZW50ZXMgYSBsb3MgdGllbXBvcyBkZWwgcHJvY2VzbyBhc2lzdGVuY2lhbCBlbiBsYSBzYWxhIGRlIHVyZ2VuY2lhcy4gRW4gZWwgZ3LDoWZpY28gc2Ugb2JzZXJ2YSBjbGFyYW1lbnRlIHF1ZSBlbCBwcmltZXIgY29tcG9uZW50ZSBwcmluY2lwYWwgY29uY2VudHJhIGxhIG1heW9yIHByb3BvcmNpw7NuIGRlIHZhcmlhbnphIGV4cGxpY2FkYSwgY2VyY2FuYSBhbCA5MyAlLCBsbyBxdWUgY29uZmlybWEgc3UgcHJlZG9taW5pbyBhYnNvbHV0byBlbiBsYSBlc3RydWN0dXJhIGRlbCBjb25qdW50byBkZSBkYXRvcy4gRXN0ZSByZXN1bHRhZG8gaW5kaWNhIHF1ZSB1bmEgc29sYSBkaW1lbnNpw7NuIGVzIGNhcGF6IGRlIHJlc3VtaXIgY2FzaSB0b2RhIGxhIGluZm9ybWFjacOzbiByZWxldmFudGUgY29udGVuaWRhIGVuIGxhcyB2YXJpYWJsZXMgYW5hbGl6YWRhcy4NCg0KQSBwYXJ0aXIgZGVsIHNlZ3VuZG8gY29tcG9uZW50ZSwgbGEgdmFyaWFuemEgZXhwbGljYWRhIGRpc21pbnV5ZSBkZSBtYW5lcmEgYWJydXB0YSwgc2l0dcOhbmRvc2UgYWxyZWRlZG9yIGRlbCAzLDYgJSwgc2VndWlkYSBwb3IgZWwgdGVyY2VyIGNvbXBvbmVudGUsIHF1ZSBhcG9ydGEgYXByb3hpbWFkYW1lbnRlIHVuIDMgJSwgbWllbnRyYXMgcXVlIGVsIGN1YXJ0byBjb21wb25lbnRlIHByZXNlbnRhIHVuYSBjb250cmlidWNpw7NuIHByw6FjdGljYW1lbnRlIG51bGEuIEVzdGEgY2HDrWRhIHByb251bmNpYWRhIGdlbmVyYSB1biDigJxjb2Rv4oCdIGNsYXJhbWVudGUgZGVmaW5pZG8gZGVzcHXDqXMgZGVsIHByaW1lciBjb21wb25lbnRlLCBjcml0ZXJpbyBjbMOhc2ljbyB1dGlsaXphZG8gcGFyYSBkZXRlcm1pbmFyIGVsIG7Dum1lcm8gw7NwdGltbyBkZSBjb21wb25lbnRlcyBhIHJldGVuZXIgZW4gdW4gQW7DoWxpc2lzIGRlIENvbXBvbmVudGVzIFByaW5jaXBhbGVzLg0KDQpFbiB0w6lybWlub3MgaW50ZXJwcmV0YXRpdm9zLCBlbCBncsOhZmljbyBkZSBDYXR0ZWxsIHJlZnVlcnphIGxvcyByZXN1bHRhZG9zIG9idGVuaWRvcyBwcmV2aWFtZW50ZSBhIHBhcnRpciBkZSBsb3MgdmFsb3JlcyBwcm9waW9zIHkgbGEgdmFyaWFuemEgYWN1bXVsYWRhLCBjb25maXJtYW5kbyBxdWUgZWwgc2lzdGVtYSBhbmFsaXphZG8gcG9zZWUgdW5hIGVzdHJ1Y3R1cmEgZXNlbmNpYWxtZW50ZSB1bmlkaW1lbnNpb25hbC4gDQoNCmBgYHtyIEdyYWZpY29fZGVfQ2F0dGVsbCwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpmdml6X2VpZyhQQ0EodmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVExbLC1jKDEsMiwzLDQsNSw2LDcsOCwxMywxNCldLCBzY2FsZS51bml0ID0gVCwgZ3JhcGggPSBGKSwgYWRkbGFiZWxzID0gVCwgeWxpbT1jKDAsOTApLCBtYWluID0gIiIpDQpgYGANCg0KIyMjIyBHcsOhZmljbyBkZSBDYXR0ZWxsLUthaXNlcg0KDQpFbCBncsOhZmljbyBkZSBDYXR0ZWxs4oCTS2Fpc2VyIHBlcm1pdGUgY29tcGxlbWVudGFyIGVsIGFuw6FsaXNpcyBkZWwgQW7DoWxpc2lzIGRlIENvbXBvbmVudGVzIFByaW5jaXBhbGVzIG1lZGlhbnRlIGxhIGFwbGljYWNpw7NuIGRlbCBjcml0ZXJpbyBkZSBLYWlzZXIsIGVsIGN1YWwgZXN0YWJsZWNlIHF1ZSBzb2xvIGRlYmVuIHJldGVuZXJzZSBhcXVlbGxvcyBjb21wb25lbnRlcyBjdXlvIHZhbG9yIHByb3BpbyBzZWEgbWF5b3IgcXVlIHVuby4gRW4gZWwgZ3LDoWZpY28gc2Ugb2JzZXJ2YSBjbGFyYW1lbnRlIHF1ZSDDum5pY2FtZW50ZSBlbCBwcmltZXIgY29tcG9uZW50ZSBwcmluY2lwYWwgcHJlc2VudGEgdW4gdmFsb3IgcHJvcGlvIHN1cGVyaW9yIGEgZXN0ZSB1bWJyYWwsIG1pZW50cmFzIHF1ZSBsb3MgY29tcG9uZW50ZXMgcmVzdGFudGVzIG11ZXN0cmFuIHZhbG9yZXMgcHJvcGlvcyBtdXkgY2VyY2Fub3MgYSBjZXJvIHkgY2xhcmFtZW50ZSBpbmZlcmlvcmVzIGEgdW5vLg0KDQpMYSBtYXJjYWRhIGNhw61kYSBkZWwgdmFsb3IgcHJvcGlvIGRlbCBwcmltZXIgYWwgc2VndW5kbyBjb21wb25lbnRlIGNvbmZpcm1hIGxhIGV4aXN0ZW5jaWEgZGUgdW5hIHJ1cHR1cmEgZXN0cnVjdHVyYWwgZW4gbGEgZXhwbGljYWNpw7NuIGRlIGxhIHZhcmlhbnphLCBpbmRpY2FuZG8gcXVlIGVsIHByaW1lciBjb21wb25lbnRlIGNvbmNlbnRyYSBwcsOhY3RpY2FtZW50ZSB0b2RhIGxhIGluZm9ybWFjacOzbiByZWxldmFudGUgZGVsIGNvbmp1bnRvIGRlIGRhdG9zLiBMYSBsw61uZWEgaG9yaXpvbnRhbCBjb3JyZXNwb25kaWVudGUgYWwgdmFsb3IgcHJvcGlvIGlndWFsIGEgdW5vIHJlZnVlcnphIHZpc3VhbG1lbnRlIGVzdGUgY3JpdGVyaW8sIG1vc3RyYW5kbyBxdWUgc29sbyBlbCBwcmltZXIgY29tcG9uZW50ZSBjdW1wbGUgY29uIGxhIGNvbmRpY2nDs24gbmVjZXNhcmlhIHBhcmEgc2VyIGNvbnNpZGVyYWRvIHNpZ25pZmljYXRpdm8gZGVzZGUgZWwgcHVudG8gZGUgdmlzdGEgZXN0YWTDrXN0aWNvLg0KDQpFbiB0w6lybWlub3MgaW50ZXJwcmV0YXRpdm9zLCBlbCBncsOhZmljbyBkZSBDYXR0ZWxs4oCTS2Fpc2VyIHJhdGlmaWNhIGxvcyByZXN1bHRhZG9zIG9idGVuaWRvcyBwcmV2aWFtZW50ZSBtZWRpYW50ZSBlbCBncsOhZmljbyBkZSBDYXR0ZWxsIHkgbGEgbWF0cml6IGRlIHZhbG9yZXMgcHJvcGlvcywgY29uZmlybWFuZG8gcXVlIGxhIGVzdHJ1Y3R1cmEgZGVsIHNpc3RlbWEgZXMgZXNlbmNpYWxtZW50ZSB1bmlkaW1lbnNpb25hbC4gRXN0byBpbXBsaWNhIHF1ZSBsb3MgdGllbXBvcyBkZWwgcHJvY2VzbyBhc2lzdGVuY2lhbCBwdWVkZW4gc2VyIHJlcHJlc2VudGFkb3MgYWRlY3VhZGFtZW50ZSBwb3IgdW4gw7puaWNvIGZhY3RvciBsYXRlbnRlLCBhc29jaWFkbyBhIGxhIGR1cmFjacOzbiBnbG9iYWwgZGUgbGEgYXRlbmNpw7NuIGVuIGxhIHNhbGEgZGUgdXJnZW5jaWFzLiANCg0KYGBge3IgR3JhZmljb19kZV9DYXR0ZWxsX0thaXNlciwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpzY3JlZSh2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTFssLWMoMSwyLDMsNCw1LDYsNyw4LDEzLDE0KV0sZmFjdG9ycyA9IEZBTFNFLCBwYyA9IFRSVUUsIG1haW4gPSIiKQ0KYGBgDQoNCiMjIyAyLjMuIENhbGlkYWQgZGUgUmVwcmVzZW50YWNpw7NuIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNCkNvbiBiYXNlIGVuIGxhIHJlZmVyZW5jaWEgZGUgW0BBRURNRGlhei1Nb3JhbGVzMWVkXSxzZSBjb25maXJtYSBxdWUsIHRyYXMgcmVkdWNpciBsYSBkaW1lbnNpb25hbGlkYWQgZGVsIGNvbmp1bnRvIGRlIGRhdG9zIHkgZW50ZW5kZXIgcXVlIHN1cyB2YXJpYWJsZXMgZXN0YW5kYXJpemFkYXMgc2UgcmVwcmVzZW50YW4gZ3LDoWZpY2FtZW50ZSBjb21vIHByb3llY2Npb25lcyBkZSB1bmEgaGlwZXJlc2ZlcmEgZGUgY29ycmVsYWNpb25lcywgZXMgZXNlbmNpYWwgaW5pY2lhciBsYSBpbnRlcnByZXRhY2nDs24gZGUgbGFzIGNvbXBvbmVudGVzIGEgcGFydGlyIGRlIGVzYXMgY29ycmVsYWNpb25lcy4gUG9zdGVyaW9ybWVudGUsIHNlIGRlYmUgZXZhbHVhciBsYSBjYWxpZGFkIGRlIGxhcyByZXByZXNlbnRhY2lvbmVzIG9idGVuaWRhcywgY29uc2lkZXJhbmRvIGxhIHJlZHVjY2nDs24gZGltZW5zaW9uYWwgYXBsaWNhZGEgYWwgY29uanVudG8gZGUgZGF0b3MgeSBzdSBpbXBhY3RvIGVuIGxhcyB2YXJpYWJsZXMuDQoNCkVzIG5lY2VzYXJpbyBldmFsdWFyIGxhIGNhbGlkYWQgZGUgbGEgcmVwcmVzZW50YWNpw7NuIGRlIGxhcyB2YXJpYWJsZXMgY3VhbnRpdGF0aXZhcyBlbiByZWxhY2nDs24gY29uIGVsIG7Dum1lcm8gZGUgZGltZW5zaW9uZXMgY2FsY3VsYWRhcyBxdWUgY2FwdHVyYW4gbGEgbWF5b3IgcHJvcG9yY2nDs24gZGUgdmFyaWFiaWxpZGFkOyBwYXJhIG3DoXMgZGV0YWxsZXMsIGNvbnN1bHRhciBsYSBbc2VjY2nDs24gMi4zXSgjc2VjMi4zKS4NCg0KIyMjIyBDw61yY3VsbyBkZSBDb3JyZWxhY2lvbmVzDQoNCkVsIGPDrXJjdWxvIGRlIGNvcnJlbGFjaW9uZXMgZGVsIEFuw6FsaXNpcyBkZSBDb21wb25lbnRlcyBQcmluY2lwYWxlcyAoQUNQKSBwZXJtaXRlIGludGVycHJldGFyIGxhIHJlbGFjacOzbiBlbnRyZSBsYXMgdmFyaWFibGVzIG9yaWdpbmFsZXMgeSBsb3MgY29tcG9uZW50ZXMgcmV0ZW5pZG9zLCBhc8OtIGNvbW8gZWwgZ3JhZG8gZW4gcXVlIGVzdGFzIGNvbnRyaWJ1eWVuIGEgbGEgZXhwbGljYWNpw7NuIGRlIGxhIHZhcmlhYmlsaWRhZCBkZWwgc2lzdGVtYS4gRW4gZWwgcGxhbm8gZGVmaW5pZG8gcG9yIGxhIERpbWVuc2nDs24gMSAoOTMsMyAlIGRlIGxhIHZhcmlhbnphKSB5IGxhIERpbWVuc2nDs24gMiAoMyw2ICUpIHNlIG9ic2VydmEgcXVlIHRvZGFzIGxhcyB2YXJpYWJsZXMgYW5hbGl6YWRhcyBzZSBwcm95ZWN0YW4gcHJpbmNpcGFsbWVudGUgc29icmUgZWwgZWplIGhvcml6b250YWwsIGxvIHF1ZSBjb25maXJtYSBlbCBjYXLDoWN0ZXIgZG9taW5hbnRlIGRlbCBwcmltZXIgY29tcG9uZW50ZSBwcmluY2lwYWwuDQoNCkxhcyB2YXJpYWJsZXMgdGllbXBvIGRlIHJlZ2lzdHJvLCB0aWVtcG8gZGUgdHJpYWdlLCB0aWVtcG8gZGUgYXRlbmNpw7NuIHByb2Zlc2lvbmFsIG3DqWRpY2EgeSB0aWVtcG8gdG90YWwgZGUgZXNwZXJhIHByZXNlbnRhbiB2ZWN0b3JlcyBsYXJnb3MgeSBvcmllbnRhZG9zIGhhY2lhIGxhIGRlcmVjaGEsIGNlcmNhbm9zIGFsIGJvcmRlIGRlbCBjw61yY3VsbywgbG8gcXVlIGluZGljYSB1bmEgYWx0YSBjb3JyZWxhY2nDs24gcG9zaXRpdmEgY29uIGxhIERpbWVuc2nDs24gMS4gRXN0ZSBjb21wb3J0YW1pZW50byBzdWdpZXJlIHF1ZSBlbCBwcmltZXIgY29tcG9uZW50ZSByZXByZXNlbnRhIHVuIGZhY3RvciBnbG9iYWwgZGUgZHVyYWNpw7NuIGRlbCBwcm9jZXNvIGFzaXN0ZW5jaWFsLCBlbiBlbCBjdWFsIHRvZGFzIGxhcyBldGFwYXMgZGUgbGEgYXRlbmNpw7NuIGNvbnRyaWJ1eWVuIGRlIG1hbmVyYSBjb25qdW50YS4gUG9yIHN1IHBhcnRlLCBsYSBEaW1lbnNpw7NuIDIgY2FwdHVyYSB1bmEgcHJvcG9yY2nDs24gbXV5IHJlZHVjaWRhIGRlIGxhIHZhcmlhYmlsaWRhZCB5IHBlcm1pdGUgZGlzdGluZ3VpciBsaWdlcm9zIGNvbnRyYXN0ZXMgZW50cmUgbGFzIHZhcmlhYmxlcy4gRW4gcGFydGljdWxhciwgZWwgdGllbXBvIGRlIHJlZ2lzdHJvIHByZXNlbnRhIHVuYSBwcm95ZWNjacOzbiBwb3NpdGl2YSBzb2JyZSBlc3RlIGVqZSwgbWllbnRyYXMgcXVlIGVsIHRpZW1wbyBkZSB0cmlhZ2UgeSBlbCB0aWVtcG8gdG90YWwgZGUgZXNwZXJhIG11ZXN0cmFuIGNvbXBvbmVudGVzIG5lZ2F0aXZvcywgbG8gcXVlIHN1Z2llcmUgZGlmZXJlbmNpYXMgbWVub3JlcyBlbiBsYSBkaW7DoW1pY2EgZGUgbGFzIGV0YXBhcyBpbmljaWFsZXMgZGVsIHByb2Nlc28uIA0KDQpFbiBjb25qdW50bywgZWwgY8OtcmN1bG8gZGUgY29ycmVsYWNpb25lcyBjb25maXJtYSBxdWUgbG9zIHRpZW1wb3MgZGVsIHByb2Nlc28gYXNpc3RlbmNpYWwgZXN0w6FuIGFsdGFtZW50ZSBpbnRlcnJlbGFjaW9uYWRvcyB5IHF1ZSBzdSBjb21wb3J0YW1pZW50byBwdWVkZSByZXN1bWlyc2UgZGUgZm9ybWEgZWZpY2llbnRlIGVuIHVuIMO6bmljbyBjb21wb25lbnRlIHByaW5jaXBhbC4gRXN0ZSByZXN1bHRhZG8gcmVmdWVyemEgbGEgdmFsaWRleiBkZSBsYSByZWR1Y2Npw7NuIGRlIGRpbWVuc2lvbmFsaWRhZCBhcGxpY2FkYSB5IHByb3BvcmNpb25hIHVuYSBpbnRlcnByZXRhY2nDs24gY2xhcmEgZGVsIEFDUCwgb3JpZW50YWRhIGEgbGEgY29tcHJlbnNpw7NuIGdsb2JhbCBkZSBsYSBlZmljaWVuY2lhIHRlbXBvcmFsIGVuIGxhIGF0ZW5jacOzbiBkZSB1cmdlbmNpYXMuDQoNCmBgYHtyIENpcmN1bG9fZGVfQ29ycmVsYWNpb25lcywgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpmdml6X3BjYV92YXIoUENBKHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMWywtYygxLDIsMyw0LDUsNiw3LDgsMTMsMTQpXSwgc2NhbGUudW5pdCA9IFQsIGdyYXBoID0gRiksY29sLnZhcj0iIzNCODNCRCIsIHJlcGVsID0gVCwgY29sLmNpcmNsZSA9ICIjQ0RDRENEIiwgZ2d0aGVtZSA9IHRoZW1lX2J3KCkpDQpgYGANCiMjIyMgTWF0cml6IGRlIFJlcHJlc2VudGFjacOzbg0KYGBge3IgTWF0cml6X2RlX1JlcHJlc3NlbnRhY2lvbl9DT1MyLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCihnZXRfcGNhX3ZhcihQQ0EodmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVExbLC1jKDEsMiwzLDQsNSw2LDcsOCwxMywxNCldLCBuY3AgPSA1LCBzY2FsZS51bml0ID0gVFJVRSwgZ3JhcGggPSBGKSkpJGNvczINCmBgYA0KDQojIyMjIENhbGlkYWQgZGUgUmVwcmVzZW50YWNpw7NuDQoNCkVsIGFuw6FsaXNpcyBkZSBsYSBjYWxpZGFkIGRlIHJlcHJlc2VudGFjacOzbiAoY29zwrIpIGVuIGVsIHBsYW5vIGZhY3RvcmlhbCBkZWwgQW7DoWxpc2lzIGRlIENvbXBvbmVudGVzIFByaW5jaXBhbGVzIChBQ1ApIHBlcm1pdGUgZXZhbHVhciBxdcOpIHRhbiBiaWVuIGNhZGEgdmFyaWFibGUgb3JpZ2luYWwgZXMgZXhwbGljYWRhIHBvciBsYXMgZGltZW5zaW9uZXMgcmV0ZW5pZGFzLiBFbiBlbCBncsOhZmljbyBzZSBvYnNlcnZhIHF1ZSB0b2RhcyBsYXMgdmFyaWFibGVzIGFuYWxpemFkYXMgcHJlc2VudGFuIHZhbG9yZXMgZWxldmFkb3MgZGUgY29zwrIsIGV2aWRlbmNpYWRvcyBwb3IgbGEgaW50ZW5zaWRhZCBkZWwgY29sb3IgeSBsYSBwcm94aW1pZGFkIGRlIGxvcyB2ZWN0b3JlcyBhbCBib3JkZSBkZWwgY8OtcmN1bG8gZGUgY29ycmVsYWNpb25lcywgbG8gcXVlIGluZGljYSB1bmEgZXhjZWxlbnRlIHJlcHJlc2VudGFjacOzbiBlbiBlbCBwbGFubyBkZWZpbmlkbyBwb3IgbGEgRGltZW5zacOzbiAxICg5MywzICUpIHkgbGEgRGltZW5zacOzbiAyICgzLDYgJSkuDQoNCkVuIHBhcnRpY3VsYXIsIGxhcyB2YXJpYWJsZXMgdGllbXBvIGRlIHJlZ2lzdHJvLCB0aWVtcG8gZGUgdHJpYWdlIHkgdGllbXBvIHRvdGFsIGRlIGVzcGVyYSBtdWVzdHJhbiBsb3MgdmFsb3JlcyBkZSBjb3PCsiBtw6FzIGFsdG9zLCBsbyBxdWUgaW1wbGljYSBxdWUgc3UgdmFyaWFiaWxpZGFkIGVzdMOhIGNhc2kgY29tcGxldGFtZW50ZSBleHBsaWNhZGEgcG9yIGxvcyBjb21wb25lbnRlcyBwcmluY2lwYWxlcywgZXNwZWNpYWxtZW50ZSBwb3IgbGEgcHJpbWVyYSBkaW1lbnNpw7NuLiBFc3RvIGNvbmZpcm1hIHF1ZSBlc3RhcyB2YXJpYWJsZXMgc29uIGZ1bmRhbWVudGFsZXMgZW4gbGEgZXN0cnVjdHVyYSBkZWwgc2lzdGVtYSB5IHRpZW5lbiB1bmEgY29udHJpYnVjacOzbiBkaXJlY3RhIGFsIGZhY3RvciBnbG9iYWwgZGUgZHVyYWNpw7NuIGRlbCBwcm9jZXNvIGFzaXN0ZW5jaWFsLg0KDQpFbiBjb25qdW50bywgZXN0b3MgcmVzdWx0YWRvcyBjb25maXJtYW4gbGEgaWRvbmVpZGFkIGRlbCBBQ1AgYXBsaWNhZG8sIHlhIHF1ZSBsYXMgdmFyaWFibGVzIGNsYXZlIGRlbCBhbsOhbGlzaXMgZXN0w6FuIGJpZW4gcmVwcmVzZW50YWRhcyBlbiBlbCBlc3BhY2lvIGZhY3RvcmlhbCwgbG8gcXVlIHBlcm1pdGUgcmVhbGl6YXIgaW50ZXJwcmV0YWNpb25lcyBjb25maWFibGVzIHkgc3VzdGVudGEgZWwgdXNvIGRlbCBwcmltZXIgY29tcG9uZW50ZSBwcmluY2lwYWwgY29tbyBpbmRpY2Fkb3Igc2ludMOpdGljbyBkZWwgZGVzZW1wZcOxbyB0ZW1wb3JhbCBkZWwgc2VydmljaW8gZGUgdXJnZW5jaWFzLg0KDQpgYGB7ciBDYWxpZGFkX2RlX2xhX1JlcHJlc2VudGFjaW9uLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCmZ2aXpfcGNhX3ZhcihQQ0EodmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVExbLC1jKDEsMiwzLDQsNSw2LDcsOCwxMywxNCldLCBuY3AgPSA1LCBzY2FsZS51bml0ID0gVFJVRSwgZ3JhcGggPSBGKSwgY29sLnZhcj0iY29zMiIsIGdyYWRpZW50LmNvbHM9YygiIzAwQUZCQiIsIiNFN0I4MDAiLCIjRkM0RTA3IiksIHJlcGVsID0gVFJVRSkNCmBgYA0KDQojIyMjIENvb3JkZW5hZGFzIEluZGl2aWR1YWxlcw0KDQpBIHBhcnRpciBkZSBsYXMgY29vcmRlbmFkYXMgaW5kaXZpZHVhbGVzIG9idGVuaWRhcyBkZWwgQW7DoWxpc2lzIGRlIENvbXBvbmVudGVzIFByaW5jaXBhbGVzIChBQ1ApLCBzZSBhbmFsaXphIGxhIHBvc2ljacOzbiBkZSBsYXMgb2JzZXJ2YWNpb25lcyBlbiBlbCBlc3BhY2lvIGZhY3RvcmlhbCBkZWZpbmlkbyBwb3IgbGFzIGRpbWVuc2lvbmVzIHByaW5jaXBhbGVzLCBsbyBxdWUgcGVybWl0ZSBpZGVudGlmaWNhciBwYXRyb25lcywgaGV0ZXJvZ2VuZWlkYWQgeSBwb3NpYmxlcyBjYXNvcyBhdMOtcGljb3MgZW4gbG9zIHRpZW1wb3MgZGVsIHByb2Nlc28gYXNpc3RlbmNpYWwuIExvcyByZXN1bHRhZG9zIG11ZXN0cmFuIHF1ZSBsYSBEaW1lbnNpw7NuIDEsIHF1ZSBjb25jZW50cmEgbcOhcyBkZWwgOTMgJSBkZSBsYSB2YXJpYW56YSB0b3RhbCwgZXMgZWwgZWplIHF1ZSBtYXlvciBjYXBhY2lkYWQgdGllbmUgcGFyYSBkaXNjcmltaW5hciBlbnRyZSBsYXMgb2JzZXJ2YWNpb25lcywgbWllbnRyYXMgcXVlIGxhcyBkaW1lbnNpb25lcyByZXN0YW50ZXMgYXBvcnRhbiBpbmZvcm1hY2nDs24gY29tcGxlbWVudGFyaWEgZGUgbWVub3IgcmVsZXZhbmNpYS4NCg0KU2Ugb2JzZXJ2YSBxdWUgbGFzIGNvb3JkZW5hZGFzIGVuIGxhIERpbWVuc2nDs24gMSBwcmVzZW50YW4gdW5hIGFtcGxpYSBkaXNwZXJzacOzbiwgY29uIHZhbG9yZXMgcG9zaXRpdm9zIHkgbmVnYXRpdm9zIGRlIG1hZ25pdHVkIGNvbnNpZGVyYWJsZS4gTGFzIG9ic2VydmFjaW9uZXMgY29uIHZhbG9yZXMgcG9zaXRpdm9zIGVsZXZhZG9zIGVuIGVzdGEgZGltZW5zacOzbiBjb3JyZXNwb25kZW4gYSBjYXNvcyBjb24gdGllbXBvcyBkZSBhdGVuY2nDs24gZ2xvYmFsbWVudGUgbcOhcyBhbHRvcywgcmVmbGVqYW5kbyBwcm9jZXNvcyBhc2lzdGVuY2lhbGVzIG3DoXMgcHJvbG9uZ2Fkb3MuIEVuIGNvbnRyYXN0ZSwgbGFzIG9ic2VydmFjaW9uZXMgY29uIHZhbG9yZXMgbmVnYXRpdm9zIHJlcHJlc2VudGFuIHBhY2llbnRlcyBxdWUgZXhwZXJpbWVudGFyb24gdGllbXBvcyBtZW5vcmVzIGVuIGxhcyBkaXN0aW50YXMgZXRhcGFzIGRlbCBwcm9jZXNvLCBsbyBxdWUgc3VnaWVyZSB1bmEgYXRlbmNpw7NuIG3DoXMgZWZpY2llbnRlLg0KDQpMYSBEaW1lbnNpw7NuIDIsIGF1bnF1ZSBleHBsaWNhIHVuYSBwcm9wb3JjacOzbiByZWR1Y2lkYSBkZSBsYSB2YXJpYWJpbGlkYWQsIHBlcm1pdGUgaWRlbnRpZmljYXIgZGlmZXJlbmNpYXMgc2VjdW5kYXJpYXMgZW50cmUgb2JzZXJ2YWNpb25lcyBjb24gcGVyZmlsZXMgdGVtcG9yYWxlcyBzaW1pbGFyZXMgZW4gbGEgcHJpbWVyYSBkaW1lbnNpw7NuLiBBbGd1bm9zIGluZGl2aWR1b3MgcHJlc2VudGFuIHZhbG9yZXMgbW9kZXJhZG9zIG8gYWx0b3MgZW4gZXN0YSBkaW1lbnNpw7NuLCBsbyBxdWUgaW5kaWNhIGRlc2JhbGFuY2VzIGVzcGVjw61maWNvcyBlbnRyZSBldGFwYXMgZGVsIHByb2Nlc28sIGNvbW8gZGlmZXJlbmNpYXMgZW50cmUgZWwgdGllbXBvIGRlIHJlZ2lzdHJvIHkgZWwgdGllbXBvIGRlIHRyaWFnZS4gU2luIGVtYmFyZ28sIGVzdGFzIHZhcmlhY2lvbmVzIHRpZW5lbiB1biBpbXBhY3RvIGludGVycHJldGF0aXZvIGxpbWl0YWRvIGZyZW50ZSBhbCBwZXNvIGRvbWluYW50ZSBkZSBsYSBEaW1lbnNpw7NuIDEuDQpGaW5hbG1lbnRlLCBsYXMgRGltZW5zaW9uZXMgMyB5IDQgbXVlc3RyYW4gY29vcmRlbmFkYXMgY2VyY2FuYXMgYSBjZXJvIHBhcmEgbGEgbWF5b3LDrWEgZGUgbGFzIG9ic2VydmFjaW9uZXMsIGxvIHF1ZSBjb25maXJtYSBzdSBiYWphIGNhcGFjaWRhZCBkaXNjcmltaW5hbnRlIHkganVzdGlmaWNhIHF1ZSBubyBzZWFuIGNvbnNpZGVyYWRhcyBlbiBlbCBhbsOhbGlzaXMgcHJpbmNpcGFsLg0KDQpgYGB7ciBDb29yZGVuYWRhc19SZWdpc3Ryb3MsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KaGVhZCgoUENBKHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMWywtYygxLDIsMyw0LDUsNiw3LDgsMTMsMTQpXSwgbmNwID0gNSwgc2NhbGUudW5pdCA9IFRSVUUsIGdyYXBoID0gRikpJGluZCRjb29yZCwgbiA9IDIzTCkNCmBgYA0KDQojIyMgMi40LiBDb250cmlidWNpb25lcyB5IEJpcGxvdHMgey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KTG9zIGF1dG9yZXMgW0BBRURNRGlhei1Nb3JhbGVzMWVkXSBzZcOxYWxhbiBxdWUgbGEgaW50ZXJwcmV0YWNpw7NuIGRlIGxvcyByZXN1bHRhZG9zIGVzdMOhIGVzdHJlY2hhbWVudGUgbGlnYWRhIGFsIGPDoWxjdWxvIGRlIGVsZW1lbnRvcyBjb21vIGNvb3JkZW5hZGFzLCBjb250cmlidWNpb25lcyB5IGNvc2Vub3MgY3VhZHJhZG9zLiBQb3IgbG8gdGFudG8sIGVzIGVzZW5jaWFsIHF1ZSBsYXMgdmFyaWFibGVzIGVzdMOpbiBiaWVuIGNvbmNlcHR1YWxpemFkYXMgeSBjb250ZXh0dWFsaXphZGFzIHBhcmEgZmFjaWxpdGFyIHN1IGNvbXByZW5zacOzbi4gRW4gZXN0ZSBzZW50aWRvLCBhbmFsaXphciBsYSBjb250cmlidWNpw7NuIGRlIGNhZGEgdmFyaWFibGUgYSB1bmEgY29tcG9uZW50ZSBheXVkYSBhIGludGVycHJldGFyIGxvcyByZXN1bHRhZG9zLCBtb3N0cmFuZG8gY8OzbW8gY2FkYSB1bmEgaW5mbHV5ZSBlbiBsYSBkZWZpbmljacOzbiBkZSBsYXMgY29tcG9uZW50ZXMgZ2VuZXJhZGFzLiBFc3RlIGFuw6FsaXNpcyBzZSBsbGV2YSBhIGNhYm8gZW4gZXN0YSBzZWNjacOzbiBwYXJhIGRldGVybWluYXIgZWwgYXBvcnRlIGRlIGNhZGEgdmFyaWFibGUgZW4gbGEgY29uc3RydWNjacOzbiBkZSBsYXMgY29tcG9uZW50ZXMuDQoNCg0KIyMjIyBNYXRyaXogZGUgQ29udHJpYnVjaW9uZXMNCg0KQSBwYXJ0aXIgZGUgbGEgbWF0cml6IGRlIGNvbnRyaWJ1Y2lvbmVzIGRlbCBBbsOhbGlzaXMgZGUgQ29tcG9uZW50ZXMgUHJpbmNpcGFsZXMgKEFDUCksIHNlIGlkZW50aWZpY2EgZWwgZ3JhZG8gZGUgYXBvcnRlIGRlIGNhZGEgdmFyaWFibGUgb3JpZ2luYWwgYSBsYSBjb25zdHJ1Y2Npw7NuIGRlIGxhcyBkaW1lbnNpb25lcyBmYWN0b3JpYWxlcywgbG8gcXVlIHBlcm1pdGUgaW50ZXJwcmV0YXIgY29uIG1heW9yIHByZWNpc2nDs24gZWwgc2lnbmlmaWNhZG8gZGUgY2FkYSBjb21wb25lbnRlLiBFbiBsYSBEaW1lbnNpw7NuIDEsIHF1ZSBjb25jZW50cmEgbGEgbWF5b3IgcGFydGUgZGUgbGEgdmFyaWFuemEgdG90YWwsIHNlIG9ic2VydmEgdW5hIGNvbnRyaWJ1Y2nDs24gZXF1aWxpYnJhZGEgZGUgbGFzIGN1YXRybyB2YXJpYWJsZXMgYW5hbGl6YWRhczogdGllbXBvIGRlIHJlZ2lzdHJvICgyMyw5OCAlKSwgdGllbXBvIGRlIHRyaWFnZSAoMjQsMzggJSksIHRpZW1wbyBkZSBhdGVuY2nDs24gcHJvZmVzaW9uYWwgbcOpZGljYSAoMjQsOTcgJSkgeSB0aWVtcG8gdG90YWwgZGUgZXNwZXJhICgyNiw2NyAlKS4gRXN0ZSByZXBhcnRvIGhvbW9nw6luZW8gY29uZmlybWEgcXVlIGVsIHByaW1lciBjb21wb25lbnRlIHJlcHJlc2VudGEgdW4gZmFjdG9yIGdsb2JhbCBkZSBkdXJhY2nDs24gZGVsIHByb2Nlc28gYXNpc3RlbmNpYWwsIGVuIGVsIGN1YWwgdG9kYXMgbGFzIGV0YXBhcyBpbmZsdXllbiBkZSBtYW5lcmEgc2ltaWxhci4gDQoNCkVuIGxhIERpbWVuc2nDs24gMiwgbGEgdmFyaWFibGUgdGllbXBvIGRlIHJlZ2lzdHJvIHByZXNlbnRhIGxhIG1heW9yIGNvbnRyaWJ1Y2nDs24gKDU5LDYyICUpLCBzZWd1aWRhIHBvciBlbCB0aWVtcG8gZGUgdHJpYWdlICgzOCw5NSAlKSwgbWllbnRyYXMgcXVlIGVsIGFwb3J0ZSBkZWwgdGllbXBvIGRlIGF0ZW5jacOzbiBwcm9mZXNpb25hbCBtw6lkaWNhIHkgZGVsIHRpZW1wbyB0b3RhbCBkZSBlc3BlcmEgZXMgbWFyZ2luYWwuIEVzdG8gaW5kaWNhIHF1ZSBlc3RhIGRpbWVuc2nDs24gY2FwdHVyYSBwcmluY2lwYWxtZW50ZSBkaWZlcmVuY2lhcyBlbiBsYXMgZXRhcGFzIGluaWNpYWxlcyBkZWwgcHJvY2VzbywgcmVmbGVqYW5kbyBjb250cmFzdGVzIGVudHJlIGVsIHJlZ2lzdHJvIGFkbWluaXN0cmF0aXZvIHkgbGEgY2xhc2lmaWNhY2nDs24gY2zDrW5pY2EgZGVsIHBhY2llbnRlLiBQb3Igc3UgcGFydGUsIGxhIERpbWVuc2nDs24gMyBlc3TDoSBkb21pbmFkYSBwb3IgZWwgdGllbXBvIGRlIGF0ZW5jacOzbiBwcm9mZXNpb25hbCBtw6lkaWNhICg1NSw4NiAlKSB5IGVsIHRpZW1wbyBkZSB0cmlhZ2UgKDI3LDM5ICUpLCBsbyBxdWUgc3VnaWVyZSBxdWUgZXN0ZSBjb21wb25lbnRlIHJlcHJlc2VudGEgdmFyaWFjaW9uZXMgYXNvY2lhZGFzIGEgbGEgZ2VzdGnDs24gZGUgbGEgYXRlbmNpw7NuIG3DqWRpY2EgeSBsYSBwcmlvcml6YWNpw7NuIGNsw61uaWNhLiBGaW5hbG1lbnRlLCBsYSBEaW1lbnNpw7NuIDQsIGEgcGVzYXIgZGUgc3UgYmFqYSByZWxldmFuY2lhIGdsb2JhbCwgbXVlc3RyYSB1bmEgY29udHJpYnVjacOzbiBtdXkgZWxldmFkYSBkZWwgdGllbXBvIHRvdGFsIGRlIGVzcGVyYSAoNjksOTMgJSksIGxvIHF1ZSBpbmRpY2EgcXVlIGVzdGEgZGltZW5zacOzbiByZWNvZ2UgdmFyaWFjaW9uZXMgcmVzaWR1YWxlcyBlc3BlY8OtZmljYXMgZGUgZXN0YSB2YXJpYWJsZS4NCg0KRW4gY29uanVudG8sIGxhIG1hdHJpeiBkZSBjb250cmlidWNpb25lcyBjb25maXJtYSBxdWUsIGF1bnF1ZSBlbCBwcmltZXIgY29tcG9uZW50ZSBwcmluY2lwYWwgc2ludGV0aXphIGRlIGZvcm1hIGVmaWNpZW50ZSBsYSBpbmZvcm1hY2nDs24gZGUgdG9kYXMgbGFzIHZhcmlhYmxlcywgbGFzIGRpbWVuc2lvbmVzIHNlY3VuZGFyaWFzIHBlcm1pdGVuIGlkZW50aWZpY2FyIGRlc2JhbGFuY2VzIHB1bnR1YWxlcyBlbnRyZSBsYXMgZGlzdGludGFzIGV0YXBhcyBkZWwgcHJvY2VzbyBhc2lzdGVuY2lhbC4gDQoNCmBgYHtyIE1hdHJpel9kZV9Db250cmlidWNpb25lcywgZmlnLmFsaWduID0gJ2NlbnRlcid9DQooZ2V0X3BjYV92YXIoUENBKHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMWywtYygxLDIsMyw0LDUsNiw3LDgsMTIsMTMsMTQpXSwgbmNwID0gNSwgc2NhbGUudW5pdCA9IFRSVUUsIGdyYXBoID0gRikpKSRjb250cmliDQpgYGANCg0KIyMjIyBDb250cmlidWNpb25lcyBhIEQxDQoNCkVsIGFuw6FsaXNpcyBkZSBsYXMgY29udHJpYnVjaW9uZXMgZGUgbGFzIHZhcmlhYmxlcyBhIGxhIERpbWVuc2nDs24gMSAoRDEpIGRlbCBBbsOhbGlzaXMgZGUgQ29tcG9uZW50ZXMgUHJpbmNpcGFsZXMgY29uZmlybWEgcXVlIGVzdGUgY29tcG9uZW50ZSBlc3TDoSBkZWZpbmlkbyBkZSBtYW5lcmEgYmFsYW5jZWFkYSBwb3IgbGFzIHByaW5jaXBhbGVzIGV0YXBhcyBkZWwgcHJvY2VzbyBhc2lzdGVuY2lhbC4gRW4gZWwgZ3LDoWZpY28gc2Ugb2JzZXJ2YSBxdWUgZWwgdGllbXBvIGRlIGF0ZW5jacOzbiBwcm9mZXNpb25hbCBtw6lkaWNhLCBlbCB0aWVtcG8gZGUgcmVnaXN0cm8geSBlbCB0aWVtcG8gZGUgdHJpYWdlIHByZXNlbnRhbiBjb250cmlidWNpb25lcyBtdXkgc2ltaWxhcmVzIHkgc3VwZXJpb3JlcyBhbCB1bWJyYWwgcHJvbWVkaW8gKGzDrW5lYSBkZSByZWZlcmVuY2lhKSwgbG8gcXVlIGluZGljYSBxdWUgZXN0YXMgdmFyaWFibGVzIHBhcnRpY2lwYW4gZGUgZm9ybWEgc2lnbmlmaWNhdGl2YSBlbiBsYSBjb25zdHJ1Y2Npw7NuIGRlIGxhIHByaW1lcmEgZGltZW5zacOzbi4NCg0KTGEgY29udHJpYnVjacOzbiBlbGV2YWRhIHkgcmVsYXRpdmFtZW50ZSBob21vZ8OpbmVhIGRlIGVzdGFzIHZhcmlhYmxlcyBzdWdpZXJlIHF1ZSBsYSBEaW1lbnNpw7NuIDEgcmVwcmVzZW50YSB1biBmYWN0b3IgZ2xvYmFsIGRlIGR1cmFjacOzbiB5IGVmaWNpZW5jaWEgZGVsIHByb2Nlc28gZGUgYXRlbmNpw7NuIGVuIHVyZ2VuY2lhcywgZW4gZWwgY3VhbCBsYXMgZmFzZXMgYWRtaW5pc3RyYXRpdmFzLCBkZSBjbGFzaWZpY2FjacOzbiBjbMOtbmljYSB5IGRlIGF0ZW5jacOzbiBtw6lkaWNhIHRpZW5lbiB1biBwZXNvIGNvbXBhcmFibGUuIEVzdG8gaW1wbGljYSBxdWUgbG9zIGluY3JlbWVudG9zIGVuIGVzdGEgZGltZW5zacOzbiBubyBlc3TDoW4gYXNvY2lhZG9zIGEgdW5hIMO6bmljYSBldGFwYSBlc3BlY8OtZmljYSwgc2lubyBhbCBjb21wb3J0YW1pZW50byBjb25qdW50byBkZWwgc2lzdGVtYSwgZG9uZGUgbG9zIHRpZW1wb3MgdGllbmRlbiBhIGF1bWVudGFyIGRlIGZvcm1hIHNpbXVsdMOhbmVhIGEgbG8gbGFyZ28gZGVsIHByb2Nlc28uDQoNCkVuIGNvbnNlY3VlbmNpYSwgY3VhbHF1aWVyIGVzdHJhdGVnaWEgb3JpZW50YWRhIGEgbWVqb3JhciBlbCBkZXNlbXBlw7FvIGRlbCBzZXJ2aWNpbyBkZWJlIGNvbnNpZGVyYXIgaW50ZXJ2ZW5jaW9uZXMgY29vcmRpbmFkYXMgZW4gbGFzIGV0YXBhcyBkZSByZWdpc3RybywgdHJpYWdlIHkgYXRlbmNpw7NuIG3DqWRpY2EsIHlhIHF1ZSB0b2RhcyBlbGxhcyBjb250cmlidXllbiBkZSBtYW5lcmEgZGVjaXNpdmEgYWwgY29tcG9uZW50ZSBwcmluY2lwYWwgcXVlIGV4cGxpY2EgbGEgbWF5b3IgcGFydGUgZGUgbGEgdmFyaWFiaWxpZGFkIG9ic2VydmFkYSBlbiBsb3MgdGllbXBvcyBkZSBhdGVuY2nDs24uDQoNCmBgYHtyIENvbnRyaWJ1Y2lvbmVzX0RJTV8xLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCmZ2aXpfY29udHJpYihQQ0EodmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVExbLC1jKDEsMiwzLDQsNSw2LDcsOCwxMiwxMywxNCldLCBuY3AgPSA2LCBzY2FsZS51bml0ID0gVFJVRSwgZ3JhcGggPSBGKSwgY2hvaWNlID0gInZhciIsIGF4ZXMgPSAxLCB0b3AgPSAxMCkNCmBgYA0KDQojIyMjIENvbnRyaWJ1Y2lvbmVzIGEgRDINCg0KRWwgZ3LDoWZpY28gZGUgY29udHJpYnVjaW9uZXMgZGUgbGFzIHZhcmlhYmxlcyBhIGxhIERpbWVuc2nDs24gMiAoRDIpIGRlbCBBbsOhbGlzaXMgZGUgQ29tcG9uZW50ZXMgUHJpbmNpcGFsZXMgbXVlc3RyYSBxdWUgZXN0YSBkaW1lbnNpw7NuIGVzdMOhIGRlZmluaWRhIGNhc2kgZXhjbHVzaXZhbWVudGUgcG9yIGxhcyBldGFwYXMgaW5pY2lhbGVzIGRlbCBwcm9jZXNvIGFzaXN0ZW5jaWFsLiBFbiBwYXJ0aWN1bGFyLCBlbCB0aWVtcG8gZGUgdHJpYWdlIHkgZWwgdGllbXBvIGRlIHJlZ2lzdHJvIHByZXNlbnRhbiBjb250cmlidWNpb25lcyBtdXkgc3VwZXJpb3JlcyBhbCB1bWJyYWwgcHJvbWVkaW8sIGNvbmNlbnRyYW5kbyBwcsOhY3RpY2FtZW50ZSBsYSB0b3RhbGlkYWQgZGVsIGFwb3J0ZSBhIGVzdGEgZGltZW5zacOzbi4gRW4gY29udHJhc3RlLCBlbCB0aWVtcG8gZGUgYXRlbmNpw7NuIHByb2Zlc2lvbmFsIG3DqWRpY2EgZXhoaWJlIHVuYSBjb250cmlidWNpw7NuIG1hcmdpbmFsLCBjZXJjYW5hIGEgY2VybywgbG8gcXVlIGluZGljYSBxdWUgc3UgaW5mbHVlbmNpYSBlbiBsYSBjb25zdHJ1Y2Npw7NuIGRlIGxhIERpbWVuc2nDs24gMiBlcyBtw61uaW1hLiBFc3RlIHBhdHLDs24gY29uZmlybWEgcXVlIGxhIERpbWVuc2nDs24gMiBubyByZXByZXNlbnRhIHVuYSBwcm9sb25nYWNpw7NuIGdlbmVyYWwgZGVsIHByb2Nlc28sIHNpbm8gbcOhcyBiaWVuIHVuIGNvbnRyYXN0ZSBlc3BlY8OtZmljbyBlbnRyZSBsYXMgZmFzZXMgYWRtaW5pc3RyYXRpdmFzIHkgZGUgY2xhc2lmaWNhY2nDs24gY2zDrW5pY2EuIA0KDQpObyBvYnN0YW50ZSwgZGFkbyBxdWUgbGEgRGltZW5zacOzbiAyIGV4cGxpY2EgdW5hIHByb3BvcmNpw7NuIHJlZHVjaWRhIGRlIGxhIHZhcmlhbnphIHRvdGFsLCBzdSB2YWxvciBpbnRlcnByZXRhdGl2byBlcyBjb21wbGVtZW50YXJpbyBmcmVudGUgYWwgcGVzbyBkb21pbmFudGUgZGUgbGEgRGltZW5zacOzbiAxLiBBdW4gYXPDrSwgZXN0b3MgcmVzdWx0YWRvcyBhcG9ydGFuIGluZm9ybWFjacOzbiByZWxldmFudGUgcGFyYSBsYSBnZXN0acOzbiBkZWwgc2VydmljaW8sIGFsIHNlw7FhbGFyIHF1ZSBsYXMgb3BvcnR1bmlkYWRlcyBkZSBtZWpvcmEgZXNwZWPDrWZpY2FzIGVuIGxvcyBwcm9jZXNvcyBkZSByZWdpc3RybyB5IHRyaWFnZSBwdWVkZW4gZ2VuZXJhciBpbXBhY3RvcyBkaWZlcmVuY2lhZG9zLCBlc3BlY2lhbG1lbnRlIGVuIGVzY2VuYXJpb3MgZG9uZGUgZXN0YXMgZXRhcGFzIGNvbnN0aXR1eWVuIGN1ZWxsb3MgZGUgYm90ZWxsYSBpbmRlcGVuZGllbnRlcyBkZWwgdGllbXBvIGRlIGF0ZW5jacOzbiBtw6lkaWNhLg0KDQpgYGB7ciBDb250cmlidWNpb25lc19ESU1fMiwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpmdml6X2NvbnRyaWIoUENBKHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMWywtYygxLDIsMyw0LDUsNiw3LDgsMTIsMTMsMTQpXSwgbmNwID0gNiwgc2NhbGUudW5pdCA9IFRSVUUsIGdyYXBoID0gRiksIGNob2ljZSA9ICJ2YXIiLCBheGVzID0gMiwgdG9wID0gMTApDQpgYGANCg0KIyMjIyBDb250cmlidWNpb25lcyBhIEQzDQoNCkVsIGdyw6FmaWNvIGRlIGNvbnRyaWJ1Y2lvbmVzIGRlIGxhcyB2YXJpYWJsZXMgYSBsYSBEaW1lbnNpw7NuIDMgKEQzKSBkZWwgQW7DoWxpc2lzIGRlIENvbXBvbmVudGVzIFByaW5jaXBhbGVzIG11ZXN0cmEgcXVlIGVzdGEgZGltZW5zacOzbiBlc3TDoSBkb21pbmFkYSBwcmluY2lwYWxtZW50ZSBwb3IgZWwgdGllbXBvIGRlIGF0ZW5jacOzbiBwcm9mZXNpb25hbCBtw6lkaWNhLCBjdXlhIGNvbnRyaWJ1Y2nDs24gc3VwZXJhIGFtcGxpYW1lbnRlIGVsIHVtYnJhbCBwcm9tZWRpbyBkZSByZWZlcmVuY2lhLiBFc3RvIGluZGljYSBxdWUgbGEgRGltZW5zacOzbiAzIGNhcHR1cmEgdmFyaWFjaW9uZXMgZXNwZWPDrWZpY2FzIGFzb2NpYWRhcyBhIGxhIGR1cmFjacOzbiBkZSBsYSBjb25zdWx0YSBtw6lkaWNhLCBkaWZlcmVuY2lhbmRvIGNhc29zIGVuIGxvcyBxdWUgZXN0YSBldGFwYSBlcyBwYXJ0aWN1bGFybWVudGUgcHJvbG9uZ2FkYSBvIG3DoXMgYnJldmUgcmVzcGVjdG8gYSBsYXMgZGVtw6FzIGZhc2VzIGRlbCBwcm9jZXNvIGFzaXN0ZW5jaWFsLg0KDQpMYXMgdmFyaWFibGVzIHRpZW1wbyBkZSByZWdpc3RybyB5IHRpZW1wbyBkZSB0cmlhZ2UgcHJlc2VudGFuIGNvbnRyaWJ1Y2lvbmVzIG5vdGFibGVtZW50ZSBtZW5vcmVzIHkgcG9yIGRlYmFqbyBkZWwgdW1icmFsLCBsbyBxdWUgc3VnaWVyZSBxdWUgc3UgaW5mbHVlbmNpYSBlbiBsYSBjb25zdHJ1Y2Npw7NuIGRlIGVzdGEgZGltZW5zacOzbiBlcyBzZWN1bmRhcmlhLiBFbiBjb25zZWN1ZW5jaWEsIGxhIERpbWVuc2nDs24gMyBwdWVkZSBpbnRlcnByZXRhcnNlIGNvbW8gdW4gY29tcG9uZW50ZSBkZSBlc3BlY2lhbGl6YWNpw7NuIG3DqWRpY2EsIHJlZmxlamFuZG8gZGlmZXJlbmNpYXMgZW4gbGEgY29tcGxlamlkYWQgY2zDrW5pY2EgZGUgbG9zIGNhc29zIG8gZW4gbGEgY2FyZ2EgZGUgdHJhYmFqbyBhc29jaWFkYSBhIGxhIGF0ZW5jacOzbiBwcm9mZXNpb25hbCwgaW5kZXBlbmRpZW50ZW1lbnRlIGRlIGxhcyBldGFwYXMgYWRtaW5pc3RyYXRpdmFzIHkgZGUgY2xhc2lmaWNhY2nDs24uDQoNClNpbiBlbWJhcmdvLCBlcyBpbXBvcnRhbnRlIGRlc3RhY2FyIHF1ZSwgYSBwZXNhciBkZSBzdSBpbnRlcnByZXRhY2nDs24gZXNwZWPDrWZpY2EsIGxhIERpbWVuc2nDs24gMyBleHBsaWNhIHVuYSBwcm9wb3JjacOzbiByZWR1Y2lkYSBkZSBsYSB2YXJpYW56YSB0b3RhbCBkZWwgY29uanVudG8gZGUgZGF0b3MuIFBvciBlbGxvLCBzdSB2YWxvciBhbmFsw610aWNvIGVzIGNvbXBsZW1lbnRhcmlvIHkgbm8gY2VudHJhbCBlbiBsYSBkZXNjcmlwY2nDs24gZ2xvYmFsIGRlbCBwcm9jZXNvIGFzaXN0ZW5jaWFsLg0KDQpgYGB7ciBDb250cmlidWNpb25lc19ESU1fMywgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpmdml6X2NvbnRyaWIoUENBKHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMWywtYygxLDIsMyw0LDUsNiw3LDgsMTIsMTMsMTQpXSwgbmNwID0gNiwgc2NhbGUudW5pdCA9IFRSVUUsIGdyYXBoID0gRiksIGNob2ljZSA9ICJ2YXIiLCBheGVzID0gMywgdG9wID0gMTApDQpgYGANCg0KPGEgbmFtZT0ic2VjMyI+PC9hPg0KDQojIyAqKkZhc2UgMyBbQ29ycmVzcG9uZGVuY2lhc10qKg0KDQpTZWfDum4gW0BBTUFSQWxkYXMtVXJpZWwyZWRdLGVsICoqYW7DoWxpc2lzIGRlIGNvcnJlc3BvbmRlbmNpYXMqKiBzaW1wbGUgKiooQUNTKSoqIHRpZW5lIGNvbW8gcHJvcMOzc2l0byByZWR1Y2lyIGxhIGRpbWVuc2lvbmFsaWRhZCBkZSBsYXMgcmVsYWNpb25lcyBlbnRyZSBjYXRlZ29yw61hcyBkZSBkb3MgdmFyaWFibGVzIGNhdGVnw7NyaWNhcywgcmVwcmVzZW50w6FuZG9sYXMgZW4gdW4gZXNwYWNpbyBtdWx0aWRpbWVuc2lvbmFsLiBFc3RlIG3DqXRvZG8gcGVybWl0ZSBhbmFsaXphciBncsOhZmljYW1lbnRlIGxhcyBkaXN0YW5jaWFzIGVudHJlIGxhcyBjYXRlZ29yw61hcyBkZSBsYXMgdmFyaWFibGVzLCBmYWNpbGl0YW5kbyBsYSBpbnRlcnByZXRhY2nDs24gZGUgdGFibGFzIGRlIGNvbnRpbmdlbmNpYS4gRWwgbsO6bWVybyBtw6F4aW1vIGRlIGRpbWVuc2lvbmVzIG5lY2VzYXJpYXMgcGFyYSBleHBsaWNhciBkaWNoYXMgcmVsYWNpb25lcyBjb3JyZXNwb25kZSBhIHVubyBtZW5vcyBlbCBuw7ptZXJvIGRlIGNhdGVnb3LDrWFzIGRlIGxhIHZhcmlhYmxlIGNvbiBtZW5vciBjYW50aWRhZCBkZSBuaXZlbGVzLg0KDQpBc2ltaXNtbywgZWwgKipBQ1MqKiwgYmFzYWRvIGVuIHRhYmxhcyBkZSBjb250aW5nZW5jaWEsIHB1ZWRlIGFtcGxpYXJzZSBwYXJhIGluY2x1aXIgbcOhcyBkZSBkb3MgdmFyaWFibGVzIGNhdGVnw7NyaWNhcywgbG8gcXVlIHNlIGNvbm9jZSBjb21vICoqQW7DoWxpc2lzIGRlIGNvcnJlc3BvbmRlbmNpYXMgbcO6bHRpcGxlcyAoQUNNKSoqLiBFc3RlIGVuZm9xdWUgdXRpbGl6YSB1bmEgdGFibGEgZGlzeXVudGl2YSBjb21wbGV0YSwgcGVybWl0aWVuZG8gZXhwbG9yYXIgeSByZXByZXNlbnRhciByZWxhY2lvbmVzIG3DoXMgY29tcGxlamFzIGVudHJlIG3Dumx0aXBsZXMgdmFyaWFibGVzIGNhdGVnw7NyaWNhcy4NCg0KIyMjIDMuMS4gT2JqZXRpdm9zDQoNCkVuIGVzdGEgdGVyY2VyYSBmYXNlIGRlbCBlc3R1ZGlvLCBzZSBwcmVzZW50YXLDoW4gY8OhbGN1bG9zLCB2aXN1YWxpemFjaW9uZXMgZSBpbnRlcnByZXRhY2lvbmVzIGJhc2FkYXMgZW4gZWwgY29uanVudG8gZGUgZGF0b3MgdHJhYmFqYWRvIGVuIGxhIFtmYXNlIDFdKCNzZWMxKSB5IFtmYXNlIDJdKCNzZWMyKS4gU2luIGVtYmFyZ28sIGVzdGEgZmFzZSBzZSBlbmZvY2Fyw6EgZW4gYXBsaWNhciBhbsOhbGlzaXMgZGUgY29ycmVzcG9uZGVuY2lhcyBzaW1wbGVzIHkgbcO6bHRpcGxlcyBzb2JyZSBsYXMgdmFyaWFibGVzIGN1YWxpdGF0aXZhcywgYWJhcmNhbmRvIGxhIGNvbnN0cnVjY2nDs24gZGUgdGFibGFzIGRlIGNvbnRpbmdlbmNpYSB5IGRpc3l1bnRpdmFzIGNvbXBsZXRhcywgYXPDrSBjb21vIGxhIGV2YWx1YWNpw7NuIGRlIGNhbGlkYWRlcyBkZSByZXByZXNlbnRhY2nDs24sIGNvbnRyaWJ1Y2lvbmVzIGUgaW50ZXJwcmV0YWNpb25lcy4NCg0KIyMjIDMuMi4gQ29ycmVzcG9uZGVuY2lhcyBTaW1wbGVzLg0KDQpEZSBhY3VlcmRvIGNvbiBbQEFFRE1EaWF6LU1vcmFsZXMxZWRdLCBlbCBhbsOhbGlzaXMgZGUgKipjb3JyZXNwb25kZW5jaWFzIHNpbXBsZSAoQUNTKSoqIHB1ZWRlIGFtcGxpYXJzZSBwYXJhIHRyYWJhamFyIGNvbiB0YWJsYXMgZGlzeXVudGl2YXMgY29tcGxldGFzLiBFbiBlc3RlIGZvcm1hdG8sIGxhcyBmaWxhcyByZXByZXNlbnRhbiBhIGxvcyBwYWNpZW50ZXMsIG1pZW50cmFzIHF1ZSBsYXMgY29sdW1uYXMgZGVzY3JpYmVuIGxhcyBtb2RhbGlkYWRlcyBkZSBsYXMgdmFyaWFibGVzIGNhdGVnw7NyaWNhcyBhbmFsaXphZGFzLCBjb21vICoqVGFyZ2V0KiosICoqQ2hlc3RQYWluKiogeSAqKkZhc3RpbmdCbG9vZFN1Z2FyKiosIGFzaWduYW5kbyBhIGNhZGEgcGFjaWVudGUgdW5hIGNhdGVnb3LDrWEgw7puaWNhIHBhcmEgY2FkYSB2YXJpYWJsZS4gDQoNCiMjIyMgQUMgUGFyZWphcyBUb3RhbGVzIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNCg0KIyMjIyMgQ29udGluZ2VuY2lhcw0KDQpBIHBhcnRpciBkZWwgYW7DoWxpc2lzIGRlIGxhcyB0YWJsYXMgZGUgY29udGluZ2VuY2lhLCBzZSBpZGVudGlmaWNhbiBwYXRyb25lcyByZWxldmFudGVzIGVuIGxhIHJlbGFjacOzbiBlbnRyZSBlbCBuaXZlbCBkZSB1cmdlbmNpYSwgZWwgcmVzdWx0YWRvIGRlbCBwYWNpZW50ZSwgbGEgdGVtcG9yYWRhIChmcmFuamEgaG9yYXJpYSkgeSBlbCBkw61hIGRlIGxhIHNlbWFuYSwgbG8gcXVlIHBlcm1pdGUgY2FyYWN0ZXJpemFyIGVsIGNvbXBvcnRhbWllbnRvIG9wZXJhdGl2byBkZWwgc2VydmljaW8gZGUgdXJnZW5jaWFzIGRlc2RlIHVuYSBwZXJzcGVjdGl2YSBkZXNjcmlwdGl2YSB5IHJlbGFjaW9uYWwuIEVuIHByaW1lciBsdWdhciwgbGEgcmVsYWNpw7NuIGVudHJlIG5pdmVsIGRlIHVyZ2VuY2lhIHkgcmVzdWx0YWRvIGRlbCBwYWNpZW50ZSBldmlkZW5jaWEgZGlmZXJlbmNpYXMgY2xhcmFzIGVuIGxhIGRpbsOhbWljYSBkZSBhdGVuY2nDs24uIExvcyBwYWNpZW50ZXMgY2xhc2lmaWNhZG9zIGNvbW8gY3LDrXRpY29zIHkgZGUgYWx0YSB1cmdlbmNpYSBwcmVzZW50YW4gdW5hIGRpc3RyaWJ1Y2nDs24gcmVsYXRpdmFtZW50ZSBlcXVpbGlicmFkYSBlbnRyZSBpbmdyZXNvcyBob3NwaXRhbGFyaW9zIChBZG1pdHRlZCkgeSBlZ3Jlc29zIChEaXNjaGFyZ2VkKSwgc2luIHJlZ2lzdHJvcyBkZSBhYmFuZG9ubyBzaW4gYXRlbmNpw7NuIGVuIGVsIG5pdmVsIGNyw610aWNvLCBsbyBxdWUgaW5kaWNhIHVuYSBhZGVjdWFkYSBwcmlvcml6YWNpw7NuIGNsw61uaWNhIGRlIGxvcyBjYXNvcyBtw6FzIGdyYXZlcy4gRW4gY29udHJhc3RlLCBsb3MgcGFjaWVudGVzIGRlIHVyZ2VuY2lhIGJhamEgY29uY2VudHJhbiBsYSBtYXlvciBwcm9wb3JjacOzbiBkZSBjYXNvcyBkZSBhYmFuZG9ubyBzaW4gc2VyIGF0ZW5kaWRvcyAoTGVmdCBXaXRob3V0IEJlaW5nIFNlZW4pLCBjb24gMTk4IGV2ZW50b3MsIGxvIHF1ZSBzdWdpZXJlIHF1ZSBsb3MgdGllbXBvcyBkZSBlc3BlcmEgcHJvbG9uZ2Fkb3MgYWZlY3RhbiBwcmluY2lwYWxtZW50ZSBhIGVzdGUgZ3J1cG8uIEVuIGVsIG5pdmVsIG1lZGlvLCBhdW5xdWUgcHJlZG9taW5hIGVsIGVncmVzbywgdGFtYmnDqW4gc2Ugb2JzZXJ2YW4gYWJhbmRvbm9zLCBsbyBxdWUgcmVmbGVqYSB1bmEgcHJlc2nDs24gb3BlcmF0aXZhIGludGVybWVkaWEgc29icmUgZWwgc2VydmljaW8uDQoNClJlc3BlY3RvIGEgbGEgcmVsYWNpw7NuIGVudHJlIG5pdmVsIGRlIHVyZ2VuY2lhIHkgdGVtcG9yYWRhLCBzZSBvYnNlcnZhIHF1ZSBsYSBmcmFuamEgZGUgRXZlbmluZyAodGFyZGUtbm9jaGUpIGNvbmNlbnRyYSBlbCBtYXlvciB2b2x1bWVuIGRlIGF0ZW5jaW9uZXMgZW4gdG9kb3MgbG9zIG5pdmVsZXMgZGUgdXJnZW5jaWEsIHNlZ3VpZGEgcG9yIGxhIGFmdGVybm9vbiB5IGxhIGxhdGUgbW9ybmluZy4gRXN0ZSBwYXRyw7NuIGluZGljYSB1bmEgbWF5b3IgZGVtYW5kYSBkZWwgc2VydmljaW8gZW4gaG9yYXMgdmVzcGVydGluYXMsIGluZGVwZW5kaWVudGVtZW50ZSBkZSBsYSBncmF2ZWRhZCBkZWwgY2FzbywgbG8gcXVlIHB1ZWRlIGdlbmVyYXIgY29uZ2VzdGnDs24geSBhdW1lbnRvIGRlIGxvcyB0aWVtcG9zIGRlIGVzcGVyYS4gTGEgZnJhbmphIGRlIGVhcmx5IG1vcm5pbmcgcHJlc2VudGEgZWwgbWVub3IgbsO6bWVybyBkZSBhdGVuY2lvbmVzLCBsbyBxdWUgc3VnaWVyZSB1bmEgdmVudGFuYSBwb3RlbmNpYWwgcGFyYSByZWRpc3RyaWJ1aXIgcmVjdXJzb3MgbyBwcm9ncmFtYXIgcmVmdWVyem9zIG9wZXJhdGl2b3MgZW4gbG9zIHBlcmlvZG9zIGRlIG1heW9yIGNhcmdhLg0KDQpFbiBjb25qdW50bywgbGFzIHRhYmxhcyBkZSBjb250aW5nZW5jaWEgZXZpZGVuY2lhbiBxdWUgZWwgZnVuY2lvbmFtaWVudG8gZGVsIHNlcnZpY2lvIGRlIHVyZ2VuY2lhcyBlc3TDoSBmdWVydGVtZW50ZSBpbmZsdWVuY2lhZG8gcG9yIGxhIHByaW9yaWRhZCBjbMOtbmljYSwgbGEgZnJhbmphIGhvcmFyaWEgeSBlbCBkw61hIGRlIGxhIHNlbWFuYSwgeSBxdWUgbG9zIHByaW5jaXBhbGVzIHByb2JsZW1hcyBvcGVyYXRpdm9zIGNvbW8gZWwgYWJhbmRvbm8gc2luIGF0ZW5jacOzbiBzZSBjb25jZW50cmFuIGVuIHBhY2llbnRlcyBkZSBtZW5vciB1cmdlbmNpYSB5IGVuIHBlcmlvZG9zIGRlIGFsdGEgZGVtYW5kYS4NCg0KYGBge3IgVGFibGFzX2RlX0NvbnRpbmdlbmNpYSwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQphZGRtYXJnaW5zKHRhYmxlKHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMJG5pdmVsX3VyZ2VuY2lhLCB2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCRyZXN1bHRhZG9fcGFjaWVudGUpKQ0KYWRkbWFyZ2lucyh0YWJsZSh2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCRuaXZlbF91cmdlbmNpYSwgdmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVEwkdGVtcG9yYWRhKSkNCmFkZG1hcmdpbnModGFibGUodmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVEwkcmVzdWx0YWRvX3BhY2llbnRlLCB2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCRkaWFfc2VtYW5hKSkNCmBgYA0KDQojIyMjIyBQcm9iYWJpbGlkYWRlcw0KDQpBIHBhcnRpciBkZWwgYW7DoWxpc2lzIGRlIGxhcyB0YWJsYXMgZGUgcHJvYmFiaWxpZGFkZXMgKGZyZWN1ZW5jaWFzIHJlbGF0aXZhcyBwb3JjZW50dWFsZXMpIHNlIHByb2Z1bmRpemEgbGEgY29tcHJlbnNpw7NuIGRlbCBjb21wb3J0YW1pZW50byBkZWwgc2VydmljaW8gZGUgdXJnZW5jaWFzLCBwZXJtaXRpZW5kbyBpbnRlcnByZXRhciBsb3MgcmVzdWx0YWRvcyBlbiB0w6lybWlub3MgZGUgcHJvYmFiaWxpZGFkIGRlIG9jdXJyZW5jaWEgZGUgbG9zIGRpc3RpbnRvcyBldmVudG9zIGFuYWxpemFkb3MuIEVuIHByaW1lciBsdWdhciwgbGEgcmVsYWNpw7NuIGVudHJlIG5pdmVsIGRlIHVyZ2VuY2lhIHkgcmVzdWx0YWRvIGRlbCBwYWNpZW50ZSBtdWVzdHJhIHF1ZSBlbCA1Nyw1OCAlIGRlbCB0b3RhbCBkZSBhdGVuY2lvbmVzIGN1bG1pbmEgZW4gZWdyZXNvIChEaXNjaGFyZ2VkKSwgbWllbnRyYXMgcXVlIGVsIDM3LDM2ICUgY29ycmVzcG9uZGUgYSBpbmdyZXNvcyBob3NwaXRhbGFyaW9zIChBZG1pdHRlZCkgeSBzb2xvIGVsIDUsMDYgJSBhIGFiYW5kb25vIHNpbiBhdGVuY2nDs24uIFNlIGV2aWRlbmNpYSBxdWUgbG9zIHBhY2llbnRlcyBjcsOtdGljb3MgeSBkZSBhbHRhIHVyZ2VuY2lhIG5vIHByZXNlbnRhbiBhYmFuZG9ubyBzaW4gc2VyIGF0ZW5kaWRvcywgbG8gcXVlIGNvbmZpcm1hIHVuYSBwcmlvcml6YWNpw7NuIGVmZWN0aXZhIGRlIGxvcyBjYXNvcyBtw6FzIGdyYXZlcy4gDQoNCkVuIGNvbnRyYXN0ZSwgbG9zIHBhY2llbnRlcyBkZSB1cmdlbmNpYSBiYWphIGNvbmNlbnRyYW4gbGEgbWF5b3IgcHJvYmFiaWxpZGFkIGRlIGFiYW5kb25vICgzLDk2ICUgZGVsIHRvdGFsKSwgc2VndWlkbyBwb3IgbG9zIGRlIHVyZ2VuY2lhIG1lZGlhICgxLDEwICUpLCBsbyBxdWUgcmVmdWVyemEgbGEgcmVsYWNpw7NuIGVudHJlIG1lbm9yZXMgbml2ZWxlcyBkZSBwcmlvcmlkYWQgY2zDrW5pY2EgeSBtYXlvciByaWVzZ28gZGUgZGVzZXJjacOzbiBkZWwgc2VydmljaW8uDQpSZXNwZWN0byBhIGxhIHJlbGFjacOzbiBlbnRyZSBuaXZlbCBkZSB1cmdlbmNpYSB5IHRlbXBvcmFkYSwgc2Ugb2JzZXJ2YSBxdWUgbGEgZnJhbmphIEV2ZW5pbmcgKHRhcmRl4oCTbm9jaGUpIGNvbmNlbnRyYSBsYSBtYXlvciBwcm9iYWJpbGlkYWQgZGUgYXRlbmNpw7NuLCBjb24gdW4gMzQsNTAgJSBkZWwgdG90YWwgZGUgbG9zIGNhc29zLCBzZWd1aWRhIHBvciBsYSBhZnRlcm5vb24gKDMwLDA0ICUpIHkgbGEgbGF0ZSBtb3JuaW5nICgxNSw0MCAlKS4gRXN0ZSBwYXRyw7NuIHNlIG1hbnRpZW5lIGRlIGZvcm1hIGNvbnNpc3RlbnRlIGVuIHRvZG9zIGxvcyBuaXZlbGVzIGRlIHVyZ2VuY2lhLCBsbyBxdWUgY29uZmlybWEgcXVlIGxhIG1heW9yIHByZXNpw7NuIG9wZXJhdGl2YSBkZWwgc2VydmljaW8gc2UgcHJlc2VudGEgZW4gaG9yYXMgdmVzcGVydGluYXMuDQoNCkZpbmFsbWVudGUsIGVsIGFuw6FsaXNpcyBkZSByZXN1bHRhZG8gZGVsIHBhY2llbnRlIHkgZMOtYSBkZSBsYSBzZW1hbmEgZXZpZGVuY2lhIHF1ZSBsb3MgZWdyZXNvcyBzb24gZWwgZXZlbnRvIG3DoXMgcHJvYmFibGUgZW4gdG9kb3MgbG9zIGTDrWFzLCBjb24gdW5hIG1heW9yIGNvbmNlbnRyYWNpw7NuIGxvcyBsdW5lcyAoOSwwNiAlKSwgbWFydGVzICg4LDk0ICUpIHkganVldmVzICg4LDIyICUpLiBMb3MgaW5ncmVzb3MgaG9zcGl0YWxhcmlvcyBzZSBkaXN0cmlidXllbiBkZSBtYW5lcmEgcmVsYXRpdmFtZW50ZSBob21vZ8OpbmVhIGEgbG8gbGFyZ28gZGUgbGEgc2VtYW5hLCBtaWVudHJhcyBxdWUgbGEgcHJvYmFiaWxpZGFkIGRlIGFiYW5kb25vIHNpbiBhdGVuY2nDs24gZXMgbWF5b3IgbG9zIGx1bmVzICgxLDA2ICUpIHkgdmllcm5lcyAoMCw4NCAlKSwgZGlzbWludXllbmRvIGR1cmFudGUgbG9zIGZpbmVzIGRlIHNlbWFuYS4NCg0KYGBge3IgVGFibGFzX2RlX1Byb2JhYmlsaWRhZGVzLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCmFkZG1hcmdpbnMocHJvcC50YWJsZSh0YWJsZSh2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCRuaXZlbF91cmdlbmNpYSwgdmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVEwkcmVzdWx0YWRvX3BhY2llbnRlKSkqMTAwKQ0KYWRkbWFyZ2lucyhwcm9wLnRhYmxlKHRhYmxlKHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMJG5pdmVsX3VyZ2VuY2lhLCB2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCR0ZW1wb3JhZGEpKSoxMDApDQphZGRtYXJnaW5zKHByb3AudGFibGUodGFibGUodmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVEwkcmVzdWx0YWRvX3BhY2llbnRlLCB2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCRkaWFfc2VtYW5hKSkqMTAwKQ0KYGBgDQoNCiMjIyMjIEZyZWN1ZW5jaWFzIFtDUEYgeSBDUENdDQoNCiBBIHBhcnRpciBkZWwgYW7DoWxpc2lzIGRlIGxhcyBmcmVjdWVuY2lhcyBjb25kaWNpb25hbGVzIHBvciBmaWxhIChDUEYpIHkgcG9yIGNvbHVtbmEgKENQQyksIHNlIG9idGllbmUgdW5hIGludGVycHJldGFjacOzbiBtw6FzIHByZWNpc2EgZGVsIGNvbXBvcnRhbWllbnRvIGRlbCBzZXJ2aWNpbyBkZSB1cmdlbmNpYXMsIGFsIGNvbnNpZGVyYXIgbGFzIHByb2JhYmlsaWRhZGVzIGNvbmRpY2lvbmFkYXMgc2Vnw7puIG5pdmVsIGRlIHVyZ2VuY2lhLCBmcmFuamEgaG9yYXJpYSB5IGTDrWEgZGUgbGEgc2VtYW5hLg0KIA0KRW4gcHJpbWVyIGx1Z2FyLCBsYXMgZnJlY3VlbmNpYXMgY29uZGljaW9uYWxlcyBwb3IgZmlsYSAoQ1BGKSBwYXJhIGxhIHJlbGFjacOzbiBlbnRyZSBuaXZlbCBkZSB1cmdlbmNpYSB5IHJlc3VsdGFkbyBkZWwgcGFjaWVudGUgbXVlc3RyYW4gZGlmZXJlbmNpYXMgY2xhcmFzIGVuIGxvcyBkZXNlbmxhY2VzIHNlZ8O6biBsYSBwcmlvcmlkYWQgY2zDrW5pY2EuIExvcyBwYWNpZW50ZXMgY3LDrXRpY29zIHkgZGUgYWx0YSB1cmdlbmNpYSBwcmVzZW50YW4gcHJvYmFiaWxpZGFkZXMgcHLDoWN0aWNhbWVudGUgZXF1aWxpYnJhZGFzIGVudHJlIGFkbWlzacOzbiBob3NwaXRhbGFyaWEgKDUwLDQwICUgeSA1MCw3NiAlLCByZXNwZWN0aXZhbWVudGUpIHkgZWdyZXNvICg0OSw2MCAlIHkgNDksMjQgJSksIHNpbiByZWdpc3Ryb3MgZGUgYWJhbmRvbm8sIGxvIHF1ZSBjb25maXJtYSB1bmEgYXRlbmNpw7NuIHByaW9yaXRhcmlhIHkgZWZlY3RpdmEgcGFyYSBsb3MgY2Fzb3MgbcOhcyBncmF2ZXMuIEVuIGNvbnRyYXN0ZSwgbG9zIHBhY2llbnRlcyBkZSB1cmdlbmNpYSBiYWphIGV4aGliZW4gdW5hIHByb2JhYmlsaWRhZCBlbGV2YWRhIGRlIGFiYW5kb25vIHNpbiBzZXIgYXRlbmRpZG9zICgxNiwyMCAlKSwgbWllbnRyYXMgcXVlIGVuIGxvcyBjYXNvcyBkZSB1cmdlbmNpYSBtZWRpYSBlc3RlIHZhbG9yIGRlc2NpZW5kZSBhIDQsMjYgJS4gRXN0b3MgcmVzdWx0YWRvcyBldmlkZW5jaWFuIHF1ZSBlbCByaWVzZ28gZGUgZGVzZXJjacOzbiBzZSBjb25jZW50cmEgZW4gbG9zIHBhY2llbnRlcyBjb24gbWVub3IgcHJpb3JpZGFkIGNsw61uaWNhLCBwcm9iYWJsZW1lbnRlIGFzb2NpYWRvIGEgbWF5b3JlcyB0aWVtcG9zIGRlIGVzcGVyYS4NCg0KRW4gY3VhbnRvIGEgbGEgcmVsYWNpw7NuIGVudHJlIG5pdmVsIGRlIHVyZ2VuY2lhIHkgdGVtcG9yYWRhLCBsYXMgQ1BGIG11ZXN0cmFuIHF1ZSwgaW5kZXBlbmRpZW50ZW1lbnRlIGRlbCBuaXZlbCBkZSB1cmdlbmNpYSwgbGEgZnJhbmphIEV2ZW5pbmcgKHRhcmRl4oCTbm9jaGUpIGNvbmNlbnRyYSBsYSBtYXlvciBwcm9wb3JjacOzbiBkZSBhdGVuY2lvbmVzLCBjb24gdmFsb3JlcyBjZXJjYW5vcyBhbCAzM+KAkzM3ICUsIHNlZ3VpZGEgcG9yIGxhIGFmdGVybm9vbi4gTGFzIENQQyBjb25maXJtYW4gcXVlIGxhIGRpc3RyaWJ1Y2nDs24gZGUgbml2ZWxlcyBkZSB1cmdlbmNpYSBlcyByZWxhdGl2YW1lbnRlIGhvbW9nw6luZWEgZGVudHJvIGRlIGNhZGEgZnJhbmphIGhvcmFyaWEsIGF1bnF1ZSBzZSBvYnNlcnZhIHVuYSBsaWdlcmEgbWF5b3IgcGFydGljaXBhY2nDs24gZGUgY2Fzb3MgbWVkaW9zIHkgY3LDrXRpY29zIGVuIGxhcyBob3JhcyBkZSBsYXRlIG1vcm5pbmcgeSBuaWdodCwgbG8gcXVlIHB1ZWRlIGFzb2NpYXJzZSBhIGRpbsOhbWljYXMgZXNwZWPDrWZpY2FzIGRlIGRlbWFuZGEgeSBkaXNwb25pYmlsaWRhZCBkZSByZWN1cnNvcy4NCg0KRmluYWxtZW50ZSwgZWwgYW7DoWxpc2lzIGRlIGxhcyBmcmVjdWVuY2lhcyBjb25kaWNpb25hbGVzIGVudHJlIHJlc3VsdGFkbyBkZWwgcGFjaWVudGUgeSBkw61hIGRlIGxhIHNlbWFuYSBtdWVzdHJhIHF1ZSwgZGVzZGUgbGEgcGVyc3BlY3RpdmEgQ1BGLCBsb3MgaW5ncmVzb3MgaG9zcGl0YWxhcmlvcyBzZSBjb25jZW50cmFuIGVzcGVjaWFsbWVudGUgbG9zIGRvbWluZ29zICgxNywxMyAlKSB5IHPDoWJhZG9zICgxNCwyOSAlKSwgbWllbnRyYXMgcXVlIGxvcyBhYmFuZG9ub3Mgc2luIGF0ZW5jacOzbiBwcmVzZW50YW4gbWF5b3JlcyBwcm9wb3JjaW9uZXMgcmVsYXRpdmFzIGxvcyBsdW5lcyAoMjAsOTUgJSkgeSB2aWVybmVzICgxNiw2MCAlKS4gRGVzZGUgbGEgw7NwdGljYSBDUEMsIHNlIGV2aWRlbmNpYSBxdWUgZW4gdG9kb3MgbG9zIGTDrWFzIHByZWRvbWluYSBlbCBlZ3Jlc28sIGNvbiBwcm9wb3JjaW9uZXMgc3VwZXJpb3JlcyBhbCA1MCAlLCBtaWVudHJhcyBxdWUgZWwgYWJhbmRvbm8gc2UgbWFudGllbmUgcG9yIGRlYmFqbyBkZWwgNyAlIGRpYXJpbywgYXVucXVlIGNvbiBwaWNvcyBtb2RlcmFkb3MgYSBpbmljaW9zIHkgZmluYWxlcyBkZSBzZW1hbmEuDQoNCmBgYHtyIFRhYmxhc19kZV9GcmVjdWVuY2lhc19Db25kaWNpb25hZGFzLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCnJvdW5kKGFkZG1hcmdpbnMocHJvcC50YWJsZSh0YWJsZSh2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCRuaXZlbF91cmdlbmNpYSwgdmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVEwkcmVzdWx0YWRvX3BhY2llbnRlKSwgMSkqMTAwLCAyKSwgMikNCnJvdW5kKGFkZG1hcmdpbnMocHJvcC50YWJsZSh0YWJsZSh2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCRuaXZlbF91cmdlbmNpYSwgdmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVEwkcmVzdWx0YWRvX3BhY2llbnRlKSwgMikqMTAwLCAxKSwgMikNCg0Kcm91bmQoYWRkbWFyZ2lucyhwcm9wLnRhYmxlKHRhYmxlKHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMJG5pdmVsX3VyZ2VuY2lhLCB2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCR0ZW1wb3JhZGEpLCAxKSoxMDAsIDIpLCAyKQ0Kcm91bmQoYWRkbWFyZ2lucyhwcm9wLnRhYmxlKHRhYmxlKHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMJG5pdmVsX3VyZ2VuY2lhLCB2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCR0ZW1wb3JhZGEpLCAyKSoxMDAsIDEpLCAyKQ0KDQpyb3VuZChhZGRtYXJnaW5zKHByb3AudGFibGUodGFibGUodmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVEwkcmVzdWx0YWRvX3BhY2llbnRlLHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMJGRpYV9zZW1hbmEpLCAxKSoxMDAsIDIpLCAyKQ0Kcm91bmQoYWRkbWFyZ2lucyhwcm9wLnRhYmxlKHRhYmxlKHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMJHJlc3VsdGFkb19wYWNpZW50ZSx2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCRkaWFfc2VtYW5hKSwgMikqMTAwLCAxKSwgMikNCmBgYA0KDQojIyMjIyBQZXJmaWxlcyBbQ1BGIHkgQ1BDXQ0KDQpBIHBhcnRpciBkZWwgYW7DoWxpc2lzIGRlIGxvcyBwZXJmaWxlcyBwb3IgZnJlY3VlbmNpYXMgY29uZGljaW9uYWxlcyBwb3IgZmlsYSAoQ1BGKSB5IHBvciBjb2x1bW5hIChDUEMpLCByZXByZXNlbnRhZG9zIG1lZGlhbnRlIGxvcyBncsOhZmljb3MgZGUgYmFycmFzIGFwaWxhZGFzLCBzZSBvYnRpZW5lIHVuYSBjYXJhY3Rlcml6YWNpw7NuIGNsYXJhIHkgY29tcGFyYXRpdmEgZGUgbGEgZXN0cnVjdHVyYSBkZWwgc2VydmljaW8gZGUgdXJnZW5jaWFzIGVuIGZ1bmNpw7NuIGRlbCBuaXZlbCBkZSB1cmdlbmNpYSwgZWwgcmVzdWx0YWRvIGRlbCBwYWNpZW50ZSwgbGEgZnJhbmphIGhvcmFyaWEgeSBlbCBkw61hIGRlIGxhIHNlbWFuYS4NCg0KRW4gcHJpbWVyIGx1Z2FyLCBsb3MgcGVyZmlsZXMgQ1BGIGVudHJlIG5pdmVsIGRlIHVyZ2VuY2lhIHkgcmVzdWx0YWRvIGRlbCBwYWNpZW50ZSBtdWVzdHJhbiBjb21wb3J0YW1pZW50b3MgY2xhcmFtZW50ZSBkaWZlcmVuY2lhZG9zLiBMb3Mgbml2ZWxlcyBjcsOtdGljbyB5IGFsdG8gcHJlc2VudGFuIHBlcmZpbGVzIG11eSBzaW1pbGFyZXMsIGNvbiB1bmEgZGlzdHJpYnVjacOzbiBwcsOhY3RpY2FtZW50ZSBlcXVpbGlicmFkYSBlbnRyZSBhZG1pc2nDs24gaG9zcGl0YWxhcmlhIHkgZWdyZXNvLCB5IGF1c2VuY2lhIHRvdGFsIGRlIGFiYW5kb25vIHNpbiBhdGVuY2nDs24sIGxvIHF1ZSByZWZsZWphIHVuYSBwcmlvcml6YWNpw7NuIGNsw61uaWNhIGVmZWN0aXZhLiBFbiBjb250cmFzdGUsIGVsIG5pdmVsIGRlIHVyZ2VuY2lhIGJhamEgZXhoaWJlIHVuIHBlcmZpbCBkb21pbmFkbyBwb3IgZWwgZWdyZXNvIHkgdW5hIGZyYWNjacOzbiB2aXNpYmxlIGRlIGFiYW5kb25vIHNpbiBzZXIgYXRlbmRpZG8sIGNvbmZpcm1hbmRvIHF1ZSBlc3RlIGdydXBvIGVzIGVsIG3DoXMgdnVsbmVyYWJsZSBhIGxvcyBlZmVjdG9zIGRlIGxhIGNvbmdlc3Rpw7NuIGRlbCBzZXJ2aWNpby4gRWwgbml2ZWwgbWVkaW8gcHJlc2VudGEgdW4gcGVyZmlsIGludGVybWVkaW8sIGNvbiBwcmVkb21pbmlvIGRlbCBlZ3Jlc28geSB1bmEgcHJvcG9yY2nDs24gbW9kZXJhZGEgZGUgYWJhbmRvbm8uIERlc2RlIGxhIHBlcnNwZWN0aXZhIGRlIGxvcyBwZXJmaWxlcyBDUEMsIHNlIG9ic2VydmEgcXVlIGVsIHJlc3VsdGFkbyDigJxMZWZ0IFdpdGhvdXQgQmVpbmcgU2VlbuKAnSBlc3TDoSBjb21wdWVzdG8gbWF5b3JpdGFyaWFtZW50ZSBwb3IgcGFjaWVudGVzIGRlIHVyZ2VuY2lhIGJhamEsIG1pZW50cmFzIHF1ZSBsb3MgcmVzdWx0YWRvcyBkZSBhZG1pc2nDs24geSBlZ3Jlc28gc2UgZGlzdHJpYnV5ZW4gcHJpbmNpcGFsbWVudGUgZW50cmUgbG9zIG5pdmVsZXMgY3LDrXRpY28sIGFsdG8geSBtZWRpby4NCg0KRW4gY3VhbnRvIGEgbG9zIHBlcmZpbGVzIGVudHJlIG5pdmVsIGRlIHVyZ2VuY2lhIHkgdGVtcG9yYWRhLCBsb3MgZ3LDoWZpY29zIENQRiBtdWVzdHJhbiB1bmEgZXN0cnVjdHVyYSBtdXkgaG9tb2fDqW5lYTogZW4gdG9kb3MgbG9zIG5pdmVsZXMgZGUgdXJnZW5jaWEgcHJlZG9taW5hIGxhIGZyYW5qYSBFdmVuaW5nICh0YXJkZeKAk25vY2hlKSwgc2VndWlkYSBwb3IgQWZ0ZXJub29uIHkgTGF0ZSBNb3JuaW5nLCBtaWVudHJhcyBxdWUgRWFybHkgTW9ybmluZyB5IE5pZ2h0IGNvbmNlbnRyYW4gbGFzIG1lbm9yZXMgcHJvcG9yY2lvbmVzLiBMb3MgcGVyZmlsZXMgQ1BDIGNvbmZpcm1hbiBxdWUsIGRlbnRybyBkZSBjYWRhIGZyYW5qYSBob3JhcmlhLCBsYSBjb21wb3NpY2nDs24gcG9yIG5pdmVsZXMgZGUgdXJnZW5jaWEgZXMgcmVsYXRpdmFtZW50ZSBlc3RhYmxlLCBsbyBxdWUgc3VnaWVyZSBxdWUgbGEgbWF5b3IgY2FyZ2Egb3BlcmF0aXZhIGVuIGxhIHRhcmRl4oCTbm9jaGUgcmVzcG9uZGUgYSB1biBhdW1lbnRvIGdlbmVyYWxpemFkbyBkZSBsYSBkZW1hbmRhIHkgbm8gYSB1biB0aXBvIGVzcGVjw61maWNvIGRlIHBhY2llbnRlLg0KDQpgYGB7ciBHcmFmaWNvc19kZV9QZXJmaWxlcywgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpwbG90Y3QodGFibGUodmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVEwkbml2ZWxfdXJnZW5jaWEsIHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMJHJlc3VsdGFkb19wYWNpZW50ZSksInJvdyIpDQpwbG90Y3QodGFibGUodmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVEwkbml2ZWxfdXJnZW5jaWEsIHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMJHJlc3VsdGFkb19wYWNpZW50ZSksImNvbCIpDQoNCnBsb3RjdCh0YWJsZSh2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCRuaXZlbF91cmdlbmNpYSwgdmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVEwkdGVtcG9yYWRhKSwicm93IikNCnBsb3RjdCh0YWJsZSh2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCRuaXZlbF91cmdlbmNpYSwgdmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVEwkdGVtcG9yYWRhKSwiY29sIikNCg0KcGxvdGN0KHRhYmxlKHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMJHJlc3VsdGFkb19wYWNpZW50ZSx2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCRkaWFfc2VtYW5hKSwicm93IikNCnBsb3RjdCh0YWJsZSh2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCRyZXN1bHRhZG9fcGFjaWVudGUsdmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVEwkZGlhX3NlbWFuYSksImNvbCIpDQpgYGANCg0KIyMjIyMgUHJ1ZWJhcyBkZSBIaXDDs3Rlc2lzDQoNCkEgcGFydGlyIGRlIGxvcyByZXN1bHRhZG9zIGRlIGxhcyBwcnVlYmFzIGRlIGhpcMOzdGVzaXMgbWVkaWFudGUgZWwgZXN0YWTDrXN0aWNvIENoaS1jdWFkcmFkbyBkZSBQZWFyc29uLCBzZSBldmFsw7phIGxhIGV4aXN0ZW5jaWEgZGUgYXNvY2lhY2lvbmVzIHNpZ25pZmljYXRpdmFzIGVudHJlIGxhcyB2YXJpYWJsZXMgY2F0ZWfDs3JpY2FzIGFuYWxpemFkYXMgZW4gZWwgc2VydmljaW8gZGUgdXJnZW5jaWFzLiBFbiBwcmltZXIgbHVnYXIsIGxhIHBydWViYSBhcGxpY2FkYSBlbnRyZSBlbCBuaXZlbCBkZSB1cmdlbmNpYSB5IGVsIHJlc3VsdGFkbyBkZWwgcGFjaWVudGUgYXJyb2phIHVuIHZhbG9yIGRlIM+HwrIgPSA5MDgsMTYsIGNvbiA2IGdyYWRvcyBkZSBsaWJlcnRhZCB5IHVuIHAtdmFsb3IgPCAyLDJlLTE2LCBsbyBxdWUgY29uZHVjZSBhbCByZWNoYXpvIGNvbnR1bmRlbnRlIGRlIGxhIGhpcMOzdGVzaXMgbnVsYSBkZSBpbmRlcGVuZGVuY2lhLiBFc3RlIHJlc3VsdGFkbyBldmlkZW5jaWEgdW5hIGFzb2NpYWNpw7NuIGVzdGFkw61zdGljYW1lbnRlIHNpZ25pZmljYXRpdmEgeSBtdXkgZnVlcnRlIGVudHJlIGxhIHByaW9yaWRhZCBjbMOtbmljYSBhc2lnbmFkYSBhbCBwYWNpZW50ZSB5IHN1IGRlc2VubGFjZSAoYWRtaXNpw7NuLCBlZ3Jlc28gbyBhYmFuZG9ubyBzaW4gYXRlbmNpw7NuKS4NCg0KUG9yIGVsIGNvbnRyYXJpbywgbGEgcHJ1ZWJhIHJlYWxpemFkYSBlbnRyZSBlbCBuaXZlbCBkZSB1cmdlbmNpYSB5IGxhIHRlbXBvcmFkYSAoZnJhbmphIGhvcmFyaWEpIHByZXNlbnRhIHVuIGVzdGFkw61zdGljbyBkZSDPh8KyID0gMTcsOTIsIGNvbiAxMiBncmFkb3MgZGUgbGliZXJ0YWQgeSB1biBwLXZhbG9yID0gMCwxMTgzLCBzdXBlcmlvciBhbCBuaXZlbCBkZSBzaWduaWZpY2FuY2lhIGhhYml0dWFsICjOsSA9IDAsMDUpLiBFbiBlc3RlIGNhc28sIG5vIHNlIHJlY2hhemEgbGEgaGlww7N0ZXNpcyBudWxhLCBsbyBxdWUgaW5kaWNhIHF1ZSBubyBleGlzdGUgZXZpZGVuY2lhIGVzdGFkw61zdGljYSBzdWZpY2llbnRlIGRlIGFzb2NpYWNpw7NuIGVudHJlIGVsIG5pdmVsIGRlIHVyZ2VuY2lhIHkgbGEgZnJhbmphIGhvcmFyaWEuIA0KDQpGaW5hbG1lbnRlLCBsYSBwcnVlYmEgZGUgaW5kZXBlbmRlbmNpYSBlbnRyZSBlbCByZXN1bHRhZG8gZGVsIHBhY2llbnRlIHkgZWwgZMOtYSBkZSBsYSBzZW1hbmEgYXJyb2phIHVuIHZhbG9yIGRlIM+HwrIgPSAzMCw3MywgY29uIDEyIGdyYWRvcyBkZSBsaWJlcnRhZCB5IHVuIHAtdmFsb3IgPSAwLDAwMjE3LCBsbyBxdWUgaW1wbGljYSBlbCByZWNoYXpvIGRlIGxhIGhpcMOzdGVzaXMgbnVsYS4gRXN0byBpbmRpY2EgbGEgZXhpc3RlbmNpYSBkZSB1bmEgYXNvY2lhY2nDs24gZXN0YWTDrXN0aWNhbWVudGUgc2lnbmlmaWNhdGl2YSBlbnRyZSBlbCBkw61hIGRlIGxhIHNlbWFuYSB5IGVsIGRlc2VubGFjZSBkZWwgcGFjaWVudGUuIA0KDQpgYGB7ciBQcnVlYmFzX2RlX0NvcnJlc3BvbmRlbmNpYSwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpjaGlzcS50ZXN0KHRhYmxlKHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMJG5pdmVsX3VyZ2VuY2lhLCB2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCRyZXN1bHRhZG9fcGFjaWVudGUpKQ0KY2hpc3EudGVzdCh0YWJsZSh2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCRuaXZlbF91cmdlbmNpYSwgdmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVEwkdGVtcG9yYWRhKSkNCmNoaXNxLnRlc3QodGFibGUodmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVEwkcmVzdWx0YWRvX3BhY2llbnRlLHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMJGRpYV9zZW1hbmEpKQ0KYGBgDQoNCiMjIyMgQUMgUGFyZWphIMOabmljYSB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQojIyMjIyBDb250aW5nZW5jaWFzIHkgUmVzaWR1YWxlcyBbVC1DUF0NCg0KQSBwYXJ0aXIgZGVsIGFuw6FsaXNpcyBjb25qdW50byBkZSBsYXMgZnJlY3VlbmNpYXMgb2JzZXJ2YWRhcywgZXNwZXJhZGFzIHkgbG9zIHJlc2lkdWFsZXMgKHNpbXBsZXMgeSB0aXBpZmljYWRvcykgZGUgbGEgcHJ1ZWJhIENoaS1jdWFkcmFkbyBlbnRyZSBlbCBuaXZlbCBkZSB1cmdlbmNpYSB5IGVsIHJlc3VsdGFkbyBkZWwgcGFjaWVudGUsIHNlIGlkZW50aWZpY2FuIGNvbiBjbGFyaWRhZCBsb3MgcGF0cm9uZXMgZXNwZWPDrWZpY29zIHF1ZSBleHBsaWNhbiBsYSBmdWVydGUgYXNvY2lhY2nDs24gZXN0YWTDrXN0aWNhIHByZXZpYW1lbnRlIGNvbmZpcm1hZGEgcG9yIGxhIHBydWViYSBkZSBoaXDDs3Rlc2lzLg0KDQpFbiBwcmltZXIgbHVnYXIsIGxhIGNvbXBhcmFjacOzbiBlbnRyZSBsYXMgZnJlY3VlbmNpYXMgb2JzZXJ2YWRhcyB5IGVzcGVyYWRhcyBtdWVzdHJhIGRlc3ZpYWNpb25lcyBzdXN0YW5jaWFsZXMgZW4gdmFyaWFzIGNvbWJpbmFjaW9uZXMuIEVuIGxvcyBuaXZlbGVzIGNyw610aWNvIHkgYWx0bywgZWwgbsO6bWVybyBkZSBwYWNpZW50ZXMgYWRtaXRpZG9zIGVzIGNvbnNpZGVyYWJsZW1lbnRlIG1heW9yIGFsIGVzcGVyYWRvIGJham8gZWwgc3VwdWVzdG8gZGUgaW5kZXBlbmRlbmNpYSwgbWllbnRyYXMgcXVlIGxvcyBjYXNvcyBkZSBhYmFuZG9ubyBzaW4gc2VyIGF0ZW5kaWRvcyBzb24gbnVsb3MsIGEgcGVzYXIgZGUgcXVlIGVsIG1vZGVsbyBlc3BlcmFiYSBhbHJlZGVkb3IgZGUgNjMgY2Fzb3MgZW4gY2FkYSBuaXZlbC4gRXN0byBpbmRpY2EgdW5hIHNvYnJlcHJvdGVjY2nDs24gY2zDrW5pY2EgZGVsaWJlcmFkYSBoYWNpYSBsb3MgcGFjaWVudGVzIGRlIG1heW9yIGdyYXZlZGFkLCBnYXJhbnRpemFuZG8gc3UgYXRlbmNpw7NuIHkgZXZpdGFuZG8gbGEgZGVzZXJjacOzbiBkZWwgc2VydmljaW8uDQpQb3IgZWwgY29udHJhcmlvLCBlbCBuaXZlbCBkZSB1cmdlbmNpYSBiYWphIHByZXNlbnRhIGVsIHBhdHLDs24gb3B1ZXN0by4gRW4gZXN0ZSBncnVwbyBzZSBvYnNlcnZhIHVuYSBmcmVjdWVuY2lhIGRlIGFiYW5kb25vICgxOTggY2Fzb3MpIG11eSBzdXBlcmlvciBhIGxhIGVzcGVyYWRhICjiiYg2MiBjYXNvcyksIGFzw60gY29tbyB1bmEgc3VicmVwcmVzZW50YWNpw7NuIG1hcmNhZGEgZGUgYWRtaXNpb25lcyBmcmVudGUgYSBsbyBxdWUgcHJlZGVjaXLDrWEgbGEgaW5kZXBlbmRlbmNpYS4gRXN0ZSBjb21wb3J0YW1pZW50byBzZSByZWZsZWphIGVuIGxvcyByZXNpZHVhbGVzIHBvc2l0aXZvcyBtdXkgZWxldmFkb3MgcGFyYSDigJxMZWZ0IFdpdGhvdXQgQmVpbmcgU2VlbuKAnSB5IG5lZ2F0aXZvcyBwYXJhIOKAnEFkbWl0dGVk4oCdLg0KDQpMb3MgcmVzaWR1YWxlcyB0aXBpZmljYWRvcyByZWZ1ZXJ6YW4gZXN0YXMgY29uY2x1c2lvbmVzLCBtb3N0cmFuZG8gdmFsb3JlcyBleHRyZW1hZGFtZW50ZSBhbHRvcyBlbiBtYWduaXR1ZCAofHp8ID4gMikgcGFyYSBsYXMgY29tYmluYWNpb25lcyBjcsOtdGljYXMuIERlc3RhY2FuIGxvcyByZXNpZHVhbGVzIHBvc2l0aXZvcyBlbGV2YWRvcyBlbiBhZG1pc2lvbmVzIGRlIHBhY2llbnRlcyBjcsOtdGljb3MgeSBhbHRvcywgeSBsb3MgcmVzaWR1YWxlcyBuZWdhdGl2b3MgbXV5IHByb251bmNpYWRvcyBlbiBhYmFuZG9ubyBwYXJhIGVzdG9zIG1pc21vcyBuaXZlbGVzLCBsbyBxdWUgY29uZmlybWEgcXVlIGVzdGFzIGNlbGRhcyBjb250cmlidXllbiBkZSBtYW5lcmEgZGVjaXNpdmEgYWwgdmFsb3IgZWxldmFkbyBkZWwgZXN0YWTDrXN0aWNvIENoaS1jdWFkcmFkby4gDQoNCmBgYHtyIENvbnRpbmdlbmNpYXNfeV9SZXNpZHVhbGVzLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCmNoaXNxLnRlc3QodGFibGUodmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVEwkbml2ZWxfdXJnZW5jaWEsIHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMJHJlc3VsdGFkb19wYWNpZW50ZSkpJG9ic2VydmVkDQpjaGlzcS50ZXN0KHRhYmxlKHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMJG5pdmVsX3VyZ2VuY2lhLCB2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCRyZXN1bHRhZG9fcGFjaWVudGUpKSRleHBlY3RlZCANCmNoaXNxLnRlc3QodGFibGUodmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVEwkbml2ZWxfdXJnZW5jaWEsIHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMJHJlc3VsdGFkb19wYWNpZW50ZSkpJHJlc2lkdWFscw0KY2hpc3EudGVzdCh0YWJsZSh2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCRuaXZlbF91cmdlbmNpYSwgdmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVEwkcmVzdWx0YWRvX3BhY2llbnRlKSkkc3RkcmVzDQpgYGANCg0KIyMjIyMgQ29udHJpYnVjaW9uZXMgW1QtQ1BdDQoNCkVsIGFuw6FsaXNpcyBkZSBsYXMgY29udHJpYnVjaW9uZXMgZGUgbGFzIGNlbGRhcyBhbCBlc3RhZMOtc3RpY28gQ2hpLWN1YWRyYWRvIChULUNQKSBwZXJtaXRlIGlkZW50aWZpY2FyIGNvbiBwcmVjaXNpw7NuIHF1w6kgY29tYmluYWNpb25lcyBkZSBuaXZlbCBkZSB1cmdlbmNpYSB5IHJlc3VsdGFkbyBkZWwgcGFjaWVudGUgZXhwbGljYW4gbGEgZGVwZW5kZW5jaWEgb2JzZXJ2YWRhIGVudHJlIGFtYmFzIHZhcmlhYmxlcy4NCg0KTG9zIHJlc3VsdGFkb3MgbXVlc3RyYW4gcXVlIGVsIG5pdmVsIGRlIHVyZ2VuY2lhIGJham8gZXMgZWwgcHJpbmNpcGFsIHJlc3BvbnNhYmxlIGRlIGxhIGFzb2NpYWNpw7NuIGVzdGFkw61zdGljYS4gRW4gcGFydGljdWxhciwgbGEgY29tYmluYWNpw7NuIOKAnExvdyDigJMgTGVmdCBXaXRob3V0IEJlaW5nIFNlZW7igJ0gYXBvcnRhIGFwcm94aW1hZGFtZW50ZSAzMywwMiAlIGRlbCB2YWxvciB0b3RhbCBkZWwgQ2hpLWN1YWRyYWRvLCBjb25zdGl0dXnDqW5kb3NlIGNvbW8gbGEgbWF5b3IgY29udHJpYnVjacOzbiBpbmRpdmlkdWFsLiBEZSBmb3JtYSBjb21wbGVtZW50YXJpYSwgbGEgY29tYmluYWNpw7NuIOKAnExvdyDigJMgQWRtaXR0ZWTigJ0gY29udHJpYnV5ZSBjb24gY2VyY2EgZGVsIDI5LDY0ICUsIGxvIHF1ZSBpbmRpY2EgdW5hIGRlc3ZpYWNpw7NuIG11eSBtYXJjYWRhIHJlc3BlY3RvIGEgbG8gZXNwZXJhZG8gYmFqbyBpbmRlcGVuZGVuY2lhLiBFbiBjb25qdW50bywgZXN0YXMgZG9zIGNlbGRhcyBjb25jZW50cmFuIG3DoXMgZGVsIDYwICUgZGUgbGEgZGVwZW5kZW5jaWEgdG90YWwsIGV2aWRlbmNpYW5kbyBxdWUgZWwgY29tcG9ydGFtaWVudG8gZGUgbG9zIHBhY2llbnRlcyBkZSBiYWphIHVyZ2VuY2lhIGVzIGVsIHByaW5jaXBhbCBmYWN0b3IgZXN0cnVjdHVyYWwgcXVlIHJvbXBlIGxhIGluZGVwZW5kZW5jaWEgZW50cmUgbGFzIHZhcmlhYmxlcy4NCg0KRW4gbG9zIG5pdmVsZXMgY3LDrXRpY28geSBhbHRvLCBsYXMgY29udHJpYnVjaW9uZXMgc2UgZGlzdHJpYnV5ZW4gcHJpbmNpcGFsbWVudGUgZW50cmUgbG9zIHJlc3VsdGFkb3MgQWRtaXR0ZWQgeSBMZWZ0IFdpdGhvdXQgQmVpbmcgU2VlbiwgY29uIHZhbG9yZXMgY2VyY2Fub3MgYWwgNuKAkzcgJSBwb3IgY2VsZGEuIEF1bnF1ZSBlc3RhcyBjb250cmlidWNpb25lcyBzb24gc2lnbmlmaWNhdGl2YW1lbnRlIG1lbm9yZXMgcXVlIGxhcyBvYnNlcnZhZGFzIGVuIGxhIHVyZ2VuY2lhIGJhamEsIHNpZ3VlbiBzaWVuZG8gcmVsZXZhbnRlcyB5IHJlZmxlamFuIHVuYSBzb2JyZXJyZXByZXNlbnRhY2nDs24gZGUgYWRtaXNpb25lcyB5IHVuYSBzdWJyZXByZXNlbnRhY2nDs24gZGVsIGFiYW5kb25vLCBjb2hlcmVudGUgY29uIGxhIHByaW9yaXphY2nDs24gY2zDrW5pY2EgZGUgZXN0b3MgcGFjaWVudGVzLiBQb3IgZWwgY29udHJhcmlvLCBlbCBuaXZlbCBkZSB1cmdlbmNpYSBtZWRpYSBwcmVzZW50YSBjb250cmlidWNpb25lcyBwcsOhY3RpY2FtZW50ZSBudWxhcyBlbiB0b2RhcyBsYXMgY2F0ZWdvcsOtYXMgZGUgcmVzdWx0YWRvIChpbmZlcmlvcmVzIGFsIDAsMiAlKSwgbG8gcXVlIGluZGljYSBxdWUgc3UgZGlzdHJpYnVjacOzbiBkZSByZXN1bHRhZG9zIGVzIG11eSBjZXJjYW5hIGEgbGEgZXNwZXJhZGEgYmFqbyBpbmRlcGVuZGVuY2lhIHksIHBvciB0YW50bywgbm8gZGVzZW1wZcOxYSB1biBwYXBlbCBkZXRlcm1pbmFudGUgZW4gbGEgYXNvY2lhY2nDs24gZ2xvYmFsLg0KDQpgYGB7ciBDb250cmlidWNpb25lc19SLVVSLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCmNoaXNxLnRlc3QodGFibGUodmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVEwkbml2ZWxfdXJnZW5jaWEsIHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMJHJlc3VsdGFkb19wYWNpZW50ZSkpJHJlc2lkdWFsc14yL2NoaXNxLnRlc3QodGFibGUodmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVEwkbml2ZWxfdXJnZW5jaWEsIHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMJHJlc3VsdGFkb19wYWNpZW50ZSkpJHN0YXRpc3RpYyoxMDANCmBgYA0KDQojIyMjIyBDb3JyZXNwb25kZW5jaWEgU2ltcGxlIFVuaWRpbWVuc2lvbmFsIFtSLVVSXQ0KDQpFbCBhbsOhbGlzaXMgZGUgbGEgQ29ycmVzcG9uZGVuY2lhIFNpbXBsZSBVbmlkaW1lbnNpb25hbCAoUi1VUikgZW50cmUgZWwgbml2ZWwgZGUgdXJnZW5jaWEgeSBlbCByZXN1bHRhZG8gZGVsIHBhY2llbnRlIGNvbmZpcm1hIHF1ZSBsYSByZWxhY2nDs24gZW50cmUgYW1iYXMgdmFyaWFibGVzIHB1ZWRlIGV4cGxpY2Fyc2UgY2FzaSBlbiBzdSB0b3RhbGlkYWQgbWVkaWFudGUgdW5hIHNvbGEgZGltZW5zacOzbiBpbnRlcnByZXRhdGl2YS4gRW4gZWZlY3RvLCBsYSBEaW1lbnNpw7NuIDEgZXhwbGljYSBlbCA5OSw5OSAlIGRlIGxhIGluZXJjaWEgdG90YWwsIG1pZW50cmFzIHF1ZSBsYSBEaW1lbnNpw7NuIDIgYXBvcnRhIHVuYSBwcm9wb3JjacOzbiBkZXNwcmVjaWFibGUgZGUgdmFyaWFiaWxpZGFkLCBsbyBxdWUgdmFsaWRhIHVuYSByZXByZXNlbnRhY2nDs24gZXNlbmNpYWxtZW50ZSB1bmlkaW1lbnNpb25hbCBkZSBsYSBhc29jaWFjacOzbi4NCg0KRGVzZGUgZWwgcHVudG8gZGUgdmlzdGEgZGUgbGFzIGNhdGVnb3LDrWFzIGRlIHJlc3VsdGFkbyAoY29sdW1uYXMpLCBsYXMgY29vcmRlbmFkYXMgc29icmUgbGEgRGltZW5zacOzbiAxIG11ZXN0cmFuIHVuYSBjbGFyYSBvcG9zaWNpw7NuIGVudHJlIOKAnExlZnQgV2l0aG91dCBCZWluZyBTZWVu4oCdLCB1YmljYWRvIGVuIGVsIGV4dHJlbW8gcG9zaXRpdm8gZGVsIGVqZSwgeSDigJxBZG1pdHRlZOKAnSwgc2l0dWFkbyBlbiBlbCBleHRyZW1vIG5lZ2F0aXZvLiBFbCByZXN1bHRhZG8g4oCcRGlzY2hhcmdlZOKAnSBhcGFyZWNlIGNlcmNhbm8gYWwgb3JpZ2VuLCBpbmRpY2FuZG8gdW4gY29tcG9ydGFtaWVudG8gbcOhcyBwcm9tZWRpbyB5IG1lbm9zIGRpc2NyaW1pbmFudGUuIExhcyBjb250cmlidWNpb25lcyBjb25maXJtYW4gZXN0ZSBwYXRyw7NuOiDigJxMZWZ0IFdpdGhvdXQgQmVpbmcgU2VlbuKAnSAoNDcsMDYgJSkgeSDigJxBZG1pdHRlZOKAnSAoNDIsNTcgJSkgc29uIGxhcyBjYXRlZ29yw61hcyBxdWUgbcOhcyBleHBsaWNhbiBsYSBlc3RydWN0dXJhIGRlIGxhIGRpbWVuc2nDs24gcHJpbmNpcGFsLCBtaWVudHJhcyBxdWUg4oCcRGlzY2hhcmdlZOKAnSB0aWVuZSB1biBhcG9ydGUgbWVub3IuIEFkZW3DoXMsIGxvcyB2YWxvcmVzIGRlIGNvc8KyIGNlcmNhbm9zIGEgMSBpbmRpY2FuIHF1ZSBlc3RhcyBjYXRlZ29yw61hcyBlc3TDoW4gbXV5IGJpZW4gcmVwcmVzZW50YWRhcyBlbiBsYSBEaW1lbnNpw7NuIDEuDQoNCkVuIGN1YW50byBhIGxhcyBjYXRlZ29yw61hcyBkZSBuaXZlbCBkZSB1cmdlbmNpYSAoZmlsYXMpLCBsYSB1cmdlbmNpYSBiYWphIHNlIHBvc2ljaW9uYSBjbGFyYW1lbnRlIGVuIGVsIGV4dHJlbW8gcG9zaXRpdm8gZGUgbGEgRGltZW5zacOzbiAxIHkgYXBvcnRhIGNlcmNhIGRlbCA2OSw4NSAlIGRlIGxhIGNvbnRyaWJ1Y2nDs24gdG90YWwsIGNvbnNvbGlkw6FuZG9zZSBjb21vIGVsIHByaW5jaXBhbCBmYWN0b3IgZXhwbGljYXRpdm8gZGUgbGEgYXNvY2lhY2nDs24uIEVuIGVsIGV4dHJlbW8gb3B1ZXN0byBzZSB1YmljYW4gbG9zIG5pdmVsZXMgY3LDrXRpY28geSBhbHRvLCBjb24gY29vcmRlbmFkYXMgbmVnYXRpdmFzIHkgY29udHJpYnVjaW9uZXMgbW9kZXJhZGFzLCBtaWVudHJhcyBxdWUgbGEgdXJnZW5jaWEgbWVkaWEgc2UgbWFudGllbmUgcHLDs3hpbWEgYWwgb3JpZ2VuLCByZWZsZWphbmRvIHVuIGNvbXBvcnRhbWllbnRvIGNlcmNhbm8gYWwgcHJvbWVkaW8geSBjb24gZXNjYXNhIGNhcGFjaWRhZCBkaXNjcmltaW5hbnRlLiANCg0KYGBge3IgQmlwbG90X0NvcnJlc3BvbmRlbmNpYV9TaW1wbGVfUi1VUiwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpDQSh0YWJsZSh2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCRuaXZlbF91cmdlbmNpYSwgdmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVEwkcmVzdWx0YWRvX3BhY2llbnRlKSwgZ3JhcGggPSBGQUxTRSkkZWlnDQpDQSh0YWJsZSh2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCRuaXZlbF91cmdlbmNpYSwgdmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVEwkcmVzdWx0YWRvX3BhY2llbnRlKSwgZ3JhcGggPSBGQUxTRSkkY29sDQpDQSh0YWJsZSh2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCRuaXZlbF91cmdlbmNpYSwgdmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVEwkcmVzdWx0YWRvX3BhY2llbnRlKSwgZ3JhcGggPSBGQUxTRSkkcm93DQpgYGANCg0KIyMjIDMuMy4gQ29ycmVzcG9uZGVuY2lhcyBNw7psdGlwbGVzIHsudGFic2V0IC50YWJzZXQtcGlsbHN9Lg0KDQpFbCBhbsOhbGlzaXMgZGUgY29ycmVzcG9uZGVuY2lhcyBtw7psdGlwbGVzICoqKEFDTSkqKiBzZSBjb25zdHJ1eWUgc29icmUgZXN0YSB0YWJsYSBkaXN5dW50aXZhLCBhcGxpY2FuZG8gZWwgbcOpdG9kbyBkZSBjb3JyZXNwb25kZW5jaWFzIGRlIGZvcm1hIGNvbmp1bnRhIGEgdG9kYXMgbGFzICoqdmFyaWFibGVzIGNhdGVnw7NyaWNhcyoqLCBwYXJ0aWNpb25hbmRvIGRlIG1hbmVyYSBleGNsdXNpdmEgeSBleGhhdXN0aXZhIGEgbGEgcG9ibGFjacOzbiBlbiBmdW5jacOzbiBkZSBzdXMgY2FyYWN0ZXLDrXN0aWNhcy4NCg0KRXN0YSBzZWNjacOzbiBzZSBwbGFudGVhIGNvbW8gdW5hIHNvbHVjacOzbiBjb21wbGVtZW50YXJpYSBhbCAqKkFDUyoqLCBjdXlvIGFuw6FsaXNpcyBlbiBsYSBbc2VjY2nDs24zLjJdKCNzZWMzLjIpIGVzdHV2byBsaW1pdGFkbyBwb3IgbGEgbmF0dXJhbGV6YSB1bmlkaW1lbnNpb25hbCBkZSBsb3MgZGF0b3MgeSBsYSAqKmltcG9zaWJpbGlkYWQgZGUgdW5hIHJlcHJlc2VudGFjacOzbiBiaWRpbWVuc2lvbmFsIHNpZ25pZmljYXRpdmEqKi4gUG9yIGVsbG8sIG1lZGlhbnRlIGVsICoqQUNNKiogeSBlbCB0cmF0YW1pZW50byBjb25qdW50byBkZSB0b2RhcyBsYXMgdmFyaWFibGVzIGNhdGVnw7NyaWNhcyByZWxhY2lvbmFkYXMsIHNlIGJ1c2NhIGNvbnN0cnVpciB1bmEgcmVwcmVzZW50YWNpw7NuIG3DoXMgY29tcGxldGEgZW4gZWwgcHJpbWVyIHBsYW5vIGZhY3RvcmlhbCwgb2ZyZWNpZW5kbyB1bmEgdmlzacOzbiBpbnRlZ3JhbCBkZSBsYXMgYXNvY2lhY2lvbmVzIGNsw61uaWNhcyBtw6FzIHJlbGV2YW50ZXMuDQoNCiMjIyMgQUNNDQpgYGB7ciBBQ00sIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0Kcm91bmQoTUNBKHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMWzE6NTAwMCwgLWMoMSwzLDQsNiw3LDgsOSwxMCwxMSwxMiwxNCldLCBncmFwaCA9IEZBTFNFKSRlaWcsMikNCg0KYGBgDQoNCiMjIyMgQmlwbG90IEFDTQ0KDQpFbCBhbmFsaXNpcyBkZSBjb3JyZXNwb25kZW5jaWFzIG11bHRpcGxlcyAoQUNNKSBFcyB1bmEgdMOpY25pY2EgZXhjZWxlbnRlIHBhcmEgZW5jb250cmFyIHBhdHJvbmVzIGVuIGRhdG9zIGNhdGVnw7NyaWNvcyBjb21vIGxvcyBkZSB1bmEgc2FsYSBkZSB1cmdlbmNpYXMuDQoNCkVsIGRpYWdyYW1hIGJpcGxvdCwgcXVlIGV4cGxpY2EgdW4gNDAuOCUgZGUgbGEgdmFyaWFiaWxpZGFkIHRvdGFsIGRlIGxvcyBkYXRvcywgcmV2ZWxhIHVuYSBzZWdtZW50YWNpw7NuIGNsYXJhIGVuIGxhIGRpbsOhbWljYSBkZSBsYSBzYWxhIGRlIHVyZ2VuY2lhcywgaWRlbnRpZmljYW5kbyB0cmVzIHBlcmZpbGVzIGRlIHBhY2llbnRlcyBiaWVuIGRpZmVyZW5jaWFkb3M6IEV4aXN0ZSB1bmEgZnVlcnRlIGNvcnJlbGFjacOzbiBlbnRyZSBsb3MgcGFjaWVudGVzIGNsYXNpZmljYWRvcyBjb24gcHJpb3JpZGFkICJDcml0aWNhbCIgKENyw610aWNhKSB5ICJIaWdoIiAoQWx0YSkgY29uIGVsIGRlc2VubGFjZSBkZSBzZXIgIkFkbWl0dGVkIiAoSG9zcGl0YWxpemFkb3MpLiBTZSBvYnNlcnZhIHVuIGFncnVwYW1pZW50byBkaXN0aW50byBkZSBwYWNpZW50ZXMgY29uIHByaW9yaWRhZCAiTWVkaXVtIiAoTWVkaWEpIHByb3ZlbmllbnRlcyBkZSB6b25hcyAiUnVyYWxlcyIuIEVzdGUgZ3J1cG8gZXN0w6EgZnVlcnRlbWVudGUgdmluY3VsYWRvIGFsIGVzdGFkbyAiRGlzY2hhcmdlZCIgKERhZG9zIGRlIGFsdGEpLCBpbmRpY2FuZG8gcXVlIGxhIGFmbHVlbmNpYSBydXJhbCB0aWVuZGUgYSBwcmVzZW50YXIgcGF0b2xvZ8OtYXMgcXVlIHNlIHJlc3VlbHZlbiBlbiBsYSBtaXNtYSBzYWxhIGRlIHVyZ2VuY2lhcyBzaW4gcmVxdWVyaXIgaG9zcGl0YWxpemFjacOzbi4gTGFzIGNhdGVnb3LDrWFzIGRlIHByaW9yaWRhZCAiTG93IiAoQmFqYSkgc2UgcHJveWVjdGFuIGVuIGxhIG1pc21hIGRpcmVjY2nDs24gcXVlIGxhIGNhdGVnb3LDrWEgIkxlZnQgV2l0aG91dCBCZWluZyBTZWVuIiAoU2UgZnVlIHNpbiBzZXIgdmlzdG8pLiBFc3RvIGFsZXJ0YSBzb2JyZSB1biBwb3NpYmxlIHByb2JsZW1hIG9wZXJhdGl2bzogbG9zIHBhY2llbnRlcyBjb24gbWVub3IgdXJnZW5jaWEgcG9kcsOtYW4gZXN0YXIgZW5mcmVudGFuZG8gdGllbXBvcyBkZSBlc3BlcmEgcHJvbG9uZ2Fkb3MgcXVlIGxvcyBtb3RpdmFuIGEgYWJhbmRvbmFyIGVsIHNlcnZpY2lvIGFudGVzIGRlIHJlY2liaXIgYXRlbmNpw7NuLg0KDQpgYGB7ciBCaXBsb3RfQUNNLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCg0KZnZpel9tY2FfYmlwbG90KE1DQSh2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTFsxOjUwMDAsIC1jKDEsMyw0LDYsNyw4LDksMTAsMTEsMTIsMTQpXSwgZ3JhcGggPSBGQUxTRSksIHJlcGVsID0gVFJVRSkNCg0KYGBgDQoNCiMjIyMgQmlwbG90IEFDTSBSZWR1Y2lkbw0KDQpBbCBhbmFsaXphciB1bmEgc3ViLW11ZXN0cmEgcmVwcmVzZW50YXRpdmEgZGUgMTUwIHBhY2llbnRlcyBtZWRpYW50ZSB1biBCaXBsb3QgQUNNLCBoZW1vcyBsb2dyYWRvIGFpc2xhciBjb21wb3J0YW1pZW50b3MgZXNwZWPDrWZpY29zLiBNaWVudHJhcyBxdWUgbGEgZ3JhbiBtYXlvcsOtYSBkZSBsb3MgcGFjaWVudGVzIHNlIGFncnVwYW4gZW4gZmx1am9zIGRlIGF0ZW5jacOzbiBlc3TDoW5kYXIgKEluZ3Jlc28gcG9yIGVzdGFkbyBDcsOtdGljbyB2cy4gQWx0YSBtw6lkaWNhKSwgZGVzdGFjYSB1biBncnVwbyBkaXNvY2lhZG8gZW4gZWwgY3VhZHJhbnRlIHN1cGVyaW9yIGRlcmVjaG8uDQoNCkVzdGUgZ3J1cG8sIHJlcHJlc2VudGFkbyBwb3IgbGEgY2F0ZWdvcsOtYSAnTGVmdCBXaXRob3V0IEJlaW5nIFNlZW4nLCBubyBjb21wYXJ0ZSBjYXJhY3RlcsOtc3RpY2FzIG5pIGNvbiBsb3MgcGFjaWVudGVzIGdyYXZlcyBuaSBjb24gbG9zIGxldmVzIGRhZG9zIGRlIGFsdGEuIExhIGlkZW50aWZpY2FjacOzbiBkZSBpbmRpdmlkdW9zIGVzcGVjw61maWNvcyBlbiBlc3RlIGNsw7pzdGVyIChlai4gcGFjaWVudGVzIElEIDM2LCAxMDUpIHN1Z2llcmUgcXVlIGVsIGFiYW5kb25vIGRlbCBzZXJ2aWNpbyBubyBlcyBhbGVhdG9yaW8sIHNpbm8gcXVlIHJlc3BvbmRlIGEgdW4gcGVyZmlsIHBhcnRpY3VsYXIgcXVlIHJlcXVpZXJlIHVuYSBhdWRpdG9yw61hIG9wZXJhdGl2YSBlc3BlY8OtZmljYS4NCg0KYGBge3IgQmlwbG90X0FDTV9SZWR1Y2lkbywgZmlnLmFsaWduPSdjZW50ZXInfQ0Kc2V0LnNlZWQoNzgwNzI4KQ0KZnZpel9tY2FfYmlwbG90KE1DQSh2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTFtzYW1wbGUoMTpucm93KHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMKSwxNTApLCAtYygxLDMsNCw2LDcsOCw5LDEwLDExLDEyLDE0KV0sIGdyYXBoID0gRkFMU0UpLCByZXBlbCA9IFRSVUUpDQoNCmBgYA0KDQojIyMjIENvbnRyaWJ1Y2lvbmVzDQoNCk9ic2VydmFuZG8gZWwgZ3LDoWZpY28gZGUgY2F0ZWdvcsOtYXMsIGxhcyB2YXJpYWJsZXMgY29sb3JlYWRhcyBlbiBuYXJhbmphIHNvbiBsYXMgcXVlIHRpZW5lbiBsYSBtYXlvciBjb250cmlidWNpw7NuLg0KDQpFc3RvIHNpZ25pZmljYSBxdWUgbG8gcXVlIG3DoXMgZGlmZXJlbmNpYSBhIHVuIHBhY2llbnRlIGRlIG90cm8gZW4gZXN0YSBzYWxhIGRlIHVyZ2VuY2lhcyBubyBlcyBzdSBvcmlnZW4gbmkgc3UgdHJpYWplIG1lZGlvLCBzaW5vIHNpIGVzIGluZ3Jlc2FkbyBvIHNpIGFiYW5kb25hIGVsIHNlcnZpY2lvLiBFbCBzaXN0ZW1hIGVzdMOhIGZ1ZXJ0ZW1lbnRlIHBvbGFyaXphZG8gcG9yIGVsIHJlc3VsdGFkbyBmaW5hbCBkZSBsYSBhdGVuY2nDs24uIEdyYWNpYXMgYSBsYSByZWR1Y2Npw7NuIGRlIGRhdG9zLCBoZW1vcyBpZGVudGlmaWNhZG8gaW5kaXZpZHVvcyBlc3BlY8OtZmljb3MgcXVlIHJlcHJlc2VudGFuIGVzdGUgZmFsbG8gZW4gbGEgYXRlbmNpw7NuLiBFc3RvcyBjYXNvcyBzaXJ2ZW4gY29tbyAicGFjaWVudGVzIHRyYXphZG9yZXMiIHBhcmEgcmVhbGl6YXIgdW5hIGF1ZGl0b3LDrWEgeSBlbnRlbmRlciBxdcOpIGZhbGzDsyBlbiBzdXMgcHJvY2Vzb3MgaW5kaXZpZHVhbGVzLg0KDQpFbCBzaXN0ZW1hIG11ZXN0cmEgdW5hIGFsdGEgY29oZXJlbmNpYSBlbiBsb3MgY2Fzb3MgZ3JhdmVzOiBsb3MgcGFjaWVudGVzICJDcml0aWNhbCIgeSAiSGlnaCIgc2UgYWdydXBhbiBkZW5zYW1lbnRlIGNvbiBsYSB2YXJpYWJsZSAiQWRtaXR0ZWQiIChjdWFkcmFudGUgaXpxdWllcmRvKSwgbG8gcXVlIGluZGljYSBxdWUgZWwgdHJpYWplIGZ1bmNpb25hIGNvcnJlY3RhbWVudGUgcGFyYSBwcmlvcml6YXIgeSBob3NwaXRhbGl6YXIgYSBxdWllbiBsbyBuZWNlc2l0YS4gRGUgaWd1YWwgZm9ybWEsIGxvcyBwYWNpZW50ZXMgIlJ1cmFsIiB5ICJNZWRpdW0iIHNlIGFzb2NpYW4gY29ycmVjdGFtZW50ZSBjb24gZWwgYWx0YSBtw6lkaWNhICgiRGlzY2hhcmdlZCIpLCBzdWdpcmllbmRvIHVuIGZsdWpvIGVmaWNpZW50ZSBwYXJhIHBhdG9sb2fDrWFzIGRlIGNvbXBsZWppZGFkIG1lZGlhLg0KDQpgYGB7ciBDb250cmlidWNpb25lc19BQ00sIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KDQpmdml6X2NvbnRyaWIoTUNBKHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMWzE6NTAwMCwgLWMoMSwzLDQsNiw3LDgsOSwxMCwxMSwxMiwxNCldLCBncmFwaCA9IEZBTFNFKSwgY2hvaWNlID0gInZhciIsIGF4ZXMgPSAxLCB0b3AgPSAxNSkNCmZ2aXpfY29udHJpYihNQ0EodmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVExbMTo1MDAwLCAtYygxLDMsNCw2LDcsOCw5LDEwLDExLDEyLDE0KV0sIGdyYXBoID0gRkFMU0UpLCBjaG9pY2UgPSAidmFyIiwgYXhlcyA9IDIsIHRvcCA9IDE1KQ0KZnZpel9jb250cmliKE1DQSh2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTFsxOjUwMDAsIC1jKDEsMyw0LDYsNyw4LDksMTAsMTEsMTIsMTQpXSwgZ3JhcGggPSBGQUxTRSksIGNob2ljZSA9ICJ2YXIiLCBheGVzID0gMywgdG9wID0gMTUpDQpgYGANCg0KIyMjIyBCaXBsb3QgY29uIENvbnRyaWJ1Y2lvbmVzDQpgYGB7ciBCaXBsb3RfY29uX0NvbnRyaWJ1Y2lvbmVzX0FDTSwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQoNCmZ2aXpfbWNhX3ZhcihNQ0EodmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVExbMTo1MDAwLCAtYygxLDMsNCw2LDcsOCw5LDEwLDExLDEyLDE0KV0sIGdyYXBoID0gRkFMU0UpLCBjb2wudmFyID0iY29udHJpYiIsIGdyYWRpZW50LmNvbHMgPSBjKCIjMDBBRkJCIiwgIiNFN0I4MDAiLCAiI0ZDNEUwNyIpLCByZXBlbCA9IFRSVUUpDQpgYGANCg0KIyMjIyBDYWxpZGFkIGRlIFJlcHJlc2VudGFjacOzbg0KYGBge3IgQ2FsaWRhZF9kZV9SZXByZXNlbnRhY2lvbl9BQ00sIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KDQpmdml6X21jYV92YXIoTUNBKHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMWzE6NTAwMCwgLWMoMSwzLDQsNiw3LDgsOSwxMCwxMSwxMiwxNCldLCBncmFwaCA9IEZBTFNFKSwgY29sLnZhciA9ImNvczIiLCBncmFkaWVudC5jb2xzID0gYygiIzAwQUZCQiIsICIjRTdCODAwIiwgIiNGQzRFMDciKSwgcmVwZWwgPSBUUlVFKQ0KYGBgDQoNCjxhIG5hbWU9InNlYzQiPjwvYT4NCg0KIyMgKipGYXNlIDQgW0Nvbmdsb21lcmFkb3NdKioNCg0KRWwgUHJvZmVzb3IgW0BFQU1PVEltbzQyMDIzXSwgZW4gc3UgdHJhYmFqbyAoYWwgcXVlIHNlIHB1ZWRlbiByZW1pdGlyIG1lZGlhbnRlIGVsIGVubGFjZSksIHNlw7FhbGFiYSBxdWUgbG9zIGF1dG9yZXMgW0BBRURNRGlhei1Nb3JhbGVzMWVkXSwgYmFzw6FuZG9zZSBlbiBlbCBhbsOhbGlzaXMgZGUgKkV2ZXJpdHQgKDE5ODApKiB0aXR1bGFkbyAqKkNsdXN0ZXIgQW5hbHlzaXMqKiwgZGVzY3JpYmVuIGxvcyBjb25nbG9tZXJhZG9zIGNvbW8gKip6b25hcyBjb250aW51YXMqKiBlbiB1biBlc3BhY2lvIGRvbmRlIHNlIGNvbmNlbnRyYSB1bmEgYWx0YSBkZW5zaWRhZCBkZSBwdW50b3MsIHNlcGFyYWRhcyBwb3Igw6FyZWFzIGNvbiBtZW5vciBkZW5zaWRhZC4gUGFyYSBpZGVudGlmaWNhciBlc3RhcyBjb25jZW50cmFjaW9uZXMsIHNlIGVtcGxlYW4gZGlmZXJlbnRlcyB0w6ljbmljYXMsIGRlc3RhY8OhbmRvc2UgbG9zIG3DqXRvZG9zIGplcsOhcnF1aWNvcy4gRXN0b3MgaW5pY2lhbiBjb24gZWwgKipjw6FsY3VsbyBkZSB1bmEgbWF0cml6IGRlIGRpc3RhbmNpYXMqKiBlbnRyZSBsb3MgZWxlbWVudG9zIGFuYWxpemFkb3MsIGxvIHF1ZSBwZXJtaXRlIGFncnVwYXJsb3MgbWVkaWFudGUgdW4gcHJvY2VzbyBkZSAqKmFnbG9tZXJhY2nDs24qKi4gRXN0ZSBtw6l0b2RvIGNvbWllbnphIGNvbiAqKmNvbmdsb21lcmFkb3MgaW5kaXZpZHVhbGVzKiogeSBhdmFuemEgaGFjaWEgdW4gKirDum5pY28gZ3J1cG8gZmluYWwqKi4gQSBsbyBsYXJnbyBkZSBlc3RlIHByb2Nlc28sIHNlIGdlbmVyYW4gZnVzaW9uZXMgeSBkaXZpc2lvbmVzIHF1ZSBlc3RhYmxlY2VuIGplcmFycXXDrWFzIGJhc2FkYXMgZW4gc2ltaWxpdHVkZXMsIHJlcHJlc2VudGFkYXMgZ3LDoWZpY2FtZW50ZSBhIHRyYXbDqXMgZGUgdW4gKipkZW5kb2dyYW1hKiouDQoNCiMjIyA0LjEuIE9iamV0aXZvcw0KDQpFbiBlc3RhICoqY3VhcnRhIGV0YXBhKiogZGVsIGVzdHVkaW8gc2UgcHJlc2VudGFyw6FuIGPDoWxjdWxvcywgdmlzdWFsaXphY2lvbmVzIGUgaW50ZXJwcmV0YWNpb25lcywgdXRpbGl6YW5kbyBlbCBjb25qdW50byBkZSBkYXRvcyBwcm9jZXNhZG8gZW4gbGFzIGZhc2VzIHByZXZpYXMgKiooMSwgMiB5IDMpKiouIEVsIGVuZm9xdWUgc2UgY2VudHJhcsOhIGVuIGVsICoqYW7DoWxpc2lzIGRlIGNvbmdsb21lcmFkb3MqKiwgYWJhcmNhbmRvIHRhbnRvIHN1IHZlcnNpw7NuIGplcsOhcnF1aWNhIG1lZGlhbnRlIGRlbmRyb2dyYW1hcyBjb21vIGxhIG5vIGplcsOhcnF1aWNhIGNvbiBLLW1lZGlhcy4NCg0KIyMjIDQuMi4gQWdydXBhY2nDs24gSmVyw6FycXVpY2Egey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KTGEgcGVzdGHDsWEgKipEaXNpbWlsYXJpZGFkKiogb2ZyZWNlIHVuYSByZXByZXNlbnRhY2nDs24gZ3LDoWZpY2EgcXVlIG11ZXN0cmEgbGFzICoqcmVsYWNpb25lcyBkZSBwcm94aW1pZGFkKiogZW50cmUgbGFzIGNhdGVnb3LDrWFzIGRlIGxhIHZhcmlhYmxlICoqIkhvc3BpdGFscyIqKi4gQSB0cmF2w6lzIGRlIHVuYSBlc2NhbGEgZGUgY29sb3JlcyBxdWUgcmVwcmVzZW50YSBsYXMgZGlzdGFuY2lhcyBlbnRyZSBsb3MgcmVnaXN0cm9zLCBzZSBldmlkZW5jaWEgcXVlIGhvc3BpdGFsZXMgY29tbyBlbCAqKkxpbGF2YXRpIEhvc3BpdGFsIGFuZCBSZXNlYXJjaCBDZW50cmUqKiB5IGVsICoqTWVkYW50YSAtIFRoZSBNZWRpY2l0eSoqIHNlIGRlc3RhY2FuIHBvciBlc3RhciBzaWduaWZpY2F0aXZhbWVudGUgYWxlamFkb3MgZGVsIHJlc3RvLiBQb3Igb3RybyBsYWRvLCBpbnN0aXR1Y2lvbmVzIGNvbW8gZWwgKipBcG9sbG8gSG9zcGl0YWxzKiosICoqQ2hlbm5haSoqIHkgZWwgKipGb3J0aXMgTWVtb3JpYWwgUmVzZWFyY2ggSW5zdGl0dXRlKiosICoqR3VydWdyYW0qKiBwcmVzZW50YW4gbWVub3IgZGlmZXJlbmNpYSBlbnRyZSBzw60uIEVzdGUgY29tcG9ydGFtaWVudG8gaW5kaWNhIHF1ZSBsb3MgaG9zcGl0YWxlcyBtw6FzIHNpbWlsYXJlcyB0aWVuZGVuIGEgZm9ybWFyIGFncnVwYWNpb25lcyBkZW50cm8gZGUgbGFzIG1pc21hcyBqZXJhcnF1w61hcywgbWllbnRyYXMgcXVlIGFxdWVsbG9zIGNvbiBkaXN0YW5jaWFzIG3DoXMgcHJvbnVuY2lhZGFzIHByb2JhYmxlbWVudGUgY29uZm9ybWVuIGdydXBvcyBpbmRlcGVuZGllbnRlcywgcmVmbGVqYW5kbyBkaWZlcmVuY2lhcyBlc3BlY8OtZmljYXMgZGVudHJvIGRlbCBhbsOhbGlzaXMuDQoNCkxhIHBlc3Rhw7FhICoqT3B0aW1pemFjacOzbiBkZSBNb2plbmEqKiBpZGVudGlmaWNhIGVsIG7Dum1lcm8gw7NwdGltbyBkZSBncnVwb3MgcGFyYSBjbGFzaWZpY2FyIGEgbG9zIHBhY2llbnRlcyBzZWfDum4gdHJlcyBlc3RyYXRlZ2lhcyBqZXLDoXJxdWljYXMuIFRhbnRvIGxhICoqdW5pw7NuIHNpbXBsZSoqIGNvbW8gbGEgKip1bmnDs24gY29tcGxldGEqKiBjb25jbHV5ZW4gcXVlICoqdHJlcyBncnVwb3MqKiBzb24gaWRlYWxlcywgbWF4aW1pemFuZG8gbGEgY29oZXNpw7NuIGludGVybmEgeSBkaWZlcmVuY2lhY2nDs24gZXh0ZXJuYS4gUG9yIHN1IGxhZG8sIGxhICoqdW5pw7NuIHByb21lZGlvKiogc3VnaWVyZSB0cmVzIGdydXBvcyBjb21vIGxhIGNvbmZpZ3VyYWNpw7NuIMOzcHRpbWEsIGNvbnNpZGVyYW5kbyBkaXN0YW5jaWFzIG1lZGlhcy4gQ2FkYSBtw6l0b2RvIHNlIGFjb21wYcOxYSBkZSBzdSByZXNwZWN0aXZvIGRlbmRvZ3JhbWEgcGFyYSB2aXN1YWxpemFyIGxhcyBqZXJhcnF1w61hcyB5IGFncnVwYWNpb25lcyByZXN1bHRhbnRlcy4NCg0KTGEgcGVzdGHDsWEgKipEZW5kb2dyYW1hcyBPcHRpbWl6YWRvcyoqIHJlcHJlc2VudGEgZ3LDoWZpY2FtZW50ZSBsb3MgcGF0cm9uZXMgb2JzZXJ2YWRvcyBlbiBsYSBzZWNjacOzbiBkZSAqKkRpc2ltaWxhcmlkYWQqKiwgdmFsaWRhbmRvIGxhcyBhZ3J1cGFjaW9uZXMgZW50cmUgcGFjaWVudGVzIGNvbiBhZmVjY2lvbmVzIGNhcmRpb3Zhc2N1bGFyZXMgc2Vnw7puIGxhcyBzaW1pbGl0dWRlcyBkZXRlY3RhZGFzIGVuIHN1cyBjYXJhY3RlcsOtc3RpY2FzLCBiYXNhZGFzIGVuIGxvcyBob3NwaXRhbGVzIGRlIGF0ZW5jacOzbi4gQWRlbcOhcywgcHJvcG9yY2lvbmEgdW5hIHZpc3VhbGl6YWNpw7NuIGNsYXJhIGRlIGxhcyBhbHR1cmFzIGplcsOhcnF1aWNhcywgZXNwZWNpYWxtZW50ZSBlbiBsb3MgbcOpdG9kb3MgZGUgKipFbmxhY2UgQ29tcGxldG8qKiB5ICoqRW5sYWNlIFByb21lZGlvKiosIHF1ZSBzb24gZGV0ZXJtaW5hbnRlcyBwYXJhIGlkZW50aWZpY2FyIGVsIG7Dum1lcm8gw7NwdGltbyBkZSBjb25nbG9tZXJhZG9zLg0KDQoNCiMjIyMgQ2FtcG8gQ2xhc2lmaWNhZG9yDQoNCkVsIGNhbXBvIGNsYXNpZmljYWRvciBkZSBzYXRpc2ZhY2Npw7NuIGRlbCBwYWNpZW50ZSBwZXJtaXRlIGNhcmFjdGVyaXphciBsYSBwZXJjZXBjacOzbiBnbG9iYWwgZGVsIHNlcnZpY2lvIGRlIHVyZ2VuY2lhcyBhIHBhcnRpciBkZSBjaW5jbyBjYXRlZ29yw61hcyBvcmRpbmFsZXM6IG11eSBpbnNhdGlzZmVjaG8sIGluc2F0aXNmZWNobywgbmV1dHJhbCwgc2F0aXNmZWNobyB5IG11eSBzYXRpc2ZlY2hvLiBMb3MgcmVzdWx0YWRvcyBtdWVzdHJhbiB1bmEgZGlzdHJpYnVjacOzbiBoZXRlcm9nw6luZWEgZGUgbGFzIHJlc3B1ZXN0YXMsIGNvbiB1bmEgbWFyY2FkYSBjb25jZW50cmFjacOzbiBlbiBsb3Mgbml2ZWxlcyBleHRyZW1vcy4NCg0KRW4gcGFydGljdWxhciwgbGEgY2F0ZWdvcsOtYSDigJxtdXkgaW5zYXRpc2ZlY2hv4oCdIHJlcHJlc2VudGEgbGEgbWF5b3IgcHJvcG9yY2nDs24gZGUgcmVzcHVlc3RhcywgY29uIDEuNTM4IHJlZ2lzdHJvcywgbG8gcXVlIGVxdWl2YWxlIGFwcm94aW1hZGFtZW50ZSBhbCAzMCw3NSAlIGRlbCB0b3RhbC4gRXN0ZSByZXN1bHRhZG8gc3VnaWVyZSBsYSBleGlzdGVuY2lhIGRlIHVuYSBmcmFjY2nDs24gY29uc2lkZXJhYmxlIGRlIHBhY2llbnRlcyBjb24gdW5hIHBlcmNlcGNpw7NuIG5lZ2F0aXZhIGRlbCBzZXJ2aWNpbywgcG9zaWJsZW1lbnRlIGFzb2NpYWRhIGEgZmFjdG9yZXMgY29tbyBsb3MgdGllbXBvcyBkZSBlc3BlcmEsIGxhIGNvbXVuaWNhY2nDs24gbyBsYSBleHBlcmllbmNpYSBkdXJhbnRlIGVsIHByb2Nlc28gZGUgYXRlbmNpw7NuLiBBIGVzdGEgY2F0ZWdvcsOtYSBzZSBzdW1hIGVsIGdydXBvIOKAnGluc2F0aXNmZWNob+KAnSwgcXVlIGFwb3J0YSB1biAxMiwxMCAlLCByZWZvcnphbmRvIGxhIGV2aWRlbmNpYSBkZSB1biBuaXZlbCByZWxldmFudGUgZGUgZGVzY29udGVudG8gZW50cmUgbG9zIHVzdWFyaW9zLiANCg0KUG9yIG90cm8gbGFkbywgbGEgY2F0ZWdvcsOtYSDigJxzYXRpc2ZlY2hv4oCdIGNvbmNlbnRyYSAxLjQyOSBvYnNlcnZhY2lvbmVzLCBjb3JyZXNwb25kaWVudGVzIGEgY2VyY2EgZGVsIDI4LDU3ICUsIGxvIHF1ZSBpbmRpY2EgcXVlIHVuYSBwcm9wb3JjacOzbiBzaW1pbGFyIGRlIHBhY2llbnRlcyBldmFsw7phIHBvc2l0aXZhbWVudGUgZWwgc2VydmljaW8gcmVjaWJpZG8uIFNpbiBlbWJhcmdvLCBlbCBuaXZlbCDigJxtdXkgc2F0aXNmZWNob+KAnSBhbGNhbnphIMO6bmljYW1lbnRlIGVsIDExLDEwICUsIGxvIHF1ZSBzdWdpZXJlIHF1ZSwgYXVucXVlIGV4aXN0ZSBzYXRpc2ZhY2Npw7NuLCBlc3RhIG5vIHNlIHRyYWR1Y2UgZGUgbWFuZXJhIGNvbnNpc3RlbnRlIGVuIGV2YWx1YWNpb25lcyBhbHRhbWVudGUgcG9zaXRpdmFzLiBMYSBjYXRlZ29yw61hIOKAnG5ldXRyYWzigJ0sIGNvbiB1biAxNyw0NiAlLCByZWZsZWphIHVuYSBwZXJjZXBjacOzbiBpbnRlcm1lZGlhLCBwb3NpYmxlbWVudGUgYXNvY2lhZGEgYSBleHBlcmllbmNpYXMgcXVlIGN1bXBsZW4gZXhwZWN0YXRpdmFzIG3DrW5pbWFzIHNpbiBnZW5lcmFyIHVuYSB2YWxvcmFjacOzbiBjbGFyYW1lbnRlIHBvc2l0aXZhIG8gbmVnYXRpdmEuDQoNCmBgYHtyIENhbXBvX0NsYXNpZmljYWRvciwgZmlnLmFsaWduPSdjZW50ZXInfQ0KU2F0aXNmYWNjaW9uIDwtIHJlYWRfZXhjZWwoIkM6L1VzZXJzL1NlYmFzdGlhbiBWYWxlbmNpYS9EZXNrdG9wL0dlc3Rpb24gZGUgZGF0b3MvU2F0aXNmYWNjaW9uLnhsc3giKQ0KaGVhZChhcy5kYXRhLmZyYW1lKFNhdGlzZmFjY2lvbikpDQpgYGANCg0KIyMjIyBEaXNpbWlsYXJpZGFkDQoNCkVsIG1hcGEgZGUgY2Fsb3IgZGUgZGlzaW1pbGFyaWRhZCBwZXJtaXRlIGFuYWxpemFyIGVsIGdyYWRvIGRlIGRpZmVyZW5jaWEgZXhpc3RlbnRlIGVudHJlIGxhcyBjYXRlZ29yw61hcyBkZWwgbml2ZWwgZGUgc2F0aXNmYWNjacOzbiBkZWwgcGFjaWVudGUsIG9mcmVjaWVuZG8gdW5hIHZpc2nDs24gcmVsYWNpb25hbCBtw6FzIHByb2Z1bmRhIHF1ZSBsYSBzaW1wbGUgZGlzdHJpYnVjacOzbiBkZSBmcmVjdWVuY2lhcy4gRW4gZXN0ZSBncsOhZmljbywgbG9zIGNvbG9yZXMgbcOhcyBpbnRlbnNvcyByZXByZXNlbnRhbiBtYXlvcmVzIG5pdmVsZXMgZGUgZGlzaW1pbGl0dWQsIG1pZW50cmFzIHF1ZSBsb3MgdG9ub3MgbcOhcyBzdWF2ZXMgaW5kaWNhbiBtYXlvciBjZXJjYW7DrWEgbyBzaW1pbGl0dWQgZW50cmUgY2F0ZWdvcsOtYXMuIExvcyByZXN1bHRhZG9zIGV2aWRlbmNpYW4gcXVlIGxhIGNhdGVnb3LDrWEg4oCcbXV5IGluc2F0aXNmZWNob+KAnSBwcmVzZW50YSBsb3MgbWF5b3JlcyBuaXZlbGVzIGRlIGRpc2ltaWxhcmlkYWQgZnJlbnRlIGEg4oCcbXV5IHNhdGlzZmVjaG/igJ0geSDigJxzYXRpc2ZlY2hv4oCdLCBsbyBxdWUgY29uZmlybWEgdW5hIHBvbGFyaXphY2nDs24gbWFyY2FkYSBlbiBsYSBwZXJjZXBjacOzbiBkZWwgc2VydmljaW8uDQoNClBvciBlbCBjb250cmFyaW8sIGxhcyBjYXRlZ29yw61hcyDigJxuZXV0cmFs4oCdLCDigJxpbnNhdGlzZmVjaG/igJ0geSDigJxzYXRpc2ZlY2hv4oCdIG11ZXN0cmFuIG5pdmVsZXMgZGUgZGlzaW1pbGFyaWRhZCBtw6FzIG1vZGVyYWRvcyBlbnRyZSBzw60sIGxvIHF1ZSBpbmRpY2EgdW5hIHpvbmEgaW50ZXJtZWRpYSBkZSBwZXJjZXBjacOzbiwgZG9uZGUgbGFzIGV4cGVyaWVuY2lhcyBubyBzb24gZXh0cmVtYXMgeSBwdWVkZW4gZGVzcGxhemFyc2UgaGFjaWEgbGEgc2F0aXNmYWNjacOzbiBvIGxhIGluc2F0aXNmYWNjacOzbiBzZWfDum4gZmFjdG9yZXMgb3BlcmF0aXZvcyBwdW50dWFsZXMuIEFzaW1pc21vLCBsYSBiYWphIGRpc2ltaWxhcmlkYWQgb2JzZXJ2YWRhIGVudHJlIOKAnHNhdGlzZmVjaG/igJ0geSDigJxtdXkgc2F0aXNmZWNob+KAnSBpbmRpY2EgY29oZXJlbmNpYSBkZW50cm8gZGVsIHBvbG8gcG9zaXRpdm8gZGUgbGEgZXNjYWxhLCBhdW5xdWUgc3UgZGlzdGFuY2lhIHJlc3BlY3RvIGEgbG9zIG5pdmVsZXMgbmVnYXRpdm9zIHJldmVsYSBxdWUgZWwgc2lzdGVtYSBubyBlc3TDoSBsb2dyYW5kbyB0cmFuc2Zvcm1hciBkZSBtYW5lcmEgY29uc2lzdGVudGUgbGEgZXhwZXJpZW5jaWEgZGVsIHVzdWFyaW8gZGVzZGUgbGEgaW5zYXRpc2ZhY2Npw7NuIGhhY2lhIGxhIHNhdGlzZmFjY2nDs24gcGxlbmEuDQoNCmBgYHtyIERpc2ltaWxhcmlkYWQsIGZpZy5hbGlnbj0nY2VudGVyJ30NCmRhdGFfID0gYXMuZGF0YS5mcmFtZShzYXRpc2ZhY2Npb25fcHJvbWVkaW8pWywgLWMoMSldDQpyb3duYW1lcyhkYXRhXykgPSB1bmNsYXNzKHNhdGlzZmFjY2lvbl9wcm9tZWRpbyRzYXRpc2ZhY2Npb25fcGFjaWVudGUpDQpmdml6X2Rpc3QoZ2V0X2Rpc3QoZGF0YV8sIHN0YW5kID0gVCwgbWV0aG9kID0gImV1Y2xpZGVhbiIpLCBncmFkaWVudCA9IGxpc3QobG93ID0gIiMwMEFGQkIiLCBtaWQgPSAid2hpdGUiLCBoaWdoID0gIiNGQzRFMDciKSkNCmBgYA0KDQojIyMjIE9wdGltaXphY2nDs24gZGUgTW9qZW5hIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNCg0KIyMjIyMgVW5pw7NuIFNpbXBsZQ0KDQpFbCBncsOhZmljbyBkZSBVbmnDs24gU2ltcGxlIGluZGljYSBxdWUgZWwgbsO6bWVybyDDs3B0aW1vIGRlIGdydXBvcyBlcyBpZ3VhbCBhIDIsIGxvIHF1ZSBzdWdpZXJlIHF1ZSBsYSBlc3RydWN0dXJhIHN1YnlhY2VudGUgZGUgbG9zIGRhdG9zIGRlIHNhdGlzZmFjY2nDs24gZGVsIHBhY2llbnRlIHB1ZWRlIGRlc2NyaWJpcnNlIGRlIG1hbmVyYSBhZGVjdWFkYSBtZWRpYW50ZSBkb3MgY29uZ2xvbWVyYWRvcyBjbGFyYW1lbnRlIGRpZmVyZW5jaWFkb3MuIEVzdGUgcmVzdWx0YWRvIGltcGxpY2EgcXVlLCBtw6FzIGFsbMOhIGRlIGxhIGNsYXNpZmljYWNpw7NuIG9yZGluYWwgb3JpZ2luYWwgZW4gY2luY28gbml2ZWxlcyBkZSBzYXRpc2ZhY2Npw7NuLCBsYXMgcGVyY2VwY2lvbmVzIGRlIGxvcyBwYWNpZW50ZXMgdGllbmRlbiBhIGFncnVwYXJzZSBlbiBkb3MgZ3JhbmRlcyBwZXJmaWxlcyBkb21pbmFudGVzLiBMYSBzZXBhcmFjacOzbiBvYnNlcnZhZGEgcmVmbGVqYSB1bmEgcG9sYXJpemFjacOzbiBlbiBsYSBleHBlcmllbmNpYSBkZWwgdXN1YXJpbywgZG9uZGUgdW4gcHJpbWVyIGdydXBvIGNvbmNlbnRyYSBhIGxvcyBwYWNpZW50ZXMgY29uIGV2YWx1YWNpb25lcyBwcmVkb21pbmFudGVtZW50ZSBuZWdhdGl2YXMgKG11eSBpbnNhdGlzZmVjaG9zIGUgaW5zYXRpc2ZlY2hvcyksIG1pZW50cmFzIHF1ZSBlbCBzZWd1bmRvIGdydXBvIHJlw7puZSBhIGFxdWVsbG9zIGNvbiBwZXJjZXBjaW9uZXMgbmV1dHJhbGVzIGEgcG9zaXRpdmFzIChuZXV0cmFsLCBzYXRpc2ZlY2hvIHkgbXV5IHNhdGlzZmVjaG8pLiANCg0KRGVzZGUgdW5hIHBlcnNwZWN0aXZhIGFuYWzDrXRpY2EgeSBvcGVyYXRpdmEsIGVzdGUgcmVzdWx0YWRvIGVzIHJlbGV2YW50ZSBwb3JxdWUgc2ltcGxpZmljYSBsYSBpbnRlcnByZXRhY2nDs24gZGVsIGZlbsOzbWVubyBkZSBzYXRpc2ZhY2Npw7NuOiBlbCBzZXJ2aWNpbyBkZSB1cmdlbmNpYXMgbm8gZXN0w6EgZW5mcmVudGFuZG8gbcO6bHRpcGxlcyBwYXRyb25lcyBjb21wbGVqb3MgZGUgcGVyY2VwY2nDs24sIHNpbm8gZG9zIGdyYW5kZXMgYmxvcXVlcyBkZSBleHBlcmllbmNpYSBjbGFyYW1lbnRlIGNvbnRyYXN0YW50ZXMuIA0KDQpgYGB7ciBVbmlvbl9zaW1wbGUsIGZpZy5hbGlnbj0nY2VudGVyJ30NCmhjX3NpbmdsZSA9IGhjbHVzdChnZXRfZGlzdChkYXRhXywgc3RhbmQgPSBULCBtZXRob2QgPSAiZXVjbGlkZWFuIiksIG1ldGhvZCA9ICJzaW5nbGUiKQ0KDQptb2plbmEgPSBmdW5jdGlvbihoYyl7DQogIG5faGQgPSBsZW5ndGgoaGMkaGVpZ2h0KQ0KICBhbHBfZyA9IDAgOyBhbHBoYSA9IGhjJGhlaWdodFtuX2hkOjFdDQogIGZvcihpIGluIDE6KG5faGQtMSkpew0KICAgIGFscF9nW2ldID0gbWVhbihhbHBoYVsobl9oZC1pKzEpOjFdKSsxLjI1KnNkKGFscGhhWyhuX2hkLWkrMSk6MV0pDQogIH0NCiAgbm9nID0gc3VtKGFscF9nPD0gYWxwaGFbLW5faGRdKSArIDENCiAgcGxvdChhbHBoYVstbl9oZF0sIHBjaD0yMCwgY29sPShhbHBfZz5hbHBoYVstbl9oZF0pKzEsIG1haW4gPSBwYXN0ZSgiT3B0aW1hbCBudW1iZXIgb2YgZ3JvdXBzID0iLG5vZyksDQogICAgICAgeWxhYiA9IGV4cHJlc3Npb24oYWxwaGFbZ10pLCB4bGFiPSJOb2RlcyIpfQ0KbW9qZW5hKGhjX3NpbmdsZSkNCmBgYA0KDQojIyMjIyBVbmnDs24gQ29tcGxldGENCg0KRWwgZ3LDoWZpY28gY29ycmVzcG9uZGllbnRlIGFsIG3DqXRvZG8gZGUgVW5pw7NuIENvbXBsZXRhIGNvbmZpcm1hIHF1ZSBlbCBuw7ptZXJvIMOzcHRpbW8gZGUgZ3J1cG9zIGVzIGlndWFsIGEgMiwgcmVmb3J6YW5kbyBsb3MgcmVzdWx0YWRvcyBvYnRlbmlkb3MgcHJldmlhbWVudGUgY29uIGVsIG3DqXRvZG8gZGUgVW5pw7NuIFNpbXBsZS4gRXN0YSBjb2luY2lkZW5jaWEgZW50cmUgYW1ib3MgY3JpdGVyaW9zIGRlIGFncnVwYW1pZW50byBpbmRpY2EgcXVlIGxhIGVzdHJ1Y3R1cmEgZGUgbG9zIGRhdG9zIGRlIHNhdGlzZmFjY2nDs24gZGVsIHBhY2llbnRlIGVzIHJvYnVzdGEgeSBlc3RhYmxlLCB5IG5vIGRlcGVuZGUgZGVsIG3DqXRvZG8gZGUgZW5sYWNlIHV0aWxpemFkbyBlbiBlbCBhbsOhbGlzaXMgamVyw6FycXVpY28uDQoNCkxhIGNsYXJhIHNlcGFyYWNpw7NuIG9ic2VydmFkYSBhbCBwYXNhciBkZSB1bm8gYSBkb3MgZ3J1cG9zIHN1Z2llcmUgcXVlIGVsIHByaW5jaXBhbCBwYXRyw7NuIGRlIGRpZmVyZW5jaWFjacOzbiBlbiBsYXMgcGVyY2VwY2lvbmVzIGRlIGxvcyBwYWNpZW50ZXMgc2UgcHJvZHVjZSBlbiBlc2Ugbml2ZWwgZGUgcGFydGljacOzbi4NCg0KRGVzZGUgdW5hIHBlcnNwZWN0aXZhIGludGVycHJldGF0aXZhLCBlc3RvcyBkb3MgY29uZ2xvbWVyYWRvcyBwdWVkZW4gYXNvY2lhcnNlIG51ZXZhbWVudGUgY29uIHVuIGdydXBvIGRlIGluc2F0aXNmYWNjacOzbiB5IHVuIGdydXBvIGRlIHNhdGlzZmFjY2nDs24sIGludGVncmFuZG8gbGFzIGNhdGVnb3LDrWFzIGludGVybWVkaWFzIGRlbnRybyBkZWwgZ3J1cG8gcXVlIHByZXNlbnRhIHVuYSBwZXJjZXBjacOzbiBnbG9iYWwgbWVub3MgbmVnYXRpdmEuDQoNCmBgYHtyIFVuaW9uX0NvbXBsZXRhLCBmaWcuYWxpZ249J2NlbnRlcid9DQpoY19jb21wbGV0ZSA9IGhjbHVzdChnZXRfZGlzdChkYXRhXywgc3RhbmQgPSBULCBtZXRob2QgPSAiZXVjbGlkZWFuIiksIG1ldGhvZCA9ICJjb21wbGV0ZSIpDQoNCm1vamVuYSA9IGZ1bmN0aW9uKGhjKXsNCiAgbl9oZCA9IGxlbmd0aChoYyRoZWlnaHQpDQogIGFscF9nID0gMCA7IGFscGhhID0gaGMkaGVpZ2h0W25faGQ6MV0NCiAgZm9yKGkgaW4gMToobl9oZC0xKSl7DQogICAgYWxwX2dbaV0gPSBtZWFuKGFscGhhWyhuX2hkLWkrMSk6MV0pKzEuMjUqc2QoYWxwaGFbKG5faGQtaSsxKToxXSkNCiAgfQ0KICBub2cgPSBzdW0oYWxwX2c8PSBhbHBoYVstbl9oZF0pICsgMQ0KICBwbG90KGFscGhhWy1uX2hkXSwgcGNoPTIwLCBjb2w9KGFscF9nPmFscGhhWy1uX2hkXSkrMSwgbWFpbiA9IHBhc3RlKCJPcHRpbWFsIG51bWJlciBvZiBncm91cHMgPSIsbm9nKSwNCiAgICAgICB5bGFiID0gZXhwcmVzc2lvbihhbHBoYVtnXSksIHhsYWI9Ik5vZGVzIil9DQoNCm1vamVuYShoY19jb21wbGV0ZSkNCmBgYA0KDQojIyMjIyBVbmnDs24gUHJvbWVkaW8NCg0KRWwgZ3LDoWZpY28gb2J0ZW5pZG8gbWVkaWFudGUgZWwgbcOpdG9kbyBkZSBVbmnDs24gUHJvbWVkaW8gY29uZmlybWEgbnVldmFtZW50ZSBxdWUgZWwgbsO6bWVybyDDs3B0aW1vIGRlIGdydXBvcyBlcyBpZ3VhbCBhIDIsIGVuIGNvaGVyZW5jaWEgY29uIGxvcyByZXN1bHRhZG9zIGRlIGxvcyBtw6l0b2RvcyBkZSBVbmnDs24gU2ltcGxlIHkgVW5pw7NuIENvbXBsZXRhLiBFc3RhIGNvbnNpc3RlbmNpYSBlbnRyZSBsb3MgZGlzdGludG9zIGNyaXRlcmlvcyBkZSBlbmxhY2UgcmVmdWVyemEgbGEgc29saWRleiBkZWwgcGF0csOzbiBkZSBhZ3J1cGFtaWVudG8gaWRlbnRpZmljYWRvIGVuIGxvcyBkYXRvcyBkZSBzYXRpc2ZhY2Npw7NuIGRlbCBwYWNpZW50ZS4NCg0KTGEgbWFyY2FkYSBkaWZlcmVuY2lhIGVuIGVsIHZhbG9yIGRlbCBjcml0ZXJpbyBkZSBhZ3J1cGFtaWVudG8gYWwgcGFzYXIgZGUgdW5vIGEgZG9zIG5vZG9zIGluZGljYSBxdWUgbGEgcHJpbmNpcGFsIGdhbmFuY2lhIGV4cGxpY2F0aXZhIHNlIGFsY2FuemEgY29uIGxhIHBhcnRpY2nDs24gZW4gZG9zIGNvbmdsb21lcmFkb3MsIG1pZW50cmFzIHF1ZSBsYSBpbmNvcnBvcmFjacOzbiBkZSB1biB0ZXJjZXIgZ3J1cG8gbm8gYXBvcnRhIHVuYSBtZWpvcmEgc2lnbmlmaWNhdGl2YS4gDQoNCkRlc2RlIHVuYSBwZXJzcGVjdGl2YSBpbnRlcnByZXRhdGl2YSwgZXN0b3MgZG9zIGdydXBvcyBwdWVkZW4gYXNvY2lhcnNlIGEgdW4gcGVyZmlsIHByZWRvbWluYW50ZW1lbnRlIGluc2F0aXNmZWNobyB5IGEgdW4gcGVyZmlsIHByZWRvbWluYW50ZW1lbnRlIHNhdGlzZmVjaG8gbyBuZXV0cmFsLCBpbnRlZ3JhbmRvIGxhcyBjYXRlZ29yw61hcyBpbnRlcm1lZGlhcyBkZW50cm8gZGVsIGdydXBvIGRlIG1heW9yIGNlcmNhbsOtYSBwZXJjZXB0dWFsLiANCg0KYGBge3IgVW5pb25fUHJvbWVkaW8sIGZpZy5hbGlnbj0nY2VudGVyJ30NCmhjX2F2ZXJhZ2UgPSBoY2x1c3QoZ2V0X2Rpc3QoZGF0YV8sIHN0YW5kID0gVCwgbWV0aG9kID0gImV1Y2xpZGVhbiIpLCBtZXRob2QgPSAiYXZlcmFnZSIpDQoNCm1vamVuYSA9IGZ1bmN0aW9uKGhjKXsNCiAgbl9oZCA9IGxlbmd0aChoYyRoZWlnaHQpDQogIGFscF9nID0gMCA7IGFscGhhID0gaGMkaGVpZ2h0W25faGQ6MV0NCiAgZm9yKGkgaW4gMToobl9oZC0xKSl7DQogICAgYWxwX2dbaV0gPSBtZWFuKGFscGhhWyhuX2hkLWkrMSk6MV0pKzEuMjUqc2QoYWxwaGFbKG5faGQtaSsxKToxXSkNCiAgfQ0KICBub2cgPSBzdW0oYWxwX2c8PSBhbHBoYVstbl9oZF0pICsgMQ0KICBwbG90KGFscGhhWy1uX2hkXSwgcGNoPTIwLCBjb2w9KGFscF9nPmFscGhhWy1uX2hkXSkrMSwgbWFpbiA9IHBhc3RlKCJPcHRpbWFsIG51bWJlciBvZiBncm91cHMgPSIsbm9nKSwNCiAgICAgICB5bGFiID0gZXhwcmVzc2lvbihhbHBoYVtnXSksIHhsYWI9Ik5vZGVzIil9DQoNCm1vamVuYShoY19hdmVyYWdlKQ0KDQpgYGANCg0KIyMjIyBEZW5kb2dyYW1hcyBPcHRpbWl6YWRvcyB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQojIyMjIyBFbmxhY2UgU2ltcGxlDQpgYGB7ciBFbmxhY2VfU2ltcGxlLCBmaWcuYWxpZ249J2NlbnRlcid9DQpzdXBwcmVzc1dhcm5pbmdzKGZ2aXpfZGVuZChoY19zaW5nbGUsIGsgPSAzLCBjZXggPSAwLjUsIGtfY29sb3JzID0gIm5wZyIsIGNvbG9yX2xhYmVsc19ieV9rID0gVCwgcmVjdCA9IFQpKQ0KYGBgDQoNCiMjIyMjIEVubGFjZSBDb21wbGV0bw0KYGBge3IgRW5sYWNlX0NvbXBsZXRvLCBmaWcuYWxpZ249J2NlbnRlcid9DQpmdml6X2RlbmQoaGNfY29tcGxldGUsIGsgPSAzLCBjZXggPSAwLjUsIGtfY29sb3JzID0gIm5wZyIsIGNvbG9yX2xhYmVsc19ieV9rID0gVCwgcmVjdCA9IFQpDQoNCmBgYA0KDQojIyMjIyBFbmxhY2UgUHJvbWVkaW8NCmBgYHtyIEVubGFjZV9Qcm9tZWRpbywgZmlnLmFsaWduPSdjZW50ZXInfQ0KZnZpel9kZW5kKGhjX2F2ZXJhZ2UsIGsgPSAzLCBjZXggPSAwLjUsIGtfY29sb3JzID0gIm5wZyIsIGNvbG9yX2xhYmVsc19ieV9rID0gVCwgcmVjdCA9IFQpDQoNCmBgYA0KDQojIyMgNC4zLiBBZ3J1cGFjacOzbiBOby1KZXLDoXJxdWljYQ0KDQpTZWfDum4gIFtAQUVETURpYXotTW9yYWxlczFlZF0sIGxvcyAqKm3DqXRvZG9zIGRlIGFnbG9tZXJhY2nDs24gbm8gamVyw6FycXVpY29zKiosIHRhbWJpw6luIGNvbm9jaWRvcyBjb21vIG3DqXRvZG9zIGRlICoqcGFydGljacOzbioqLCBzZSBiYXNhbiBlbiB1bmEgKipwYXJ0aWNpw7NuIGluaWNpYWwqKiBkZWwgY29uanVudG8gZGUgZGF0b3MsIGdlbmVyYW5kbyBzdWJjb25qdW50b3MgbyBncnVwb3MuIEEgY2FkYSB1bm8gZGUgZXN0b3MgZ3J1cG9zIHNlIGxlIGNhbGN1bGEgdW4gY2VudHJvaWRlLCB5IHBvc3Rlcmlvcm1lbnRlLCBsYXMgb2JzZXJ2YWNpb25lcyBzZSBhc2lnbmFuIGFsIGNvbmdsb21lcmFkbyBjdXlvIGNlbnRyb2lkZSBzZSBlbmN1ZW50cmEgbcOhcyBjZXJjYW5vLiBFc3RlIHByb2Nlc28gc2UgcmVwaXRlIHJlY3Vyc2l2YW1lbnRlLCByZWNhbGN1bGFuZG8gbG9zIGNlbnRyb2lkZXMgeSBhanVzdGFuZG8gbGFzIGFzaWduYWNpb25lcyBoYXN0YSBxdWUgbGFzIG9ic2VydmFjaW9uZXMgeWEgbm8gcHVlZGFuIGNhbWJpYXIgZGUgZ3J1cG8uIEEgZGlmZXJlbmNpYSBkZSBsb3MgbcOpdG9kb3MgamVyw6FycXVpY29zLCBlc3RlIGVuZm9xdWUgcGVybWl0ZSBxdWUgdW5hIG9ic2VydmFjacOzbiBjYW1iaWUgZGUgZ3J1cG8gZHVyYW50ZSBlbCBwcm9jZXNvLg0KDQpFbCAqKmFuw6FsaXNpcyBkZWwgY29uanVudG8gZGUgZGF0b3Mgc2UgY2VycmFyw6EqKiBjb24gZWwgbcOpdG9kbyBubyBqZXLDoXJxdWljbyBkZSAqKkstbWVkaWFzKiosIHF1ZSBkaXZpZGUgdW4gY29uanVudG8gZGUgJG4kIG9iamV0b3MgZW4gJGskIGdydXBvcy4gRXN0ZSBtw6l0b2RvIHNlbGVjY2lvbmEgbG9zIGNlbnRyb2lkZXMgZGUgbG9zIGdydXBvcyBkZSBtYW5lcmEgcXVlIG1pbmltaWNlbiBsYSBkaXN0YW5jaWEgKmV1Y2xpZGlhbmEqIGVudHJlIGNhZGEgb2JqZXRvIHkgc3UgY2VudHJvaWRlIG3DoXMgY2VyY2Fuby4gTGFzIG9ic2VydmFjaW9uZXMgc2UgYXNpZ25hbiBhbCBjb25nbG9tZXJhZG8gY3V5byBjZW50cm9pZGUgZXN0w6kgbcOhcyBwcsOzeGltbywgY29uIGVsIG9iamV0aXZvIGRlIHJlb3JnYW5pemFyIGxvcyBvYmpldG9zIGVuIGdydXBvcyBxdWUgcHJlc2VudGVuIGxhIG1lbm9yIHZhcmlhYmlsaWRhZCBpbnRlcm5hIHBvc2libGUuDQoNCiMjIyMgSy3Dk3B0aW1vIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNCiMjIyMjIEVsYm93DQpgYGB7ciBFbGJvdywgZmlnLmFsaWduPSdjZW50ZXInfQ0KZnZpel9uYmNsdXN0KGRhdGFfLCBrbWVhbnMsIG1ldGhvZCA9ICJ3c3MiLCBrLm1heCA9IDMpICsgDQpnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAzLCBsaW5ldHlwZSA9IDIpDQpgYGANCg0KIyMjIyMgU2lsaG91ZXR0ZQ0KYGBge3IgU2lsaG91ZXR0ZSxmaWcuYWxpZ249J2NlbnRlcid9DQpuX2ZpbGFzIDwtIG5yb3coZGF0YV8pDQprX21heCA8LSBtaW4oNSwgbl9maWxhcyAtIDEpICMgQWp1c3RhIHNlZ8O6biB0dXMgZGF0b3MNCmZ2aXpfbmJjbHVzdChzY2FsZShkYXRhXyksIGttZWFucywgbWV0aG9kID0gInNpbGhvdWV0dGUiLCBrLm1heCA9IGtfbWF4KQ0KDQpgYGANCg0KIyMjIyMgR2FwIFN0YXRpc3RpYw0KYGBge3IgR2FwX1N0YXRpc3RpYyxmaWcuYWxpZ249J2NlbnRlcid9DQpzdXBwcmVzc1dhcm5pbmdzKGZ2aXpfbmJjbHVzdChzY2FsZShkYXRhXyksIGttZWFucywgbWV0aG9kID0gImdhcF9zdGF0Iiwgay5tYXggPSBrX21heCwgbmJvb3QgPSA1MCkpDQoNCmBgYA0KDQojIyMjIFJlc3VsdGFkb3MgSy1NZWFuc3sudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNCiMjIyMjIEstw5NwdGltbyBbRWxfTWEtUnVsIDNdDQpgYGB7ciBrLW9wdGltb3MsIGZpZy5hbGlnbj0nY2VudGVyJ30NCnNldC5zZWVkKDEyMTEyNCkNCnByaW50KGttZWFucyhkYXRhXywgMywgbnN0YXJ0ID0gMjUpKQ0KYGBgDQoNCiMjIyMjIEstw5NwdGltbyBbc2lsIDRdDQpgYGB7ciBrLW9wdGltb19zaWwsIGZpZy5hbGlnbj0nY2VudGVyJ30NCnNldC5zZWVkKDEyMTEyNCkNCnByaW50KGttZWFucyhkYXRhXywgNCwgbnN0YXJ0ID0gMjUpKQ0KYGBgDQoNCiMjIyMgR3LDoWZpY29zIEstTWVhbnN7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQoNCiMjIyMjIEstw5NwdGltbyBbRWxiX01hLVJ1bCAzXQ0KYGBge3IgR3JhZl9FbGJfTWEtUnVsLCBmaWcuYWxpZ249J2NlbnRlcid9DQpmdml6X2NsdXN0ZXIoa21lYW5zKGRhdGFfLCAzLCBuc3RhcnQgPSAyNSksIGRhdGEgPSBkYXRhXywgcGFsZXR0ZSA9IGMoIiMyRTlGREYiLCAiIzAwQUZCQiIsICIjRTdCODAwIiwgIiNFN0I4MDEiKSwgZWxsaXBzZS50eXBlID0gImV1Y2xpZCIsIHN0YXIucGxvdCA9IFRSVUUsIHJlcGVsID0gVFJVRSwgZ2d0aGVtZSA9IHRoZW1lX21pbmltYWwoKQ0KKQ0KYGBgDQoNCiMjIyMjIEstw5NwdGltbyAgW3NpbCA0XQ0KYGBge3IgR3JhZl9zaWwsIGZpZy5hbGlnbj0nY2VudGVyJ30NCmZ2aXpfY2x1c3RlcihrbWVhbnMoZGF0YV8sIDIsIG5zdGFydCA9IDI1KSwgZGF0YSA9IGRhdGFfLCBwYWxldHRlID0gYygiIzJFOUZERiIsICIjMDBBRkJCIiwgIiNFN0I4MDAiLCAiI0U3QjgwMSIpLCBlbGxpcHNlLnR5cGUgPSAiZXVjbGlkIiwgc3Rhci5wbG90ID0gVFJVRSwgcmVwZWwgPSBUUlVFLCBnZ3RoZW1lID0gdGhlbWVfbWluaW1hbCgpDQopDQoNCmBgYA0KDQo8YSBuYW1lPSJzZWM1Ij48L2E+DQoNCiMjICoqRmFzZSA1IFtSZWdyZXNpb25lc10qKg0KDQpFbCBhbsOhbGlzaXMgZGUgcmVncmVzacOzbiBlcyB1bmEgaGVycmFtaWVudGEgZXN0YWTDrXN0aWNhIGVtcGxlYWRhIHBhcmEgaWRlbnRpZmljYXIgeSBldmFsdWFyIGxhcyByZWxhY2lvbmVzIGVudHJlIGRpc3RpbnRhcyB2YXJpYWJsZXMuIEVzdGUgbcOpdG9kbyBwZXJtaXRlIGV4cGxvcmFyIGPDs21vIHVuYSB2YXJpYWJsZSBkZXBlbmRpZW50ZSBvIGRlIHJlc3B1ZXN0YSBzZSB2ZSBhZmVjdGFkYSBwb3IgbG9zIGNhbWJpb3MgZW4gdW5hIG8gbcOhcyB2YXJpYWJsZXMgaW5kZXBlbmRpZW50ZXMgbyBwcmVkaWN0b3JhcywgdXRpbGl6YW5kbyBkaXZlcnNhcyB0w6ljbmljYXMgZGUgbW9kZWxhZG8geSBhbsOhbGlzaXMuIEVuIGVzdGUgZG9jdW1lbnRvIHNlIGFib3JkYXLDoW4gbG9zIG1vZGVsb3MgZGUgcmVncmVzacOzbiBsaW5lYWwgKiooZW4gc3VzIHZlcnNpb25lcyBzaW1wbGUgeSBtw7psdGlwbGUpKiogeSBlbCAqKm1vZGVsbyBsb2fDrXN0aWNvKiosIGFtYm9zIGNvbnNpZGVyYWRvcyBjb21vIGNhc29zIGVzcGVjw61maWNvcyBkZWwgbW9kZWxvIGRlIHJlZ3Jlc2nDs24gbGluZWFsIGdlbmVyYWxpemFkby4NCg0KIyMjIDUuMS4gT2JqZXRpdm9zDQoNCkVzdGUgZXN0dWRpbyB0aWVuZSBjb21vIHByb3DDs3NpdG8gZXN0YWJsZWNlciBsYSAqKnJlbGFjacOzbiBlbnRyZSBkb3MgbyBtw6FzIHZhcmlhYmxlcyoqIG1lZGlhbnRlIGxhIG9idGVuY2nDs24gZGUgaW5mb3JtYWNpw7NuIHNvYnJlIHVuYSBkZSBlbGxhcywgYmFzYWRhIGVuIGVsIGNvbm9jaW1pZW50byBkZSBsb3MgdmFsb3JlcyBkZSBsYXMgb3RyYXMuIExhcyByZWxhY2lvbmVzIGVzdGFibGVjaWRhcyBzb24gZGUgY2Fyw6FjdGVyICoqbm8gZGV0ZXJtaW7DrXN0aWNvKiosIGVzIGRlY2lyLCBzZSBwbGFudGVhcsOhbiByZWxhY2lvbmVzIHByb2JhYmlsw61zdGljYXMgeSBzZSBpbXBsZW1lbnRhcsOhbiBwcm9jZWRpbWllbnRvcyBwYXJhIHJlYWxpemFyIGluZmVyZW5jaWFzIHNvYnJlIGxvcyBtb2RlbG9zIHV0aWxpemFkb3MuIEFkZW3DoXMsIHNlIG9idGVuZHLDoW4gbWVkaWRhcyBjdWFudGl0YXRpdmFzIHF1ZSBpbmRpcXVlbiBlbCBncmFkbyBkZSByZWxhY2nDs24gZW50cmUgbGFzIHZhcmlhYmxlcy4gTG9zIG1vZGVsb3MgY29uc2lkZXJhZG9zIGVuIGVzdGUgdHJhYmFqbyBjb3JyZXNwb25kZW4gYSBjYXNvcyBlc3BlY8OtZmljb3MgZGVsIG1vZGVsbyBsaW5lYWwgZ2VuZXJhbGl6YWRvOiAqKlJlZ3Jlc2nDs24gTGluZWFsIFNpbXBsZSoqLCAqKlJlZ3Jlc2nDs24gTGluZWFsIE3Dumx0aXBsZSoqIHkgKipSZWdyZXNpw7NuIExvZ8Otc3RpY2EqKi4gQ2FkYSBtb2RlbG8gc2Vyw6EgZGVzY3JpdG8gdGXDs3JpY2FtZW50ZSBlbiBzdSByZXNwZWN0aXZhIHNlY2Npw7NuLCB5IHNlIGFwbGljYXLDoSBhIHVuIGNvbmp1bnRvIGRlIGRhdG9zIGVzcGVjw61maWNvIGRlc2NyaXRvIGVuIGxhIFtzZWNjacOzbiAyXSgjc2VjMikuDQoNCiMjIyA1LjIuIFJlZ3Jlc2nDs24gTGluZWFsIFNpbXBsZSB7LnRhYnNldCAudGFic2V0LXBpbGxzfSANCg0KRXN0ZSBtb2RlbG8sIHF1ZSBhIHBhcnRpciBkZSBhaG9yYSBzZSBkZW5vbWluYXLDoSBjb21vIFJMUywgZXN0w6EgY29tcHVlc3RvIHBvciBkb3MgdmFyaWFibGVzOiB1bmEgcHJlZGljdG9yYSB5IG90cmEgcmVzcHVlc3RhLiBFc3BlY8OtZmljYW1lbnRlLCBsYSB2YXJpYWJsZSAkWSQgc2UgY29uc2lkZXJhIGluZmx1aWRhIHBvciBsYSB2YXJpYWJsZSBwcmVkaWN0b3JhICR4JC4gTGEgcmVsYWNpw7NuIGVudHJlIGVzdGFzIHZhcmlhYmxlcyBlc3TDoSBkZXNjcml0YSBwb3IgbGEgZWN1YWNpw7NuOg0KJCRZID0gXGJldGFfMCArIFxiZXRhXzF4ICsgXHZhcmVwc2lsb24kJA0KDQpEb25kZTogDQotICRZJDogRXMgbGEgdmFyaWFibGUgZGVwZW5kaWVudGUgKGxhIHF1ZSBzZSBkZXNlYSBwcmVkZWNpciBvIGV4cGxpY2FyKS4NCi0gJHgkOiBFcyBsYSB2YXJpYWJsZSBpbmRlcGVuZGllbnRlIChwcmVkaWN0b3JhKS4NCi0gJChcYmV0YV8wKSQ6IEVzIGVsIGludGVyY2VwdG8gKHZhbG9yIGRlICRZJCBjdWFuZG8gJCh4ID0gMCkkLg0KLSAkKFxiZXRhXzEpJDogRXMgbGEgcGVuZGllbnRlIChpbmRpY2EgY3XDoW50byBjYW1iaWEgJFkkIHBvciBjYWRhIHVuaWRhZCBxdWUgY2FtYmlhICQoeCkkLg0KLSAkKFxlcHNpbG9uKSQ6IEVzIGVsIHTDqXJtaW5vIGRlIGVycm9yLCBxdWUgY2FwdHVyYSBsYXMgZGVzdmlhY2lvbmVzIGVudHJlIGxvcyB2YWxvcmVzIG9ic2VydmFkb3MgeSBsb3MgdmFsb3JlcyBwcmVkaWNob3MgcG9yIGVsIG1vZGVsby4NCg0KTGEgcmVsYWNpw7NuIGVudHJlIGxhIHZhcmlhYmxlIGluZGVwZW5kaWVudGUgeSBsYSB2YXJpYWJsZSBkZXBlbmRpZW50ZSBlbiBlbCBtb2RlbG8gZGUgcmVncmVzacOzbiBsaW5lYWwgc2ltcGxlIGRlYmUgY3VtcGxpciBjaWVydGFzIHN1cG9zaWNpb25lcyBjbGF2ZSBwYXJhIHF1ZSBsb3MgcmVzdWx0YWRvcyBzZWFuIHbDoWxpZG9zLiBFc3RhcyBzb24gbGFzIHNpZ3VpZW50ZXM6IDEuIExhIHJlbGFjacOzbiBlbnRyZSBsYSB2YXJpYWJsZSBpbmRlcGVuZGllbnRlICR4JCB5IGxhIHZhcmlhYmxlIGRlcGVuZGllbnRlICRZJCBkZWJlIHNlciBsaW5lYWwuIDIuIEVsIHTDqXJtaW5vIGRlIGVycm9yICTOtSQgc2lndWUgdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIHkgdGllbmUgdW5hIG1lZGlhIGlndWFsIGEgY2Vyby4gMy4gTGFzIG9ic2VydmFjaW9uZXMgZGViZW4gc2VyIGluZGVwZW5kaWVudGVzIGVudHJlIHPDrSwgZXMgZGVjaXIsIGVsIHZhbG9yIGRlICRZJCBwYXJhIHVuIGRhdG8gbm8gaW5mbHV5ZSBlbiBsb3MgdmFsb3JlcyBkZSAkWSQgcGFyYSBvdHJvcyBkYXRvcy4gNC4gTGEgdmFyaWFuemEgZGVsIHTDqXJtaW5vIGRlIGVycm9yICTOtSQgZGViZSBzZXIgY29uc3RhbnRlIHBhcmEgdG9kb3MgbG9zIHZhbG9yZXMgZGUgbGEgdmFyaWFibGUgaW5kZXBlbmRpZW50ZSAkeCQsIHVuYSBjb25kaWNpw7NuIGNvbm9jaWRhIGNvbW8gaG9tb2NlZGFzdGljaWRhZC4gTGEgdmFyaWFuemEgZGUgJFx2YXJlcHNpbG9uJCBlcyBjb25zdGFudGUgcGFyYSB0b2RvcyBsb3MgdmFsb3JlcyBkZSAkeCQuDQoNCiMjIyMjIENvZWZpY2llbnRlcyBkZWwgTW9kZWxvIFJMUw0KYGBge3IgQ29lZmljaWVudGVzX01vZGVsb19STFMsIGZpZy5hbGlnbj0nY2VudGVyJ30NCm1vZGVsb19STF9TaW1wbGUgPSBsbSh2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCRzYXRpc2ZhY2Npb25fcGFjaWVudGV+dmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVEwkdGllbXBvX3RvdGFsX2VzcGVyYSkNCmNvZWYobW9kZWxvX1JMX1NpbXBsZSkNCmBgYA0KDQojIyMjIyBSZXN1bWVuIEVzdGFkw61zdGljbyBkZWwgTW9kZWxvIFJMUw0KYGBge3IgUmVzdW1lbiBFc3RhZMOtc3RpY29fZGVsX01vZGVsb19STFMsZmlnLmFsaWduPSdjZW50ZXInfQ0Kc3VtbWFyeShtb2RlbG9fUkxfU2ltcGxlKQ0KYGBgDQoNCiMjIyMjIFRhYmxhIEFOT1ZBIHBhcmEgZWwgTW9kZWxvIFJMUw0KYGBge3IgVGFibGFfQU5PVkFfcGFyYV9lbF9Nb2RlbG9fUkxTLGZpZy5hbGlnbj0nY2VudGVyJ30NCmFub3ZhKG1vZGVsb19STF9TaW1wbGUpDQoNCmBgYA0KDQojIyMgNS4zLiBSZWdyZXNpw7NuIExpbmVhbCBNw7psdGlwbGUuDQoNCkVzdGUgbW9kZWxvLCBxdWUgcHVlZGUgaW5pY2lhbG1lbnRlIHBlbnNhcnNlIGNvbW8gdW5hIGV4dGVuc2nDs24gZGUgbGEgcmVncmVzacOzbiBsaW5lYWwgc2ltcGxlIHBhcmEgZmFjaWxpdGFyIHN1IGNvbXByZW5zacOzbiwgeSBxdWUgZXZlbnR1YWxtZW50ZSBzZXLDoSBsbGFtYWRvIGVuIGVzdGUgZXN0dWRpbyBjb21vICoqUkxNKiosIHRpZW5lIGNvbW8gZWN1YWNpw7NuIGdlbmVyYWwgYWRpdGl2YTokJHlfaT1cYmV0YV8wK1xiZXRhXzEgeF97aTF9K1xjZG90cytcYmV0YV9rIHhfe2lrfStcdmFyZXBzaWxvbl9pLCBcaHNwYWNlezNtbX1pPTEsMixcZG90cyxuXGhzcGFjZXsxMG1tfSgyMSkkJCANCg0KRG9uZGU6DQotICR5X2kgJDogVmFsb3Igb2JzZXJ2YWRvIGRlIGxhIHZhcmlhYmxlIGRlcGVuZGllbnRlIHBhcmEgbGEgb2JzZXJ2YWNpw7NuICQgaSAkDQotICRcYmV0YV8wJDogSW50ZXJjZXB0bywgdmFsb3IgZGUgJCB5ICQgY3VhbmRvIHRvZGFzIGxhcyAkIHhfaiA9IDAgJC4NCi0gJFxiZXRhXzEsIFxiZXRhXzIsIFxkb3RzLCBcYmV0YV9rJDogQ29lZmljaWVudGVzIHF1ZSBpbmRpY2FuIGN1w6FudG8gY2FtYmlhIFwoIHkgXCkgcG9yIGNhZGEgdW5pZGFkIHF1ZSBjYW1iaWEgXCggeF9qIFwpLCBtYW50ZW5pZW5kbyBjb25zdGFudGVzIGxhcyBkZW3DoXMgdmFyaWFibGVzLg0KLSAkIFxlcHNpbG9uX2kgJDogVMOpcm1pbm8gZGUgZXJyb3IgcGFyYSBsYSBvYnNlcnZhY2nDs24gXCggaSBcKS4NCi0gJCBFKFxlcHNpbG9uKSA9IDAgJDogU2UgYXN1bWUgcXVlIGVsIGVycm9yIHRpZW5lIG1lZGlhIGNlcm8uDQotICQgVihcZXBzaWxvbikgPSBcc2lnbWFeMiAkOiBMYSB2YXJpYW56YSBkZWwgZXJyb3IgZXMgY29uc3RhbnRlLg0KDQpBZGVtw6FzICRFKFxlcHNpbG9uKT0wJCB5ICRWKFxlcHNpbG9uKT1cc2lnbWFeMiQuIFRhbWJpw6luLCBwYXJhIGhhY2VyIHBydWViYXMgZGUgaGlww7N0ZXNpcyB5IGNhbGN1bGFyIGludGVydmFsb3MgZGUgY29uZmlhbnphIHkgZGUgcHJlZGljY2nDs24sIHNlIHN1cG9uZSBxdWUgJFxlcHNpbG9uJCBlc3TDoSBub3JtYWxtZW50ZSBkaXN0cmlidWlkYS4gQ29tcGxlbWVudGFyaWFtZW50ZSwgY29uIGJhc2UgZW4gZWwgZW5mb3F1ZSBkZSBsb3MgbcOtbmltb3MgY3VhZHJhZG9zIG9yZGluYXJpb3MsIGxhIGVzdGltYWNpw7NuIGRlIHN1cyBwYXLDoW1ldHJvcyBzZSBwbGFudGVhIGVuIHTDqXJtaW5vcyBkZSBsYSBtaW5pbWl6YWNpw7NuIGRlIHVuYSBmdW5jacOzbiBkZSBlbnNheW8gZGVzZGUgbGEgY3VhbCBzZSBvYnNlcnZhbiBsb3MgY3VhZHJhZG9zIGRlIGxhcyBkZXN2aWFjaW9uZXMgZGUgbGEgdmFyYWlibGUgZXN0dWRpYWRhLiBMYSBmdW5jacOzbiBkZSBlbnNheW8gc2UgcmVwcmVzZW50YSBjb21vICRmKGJfMCxiXzEsLi4uLGJfayk9IFxzdW1fe2p9W3lfaS0oYl8wK2JfMXhfezFqfStiXzJ4X3syan0rLi4uK2Jfa3hfe2tqfSldXjIkLiBFc3RvIGNvbmR1Y2UgYSB1biBjb25qdW50byBkZSBlY3VhY2lvbmVzIG5vcm1hbGVzIGxpbmVhbGVzIGVuICRiXzAsYl8xLC4uLixiX2skLCBxdWUgYWwgc2VyIHJlc3VlbHRhcyBlbnRyZWdhbiBsYXMgZXN0aW1hY2lvbmVzIGRlIG3DrW5pbW9zIGN1YWRyYWRvcyBkZSAkXGhhdHtcYmV0YV8wfSxcaGF0e1xiZXRhXzF9LC4uLiwsIFxoYXR7XGJldGFfa30kLg0KDQoNCkNvbXBsZW1lbnRhcmlhbWVudGUsIGxhIHByb3BvcmNpw7NuIGRlIHZhcmlhY2nDs24gdG90YWwgZXhwbGljYWRhIHBvciBlbCBtb2RlbG8gZGUgcmVncmVzacOzbiBtw7psdGlwbGUgYSB0cmF2w6lzIGRlbCBjb2VmaWNpZW50ZSBkZSBkZXRlcm1pbmFjacOzbiBtw7psdGlwbGUgc2UgYWp1c3RhLCBnZW5lcmFsbWVudGUsIGNvbiBiYXNlIGVuIGVsIG7Dum1lcm8gZGUgcGFyw6FtZXRyb3MgZGVsIG1vZGVsby4NCg0KQWRlbcOhcywgdW5hIHBydWViYSBkZSB1dGlsaWRhZCBkZWwgbW9kZWxvIGRlIHJlZ3Jlc2nDs24gbGluZWFsIG3Dumx0aXBsZSBjb25zaXN0ZSBlbiB1bmEgcHJ1ZWJhIGRlIGhpcMOzdGVzaXMgYmFzYWRhIGVuIHVuIGVzdGFkw61zdGljbyBxdWUgdGllbmUgdW5hIGRpc3RyaWJ1Y2nDs24gJEYkIHBhcnRpY3VsYXIgY3VhbmRvICRIXzAkIGVzIHZlcmRhZGVyYSwgZXN0byBkZSBleHByZXNhIGVuIGVsIHBhcjokJEhfMDpcYmV0YV8xPVxiZXRhXzI9XGNkb3RzPVxiZXRhX2s9MFxoc3BhY2V7MTBtbX0oMjIpJCQNCiQkSF8xOiBcdGV4dCB7YWwgbWVub3MgdW5hIH1cYmV0YV9pXG5lcSAwXGhzcGFjZXs1bW19KGk9MSwuLi4saylcaHNwYWNlezEwbW19KDIzKSQkIGVsIHZhbG9yIGRlbCBlc3RhZMOtc3RpY28gZGUgcHJ1ZWJhIGVzOiQkZj1cZnJhY3tSXjIva317KDEtUl4yKShuLShrKzEpKX09XGZyYWN7U0NSL2t9e1NDRS8obi0oaysxKSl9PVxmcmFje1JNQ317Q01FfVxoc3BhY2V7MTBtbX0oMjQpJCQgZG9uZGUgJFNDUj1TVEMtU0NFJCwgcXVlIGVzIGxhIHN1bWEgZGUgY3VhZHJhZG9zIGRlIHJlZ3Jlc2nDs24sIHkgbGEgcmVnacOzbiBkZSByZWNoYXpvIHBhcmEgdW5hIHBydWViYSBkZSBuaXZlbCAkXGFscGhhJCBlczogJCRmXGdlcSBGX3tcYWxwaGEsIGssbi0oaysxKX1caHNwYWNlezEwbW19KDI1KSQkIFBvciDDumx0aW1vLCB1biBpbnRlcnZhbG8gZGUgY29uZmlhbnphIGFsICQxMDAoMS1cYWxwaGEpXCUkIHBhcmEgJFxiZXRhX2kkIGVzOiAkJFxoYXRcYmV0YV9pXHBtIHRfe1xhbHBoYS8yLG4tKGsrMSl9XGNkb3Qgc197XGhhdFxiZXRhX3tpfX1caHNwYWNlezEwbW19KDI2KSQkIHkgdW4gaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSBhbCBtaXNtbyBuaXZlbCBkZSBzaWduaWZpY2FuY2lhIHBhcmEgdW4gdmFsb3IgZnV0dXJvIGVzdMOhIGRhZG8gcG9yOiAkJFxoYXQgeVxwbSB0X3tcYWxwaGEvMixuLShrKzEpfVxjZG90IFxzcXJ0e3NeMitzXjJfe1xoYXQgWX19XGhzcGFjZXsxMG1tfSgyNykkJCBQYXJhIGNlcnJhciwgZXMgbmVjZXNhcmlvIG1lbmNpb25hciBxdWUgZXZlbnR1YWxtZW50ZSBzdXJnZW4gcHJvYmxlbWFzIGVuIGxvcyBhbsOhbGlzaXMgZGUgcmVncmVzacOzbiBtw7psdGlwbGUgcXVlIGltcGxpY2FuIGNvbnNpZGVyYXIgdMOpY25pY2FzIGRlIHNvbHVjacOzbiByZWxhY2lvbmFkYXMgY29uIHRyYW5zZm9ybWFjaW9uZXMgZGUgbm8tbGluZWFsaWRhZCwgZXN0YW5kYXJpemFjacOzbiB5IHNlbGVjY2nDs24gZGUgdmFyaWFibGVzLCBpZGVudGlmaWNhY2nDs24gZGUgb2JzZXJ2YWNpb25lcyBpbmZsdXllbnRlcywgbXVsdGljb2xpbmVhbGlkYWQsIGVudHJlIG90cmFzLiAoU2Vnw7puIFtARUFNT1RJbW80MjAyM10gKQ0KDQpDb24gYmFzZSBlbiBlbCBjb25qdW50byBkZSBkYXRvcyBkZXNjcml0byBlbiBsYSBbc2VjY2nDs24gMS4yXSgjc2VjMS4yKSwgc2UgZm9ybXVsYXLDoSB1biBtb2RlbG8gZGUgcmVncmVzacOzbiBsaW5lYWwgbcO6bHRpcGxlIHBhcmEgZXN0dWRpYXIgbGEgcmVsYWNpw7NuIGxpbmVhbCBlbnRyZSBsYSB2YXJpYWJsZSBkZXBlbmRpZW50ZSAqKk1heCBIZWFydCBSYXRlKiogeSBsYXMgdmFyaWFibGVzIGN1YWxpdGF0aXZhcyBkZWwgY29uanVudG8gZGUgZGF0b3M6ICoqY2hlc3RwYWluKiosKipyZXN0aW5nZWxlY3RybyoqLCoqc2xvcGUqKiwgKipub29mbWFqb3J2ZXNlZWxzKiosKipnZW5kZXIqKiwqKmV4Y2Vyc2ljZWFuZ2luYSoqLCoqZmFzdGluZ2Jsb29kc3VnYXIqKiB5ICoqdGFyZ2V0KiogY29tbyBpbmRlcGVuZGllbnRlcy4gRXN0ZSBhbsOhbGlzaXMgcGVybWl0aXLDoSBldmFsdWFyIGPDs21vIGVzdGFzIGNhcmFjdGVyw61zdGljYXMgY2F0ZWfDs3JpY2FzIGluZmx1eWVuIGVuIGxvcyB2YWxvcmVzIGRlICoqZnJlY3VlbmNpYSBjYXJkw61hY2EgbcOheGltYSoqIHkgZGV0ZXJtaW5hciBzdSBpbXBhY3RvIGVuIGVsIGNvbnRleHRvIGRlbCBlc3R1ZGlvLg0KDQojIyMjIyBSZXN1bWVuIFZhcmlhYmxlcyBDdWFudGl0YXRpdmFzDQpgYGB7ciBSZXN1bWVuX1ZhcmlhYmxlc19DdWFudGl0YXRpdmFzLGZpZy5hbGlnbj0nY2VudGVyJ30NCnN1bW1hcnkodmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVEwkcmVsYWNpb25fZW5mZXJtZXJhX3BhY2llbnRlKQ0Kc3VtbWFyeSh2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCRlc3BlY2lhbGlzdGFzX2Rpc3BvbmlibGVzKQ0Kc3VtbWFyeSh2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCR0aWVtcG9fcmVnaXN0cm8pDQpzdW1tYXJ5KHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMJHRpZW1wb190cmlhZ2UpDQpzdW1tYXJ5KHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMJHRpZW1wb19hdGVuY2lvbl9wcm9mZXNpb25hbF9tZWRpY28pDQpzdW1tYXJ5KHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMJHRpZW1wb190b3RhbF9lc3BlcmEpDQpgYGANCg0KIyMjIyMgUmVzdW1lbiBWYXJpYWJsZXMgQ3VhbGl0YXRpdmFzDQpgYGB7ciBSZXN1bWVuX1ZhcmlhYmxlc19DdWFsaXRhdGl2YXMsZmlnLmFsaWduPSdjZW50ZXInfQ0KDQp0YWJsZSh2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCRub21icmVfaG9zcGl0YWxlcykNCnByb3AudGFibGUodGFibGUodmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVEwkbm9tYnJlX2hvc3BpdGFsZXMpKQ0KYmFycGxvdCh0YWJsZSh2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCRub21icmVfaG9zcGl0YWxlcykpDQoNCnRhYmxlKHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMJHpvbmEpDQpwcm9wLnRhYmxlKHRhYmxlKHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMJHpvbmEpKQ0KYmFycGxvdCh0YWJsZSh2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCR6b25hKSkNCg0KdGFibGUodmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVEwkZGlhX3NlbWFuYSkNCnByb3AudGFibGUodGFibGUodmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVEwkZGlhX3NlbWFuYSkpDQpiYXJwbG90KHRhYmxlKHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMJGRpYV9zZW1hbmEpKQ0KDQp0YWJsZSh2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCR0ZW1wb3JhZGEpDQpwcm9wLnRhYmxlKHRhYmxlKHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMJHRlbXBvcmFkYSkpDQpiYXJwbG90KHRhYmxlKHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMJHRlbXBvcmFkYSkpDQoNCnRhYmxlKHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMJG5pdmVsX3VyZ2VuY2lhKQ0KcHJvcC50YWJsZSh0YWJsZSh2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCRuaXZlbF91cmdlbmNpYSkpDQpiYXJwbG90KHRhYmxlKHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMJG5pdmVsX3VyZ2VuY2lhKSkNCg0KdGFibGUodmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVEwkcmVzdWx0YWRvX3BhY2llbnRlKQ0KcHJvcC50YWJsZSh0YWJsZSh2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCRyZXN1bHRhZG9fcGFjaWVudGUpKQ0KYmFycGxvdCh0YWJsZSh2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCRyZXN1bHRhZG9fcGFjaWVudGUpKQ0KDQp0YWJsZSh2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCRzYXRpc2ZhY2Npb25fcGFjaWVudGUpDQpwcm9wLnRhYmxlKHRhYmxlKHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMJHNhdGlzZmFjY2lvbl9wYWNpZW50ZSkpDQpiYXJwbG90KHRhYmxlKHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMJHNhdGlzZmFjY2lvbl9wYWNpZW50ZSkpDQoNCmBgYA0KDQojIyMjIyBEaWFncmFtYXMgZGUgRGlzcGVyc2nDs24gVmFyaWFibGVzIEN1YW50aXRhdGl2YXMNCmBgYHtyIERpYWdyYW1hc19Ub3RhbGVzX2RlX0Rpc3BlcnNpb259DQpwYWlycyh+cmVsYWNpb25fZW5mZXJtZXJhX3BhY2llbnRlICsgZXNwZWNpYWxpc3Rhc19kaXNwb25pYmxlcyArIHRpZW1wb19yZWdpc3RybyArIHRpZW1wb190cmlhZ2UgKyB0aWVtcG9fYXRlbmNpb25fcHJvZmVzaW9uYWxfbWVkaWNvICsgdGllbXBvX3RvdGFsX2VzcGVyYSwgZGF0YSA9IHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMKQ0KYGBgDQoNCiMjIyA1LjQuIFJlZ3Jlc2nDs24gTG9nw61zdGljYSBTaW1wbGUNCg0KTGEgKipyZWdyZXNpw7NuIGxvZ8Otc3RpY2Egc2ltcGxlKiogc2UgdXRpbGl6YSBwYXJhIGFuYWxpemFyIGxhIHJlbGFjacOzbiBlbnRyZSB1bmEgdmFyaWFibGUgY2F0ZWfDs3JpY2EgZGVwZW5kaWVudGUgeSB1bmEgw7puaWNhIHZhcmlhYmxlIGluZGVwZW5kaWVudGUsIHBlcm1pdGllbmRvIGNhbGN1bGFyIGxhcyBwcm9iYWJpbGlkYWRlcyBkZSBwZXJ0ZW5lbmNpYSBhIGRpc3RpbnRhcyBjYXRlZ29yw61hcy4NCg0KRWwgbW9kZWxvIHBlcm1pdGUgaWRlbnRpZmljYXIgKipyZWxhY2lvbmVzIHNpZ25pZmljYXRpdmFzKiogZW50cmUgbGFzIHZhcmlhYmxlcyBlc3R1ZGlhZGFzLCBmYWNpbGl0YW5kbyBsYSBwcmVkaWNjacOzbiBwcmVjaXNhIGRlIGFmZWNjaW9uZXMgY2FyZGlvdmFzY3VsYXJlcyBlbiBwYWNpZW50ZXMgZXNwZWPDrWZpY29zLiBFc3RlIGVuZm9xdWUgZGVzdGFjYSBwb3Igc3UgY2FwYWNpZGFkIHBhcmEgY29tcHJlbmRlciB5IG1vZGVsYXIgcmVsYWNpb25lcyBjYXRlZ8OzcmljYXMgZW4gZGF0b3MgZGUgc2FsdWQuDQoNCkVuIGVsIGNhc28gcG9yIHRyYXRhciwgc2UgdHJhYmFqYXLDoSBjb24gYmFzZSBlbiB1bmEgZGlzdHJpYnVjacOzbiBiaW5vbWlhbCAoYWRlY3VhZGEgcGFyYSB2YXJpYWJsZXMgcXVlIHJlcHJlc2VudGFuIHVuYSByZXNwdWVzdGEgYmluYXJpYSkgY29uIGZ1bmNpw7NuIGRlIGVubGFjZSBsb2dpdDokJFxwaSh4KT1cZGZyYWN7ZV57XGJldGFfMCtcYmV0YV8xIHh9fXsxKyBlXntcYmV0YV8wICtcYmV0YV8xIHh9fT0gIFxkZnJhY3sxfXsxKyBlXnstKFxiZXRhXzArXGJldGFfMSB4KX19XGhzcGFjZXsxMG1tfSgzMCkkJChkZWwgaW5nbMOpcyAqKmxvZyoqYXJpdGhtaWMgdW4qKml0Kio6IHVuaWRhZCBsb2dhcsOtdG1pY2EgKG5hdHVyYWwpKTsgcXVlIGFkZW3DoXMgZXMgYXByb3BpYWRhIMO6bmljYW1lbnRlIHBhcmEgbGEgZGlzdHJpYnVjacOzbiBiaW5vbWlhbCksIHBvciBsbyBjdWFsIHVuIG5vbWJyZSBtw6FzIGFkZWN1YWRvIHBhcmEgbGEgcmVncmVzacOzbiBwb2Ryw61hIHNlciByZWdyZXNpw7NuIGxvZ8Otc3RpY2EgYmluYXJpYS4gQ2FiZSBhbm90YXIgcXVlIGVsIHTDqXJtaW5vIGxvZ8Otc3RpY28gaGFjZSByZWZlcmVuY2lhIGEgcXVlIGxhIGZ1bmNpw7NuIGRlIGVubGFjZSBjb25zdGl0dXllLCBlbiBjaWVydG8gc2VudGlkbywgdW4gcmVmaW5hbWllbnRvIGRlbCBtb2RlbG8gZXhwb25lbmNpYWwgZGUgY3JlY2ltaWVudG8sIGRlc2NyaXRvIHBvciBsYSBmdW5jacOzbiBzaWdtb2lkZWEsIGRlIHVuYSBtYWduaXR1ZCBhc29jaWFkYSBjb24gdW4gY29uanVudG8gJEMkLiAoc2Vnw7puW0BFQU1PVEltbzQyMDIzXSkuDQoNClBhcmEgaW50ZXJwcmV0YXIgbG9zIHJlc3VsdGFkb3MsIGxhIGZ1bmNpw7NuIGRlIGVubGFjZSAkcGkoeCkkIHNlIGFzb2NpYSBjb24gbGEgcmF6w7NuIGRlIHByb2JhYmlsaWRhZGVzIChPRERTIHJhdGlvLCBPUiBlbiBpbmdsw6lzKSwgZGVmaW5pZGEgY29tbyBlbCBsb2dhcml0bW86ICRsb2dcbGVmdChcZnJhY3tccGkoeCl9ezEtXHBpKHgpfVxyaWdodCkkLiBFc3RhIGZ1bmNpw7NuIG1vZGVsYSBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIHVuIHBhY2llbnRlIHByZXNlbnRlIGxhIGFmZWNjacOzbiAobml2ZWwgZGUgcmVmZXJlbmNpYSAkMSQpIGVuIGZ1bmNpw7NuIGRlIGxhcyB2YXJpYWJsZXMgcHJlZGljdG9yYXMuIEFkZW3DoXMsIGxhIHRyYW5zZm9ybWFjacOzbiBkZSBwcm9iYWJpbGlkYWRlcyBhIHJhem9uZXMgZGUgcHJvYmFiaWxpZGFkIGNvbnNlcnZhIGxhIHJlbGFjacOzbiBkZSBvcmRlbiB5IGFtcGzDrWEgZWwgaW50ZXJ2YWxvIGRlIHByb2JhYmlsaWRhZCAkWzAsMV0kIGFsIHJhbmdvICQoLVxpbmZ0eSwgXGluZnR5KSQuIEVzdGFzIHByb3BpZWRhZGVzIHNvbiBmdW5kYW1lbnRhbGVzIHBhcmEgaW50ZXJwcmV0YXIgY29ycmVjdGFtZW50ZSBsYXMgcmVsYWNpb25lcyBlbnRyZSDDqXhpdG8gKGFmZWNjacOzbiBwcmVzZW50ZSkgeSBmcmFjYXNvIChhZmVjY2nDs24gYXVzZW50ZSkgZW4gZXN0ZSBjb250ZXh0by4NCg0KTGFzIHByb3BpZWRhZGVzIHF1ZSBzZSBkYW4gZW50cmUgbGFzIHByb2JhYmlsaWRhZGVzIGNvbXBsZW1lbnRhcmlhcyBkZSDDqXhpdG8geSBmcmFjYXNvLCBzdXMgcmF6b25lcyB5IGxhIGZ1bmNpw7NuIGRlIGVubGFjZSBsb2dpdCBzb246DQoNCnx8fHwNCjotOnw6LTp8Oi06fA0KJHAow6l4aXRvKT1wKGZyYWNhc28pJHwkT1I9MSR8JExvZ2l0XGxlZnQoT1JccmlnaHQpPTAkDQokcCjDqXhpdG8pPHAoZnJhY2FzbykkfCRPUjwxJHwkTG9naXRcbGVmdChPUlxyaWdodCk8MCQNCiRwKMOpeGl0byk+cChmcmFjYXNvKSR8JE9SPjEkfCRMb2dpdFxsZWZ0KE9SXHJpZ2h0KT4wJA0KfHx8fA0KDQpTZSBlbnRpZW5kZSBxdWUgbGEgdHJhbnNmb3JtYWNpw7NuICRMb2dpdCQgY2FyZWNlIGRlIHNlbnRpZG8gcGFyYSBsYSBjZXJ0ZXphIGRlbCDDqXhpdG8gbyBkZWwgZnJhY2Fzby4NCg0KIyMjIyMgUmVzdW1lbiB5IEJveHBsb3QgVGllbXBvIFRvdGFsIGRlIEVzcGVyYQ0KYGBge3IgcmVzdW1lbl9jb2xlc3Rlcm9sc2VyaWNvLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCnN1bW1hcnkodmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVEwkdGllbXBvX3RvdGFsX2VzcGVyYSkNCmJveHBsb3QodmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVEwkdGllbXBvX3RvdGFsX2VzcGVyYSwgbWFpbiA9ICJEaWFncmFtYSBkZSBDYWphIGRlbCBUaWVtcG8gVG90YWwgZGUgRXNwZXJhIiwgY29sID0gYygib3JhbmdlIikpDQpgYGANCg0KIyMjIyMgSGlzdG9ncmFtYSBkZSBUaWVtcG8gVG90YWwgZGUgRXNwZXJhDQpgYGB7ciBoaXN0b2dyYW1hX0NTLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCnN1bW1hcnkodmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVEwkdGllbXBvX3RvdGFsX2VzcGVyYSkNCmhpc3QodmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVEwkdGllbXBvX3RvdGFsX2VzcGVyYSwgbWFpbiA9ICJIaXN0b2dyYW1hIGRlIFRpZW1wbyBUb3RhbCBkZSBFc3BlcmEiLCBjb2wgPSBjKCJibHVlIikpDQpgYGANCg0KIyMjIyMgUmVzdW1lbiB5IERpYWdyYW1hIGRlIEJhcnJhcyBkZSBTYXRpc2ZhY2Npb24gUGFjaWVudGUNCmBgYHtyIHJlc3VtZW5fdGFyZ2V0LCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCnRhYmxlKHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMJHNhdGlzZmFjY2lvbl9wYWNpZW50ZSkNCnByb3AudGFibGUodGFibGUodmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVEwkc2F0aXNmYWNjaW9uX3BhY2llbnRlKSkNCmJhcnBsb3QodGFibGUodmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVEwkc2F0aXNmYWNjaW9uX3BhY2llbnRlKSkNCmBgYA0KIyMjIyMgUmVzdW1lbiB5IERpYWdyYW1hIGRlIENhamFzIENvbmp1bnRvDQpgYGB7ciByZXN1bWVuX3lfZGlhZ3JhbWFfZGVfY2FqYXNfY29uanVudG8sIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KdGFwcGx5KHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMJHRpZW1wb190b3RhbF9lc3BlcmEsIHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMJHNhdGlzZmFjY2lvbl9wYWNpZW50ZSwgbWVhbikNCnRhcHBseSh2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCR0aWVtcG9fdG90YWxfZXNwZXJhLCB2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCRzYXRpc2ZhY2Npb25fcGFjaWVudGUsIG1lZGlhbikNCmJveHBsb3QodmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVEwkdGllbXBvX3RvdGFsX2VzcGVyYX52aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCRzYXRpc2ZhY2Npb25fcGFjaWVudGUsIG1haW4gPSAiQm94cGxvdCBDb25qdW50bzogVGllbXBvIFRvdGFsIEVzcGVyYS1TYXRpc2ZhY2Npb24gcGFjaWVudGUiICwgY29sID0gYygib3JhbmdlIiwgImJsdWUiKSkNCmBgYA0KIyMjIyMgQ29lZmljaWVudGVzIGRlbCBNb2RlbG8gUkxvZ1MNCmBgYHtyIGNvZWZpY2llbnRlc19SZWdyZXNpb25fTG9naXN0aWNhX1NpbXBsZSwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQoNCiMgTGlicmVyw61hcw0KbGlicmFyeShkcGx5cikNCg0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyAxLiBMaW1waWV6YSBiw6FzaWNhIGRlIGxvcyBkYXRvcw0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIEVsaW1pbmFyIGZpbGEgZGUgcmVzdW1lbiAiVG90YWwiIChDUsONVElDTykNCnZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMIDwtDQogIHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMIHw+DQogIGRwbHlyOjpmaWx0ZXIobm9tYnJlX2hvc3BpdGFsZXMgIT0gIlRvdGFsIikNCg0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyAyLiBDcmVhciB2YXJpYWJsZSBiaW5hcmlhIGRlIHNhdGlzZmFjY2nDs24NCiMgICAgKDEgPSBzYXRpc2ZlY2hvLCAwID0gbm8gc2F0aXNmZWNobykNCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KdmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVEwgPC0gDQogIHZpc2l0YV9wYWNpZW50ZXNfc2FsYV91cmdlbmNpYXNfRVRMIHw+DQogIG11dGF0ZSgNCiAgICBzYXRpc2ZfYmluYXJpYSA9IGlmZWxzZShzYXRpc2ZhY2Npb25fcGFjaWVudGUgPj0gNCwgMSwgMCkNCiAgKQ0KDQojIFZlcmlmaWNhciBkaXN0cmlidWNpw7NuDQp0YWJsZSh2aXNpdGFfcGFjaWVudGVzX3NhbGFfdXJnZW5jaWFzX0VUTCRzYXRpc2ZfYmluYXJpYSkNCg0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyAzLiBTZWxlY2Npb25hciB2YXJpYWJsZXMgZGVsIG1vZGVsbw0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpkYXRvc19tb2RlbG8gPC0gdmlzaXRhX3BhY2llbnRlc19zYWxhX3VyZ2VuY2lhc19FVEwgfD4NCiAgc2VsZWN0KA0KICAgIHNhdGlzZl9iaW5hcmlhLA0KICAgIHRpZW1wb190b3RhbF9lc3BlcmENCiAgKSB8Pg0KICBuYS5vbWl0KCkNCg0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyA0LiBFc3RpbWFyIGVsIG1vZGVsbyBkZSByZWdyZXNpw7NuIGxvZ8Otc3RpY2EgYmluYXJpYQ0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQptb2RlbG9fUkxvZ19zaW1wbGUgPC0gZ2xtKA0KICBzYXRpc2ZfYmluYXJpYSB+IHRpZW1wb190b3RhbF9lc3BlcmEsDQogIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAibG9naXQiKSwNCiAgZGF0YSA9IGRhdG9zX21vZGVsbw0KKQ0KDQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIDUuIFJlc3VsdGFkb3MgZGVsIG1vZGVsbw0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpzdW1tYXJ5KG1vZGVsb19STG9nX3NpbXBsZSkNCg0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyA2LiBPZGRzIFJhdGlvcyBlIGludGVydmFsb3MgZGUgY29uZmlhbnphDQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCk9SIDwtIGV4cChjYmluZCgNCiAgT1IgPSBjb2VmKG1vZGVsb19STG9nX3NpbXBsZSksDQogIGNvbmZpbnQobW9kZWxvX1JMb2dfc2ltcGxlKQ0KKSkNCg0KT1INCmBgYA0KDQoNCg0KIyMgKio2LiBDb25jbHVzaW9uZXMqKg0KDQpFbCBhbsOhbGlzaXMgaW50ZWdyYWwgZGVsIGNvbmp1bnRvIGRlIGRhdG9zIGV2aWRlbmNpYSBxdWUgZWwgc2VydmljaW8gZGUgdXJnZW5jaWFzIHByZXNlbnRhIHVuYSBlc3RydWN0dXJhIG9wZXJhdGl2YSBjb21wbGVqYSwgY2FyYWN0ZXJpemFkYSBwb3IgdW5hIGFsdGEgaW50ZXJkZXBlbmRlbmNpYSBlbnRyZSBsYXMgZGlzdGludGFzIGV0YXBhcyBkZWwgcHJvY2VzbyBhc2lzdGVuY2lhbCB5IHVuYSBtYXJjYWRhIGhldGVyb2dlbmVpZGFkIGVuIGxhIGV4cGVyaWVuY2lhIGRlIGxvcyBwYWNpZW50ZXMuIExhIGJhc2UgZGUgZGF0b3MsIGNvbiA1LjAwMCByZWdpc3Ryb3MgeSB1bmEgY29tYmluYWNpw7NuIGFkZWN1YWRhIGRlIHZhcmlhYmxlcyBjdWFsaXRhdGl2YXMgeSBjdWFudGl0YXRpdmFzLCBwZXJtaXRpw7MgYWJvcmRhciBlbCBmZW7Ds21lbm8gZGVzZGUgdW5hIHBlcnNwZWN0aXZhIGVzdGFkw61zdGljYSByb2J1c3RhLCBvcGVyYWNpb25hbCB5IHBlcmNlcHR1YWwsIHByb3BvcmNpb25hbmRvIGluZm9ybWFjacOzbiB2YWxpb3NhIHBhcmEgbGEgdG9tYSBkZSBkZWNpc2lvbmVzIGVuIGVsIMOhbWJpdG8gZGUgbGEgZ2VzdGnDs24gaG9zcGl0YWxhcmlhLg0KDQpMb3MgcmVzdWx0YWRvcyBtdWVzdHJhbiBkZSBtYW5lcmEgY29uc2lzdGVudGUgcXVlIGxvcyB0aWVtcG9zIGRlbCBwcm9jZXNvIGFzaXN0ZW5jaWFsIChyZWdpc3RybywgdHJpYWdlLCBhdGVuY2nDs24gbcOpZGljYSB5IHRpZW1wbyB0b3RhbCBkZSBlc3BlcmEpIGVzdMOhbiBmdWVydGVtZW50ZSBjb3JyZWxhY2lvbmFkb3MsIGxvIHF1ZSBpbXBsaWNhIHF1ZSBsYXMgZGVtb3JhcyBlbiB1bmEgZXRhcGEgc2UgcHJvcGFnYW4geSBzZSBhY3VtdWxhbiBhIGxvIGxhcmdvIGRlIHRvZG8gZWwgZmx1am8gZGUgYXRlbmNpw7NuLiBFc3RhIHJlbGFjacOzbiBlc3RydWN0dXJhbCBzZSBjb25maXJtYSB0YW50byBlbiBsb3MgYW7DoWxpc2lzIGRlIGNvcnJlbGFjacOzbiB5IGNvdmFyaWFuemEgY29tbyBlbiBsb3MgZGlhZ3JhbWFzIGRlIGRpc3BlcnNpw7NuIHkgZW4gZWwgQW7DoWxpc2lzIGRlIENvbXBvbmVudGVzIFByaW5jaXBhbGVzIChBQ1ApLCBkb25kZSB1biDDum5pY28gY29tcG9uZW50ZSBwcmluY2lwYWwgZXhwbGljYSBtw6FzIGRlbCA5MyAlIGRlIGxhIHZhcmlhYmlsaWRhZCB0b3RhbC4gRW4gY29uc2VjdWVuY2lhLCBlbCBkZXNlbXBlw7FvIHRlbXBvcmFsIGRlbCBzZXJ2aWNpbyBwdWVkZSBpbnRlcnByZXRhcnNlIGRlIG1hbmVyYSBlZmVjdGl2YSBtZWRpYW50ZSB1biBmYWN0b3IgZ2xvYmFsIGRlIGR1cmFjacOzbiBkZWwgcHJvY2VzbywgbcOhcyBxdWUgY29tbyBwcm9ibGVtYXMgYWlzbGFkb3MgZW4gZXRhcGFzIGluZGl2aWR1YWxlcy4NCg0KQXNpbWlzbW8sIHNlIGV2aWRlbmNpYSBxdWUgbG9zIHJlY3Vyc29zIGVzdHJ1Y3R1cmFsZXMsIGNvbW8gZWwgbsO6bWVybyBkZSBlc3BlY2lhbGlzdGFzIGRpc3BvbmlibGVzIG8gZWwgdGFtYcOxbyBkZSBsYSBpbnN0YWxhY2nDs24gZW4gY2FtYXMsIHByZXNlbnRhbiB1bmEgaW5mbHVlbmNpYSBsaW1pdGFkYSBzb2JyZSBsYSByZWR1Y2Npw7NuIGRlIGxvcyB0aWVtcG9zIGRlIGF0ZW5jacOzbiBjdWFuZG8gc2UgY29uc2lkZXJhbiBkZSBtYW5lcmEgYWlzbGFkYS4gRW4gY29udHJhc3RlLCBsYSByZWxhY2nDs24gZW5mZXJtZXJh4oCTcGFjaWVudGUgbXVlc3RyYSBhc29jaWFjaW9uZXMgbcOhcyBjbGFyYXMgY29uIGxvcyB0aWVtcG9zIGRlbCBwcm9jZXNvLCBsbyBxdWUgc3VnaWVyZSBxdWUgbGEgY2FyZ2EgYXNpc3RlbmNpYWwgZGVsIHBlcnNvbmFsIGRlIGVuZmVybWVyw61hIGRlc2VtcGXDsWEgdW4gcGFwZWwgY2xhdmUgZW4gbGEgZWZpY2llbmNpYSBvcGVyYXRpdmEgZGVsIHNlcnZpY2lvLiBFc3RvcyBoYWxsYXpnb3MgaW5kaWNhbiBxdWUgbGEgbWVqb3JhIGRlbCBkZXNlbXBlw7FvIG5vIGRlcGVuZGUgw7puaWNhbWVudGUgZGUgYXVtZW50YXIgcmVjdXJzb3MsIHNpbm8gZGUgb3B0aW1pemFyIGxhIGdlc3Rpw7NuIHkgb3JnYW5pemFjacOzbiBkZSBsb3MgcHJvY2Vzb3MgaW50ZXJub3MuDQoNCkVsIG5pdmVsIGRlIHVyZ2VuY2lhIGRlbCBwYWNpZW50ZSBlbWVyZ2UgY29tbyB1biBkZXRlcm1pbmFudGUgY2VudHJhbCBkZWwgcmVzdWx0YWRvIGRlIGxhIGF0ZW5jacOzbi4gTGFzIHBydWViYXMgZGUgaGlww7N0ZXNpcyB5IGxvcyBhbsOhbGlzaXMgZGUgY29udGluZ2VuY2lhIGNvbmZpcm1hbiB1bmEgYXNvY2lhY2nDs24gZXN0YWTDrXN0aWNhbWVudGUgc2lnbmlmaWNhdGl2YSBlbnRyZSBsYSBwcmlvcmlkYWQgY2zDrW5pY2EgeSBlbCBkZXNlbmxhY2UgZGVsIHBhY2llbnRlLiBMb3MgY2Fzb3MgY3LDrXRpY29zIHkgZGUgYWx0YSB1cmdlbmNpYSBzb24gYXRlbmRpZG9zIGRlIG1hbmVyYSBwcmlvcml0YXJpYSwgc2luIHJlZ2lzdHJvcyBkZSBhYmFuZG9ubywgbG8gcXVlIHJlZmxlamEgdW4gZnVuY2lvbmFtaWVudG8gYWRlY3VhZG8gZGVsIHNpc3RlbWEgZGUgdHJpYWdlLiBFbiBjb250cmFzdGUsIGxvcyBwYWNpZW50ZXMgZGUgdXJnZW5jaWEgYmFqYSBjb25jZW50cmFuIGRlIGZvcm1hIGRlc3Byb3BvcmNpb25hZGEgZWwgZmVuw7NtZW5vIGRlIGFiYW5kb25vIHNpbiBzZXIgYXRlbmRpZG9zLCBlc3BlY2lhbG1lbnRlIGVuIHBlcmlvZG9zIGRlIGFsdGEgZGVtYW5kYSwgbG8gcXVlIHNlw7FhbGEgdW4gcHJvYmxlbWEgZXN0cnVjdHVyYWwgZW4gbGEgZ2VzdGnDs24gZGUgZXN0b3MgY2Fzb3MuDQoNCkRlc2RlIGxhIHBlcnNwZWN0aXZhIHRlbXBvcmFsLCBzZSBpZGVudGlmaWNhIHF1ZSBsYSBmcmFuamEgdGFyZGXigJNub2NoZSBjb25jZW50cmEgZWwgbWF5b3Igdm9sdW1lbiBkZSBhdGVuY2lvbmVzIGVuIHRvZG9zIGxvcyBuaXZlbGVzIGRlIHVyZ2VuY2lhLCBtaWVudHJhcyBxdWUgZWwgZMOtYSBkZSBsYSBzZW1hbmEgdGFtYmnDqW4gaW5mbHV5ZSBlbiBsb3MgcmVzdWx0YWRvcyBkZWwgcGFjaWVudGUsIGNvbiB2YXJpYWNpb25lcyBzaWduaWZpY2F0aXZhcyBlbiBsb3MgcGF0cm9uZXMgZGUgZWdyZXNvLCBhZG1pc2nDs24geSBhYmFuZG9uby4gRXN0b3MgaGFsbGF6Z29zIHN1Z2llcmVuIGxhIG5lY2VzaWRhZCBkZSB1bmEgcGxhbmlmaWNhY2nDs24gZGlmZXJlbmNpYWRhIGRlIHJlY3Vyc29zIHkgdHVybm9zLCBhanVzdGFkYSBhIGxvcyBwaWNvcyBkZSBkZW1hbmRhLCBtw6FzIHF1ZSBhIGxhIGdyYXZlZGFkIGRlIGxvcyBjYXNvcy4NCg0KRW4gY3VhbnRvIGEgbGEgZXhwZXJpZW5jaWEgZGVsIHVzdWFyaW8sIGxvcyBhbsOhbGlzaXMgZGUgc2F0aXNmYWNjacOzbiByZXZlbGFuIHVuYSBwb2xhcml6YWNpw7NuIGNsYXJhIGVuIGxhIHBlcmNlcGNpw7NuIGRlbCBzZXJ2aWNpbywgY29uIHVuYSBwcm9wb3JjacOzbiBjb25zaWRlcmFibGUgZGUgcGFjaWVudGVzIG11eSBpbnNhdGlzZmVjaG9zIHkgdW4gZ3J1cG8gc2lnbmlmaWNhdGl2byBkZSBzYXRpc2ZlY2hvcywgcGVybyBjb24gYmFqYSBwcmVzZW5jaWEgZGUgZXZhbHVhY2lvbmVzIGFsdGFtZW50ZSBwb3NpdGl2YXMuIExhIHNhdGlzZmFjY2nDs24gZGVsIHBhY2llbnRlIHNlIHJlbGFjaW9uYSBkZSBtYW5lcmEgbmVnYXRpdmEgeSBmdWVydGUgY29uIGxvcyB0aWVtcG9zIGRlIGVzcGVyYSwgY29uZmlybWFuZG8gcXVlIGxhIG9wb3J0dW5pZGFkIGVuIGxhIGF0ZW5jacOzbiBlcyB1biBmYWN0b3IgZGV0ZXJtaW5hbnRlIGRlIGxhIGNhbGlkYWQgcGVyY2liaWRhLiBMb3MgYW7DoWxpc2lzIGRlIGRpc2ltaWxhcmlkYWQgeSBhZ3J1cGFtaWVudG8gcmVmdWVyemFuIGVzdGEgY29uY2x1c2nDs24sIG1vc3RyYW5kbyBxdWUgbGFzIHBlcmNlcGNpb25lcyBzZSBvcmdhbml6YW4gZW4gZG9zIGdyYW5kZXMgcGVyZmlsZXM6IHVubyBwcmVkb21pbmFudGVtZW50ZSBpbnNhdGlzZmVjaG8geSBvdHJvIG5ldXRyYWzigJNzYXRpc2ZlY2hvLg0KDQpFbiBzw61udGVzaXMsIGVsIGVzdHVkaW8gZGVtdWVzdHJhIHF1ZSBlbCBwcmluY2lwYWwgZGVzYWbDrW8gZGVsIHNlcnZpY2lvIGRlIHVyZ2VuY2lhcyBubyByYWRpY2EgZW4gbGEgZ3JhdmVkYWQgZGUgbG9zIGNhc29zIGNyw610aWNvcywgc2lubyBlbiBsYSBnZXN0acOzbiBkZSBsb3MgcGFjaWVudGVzIGRlIHVyZ2VuY2lhIGJhamEgeSBtZWRpYSwgZXNwZWNpYWxtZW50ZSBlbiBjb250ZXh0b3MgZGUgYWx0YSBkZW1hbmRhLiBMYSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhIHkgZ3LDoWZpY2EgcmVzcGFsZGEgbGEgbmVjZXNpZGFkIGRlIGltcGxlbWVudGFyIGVzdHJhdGVnaWFzIG9yaWVudGFkYXMgYSBsYSByZWR1Y2Npw7NuIGRlIGxvcyB0aWVtcG9zIGRlIGVzcGVyYSwgbGEgb3B0aW1pemFjacOzbiBkZWwgZmx1am8gYXNpc3RlbmNpYWwgeSBlbCBmb3J0YWxlY2ltaWVudG8gZGUgbG9zIHByb2Nlc29zIGRlIHJlZ2lzdHJvIHkgdHJpYWdlLCBzaW4gY29tcHJvbWV0ZXIgbGEgYXRlbmNpw7NuIHByaW9yaXRhcmlhIGRlIGxvcyBjYXNvcyBncmF2ZXMuIEVzdGFzIGFjY2lvbmVzIHBlcm1pdGlyw61hbiBubyBzb2xvIG1lam9yYXIgbGEgZWZpY2llbmNpYSBvcGVyYXRpdmEgZGVsIHNlcnZpY2lvLCBzaW5vIHRhbWJpw6luIGVsZXZhciBkZSBtYW5lcmEgc29zdGVuaWJsZSBsYSBzYXRpc2ZhY2Npw7NuIGRlbCBwYWNpZW50ZSB5IGxhIGNhbGlkYWQgcGVyY2liaWRhIGRlIGxhIGF0ZW5jacOzbiBlbiB1cmdlbmNpYXMuDQoNCg0KIyMgKio3LiBCaWJsaW9ncmFmw61hKioNCg0KDQoNCiANCg0KDQoNCg==