Integrantes:
Maribel Barría
Ennis Delgado
Linda Yángüez
Introducción
Este documento presenta los cinco procedimientos estadísticos
asignados al Grupo 3 en una base de datos toxinológica
simulada. El objetivo es mostrar, de forma breve y reproducible, la
pregunta de investigación, las variables, las hipótesis, la selección de
la prueba, los supuestos, los resultados principales, la interpretación
estadística, la interpretación toxinológica y la conclusión de cada
análisis.
Importante: la base de datos es simulada. Por lo
tanto, todas las interpretaciones se presentan únicamente con fines
académicos y no deben considerarse evidencia clínica o epidemiológica
real.
Análisis
incluidos
- Mann–Whitney–Wilcoxon
- Kruskal–Wallis
- Kaplan–Meier
- Log-Rank
- Modelo de riesgos proporcionales de Cox
1.
Mann–Whitney–Wilcoxon
video 1 https://youtu.be/Sbs79_mnXPM
Pregunta de
investigación
¿Los días de hospitalización difieren entre pacientes que
presentaron eventos adversos y quienes no los presentaron?
Variables
- Respuesta:
Hospitalizacion_dias —
cuantitativa discreta, escala de razón.
- Explicativa:
Evento_Adverso —
cualitativa nominal binaria.
Hipótesis
H₀: las distribuciones de los días de
hospitalización son iguales entre ambos grupos.
H₁: las distribuciones de los días de hospitalización
difieren entre ambos grupos.
¿Por qué se eligió
esta prueba?
Se utilizó Mann–Whitney–Wilcoxon porque se comparan dos
grupos independientes y la variable de hospitalización presenta
asimetría y valores extremos. Al ser una prueba no paramétrica, no
requiere asumir normalidad.
Supuestos
principales
- Observaciones independientes.
- Variable respuesta al menos ordinal/cuantitativa.
- Dos grupos independientes.
- No se requiere normalidad ni homogeneidad de varianzas.
Estadística
descriptiva
tabla_mw <- Toxinologia_Panama %>%
group_by(Evento_Adverso) %>%
summarise(
n = n(),
Mediana = median(Hospitalizacion_dias, na.rm = TRUE),
Q1 = quantile(Hospitalizacion_dias, 0.25, na.rm = TRUE),
Q3 = quantile(Hospitalizacion_dias, 0.75, na.rm = TRUE),
RIQ = IQR(Hospitalizacion_dias, na.rm = TRUE),
.groups = "drop"
)
knitr::kable(tabla_mw, digits = 2,
caption = "Días de hospitalización según evento adverso")
Días de hospitalización según evento adverso
| No |
405861 |
2 |
1 |
4 |
3 |
| Sí |
94139 |
4 |
2 |
7 |
5 |
Gráfico
ggplot(
Toxinologia_Panama,
aes(x = Evento_Adverso, y = Hospitalizacion_dias, fill = Evento_Adverso)
) +
geom_boxplot(alpha = 0.75, outlier.alpha = 0.25) +
labs(
title = "Días de hospitalización según evento adverso",
x = "Evento adverso",
y = "Hospitalización (días)"
) +
theme_minimal(base_size = 13) +
theme(legend.position = "none")

Ejecución en R y
resultado
prueba_mw <- wilcox.test(
Hospitalizacion_dias ~ Evento_Adverso,
data = Toxinologia_Panama,
exact = FALSE
)
data.frame(
Estadistico_W = unname(prueba_mw$statistic),
p_valor = prueba_mw$p.value
) |>
knitr::kable(digits = 4, caption = "Resultado de Mann–Whitney–Wilcoxon")
Resultado de Mann–Whitney–Wilcoxon
| 11674537918 |
0 |
Interpretación estadística. El valor p obtenido es
< 2.2e-16.
Se rechaza H₀: existe evidencia estadísticamente significativa de
diferencias entre los grupos.
Interpretación
toxinológica
Descriptivamente, los pacientes con evento adverso presentan una
estancia hospitalaria mayor que quienes no presentan el evento. En el
escenario simulado, esto sugiere una asociación entre la presencia de
eventos adversos y una evolución clínica que requiere más tiempo de
hospitalización.
Conclusión
Los días de hospitalización sí difieren entre los
grupos cuando la prueba resulta significativa. La comparación
debe interpretarse como una asociación, no como
demostración de causalidad.
2. Kruskal–Wallis
video 2 https://youtu.be/Mu9DuoVwYDY?si=6tLeX9pc3kri77-A
Pregunta de
investigación
¿Existen diferencias en los niveles del biomarcador
toxinológico según el agente toxinológico involucrado?
Variables
- Respuesta:
Biomarcador_UL —
cuantitativa continua.
- Explicativa:
Agente — cualitativa
nominal con seis grupos.
Hipótesis
H₀: la distribución del biomarcador es igual entre
todos los agentes.
H₁: al menos uno de los agentes presenta una
distribución diferente.
¿Por qué se eligió
esta prueba?
Kruskal–Wallis permite comparar una variable cuantitativa entre
más de dos grupos independientes sin exigir
normalidad.
Supuestos
principales
- Observaciones independientes.
- Variable respuesta al menos ordinal.
- Grupos mutuamente independientes.
- La interpretación como comparación de localización es más directa
cuando las distribuciones presentan formas semejantes.
Estadística
descriptiva
estadisticas_agente <- Toxinologia_Panama %>%
group_by(Agente) %>%
summarise(
n = n(),
Mediana = median(Biomarcador_UL, na.rm = TRUE),
Q1 = quantile(Biomarcador_UL, 0.25, na.rm = TRUE),
Q3 = quantile(Biomarcador_UL, 0.75, na.rm = TRUE),
RIQ = IQR(Biomarcador_UL, na.rm = TRUE),
.groups = "drop"
) %>%
arrange(desc(Mediana))
knitr::kable(
estadisticas_agente,
digits = 2,
caption = "Biomarcador según agente toxinológico"
)
Biomarcador según agente toxinológico
| Bothrops asper |
169809 |
78.96 |
64.37 |
94.82 |
30.45 |
| Crotalus simus |
34947 |
77.11 |
62.55 |
92.85 |
30.30 |
| Micrurus spp. |
39780 |
72.98 |
58.51 |
88.78 |
30.27 |
| Escorpión |
100172 |
71.06 |
56.46 |
86.97 |
30.51 |
| Animal marino |
55254 |
69.02 |
54.36 |
85.11 |
30.75 |
| Hymenoptera |
100038 |
66.90 |
52.43 |
82.79 |
30.36 |
Gráfico
ggplot(Toxinologia_Panama, aes(x = Agente, y = Biomarcador_UL)) +
geom_boxplot() +
labs(
title = "Niveles del biomarcador según agente toxinológico",
x = "Agente toxinológico",
y = "Biomarcador (UL)"
) +
theme_minimal(base_size = 13) +
theme(axis.text.x = element_text(angle = 35, hjust = 1))

Prueba global
prueba_kw <- kruskal.test(
Biomarcador_UL ~ Agente,
data = Toxinologia_Panama
)
data.frame(
H = unname(prueba_kw$statistic),
gl = unname(prueba_kw$parameter),
p_valor = prueba_kw$p.value
) |>
knitr::kable(digits = 4, caption = "Resultado de Kruskal–Wallis")
Resultado de Kruskal–Wallis
| 20612.6 |
5 |
0 |
Comparaciones post
hoc
if (!requireNamespace("FSA", quietly = TRUE)) {
stop("Instala el paquete FSA con install.packages('FSA') antes de tejer el documento.")
}
posthoc_dunn <- FSA::dunnTest(
Biomarcador_UL ~ Agente,
data = Toxinologia_Panama,
method = "holm"
)
posthoc_dunn$res |>
knitr::kable(
digits = 4,
caption = "Comparaciones post hoc de Dunn con ajuste de Holm"
)
Comparaciones post hoc de Dunn con ajuste de Holm
| Animal marino - Bothrops asper |
-85.4369 |
0 |
0 |
| Animal marino - Crotalus simus |
-49.6226 |
0 |
0 |
| Bothrops asper - Crotalus simus |
13.4980 |
0 |
0 |
| Animal marino - Escorpión |
-15.4558 |
0 |
0 |
| Bothrops asper - Escorpión |
84.4739 |
0 |
0 |
| Crotalus simus - Escorpión |
41.4075 |
0 |
0 |
| Animal marino - Hymenoptera |
17.0495 |
0 |
0 |
| Bothrops asper - Hymenoptera |
127.6618 |
0 |
0 |
| Crotalus simus - Hymenoptera |
69.1246 |
0 |
0 |
| Escorpión - Hymenoptera |
38.5415 |
0 |
0 |
| Animal marino - Micrurus spp. |
-24.9726 |
0 |
0 |
| Bothrops asper - Micrurus spp. |
45.6422 |
0 |
0 |
| Crotalus simus - Micrurus spp. |
23.8622 |
0 |
0 |
| Escorpión - Micrurus spp. |
-13.8877 |
0 |
0 |
| Hymenoptera - Micrurus spp. |
-42.9486 |
0 |
0 |
Interpretación estadística. Kruskal–Wallis produjo H
= 2.0612601^{4}, gl = 5 y p = < 2.2e-16.
Se rechaza H₀: existen diferencias estadísticamente significativas entre
los agentes. Las comparaciones de Dunn permiten identificar entre qué
pares se encuentran esas diferencias.
Interpretación
toxinológica
En la base simulada, el comportamiento del biomarcador varía según el
agente toxinológico. Las medianas y las comparaciones post hoc permiten
describir qué agentes presentan niveles relativamente mayores o menores,
sin atribuir causalidad.
Conclusión
La prueba global determina si existen diferencias entre agentes y,
cuando es significativa, el post hoc de Dunn con ajuste de Holm
identifica los pares que difieren.
3. Kaplan–Meier
video 3 https://youtu.be/q6o_cmBQ8Jo
Pregunta de
investigación
¿Cómo cambia la probabilidad de permanecer sin presentar el
evento durante el seguimiento según la severidad clínica del caso
toxinológico?
Variables
- Tiempo:
Tiempo_Supervivencia_dias —
cuantitativa, escala de razón.
- Estado:
Estado_Evento — binaria; 0 =
censura y 1 = evento.
- Agrupación:
Severidad — cualitativa
ordinal.
Propósito del
análisis
Kaplan–Meier es principalmente descriptivo: estima
la función de supervivencia a lo largo del tiempo considerando la
censura. La comparación formal entre curvas se realiza posteriormente
con Log-Rank.
Conceptos que deben
explicarse
- Tiempo al evento: período observado hasta el evento
o la censura.
- Censura: el evento no se observó durante el período
de seguimiento disponible.
- Individuos en riesgo: pacientes que continúan en
seguimiento y aún pueden presentar el evento.
- Función de supervivencia S(t): probabilidad
estimada de permanecer sin el evento más allá del tiempo \(t\).
Estadística
descriptiva
tabla_km <- Toxinologia_Panama %>%
group_by(Severidad) %>%
summarise(
n = n(),
Eventos = sum(Estado_Evento == 1, na.rm = TRUE),
Censurados = sum(Estado_Evento == 0, na.rm = TRUE),
Porcentaje_eventos = round(100 * Eventos / n, 2),
.groups = "drop"
)
knitr::kable(
tabla_km,
caption = "Eventos y censuras según severidad"
)
Eventos y censuras según severidad
| Leve |
164378 |
3964 |
160414 |
2.41 |
| Moderada |
184473 |
7147 |
177326 |
3.87 |
| Severa |
106469 |
7072 |
99397 |
6.64 |
| Crítica |
44680 |
6953 |
37727 |
15.56 |
Supuestos
principales
- Tiempo de seguimiento correctamente definido.
- Evento correctamente identificado.
- Observaciones independientes.
- Censura no informativa.
Estimación
Kaplan–Meier
modelo_km <- survfit(
Surv(Tiempo_Supervivencia_dias, Estado_Evento) ~ Severidad,
data = Toxinologia_Panama
)
modelo_km
## Call: survfit(formula = Surv(Tiempo_Supervivencia_dias, Estado_Evento) ~
## Severidad, data = Toxinologia_Panama)
##
## n events median 0.95LCL 0.95UCL
## Severidad=Leve 164378 3964 NA NA NA
## Severidad=Moderada 184473 7147 NA NA NA
## Severidad=Severa 106469 7072 NA NA NA
## Severidad=Crítica 44680 6953 NA NA NA
Curvas de
supervivencia y pacientes en riesgo
ggsurvplot(
modelo_km,
data = Toxinologia_Panama,
censor = TRUE,
conf.int = FALSE,
risk.table = TRUE,
risk.table.height = 0.30,
risk.table.title = "Pacientes en riesgo",
title = "Curvas de Kaplan–Meier según severidad",
xlab = "Tiempo de seguimiento (días)",
ylab = "Probabilidad de permanecer sin el evento",
legend.title = "Severidad",
ggtheme = theme_minimal(base_size = 12)
)

Cómo leer la gráfica: una curva más alta representa
una mayor probabilidad estimada de permanecer sin el evento. Cada
descenso refleja la ocurrencia de eventos y las marcas de censura
representan pacientes cuyo evento no fue observado durante el
seguimiento.
Interpretación
estadística
Las curvas permiten comparar visualmente el patrón de supervivencia
entre niveles de severidad. La mediana de supervivencia solo puede
reportarse si alguna curva alcanza una probabilidad de 0.50 durante el
seguimiento.
Interpretación
toxinológica
En el escenario simulado, una curva más baja indica un patrón menos
favorable de permanencia sin evento. La lectura debe centrarse en la
separación y el descenso de las curvas, sin inferir todavía
significancia estadística entre ellas.
Conclusión
Kaplan–Meier describe cómo cambia la probabilidad de
permanecer sin el evento a lo largo del tiempo y permite
visualizar el efecto de la censura y el número de pacientes en
riesgo.
4. Log-Rank
video 4 https://www.youtube.com/watch?v=i2cypwpmJew
Pregunta de
investigación
¿Existen diferencias entre las curvas de supervivencia de los
pacientes que reciben diferentes tratamientos?
Variables
- Tiempo:
Tiempo_Supervivencia_dias.
- Evento:
Estado_Evento.
- Grupo:
Tratamiento.
Hipótesis
H₀: las funciones de supervivencia son iguales entre
todos los tratamientos.
H₁: al menos una función de supervivencia difiere de
las demás.
¿Por qué se eligió
esta prueba?
Log-Rank compara formalmente curvas de supervivencia de grupos
independientes y utiliza adecuadamente la información de observaciones
censuradas.
Supuestos
principales
- Observaciones independientes.
- Tiempo y evento bien definidos.
- Censura no informativa.
- Grupos independientes.
- La prueba es especialmente interpretable cuando las diferencias
entre curvas son relativamente consistentes durante el seguimiento.
Estadística
descriptiva
tabla_logrank <- Toxinologia_Panama %>%
group_by(Tratamiento) %>%
summarise(
n = n(),
Eventos = sum(Estado_Evento == 1, na.rm = TRUE),
Censurados = sum(Estado_Evento == 0, na.rm = TRUE),
Porcentaje_eventos = round(100 * Eventos / n, 2),
.groups = "drop"
)
knitr::kable(
tabla_logrank,
caption = "Eventos y censuras según tratamiento"
)
Eventos y censuras según tratamiento
| Antiveneno tardío |
124823 |
7457 |
117366 |
5.97 |
| Antiveneno temprano |
225579 |
8641 |
216938 |
3.83 |
| Soporte |
149598 |
9038 |
140560 |
6.04 |
Kaplan–Meier por
tratamiento y prueba Log-Rank
supervivencia_logrank <- Surv(
Toxinologia_Panama$Tiempo_Supervivencia_dias,
Toxinologia_Panama$Estado_Evento
)
km_tratamiento <- survfit(
supervivencia_logrank ~ Tratamiento,
data = Toxinologia_Panama
)
logrank <- survdiff(
supervivencia_logrank ~ Tratamiento,
data = Toxinologia_Panama
)
gl_logrank <- length(logrank$n) - 1
p_logrank <- pchisq(
logrank$chisq,
df = gl_logrank,
lower.tail = FALSE
)
data.frame(
Chi_cuadrado = logrank$chisq,
gl = gl_logrank,
p_valor = p_logrank
) |>
knitr::kable(digits = 4, caption = "Resultado de la prueba Log-Rank")
Resultado de la prueba Log-Rank
| 1247.261 |
2 |
0 |
Gráfico
ggsurvplot(
km_tratamiento,
data = Toxinologia_Panama,
conf.int = TRUE,
censor = TRUE,
risk.table = TRUE,
risk.table.height = 0.28,
risk.table.title = "Número de pacientes en riesgo",
pval = TRUE,
pval.method = TRUE,
title = "Curvas de supervivencia según tratamiento",
xlab = "Tiempo de seguimiento (días)",
ylab = "Probabilidad de permanecer sin el evento",
legend.title = "Tratamiento",
legend = "top",
ggtheme = theme_classic()
)

Interpretación estadística. La prueba Log-Rank
produjo χ² = 1247.261, gl = 2 y p = < 2.2e-16.
Se rechaza H₀: existen diferencias globales estadísticamente
significativas entre las curvas de supervivencia de los
tratamientos.
Interpretación
toxinológica
Las curvas permiten observar cuál tratamiento mantiene una mayor o
menor probabilidad estimada de permanecer sin el evento. La prueba
Log-Rank indica si la diferencia global entre curvas es estadísticamente
significativa, pero no identifica por sí sola qué pares de
tratamientos difieren.
Conclusión
Log-Rank responde directamente si las curvas de supervivencia de los
tratamientos son iguales o diferentes durante el seguimiento.
5. Modelo de riesgos
proporcionales de Cox
video 5 https://youtu.be/_sOtLTSDMF4?si=GcwhYYVoOAwjQqMz
Pregunta de
investigación
¿Existe una asociación entre el tratamiento administrado y el
riesgo instantáneo de presentar el evento durante el seguimiento,
después de ajustar por edad, sexo, agente toxinológico, dosis, severidad
y biomarcador?
Variables
- Tiempo:
Tiempo_Supervivencia_dias.
- Evento:
Estado_Evento.
- Predictor principal:
Tratamiento.
- Covariables:
Edad, Sexo,
Agente, Dosis_mgkg, Severidad,
Biomarcador_UL.
Hipótesis
H₀: el tratamiento no se asocia con el hazard del
evento después del ajuste por las covariables.
H₁: el tratamiento se asocia con el hazard del evento
después del ajuste.
¿Por qué se eligió
este modelo?
El modelo de Cox permite estudiar simultáneamente el tiempo
hasta el evento, la censura y múltiples
variables explicativas. Su medida principal es el Hazard Ratio
(HR).
Cómo interpretar un HR: HR = 1 indica ausencia de
diferencia en el hazard respecto a la categoría de referencia; HR > 1
indica mayor hazard; HR < 1 indica menor hazard, manteniendo
constantes las demás variables del modelo.
Supuestos
principales
- Tiempo y evento correctamente definidos.
- Observaciones independientes.
- Censura no informativa.
- Riesgos proporcionales.
- Relación adecuada entre covariables continuas y el log-hazard.
- Ausencia de multicolinealidad importante.
Preparación del
modelo
# Se deja Severidad como factor no ordenado para obtener HR
# de categorías frente a una referencia clara.
Toxinologia_Panama$Severidad <- factor(
Toxinologia_Panama$Severidad,
levels = c("Leve", "Moderada", "Severa", "Crítica"),
ordered = FALSE
)
Toxinologia_Panama$Severidad <- relevel(
Toxinologia_Panama$Severidad,
ref = "Leve"
)
Modelo ajustado
modelo_cox_ajustado <- coxph(
Surv(Tiempo_Supervivencia_dias, Estado_Evento) ~
Tratamiento +
Edad +
Sexo +
Agente +
Dosis_mgkg +
Severidad +
Biomarcador_UL,
data = Toxinologia_Panama
)
summary(modelo_cox_ajustado)
## Call:
## coxph(formula = Surv(Tiempo_Supervivencia_dias, Estado_Evento) ~
## Tratamiento + Edad + Sexo + Agente + Dosis_mgkg + Severidad +
## Biomarcador_UL, data = Toxinologia_Panama)
##
## n= 500000, number of events= 25136
##
## coef exp(coef) se(coef) z
## TratamientoAntiveneno temprano -0.4675243 0.6265515 0.0162550 -28.762
## TratamientoSoporte 0.0194581 1.0196487 0.0158517 1.228
## Edad 0.0077568 1.0077870 0.0003610 21.485
## SexoMasculino -0.0067848 0.9932381 0.0126779 -0.535
## AgenteBothrops asper -0.0011165 0.9988841 0.0222177 -0.050
## AgenteCrotalus simus 0.0029874 1.0029918 0.0307480 0.097
## AgenteEscorpión 0.0088366 1.0088758 0.0235900 0.375
## AgenteHymenoptera -0.0098862 0.9901625 0.0236821 -0.417
## AgenteMicrurus spp. 0.0091619 1.0092040 0.0292362 0.313
## Dosis_mgkg 0.1792348 1.1963016 0.0040977 43.740
## SeveridadModerada 0.2404427 1.2718121 0.0202068 11.899
## SeveridadSevera 0.4859017 1.6256403 0.0218858 22.202
## SeveridadCrítica 0.8454649 2.3290604 0.0276724 30.553
## Biomarcador_UL 0.0001738 1.0001738 0.0004203 0.413
## Pr(>|z|)
## TratamientoAntiveneno temprano <2e-16 ***
## TratamientoSoporte 0.220
## Edad <2e-16 ***
## SexoMasculino 0.593
## AgenteBothrops asper 0.960
## AgenteCrotalus simus 0.923
## AgenteEscorpión 0.708
## AgenteHymenoptera 0.676
## AgenteMicrurus spp. 0.754
## Dosis_mgkg <2e-16 ***
## SeveridadModerada <2e-16 ***
## SeveridadSevera <2e-16 ***
## SeveridadCrítica <2e-16 ***
## Biomarcador_UL 0.679
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## exp(coef) exp(-coef) lower .95 upper .95
## TratamientoAntiveneno temprano 0.6266 1.5960 0.6069 0.6468
## TratamientoSoporte 1.0196 0.9807 0.9885 1.0518
## Edad 1.0078 0.9923 1.0071 1.0085
## SexoMasculino 0.9932 1.0068 0.9689 1.0182
## AgenteBothrops asper 0.9989 1.0011 0.9563 1.0433
## AgenteCrotalus simus 1.0030 0.9970 0.9443 1.0653
## AgenteEscorpión 1.0089 0.9912 0.9633 1.0566
## AgenteHymenoptera 0.9902 1.0099 0.9453 1.0372
## AgenteMicrurus spp. 1.0092 0.9909 0.9530 1.0687
## Dosis_mgkg 1.1963 0.8359 1.1867 1.2059
## SeveridadModerada 1.2718 0.7863 1.2224 1.3232
## SeveridadSevera 1.6256 0.6151 1.5574 1.6969
## SeveridadCrítica 2.3291 0.4294 2.2061 2.4589
## Biomarcador_UL 1.0002 0.9998 0.9994 1.0010
##
## Concordance= 0.705 (se = 0.002 )
## Likelihood ratio test= 16327 on 14 df, p=<2e-16
## Wald test = 19027 on 14 df, p=<2e-16
## Score (logrank) test = 21798 on 14 df, p=<2e-16
Hazard Ratios e
intervalos de confianza
s_cox <- summary(modelo_cox_ajustado)
tabla_hr <- data.frame(
Variable = rownames(s_cox$coefficients),
HR = s_cox$coefficients[, "exp(coef)"],
IC95_inf = s_cox$conf.int[, "lower .95"],
IC95_sup = s_cox$conf.int[, "upper .95"],
p_valor = s_cox$coefficients[, "Pr(>|z|)"],
row.names = NULL
)
knitr::kable(
tabla_hr,
digits = 4,
caption = "Hazard Ratios ajustados del modelo de Cox"
)
Hazard Ratios ajustados del modelo de Cox
| TratamientoAntiveneno temprano |
0.6266 |
0.6069 |
0.6468 |
0.0000 |
| TratamientoSoporte |
1.0196 |
0.9885 |
1.0518 |
0.2196 |
| Edad |
1.0078 |
1.0071 |
1.0085 |
0.0000 |
| SexoMasculino |
0.9932 |
0.9689 |
1.0182 |
0.5925 |
| AgenteBothrops asper |
0.9989 |
0.9563 |
1.0433 |
0.9599 |
| AgenteCrotalus simus |
1.0030 |
0.9443 |
1.0653 |
0.9226 |
| AgenteEscorpión |
1.0089 |
0.9633 |
1.0566 |
0.7080 |
| AgenteHymenoptera |
0.9902 |
0.9453 |
1.0372 |
0.6763 |
| AgenteMicrurus spp. |
1.0092 |
0.9530 |
1.0687 |
0.7540 |
| Dosis_mgkg |
1.1963 |
1.1867 |
1.2059 |
0.0000 |
| SeveridadModerada |
1.2718 |
1.2224 |
1.3232 |
0.0000 |
| SeveridadSevera |
1.6256 |
1.5574 |
1.6969 |
0.0000 |
| SeveridadCrítica |
2.3291 |
2.2061 |
2.4589 |
0.0000 |
| Biomarcador_UL |
1.0002 |
0.9994 |
1.0010 |
0.6793 |
Efecto global del
tratamiento
modelo_sin_trat <- update(
modelo_cox_ajustado,
. ~ . - Tratamiento
)
comparacion_trat <- anova(
modelo_sin_trat,
modelo_cox_ajustado,
test = "LRT"
)
comparacion_trat
## Analysis of Deviance Table
## Cox model: response is Surv(Tiempo_Supervivencia_dias, Estado_Evento)
## Model 1: ~ Edad + Sexo + Agente + Dosis_mgkg + Severidad + Biomarcador_UL
## Model 2: ~ Tratamiento + Edad + Sexo + Agente + Dosis_mgkg + Severidad + Biomarcador_UL
## loglik Chisq Df Pr(>|Chi|)
## 1 -310548
## 2 -309967 1161.7 2 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
El p-valor global del modelo no debe confundirse con
el efecto específico del tratamiento. Para evaluar el tratamiento como
conjunto se compara el modelo completo con otro modelo idéntico pero sin
Tratamiento.
Supuesto de riesgos
proporcionales
supuesto_PH <- cox.zph(modelo_cox_ajustado)
supuesto_PH
## chisq df p
## Tratamiento 1.139 2 0.57
## Edad 0.926 1 0.34
## Sexo 0.269 1 0.60
## Agente 2.860 5 0.72
## Dosis_mgkg 45.989 1 1.2e-11
## Severidad 21.628 3 7.8e-05
## Biomarcador_UL 37.490 1 9.2e-10
## GLOBAL 56.250 14 5.3e-07
Interpretación del supuesto: en
cox.zph, H₀ establece que el supuesto de riesgos
proporcionales se cumple. Un p > 0.05 indica que no hay evidencia
estadística de violación; un p < 0.05 indica evidencia de posible
incumplimiento. Debe revisarse tanto cada covariable como la fila
GLOBAL.
Gráfico de Hazard
Ratios
ggforest(
modelo_cox_ajustado,
data = Toxinologia_Panama,
main = "Hazard Ratios ajustados",
cpositions = c(0.02, 0.22, 0.40),
fontsize = 0.8
)

Interpretación
estadística
El modelo de Cox estima el cambio relativo en el hazard
instantáneo asociado con cada predictor, manteniendo constantes
las demás variables. Los HR deben interpretarse siempre respecto a su
categoría de referencia y junto con su intervalo de confianza del 95 % y
su valor p.
Cuando un intervalo de confianza del 95 % para un HR no
incluye 1, existe evidencia de asociación estadísticamente
significativa para ese contraste, siempre que los supuestos del modelo
sean razonables.
Interpretación
toxinológica
Dentro del escenario simulado, el modelo permite identificar qué
características se asocian con un mayor o menor hazard de presentar el
evento durante el seguimiento, después de considerar simultáneamente las
demás covariables.
Debe utilizarse lenguaje de asociación y no de
causalidad: por ejemplo, “se asocia con un menor hazard” en lugar de
“protege” o “evita” el evento.
Conclusión
El modelo de Cox complementa a Kaplan–Meier y Log-Rank porque no solo
compara grupos, sino que permite cuantificar asociaciones
ajustadas mediante Hazard Ratios y evaluar múltiples
covariables al mismo tiempo. La conclusión final debe considerar tanto
los HR e intervalos de confianza como la verificación del supuesto de
riesgos proporcionales.
Conclusión general
Las cinco pruebas responden a preguntas diferentes y
complementarias:
- Mann–Whitney–Wilcoxon compara dos grupos
independientes.
- Kruskal–Wallis compara más de dos grupos
independientes y puede complementarse con Dunn.
- Kaplan–Meier describe la probabilidad de permanecer
sin el evento a lo largo del tiempo.
- Log-Rank contrasta formalmente si varias curvas de
supervivencia difieren.
- Cox cuantifica la asociación entre predictores y el
hazard del evento mediante Hazard Ratios ajustados.
En conjunto, el documento muestra el flujo completo solicitado:
planteamiento de la pregunta, identificación de variables, hipótesis,
selección de la prueba, supuestos, ejecución en R, visualización,
interpretación estadística, interpretación toxinológica y
conclusión.
Para la exposición: no es necesario explicar el
código línea por línea. Utiliza el HTML como guía visual y céntrate en
la pregunta, por qué escogiste la prueba, qué muestra la gráfica, cuál
fue el resultado principal y qué significa dentro del escenario
toxinológico simulado.
LS0tDQp0aXRsZTogIkFuw6FsaXNpcyBCaW9lc3RhZMOtc3RpY28gQXBsaWNhZG8gYSBsYSBUb3hpbm9sb2fDrWEiDQphdXRob3I6ICJHcnVwbyAzIg0KZGF0ZTogIjIwMjYtMDgtMzEiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiBmYWxzZQ0KICAgICAgc21vb3RoX3Njcm9sbDogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICB0aGVtZTogZmxhdGx5DQogICAgaGlnaGxpZ2h0OiB0YW5nbw0KLS0tDQojIyBJbnRlZ3JhbnRlczoNCg0KTWFyaWJlbCBCYXJyw61hICANCkVubmlzIERlbGdhZG8gIA0KTGluZGEgWcOhbmfDvGV6DQoNCjxzdHlsZT4NCmJvZHkgew0KICBmb250LXNpemU6IDE2cHg7DQogIGxpbmUtaGVpZ2h0OiAxLjY1Ow0KfQ0KaDEsIGgyLCBoMyB7DQogIGZvbnQtd2VpZ2h0OiA3MDA7DQp9DQpoMSB7DQogIGJvcmRlci1ib3R0b206IDNweCBzb2xpZCAjMmMzZTUwOw0KICBwYWRkaW5nLWJvdHRvbTogOHB4Ow0KICBtYXJnaW4tdG9wOiA0MnB4Ow0KfQ0KaDIgew0KICBtYXJnaW4tdG9wOiAzMHB4Ow0KfQ0KYmxvY2txdW90ZSB7DQogIGJvcmRlci1sZWZ0OiA1cHggc29saWQgIzJjM2U1MDsNCiAgYmFja2dyb3VuZDogI2Y3ZjlmYjsNCiAgcGFkZGluZzogMTJweCAxOHB4Ow0KICBib3JkZXItcmFkaXVzOiA2cHg7DQp9DQoubm90ZSB7DQogIGJhY2tncm91bmQ6ICNlZWY2ZmY7DQogIGJvcmRlci1sZWZ0OiA1cHggc29saWQgIzNiODJmNjsNCiAgcGFkZGluZzogMTRweCAxOHB4Ow0KICBib3JkZXItcmFkaXVzOiA4cHg7DQogIG1hcmdpbjogMThweCAwOw0KfQ0KLnJlc3VsdCB7DQogIGJhY2tncm91bmQ6ICNmMmZiZjU7DQogIGJvcmRlci1sZWZ0OiA1cHggc29saWQgIzJlOGI1NzsNCiAgcGFkZGluZzogMTRweCAxOHB4Ow0KICBib3JkZXItcmFkaXVzOiA4cHg7DQogIG1hcmdpbjogMThweCAwOw0KfQ0KLndhcm5pbmcgew0KICBiYWNrZ3JvdW5kOiAjZmZmOGU4Ow0KICBib3JkZXItbGVmdDogNXB4IHNvbGlkICNlNmE3MDA7DQogIHBhZGRpbmc6IDE0cHggMThweDsNCiAgYm9yZGVyLXJhZGl1czogOHB4Ow0KICBtYXJnaW46IDE4cHggMDsNCn0NCnRhYmxlIHsNCiAgd2lkdGg6IDEwMCU7DQp9DQo8L3N0eWxlPg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldCgNCiAgZWNobyA9IFRSVUUsDQogIG1lc3NhZ2UgPSBGQUxTRSwNCiAgd2FybmluZyA9IEZBTFNFLA0KICBmaWcuYWxpZ24gPSAiY2VudGVyIiwNCiAgb3V0LndpZHRoID0gIjkyJSINCikNCg0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoc3Vydml2YWwpDQpsaWJyYXJ5KHN1cnZtaW5lcikNCg0KIyBMYSBiYXNlIHNlIGdlbmVyYS9jYXJnYSBkZXNkZSBlbCBzY3JpcHQgb3JpZ2luYWwgZGUgbGEgYXNpZ25hY2nDs24uDQpzb3VyY2UoIkJBU0UgKDIpLlIiKQ0KYGBgDQoNCiMgSW50cm9kdWNjacOzbg0KDQpFc3RlIGRvY3VtZW50byBwcmVzZW50YSBsb3MgKipjaW5jbyBwcm9jZWRpbWllbnRvcyBlc3RhZMOtc3RpY29zIGFzaWduYWRvcyBhbCBHcnVwbyAzKiogZW4gdW5hIGJhc2UgZGUgZGF0b3MgdG94aW5vbMOzZ2ljYSBzaW11bGFkYS4gRWwgb2JqZXRpdm8gZXMgbW9zdHJhciwgZGUgZm9ybWEgYnJldmUgeSByZXByb2R1Y2libGUsIGxhIHByZWd1bnRhIGRlIGludmVzdGlnYWNpw7NuLCBsYXMgdmFyaWFibGVzLCBsYXMgaGlww7N0ZXNpcywgbGEgc2VsZWNjacOzbiBkZSBsYSBwcnVlYmEsIGxvcyBzdXB1ZXN0b3MsIGxvcyByZXN1bHRhZG9zIHByaW5jaXBhbGVzLCBsYSBpbnRlcnByZXRhY2nDs24gZXN0YWTDrXN0aWNhLCBsYSBpbnRlcnByZXRhY2nDs24gdG94aW5vbMOzZ2ljYSB5IGxhIGNvbmNsdXNpw7NuIGRlIGNhZGEgYW7DoWxpc2lzLg0KDQo8ZGl2IGNsYXNzPSJ3YXJuaW5nIj4NCioqSW1wb3J0YW50ZToqKiBsYSBiYXNlIGRlIGRhdG9zIGVzIHNpbXVsYWRhLiBQb3IgbG8gdGFudG8sIHRvZGFzIGxhcyBpbnRlcnByZXRhY2lvbmVzIHNlIHByZXNlbnRhbiDDum5pY2FtZW50ZSBjb24gZmluZXMgYWNhZMOpbWljb3MgeSBubyBkZWJlbiBjb25zaWRlcmFyc2UgZXZpZGVuY2lhIGNsw61uaWNhIG8gZXBpZGVtaW9sw7NnaWNhIHJlYWwuDQo8L2Rpdj4NCg0KIyMgQW7DoWxpc2lzIGluY2x1aWRvcw0KDQoxLiBNYW5u4oCTV2hpdG5leeKAk1dpbGNveG9uICANCjIuIEtydXNrYWzigJNXYWxsaXMgIA0KMy4gS2FwbGFu4oCTTWVpZXIgIA0KNC4gTG9nLVJhbmsgIA0KNS4gTW9kZWxvIGRlIHJpZXNnb3MgcHJvcG9yY2lvbmFsZXMgZGUgQ294ICANCg0KLS0tDQoNCiMgMS4gTWFubuKAk1doaXRuZXnigJNXaWxjb3hvbg0KDQp2aWRlbyAxIGh0dHBzOi8veW91dHUuYmUvU2JzNzlfbW5YUE0NCg0KIyMgUHJlZ3VudGEgZGUgaW52ZXN0aWdhY2nDs24NCg0KKirCv0xvcyBkw61hcyBkZSBob3NwaXRhbGl6YWNpw7NuIGRpZmllcmVuIGVudHJlIHBhY2llbnRlcyBxdWUgcHJlc2VudGFyb24gZXZlbnRvcyBhZHZlcnNvcyB5IHF1aWVuZXMgbm8gbG9zIHByZXNlbnRhcm9uPyoqDQoNCiMjIFZhcmlhYmxlcw0KDQotICoqUmVzcHVlc3RhOioqIGBIb3NwaXRhbGl6YWNpb25fZGlhc2Ag4oCUIGN1YW50aXRhdGl2YSBkaXNjcmV0YSwgZXNjYWxhIGRlIHJhesOzbi4NCi0gKipFeHBsaWNhdGl2YToqKiBgRXZlbnRvX0FkdmVyc29gIOKAlCBjdWFsaXRhdGl2YSBub21pbmFsIGJpbmFyaWEuDQoNCiMjIEhpcMOzdGVzaXMNCg0KKipI4oKAOioqIGxhcyBkaXN0cmlidWNpb25lcyBkZSBsb3MgZMOtYXMgZGUgaG9zcGl0YWxpemFjacOzbiBzb24gaWd1YWxlcyBlbnRyZSBhbWJvcyBncnVwb3MuICANCioqSOKCgToqKiBsYXMgZGlzdHJpYnVjaW9uZXMgZGUgbG9zIGTDrWFzIGRlIGhvc3BpdGFsaXphY2nDs24gZGlmaWVyZW4gZW50cmUgYW1ib3MgZ3J1cG9zLg0KDQojIyDCv1BvciBxdcOpIHNlIGVsaWdpw7MgZXN0YSBwcnVlYmE/DQoNClNlIHV0aWxpesOzIE1hbm7igJNXaGl0bmV54oCTV2lsY294b24gcG9ycXVlIHNlIGNvbXBhcmFuICoqZG9zIGdydXBvcyBpbmRlcGVuZGllbnRlcyoqIHkgbGEgdmFyaWFibGUgZGUgaG9zcGl0YWxpemFjacOzbiBwcmVzZW50YSBhc2ltZXRyw61hIHkgdmFsb3JlcyBleHRyZW1vcy4gQWwgc2VyIHVuYSBwcnVlYmEgbm8gcGFyYW3DqXRyaWNhLCBubyByZXF1aWVyZSBhc3VtaXIgbm9ybWFsaWRhZC4NCg0KIyMgU3VwdWVzdG9zIHByaW5jaXBhbGVzDQoNCi0gT2JzZXJ2YWNpb25lcyBpbmRlcGVuZGllbnRlcy4NCi0gVmFyaWFibGUgcmVzcHVlc3RhIGFsIG1lbm9zIG9yZGluYWwvY3VhbnRpdGF0aXZhLg0KLSBEb3MgZ3J1cG9zIGluZGVwZW5kaWVudGVzLg0KLSBObyBzZSByZXF1aWVyZSBub3JtYWxpZGFkIG5pIGhvbW9nZW5laWRhZCBkZSB2YXJpYW56YXMuDQoNCiMjIEVzdGFkw61zdGljYSBkZXNjcmlwdGl2YQ0KDQpgYGB7ciBtdy1kZXNjcmlwdGl2b3N9DQp0YWJsYV9tdyA8LSBUb3hpbm9sb2dpYV9QYW5hbWEgJT4lDQogIGdyb3VwX2J5KEV2ZW50b19BZHZlcnNvKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIG4gPSBuKCksDQogICAgTWVkaWFuYSA9IG1lZGlhbihIb3NwaXRhbGl6YWNpb25fZGlhcywgbmEucm0gPSBUUlVFKSwNCiAgICBRMSA9IHF1YW50aWxlKEhvc3BpdGFsaXphY2lvbl9kaWFzLCAwLjI1LCBuYS5ybSA9IFRSVUUpLA0KICAgIFEzID0gcXVhbnRpbGUoSG9zcGl0YWxpemFjaW9uX2RpYXMsIDAuNzUsIG5hLnJtID0gVFJVRSksDQogICAgUklRID0gSVFSKEhvc3BpdGFsaXphY2lvbl9kaWFzLCBuYS5ybSA9IFRSVUUpLA0KICAgIC5ncm91cHMgPSAiZHJvcCINCiAgKQ0KDQprbml0cjo6a2FibGUodGFibGFfbXcsIGRpZ2l0cyA9IDIsDQogICAgICAgICAgICAgY2FwdGlvbiA9ICJEw61hcyBkZSBob3NwaXRhbGl6YWNpw7NuIHNlZ8O6biBldmVudG8gYWR2ZXJzbyIpDQpgYGANCg0KIyMgR3LDoWZpY28NCg0KYGBge3IgbXctZ3JhZmljb30NCmdncGxvdCgNCiAgVG94aW5vbG9naWFfUGFuYW1hLA0KICBhZXMoeCA9IEV2ZW50b19BZHZlcnNvLCB5ID0gSG9zcGl0YWxpemFjaW9uX2RpYXMsIGZpbGwgPSBFdmVudG9fQWR2ZXJzbykNCikgKw0KICBnZW9tX2JveHBsb3QoYWxwaGEgPSAwLjc1LCBvdXRsaWVyLmFscGhhID0gMC4yNSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkTDrWFzIGRlIGhvc3BpdGFsaXphY2nDs24gc2Vnw7puIGV2ZW50byBhZHZlcnNvIiwNCiAgICB4ID0gIkV2ZW50byBhZHZlcnNvIiwNCiAgICB5ID0gIkhvc3BpdGFsaXphY2nDs24gKGTDrWFzKSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTMpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KYGBgDQoNCiMjIEVqZWN1Y2nDs24gZW4gUiB5IHJlc3VsdGFkbw0KDQpgYGB7ciBtdy1wcnVlYmF9DQpwcnVlYmFfbXcgPC0gd2lsY294LnRlc3QoDQogIEhvc3BpdGFsaXphY2lvbl9kaWFzIH4gRXZlbnRvX0FkdmVyc28sDQogIGRhdGEgPSBUb3hpbm9sb2dpYV9QYW5hbWEsDQogIGV4YWN0ID0gRkFMU0UNCikNCg0KZGF0YS5mcmFtZSgNCiAgRXN0YWRpc3RpY29fVyA9IHVubmFtZShwcnVlYmFfbXckc3RhdGlzdGljKSwNCiAgcF92YWxvciA9IHBydWViYV9tdyRwLnZhbHVlDQopIHw+DQogIGtuaXRyOjprYWJsZShkaWdpdHMgPSA0LCBjYXB0aW9uID0gIlJlc3VsdGFkbyBkZSBNYW5u4oCTV2hpdG5leeKAk1dpbGNveG9uIikNCmBgYA0KDQo8ZGl2IGNsYXNzPSJyZXN1bHQiPg0KKipJbnRlcnByZXRhY2nDs24gZXN0YWTDrXN0aWNhLioqIEVsIHZhbG9yIHAgb2J0ZW5pZG8gZXMgYHIgZm9ybWF0LnB2YWwocHJ1ZWJhX213JHAudmFsdWUsIGRpZ2l0cyA9IDQpYC4gIA0KYHIgaWYgKHBydWViYV9tdyRwLnZhbHVlIDwgMC4wNSkgIlNlIHJlY2hhemEgSOKCgDogZXhpc3RlIGV2aWRlbmNpYSBlc3RhZMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZhIGRlIGRpZmVyZW5jaWFzIGVudHJlIGxvcyBncnVwb3MuIiBlbHNlICJObyBzZSByZWNoYXphIEjigoA6IG5vIGV4aXN0ZSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhbWVudGUgc2lnbmlmaWNhdGl2YSBkZSBkaWZlcmVuY2lhcyBlbnRyZSBsb3MgZ3J1cG9zLiJgDQo8L2Rpdj4NCg0KIyMgSW50ZXJwcmV0YWNpw7NuIHRveGlub2zDs2dpY2ENCg0KRGVzY3JpcHRpdmFtZW50ZSwgbG9zIHBhY2llbnRlcyBjb24gZXZlbnRvIGFkdmVyc28gcHJlc2VudGFuIHVuYSBlc3RhbmNpYSBob3NwaXRhbGFyaWEgbWF5b3IgcXVlIHF1aWVuZXMgbm8gcHJlc2VudGFuIGVsIGV2ZW50by4gRW4gZWwgZXNjZW5hcmlvIHNpbXVsYWRvLCBlc3RvIHN1Z2llcmUgdW5hIGFzb2NpYWNpw7NuIGVudHJlIGxhIHByZXNlbmNpYSBkZSBldmVudG9zIGFkdmVyc29zIHkgdW5hIGV2b2x1Y2nDs24gY2zDrW5pY2EgcXVlIHJlcXVpZXJlIG3DoXMgdGllbXBvIGRlIGhvc3BpdGFsaXphY2nDs24uDQoNCiMjIENvbmNsdXNpw7NuDQoNCkxvcyBkw61hcyBkZSBob3NwaXRhbGl6YWNpw7NuICoqc8OtIGRpZmllcmVuIGVudHJlIGxvcyBncnVwb3MqKiBjdWFuZG8gbGEgcHJ1ZWJhIHJlc3VsdGEgc2lnbmlmaWNhdGl2YS4gTGEgY29tcGFyYWNpw7NuIGRlYmUgaW50ZXJwcmV0YXJzZSBjb21vIHVuYSAqKmFzb2NpYWNpw7NuKiosIG5vIGNvbW8gZGVtb3N0cmFjacOzbiBkZSBjYXVzYWxpZGFkLg0KDQotLS0NCg0KIyAyLiBLcnVza2Fs4oCTV2FsbGlzDQoNCnZpZGVvIDIgaHR0cHM6Ly95b3V0dS5iZS9NdTlEdW9Wd1lEWT9zaT02dExlWDlwYzNrcmk3Ny1BDQoNCiMjIFByZWd1bnRhIGRlIGludmVzdGlnYWNpw7NuDQoNCioqwr9FeGlzdGVuIGRpZmVyZW5jaWFzIGVuIGxvcyBuaXZlbGVzIGRlbCBiaW9tYXJjYWRvciB0b3hpbm9sw7NnaWNvIHNlZ8O6biBlbCBhZ2VudGUgdG94aW5vbMOzZ2ljbyBpbnZvbHVjcmFkbz8qKg0KDQojIyBWYXJpYWJsZXMNCg0KLSAqKlJlc3B1ZXN0YToqKiBgQmlvbWFyY2Fkb3JfVUxgIOKAlCBjdWFudGl0YXRpdmEgY29udGludWEuDQotICoqRXhwbGljYXRpdmE6KiogYEFnZW50ZWAg4oCUIGN1YWxpdGF0aXZhIG5vbWluYWwgY29uIHNlaXMgZ3J1cG9zLg0KDQojIyBIaXDDs3Rlc2lzDQoNCioqSOKCgDoqKiBsYSBkaXN0cmlidWNpw7NuIGRlbCBiaW9tYXJjYWRvciBlcyBpZ3VhbCBlbnRyZSB0b2RvcyBsb3MgYWdlbnRlcy4gIA0KKipI4oKBOioqIGFsIG1lbm9zIHVubyBkZSBsb3MgYWdlbnRlcyBwcmVzZW50YSB1bmEgZGlzdHJpYnVjacOzbiBkaWZlcmVudGUuDQoNCiMjIMK/UG9yIHF1w6kgc2UgZWxpZ2nDsyBlc3RhIHBydWViYT8NCg0KS3J1c2thbOKAk1dhbGxpcyBwZXJtaXRlIGNvbXBhcmFyIHVuYSB2YXJpYWJsZSBjdWFudGl0YXRpdmEgZW50cmUgKiptw6FzIGRlIGRvcyBncnVwb3MgaW5kZXBlbmRpZW50ZXMqKiBzaW4gZXhpZ2lyIG5vcm1hbGlkYWQuDQoNCiMjIFN1cHVlc3RvcyBwcmluY2lwYWxlcw0KDQotIE9ic2VydmFjaW9uZXMgaW5kZXBlbmRpZW50ZXMuDQotIFZhcmlhYmxlIHJlc3B1ZXN0YSBhbCBtZW5vcyBvcmRpbmFsLg0KLSBHcnVwb3MgbXV0dWFtZW50ZSBpbmRlcGVuZGllbnRlcy4NCi0gTGEgaW50ZXJwcmV0YWNpw7NuIGNvbW8gY29tcGFyYWNpw7NuIGRlIGxvY2FsaXphY2nDs24gZXMgbcOhcyBkaXJlY3RhIGN1YW5kbyBsYXMgZGlzdHJpYnVjaW9uZXMgcHJlc2VudGFuIGZvcm1hcyBzZW1lamFudGVzLg0KDQojIyBFc3RhZMOtc3RpY2EgZGVzY3JpcHRpdmENCg0KYGBge3Iga3ctZGVzY3JpcHRpdm9zfQ0KZXN0YWRpc3RpY2FzX2FnZW50ZSA8LSBUb3hpbm9sb2dpYV9QYW5hbWEgJT4lDQogIGdyb3VwX2J5KEFnZW50ZSkgJT4lDQogIHN1bW1hcmlzZSgNCiAgICBuID0gbigpLA0KICAgIE1lZGlhbmEgPSBtZWRpYW4oQmlvbWFyY2Fkb3JfVUwsIG5hLnJtID0gVFJVRSksDQogICAgUTEgPSBxdWFudGlsZShCaW9tYXJjYWRvcl9VTCwgMC4yNSwgbmEucm0gPSBUUlVFKSwNCiAgICBRMyA9IHF1YW50aWxlKEJpb21hcmNhZG9yX1VMLCAwLjc1LCBuYS5ybSA9IFRSVUUpLA0KICAgIFJJUSA9IElRUihCaW9tYXJjYWRvcl9VTCwgbmEucm0gPSBUUlVFKSwNCiAgICAuZ3JvdXBzID0gImRyb3AiDQogICkgJT4lDQogIGFycmFuZ2UoZGVzYyhNZWRpYW5hKSkNCg0Ka25pdHI6OmthYmxlKA0KICBlc3RhZGlzdGljYXNfYWdlbnRlLA0KICBkaWdpdHMgPSAyLA0KICBjYXB0aW9uID0gIkJpb21hcmNhZG9yIHNlZ8O6biBhZ2VudGUgdG94aW5vbMOzZ2ljbyINCikNCmBgYA0KDQojIyBHcsOhZmljbw0KDQpgYGB7ciBrdy1ncmFmaWNvfQ0KZ2dwbG90KFRveGlub2xvZ2lhX1BhbmFtYSwgYWVzKHggPSBBZ2VudGUsIHkgPSBCaW9tYXJjYWRvcl9VTCkpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIk5pdmVsZXMgZGVsIGJpb21hcmNhZG9yIHNlZ8O6biBhZ2VudGUgdG94aW5vbMOzZ2ljbyIsDQogICAgeCA9ICJBZ2VudGUgdG94aW5vbMOzZ2ljbyIsDQogICAgeSA9ICJCaW9tYXJjYWRvciAoVUwpIg0KICApICsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMykgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDM1LCBoanVzdCA9IDEpKQ0KYGBgDQoNCiMjIFBydWViYSBnbG9iYWwNCg0KYGBge3Iga3ctcHJ1ZWJhfQ0KcHJ1ZWJhX2t3IDwtIGtydXNrYWwudGVzdCgNCiAgQmlvbWFyY2Fkb3JfVUwgfiBBZ2VudGUsDQogIGRhdGEgPSBUb3hpbm9sb2dpYV9QYW5hbWENCikNCg0KZGF0YS5mcmFtZSgNCiAgSCA9IHVubmFtZShwcnVlYmFfa3ckc3RhdGlzdGljKSwNCiAgZ2wgPSB1bm5hbWUocHJ1ZWJhX2t3JHBhcmFtZXRlciksDQogIHBfdmFsb3IgPSBwcnVlYmFfa3ckcC52YWx1ZQ0KKSB8Pg0KICBrbml0cjo6a2FibGUoZGlnaXRzID0gNCwgY2FwdGlvbiA9ICJSZXN1bHRhZG8gZGUgS3J1c2thbOKAk1dhbGxpcyIpDQpgYGANCg0KIyMgQ29tcGFyYWNpb25lcyBwb3N0IGhvYw0KDQpgYGB7ciBrdy1wb3N0aG9jfQ0KaWYgKCFyZXF1aXJlTmFtZXNwYWNlKCJGU0EiLCBxdWlldGx5ID0gVFJVRSkpIHsNCiAgc3RvcCgiSW5zdGFsYSBlbCBwYXF1ZXRlIEZTQSBjb24gaW5zdGFsbC5wYWNrYWdlcygnRlNBJykgYW50ZXMgZGUgdGVqZXIgZWwgZG9jdW1lbnRvLiIpDQp9DQoNCnBvc3Rob2NfZHVubiA8LSBGU0E6OmR1bm5UZXN0KA0KICBCaW9tYXJjYWRvcl9VTCB+IEFnZW50ZSwNCiAgZGF0YSA9IFRveGlub2xvZ2lhX1BhbmFtYSwNCiAgbWV0aG9kID0gImhvbG0iDQopDQoNCnBvc3Rob2NfZHVubiRyZXMgfD4NCiAga25pdHI6OmthYmxlKA0KICAgIGRpZ2l0cyA9IDQsDQogICAgY2FwdGlvbiA9ICJDb21wYXJhY2lvbmVzIHBvc3QgaG9jIGRlIER1bm4gY29uIGFqdXN0ZSBkZSBIb2xtIg0KICApDQpgYGANCg0KPGRpdiBjbGFzcz0icmVzdWx0Ij4NCioqSW50ZXJwcmV0YWNpw7NuIGVzdGFkw61zdGljYS4qKiBLcnVza2Fs4oCTV2FsbGlzIHByb2R1am8gSCA9IGByIHJvdW5kKHVubmFtZShwcnVlYmFfa3ckc3RhdGlzdGljKSwgMylgLCBnbCA9IGByIHVubmFtZShwcnVlYmFfa3ckcGFyYW1ldGVyKWAgeSBwID0gYHIgZm9ybWF0LnB2YWwocHJ1ZWJhX2t3JHAudmFsdWUsIGRpZ2l0cyA9IDQpYC4gIA0KYHIgaWYgKHBydWViYV9rdyRwLnZhbHVlIDwgMC4wNSkgIlNlIHJlY2hhemEgSOKCgDogZXhpc3RlbiBkaWZlcmVuY2lhcyBlc3RhZMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZhcyBlbnRyZSBsb3MgYWdlbnRlcy4gTGFzIGNvbXBhcmFjaW9uZXMgZGUgRHVubiBwZXJtaXRlbiBpZGVudGlmaWNhciBlbnRyZSBxdcOpIHBhcmVzIHNlIGVuY3VlbnRyYW4gZXNhcyBkaWZlcmVuY2lhcy4iIGVsc2UgIk5vIHNlIHJlY2hhemEgSOKCgDogbm8gc2UgZGV0ZWN0YXJvbiBkaWZlcmVuY2lhcyBnbG9iYWxlcyBlc3RhZMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZhcy4iYA0KPC9kaXY+DQoNCiMjIEludGVycHJldGFjacOzbiB0b3hpbm9sw7NnaWNhDQoNCkVuIGxhIGJhc2Ugc2ltdWxhZGEsIGVsIGNvbXBvcnRhbWllbnRvIGRlbCBiaW9tYXJjYWRvciB2YXLDrWEgc2Vnw7puIGVsIGFnZW50ZSB0b3hpbm9sw7NnaWNvLiBMYXMgbWVkaWFuYXMgeSBsYXMgY29tcGFyYWNpb25lcyBwb3N0IGhvYyBwZXJtaXRlbiBkZXNjcmliaXIgcXXDqSBhZ2VudGVzIHByZXNlbnRhbiBuaXZlbGVzIHJlbGF0aXZhbWVudGUgbWF5b3JlcyBvIG1lbm9yZXMsIHNpbiBhdHJpYnVpciBjYXVzYWxpZGFkLg0KDQojIyBDb25jbHVzacOzbg0KDQpMYSBwcnVlYmEgZ2xvYmFsIGRldGVybWluYSBzaSBleGlzdGVuIGRpZmVyZW5jaWFzIGVudHJlIGFnZW50ZXMgeSwgY3VhbmRvIGVzIHNpZ25pZmljYXRpdmEsIGVsIHBvc3QgaG9jIGRlIER1bm4gY29uIGFqdXN0ZSBkZSBIb2xtIGlkZW50aWZpY2EgbG9zIHBhcmVzIHF1ZSBkaWZpZXJlbi4NCg0KLS0tDQoNCiMgMy4gS2FwbGFu4oCTTWVpZXINCnZpZGVvIDMgaHR0cHM6Ly95b3V0dS5iZS9xNm9fY21CUThKbw0KDQojIyBQcmVndW50YSBkZSBpbnZlc3RpZ2FjacOzbg0KDQoqKsK/Q8OzbW8gY2FtYmlhIGxhIHByb2JhYmlsaWRhZCBkZSBwZXJtYW5lY2VyIHNpbiBwcmVzZW50YXIgZWwgZXZlbnRvIGR1cmFudGUgZWwgc2VndWltaWVudG8gc2Vnw7puIGxhIHNldmVyaWRhZCBjbMOtbmljYSBkZWwgY2FzbyB0b3hpbm9sw7NnaWNvPyoqDQoNCiMjIFZhcmlhYmxlcw0KDQotICoqVGllbXBvOioqIGBUaWVtcG9fU3VwZXJ2aXZlbmNpYV9kaWFzYCDigJQgY3VhbnRpdGF0aXZhLCBlc2NhbGEgZGUgcmF6w7NuLg0KLSAqKkVzdGFkbzoqKiBgRXN0YWRvX0V2ZW50b2Ag4oCUIGJpbmFyaWE7IDAgPSBjZW5zdXJhIHkgMSA9IGV2ZW50by4NCi0gKipBZ3J1cGFjacOzbjoqKiBgU2V2ZXJpZGFkYCDigJQgY3VhbGl0YXRpdmEgb3JkaW5hbC4NCg0KIyMgUHJvcMOzc2l0byBkZWwgYW7DoWxpc2lzDQoNCkthcGxhbuKAk01laWVyIGVzIHByaW5jaXBhbG1lbnRlICoqZGVzY3JpcHRpdm8qKjogZXN0aW1hIGxhIGZ1bmNpw7NuIGRlIHN1cGVydml2ZW5jaWEgYSBsbyBsYXJnbyBkZWwgdGllbXBvIGNvbnNpZGVyYW5kbyBsYSBjZW5zdXJhLiBMYSBjb21wYXJhY2nDs24gZm9ybWFsIGVudHJlIGN1cnZhcyBzZSByZWFsaXphIHBvc3Rlcmlvcm1lbnRlIGNvbiBMb2ctUmFuay4NCg0KIyMgQ29uY2VwdG9zIHF1ZSBkZWJlbiBleHBsaWNhcnNlDQoNCi0gKipUaWVtcG8gYWwgZXZlbnRvOioqIHBlcsOtb2RvIG9ic2VydmFkbyBoYXN0YSBlbCBldmVudG8gbyBsYSBjZW5zdXJhLg0KLSAqKkNlbnN1cmE6KiogZWwgZXZlbnRvIG5vIHNlIG9ic2VydsOzIGR1cmFudGUgZWwgcGVyw61vZG8gZGUgc2VndWltaWVudG8gZGlzcG9uaWJsZS4NCi0gKipJbmRpdmlkdW9zIGVuIHJpZXNnbzoqKiBwYWNpZW50ZXMgcXVlIGNvbnRpbsO6YW4gZW4gc2VndWltaWVudG8geSBhw7puIHB1ZWRlbiBwcmVzZW50YXIgZWwgZXZlbnRvLg0KLSAqKkZ1bmNpw7NuIGRlIHN1cGVydml2ZW5jaWEgUyh0KToqKiBwcm9iYWJpbGlkYWQgZXN0aW1hZGEgZGUgcGVybWFuZWNlciBzaW4gZWwgZXZlbnRvIG3DoXMgYWxsw6EgZGVsIHRpZW1wbyBcKHRcKS4NCg0KIyMgRXN0YWTDrXN0aWNhIGRlc2NyaXB0aXZhDQoNCmBgYHtyIGttLWRlc2NyaXB0aXZvc30NCnRhYmxhX2ttIDwtIFRveGlub2xvZ2lhX1BhbmFtYSAlPiUNCiAgZ3JvdXBfYnkoU2V2ZXJpZGFkKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIG4gPSBuKCksDQogICAgRXZlbnRvcyA9IHN1bShFc3RhZG9fRXZlbnRvID09IDEsIG5hLnJtID0gVFJVRSksDQogICAgQ2Vuc3VyYWRvcyA9IHN1bShFc3RhZG9fRXZlbnRvID09IDAsIG5hLnJtID0gVFJVRSksDQogICAgUG9yY2VudGFqZV9ldmVudG9zID0gcm91bmQoMTAwICogRXZlbnRvcyAvIG4sIDIpLA0KICAgIC5ncm91cHMgPSAiZHJvcCINCiAgKQ0KDQprbml0cjo6a2FibGUoDQogIHRhYmxhX2ttLA0KICBjYXB0aW9uID0gIkV2ZW50b3MgeSBjZW5zdXJhcyBzZWfDum4gc2V2ZXJpZGFkIg0KKQ0KYGBgDQoNCiMjIFN1cHVlc3RvcyBwcmluY2lwYWxlcw0KDQotIFRpZW1wbyBkZSBzZWd1aW1pZW50byBjb3JyZWN0YW1lbnRlIGRlZmluaWRvLg0KLSBFdmVudG8gY29ycmVjdGFtZW50ZSBpZGVudGlmaWNhZG8uDQotIE9ic2VydmFjaW9uZXMgaW5kZXBlbmRpZW50ZXMuDQotIENlbnN1cmEgbm8gaW5mb3JtYXRpdmEuDQoNCiMjIEVzdGltYWNpw7NuIEthcGxhbuKAk01laWVyDQoNCmBgYHtyIGttLW1vZGVsb30NCm1vZGVsb19rbSA8LSBzdXJ2Zml0KA0KICBTdXJ2KFRpZW1wb19TdXBlcnZpdmVuY2lhX2RpYXMsIEVzdGFkb19FdmVudG8pIH4gU2V2ZXJpZGFkLA0KICBkYXRhID0gVG94aW5vbG9naWFfUGFuYW1hDQopDQoNCm1vZGVsb19rbQ0KYGBgDQoNCiMjIEN1cnZhcyBkZSBzdXBlcnZpdmVuY2lhIHkgcGFjaWVudGVzIGVuIHJpZXNnbw0KDQpgYGB7ciBrbS1ncmFmaWNvLCBmaWcuaGVpZ2h0PTd9DQpnZ3N1cnZwbG90KA0KICBtb2RlbG9fa20sDQogIGRhdGEgPSBUb3hpbm9sb2dpYV9QYW5hbWEsDQogIGNlbnNvciA9IFRSVUUsDQogIGNvbmYuaW50ID0gRkFMU0UsDQogIHJpc2sudGFibGUgPSBUUlVFLA0KICByaXNrLnRhYmxlLmhlaWdodCA9IDAuMzAsDQogIHJpc2sudGFibGUudGl0bGUgPSAiUGFjaWVudGVzIGVuIHJpZXNnbyIsDQogIHRpdGxlID0gIkN1cnZhcyBkZSBLYXBsYW7igJNNZWllciBzZWfDum4gc2V2ZXJpZGFkIiwNCiAgeGxhYiA9ICJUaWVtcG8gZGUgc2VndWltaWVudG8gKGTDrWFzKSIsDQogIHlsYWIgPSAiUHJvYmFiaWxpZGFkIGRlIHBlcm1hbmVjZXIgc2luIGVsIGV2ZW50byIsDQogIGxlZ2VuZC50aXRsZSA9ICJTZXZlcmlkYWQiLA0KICBnZ3RoZW1lID0gdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMikNCikNCmBgYA0KDQo8ZGl2IGNsYXNzPSJub3RlIj4NCioqQ8OzbW8gbGVlciBsYSBncsOhZmljYToqKiB1bmEgY3VydmEgbcOhcyBhbHRhIHJlcHJlc2VudGEgdW5hIG1heW9yIHByb2JhYmlsaWRhZCBlc3RpbWFkYSBkZSBwZXJtYW5lY2VyIHNpbiBlbCBldmVudG8uIENhZGEgZGVzY2Vuc28gcmVmbGVqYSBsYSBvY3VycmVuY2lhIGRlIGV2ZW50b3MgeSBsYXMgbWFyY2FzIGRlIGNlbnN1cmEgcmVwcmVzZW50YW4gcGFjaWVudGVzIGN1eW8gZXZlbnRvIG5vIGZ1ZSBvYnNlcnZhZG8gZHVyYW50ZSBlbCBzZWd1aW1pZW50by4NCjwvZGl2Pg0KDQojIyBJbnRlcnByZXRhY2nDs24gZXN0YWTDrXN0aWNhDQoNCkxhcyBjdXJ2YXMgcGVybWl0ZW4gY29tcGFyYXIgdmlzdWFsbWVudGUgZWwgcGF0csOzbiBkZSBzdXBlcnZpdmVuY2lhIGVudHJlIG5pdmVsZXMgZGUgc2V2ZXJpZGFkLiBMYSBtZWRpYW5hIGRlIHN1cGVydml2ZW5jaWEgc29sbyBwdWVkZSByZXBvcnRhcnNlIHNpIGFsZ3VuYSBjdXJ2YSBhbGNhbnphIHVuYSBwcm9iYWJpbGlkYWQgZGUgMC41MCBkdXJhbnRlIGVsIHNlZ3VpbWllbnRvLg0KDQojIyBJbnRlcnByZXRhY2nDs24gdG94aW5vbMOzZ2ljYQ0KDQpFbiBlbCBlc2NlbmFyaW8gc2ltdWxhZG8sIHVuYSBjdXJ2YSBtw6FzIGJhamEgaW5kaWNhIHVuIHBhdHLDs24gbWVub3MgZmF2b3JhYmxlIGRlIHBlcm1hbmVuY2lhIHNpbiBldmVudG8uIExhIGxlY3R1cmEgZGViZSBjZW50cmFyc2UgZW4gbGEgc2VwYXJhY2nDs24geSBlbCBkZXNjZW5zbyBkZSBsYXMgY3VydmFzLCBzaW4gaW5mZXJpciB0b2RhdsOtYSBzaWduaWZpY2FuY2lhIGVzdGFkw61zdGljYSBlbnRyZSBlbGxhcy4NCg0KIyMgQ29uY2x1c2nDs24NCg0KS2FwbGFu4oCTTWVpZXIgZGVzY3JpYmUgKipjw7NtbyBjYW1iaWEgbGEgcHJvYmFiaWxpZGFkIGRlIHBlcm1hbmVjZXIgc2luIGVsIGV2ZW50byBhIGxvIGxhcmdvIGRlbCB0aWVtcG8qKiB5IHBlcm1pdGUgdmlzdWFsaXphciBlbCBlZmVjdG8gZGUgbGEgY2Vuc3VyYSB5IGVsIG7Dum1lcm8gZGUgcGFjaWVudGVzIGVuIHJpZXNnby4NCg0KLS0tDQoNCiMgNC4gTG9nLVJhbmsNCg0KdmlkZW8gNCBodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PWkyY3lwd3BtSmV3DQoNCiMjIFByZWd1bnRhIGRlIGludmVzdGlnYWNpw7NuDQoNCioqwr9FeGlzdGVuIGRpZmVyZW5jaWFzIGVudHJlIGxhcyBjdXJ2YXMgZGUgc3VwZXJ2aXZlbmNpYSBkZSBsb3MgcGFjaWVudGVzIHF1ZSByZWNpYmVuIGRpZmVyZW50ZXMgdHJhdGFtaWVudG9zPyoqDQoNCiMjIFZhcmlhYmxlcw0KDQotICoqVGllbXBvOioqIGBUaWVtcG9fU3VwZXJ2aXZlbmNpYV9kaWFzYC4NCi0gKipFdmVudG86KiogYEVzdGFkb19FdmVudG9gLg0KLSAqKkdydXBvOioqIGBUcmF0YW1pZW50b2AuDQoNCiMjIEhpcMOzdGVzaXMNCg0KKipI4oKAOioqIGxhcyBmdW5jaW9uZXMgZGUgc3VwZXJ2aXZlbmNpYSBzb24gaWd1YWxlcyBlbnRyZSB0b2RvcyBsb3MgdHJhdGFtaWVudG9zLiAgDQoqKkjigoE6KiogYWwgbWVub3MgdW5hIGZ1bmNpw7NuIGRlIHN1cGVydml2ZW5jaWEgZGlmaWVyZSBkZSBsYXMgZGVtw6FzLg0KDQojIyDCv1BvciBxdcOpIHNlIGVsaWdpw7MgZXN0YSBwcnVlYmE/DQoNCkxvZy1SYW5rIGNvbXBhcmEgZm9ybWFsbWVudGUgY3VydmFzIGRlIHN1cGVydml2ZW5jaWEgZGUgZ3J1cG9zIGluZGVwZW5kaWVudGVzIHkgdXRpbGl6YSBhZGVjdWFkYW1lbnRlIGxhIGluZm9ybWFjacOzbiBkZSBvYnNlcnZhY2lvbmVzIGNlbnN1cmFkYXMuDQoNCiMjIFN1cHVlc3RvcyBwcmluY2lwYWxlcw0KDQotIE9ic2VydmFjaW9uZXMgaW5kZXBlbmRpZW50ZXMuDQotIFRpZW1wbyB5IGV2ZW50byBiaWVuIGRlZmluaWRvcy4NCi0gQ2Vuc3VyYSBubyBpbmZvcm1hdGl2YS4NCi0gR3J1cG9zIGluZGVwZW5kaWVudGVzLg0KLSBMYSBwcnVlYmEgZXMgZXNwZWNpYWxtZW50ZSBpbnRlcnByZXRhYmxlIGN1YW5kbyBsYXMgZGlmZXJlbmNpYXMgZW50cmUgY3VydmFzIHNvbiByZWxhdGl2YW1lbnRlIGNvbnNpc3RlbnRlcyBkdXJhbnRlIGVsIHNlZ3VpbWllbnRvLg0KDQojIyBFc3RhZMOtc3RpY2EgZGVzY3JpcHRpdmENCg0KYGBge3IgbG9ncmFuay1kZXNjcmlwdGl2b3N9DQp0YWJsYV9sb2dyYW5rIDwtIFRveGlub2xvZ2lhX1BhbmFtYSAlPiUNCiAgZ3JvdXBfYnkoVHJhdGFtaWVudG8pICU+JQ0KICBzdW1tYXJpc2UoDQogICAgbiA9IG4oKSwNCiAgICBFdmVudG9zID0gc3VtKEVzdGFkb19FdmVudG8gPT0gMSwgbmEucm0gPSBUUlVFKSwNCiAgICBDZW5zdXJhZG9zID0gc3VtKEVzdGFkb19FdmVudG8gPT0gMCwgbmEucm0gPSBUUlVFKSwNCiAgICBQb3JjZW50YWplX2V2ZW50b3MgPSByb3VuZCgxMDAgKiBFdmVudG9zIC8gbiwgMiksDQogICAgLmdyb3VwcyA9ICJkcm9wIg0KICApDQoNCmtuaXRyOjprYWJsZSgNCiAgdGFibGFfbG9ncmFuaywNCiAgY2FwdGlvbiA9ICJFdmVudG9zIHkgY2Vuc3VyYXMgc2Vnw7puIHRyYXRhbWllbnRvIg0KKQ0KYGBgDQoNCiMjIEthcGxhbuKAk01laWVyIHBvciB0cmF0YW1pZW50byB5IHBydWViYSBMb2ctUmFuaw0KDQpgYGB7ciBsb2dyYW5rLW1vZGVsb30NCnN1cGVydml2ZW5jaWFfbG9ncmFuayA8LSBTdXJ2KA0KICBUb3hpbm9sb2dpYV9QYW5hbWEkVGllbXBvX1N1cGVydml2ZW5jaWFfZGlhcywNCiAgVG94aW5vbG9naWFfUGFuYW1hJEVzdGFkb19FdmVudG8NCikNCg0Ka21fdHJhdGFtaWVudG8gPC0gc3VydmZpdCgNCiAgc3VwZXJ2aXZlbmNpYV9sb2dyYW5rIH4gVHJhdGFtaWVudG8sDQogIGRhdGEgPSBUb3hpbm9sb2dpYV9QYW5hbWENCikNCg0KbG9ncmFuayA8LSBzdXJ2ZGlmZigNCiAgc3VwZXJ2aXZlbmNpYV9sb2dyYW5rIH4gVHJhdGFtaWVudG8sDQogIGRhdGEgPSBUb3hpbm9sb2dpYV9QYW5hbWENCikNCg0KZ2xfbG9ncmFuayA8LSBsZW5ndGgobG9ncmFuayRuKSAtIDENCnBfbG9ncmFuayA8LSBwY2hpc3EoDQogIGxvZ3JhbmskY2hpc3EsDQogIGRmID0gZ2xfbG9ncmFuaywNCiAgbG93ZXIudGFpbCA9IEZBTFNFDQopDQoNCmRhdGEuZnJhbWUoDQogIENoaV9jdWFkcmFkbyA9IGxvZ3JhbmskY2hpc3EsDQogIGdsID0gZ2xfbG9ncmFuaywNCiAgcF92YWxvciA9IHBfbG9ncmFuaw0KKSB8Pg0KICBrbml0cjo6a2FibGUoZGlnaXRzID0gNCwgY2FwdGlvbiA9ICJSZXN1bHRhZG8gZGUgbGEgcHJ1ZWJhIExvZy1SYW5rIikNCmBgYA0KDQojIyBHcsOhZmljbw0KDQpgYGB7ciBsb2dyYW5rLWdyYWZpY28sIGZpZy5oZWlnaHQ9N30NCmdnc3VydnBsb3QoDQogIGttX3RyYXRhbWllbnRvLA0KICBkYXRhID0gVG94aW5vbG9naWFfUGFuYW1hLA0KICBjb25mLmludCA9IFRSVUUsDQogIGNlbnNvciA9IFRSVUUsDQogIHJpc2sudGFibGUgPSBUUlVFLA0KICByaXNrLnRhYmxlLmhlaWdodCA9IDAuMjgsDQogIHJpc2sudGFibGUudGl0bGUgPSAiTsO6bWVybyBkZSBwYWNpZW50ZXMgZW4gcmllc2dvIiwNCiAgcHZhbCA9IFRSVUUsDQogIHB2YWwubWV0aG9kID0gVFJVRSwNCiAgdGl0bGUgPSAiQ3VydmFzIGRlIHN1cGVydml2ZW5jaWEgc2Vnw7puIHRyYXRhbWllbnRvIiwNCiAgeGxhYiA9ICJUaWVtcG8gZGUgc2VndWltaWVudG8gKGTDrWFzKSIsDQogIHlsYWIgPSAiUHJvYmFiaWxpZGFkIGRlIHBlcm1hbmVjZXIgc2luIGVsIGV2ZW50byIsDQogIGxlZ2VuZC50aXRsZSA9ICJUcmF0YW1pZW50byIsDQogIGxlZ2VuZCA9ICJ0b3AiLA0KICBnZ3RoZW1lID0gdGhlbWVfY2xhc3NpYygpDQopDQpgYGANCg0KPGRpdiBjbGFzcz0icmVzdWx0Ij4NCioqSW50ZXJwcmV0YWNpw7NuIGVzdGFkw61zdGljYS4qKiBMYSBwcnVlYmEgTG9nLVJhbmsgcHJvZHVqbyDPh8KyID0gYHIgcm91bmQobG9ncmFuayRjaGlzcSwgMylgLCBnbCA9IGByIGdsX2xvZ3JhbmtgIHkgcCA9IGByIGZvcm1hdC5wdmFsKHBfbG9ncmFuaywgZGlnaXRzID0gNClgLiAgDQpgciBpZiAocF9sb2dyYW5rIDwgMC4wNSkgIlNlIHJlY2hhemEgSOKCgDogZXhpc3RlbiBkaWZlcmVuY2lhcyBnbG9iYWxlcyBlc3RhZMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZhcyBlbnRyZSBsYXMgY3VydmFzIGRlIHN1cGVydml2ZW5jaWEgZGUgbG9zIHRyYXRhbWllbnRvcy4iIGVsc2UgIk5vIHNlIHJlY2hhemEgSOKCgDogbm8gc2UgZW5jb250cmFyb24gZGlmZXJlbmNpYXMgZ2xvYmFsZXMgZXN0YWTDrXN0aWNhbWVudGUgc2lnbmlmaWNhdGl2YXMgZW50cmUgbGFzIGN1cnZhcy4iYA0KPC9kaXY+DQoNCiMjIEludGVycHJldGFjacOzbiB0b3hpbm9sw7NnaWNhDQoNCkxhcyBjdXJ2YXMgcGVybWl0ZW4gb2JzZXJ2YXIgY3XDoWwgdHJhdGFtaWVudG8gbWFudGllbmUgdW5hIG1heW9yIG8gbWVub3IgcHJvYmFiaWxpZGFkIGVzdGltYWRhIGRlIHBlcm1hbmVjZXIgc2luIGVsIGV2ZW50by4gTGEgcHJ1ZWJhIExvZy1SYW5rIGluZGljYSBzaSBsYSBkaWZlcmVuY2lhIGdsb2JhbCBlbnRyZSBjdXJ2YXMgZXMgZXN0YWTDrXN0aWNhbWVudGUgc2lnbmlmaWNhdGl2YSwgcGVybyAqKm5vIGlkZW50aWZpY2EgcG9yIHPDrSBzb2xhIHF1w6kgcGFyZXMgZGUgdHJhdGFtaWVudG9zIGRpZmllcmVuKiouDQoNCiMjIENvbmNsdXNpw7NuDQoNCkxvZy1SYW5rIHJlc3BvbmRlIGRpcmVjdGFtZW50ZSBzaSBsYXMgY3VydmFzIGRlIHN1cGVydml2ZW5jaWEgZGUgbG9zIHRyYXRhbWllbnRvcyBzb24gaWd1YWxlcyBvIGRpZmVyZW50ZXMgZHVyYW50ZSBlbCBzZWd1aW1pZW50by4NCg0KLS0tDQoNCiMgNS4gTW9kZWxvIGRlIHJpZXNnb3MgcHJvcG9yY2lvbmFsZXMgZGUgQ294DQoNCnZpZGVvIDUgaHR0cHM6Ly95b3V0dS5iZS9fc090TFRTRE1GND9zaT1HY3doWVlWb09Bd2pRcU16DQoNCiMjIFByZWd1bnRhIGRlIGludmVzdGlnYWNpw7NuDQoNCioqwr9FeGlzdGUgdW5hIGFzb2NpYWNpw7NuIGVudHJlIGVsIHRyYXRhbWllbnRvIGFkbWluaXN0cmFkbyB5IGVsIHJpZXNnbyBpbnN0YW50w6FuZW8gZGUgcHJlc2VudGFyIGVsIGV2ZW50byBkdXJhbnRlIGVsIHNlZ3VpbWllbnRvLCBkZXNwdcOpcyBkZSBhanVzdGFyIHBvciBlZGFkLCBzZXhvLCBhZ2VudGUgdG94aW5vbMOzZ2ljbywgZG9zaXMsIHNldmVyaWRhZCB5IGJpb21hcmNhZG9yPyoqDQoNCiMjIFZhcmlhYmxlcw0KDQotICoqVGllbXBvOioqIGBUaWVtcG9fU3VwZXJ2aXZlbmNpYV9kaWFzYC4NCi0gKipFdmVudG86KiogYEVzdGFkb19FdmVudG9gLg0KLSAqKlByZWRpY3RvciBwcmluY2lwYWw6KiogYFRyYXRhbWllbnRvYC4NCi0gKipDb3ZhcmlhYmxlczoqKiBgRWRhZGAsIGBTZXhvYCwgYEFnZW50ZWAsIGBEb3Npc19tZ2tnYCwgYFNldmVyaWRhZGAsIGBCaW9tYXJjYWRvcl9VTGAuDQoNCiMjIEhpcMOzdGVzaXMNCg0KKipI4oKAOioqIGVsIHRyYXRhbWllbnRvIG5vIHNlIGFzb2NpYSBjb24gZWwgaGF6YXJkIGRlbCBldmVudG8gZGVzcHXDqXMgZGVsIGFqdXN0ZSBwb3IgbGFzIGNvdmFyaWFibGVzLiAgDQoqKkjigoE6KiogZWwgdHJhdGFtaWVudG8gc2UgYXNvY2lhIGNvbiBlbCBoYXphcmQgZGVsIGV2ZW50byBkZXNwdcOpcyBkZWwgYWp1c3RlLg0KDQojIyDCv1BvciBxdcOpIHNlIGVsaWdpw7MgZXN0ZSBtb2RlbG8/DQoNCkVsIG1vZGVsbyBkZSBDb3ggcGVybWl0ZSBlc3R1ZGlhciBzaW11bHTDoW5lYW1lbnRlIGVsICoqdGllbXBvIGhhc3RhIGVsIGV2ZW50byoqLCBsYSAqKmNlbnN1cmEqKiB5IG3Dumx0aXBsZXMgdmFyaWFibGVzIGV4cGxpY2F0aXZhcy4gU3UgbWVkaWRhIHByaW5jaXBhbCBlcyBlbCAqKkhhemFyZCBSYXRpbyAoSFIpKiouDQoNCjxkaXYgY2xhc3M9Im5vdGUiPg0KKipDw7NtbyBpbnRlcnByZXRhciB1biBIUjoqKiBIUiA9IDEgaW5kaWNhIGF1c2VuY2lhIGRlIGRpZmVyZW5jaWEgZW4gZWwgaGF6YXJkIHJlc3BlY3RvIGEgbGEgY2F0ZWdvcsOtYSBkZSByZWZlcmVuY2lhOyBIUiAmZ3Q7IDEgaW5kaWNhIG1heW9yIGhhemFyZDsgSFIgJmx0OyAxIGluZGljYSBtZW5vciBoYXphcmQsIG1hbnRlbmllbmRvIGNvbnN0YW50ZXMgbGFzIGRlbcOhcyB2YXJpYWJsZXMgZGVsIG1vZGVsby4NCjwvZGl2Pg0KDQojIyBTdXB1ZXN0b3MgcHJpbmNpcGFsZXMNCg0KLSBUaWVtcG8geSBldmVudG8gY29ycmVjdGFtZW50ZSBkZWZpbmlkb3MuDQotIE9ic2VydmFjaW9uZXMgaW5kZXBlbmRpZW50ZXMuDQotIENlbnN1cmEgbm8gaW5mb3JtYXRpdmEuDQotIFJpZXNnb3MgcHJvcG9yY2lvbmFsZXMuDQotIFJlbGFjacOzbiBhZGVjdWFkYSBlbnRyZSBjb3ZhcmlhYmxlcyBjb250aW51YXMgeSBlbCBsb2ctaGF6YXJkLg0KLSBBdXNlbmNpYSBkZSBtdWx0aWNvbGluZWFsaWRhZCBpbXBvcnRhbnRlLg0KDQojIyBQcmVwYXJhY2nDs24gZGVsIG1vZGVsbw0KDQpgYGB7ciBjb3gtcHJlcGFyYWNpb259DQojIFNlIGRlamEgU2V2ZXJpZGFkIGNvbW8gZmFjdG9yIG5vIG9yZGVuYWRvIHBhcmEgb2J0ZW5lciBIUg0KIyBkZSBjYXRlZ29yw61hcyBmcmVudGUgYSB1bmEgcmVmZXJlbmNpYSBjbGFyYS4NClRveGlub2xvZ2lhX1BhbmFtYSRTZXZlcmlkYWQgPC0gZmFjdG9yKA0KICBUb3hpbm9sb2dpYV9QYW5hbWEkU2V2ZXJpZGFkLA0KICBsZXZlbHMgPSBjKCJMZXZlIiwgIk1vZGVyYWRhIiwgIlNldmVyYSIsICJDcsOtdGljYSIpLA0KICBvcmRlcmVkID0gRkFMU0UNCikNCg0KVG94aW5vbG9naWFfUGFuYW1hJFNldmVyaWRhZCA8LSByZWxldmVsKA0KICBUb3hpbm9sb2dpYV9QYW5hbWEkU2V2ZXJpZGFkLA0KICByZWYgPSAiTGV2ZSINCikNCmBgYA0KDQojIyBNb2RlbG8gYWp1c3RhZG8NCg0KYGBge3IgY294LW1vZGVsb30NCm1vZGVsb19jb3hfYWp1c3RhZG8gPC0gY294cGgoDQogIFN1cnYoVGllbXBvX1N1cGVydml2ZW5jaWFfZGlhcywgRXN0YWRvX0V2ZW50bykgfg0KICAgIFRyYXRhbWllbnRvICsNCiAgICBFZGFkICsNCiAgICBTZXhvICsNCiAgICBBZ2VudGUgKw0KICAgIERvc2lzX21na2cgKw0KICAgIFNldmVyaWRhZCArDQogICAgQmlvbWFyY2Fkb3JfVUwsDQogIGRhdGEgPSBUb3hpbm9sb2dpYV9QYW5hbWENCikNCg0Kc3VtbWFyeShtb2RlbG9fY294X2FqdXN0YWRvKQ0KYGBgDQoNCiMjIEhhemFyZCBSYXRpb3MgZSBpbnRlcnZhbG9zIGRlIGNvbmZpYW56YQ0KDQpgYGB7ciBjb3gtaHJ9DQpzX2NveCA8LSBzdW1tYXJ5KG1vZGVsb19jb3hfYWp1c3RhZG8pDQoNCnRhYmxhX2hyIDwtIGRhdGEuZnJhbWUoDQogIFZhcmlhYmxlID0gcm93bmFtZXMoc19jb3gkY29lZmZpY2llbnRzKSwNCiAgSFIgPSBzX2NveCRjb2VmZmljaWVudHNbLCAiZXhwKGNvZWYpIl0sDQogIElDOTVfaW5mID0gc19jb3gkY29uZi5pbnRbLCAibG93ZXIgLjk1Il0sDQogIElDOTVfc3VwID0gc19jb3gkY29uZi5pbnRbLCAidXBwZXIgLjk1Il0sDQogIHBfdmFsb3IgPSBzX2NveCRjb2VmZmljaWVudHNbLCAiUHIoPnx6fCkiXSwNCiAgcm93Lm5hbWVzID0gTlVMTA0KKQ0KDQprbml0cjo6a2FibGUoDQogIHRhYmxhX2hyLA0KICBkaWdpdHMgPSA0LA0KICBjYXB0aW9uID0gIkhhemFyZCBSYXRpb3MgYWp1c3RhZG9zIGRlbCBtb2RlbG8gZGUgQ294Ig0KKQ0KYGBgDQoNCiMjIEVmZWN0byBnbG9iYWwgZGVsIHRyYXRhbWllbnRvDQoNCmBgYHtyIGNveC10cmF0YW1pZW50by1nbG9iYWx9DQptb2RlbG9fc2luX3RyYXQgPC0gdXBkYXRlKA0KICBtb2RlbG9fY294X2FqdXN0YWRvLA0KICAuIH4gLiAtIFRyYXRhbWllbnRvDQopDQoNCmNvbXBhcmFjaW9uX3RyYXQgPC0gYW5vdmEoDQogIG1vZGVsb19zaW5fdHJhdCwNCiAgbW9kZWxvX2NveF9hanVzdGFkbywNCiAgdGVzdCA9ICJMUlQiDQopDQoNCmNvbXBhcmFjaW9uX3RyYXQNCmBgYA0KDQo8ZGl2IGNsYXNzPSJub3RlIj4NCkVsICoqcC12YWxvciBnbG9iYWwgZGVsIG1vZGVsbyoqIG5vIGRlYmUgY29uZnVuZGlyc2UgY29uIGVsIGVmZWN0byBlc3BlY8OtZmljbyBkZWwgdHJhdGFtaWVudG8uIFBhcmEgZXZhbHVhciBlbCB0cmF0YW1pZW50byBjb21vIGNvbmp1bnRvIHNlIGNvbXBhcmEgZWwgbW9kZWxvIGNvbXBsZXRvIGNvbiBvdHJvIG1vZGVsbyBpZMOpbnRpY28gcGVybyBzaW4gYFRyYXRhbWllbnRvYC4NCjwvZGl2Pg0KDQojIyBTdXB1ZXN0byBkZSByaWVzZ29zIHByb3BvcmNpb25hbGVzDQoNCmBgYHtyIGNveC1waH0NCnN1cHVlc3RvX1BIIDwtIGNveC56cGgobW9kZWxvX2NveF9hanVzdGFkbykNCg0Kc3VwdWVzdG9fUEgNCmBgYA0KDQo8ZGl2IGNsYXNzPSJyZXN1bHQiPg0KKipJbnRlcnByZXRhY2nDs24gZGVsIHN1cHVlc3RvOioqIGVuIGBjb3guenBoYCwgSOKCgCBlc3RhYmxlY2UgcXVlIGVsIHN1cHVlc3RvIGRlIHJpZXNnb3MgcHJvcG9yY2lvbmFsZXMgc2UgY3VtcGxlLiBVbiBwICZndDsgMC4wNSBpbmRpY2EgcXVlIG5vIGhheSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhIGRlIHZpb2xhY2nDs247IHVuIHAgJmx0OyAwLjA1IGluZGljYSBldmlkZW5jaWEgZGUgcG9zaWJsZSBpbmN1bXBsaW1pZW50by4gRGViZSByZXZpc2Fyc2UgdGFudG8gY2FkYSBjb3ZhcmlhYmxlIGNvbW8gbGEgZmlsYSAqKkdMT0JBTCoqLg0KPC9kaXY+DQoNCiMjIEdyw6FmaWNvIGRlIEhhemFyZCBSYXRpb3MNCg0KYGBge3IgY294LWZvcmVzdCwgZmlnLmhlaWdodD03fQ0KZ2dmb3Jlc3QoDQogIG1vZGVsb19jb3hfYWp1c3RhZG8sDQogIGRhdGEgPSBUb3hpbm9sb2dpYV9QYW5hbWEsDQogIG1haW4gPSAiSGF6YXJkIFJhdGlvcyBhanVzdGFkb3MiLA0KICBjcG9zaXRpb25zID0gYygwLjAyLCAwLjIyLCAwLjQwKSwNCiAgZm9udHNpemUgPSAwLjgNCikNCmBgYA0KDQojIyBJbnRlcnByZXRhY2nDs24gZXN0YWTDrXN0aWNhDQoNCkVsIG1vZGVsbyBkZSBDb3ggZXN0aW1hIGVsIGNhbWJpbyByZWxhdGl2byBlbiBlbCAqKmhhemFyZCBpbnN0YW50w6FuZW8qKiBhc29jaWFkbyBjb24gY2FkYSBwcmVkaWN0b3IsIG1hbnRlbmllbmRvIGNvbnN0YW50ZXMgbGFzIGRlbcOhcyB2YXJpYWJsZXMuIExvcyBIUiBkZWJlbiBpbnRlcnByZXRhcnNlIHNpZW1wcmUgcmVzcGVjdG8gYSBzdSBjYXRlZ29yw61hIGRlIHJlZmVyZW5jaWEgeSBqdW50byBjb24gc3UgaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSBkZWwgOTUgJSB5IHN1IHZhbG9yIHAuDQoNCkN1YW5kbyB1biBpbnRlcnZhbG8gZGUgY29uZmlhbnphIGRlbCA5NSAlIHBhcmEgdW4gSFIgKipubyBpbmNsdXllIDEqKiwgZXhpc3RlIGV2aWRlbmNpYSBkZSBhc29jaWFjacOzbiBlc3RhZMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZhIHBhcmEgZXNlIGNvbnRyYXN0ZSwgc2llbXByZSBxdWUgbG9zIHN1cHVlc3RvcyBkZWwgbW9kZWxvIHNlYW4gcmF6b25hYmxlcy4NCg0KIyMgSW50ZXJwcmV0YWNpw7NuIHRveGlub2zDs2dpY2ENCg0KRGVudHJvIGRlbCBlc2NlbmFyaW8gc2ltdWxhZG8sIGVsIG1vZGVsbyBwZXJtaXRlIGlkZW50aWZpY2FyIHF1w6kgY2FyYWN0ZXLDrXN0aWNhcyBzZSBhc29jaWFuIGNvbiB1biBtYXlvciBvIG1lbm9yIGhhemFyZCBkZSBwcmVzZW50YXIgZWwgZXZlbnRvIGR1cmFudGUgZWwgc2VndWltaWVudG8sIGRlc3B1w6lzIGRlIGNvbnNpZGVyYXIgc2ltdWx0w6FuZWFtZW50ZSBsYXMgZGVtw6FzIGNvdmFyaWFibGVzLg0KDQpEZWJlIHV0aWxpemFyc2UgbGVuZ3VhamUgZGUgKiphc29jaWFjacOzbioqIHkgbm8gZGUgY2F1c2FsaWRhZDogcG9yIGVqZW1wbG8sIOKAnHNlIGFzb2NpYSBjb24gdW4gbWVub3IgaGF6YXJk4oCdIGVuIGx1Z2FyIGRlIOKAnHByb3RlZ2XigJ0gbyDigJxldml0YeKAnSBlbCBldmVudG8uDQoNCiMjIENvbmNsdXNpw7NuDQoNCkVsIG1vZGVsbyBkZSBDb3ggY29tcGxlbWVudGEgYSBLYXBsYW7igJNNZWllciB5IExvZy1SYW5rIHBvcnF1ZSBubyBzb2xvIGNvbXBhcmEgZ3J1cG9zLCBzaW5vIHF1ZSBwZXJtaXRlICoqY3VhbnRpZmljYXIgYXNvY2lhY2lvbmVzIGFqdXN0YWRhcyBtZWRpYW50ZSBIYXphcmQgUmF0aW9zKiogeSBldmFsdWFyIG3Dumx0aXBsZXMgY292YXJpYWJsZXMgYWwgbWlzbW8gdGllbXBvLiBMYSBjb25jbHVzacOzbiBmaW5hbCBkZWJlIGNvbnNpZGVyYXIgdGFudG8gbG9zIEhSIGUgaW50ZXJ2YWxvcyBkZSBjb25maWFuemEgY29tbyBsYSB2ZXJpZmljYWNpw7NuIGRlbCBzdXB1ZXN0byBkZSByaWVzZ29zIHByb3BvcmNpb25hbGVzLg0KDQotLS0NCg0KIyBDb25jbHVzacOzbiBnZW5lcmFsDQoNCkxhcyBjaW5jbyBwcnVlYmFzIHJlc3BvbmRlbiBhIHByZWd1bnRhcyBkaWZlcmVudGVzIHkgY29tcGxlbWVudGFyaWFzOg0KDQotICoqTWFubuKAk1doaXRuZXnigJNXaWxjb3hvbioqIGNvbXBhcmEgZG9zIGdydXBvcyBpbmRlcGVuZGllbnRlcy4NCi0gKipLcnVza2Fs4oCTV2FsbGlzKiogY29tcGFyYSBtw6FzIGRlIGRvcyBncnVwb3MgaW5kZXBlbmRpZW50ZXMgeSBwdWVkZSBjb21wbGVtZW50YXJzZSBjb24gRHVubi4NCi0gKipLYXBsYW7igJNNZWllcioqIGRlc2NyaWJlIGxhIHByb2JhYmlsaWRhZCBkZSBwZXJtYW5lY2VyIHNpbiBlbCBldmVudG8gYSBsbyBsYXJnbyBkZWwgdGllbXBvLg0KLSAqKkxvZy1SYW5rKiogY29udHJhc3RhIGZvcm1hbG1lbnRlIHNpIHZhcmlhcyBjdXJ2YXMgZGUgc3VwZXJ2aXZlbmNpYSBkaWZpZXJlbi4NCi0gKipDb3gqKiBjdWFudGlmaWNhIGxhIGFzb2NpYWNpw7NuIGVudHJlIHByZWRpY3RvcmVzIHkgZWwgaGF6YXJkIGRlbCBldmVudG8gbWVkaWFudGUgSGF6YXJkIFJhdGlvcyBhanVzdGFkb3MuDQoNCkVuIGNvbmp1bnRvLCBlbCBkb2N1bWVudG8gbXVlc3RyYSBlbCBmbHVqbyBjb21wbGV0byBzb2xpY2l0YWRvOiBwbGFudGVhbWllbnRvIGRlIGxhIHByZWd1bnRhLCBpZGVudGlmaWNhY2nDs24gZGUgdmFyaWFibGVzLCBoaXDDs3Rlc2lzLCBzZWxlY2Npw7NuIGRlIGxhIHBydWViYSwgc3VwdWVzdG9zLCBlamVjdWNpw7NuIGVuIFIsIHZpc3VhbGl6YWNpw7NuLCBpbnRlcnByZXRhY2nDs24gZXN0YWTDrXN0aWNhLCBpbnRlcnByZXRhY2nDs24gdG94aW5vbMOzZ2ljYSB5IGNvbmNsdXNpw7NuLg0KDQo8ZGl2IGNsYXNzPSJub3RlIj4NCioqUGFyYSBsYSBleHBvc2ljacOzbjoqKiBubyBlcyBuZWNlc2FyaW8gZXhwbGljYXIgZWwgY8OzZGlnbyBsw61uZWEgcG9yIGzDrW5lYS4gVXRpbGl6YSBlbCBIVE1MIGNvbW8gZ3XDrWEgdmlzdWFsIHkgY8OpbnRyYXRlIGVuIGxhIHByZWd1bnRhLCBwb3IgcXXDqSBlc2NvZ2lzdGUgbGEgcHJ1ZWJhLCBxdcOpIG11ZXN0cmEgbGEgZ3LDoWZpY2EsIGN1w6FsIGZ1ZSBlbCByZXN1bHRhZG8gcHJpbmNpcGFsIHkgcXXDqSBzaWduaWZpY2EgZGVudHJvIGRlbCBlc2NlbmFyaW8gdG94aW5vbMOzZ2ljbyBzaW11bGFkby4NCjwvZGl2Pg0KDQoNCg==