Proceso para realizar
un contraste de hipótesis
El contraste de hipótesis se desarrolla en una serie
de etapas estructuradas que permiten evaluar, a partir de datos
muestrales, la validez de una afirmación sobre una población.
El procedimiento puede resumirse en las siguientes etapas:
2. Seleccionar el
nivel de significación \(\alpha\) y
consecuentemente, el nivel de confianza asociado.
El nivel de significación \(\alpha\) corresponde a la
probabilidad máxima que se acepta de cometer un error al rechazar la
hipótesis nula cuando esta es verdadera.
Los valores más habituales utilizados son:
- \(\alpha = 0.05\)
- \(\alpha = 0.01\)
Error tipo I
Ocurre cuando se rechaza la hipótesis nula \(H_0\) siendo esta verdadera. Es
decir, se concluye que existe una diferencia o efecto cuando en realidad
no lo hay.
Este error está directamente controlado por el nivel de significación
\(\alpha\).
Error tipo II
Ocurre cuando no se rechaza la hipótesis nula \(H_0\) siendo esta falsa. Es decir,
no se detecta una diferencia o efecto que realmente existe.
En este caso, se está pasando por alto un efecto real.
El nivel de confianza es la probabilidad
complementaria al nivel de significación y expresa el grado de
fiabilidad asociado a un procedimiento de inferencia estadística. Se
denota como:
\[
\text{Nivel de confianza} = 1 - \alpha
\]
Por ejemplo:
- Si \(\alpha = 0{,}05\), el nivel de
confianza es 0,95 (95%).
- Si \(\alpha = 0{,}01\), el nivel de
confianza es 0,99 (99%).
El nivel de confianza debe fijarse antes de realizar el
análisis de los datos, ya que forma parte del diseño del
contraste de hipótesis. No se ajusta en función de los resultados
observados, sino que se establece a priori para controlar la
probabilidad de cometer un error de tipo I y definir el
criterio de decisión del test.
Un nivel de confianza del 95% indica que si se repitiese el muestreo
infinitas veces, aproximadamente el 95% de los intervalos construidos
contendrían el verdadero parámetro poblacional.
3. Recoger la
muestra de datos y seleccionar el tamaño muestral
El tamaño muestral es un factor determinante en la
validez y fiabilidad de un contraste de hipótesis, ya que condiciona
tanto la precisión de las estimaciones como las propiedades del test
estadístico.
En términos generales, un mayor tamaño muestral:
- Reduce la variabilidad de los estimadores, aumentando su
precisión.
- Incrementa la potencia estadística del contraste, es decir, la
capacidad para detectar efectos reales.
- Mejora la robustez del procedimiento frente a fluctuaciones
aleatorias en los datos.
4. Elegir el
estadístico de contraste adecuado y calcularlo
Una vez formuladas las hipótesis, se debe elegir el
estadístico de prueba más adecuado según el tipo de
variable, los supuestos que se cumplan y el objetivo del estudio.
Los principales métodos utilizados en contrastes de
hipótesis son:
Test Z
Se utiliza cuando se quiere contrastar una media y se conoce
la desviación estándar poblacional (σ).
Este caso es habitual en entornos industriales donde el proceso está
bien caracterizado y la variabilidad poblacional puede considerarse
conocida y estable.
Es especialmente apropiado cuando la población es normal o cuando el
tamaño muestral es suficientemente grande, de forma que la distribución
de la media muestral puede aproximarse a una normal en virtud del
Teorema Central del Límite.
En la práctica, se utiliza con frecuencia la regla orientativa \(n \geq 30\), aunque no constituye un
criterio estricto.
El estadístico de contraste se define como
\[
Z = \frac{\bar{x} - \mu_0}{\sigma / \sqrt{n}}
\]
Donde:
- \(\bar{x}\): media muestral de la
temperatura del reactor
- \(\mu_0\): valor de referencia
proporcionado por el fabricante
- \(\sigma\): desviación estándar
poblacional conocida
- \(n\): tamaño de la muestra
Bajo la hipótesis nula \(H_0\), este
estadístico sigue una distribución normal estándar \(\mathcal{N}(0,1)\).
Test t de Student
El test t de Student es el enfoque más habitual
cuando la desviación estándar poblacional es
desconocida.
En este caso, la variabilidad del proceso se estima a partir de la
muestra mediante la desviación estándar muestral
(s).
Es adecuado especialmente cuando:
- El tamaño muestral es pequeño o moderado (\(n < 30\)).
- No se conoce \(\sigma\).
- El proceso se encuentra en régimen estacionario y puede asumirse
aproximadamente normalidad.
Se define como
\[
t = \frac{\bar{x} - \mu_0}{s / \sqrt{n}}
\]
donde:
- \(s\): desviación estándar
muestral
- El resto de variables se definen como en el caso anterior
Bajo la hipótesis nula \(H_0\), este
estadístico sigue una distribución t de Student con \(n - 1\) grados de libertad.
Test Z para dos proporciones
El test Z para dos proporciones se utiliza para
comparar si dos proporciones poblacionales pueden considerarse iguales o
si existen diferencias estadísticamente significativas entre ellas.
Es especialmente útil cuando se desea comparar la frecuencia de
aparición de una característica en dos poblaciones independientes.
Es adecuado cuando:
- Se comparan dos muestras independientes.
- La variable analizada es dicotómica (presencia/ausencia,
éxito/fracaso, detección/no detección).
- Los tamaños muestrales son suficientemente grandes para aproximar la
distribución a una normal.
El estadístico de contraste se define como:
\[
Z =
\frac{\hat{p}_1 - \hat{p}_2}
{\sqrt{\hat{p}(1-\hat{p})
\left(
\frac{1}{n_1}
+
\frac{1}{n_2}
\right)}}
\]
donde:
- \(\hat{p}_1\): proporción muestral
del primer grupo.
- \(\hat{p}_2\): proporción muestral
del segundo grupo.
- \(n_1\): tamaño de la primera
muestra.
- \(n_2\): tamaño de la segunda
muestra.
- \(\hat{p}\): proporción combinada
bajo la hipótesis nula.
La proporción combinada se calcula como:
\[
\hat{p}
=
\frac{x_1+x_2}
{n_1+n_2}
\]
donde \(x_1\) y \(x_2\) representan el número de
observaciones con la característica estudiada en cada muestra.
Bajo la hipótesis nula \(H_0\), el
estadístico sigue aproximadamente una distribución normal
estándar:
\[
Z \sim \mathcal{N}(0,1)
\]
Este contraste se utiliza con frecuencia en estudios de calidad
industrial, epidemiología, ciencias ambientales y análisis comparativos
de materiales, donde el objetivo es determinar si dos poblaciones
presentan proporciones significativamente diferentes.
Test Chi-cuadrado (χ²)
El test Chi-cuadrado se utiliza con
variables categóricas (por ejemplo, tipos, clases o
categorías) y permite comparar lo que se observa en los datos con lo que
se esperaría bajo una hipótesis teórica.
Su objetivo es determinar si las diferencias entre
frecuencias observadas y esperadas son suficientemente grandes como para
indicar que existe una relación entre variables o un desajuste respecto
a un modelo teórico.
Se aplica principalmente en estos contextos:
análisis de independencia entre variables categóricas, comprobación de
la bondad de ajuste de una distribución y comparación de proporciones
entre grupos.
\[
\chi^2 = \sum \frac{(O_i - E_i)^2}{E_i}
\]
donde
- \(O_i\): frecuencia observada en la
categoría \(i\) (datos reales).
- \(E_i\): frecuencia esperada bajo
la hipótesis nula.
- \(O_i - E_i\): diferencia entre lo
observado y lo esperado.
- \((O_i - E_i)^2\): se eleva al
cuadrado para evitar signos negativos y amplificar desviaciones
grandes.
- \(\frac{(O_i - E_i)^2}{E_i}\):
normaliza la desviación respecto al tamaño esperado.
- \(\sum\): suma de todas las
categorías.
Bootstrapping
Es un método computacional muy flexible. No requiere
asumir normalidad ni conocer la distribución poblacional. Consiste en
generar miles de muestras artificiales (con reemplazo) a partir de los
datos originales para estimar la distribución del estadístico.
Es especialmente útil cuando:
- El tamaño de la muestra es pequeño
- Los datos no siguen una distribución normal
- Los supuestos de los tests clásicos no se cumplen
Resumen
comparativo
|
Estadístico
|
Tipo de variable
|
Supuestos principales
|
Tamaño muestral recomendado
|
Coste computacional
|
Uso más frecuente
|
|
Test Z
|
Numérica (media)
|
Normalidad + σ conocida
|
Grande (n ≥ 30)
|
Muy bajo
|
Procesos industriales
|
|
Test t
|
Numérica (media)
|
Normalidad aproximada
|
Pequeño o mediano
|
Bajo
|
Experimentos científicos
|
|
Chi-cuadrado
|
Categórica
|
Frecuencias esperadas ≥ 5
|
Grande
|
Bajo
|
Encuestas
|
|
Bootstrapping
|
Cualquier tipo
|
Muy pocos supuestos
|
Cualquier tamaño
|
Alto
|
Datos no normales o muestras pequeñas
|
|
Z (dos proporciones)
|
Proporciones
|
Muestras independientes y tamaño grande
|
Grande
|
Muy bajo
|
Comparación de proporciones
|
5. Determinación
del valor-p o región crítica asociada al contraste
Una vez seleccionado el estadístico de contraste adecuado, se calcula
su valor a partir de los datos muestrales.
A partir de este valor observado y de la distribución del estadístico
bajo la hipótesis nula \(H_0\), se
obtiene el p-valor, utilizando tablas estadísticas o
software especializado.
¿Qué es el
p-valor?
El p-valor es la probabilidad de obtener un
resultado igual o más extremo que el observado, suponiendo que la
hipótesis nula \(H_0\) es
verdadera.
En otras palabras, mide la compatibilidad entre los datos observados
y la hipótesis nula.
Interpretación del
p-valor
p-valor pequeño (\(p
\leq \alpha\), por ejemplo \(\alpha =
0{,}05\)):
Los datos observados serían poco probables bajo \(H_0\). Se rechaza \(H_0\) y se considera que existe evidencia
estadísticamente significativa a favor de \(H_1\).
p-valor grande (\(p
> \alpha\)):
Los datos son compatibles con \(H_0\).
No se rechaza \(H_0\), ya que no existe
evidencia suficiente en su contra.
Nota
El p-valor no es la probabilidad de que \(H_0\) sea verdadera.
Solo indica cuán consistentes son los datos con la hipótesis nula.
Regla de
decisión
La decisión en un contraste de hipótesis se basa en la
comparación entre el p-valor y el nivel de significación \(\alpha\):
- Si \(p \leq \alpha\): se rechaza
\(H_0\).
- Si \(p > \alpha\): no se rechaza
\(H_0\).
En un contraste bilateral, el p-valor considera
ambas colas de la distribución, mientras que en un contraste
unilateral se considera una sola cola.
Representación
gráfica de contrastes de hipótesis
A continuación, se muestran dos figuras que ilustran
el comportamiento de los contrastes de hipótesis en sus
versiones bilateral y unilateral.
Figura 1: Contraste bilateral
En un contraste bilateral, la región crítica se
distribuye en ambas colas de la distribución, de modo
que la probabilidad de error \(\alpha\)
se reparte entre los dos extremos. Este enfoque se utiliza cuando la
hipótesis alternativa plantea diferencias en cualquier dirección.

Aquí:
- α (nivel de significación) representa la
probabilidad total de cometer un error de tipo I (rechazar H₀ siendo
verdadera).
- Este riesgo se reparte en dos colas: α/2 en cada
extremo de la distribución.
- Las zonas rojas son las regiones críticas donde se
rechaza H₀.
- La zona verde representa el intervalo de no
rechazo, donde no hay evidencia suficiente contra H₀.
- Las líneas discontinuas son los valores críticos
que separan ambas regiones.
Regla visual:
- Si el estadístico cae en rojo → p ≤ α → se rechaza
\(H_0\)
- Si cae en verde → p > α → no se rechaza
\(H_0\)
Figura 2: Contraste unilateral
En un contraste unilateral, la región crítica se
sitúa únicamente en una de las colas de la
distribución, de modo que toda la probabilidad de error α se
concentra en un solo lado en función de la hipótesis alternativa.

Aquí:
- Todo el nivel de significación α se concentra en una sola
cola de la distribución.
- La zona roja representa la región crítica, donde se
rechaza H₀.
- La zona verde es la región de no rechazo (1 −
α).
- El valor crítico marca el punto a partir del cual el estadístico es
suficientemente extremo.
Regla visual:
- Si el estadístico cae en rojo → p ≤ α → rechazo de
\(H_0\)
- Si el estadístico cae en verde → p > α → no
rechazo de \(H_0\)
6. Conclusión.
Toma la decisión estadística
Tras el análisis, se toma la decisión estadística
(rechazar o no rechazar \(H_0\)),
Si se rechaza \(H_0\): se
concluye que existe evidencia suficiente para afirmar que el efecto,
diferencia o relación planteada en \(H_1\) es compatible con los datos
observados.
Si no se rechaza \(H_0\): no se
dispone de evidencia suficiente para afirmar que exista el efecto o
diferencia planteada en \(H_1\), aunque
esto no implica que \(H_0\) sea
necesariamente verdadera.
7. Interpretación
del resultado en el contexto del problema
Una vez tomada la decisión estadística (rechazar o no rechazar \(H_0\)), el resultado debe
interpretarse en términos del problema original.
En este paso se traduce la conclusión estadística a una conclusión
contextual, explicando qué implica la decisión sobre la hipótesis en el
ámbito real del estudio.
Es importante destacar que esta interpretación no afirma que \(H_0\) sea verdadera o falsa, sino que la
evidencia disponible no es suficiente para rechazarla bajo el riesgo de
error establecido.
A continuación, se presentan dos escenarios
prácticos con el objetivo de ejemplificar la aplicación de los
contrastes de hipótesis en contextos reales
🔬 Escenario 1: Control
de temperatura en un reactor industrial
1. Planteamiento del
problema
Se analiza el comportamiento térmico de un reactor
industrial con el objetivo de determinar si la temperatura
media de operación supera el valor de referencia
especificado por el fabricante.
El problema se plantea como un contraste de
hipótesis, ya que temperaturas elevadas de forma sostenida
pueden indicar fallos en el sistema o un funcionamiento anómalo.
2. Población y
variable de estudio
La población está formada por todas las* posibles mediciones
de temperatura del reactor en condiciones normales de
operación.
La variable de estudio es la temperatura
interna del reactor, medida en grados Celsius (°C). Se trata de
una variable cuantitativa continua, ya que puede tomar cualquier valor
dentro de un intervalo.
3. Recogida de
datos
Se obtiene una muestra aleatoria de mediciones de
temperatura del reactor registradas en distintos instantes de tiempo
durante condiciones de funcionamiento estable.
Las observaciones se consideran independientes y
pueden recogerse mediante muestreo aleatorio simple, asegurando que la
muestra sea representativa del comportamiento del sistema.
El tamaño muestral \(n\) debe ser suficientemente
grande para garantizar estabilidad en las estimaciones.
La base de datos incluye, al menos, la temperatura
registrada en cada medición, pudiendo incorporarse también el instante
de registro para fines de trazabilidad y análisis temporal.
5. Nivel de
significación
Se fija el nivel de significación del contraste
en:
\[
\alpha = 0.05, \quad 1 - \alpha = 0.95
\]
Este parámetro determina el umbral de decisión del contraste y
controla la probabilidad de cometer un error de tipo I, es decir,
rechazar la hipótesis nula siendo esta verdadera.
6. Métodos de
contraste posibles
Método principal: t
de Student (σ desconocida)
\[
t = \frac{\bar{x} - \mu_0}{s / \sqrt{n}}
\]
Alternativas
metodológicas
En función de las características de los datos y de los supuestos
disponibles, podrían emplearse otros métodos de contraste:
| Test Z |
Simple |
Requiere σ conocida |
Procesos muy controlados |
| Bootstrapping |
Sin supuestos fuertes |
Coste computacional alto |
Datos no normales |
7. Regla de
decisión
La decisión del contraste se toma comparando el p-valor con
el nivel de significación \(\alpha =
0.05\):
- Si \(p < 0.05\), se rechaza
\(H_0\).
- Si \(p \geq 0.05\), no se rechaza
\(H_0\).
En el contexto del reactor industrial, esta regla permite determinar
si la temperatura media observada es incompatible con el valor de
referencia establecido por el fabricante.
8. Interpretación del
resultado
Rechazo de \(H_0\): se concluye que
existe evidencia estadística de que la temperatura media del
reactor supera el valor de referencia, lo que puede indicar
sobrecalentamiento o una desviación relevante en las condiciones de
operación del sistema.
No rechazo de \(H_0\): no se dispone de
evidencia suficiente para afirmar que la temperatura media supere el
valor de referencia, por lo que el comportamiento térmico del
reactor se considera compatible con la variabilidad normal del
proceso.
☢️ Escenario 2:
Comparación de proporciones de uranio en muestras radiactivas
1. Planteamiento del
problema
Se analiza si dos muestras de material radiactivo
pueden proceder de la misma fuente de origen a partir
de la comparación de la proporción de uranio presente en cada una.
El objetivo es determinar si las diferencias
observadas son atribuibles a variabilidad aleatoria o a diferencias
estructurales entre poblaciones.
2. Poblaciones y
variable de estudio
Se eligen las siguientes poblaciones, ya que
representan posibles fuentes distintas de material radiactivo.
Población 1: muestras de material radiactivo de
origen desconocido A
Población 2: muestras de material radiactivo de
origen desconocido B
Variable de estudio: proporción de uranio en cada
muestra
Tipo: variable categórica/binomial
Interpretación: porcentaje de uranio respecto al total de la
muestra
3. Recogida de
datos
Se obtienen dos muestras independientes procedentes
de cada una de las poblaciones.
En cada una de ellas se registran:
- tamaños muestrales \(n_1\) y \(n_2\)
- número de detecciones de uranio en cada muestra
- cálculo de las proporciones muestrales \(\hat{p}_1\) y \(\hat{p}_2\)
Estas proporciones se obtienen a partir de la frecuencia de detección
de uranio respecto al total de observaciones en cada muestra.
Condiciones del muestreo:
- independencia entre muestras
- control del sesgo instrumental
- condiciones homogéneas de medición para asegurar comparabilidad
5. Nivel de
significación
Se fija el nivel de significación en:
\[
\alpha = 0.05
\] —
6. Métodos de
contraste posibles
Método principal:
contraste Z para dos proporciones de uranio
Se utiliza el estadístico Z (dos proporciones)para
comparar la proporción de uranio entre ambas poblaciones.
\[
Z =
\frac{\hat{p}_1 - \hat{p}_2}
{\sqrt{\hat{p}(1 - \hat{p})\left(\frac{1}{n_1} + \frac{1}{n_2}\right)}}
\]
Este contraste permite evaluar si las diferencias observadas en el
contenido de uranio entre las dos muestras son estadísticamente
significativas.
Alternativa
metodológica
| Chi-cuadrado |
Enfoque alternativo al Z en tablas de contingencia |
Menos directo para interpretación de proporciones |
Verificación de diferencias globales |
A diferencia del contraste de proporciones (Z), que
compara directamente las proporciones estimadas en cada muestra, el
chi-cuadrado mide si las diferencias en el uranio entre
las dos muestras son demasiado grandes como para explicarse solo por
casualidad, evaluando la discrepancia entre las frecuencias observadas y
las que se esperarían si ambas poblaciones fueran iguales.
7. Regla de
decisión
La decisión se basa en comparar el p-valor obtenido
en el contraste sobre la proporción de uranio entre ambas muestras con
el nivel de significación \(\alpha =
0.05\).
- Si \(p < 0.05\) se
rechaza \(H_0\), concluyendo
que existen diferencias significativas en la proporción de uranio entre
las muestras A y B (posible origen distinto).
- Si \(p \geq 0.05\) no se
rechaza \(H_0\), concluyendo
que las diferencias observadas en el contenido de uranio son compatibles
con la variabilidad aleatoria y no hay evidencia de orígenes
distintos.
8. Interpretación del
resultado
A partir del resultado del contraste sobre la proporción de
uranio entre las muestras, la interpretación se conecta
directamente con el objetivo del estudio: determinar si ambas muestras
pueden proceder del mismo origen.
Rechazo de \(H_0\): se concluye que existen
diferencias significativas en la proporción de uranio entre las
muestras. Esto indica que la composición química no es compatible bajo
un mismo patrón de generación, por lo que es razonable considerar que
las muestras podrían proceder de fuentes de origen distintas.
No rechazo de \(H_0\): no se encuentran
diferencias estadísticamente significativas en la proporción de uranio.
En este caso, las variaciones observadas se interpretan como resultado
de la variabilidad aleatoria del muestreo, por lo que los datos son
compatibles con la hipótesis de un mismo origen para ambas
muestras.
Referencias
- Triola, M. F. (2018). Estadística (12ª ed.). Pearson
Educación.
- Elaboración propia con apoyo de inteligencia artificial
(ChatGPT).
LS0tDQp0aXRsZTogIkVzdGFkw61zdGljYSBpbmZlcmVuY2lhbDogZGVsIGFuw6FsaXNpcyBtdWVzdHJhbCBhIGxhIHByZWRpY2Npw7NuIHBvYmxhY2lvbmFsIg0KYXV0aG9yOiAiSXJpcyBZYWfDvGUgSW5nbGFkYSINCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCm91dHB1dDoNCiAgcm1hcmtkb3duOjpodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogMw0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlDQogICAgdGhlbWU6IGNvc21vDQogICAgaGlnaGxpZ2h0OiBrYXRlDQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNzczogImVzdGlsb3MtaW1wcmVzaW9uLmNzcyIgICAjIDwtLSBpbXBvcnRhbnRlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoDQogIGVjaG8gPSBUUlVFLA0KICB3YXJuaW5nID0gRkFMU0UsDQogIG1lc3NhZ2UgPSBGQUxTRSwNCiAgZmlnLmFsaWduID0gImNlbnRlciIsDQogIGZpZy53aWR0aCA9IDksDQogIGZpZy5oZWlnaHQgPSA1LjUsDQogIG91dC53aWR0aCA9ICIxMDAlIg0KKQ0KYGBgDQojIyBPYmpldGl2b3MgDQoNCkVzdGUgc2l0aW8gd2ViIHRpZW5lIGNvbW8gb2JqZXRpdm8gcHJlc2VudGFyIGxvcyAqKmZ1bmRhbWVudG9zIGRlIGxhIGVzdGFkw61zdGljYSBpbmZlcmVuY2lhbCoqIHkgc3UgYXBsaWNhY2nDs24gZW4gZWwgYW7DoWxpc2lzIGRlIGRhdG9zLg0KDQotLS0NCg0KIyDCv1F1w6kgZXMgbGEgZXN0YWTDrXN0aWNhIGluZmVyZW5jaWFsPyANCg0KTGEgKiplc3RhZMOtc3RpY2EgaW5mZXJlbmNpYWwqKiBlcyB1bmEgcmFtYSBkZSBsYSAqKmVzdGFkw61zdGljYSoqIHF1ZSBwZXJtaXRlIGV4dHJhZXIgY29uY2x1c2lvbmVzIHNvYnJlIHVuYSBwb2JsYWNpw7NuIGEgcGFydGlyIGRlbCBhbsOhbGlzaXMgZGUgdW5hIG11ZXN0cmEuIFN1IHJlbGV2YW5jaWEgcmFkaWNhIGVuIHF1ZSwgZW4gbGEgbWF5b3LDrWEgZGUgc2l0dWFjaW9uZXMgcmVhbGVzLCByZXN1bHRhIGludmlhYmxlIGVzdHVkaWFyIGxhIHRvdGFsaWRhZCBkZSBsb3MgaW5kaXZpZHVvcyBkZSB1bmEgcG9ibGFjacOzbiwgcG9yIGxvIHF1ZSBzZSBlbXBsZWFuIG3DqXRvZG9zIHByb2JhYmlsw61zdGljb3MgeSBoZXJyYW1pZW50YXMgbWF0ZW3DoXRpY2FzIHBhcmEgcmVhbGl6YXIgZXN0aW1hY2lvbmVzIHkgdG9tYXIgZGVjaXNpb25lcyBmdW5kYW1lbnRhZGFzIChUcmlvbGEsIDIwMTgpLg0KDQpFbnRyZSBsYXMgaGVycmFtaWVudGFzIHV0aWxpemFkYXMgZW4gZXN0YWTDrXN0aWNhIGluZmVyZW5jaWFsIGRlc3RhY2FuIGxvcyAqKmNvbnRyYXN0ZXMgZGUgaGlww7N0ZXNpcyoqLg0KPGJyPg0KDQojIMK/UXXDqSBzb24gbG9zIGNvbnRyYXN0ZXMgZGUgaGlww7N0ZXNpcz8NCg0KKipVbiBjb250cmFzdGUgZGUgaGlww7N0ZXNpcyoqIGVzIHVuIHByb2NlZGltaWVudG8gZXN0YWTDrXN0aWNvIHF1ZSBwZXJtaXRlIGRlY2lkaXIsIGEgcGFydGlyIGRlIHVuYSBtdWVzdHJhIGRlIGRhdG9zLCBzaSBsYSBldmlkZW5jaWEgb2JzZXJ2YWRhIGVzIGNvbXBhdGlibGUgbyBubyBjb24gbGEgaGlww7N0ZXNpcyBudWxhIHBsYW50ZWFkYSAoVHJpb2xhLCAyMDE4KS4NCg0KRXN0ZSBtw6l0b2RvIGNvbnN0aXR1eWUgdW5hIGRlIGxhcyBiYXNlcyBmdW5kYW1lbnRhbGVzIGRlIGxhIGluZmVyZW5jaWEgZXN0YWTDrXN0aWNhIHkgc2UgdXRpbGl6YSBhbXBsaWFtZW50ZSBlbiB0b2RvIHRpcG8gZGUgZGlzY2lwbGluYXMgY2llbnTDrWZpY2FzLCBtw6lkaWNhcywgaW5kdXN0cmlhbGVzIHkgc29jaWFsZXMgKFRyaW9sYSwgMjAxOCkuDQoNCioqRW50cmUgc3VzIG9iamV0aXZvcyBwcmluY2lwYWxlcyBlc3TDoW46KioNCg0KLSBFdmFsdWFyIGFmaXJtYWNpb25lcyBzb2JyZSBwYXLDoW1ldHJvcyBwb2JsYWNpb25hbGVzLg0KLSBEZXRlcm1pbmFyIHNpIGxhcyBkaWZlcmVuY2lhcyBvYnNlcnZhZGFzIHB1ZWRlbiBhdHJpYnVpcnNlIGFsIGF6YXIuDQotIEZhY2lsaXRhciBsYSB0b21hIGRlIGRlY2lzaW9uZXMgZW4gc2l0dWFjaW9uZXMgZGUgaW5jZXJ0aWR1bWJyZSBlc3RhZMOtc3RpY2EuDQoNCjxicj4NCg0KIyBQcm9jZXNvIHBhcmEgcmVhbGl6YXIgdW4gY29udHJhc3RlIGRlIGhpcMOzdGVzaXMNCg0KKipFbCBjb250cmFzdGUgZGUgaGlww7N0ZXNpcyoqIHNlIGRlc2Fycm9sbGEgZW4gdW5hIHNlcmllIGRlIGV0YXBhcyBlc3RydWN0dXJhZGFzIHF1ZSBwZXJtaXRlbiBldmFsdWFyLCBhIHBhcnRpciBkZSBkYXRvcyBtdWVzdHJhbGVzLCBsYSB2YWxpZGV6IGRlIHVuYSBhZmlybWFjacOzbiBzb2JyZSB1bmEgcG9ibGFjacOzbi4gDQoNCg0KRWwgcHJvY2VkaW1pZW50byBwdWVkZSByZXN1bWlyc2UgZW4gbGFzIHNpZ3VpZW50ZXMgZXRhcGFzOg0KDQoNCiMjIyAxLiBGb3JtdWxhciBsYXMgaGlww7N0ZXNpcw0KDQpTZSBwYXJ0ZSBkZSBsYSBmb3JtdWxhY2nDs24gZGUgdW5hICoqaGlww7N0ZXNpcyBlc3RhZMOtc3RpY2EqKiBxdWUgcGVybWl0YSBjb250cmFzdGFyIGxhIGV4aXN0ZW5jaWEgZGUgdW4gZWZlY3RvIG8gZGlmZXJlbmNpYSBzaWduaWZpY2F0aXZhIGVuIGVsIHNpc3RlbWEgYW5hbGl6YWRvLiBTZSBkaXN0aW5ndWUgZW50cmUgKipoaXDDs3Rlc2lzIG51bGEgXChIXzBcKSBlIGhpcMOzdGVzaXMgYWx0ZXJuYXRpdmEgXChIXzFcKSoqIChUcmlvbGEsIDIwMTgpLg0KDQoNCioqTGEgaGlww7N0ZXNpcyBudWxhIFwoSF8wXCkqKiBzZSBkZWZpbmUgY29tbyBsYSBhZmlybWFjacOzbiBkZSByZWZlcmVuY2lhIHF1ZSBzZSBhc3VtZSB2w6FsaWRhIGluaWNpYWxtZW50ZSB5IHF1ZSBzZSBzb21ldGUgYSBjb250cmFzdGUgY29uIGxvcyBkYXRvcyBwYXJhIGV2YWx1YXIgc3UgY29tcGF0aWJpbGlkYWQgY29uIGxhIGV2aWRlbmNpYSBtdWVzdHJhbC4NCg0KDQoqKkxhIGhpcMOzdGVzaXMgYWx0ZXJuYXRpdmEgXChIXzFcKSoqIHJlcHJlc2VudGEgbGEgYWZpcm1hY2nDs24gY29udHJhcmlhIGEgbGEgaGlww7N0ZXNpcyBudWxhIHkgcmVjb2dlIGxvcyB2YWxvcmVzIGRlbCBwYXLDoW1ldHJvIHF1ZSBubyBzb24gY29tcGF0aWJsZXMgY29uIGxhIGhpcMOzdGVzaXMgbnVsYS4gDQoNCkVuIGZ1bmNpw7NuIGRlbCB0aXBvIGRlIGNvbnRyYXN0ZSwgbGEgaGlww7N0ZXNpcyBhbHRlcm5hdGl2YSBwdWVkZSBmb3JtdWxhcnNlIGNvbW8gdW5hICoqYWZpcm1hY2nDs24gYmlsYXRlcmFsKiosIGN1YW5kbyBzZSBwbGFudGVhIHNpbXBsZW1lbnRlIGxhIGV4aXN0ZW5jaWEgZGUgdW5hIGRpZmVyZW5jaWEgcmVzcGVjdG8gYWwgdmFsb3IgZGUgcmVmZXJlbmNpYSwgbyBjb21vIHVuYSAqKmFmaXJtYWNpw7NuIHVuaWxhdGVyYWwqKiwgY3VhbmRvIHNlIGVzcGVjaWZpY2EgbGEgZGlyZWNjacOzbiBkZSBkaWNoYSBkZXN2aWFjacOzbiAobWF5b3IgbyBtZW5vciBxdWUgZWwgdmFsb3IgaGlwb3RldGl6YWRvKS4gDQoNCkVzdGEgZWxlY2Npw7NuIG5vIGVzIGFyYml0cmFyaWEsIHNpbm8gcXVlIGRlcGVuZGUgZGlyZWN0YW1lbnRlIGRlbCBvYmpldGl2byBkZWwgZXN0dWRpbyB5IGRlIGxhIGZvcm11bGFjacOzbiBkZWwgcHJvYmxlbWEsIHlhIHF1ZSBkZXRlcm1pbmEgbGEgcmVnacOzbiBkZSByZWNoYXpvIHksIHBvciB0YW50bywgbGEgc2Vuc2liaWxpZGFkIGRlbCBjb250cmFzdGUgZnJlbnRlIGEgZGlzdGludG9zIHRpcG9zIGRlIGRlc3ZpYWNpb25lcyByZXNwZWN0byBhIGxhIGhpcMOzdGVzaXMgbnVsYS4NCg0KLS0tDQoNCiMjIyAyLiBTZWxlY2Npb25hciBlbCBuaXZlbCBkZSBzaWduaWZpY2FjacOzbiBcKFxhbHBoYVwpIHkgY29uc2VjdWVudGVtZW50ZSwgZWwgbml2ZWwgZGUgY29uZmlhbnphIGFzb2NpYWRvLg0KDQoqKkVsIG5pdmVsIGRlIHNpZ25pZmljYWNpw7NuIFwoXGFscGhhXCkqKiBjb3JyZXNwb25kZSBhIGxhIHByb2JhYmlsaWRhZCBtw6F4aW1hIHF1ZSBzZSBhY2VwdGEgZGUgY29tZXRlciB1biBlcnJvciBhbCByZWNoYXphciBsYSBoaXDDs3Rlc2lzIG51bGEgY3VhbmRvIGVzdGEgZXMgdmVyZGFkZXJhLg0KDQoqKkxvcyB2YWxvcmVzIG3DoXMgaGFiaXR1YWxlcyB1dGlsaXphZG9zIHNvbjoqKg0KDQotIFwoXGFscGhhID0gMC4wNVwpDQotIFwoXGFscGhhID0gMC4wMVwpDQoNCg0KKipFcnJvciB0aXBvIEkqKg0KDQpPY3VycmUgY3VhbmRvICoqc2UgcmVjaGF6YSBsYSBoaXDDs3Rlc2lzIG51bGEgXChIXzBcKSBzaWVuZG8gZXN0YSB2ZXJkYWRlcmEqKi4gRXMgZGVjaXIsIHNlIGNvbmNsdXllIHF1ZSBleGlzdGUgdW5hIGRpZmVyZW5jaWEgbyBlZmVjdG8gY3VhbmRvIGVuIHJlYWxpZGFkIG5vIGxvIGhheS4NCg0KRXN0ZSBlcnJvciBlc3TDoSBkaXJlY3RhbWVudGUgY29udHJvbGFkbyBwb3IgZWwgbml2ZWwgZGUgc2lnbmlmaWNhY2nDs24gXChcYWxwaGFcKS4NCg0KICoqRXJyb3IgdGlwbyBJSSoqDQoNCk9jdXJyZSBjdWFuZG8gKipubyBzZSByZWNoYXphIGxhIGhpcMOzdGVzaXMgbnVsYSBcKEhfMFwpIHNpZW5kbyBlc3RhIGZhbHNhKiouIEVzIGRlY2lyLCBubyBzZSBkZXRlY3RhIHVuYSBkaWZlcmVuY2lhIG8gZWZlY3RvIHF1ZSByZWFsbWVudGUgZXhpc3RlLg0KDQpFbiBlc3RlIGNhc28sIHNlIGVzdMOhIHBhc2FuZG8gcG9yIGFsdG8gdW4gZWZlY3RvIHJlYWwuDQoNCg0KKipFbCBuaXZlbCBkZSBjb25maWFuemEqKiBlcyBsYSBwcm9iYWJpbGlkYWQgY29tcGxlbWVudGFyaWEgYWwgbml2ZWwgZGUgc2lnbmlmaWNhY2nDs24geSBleHByZXNhIGVsIGdyYWRvIGRlIGZpYWJpbGlkYWQgYXNvY2lhZG8gYSB1biBwcm9jZWRpbWllbnRvIGRlIGluZmVyZW5jaWEgZXN0YWTDrXN0aWNhLiBTZSBkZW5vdGEgY29tbzoNCg0KXFsNClx0ZXh0e05pdmVsIGRlIGNvbmZpYW56YX0gPSAxIC0gXGFscGhhDQpcXQ0KDQpQb3IgZWplbXBsbzoNCg0KLSBTaSBcKFxhbHBoYSA9IDB7LH0wNVwpLCBlbCBuaXZlbCBkZSBjb25maWFuemEgZXMgMCw5NSAoOTUlKS4NCi0gU2kgXChcYWxwaGEgPSAweyx9MDFcKSwgZWwgbml2ZWwgZGUgY29uZmlhbnphIGVzIDAsOTkgKDk5JSkuDQoNCkVsIG5pdmVsIGRlIGNvbmZpYW56YSBkZWJlIGZpamFyc2UgKiphbnRlcyBkZSByZWFsaXphciBlbCBhbsOhbGlzaXMgZGUgbG9zIGRhdG9zKiosIHlhIHF1ZSBmb3JtYSBwYXJ0ZSBkZWwgZGlzZcOxbyBkZWwgY29udHJhc3RlIGRlIGhpcMOzdGVzaXMuIE5vIHNlIGFqdXN0YSBlbiBmdW5jacOzbiBkZSBsb3MgcmVzdWx0YWRvcyBvYnNlcnZhZG9zLCBzaW5vIHF1ZSBzZSBlc3RhYmxlY2UgYSBwcmlvcmkgcGFyYSBjb250cm9sYXIgbGEgcHJvYmFiaWxpZGFkIGRlIGNvbWV0ZXIgdW4gKiplcnJvciBkZSB0aXBvIEkqKiB5IGRlZmluaXIgZWwgY3JpdGVyaW8gZGUgZGVjaXNpw7NuIGRlbCB0ZXN0Lg0KDQpVbiBuaXZlbCBkZSBjb25maWFuemEgZGVsIDk1JSBpbmRpY2EgcXVlIHNpIHNlIHJlcGl0aWVzZSBlbCBtdWVzdHJlbyBpbmZpbml0YXMgdmVjZXMsIGFwcm94aW1hZGFtZW50ZSBlbCA5NSUgZGUgbG9zIGludGVydmFsb3MgY29uc3RydWlkb3MgY29udGVuZHLDrWFuIGVsIHZlcmRhZGVybyBwYXLDoW1ldHJvIHBvYmxhY2lvbmFsLg0KDQotLS0NCg0KIyMjIDMuIFJlY29nZXIgbGEgbXVlc3RyYSBkZSBkYXRvcyB5IHNlbGVjY2lvbmFyIGVsIHRhbWHDsW8gbXVlc3RyYWwNCg0KKipFbCB0YW1hw7FvIG11ZXN0cmFsKiogZXMgdW4gZmFjdG9yIGRldGVybWluYW50ZSBlbiBsYSB2YWxpZGV6IHkgZmlhYmlsaWRhZCBkZSB1biBjb250cmFzdGUgZGUgaGlww7N0ZXNpcywgeWEgcXVlIGNvbmRpY2lvbmEgdGFudG8gbGEgcHJlY2lzacOzbiBkZSBsYXMgZXN0aW1hY2lvbmVzIGNvbW8gbGFzIHByb3BpZWRhZGVzIGRlbCB0ZXN0IGVzdGFkw61zdGljby4NCg0KRW4gdMOpcm1pbm9zIGdlbmVyYWxlcywgdW4gKiptYXlvciB0YW1hw7FvIG11ZXN0cmFsKio6DQoNCi0gUmVkdWNlIGxhIHZhcmlhYmlsaWRhZCBkZSBsb3MgZXN0aW1hZG9yZXMsIGF1bWVudGFuZG8gc3UgcHJlY2lzacOzbi4NCi0gSW5jcmVtZW50YSBsYSBwb3RlbmNpYSBlc3RhZMOtc3RpY2EgZGVsIGNvbnRyYXN0ZSwgZXMgZGVjaXIsIGxhIGNhcGFjaWRhZCBwYXJhIGRldGVjdGFyIGVmZWN0b3MgcmVhbGVzLg0KLSBNZWpvcmEgbGEgcm9idXN0ZXogZGVsIHByb2NlZGltaWVudG8gZnJlbnRlIGEgZmx1Y3R1YWNpb25lcyBhbGVhdG9yaWFzIGVuIGxvcyBkYXRvcy4NCg0KLS0tDQoNCiMjIyA0LiBFbGVnaXIgZWwgZXN0YWTDrXN0aWNvIGRlIGNvbnRyYXN0ZSBhZGVjdWFkbyB5IGNhbGN1bGFybG8NCg0KVW5hIHZleiBmb3JtdWxhZGFzIGxhcyBoaXDDs3Rlc2lzLCBzZSBkZWJlIGVsZWdpciBlbCAqKmVzdGFkw61zdGljbyBkZSBwcnVlYmEqKiBtw6FzIGFkZWN1YWRvIHNlZ8O6biBlbCB0aXBvIGRlIHZhcmlhYmxlLCBsb3Mgc3VwdWVzdG9zIHF1ZSBzZSBjdW1wbGFuIHkgZWwgb2JqZXRpdm8gZGVsIGVzdHVkaW8uDQoNCkxvcyBwcmluY2lwYWxlcyAqKm3DqXRvZG9zIHV0aWxpemFkb3MgZW4gY29udHJhc3RlcyBkZSBoaXDDs3Rlc2lzKiogc29uOg0KDQoqKlRlc3QgWioqDQoNClNlIHV0aWxpemEgY3VhbmRvIHNlIHF1aWVyZSAqKmNvbnRyYXN0YXIgdW5hIG1lZGlhIHkgc2UgY29ub2NlIGxhIGRlc3ZpYWNpw7NuIGVzdMOhbmRhciBwb2JsYWNpb25hbCAoz4MpLioqDQoNCkVzdGUgY2FzbyBlcyBoYWJpdHVhbCBlbiBlbnRvcm5vcyBpbmR1c3RyaWFsZXMgZG9uZGUgZWwgcHJvY2VzbyBlc3TDoSBiaWVuIGNhcmFjdGVyaXphZG8geSBsYSB2YXJpYWJpbGlkYWQgcG9ibGFjaW9uYWwgcHVlZGUgY29uc2lkZXJhcnNlIGNvbm9jaWRhIHkgZXN0YWJsZS4NCg0KRXMgZXNwZWNpYWxtZW50ZSBhcHJvcGlhZG8gY3VhbmRvIGxhIHBvYmxhY2nDs24gZXMgbm9ybWFsIG8gY3VhbmRvIGVsIHRhbWHDsW8gbXVlc3RyYWwgZXMgc3VmaWNpZW50ZW1lbnRlIGdyYW5kZSwgZGUgZm9ybWEgcXVlIGxhIGRpc3RyaWJ1Y2nDs24gZGUgbGEgbWVkaWEgbXVlc3RyYWwgcHVlZGUgYXByb3hpbWFyc2UgYSB1bmEgbm9ybWFsIGVuIHZpcnR1ZCBkZWwgVGVvcmVtYSBDZW50cmFsIGRlbCBMw61taXRlLiANCg0KRW4gbGEgcHLDoWN0aWNhLCBzZSB1dGlsaXphIGNvbiBmcmVjdWVuY2lhIGxhIHJlZ2xhIG9yaWVudGF0aXZhIFwobiBcZ2VxIDMwXCksIGF1bnF1ZSBubyBjb25zdGl0dXllIHVuIGNyaXRlcmlvIGVzdHJpY3RvLg0KDQoqKkVsIGVzdGFkw61zdGljbyBkZSBjb250cmFzdGUgc2UgZGVmaW5lIGNvbW8qKg0KDQokJA0KWiA9IFxmcmFje1xiYXJ7eH0gLSBcbXVfMH17XHNpZ21hIC8gXHNxcnR7bn19DQokJA0KDQpEb25kZToNCg0KLSBcKFxiYXJ7eH1cKTogbWVkaWEgbXVlc3RyYWwgZGUgbGEgdGVtcGVyYXR1cmEgZGVsIHJlYWN0b3IgIA0KLSBcKFxtdV8wXCk6IHZhbG9yIGRlIHJlZmVyZW5jaWEgcHJvcG9yY2lvbmFkbyBwb3IgZWwgZmFicmljYW50ZSAgDQotIFwoXHNpZ21hXCk6IGRlc3ZpYWNpw7NuIGVzdMOhbmRhciBwb2JsYWNpb25hbCBjb25vY2lkYSAgDQotIFwoblwpOiB0YW1hw7FvIGRlIGxhIG11ZXN0cmENCg0KQmFqbyBsYSBoaXDDs3Rlc2lzIG51bGEgXChIXzBcKSwgZXN0ZSBlc3RhZMOtc3RpY28gc2lndWUgdW5hICoqZGlzdHJpYnVjacOzbiBub3JtYWwgZXN0w6FuZGFyIFwoIFxtYXRoY2Fse059KDAsMSkgXCkuKioNCg0KLS0tDQoNCioqVGVzdCB0IGRlIFN0dWRlbnQqKg0KDQpFbCAqKnRlc3QgdCBkZSBTdHVkZW50KiogZXMgZWwgZW5mb3F1ZSBtw6FzIGhhYml0dWFsIGN1YW5kbyAqKmxhIGRlc3ZpYWNpw7NuIGVzdMOhbmRhciBwb2JsYWNpb25hbCBlcyBkZXNjb25vY2lkYS4qKiANCg0KRW4gZXN0ZSBjYXNvLCBsYSB2YXJpYWJpbGlkYWQgZGVsIHByb2Nlc28gc2UgZXN0aW1hIGEgcGFydGlyIGRlIGxhIG11ZXN0cmEgbWVkaWFudGUgbGEgKipkZXN2aWFjacOzbiBlc3TDoW5kYXIgbXVlc3RyYWwgKHMpKiouDQoNCioqRXMgYWRlY3VhZG8gZXNwZWNpYWxtZW50ZSBjdWFuZG86KioNCg0KLSBFbCB0YW1hw7FvIG11ZXN0cmFsIGVzIHBlcXVlw7FvIG8gbW9kZXJhZG8gKFwobiA8IDMwXCkpLg0KLSBObyBzZSBjb25vY2UgXChcc2lnbWFcKS4NCi0gRWwgcHJvY2VzbyBzZSBlbmN1ZW50cmEgZW4gcsOpZ2ltZW4gZXN0YWNpb25hcmlvIHkgcHVlZGUgYXN1bWlyc2UgYXByb3hpbWFkYW1lbnRlIG5vcm1hbGlkYWQuDQoNClNlIGRlZmluZSBjb21vDQoNCiQkDQp0ID0gXGZyYWN7XGJhcnt4fSAtIFxtdV8wfXtzIC8gXHNxcnR7bn19DQokJA0KDQpkb25kZToNCg0KLSBcKHNcKTogZGVzdmlhY2nDs24gZXN0w6FuZGFyIG11ZXN0cmFsICANCi0gRWwgcmVzdG8gZGUgdmFyaWFibGVzIHNlIGRlZmluZW4gY29tbyBlbiBlbCBjYXNvIGFudGVyaW9yICANCg0KQmFqbyBsYSBoaXDDs3Rlc2lzIG51bGEgXChIXzBcKSwgZXN0ZSBlc3RhZMOtc3RpY28gc2lndWUgdW5hICoqZGlzdHJpYnVjacOzbiB0IGRlIFN0dWRlbnQgY29uIFwobiAtIDFcKSBncmFkb3MgZGUgbGliZXJ0YWQuKioNCg0KLS0tDQoNCioqVGVzdCBaIHBhcmEgZG9zIHByb3BvcmNpb25lcyoqDQoNCkVsICoqdGVzdCBaIHBhcmEgZG9zIHByb3BvcmNpb25lcyoqIHNlIHV0aWxpemEgcGFyYSBjb21wYXJhciBzaSBkb3MgcHJvcG9yY2lvbmVzIHBvYmxhY2lvbmFsZXMgcHVlZGVuIGNvbnNpZGVyYXJzZSBpZ3VhbGVzIG8gc2kgZXhpc3RlbiBkaWZlcmVuY2lhcyBlc3RhZMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZhcyBlbnRyZSBlbGxhcy4NCg0KRXMgZXNwZWNpYWxtZW50ZSDDunRpbCBjdWFuZG8gc2UgZGVzZWEgY29tcGFyYXIgbGEgZnJlY3VlbmNpYSBkZSBhcGFyaWNpw7NuIGRlIHVuYSBjYXJhY3RlcsOtc3RpY2EgZW4gZG9zIHBvYmxhY2lvbmVzIGluZGVwZW5kaWVudGVzLg0KDQoqKkVzIGFkZWN1YWRvIGN1YW5kbzoqKg0KDQotIFNlIGNvbXBhcmFuIGRvcyBtdWVzdHJhcyBpbmRlcGVuZGllbnRlcy4NCi0gTGEgdmFyaWFibGUgYW5hbGl6YWRhIGVzIGRpY290w7NtaWNhIChwcmVzZW5jaWEvYXVzZW5jaWEsIMOpeGl0by9mcmFjYXNvLCBkZXRlY2Npw7NuL25vIGRldGVjY2nDs24pLg0KLSBMb3MgdGFtYcOxb3MgbXVlc3RyYWxlcyBzb24gc3VmaWNpZW50ZW1lbnRlIGdyYW5kZXMgcGFyYSBhcHJveGltYXIgbGEgZGlzdHJpYnVjacOzbiBhIHVuYSBub3JtYWwuDQoNCioqRWwgZXN0YWTDrXN0aWNvIGRlIGNvbnRyYXN0ZSBzZSBkZWZpbmUgY29tbzoqKg0KDQokJA0KWiA9DQpcZnJhY3tcaGF0e3B9XzEgLSBcaGF0e3B9XzJ9DQp7XHNxcnR7XGhhdHtwfSgxLVxoYXR7cH0pDQpcbGVmdCgNClxmcmFjezF9e25fMX0NCisNClxmcmFjezF9e25fMn0NClxyaWdodCl9fQ0KJCQNCg0KZG9uZGU6DQoNCi0gXChcaGF0e3B9XzFcKTogcHJvcG9yY2nDs24gbXVlc3RyYWwgZGVsIHByaW1lciBncnVwby4NCi0gXChcaGF0e3B9XzJcKTogcHJvcG9yY2nDs24gbXVlc3RyYWwgZGVsIHNlZ3VuZG8gZ3J1cG8uDQotIFwobl8xXCk6IHRhbWHDsW8gZGUgbGEgcHJpbWVyYSBtdWVzdHJhLg0KLSBcKG5fMlwpOiB0YW1hw7FvIGRlIGxhIHNlZ3VuZGEgbXVlc3RyYS4NCi0gXChcaGF0e3B9XCk6IHByb3BvcmNpw7NuIGNvbWJpbmFkYSBiYWpvIGxhIGhpcMOzdGVzaXMgbnVsYS4NCg0KTGEgcHJvcG9yY2nDs24gY29tYmluYWRhIHNlIGNhbGN1bGEgY29tbzoNCg0KJCQNClxoYXR7cH0NCj0NClxmcmFje3hfMSt4XzJ9DQp7bl8xK25fMn0NCiQkDQoNCmRvbmRlIFwoeF8xXCkgeSBcKHhfMlwpIHJlcHJlc2VudGFuIGVsIG7Dum1lcm8gZGUgb2JzZXJ2YWNpb25lcyBjb24gbGEgY2FyYWN0ZXLDrXN0aWNhIGVzdHVkaWFkYSBlbiBjYWRhIG11ZXN0cmEuDQoNCkJham8gbGEgaGlww7N0ZXNpcyBudWxhIFwoSF8wXCksIGVsIGVzdGFkw61zdGljbyBzaWd1ZSBhcHJveGltYWRhbWVudGUgdW5hICoqZGlzdHJpYnVjacOzbiBub3JtYWwgZXN0w6FuZGFyKio6DQoNCiQkDQpaIFxzaW0gXG1hdGhjYWx7Tn0oMCwxKQ0KJCQNCg0KRXN0ZSBjb250cmFzdGUgc2UgdXRpbGl6YSBjb24gZnJlY3VlbmNpYSBlbiBlc3R1ZGlvcyBkZSBjYWxpZGFkIGluZHVzdHJpYWwsIGVwaWRlbWlvbG9nw61hLCBjaWVuY2lhcyBhbWJpZW50YWxlcyB5IGFuw6FsaXNpcyBjb21wYXJhdGl2b3MgZGUgbWF0ZXJpYWxlcywgZG9uZGUgZWwgb2JqZXRpdm8gZXMgZGV0ZXJtaW5hciBzaSBkb3MgcG9ibGFjaW9uZXMgcHJlc2VudGFuIHByb3BvcmNpb25lcyBzaWduaWZpY2F0aXZhbWVudGUgZGlmZXJlbnRlcy4NCg0KDQotLS0NCg0KKipUZXN0IENoaS1jdWFkcmFkbyAoz4fCsikqKg0KDQoqKkVsIHRlc3QgQ2hpLWN1YWRyYWRvKiogc2UgdXRpbGl6YSBjb24gKip2YXJpYWJsZXMgY2F0ZWfDs3JpY2FzKiogKHBvciBlamVtcGxvLCB0aXBvcywgY2xhc2VzIG8gY2F0ZWdvcsOtYXMpIHkgcGVybWl0ZSBjb21wYXJhciBsbyBxdWUgc2Ugb2JzZXJ2YSBlbiBsb3MgZGF0b3MgY29uIGxvIHF1ZSBzZSBlc3BlcmFyw61hIGJham8gdW5hIGhpcMOzdGVzaXMgdGXDs3JpY2EuDQoNClN1ICoqb2JqZXRpdm8qKiBlcyBkZXRlcm1pbmFyIHNpIGxhcyBkaWZlcmVuY2lhcyBlbnRyZSBmcmVjdWVuY2lhcyBvYnNlcnZhZGFzIHkgZXNwZXJhZGFzIHNvbiBzdWZpY2llbnRlbWVudGUgZ3JhbmRlcyBjb21vIHBhcmEgaW5kaWNhciBxdWUgZXhpc3RlIHVuYSByZWxhY2nDs24gZW50cmUgdmFyaWFibGVzIG8gdW4gZGVzYWp1c3RlIHJlc3BlY3RvIGEgdW4gbW9kZWxvIHRlw7NyaWNvLg0KDQpTZSBhcGxpY2EgcHJpbmNpcGFsbWVudGUgKiplbiBlc3RvcyBjb250ZXh0b3MqKjogYW7DoWxpc2lzIGRlIGluZGVwZW5kZW5jaWEgZW50cmUgdmFyaWFibGVzIGNhdGVnw7NyaWNhcywgY29tcHJvYmFjacOzbiBkZSBsYSBib25kYWQgZGUgYWp1c3RlIGRlIHVuYSBkaXN0cmlidWNpw7NuIHkgY29tcGFyYWNpw7NuIGRlIHByb3BvcmNpb25lcyBlbnRyZSBncnVwb3MuDQoNClxbDQpcY2hpXjIgPSBcc3VtIFxmcmFjeyhPX2kgLSBFX2kpXjJ9e0VfaX0NClxdDQoNCmRvbmRlDQoNCg0KLSBcKE9faVwpOiBmcmVjdWVuY2lhIG9ic2VydmFkYSBlbiBsYSBjYXRlZ29yw61hIFwoaVwpIChkYXRvcyByZWFsZXMpLg0KLSBcKEVfaVwpOiBmcmVjdWVuY2lhIGVzcGVyYWRhIGJham8gbGEgaGlww7N0ZXNpcyBudWxhLg0KLSBcKE9faSAtIEVfaVwpOiBkaWZlcmVuY2lhIGVudHJlIGxvIG9ic2VydmFkbyB5IGxvIGVzcGVyYWRvLg0KLSBcKChPX2kgLSBFX2kpXjJcKTogc2UgZWxldmEgYWwgY3VhZHJhZG8gcGFyYSBldml0YXIgc2lnbm9zIG5lZ2F0aXZvcyB5IGFtcGxpZmljYXIgZGVzdmlhY2lvbmVzIGdyYW5kZXMuDQotIFwoXGZyYWN7KE9faSAtIEVfaSleMn17RV9pfVwpOiBub3JtYWxpemEgbGEgZGVzdmlhY2nDs24gcmVzcGVjdG8gYWwgdGFtYcOxbyBlc3BlcmFkby4NCi0gXChcc3VtXCk6IHN1bWEgZGUgdG9kYXMgbGFzIGNhdGVnb3LDrWFzLg0KDQotLS0NCg0KKipCb290c3RyYXBwaW5nKioNCg0KRXMgdW4gKiptw6l0b2RvIGNvbXB1dGFjaW9uYWwqKiBtdXkgZmxleGlibGUuIE5vIHJlcXVpZXJlIGFzdW1pciBub3JtYWxpZGFkIG5pIGNvbm9jZXIgbGEgZGlzdHJpYnVjacOzbiBwb2JsYWNpb25hbC4gQ29uc2lzdGUgZW4gZ2VuZXJhciBtaWxlcyBkZSBtdWVzdHJhcyBhcnRpZmljaWFsZXMgKGNvbiByZWVtcGxhem8pIGEgcGFydGlyIGRlIGxvcyBkYXRvcyBvcmlnaW5hbGVzIHBhcmEgZXN0aW1hciBsYSBkaXN0cmlidWNpw7NuIGRlbCBlc3RhZMOtc3RpY28uDQoNCioqRXMgZXNwZWNpYWxtZW50ZSDDunRpbCBjdWFuZG86KioNCg0KLSBFbCB0YW1hw7FvIGRlIGxhIG11ZXN0cmEgZXMgcGVxdWXDsW8gIA0KLSBMb3MgZGF0b3Mgbm8gc2lndWVuIHVuYSBkaXN0cmlidWNpw7NuIG5vcm1hbCAgDQotIExvcyBzdXB1ZXN0b3MgZGUgbG9zIHRlc3RzIGNsw6FzaWNvcyBubyBzZSBjdW1wbGVuICANCg0KLS0tDQoNCiMjIyBSZXN1bWVuIGNvbXBhcmF0aXZvDQoNCjx0YWJsZSBzdHlsZT0iYm9yZGVyLWNvbGxhcHNlOiBzZXBhcmF0ZTsgYm9yZGVyLXNwYWNpbmc6IDAgOHB4OyB3aWR0aDoxMDAlOyI+DQogIDx0cj4NCiAgICA8dGggc3R5bGU9InRleHQtYWxpZ246bGVmdDsgcGFkZGluZzoxMHB4OyI+RXN0YWTDrXN0aWNvPC90aD4NCiAgICA8dGggc3R5bGU9InRleHQtYWxpZ246bGVmdDsgcGFkZGluZzoxMHB4OyI+VGlwbyBkZSB2YXJpYWJsZTwvdGg+DQogICAgPHRoIHN0eWxlPSJ0ZXh0LWFsaWduOmxlZnQ7IHBhZGRpbmc6MTBweDsiPlN1cHVlc3RvcyBwcmluY2lwYWxlczwvdGg+DQogICAgPHRoIHN0eWxlPSJ0ZXh0LWFsaWduOmxlZnQ7IHBhZGRpbmc6MTBweDsiPlRhbWHDsW8gbXVlc3RyYWwgcmVjb21lbmRhZG88L3RoPg0KICAgIDx0aCBzdHlsZT0idGV4dC1hbGlnbjpsZWZ0OyBwYWRkaW5nOjEwcHg7Ij5Db3N0ZSBjb21wdXRhY2lvbmFsPC90aD4NCiAgICA8dGggc3R5bGU9InRleHQtYWxpZ246bGVmdDsgcGFkZGluZzoxMHB4OyI+VXNvIG3DoXMgZnJlY3VlbnRlPC90aD4NCiAgPC90cj4NCg0KICA8dHI+DQogICAgPHRkIHN0eWxlPSJwYWRkaW5nOjEwcHg7Ij5UZXN0IFo8L3RkPg0KICAgIDx0ZCBzdHlsZT0icGFkZGluZzoxMHB4OyI+TnVtw6lyaWNhIChtZWRpYSk8L3RkPg0KICAgIDx0ZCBzdHlsZT0icGFkZGluZzoxMHB4OyI+Tm9ybWFsaWRhZCArIM+DIGNvbm9jaWRhPC90ZD4NCiAgICA8dGQgc3R5bGU9InBhZGRpbmc6MTBweDsiPkdyYW5kZSAobiDiiaUgMzApPC90ZD4NCiAgICA8dGQgc3R5bGU9InBhZGRpbmc6MTBweDsiPk11eSBiYWpvPC90ZD4NCiAgICA8dGQgc3R5bGU9InBhZGRpbmc6MTBweDsiPlByb2Nlc29zIGluZHVzdHJpYWxlczwvdGQ+DQogIDwvdHI+DQoNCiAgPHRyPg0KICAgIDx0ZCBzdHlsZT0icGFkZGluZzoxMHB4OyI+VGVzdCB0PC90ZD4NCiAgICA8dGQgc3R5bGU9InBhZGRpbmc6MTBweDsiPk51bcOpcmljYSAobWVkaWEpPC90ZD4NCiAgICA8dGQgc3R5bGU9InBhZGRpbmc6MTBweDsiPk5vcm1hbGlkYWQgYXByb3hpbWFkYTwvdGQ+DQogICAgPHRkIHN0eWxlPSJwYWRkaW5nOjEwcHg7Ij5QZXF1ZcOxbyBvIG1lZGlhbm88L3RkPg0KICAgIDx0ZCBzdHlsZT0icGFkZGluZzoxMHB4OyI+QmFqbzwvdGQ+DQogICAgPHRkIHN0eWxlPSJwYWRkaW5nOjEwcHg7Ij5FeHBlcmltZW50b3MgY2llbnTDrWZpY29zPC90ZD4NCiAgPC90cj4NCg0KICA8dHI+DQogICAgPHRkIHN0eWxlPSJwYWRkaW5nOjEwcHg7Ij5DaGktY3VhZHJhZG88L3RkPg0KICAgIDx0ZCBzdHlsZT0icGFkZGluZzoxMHB4OyI+Q2F0ZWfDs3JpY2E8L3RkPg0KICAgIDx0ZCBzdHlsZT0icGFkZGluZzoxMHB4OyI+RnJlY3VlbmNpYXMgZXNwZXJhZGFzIOKJpSA1PC90ZD4NCiAgICA8dGQgc3R5bGU9InBhZGRpbmc6MTBweDsiPkdyYW5kZTwvdGQ+DQogICAgPHRkIHN0eWxlPSJwYWRkaW5nOjEwcHg7Ij5CYWpvPC90ZD4NCiAgICA8dGQgc3R5bGU9InBhZGRpbmc6MTBweDsiPkVuY3Vlc3RhczwvdGQ+DQogIDwvdHI+DQoNCiAgPHRyPg0KICAgIDx0ZCBzdHlsZT0icGFkZGluZzoxMHB4OyI+Qm9vdHN0cmFwcGluZzwvdGQ+DQogICAgPHRkIHN0eWxlPSJwYWRkaW5nOjEwcHg7Ij5DdWFscXVpZXIgdGlwbzwvdGQ+DQogICAgPHRkIHN0eWxlPSJwYWRkaW5nOjEwcHg7Ij5NdXkgcG9jb3Mgc3VwdWVzdG9zPC90ZD4NCiAgICA8dGQgc3R5bGU9InBhZGRpbmc6MTBweDsiPkN1YWxxdWllciB0YW1hw7FvPC90ZD4NCiAgICA8dGQgc3R5bGU9InBhZGRpbmc6MTBweDsiPkFsdG88L3RkPg0KICAgIDx0ZCBzdHlsZT0icGFkZGluZzoxMHB4OyI+RGF0b3Mgbm8gbm9ybWFsZXMgbyBtdWVzdHJhcyBwZXF1ZcOxYXM8L3RkPg0KICA8L3RyPg0KICANCiAgPHRyPg0KICA8dGQgc3R5bGU9InBhZGRpbmc6MTBweDsiPlogKGRvcyBwcm9wb3JjaW9uZXMpPC90ZD4NCiAgPHRkIHN0eWxlPSJwYWRkaW5nOjEwcHg7Ij5Qcm9wb3JjaW9uZXM8L3RkPg0KICA8dGQgc3R5bGU9InBhZGRpbmc6MTBweDsiPk11ZXN0cmFzIGluZGVwZW5kaWVudGVzIHkgdGFtYcOxbyBncmFuZGU8L3RkPg0KICA8dGQgc3R5bGU9InBhZGRpbmc6MTBweDsiPkdyYW5kZTwvdGQ+DQogIDx0ZCBzdHlsZT0icGFkZGluZzoxMHB4OyI+TXV5IGJham88L3RkPg0KICA8dGQgc3R5bGU9InBhZGRpbmc6MTBweDsiPkNvbXBhcmFjacOzbiBkZSBwcm9wb3JjaW9uZXM8L3RkPg0KPC90cj4NCjwvdGFibGU+DQoNCg0KDQojIyMgNS4gRGV0ZXJtaW5hY2nDs24gZGVsIHZhbG9yLXAgbyByZWdpw7NuIGNyw610aWNhIGFzb2NpYWRhIGFsIGNvbnRyYXN0ZQ0KDQoNClVuYSB2ZXogc2VsZWNjaW9uYWRvIGVsIGVzdGFkw61zdGljbyBkZSBjb250cmFzdGUgYWRlY3VhZG8sIHNlIGNhbGN1bGEgc3UgdmFsb3IgYSBwYXJ0aXIgZGUgbG9zIGRhdG9zIG11ZXN0cmFsZXMuDQoNCkEgcGFydGlyIGRlIGVzdGUgdmFsb3Igb2JzZXJ2YWRvIHkgZGUgbGEgZGlzdHJpYnVjacOzbiBkZWwgZXN0YWTDrXN0aWNvIGJham8gbGEgaGlww7N0ZXNpcyBudWxhIFwoSF8wXCksIHNlIG9idGllbmUgZWwgKipwLXZhbG9yKiosIHV0aWxpemFuZG8gdGFibGFzIGVzdGFkw61zdGljYXMgbyBzb2Z0d2FyZSBlc3BlY2lhbGl6YWRvLg0KDQoNCiMjIyDCv1F1w6kgZXMgZWwgcC12YWxvcj8NCg0KRWwgKipwLXZhbG9yKiogZXMgbGEgcHJvYmFiaWxpZGFkIGRlIG9idGVuZXIgdW4gcmVzdWx0YWRvIGlndWFsIG8gbcOhcyBleHRyZW1vIHF1ZSBlbCBvYnNlcnZhZG8sIHN1cG9uaWVuZG8gcXVlIGxhIGhpcMOzdGVzaXMgbnVsYSBcKEhfMFwpIGVzIHZlcmRhZGVyYS4NCg0KRW4gb3RyYXMgcGFsYWJyYXMsIG1pZGUgbGEgY29tcGF0aWJpbGlkYWQgZW50cmUgbG9zIGRhdG9zIG9ic2VydmFkb3MgeSBsYSBoaXDDs3Rlc2lzIG51bGEuDQoNCg0KIyMjIEludGVycHJldGFjacOzbiBkZWwgcC12YWxvcg0KDQotICoqcC12YWxvciBwZXF1ZcOxbyoqIChcKHAgXGxlcSBcYWxwaGFcKSwgcG9yIGVqZW1wbG8gXChcYWxwaGEgPSAweyx9MDVcKSk6ICANCiAgTG9zIGRhdG9zIG9ic2VydmFkb3Mgc2Vyw61hbiBwb2NvIHByb2JhYmxlcyBiYWpvIFwoSF8wXCkuIFNlIHJlY2hhemEgXChIXzBcKSB5IHNlIGNvbnNpZGVyYSBxdWUgZXhpc3RlIGV2aWRlbmNpYSBlc3RhZMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZhIGEgZmF2b3IgZGUgXChIXzFcKS4NCg0KLSAqKnAtdmFsb3IgZ3JhbmRlKiogKFwocCA+IFxhbHBoYVwpKTogIA0KICBMb3MgZGF0b3Mgc29uIGNvbXBhdGlibGVzIGNvbiBcKEhfMFwpLiBObyBzZSByZWNoYXphIFwoSF8wXCksIHlhIHF1ZSBubyBleGlzdGUgZXZpZGVuY2lhIHN1ZmljaWVudGUgZW4gc3UgY29udHJhLg0KDQoNCiMjIyBOb3RhIA0KDQpFbCBwLXZhbG9yIG5vIGVzIGxhIHByb2JhYmlsaWRhZCBkZSBxdWUgXChIXzBcKSBzZWEgdmVyZGFkZXJhLiAgDQpTb2xvIGluZGljYSBjdcOhbiBjb25zaXN0ZW50ZXMgc29uIGxvcyBkYXRvcyBjb24gbGEgaGlww7N0ZXNpcyBudWxhLg0KDQoNCiMjIyBSZWdsYSBkZSBkZWNpc2nDs24NCg0KTGEgZGVjaXNpw7NuIGVuIHVuIGNvbnRyYXN0ZSBkZSBoaXDDs3Rlc2lzIHNlIGJhc2EgZW4gbGEgKipjb21wYXJhY2nDs24gZW50cmUgZWwgcC12YWxvciB5IGVsIG5pdmVsIGRlIHNpZ25pZmljYWNpw7NuIFwoXGFscGhhXCkqKjoNCg0KLSBTaSBcKHAgXGxlcSBcYWxwaGFcKTogc2UgcmVjaGF6YSBcKEhfMFwpLg0KLSBTaSBcKHAgPiBcYWxwaGFcKTogbm8gc2UgcmVjaGF6YSBcKEhfMFwpLg0KDQpFbiB1biAqKmNvbnRyYXN0ZSBiaWxhdGVyYWwqKiwgZWwgcC12YWxvciBjb25zaWRlcmEgYW1iYXMgY29sYXMgZGUgbGEgZGlzdHJpYnVjacOzbiwgbWllbnRyYXMgcXVlIGVuIHVuICoqY29udHJhc3RlIHVuaWxhdGVyYWwqKiBzZSBjb25zaWRlcmEgdW5hIHNvbGEgY29sYS4NCg0KLS0tDQoNCiMjIyBSZXByZXNlbnRhY2nDs24gZ3LDoWZpY2EgZGUgY29udHJhc3RlcyBkZSBoaXDDs3Rlc2lzDQoNCkEgY29udGludWFjacOzbiwgc2UgbXVlc3RyYW4gKipkb3MgZmlndXJhcyoqIHF1ZSBpbHVzdHJhbiBlbCBjb21wb3J0YW1pZW50byBkZSBsb3MgKipjb250cmFzdGVzIGRlIGhpcMOzdGVzaXMqKiBlbiBzdXMgdmVyc2lvbmVzIGJpbGF0ZXJhbCB5IHVuaWxhdGVyYWwuDQoNCg0KKipGaWd1cmEgMTogQ29udHJhc3RlIGJpbGF0ZXJhbCoqDQoNCkVuIHVuICoqY29udHJhc3RlIGJpbGF0ZXJhbCoqLCBsYSByZWdpw7NuIGNyw610aWNhIHNlIGRpc3RyaWJ1eWUgZW4gKiphbWJhcyBjb2xhcyBkZSBsYSBkaXN0cmlidWNpw7NuKiosIGRlIG1vZG8gcXVlIGxhIHByb2JhYmlsaWRhZCBkZSBlcnJvciBcKFxhbHBoYVwpIHNlIHJlcGFydGUgZW50cmUgbG9zIGRvcyBleHRyZW1vcy4gRXN0ZSBlbmZvcXVlIHNlIHV0aWxpemEgY3VhbmRvIGxhIGhpcMOzdGVzaXMgYWx0ZXJuYXRpdmEgcGxhbnRlYSBkaWZlcmVuY2lhcyBlbiBjdWFscXVpZXIgZGlyZWNjacOzbi4NCg0KYGBge3IgY3VydmEtaGlwb3Rlc2lzLCBlY2hvPUZBTFNFfQ0KDQpsaWJyYXJ5KGdncGxvdDIpDQoNCiMgRGF0b3MgY3VydmEgbm9ybWFsIGVzdMOhbmRhcg0KeCA8LSBzZXEoLTQsIDQsIGxlbmd0aC5vdXQgPSAxMDAwKQ0KeSA8LSBkbm9ybSh4KQ0KDQpkYXRhIDwtIGRhdGEuZnJhbWUoeCwgeSkNCg0KIyBOaXZlbCBkZSBzaWduaWZpY2FjacOzbg0KYWxwaGEgPC0gMC4wNQ0Kel9jcml0IDwtIHFub3JtKDEgLSBhbHBoYS8yKQ0KDQpnZ3Bsb3QoZGF0YSwgYWVzKHgsIHkpKSArDQogIGdlb21fbGluZShzaXplID0gMSkgKw0KICANCiAgIyBab25hIGRlIG5vIHJlY2hhem8gKDEgLSDOsSkNCiAgZ2VvbV9hcmVhKA0KICAgIGRhdGEgPSBzdWJzZXQoZGF0YSwgeCA+IC16X2NyaXQgJiB4IDwgel9jcml0KSwNCiAgICBhZXMoeCwgeSksDQogICAgZmlsbCA9ICJncmVlbiIsDQogICAgYWxwaGEgPSAwLjI1DQogICkgKw0KICANCiAgIyBab25hcyBjcsOtdGljYXMgKM6xLzIgZW4gY2FkYSBjb2xhKQ0KICBnZW9tX2FyZWEoDQogICAgZGF0YSA9IHN1YnNldChkYXRhLCB4IDw9IC16X2NyaXQpLA0KICAgIGFlcyh4LCB5KSwNCiAgICBmaWxsID0gInJlZCIsDQogICAgYWxwaGEgPSAwLjQNCiAgKSArDQogIA0KICBnZW9tX2FyZWEoDQogICAgZGF0YSA9IHN1YnNldChkYXRhLCB4ID49IHpfY3JpdCksDQogICAgYWVzKHgsIHkpLA0KICAgIGZpbGwgPSAicmVkIiwNCiAgICBhbHBoYSA9IDAuNA0KICApICsNCiAgDQogICMgTMOtbmVhcyBjcsOtdGljYXMNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYygtel9jcml0LCB6X2NyaXQpLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIEV0aXF1ZXRhcyBwcmluY2lwYWxlcw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSAwLCB5ID0gMC4yNSwNCiAgICAgICAgICAgbGFiZWwgPSAiWm9uYSBkZSBubyByZWNoYXpvICgxIC0gzrEpIiwgY29sb3IgPSAiZGFya2dyZWVuIikgKw0KICANCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gLTIuOCwgeSA9IDAuMDUsDQogICAgICAgICAgIGxhYmVsID0gIlpvbmEgY3LDrXRpY2EgzrEvMiIpICsNCiAgDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDIuOCwgeSA9IDAuMDUsDQogICAgICAgICAgIGxhYmVsID0gIlpvbmEgY3LDrXRpY2EgzrEvMiIpICsNCiAgDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDAsIHkgPSAwLjAyLA0KICAgICAgICAgICBsYWJlbCA9ICLOsSA9IDAuMDUg4oaSIHJpZXNnbyBkZSBlcnJvciB0aXBvIEkiLCBjb2xvciA9ICJibGFjayIpICsNCiAgDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQ29udHJhc3RlIGJpbGF0ZXJhbDogZGlzdHJpYnVjacOzbiBub3JtYWwgeSBuaXZlbCBkZSBzaWduaWZpY2FjacOzbiDOsSIsDQogICAgeCA9ICJFc3RhZMOtc3RpY28gWiIsDQogICAgeSA9ICJEZW5zaWRhZCINCiAgKSArDQogIA0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQpBcXXDrToNCg0KLSAqKs6xIChuaXZlbCBkZSBzaWduaWZpY2FjacOzbikqKiByZXByZXNlbnRhIGxhIHByb2JhYmlsaWRhZCB0b3RhbCBkZSBjb21ldGVyIHVuIGVycm9yIGRlIHRpcG8gSSAocmVjaGF6YXIgSOKCgCBzaWVuZG8gdmVyZGFkZXJhKS4NCi0gRXN0ZSByaWVzZ28gc2UgcmVwYXJ0ZSBlbiBkb3MgY29sYXM6ICoqzrEvMiBlbiBjYWRhIGV4dHJlbW8qKiBkZSBsYSBkaXN0cmlidWNpw7NuLg0KLSBMYXMgKip6b25hcyByb2phcyoqIHNvbiBsYXMgcmVnaW9uZXMgY3LDrXRpY2FzIGRvbmRlIHNlIHJlY2hhemEgSOKCgC4NCi0gTGEgKip6b25hIHZlcmRlKiogcmVwcmVzZW50YSBlbCBpbnRlcnZhbG8gZGUgbm8gcmVjaGF6bywgZG9uZGUgbm8gaGF5IGV2aWRlbmNpYSBzdWZpY2llbnRlIGNvbnRyYSBI4oKALg0KLSBMYXMgbMOtbmVhcyBkaXNjb250aW51YXMgc29uIGxvcyAqKnZhbG9yZXMgY3LDrXRpY29zKiogcXVlIHNlcGFyYW4gYW1iYXMgcmVnaW9uZXMuDQoNCg0KKipSZWdsYSB2aXN1YWw6KioNCg0KLSBTaSBlbCBlc3RhZMOtc3RpY28gY2FlIGVuICoqcm9qbyoqIOKGkiBwIOKJpCDOsSDihpIgc2UgcmVjaGF6YSAqKlwoSF8wXCkqKg0KLSBTaSBjYWUgZW4gKip2ZXJkZSoqIOKGkiBwID4gzrEg4oaSIG5vIHNlIHJlY2hhemEgKipcKEhfMFwpKioNCg0KLS0tDQoNCioqRmlndXJhIDI6IENvbnRyYXN0ZSB1bmlsYXRlcmFsKioNCg0KRW4gdW4gKipjb250cmFzdGUgdW5pbGF0ZXJhbCoqLCBsYSByZWdpw7NuIGNyw610aWNhIHNlIHNpdMO6YSDDum5pY2FtZW50ZSBlbiAqKnVuYSBkZSBsYXMgY29sYXMgZGUgbGEgZGlzdHJpYnVjacOzbioqLCBkZSBtb2RvIHF1ZSB0b2RhIGxhIHByb2JhYmlsaWRhZCBkZSBlcnJvciDOsSBzZSBjb25jZW50cmEgZW4gdW4gc29sbyBsYWRvIGVuIGZ1bmNpw7NuIGRlIGxhIGhpcMOzdGVzaXMgYWx0ZXJuYXRpdmEuDQoNCmBgYHtyIGN1cnZhLWhpcG90ZXNpcy11bmlsYXRlcmFsLCBlY2hvPUZBTFNFfQ0KDQpsaWJyYXJ5KGdncGxvdDIpDQoNCnggPC0gc2VxKC00LCA0LCBsZW5ndGgub3V0ID0gMTAwMCkNCnkgPC0gZG5vcm0oeCkNCg0KZGF0YSA8LSBkYXRhLmZyYW1lKHgsIHkpDQoNCmFscGhhIDwtIDAuMDUNCnpfY3JpdCA8LSBxbm9ybSgxIC0gYWxwaGEpDQoNCmdncGxvdChkYXRhLCBhZXMoeCwgeSkpICsNCiAgZ2VvbV9saW5lKHNpemUgPSAxKSArDQogIA0KICAjIFpvbmEgZGUgbm8gcmVjaGF6byAoMSAtIM6xKQ0KICBnZW9tX2FyZWEoDQogICAgZGF0YSA9IHN1YnNldChkYXRhLCB4IDwgel9jcml0KSwNCiAgICBhZXMoeCwgeSksDQogICAgZmlsbCA9ICJncmVlbiIsDQogICAgYWxwaGEgPSAwLjI1DQogICkgKw0KICANCiAgIyBab25hIGNyw610aWNhIM6xDQogIGdlb21fYXJlYSgNCiAgICBkYXRhID0gc3Vic2V0KGRhdGEsIHggPj0gel9jcml0KSwNCiAgICBhZXMoeCwgeSksDQogICAgZmlsbCA9ICJyZWQiLA0KICAgIGFscGhhID0gMC40DQogICkgKw0KICANCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gel9jcml0LCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSAwLCB5ID0gMC4yNSwNCiAgICAgICAgICAgbGFiZWwgPSAiWm9uYSBkZSBubyByZWNoYXpvICgxIC0gzrEpIiwgY29sb3IgPSAiZGFya2dyZWVuIikgKw0KICANCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMi41LCB5ID0gMC4wNSwNCiAgICAgICAgICAgbGFiZWwgPSAiWm9uYSBjcsOtdGljYSDOsSIpICsNCiAgDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDAsIHkgPSAwLjAyLA0KICAgICAgICAgICBsYWJlbCA9ICLOsSA9IDAuMDUg4oaSIGVycm9yIHRpcG8gSSIsIGNvbG9yID0gImJsYWNrIikgKw0KICANCiAgbGFicygNCiAgICB0aXRsZSA9ICJDb250cmFzdGUgdW5pbGF0ZXJhbDogcmVnacOzbiBjcsOtdGljYSB5IG5pdmVsIGRlIHNpZ25pZmljYWNpw7NuIM6xIiwNCiAgICB4ID0gIkVzdGFkw61zdGljbyBaIiwNCiAgICB5ID0gIkRlbnNpZGFkIg0KICApICsNCiAgDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCkFxdcOtOg0KDQotIFRvZG8gZWwgbml2ZWwgZGUgc2lnbmlmaWNhY2nDs24gKirOsSBzZSBjb25jZW50cmEgZW4gdW5hIHNvbGEgY29sYSoqIGRlIGxhIGRpc3RyaWJ1Y2nDs24uDQotIExhIHpvbmEgcm9qYSByZXByZXNlbnRhIGxhICoqcmVnacOzbiBjcsOtdGljYSoqLCBkb25kZSBzZSByZWNoYXphIEjigoAuDQotIExhIHpvbmEgdmVyZGUgZXMgbGEgcmVnacOzbiBkZSAqKm5vIHJlY2hhem8gKDEg4oiSIM6xKSoqLg0KLSBFbCB2YWxvciBjcsOtdGljbyBtYXJjYSBlbCBwdW50byBhIHBhcnRpciBkZWwgY3VhbCBlbCBlc3RhZMOtc3RpY28gZXMgc3VmaWNpZW50ZW1lbnRlIGV4dHJlbW8uDQoNCg0KKipSZWdsYSB2aXN1YWw6KioNCg0KLSBTaSBlbCBlc3RhZMOtc3RpY28gY2FlIGVuICoqcm9qbyoqIOKGkiBwIOKJpCDOsSDihpIgcmVjaGF6byBkZSAqKlwoSF8wXCkqKiANCi0gU2kgZWwgZXN0YWTDrXN0aWNvIGNhZSBlbiAqKnZlcmRlKiog4oaSIHAgPiDOsSDihpIgbm8gcmVjaGF6byBkZSAqKlwoSF8wXCkqKg0KDQotLS0NCg0KIyMjIDYuIENvbmNsdXNpw7NuLiBUb21hIGxhIGRlY2lzacOzbiBlc3RhZMOtc3RpY2ENCg0KVHJhcyBlbCBhbsOhbGlzaXMsIHNlIHRvbWEgbGEgKipkZWNpc2nDs24gZXN0YWTDrXN0aWNhKiogKHJlY2hhemFyIG8gbm8gcmVjaGF6YXIgXChIXzBcKSksDQoNCi0gU2kgc2UgcmVjaGF6YSAgXChIXzBcKTogc2UgY29uY2x1eWUgcXVlIGV4aXN0ZSBldmlkZW5jaWEgc3VmaWNpZW50ZSBwYXJhIGFmaXJtYXIgcXVlIGVsIGVmZWN0bywgZGlmZXJlbmNpYSBvIHJlbGFjacOzbiBwbGFudGVhZGEgZW4gIFwoSF8xXCkgZXMgY29tcGF0aWJsZSBjb24gbG9zIGRhdG9zIG9ic2VydmFkb3MuDQoNCi0gU2kgbm8gc2UgcmVjaGF6YSAgXChIXzBcKTogbm8gc2UgZGlzcG9uZSBkZSBldmlkZW5jaWEgc3VmaWNpZW50ZSBwYXJhIGFmaXJtYXIgcXVlIGV4aXN0YSBlbCBlZmVjdG8gbyBkaWZlcmVuY2lhIHBsYW50ZWFkYSBlbiAgXChIXzFcKSwgYXVucXVlIGVzdG8gbm8gaW1wbGljYSBxdWUgIFwoSF8wXCkgc2VhIG5lY2VzYXJpYW1lbnRlIHZlcmRhZGVyYS4NCg0KLS0tDQoNCiMjIyA3LiBJbnRlcnByZXRhY2nDs24gZGVsIHJlc3VsdGFkbyBlbiBlbCBjb250ZXh0byBkZWwgcHJvYmxlbWENCg0KVW5hIHZleiB0b21hZGEgbGEgZGVjaXNpw7NuIGVzdGFkw61zdGljYSAocmVjaGF6YXIgbyBubyByZWNoYXphciBcKEhfMFwpKSwgZWwgcmVzdWx0YWRvIGRlYmUgKippbnRlcnByZXRhcnNlIGVuIHTDqXJtaW5vcyBkZWwgcHJvYmxlbWEgb3JpZ2luYWwqKi4NCg0KRW4gZXN0ZSBwYXNvIHNlIHRyYWR1Y2UgbGEgY29uY2x1c2nDs24gZXN0YWTDrXN0aWNhIGEgdW5hIGNvbmNsdXNpw7NuIGNvbnRleHR1YWwsIGV4cGxpY2FuZG8gcXXDqSBpbXBsaWNhIGxhIGRlY2lzacOzbiBzb2JyZSBsYSBoaXDDs3Rlc2lzIGVuIGVsIMOhbWJpdG8gcmVhbCBkZWwgZXN0dWRpby4NCg0KRXMgaW1wb3J0YW50ZSBkZXN0YWNhciBxdWUgZXN0YSBpbnRlcnByZXRhY2nDs24gbm8gYWZpcm1hIHF1ZSBcKEhfMFwpIHNlYSB2ZXJkYWRlcmEgbyBmYWxzYSwgc2lubyBxdWUgbGEgZXZpZGVuY2lhIGRpc3BvbmlibGUgbm8gZXMgc3VmaWNpZW50ZSBwYXJhIHJlY2hhemFybGEgYmFqbyBlbCByaWVzZ28gZGUgZXJyb3IgZXN0YWJsZWNpZG8uDQoNCg0KLS0tDQoNCkEgY29udGludWFjacOzbiwgc2UgcHJlc2VudGFuICoqZG9zIGVzY2VuYXJpb3MgcHLDoWN0aWNvcyoqIGNvbiBlbCBvYmpldGl2byBkZSBlamVtcGxpZmljYXIgbGEgYXBsaWNhY2nDs24gZGUgbG9zICoqY29udHJhc3RlcyBkZSBoaXDDs3Rlc2lzIGVuIGNvbnRleHRvcyByZWFsZXMqKg0KDQo8YnI+DQoNCiMg8J+UrCBFc2NlbmFyaW8gMTogQ29udHJvbCBkZSB0ZW1wZXJhdHVyYSBlbiB1biByZWFjdG9yIGluZHVzdHJpYWwNCg0KIyMgMS4gUGxhbnRlYW1pZW50byBkZWwgcHJvYmxlbWENCg0KU2UgYW5hbGl6YSBlbCAqKmNvbXBvcnRhbWllbnRvIHTDqXJtaWNvIGRlIHVuIHJlYWN0b3IgaW5kdXN0cmlhbCoqIGNvbiBlbCBvYmpldGl2byBkZSBkZXRlcm1pbmFyIHNpIGxhIHRlbXBlcmF0dXJhIG1lZGlhIGRlIG9wZXJhY2nDs24gKipzdXBlcmEgZWwgdmFsb3IgZGUgcmVmZXJlbmNpYSoqIGVzcGVjaWZpY2FkbyBwb3IgZWwgZmFicmljYW50ZS4NCg0KRWwgcHJvYmxlbWEgc2UgcGxhbnRlYSBjb21vIHVuICoqY29udHJhc3RlIGRlIGhpcMOzdGVzaXMqKiwgeWEgcXVlIHRlbXBlcmF0dXJhcyBlbGV2YWRhcyBkZSBmb3JtYSBzb3N0ZW5pZGEgcHVlZGVuIGluZGljYXIgZmFsbG9zIGVuIGVsIHNpc3RlbWEgbyB1biBmdW5jaW9uYW1pZW50byBhbsOzbWFsby4NCg0KLS0tDQoNCiMjIDIuIFBvYmxhY2nDs24geSB2YXJpYWJsZSBkZSBlc3R1ZGlvDQoNCkxhIHBvYmxhY2nDs24gZXN0w6EgZm9ybWFkYSBwb3IgdG9kYXMgbGFzKiAqKnBvc2libGVzIG1lZGljaW9uZXMgZGUgdGVtcGVyYXR1cmEgZGVsIHJlYWN0b3IqKiBlbiBjb25kaWNpb25lcyBub3JtYWxlcyBkZSBvcGVyYWNpw7NuLg0KDQpMYSAqKnZhcmlhYmxlIGRlIGVzdHVkaW8qKiBlcyBsYSAqKnRlbXBlcmF0dXJhIGludGVybmEgZGVsIHJlYWN0b3IqKiwgbWVkaWRhIGVuIGdyYWRvcyBDZWxzaXVzICjCsEMpLiBTZSB0cmF0YSBkZSB1bmEgdmFyaWFibGUgY3VhbnRpdGF0aXZhIGNvbnRpbnVhLCB5YSBxdWUgcHVlZGUgdG9tYXIgY3VhbHF1aWVyIHZhbG9yIGRlbnRybyBkZSB1biBpbnRlcnZhbG8uDQoNCi0tLQ0KDQojIyAzLiBSZWNvZ2lkYSBkZSBkYXRvcw0KDQoNClNlIG9idGllbmUgdW5hICoqbXVlc3RyYSBhbGVhdG9yaWEqKiBkZSBtZWRpY2lvbmVzIGRlIHRlbXBlcmF0dXJhIGRlbCByZWFjdG9yIHJlZ2lzdHJhZGFzIGVuIGRpc3RpbnRvcyBpbnN0YW50ZXMgZGUgdGllbXBvIGR1cmFudGUgY29uZGljaW9uZXMgZGUgZnVuY2lvbmFtaWVudG8gZXN0YWJsZS4NCg0KTGFzIG9ic2VydmFjaW9uZXMgc2UgY29uc2lkZXJhbiAqKmluZGVwZW5kaWVudGVzKiogeSBwdWVkZW4gcmVjb2dlcnNlIG1lZGlhbnRlIG11ZXN0cmVvIGFsZWF0b3JpbyBzaW1wbGUsIGFzZWd1cmFuZG8gcXVlIGxhIG11ZXN0cmEgc2VhIHJlcHJlc2VudGF0aXZhIGRlbCBjb21wb3J0YW1pZW50byBkZWwgc2lzdGVtYS4NCg0KRWwgKip0YW1hw7FvIG11ZXN0cmFsIFwoblwpKiogZGViZSBzZXIgc3VmaWNpZW50ZW1lbnRlIGdyYW5kZSBwYXJhIGdhcmFudGl6YXIgZXN0YWJpbGlkYWQgZW4gbGFzIGVzdGltYWNpb25lcy4NCg0KTGEgKipiYXNlIGRlIGRhdG9zKiogaW5jbHV5ZSwgYWwgbWVub3MsIGxhIHRlbXBlcmF0dXJhIHJlZ2lzdHJhZGEgZW4gY2FkYSBtZWRpY2nDs24sIHB1ZGllbmRvIGluY29ycG9yYXJzZSB0YW1iacOpbiBlbCBpbnN0YW50ZSBkZSByZWdpc3RybyBwYXJhIGZpbmVzIGRlIHRyYXphYmlsaWRhZCB5IGFuw6FsaXNpcyB0ZW1wb3JhbC4NCg0KLS0tDQoNCiMjIDQuIEZvcm11bGFjacOzbiBkZSBoaXDDs3Rlc2lzDQoNClNlIHBsYW50ZWEgdW4gKipjb250cmFzdGUgZGUgaGlww7N0ZXNpcyBzb2JyZSBsYSBtZWRpYSBwb2JsYWNpb25hbCBcKFxtdVwpKiosIGNvbiBlbCBvYmpldGl2byBkZSBldmFsdWFyIHNpIGxhIHRlbXBlcmF0dXJhIG1lZGlhIGRlbCByZWFjdG9yIHN1cGVyYSBlbCB2YWxvciBkZSByZWZlcmVuY2lhIGVzdGFibGVjaWRvIHBvciBlbCBmYWJyaWNhbnRlIFwoXG11XzBcKS4NCg0KXFsNCkhfMDogXG11IFxsZXEgXG11XzANClxdDQoNClxbDQpIXzE6IFxtdSA+IFxtdV8wDQpcXQ0KDQpTZSB0cmF0YSBkZSB1biAqKmNvbnRyYXN0ZSB1bmlsYXRlcmFsIGRlIGNvbGEgZGVyZWNoYSoqLCBkaXNlw7FhZG8gcGFyYSBkZXRlY3RhciBpbmNyZW1lbnRvcyBlbiBsYSBtZWRpYSByZXNwZWN0byBhbCB2YWxvciBkZSByZWZlcmVuY2lhLg0KDQotLS0NCg0KDQojIyA1LiBOaXZlbCBkZSBzaWduaWZpY2FjacOzbg0KDQpTZSBmaWphIGVsICoqbml2ZWwgZGUgc2lnbmlmaWNhY2nDs24qKiBkZWwgY29udHJhc3RlIGVuOg0KDQpcWw0KXGFscGhhID0gMC4wNSwgXHF1YWQgMSAtIFxhbHBoYSA9IDAuOTUNClxdDQoNCkVzdGUgcGFyw6FtZXRybyBkZXRlcm1pbmEgZWwgdW1icmFsIGRlIGRlY2lzacOzbiBkZWwgY29udHJhc3RlIHkgY29udHJvbGEgbGEgcHJvYmFiaWxpZGFkIGRlIGNvbWV0ZXIgdW4gZXJyb3IgZGUgdGlwbyBJLCBlcyBkZWNpciwgcmVjaGF6YXIgbGEgaGlww7N0ZXNpcyBudWxhIHNpZW5kbyBlc3RhIHZlcmRhZGVyYS4NCg0KLS0tDQoNCiMjIDYuIE3DqXRvZG9zIGRlIGNvbnRyYXN0ZSBwb3NpYmxlcw0KDQojIyMgTcOpdG9kbyBwcmluY2lwYWw6IHQgZGUgU3R1ZGVudCAoz4MgZGVzY29ub2NpZGEpDQoNClxbDQp0ID0gXGZyYWN7XGJhcnt4fSAtIFxtdV8wfXtzIC8gXHNxcnR7bn19DQpcXQ0KDQotLS0NCg0KIyMjIEFsdGVybmF0aXZhcyBtZXRvZG9sw7NnaWNhcw0KDQpFbiBmdW5jacOzbiBkZSBsYXMgY2FyYWN0ZXLDrXN0aWNhcyBkZSBsb3MgZGF0b3MgeSBkZSBsb3Mgc3VwdWVzdG9zIGRpc3BvbmlibGVzLCBwb2Ryw61hbiBlbXBsZWFyc2Ugb3Ryb3MgbcOpdG9kb3MgZGUgY29udHJhc3RlOg0KDQoNCnwgTcOpdG9kbyB8IFZlbnRhamFzIHwgTGltaXRhY2lvbmVzIHwgVXNvIHTDrXBpY28gfA0KfC0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS18DQp8IFRlc3QgWiB8IFNpbXBsZSB8IFJlcXVpZXJlIM+DIGNvbm9jaWRhIHwgUHJvY2Vzb3MgbXV5IGNvbnRyb2xhZG9zIHwNCnwgQm9vdHN0cmFwcGluZyB8IFNpbiBzdXB1ZXN0b3MgZnVlcnRlcyB8IENvc3RlIGNvbXB1dGFjaW9uYWwgYWx0byB8IERhdG9zIG5vIG5vcm1hbGVzIHwNCg0KLS0tDQoNCiMjIDcuIFJlZ2xhIGRlIGRlY2lzacOzbg0KDQpMYSBkZWNpc2nDs24gZGVsIGNvbnRyYXN0ZSBzZSB0b21hIGNvbXBhcmFuZG8gZWwgKipwLXZhbG9yIGNvbiBlbCBuaXZlbCBkZSBzaWduaWZpY2FjacOzbiBcKFxhbHBoYSA9IDAuMDVcKSoqOg0KDQotIFNpIFwocCA8IDAuMDVcKSwgc2UgcmVjaGF6YSBcKEhfMFwpLiAgDQotIFNpIFwocCBcZ2VxIDAuMDVcKSwgbm8gc2UgcmVjaGF6YSBcKEhfMFwpLiAgDQoNCkVuIGVsIGNvbnRleHRvIGRlbCByZWFjdG9yIGluZHVzdHJpYWwsIGVzdGEgcmVnbGEgcGVybWl0ZSBkZXRlcm1pbmFyIHNpIGxhIHRlbXBlcmF0dXJhIG1lZGlhIG9ic2VydmFkYSBlcyBpbmNvbXBhdGlibGUgY29uIGVsIHZhbG9yIGRlIHJlZmVyZW5jaWEgZXN0YWJsZWNpZG8gcG9yIGVsIGZhYnJpY2FudGUuDQoNCi0tLQ0KDQojIyA4LiBJbnRlcnByZXRhY2nDs24gZGVsIHJlc3VsdGFkbw0KDQotICoqUmVjaGF6byBkZSBcKEhfMFwpOioqIHNlIGNvbmNsdXllIHF1ZSAqKmV4aXN0ZSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhIGRlIHF1ZSBsYSB0ZW1wZXJhdHVyYSBtZWRpYSBkZWwgcmVhY3RvciBzdXBlcmEgZWwgdmFsb3IgZGUgcmVmZXJlbmNpYSoqLCBsbyBxdWUgcHVlZGUgaW5kaWNhciBzb2JyZWNhbGVudGFtaWVudG8gbyB1bmEgZGVzdmlhY2nDs24gcmVsZXZhbnRlIGVuIGxhcyBjb25kaWNpb25lcyBkZSBvcGVyYWNpw7NuIGRlbCBzaXN0ZW1hLiAgDQoNCi0gKipObyByZWNoYXpvIGRlIFwoSF8wXCk6KiogKipubyBzZSBkaXNwb25lIGRlIGV2aWRlbmNpYSBzdWZpY2llbnRlIHBhcmEgYWZpcm1hciBxdWUgbGEgdGVtcGVyYXR1cmEgbWVkaWEgc3VwZXJlIGVsIHZhbG9yIGRlIHJlZmVyZW5jaWEqKiwgcG9yIGxvIHF1ZSBlbCBjb21wb3J0YW1pZW50byB0w6lybWljbyBkZWwgcmVhY3RvciBzZSBjb25zaWRlcmEgY29tcGF0aWJsZSBjb24gbGEgdmFyaWFiaWxpZGFkIG5vcm1hbCBkZWwgcHJvY2Vzby4gIA0KDQotLS0NCg0KPGJyPg0KDQojIOKYou+4jyBFc2NlbmFyaW8gMjogQ29tcGFyYWNpw7NuIGRlIHByb3BvcmNpb25lcyBkZSB1cmFuaW8gZW4gbXVlc3RyYXMgcmFkaWFjdGl2YXMNCg0KIyMgMS4gUGxhbnRlYW1pZW50byBkZWwgcHJvYmxlbWENCg0KU2UgYW5hbGl6YSBzaSAqKmRvcyBtdWVzdHJhcyBkZSBtYXRlcmlhbCByYWRpYWN0aXZvKiogcHVlZGVuIHByb2NlZGVyIGRlIGxhICoqbWlzbWEgZnVlbnRlIGRlIG9yaWdlbioqIGEgcGFydGlyIGRlIGxhIGNvbXBhcmFjacOzbiBkZSBsYSBwcm9wb3JjacOzbiBkZSB1cmFuaW8gcHJlc2VudGUgZW4gY2FkYSB1bmEuDQoNCkVsICoqb2JqZXRpdm8qKiBlcyBkZXRlcm1pbmFyIHNpIGxhcyBkaWZlcmVuY2lhcyBvYnNlcnZhZGFzIHNvbiBhdHJpYnVpYmxlcyBhIHZhcmlhYmlsaWRhZCBhbGVhdG9yaWEgbyBhIGRpZmVyZW5jaWFzIGVzdHJ1Y3R1cmFsZXMgZW50cmUgcG9ibGFjaW9uZXMuDQoNCi0tLQ0KDQojIyAyLiBQb2JsYWNpb25lcyB5IHZhcmlhYmxlIGRlIGVzdHVkaW8NCg0KU2UgZWxpZ2VuIGxhcyBzaWd1aWVudGVzICoqcG9ibGFjaW9uZXMqKiwgeWEgcXVlIHJlcHJlc2VudGFuIHBvc2libGVzIGZ1ZW50ZXMgZGlzdGludGFzIGRlIG1hdGVyaWFsIHJhZGlhY3Rpdm8uIA0KDQoNCioqUG9ibGFjacOzbiAxKio6IG11ZXN0cmFzIGRlIG1hdGVyaWFsIHJhZGlhY3Rpdm8gZGUgb3JpZ2VuIGRlc2Nvbm9jaWRvIEENCg0KKipQb2JsYWNpw7NuIDIqKjogbXVlc3RyYXMgZGUgbWF0ZXJpYWwgcmFkaWFjdGl2byBkZSBvcmlnZW4gZGVzY29ub2NpZG8gQg0KDQoNClZhcmlhYmxlIGRlIGVzdHVkaW86ICoqcHJvcG9yY2nDs24gZGUgdXJhbmlvIGVuIGNhZGEgbXVlc3RyYSoqDQoNClRpcG86ICoqdmFyaWFibGUgY2F0ZWfDs3JpY2EvYmlub21pYWwqKg0KDQoNCkludGVycHJldGFjacOzbjogKipwb3JjZW50YWplIGRlIHVyYW5pbyByZXNwZWN0byBhbCB0b3RhbCBkZSBsYSBtdWVzdHJhKioNCg0KDQotLS0NCg0KIyMgMy4gUmVjb2dpZGEgZGUgZGF0b3MNCg0KU2Ugb2J0aWVuZW4gKipkb3MgbXVlc3RyYXMgaW5kZXBlbmRpZW50ZXMqKiBwcm9jZWRlbnRlcyBkZSBjYWRhIHVuYSBkZSBsYXMgcG9ibGFjaW9uZXMuDQoNCkVuIGNhZGEgdW5hIGRlIGVsbGFzICoqc2UgcmVnaXN0cmFuKio6DQoNCi0gdGFtYcOxb3MgbXVlc3RyYWxlcyBcKG5fMVwpIHkgXChuXzJcKSAgDQotIG7Dum1lcm8gZGUgZGV0ZWNjaW9uZXMgZGUgdXJhbmlvIGVuIGNhZGEgbXVlc3RyYSAgDQotIGPDoWxjdWxvIGRlIGxhcyBwcm9wb3JjaW9uZXMgbXVlc3RyYWxlcyBcKFxoYXR7cH1fMVwpIHkgXChcaGF0e3B9XzJcKSAgDQoNCkVzdGFzIHByb3BvcmNpb25lcyBzZSBvYnRpZW5lbiBhIHBhcnRpciBkZSBsYSBmcmVjdWVuY2lhIGRlIGRldGVjY2nDs24gZGUgdXJhbmlvIHJlc3BlY3RvIGFsIHRvdGFsIGRlIG9ic2VydmFjaW9uZXMgZW4gY2FkYSBtdWVzdHJhLg0KDQoqKkNvbmRpY2lvbmVzIGRlbCBtdWVzdHJlbzoqKg0KDQotIGluZGVwZW5kZW5jaWEgZW50cmUgbXVlc3RyYXMgIA0KLSBjb250cm9sIGRlbCBzZXNnbyBpbnN0cnVtZW50YWwgIA0KLSBjb25kaWNpb25lcyBob21vZ8OpbmVhcyBkZSBtZWRpY2nDs24gcGFyYSBhc2VndXJhciBjb21wYXJhYmlsaWRhZCAgDQoNCi0tLQ0KDQojIyA0LiBGb3JtdWxhY2nDs24gZGUgaGlww7N0ZXNpcw0KDQpTZSBwbGFudGVhIHVuICoqY29udHJhc3RlIGJpbGF0ZXJhbCoqIHBhcmEgZGV0ZXJtaW5hciBzaSBleGlzdGVuIGRpZmVyZW5jaWFzIGVuIGxhIHByb3BvcmNpw7NuIGRlIHVyYW5pbyBlbnRyZSBhbWJhcyBwb2JsYWNpb25lcy4NCg0KJCQNCkhfMDogcF8xID0gcF8yDQokJA0KDQokJA0KSF8xOiBwXzEgXG5lcSBwXzINCiQkDQoNCkJham8gbGEgKipoaXDDs3Rlc2lzIG51bGEgIFwoSF8wXCkqKiwgc2UgYXN1bWUgcXVlIGFtYmFzIHBvYmxhY2lvbmVzIHByZXNlbnRhbiBsYSAqKm1pc21hIHByb3BvcmNpw7NuIGRlIHVyYW5pbyoqLCBtaWVudHJhcyBxdWUgbGEgKipoaXDDs3Rlc2lzIGFsdGVybmF0aXZhIFwoSF8wMSkqKiBwbGFudGVhIGxhIGV4aXN0ZW5jaWEgZGUgZGlmZXJlbmNpYXMgc2lnbmlmaWNhdGl2YXMgZW50cmUgZWxsYXMuDQoNCi0tLQ0KDQojIyA1LiBOaXZlbCBkZSBzaWduaWZpY2FjacOzbg0KDQpTZSBmaWphIGVsICoqbml2ZWwgZGUgc2lnbmlmaWNhY2nDs24qKiBlbjogDQoNCiQkDQpcYWxwaGEgPSAwLjA1DQokJA0KLS0tDQoNCiMjIDYuIE3DqXRvZG9zIGRlIGNvbnRyYXN0ZSBwb3NpYmxlcw0KDQojIyMgTcOpdG9kbyBwcmluY2lwYWw6IGNvbnRyYXN0ZSBaIHBhcmEgZG9zIHByb3BvcmNpb25lcyBkZSB1cmFuaW8NCg0KU2UgdXRpbGl6YSBlbCAqKmVzdGFkw61zdGljbyBaIChkb3MgcHJvcG9yY2lvbmVzKSoqcGFyYSBjb21wYXJhciBsYSBwcm9wb3JjacOzbiBkZSB1cmFuaW8gZW50cmUgYW1iYXMgcG9ibGFjaW9uZXMuDQoNCiQkDQpaID0NClxmcmFje1xoYXR7cH1fMSAtIFxoYXR7cH1fMn0NCntcc3FydHtcaGF0e3B9KDEgLSBcaGF0e3B9KVxsZWZ0KFxmcmFjezF9e25fMX0gKyBcZnJhY3sxfXtuXzJ9XHJpZ2h0KX19DQokJA0KDQpFc3RlIGNvbnRyYXN0ZSBwZXJtaXRlIGV2YWx1YXIgc2kgbGFzIGRpZmVyZW5jaWFzIG9ic2VydmFkYXMgZW4gZWwgY29udGVuaWRvIGRlIHVyYW5pbyBlbnRyZSBsYXMgZG9zIG11ZXN0cmFzIHNvbiBlc3RhZMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZhcy4NCg0KLS0tDQoNCiMjIyBBbHRlcm5hdGl2YSBtZXRvZG9sw7NnaWNhDQoNCnx8IE3DqXRvZG8gfCBWZW50YWphcyB8IExpbWl0YWNpb25lcyB8IFVzbyB0w61waWNvIHwNCnwtLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tfA0KfCBDaGktY3VhZHJhZG8gfCBFbmZvcXVlIGFsdGVybmF0aXZvIGFsIFogZW4gdGFibGFzIGRlIGNvbnRpbmdlbmNpYSB8IE1lbm9zIGRpcmVjdG8gcGFyYSBpbnRlcnByZXRhY2nDs24gZGUgcHJvcG9yY2lvbmVzIHwgVmVyaWZpY2FjacOzbiBkZSBkaWZlcmVuY2lhcyBnbG9iYWxlcyB8DQoNCkEgZGlmZXJlbmNpYSBkZWwgKipjb250cmFzdGUgZGUgcHJvcG9yY2lvbmVzIChaKSoqLCBxdWUgY29tcGFyYSBkaXJlY3RhbWVudGUgbGFzIHByb3BvcmNpb25lcyBlc3RpbWFkYXMgZW4gY2FkYSBtdWVzdHJhLCBlbCAqKmNoaS1jdWFkcmFkbyoqIG1pZGUgc2kgbGFzIGRpZmVyZW5jaWFzIGVuIGVsIHVyYW5pbyBlbnRyZSBsYXMgZG9zIG11ZXN0cmFzIHNvbiBkZW1hc2lhZG8gZ3JhbmRlcyBjb21vIHBhcmEgZXhwbGljYXJzZSBzb2xvIHBvciBjYXN1YWxpZGFkLCBldmFsdWFuZG8gbGEgZGlzY3JlcGFuY2lhIGVudHJlIGxhcyBmcmVjdWVuY2lhcyBvYnNlcnZhZGFzIHkgbGFzIHF1ZSBzZSBlc3BlcmFyw61hbiBzaSBhbWJhcyBwb2JsYWNpb25lcyBmdWVyYW4gaWd1YWxlcy4NCg0KLS0tDQoNCiMjIDcuIFJlZ2xhIGRlIGRlY2lzacOzbg0KDQoNCkxhIGRlY2lzacOzbiBzZSBiYXNhIGVuIGNvbXBhcmFyIGVsICoqcC12YWxvcioqIG9idGVuaWRvIGVuIGVsIGNvbnRyYXN0ZSBzb2JyZSBsYSBwcm9wb3JjacOzbiBkZSB1cmFuaW8gZW50cmUgYW1iYXMgbXVlc3RyYXMgY29uIGVsIG5pdmVsIGRlIHNpZ25pZmljYWNpw7NuIFwoXGFscGhhID0gMC4wNVwpLg0KDQotICoqU2kgXChwIDwgMC4wNVwpIHNlIHJlY2hhemEgXChIXzBcKSoqLCBjb25jbHV5ZW5kbyBxdWUgZXhpc3RlbiBkaWZlcmVuY2lhcyBzaWduaWZpY2F0aXZhcyBlbiBsYSBwcm9wb3JjacOzbiBkZSB1cmFuaW8gZW50cmUgbGFzIG11ZXN0cmFzIEEgeSBCIChwb3NpYmxlIG9yaWdlbiBkaXN0aW50bykuICANCi0gKipTaSBcKHAgXGdlcSAwLjA1XCkgbm8gc2UgcmVjaGF6YSBcKEhfMFwpKiosIGNvbmNsdXllbmRvIHF1ZSBsYXMgZGlmZXJlbmNpYXMgb2JzZXJ2YWRhcyBlbiBlbCBjb250ZW5pZG8gZGUgdXJhbmlvIHNvbiBjb21wYXRpYmxlcyBjb24gbGEgdmFyaWFiaWxpZGFkIGFsZWF0b3JpYSB5IG5vIGhheSBldmlkZW5jaWEgZGUgb3LDrWdlbmVzIGRpc3RpbnRvcy4NCg0KLS0tDQoNCiMjIDguIEludGVycHJldGFjacOzbiBkZWwgcmVzdWx0YWRvDQoNCkEgcGFydGlyIGRlbCAqKnJlc3VsdGFkbyBkZWwgY29udHJhc3RlIHNvYnJlIGxhIHByb3BvcmNpw7NuIGRlIHVyYW5pbyBlbnRyZSBsYXMgbXVlc3RyYXMqKiwgbGEgaW50ZXJwcmV0YWNpw7NuIHNlIGNvbmVjdGEgZGlyZWN0YW1lbnRlIGNvbiBlbCBvYmpldGl2byBkZWwgZXN0dWRpbzogZGV0ZXJtaW5hciBzaSBhbWJhcyBtdWVzdHJhcyBwdWVkZW4gcHJvY2VkZXIgZGVsIG1pc21vIG9yaWdlbi4NCg0KLSAqKlJlY2hhem8gZGUgXChIXzBcKToqKiBzZSBjb25jbHV5ZSBxdWUgZXhpc3RlbiBkaWZlcmVuY2lhcyBzaWduaWZpY2F0aXZhcyBlbiBsYSBwcm9wb3JjacOzbiBkZSB1cmFuaW8gZW50cmUgbGFzIG11ZXN0cmFzLiBFc3RvIGluZGljYSBxdWUgbGEgY29tcG9zaWNpw7NuIHF1w61taWNhIG5vIGVzIGNvbXBhdGlibGUgYmFqbyB1biBtaXNtbyBwYXRyw7NuIGRlIGdlbmVyYWNpw7NuLCBwb3IgbG8gcXVlIGVzIHJhem9uYWJsZSBjb25zaWRlcmFyIHF1ZSBsYXMgbXVlc3RyYXMgcG9kcsOtYW4gcHJvY2VkZXIgZGUgZnVlbnRlcyBkZSBvcmlnZW4gZGlzdGludGFzLg0KDQotICoqTm8gcmVjaGF6byBkZSBcKEhfMFwpOioqIG5vIHNlIGVuY3VlbnRyYW4gZGlmZXJlbmNpYXMgZXN0YWTDrXN0aWNhbWVudGUgc2lnbmlmaWNhdGl2YXMgZW4gbGEgcHJvcG9yY2nDs24gZGUgdXJhbmlvLiBFbiBlc3RlIGNhc28sIGxhcyB2YXJpYWNpb25lcyBvYnNlcnZhZGFzIHNlIGludGVycHJldGFuIGNvbW8gcmVzdWx0YWRvIGRlIGxhIHZhcmlhYmlsaWRhZCBhbGVhdG9yaWEgZGVsIG11ZXN0cmVvLCBwb3IgbG8gcXVlIGxvcyBkYXRvcyBzb24gY29tcGF0aWJsZXMgY29uIGxhIGhpcMOzdGVzaXMgZGUgdW4gbWlzbW8gb3JpZ2VuIHBhcmEgYW1iYXMgbXVlc3RyYXMuDQoNCjxicj4NCg0KDQojIyBSZWZlcmVuY2lhcw0KDQotIFRyaW9sYSwgTS4gRi4gKDIwMTgpLiAqRXN0YWTDrXN0aWNhKiAoMTLCqiBlZC4pLiBQZWFyc29uIEVkdWNhY2nDs24uICANCi0gRWxhYm9yYWNpw7NuIHByb3BpYSBjb24gYXBveW8gZGUgaW50ZWxpZ2VuY2lhIGFydGlmaWNpYWwgKENoYXRHUFQpLg0K