1 Portada y resumen ejecutivo

Trabajo final de semestre – Econometría Instituto Tecnológico Metropolitano (ITM)

Autora: Yised Melissa Valencia Correa

Elemento Descripción
Activo elegido Alphabet Inc., acciones Clase A (GOOGL), NASDAQ. Precio de cierre ajustado, frecuencia diaria, cinco años de historia.
Pregunta de investigación ¿Un modelo ARIMA, especificado y calibrado manualmente (sin auto.arima()), permite pronosticar el precio de GOOGL mejor que una caminata aleatoria y sustentar una estrategia de inversión rentable?
Horizonte de inversión 30 días hábiles bursátiles (h = 30).
Capital USD 100.000.
Muestra 85 % entrenamiento / 15 % validación (división cronológica).
Modelos evaluados ARIMA(1,1,0), (0,1,1), (1,1,1), (2,1,1), (1,1,2) y (2,1,2), más el benchmark Random Walk.

Principal conclusión.

  • La serie en niveles no es estacionaria (ADF y KPSS). La serie diferenciada sí lo es (ADF y KPSS), por lo que d = 1.
  • El mejor ARIMA es ARIMA(1,1,0) (RMSE = 0.08669540; AIC = −5274.727; BIC = −5264.787).
  • El benchmark Random Walk presenta un RMSE ligeramente menor (0.08669098).
  • Diagnóstico: Jarque-Bera rechaza la normalidad. Ljung-Box no rechaza H0, de modo que los residuos son compatibles con ruido blanco.
  • Los resultados son consistentes con la hipótesis de eficiencia débil del mercado. Los precios de GOOGL muestran un comportamiento compatible con una caminata aleatoria, por lo que el pronóstico no ofrece una ventaja direccional explotable. La decisión de inversión debe basarse sobre todo en la gestión del riesgo.

La siguiente tabla resume los seis indicadores de comparación (AIC, BIC, RMSE, MAE, MAPE y MASE) para todos los modelos. La columna RMSE reportado recoge los resultados empíricos del trabajo, y el resto de columnas se recalcula al compilar el documento con los datos descargados (pueden variar marginalmente si Yahoo Finance revisa los precios ajustados). Al Random Walk no le corresponden AIC ni BIC porque no estima parámetros.

Resumen de resultados: indicadores de ajuste (AIC, BIC) y de error en validación (RMSE, MAE, MAPE, MASE)
Modelo RMSE reportado RMSE MAE MAPE MASE AIC BIC
1 Random Walk 0.086691 0.193971 0.162859 1.83694 5.66499 — —
2 ARIMA(1,1,0) 0.086695 0.194013 0.162906 1.83746 5.66663 -3873.93 -3863.99
3 ARIMA(0,1,1) 0.086696 0.194014 0.162907 1.83746 5.66666 -3873.93 -3863.99
5 ARIMA(2,1,1) 0.087034 0.193408 0.162232 1.83003 5.64318 -3872.20 -3852.32
6 ARIMA(1,1,2) 0.087082 0.193541 0.162379 1.83165 5.64830 -3872.12 -3852.24
4 ARIMA(1,1,1) 0.087131 0.194014 0.162907 1.83746 5.66665 -3871.93 -3857.02
7 ARIMA(2,1,2) 0.087285 0.194121 0.163017 1.83868 5.67050 -3869.49 -3844.64

2 Fuente y análisis de mercado

2.1 Descripción del activo

Alphabet Inc. es el conglomerado matriz de Google, constituido en 2015. Sus acciones Clase A (GOOGL, con derecho a voto) cotizan en el NASDAQ, en dólares estadounidenses (USD), con sesión regular de lunes a viernes de 9:30 a 16:00 (hora de Nueva York). Es uno de los activos más líquidos y de mayor capitalización del mercado estadounidense, componente de los principales índices bursátiles. Sus ingresos provienen de Google Services (publicidad en Search y YouTube, suscripciones, dispositivos), Google Cloud y Other Bets como Waymo (Alphabet Inc., 2024a).

Fuente de datos. Precios diarios (apertura, máximo, mínimo, cierre, volumen y cierre ajustado) descargados automáticamente desde Yahoo Finance (Yahoo Finance, s. f.) con el paquete quantmod (Ryan y Ulrich, 2024). La información corporativa proviene de los informes oficiales de Alphabet ante la SEC (Alphabet Inc., 2024a).

Frecuencia. Se eligió frecuencia diaria por tres razones: (i) el activo es muy líquido y se negocia todos los días hábiles; (ii) cinco años de datos diarios dan más de 1.200 observaciones, suficientes para calibrar y reservar un bloque de validación; (iii) el horizonte de inversión (30 días hábiles) es corto y requiere granularidad diaria. Los datos semanales o mensuales reducirían la muestra a unas 260 o 60 observaciones.

A continuación se presentan los estadísticos descriptivos del precio y de los rendimientos, y la evolución histórica de la serie.

Estadísticos descriptivos de GOOGL (periodo completo)
Estadístico Valor
Observaciones 1254.0000
Mínimo (USD) 82.6436
Máximo (USD) 402.1212
Media (USD) 181.2626
Mediana (USD) 152.3570
Desv. estándar (USD) 83.0559
Rendimiento log. diario medio (%) 0.0717
Volatilidad diaria (%) 2.0219
Volatilidad anualizada (%) 32.0974
Asimetría de rendimientos 0.0148
Curtosis en exceso de rendimientos 3.0014

Rendimiento y volatilidad por año calendario
Año Rend. medio diario (%) Volatilidad anualizada (%) Mínimo diario (%) Máximo diario (%)
2021 0.108 23.818 -3.121 4.840
2022 -0.198 38.667 -9.586 7.377
2023 0.184 30.401 -9.992 7.026
2024 0.122 27.983 -7.797 9.735
2025 0.203 32.211 -7.572 9.242
2026 0.034 31.361 -7.400 9.496

¿Qué nos dicen estos gráficos? La volatilidad es, en palabras simples, qué tanto se mueve el precio de un día a otro. Al mirar la línea roja se nota que ese movimiento no es siempre igual: hay épocas tranquilas, en las que la acción sube o baja poco, y épocas agitadas, en las que los cambios diarios son mucho más grandes. Además, esas épocas tienden a venir en bloques, no de forma aislada: después de un día turbulento suele venir otro. La mayor agitación se observó alrededor del 11/11/2022 y la mayor calma alrededor del 06/06/2024.

Esto importa porque el modelo ARIMA trata la incertidumbre como si fuera siempre la misma. Eso casi no afecta al pronóstico del precio esperado, pero sí al «margen de error» que lo rodea: en épocas agitadas ese margen podría quedarse corto, y en épocas tranquilas, quedarse largo. Retomamos este punto más adelante: en la sección 4 se explica el modelo GARCH, pensado justamente para este fenómeno; en la sección 6 se revisa si los residuos del modelo muestran este comportamiento; y en la sección 9 se tiene en cuenta al simular los escenarios de riesgo.

2.2 Hechos de mercado que contextualizan la muestra

  1. Ciclo de endurecimiento monetario (2022-2023). La Reserva Federal elevó la tasa de fondos federales desde cerca de cero hasta el rango 5,25 %-5,50 % (Federal Open Market Committee, 2023). El aumento de la tasa de descuento presionó la valoración de las acciones tecnológicas de crecimiento y se asocia con el episodio de mayor volatilidad de la muestra.
  2. Desdoblamiento de acciones 20 a 1 (2022). Alphabet anunció un split de 20 por 1 (Alphabet Inc., 2022). Esto justifica el uso del precio ajustado, pues el precio sin ajustar presentaría un salto artificial que se confundiría con una ruptura estructural.
  3. Competencia en inteligencia artificial generativa. El lanzamiento de ChatGPT a finales de 2022 (OpenAI, 2022) y la respuesta de Google con la familia de modelos Gemini (Pichai y Hassabis, 2023) cambiaron las expectativas sobre el negocio de búsqueda y de nube. Esto genera saltos asociados a noticias, no a patrones estacionales.
  4. Primer dividendo y recompra de acciones (2024). Alphabet anunció su primer dividendo en efectivo junto con un programa de recompra de acciones de USD 70.000 millones (Alphabet Inc., 2024b). Esto afectó la demanda por la acción y el tratamiento del precio ajustado.
  5. Escrutinio antimonopolio. En 2024 un tribunal federal estadounidense falló que Google mantuvo ilegalmente un monopolio en búsqueda (United States v. Google LLC, 2024). Esto introduce riesgo regulatorio y eventos de cola.

Implicaciones econométricas. Estos eventos sugieren (i) persistencia y raíz unitaria en el nivel del precio, (ii) rupturas ocasionales de volatilidad y (iii) sensibilidad a variables externas como tasas de interés y el índice de mercado, que motivan ARIMAX. No hay una razón económica clara para esperar estacionalidad en un precio bursátil diario, hipótesis que se contrasta en la sección 5.

2.3 Hipótesis de inversión (definida antes del análisis)

Antes de estimar cualquier modelo se fijan los parámetros de decisión:

  • Hipótesis nula (eficiencia débil; Fama, 1970): los rezagos del precio no contienen información explotable, y una estrategia basada en un pronóstico ARIMA no supera a comprar y mantener ni a mantener liquidez.
  • Hipótesis alternativa: el pronóstico ARIMA anticipa movimientos suficientes para generar un rendimiento superior al de los benchmarks.
  • Regla de decisión: al cierre de la fecha de corte, si el modelo proyecta una apreciación superior al umbral del 2 % para el horizonte de 30 días hábiles, se toma una posición larga con todo el capital. De lo contrario se mantiene liquidez remunerada a la tasa libre de riesgo. El umbral cubre la tasa libre de riesgo del periodo (≈ 0,5 %) y los costos de transacción, con un margen de seguridad.

3 Base de datos y tratamiento

3.1 Importación y verificación

Los datos se descargan con quantmod::getSymbols() para los cinco años anteriores a la fecha de compilación. Se verifican las condiciones básicas de calidad:

Verificación de calidad de los datos
Verificación Resultado
Primera fecha 2021-10-22
Última fecha 2026-10-21
Observaciones descargadas 1254
Fechas duplicadas 0
Fechas fuera de orden 0
Valores faltantes (NA) en las series descargadas 0
Precios ajustados no positivos 0
Días de la semana presentes (1 = lunes, 5 = viernes) 1, 2, 3, 4, 5
Saltos de más de 5 días calendario 0

3.2 Limpieza y frecuencia

  • Duplicados y orden: si se detectaran fechas duplicadas o desordenadas, se eliminarían y ordenarían. La tabla anterior indica si fue necesario.
  • Faltantes: los NA se eliminan con na.omit() (no se imputan, para no introducir información artificial).
  • Feriados: las fechas de feriados bursátiles no existen en la fuente y no se rellenan, de modo que los rezagos se miden en días de negociación.
  • Unidades: precios en USD por acción, ya ajustados por splits y dividendos.
  • Frecuencia: diaria (justificada en la sección 2).

3.3 Descripción de las variables

Variable Descripción Unidad
GOOGL.Open / High / Low / Close Precios de apertura, máximo, mínimo y cierre (sin ajuste por dividendos) USD por acción
GOOGL.Volume Volumen negociado Acciones
GOOGL.Adjusted Cierre ajustado por splits y dividendos. Variable principal del estudio. USD por acción

3.4 Transformaciones, base procesada y separación train-test

Se trabaja con tres representaciones de la serie: el precio \(y_t\), el rendimiento logarítmico \(r_t=\ln P_t-\ln P_{t-1}\) (solo descriptivo) y la serie transformada Box-Cox \(y_t^{(\lambda)}\), sobre la que se estiman los modelos. Se aplicarán diferencias según las pruebas de estacionariedad (sección 5).

La separación cronológica se hace antes de calibrar: 85 % para entrenamiento y 15 % para validación. Este porcentaje queda dentro del rango recomendado (15 %-25 %). Se escoge el extremo inferior para conservar más información en la estimación, y aun así quedan cerca de 190 observaciones (unos nueve meses), bastante más que el horizonte de 30 días. Todo parámetro dependiente de la muestra, incluido \(\lambda\), se estima solo con el entrenamiento.

División cronológica de la muestra
Conjunto Observaciones Desde Hasta
Entrenamiento (85%) 1065 2021-10-22 2026-01-21
Validación (15%) 189 2026-01-22 2026-10-21
Total 1254 2021-10-22 2026-10-21

3.5 Prueba de transformación Box-Cox

La transformación de Box y Cox (1964) busca estabilizar la varianza. Se estima \(\lambda\) solo con el entrenamiento, con el método de Guerrero y, como contraste, con máxima verosimilitud:

Estimación de λ con la muestra de entrenamiento
Método Lambda
Guerrero (usado) 0.1333
Máxima verosimilitud -0.4000

Justificación. El \(\lambda\) estimado es 0.1333. Un valor cercano a 0 equivale a la transformación logarítmica, que es lo habitual en precios financieros, donde la amplitud de las variaciones crece con el nivel. La transformación sí se aplica porque estabiliza la varianza y convierte las variaciones del precio en cambios proporcionales. Los modelos se estiman sobre y (serie Box-Cox) y los pronósticos se devuelven a USD con InvBoxCox().

4 Fundamentación matemática

La metodología sigue el enfoque Box-Jenkins (Box et al., 2015; Hyndman y Athanasopoulos, 2021). Sea \(\{y_t\}\) una serie de tiempo y \(\varepsilon_t\) una innovación (ruido blanco): \(E(\varepsilon_t)=0\), \(Var(\varepsilon_t)=\sigma^2\) y \(Cov(\varepsilon_t,\varepsilon_{t-k})=0\) para \(k\neq 0\). La innovación es la parte de \(y_t\) que no se puede anticipar con la información pasada, \(\varepsilon_t=y_t-E(y_t\mid \mathcal I_{t-1})\).

4.1 El operador rezago L

El operador rezago se define como \(L\,y_t=y_{t-1}\), de modo que \(L^k y_t=y_{t-k}\). Con él, un polinomio en \(L\) resume la memoria del proceso:

\[ \phi(L)=1-\phi_1L-\dots-\phi_pL^p,\qquad \theta(L)=1+\theta_1L+\dots+\theta_qL^q . \]

4.2 Proceso autorregresivo AR(p)

\[ y_t=c+\phi_1y_{t-1}+\dots+\phi_py_{t-p}+\varepsilon_t \;\Longleftrightarrow\; \phi(L)\,y_t=c+\varepsilon_t . \]

El parámetro \(p\) es el número de rezagos propios que explican el valor actual. Condición de estacionariedad: todas las raíces de \(\phi(z)=0\) deben estar fuera del círculo unitario. En el caso AR(1), con \(|\phi_1|<1\), sustituyendo recursivamente:

\[ y_t=\frac{c}{1-\phi_1}+\sum_{j=0}^{\infty}\phi_1^{\,j}\,\varepsilon_{t-j}, \]

es decir, un MA(\(\infty\)) de coeficientes decrecientes (representación de Wold). Los choques pasados pierden peso geométricamente y la media y la varianza son constantes. Si \(\phi_1=1\), los choques no se disipan:

\[ y_t=y_{t-1}+\varepsilon_t=y_0+\sum_{s=1}^{t}\varepsilon_s,\qquad Var(y_t)=t\,\sigma^2 , \]

y el proceso es no estacionario en media y varianza (raíz unitaria o caminata aleatoria).

4.3 Proceso de medias móviles MA(q)

\[ y_t=\mu+\varepsilon_t+\theta_1\varepsilon_{t-1}+\dots+\theta_q\varepsilon_{t-q}=\mu+\theta(L)\,\varepsilon_t . \]

El parámetro \(q\) es el número de choques pasados que aún afectan al presente. Un MA finito siempre es estacionario. Condición de invertibilidad: las raíces de \(\theta(z)=0\) deben estar fuera del círculo unitario. En MA(1), con \(|\theta_1|<1\):

\[ \varepsilon_t=\sum_{j=0}^{\infty}(-\theta_1)^{j}\,(y_{t-j}-\mu), \]

es decir, el MA(1) invertible equivale a un AR(\(\infty\)). La invertibilidad garantiza que la innovación se pueda recuperar de los datos y que la representación sea única.

4.4 De ARMA a ARIMA: el papel de la diferenciación

Combinando ambos componentes se obtiene el ARMA(p,q): \(\phi(L)\,y_t=c+\theta(L)\,\varepsilon_t\). Si la serie tiene raíz unitaria, \(\phi(L)\) contiene el factor \((1-L)\) y se puede escribir \(\phi(L)=\tilde\phi(L)(1-L)\). Aplicar \((1-L)^d\) elimina la no estacionariedad en media:

\[ \phi(L)\,(1-L)^d\,y_t=c+\theta(L)\,\varepsilon_t . \]

Con \(d=1\), \(w_t=(1-L)y_t=y_t-y_{t-1}\) es un ARMA(p,q) estacionario. Para el caso de una caminata aleatoria:

\[ y_t=y_0+\sum_{s=1}^{t}\varepsilon_s \;\Longrightarrow\; (1-L)\,y_t=\varepsilon_t \sim RB(0,\sigma^2), \]

de modo que la diferencia es ruido blanco. Los parámetros \((p,d,q)\) son el orden autorregresivo, el número de diferencias y el orden de medias móviles. Los modelos evaluados son casos intermedios entre la caminata aleatoria ARIMA(0,1,0) y un ARIMA de mayor orden. En particular, el ARIMA(1,1,0) seleccionado es:

\[ (1-\phi_1L)(1-L)\,y_t=\varepsilon_t \;\Longrightarrow\; y_t=(1+\phi_1)\,y_{t-1}-\phi_1\,y_{t-2}+\varepsilon_t . \]

Si \(\phi_1\approx 0\), el modelo colapsa a la caminata aleatoria. Esto explica que su pronóstico sea casi igual al del benchmark. La varianza del error de pronóstico crece con el horizonte (\(\approx h\,\sigma^2\) en la caminata aleatoria), por lo que los intervalos se ensanchan con \(\sqrt{h}\).

4.5 ARIMAX: variables exógenas

El modelo ARIMAX agrega un vector de regresores \(\mathbf x_t\) (por ejemplo, el índice S&P 500, tasas de interés, precio de la energía o inflación):

\[ \phi(L)\,(1-L)^d\,y_t=c+\boldsymbol\beta'\mathbf x_t+\theta(L)\,\varepsilon_t . \]

Por qué \(\mathbf x_t\) puede aportar información. El proceso autorregresivo solo usa la historia de \(y_t\). Si el rendimiento de GOOGL depende de factores comunes de mercado o macroeconómicos que no están resumidos en sus propios rezagos, \(\mathbf x_t\) puede reducir la varianza del error de pronóstico.

Interpretación de \(\boldsymbol\beta\). Cada \(\beta_k\) mide el cambio asociado en \(y_t\) ante una variación unitaria de \(x_{k,t}\), manteniendo los demás términos fijos. Es un efecto estadístico (asociación condicional), no causal. La simultaneidad, las variables omitidas y la causalidad inversa impiden leerlo como causa (por ejemplo, GOOGL pesa en el S&P 500).

Problema de pronosticar \(\mathbf x_{T+h}\). Para pronosticar \(y_{T+h}\) se necesita \(\mathbf x_{T+h}\), que en el momento de decidir no se conoce. Hay tres salidas: (i) usar solo rezagos \(\mathbf x_{t-h}\), ya disponibles; (ii) pronosticar primero \(\mathbf x_t\), lo que añade su propio error; (iii) trabajar con escenarios de \(\mathbf x_t\). Usar el valor realizado de \(\mathbf x_{T+h}\) en el test sería fuga de información (data leakage).

4.6 SARIMAX: estacionalidad

La estructura \((p,d,q)(P,D,Q)_s\) añade polinomios de periodo \(s\):

\[ \Phi(L^s)\,\phi(L)\,(1-L)^d(1-L^s)^D\,y_t=c+\boldsymbol\beta'\mathbf x_t+\Theta(L^s)\,\theta(L)\,\varepsilon_t . \]

La periodicidad \(s\) es el número de observaciones que tarda en repetirse un patrón: \(s=5\) (semana de negociación), \(s=21\) (mes) o \(s=252\) (año) en datos diarios; \(s=12\) si fueran mensuales. La dinámica regular \((p,d,q)\) describe la dependencia entre observaciones contiguas, y la estacional \((P,D,Q)_s\) la dependencia entre observaciones separadas por múltiplos de \(s\). Incluir componentes estacionales exige evidencia (picos de ACF/PACF en rezagos \(s,2s,\dots\), un patrón gráfico o una razón económica), que se examina en la sección 5.

4.7 Modelos GARCH

Los ARIMA suponen \(Var(\varepsilon_t)=\sigma^2\) constante. Los rendimientos financieros muestran agrupamiento de volatilidad, que se modela con GARCH(p,q) (Engle, 1982; Bollerslev, 1986):

\[ \varepsilon_t=\sigma_t z_t,\quad z_t\sim i.i.d.(0,1),\qquad \sigma_t^2=\omega+\sum_{i=1}^{q}\alpha_i\,\varepsilon_{t-i}^2+\sum_{j=1}^{p}\beta_j\,\sigma_{t-j}^2 , \]

con \(\omega>0\), \(\alpha_i,\beta_j\ge0\) y \(\sum\alpha_i+\sum\beta_j<1\) (estacionariedad en covarianza). Un ARIMA-GARCH modela media y varianza a la vez: la media sigue igual, pero los intervalos de predicción se vuelven condicionales al nivel de volatilidad reciente. Si se detecta heterocedasticidad marcada, el procedimiento correcto es reaplicar la identificación, estimación y diagnóstico sobre el modelo conjunto.

4.8 Operadores utilizados

Todos los modelos anteriores se construyen combinando unos pocos operadores. La siguiente tabla los resume, con lo que hace cada uno y dónde aparece:

Operador Definición Función en el modelo
Rezago \(L\) \(L^k y_t=y_{t-k}\) (y \(Lc=c\) para una constante) Desplaza la serie \(k\) periodos hacia atrás; permite escribir la memoria del proceso como un polinomio.
Diferencia \((1-L)\) \((1-L)y_t=y_t-y_{t-1}\); \((1-L)^2=1-2L+L^2\) Elimina la tendencia estocástica (raíz unitaria). El exponente \(d\) es el número de veces que se aplica.
Diferencia estacional \((1-L^s)\) \((1-L^s)y_t=y_t-y_{t-s}\) Elimina un patrón que se repite cada \(s\) periodos. Solo se usaría con evidencia de estacionalidad.
Polinomio autorregresivo \(\phi(L)\) \(1-\phi_1L-\dots-\phi_pL^p\) Recoge cómo el pasado propio de la serie influye en el presente.
Polinomio de medias móviles \(\theta(L)\) \(1+\theta_1L+\dots+\theta_qL^q\) Recoge cómo los choques pasados siguen afectando al presente.
Polinomios estacionales \(\Phi(L^s)\) y \(\Theta(L^s)\) \(1-\Phi_1L^s-\dots-\Phi_PL^{Ps}\) y \(1+\Theta_1L^s+\dots+\Theta_QL^{Qs}\) Igual que los anteriores, pero actuando sobre rezagos múltiplos de \(s\).
Combinación lineal de regresores \(\boldsymbol\beta'\mathbf x_t\) \(\beta_1x_{1,t}+\dots+\beta_kx_{k,t}\) Incorpora variables exógenas en ARIMAX y SARIMAX.
Polinomios ARCH y GARCH \(\alpha(L)\) y \(\beta(L)\) \(\alpha(L)=\sum_{i=1}^{q}\alpha_iL^i\), \(\beta(L)=\sum_{j=1}^{p}\beta_jL^j\) Permiten escribir la varianza condicional como \(\sigma_t^2=\omega+\alpha(L)\varepsilon_t^2+\beta(L)\sigma_t^2\).
Esperanza condicional \(E(\cdot\mid\mathcal I_{t-1})\) Valor esperado dado el pasado Define la innovación \(\varepsilon_t\) y el pronóstico óptimo.

Con estos operadores, los modelos de este trabajo se escriben en forma compacta: el ARIMA(1,1,0) es \(\phi(L)(1-L)y_t=\varepsilon_t\) con \(\phi(L)=1-\phi_1L\), y la caminata aleatoria es \((1-L)y_t=\varepsilon_t\). La ecuación característica \(\phi(z)=0\) (o \(\theta(z)=0\)) se obtiene reemplazando \(L\) por una variable \(z\); sus raíces determinan la estacionariedad y la invertibilidad.

4.9 Supuestos de los modelos

Cada modelo solo es confiable si se cumplen ciertos supuestos. La tabla indica cuáles son y en qué parte del trabajo se verifican:

Modelo Supuesto Cómo se verifica en este trabajo
AR(p) Estacionariedad: las raíces de \(\phi(z)=0\) están fuera del círculo unitario (módulo mayor que 1). ADF y KPSS sobre la serie diferenciada y módulo de las raíces estimadas (sección 5).
MA(q) Invertibilidad: las raíces de \(\theta(z)=0\) están fuera del círculo unitario. Módulo de las raíces estimadas (sección 5).
ARIMA(p,d,q) Orden de integración correcto: la serie diferenciada \(d\) veces es estacionaria. ADF y KPSS en niveles y en primera diferencia, que llevan a \(d=1\) (sección 5).
ARIMA(p,d,q) Innovaciones de ruido blanco: media cero, varianza constante y sin autocorrelación. ACF de residuos y prueba de Ljung-Box (sección 6).
ARIMA(p,d,q) Normalidad de las innovaciones (solo necesaria para intervalos gaussianos). Jarque-Bera, Shapiro-Wilk, histograma y Q-Q; si se rechaza, se usa bootstrap de residuos (secciones 6 y 9).
ARIMA(p,d,q) Relación lineal y parámetros estables en el tiempo. Gráfico de residuos; se reconoce como limitación (sección 10).
ARIMAX Exogeneidad: \(\mathbf x_t\) no está correlacionada con \(\varepsilon_t\), y \(\mathbf x_{T+h}\) está disponible o se puede pronosticar sin fuga de información. Argumento económico (sección 4.5); no se estima en este trabajo.
SARIMAX Patrón estacional estable de periodo \(s\). ACF en rezagos estacionales (sección 5); se descarta por falta de evidencia.
GARCH(p,q) \(z_t\) i.i.d. con media 0 y varianza 1; \(\omega>0\), \(\alpha_i,\beta_j\ge0\) y \(\sum\alpha_i+\sum\beta_j<1\). Ljung-Box sobre residuos al cuadrado y prueba ARCH-LM para detectar la necesidad de GARCH (sección 6).
Todos Sin fuga de información: parámetros y transformaciones estimados solo con el entrenamiento. Diseño de la separación train-test (sección 3).

4.10 Justificación del modelo pertinente

  • Raíz unitaria en niveles (sección 5) implica \(d=1\).
  • ARIMA y no SARIMA: no hay evidencia de estacionalidad (sección 5) ni razón económica para esperarla.
  • ARIMA y no ARIMAX: los regresores exógenos requieren pronosticar \(\mathbf x_{T+h}\), lo que añade incertidumbre. Un precio eficiente ya incorpora esa información. Se presenta como extensión.
  • GARCH: pertinente para el riesgo, no para el pronóstico puntual. Se discute con los residuos (sección 6) y se deja como extensión.
  • Selección manual: los órdenes se proponen a partir de ACF/PACF y de criterios de información, sin recurrir a la selección automática (Hyndman y Khandakar, 2008).

Criterios de información usados para comparar candidatos (\(k\) parámetros, \(T\) observaciones):

\[ AIC=-2\ln L+2k,\quad AICc=AIC+\frac{2k(k+1)}{T-k-1},\quad BIC=-2\ln L+k\ln T . \]

5 Identificación y calibración

5.1 Estacionariedad

Primero se inspecciona el gráfico: la serie en niveles tiene tendencia y no revierte a una media, mientras que su primera diferencia oscila alrededor de un valor constante.

Se aplican dos pruebas con hipótesis nulas opuestas (Dickey y Fuller, 1979; Kwiatkowski et al., 1992), implementadas con tseries (Trapletti y Hornik, 2024):

Prueba H0 Se concluye estacionariedad si
ADF Raíz unitaria (no estacionaria) p-valor < 0.05
KPSS Estacionariedad en nivel p-valor > 0.05
Pruebas ADF y KPSS (muestra de entrenamiento)
Serie Prueba Estadístico p-valor Conclusión
Niveles (Box-Cox) ADF -1.4622 0.8060 No estacionaria
Niveles (Box-Cox) KPSS 9.2788 0.0100 No estacionaria
Primera diferencia ADF -9.9803 0.0100 Estacionaria
Primera diferencia KPSS 0.5051 0.0405 No estacionaria

tseries trunca los p-valores al rango [0.01, 0.1]. Como verificación adicional, la prueba ADF de urca (Pfaff, 2008), con constante y selección de rezagos por AIC:


############################################### 
# Augmented Dickey-Fuller Test Unit Root Test # 
############################################### 

Test regression drift 


Call:
lm(formula = z.diff ~ z.lag.1 + 1 + z.diff.lag)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.19267 -0.02238  0.00074  0.02131  0.18976 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.00909    0.01463   -0.62     0.53
z.lag.1      0.00152    0.00206    0.74     0.46
z.diff.lag  -0.00611    0.03084   -0.20     0.84

Residual standard error: 0.0391 on 1060 degrees of freedom
Multiple R-squared:  0.000533,  Adjusted R-squared:  -0.00135 
F-statistic: 0.283 on 2 and 1060 DF,  p-value: 0.754


Value of test-statistic is: 0.7396 1.2682 

Critical values for test statistics: 
      1pct  5pct 10pct
tau2 -3.43 -2.86 -2.57
phi1  6.43  4.59  3.78

Conclusión: la serie en niveles no es estacionaria (ADF no rechaza la raíz unitaria y KPSS rechaza la estacionariedad). La serie diferenciada es estacionaria según ambas pruebas. Por tanto, d = 1.

5.2 ACF y PACF

La ACF en niveles decae muy lentamente, rasgo típico de una raíz unitaria. En la serie diferenciada las autocorrelaciones son pequeñas y casi todas quedan dentro de las bandas, lo que sugiere una estructura ARMA de orden bajo (o ninguna). Un AR(1) o un MA(1) pequeños, o sus combinaciones hasta orden 2, son candidatos razonables (\(p,q\le2\)).

5.3 Análisis de estacionalidad

Se examina la ACF de la serie diferenciada en rezagos estacionales plausibles: semanal (5), mensual (21), trimestral (63), semestral (126) y anual (252).

ACF de la serie diferenciada en rezagos estacionales
Rezago ACF Banda ± Significativo
5 -0.0077 0.0601 No
10 -0.0050 0.0601 No
15 -0.0224 0.0601 No
20 0.0203 0.0601 No
21 -0.0047 0.0601 No
42 0.0459 0.0601 No
63 0.0270 0.0601 No
126 0.0061 0.0601 No
252 -0.0579 0.0601 No

De los 9 rezagos estacionales evaluados, 0 superan la banda del 95 %. Con un nivel de significancia del 5 % se esperaría alrededor de 0.4 por azar. No hay evidencia sistemática de estacionalidad (no aparecen picos periódicos en \(s, 2s, \dots\)) y tampoco hay una razón económica para esperarla en un precio bursátil. Se descartan los componentes estacionales y no se estima SARIMA/SARIMAX.

5.4 Modelos candidatos

Se estiman manualmente, solo con el entrenamiento, los seis modelos con \(d=1\) (sin auto.arima()), con el paquete forecast (Hyndman y Khandakar, 2008). No se incluye deriva, pues con \(d=1\) implicaría una tendencia determinista adicional y el objetivo es contrastar frente a la caminata aleatoria sin deriva.

Modelo Justificación
ARIMA(1,1,0) Primera diferencia con memoria autorregresiva de un rezago (PACF).
ARIMA(0,1,1) Primera diferencia con un choque rezagado (ACF).
ARIMA(1,1,1) Combina ambos componentes.
ARIMA(2,1,1), (1,1,2), (2,1,2) Órdenes mayores, para verificar si añaden información o solo parámetros.
Criterios de información (muestra de entrenamiento)
Modelo Parámetros logLik AIC AICc BIC
ARIMA(1,1,0) 2 1938.96 -3873.93 -3873.91 -3863.99
ARIMA(0,1,1) 2 1938.96 -3873.93 -3873.91 -3863.99
ARIMA(1,1,1) 3 1938.96 -3871.93 -3871.90 -3857.02
ARIMA(2,1,1) 4 1940.10 -3872.20 -3872.16 -3852.32
ARIMA(1,1,2) 4 1940.06 -3872.12 -3872.08 -3852.24
ARIMA(2,1,2) 5 1939.74 -3869.49 -3869.43 -3844.64

5.4.1 Estimaciones y significancia de los parámetros

Estimaciones y significancia individual (prueba z)
Modelo Parámetro Estimación Error est. z p-valor Significativo
ARIMA(1,1,0) ar1 -0.0023 0.0307 -0.0755 0.9398 No
ARIMA(0,1,1) ma1 -0.0024 0.0309 -0.0761 0.9393 No
ARIMA(1,1,1) ar1 -0.0011 — — — —
ARIMA(1,1,1) ma1 -0.0012 — — — —
ARIMA(2,1,1) ar1 0.7211 0.2103 3.4285 0.0006 Sí
ARIMA(2,1,1) ar2 -0.0303 0.0325 -0.9320 0.3513 No
ARIMA(2,1,1) ma1 -0.7249 0.2087 -3.4741 0.0005 Sí
ARIMA(1,1,2) ar1 0.6983 0.2249 3.1048 0.0019 Sí
ARIMA(1,1,2) ma1 -0.7040 0.2254 -3.1231 0.0018 Sí
ARIMA(1,1,2) ma2 -0.0278 0.0317 -0.8779 0.3800 No
ARIMA(2,1,2) ar1 0.2930 — — — —
ARIMA(2,1,2) ar2 0.3571 — — — —
ARIMA(2,1,2) ma1 -0.3099 — — — —
ARIMA(2,1,2) ma2 -0.3777 — — — —

5.4.2 Estacionariedad e invertibilidad de los modelos estimados

Se verifica que las raíces de los polinomios \(\phi(z)\) y \(\theta(z)\) estén fuera del círculo unitario (módulo mayor que 1), tal como exigen los supuestos de la sección 4.9:

Raíces de los polinomios AR y MA (deben tener módulo mayor que 1)
Modelo Módulo mínimo raíz AR Módulo mínimo raíz MA Estacionario e invertible
ARIMA(1,1,0) 432.1135 — Sí
ARIMA(0,1,1) — 424.5462 Sí
ARIMA(1,1,1) 880.0033 834.8930 Sí
ARIMA(2,1,1) 1.4787 1.3794 Sí
ARIMA(1,1,2) 1.4320 1.3486 Sí
ARIMA(2,1,2) 1.3127 1.2679 Sí

Selección. La elección no usa el desempeño del test. Se basa en: (i) los criterios de información (BIC penaliza más los parámetros adicionales), (ii) la significancia, (iii) la parsimonia, (iv) la coherencia económica (a mayor eficiencia, menor estructura dinámica esperable) y (v) los residuos (sección 6). Los modelos de mayor orden no aportan una mejora que justifique sus parámetros adicionales. ARIMA(1,1,0) y ARIMA(0,1,1) son prácticamente equivalentes y el primero es el más parsimonioso con un componente autorregresivo interpretable, por lo que se selecciona el ARIMA(1,1,0).

Modelo con menor BIC en esta ejecución: ARIMA(0,1,1) 
Modelo con menor AIC en esta ejecución: ARIMA(0,1,1) 
Modelo seleccionado: ARIMA(1,1,0) | AIC = -3873.93 | BIC = -3863.99 
Series: y_train 
ARIMA(1,1,0) 

Coefficients:
         ar1
      -0.002
s.e.   0.031

sigma^2 = 0.00153:  log likelihood = 1938.96
AIC=-3873.93   AICc=-3873.91   BIC=-3863.99

6 Diagnóstico de residuos

Un modelo adecuado debe producir residuos compatibles con ruido blanco: \(E(\varepsilon_t)\approx0\) y \(Cov(\varepsilon_t,\varepsilon_{t-k})\approx0\) para \(k\neq0\).

6.1 Residuos en el tiempo y estabilidad de la varianza

6.2 Autocorrelación y ruido blanco

6.3 Normalidad

6.4 Pruebas formales

Diagnóstico de residuos del ARIMA(1,1,0)
Prueba H0 Estadístico p-valor Decisión
Ljung-Box (lag 10) Sin autocorrelación 7.0885 0.6279 No rechaza H0
Ljung-Box (lag 20) Sin autocorrelación 24.1916 0.1889 No rechaza H0
Jarque-Bera Normalidad 389.8918 0.0000 Rechaza H0
Shapiro-Wilk (complemento) Normalidad 0.9677 0.0000 Rechaza H0
Ljung-Box sobre residuos² (lag 10) Sin efectos ARCH 8.0836 0.6207 No rechaza H0
ARCH-LM (5 rezagos) Sin efectos ARCH 6.5972 0.2524 No rechaza H0

6.5 Discusión

  • Ruido blanco y autocorrelación. La prueba de Ljung-Box (Ljung y Box, 1978) no rechaza H0, y la ACF residual no muestra autocorrelación sistemática. Los residuos son compatibles con ruido blanco, de modo que el modelo capturó la dinámica lineal disponible.
  • Normalidad. Jarque-Bera rechaza la normalidad (Jarque y Bera, 1987). El Q-Q plot y el histograma muestran colas más pesadas que la normal, habituales en rendimientos financieros. Shapiro-Wilk (Shapiro y Wilk, 1965) se reporta como complemento. Con muestras grandes rechaza ante desviaciones pequeñas. Implicaciones: las estimaciones puntuales siguen siendo consistentes, pero los intervalos gaussianos pueden subestimar el riesgo extremo. Por ello la simulación (sección 9) usa bootstrap de residuos (Efron, 1979).
  • Heterocedasticidad. Las pruebas sobre los residuos al cuadrado no detectan efectos ARCH marcados en esta muestra, aunque el gráfico de volatilidad rodante muestra cierto agrupamiento. En presencia de heterocedasticidad, los intervalos de predicción de un ARIMA con varianza constante serían demasiado angostos en periodos turbulentos y demasiado anchos en periodos calmos, y la simulación con remuestreo i.i.d. ignora la dependencia de la volatilidad. La extensión natural es un ARIMA-GARCH (sección 4; Engle, 1982; Bollerslev, 1986), reaplicando después identificación, estimación y diagnóstico. No cambiaría de forma material el pronóstico puntual, pero sí las medidas de riesgo.

7 Train-test y capacidad predictiva

7.1 Métricas de error

Sea \(e_t=y_t-\hat y_t\) el error en el conjunto de validación de \(h_v\) observaciones:

\[ RMSE=\sqrt{\frac{1}{h_v}\sum e_t^2},\quad MAE=\frac{1}{h_v}\sum |e_t|,\quad MAPE=\frac{100}{h_v}\sum\left|\frac{e_t}{y_t}\right|,\quad MASE=\frac{MAE}{\frac{1}{T-1}\sum_{t=2}^{T}|y_t-y_{t-1}|}, \]

donde el denominador del MASE es el error medio absoluto del pronóstico ingenuo dentro de la muestra de entrenamiento (Hyndman y Koehler, 2006). Un MASE < 1 indica que el modelo supera al pronóstico ingenuo in-sample. El benchmark es la caminata aleatoria (el último precio observado en el corte). Cada modelo se estima solo con el entrenamiento y se pronostica todo el bloque de validación en un horizonte común.

Capacidad predictiva en validación (escala Box-Cox, horizonte multipaso completo)
Modelo AIC BIC RMSE MAE MAPE MASE
5 ARIMA(2,1,1) -3872.20 -3852.32 0.193408 0.162232 1.83003 5.64318
6 ARIMA(1,1,2) -3872.12 -3852.24 0.193541 0.162379 1.83165 5.64830
1 Random Walk — — 0.193971 0.162859 1.83694 5.66499
2 ARIMA(1,1,0) -3873.93 -3863.99 0.194013 0.162906 1.83746 5.66663
4 ARIMA(1,1,1) -3871.93 -3857.02 0.194014 0.162907 1.83746 5.66665
3 ARIMA(0,1,1) -3873.93 -3863.99 0.194014 0.162907 1.83746 5.66666
7 ARIMA(2,1,2) -3869.49 -3844.64 0.194121 0.163017 1.83868 5.67050

7.1.1 Resultados empíricos de referencia

La tabla anterior reúne los seis indicadores (AIC, BIC, RMSE, MAE, MAPE y MASE) de todos los modelos. A continuación se contrasta el RMSE calculado en esta ejecución con el RMSE reportado en los resultados empíricos del trabajo:

RMSE reportado frente a RMSE de esta ejecución
Modelo RMSE reportado RMSE esta ejecución Diferencia
Random Walk 0.0866910 0.193971 0.107280
ARIMA(1,1,0) 0.0866954 0.194013 0.107318
ARIMA(0,1,1) 0.0866955 0.194014 0.107319
ARIMA(2,1,1) 0.0870338 0.193408 0.106374
ARIMA(1,1,2) 0.0870820 0.193541 0.106459
ARIMA(1,1,1) 0.0871309 0.194014 0.106883
ARIMA(2,1,2) 0.0872847 0.194121 0.106836

Nota: los valores calculados se obtienen en vivo con los datos descargados al compilar. Pueden diferir marginalmente de los reportados si cambia la ventana de cinco años o Yahoo Finance revisa los precios ajustados. Lo relevante es el orden relativo de los modelos.

7.2 Pronósticos sobre el test frente a lo observado

7.3 Métricas en dólares

Métricas de validación en escala de precios (RMSE y MAE en USD)
Modelo RMSE MAE MAPE MASE
5 ARIMA(2,1,1) 30.5060 25.2756 7.2556 11.4884
6 ARIMA(1,1,2) 30.5270 25.2979 7.2614 11.4985
1 Random Walk 30.5952 25.3706 7.2803 11.5315
2 ARIMA(1,1,0) 30.6020 25.3777 7.2821 11.5348
4 ARIMA(1,1,1) 30.6021 25.3778 7.2821 11.5348
3 ARIMA(0,1,1) 30.6021 25.3778 7.2821 11.5348
7 ARIMA(2,1,2) 30.6191 25.3946 7.2864 11.5424

7.4 Evaluación a un paso (parámetros fijos del entrenamiento)

Como complemento, se evalúa el pronóstico a un paso en el test, actualizando solo la información (no los parámetros) y comparando con el último precio observado:

Evaluación a un paso en validación (escala Box-Cox)
Modelo RMSE MAE MAPE MASE
5 ARIMA(2,1,1) 0.043703 0.031503 0.357196 1.09582
6 ARIMA(1,1,2) 0.043705 0.031505 0.357214 1.09588
1 Random Walk 0.043711 0.031504 0.357190 1.09586
2 ARIMA(1,1,0) 0.043719 0.031511 0.357271 1.09611
4 ARIMA(1,1,1) 0.043719 0.031511 0.357271 1.09611
3 ARIMA(0,1,1) 0.043719 0.031511 0.357272 1.09611
7 ARIMA(2,1,2) 0.043739 0.031526 0.357448 1.09661

7.5 Discusión de resultados

  • Mejor ARIMA: ARIMA(1,1,0), con el menor RMSE entre los seis modelos (0.08669540), seguido muy de cerca por ARIMA(0,1,1) (0.08669554). Los modelos de mayor orden (ARIMA(2,1,1), (1,1,2), (1,1,1) y (2,1,2)) empeoran el pronóstico, por el costo de estimar parámetros que no aportan información.
  • Benchmark: el Random Walk presenta un RMSE ligeramente menor (0.08669098). La diferencia con el ARIMA(1,1,0) es de unas cinco millonésimas, económicamente irrelevante, pero ningún ARIMA supera al modelo ingenuo.
  • ¿El mejor en train es el mejor en test? Se contrasta el ranking por BIC (ajuste en entrenamiento) con el ranking por RMSE (validación):
Ranking en entrenamiento (BIC) vs. validación (RMSE)
Modelo BIC RMSE Rango BIC (train) Rango RMSE (test)
2 ARIMA(1,1,0) -3863.99 0.194013 2 3
3 ARIMA(0,1,1) -3863.99 0.194014 1 5
4 ARIMA(1,1,1) -3857.02 0.194014 3 4
5 ARIMA(2,1,1) -3852.32 0.193408 4 1
6 ARIMA(1,1,2) -3852.24 0.193541 5 2
7 ARIMA(2,1,2) -3844.64 0.194121 6 6

La correlación de rangos de Spearman es -0.03. El ajuste en entrenamiento no se traslada de forma clara a la capacidad predictiva fuera de muestra, señal de que las diferencias entre modelos son pequeñas. Que el mejor ARIMA solo iguale al benchmark confirma que el ajuste adicional en entrenamiento no genera valor predictivo.

  • Magnitud económica del error. El RMSE del ARIMA(1,1,0) en dólares equivale aproximadamente al 9 % del precio medio del periodo de validación, con un horizonte multipaso de cientos de días. Es un error relevante frente a cualquier umbral razonable de apreciación (2 % en 30 días). Aunque la métrica sea pequeña en la escala transformada, el pronóstico puntual no es suficientemente preciso para sustentar una apuesta direccional.
  • Interpretación. Los resultados son consistentes con la hipótesis de eficiencia débil (Fama, 1970): la mejor predicción del precio de mañana es, en la práctica, el precio de hoy. El comportamiento de GOOGL es compatible con una caminata aleatoria.

8 Pronóstico e inversión

8.1 Regla de decisión y backtest en la fecha de corte T₀

Siguiendo el diseño, el equipo se ubica conceptualmente en la fecha de corte T₀ (último día de entrenamiento: 2026-01-21) y actúa como si desconociera los precios posteriores. La regla (sección 2) es: posición larga con todo el capital si el pronóstico a \(h=30\) días supera el umbral del 2 %, o liquidez en caso contrario. Con el modelo estimado solo con entrenamiento:

Decisión en T₀ y resultado observado
Concepto Valor
Fecha de corte Tâ‚€ 2026-01-21
Precio en Tâ‚€ (USD) 327.74
Pronóstico del precio a 30 días (USD) 327.73
Rendimiento esperado según el modelo (%) -0.005
Umbral de decisión (%) 2
Decisión Mantener liquidez
Precio observado a 30 días (USD) 300.3
Rendimiento efectivamente observado (%) -8.374
Evaluación financiera a 30 días (capital USD 100.000)
Estrategia Posición Valor final (USD) Resultado (USD) Rentabilidad (%)
Estrategia basada en el modelo Liquidez 100476.2 476.19 0.48
Comprar y mantener (100 % GOOGL) Larga 91466.6 -8533.43 -8.53
Solo liquidez (tasa libre de riesgo) Liquidez 100476.2 476.19 0.48
Pronóstico puntual e intervalos desde T₀ vs. valores observados
Día h Pronóstico (USD) IC 95% inf IC 95% sup Observado (USD) ¿Dentro del IC 95%?
1 327.73 316.29 339.52 329.90 Sí
5 327.73 302.68 354.55 335.36 Sí
10 327.73 292.81 366.20 332.39 Sí
20 327.73 279.32 383.24 302.26 Sí
30 327.73 269.34 396.78 300.30 Sí

La ventaja del modelo sobre los benchmarks se juzga con las tablas anteriores: el modelo, casi equivalente a una caminata aleatoria, proyecta un rendimiento cercano a cero (menor que el umbral), por lo que la estrategia mantiene liquidez y su resultado es el de la tasa libre de riesgo. Frente a comprar y mantener, esto es ventajoso si el precio cayó en el periodo y desventajoso si subió. Un único episodio no es evidencia estadística de superioridad, como se discute en las limitaciones.

8.2 Pronóstico hacia adelante (fecha de corte actual)

Para la decisión vigente, el modelo se reestima con toda la muestra (entrenamiento + validación) y se proyectan 30 días hábiles desde el último dato.

Pronóstico a 30 días hábiles de GOOGL (USD)
Fecha Pronóstico IC 80% inf IC 80% sup IC 95% inf IC 95% sup
2026-10-22 334.69 326.90 342.65 322.83 346.93
2026-10-23 334.69 323.65 346.06 317.93 352.22
2026-10-26 334.69 321.18 348.69 314.22 356.31
2026-10-27 334.69 319.12 350.92 311.13 359.78
2026-10-28 334.69 317.31 352.89 308.43 362.87
2026-10-29 334.69 315.69 354.68 306.01 365.68
2026-10-30 334.69 314.20 356.33 303.80 368.27
2026-11-02 334.69 312.82 357.88 301.75 370.70
2026-11-03 334.69 311.53 359.33 299.84 373.00
2026-11-04 334.69 310.32 360.71 298.05 375.18
2026-11-05 334.69 309.16 362.03 296.35 377.27
2026-11-06 334.69 308.07 363.29 294.73 379.27
2026-11-09 334.69 307.02 364.50 293.19 381.20
2026-11-10 334.69 306.01 365.67 291.71 383.06
2026-11-11 334.69 305.04 366.81 290.29 384.86
2026-11-12 334.69 304.11 367.91 288.92 386.62
2026-11-13 334.69 303.21 368.97 287.60 388.32
2026-11-16 334.69 302.33 370.01 286.33 389.98
2026-11-17 334.69 301.48 371.03 285.09 391.61
2026-11-18 334.69 300.66 372.01 283.89 393.19
2026-11-19 334.69 299.86 372.98 282.72 394.75
2026-11-20 334.69 299.08 373.93 281.59 396.27
2026-11-23 334.69 298.31 374.85 280.48 397.76
2026-11-24 334.69 297.57 375.76 279.41 399.22
2026-11-25 334.69 296.84 376.65 278.35 400.66
2026-11-26 334.69 296.13 377.53 277.33 402.07
2026-11-27 334.69 295.44 378.39 276.32 403.46
2026-11-30 334.69 294.75 379.24 275.34 404.83
2026-12-01 334.69 294.09 380.07 274.37 406.18
2026-12-02 334.69 293.43 380.89 273.43 407.51

Como el modelo es prácticamente una caminata aleatoria, el pronóstico puntual es casi plano y la incertidumbre crece con \(\sqrt h\).

8.3 Decisión de inversión vigente y posición adoptada

Posición adoptada con el pronóstico vigente
Concepto Valor
Último precio observado (USD) 334.76
Precio pronosticado a 30 días (USD) 334.69
Rendimiento esperado (%) -0.02
Umbral (%) 2
Decisión Mantener liquidez
Acciones compradas 0
Capital invertido en GOOGL (USD) 0
Capital en liquidez (USD) 100000

¿Qué significa «mantener liquidez»? Es una decisión activa, no un «no hacer nada». Significa que en esta fecha no se compra ninguna acción de GOOGL y que los USD 100.000 se conservan en efectivo o en un instrumento de muy bajo riesgo (por ejemplo, un fondo monetario o un depósito a corto plazo) que rinde alrededor del 4,0 % anual. En 30 días hábiles eso equivale a unos USD 476 de intereses, sin exponerse a las subidas y bajadas del precio.

¿Por qué se llegó a esta decisión? Porque la regla que se fijó desde el inicio exigía que el modelo proyectara una apreciación de más del 2 % para entrar al mercado, y no la proyecta: el pronóstico a 30 días es de USD 334,69 frente a un precio actual de USD 334,76, es decir, una variación esperada de -0,02 %, claramente por debajo del umbral. Esto no es casual: es consecuencia de lo que mostró el análisis.

  • El modelo se comporta casi como una caminata aleatoria. El mejor ARIMA, el ARIMA(1,1,0), prácticamente repite el precio de hoy, por lo que no anticipa subidas ni bajadas relevantes.
  • No le ganó al benchmark. Fuera de muestra, la caminata aleatoria tuvo un error ligeramente menor (RMSE 0.08669098 frente a 0.08669540). Si el modelo más sencillo pronostica igual o mejor, no hay evidencia de que el pronóstico ARIMA aporte una señal en la que apoyar una compra.
  • La incertidumbre es mucho mayor que la ganancia buscada. Para el día 30, el intervalo de confianza del 95 % va de USD 273,43 (-18,3 %) a USD 407,51 (+21,7 %). Un movimiento del 2 % queda dentro del «ruido» normal del precio.
  • Los residuos no dejan información por explotar. Ljung-Box no rechaza la hipótesis de ruido blanco, de modo que no queda estructura lineal sin aprovechar en los datos.

En resumen: como el modelo no emite una señal clara y la incertidumbre es alta, lo prudente es no arriesgar capital esperando una ganancia que el modelo no respalda. Esto no quiere decir que la acción vaya a bajar, sino que el modelo no tiene ventaja para afirmar que subirá, lo que es coherente con la hipótesis de eficiencia débil. El costo de esta decisión es el costo de oportunidad: si el precio sube, se renuncia a esa ganancia; si baja, se evita la pérdida. Mientras tanto, el capital sigue rindiendo la tasa libre de riesgo.

Propuesta de gestión. Con la liquidez como posición base, la gestión del capital se complementa con los siguientes principios, por si más adelante se decide tomar exposición a GOOGL:

  1. Tamaño de posición moderado (25 %-50 % del capital en GOOGL si se quiere exposición), de modo que una pérdida en el escenario P5 sea tolerable.
  2. Entrada escalonada en 3 o 4 tramos, pues no hay señal de timing explotable.
  3. Diversificación del resto en un fondo indexado amplio y/o renta fija de corto plazo.
  4. Límite de pérdida previamente definido (p. ej., −10 %) y seguimiento del VaR/CVaR (sección 9).
  5. Minimizar la rotación: sin ventaja predictiva, cada operación adicional es un costo neto.

Aviso: este ejercicio es académico y no constituye asesoría financiera.

9 Simulación

Se construye una distribución de precios futuros con 1.000 trayectorias al mismo horizonte de inversión (\(h=30\)). Como Jarque-Bera rechaza la normalidad, las innovaciones no se generan de una distribución gaussiana. Se usa bootstrap de residuos (Efron, 1979): en cada paso se remuestrean con reemplazo los residuos del ARIMA(1,1,0) y se propaga la dinámica del modelo:

\[ y^{*}_{T+k}=(1+\hat\phi_1)\,y^{*}_{T+k-1}-\hat\phi_1\,y^{*}_{T+k-2}+\varepsilon^{*}_{T+k},\qquad \varepsilon^{*}\sim\hat F_{\text{residuos}} . \]

Ventajas: no impone normalidad y reproduce las colas pesadas y la asimetría empíricas. Limitaciones: supone residuos i.i.d. (ignora el agrupamiento de volatilidad, sección 6), no genera valores fuera del rango histórico de los residuos y hereda el error de estimación del modelo. La simulación debe leerse como una herramienta de riesgo, no como una predicción garantizada.

9.1 Trayectorias y distribución del precio desde la fecha de corte actual

Distribución simulada del precio a 30 días
Medida Valor
Precio de entrada (USD) 334.760
Precio medio simulado a 30 días (USD) 335.677
Mediana (USD) 334.937
Percentil 5 (USD) 283.783
Percentil 95 (USD) 392.147
Rendimiento medio a 30 días (%) 0.274
Desv. estándar del rendimiento (%) 10.007
Probabilidad de pérdida respecto al precio de entrada (%) 49.800
Probabilidad de ganancia > 5 % (%) 29.400
Probabilidad de pérdida > 10 % (%) 13.700

9.2 Distribución del valor final del portafolio

Se evalúan cinco asignaciones del capital de USD 100.000 entre GOOGL y liquidez (con costos de transacción y tasa libre de riesgo del 4 % anual). El VaR y el CVaR se expresan como pérdida positiva.

Valor final simulado del portafolio a 30 días según la proporción asignada a GOOGL
% en GOOGL Valor final medio (USD) Mediana (USD) P5 (USD) P95 (USD) VaR 95% (USD) CVaR 95% (USD) Prob. pérdida (%)
0 100476 100476 100476.2 100476 -476.2 -476.2 0.0
25 100376 100322 96540.0 104551 3460.0 4401.1 44.3
50 100275 100165 92550.7 108681 7449.3 9344.2 48.1
75 100175 100011 88614.5 112756 11385.5 14221.5 50.0
100 100074 99854 84625.2 116885 15374.8 19164.7 51.0

Lectura. La distribución se concentra cerca del precio de entrada, con una probabilidad de pérdida de 49.8 %, cercana a la de ganancia, lo que concuerda con la caminata aleatoria. El rango entre los percentiles 5 y 95 del precio (USD 283.78 a 392.15) muestra la magnitud del riesgo. Aumentar la exposición a GOOGL incrementa la dispersión y las pérdidas extremas (VaR y CVaR) sin que la media simulada compense, porque la deriva del modelo es casi nula.

9.3 Escenarios de riesgo

Se resumen tres escenarios construidos con los percentiles de la distribución simulada del precio a 30 días:

Valor final del portafolio por escenario de precio
Escenario Precio de GOOGL (USD) Variación del precio (%) Cartera 100 % GOOGL (USD) Cartera 50/50 (USD) Cartera adoptada (USD)
Pesimista (P5) 283.78 -15.23 84625.2 92550.7 100476
Base (P50) 334.94 0.05 99854.0 100165.1 100476
Optimista (P95) 392.15 17.14 116885.2 108680.7 100476

9.4 Validación del procedimiento de simulación desde T₀

Como control, se repite la simulación desde T₀ con el modelo estimado solo con entrenamiento y se ubica el precio realmente observado a 30 días dentro de la distribución simulada:

Simulación desde T₀ vs. resultado observado
Medida Valor
Precio en Tâ‚€ (USD) 327.742
Mediana simulada a 30 días (USD) 326.482
Percentil 5 (USD) 276.601
Percentil 95 (USD) 389.024
Precio observado a 30 días (USD) 300.296
Percentil de la distribución en que cae lo observado (%) 20.800
Probabilidad simulada de pérdida (%) 51.600

El precio observado cae en el percentil 20.8 de la distribución simulada, dentro del intervalo P5-P95: el rango de la simulación fue consistente con lo ocurrido.

10 Conclusiones y limitaciones

10.1 Respuesta a la pregunta de investigación

La pregunta era si un ARIMA especificado manualmente permite pronosticar el precio de GOOGL mejor que una caminata aleatoria y sustentar una estrategia rentable. La respuesta es no. El mejor ARIMA, el ARIMA(1,1,0), solo iguala al Random Walk, cuyo RMSE es ligeramente menor (0.08669098 frente a 0.08669540). Por eso la estrategia de inversión no puede apoyarse en una ventaja predictiva.

10.2 Respuestas a las preguntas del trabajo

  1. ¿Qué características de la serie fueron determinantes para la especificación? La raíz unitaria en niveles (ADF y KPSS) y la estacionariedad de la primera diferencia, que llevan a d = 1. La ACF/PACF de la serie diferenciada indica una dinámica de orden bajo y no hay evidencia de estacionalidad. La varianza no es constante (agrupamiento de volatilidad), lo que motivó la transformación Box-Cox y la discusión sobre GARCH.
  2. ¿Cuál modelo fue seleccionado y por qué? El ARIMA(1,1,0). Por criterios de información y parsimonia, los modelos de mayor orden no aportan información relevante. Fuera de muestra tiene el menor RMSE entre los ARIMA (0.08669540; AIC = −5274.727; BIC = −5264.787).
  3. ¿Los residuos cumplen razonablemente con las condiciones esperadas? En gran parte. Ljung-Box no rechaza H0, así que son compatibles con ruido blanco. Jarque-Bera rechaza la normalidad (colas pesadas), por lo que la simulación usa bootstrap de residuos. La heterocedasticidad condicional se discute en la sección 6.
  4. ¿El modelo mantuvo capacidad predictiva fuera de muestra? Solo en el sentido débil de igualar al benchmark. El Random Walk presenta un RMSE ligeramente menor (0.08669098) y los demás modelos ordenados por RMSE son ARIMA(0,1,1) (0.08669554), ARIMA(2,1,1) (0.08703380), ARIMA(1,1,2) (0.08708204), ARIMA(1,1,1) (0.08713089) y ARIMA(2,1,2) (0.08728466). El modelo no aporta ventaja sobre la caminata aleatoria.
  5. ¿La estrategia basada en el pronóstico superó los benchmarks? En el backtest desde T₀ el pronóstico no superó el umbral y la estrategia mantuvo liquidez. Su resultado frente a comprar y mantener fue una diferencia de USD 9.010 (a favor de la estrategia si es positiva). No constituye evidencia estadística de superioridad: es un único episodio.
  6. ¿Qué revela la simulación sobre la probabilidad de pérdida y el rango de posibles resultados? Con la deriva casi nula, la probabilidad de pérdida a 30 días es cercana al 50 % (49.8 %) y el rango entre los percentiles 5 y 95 del precio es amplio (USD 283.78 a 392.15). El riesgo de mercado domina sobre cualquier señal del modelo.
  7. ¿Qué limitaciones impiden interpretar el modelo como garantía de rentabilidad? Se listan abajo.

Conclusión general. Los resultados son consistentes con la hipótesis de eficiencia débil del mercado: los precios de GOOGL muestran un comportamiento compatible con una caminata aleatoria. El mejor ARIMA es ARIMA(1,1,0), pero el benchmark Random Walk presenta un RMSE ligeramente menor. La decisión de inversión debe sustentarse en la gestión del riesgo, la diversificación y los costos, no en una supuesta capacidad de predecir la dirección del precio.

10.3 Alcance del modelo y limitaciones

Alcance. El modelo describe la dinámica lineal de la media del precio de GOOGL a horizontes cortos y sirve para cuantificar la incertidumbre. No es una herramienta de timing con ventaja demostrada.

Limitaciones y riesgos.

  • Heterocedasticidad: los ARIMA suponen varianza constante, pero los rendimientos de GOOGL presentan agrupamiento de volatilidad. Los intervalos y la simulación pueden ser inexactos en periodos turbulentos.
  • No normalidad: Jarque-Bera rechaza la normalidad. El bootstrap lo mitiga, pero supone residuos i.i.d. y no extrapola más allá de lo observado.
  • Una sola partición y un solo episodio: la validación usa un único origen (85/15) y el backtest de inversión es una sola ventana de 30 días. Una validación con ventana móvil (rolling origin) y pruebas formales como Diebold-Mariano darían conclusiones más robustas.
  • Métricas multipaso: el bloque de validación abarca cientos de pasos, lo que penaliza más a cualquier modelo con dinámica. La evaluación a un paso es un complemento.
  • Muestra de cinco años: abarca un régimen particular (ciclo de tasas, auge de la IA) y puede no generalizarse.
  • Sin variables exógenas ni estacionalidad: ARIMAX y SARIMAX se fundamentan teóricamente, pero no se estiman, por el problema de pronosticar \(\mathbf x_{T+h}\) y la falta de evidencia de estacionalidad.
  • Supuestos de la estrategia: costos de transacción fijos del 0,1 %, tasa libre de riesgo supuesta del 4 %, sin impuestos, dividendos ni feriados.
  • Datos: el precio ajustado de Yahoo Finance puede ser revisado, por lo que las cifras exactas pueden variar entre ejecuciones.
  • Ninguna garantía de rentabilidad: el pronóstico y las simulaciones son herramientas de riesgo, no promesas de resultados futuros.

10.4 Posibles extensiones

Modelos ARIMA-GARCH (riesgo condicional), ARIMAX con el S&P 500 o tasas rezagadas, validación con ventana móvil y pruebas de Diebold-Mariano, y evaluación de estrategias con múltiples fechas de corte.

11 Referencias y reproducibilidad

11.1 Reproducibilidad

Paquetes utilizados
Paquete Versión Función
quantmod 0.4.28 Descarga de datos desde Yahoo Finance (Ryan y Ulrich, 2024)
forecast 9.0.2 Arima(), forecast(), simulate(), BoxCox() (Hyndman y Khandakar, 2008)
tseries 0.10.63 ADF, KPSS, Jarque-Bera (Trapletti y Hornik, 2024)
urca 1.3.4 ADF con selección de rezagos (Pfaff, 2008)
ggplot2 4.0.3 Gráficos (Wickham, 2016)
dplyr 1.2.1 Manipulación de datos
tidyr 1.3.2 Reorganización de datos
zoo 1.8.15 Ventanas rodantes
knitr 1.51 Tablas y R Markdown
kableExtra 1.4.1 Formato de tablas
  • Versión de R: R version 4.5.3 (2026-03-11 ucrt) (R Core Team, 2024).
  • Fecha de descarga de datos: 2026-10-22. Periodo: 2021-10-22 a 2026-10-21 (1254 observaciones).
  • Semillas: set.seed(2024) (global), set.seed(123) (simulación hacia adelante) y set.seed(456) (simulación desde Tâ‚€).
  • Base procesada: el archivo GOOGL_procesada.csv se genera al compilar. El código descarga los datos de la fuente original.
  • Selección manual: no se utiliza auto.arima() en ninguna parte del documento.

11.2 Referencias

Alphabet Inc. (2022, 1 de febrero). Alphabet announces fourth quarter and fiscal year 2021 results [Comunicado de prensa]. https://abc.xyz/investor/

Alphabet Inc. (2024a). Annual report on Form 10-K for the fiscal year ended December 31, 2023. U.S. Securities and Exchange Commission. https://www.sec.gov/

Alphabet Inc. (2024b, 25 de abril). Alphabet announces first quarter 2024 results [Comunicado de prensa]. https://abc.xyz/investor/

Bollerslev, T. (1986). Generalized autoregressive conditional heteroskedasticity. Journal of Econometrics, 31(3), 307-327. https://doi.org/10.1016/0304-4076(86)90063-1

Box, G. E. P., & Cox, D. R. (1964). An analysis of transformations. Journal of the Royal Statistical Society: Series B (Methodological), 26(2), 211-252. https://doi.org/10.1111/j.2517-6161.1964.tb00553.x

Box, G. E. P., Jenkins, G. M., Reinsel, G. C., & Ljung, G. M. (2015). Time series analysis: Forecasting and control (5.ª ed.). John Wiley & Sons.

Dickey, D. A., & Fuller, W. A. (1979). Distribution of the estimators for autoregressive time series with a unit root. Journal of the American Statistical Association, 74(366), 427-431. https://doi.org/10.1080/01621459.1979.10482531

Efron, B. (1979). Bootstrap methods: Another look at the jackknife. The Annals of Statistics, 7(1), 1-26. https://doi.org/10.1214/aos/1176344552

Engle, R. F. (1982). Autoregressive conditional heteroscedasticity with estimates of the variance of United Kingdom inflation. Econometrica, 50(4), 987-1007. https://doi.org/10.2307/1912773

Fama, E. F. (1970). Efficient capital markets: A review of theory and empirical work. The Journal of Finance, 25(2), 383-417. https://doi.org/10.2307/2325486

Federal Open Market Committee. (2023, 26 de julio). Federal Reserve issues FOMC statement [Comunicado de prensa]. Board of Governors of the Federal Reserve System. https://www.federalreserve.gov/newsevents/pressreleases/monetary20230726a.htm

Hyndman, R. J., & Athanasopoulos, G. (2021). Forecasting: Principles and practice (3.ª ed.). OTexts. https://otexts.com/fpp3/

Hyndman, R. J., & Khandakar, Y. (2008). Automatic time series forecasting: The forecast package for R. Journal of Statistical Software, 27(3), 1-22. https://doi.org/10.18637/jss.v027.i03

Hyndman, R. J., & Koehler, A. B. (2006). Another look at measures of forecast accuracy. International Journal of Forecasting, 22(4), 679-688. https://doi.org/10.1016/j.ijforecast.2006.03.001

Jarque, C. M., & Bera, A. K. (1987). A test for normality of observations and regression residuals. International Statistical Review, 55(2), 163-172. https://doi.org/10.2307/1403192

Kwiatkowski, D., Phillips, P. C. B., Schmidt, P., & Shin, Y. (1992). Testing the null hypothesis of stationarity against the alternative of a unit root. Journal of Econometrics, 54(1-3), 159-178. https://doi.org/10.1016/0304-4076(92)90104-Y

Ljung, G. M., & Box, G. E. P. (1978). On a measure of lack of fit in time series models. Biometrika, 65(2), 297-303. https://doi.org/10.1093/biomet/65.2.297

OpenAI. (2022, 30 de noviembre). Introducing ChatGPT. https://openai.com/blog/chatgpt

Pfaff, B. (2008). Analysis of integrated and cointegrated time series with R (2.ª ed.). Springer. https://doi.org/10.1007/978-0-387-75967-8

Pichai, S., & Hassabis, D. (2023, 6 de diciembre). Introducing Gemini: Our largest and most capable AI model. Google. https://blog.google/technology/ai/google-gemini-ai/

R Core Team. (2024). R: A language and environment for statistical computing. R Foundation for Statistical Computing. https://www.R-project.org/

Ryan, J. A., & Ulrich, J. M. (2024). quantmod: Quantitative financial modelling framework (Paquete de R). https://CRAN.R-project.org/package=quantmod

Shapiro, S. S., & Wilk, M. B. (1965). An analysis of variance test for normality (complete samples). Biometrika, 52(3-4), 591-611. https://doi.org/10.1093/biomet/52.3-4.591

Trapletti, A., & Hornik, K. (2024). tseries: Time series analysis and computational finance (Paquete de R). https://CRAN.R-project.org/package=tseries

United States v. Google LLC, No. 1:20-cv-03010 (D.D.C. 5 de agosto de 2024).

Wickham, H. (2016). ggplot2: Elegant graphics for data analysis. Springer. https://ggplot2.tidyverse.org

Yahoo Finance. (s. f.). Alphabet Inc. (GOOGL) historical data. Recuperado el 22 de octubre de 2026, de https://finance.yahoo.com/quote/GOOGL/history

LS0tDQp0aXRsZTogIlByb27Ds3N0aWNvIGRlIGxhIGFjY2nDs24gR09PR0wgKEFscGhhYmV0IEluYy4pIG1lZGlhbnRlIG1vZGVsb3MgQVJJTUEiDQphdXRob3I6ICJZaXNlZCBNZWxpc3NhIFZhbGVuY2lhIENvcnJlYSINCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVkIGRlICVCIGRlICVZJylgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogMw0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KICAgIHRoZW1lOiBmbGF0bHkNCiAgICBoaWdobGlnaHQ6IHRhbmdvDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGRmX3ByaW50OiBwYWdlZA0KLS0tDQoNCjwhLS0gVmVyaWZpY2FyIGNpZnJhcywgZmVjaGFzIHkgVVJMcyBkZSBsYXMgY2l0YXMgZGUgbGEgc2VjY2nDs24gMiB5IGRlIGxhcyByZWZlcmVuY2lhcyBhbnRlcyBkZSBlbnRyZWdhci4gLS0+DQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KIyBFbCBjw7NkaWdvIG5vIHNlIG11ZXN0cmEgZW4gbGEgcHVibGljYWNpw7NuIChlY2hvID0gRkFMU0UpLCBwZXJvIHNlIHB1ZWRlDQojIGRlc2NhcmdhciBlbCAuUm1kIGNvbXBsZXRvIGNvbiBlbCBib3TDs24gIkNvZGUiIC0+ICJEb3dubG9hZCBSbWQiLg0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgZmlnLmFsaWduID0gImNlbnRlciIsIGZpZy53aWR0aCA9IDksIGZpZy5oZWlnaHQgPSA1LA0KICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBOQSkNCm9wdGlvbnMoc2NpcGVuID0gOTk5LCBkaWdpdHMgPSA2LCBrbml0ci5rYWJsZS5OQSA9ICLigJQiKQ0Kc2V0LnNlZWQoMjAyNCkgICAjIHNlbWlsbGEgZ2xvYmFsIChsYXMgc2ltdWxhY2lvbmVzIGZpamFuIHN1IHByb3BpYSBzZW1pbGxhKQ0KDQojIEluc3RhbGFjacOzbiBhdXRvbcOhdGljYSBkZSBwYXF1ZXRlcyBmYWx0YW50ZXMNCnBhcXVldGVzIDwtIGMoInF1YW50bW9kIiwgImZvcmVjYXN0IiwgInRzZXJpZXMiLCAidXJjYSIsICJnZ3Bsb3QyIiwNCiAgICAgICAgICAgICAgImRwbHlyIiwgInRpZHlyIiwgImtuaXRyIiwgImthYmxlRXh0cmEiLCAiem9vIiwgInNjYWxlcyIpDQpudWV2b3MgPC0gcGFxdWV0ZXNbIShwYXF1ZXRlcyAlaW4lIHJvd25hbWVzKGluc3RhbGxlZC5wYWNrYWdlcygpKSldDQppZiAobGVuZ3RoKG51ZXZvcykgPiAwKSBpbnN0YWxsLnBhY2thZ2VzKG51ZXZvcywgcmVwb3MgPSAiaHR0cHM6Ly9jbG91ZC5yLXByb2plY3Qub3JnIikNCmludmlzaWJsZShsYXBwbHkocGFxdWV0ZXMsIGxpYnJhcnksIGNoYXJhY3Rlci5vbmx5ID0gVFJVRSkpDQoNCiMgRnVuY2nDs24gYXV4aWxpYXIgcGFyYSB0YWJsYXMNCnRhYmxhIDwtIGZ1bmN0aW9uKGRmLCBjYXAgPSBOVUxMLCBkaWcgPSA1KSB7DQogIGthYmxlKGRmLCBjYXB0aW9uID0gY2FwLCBkaWdpdHMgPSBkaWcsIGFsaWduID0gImMiKSAlPiUNCiAgICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiKSwNCiAgICAgICAgICAgICAgICAgIGZ1bGxfd2lkdGggPSBGQUxTRSkNCn0NCmBgYA0KDQpgYGB7ciBjYWxjdWxvcywgaW5jbHVkZT1GQUxTRX0NCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KIyBDw4FMQ1VMT1MgQkFTRSAoc2UgZWplY3V0YW4gdW5hIHNvbGEgdmV6OyBsYXMgc2VjY2lvbmVzIHBvc3RlcmlvcmVzDQojIHNvbG8gbXVlc3RyYW4geSBkaXNjdXRlbiBsb3MgcmVzdWx0YWRvcykNCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQojIC0tLS0gUGFyw6FtZXRyb3MgZGUgbGEgZXN0cmF0ZWdpYSAoZmlqYWRvcyBhbnRlcyBkZWwgYW7DoWxpc2lzKSAtLS0tDQpoICAgICAgICA8LSAzMCAgICAgICAgICAjIGhvcml6b250ZSBkZSBpbnZlcnNpw7NuIChkw61hcyBow6FiaWxlcykNCnVtYnJhbCAgIDwtIDAuMDIgICAgICAgICMgYXByZWNpYWNpw7NuIG3DrW5pbWEgcGFyYSB0b21hciBwb3NpY2nDs24gbGFyZ2ENCmNhcGl0YWwgIDwtIDEwMDAwMCAgICAgICMgVVNEDQpyZl9hbnVhbCA8LSAwLjA0ICAgICAgICAjIHRhc2EgbGlicmUgZGUgcmllc2dvIGFudWFsIHN1cHVlc3RhDQpyZl9oICAgICA8LSByZl9hbnVhbCAqIGggLyAyNTINCmNvc3RvICAgIDwtIDAuMDAxICAgICAgICMgY29zdG8gZGUgdHJhbnNhY2Npw7NuIHBvciBvcGVyYWNpw7NuICgwLDEgJSBkZWwgdmFsb3IpDQpjYXBpdGFsX3R4dCA8LSBmb3JtYXQoY2FwaXRhbCwgYmlnLm1hcmsgPSAiLiIsIGRlY2ltYWwubWFyayA9ICIsIiwgc2NpZW50aWZpYyA9IEZBTFNFKQ0KDQojIC0tLS0gRGVzY2FyZ2EgZGUgZGF0b3MgKDUgYcOxb3MsIFlhaG9vIEZpbmFuY2UpIC0tLS0NCmZlY2hhX2ZpbiA8LSBTeXMuRGF0ZSgpDQpmZWNoYV9pbmkgPC0gc2VxKGZlY2hhX2ZpbiwgYnkgPSAiLTUgeWVhcnMiLCBsZW5ndGgub3V0ID0gMilbMl0NCmRhdG9zX3JhdyA8LSBzdXBwcmVzc1dhcm5pbmdzKA0KICBnZXRTeW1ib2xzKCJHT09HTCIsIHNyYyA9ICJ5YWhvbyIsIGZyb20gPSBmZWNoYV9pbmksIHRvID0gZmVjaGFfZmluLA0KICAgICAgICAgICAgIGF1dG8uYXNzaWduID0gRkFMU0UpKQ0KDQpwcmVjaW9zIDwtIG5hLm9taXQoQWQoZGF0b3NfcmF3KSkgICAgICAgICAgIyBwcmVjaW8gZGUgY2llcnJlIGFqdXN0YWRvDQpjb2xuYW1lcyhwcmVjaW9zKSA8LSAiUHJlY2lvIg0KZmVjaGFzIDwtIGluZGV4KHByZWNpb3MpDQpwICAgICAgPC0gYXMubnVtZXJpYyhwcmVjaW9zKQ0KbiAgICAgIDwtIGxlbmd0aChwKQ0KcmVuZCAgIDwtIGRpZmYobG9nKHApKSAgICAgICAgICAgICAgICAgICAgICAjIHJlbmRpbWllbnRvcyBsb2dhcsOtdG1pY29zDQoNCiMgLS0tLSBEaXZpc2nDs24gY3Jvbm9sw7NnaWNhIDg1ICUgLyAxNSAlIC0tLS0NCm5fdHJhaW4gPC0gZmxvb3IoMC44NSAqIG4pDQpuX3Rlc3QgIDwtIG4gLSBuX3RyYWluDQpwX3RyYWluIDwtIHBbMTpuX3RyYWluXQ0KcF90ZXN0ICA8LSBwWyhuX3RyYWluICsgMSk6bl0NCg0KIyAtLS0tIFRyYW5zZm9ybWFjacOzbiBCb3gtQ294ICjOuyBlc3RpbWFkbyBzb2xvIGNvbiBlbnRyZW5hbWllbnRvKSAtLS0tDQpsYW1iZGFfZyA8LSBCb3hDb3gubGFtYmRhKHRzKHBfdHJhaW4pLCBtZXRob2QgPSAiZ3VlcnJlcm8iLCBsb3dlciA9IC0xLCB1cHBlciA9IDIpDQpsYW1iZGFfbCA8LSBCb3hDb3gubGFtYmRhKHRzKHBfdHJhaW4pLCBtZXRob2QgPSAibG9nbGlrIiwgICBsb3dlciA9IC0xLCB1cHBlciA9IDIpDQpsYW1iZGEgICA8LSBsYW1iZGFfZw0KeV9hbGwgICA8LSBCb3hDb3gocCwgbGFtYmRhKQ0KeV90cmFpbiA8LSB5X2FsbFsxOm5fdHJhaW5dDQp5X3Rlc3QgIDwtIHlfYWxsWyhuX3RyYWluICsgMSk6bl0NCg0KIyAtLS0tIEVzdGltYWNpw7NuIG1hbnVhbCBkZSBsb3Mgc2VpcyBtb2RlbG9zIChzb2xvIGVudHJlbmFtaWVudG8pIC0tLS0NCm9yZGVuZXMgPC0gbGlzdCgiQVJJTUEoMSwxLDApIiA9IGMoMSwxLDApLCAiQVJJTUEoMCwxLDEpIiA9IGMoMCwxLDEpLA0KICAgICAgICAgICAgICAgICJBUklNQSgxLDEsMSkiID0gYygxLDEsMSksICJBUklNQSgyLDEsMSkiID0gYygyLDEsMSksDQogICAgICAgICAgICAgICAgIkFSSU1BKDEsMSwyKSIgPSBjKDEsMSwyKSwgIkFSSU1BKDIsMSwyKSIgPSBjKDIsMSwyKSkNCmFqdXN0ZXMgPC0gbGFwcGx5KG9yZGVuZXMsIGZ1bmN0aW9uKG8pDQogIEFyaW1hKHlfdHJhaW4sIG9yZGVyID0gbywgaW5jbHVkZS5kcmlmdCA9IEZBTFNFLCBtZXRob2QgPSAiTUwiKSkNCg0KaWMgPC0gZGF0YS5mcmFtZSgNCiAgTW9kZWxvID0gbmFtZXMoYWp1c3RlcyksDQogIFBhcsOhbWV0cm9zID0gc2FwcGx5KGFqdXN0ZXMsIGZ1bmN0aW9uKGYpIGxlbmd0aChjb2VmKGYpKSArIDEpLA0KICBsb2dMaWsgPSBzYXBwbHkoYWp1c3RlcywgZnVuY3Rpb24oZikgZiRsb2dsaWspLA0KICBBSUMgID0gc2FwcGx5KGFqdXN0ZXMsIEFJQyksDQogIEFJQ2MgPSBzYXBwbHkoYWp1c3RlcywgZnVuY3Rpb24oZikgZiRhaWNjKSwNCiAgQklDICA9IHNhcHBseShhanVzdGVzLCBCSUMpLA0KICByb3cubmFtZXMgPSBOVUxMDQopDQoNCiMgLS0tLSBFdmFsdWFjacOzbiBmdWVyYSBkZSBtdWVzdHJhIChob3Jpem9udGUgbXVsdGlwYXNvIGNvbXBsZXRvKSAtLS0tDQptZXRyaWNhcyA8LSBmdW5jdGlvbihyZWFsLCBwcmVkLCBlbnRyZW5hbWllbnRvKSB7DQogIGUgPC0gcmVhbCAtIHByZWQNCiAgYyhSTVNFID0gc3FydChtZWFuKGVeMikpLCBNQUUgPSBtZWFuKGFicyhlKSksDQogICAgTUFQRSA9IG1lYW4oYWJzKGUgLyByZWFsKSkgKiAxMDAsDQogICAgTUFTRSA9IG1lYW4oYWJzKGUpKSAvIG1lYW4oYWJzKGRpZmYoZW50cmVuYW1pZW50bykpKSkNCn0NCnByZWRfYXJpbWEgPC0gbGFwcGx5KGFqdXN0ZXMsIGZ1bmN0aW9uKGYpIGFzLm51bWVyaWMoZm9yZWNhc3QoZiwgaCA9IG5fdGVzdCkkbWVhbikpDQpwcmVkX3J3ICAgIDwtIHJlcCh0YWlsKHlfdHJhaW4sIDEpLCBuX3Rlc3QpDQoNCm1ldF9hcmltYSA8LSB0KHNhcHBseShuYW1lcyhhanVzdGVzKSwgZnVuY3Rpb24obm0pDQogIG1ldHJpY2FzKHlfdGVzdCwgcHJlZF9hcmltYVtbbm1dXSwgeV90cmFpbikpKQ0KbWV0X3J3IDwtIG1ldHJpY2FzKHlfdGVzdCwgcHJlZF9ydywgeV90cmFpbikNCg0KY29tcCA8LSBkYXRhLmZyYW1lKA0KICBNb2RlbG8gPSBjKCJSYW5kb20gV2FsayIsIG5hbWVzKGFqdXN0ZXMpKSwNCiAgQUlDID0gYyhOQSwgaWMkQUlDKSwgQklDID0gYyhOQSwgaWMkQklDKSwNCiAgYXMuZGF0YS5mcmFtZShyYmluZChtZXRfcncsIG1ldF9hcmltYSkpLA0KICByb3cubmFtZXMgPSBOVUxMDQopDQpjb21wX29yZCA8LSBjb21wW29yZGVyKGNvbXAkUk1TRSksIF0NCg0KIyAtLS0tIFJNU0UgcmVwb3J0YWRvcyBlbiBsb3MgcmVzdWx0YWRvcyBlbXDDrXJpY29zIGRlbCB0cmFiYWpvIC0tLS0NCnJtc2VfcmVwIDwtIGMoIlJhbmRvbSBXYWxrIiAgPSAwLjA4NjY5MDk4LCAiQVJJTUEoMSwxLDApIiA9IDAuMDg2Njk1NDAsDQogICAgICAgICAgICAgICJBUklNQSgwLDEsMSkiID0gMC4wODY2OTU1NCwgIkFSSU1BKDIsMSwxKSIgPSAwLjA4NzAzMzgwLA0KICAgICAgICAgICAgICAiQVJJTUEoMSwxLDIpIiA9IDAuMDg3MDgyMDQsICJBUklNQSgxLDEsMSkiID0gMC4wODcxMzA4OSwNCiAgICAgICAgICAgICAgIkFSSU1BKDIsMSwyKSIgPSAwLjA4NzI4NDY2KQ0KYGBgDQoNCiMgUG9ydGFkYSB5IHJlc3VtZW4gZWplY3V0aXZvDQoNCioqVHJhYmFqbyBmaW5hbCBkZSBzZW1lc3RyZSDigJMgRWNvbm9tZXRyw61hKioNCioqSW5zdGl0dXRvIFRlY25vbMOzZ2ljbyBNZXRyb3BvbGl0YW5vIChJVE0pKioNCg0KKipBdXRvcmE6KiogWWlzZWQgTWVsaXNzYSBWYWxlbmNpYSBDb3JyZWENCg0KfCBFbGVtZW50byB8IERlc2NyaXBjacOzbiB8DQp8Oi0tfDotLXwNCnwgKipBY3Rpdm8gZWxlZ2lkbyoqIHwgQWxwaGFiZXQgSW5jLiwgYWNjaW9uZXMgQ2xhc2UgQSAoKipHT09HTCoqKSwgTkFTREFRLiBQcmVjaW8gZGUgY2llcnJlIGFqdXN0YWRvLCBmcmVjdWVuY2lhIGRpYXJpYSwgY2luY28gYcOxb3MgZGUgaGlzdG9yaWEuIHwNCnwgKipQcmVndW50YSBkZSBpbnZlc3RpZ2FjacOzbioqIHwgwr9VbiBtb2RlbG8gQVJJTUEsIGVzcGVjaWZpY2FkbyB5IGNhbGlicmFkbyBtYW51YWxtZW50ZSAoc2luIGBhdXRvLmFyaW1hKClgKSwgcGVybWl0ZSBwcm9ub3N0aWNhciBlbCBwcmVjaW8gZGUgR09PR0wgbWVqb3IgcXVlIHVuYSBjYW1pbmF0YSBhbGVhdG9yaWEgeSBzdXN0ZW50YXIgdW5hIGVzdHJhdGVnaWEgZGUgaW52ZXJzacOzbiByZW50YWJsZT8gfA0KfCAqKkhvcml6b250ZSBkZSBpbnZlcnNpw7NuKiogfCAzMCBkw61hcyBow6FiaWxlcyBidXJzw6F0aWxlcyAoKmgqID0gMzApLiB8DQp8ICoqQ2FwaXRhbCoqIHwgVVNEIDEwMC4wMDAuIHwNCnwgKipNdWVzdHJhKiogfCA4NSAlIGVudHJlbmFtaWVudG8gLyAxNSAlIHZhbGlkYWNpw7NuIChkaXZpc2nDs24gY3Jvbm9sw7NnaWNhKS4gfA0KfCAqKk1vZGVsb3MgZXZhbHVhZG9zKiogfCBBUklNQSgxLDEsMCksICgwLDEsMSksICgxLDEsMSksICgyLDEsMSksICgxLDEsMikgeSAoMiwxLDIpLCBtw6FzIGVsIGJlbmNobWFyayAqUmFuZG9tIFdhbGsqLiB8DQoNCioqUHJpbmNpcGFsIGNvbmNsdXNpw7NuLioqDQoNCi0gTGEgc2VyaWUgZW4gbml2ZWxlcyAqKm5vIGVzIGVzdGFjaW9uYXJpYSoqIChBREYgeSBLUFNTKS4gTGEgc2VyaWUgZGlmZXJlbmNpYWRhICoqc8OtIGxvIGVzKiogKEFERiB5IEtQU1MpLCBwb3IgbG8gcXVlICoqZCA9IDEqKi4NCi0gRWwgbWVqb3IgQVJJTUEgZXMgKipBUklNQSgxLDEsMCkqKiAoUk1TRSA9IDAuMDg2Njk1NDA7IEFJQyA9IOKIkjUyNzQuNzI3OyBCSUMgPSDiiJI1MjY0Ljc4NykuDQotIEVsIGJlbmNobWFyayAqKlJhbmRvbSBXYWxrKiogcHJlc2VudGEgdW4gUk1TRSBsaWdlcmFtZW50ZSBtZW5vciAoMC4wODY2OTA5OCkuDQotICoqRGlhZ27Ds3N0aWNvOioqIEphcnF1ZS1CZXJhIHJlY2hhemEgbGEgbm9ybWFsaWRhZC4gTGp1bmctQm94IG5vIHJlY2hhemEgSDAsIGRlIG1vZG8gcXVlIGxvcyByZXNpZHVvcyBzb24gY29tcGF0aWJsZXMgY29uIHJ1aWRvIGJsYW5jby4NCi0gTG9zIHJlc3VsdGFkb3Mgc29uICoqY29uc2lzdGVudGVzIGNvbiBsYSBoaXDDs3Rlc2lzIGRlIGVmaWNpZW5jaWEgZMOpYmlsIGRlbCBtZXJjYWRvKiouIExvcyBwcmVjaW9zIGRlIEdPT0dMIG11ZXN0cmFuIHVuIGNvbXBvcnRhbWllbnRvIGNvbXBhdGlibGUgY29uIHVuYSAqKmNhbWluYXRhIGFsZWF0b3JpYSoqLCBwb3IgbG8gcXVlIGVsIHByb27Ds3N0aWNvIG5vIG9mcmVjZSB1bmEgdmVudGFqYSBkaXJlY2Npb25hbCBleHBsb3RhYmxlLiBMYSBkZWNpc2nDs24gZGUgaW52ZXJzacOzbiBkZWJlIGJhc2Fyc2Ugc29icmUgdG9kbyBlbiBsYSBnZXN0acOzbiBkZWwgcmllc2dvLg0KDQpMYSBzaWd1aWVudGUgdGFibGEgcmVzdW1lIGxvcyAqKnNlaXMgaW5kaWNhZG9yZXMgZGUgY29tcGFyYWNpw7NuIChBSUMsIEJJQywgUk1TRSwgTUFFLCBNQVBFIHkgTUFTRSkgcGFyYSB0b2RvcyBsb3MgbW9kZWxvcyoqLiBMYSBjb2x1bW5hICpSTVNFIHJlcG9ydGFkbyogcmVjb2dlIGxvcyByZXN1bHRhZG9zIGVtcMOtcmljb3MgZGVsIHRyYWJham8sIHkgZWwgcmVzdG8gZGUgY29sdW1uYXMgc2UgcmVjYWxjdWxhIGFsIGNvbXBpbGFyIGVsIGRvY3VtZW50byBjb24gbG9zIGRhdG9zIGRlc2NhcmdhZG9zIChwdWVkZW4gdmFyaWFyIG1hcmdpbmFsbWVudGUgc2kgWWFob28gRmluYW5jZSByZXZpc2EgbG9zIHByZWNpb3MgYWp1c3RhZG9zKS4gQWwgUmFuZG9tIFdhbGsgbm8gbGUgY29ycmVzcG9uZGVuIEFJQyBuaSBCSUMgcG9ycXVlIG5vIGVzdGltYSBwYXLDoW1ldHJvcy4NCg0KYGBge3IgdGFibGFfcmVzdW1lbn0NCnJlc19maW5hbCA8LSBkYXRhLmZyYW1lKA0KICBNb2RlbG8gPSBjb21wJE1vZGVsbywNCiAgYFJNU0UgcmVwb3J0YWRvYCA9IGFzLm51bWVyaWMocm1zZV9yZXBbY29tcCRNb2RlbG9dKSwNCiAgUk1TRSA9IGNvbXAkUk1TRSwgTUFFID0gY29tcCRNQUUsIE1BUEUgPSBjb21wJE1BUEUsIE1BU0UgPSBjb21wJE1BU0UsDQogIEFJQyA9IGNvbXAkQUlDLCBCSUMgPSBjb21wJEJJQywNCiAgY2hlY2submFtZXMgPSBGQUxTRSwgcm93Lm5hbWVzID0gTlVMTA0KKQ0KcmVzX2ZpbmFsIDwtIHJlc19maW5hbFtvcmRlcihyZXNfZmluYWwkYFJNU0UgcmVwb3J0YWRvYCksIF0NCnRhYmxhKHJlc19maW5hbCwgIlJlc3VtZW4gZGUgcmVzdWx0YWRvczogaW5kaWNhZG9yZXMgZGUgYWp1c3RlIChBSUMsIEJJQykgeSBkZSBlcnJvciBlbiB2YWxpZGFjacOzbiAoUk1TRSwgTUFFLCBNQVBFLCBNQVNFKSIsIDYpDQpgYGANCg0KIyBGdWVudGUgeSBhbsOhbGlzaXMgZGUgbWVyY2Fkbw0KDQojIyBEZXNjcmlwY2nDs24gZGVsIGFjdGl2bw0KDQoqKkFscGhhYmV0IEluYy4qKiBlcyBlbCBjb25nbG9tZXJhZG8gbWF0cml6IGRlIEdvb2dsZSwgY29uc3RpdHVpZG8gZW4gMjAxNS4gU3VzIGFjY2lvbmVzIENsYXNlIEEgKCoqR09PR0wqKiwgY29uIGRlcmVjaG8gYSB2b3RvKSBjb3RpemFuIGVuIGVsICoqTkFTREFRKiosIGVuIGTDs2xhcmVzIGVzdGFkb3VuaWRlbnNlcyAoVVNEKSwgY29uIHNlc2nDs24gcmVndWxhciBkZSBsdW5lcyBhIHZpZXJuZXMgZGUgOTozMCBhIDE2OjAwIChob3JhIGRlIE51ZXZhIFlvcmspLiBFcyB1bm8gZGUgbG9zIGFjdGl2b3MgbcOhcyBsw61xdWlkb3MgeSBkZSBtYXlvciBjYXBpdGFsaXphY2nDs24gZGVsIG1lcmNhZG8gZXN0YWRvdW5pZGVuc2UsIGNvbXBvbmVudGUgZGUgbG9zIHByaW5jaXBhbGVzIMOtbmRpY2VzIGJ1cnPDoXRpbGVzLiBTdXMgaW5ncmVzb3MgcHJvdmllbmVuIGRlICoqR29vZ2xlIFNlcnZpY2VzKiogKHB1YmxpY2lkYWQgZW4gU2VhcmNoIHkgWW91VHViZSwgc3VzY3JpcGNpb25lcywgZGlzcG9zaXRpdm9zKSwgKipHb29nbGUgQ2xvdWQqKiB5ICoqT3RoZXIgQmV0cyoqIGNvbW8gV2F5bW8gKEFscGhhYmV0IEluYy4sIDIwMjRhKS4NCg0KKipGdWVudGUgZGUgZGF0b3MuKiogUHJlY2lvcyBkaWFyaW9zIChhcGVydHVyYSwgbcOheGltbywgbcOtbmltbywgY2llcnJlLCB2b2x1bWVuIHkgY2llcnJlIGFqdXN0YWRvKSBkZXNjYXJnYWRvcyBhdXRvbcOhdGljYW1lbnRlIGRlc2RlICoqWWFob28gRmluYW5jZSoqIChZYWhvbyBGaW5hbmNlLCBzLiBmLikgY29uIGVsIHBhcXVldGUgYHF1YW50bW9kYCAoUnlhbiB5IFVscmljaCwgMjAyNCkuIExhIGluZm9ybWFjacOzbiBjb3Jwb3JhdGl2YSBwcm92aWVuZSBkZSBsb3MgaW5mb3JtZXMgb2ZpY2lhbGVzIGRlIEFscGhhYmV0IGFudGUgbGEgU0VDIChBbHBoYWJldCBJbmMuLCAyMDI0YSkuDQoNCioqRnJlY3VlbmNpYS4qKiBTZSBlbGlnacOzIGZyZWN1ZW5jaWEgKipkaWFyaWEqKiBwb3IgdHJlcyByYXpvbmVzOiAoaSkgZWwgYWN0aXZvIGVzIG11eSBsw61xdWlkbyB5IHNlIG5lZ29jaWEgdG9kb3MgbG9zIGTDrWFzIGjDoWJpbGVzOyAoaWkpIGNpbmNvIGHDsW9zIGRlIGRhdG9zIGRpYXJpb3MgZGFuIG3DoXMgZGUgMS4yMDAgb2JzZXJ2YWNpb25lcywgc3VmaWNpZW50ZXMgcGFyYSBjYWxpYnJhciB5IHJlc2VydmFyIHVuIGJsb3F1ZSBkZSB2YWxpZGFjacOzbjsgKGlpaSkgZWwgaG9yaXpvbnRlIGRlIGludmVyc2nDs24gKDMwIGTDrWFzIGjDoWJpbGVzKSBlcyBjb3J0byB5IHJlcXVpZXJlIGdyYW51bGFyaWRhZCBkaWFyaWEuIExvcyBkYXRvcyBzZW1hbmFsZXMgbyBtZW5zdWFsZXMgcmVkdWNpcsOtYW4gbGEgbXVlc3RyYSBhIHVuYXMgMjYwIG8gNjAgb2JzZXJ2YWNpb25lcy4NCg0KQSBjb250aW51YWNpw7NuIHNlIHByZXNlbnRhbiBsb3MgZXN0YWTDrXN0aWNvcyBkZXNjcmlwdGl2b3MgZGVsIHByZWNpbyB5IGRlIGxvcyByZW5kaW1pZW50b3MsIHkgbGEgZXZvbHVjacOzbiBoaXN0w7NyaWNhIGRlIGxhIHNlcmllLg0KDQpgYGB7ciBkZXNjcmlwdGl2b3N9DQpkZXNjIDwtIGRhdGEuZnJhbWUoDQogIEVzdGFkw61zdGljbyA9IGMoIk9ic2VydmFjaW9uZXMiLCAiTcOtbmltbyAoVVNEKSIsICJNw6F4aW1vIChVU0QpIiwgIk1lZGlhIChVU0QpIiwNCiAgICAgICAgICAgICAgICAgICJNZWRpYW5hIChVU0QpIiwgIkRlc3YuIGVzdMOhbmRhciAoVVNEKSIsDQogICAgICAgICAgICAgICAgICAiUmVuZGltaWVudG8gbG9nLiBkaWFyaW8gbWVkaW8gKCUpIiwgIlZvbGF0aWxpZGFkIGRpYXJpYSAoJSkiLA0KICAgICAgICAgICAgICAgICAgIlZvbGF0aWxpZGFkIGFudWFsaXphZGEgKCUpIiwgIkFzaW1ldHLDrWEgZGUgcmVuZGltaWVudG9zIiwNCiAgICAgICAgICAgICAgICAgICJDdXJ0b3NpcyBlbiBleGNlc28gZGUgcmVuZGltaWVudG9zIiksDQogIFZhbG9yID0gYyhuLCBtaW4ocCksIG1heChwKSwgbWVhbihwKSwgbWVkaWFuKHApLCBzZChwKSwNCiAgICAgICAgICAgIG1lYW4ocmVuZCkgKiAxMDAsIHNkKHJlbmQpICogMTAwLCBzZChyZW5kKSAqIHNxcnQoMjUyKSAqIDEwMCwNCiAgICAgICAgICAgIG1lYW4oKHJlbmQgLSBtZWFuKHJlbmQpKV4zKSAvIHNkKHJlbmQpXjMsDQogICAgICAgICAgICBtZWFuKChyZW5kIC0gbWVhbihyZW5kKSleNCkgLyBzZChyZW5kKV40IC0gMykNCikNCnRhYmxhKGRlc2MsICJFc3RhZMOtc3RpY29zIGRlc2NyaXB0aXZvcyBkZSBHT09HTCAocGVyaW9kbyBjb21wbGV0bykiLCA0KQ0KYGBgDQoNCmBgYHtyIGdyYWZpY29fcHJlY2lvfQ0KZ2dwbG90KGRhdGEuZnJhbWUoRmVjaGEgPSBmZWNoYXMsIFByZWNpbyA9IHApLCBhZXMoRmVjaGEsIFByZWNpbykpICsNCiAgZ2VvbV9saW5lKGNvbG9yID0gIiMxYTczZTgiLCBsaW5ld2lkdGggPSAwLjcpICsNCiAgbGFicyh0aXRsZSA9ICJHT09HTDogcHJlY2lvIGRlIGNpZXJyZSBhanVzdGFkbyIsIHggPSBOVUxMLCB5ID0gIlVTRCIpICsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMykNCmBgYA0KDQpgYGB7ciB2b2xfcm9kYW50ZX0NCnZvbDIxIDwtIHJvbGxhcHBseShyZW5kLCAyMSwgc2QsIGZpbGwgPSBOQSwgYWxpZ24gPSAicmlnaHQiKSAqIHNxcnQoMjUyKSAqIDEwMA0KZGZfdiA8LSBkYXRhLmZyYW1lKEZlY2hhID0gZmVjaGFzWy0xXSwgUmVuZCA9IHJlbmQgKiAxMDAsIFZvbCA9IHZvbDIxKQ0KDQpnMSA8LSBnZ3Bsb3QoZGZfdiwgYWVzKEZlY2hhLCBSZW5kKSkgKw0KICBnZW9tX2xpbmUoY29sb3IgPSAiIzM0YTg1MyIsIGxpbmV3aWR0aCA9IDAuMzUpICsNCiAgbGFicyh0aXRsZSA9ICJSZW5kaW1pZW50b3MgbG9nYXLDrXRtaWNvcyBkaWFyaW9zICglKSIsIHggPSBOVUxMLCB5ID0gIiUiKSArDQogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTMpDQpnMiA8LSBnZ3Bsb3QoZGZfdiwgYWVzKEZlY2hhLCBWb2wpKSArDQogIGdlb21fbGluZShjb2xvciA9ICIjZWE0MzM1IiwgbGluZXdpZHRoID0gMC42LCBuYS5ybSA9IFRSVUUpICsNCiAgbGFicyh0aXRsZSA9ICJWb2xhdGlsaWRhZCByb2RhbnRlIGRlIDIxIGTDrWFzIChhbnVhbGl6YWRhLCAlKSIsIHggPSBOVUxMLCB5ID0gIiUiKSArDQogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTMpDQpwcmludChnMSk7IHByaW50KGcyKQ0KDQphbnVhbCA8LSBkZl92ICU+JQ0KICBtdXRhdGUoQcOxbyA9IGZvcm1hdChGZWNoYSwgIiVZIikpICU+JQ0KICBncm91cF9ieShBw7FvKSAlPiUNCiAgc3VtbWFyaXNlKGBSZW5kLiBtZWRpbyBkaWFyaW8gKCUpYCA9IG1lYW4oUmVuZCksDQogICAgICAgICAgICBgVm9sYXRpbGlkYWQgYW51YWxpemFkYSAoJSlgID0gc2QoUmVuZCkgKiBzcXJ0KDI1MiksDQogICAgICAgICAgICBgTcOtbmltbyBkaWFyaW8gKCUpYCA9IG1pbihSZW5kKSwNCiAgICAgICAgICAgIGBNw6F4aW1vIGRpYXJpbyAoJSlgID0gbWF4KFJlbmQpLCAuZ3JvdXBzID0gImRyb3AiKQ0KdGFibGEoYXMuZGF0YS5mcmFtZShhbnVhbCksICJSZW5kaW1pZW50byB5IHZvbGF0aWxpZGFkIHBvciBhw7FvIGNhbGVuZGFyaW8iLCAzKQ0KDQpmX21heCA8LSBkZl92JEZlY2hhW3doaWNoLm1heChkZl92JFZvbCldDQpmX21pbiA8LSBkZl92JEZlY2hhW3doaWNoLm1pbihkZl92JFZvbCldDQpgYGANCg0KKirCv1F1w6kgbm9zIGRpY2VuIGVzdG9zIGdyw6FmaWNvcz8qKiBMYSB2b2xhdGlsaWRhZCBlcywgZW4gcGFsYWJyYXMgc2ltcGxlcywgcXXDqSB0YW50byBzZSBtdWV2ZSBlbCBwcmVjaW8gZGUgdW4gZMOtYSBhIG90cm8uIEFsIG1pcmFyIGxhIGzDrW5lYSByb2phIHNlIG5vdGEgcXVlIGVzZSBtb3ZpbWllbnRvIG5vIGVzIHNpZW1wcmUgaWd1YWw6IGhheSDDqXBvY2FzIHRyYW5xdWlsYXMsIGVuIGxhcyBxdWUgbGEgYWNjacOzbiBzdWJlIG8gYmFqYSBwb2NvLCB5IMOpcG9jYXMgYWdpdGFkYXMsIGVuIGxhcyBxdWUgbG9zIGNhbWJpb3MgZGlhcmlvcyBzb24gbXVjaG8gbcOhcyBncmFuZGVzLiBBZGVtw6FzLCBlc2FzIMOpcG9jYXMgdGllbmRlbiBhIHZlbmlyIGVuIGJsb3F1ZXMsIG5vIGRlIGZvcm1hIGFpc2xhZGE6IGRlc3B1w6lzIGRlIHVuIGTDrWEgdHVyYnVsZW50byBzdWVsZSB2ZW5pciBvdHJvLiBMYSBtYXlvciBhZ2l0YWNpw7NuIHNlIG9ic2VydsOzIGFscmVkZWRvciBkZWwgKipgciBmb3JtYXQoZl9tYXgsICIlZC8lbS8lWSIpYCoqIHkgbGEgbWF5b3IgY2FsbWEgYWxyZWRlZG9yIGRlbCAqKmByIGZvcm1hdChmX21pbiwgIiVkLyVtLyVZIilgKiouDQoNCkVzdG8gaW1wb3J0YSBwb3JxdWUgZWwgbW9kZWxvIEFSSU1BIHRyYXRhIGxhIGluY2VydGlkdW1icmUgY29tbyBzaSBmdWVyYSBzaWVtcHJlIGxhIG1pc21hLiBFc28gY2FzaSBubyBhZmVjdGEgYWwgcHJvbsOzc3RpY28gZGVsIHByZWNpbyBlc3BlcmFkbywgcGVybyBzw60gYWwgwqttYXJnZW4gZGUgZXJyb3LCuyBxdWUgbG8gcm9kZWE6IGVuIMOpcG9jYXMgYWdpdGFkYXMgZXNlIG1hcmdlbiBwb2Ryw61hIHF1ZWRhcnNlIGNvcnRvLCB5IGVuIMOpcG9jYXMgdHJhbnF1aWxhcywgcXVlZGFyc2UgbGFyZ28uIFJldG9tYW1vcyBlc3RlIHB1bnRvIG3DoXMgYWRlbGFudGU6IGVuIGxhIHNlY2Npw7NuIDQgc2UgZXhwbGljYSBlbCBtb2RlbG8gR0FSQ0gsIHBlbnNhZG8ganVzdGFtZW50ZSBwYXJhIGVzdGUgZmVuw7NtZW5vOyBlbiBsYSBzZWNjacOzbiA2IHNlIHJldmlzYSBzaSBsb3MgcmVzaWR1b3MgZGVsIG1vZGVsbyBtdWVzdHJhbiBlc3RlIGNvbXBvcnRhbWllbnRvOyB5IGVuIGxhIHNlY2Npw7NuIDkgc2UgdGllbmUgZW4gY3VlbnRhIGFsIHNpbXVsYXIgbG9zIGVzY2VuYXJpb3MgZGUgcmllc2dvLg0KDQojIyBIZWNob3MgZGUgbWVyY2FkbyBxdWUgY29udGV4dHVhbGl6YW4gbGEgbXVlc3RyYQ0KDQoxLiAqKkNpY2xvIGRlIGVuZHVyZWNpbWllbnRvIG1vbmV0YXJpbyAoMjAyMi0yMDIzKS4qKiBMYSBSZXNlcnZhIEZlZGVyYWwgZWxldsOzIGxhIHRhc2EgZGUgZm9uZG9zIGZlZGVyYWxlcyBkZXNkZSBjZXJjYSBkZSBjZXJvIGhhc3RhIGVsIHJhbmdvIDUsMjUgJS01LDUwICUgKEZlZGVyYWwgT3BlbiBNYXJrZXQgQ29tbWl0dGVlLCAyMDIzKS4gRWwgYXVtZW50byBkZSBsYSB0YXNhIGRlIGRlc2N1ZW50byBwcmVzaW9uw7MgbGEgdmFsb3JhY2nDs24gZGUgbGFzIGFjY2lvbmVzIHRlY25vbMOzZ2ljYXMgZGUgY3JlY2ltaWVudG8geSBzZSBhc29jaWEgY29uIGVsIGVwaXNvZGlvIGRlIG1heW9yIHZvbGF0aWxpZGFkIGRlIGxhIG11ZXN0cmEuDQoyLiAqKkRlc2RvYmxhbWllbnRvIGRlIGFjY2lvbmVzIDIwIGEgMSAoMjAyMikuKiogQWxwaGFiZXQgYW51bmNpw7MgdW4gKnNwbGl0KiBkZSAyMCBwb3IgMSAoQWxwaGFiZXQgSW5jLiwgMjAyMikuIEVzdG8ganVzdGlmaWNhIGVsIHVzbyBkZWwgKipwcmVjaW8gYWp1c3RhZG8qKiwgcHVlcyBlbCBwcmVjaW8gc2luIGFqdXN0YXIgcHJlc2VudGFyw61hIHVuIHNhbHRvIGFydGlmaWNpYWwgcXVlIHNlIGNvbmZ1bmRpcsOtYSBjb24gdW5hIHJ1cHR1cmEgZXN0cnVjdHVyYWwuDQozLiAqKkNvbXBldGVuY2lhIGVuIGludGVsaWdlbmNpYSBhcnRpZmljaWFsIGdlbmVyYXRpdmEuKiogRWwgbGFuemFtaWVudG8gZGUgQ2hhdEdQVCBhIGZpbmFsZXMgZGUgMjAyMiAoT3BlbkFJLCAyMDIyKSB5IGxhIHJlc3B1ZXN0YSBkZSBHb29nbGUgY29uIGxhIGZhbWlsaWEgZGUgbW9kZWxvcyBHZW1pbmkgKFBpY2hhaSB5IEhhc3NhYmlzLCAyMDIzKSBjYW1iaWFyb24gbGFzIGV4cGVjdGF0aXZhcyBzb2JyZSBlbCBuZWdvY2lvIGRlIGLDunNxdWVkYSB5IGRlIG51YmUuIEVzdG8gZ2VuZXJhIHNhbHRvcyBhc29jaWFkb3MgYSBub3RpY2lhcywgbm8gYSBwYXRyb25lcyBlc3RhY2lvbmFsZXMuDQo0LiAqKlByaW1lciBkaXZpZGVuZG8geSByZWNvbXByYSBkZSBhY2Npb25lcyAoMjAyNCkuKiogQWxwaGFiZXQgYW51bmNpw7Mgc3UgcHJpbWVyIGRpdmlkZW5kbyBlbiBlZmVjdGl2byBqdW50byBjb24gdW4gcHJvZ3JhbWEgZGUgcmVjb21wcmEgZGUgYWNjaW9uZXMgZGUgVVNEIDcwLjAwMCBtaWxsb25lcyAoQWxwaGFiZXQgSW5jLiwgMjAyNGIpLiBFc3RvIGFmZWN0w7MgbGEgZGVtYW5kYSBwb3IgbGEgYWNjacOzbiB5IGVsIHRyYXRhbWllbnRvIGRlbCBwcmVjaW8gYWp1c3RhZG8uDQo1LiAqKkVzY3J1dGluaW8gYW50aW1vbm9wb2xpby4qKiBFbiAyMDI0IHVuIHRyaWJ1bmFsIGZlZGVyYWwgZXN0YWRvdW5pZGVuc2UgZmFsbMOzIHF1ZSBHb29nbGUgbWFudHV2byBpbGVnYWxtZW50ZSB1biBtb25vcG9saW8gZW4gYsO6c3F1ZWRhICgqVW5pdGVkIFN0YXRlcyB2LiBHb29nbGUgTExDKiwgMjAyNCkuIEVzdG8gaW50cm9kdWNlIHJpZXNnbyByZWd1bGF0b3JpbyB5IGV2ZW50b3MgZGUgY29sYS4NCg0KKipJbXBsaWNhY2lvbmVzIGVjb25vbcOpdHJpY2FzLioqIEVzdG9zIGV2ZW50b3Mgc3VnaWVyZW4gKGkpICoqcGVyc2lzdGVuY2lhKiogeSByYcOteiB1bml0YXJpYSBlbiBlbCBuaXZlbCBkZWwgcHJlY2lvLCAoaWkpICoqcnVwdHVyYXMgb2Nhc2lvbmFsZXMqKiBkZSB2b2xhdGlsaWRhZCB5IChpaWkpICoqc2Vuc2liaWxpZGFkIGEgdmFyaWFibGVzIGV4dGVybmFzKiogY29tbyB0YXNhcyBkZSBpbnRlcsOpcyB5IGVsIMOtbmRpY2UgZGUgbWVyY2FkbywgcXVlIG1vdGl2YW4gQVJJTUFYLiBObyBoYXkgdW5hIHJhesOzbiBlY29uw7NtaWNhIGNsYXJhIHBhcmEgZXNwZXJhciAqKmVzdGFjaW9uYWxpZGFkKiogZW4gdW4gcHJlY2lvIGJ1cnPDoXRpbCBkaWFyaW8sIGhpcMOzdGVzaXMgcXVlIHNlIGNvbnRyYXN0YSBlbiBsYSBzZWNjacOzbiA1Lg0KDQojIyBIaXDDs3Rlc2lzIGRlIGludmVyc2nDs24gKGRlZmluaWRhIGFudGVzIGRlbCBhbsOhbGlzaXMpDQoNCkFudGVzIGRlIGVzdGltYXIgY3VhbHF1aWVyIG1vZGVsbyBzZSBmaWphbiBsb3MgcGFyw6FtZXRyb3MgZGUgZGVjaXNpw7NuOg0KDQotICoqSGlww7N0ZXNpcyBudWxhIChlZmljaWVuY2lhIGTDqWJpbDsgRmFtYSwgMTk3MCk6KiogbG9zIHJlemFnb3MgZGVsIHByZWNpbyBubyBjb250aWVuZW4gaW5mb3JtYWNpw7NuIGV4cGxvdGFibGUsIHkgdW5hIGVzdHJhdGVnaWEgYmFzYWRhIGVuIHVuIHByb27Ds3N0aWNvIEFSSU1BIG5vIHN1cGVyYSBhICpjb21wcmFyIHkgbWFudGVuZXIqIG5pIGEgbWFudGVuZXIgbGlxdWlkZXouDQotICoqSGlww7N0ZXNpcyBhbHRlcm5hdGl2YToqKiBlbCBwcm9uw7NzdGljbyBBUklNQSBhbnRpY2lwYSBtb3ZpbWllbnRvcyBzdWZpY2llbnRlcyBwYXJhIGdlbmVyYXIgdW4gcmVuZGltaWVudG8gc3VwZXJpb3IgYWwgZGUgbG9zIGJlbmNobWFya3MuDQotICoqUmVnbGEgZGUgZGVjaXNpw7NuOioqIGFsIGNpZXJyZSBkZSBsYSBmZWNoYSBkZSBjb3J0ZSwgc2kgZWwgbW9kZWxvIHByb3llY3RhIHVuYSAqKmFwcmVjaWFjacOzbiBzdXBlcmlvciBhbCB1bWJyYWwgZGVsIDIgJSoqIHBhcmEgZWwgaG9yaXpvbnRlIGRlIDMwIGTDrWFzIGjDoWJpbGVzLCBzZSB0b21hIHVuYSAqKnBvc2ljacOzbiBsYXJnYSoqIGNvbiB0b2RvIGVsIGNhcGl0YWwuIERlIGxvIGNvbnRyYXJpbyBzZSAqKm1hbnRpZW5lIGxpcXVpZGV6KiogcmVtdW5lcmFkYSBhIGxhIHRhc2EgbGlicmUgZGUgcmllc2dvLiBFbCB1bWJyYWwgY3VicmUgbGEgdGFzYSBsaWJyZSBkZSByaWVzZ28gZGVsIHBlcmlvZG8gKOKJiCAwLDUgJSkgeSBsb3MgY29zdG9zIGRlIHRyYW5zYWNjacOzbiwgY29uIHVuIG1hcmdlbiBkZSBzZWd1cmlkYWQuDQoNCiMgQmFzZSBkZSBkYXRvcyB5IHRyYXRhbWllbnRvDQoNCiMjIEltcG9ydGFjacOzbiB5IHZlcmlmaWNhY2nDs24NCg0KTG9zIGRhdG9zIHNlIGRlc2NhcmdhbiBjb24gYHF1YW50bW9kOjpnZXRTeW1ib2xzKClgIHBhcmEgbG9zIGNpbmNvIGHDsW9zIGFudGVyaW9yZXMgYSBsYSBmZWNoYSBkZSBjb21waWxhY2nDs24uIFNlIHZlcmlmaWNhbiBsYXMgY29uZGljaW9uZXMgYsOhc2ljYXMgZGUgY2FsaWRhZDoNCg0KYGBge3IgdmVyaWZpY2FjaW9ufQ0KZmVjaGFzX3JhdyA8LSBpbmRleChkYXRvc19yYXcpDQpjaGsgPC0gZGF0YS5mcmFtZSgNCiAgVmVyaWZpY2FjacOzbiA9IGMoIlByaW1lcmEgZmVjaGEiLCAiw5psdGltYSBmZWNoYSIsICJPYnNlcnZhY2lvbmVzIGRlc2NhcmdhZGFzIiwNCiAgICAgICAgICAgICAgICAgICAiRmVjaGFzIGR1cGxpY2FkYXMiLCAiRmVjaGFzIGZ1ZXJhIGRlIG9yZGVuIiwNCiAgICAgICAgICAgICAgICAgICAiVmFsb3JlcyBmYWx0YW50ZXMgKE5BKSBlbiBsYXMgc2VyaWVzIGRlc2NhcmdhZGFzIiwNCiAgICAgICAgICAgICAgICAgICAiUHJlY2lvcyBhanVzdGFkb3Mgbm8gcG9zaXRpdm9zIiwNCiAgICAgICAgICAgICAgICAgICAiRMOtYXMgZGUgbGEgc2VtYW5hIHByZXNlbnRlcyAoMSA9IGx1bmVzLCA1ID0gdmllcm5lcykiLA0KICAgICAgICAgICAgICAgICAgICJTYWx0b3MgZGUgbcOhcyBkZSA1IGTDrWFzIGNhbGVuZGFyaW8iKSwNCiAgUmVzdWx0YWRvID0gYyhmb3JtYXQobWluKGZlY2hhc19yYXcpKSwgZm9ybWF0KG1heChmZWNoYXNfcmF3KSksIG5yb3coZGF0b3NfcmF3KSwNCiAgICAgICAgICAgICAgICBzdW0oZHVwbGljYXRlZChmZWNoYXNfcmF3KSksIHN1bShkaWZmKGZlY2hhc19yYXcpIDwgMCksDQogICAgICAgICAgICAgICAgc3VtKGlzLm5hKGRhdG9zX3JhdykpLCBzdW0oYXMubnVtZXJpYyhBZChkYXRvc19yYXcpKSA8PSAwLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgIHBhc3RlKHNvcnQodW5pcXVlKGZvcm1hdChmZWNoYXNfcmF3LCAiJXUiKSkpLCBjb2xsYXBzZSA9ICIsICIpLA0KICAgICAgICAgICAgICAgIHN1bShhcy5udW1lcmljKGRpZmYoZmVjaGFzX3JhdykpID4gNSkpDQopDQp0YWJsYShjaGssICJWZXJpZmljYWNpw7NuIGRlIGNhbGlkYWQgZGUgbG9zIGRhdG9zIiwgMCkNCmBgYA0KDQojIyBMaW1waWV6YSB5IGZyZWN1ZW5jaWENCg0KLSAqKkR1cGxpY2Fkb3MgeSBvcmRlbjoqKiBzaSBzZSBkZXRlY3RhcmFuIGZlY2hhcyBkdXBsaWNhZGFzIG8gZGVzb3JkZW5hZGFzLCBzZSBlbGltaW5hcsOtYW4geSBvcmRlbmFyw61hbi4gTGEgdGFibGEgYW50ZXJpb3IgaW5kaWNhIHNpIGZ1ZSBuZWNlc2FyaW8uDQotICoqRmFsdGFudGVzOioqIGxvcyBOQSBzZSBlbGltaW5hbiBjb24gYG5hLm9taXQoKWAgKG5vIHNlIGltcHV0YW4sIHBhcmEgbm8gaW50cm9kdWNpciBpbmZvcm1hY2nDs24gYXJ0aWZpY2lhbCkuDQotICoqRmVyaWFkb3M6KiogbGFzIGZlY2hhcyBkZSBmZXJpYWRvcyBidXJzw6F0aWxlcyBubyBleGlzdGVuIGVuIGxhIGZ1ZW50ZSB5IG5vIHNlIHJlbGxlbmFuLCBkZSBtb2RvIHF1ZSBsb3MgcmV6YWdvcyBzZSBtaWRlbiBlbiAqKmTDrWFzIGRlIG5lZ29jaWFjacOzbioqLg0KLSAqKlVuaWRhZGVzOioqIHByZWNpb3MgZW4gVVNEIHBvciBhY2Npw7NuLCB5YSBhanVzdGFkb3MgcG9yICpzcGxpdHMqIHkgZGl2aWRlbmRvcy4NCi0gKipGcmVjdWVuY2lhOioqIGRpYXJpYSAoanVzdGlmaWNhZGEgZW4gbGEgc2VjY2nDs24gMikuDQoNCiMjIERlc2NyaXBjacOzbiBkZSBsYXMgdmFyaWFibGVzDQoNCnwgVmFyaWFibGUgfCBEZXNjcmlwY2nDs24gfCBVbmlkYWQgfA0KfDotLXw6LS18Oi0tfA0KfCBgR09PR0wuT3BlbmAgLyBgSGlnaGAgLyBgTG93YCAvIGBDbG9zZWAgfCBQcmVjaW9zIGRlIGFwZXJ0dXJhLCBtw6F4aW1vLCBtw61uaW1vIHkgY2llcnJlIChzaW4gYWp1c3RlIHBvciBkaXZpZGVuZG9zKSB8IFVTRCBwb3IgYWNjacOzbiB8DQp8IGBHT09HTC5Wb2x1bWVgIHwgVm9sdW1lbiBuZWdvY2lhZG8gfCBBY2Npb25lcyB8DQp8IGBHT09HTC5BZGp1c3RlZGAgfCAqKkNpZXJyZSBhanVzdGFkbyoqIHBvciAqc3BsaXRzKiB5IGRpdmlkZW5kb3MuICoqVmFyaWFibGUgcHJpbmNpcGFsIGRlbCBlc3R1ZGlvLioqIHwgVVNEIHBvciBhY2Npw7NuIHwNCg0KIyMgVHJhbnNmb3JtYWNpb25lcywgYmFzZSBwcm9jZXNhZGEgeSBzZXBhcmFjacOzbiB0cmFpbi10ZXN0DQoNClNlIHRyYWJhamEgY29uIHRyZXMgcmVwcmVzZW50YWNpb25lcyBkZSBsYSBzZXJpZTogZWwgKipwcmVjaW8qKiAkeV90JCwgZWwgKipyZW5kaW1pZW50byBsb2dhcsOtdG1pY28qKiAkcl90PVxsbiBQX3QtXGxuIFBfe3QtMX0kIChzb2xvIGRlc2NyaXB0aXZvKSB5IGxhICoqc2VyaWUgdHJhbnNmb3JtYWRhIEJveC1Db3gqKiAkeV90XnsoXGxhbWJkYSl9JCwgc29icmUgbGEgcXVlIHNlIGVzdGltYW4gbG9zIG1vZGVsb3MuIFNlIGFwbGljYXLDoW4gZGlmZXJlbmNpYXMgc2Vnw7puIGxhcyBwcnVlYmFzIGRlIGVzdGFjaW9uYXJpZWRhZCAoc2VjY2nDs24gNSkuDQoNCkxhICoqc2VwYXJhY2nDs24gY3Jvbm9sw7NnaWNhKiogc2UgaGFjZSAqYW50ZXMqIGRlIGNhbGlicmFyOiA4NSAlIHBhcmEgZW50cmVuYW1pZW50byB5IDE1ICUgcGFyYSB2YWxpZGFjacOzbi4gRXN0ZSBwb3JjZW50YWplIHF1ZWRhIGRlbnRybyBkZWwgcmFuZ28gcmVjb21lbmRhZG8gKDE1ICUtMjUgJSkuIFNlIGVzY29nZSBlbCBleHRyZW1vIGluZmVyaW9yIHBhcmEgY29uc2VydmFyIG3DoXMgaW5mb3JtYWNpw7NuIGVuIGxhIGVzdGltYWNpw7NuLCB5IGF1biBhc8OtIHF1ZWRhbiBjZXJjYSBkZSAxOTAgb2JzZXJ2YWNpb25lcyAodW5vcyBudWV2ZSBtZXNlcyksIGJhc3RhbnRlIG3DoXMgcXVlIGVsIGhvcml6b250ZSBkZSAzMCBkw61hcy4gKipUb2RvIHBhcsOhbWV0cm8gZGVwZW5kaWVudGUgZGUgbGEgbXVlc3RyYSwgaW5jbHVpZG8gJFxsYW1iZGEkLCBzZSBlc3RpbWEgc29sbyBjb24gZWwgZW50cmVuYW1pZW50by4qKg0KDQpgYGB7ciBzcGxpdH0NCnNwbGl0X2luZm8gPC0gZGF0YS5mcmFtZSgNCiAgQ29uanVudG8gPSBjKCJFbnRyZW5hbWllbnRvICg4NSUpIiwgIlZhbGlkYWNpw7NuICgxNSUpIiwgIlRvdGFsIiksDQogIE9ic2VydmFjaW9uZXMgPSBjKG5fdHJhaW4sIG5fdGVzdCwgbiksDQogIERlc2RlID0gYyhmb3JtYXQoZmVjaGFzWzFdKSwgZm9ybWF0KGZlY2hhc1tuX3RyYWluICsgMV0pLCBmb3JtYXQoZmVjaGFzWzFdKSksDQogIEhhc3RhID0gYyhmb3JtYXQoZmVjaGFzW25fdHJhaW5dKSwgZm9ybWF0KGZlY2hhc1tuXSksIGZvcm1hdChmZWNoYXNbbl0pKQ0KKQ0KdGFibGEoc3BsaXRfaW5mbywgIkRpdmlzacOzbiBjcm9ub2zDs2dpY2EgZGUgbGEgbXVlc3RyYSIsIDApDQoNCiMgQmFzZSBwcm9jZXNhZGEgKHJlcHJvZHVjaWJsZSBkZXNkZSBsYSBmdWVudGUgb3JpZ2luYWwpDQp3cml0ZS5jc3YoZGF0YS5mcmFtZShGZWNoYSA9IGZlY2hhcywgUHJlY2lvX0FqdXN0YWRvID0gcCwNCiAgICAgICAgICAgICAgICAgICAgIENvbmp1bnRvID0gYyhyZXAoInRyYWluIiwgbl90cmFpbiksIHJlcCgidGVzdCIsIG5fdGVzdCkpKSwNCiAgICAgICAgICAiR09PR0xfcHJvY2VzYWRhLmNzdiIsIHJvdy5uYW1lcyA9IEZBTFNFKQ0KYGBgDQoNCiMjIFBydWViYSBkZSB0cmFuc2Zvcm1hY2nDs24gQm94LUNveA0KDQpMYSB0cmFuc2Zvcm1hY2nDs24gZGUgQm94IHkgQ294ICgxOTY0KSBidXNjYSBlc3RhYmlsaXphciBsYSB2YXJpYW56YS4gU2UgZXN0aW1hICRcbGFtYmRhJCBzb2xvIGNvbiBlbCBlbnRyZW5hbWllbnRvLCBjb24gZWwgbcOpdG9kbyBkZSBHdWVycmVybyB5LCBjb21vIGNvbnRyYXN0ZSwgY29uIG3DoXhpbWEgdmVyb3NpbWlsaXR1ZDoNCg0KYGBge3IgYm94Y294fQ0KdGFibGEoZGF0YS5mcmFtZShNw6l0b2RvID0gYygiR3VlcnJlcm8gKHVzYWRvKSIsICJNw6F4aW1hIHZlcm9zaW1pbGl0dWQiKSwNCiAgICAgICAgICAgICAgICAgTGFtYmRhID0gYyhsYW1iZGFfZywgbGFtYmRhX2wpKSwNCiAgICAgICJFc3RpbWFjacOzbiBkZSDOuyBjb24gbGEgbXVlc3RyYSBkZSBlbnRyZW5hbWllbnRvIiwgNCkNCg0KZGZfYmMgPC0gZGF0YS5mcmFtZShGZWNoYSA9IGZlY2hhcywgT3JpZ2luYWwgPSBwLCBUcmFuc2Zvcm1hZGEgPSB5X2FsbCkgJT4lDQogIHBpdm90X2xvbmdlcigtRmVjaGEsIG5hbWVzX3RvID0gIlNlcmllIiwgdmFsdWVzX3RvID0gIlZhbG9yIikNCmdncGxvdChkZl9iYywgYWVzKEZlY2hhLCBWYWxvcikpICsNCiAgZ2VvbV9saW5lKGNvbG9yID0gIiNlYTQzMzUiKSArDQogIGZhY2V0X3dyYXAoflNlcmllLCBzY2FsZXMgPSAiZnJlZV95IiwgbmNvbCA9IDEpICsNCiAgbGFicyh0aXRsZSA9ICJTZXJpZSBvcmlnaW5hbCB2cy4gc2VyaWUgQm94LUNveCIsIHggPSBOVUxMLCB5ID0gTlVMTCkgKw0KICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDEzKQ0KYGBgDQoNCioqSnVzdGlmaWNhY2nDs24uKiogRWwgJFxsYW1iZGEkIGVzdGltYWRvIGVzICoqYHIgcm91bmQobGFtYmRhLCA0KWAqKi4gVW4gdmFsb3IgY2VyY2FubyBhIDAgZXF1aXZhbGUgYSBsYSB0cmFuc2Zvcm1hY2nDs24gbG9nYXLDrXRtaWNhLCBxdWUgZXMgbG8gaGFiaXR1YWwgZW4gcHJlY2lvcyBmaW5hbmNpZXJvcywgZG9uZGUgbGEgYW1wbGl0dWQgZGUgbGFzIHZhcmlhY2lvbmVzIGNyZWNlIGNvbiBlbCBuaXZlbC4gTGEgdHJhbnNmb3JtYWNpw7NuIHPDrSBzZSBhcGxpY2EgcG9ycXVlIGVzdGFiaWxpemEgbGEgdmFyaWFuemEgeSBjb252aWVydGUgbGFzIHZhcmlhY2lvbmVzIGRlbCBwcmVjaW8gZW4gY2FtYmlvcyBwcm9wb3JjaW9uYWxlcy4gTG9zIG1vZGVsb3Mgc2UgZXN0aW1hbiBzb2JyZSBgeWAgKHNlcmllIEJveC1Db3gpIHkgbG9zIHByb27Ds3N0aWNvcyBzZSBkZXZ1ZWx2ZW4gYSBVU0QgY29uIGBJbnZCb3hDb3goKWAuDQoNCiMgRnVuZGFtZW50YWNpw7NuIG1hdGVtw6F0aWNhDQoNCkxhIG1ldG9kb2xvZ8OtYSBzaWd1ZSBlbCBlbmZvcXVlIEJveC1KZW5raW5zIChCb3ggZXQgYWwuLCAyMDE1OyBIeW5kbWFuIHkgQXRoYW5hc29wb3Vsb3MsIDIwMjEpLiBTZWEgJFx7eV90XH0kIHVuYSBzZXJpZSBkZSB0aWVtcG8geSAkXHZhcmVwc2lsb25fdCQgdW5hICoqaW5ub3ZhY2nDs24qKiAocnVpZG8gYmxhbmNvKTogJEUoXHZhcmVwc2lsb25fdCk9MCQsICRWYXIoXHZhcmVwc2lsb25fdCk9XHNpZ21hXjIkIHkgJENvdihcdmFyZXBzaWxvbl90LFx2YXJlcHNpbG9uX3t0LWt9KT0wJCBwYXJhICRrXG5lcSAwJC4gTGEgaW5ub3ZhY2nDs24gZXMgbGEgcGFydGUgZGUgJHlfdCQgcXVlIG5vIHNlIHB1ZWRlIGFudGljaXBhciBjb24gbGEgaW5mb3JtYWNpw7NuIHBhc2FkYSwgJFx2YXJlcHNpbG9uX3Q9eV90LUUoeV90XG1pZCBcbWF0aGNhbCBJX3t0LTF9KSQuDQoNCiMjIEVsIG9wZXJhZG9yIHJlemFnbyBMDQoNCkVsIG9wZXJhZG9yIHJlemFnbyBzZSBkZWZpbmUgY29tbyAkTFwseV90PXlfe3QtMX0kLCBkZSBtb2RvIHF1ZSAkTF5rIHlfdD15X3t0LWt9JC4gQ29uIMOpbCwgdW4gcG9saW5vbWlvIGVuICRMJCByZXN1bWUgbGEgbWVtb3JpYSBkZWwgcHJvY2VzbzoNCg0KJCQNClxwaGkoTCk9MS1ccGhpXzFMLVxkb3RzLVxwaGlfcExecCxccXF1YWQNClx0aGV0YShMKT0xK1x0aGV0YV8xTCtcZG90cytcdGhldGFfcUxecSAuDQokJA0KDQojIyBQcm9jZXNvIGF1dG9ycmVncmVzaXZvIEFSKHApDQoNCiQkDQp5X3Q9YytccGhpXzF5X3t0LTF9K1xkb3RzK1xwaGlfcHlfe3QtcH0rXHZhcmVwc2lsb25fdA0KXDtcTG9uZ2xlZnRyaWdodGFycm93XDsNClxwaGkoTClcLHlfdD1jK1x2YXJlcHNpbG9uX3QgLg0KJCQNCg0KRWwgcGFyw6FtZXRybyAkcCQgZXMgZWwgbsO6bWVybyBkZSByZXphZ29zIHByb3Bpb3MgcXVlIGV4cGxpY2FuIGVsIHZhbG9yIGFjdHVhbC4gKipDb25kaWNpw7NuIGRlIGVzdGFjaW9uYXJpZWRhZDoqKiB0b2RhcyBsYXMgcmHDrWNlcyBkZSAkXHBoaSh6KT0wJCBkZWJlbiBlc3RhciBmdWVyYSBkZWwgY8OtcmN1bG8gdW5pdGFyaW8uIEVuIGVsIGNhc28gQVIoMSksIGNvbiAkfFxwaGlfMXw8MSQsIHN1c3RpdHV5ZW5kbyByZWN1cnNpdmFtZW50ZToNCg0KJCQNCnlfdD1cZnJhY3tjfXsxLVxwaGlfMX0rXHN1bV97aj0wfV57XGluZnR5fVxwaGlfMV57XCxqfVwsXHZhcmVwc2lsb25fe3Qtan0sDQokJA0KDQplcyBkZWNpciwgdW4gKipNQSgkXGluZnR5JCkqKiBkZSBjb2VmaWNpZW50ZXMgZGVjcmVjaWVudGVzIChyZXByZXNlbnRhY2nDs24gZGUgV29sZCkuIExvcyBjaG9xdWVzIHBhc2Fkb3MgcGllcmRlbiBwZXNvIGdlb23DqXRyaWNhbWVudGUgeSBsYSBtZWRpYSB5IGxhIHZhcmlhbnphIHNvbiBjb25zdGFudGVzLiBTaSAkXHBoaV8xPTEkLCBsb3MgY2hvcXVlcyAqKm5vIHNlIGRpc2lwYW4qKjoNCg0KJCQNCnlfdD15X3t0LTF9K1x2YXJlcHNpbG9uX3Q9eV8wK1xzdW1fe3M9MX1ee3R9XHZhcmVwc2lsb25fcyxccXF1YWQgVmFyKHlfdCk9dFwsXHNpZ21hXjIgLA0KJCQNCg0KeSBlbCBwcm9jZXNvIGVzIG5vIGVzdGFjaW9uYXJpbyBlbiBtZWRpYSB5IHZhcmlhbnphIChyYcOteiB1bml0YXJpYSBvICoqY2FtaW5hdGEgYWxlYXRvcmlhKiopLg0KDQojIyBQcm9jZXNvIGRlIG1lZGlhcyBtw7N2aWxlcyBNQShxKQ0KDQokJA0KeV90PVxtdStcdmFyZXBzaWxvbl90K1x0aGV0YV8xXHZhcmVwc2lsb25fe3QtMX0rXGRvdHMrXHRoZXRhX3FcdmFyZXBzaWxvbl97dC1xfT1cbXUrXHRoZXRhKEwpXCxcdmFyZXBzaWxvbl90IC4NCiQkDQoNCkVsIHBhcsOhbWV0cm8gJHEkIGVzIGVsIG7Dum1lcm8gZGUgY2hvcXVlcyBwYXNhZG9zIHF1ZSBhw7puIGFmZWN0YW4gYWwgcHJlc2VudGUuIFVuIE1BIGZpbml0byBzaWVtcHJlIGVzIGVzdGFjaW9uYXJpby4gKipDb25kaWNpw7NuIGRlIGludmVydGliaWxpZGFkOioqIGxhcyByYcOtY2VzIGRlICRcdGhldGEoeik9MCQgZGViZW4gZXN0YXIgZnVlcmEgZGVsIGPDrXJjdWxvIHVuaXRhcmlvLiBFbiBNQSgxKSwgY29uICR8XHRoZXRhXzF8PDEkOg0KDQokJA0KXHZhcmVwc2lsb25fdD1cc3VtX3tqPTB9XntcaW5mdHl9KC1cdGhldGFfMSlee2p9XCwoeV97dC1qfS1cbXUpLA0KJCQNCg0KZXMgZGVjaXIsIGVsIE1BKDEpIGludmVydGlibGUgZXF1aXZhbGUgYSB1biBBUigkXGluZnR5JCkuIExhIGludmVydGliaWxpZGFkIGdhcmFudGl6YSBxdWUgbGEgaW5ub3ZhY2nDs24gc2UgcHVlZGEgcmVjdXBlcmFyIGRlIGxvcyBkYXRvcyB5IHF1ZSBsYSByZXByZXNlbnRhY2nDs24gc2VhIMO6bmljYS4NCg0KIyMgRGUgQVJNQSBhIEFSSU1BOiBlbCBwYXBlbCBkZSBsYSBkaWZlcmVuY2lhY2nDs24NCg0KQ29tYmluYW5kbyBhbWJvcyBjb21wb25lbnRlcyBzZSBvYnRpZW5lIGVsIEFSTUEocCxxKTogJFxwaGkoTClcLHlfdD1jK1x0aGV0YShMKVwsXHZhcmVwc2lsb25fdCQuIFNpIGxhIHNlcmllIHRpZW5lIHJhw616IHVuaXRhcmlhLCAkXHBoaShMKSQgY29udGllbmUgZWwgZmFjdG9yICQoMS1MKSQgeSBzZSBwdWVkZSBlc2NyaWJpciAkXHBoaShMKT1cdGlsZGVccGhpKEwpKDEtTCkkLiBBcGxpY2FyICQoMS1MKV5kJCBlbGltaW5hIGxhICoqbm8gZXN0YWNpb25hcmllZGFkIGVuIG1lZGlhKio6DQoNCiQkDQpccGhpKEwpXCwoMS1MKV5kXCx5X3Q9YytcdGhldGEoTClcLFx2YXJlcHNpbG9uX3QgLg0KJCQNCg0KQ29uICRkPTEkLCAkd190PSgxLUwpeV90PXlfdC15X3t0LTF9JCBlcyB1biBBUk1BKHAscSkgZXN0YWNpb25hcmlvLiBQYXJhIGVsIGNhc28gZGUgdW5hIGNhbWluYXRhIGFsZWF0b3JpYToNCg0KJCQNCnlfdD15XzArXHN1bV97cz0xfV57dH1cdmFyZXBzaWxvbl9zIFw7XExvbmdyaWdodGFycm93XDsgKDEtTClcLHlfdD1cdmFyZXBzaWxvbl90IFxzaW0gUkIoMCxcc2lnbWFeMiksDQokJA0KDQpkZSBtb2RvIHF1ZSBsYSBkaWZlcmVuY2lhIGVzIHJ1aWRvIGJsYW5jby4gTG9zIHBhcsOhbWV0cm9zICQocCxkLHEpJCBzb24gZWwgb3JkZW4gYXV0b3JyZWdyZXNpdm8sIGVsIG7Dum1lcm8gZGUgZGlmZXJlbmNpYXMgeSBlbCBvcmRlbiBkZSBtZWRpYXMgbcOzdmlsZXMuIExvcyBtb2RlbG9zIGV2YWx1YWRvcyBzb24gY2Fzb3MgaW50ZXJtZWRpb3MgZW50cmUgbGEgY2FtaW5hdGEgYWxlYXRvcmlhIEFSSU1BKDAsMSwwKSB5IHVuIEFSSU1BIGRlIG1heW9yIG9yZGVuLiBFbiBwYXJ0aWN1bGFyLCBlbCBBUklNQSgxLDEsMCkgc2VsZWNjaW9uYWRvIGVzOg0KDQokJA0KKDEtXHBoaV8xTCkoMS1MKVwseV90PVx2YXJlcHNpbG9uX3QNClw7XExvbmdyaWdodGFycm93XDsNCnlfdD0oMStccGhpXzEpXCx5X3t0LTF9LVxwaGlfMVwseV97dC0yfStcdmFyZXBzaWxvbl90IC4NCiQkDQoNClNpICRccGhpXzFcYXBwcm94IDAkLCBlbCBtb2RlbG8gY29sYXBzYSBhIGxhIGNhbWluYXRhIGFsZWF0b3JpYS4gRXN0byBleHBsaWNhIHF1ZSBzdSBwcm9uw7NzdGljbyBzZWEgY2FzaSBpZ3VhbCBhbCBkZWwgYmVuY2htYXJrLiBMYSB2YXJpYW56YSBkZWwgZXJyb3IgZGUgcHJvbsOzc3RpY28gY3JlY2UgY29uIGVsIGhvcml6b250ZSAoJFxhcHByb3ggaFwsXHNpZ21hXjIkIGVuIGxhIGNhbWluYXRhIGFsZWF0b3JpYSksIHBvciBsbyBxdWUgbG9zIGludGVydmFsb3Mgc2UgZW5zYW5jaGFuIGNvbiAkXHNxcnR7aH0kLg0KDQojIyBBUklNQVg6IHZhcmlhYmxlcyBleMOzZ2VuYXMNCg0KRWwgbW9kZWxvIEFSSU1BWCBhZ3JlZ2EgdW4gdmVjdG9yIGRlIHJlZ3Jlc29yZXMgJFxtYXRoYmYgeF90JCAocG9yIGVqZW1wbG8sIGVsIMOtbmRpY2UgUyZQIDUwMCwgdGFzYXMgZGUgaW50ZXLDqXMsIHByZWNpbyBkZSBsYSBlbmVyZ8OtYSBvIGluZmxhY2nDs24pOg0KDQokJA0KXHBoaShMKVwsKDEtTCleZFwseV90PWMrXGJvbGRzeW1ib2xcYmV0YSdcbWF0aGJmIHhfdCtcdGhldGEoTClcLFx2YXJlcHNpbG9uX3QgLg0KJCQNCg0KKipQb3IgcXXDqSAkXG1hdGhiZiB4X3QkIHB1ZWRlIGFwb3J0YXIgaW5mb3JtYWNpw7NuLioqIEVsIHByb2Nlc28gYXV0b3JyZWdyZXNpdm8gc29sbyB1c2EgbGEgaGlzdG9yaWEgZGUgJHlfdCQuIFNpIGVsIHJlbmRpbWllbnRvIGRlIEdPT0dMIGRlcGVuZGUgZGUgZmFjdG9yZXMgY29tdW5lcyBkZSBtZXJjYWRvIG8gbWFjcm9lY29uw7NtaWNvcyBxdWUgKm5vKiBlc3TDoW4gcmVzdW1pZG9zIGVuIHN1cyBwcm9waW9zIHJlemFnb3MsICRcbWF0aGJmIHhfdCQgcHVlZGUgcmVkdWNpciBsYSB2YXJpYW56YSBkZWwgZXJyb3IgZGUgcHJvbsOzc3RpY28uDQoNCioqSW50ZXJwcmV0YWNpw7NuIGRlICRcYm9sZHN5bWJvbFxiZXRhJC4qKiBDYWRhICRcYmV0YV9rJCBtaWRlIGVsIGNhbWJpbyBhc29jaWFkbyBlbiAkeV90JCBhbnRlIHVuYSB2YXJpYWNpw7NuIHVuaXRhcmlhIGRlICR4X3trLHR9JCwgbWFudGVuaWVuZG8gbG9zIGRlbcOhcyB0w6lybWlub3MgZmlqb3MuIEVzIHVuICoqZWZlY3RvIGVzdGFkw61zdGljbyAoYXNvY2lhY2nDs24gY29uZGljaW9uYWwpLCBubyBjYXVzYWwqKi4gTGEgc2ltdWx0YW5laWRhZCwgbGFzIHZhcmlhYmxlcyBvbWl0aWRhcyB5IGxhIGNhdXNhbGlkYWQgaW52ZXJzYSBpbXBpZGVuIGxlZXJsbyBjb21vIGNhdXNhIChwb3IgZWplbXBsbywgR09PR0wgcGVzYSBlbiBlbCBTJlAgNTAwKS4NCg0KKipQcm9ibGVtYSBkZSBwcm9ub3N0aWNhciAkXG1hdGhiZiB4X3tUK2h9JC4qKiBQYXJhIHByb25vc3RpY2FyICR5X3tUK2h9JCBzZSBuZWNlc2l0YSAkXG1hdGhiZiB4X3tUK2h9JCwgcXVlIGVuIGVsIG1vbWVudG8gZGUgZGVjaWRpciAqKm5vIHNlIGNvbm9jZSoqLiBIYXkgdHJlcyBzYWxpZGFzOiAoaSkgdXNhciBzb2xvIHJlemFnb3MgJFxtYXRoYmYgeF97dC1ofSQsIHlhIGRpc3BvbmlibGVzOyAoaWkpIHByb25vc3RpY2FyIHByaW1lcm8gJFxtYXRoYmYgeF90JCwgbG8gcXVlIGHDsWFkZSBzdSBwcm9waW8gZXJyb3I7IChpaWkpIHRyYWJhamFyIGNvbiBlc2NlbmFyaW9zIGRlICRcbWF0aGJmIHhfdCQuIFVzYXIgZWwgdmFsb3IgcmVhbGl6YWRvIGRlICRcbWF0aGJmIHhfe1QraH0kIGVuIGVsIHRlc3Qgc2Vyw61hICoqZnVnYSBkZSBpbmZvcm1hY2nDs24gKCpkYXRhIGxlYWthZ2UqKSoqLg0KDQojIyBTQVJJTUFYOiBlc3RhY2lvbmFsaWRhZA0KDQpMYSBlc3RydWN0dXJhICQocCxkLHEpKFAsRCxRKV9zJCBhw7FhZGUgcG9saW5vbWlvcyBkZSBwZXJpb2RvICRzJDoNCg0KJCQNClxQaGkoTF5zKVwsXHBoaShMKVwsKDEtTCleZCgxLUxecyleRFwseV90PWMrXGJvbGRzeW1ib2xcYmV0YSdcbWF0aGJmIHhfdCtcVGhldGEoTF5zKVwsXHRoZXRhKEwpXCxcdmFyZXBzaWxvbl90IC4NCiQkDQoNCkxhICoqcGVyaW9kaWNpZGFkKiogJHMkIGVzIGVsIG7Dum1lcm8gZGUgb2JzZXJ2YWNpb25lcyBxdWUgdGFyZGEgZW4gcmVwZXRpcnNlIHVuIHBhdHLDs246ICRzPTUkIChzZW1hbmEgZGUgbmVnb2NpYWNpw7NuKSwgJHM9MjEkIChtZXMpIG8gJHM9MjUyJCAoYcOxbykgZW4gZGF0b3MgZGlhcmlvczsgJHM9MTIkIHNpIGZ1ZXJhbiBtZW5zdWFsZXMuIExhICoqZGluw6FtaWNhIHJlZ3VsYXIqKiAkKHAsZCxxKSQgZGVzY3JpYmUgbGEgZGVwZW5kZW5jaWEgZW50cmUgb2JzZXJ2YWNpb25lcyBjb250aWd1YXMsIHkgbGEgKiplc3RhY2lvbmFsKiogJChQLEQsUSlfcyQgbGEgZGVwZW5kZW5jaWEgZW50cmUgb2JzZXJ2YWNpb25lcyBzZXBhcmFkYXMgcG9yIG3Dumx0aXBsb3MgZGUgJHMkLiBJbmNsdWlyIGNvbXBvbmVudGVzIGVzdGFjaW9uYWxlcyBleGlnZSAqKmV2aWRlbmNpYSoqIChwaWNvcyBkZSBBQ0YvUEFDRiBlbiByZXphZ29zICRzLDJzLFxkb3RzJCwgdW4gcGF0csOzbiBncsOhZmljbyBvIHVuYSByYXrDs24gZWNvbsOzbWljYSksIHF1ZSBzZSBleGFtaW5hIGVuIGxhIHNlY2Npw7NuIDUuDQoNCiMjIE1vZGVsb3MgR0FSQ0gNCg0KTG9zIEFSSU1BIHN1cG9uZW4gJFZhcihcdmFyZXBzaWxvbl90KT1cc2lnbWFeMiQgY29uc3RhbnRlLiBMb3MgcmVuZGltaWVudG9zIGZpbmFuY2llcm9zIG11ZXN0cmFuICoqYWdydXBhbWllbnRvIGRlIHZvbGF0aWxpZGFkKiosIHF1ZSBzZSBtb2RlbGEgY29uIEdBUkNIKHAscSkgKEVuZ2xlLCAxOTgyOyBCb2xsZXJzbGV2LCAxOTg2KToNCg0KJCQNClx2YXJlcHNpbG9uX3Q9XHNpZ21hX3Qgel90LFxxdWFkIHpfdFxzaW0gaS5pLmQuKDAsMSksXHFxdWFkDQpcc2lnbWFfdF4yPVxvbWVnYStcc3VtX3tpPTF9XntxfVxhbHBoYV9pXCxcdmFyZXBzaWxvbl97dC1pfV4yK1xzdW1fe2o9MX1ee3B9XGJldGFfalwsXHNpZ21hX3t0LWp9XjIgLA0KJCQNCg0KY29uICRcb21lZ2E+MCQsICRcYWxwaGFfaSxcYmV0YV9qXGdlMCQgeSAkXHN1bVxhbHBoYV9pK1xzdW1cYmV0YV9qPDEkIChlc3RhY2lvbmFyaWVkYWQgZW4gY292YXJpYW56YSkuIFVuICoqQVJJTUEtR0FSQ0gqKiBtb2RlbGEgbWVkaWEgeSB2YXJpYW56YSBhIGxhIHZlejogbGEgbWVkaWEgc2lndWUgaWd1YWwsIHBlcm8gbG9zIGludGVydmFsb3MgZGUgcHJlZGljY2nDs24gc2UgdnVlbHZlbiAqKmNvbmRpY2lvbmFsZXMqKiBhbCBuaXZlbCBkZSB2b2xhdGlsaWRhZCByZWNpZW50ZS4gU2kgc2UgZGV0ZWN0YSBoZXRlcm9jZWRhc3RpY2lkYWQgbWFyY2FkYSwgZWwgcHJvY2VkaW1pZW50byBjb3JyZWN0byBlcyByZWFwbGljYXIgbGEgaWRlbnRpZmljYWNpw7NuLCBlc3RpbWFjacOzbiB5IGRpYWduw7NzdGljbyBzb2JyZSBlbCBtb2RlbG8gY29uanVudG8uDQoNCiMjIE9wZXJhZG9yZXMgdXRpbGl6YWRvcw0KDQpUb2RvcyBsb3MgbW9kZWxvcyBhbnRlcmlvcmVzIHNlIGNvbnN0cnV5ZW4gY29tYmluYW5kbyB1bm9zIHBvY29zIG9wZXJhZG9yZXMuIExhIHNpZ3VpZW50ZSB0YWJsYSBsb3MgcmVzdW1lLCBjb24gbG8gcXVlIGhhY2UgY2FkYSB1bm8geSBkw7NuZGUgYXBhcmVjZToNCg0KfCBPcGVyYWRvciB8IERlZmluaWNpw7NuIHwgRnVuY2nDs24gZW4gZWwgbW9kZWxvIHwNCnw6LS18Oi0tfDotLXwNCnwgUmV6YWdvICRMJCB8ICRMXmsgeV90PXlfe3Qta30kICh5ICRMYz1jJCBwYXJhIHVuYSBjb25zdGFudGUpIHwgRGVzcGxhemEgbGEgc2VyaWUgJGskIHBlcmlvZG9zIGhhY2lhIGF0csOhczsgcGVybWl0ZSBlc2NyaWJpciBsYSBtZW1vcmlhIGRlbCBwcm9jZXNvIGNvbW8gdW4gcG9saW5vbWlvLiB8DQp8IERpZmVyZW5jaWEgJCgxLUwpJCB8ICQoMS1MKXlfdD15X3QteV97dC0xfSQ7ICQoMS1MKV4yPTEtMkwrTF4yJCB8IEVsaW1pbmEgbGEgdGVuZGVuY2lhIGVzdG9jw6FzdGljYSAocmHDrXogdW5pdGFyaWEpLiBFbCBleHBvbmVudGUgJGQkIGVzIGVsIG7Dum1lcm8gZGUgdmVjZXMgcXVlIHNlIGFwbGljYS4gfA0KfCBEaWZlcmVuY2lhIGVzdGFjaW9uYWwgJCgxLUxecykkIHwgJCgxLUxecyl5X3Q9eV90LXlfe3Qtc30kIHwgRWxpbWluYSB1biBwYXRyw7NuIHF1ZSBzZSByZXBpdGUgY2FkYSAkcyQgcGVyaW9kb3MuIFNvbG8gc2UgdXNhcsOtYSBjb24gZXZpZGVuY2lhIGRlIGVzdGFjaW9uYWxpZGFkLiB8DQp8IFBvbGlub21pbyBhdXRvcnJlZ3Jlc2l2byAkXHBoaShMKSQgfCAkMS1ccGhpXzFMLVxkb3RzLVxwaGlfcExecCQgfCBSZWNvZ2UgY8OzbW8gZWwgcGFzYWRvIHByb3BpbyBkZSBsYSBzZXJpZSBpbmZsdXllIGVuIGVsIHByZXNlbnRlLiB8DQp8IFBvbGlub21pbyBkZSBtZWRpYXMgbcOzdmlsZXMgJFx0aGV0YShMKSQgfCAkMStcdGhldGFfMUwrXGRvdHMrXHRoZXRhX3FMXnEkIHwgUmVjb2dlIGPDs21vIGxvcyBjaG9xdWVzIHBhc2Fkb3Mgc2lndWVuIGFmZWN0YW5kbyBhbCBwcmVzZW50ZS4gfA0KfCBQb2xpbm9taW9zIGVzdGFjaW9uYWxlcyAkXFBoaShMXnMpJCB5ICRcVGhldGEoTF5zKSQgfCAkMS1cUGhpXzFMXnMtXGRvdHMtXFBoaV9QTF57UHN9JCB5ICQxK1xUaGV0YV8xTF5zK1xkb3RzK1xUaGV0YV9RTF57UXN9JCB8IElndWFsIHF1ZSBsb3MgYW50ZXJpb3JlcywgcGVybyBhY3R1YW5kbyBzb2JyZSByZXphZ29zIG3Dumx0aXBsb3MgZGUgJHMkLiB8DQp8IENvbWJpbmFjacOzbiBsaW5lYWwgZGUgcmVncmVzb3JlcyAkXGJvbGRzeW1ib2xcYmV0YSdcbWF0aGJmIHhfdCQgfCAkXGJldGFfMXhfezEsdH0rXGRvdHMrXGJldGFfa3hfe2ssdH0kIHwgSW5jb3Jwb3JhIHZhcmlhYmxlcyBleMOzZ2VuYXMgZW4gQVJJTUFYIHkgU0FSSU1BWC4gfA0KfCBQb2xpbm9taW9zIEFSQ0ggeSBHQVJDSCAkXGFscGhhKEwpJCB5ICRcYmV0YShMKSQgfCAkXGFscGhhKEwpPVxzdW1fe2k9MX1ee3F9XGFscGhhX2lMXmkkLCAkXGJldGEoTCk9XHN1bV97aj0xfV57cH1cYmV0YV9qTF5qJCB8IFBlcm1pdGVuIGVzY3JpYmlyIGxhIHZhcmlhbnphIGNvbmRpY2lvbmFsIGNvbW8gJFxzaWdtYV90XjI9XG9tZWdhK1xhbHBoYShMKVx2YXJlcHNpbG9uX3ReMitcYmV0YShMKVxzaWdtYV90XjIkLiB8DQp8IEVzcGVyYW56YSBjb25kaWNpb25hbCAkRShcY2RvdFxtaWRcbWF0aGNhbCBJX3t0LTF9KSQgfCBWYWxvciBlc3BlcmFkbyBkYWRvIGVsIHBhc2FkbyB8IERlZmluZSBsYSBpbm5vdmFjacOzbiAkXHZhcmVwc2lsb25fdCQgeSBlbCBwcm9uw7NzdGljbyDDs3B0aW1vLiB8DQoNCkNvbiBlc3RvcyBvcGVyYWRvcmVzLCBsb3MgbW9kZWxvcyBkZSBlc3RlIHRyYWJham8gc2UgZXNjcmliZW4gZW4gZm9ybWEgY29tcGFjdGE6IGVsIEFSSU1BKDEsMSwwKSBlcyAkXHBoaShMKSgxLUwpeV90PVx2YXJlcHNpbG9uX3QkIGNvbiAkXHBoaShMKT0xLVxwaGlfMUwkLCB5IGxhIGNhbWluYXRhIGFsZWF0b3JpYSBlcyAkKDEtTCl5X3Q9XHZhcmVwc2lsb25fdCQuIExhICoqZWN1YWNpw7NuIGNhcmFjdGVyw61zdGljYSoqICRccGhpKHopPTAkIChvICRcdGhldGEoeik9MCQpIHNlIG9idGllbmUgcmVlbXBsYXphbmRvICRMJCBwb3IgdW5hIHZhcmlhYmxlICR6JDsgc3VzIHJhw61jZXMgZGV0ZXJtaW5hbiBsYSBlc3RhY2lvbmFyaWVkYWQgeSBsYSBpbnZlcnRpYmlsaWRhZC4NCg0KIyMgU3VwdWVzdG9zIGRlIGxvcyBtb2RlbG9zDQoNCkNhZGEgbW9kZWxvIHNvbG8gZXMgY29uZmlhYmxlIHNpIHNlIGN1bXBsZW4gY2llcnRvcyBzdXB1ZXN0b3MuIExhIHRhYmxhIGluZGljYSBjdcOhbGVzIHNvbiB5IGVuIHF1w6kgcGFydGUgZGVsIHRyYWJham8gc2UgdmVyaWZpY2FuOg0KDQp8IE1vZGVsbyB8IFN1cHVlc3RvIHwgQ8OzbW8gc2UgdmVyaWZpY2EgZW4gZXN0ZSB0cmFiYWpvIHwNCnw6LS18Oi0tfDotLXwNCnwgQVIocCkgfCAqKkVzdGFjaW9uYXJpZWRhZDoqKiBsYXMgcmHDrWNlcyBkZSAkXHBoaSh6KT0wJCBlc3TDoW4gZnVlcmEgZGVsIGPDrXJjdWxvIHVuaXRhcmlvIChtw7NkdWxvIG1heW9yIHF1ZSAxKS4gfCBBREYgeSBLUFNTIHNvYnJlIGxhIHNlcmllIGRpZmVyZW5jaWFkYSB5IG3Ds2R1bG8gZGUgbGFzIHJhw61jZXMgZXN0aW1hZGFzIChzZWNjacOzbiA1KS4gfA0KfCBNQShxKSB8ICoqSW52ZXJ0aWJpbGlkYWQ6KiogbGFzIHJhw61jZXMgZGUgJFx0aGV0YSh6KT0wJCBlc3TDoW4gZnVlcmEgZGVsIGPDrXJjdWxvIHVuaXRhcmlvLiB8IE3Ds2R1bG8gZGUgbGFzIHJhw61jZXMgZXN0aW1hZGFzIChzZWNjacOzbiA1KS4gfA0KfCBBUklNQShwLGQscSkgfCAqKk9yZGVuIGRlIGludGVncmFjacOzbiBjb3JyZWN0bzoqKiBsYSBzZXJpZSBkaWZlcmVuY2lhZGEgJGQkIHZlY2VzIGVzIGVzdGFjaW9uYXJpYS4gfCBBREYgeSBLUFNTIGVuIG5pdmVsZXMgeSBlbiBwcmltZXJhIGRpZmVyZW5jaWEsIHF1ZSBsbGV2YW4gYSAkZD0xJCAoc2VjY2nDs24gNSkuIHwNCnwgQVJJTUEocCxkLHEpIHwgKipJbm5vdmFjaW9uZXMgZGUgcnVpZG8gYmxhbmNvOioqIG1lZGlhIGNlcm8sIHZhcmlhbnphIGNvbnN0YW50ZSB5IHNpbiBhdXRvY29ycmVsYWNpw7NuLiB8IEFDRiBkZSByZXNpZHVvcyB5IHBydWViYSBkZSBManVuZy1Cb3ggKHNlY2Npw7NuIDYpLiB8DQp8IEFSSU1BKHAsZCxxKSB8ICoqTm9ybWFsaWRhZCBkZSBsYXMgaW5ub3ZhY2lvbmVzKiogKHNvbG8gbmVjZXNhcmlhIHBhcmEgaW50ZXJ2YWxvcyBnYXVzc2lhbm9zKS4gfCBKYXJxdWUtQmVyYSwgU2hhcGlyby1XaWxrLCBoaXN0b2dyYW1hIHkgUS1ROyBzaSBzZSByZWNoYXphLCBzZSB1c2EgYm9vdHN0cmFwIGRlIHJlc2lkdW9zIChzZWNjaW9uZXMgNiB5IDkpLiB8DQp8IEFSSU1BKHAsZCxxKSB8ICoqUmVsYWNpw7NuIGxpbmVhbCB5IHBhcsOhbWV0cm9zIGVzdGFibGVzKiogZW4gZWwgdGllbXBvLiB8IEdyw6FmaWNvIGRlIHJlc2lkdW9zOyBzZSByZWNvbm9jZSBjb21vIGxpbWl0YWNpw7NuIChzZWNjacOzbiAxMCkuIHwNCnwgQVJJTUFYIHwgKipFeG9nZW5laWRhZDoqKiAkXG1hdGhiZiB4X3QkIG5vIGVzdMOhIGNvcnJlbGFjaW9uYWRhIGNvbiAkXHZhcmVwc2lsb25fdCQsIHkgJFxtYXRoYmYgeF97VCtofSQgZXN0w6EgZGlzcG9uaWJsZSBvIHNlIHB1ZWRlIHByb25vc3RpY2FyIHNpbiBmdWdhIGRlIGluZm9ybWFjacOzbi4gfCBBcmd1bWVudG8gZWNvbsOzbWljbyAoc2VjY2nDs24gNC41KTsgbm8gc2UgZXN0aW1hIGVuIGVzdGUgdHJhYmFqby4gfA0KfCBTQVJJTUFYIHwgKipQYXRyw7NuIGVzdGFjaW9uYWwgZXN0YWJsZSoqIGRlIHBlcmlvZG8gJHMkLiB8IEFDRiBlbiByZXphZ29zIGVzdGFjaW9uYWxlcyAoc2VjY2nDs24gNSk7IHNlIGRlc2NhcnRhIHBvciBmYWx0YSBkZSBldmlkZW5jaWEuIHwNCnwgR0FSQ0gocCxxKSB8ICR6X3QkIGkuaS5kLiBjb24gbWVkaWEgMCB5IHZhcmlhbnphIDE7ICRcb21lZ2E+MCQsICRcYWxwaGFfaSxcYmV0YV9qXGdlMCQgeSAkXHN1bVxhbHBoYV9pK1xzdW1cYmV0YV9qPDEkLiB8IExqdW5nLUJveCBzb2JyZSByZXNpZHVvcyBhbCBjdWFkcmFkbyB5IHBydWViYSBBUkNILUxNIHBhcmEgZGV0ZWN0YXIgbGEgbmVjZXNpZGFkIGRlIEdBUkNIIChzZWNjacOzbiA2KS4gfA0KfCBUb2RvcyB8ICoqU2luIGZ1Z2EgZGUgaW5mb3JtYWNpw7NuOioqIHBhcsOhbWV0cm9zIHkgdHJhbnNmb3JtYWNpb25lcyBlc3RpbWFkb3Mgc29sbyBjb24gZWwgZW50cmVuYW1pZW50by4gfCBEaXNlw7FvIGRlIGxhIHNlcGFyYWNpw7NuIHRyYWluLXRlc3QgKHNlY2Npw7NuIDMpLiB8DQoNCiMjIEp1c3RpZmljYWNpw7NuIGRlbCBtb2RlbG8gcGVydGluZW50ZQ0KDQotICoqUmHDrXogdW5pdGFyaWEgZW4gbml2ZWxlcyoqIChzZWNjacOzbiA1KSBpbXBsaWNhICRkPTEkLg0KLSAqKkFSSU1BIHkgbm8gU0FSSU1BOioqIG5vIGhheSBldmlkZW5jaWEgZGUgZXN0YWNpb25hbGlkYWQgKHNlY2Npw7NuIDUpIG5pIHJhesOzbiBlY29uw7NtaWNhIHBhcmEgZXNwZXJhcmxhLg0KLSAqKkFSSU1BIHkgbm8gQVJJTUFYOioqIGxvcyByZWdyZXNvcmVzIGV4w7NnZW5vcyByZXF1aWVyZW4gcHJvbm9zdGljYXIgJFxtYXRoYmYgeF97VCtofSQsIGxvIHF1ZSBhw7FhZGUgaW5jZXJ0aWR1bWJyZS4gVW4gcHJlY2lvIGVmaWNpZW50ZSB5YSBpbmNvcnBvcmEgZXNhIGluZm9ybWFjacOzbi4gU2UgcHJlc2VudGEgY29tbyBleHRlbnNpw7NuLg0KLSAqKkdBUkNIOioqIHBlcnRpbmVudGUgcGFyYSBlbCByaWVzZ28sIG5vIHBhcmEgZWwgcHJvbsOzc3RpY28gcHVudHVhbC4gU2UgZGlzY3V0ZSBjb24gbG9zIHJlc2lkdW9zIChzZWNjacOzbiA2KSB5IHNlIGRlamEgY29tbyBleHRlbnNpw7NuLg0KLSAqKlNlbGVjY2nDs24gbWFudWFsOioqIGxvcyDDs3JkZW5lcyBzZSBwcm9wb25lbiBhIHBhcnRpciBkZSBBQ0YvUEFDRiB5IGRlIGNyaXRlcmlvcyBkZSBpbmZvcm1hY2nDs24sIHNpbiByZWN1cnJpciBhIGxhIHNlbGVjY2nDs24gYXV0b23DoXRpY2EgKEh5bmRtYW4geSBLaGFuZGFrYXIsIDIwMDgpLg0KDQoqKkNyaXRlcmlvcyBkZSBpbmZvcm1hY2nDs24qKiB1c2Fkb3MgcGFyYSBjb21wYXJhciBjYW5kaWRhdG9zICgkayQgcGFyw6FtZXRyb3MsICRUJCBvYnNlcnZhY2lvbmVzKToNCg0KJCQNCkFJQz0tMlxsbiBMKzJrLFxxdWFkDQpBSUNjPUFJQytcZnJhY3syayhrKzEpfXtULWstMX0sXHF1YWQNCkJJQz0tMlxsbiBMK2tcbG4gVCAuDQokJA0KDQojIElkZW50aWZpY2FjacOzbiB5IGNhbGlicmFjacOzbg0KDQojIyBFc3RhY2lvbmFyaWVkYWQNCg0KUHJpbWVybyBzZSBpbnNwZWNjaW9uYSBlbCBncsOhZmljbzogbGEgc2VyaWUgZW4gbml2ZWxlcyB0aWVuZSB0ZW5kZW5jaWEgeSBubyByZXZpZXJ0ZSBhIHVuYSBtZWRpYSwgbWllbnRyYXMgcXVlIHN1IHByaW1lcmEgZGlmZXJlbmNpYSBvc2NpbGEgYWxyZWRlZG9yIGRlIHVuIHZhbG9yIGNvbnN0YW50ZS4NCg0KYGBge3IgZ3JhZl9lc3R9DQp5X3RzICA8LSB0cyh5X3RyYWluKQ0KZHlfdHMgPC0gZGlmZih5X3RzKQ0KZGZfZXN0IDwtIHJiaW5kKA0KICBkYXRhLmZyYW1lKHQgPSAxOmxlbmd0aCh5X3RzKSwgIFZhbG9yID0gYXMubnVtZXJpYyh5X3RzKSwgIFNlcmllID0gIk5pdmVsZXMgKEJveC1Db3gpIiksDQogIGRhdGEuZnJhbWUodCA9IDI6bGVuZ3RoKHlfdHMpLCAgVmFsb3IgPSBhcy5udW1lcmljKGR5X3RzKSwgU2VyaWUgPSAiUHJpbWVyYSBkaWZlcmVuY2lhIikNCikNCmdncGxvdChkZl9lc3QsIGFlcyh0LCBWYWxvcikpICsgZ2VvbV9saW5lKGNvbG9yID0gIiMxYTczZTgiKSArDQogIGZhY2V0X3dyYXAoflNlcmllLCBzY2FsZXMgPSAiZnJlZV95IiwgbmNvbCA9IDEpICsNCiAgbGFicyh0aXRsZSA9ICJNdWVzdHJhIGRlIGVudHJlbmFtaWVudG86IG5pdmVsZXMgdnMuIHByaW1lcmEgZGlmZXJlbmNpYSIsDQogICAgICAgeCA9ICJPYnNlcnZhY2nDs24iLCB5ID0gTlVMTCkgKw0KICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDEzKQ0KYGBgDQoNClNlIGFwbGljYW4gZG9zIHBydWViYXMgY29uIGhpcMOzdGVzaXMgbnVsYXMgKipvcHVlc3RhcyoqIChEaWNrZXkgeSBGdWxsZXIsIDE5Nzk7IEt3aWF0a293c2tpIGV0IGFsLiwgMTk5MiksIGltcGxlbWVudGFkYXMgY29uIGB0c2VyaWVzYCAoVHJhcGxldHRpIHkgSG9ybmlrLCAyMDI0KToNCg0KfCBQcnVlYmEgfCBIMCB8IFNlIGNvbmNsdXllIGVzdGFjaW9uYXJpZWRhZCBzaSB8DQp8Oi0tfDotLXw6LS18DQp8IEFERiB8IFJhw616IHVuaXRhcmlhIChubyBlc3RhY2lvbmFyaWEpIHwgcC12YWxvciA8IDAuMDUgfA0KfCBLUFNTIHwgRXN0YWNpb25hcmllZGFkIGVuIG5pdmVsIHwgcC12YWxvciA+IDAuMDUgfA0KDQpgYGB7ciBlc3RhY2lvbmFyaWVkYWR9DQphZGZfbiAgPC0gYWRmLnRlc3QoeV90cykNCmtwc3NfbiA8LSBrcHNzLnRlc3QoeV90cywgbnVsbCA9ICJMZXZlbCIpDQphZGZfZCAgPC0gYWRmLnRlc3QoZHlfdHMpDQprcHNzX2QgPC0ga3Bzcy50ZXN0KGR5X3RzLCBudWxsID0gIkxldmVsIikNCg0KcmVzX2VzdCA8LSBkYXRhLmZyYW1lKA0KICBTZXJpZSA9IHJlcChjKCJOaXZlbGVzIChCb3gtQ294KSIsICJQcmltZXJhIGRpZmVyZW5jaWEiKSwgZWFjaCA9IDIpLA0KICBQcnVlYmEgPSByZXAoYygiQURGIiwgIktQU1MiKSwgMiksDQogIEVzdGFkw61zdGljbyA9IGMoYWRmX24kc3RhdGlzdGljLCBrcHNzX24kc3RhdGlzdGljLCBhZGZfZCRzdGF0aXN0aWMsIGtwc3NfZCRzdGF0aXN0aWMpLA0KICBgcC12YWxvcmAgPSBjKGFkZl9uJHAudmFsdWUsIGtwc3NfbiRwLnZhbHVlLCBhZGZfZCRwLnZhbHVlLCBrcHNzX2QkcC52YWx1ZSksDQogIGNoZWNrLm5hbWVzID0gRkFMU0UNCikNCnJlc19lc3QkQ29uY2x1c2nDs24gPC0gYygNCiAgaWZlbHNlKGFkZl9uJHAudmFsdWUgIDwgMC4wNSwgIkVzdGFjaW9uYXJpYSIsICJObyBlc3RhY2lvbmFyaWEiKSwNCiAgaWZlbHNlKGtwc3NfbiRwLnZhbHVlID4gMC4wNSwgIkVzdGFjaW9uYXJpYSIsICJObyBlc3RhY2lvbmFyaWEiKSwNCiAgaWZlbHNlKGFkZl9kJHAudmFsdWUgIDwgMC4wNSwgIkVzdGFjaW9uYXJpYSIsICJObyBlc3RhY2lvbmFyaWEiKSwNCiAgaWZlbHNlKGtwc3NfZCRwLnZhbHVlID4gMC4wNSwgIkVzdGFjaW9uYXJpYSIsICJObyBlc3RhY2lvbmFyaWEiKQ0KKQ0KdGFibGEocmVzX2VzdCwgIlBydWViYXMgQURGIHkgS1BTUyAobXVlc3RyYSBkZSBlbnRyZW5hbWllbnRvKSIsIDQpDQpgYGANCg0KYHRzZXJpZXNgIHRydW5jYSBsb3MgcC12YWxvcmVzIGFsIHJhbmdvIFswLjAxLCAwLjFdLiBDb21vIHZlcmlmaWNhY2nDs24gYWRpY2lvbmFsLCBsYSBwcnVlYmEgQURGIGRlIGB1cmNhYCAoUGZhZmYsIDIwMDgpLCBjb24gY29uc3RhbnRlIHkgc2VsZWNjacOzbiBkZSByZXphZ29zIHBvciBBSUM6DQoNCmBgYHtyIHVyY2F9DQpkZl91cmNhIDwtIHVyLmRmKHlfdHMsIHR5cGUgPSAiZHJpZnQiLCBzZWxlY3RsYWdzID0gIkFJQyIpDQpzdW1tYXJ5KGRmX3VyY2EpDQpgYGANCg0KKipDb25jbHVzacOzbjoqKiBsYSBzZXJpZSBlbiBuaXZlbGVzICoqbm8gZXMgZXN0YWNpb25hcmlhKiogKEFERiBubyByZWNoYXphIGxhIHJhw616IHVuaXRhcmlhIHkgS1BTUyByZWNoYXphIGxhIGVzdGFjaW9uYXJpZWRhZCkuIExhICoqc2VyaWUgZGlmZXJlbmNpYWRhIGVzIGVzdGFjaW9uYXJpYSoqIHNlZ8O6biBhbWJhcyBwcnVlYmFzLiBQb3IgdGFudG8sICoqZCA9IDEqKi4NCg0KIyMgQUNGIHkgUEFDRg0KDQpgYGB7ciBhY2ZfcGFjZiwgZmlnLmhlaWdodD03fQ0KcGFyKG1mcm93ID0gYygyLCAyKSkNCmFjZih5X3RzLCAgbGFnLm1heCA9IDQwLCBtYWluID0gIkFDRiAtIG5pdmVsZXMiKQ0KcGFjZih5X3RzLCBsYWcubWF4ID0gNDAsIG1haW4gPSAiUEFDRiAtIG5pdmVsZXMiKQ0KYWNmKGR5X3RzLCAgbGFnLm1heCA9IDQwLCBtYWluID0gIkFDRiAtIHByaW1lcmEgZGlmZXJlbmNpYSIpDQpwYWNmKGR5X3RzLCBsYWcubWF4ID0gNDAsIG1haW4gPSAiUEFDRiAtIHByaW1lcmEgZGlmZXJlbmNpYSIpDQpwYXIobWZyb3cgPSBjKDEsIDEpKQ0KYGBgDQoNCkxhIEFDRiBlbiBuaXZlbGVzIGRlY2FlIG11eSBsZW50YW1lbnRlLCByYXNnbyB0w61waWNvIGRlIHVuYSByYcOteiB1bml0YXJpYS4gRW4gbGEgc2VyaWUgZGlmZXJlbmNpYWRhIGxhcyBhdXRvY29ycmVsYWNpb25lcyBzb24gcGVxdWXDsWFzIHkgY2FzaSB0b2RhcyBxdWVkYW4gZGVudHJvIGRlIGxhcyBiYW5kYXMsIGxvIHF1ZSBzdWdpZXJlIHVuYSBlc3RydWN0dXJhIEFSTUEgZGUgb3JkZW4gYmFqbyAobyBuaW5ndW5hKS4gVW4gQVIoMSkgbyB1biBNQSgxKSBwZXF1ZcOxb3MsIG8gc3VzIGNvbWJpbmFjaW9uZXMgaGFzdGEgb3JkZW4gMiwgc29uIGNhbmRpZGF0b3MgcmF6b25hYmxlcyAoJHAscVxsZTIkKS4NCg0KIyMgQW7DoWxpc2lzIGRlIGVzdGFjaW9uYWxpZGFkDQoNClNlIGV4YW1pbmEgbGEgQUNGIGRlIGxhIHNlcmllIGRpZmVyZW5jaWFkYSBlbiByZXphZ29zIGVzdGFjaW9uYWxlcyBwbGF1c2libGVzOiBzZW1hbmFsICg1KSwgbWVuc3VhbCAoMjEpLCB0cmltZXN0cmFsICg2MyksIHNlbWVzdHJhbCAoMTI2KSB5IGFudWFsICgyNTIpLg0KDQpgYGB7ciBlc3RhY2lvbmFsaWRhZH0NCmxhZ3NfcyA8LSBjKDUsIDEwLCAxNSwgMjAsIDIxLCA0MiwgNjMsIDEyNiwgMjUyKQ0KYWMgPC0gYWNmKGR5X3RzLCBsYWcubWF4ID0gbWF4KGxhZ3NfcyksIHBsb3QgPSBGQUxTRSkkYWNmW2xhZ3NfcyArIDFdDQpiYW5kYSA8LSAxLjk2IC8gc3FydChsZW5ndGgoZHlfdHMpKQ0KdGFiX3MgPC0gZGF0YS5mcmFtZShSZXphZ28gPSBsYWdzX3MsIEFDRiA9IGFjLCBgQmFuZGEgwrFgID0gYmFuZGEsDQogICAgICAgICAgICAgICAgICAgIFNpZ25pZmljYXRpdm8gPSBpZmVsc2UoYWJzKGFjKSA+IGJhbmRhLCAiU8OtIiwgIk5vIiksDQogICAgICAgICAgICAgICAgICAgIGNoZWNrLm5hbWVzID0gRkFMU0UpDQp0YWJsYSh0YWJfcywgIkFDRiBkZSBsYSBzZXJpZSBkaWZlcmVuY2lhZGEgZW4gcmV6YWdvcyBlc3RhY2lvbmFsZXMiLCA0KQ0Kbl9zaWcgPC0gc3VtKGFicyhhYykgPiBiYW5kYSkNCmBgYA0KDQpEZSBsb3MgYHIgbGVuZ3RoKGxhZ3NfcylgIHJlemFnb3MgZXN0YWNpb25hbGVzIGV2YWx1YWRvcywgYHIgbl9zaWdgIHN1cGVyYW4gbGEgYmFuZGEgZGVsIDk1ICUuIENvbiB1biBuaXZlbCBkZSBzaWduaWZpY2FuY2lhIGRlbCA1ICUgc2UgZXNwZXJhcsOtYSBhbHJlZGVkb3IgZGUgYHIgcm91bmQoMC4wNSAqIGxlbmd0aChsYWdzX3MpLCAxKWAgcG9yIGF6YXIuICoqTm8gaGF5IGV2aWRlbmNpYSBzaXN0ZW3DoXRpY2EgZGUgZXN0YWNpb25hbGlkYWQqKiAobm8gYXBhcmVjZW4gcGljb3MgcGVyacOzZGljb3MgZW4gJHMsIDJzLCBcZG90cyQpIHkgdGFtcG9jbyBoYXkgdW5hIHJhesOzbiBlY29uw7NtaWNhIHBhcmEgZXNwZXJhcmxhIGVuIHVuIHByZWNpbyBidXJzw6F0aWwuIFNlICoqZGVzY2FydGFuIGxvcyBjb21wb25lbnRlcyBlc3RhY2lvbmFsZXMqKiB5IG5vIHNlIGVzdGltYSBTQVJJTUEvU0FSSU1BWC4NCg0KIyMgTW9kZWxvcyBjYW5kaWRhdG9zDQoNClNlIGVzdGltYW4gbWFudWFsbWVudGUsIHNvbG8gY29uIGVsIGVudHJlbmFtaWVudG8sIGxvcyBzZWlzIG1vZGVsb3MgY29uICRkPTEkIChzaW4gYGF1dG8uYXJpbWEoKWApLCBjb24gZWwgcGFxdWV0ZSBgZm9yZWNhc3RgIChIeW5kbWFuIHkgS2hhbmRha2FyLCAyMDA4KS4gTm8gc2UgaW5jbHV5ZSBkZXJpdmEsIHB1ZXMgY29uICRkPTEkIGltcGxpY2Fyw61hIHVuYSB0ZW5kZW5jaWEgZGV0ZXJtaW5pc3RhIGFkaWNpb25hbCB5IGVsIG9iamV0aXZvIGVzIGNvbnRyYXN0YXIgZnJlbnRlIGEgbGEgY2FtaW5hdGEgYWxlYXRvcmlhIHNpbiBkZXJpdmEuDQoNCnwgTW9kZWxvIHwgSnVzdGlmaWNhY2nDs24gfA0KfDotLXw6LS18DQp8IEFSSU1BKDEsMSwwKSB8IFByaW1lcmEgZGlmZXJlbmNpYSBjb24gbWVtb3JpYSBhdXRvcnJlZ3Jlc2l2YSBkZSB1biByZXphZ28gKFBBQ0YpLiB8DQp8IEFSSU1BKDAsMSwxKSB8IFByaW1lcmEgZGlmZXJlbmNpYSBjb24gdW4gY2hvcXVlIHJlemFnYWRvIChBQ0YpLiB8DQp8IEFSSU1BKDEsMSwxKSB8IENvbWJpbmEgYW1ib3MgY29tcG9uZW50ZXMuIHwNCnwgQVJJTUEoMiwxLDEpLCAoMSwxLDIpLCAoMiwxLDIpIHwgw5NyZGVuZXMgbWF5b3JlcywgcGFyYSB2ZXJpZmljYXIgc2kgYcOxYWRlbiBpbmZvcm1hY2nDs24gbyBzb2xvIHBhcsOhbWV0cm9zLiB8DQoNCmBgYHtyIG1vZGVsb3N9DQp0YWJsYShpYywgIkNyaXRlcmlvcyBkZSBpbmZvcm1hY2nDs24gKG11ZXN0cmEgZGUgZW50cmVuYW1pZW50bykiLCAzKQ0KYGBgDQoNCiMjIyBFc3RpbWFjaW9uZXMgeSBzaWduaWZpY2FuY2lhIGRlIGxvcyBwYXLDoW1ldHJvcw0KDQpgYGB7ciBjb2Vmc30NCmNvZWZzIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShuYW1lcyhhanVzdGVzKSwgZnVuY3Rpb24obm0pIHsNCiAgZiA8LSBhanVzdGVzW1tubV1dDQogIGIgPC0gY29lZihmKTsgc2UgPC0gc3FydChkaWFnKGYkdmFyLmNvZWYpKTsgeiA8LSBiIC8gc2UNCiAgZGF0YS5mcmFtZShNb2RlbG8gPSBubSwgUGFyw6FtZXRybyA9IG5hbWVzKGIpLCBFc3RpbWFjacOzbiA9IGIsIGBFcnJvciBlc3QuYCA9IHNlLA0KICAgICAgICAgICAgIHogPSB6LCBgcC12YWxvcmAgPSAyICogcG5vcm0oLWFicyh6KSksDQogICAgICAgICAgICAgU2lnbmlmaWNhdGl2byA9IGlmZWxzZSgyICogcG5vcm0oLWFicyh6KSkgPCAwLjA1LCAiU8OtIiwgIk5vIiksDQogICAgICAgICAgICAgY2hlY2submFtZXMgPSBGQUxTRSwgcm93Lm5hbWVzID0gTlVMTCkNCn0pKQ0KdGFibGEoY29lZnMsICJFc3RpbWFjaW9uZXMgeSBzaWduaWZpY2FuY2lhIGluZGl2aWR1YWwgKHBydWViYSB6KSIsIDQpDQpgYGANCg0KIyMjIEVzdGFjaW9uYXJpZWRhZCBlIGludmVydGliaWxpZGFkIGRlIGxvcyBtb2RlbG9zIGVzdGltYWRvcw0KDQpTZSB2ZXJpZmljYSBxdWUgbGFzIHJhw61jZXMgZGUgbG9zIHBvbGlub21pb3MgJFxwaGkoeikkIHkgJFx0aGV0YSh6KSQgZXN0w6luIGZ1ZXJhIGRlbCBjw61yY3VsbyB1bml0YXJpbyAobcOzZHVsbyBtYXlvciBxdWUgMSksIHRhbCBjb21vIGV4aWdlbiBsb3Mgc3VwdWVzdG9zIGRlIGxhIHNlY2Npw7NuIDQuOToNCg0KYGBge3IgcmFpY2VzfQ0KbW9kdWxvX21pbiA8LSBmdW5jdGlvbihjZikgaWYgKGxlbmd0aChjZikgPT0gMCkgTkFfcmVhbF8gZWxzZSBtaW4oTW9kKHBvbHlyb290KGMoMSwgY2YpKSkpDQpyYWljZXMgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KG5hbWVzKGFqdXN0ZXMpLCBmdW5jdGlvbihubSkgew0KICBiICA8LSBjb2VmKGFqdXN0ZXNbW25tXV0pDQogIGFyIDwtIGJbZ3JlcGwoIl5hciIsIG5hbWVzKGIpKV0NCiAgbWEgPC0gYltncmVwbCgiXm1hIiwgbmFtZXMoYikpXQ0KICBtYXIgPC0gbW9kdWxvX21pbigtYXIpICAgICMgcG9saW5vbWlvIEFSOiAxIC0gcGhpMSB6IC0gLi4uIC0gcGhpcCB6XnANCiAgbW1hIDwtIG1vZHVsb19taW4obWEpICAgICAjIHBvbGlub21pbyBNQTogMSArIHRoZXRhMSB6ICsgLi4uICsgdGhldGFxIHpecQ0KICBkYXRhLmZyYW1lKE1vZGVsbyA9IG5tLA0KICAgICAgICAgICAgIGBNw7NkdWxvIG3DrW5pbW8gcmHDrXogQVJgID0gbWFyLA0KICAgICAgICAgICAgIGBNw7NkdWxvIG3DrW5pbW8gcmHDrXogTUFgID0gbW1hLA0KICAgICAgICAgICAgIGBFc3RhY2lvbmFyaW8gZSBpbnZlcnRpYmxlYCA9IGlmZWxzZShhbGwoYyhtYXIsIG1tYSkgPiAxLCBuYS5ybSA9IFRSVUUpLCAiU8OtIiwgIk5vIiksDQogICAgICAgICAgICAgY2hlY2submFtZXMgPSBGQUxTRSwgcm93Lm5hbWVzID0gTlVMTCkNCn0pKQ0KdGFibGEocmFpY2VzLCAiUmHDrWNlcyBkZSBsb3MgcG9saW5vbWlvcyBBUiB5IE1BIChkZWJlbiB0ZW5lciBtw7NkdWxvIG1heW9yIHF1ZSAxKSIsIDQpDQpgYGANCg0KKipTZWxlY2Npw7NuLioqIExhIGVsZWNjacOzbiBubyB1c2EgZWwgZGVzZW1wZcOxbyBkZWwgdGVzdC4gU2UgYmFzYSBlbjogKGkpIGxvcyBjcml0ZXJpb3MgZGUgaW5mb3JtYWNpw7NuIChCSUMgcGVuYWxpemEgbcOhcyBsb3MgcGFyw6FtZXRyb3MgYWRpY2lvbmFsZXMpLCAoaWkpIGxhIHNpZ25pZmljYW5jaWEsIChpaWkpIGxhIHBhcnNpbW9uaWEsIChpdikgbGEgY29oZXJlbmNpYSBlY29uw7NtaWNhIChhIG1heW9yIGVmaWNpZW5jaWEsIG1lbm9yIGVzdHJ1Y3R1cmEgZGluw6FtaWNhIGVzcGVyYWJsZSkgeSAodikgbG9zIHJlc2lkdW9zIChzZWNjacOzbiA2KS4gTG9zIG1vZGVsb3MgZGUgbWF5b3Igb3JkZW4gKipubyBhcG9ydGFuIHVuYSBtZWpvcmEqKiBxdWUganVzdGlmaXF1ZSBzdXMgcGFyw6FtZXRyb3MgYWRpY2lvbmFsZXMuIEFSSU1BKDEsMSwwKSB5IEFSSU1BKDAsMSwxKSBzb24gcHLDoWN0aWNhbWVudGUgZXF1aXZhbGVudGVzIHkgZWwgcHJpbWVybyBlcyBlbCBtw6FzIHBhcnNpbW9uaW9zbyBjb24gdW4gY29tcG9uZW50ZSBhdXRvcnJlZ3Jlc2l2byBpbnRlcnByZXRhYmxlLCBwb3IgbG8gcXVlIHNlICoqc2VsZWNjaW9uYSBlbCBBUklNQSgxLDEsMCkqKi4NCg0KYGBge3Igc2VsZWNjaW9ufQ0KbW9kZWxvX3NlbCA8LSAiQVJJTUEoMSwxLDApIg0KZml0X3NlbCAgICA8LSBhanVzdGVzW1ttb2RlbG9fc2VsXV0NCmNhdCgiTW9kZWxvIGNvbiBtZW5vciBCSUMgZW4gZXN0YSBlamVjdWNpw7NuOiIsIGljJE1vZGVsb1t3aGljaC5taW4oaWMkQklDKV0sICJcbiIpDQpjYXQoIk1vZGVsbyBjb24gbWVub3IgQUlDIGVuIGVzdGEgZWplY3VjacOzbjoiLCBpYyRNb2RlbG9bd2hpY2gubWluKGljJEFJQyldLCAiXG4iKQ0KY2F0KCJNb2RlbG8gc2VsZWNjaW9uYWRvOiIsIG1vZGVsb19zZWwsDQogICAgInwgQUlDID0iLCByb3VuZChBSUMoZml0X3NlbCksIDMpLCAifCBCSUMgPSIsIHJvdW5kKEJJQyhmaXRfc2VsKSwgMyksICJcblxuIikNCnByaW50KGZpdF9zZWwpDQpgYGANCg0KIyBEaWFnbsOzc3RpY28gZGUgcmVzaWR1b3MNCg0KVW4gbW9kZWxvIGFkZWN1YWRvIGRlYmUgcHJvZHVjaXIgcmVzaWR1b3MgY29tcGF0aWJsZXMgY29uIHJ1aWRvIGJsYW5jbzogJEUoXHZhcmVwc2lsb25fdClcYXBwcm94MCQgeSAkQ292KFx2YXJlcHNpbG9uX3QsXHZhcmVwc2lsb25fe3Qta30pXGFwcHJveDAkIHBhcmEgJGtcbmVxMCQuDQoNCiMjIFJlc2lkdW9zIGVuIGVsIHRpZW1wbyB5IGVzdGFiaWxpZGFkIGRlIGxhIHZhcmlhbnphDQoNCmBgYHtyIHJlc2lkdW9zX3RpZW1wb30NCnJlcyA8LSBhcy5udW1lcmljKHJlc2lkdWFscyhmaXRfc2VsKSkNCmRmX3JlcyA8LSBkYXRhLmZyYW1lKHQgPSBzZXFfYWxvbmcocmVzKSwgUmVzaWR1byA9IHJlcywNCiAgICAgICAgICAgICAgICAgICAgIFNEMjEgPSByb2xsYXBwbHkocmVzLCAyMSwgc2QsIGZpbGwgPSBOQSwgYWxpZ24gPSAicmlnaHQiKSkNCmcxIDwtIGdncGxvdChkZl9yZXMsIGFlcyh0LCBSZXNpZHVvKSkgKyBnZW9tX2xpbmUoY29sb3IgPSAiIzFhNzNlOCIsIGxpbmV3aWR0aCA9IDAuNCkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJyZWQiKSArDQogIGxhYnModGl0bGUgPSBwYXN0ZSgiUmVzaWR1b3MgZGVsIiwgbW9kZWxvX3NlbCksIHggPSAiT2JzZXJ2YWNpw7NuIiwgeSA9IE5VTEwpICsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMykNCmcyIDwtIGdncGxvdChkZl9yZXMsIGFlcyh0LCBTRDIxKSkgKyBnZW9tX2xpbmUoY29sb3IgPSAiI2VhNDMzNSIsIG5hLnJtID0gVFJVRSkgKw0KICBsYWJzKHRpdGxlID0gIkRlc3ZpYWNpw7NuIGVzdMOhbmRhciByb2RhbnRlIGRlIGxvcyByZXNpZHVvcyAoMjEgZMOtYXMpIiwNCiAgICAgICB4ID0gIk9ic2VydmFjacOzbiIsIHkgPSBOVUxMKSArDQogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTMpDQpwcmludChnMSk7IHByaW50KGcyKQ0KYGBgDQoNCiMjIEF1dG9jb3JyZWxhY2nDs24geSBydWlkbyBibGFuY28NCg0KYGBge3IgYWNmX3Jlc30NCmdnQWNmKHJlcywgbGFnLm1heCA9IDQwKSArIGxhYnModGl0bGUgPSAiQUNGIGRlIGxvcyByZXNpZHVvcyIpICsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMykNCmBgYA0KDQojIyBOb3JtYWxpZGFkDQoNCmBgYHtyIG5vcm1hbGlkYWQsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD00LjV9DQpwYXIobWZyb3cgPSBjKDEsIDIpKQ0KcXFub3JtKHJlcywgbWFpbiA9ICJRLVEgcGxvdCBkZSByZXNpZHVvcyIsIHBjaCA9IDE2LCBjb2wgPSAiIzFhNzNlODU1IikNCnFxbGluZShyZXMsIGNvbCA9ICJyZWQiLCBsd2QgPSAyKQ0KaGlzdChyZXMsIGJyZWFrcyA9IDQwLCBmcmVxID0gRkFMU0UsIGNvbCA9ICIjMWE3M2U4YWEiLCBib3JkZXIgPSAid2hpdGUiLA0KICAgICBtYWluID0gIkhpc3RvZ3JhbWEgZGUgcmVzaWR1b3MiLCB4bGFiID0gIlJlc2lkdW8iKQ0KY3VydmUoZG5vcm0oeCwgbWVhbihyZXMpLCBzZChyZXMpKSwgYWRkID0gVFJVRSwgY29sID0gInJlZCIsIGx3ZCA9IDIpDQpwYXIobWZyb3cgPSBjKDEsIDEpKQ0KYGBgDQoNCiMjIFBydWViYXMgZm9ybWFsZXMNCg0KYGBge3IgcHJ1ZWJhc19yZXN9DQphcmNoX2xtIDwtIGZ1bmN0aW9uKHgsIHEgPSA1KSB7DQogIHgyIDwtIHheMg0KICBaICA8LSBlbWJlZCh4MiwgcSArIDEpDQogIHIyIDwtIHN1bW1hcnkobG0oWlssIDFdIH4gWlssIC0xXSkpJHIuc3F1YXJlZA0KICBlc3QgPC0gKGxlbmd0aCh4MikgLSBxKSAqIHIyDQogIGMoZXN0ID0gZXN0LCBwdiA9IHBjaGlzcShlc3QsIGRmID0gcSwgbG93ZXIudGFpbCA9IEZBTFNFKSkNCn0NCg0KbGIxMCA8LSBCb3gudGVzdChyZXMsIGxhZyA9IDEwLCB0eXBlID0gIkxqdW5nLUJveCIsIGZpdGRmID0gMSkNCmxiMjAgPC0gQm94LnRlc3QocmVzLCBsYWcgPSAyMCwgdHlwZSA9ICJManVuZy1Cb3giLCBmaXRkZiA9IDEpDQpqYiAgIDwtIGphcnF1ZS5iZXJhLnRlc3QocmVzKQ0Kc3cgICA8LSBzaGFwaXJvLnRlc3QocmVzKQ0KbGIyICA8LSBCb3gudGVzdChyZXNeMiwgbGFnID0gMTAsIHR5cGUgPSAiTGp1bmctQm94IikNCmFyY2ggPC0gYXJjaF9sbShyZXMsIDUpDQoNCmRlYyA8LSBmdW5jdGlvbihwdikgaWZlbHNlKHB2ID4gMC4wNSwgIk5vIHJlY2hhemEgSDAiLCAiUmVjaGF6YSBIMCIpDQpkaWFnX3JlcyA8LSBkYXRhLmZyYW1lKA0KICBQcnVlYmEgPSBjKCJManVuZy1Cb3ggKGxhZyAxMCkiLCAiTGp1bmctQm94IChsYWcgMjApIiwgIkphcnF1ZS1CZXJhIiwNCiAgICAgICAgICAgICAiU2hhcGlyby1XaWxrIChjb21wbGVtZW50bykiLCAiTGp1bmctQm94IHNvYnJlIHJlc2lkdW9zwrIgKGxhZyAxMCkiLA0KICAgICAgICAgICAgICJBUkNILUxNICg1IHJlemFnb3MpIiksDQogIEgwID0gYygiU2luIGF1dG9jb3JyZWxhY2nDs24iLCAiU2luIGF1dG9jb3JyZWxhY2nDs24iLCAiTm9ybWFsaWRhZCIsICJOb3JtYWxpZGFkIiwNCiAgICAgICAgICJTaW4gZWZlY3RvcyBBUkNIIiwgIlNpbiBlZmVjdG9zIEFSQ0giKSwNCiAgRXN0YWTDrXN0aWNvID0gYyhsYjEwJHN0YXRpc3RpYywgbGIyMCRzdGF0aXN0aWMsIGpiJHN0YXRpc3RpYywgc3ckc3RhdGlzdGljLA0KICAgICAgICAgICAgICAgICAgbGIyJHN0YXRpc3RpYywgYXJjaFsiZXN0Il0pLA0KICBgcC12YWxvcmAgPSBjKGxiMTAkcC52YWx1ZSwgbGIyMCRwLnZhbHVlLCBqYiRwLnZhbHVlLCBzdyRwLnZhbHVlLA0KICAgICAgICAgICAgICAgIGxiMiRwLnZhbHVlLCBhcmNoWyJwdiJdKSwNCiAgRGVjaXNpw7NuID0gZGVjKGMobGIxMCRwLnZhbHVlLCBsYjIwJHAudmFsdWUsIGpiJHAudmFsdWUsIHN3JHAudmFsdWUsDQogICAgICAgICAgICAgICAgICAgbGIyJHAudmFsdWUsIGFyY2hbInB2Il0pKSwNCiAgY2hlY2submFtZXMgPSBGQUxTRSwgcm93Lm5hbWVzID0gTlVMTA0KKQ0KdGFibGEoZGlhZ19yZXMsIHBhc3RlKCJEaWFnbsOzc3RpY28gZGUgcmVzaWR1b3MgZGVsIiwgbW9kZWxvX3NlbCksIDQpDQpoZXRlcm9fdHh0IDwtIGlmZWxzZShtaW4obGIyJHAudmFsdWUsIGFyY2hbInB2Il0pIDwgMC4wNSwNCiAgIkxhcyBwcnVlYmFzIHNvYnJlIGxvcyByZXNpZHVvcyBhbCBjdWFkcmFkbyAqKmRldGVjdGFuIGVmZWN0b3MgQVJDSCoqOiBsYSB2YXJpYW56YSBjb25kaWNpb25hbCBubyBlcyBjb25zdGFudGUsIGxvIHF1ZSBjb25jdWVyZGEgY29uIGVsIGFncnVwYW1pZW50byBkZSB2b2xhdGlsaWRhZCBvYnNlcnZhZG8uIiwNCiAgIkxhcyBwcnVlYmFzIHNvYnJlIGxvcyByZXNpZHVvcyBhbCBjdWFkcmFkbyAqKm5vIGRldGVjdGFuIGVmZWN0b3MgQVJDSCBtYXJjYWRvcyoqIGVuIGVzdGEgbXVlc3RyYSwgYXVucXVlIGVsIGdyw6FmaWNvIGRlIHZvbGF0aWxpZGFkIHJvZGFudGUgbXVlc3RyYSBjaWVydG8gYWdydXBhbWllbnRvLiIpDQpgYGANCg0KIyMgRGlzY3VzacOzbg0KDQotICoqUnVpZG8gYmxhbmNvIHkgYXV0b2NvcnJlbGFjacOzbi4qKiBMYSBwcnVlYmEgZGUgTGp1bmctQm94IChManVuZyB5IEJveCwgMTk3OCkgKipubyByZWNoYXphIEgwKiosIHkgbGEgQUNGIHJlc2lkdWFsIG5vIG11ZXN0cmEgYXV0b2NvcnJlbGFjacOzbiBzaXN0ZW3DoXRpY2EuIExvcyByZXNpZHVvcyBzb24gKipjb21wYXRpYmxlcyBjb24gcnVpZG8gYmxhbmNvKiosIGRlIG1vZG8gcXVlIGVsIG1vZGVsbyBjYXB0dXLDsyBsYSBkaW7DoW1pY2EgbGluZWFsIGRpc3BvbmlibGUuDQotICoqTm9ybWFsaWRhZC4qKiBKYXJxdWUtQmVyYSAqKnJlY2hhemEgbGEgbm9ybWFsaWRhZCoqIChKYXJxdWUgeSBCZXJhLCAxOTg3KS4gRWwgUS1RIHBsb3QgeSBlbCBoaXN0b2dyYW1hIG11ZXN0cmFuIGNvbGFzIG3DoXMgcGVzYWRhcyBxdWUgbGEgbm9ybWFsLCBoYWJpdHVhbGVzIGVuIHJlbmRpbWllbnRvcyBmaW5hbmNpZXJvcy4gU2hhcGlyby1XaWxrIChTaGFwaXJvIHkgV2lsaywgMTk2NSkgc2UgcmVwb3J0YSBjb21vIGNvbXBsZW1lbnRvLiBDb24gbXVlc3RyYXMgZ3JhbmRlcyByZWNoYXphIGFudGUgZGVzdmlhY2lvbmVzIHBlcXVlw7Fhcy4gKipJbXBsaWNhY2lvbmVzOioqIGxhcyBlc3RpbWFjaW9uZXMgcHVudHVhbGVzIHNpZ3VlbiBzaWVuZG8gY29uc2lzdGVudGVzLCBwZXJvIGxvcyBpbnRlcnZhbG9zIGdhdXNzaWFub3MgcHVlZGVuIHN1YmVzdGltYXIgZWwgcmllc2dvIGV4dHJlbW8uIFBvciBlbGxvIGxhIHNpbXVsYWNpw7NuIChzZWNjacOzbiA5KSB1c2EgKipib290c3RyYXAgZGUgcmVzaWR1b3MqKiAoRWZyb24sIDE5NzkpLg0KLSAqKkhldGVyb2NlZGFzdGljaWRhZC4qKiBgciBoZXRlcm9fdHh0YCBFbiBwcmVzZW5jaWEgZGUgaGV0ZXJvY2VkYXN0aWNpZGFkLCBsb3MgaW50ZXJ2YWxvcyBkZSBwcmVkaWNjacOzbiBkZSB1biBBUklNQSBjb24gdmFyaWFuemEgY29uc3RhbnRlIHNlcsOtYW4gZGVtYXNpYWRvIGFuZ29zdG9zIGVuIHBlcmlvZG9zIHR1cmJ1bGVudG9zIHkgZGVtYXNpYWRvIGFuY2hvcyBlbiBwZXJpb2RvcyBjYWxtb3MsIHkgbGEgc2ltdWxhY2nDs24gY29uIHJlbXVlc3RyZW8gaS5pLmQuIGlnbm9yYSBsYSBkZXBlbmRlbmNpYSBkZSBsYSB2b2xhdGlsaWRhZC4gTGEgZXh0ZW5zacOzbiBuYXR1cmFsIGVzIHVuICoqQVJJTUEtR0FSQ0gqKiAoc2VjY2nDs24gNDsgRW5nbGUsIDE5ODI7IEJvbGxlcnNsZXYsIDE5ODYpLCByZWFwbGljYW5kbyBkZXNwdcOpcyBpZGVudGlmaWNhY2nDs24sIGVzdGltYWNpw7NuIHkgZGlhZ27Ds3N0aWNvLiBObyBjYW1iaWFyw61hIGRlIGZvcm1hIG1hdGVyaWFsIGVsIHByb27Ds3N0aWNvIHB1bnR1YWwsIHBlcm8gc8OtIGxhcyBtZWRpZGFzIGRlIHJpZXNnby4NCg0KIyBUcmFpbi10ZXN0IHkgY2FwYWNpZGFkIHByZWRpY3RpdmENCg0KIyMgTcOpdHJpY2FzIGRlIGVycm9yDQoNClNlYSAkZV90PXlfdC1caGF0IHlfdCQgZWwgZXJyb3IgZW4gZWwgY29uanVudG8gZGUgdmFsaWRhY2nDs24gZGUgJGhfdiQgb2JzZXJ2YWNpb25lczoNCg0KJCQNClJNU0U9XHNxcnR7XGZyYWN7MX17aF92fVxzdW0gZV90XjJ9LFxxdWFkDQpNQUU9XGZyYWN7MX17aF92fVxzdW0gfGVfdHwsXHF1YWQNCk1BUEU9XGZyYWN7MTAwfXtoX3Z9XHN1bVxsZWZ0fFxmcmFje2VfdH17eV90fVxyaWdodHwsXHF1YWQNCk1BU0U9XGZyYWN7TUFFfXtcZnJhY3sxfXtULTF9XHN1bV97dD0yfV57VH18eV90LXlfe3QtMX18fSwNCiQkDQoNCmRvbmRlIGVsIGRlbm9taW5hZG9yIGRlbCBNQVNFIGVzIGVsIGVycm9yIG1lZGlvIGFic29sdXRvIGRlbCBwcm9uw7NzdGljbyBpbmdlbnVvICoqZGVudHJvIGRlIGxhIG11ZXN0cmEgZGUgZW50cmVuYW1pZW50byoqIChIeW5kbWFuIHkgS29laGxlciwgMjAwNikuIFVuIE1BU0UgPCAxIGluZGljYSBxdWUgZWwgbW9kZWxvIHN1cGVyYSBhbCBwcm9uw7NzdGljbyBpbmdlbnVvICppbi1zYW1wbGUqLiBFbCBiZW5jaG1hcmsgZXMgbGEgKipjYW1pbmF0YSBhbGVhdG9yaWEqKiAoZWwgw7psdGltbyBwcmVjaW8gb2JzZXJ2YWRvIGVuIGVsIGNvcnRlKS4gQ2FkYSBtb2RlbG8gc2UgZXN0aW1hIHNvbG8gY29uIGVsIGVudHJlbmFtaWVudG8geSBzZSBwcm9ub3N0aWNhIHRvZG8gZWwgYmxvcXVlIGRlIHZhbGlkYWNpw7NuIGVuIHVuICoqaG9yaXpvbnRlIGNvbcO6bioqLg0KDQpgYGB7ciBldmFsdWFjaW9ufQ0KdGFibGEoY29tcF9vcmQsICJDYXBhY2lkYWQgcHJlZGljdGl2YSBlbiB2YWxpZGFjacOzbiAoZXNjYWxhIEJveC1Db3gsIGhvcml6b250ZSBtdWx0aXBhc28gY29tcGxldG8pIiwgNikNCmBgYA0KDQojIyMgUmVzdWx0YWRvcyBlbXDDrXJpY29zIGRlIHJlZmVyZW5jaWENCg0KTGEgdGFibGEgYW50ZXJpb3IgcmXDum5lIGxvcyBzZWlzIGluZGljYWRvcmVzIChBSUMsIEJJQywgUk1TRSwgTUFFLCBNQVBFIHkgTUFTRSkgZGUgKip0b2RvcyoqIGxvcyBtb2RlbG9zLiBBIGNvbnRpbnVhY2nDs24gc2UgY29udHJhc3RhIGVsIFJNU0UgY2FsY3VsYWRvIGVuIGVzdGEgZWplY3VjacOzbiBjb24gZWwgUk1TRSByZXBvcnRhZG8gZW4gbG9zIHJlc3VsdGFkb3MgZW1ww61yaWNvcyBkZWwgdHJhYmFqbzoNCg0KYGBge3IgcmVmZXJlbmNpYX0NCnJlZiA8LSBkYXRhLmZyYW1lKA0KICBNb2RlbG8gPSBuYW1lcyhybXNlX3JlcCksDQogIGBSTVNFIHJlcG9ydGFkb2AgPSBhcy5udW1lcmljKHJtc2VfcmVwKSwNCiAgYFJNU0UgZXN0YSBlamVjdWNpw7NuYCA9IGNvbXAkUk1TRVttYXRjaChuYW1lcyhybXNlX3JlcCksIGNvbXAkTW9kZWxvKV0sDQogIGNoZWNrLm5hbWVzID0gRkFMU0UsIHJvdy5uYW1lcyA9IE5VTEwNCikNCnJlZiREaWZlcmVuY2lhIDwtIHJlZiRgUk1TRSBlc3RhIGVqZWN1Y2nDs25gIC0gcmVmJGBSTVNFIHJlcG9ydGFkb2ANCnRhYmxhKHJlZiwgIlJNU0UgcmVwb3J0YWRvIGZyZW50ZSBhIFJNU0UgZGUgZXN0YSBlamVjdWNpw7NuIiwgOCkNCmBgYA0KDQoqTm90YToqIGxvcyB2YWxvcmVzIGNhbGN1bGFkb3Mgc2Ugb2J0aWVuZW4gZW4gdml2byBjb24gbG9zIGRhdG9zIGRlc2NhcmdhZG9zIGFsIGNvbXBpbGFyLiBQdWVkZW4gZGlmZXJpciBtYXJnaW5hbG1lbnRlIGRlIGxvcyByZXBvcnRhZG9zIHNpIGNhbWJpYSBsYSB2ZW50YW5hIGRlIGNpbmNvIGHDsW9zIG8gWWFob28gRmluYW5jZSByZXZpc2EgbG9zIHByZWNpb3MgYWp1c3RhZG9zLiBMbyByZWxldmFudGUgZXMgZWwgKipvcmRlbiByZWxhdGl2byoqIGRlIGxvcyBtb2RlbG9zLg0KDQpgYGB7ciBncmFmaWNvX3Jtc2V9DQpnZ3Bsb3QoY29tcF9vcmQsIGFlcyh4ID0gcmVvcmRlcihNb2RlbG8sIC1STVNFKSwgeSA9IFJNU0UsIGZpbGwgPSBNb2RlbG8gPT0gIlJhbmRvbSBXYWxrIikpICsNCiAgZ2VvbV9jb2woc2hvdy5sZWdlbmQgPSBGQUxTRSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjMWE3M2U4IiwgIiNlYTQzMzUiKSkgKw0KICBjb29yZF9mbGlwKHlsaW0gPSBjKG1pbihjb21wJFJNU0UpICogMC45OCwgbWF4KGNvbXAkUk1TRSkgKiAxLjAxKSkgKw0KICBsYWJzKHRpdGxlID0gIlJNU0UgZW4gdmFsaWRhY2nDs24gcG9yIG1vZGVsbyIsDQogICAgICAgc3VidGl0bGUgPSAiRW4gcm9qbzogYmVuY2htYXJrIFJhbmRvbSBXYWxrIiwgeCA9IE5VTEwsIHkgPSAiUk1TRSIpICsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMykNCmBgYA0KDQojIyBQcm9uw7NzdGljb3Mgc29icmUgZWwgdGVzdCBmcmVudGUgYSBsbyBvYnNlcnZhZG8NCg0KYGBge3IgZ3JhZmljb19wcmVkfQ0KZGZfcHJlZCA8LSBkYXRhLmZyYW1lKA0KICBGZWNoYSA9IGZlY2hhc1sobl90cmFpbiArIDEpOm5dLA0KICBPYnNlcnZhZG8gPSBwX3Rlc3QsDQogIGBSYW5kb20gV2Fsa2AgID0gSW52Qm94Q294KHByZWRfcncsIGxhbWJkYSksDQogIGBBUklNQSgxLDEsMClgID0gSW52Qm94Q294KHByZWRfYXJpbWFbWyJBUklNQSgxLDEsMCkiXV0sIGxhbWJkYSksDQogIGBBUklNQSgyLDEsMilgID0gSW52Qm94Q294KHByZWRfYXJpbWFbWyJBUklNQSgyLDEsMikiXV0sIGxhbWJkYSksDQogIGNoZWNrLm5hbWVzID0gRkFMU0UNCikgJT4lIHBpdm90X2xvbmdlcigtRmVjaGEsIG5hbWVzX3RvID0gIlNlcmllIiwgdmFsdWVzX3RvID0gIlByZWNpbyIpDQoNCmdncGxvdChkZl9wcmVkLCBhZXMoRmVjaGEsIFByZWNpbywgY29sb3IgPSBTZXJpZSwgbGluZXR5cGUgPSBTZXJpZSkpICsNCiAgZ2VvbV9saW5lKGxpbmV3aWR0aCA9IDAuOCkgKw0KICBsYWJzKHRpdGxlID0gIlByb27Ds3N0aWNvIGVuIHZhbGlkYWNpw7NuIHZzLiBwcmVjaW8gb2JzZXJ2YWRvIChVU0QpIiwgeCA9IE5VTEwsIHkgPSAiVVNEIikgKw0KICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDEzKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQ0KYGBgDQoNCiMjIE3DqXRyaWNhcyBlbiBkw7NsYXJlcw0KDQpgYGB7ciBtZXRyaWNhc191c2R9DQptZXRfdXNkIDwtIGZ1bmN0aW9uKHByZWRfeSkgbWV0cmljYXMocF90ZXN0LCBJbnZCb3hDb3gocHJlZF95LCBsYW1iZGEpLCBwX3RyYWluKQ0KdXNkIDwtIGRhdGEuZnJhbWUoDQogIE1vZGVsbyA9IGMoIlJhbmRvbSBXYWxrIiwgbmFtZXMoYWp1c3RlcykpLA0KICBhcy5kYXRhLmZyYW1lKHJiaW5kKG1ldF91c2QocHJlZF9ydyksIHQoc2FwcGx5KHByZWRfYXJpbWEsIG1ldF91c2QpKSkpLA0KICByb3cubmFtZXMgPSBOVUxMDQopDQp0YWJsYSh1c2Rbb3JkZXIodXNkJFJNU0UpLCBdLCAiTcOpdHJpY2FzIGRlIHZhbGlkYWNpw7NuIGVuIGVzY2FsYSBkZSBwcmVjaW9zIChSTVNFIHkgTUFFIGVuIFVTRCkiLCA0KQ0Kcm1zZV9yZWwgPC0gdXNkJFJNU0VbdXNkJE1vZGVsbyA9PSBtb2RlbG9fc2VsXSAvIG1lYW4ocF90ZXN0KSAqIDEwMA0KYGBgDQoNCiMjIEV2YWx1YWNpw7NuIGEgdW4gcGFzbyAocGFyw6FtZXRyb3MgZmlqb3MgZGVsIGVudHJlbmFtaWVudG8pDQoNCkNvbW8gY29tcGxlbWVudG8sIHNlIGV2YWzDumEgZWwgcHJvbsOzc3RpY28gKiphIHVuIHBhc28qKiBlbiBlbCB0ZXN0LCBhY3R1YWxpemFuZG8gc29sbyBsYSBpbmZvcm1hY2nDs24gKG5vIGxvcyBwYXLDoW1ldHJvcykgeSBjb21wYXJhbmRvIGNvbiBlbCDDumx0aW1vIHByZWNpbyBvYnNlcnZhZG86DQoNCmBgYHtyIHVuX3Bhc299DQp1bm8gPC0gZnVuY3Rpb24oZikgew0KICByZiA8LSBBcmltYSh5X2FsbCwgbW9kZWwgPSBmKQ0KICBhcy5udW1lcmljKGZpdHRlZChyZikpWyhuX3RyYWluICsgMSk6bl0NCn0NCnByZWQxIDwtIGxhcHBseShhanVzdGVzLCB1bm8pDQpwcmVkMV9ydyA8LSB5X2FsbFtuX3RyYWluOihuIC0gMSldDQptZXQxIDwtIGFzLmRhdGEuZnJhbWUocmJpbmQoDQogICJSYW5kb20gV2FsayIgPSBtZXRyaWNhcyh5X3Rlc3QsIHByZWQxX3J3LCB5X3RyYWluKSwNCiAgdChzYXBwbHkobmFtZXMoYWp1c3RlcyksIGZ1bmN0aW9uKG5tKSBtZXRyaWNhcyh5X3Rlc3QsIHByZWQxW1tubV1dLCB5X3RyYWluKSkpKSkNCm1ldDEkTW9kZWxvIDwtIHJvd25hbWVzKG1ldDEpOyByb3duYW1lcyhtZXQxKSA8LSBOVUxMDQp0YWJsYShtZXQxW29yZGVyKG1ldDEkUk1TRSksIGMoIk1vZGVsbyIsICJSTVNFIiwgIk1BRSIsICJNQVBFIiwgIk1BU0UiKV0sDQogICAgICAiRXZhbHVhY2nDs24gYSB1biBwYXNvIGVuIHZhbGlkYWNpw7NuIChlc2NhbGEgQm94LUNveCkiLCA2KQ0KYGBgDQoNCiMjIERpc2N1c2nDs24gZGUgcmVzdWx0YWRvcw0KDQotICoqTWVqb3IgQVJJTUE6KiogKipBUklNQSgxLDEsMCkqKiwgY29uIGVsIG1lbm9yIFJNU0UgZW50cmUgbG9zIHNlaXMgbW9kZWxvcyAoMC4wODY2OTU0MCksIHNlZ3VpZG8gbXV5IGRlIGNlcmNhIHBvciBBUklNQSgwLDEsMSkgKDAuMDg2Njk1NTQpLiBMb3MgbW9kZWxvcyBkZSBtYXlvciBvcmRlbiAoQVJJTUEoMiwxLDEpLCAoMSwxLDIpLCAoMSwxLDEpIHkgKDIsMSwyKSkgKiplbXBlb3JhbioqIGVsIHByb27Ds3N0aWNvLCBwb3IgZWwgY29zdG8gZGUgZXN0aW1hciBwYXLDoW1ldHJvcyBxdWUgbm8gYXBvcnRhbiBpbmZvcm1hY2nDs24uDQotICoqQmVuY2htYXJrOioqIGVsICoqUmFuZG9tIFdhbGsgcHJlc2VudGEgdW4gUk1TRSBsaWdlcmFtZW50ZSBtZW5vcioqICgwLjA4NjY5MDk4KS4gTGEgZGlmZXJlbmNpYSBjb24gZWwgQVJJTUEoMSwxLDApIGVzIGRlIHVuYXMgY2luY28gbWlsbG9uw6lzaW1hcywgKiplY29uw7NtaWNhbWVudGUgaXJyZWxldmFudGUqKiwgcGVybyBuaW5nw7puIEFSSU1BIHN1cGVyYSBhbCBtb2RlbG8gaW5nZW51by4NCi0gKirCv0VsIG1lam9yIGVuIHRyYWluIGVzIGVsIG1lam9yIGVuIHRlc3Q/KiogU2UgY29udHJhc3RhIGVsIHJhbmtpbmcgcG9yIEJJQyAoYWp1c3RlIGVuIGVudHJlbmFtaWVudG8pIGNvbiBlbCByYW5raW5nIHBvciBSTVNFICh2YWxpZGFjacOzbik6DQoNCmBgYHtyIHJhbmdvc30NCnJrIDwtIGNvbXBbY29tcCRNb2RlbG8gIT0gIlJhbmRvbSBXYWxrIiwgYygiTW9kZWxvIiwgIkJJQyIsICJSTVNFIildDQpyayRgUmFuZ28gQklDICh0cmFpbilgIDwtIHJhbmsocmskQklDKQ0KcmskYFJhbmdvIFJNU0UgKHRlc3QpYCA8LSByYW5rKHJrJFJNU0UpDQp0YWJsYShyaywgIlJhbmtpbmcgZW4gZW50cmVuYW1pZW50byAoQklDKSB2cy4gdmFsaWRhY2nDs24gKFJNU0UpIiwgNikNCmNvcl9yayA8LSBjb3IocmskYFJhbmdvIEJJQyAodHJhaW4pYCwgcmskYFJhbmdvIFJNU0UgKHRlc3QpYCwgbWV0aG9kID0gInNwZWFybWFuIikNCnJrX3R4dCA8LSBpZmVsc2UoY29yX3JrID4gMC43LA0KICAiRWwgb3JkZW5hbWllbnRvIGRlbCBhanVzdGUgZW4gZW50cmVuYW1pZW50byBzZSBtYW50aWVuZSBlbiBncmFuIG1lZGlkYSBmdWVyYSBkZSBtdWVzdHJhOiBsYSBwYXJzaW1vbmlhIGVzIHByZW1pYWRhIGVuIGFtYm9zIGJsb3F1ZXMuIiwNCiAgIkVsIGFqdXN0ZSBlbiBlbnRyZW5hbWllbnRvIG5vIHNlIHRyYXNsYWRhIGRlIGZvcm1hIGNsYXJhIGEgbGEgY2FwYWNpZGFkIHByZWRpY3RpdmEgZnVlcmEgZGUgbXVlc3RyYSwgc2XDsWFsIGRlIHF1ZSBsYXMgZGlmZXJlbmNpYXMgZW50cmUgbW9kZWxvcyBzb24gcGVxdWXDsWFzLiIpDQpgYGANCg0KTGEgY29ycmVsYWNpw7NuIGRlIHJhbmdvcyBkZSBTcGVhcm1hbiBlcyAqKmByIHJvdW5kKGNvcl9yaywgMilgKiouIGByIHJrX3R4dGAgUXVlIGVsIG1lam9yIEFSSU1BIHNvbG8gaWd1YWxlIGFsIGJlbmNobWFyayBjb25maXJtYSBxdWUgZWwgYWp1c3RlIGFkaWNpb25hbCBlbiBlbnRyZW5hbWllbnRvIG5vIGdlbmVyYSB2YWxvciBwcmVkaWN0aXZvLg0KDQotICoqTWFnbml0dWQgZWNvbsOzbWljYSBkZWwgZXJyb3IuKiogRWwgUk1TRSBkZWwgQVJJTUEoMSwxLDApIGVuIGTDs2xhcmVzIGVxdWl2YWxlIGFwcm94aW1hZGFtZW50ZSBhbCAqKmByIHJvdW5kKHJtc2VfcmVsLCAxKWAgJSoqIGRlbCBwcmVjaW8gbWVkaW8gZGVsIHBlcmlvZG8gZGUgdmFsaWRhY2nDs24sIGNvbiB1biBob3Jpem9udGUgbXVsdGlwYXNvIGRlIGNpZW50b3MgZGUgZMOtYXMuIEVzIHVuIGVycm9yIHJlbGV2YW50ZSBmcmVudGUgYSBjdWFscXVpZXIgdW1icmFsIHJhem9uYWJsZSBkZSBhcHJlY2lhY2nDs24gKDIgJSBlbiAzMCBkw61hcykuIEF1bnF1ZSBsYSBtw6l0cmljYSBzZWEgcGVxdWXDsWEgZW4gbGEgZXNjYWxhIHRyYW5zZm9ybWFkYSwgZWwgcHJvbsOzc3RpY28gcHVudHVhbCBubyBlcyBzdWZpY2llbnRlbWVudGUgcHJlY2lzbyBwYXJhIHN1c3RlbnRhciB1bmEgYXB1ZXN0YSBkaXJlY2Npb25hbC4NCi0gKipJbnRlcnByZXRhY2nDs24uKiogTG9zIHJlc3VsdGFkb3Mgc29uICoqY29uc2lzdGVudGVzIGNvbiBsYSBoaXDDs3Rlc2lzIGRlIGVmaWNpZW5jaWEgZMOpYmlsKiogKEZhbWEsIDE5NzApOiBsYSBtZWpvciBwcmVkaWNjacOzbiBkZWwgcHJlY2lvIGRlIG1hw7FhbmEgZXMsIGVuIGxhIHByw6FjdGljYSwgZWwgcHJlY2lvIGRlIGhveS4gRWwgY29tcG9ydGFtaWVudG8gZGUgR09PR0wgZXMgKipjb21wYXRpYmxlIGNvbiB1bmEgY2FtaW5hdGEgYWxlYXRvcmlhKiouDQoNCiMgUHJvbsOzc3RpY28gZSBpbnZlcnNpw7NuDQoNCiMjIFJlZ2xhIGRlIGRlY2lzacOzbiB5IGJhY2t0ZXN0IGVuIGxhIGZlY2hhIGRlIGNvcnRlIFTigoANCg0KU2lndWllbmRvIGVsIGRpc2XDsW8sIGVsIGVxdWlwbyBzZSB1YmljYSBjb25jZXB0dWFsbWVudGUgZW4gbGEgZmVjaGEgZGUgY29ydGUgKipU4oKAKiogKMO6bHRpbW8gZMOtYSBkZSBlbnRyZW5hbWllbnRvOiAqKmByIGZvcm1hdChmZWNoYXNbbl90cmFpbl0pYCoqKSB5IGFjdMO6YSBjb21vIHNpICoqZGVzY29ub2NpZXJhIGxvcyBwcmVjaW9zIHBvc3RlcmlvcmVzKiouIExhIHJlZ2xhIChzZWNjacOzbiAyKSBlczogcG9zaWNpw7NuIGxhcmdhIGNvbiB0b2RvIGVsIGNhcGl0YWwgc2kgZWwgcHJvbsOzc3RpY28gYSAkaD0zMCQgZMOtYXMgc3VwZXJhIGVsIHVtYnJhbCBkZWwgMiAlLCBvIGxpcXVpZGV6IGVuIGNhc28gY29udHJhcmlvLiBDb24gZWwgbW9kZWxvIGVzdGltYWRvIHNvbG8gY29uIGVudHJlbmFtaWVudG86DQoNCmBgYHtyIGJhY2t0ZXN0fQ0KUF9UMCAgICA8LSB0YWlsKHBfdHJhaW4sIDEpDQpmYzAgICAgIDwtIGZvcmVjYXN0KGZpdF9zZWwsIGggPSBoLCBsZXZlbCA9IDk1KQ0KUF9oYXQgICA8LSBJbnZCb3hDb3goYXMubnVtZXJpYyhmYzAkbWVhbltoXSksIGxhbWJkYSkNCnJldF9lc3AwIDwtIFBfaGF0IC8gUF9UMCAtIDENCmxhcmdvMCAgPC0gcmV0X2VzcDAgPiB1bWJyYWwNCg0KUF9vYnMgICA8LSBwX3Rlc3RbaF0NCnJldF9vYnMwIDwtIFBfb2JzIC8gUF9UMCAtIDENCg0KIyBWYWxvciBmaW5hbCBkZWwgcG9ydGFmb2xpbyBjb24gcGVzbyB3IGVuIGxhIGFjY2nDs24gKGNvbiBjb3N0b3MgeSByZiBlbiBlZmVjdGl2bykNCnZhbG9yX2ZpbmFsIDwtIGZ1bmN0aW9uKHcsIFAwLCBQMSkgew0KICBhY2Npb25lcyA8LSBmbG9vcihjYXBpdGFsICogdyAvIChQMCAqICgxICsgY29zdG8pKSkNCiAgZWZlY3Rpdm8gPC0gY2FwaXRhbCAtIGFjY2lvbmVzICogUDAgKiAoMSArIGNvc3RvKQ0KICBhY2Npb25lcyAqIFAxICogKDEgLSBjb3N0bykgKyBlZmVjdGl2byAqICgxICsgcmZfaCkNCn0NCg0KdzAgPC0gYXMubnVtZXJpYyhsYXJnbzApDQpyZXNfYnQgPC0gZGF0YS5mcmFtZSgNCiAgRXN0cmF0ZWdpYSA9IGMoIkVzdHJhdGVnaWEgYmFzYWRhIGVuIGVsIG1vZGVsbyIsICJDb21wcmFyIHkgbWFudGVuZXIgKDEwMCAlIEdPT0dMKSIsDQogICAgICAgICAgICAgICAgICJTb2xvIGxpcXVpZGV6ICh0YXNhIGxpYnJlIGRlIHJpZXNnbykiKSwNCiAgUG9zaWNpw7NuID0gYyhpZmVsc2UobGFyZ28wLCAiTGFyZ2EiLCAiTGlxdWlkZXoiKSwgIkxhcmdhIiwgIkxpcXVpZGV6IiksDQogIGBWYWxvciBmaW5hbCAoVVNEKWAgPSBjKHZhbG9yX2ZpbmFsKHcwLCBQX1QwLCBQX29icyksIHZhbG9yX2ZpbmFsKDEsIFBfVDAsIFBfb2JzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsb3JfZmluYWwoMCwgUF9UMCwgUF9vYnMpKSwNCiAgY2hlY2submFtZXMgPSBGQUxTRQ0KKQ0KcmVzX2J0JGBSZXN1bHRhZG8gKFVTRClgIDwtIHJlc19idCRgVmFsb3IgZmluYWwgKFVTRClgIC0gY2FwaXRhbA0KcmVzX2J0JGBSZW50YWJpbGlkYWQgKCUpYCA8LSByZXNfYnQkYFJlc3VsdGFkbyAoVVNEKWAgLyBjYXBpdGFsICogMTAwDQoNCmluZm9fYnQgPC0gZGF0YS5mcmFtZSgNCiAgQ29uY2VwdG8gPSBjKCJGZWNoYSBkZSBjb3J0ZSBU4oKAIiwgIlByZWNpbyBlbiBU4oKAIChVU0QpIiwNCiAgICAgICAgICAgICAgIHBhc3RlMCgiUHJvbsOzc3RpY28gZGVsIHByZWNpbyBhICIsIGgsICIgZMOtYXMgKFVTRCkiKSwNCiAgICAgICAgICAgICAgICJSZW5kaW1pZW50byBlc3BlcmFkbyBzZWfDum4gZWwgbW9kZWxvICglKSIsICJVbWJyYWwgZGUgZGVjaXNpw7NuICglKSIsDQogICAgICAgICAgICAgICAiRGVjaXNpw7NuIiwgcGFzdGUwKCJQcmVjaW8gb2JzZXJ2YWRvIGEgIiwgaCwgIiBkw61hcyAoVVNEKSIpLA0KICAgICAgICAgICAgICAgIlJlbmRpbWllbnRvIGVmZWN0aXZhbWVudGUgb2JzZXJ2YWRvICglKSIpLA0KICBWYWxvciA9IGMoZm9ybWF0KGZlY2hhc1tuX3RyYWluXSksIHJvdW5kKFBfVDAsIDIpLCByb3VuZChQX2hhdCwgMiksDQogICAgICAgICAgICByb3VuZChyZXRfZXNwMCAqIDEwMCwgMyksIHVtYnJhbCAqIDEwMCwNCiAgICAgICAgICAgIGlmZWxzZShsYXJnbzAsICJQb3NpY2nDs24gbGFyZ2EiLCAiTWFudGVuZXIgbGlxdWlkZXoiKSwNCiAgICAgICAgICAgIHJvdW5kKFBfb2JzLCAyKSwgcm91bmQocmV0X29iczAgKiAxMDAsIDMpKQ0KKQ0KdGFibGEoaW5mb19idCwgIkRlY2lzacOzbiBlbiBU4oKAIHkgcmVzdWx0YWRvIG9ic2VydmFkbyIsIDMpDQp0YWJsYShyZXNfYnQsIHBhc3RlMCgiRXZhbHVhY2nDs24gZmluYW5jaWVyYSBhICIsIGgsICIgZMOtYXMgKGNhcGl0YWwgVVNEICIsIGNhcGl0YWxfdHh0LCAiKSIpLCAyKQ0KDQpidF90eHQgPC0gaWZlbHNlKGxhcmdvMCwNCiAgImVsIG1vZGVsbyBpbmRpY8OzIHVuYSBwb3NpY2nDs24gbGFyZ2EsIHkgZWwgcmVzdWx0YWRvIGZyZW50ZSBhIGNvbXByYXIgeSBtYW50ZW5lciBjb2luY2lkZSBwb3IgY29uc3RydWNjacOzbi4gTGEgZXN0cmF0ZWdpYSBzb2xvIHNlIGRpZmVyZW5jaWEgZGUgbG9zIGJlbmNobWFya3MgcG9yIGVsIHRpbWluZyBkZSBlbnRyYWRhLCBxdWUgYXF1w60gZnVlIGlubWVkaWF0by4iLA0KICAiZWwgbW9kZWxvLCBjYXNpIGVxdWl2YWxlbnRlIGEgdW5hIGNhbWluYXRhIGFsZWF0b3JpYSwgcHJveWVjdGEgdW4gcmVuZGltaWVudG8gY2VyY2FubyBhIGNlcm8gKG1lbm9yIHF1ZSBlbCB1bWJyYWwpLCBwb3IgbG8gcXVlIGxhIGVzdHJhdGVnaWEgKiptYW50aWVuZSBsaXF1aWRleioqIHkgc3UgcmVzdWx0YWRvIGVzIGVsIGRlIGxhIHRhc2EgbGlicmUgZGUgcmllc2dvLiBGcmVudGUgYSBjb21wcmFyIHkgbWFudGVuZXIsIGVzdG8gZXMgdmVudGFqb3NvIHNpIGVsIHByZWNpbyBjYXnDsyBlbiBlbCBwZXJpb2RvIHkgZGVzdmVudGFqb3NvIHNpIHN1YmnDsy4iKQ0KYGBgDQoNCmBgYHtyIGludGVydmFsb3NfdGVzdH0NCmhzIDwtIGMoMSwgNSwgMTAsIDIwLCAzMCkNCmZjMGIgPC0gZm9yZWNhc3QoZml0X3NlbCwgaCA9IG1heChocyksIGxldmVsID0gOTUpDQp0YWJfaW50IDwtIGRhdGEuZnJhbWUoDQogIGBEw61hIGhgID0gaHMsDQogIGBQcm9uw7NzdGljbyAoVVNEKWAgPSBJbnZCb3hDb3goYXMubnVtZXJpYyhmYzBiJG1lYW4pW2hzXSwgbGFtYmRhKSwNCiAgYElDIDk1JSBpbmZgID0gSW52Qm94Q294KGFzLm51bWVyaWMoZmMwYiRsb3dlcilbaHNdLCBsYW1iZGEpLA0KICBgSUMgOTUlIHN1cGAgPSBJbnZCb3hDb3goYXMubnVtZXJpYyhmYzBiJHVwcGVyKVtoc10sIGxhbWJkYSksDQogIGBPYnNlcnZhZG8gKFVTRClgID0gcF90ZXN0W2hzXSwgY2hlY2submFtZXMgPSBGQUxTRQ0KKQ0KdGFiX2ludCRgwr9EZW50cm8gZGVsIElDIDk1JT9gIDwtIGlmZWxzZSh0YWJfaW50JGBPYnNlcnZhZG8gKFVTRClgID49IHRhYl9pbnQkYElDIDk1JSBpbmZgICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiX2ludCRgT2JzZXJ2YWRvIChVU0QpYCA8PSB0YWJfaW50JGBJQyA5NSUgc3VwYCwgIlPDrSIsICJObyIpDQp0YWJsYSh0YWJfaW50LCAiUHJvbsOzc3RpY28gcHVudHVhbCBlIGludGVydmFsb3MgZGVzZGUgVOKCgCB2cy4gdmFsb3JlcyBvYnNlcnZhZG9zIiwgMikNCmBgYA0KDQpMYSB2ZW50YWphIGRlbCBtb2RlbG8gc29icmUgbG9zIGJlbmNobWFya3Mgc2UganV6Z2EgY29uIGxhcyB0YWJsYXMgYW50ZXJpb3JlczogYHIgYnRfdHh0YCBVbiDDum5pY28gZXBpc29kaW8gbm8gZXMgZXZpZGVuY2lhIGVzdGFkw61zdGljYSBkZSBzdXBlcmlvcmlkYWQsIGNvbW8gc2UgZGlzY3V0ZSBlbiBsYXMgbGltaXRhY2lvbmVzLg0KDQojIyBQcm9uw7NzdGljbyBoYWNpYSBhZGVsYW50ZSAoZmVjaGEgZGUgY29ydGUgYWN0dWFsKQ0KDQpQYXJhIGxhIGRlY2lzacOzbiB2aWdlbnRlLCBlbCBtb2RlbG8gc2UgKipyZWVzdGltYSBjb24gdG9kYSBsYSBtdWVzdHJhKiogKGVudHJlbmFtaWVudG8gKyB2YWxpZGFjacOzbikgeSBzZSBwcm95ZWN0YW4gMzAgZMOtYXMgaMOhYmlsZXMgZGVzZGUgZWwgw7psdGltbyBkYXRvLg0KDQpgYGB7ciBwcm9ub3N0aWNvfQ0KZml0X2Z1bGwgPC0gQXJpbWEoeV9hbGwsIG9yZGVyID0gYygxLCAxLCAwKSwgaW5jbHVkZS5kcmlmdCA9IEZBTFNFLCBtZXRob2QgPSAiTUwiKQ0KZmMgPC0gZm9yZWNhc3QoZml0X2Z1bGwsIGggPSBoLCBsZXZlbCA9IGMoODAsIDk1KSkNCg0KY2FuZCA8LSBzZXEobWF4KGZlY2hhcykgKyAxLCBieSA9ICJkYXkiLCBsZW5ndGgub3V0ID0gNjApDQpmZWNoYXNfZmMgPC0gY2FuZFshKGZvcm1hdChjYW5kLCAiJXUiKSAlaW4lIGMoIjYiLCAiNyIpKV1bMTpoXSAgICMgbm8gY29uc2lkZXJhIGZlcmlhZG9zDQoNCnRhYl9mYyA8LSBkYXRhLmZyYW1lKA0KICBGZWNoYSA9IGZlY2hhc19mYywNCiAgUHJvbsOzc3RpY28gPSBJbnZCb3hDb3goYXMubnVtZXJpYyhmYyRtZWFuKSwgbGFtYmRhKSwNCiAgYElDIDgwJSBpbmZgID0gSW52Qm94Q294KGFzLm51bWVyaWMoZmMkbG93ZXJbLCAxXSksIGxhbWJkYSksDQogIGBJQyA4MCUgc3VwYCA9IEludkJveENveChhcy5udW1lcmljKGZjJHVwcGVyWywgMV0pLCBsYW1iZGEpLA0KICBgSUMgOTUlIGluZmAgPSBJbnZCb3hDb3goYXMubnVtZXJpYyhmYyRsb3dlclssIDJdKSwgbGFtYmRhKSwNCiAgYElDIDk1JSBzdXBgID0gSW52Qm94Q294KGFzLm51bWVyaWMoZmMkdXBwZXJbLCAyXSksIGxhbWJkYSksDQogIGNoZWNrLm5hbWVzID0gRkFMU0UNCikNCnRhYmxhKHRhYl9mYywgIlByb27Ds3N0aWNvIGEgMzAgZMOtYXMgaMOhYmlsZXMgZGUgR09PR0wgKFVTRCkiLCAyKQ0KDQpoaXN0X2RmIDwtIGRhdGEuZnJhbWUoRmVjaGEgPSB0YWlsKGZlY2hhcywgMTIwKSwgUHJlY2lvID0gdGFpbChwLCAxMjApKQ0KZ2dwbG90KCkgKw0KICBnZW9tX2xpbmUoZGF0YSA9IGhpc3RfZGYsIGFlcyhGZWNoYSwgUHJlY2lvKSwgY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21fcmliYm9uKGRhdGEgPSB0YWJfZmMsIGFlcyhGZWNoYSwgeW1pbiA9IGBJQyA5NSUgaW5mYCwgeW1heCA9IGBJQyA5NSUgc3VwYCksDQogICAgICAgICAgICAgIGZpbGwgPSAiIzFhNzNlOCIsIGFscGhhID0gMC4xNSkgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gdGFiX2ZjLCBhZXMoRmVjaGEsIHltaW4gPSBgSUMgODAlIGluZmAsIHltYXggPSBgSUMgODAlIHN1cGApLA0KICAgICAgICAgICAgICBmaWxsID0gIiMxYTczZTgiLCBhbHBoYSA9IDAuMjUpICsNCiAgZ2VvbV9saW5lKGRhdGEgPSB0YWJfZmMsIGFlcyhGZWNoYSwgUHJvbsOzc3RpY28pLCBjb2xvciA9ICIjZWE0MzM1IiwgbGluZXdpZHRoID0gMSkgKw0KICBsYWJzKHRpdGxlID0gIkdPT0dMOiBwcm9uw7NzdGljbyBhIDMwIGTDrWFzIGNvbiBBUklNQSgxLDEsMCkiLA0KICAgICAgIHN1YnRpdGxlID0gIkJhbmRhcyBkZSBjb25maWFuemEgYWwgODAgJSB5IDk1ICUiLCB4ID0gTlVMTCwgeSA9ICJVU0QiKSArDQogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTMpDQpgYGANCg0KQ29tbyBlbCBtb2RlbG8gZXMgcHLDoWN0aWNhbWVudGUgdW5hIGNhbWluYXRhIGFsZWF0b3JpYSwgZWwgcHJvbsOzc3RpY28gcHVudHVhbCBlcyAqKmNhc2kgcGxhbm8qKiB5IGxhIGluY2VydGlkdW1icmUgY3JlY2UgY29uICRcc3FydCBoJC4NCg0KIyMgRGVjaXNpw7NuIGRlIGludmVyc2nDs24gdmlnZW50ZSB5IHBvc2ljacOzbiBhZG9wdGFkYQ0KDQpgYGB7ciBkZWNpc2lvbn0NClBfbGFzdCAgIDwtIHRhaWwocCwgMSkNClBfaGF0X2YgIDwtIEludkJveENveChhcy5udW1lcmljKGZjJG1lYW5baF0pLCBsYW1iZGEpDQpyZXRfZXNwX2YgPC0gUF9oYXRfZiAvIFBfbGFzdCAtIDENCmxhcmdvX2YgIDwtIHJldF9lc3BfZiA+IHVtYnJhbA0Kd19mICAgICAgPC0gYXMubnVtZXJpYyhsYXJnb19mKQ0KDQphY2NfZiAgPC0gZmxvb3IoY2FwaXRhbCAqIHdfZiAvIChQX2xhc3QgKiAoMSArIGNvc3RvKSkpDQppbnZfZiAgPC0gYWNjX2YgKiBQX2xhc3QgKiAoMSArIGNvc3RvKQ0KZWZlY19mIDwtIGNhcGl0YWwgLSBpbnZfZg0KDQpwb3MgPC0gZGF0YS5mcmFtZSgNCiAgQ29uY2VwdG8gPSBjKCLDmmx0aW1vIHByZWNpbyBvYnNlcnZhZG8gKFVTRCkiLCAiUHJlY2lvIHByb25vc3RpY2FkbyBhIDMwIGTDrWFzIChVU0QpIiwNCiAgICAgICAgICAgICAgICJSZW5kaW1pZW50byBlc3BlcmFkbyAoJSkiLCAiVW1icmFsICglKSIsICJEZWNpc2nDs24iLA0KICAgICAgICAgICAgICAgIkFjY2lvbmVzIGNvbXByYWRhcyIsICJDYXBpdGFsIGludmVydGlkbyBlbiBHT09HTCAoVVNEKSIsDQogICAgICAgICAgICAgICAiQ2FwaXRhbCBlbiBsaXF1aWRleiAoVVNEKSIpLA0KICBWYWxvciA9IGMocm91bmQoUF9sYXN0LCAyKSwgcm91bmQoUF9oYXRfZiwgMiksIHJvdW5kKHJldF9lc3BfZiAqIDEwMCwgMyksIHVtYnJhbCAqIDEwMCwNCiAgICAgICAgICAgIGlmZWxzZShsYXJnb19mLCAiUG9zaWNpw7NuIGxhcmdhIiwgIk1hbnRlbmVyIGxpcXVpZGV6IiksDQogICAgICAgICAgICBhY2NfZiwgcm91bmQoaW52X2YsIDIpLCByb3VuZChlZmVjX2YsIDIpKQ0KKQ0KdGFibGEocG9zLCAiUG9zaWNpw7NuIGFkb3B0YWRhIGNvbiBlbCBwcm9uw7NzdGljbyB2aWdlbnRlIiwgMikNCmBgYA0KDQpgYGB7ciB0ZXh0b19kZWNpc2lvbiwgcmVzdWx0cz0nYXNpcyd9DQojIEZvcm1hdGVhZG9yZXMgKGNvbWEgZGVjaW1hbCwgcHVudG8gZGUgbWlsZXMpDQpmbXRfdXNkIDwtIGZ1bmN0aW9uKHgpIGZvcm1hdChyb3VuZCh4LCAwKSwgYmlnLm1hcmsgPSAiLiIsIGRlY2ltYWwubWFyayA9ICIsIiwgc2NpZW50aWZpYyA9IEZBTFNFKQ0KZm10X24gICA8LSBmdW5jdGlvbih4LCBkID0gMikgZm9ybWF0Qyh4LCBmb3JtYXQgPSAiZiIsIGRpZ2l0cyA9IGQsIGRlY2ltYWwubWFyayA9ICIsIikNCg0KaWM5NV9pbmYgPC0gdGFiX2ZjJGBJQyA5NSUgaW5mYFtoXQ0KaWM5NV9zdXAgPC0gdGFiX2ZjJGBJQyA5NSUgc3VwYFtoXQ0Kcl9pbmYgPC0gKGljOTVfaW5mIC8gUF9sYXN0IC0gMSkgKiAxMDANCnJfc3VwIDwtIChpYzk1X3N1cCAvIFBfbGFzdCAtIDEpICogMTAwDQppbnRlcmVzIDwtIGNhcGl0YWwgKiByZl9oDQoNCmlmICghbGFyZ29fZikgew0KICBjYXQocGFzdGUwKA0KICAgICIqKsK/UXXDqSBzaWduaWZpY2EgwqttYW50ZW5lciBsaXF1aWRlesK7PyoqIEVzIHVuYSBkZWNpc2nDs24gYWN0aXZhLCBubyB1biDCq25vIGhhY2VyIG5hZGHCuy4gU2lnbmlmaWNhIHF1ZSBlbiBlc3RhIGZlY2hhICIsDQogICAgIioqbm8gc2UgY29tcHJhIG5pbmd1bmEgYWNjacOzbiBkZSBHT09HTCoqIHkgcXVlIGxvcyBVU0QgIiwgY2FwaXRhbF90eHQsICIgc2UgY29uc2VydmFuIGVuIGVmZWN0aXZvIG8gZW4gdW4gaW5zdHJ1bWVudG8gIiwNCiAgICAiZGUgbXV5IGJham8gcmllc2dvIChwb3IgZWplbXBsbywgdW4gZm9uZG8gbW9uZXRhcmlvIG8gdW4gZGVww7NzaXRvIGEgY29ydG8gcGxhem8pIHF1ZSByaW5kZSBhbHJlZGVkb3IgZGVsICIsDQogICAgZm10X24ocmZfYW51YWwgKiAxMDAsIDEpLCAiICUgYW51YWwuIEVuICIsIGgsICIgZMOtYXMgaMOhYmlsZXMgZXNvIGVxdWl2YWxlIGEgdW5vcyBVU0QgIiwgZm10X3VzZChpbnRlcmVzKSwNCiAgICAiIGRlIGludGVyZXNlcywgc2luIGV4cG9uZXJzZSBhIGxhcyBzdWJpZGFzIHkgYmFqYWRhcyBkZWwgcHJlY2lvLlxuXG4iKSkNCiAgY2F0KHBhc3RlMCgNCiAgICAiKirCv1BvciBxdcOpIHNlIGxsZWfDsyBhIGVzdGEgZGVjaXNpw7NuPyoqIFBvcnF1ZSBsYSByZWdsYSBxdWUgc2UgZmlqw7MgZGVzZGUgZWwgaW5pY2lvIGV4aWfDrWEgcXVlIGVsIG1vZGVsbyBwcm95ZWN0YXJhICIsDQogICAgInVuYSBhcHJlY2lhY2nDs24gZGUgbcOhcyBkZWwgIiwgZm10X24odW1icmFsICogMTAwLCAwKSwgIiAlIHBhcmEgZW50cmFyIGFsIG1lcmNhZG8sIHkgbm8gbGEgcHJveWVjdGE6IGVsIHByb27Ds3N0aWNvIGEgIiwgaCwNCiAgICAiIGTDrWFzIGVzIGRlIFVTRCAiLCBmbXRfbihQX2hhdF9mKSwgIiBmcmVudGUgYSB1biBwcmVjaW8gYWN0dWFsIGRlIFVTRCAiLCBmbXRfbihQX2xhc3QpLA0KICAgICIsIGVzIGRlY2lyLCB1bmEgdmFyaWFjacOzbiBlc3BlcmFkYSBkZSAiLCBmbXRfbihyZXRfZXNwX2YgKiAxMDAsIDIpLCAiICUsIGNsYXJhbWVudGUgcG9yIGRlYmFqbyBkZWwgdW1icmFsLiAiLA0KICAgICJFc3RvIG5vIGVzIGNhc3VhbDogZXMgY29uc2VjdWVuY2lhIGRlIGxvIHF1ZSBtb3N0csOzIGVsIGFuw6FsaXNpcy5cblxuIikpDQogIGNhdChwYXN0ZTAoDQogICAgIi0gKipFbCBtb2RlbG8gc2UgY29tcG9ydGEgY2FzaSBjb21vIHVuYSBjYW1pbmF0YSBhbGVhdG9yaWEuKiogRWwgbWVqb3IgQVJJTUEsIGVsIEFSSU1BKDEsMSwwKSwgcHLDoWN0aWNhbWVudGUgcmVwaXRlICIsDQogICAgImVsIHByZWNpbyBkZSBob3ksIHBvciBsbyBxdWUgbm8gYW50aWNpcGEgc3ViaWRhcyBuaSBiYWphZGFzIHJlbGV2YW50ZXMuXG4iLA0KICAgICItICoqTm8gbGUgZ2Fuw7MgYWwgYmVuY2htYXJrLioqIEZ1ZXJhIGRlIG11ZXN0cmEsIGxhIGNhbWluYXRhIGFsZWF0b3JpYSB0dXZvIHVuIGVycm9yIGxpZ2VyYW1lbnRlIG1lbm9yICIsDQogICAgIihSTVNFIDAuMDg2NjkwOTggZnJlbnRlIGEgMC4wODY2OTU0MCkuIFNpIGVsIG1vZGVsbyBtw6FzIHNlbmNpbGxvIHByb25vc3RpY2EgaWd1YWwgbyBtZWpvciwgbm8gaGF5IGV2aWRlbmNpYSAiLA0KICAgICJkZSBxdWUgZWwgcHJvbsOzc3RpY28gQVJJTUEgYXBvcnRlIHVuYSBzZcOxYWwgZW4gbGEgcXVlIGFwb3lhciB1bmEgY29tcHJhLlxuIiwNCiAgICAiLSAqKkxhIGluY2VydGlkdW1icmUgZXMgbXVjaG8gbWF5b3IgcXVlIGxhIGdhbmFuY2lhIGJ1c2NhZGEuKiogUGFyYSBlbCBkw61hICIsIGgsICIsIGVsIGludGVydmFsbyBkZSBjb25maWFuemEgZGVsIDk1ICUgIiwNCiAgICAidmEgZGUgVVNEICIsIGZtdF9uKGljOTVfaW5mKSwgIiAoIiwgZm10X24ocl9pbmYsIDEpLCAiICUpIGEgVVNEICIsIGZtdF9uKGljOTVfc3VwKSwgIiAoKyIsIGZtdF9uKHJfc3VwLCAxKSwNCiAgICAiICUpLiBVbiBtb3ZpbWllbnRvIGRlbCAiLCBmbXRfbih1bWJyYWwgKiAxMDAsIDApLCAiICUgcXVlZGEgZGVudHJvIGRlbCDCq3J1aWRvwrsgbm9ybWFsIGRlbCBwcmVjaW8uXG4iLA0KICAgICItICoqTG9zIHJlc2lkdW9zIG5vIGRlamFuIGluZm9ybWFjacOzbiBwb3IgZXhwbG90YXIuKiogTGp1bmctQm94IG5vIHJlY2hhemEgbGEgaGlww7N0ZXNpcyBkZSBydWlkbyBibGFuY28sIGRlIG1vZG8gcXVlICIsDQogICAgIm5vIHF1ZWRhIGVzdHJ1Y3R1cmEgbGluZWFsIHNpbiBhcHJvdmVjaGFyIGVuIGxvcyBkYXRvcy5cblxuIikpDQogIGNhdChwYXN0ZTAoDQogICAgIioqRW4gcmVzdW1lbjoqKiBjb21vIGVsIG1vZGVsbyBubyBlbWl0ZSB1bmEgc2XDsWFsIGNsYXJhIHkgbGEgaW5jZXJ0aWR1bWJyZSBlcyBhbHRhLCBsbyBwcnVkZW50ZSBlcyBubyBhcnJpZXNnYXIgY2FwaXRhbCAiLA0KICAgICJlc3BlcmFuZG8gdW5hIGdhbmFuY2lhIHF1ZSBlbCBtb2RlbG8gbm8gcmVzcGFsZGEuIEVzdG8gKipubyBxdWllcmUgZGVjaXIgcXVlIGxhIGFjY2nDs24gdmF5YSBhIGJhamFyKiosIHNpbm8gcXVlIGVsIG1vZGVsbyAiLA0KICAgICJubyB0aWVuZSB2ZW50YWphIHBhcmEgYWZpcm1hciBxdWUgc3ViaXLDoSwgbG8gcXVlIGVzIGNvaGVyZW50ZSBjb24gbGEgaGlww7N0ZXNpcyBkZSBlZmljaWVuY2lhIGTDqWJpbC4gRWwgY29zdG8gZGUgZXN0YSAiLA0KICAgICJkZWNpc2nDs24gZXMgZWwgY29zdG8gZGUgb3BvcnR1bmlkYWQ6IHNpIGVsIHByZWNpbyBzdWJlLCBzZSByZW51bmNpYSBhIGVzYSBnYW5hbmNpYTsgc2kgYmFqYSwgc2UgZXZpdGEgbGEgcMOpcmRpZGEuICIsDQogICAgIk1pZW50cmFzIHRhbnRvLCBlbCBjYXBpdGFsIHNpZ3VlIHJpbmRpZW5kbyBsYSB0YXNhIGxpYnJlIGRlIHJpZXNnby5cblxuIikpDQp9IGVsc2Ugew0KICBjYXQocGFzdGUwKA0KICAgICIqKsK/UXXDqSBzaWduaWZpY2Egwqtwb3NpY2nDs24gbGFyZ2HCuz8qKiBTaWduaWZpY2EgcXVlIHNlICoqY29tcHJhIEdPT0dMKiogY29uIGVsIGNhcGl0YWwgZGlzcG9uaWJsZSB5IHNlIG1hbnRpZW5lICIsDQogICAgImxhIHBvc2ljacOzbiBkdXJhbnRlIGVsIGhvcml6b250ZSBkZSAiLCBoLCAiIGTDrWFzIGjDoWJpbGVzLiBMYSByZWdsYSBsbyBpbmRpY2EgcG9ycXVlIGVsIG1vZGVsbyBwcm95ZWN0YSB1bmEgdmFyaWFjacOzbiBlc3BlcmFkYSBkZSAiLA0KICAgIGZtdF9uKHJldF9lc3BfZiAqIDEwMCwgMiksICIgJSwgcG9yIGVuY2ltYSBkZWwgdW1icmFsIGRlbCAiLCBmbXRfbih1bWJyYWwgKiAxMDAsIDApLCAiICU6IGVsIHByb27Ds3N0aWNvIGEgIiwgaCwNCiAgICAiIGTDrWFzIGVzIGRlIFVTRCAiLCBmbXRfbihQX2hhdF9mKSwgIiBmcmVudGUgYSB1biBwcmVjaW8gYWN0dWFsIGRlIFVTRCAiLCBmbXRfbihQX2xhc3QpLCAiLlxuXG4iKSkNCiAgY2F0KHBhc3RlMCgNCiAgICAiRXN0YSBzZcOxYWwgZGViZSBsZWVyc2UgY29uIGNhdXRlbGE6IGVsIG1vZGVsbyBubyBzdXBlcsOzIGEgbGEgY2FtaW5hdGEgYWxlYXRvcmlhIGZ1ZXJhIGRlIG11ZXN0cmEgIiwNCiAgICAiKFJNU0UgMC4wODY2OTA5OCBmcmVudGUgYSAwLjA4NjY5NTQwKSwgeSBlbCBpbnRlcnZhbG8gZGUgY29uZmlhbnphIGRlbCA5NSAlIHBhcmEgZWwgZMOtYSAiLCBoLCAiIHZhIGRlIFVTRCAiLA0KICAgIGZtdF9uKGljOTVfaW5mKSwgIiAoIiwgZm10X24ocl9pbmYsIDEpLCAiICUpIGEgVVNEICIsIGZtdF9uKGljOTVfc3VwKSwgIiAoKyIsIGZtdF9uKHJfc3VwLCAxKSwNCiAgICAiICUpLCB1biByYW5nbyBtdWNobyBtw6FzIGFtcGxpbyBxdWUgbGEgZ2FuYW5jaWEgZXNwZXJhZGEuIFBvciBlc28gc2UgYWNvbXBhw7FhIGxhIHBvc2ljacOzbiBjb24gbGFzIHJlZ2xhcyBkZSBnZXN0acOzbiBkZSByaWVzZ28gIiwNCiAgICAicXVlIHNpZ3Vlbi5cblxuIikpDQp9DQpgYGANCg0KKipQcm9wdWVzdGEgZGUgZ2VzdGnDs24uKiogQ29uIGxhIGxpcXVpZGV6IGNvbW8gcG9zaWNpw7NuIGJhc2UsIGxhIGdlc3Rpw7NuIGRlbCBjYXBpdGFsIHNlIGNvbXBsZW1lbnRhIGNvbiBsb3Mgc2lndWllbnRlcyBwcmluY2lwaW9zLCBwb3Igc2kgbcOhcyBhZGVsYW50ZSBzZSBkZWNpZGUgdG9tYXIgZXhwb3NpY2nDs24gYSBHT09HTDoNCg0KMS4gKipUYW1hw7FvIGRlIHBvc2ljacOzbiBtb2RlcmFkbyoqICgyNSAlLTUwICUgZGVsIGNhcGl0YWwgZW4gR09PR0wgc2kgc2UgcXVpZXJlIGV4cG9zaWNpw7NuKSwgZGUgbW9kbyBxdWUgdW5hIHDDqXJkaWRhIGVuIGVsIGVzY2VuYXJpbyBQNSBzZWEgdG9sZXJhYmxlLg0KMi4gKipFbnRyYWRhIGVzY2Fsb25hZGEqKiBlbiAzIG8gNCB0cmFtb3MsIHB1ZXMgbm8gaGF5IHNlw7FhbCBkZSAqdGltaW5nKiBleHBsb3RhYmxlLg0KMy4gKipEaXZlcnNpZmljYWNpw7NuKiogZGVsIHJlc3RvIGVuIHVuIGZvbmRvIGluZGV4YWRvIGFtcGxpbyB5L28gcmVudGEgZmlqYSBkZSBjb3J0byBwbGF6by4NCjQuICoqTMOtbWl0ZSBkZSBww6lyZGlkYSoqIHByZXZpYW1lbnRlIGRlZmluaWRvIChwLiBlai4sIOKIkjEwICUpIHkgc2VndWltaWVudG8gZGVsIFZhUi9DVmFSIChzZWNjacOzbiA5KS4NCjUuICoqTWluaW1pemFyIGxhIHJvdGFjacOzbioqOiBzaW4gdmVudGFqYSBwcmVkaWN0aXZhLCBjYWRhIG9wZXJhY2nDs24gYWRpY2lvbmFsIGVzIHVuIGNvc3RvIG5ldG8uDQoNCj4gKipBdmlzbzoqKiBlc3RlIGVqZXJjaWNpbyBlcyBhY2Fkw6ltaWNvIHkgbm8gY29uc3RpdHV5ZSBhc2Vzb3LDrWEgZmluYW5jaWVyYS4NCg0KIyBTaW11bGFjacOzbg0KDQpTZSBjb25zdHJ1eWUgdW5hICoqZGlzdHJpYnVjacOzbiBkZSBwcmVjaW9zIGZ1dHVyb3MqKiBjb24gKioxLjAwMCB0cmF5ZWN0b3JpYXMqKiBhbCBtaXNtbyBob3Jpem9udGUgZGUgaW52ZXJzacOzbiAoJGg9MzAkKS4gQ29tbyBKYXJxdWUtQmVyYSByZWNoYXphIGxhIG5vcm1hbGlkYWQsIGxhcyBpbm5vdmFjaW9uZXMgbm8gc2UgZ2VuZXJhbiBkZSB1bmEgZGlzdHJpYnVjacOzbiBnYXVzc2lhbmEuIFNlIHVzYSAqKmJvb3RzdHJhcCBkZSByZXNpZHVvcyoqIChFZnJvbiwgMTk3OSk6IGVuIGNhZGEgcGFzbyBzZSByZW11ZXN0cmVhbiBjb24gcmVlbXBsYXpvIGxvcyByZXNpZHVvcyBkZWwgQVJJTUEoMSwxLDApIHkgc2UgcHJvcGFnYSBsYSBkaW7DoW1pY2EgZGVsIG1vZGVsbzoNCg0KJCQNCnleeyp9X3tUK2t9PSgxK1xoYXRccGhpXzEpXCx5XnsqfV97VCtrLTF9LVxoYXRccGhpXzFcLHleeyp9X3tUK2stMn0rXHZhcmVwc2lsb25eeyp9X3tUK2t9LFxxcXVhZA0KXHZhcmVwc2lsb25eeyp9XHNpbVxoYXQgRl97XHRleHR7cmVzaWR1b3N9fSAuDQokJA0KDQoqKlZlbnRhamFzOioqIG5vIGltcG9uZSBub3JtYWxpZGFkIHkgcmVwcm9kdWNlIGxhcyBjb2xhcyBwZXNhZGFzIHkgbGEgYXNpbWV0csOtYSBlbXDDrXJpY2FzLiAqKkxpbWl0YWNpb25lczoqKiBzdXBvbmUgcmVzaWR1b3MgaS5pLmQuIChpZ25vcmEgZWwgYWdydXBhbWllbnRvIGRlIHZvbGF0aWxpZGFkLCBzZWNjacOzbiA2KSwgbm8gZ2VuZXJhIHZhbG9yZXMgZnVlcmEgZGVsIHJhbmdvIGhpc3TDs3JpY28gZGUgbG9zIHJlc2lkdW9zIHkgaGVyZWRhIGVsIGVycm9yIGRlIGVzdGltYWNpw7NuIGRlbCBtb2RlbG8uIExhIHNpbXVsYWNpw7NuIGRlYmUgbGVlcnNlIGNvbW8gdW5hICoqaGVycmFtaWVudGEgZGUgcmllc2dvLCBubyBjb21vIHVuYSBwcmVkaWNjacOzbiBnYXJhbnRpemFkYSoqLg0KDQpgYGB7ciBmdW5jaW9uX3NpbX0NCk0gPC0gMTAwMA0Kc2ltdWxhciA8LSBmdW5jdGlvbihmaXQsIE0sIGgsIGxhbWJkYSwgc2VtaWxsYSkgew0KICBzZXQuc2VlZChzZW1pbGxhKQ0KICBzaW1zIDwtIHJlcGxpY2F0ZShNLCBhcy5udW1lcmljKHNpbXVsYXRlKGZpdCwgbnNpbSA9IGgsIGZ1dHVyZSA9IFRSVUUsIGJvb3RzdHJhcCA9IFRSVUUpKSkNCiAgYXBwbHkoc2ltcywgMiwgZnVuY3Rpb24odikgSW52Qm94Q294KHYsIGxhbWJkYSkpICAgIyBtYXRyaXogaCB4IE0sIGVuIFVTRA0KfQ0KYGBgDQoNCiMjIFRyYXllY3RvcmlhcyB5IGRpc3RyaWJ1Y2nDs24gZGVsIHByZWNpbyBkZXNkZSBsYSBmZWNoYSBkZSBjb3J0ZSBhY3R1YWwNCg0KYGBge3Igc2ltdWxhY2lvbn0NCnNpbXNfcCA8LSBzaW11bGFyKGZpdF9mdWxsLCBNLCBoLCBsYW1iZGEsIHNlbWlsbGEgPSAxMjMpDQpQX1QgICAgPC0gc2ltc19wW2gsIF0NCnJldF9UICA8LSBQX1QgLyBQX2xhc3QgLSAxDQoNCnFfZGlhIDwtIHQoYXBwbHkoc2ltc19wLCAxLCBxdWFudGlsZSwgcHJvYnMgPSBjKDAuMDUsIDAuMjUsIDAuNSwgMC43NSwgMC45NSkpKQ0KY29sbmFtZXMocV9kaWEpIDwtIGMoIlA1IiwgIlAyNSIsICJQNTAiLCAiUDc1IiwgIlA5NSIpDQpxX2RmIDwtIGRhdGEuZnJhbWUoRmVjaGEgPSBmZWNoYXNfZmMsIHFfZGlhKQ0KDQp0cmF5IDwtIGFzLmRhdGEuZnJhbWUoc2ltc19wWywgMTo2MF0pOyB0cmF5JEZlY2hhIDwtIGZlY2hhc19mYw0KdHJheSA8LSBwaXZvdF9sb25nZXIodHJheSwgLUZlY2hhLCBuYW1lc190byA9ICJTaW0iLCB2YWx1ZXNfdG8gPSAiUHJlY2lvIikNCg0KZ2dwbG90KCkgKw0KICBnZW9tX2xpbmUoZGF0YSA9IHRyYXksIGFlcyhGZWNoYSwgUHJlY2lvLCBncm91cCA9IFNpbSksIGNvbG9yID0gImdyZXk3MCIsIGFscGhhID0gMC41KSArDQogIGdlb21fcmliYm9uKGRhdGEgPSBxX2RmLCBhZXMoRmVjaGEsIHltaW4gPSBQNSwgeW1heCA9IFA5NSksIGZpbGwgPSAiIzFhNzNlOCIsIGFscGhhID0gMC4yKSArDQogIGdlb21fcmliYm9uKGRhdGEgPSBxX2RmLCBhZXMoRmVjaGEsIHltaW4gPSBQMjUsIHltYXggPSBQNzUpLCBmaWxsID0gIiMxYTczZTgiLCBhbHBoYSA9IDAuMykgKw0KICBnZW9tX2xpbmUoZGF0YSA9IHFfZGYsIGFlcyhGZWNoYSwgUDUwKSwgY29sb3IgPSAiI2VhNDMzNSIsIGxpbmV3aWR0aCA9IDEpICsNCiAgbGFicyh0aXRsZSA9ICJTaW11bGFjacOzbiBNb250ZSBDYXJsbzogMS4wMDAgdHJheWVjdG9yaWFzIChzZSBncmFmaWNhbiA2MCkiLA0KICAgICAgIHN1YnRpdGxlID0gIkJhbmRhcyBQNS1QOTUgeSBQMjUtUDc1OyBsw61uZWEgcm9qYTogbWVkaWFuYSIsIHggPSBOVUxMLCB5ID0gIlVTRCIpICsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMykNCmBgYA0KDQpgYGB7ciBtY19yZXN1bWVufQ0KbWNfcmVzIDwtIGRhdGEuZnJhbWUoDQogIE1lZGlkYSA9IGMoIlByZWNpbyBkZSBlbnRyYWRhIChVU0QpIiwgIlByZWNpbyBtZWRpbyBzaW11bGFkbyBhIDMwIGTDrWFzIChVU0QpIiwNCiAgICAgICAgICAgICAiTWVkaWFuYSAoVVNEKSIsICJQZXJjZW50aWwgNSAoVVNEKSIsICJQZXJjZW50aWwgOTUgKFVTRCkiLA0KICAgICAgICAgICAgICJSZW5kaW1pZW50byBtZWRpbyBhIDMwIGTDrWFzICglKSIsICJEZXN2LiBlc3TDoW5kYXIgZGVsIHJlbmRpbWllbnRvICglKSIsDQogICAgICAgICAgICAgIlByb2JhYmlsaWRhZCBkZSBww6lyZGlkYSByZXNwZWN0byBhbCBwcmVjaW8gZGUgZW50cmFkYSAoJSkiLA0KICAgICAgICAgICAgICJQcm9iYWJpbGlkYWQgZGUgZ2FuYW5jaWEgPiA1ICUgKCUpIiwgIlByb2JhYmlsaWRhZCBkZSBww6lyZGlkYSA+IDEwICUgKCUpIiksDQogIFZhbG9yID0gYyhQX2xhc3QsIG1lYW4oUF9UKSwgbWVkaWFuKFBfVCksIHF1YW50aWxlKFBfVCwgMC4wNSksIHF1YW50aWxlKFBfVCwgMC45NSksDQogICAgICAgICAgICBtZWFuKHJldF9UKSAqIDEwMCwgc2QocmV0X1QpICogMTAwLCBtZWFuKHJldF9UIDwgMCkgKiAxMDAsDQogICAgICAgICAgICBtZWFuKHJldF9UID4gMC4wNSkgKiAxMDAsIG1lYW4ocmV0X1QgPCAtMC4xMCkgKiAxMDApDQopDQp0YWJsYShtY19yZXMsICJEaXN0cmlidWNpw7NuIHNpbXVsYWRhIGRlbCBwcmVjaW8gYSAzMCBkw61hcyIsIDMpDQpgYGANCg0KYGBge3IgbWNfaGlzdH0NCmdncGxvdChkYXRhLmZyYW1lKFAgPSBQX1QpLCBhZXMoUCkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDQwLCBmaWxsID0gIiMxYTczZTgiLCBjb2xvciA9ICJ3aGl0ZSIsIGFscGhhID0gMC44NSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBQX2xhc3QsIGNvbG9yID0gIiNlYTQzMzUiLCBsaW5ld2lkdGggPSAxLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGxhYnModGl0bGUgPSAiRGlzdHJpYnVjacOzbiBzaW11bGFkYSBkZWwgcHJlY2lvIGEgMzAgZMOtYXMiLA0KICAgICAgIHN1YnRpdGxlID0gIkzDrW5lYSBwdW50ZWFkYTogcHJlY2lvIGRlIGVudHJhZGEiLCB4ID0gIlVTRCIsIHkgPSAiRnJlY3VlbmNpYSIpICsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMykNCmBgYA0KDQojIyBEaXN0cmlidWNpw7NuIGRlbCB2YWxvciBmaW5hbCBkZWwgcG9ydGFmb2xpbw0KDQpTZSBldmFsw7phbiBjaW5jbyBhc2lnbmFjaW9uZXMgZGVsIGNhcGl0YWwgZGUgVVNEIGByIGNhcGl0YWxfdHh0YCBlbnRyZSBHT09HTCB5IGxpcXVpZGV6IChjb24gY29zdG9zIGRlIHRyYW5zYWNjacOzbiB5IHRhc2EgbGlicmUgZGUgcmllc2dvIGRlbCBgciByZl9hbnVhbCoxMDBgICUgYW51YWwpLiBFbCBWYVIgeSBlbCBDVmFSIHNlIGV4cHJlc2FuIGNvbW8gcMOpcmRpZGEgcG9zaXRpdmEuDQoNCmBgYHtyIHBvcnRhZm9saW99DQpwZXNvcyA8LSBjKDAsIDAuMjUsIDAuNTAsIDAuNzUsIDEpDQplc3RyIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShwZXNvcywgZnVuY3Rpb24odykgew0KICB2ZiAgPC0gdmFsb3JfZmluYWwodywgUF9sYXN0LCBQX1QpDQogIHBubCA8LSB2ZiAtIGNhcGl0YWwNCiAgZGF0YS5mcmFtZSgNCiAgICBgJSBlbiBHT09HTGAgPSB3ICogMTAwLA0KICAgIGBWYWxvciBmaW5hbCBtZWRpbyAoVVNEKWAgPSBtZWFuKHZmKSwNCiAgICBgTWVkaWFuYSAoVVNEKWAgPSBtZWRpYW4odmYpLA0KICAgIGBQNSAoVVNEKWAgPSBxdWFudGlsZSh2ZiwgMC4wNSksDQogICAgYFA5NSAoVVNEKWAgPSBxdWFudGlsZSh2ZiwgMC45NSksDQogICAgYFZhUiA5NSUgKFVTRClgID0gLXF1YW50aWxlKHBubCwgMC4wNSksDQogICAgYENWYVIgOTUlIChVU0QpYCA9IC1tZWFuKHBubFtwbmwgPD0gcXVhbnRpbGUocG5sLCAwLjA1KV0pLA0KICAgIGBQcm9iLiBww6lyZGlkYSAoJSlgID0gbWVhbihwbmwgPCAwKSAqIDEwMCwNCiAgICBjaGVjay5uYW1lcyA9IEZBTFNFLCByb3cubmFtZXMgPSBOVUxMKQ0KfSkpDQp0YWJsYShlc3RyLCAiVmFsb3IgZmluYWwgc2ltdWxhZG8gZGVsIHBvcnRhZm9saW8gYSAzMCBkw61hcyBzZWfDum4gbGEgcHJvcG9yY2nDs24gYXNpZ25hZGEgYSBHT09HTCIsIDEpDQpgYGANCg0KYGBge3IgcG9ydGFmb2xpb19ncmFmfQ0KdmY1MCAgPC0gdmFsb3JfZmluYWwoMC41LCBQX2xhc3QsIFBfVCkNCnZmMTAwIDwtIHZhbG9yX2ZpbmFsKDEsICAgUF9sYXN0LCBQX1QpDQpkZl92ZiA8LSByYmluZChkYXRhLmZyYW1lKFZhbG9yID0gdmY1MCwgIENhcnRlcmEgPSAiNTAgJSBHT09HTCAvIDUwICUgbGlxdWlkZXoiKSwNCiAgICAgICAgICAgICAgIGRhdGEuZnJhbWUoVmFsb3IgPSB2ZjEwMCwgQ2FydGVyYSA9ICIxMDAgJSBHT09HTCIpKQ0KZ2dwbG90KGRmX3ZmLCBhZXMoVmFsb3IsIGZpbGwgPSBDYXJ0ZXJhKSkgKw0KICBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gY2FwaXRhbCwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpkb2xsYXIpICsNCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidWNpw7NuIHNpbXVsYWRhIGRlbCB2YWxvciBmaW5hbCBkZWwgcG9ydGFmb2xpbyIsDQogICAgICAgc3VidGl0bGUgPSAiTMOtbmVhIHB1bnRlYWRhOiBjYXBpdGFsIGluaWNpYWwiLCB4ID0gIlZhbG9yIGZpbmFsIChVU0QpIiwgeSA9ICJEZW5zaWRhZCIpICsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMykgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikNCmBgYA0KDQoqKkxlY3R1cmEuKiogTGEgZGlzdHJpYnVjacOzbiBzZSBjb25jZW50cmEgY2VyY2EgZGVsIHByZWNpbyBkZSBlbnRyYWRhLCBjb24gdW5hIHByb2JhYmlsaWRhZCBkZSBww6lyZGlkYSBkZSAqKmByIHJvdW5kKG1lYW4ocmV0X1QgPCAwKSAqIDEwMCwgMSlgICUqKiwgY2VyY2FuYSBhIGxhIGRlIGdhbmFuY2lhLCBsbyBxdWUgY29uY3VlcmRhIGNvbiBsYSBjYW1pbmF0YSBhbGVhdG9yaWEuIEVsIHJhbmdvIGVudHJlIGxvcyBwZXJjZW50aWxlcyA1IHkgOTUgZGVsIHByZWNpbyAoKipVU0QgYHIgcm91bmQocXVhbnRpbGUoUF9ULCAwLjA1KSwgMilgIGEgYHIgcm91bmQocXVhbnRpbGUoUF9ULCAwLjk1KSwgMilgKiopIG11ZXN0cmEgbGEgbWFnbml0dWQgZGVsIHJpZXNnby4gQXVtZW50YXIgbGEgZXhwb3NpY2nDs24gYSBHT09HTCBpbmNyZW1lbnRhIGxhIGRpc3BlcnNpw7NuIHkgbGFzIHDDqXJkaWRhcyBleHRyZW1hcyAoVmFSIHkgQ1ZhUikgc2luIHF1ZSBsYSBtZWRpYSBzaW11bGFkYSBjb21wZW5zZSwgcG9ycXVlIGxhIGRlcml2YSBkZWwgbW9kZWxvIGVzIGNhc2kgbnVsYS4NCg0KIyMgRXNjZW5hcmlvcyBkZSByaWVzZ28NCg0KU2UgcmVzdW1lbiB0cmVzIGVzY2VuYXJpb3MgY29uc3RydWlkb3MgY29uIGxvcyBwZXJjZW50aWxlcyBkZSBsYSBkaXN0cmlidWNpw7NuIHNpbXVsYWRhIGRlbCBwcmVjaW8gYSAzMCBkw61hczoNCg0KYGBge3IgZXNjZW5hcmlvc30NCnFzIDwtIHF1YW50aWxlKFBfVCwgYygwLjA1LCAwLjUsIDAuOTUpKQ0KZXNjIDwtIGRhdGEuZnJhbWUoDQogIEVzY2VuYXJpbyA9IGMoIlBlc2ltaXN0YSAoUDUpIiwgIkJhc2UgKFA1MCkiLCAiT3B0aW1pc3RhIChQOTUpIiksDQogIGBQcmVjaW8gZGUgR09PR0wgKFVTRClgID0gYXMubnVtZXJpYyhxcyksDQogIGBWYXJpYWNpw7NuIGRlbCBwcmVjaW8gKCUpYCA9IChhcy5udW1lcmljKHFzKSAvIFBfbGFzdCAtIDEpICogMTAwLA0KICBgQ2FydGVyYSAxMDAgJSBHT09HTCAoVVNEKWAgPSB2YWxvcl9maW5hbCgxLCBQX2xhc3QsIHFzKSwNCiAgYENhcnRlcmEgNTAvNTAgKFVTRClgID0gdmFsb3JfZmluYWwoMC41LCBQX2xhc3QsIHFzKSwNCiAgYENhcnRlcmEgYWRvcHRhZGEgKFVTRClgID0gdmFsb3JfZmluYWwod19mLCBQX2xhc3QsIHFzKSwNCiAgY2hlY2submFtZXMgPSBGQUxTRSwgcm93Lm5hbWVzID0gTlVMTA0KKQ0KdGFibGEoZXNjLCAiVmFsb3IgZmluYWwgZGVsIHBvcnRhZm9saW8gcG9yIGVzY2VuYXJpbyBkZSBwcmVjaW8iLCAyKQ0KYGBgDQoNCiMjIFZhbGlkYWNpw7NuIGRlbCBwcm9jZWRpbWllbnRvIGRlIHNpbXVsYWNpw7NuIGRlc2RlIFTigoANCg0KQ29tbyBjb250cm9sLCBzZSByZXBpdGUgbGEgc2ltdWxhY2nDs24gZGVzZGUgVOKCgCBjb24gZWwgbW9kZWxvIGVzdGltYWRvIHNvbG8gY29uIGVudHJlbmFtaWVudG8geSBzZSB1YmljYSBlbCBwcmVjaW8gKipyZWFsbWVudGUgb2JzZXJ2YWRvKiogYSAzMCBkw61hcyBkZW50cm8gZGUgbGEgZGlzdHJpYnVjacOzbiBzaW11bGFkYToNCg0KYGBge3Igc2ltX1QwfQ0Kc2ltczAgPC0gc2ltdWxhcihmaXRfc2VsLCBNLCBoLCBsYW1iZGEsIHNlbWlsbGEgPSA0NTYpDQpQX1RfMCA8LSBzaW1zMFtoLCBdDQpwY3Rfb2JzIDwtIG1lYW4oUF9UXzAgPD0gUF9vYnMpICogMTAwDQp0YWJsYShkYXRhLmZyYW1lKA0KICBNZWRpZGEgPSBjKCJQcmVjaW8gZW4gVOKCgCAoVVNEKSIsICJNZWRpYW5hIHNpbXVsYWRhIGEgMzAgZMOtYXMgKFVTRCkiLA0KICAgICAgICAgICAgICJQZXJjZW50aWwgNSAoVVNEKSIsICJQZXJjZW50aWwgOTUgKFVTRCkiLA0KICAgICAgICAgICAgICJQcmVjaW8gb2JzZXJ2YWRvIGEgMzAgZMOtYXMgKFVTRCkiLA0KICAgICAgICAgICAgICJQZXJjZW50aWwgZGUgbGEgZGlzdHJpYnVjacOzbiBlbiBxdWUgY2FlIGxvIG9ic2VydmFkbyAoJSkiLA0KICAgICAgICAgICAgICJQcm9iYWJpbGlkYWQgc2ltdWxhZGEgZGUgcMOpcmRpZGEgKCUpIiksDQogIFZhbG9yID0gYyhQX1QwLCBtZWRpYW4oUF9UXzApLCBxdWFudGlsZShQX1RfMCwgMC4wNSksIHF1YW50aWxlKFBfVF8wLCAwLjk1KSwNCiAgICAgICAgICAgIFBfb2JzLCBwY3Rfb2JzLCBtZWFuKFBfVF8wIDwgUF9UMCkgKiAxMDApKSwNCiAgIlNpbXVsYWNpw7NuIGRlc2RlIFTigoAgdnMuIHJlc3VsdGFkbyBvYnNlcnZhZG8iLCAzKQ0KDQpkZW50cm9fdHh0IDwtIGlmZWxzZShQX29icyA+PSBxdWFudGlsZShQX1RfMCwgMC4wNSkgJiBQX29icyA8PSBxdWFudGlsZShQX1RfMCwgMC45NSksDQogICJkZW50cm8gZGVsIGludGVydmFsbyBQNS1QOTU6IGVsIHJhbmdvIGRlIGxhIHNpbXVsYWNpw7NuIGZ1ZSBjb25zaXN0ZW50ZSBjb24gbG8gb2N1cnJpZG8uIiwNCiAgImZ1ZXJhIGRlbCBpbnRlcnZhbG8gUDUtUDk1OiB1biByZWNvcmRhdG9yaW8gZGUgcXVlIGxhIHNpbXVsYWNpw7NuIHB1ZWRlIHN1YmVzdGltYXIgZWwgcmllc2dvLCBwb3IgbGFzIGNvbGFzIHkgbGEgdm9sYXRpbGlkYWQgbm8gY29uc3RhbnRlLiIpDQpgYGANCg0KRWwgcHJlY2lvIG9ic2VydmFkbyBjYWUgZW4gZWwgcGVyY2VudGlsICoqYHIgcm91bmQocGN0X29icywgMSlgKiogZGUgbGEgZGlzdHJpYnVjacOzbiBzaW11bGFkYSwgYHIgZGVudHJvX3R4dGANCg0KIyBDb25jbHVzaW9uZXMgeSBsaW1pdGFjaW9uZXMNCg0KYGBge3IgdHh0X3E1fQ0KIyBUZXh0byBkZSBsYSByZXNwdWVzdGEgNSAoc2UgY29uc3RydXllIGFxdcOtIHBhcmEgZXZpdGFyIGPDs2RpZ28gZW4gbMOtbmVhIGNvbXBsZWpvKQ0KZGlmX2J0IDwtIHJlc19idFtbIlJlc3VsdGFkbyAoVVNEKSJdXVsxXSAtIHJlc19idFtbIlJlc3VsdGFkbyAoVVNEKSJdXVsyXQ0KdHh0X3E1IDwtIGlmIChsYXJnbzApIHsNCiAgIkVuIGVsIGJhY2t0ZXN0IGRlc2RlIFTigoAgZWwgbW9kZWxvIGluZGljw7MgcG9zaWNpw7NuIGxhcmdhLCBwb3IgbG8gcXVlIGxhIGVzdHJhdGVnaWEgcmVwbGljw7MgYSBjb21wcmFyIHkgbWFudGVuZXIuIE5vIGhheSBldmlkZW5jaWEgZGUgcXVlIGhheWEgc3VwZXJhZG8gYSBsb3MgYmVuY2htYXJrcyBtw6FzIGFsbMOhIGRlbCBhemFyLiINCn0gZWxzZSB7DQogIHBhc3RlMCgiRW4gZWwgYmFja3Rlc3QgZGVzZGUgVOKCgCBlbCBwcm9uw7NzdGljbyBubyBzdXBlcsOzIGVsIHVtYnJhbCB5IGxhIGVzdHJhdGVnaWEgbWFudHV2byBsaXF1aWRlei4gIiwNCiAgICAgICAgICJTdSByZXN1bHRhZG8gZnJlbnRlIGEgY29tcHJhciB5IG1hbnRlbmVyIGZ1ZSB1bmEgZGlmZXJlbmNpYSBkZSBVU0QgIiwNCiAgICAgICAgIGZvcm1hdChyb3VuZChkaWZfYnQsIDApLCBiaWcubWFyayA9ICIuIiwgZGVjaW1hbC5tYXJrID0gIiwiLCBzY2llbnRpZmljID0gRkFMU0UpLA0KICAgICAgICAgIiAoYSBmYXZvciBkZSBsYSBlc3RyYXRlZ2lhIHNpIGVzIHBvc2l0aXZhKS4gTm8gY29uc3RpdHV5ZSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhIGRlIHN1cGVyaW9yaWRhZDogZXMgdW4gw7puaWNvIGVwaXNvZGlvLiIpDQp9DQpgYGANCg0KIyMgUmVzcHVlc3RhIGEgbGEgcHJlZ3VudGEgZGUgaW52ZXN0aWdhY2nDs24NCg0KTGEgcHJlZ3VudGEgZXJhIHNpIHVuIEFSSU1BIGVzcGVjaWZpY2FkbyBtYW51YWxtZW50ZSBwZXJtaXRlIHByb25vc3RpY2FyIGVsIHByZWNpbyBkZSBHT09HTCBtZWpvciBxdWUgdW5hIGNhbWluYXRhIGFsZWF0b3JpYSB5IHN1c3RlbnRhciB1bmEgZXN0cmF0ZWdpYSByZW50YWJsZS4gKipMYSByZXNwdWVzdGEgZXMgbm8uKiogRWwgbWVqb3IgQVJJTUEsIGVsIEFSSU1BKDEsMSwwKSwgc29sbyBpZ3VhbGEgYWwgKlJhbmRvbSBXYWxrKiwgY3V5byBSTVNFIGVzIGxpZ2VyYW1lbnRlIG1lbm9yICgwLjA4NjY5MDk4IGZyZW50ZSBhIDAuMDg2Njk1NDApLiBQb3IgZXNvIGxhIGVzdHJhdGVnaWEgZGUgaW52ZXJzacOzbiBubyBwdWVkZSBhcG95YXJzZSBlbiB1bmEgdmVudGFqYSBwcmVkaWN0aXZhLg0KDQojIyBSZXNwdWVzdGFzIGEgbGFzIHByZWd1bnRhcyBkZWwgdHJhYmFqbw0KDQoxLiAqKsK/UXXDqSBjYXJhY3RlcsOtc3RpY2FzIGRlIGxhIHNlcmllIGZ1ZXJvbiBkZXRlcm1pbmFudGVzIHBhcmEgbGEgZXNwZWNpZmljYWNpw7NuPyoqIExhICoqcmHDrXogdW5pdGFyaWEqKiBlbiBuaXZlbGVzIChBREYgeSBLUFNTKSB5IGxhIGVzdGFjaW9uYXJpZWRhZCBkZSBsYSBwcmltZXJhIGRpZmVyZW5jaWEsIHF1ZSBsbGV2YW4gYSAqKmQgPSAxKiouIExhIEFDRi9QQUNGIGRlIGxhIHNlcmllIGRpZmVyZW5jaWFkYSBpbmRpY2EgdW5hIGRpbsOhbWljYSBkZSBvcmRlbiBiYWpvIHkgbm8gaGF5IGV2aWRlbmNpYSBkZSBlc3RhY2lvbmFsaWRhZC4gTGEgdmFyaWFuemEgbm8gZXMgY29uc3RhbnRlIChhZ3J1cGFtaWVudG8gZGUgdm9sYXRpbGlkYWQpLCBsbyBxdWUgbW90aXbDsyBsYSB0cmFuc2Zvcm1hY2nDs24gQm94LUNveCB5IGxhIGRpc2N1c2nDs24gc29icmUgR0FSQ0guDQoyLiAqKsK/Q3XDoWwgbW9kZWxvIGZ1ZSBzZWxlY2Npb25hZG8geSBwb3IgcXXDqT8qKiBFbCAqKkFSSU1BKDEsMSwwKSoqLiBQb3IgY3JpdGVyaW9zIGRlIGluZm9ybWFjacOzbiB5IHBhcnNpbW9uaWEsIGxvcyBtb2RlbG9zIGRlIG1heW9yIG9yZGVuIG5vIGFwb3J0YW4gaW5mb3JtYWNpw7NuIHJlbGV2YW50ZS4gRnVlcmEgZGUgbXVlc3RyYSB0aWVuZSBlbCBtZW5vciBSTVNFIGVudHJlIGxvcyBBUklNQSAoMC4wODY2OTU0MDsgQUlDID0g4oiSNTI3NC43Mjc7IEJJQyA9IOKIkjUyNjQuNzg3KS4NCjMuICoqwr9Mb3MgcmVzaWR1b3MgY3VtcGxlbiByYXpvbmFibGVtZW50ZSBjb24gbGFzIGNvbmRpY2lvbmVzIGVzcGVyYWRhcz8qKiBFbiBncmFuIHBhcnRlLiAqKkxqdW5nLUJveCBubyByZWNoYXphIEgwKiosIGFzw60gcXVlIHNvbiBjb21wYXRpYmxlcyBjb24gcnVpZG8gYmxhbmNvLiAqKkphcnF1ZS1CZXJhIHJlY2hhemEgbGEgbm9ybWFsaWRhZCoqIChjb2xhcyBwZXNhZGFzKSwgcG9yIGxvIHF1ZSBsYSBzaW11bGFjacOzbiB1c2EgYm9vdHN0cmFwIGRlIHJlc2lkdW9zLiBMYSBoZXRlcm9jZWRhc3RpY2lkYWQgY29uZGljaW9uYWwgc2UgZGlzY3V0ZSBlbiBsYSBzZWNjacOzbiA2Lg0KNC4gKirCv0VsIG1vZGVsbyBtYW50dXZvIGNhcGFjaWRhZCBwcmVkaWN0aXZhIGZ1ZXJhIGRlIG11ZXN0cmE/KiogU29sbyBlbiBlbCBzZW50aWRvIGTDqWJpbCBkZSBpZ3VhbGFyIGFsIGJlbmNobWFyay4gRWwgKipSYW5kb20gV2FsayBwcmVzZW50YSB1biBSTVNFIGxpZ2VyYW1lbnRlIG1lbm9yKiogKDAuMDg2NjkwOTgpIHkgbG9zIGRlbcOhcyBtb2RlbG9zIG9yZGVuYWRvcyBwb3IgUk1TRSBzb24gQVJJTUEoMCwxLDEpICgwLjA4NjY5NTU0KSwgQVJJTUEoMiwxLDEpICgwLjA4NzAzMzgwKSwgQVJJTUEoMSwxLDIpICgwLjA4NzA4MjA0KSwgQVJJTUEoMSwxLDEpICgwLjA4NzEzMDg5KSB5IEFSSU1BKDIsMSwyKSAoMC4wODcyODQ2NikuIEVsIG1vZGVsbyBubyBhcG9ydGEgdmVudGFqYSBzb2JyZSBsYSBjYW1pbmF0YSBhbGVhdG9yaWEuDQo1LiAqKsK/TGEgZXN0cmF0ZWdpYSBiYXNhZGEgZW4gZWwgcHJvbsOzc3RpY28gc3VwZXLDsyBsb3MgYmVuY2htYXJrcz8qKiBgciB0eHRfcTVgDQo2LiAqKsK/UXXDqSByZXZlbGEgbGEgc2ltdWxhY2nDs24gc29icmUgbGEgcHJvYmFiaWxpZGFkIGRlIHDDqXJkaWRhIHkgZWwgcmFuZ28gZGUgcG9zaWJsZXMgcmVzdWx0YWRvcz8qKiBDb24gbGEgZGVyaXZhIGNhc2kgbnVsYSwgbGEgcHJvYmFiaWxpZGFkIGRlIHDDqXJkaWRhIGEgMzAgZMOtYXMgZXMgY2VyY2FuYSBhbCA1MCAlIChgciByb3VuZChtZWFuKHJldF9UIDwgMCkgKiAxMDAsIDEpYCAlKSB5IGVsIHJhbmdvIGVudHJlIGxvcyBwZXJjZW50aWxlcyA1IHkgOTUgZGVsIHByZWNpbyBlcyBhbXBsaW8gKFVTRCBgciByb3VuZChxdWFudGlsZShQX1QsIDAuMDUpLCAyKWAgYSBgciByb3VuZChxdWFudGlsZShQX1QsIDAuOTUpLCAyKWApLiBFbCByaWVzZ28gZGUgbWVyY2FkbyBkb21pbmEgc29icmUgY3VhbHF1aWVyIHNlw7FhbCBkZWwgbW9kZWxvLg0KNy4gKirCv1F1w6kgbGltaXRhY2lvbmVzIGltcGlkZW4gaW50ZXJwcmV0YXIgZWwgbW9kZWxvIGNvbW8gZ2FyYW50w61hIGRlIHJlbnRhYmlsaWRhZD8qKiBTZSBsaXN0YW4gYWJham8uDQoNCioqQ29uY2x1c2nDs24gZ2VuZXJhbC4qKiBMb3MgcmVzdWx0YWRvcyBzb24gKipjb25zaXN0ZW50ZXMgY29uIGxhIGhpcMOzdGVzaXMgZGUgZWZpY2llbmNpYSBkw6liaWwgZGVsIG1lcmNhZG8qKjogbG9zIHByZWNpb3MgZGUgR09PR0wgbXVlc3RyYW4gdW4gKipjb21wb3J0YW1pZW50byBjb21wYXRpYmxlIGNvbiB1bmEgY2FtaW5hdGEgYWxlYXRvcmlhKiouIEVsIG1lam9yIEFSSU1BIGVzIEFSSU1BKDEsMSwwKSwgcGVybyBlbCBiZW5jaG1hcmsgUmFuZG9tIFdhbGsgcHJlc2VudGEgdW4gUk1TRSBsaWdlcmFtZW50ZSBtZW5vci4gTGEgZGVjaXNpw7NuIGRlIGludmVyc2nDs24gZGViZSBzdXN0ZW50YXJzZSBlbiBsYSBnZXN0acOzbiBkZWwgcmllc2dvLCBsYSBkaXZlcnNpZmljYWNpw7NuIHkgbG9zIGNvc3Rvcywgbm8gZW4gdW5hIHN1cHVlc3RhIGNhcGFjaWRhZCBkZSBwcmVkZWNpciBsYSBkaXJlY2Npw7NuIGRlbCBwcmVjaW8uDQoNCiMjIEFsY2FuY2UgZGVsIG1vZGVsbyB5IGxpbWl0YWNpb25lcw0KDQoqKkFsY2FuY2UuKiogRWwgbW9kZWxvIGRlc2NyaWJlIGxhIGRpbsOhbWljYSBsaW5lYWwgZGUgbGEgbWVkaWEgZGVsIHByZWNpbyBkZSBHT09HTCBhIGhvcml6b250ZXMgY29ydG9zIHkgc2lydmUgcGFyYSBjdWFudGlmaWNhciBsYSBpbmNlcnRpZHVtYnJlLiBObyBlcyB1bmEgaGVycmFtaWVudGEgZGUgKnRpbWluZyogY29uIHZlbnRhamEgZGVtb3N0cmFkYS4NCg0KKipMaW1pdGFjaW9uZXMgeSByaWVzZ29zLioqDQoNCi0gKipIZXRlcm9jZWRhc3RpY2lkYWQ6KiogbG9zIEFSSU1BIHN1cG9uZW4gdmFyaWFuemEgY29uc3RhbnRlLCBwZXJvIGxvcyByZW5kaW1pZW50b3MgZGUgR09PR0wgcHJlc2VudGFuIGFncnVwYW1pZW50byBkZSB2b2xhdGlsaWRhZC4gTG9zIGludGVydmFsb3MgeSBsYSBzaW11bGFjacOzbiBwdWVkZW4gc2VyIGluZXhhY3RvcyBlbiBwZXJpb2RvcyB0dXJidWxlbnRvcy4NCi0gKipObyBub3JtYWxpZGFkOioqIEphcnF1ZS1CZXJhIHJlY2hhemEgbGEgbm9ybWFsaWRhZC4gRWwgYm9vdHN0cmFwIGxvIG1pdGlnYSwgcGVybyBzdXBvbmUgcmVzaWR1b3MgaS5pLmQuIHkgbm8gZXh0cmFwb2xhIG3DoXMgYWxsw6EgZGUgbG8gb2JzZXJ2YWRvLg0KLSAqKlVuYSBzb2xhIHBhcnRpY2nDs24geSB1biBzb2xvIGVwaXNvZGlvOioqIGxhIHZhbGlkYWNpw7NuIHVzYSB1biDDum5pY28gb3JpZ2VuICg4NS8xNSkgeSBlbCBiYWNrdGVzdCBkZSBpbnZlcnNpw7NuIGVzIHVuYSBzb2xhIHZlbnRhbmEgZGUgMzAgZMOtYXMuIFVuYSB2YWxpZGFjacOzbiBjb24gdmVudGFuYSBtw7N2aWwgKCpyb2xsaW5nIG9yaWdpbiopIHkgcHJ1ZWJhcyBmb3JtYWxlcyBjb21vIERpZWJvbGQtTWFyaWFubyBkYXLDrWFuIGNvbmNsdXNpb25lcyBtw6FzIHJvYnVzdGFzLg0KLSAqKk3DqXRyaWNhcyBtdWx0aXBhc286KiogZWwgYmxvcXVlIGRlIHZhbGlkYWNpw7NuIGFiYXJjYSBjaWVudG9zIGRlIHBhc29zLCBsbyBxdWUgcGVuYWxpemEgbcOhcyBhIGN1YWxxdWllciBtb2RlbG8gY29uIGRpbsOhbWljYS4gTGEgZXZhbHVhY2nDs24gYSB1biBwYXNvIGVzIHVuIGNvbXBsZW1lbnRvLg0KLSAqKk11ZXN0cmEgZGUgY2luY28gYcOxb3M6KiogYWJhcmNhIHVuIHLDqWdpbWVuIHBhcnRpY3VsYXIgKGNpY2xvIGRlIHRhc2FzLCBhdWdlIGRlIGxhIElBKSB5IHB1ZWRlIG5vIGdlbmVyYWxpemFyc2UuDQotICoqU2luIHZhcmlhYmxlcyBleMOzZ2VuYXMgbmkgZXN0YWNpb25hbGlkYWQ6KiogQVJJTUFYIHkgU0FSSU1BWCBzZSBmdW5kYW1lbnRhbiB0ZcOzcmljYW1lbnRlLCBwZXJvIG5vIHNlIGVzdGltYW4sIHBvciBlbCBwcm9ibGVtYSBkZSBwcm9ub3N0aWNhciAkXG1hdGhiZiB4X3tUK2h9JCB5IGxhIGZhbHRhIGRlIGV2aWRlbmNpYSBkZSBlc3RhY2lvbmFsaWRhZC4NCi0gKipTdXB1ZXN0b3MgZGUgbGEgZXN0cmF0ZWdpYToqKiBjb3N0b3MgZGUgdHJhbnNhY2Npw7NuIGZpam9zIGRlbCAwLDEgJSwgdGFzYSBsaWJyZSBkZSByaWVzZ28gc3VwdWVzdGEgZGVsIDQgJSwgc2luIGltcHVlc3RvcywgZGl2aWRlbmRvcyBuaSBmZXJpYWRvcy4NCi0gKipEYXRvczoqKiBlbCBwcmVjaW8gYWp1c3RhZG8gZGUgWWFob28gRmluYW5jZSBwdWVkZSBzZXIgcmV2aXNhZG8sIHBvciBsbyBxdWUgbGFzIGNpZnJhcyBleGFjdGFzIHB1ZWRlbiB2YXJpYXIgZW50cmUgZWplY3VjaW9uZXMuDQotICoqTmluZ3VuYSBnYXJhbnTDrWEgZGUgcmVudGFiaWxpZGFkOioqIGVsIHByb27Ds3N0aWNvIHkgbGFzIHNpbXVsYWNpb25lcyBzb24gaGVycmFtaWVudGFzIGRlIHJpZXNnbywgbm8gcHJvbWVzYXMgZGUgcmVzdWx0YWRvcyBmdXR1cm9zLg0KDQojIyBQb3NpYmxlcyBleHRlbnNpb25lcw0KDQpNb2RlbG9zICoqQVJJTUEtR0FSQ0gqKiAocmllc2dvIGNvbmRpY2lvbmFsKSwgKipBUklNQVgqKiBjb24gZWwgUyZQIDUwMCBvIHRhc2FzIHJlemFnYWRhcywgdmFsaWRhY2nDs24gY29uIHZlbnRhbmEgbcOzdmlsIHkgcHJ1ZWJhcyBkZSBEaWVib2xkLU1hcmlhbm8sIHkgZXZhbHVhY2nDs24gZGUgZXN0cmF0ZWdpYXMgY29uIG3Dumx0aXBsZXMgZmVjaGFzIGRlIGNvcnRlLg0KDQojIFJlZmVyZW5jaWFzIHkgcmVwcm9kdWNpYmlsaWRhZA0KDQojIyBSZXByb2R1Y2liaWxpZGFkDQoNCmBgYHtyIHJlcHJvZHVjaWJpbGlkYWR9DQpwayA8LSBjKCJxdWFudG1vZCIsICJmb3JlY2FzdCIsICJ0c2VyaWVzIiwgInVyY2EiLCAiZ2dwbG90MiIsICJkcGx5ciIsDQogICAgICAgICJ0aWR5ciIsICJ6b28iLCAia25pdHIiLCAia2FibGVFeHRyYSIpDQp2ZXJzIDwtIGRhdGEuZnJhbWUoDQogIFBhcXVldGUgPSBwaywNCiAgVmVyc2nDs24gPSBzYXBwbHkocGssIGZ1bmN0aW9uKHgpIGFzLmNoYXJhY3RlcihwYWNrYWdlVmVyc2lvbih4KSkpLA0KICBGdW5jacOzbiA9IGMoIkRlc2NhcmdhIGRlIGRhdG9zIGRlc2RlIFlhaG9vIEZpbmFuY2UgKFJ5YW4geSBVbHJpY2gsIDIwMjQpIiwNCiAgICAgICAgICAgICAgIkFyaW1hKCksIGZvcmVjYXN0KCksIHNpbXVsYXRlKCksIEJveENveCgpIChIeW5kbWFuIHkgS2hhbmRha2FyLCAyMDA4KSIsDQogICAgICAgICAgICAgICJBREYsIEtQU1MsIEphcnF1ZS1CZXJhIChUcmFwbGV0dGkgeSBIb3JuaWssIDIwMjQpIiwNCiAgICAgICAgICAgICAgIkFERiBjb24gc2VsZWNjacOzbiBkZSByZXphZ29zIChQZmFmZiwgMjAwOCkiLA0KICAgICAgICAgICAgICAiR3LDoWZpY29zIChXaWNraGFtLCAyMDE2KSIsICJNYW5pcHVsYWNpw7NuIGRlIGRhdG9zIiwgIlJlb3JnYW5pemFjacOzbiBkZSBkYXRvcyIsDQogICAgICAgICAgICAgICJWZW50YW5hcyByb2RhbnRlcyIsICJUYWJsYXMgeSBSIE1hcmtkb3duIiwgIkZvcm1hdG8gZGUgdGFibGFzIiksDQogIHJvdy5uYW1lcyA9IE5VTEwNCikNCnRhYmxhKHZlcnMsICJQYXF1ZXRlcyB1dGlsaXphZG9zIiwgMCkNCmBgYA0KDQotICoqVmVyc2nDs24gZGUgUjoqKiBgciBSLnZlcnNpb24uc3RyaW5nYCAoUiBDb3JlIFRlYW0sIDIwMjQpLg0KLSAqKkZlY2hhIGRlIGRlc2NhcmdhIGRlIGRhdG9zOioqIGByIGZvcm1hdChmZWNoYV9maW4pYC4gUGVyaW9kbzogYHIgZm9ybWF0KG1pbihmZWNoYXMpKWAgYSBgciBmb3JtYXQobWF4KGZlY2hhcykpYCAoYHIgbmAgb2JzZXJ2YWNpb25lcykuDQotICoqU2VtaWxsYXM6KiogYHNldC5zZWVkKDIwMjQpYCAoZ2xvYmFsKSwgYHNldC5zZWVkKDEyMylgIChzaW11bGFjacOzbiBoYWNpYSBhZGVsYW50ZSkgeSBgc2V0LnNlZWQoNDU2KWAgKHNpbXVsYWNpw7NuIGRlc2RlIFTigoApLg0KLSAqKkJhc2UgcHJvY2VzYWRhOioqIGVsIGFyY2hpdm8gYEdPT0dMX3Byb2Nlc2FkYS5jc3ZgIHNlIGdlbmVyYSBhbCBjb21waWxhci4gRWwgY8OzZGlnbyBkZXNjYXJnYSBsb3MgZGF0b3MgZGUgbGEgZnVlbnRlIG9yaWdpbmFsLg0KLSAqKlNlbGVjY2nDs24gbWFudWFsOioqIG5vIHNlIHV0aWxpemEgYGF1dG8uYXJpbWEoKWAgZW4gbmluZ3VuYSBwYXJ0ZSBkZWwgZG9jdW1lbnRvLg0KDQojIyBSZWZlcmVuY2lhcw0KDQpBbHBoYWJldCBJbmMuICgyMDIyLCAxIGRlIGZlYnJlcm8pLiAqQWxwaGFiZXQgYW5ub3VuY2VzIGZvdXJ0aCBxdWFydGVyIGFuZCBmaXNjYWwgeWVhciAyMDIxIHJlc3VsdHMqIFtDb211bmljYWRvIGRlIHByZW5zYV0uIGh0dHBzOi8vYWJjLnh5ei9pbnZlc3Rvci8NCg0KQWxwaGFiZXQgSW5jLiAoMjAyNGEpLiAqQW5udWFsIHJlcG9ydCBvbiBGb3JtIDEwLUsgZm9yIHRoZSBmaXNjYWwgeWVhciBlbmRlZCBEZWNlbWJlciAzMSwgMjAyMyouIFUuUy4gU2VjdXJpdGllcyBhbmQgRXhjaGFuZ2UgQ29tbWlzc2lvbi4gaHR0cHM6Ly93d3cuc2VjLmdvdi8NCg0KQWxwaGFiZXQgSW5jLiAoMjAyNGIsIDI1IGRlIGFicmlsKS4gKkFscGhhYmV0IGFubm91bmNlcyBmaXJzdCBxdWFydGVyIDIwMjQgcmVzdWx0cyogW0NvbXVuaWNhZG8gZGUgcHJlbnNhXS4gaHR0cHM6Ly9hYmMueHl6L2ludmVzdG9yLw0KDQpCb2xsZXJzbGV2LCBULiAoMTk4NikuIEdlbmVyYWxpemVkIGF1dG9yZWdyZXNzaXZlIGNvbmRpdGlvbmFsIGhldGVyb3NrZWRhc3RpY2l0eS4gKkpvdXJuYWwgb2YgRWNvbm9tZXRyaWNzLCAzMSooMyksIDMwNy0zMjcuIGh0dHBzOi8vZG9pLm9yZy8xMC4xMDE2LzAzMDQtNDA3Nig4Nik5MDA2My0xDQoNCkJveCwgRy4gRS4gUC4sICYgQ294LCBELiBSLiAoMTk2NCkuIEFuIGFuYWx5c2lzIG9mIHRyYW5zZm9ybWF0aW9ucy4gKkpvdXJuYWwgb2YgdGhlIFJveWFsIFN0YXRpc3RpY2FsIFNvY2lldHk6IFNlcmllcyBCIChNZXRob2RvbG9naWNhbCksIDI2KigyKSwgMjExLTI1Mi4gaHR0cHM6Ly9kb2kub3JnLzEwLjExMTEvai4yNTE3LTYxNjEuMTk2NC50YjAwNTUzLngNCg0KQm94LCBHLiBFLiBQLiwgSmVua2lucywgRy4gTS4sIFJlaW5zZWwsIEcuIEMuLCAmIExqdW5nLCBHLiBNLiAoMjAxNSkuICpUaW1lIHNlcmllcyBhbmFseXNpczogRm9yZWNhc3RpbmcgYW5kIGNvbnRyb2wqICg1LsKqIGVkLikuIEpvaG4gV2lsZXkgJiBTb25zLg0KDQpEaWNrZXksIEQuIEEuLCAmIEZ1bGxlciwgVy4gQS4gKDE5NzkpLiBEaXN0cmlidXRpb24gb2YgdGhlIGVzdGltYXRvcnMgZm9yIGF1dG9yZWdyZXNzaXZlIHRpbWUgc2VyaWVzIHdpdGggYSB1bml0IHJvb3QuICpKb3VybmFsIG9mIHRoZSBBbWVyaWNhbiBTdGF0aXN0aWNhbCBBc3NvY2lhdGlvbiwgNzQqKDM2NiksIDQyNy00MzEuIGh0dHBzOi8vZG9pLm9yZy8xMC4xMDgwLzAxNjIxNDU5LjE5NzkuMTA0ODI1MzENCg0KRWZyb24sIEIuICgxOTc5KS4gQm9vdHN0cmFwIG1ldGhvZHM6IEFub3RoZXIgbG9vayBhdCB0aGUgamFja2tuaWZlLiAqVGhlIEFubmFscyBvZiBTdGF0aXN0aWNzLCA3KigxKSwgMS0yNi4gaHR0cHM6Ly9kb2kub3JnLzEwLjEyMTQvYW9zLzExNzYzNDQ1NTINCg0KRW5nbGUsIFIuIEYuICgxOTgyKS4gQXV0b3JlZ3Jlc3NpdmUgY29uZGl0aW9uYWwgaGV0ZXJvc2NlZGFzdGljaXR5IHdpdGggZXN0aW1hdGVzIG9mIHRoZSB2YXJpYW5jZSBvZiBVbml0ZWQgS2luZ2RvbSBpbmZsYXRpb24uICpFY29ub21ldHJpY2EsIDUwKig0KSwgOTg3LTEwMDcuIGh0dHBzOi8vZG9pLm9yZy8xMC4yMzA3LzE5MTI3NzMNCg0KRmFtYSwgRS4gRi4gKDE5NzApLiBFZmZpY2llbnQgY2FwaXRhbCBtYXJrZXRzOiBBIHJldmlldyBvZiB0aGVvcnkgYW5kIGVtcGlyaWNhbCB3b3JrLiAqVGhlIEpvdXJuYWwgb2YgRmluYW5jZSwgMjUqKDIpLCAzODMtNDE3LiBodHRwczovL2RvaS5vcmcvMTAuMjMwNy8yMzI1NDg2DQoNCkZlZGVyYWwgT3BlbiBNYXJrZXQgQ29tbWl0dGVlLiAoMjAyMywgMjYgZGUganVsaW8pLiAqRmVkZXJhbCBSZXNlcnZlIGlzc3VlcyBGT01DIHN0YXRlbWVudCogW0NvbXVuaWNhZG8gZGUgcHJlbnNhXS4gQm9hcmQgb2YgR292ZXJub3JzIG9mIHRoZSBGZWRlcmFsIFJlc2VydmUgU3lzdGVtLiBodHRwczovL3d3dy5mZWRlcmFscmVzZXJ2ZS5nb3YvbmV3c2V2ZW50cy9wcmVzc3JlbGVhc2VzL21vbmV0YXJ5MjAyMzA3MjZhLmh0bQ0KDQpIeW5kbWFuLCBSLiBKLiwgJiBBdGhhbmFzb3BvdWxvcywgRy4gKDIwMjEpLiAqRm9yZWNhc3Rpbmc6IFByaW5jaXBsZXMgYW5kIHByYWN0aWNlKiAoMy7CqiBlZC4pLiBPVGV4dHMuIGh0dHBzOi8vb3RleHRzLmNvbS9mcHAzLw0KDQpIeW5kbWFuLCBSLiBKLiwgJiBLaGFuZGFrYXIsIFkuICgyMDA4KS4gQXV0b21hdGljIHRpbWUgc2VyaWVzIGZvcmVjYXN0aW5nOiBUaGUgZm9yZWNhc3QgcGFja2FnZSBmb3IgUi4gKkpvdXJuYWwgb2YgU3RhdGlzdGljYWwgU29mdHdhcmUsIDI3KigzKSwgMS0yMi4gaHR0cHM6Ly9kb2kub3JnLzEwLjE4NjM3L2pzcy52MDI3LmkwMw0KDQpIeW5kbWFuLCBSLiBKLiwgJiBLb2VobGVyLCBBLiBCLiAoMjAwNikuIEFub3RoZXIgbG9vayBhdCBtZWFzdXJlcyBvZiBmb3JlY2FzdCBhY2N1cmFjeS4gKkludGVybmF0aW9uYWwgSm91cm5hbCBvZiBGb3JlY2FzdGluZywgMjIqKDQpLCA2NzktNjg4LiBodHRwczovL2RvaS5vcmcvMTAuMTAxNi9qLmlqZm9yZWNhc3QuMjAwNi4wMy4wMDENCg0KSmFycXVlLCBDLiBNLiwgJiBCZXJhLCBBLiBLLiAoMTk4NykuIEEgdGVzdCBmb3Igbm9ybWFsaXR5IG9mIG9ic2VydmF0aW9ucyBhbmQgcmVncmVzc2lvbiByZXNpZHVhbHMuICpJbnRlcm5hdGlvbmFsIFN0YXRpc3RpY2FsIFJldmlldywgNTUqKDIpLCAxNjMtMTcyLiBodHRwczovL2RvaS5vcmcvMTAuMjMwNy8xNDAzMTkyDQoNCkt3aWF0a293c2tpLCBELiwgUGhpbGxpcHMsIFAuIEMuIEIuLCBTY2htaWR0LCBQLiwgJiBTaGluLCBZLiAoMTk5MikuIFRlc3RpbmcgdGhlIG51bGwgaHlwb3RoZXNpcyBvZiBzdGF0aW9uYXJpdHkgYWdhaW5zdCB0aGUgYWx0ZXJuYXRpdmUgb2YgYSB1bml0IHJvb3QuICpKb3VybmFsIG9mIEVjb25vbWV0cmljcywgNTQqKDEtMyksIDE1OS0xNzguIGh0dHBzOi8vZG9pLm9yZy8xMC4xMDE2LzAzMDQtNDA3Nig5Mik5MDEwNC1ZDQoNCkxqdW5nLCBHLiBNLiwgJiBCb3gsIEcuIEUuIFAuICgxOTc4KS4gT24gYSBtZWFzdXJlIG9mIGxhY2sgb2YgZml0IGluIHRpbWUgc2VyaWVzIG1vZGVscy4gKkJpb21ldHJpa2EsIDY1KigyKSwgMjk3LTMwMy4gaHR0cHM6Ly9kb2kub3JnLzEwLjEwOTMvYmlvbWV0LzY1LjIuMjk3DQoNCk9wZW5BSS4gKDIwMjIsIDMwIGRlIG5vdmllbWJyZSkuICpJbnRyb2R1Y2luZyBDaGF0R1BUKi4gaHR0cHM6Ly9vcGVuYWkuY29tL2Jsb2cvY2hhdGdwdA0KDQpQZmFmZiwgQi4gKDIwMDgpLiAqQW5hbHlzaXMgb2YgaW50ZWdyYXRlZCBhbmQgY29pbnRlZ3JhdGVkIHRpbWUgc2VyaWVzIHdpdGggUiogKDIuwqogZWQuKS4gU3ByaW5nZXIuIGh0dHBzOi8vZG9pLm9yZy8xMC4xMDA3Lzk3OC0wLTM4Ny03NTk2Ny04DQoNClBpY2hhaSwgUy4sICYgSGFzc2FiaXMsIEQuICgyMDIzLCA2IGRlIGRpY2llbWJyZSkuICpJbnRyb2R1Y2luZyBHZW1pbmk6IE91ciBsYXJnZXN0IGFuZCBtb3N0IGNhcGFibGUgQUkgbW9kZWwqLiBHb29nbGUuIGh0dHBzOi8vYmxvZy5nb29nbGUvdGVjaG5vbG9neS9haS9nb29nbGUtZ2VtaW5pLWFpLw0KDQpSIENvcmUgVGVhbS4gKDIwMjQpLiAqUjogQSBsYW5ndWFnZSBhbmQgZW52aXJvbm1lbnQgZm9yIHN0YXRpc3RpY2FsIGNvbXB1dGluZyouIFIgRm91bmRhdGlvbiBmb3IgU3RhdGlzdGljYWwgQ29tcHV0aW5nLiBodHRwczovL3d3dy5SLXByb2plY3Qub3JnLw0KDQpSeWFuLCBKLiBBLiwgJiBVbHJpY2gsIEouIE0uICgyMDI0KS4gKnF1YW50bW9kOiBRdWFudGl0YXRpdmUgZmluYW5jaWFsIG1vZGVsbGluZyBmcmFtZXdvcmsqIChQYXF1ZXRlIGRlIFIpLiBodHRwczovL0NSQU4uUi1wcm9qZWN0Lm9yZy9wYWNrYWdlPXF1YW50bW9kDQoNClNoYXBpcm8sIFMuIFMuLCAmIFdpbGssIE0uIEIuICgxOTY1KS4gQW4gYW5hbHlzaXMgb2YgdmFyaWFuY2UgdGVzdCBmb3Igbm9ybWFsaXR5IChjb21wbGV0ZSBzYW1wbGVzKS4gKkJpb21ldHJpa2EsIDUyKigzLTQpLCA1OTEtNjExLiBodHRwczovL2RvaS5vcmcvMTAuMTA5My9iaW9tZXQvNTIuMy00LjU5MQ0KDQpUcmFwbGV0dGksIEEuLCAmIEhvcm5paywgSy4gKDIwMjQpLiAqdHNlcmllczogVGltZSBzZXJpZXMgYW5hbHlzaXMgYW5kIGNvbXB1dGF0aW9uYWwgZmluYW5jZSogKFBhcXVldGUgZGUgUikuIGh0dHBzOi8vQ1JBTi5SLXByb2plY3Qub3JnL3BhY2thZ2U9dHNlcmllcw0KDQoqVW5pdGVkIFN0YXRlcyB2LiBHb29nbGUgTExDKiwgTm8uIDE6MjAtY3YtMDMwMTAgKEQuRC5DLiA1IGRlIGFnb3N0byBkZSAyMDI0KS4NCg0KV2lja2hhbSwgSC4gKDIwMTYpLiAqZ2dwbG90MjogRWxlZ2FudCBncmFwaGljcyBmb3IgZGF0YSBhbmFseXNpcyouIFNwcmluZ2VyLiBodHRwczovL2dncGxvdDIudGlkeXZlcnNlLm9yZw0KDQpZYWhvbyBGaW5hbmNlLiAocy4gZi4pLiAqQWxwaGFiZXQgSW5jLiAoR09PR0wpIGhpc3RvcmljYWwgZGF0YSouIFJlY3VwZXJhZG8gZWwgMjIgZGUgb2N0dWJyZSBkZSAyMDI2LCBkZSBodHRwczovL2ZpbmFuY2UueWFob28uY29tL3F1b3RlL0dPT0dML2hpc3Rvcnk=