Introducción

En este documento veremos aspectos básicos del manejo de datos, como la recodificación de una variable, la selección de datos y el cálculo de una nueva variable. Al final incluímos una nota acerca de los cálculos estadísticos considerando el efecto de diseño.

Sobre la base de datos

Los datos que vamos a usar deben citarse de la siguiente manera: Fuente: Barómetro de las Américas por el Proyecto de Opinión Pública de América Latina (LAPOP), wwww.LapopSurveys.org.

En este documento cargamos una base que se encuentra alojada en el repositorio “materials_edu” de la cuenta de LAPOP en GitHub. Mediante la librería rio y el comando import se puede importar esta base de datos desde este repositorio, usando el siguiente código. Importamos la base de datos en un objeto “lapop21”. Esta base de datos tiene extensión .RData y cuando se importa, carga las variables como del tipo double (“dbl”), que es un tipo de variable numérica que acepta decimales, a diferencia del tipo integer, “int”, que solo acepta enteros.

library(rio)
lapop21 = import("https://raw.github.com/lapop-central/materials_edu/main/lapop21.RData")

En este repositorio también se encuentra la base de datos de la ronda anterior, la que también podemos cargar y llamarla “lapop18”. Es necesario aclarar que esta base de datos, importada desde un archivo SPSS, carga las variables como del tipo numéricas (“num”) que para fines prácticos es igual al formato doble (“dbl”).

lapop18 = import("https://raw.github.com/lapop-central/materials_edu/main/LAPOP_AB_Merge_2018_v1.0.sav")

Recodificación de una variable

En esta sección usaremos el reporte “El Pulso de la Democracia”, con los resultados de la última ronda 2021 del Barómetro de las Américas, disponible aquí. Este reporte presenta los resultados acerca del apoyo a la democracia en las Américas. Estos resultados se basan en la variable ING4 de la base de datos. Esta variable está fraseada de la siguiente manera:

ING4. Cambiando de nuevo de tema, puede que la democracia tenga problemas, pero es mejor que cualquier otra forma de gobierno. ¿Hasta qué punto está de acuerdo o en desacuerdo con esta frase?

Esta variable está medida en una escala del 1 a 7, donde 1 significa “muy en desacuerdo” y 7 significa “muy de acuerdo”. Luego, los valores entre 5 a 7 son recodificados como apoyo a la democracia. Para ver la distribución de respuestas a esta variable, podemos usar el comando table.

table(lapop21$ing4)
## 
##     1     2     3     4     5     6     7 
##  5704  2567  4980  8177 13886  8390 16759

De esta manera calculamos las observaciones (frecuencias absolutas) por cada valor de la variable. Para calcular el porcentaje de personas que apoya a la democracia tenemos que recodificar esta variable y crear una nueva. Es decir, la variable original ING4, en una escala de 1-7, la recodificamos en una nueva variable, siguiendo la siguiente regla:

  1. Valores entre 1-4 de ING4 se transforman en 0 en una nueva variable ing4r
  2. Valores entre 5-7 de ING4 se transformen en 1 en una nueva variable ing4r

Un ejemplo de cómo se presentan estos datos recodificados en el reporte se puede ver en el Gráfico 1.1. Este muestra el porcentaje de ciudadanos que apoya a la democracia por país. Es decir, se muestra el porcentaje de entrevistados que respondieron entre 5 y 7 a la pregunta ING4 en cada país. De acuerdo a la recodificación planteada, este gráfico representaría el porcentaje de entrevistados que registra un 1 en la variable recodificada.

En el informe El Pulso de la Democracia de la ronda 2018/19, disponible aquí, también se presenta un gráfico similar, usando la misma variable y la misma regla de recodificacíon.

Para recodificar una variable en R hay varias formas. Una de las formas más eficientes de hacerlo es usando el comando recode del paquete car. El paquete dplyr tiene un comando recode que puede confundir a R. Para evitar confusiones usaremos la sintaxis car::recode para la recodificación, es decir para especificar que se use el comando recodedel paquete car y no de otro. Guardamos la variable recodificada como “lapop21$ing4rec (es decir, creamos una nueva variable o vector en el dataframe). Luego, usamos el comando table para describir esta nueva variable.

library(car)
lapop21$ing4rec = car::recode(lapop21$ing4, "1:4=0; 5:7=1")
table(lapop21$ing4rec)
## 
##     0     1 
## 21428 39035

Si sumamos las observaciones entre 1 y 4 de la variable original (5704+2567+4980+8177), vemos que es el resultado que tenemos en el valor 0 de la nueva variable (21428), tal como planteamos en la recodificación. También debemos notar que la base de datos en el Environment ahora tiene una variable más, totalizando 1826 variables.

Selección de casos

El gráfico 1.1 muestra que el apoyo a la democracia va de un máximo de 80% en Uruguay a un mínimo de 46% en Haití. Para replicar el resultado correspondiente a Uruguay podemos seleccionar las observaciones de ese país. De acuerdo a la codificación de la variable “pais”, Uruguay tiene el código 14.

La selección de casos en R se puede hacer de múltiples maneras. Una forma es usar los corchetes […]. Otra forma es usando el comando subset. Con este comando seleccionamos las observaciones de este país y guardamos esta selección en un nuevo dataframe “lapop2” usando este último comando. Se tiene 3009 observaciones en Uruguay.

lapop1 = subset(lapop21, pais==14)
table(lapop1$pais)
## 
##   14 
## 3009

Con esta selección de datos, podemos calcular el porcentaje (frecuencias relativas) usando el comando prop.table. Este comando nos brinda las frecuencias relativas (en valores entre 0 y 1) de una tabla de frecuencias calculada con table. Estas frecuencias relativas se multiplican por 100 para reproducir el porcentaje en cada país. En este caso ya no requerimos usar los […] para hacer la selección porque el dataframe “lapop1” guarda los datos seleccionados de Uruguay.

prop.table(table(lapop1$ing4rec))*100
## 
##        0        1 
## 15.47499 84.52501

Estos resultados son porcentajes (entre 0 y 100), pero incluyen muchos decimales. Para redondear a un decimal, como se muestra en el Gráfico 1.2, podemos usar el comando round, donde anidamos toda la sintaxis anterior. En este comando, además, tenemos que especificar el número de decimales que se quiere, que en este caso es 1.

round(prop.table(table(lapop1$ing4rec))*100, 1)
## 
##    0    1 
## 15.5 84.5

Según este resultado 84.5% de uruguayos apoya a la democracia. Este resultado es distinto al que se reporta en el gráfico 1.1, donde el valor reportado es 80%. Esta diferencia es debido a que estos primeros procedimientos no incluyen el efecto de diseño. Más abajo veremos el procedimiento para reproducir el resultado exacto reportado.

En el reporte de la ronda 2018/19 el reporte indica que “El Gráfico 1.2 muestra el porcentaje de personas en cada país que expresa apoyar la democracia en 2018/19. El apoyo a la democracia va de un mínimo de 45% en Honduras a un máximo de 76.2% en Uruguay” (p.11).

Para replicar estos resultados acerca de Honduras y de Uruguay para 2018/19, podemos seleccionar los datos de estos dos países. De acuerdo al cuestionario, que se puede ver aquí, Honduras es el país 4 y Uruguay es el país 14 de la variable “pais”, que también se ha importando como una variable numérica.

Se incluye el operador “o”, que en R se denota con “|”. De esta manera se indica que se selecciones las observaciones de Honduras o de Uruguay (pais==4 | pais==14). La descripción de la variable “pais” muestra que solo incluye los casos de Honduras (2) y Uruguay (14).

# lapop2 <- lapop18[lapop18$pais == 4 | lapop18$pais==14, ]
lapop2 = subset(lapop18, pais==4 | pais==14)
table(lapop2$pais)
## 
##    4   14 
## 1560 1581

El nuevo dataframe “lapop2” tiene 3141 observaciones y 84 variables debido a que no hemos creado la variable recodificada.

lapop2$ing4rec = car::recode(lapop2$ing4, "1:4=0; 5:7=1")

Con esta variable podemos seguir los mismos procedimientos anteriormente descritos para producir la tabla de frecuencias relativas. Como este dataframe tiene los datos de dos países, aquí si podemos usar los […] para especificar que queremos una tabla de Uruguay y de Honduras.

prop.table(table(lapop2$ing4rec[lapop2$pais==4]))*100
## 
##        0        1 
## 54.98995 45.01005
prop.table(table(lapop2$ing4rec[lapop2$pais==14]))*100
## 
##        0        1 
## 23.80641 76.19359

Y luego podemos incluir el redondeo.

round(prop.table(table(lapop2$ing4rec[lapop2$pais==4]))*100, 1)
## 
##  0  1 
## 55 45
round(prop.table(table(lapop2$ing4rec[lapop2$pais==14]))*100, 1)
## 
##    0    1 
## 23.8 76.2

Con este código hemos reproducido los resultados de los países en los extremos del Gráfico 1.2 del reporte. En este caso, los resultados sí son similares a los reportados en el gráfico.

Ambos reportes también indican que se excluye de los cálculos a Estados Unidos y Canadá. La base de datos cargada como “lapop18” incluye a todos los países de la ronda. Para excluir a estos dos países, tenemos que seleccionar los países que NO son EE.UU. y Canadá. Esta nueva selección la guardamos en un nuevo dataframe o se puede sobreescribir en el dataframe original, como se hace en este caso debido a que la exclusión de estos países es para todos los cálculos que siguen. De acuerdo al cuestionario, EE.UU. tiene el código 40 y Canadá, el código 41 en la variable “pais”. Para excluirlos tenemos que incluir a los países que tengan un código menor a 40 (o de 35 o menos). Para esto nuevamente podemos usar el comando subset.

lapop18 = subset(lapop18, pais<=35)

Podemos observar en el Environment que se reducen las observaciones del dataframe “lapop18” luego de correr este código, pues hemos eliminado las observaciones de entrevistados en estos dos países. El número de observaciones pasa de 31,050 a 28,042, número que coincide con el de la base de datos en formato .RData que no incluía a estos países.

De la misma manera podemos proceder en la base de datos de la ronda 2021, con lo que disminuyen las observaciones a 60661.

lapop21 = subset(lapop21, pais<=35)

Calcular una variable

Una práctica frecuente de LAPOP con los datos del Barómetro de las Américas es el re-escalamiento de variables. El capítulo sobre legitimidad democrática del reporte brinda ejemplos de este re-escalamiento con variables relacionadas al apoyo al sistema. Para calcular este índice de apoyo al sistema se trabaja con un conjunto de cinco variables:

B1. ¿Hasta qué punto cree usted que los tribunales de justicia de (país) garantizan un juicio justo?

B2. ¿Hasta qué punto tiene usted respeto por las instituciones políticas de (país)?

B3. ¿Hasta qué punto cree usted que los derechos básicos del ciudadano están bien protegidos por el sistema político de (país)?

B4. ¿Hasta qué punto se siente orgulloso de vivir bajo el sistema político de (país)?

B6. ¿Hasta qué punto piensa usted que se debe apoyar al sistema político de (país)?

Como indica el reporte “Para cada pregunta, la escala original de 1 (”Nada”) a 7 (“Mucho”) se recodifica en una escala de 0 a 100, de tal forma que 0 indica el menor nivel de apoyo al sistema político y 100 es el nivel máximo de apoyo al sistema político. Esta nueva escala sigue la recodificación típica de LAPOP y puede ser interpretada como una medición del apoyo en unidades, o grados, en una escala continua que va de 0 a 100” (p.34). Para comprobar la escala original de estas variables, se puede describir estas variables usando el comando table.

table(lapop18$b1)
## 
##    1    2    3    4    5    6    7 
## 4089 4067 5881 6137 4215 1631 1371
table(lapop18$b2)
## 
##    1    2    3    4    5    6    7 
## 2861 2152 2998 4153 5182 4448 5679
table(lapop18$b3)
## 
##    1    2    3    4    5    6    7 
## 5080 4096 5153 5349 4219 2061 1491
table(lapop18$b4)
## 
##    1    2    3    4    5    6    7 
## 5095 3206 3743 4557 4326 3041 3584
table(lapop18$b6)
## 
##    1    2    3    4    5    6    7 
## 3713 2325 2971 4277 4616 3868 5572

Observamos que efectivamente todas las variables están en una escala de 1 a 7. Para reescalar una variable en una escala original de 1 a 7 a otra de 0 a 100, lo primero que tenemos que hacer es restar 1 unidad, con lo que la variable tendría una escala de 0 a 6, luego dividirla entre 6, con lo que variaría entre 0 y 1 y, finalmente, multiplicarla por 100. Esto es:

Variable reescalada = ((variable original -1)/6)*100

lapop18$b1rec = ((lapop18$b1-1)/6)*100
lapop18$b2rec = ((lapop18$b2-1)/6)*100
lapop18$b3rec = ((lapop18$b3-1)/6)*100
lapop18$b4rec = ((lapop18$b4-1)/6)*100
lapop18$b6rec = ((lapop18$b6-1)/6)*100
table(lapop18$b1rec)
## 
##                0 16.6666666666667 33.3333333333333               50 
##             4089             4067             5881             6137 
## 66.6666666666667 83.3333333333333              100 
##             4215             1631             1371

Con esta transformación observamos que los 4,089 entrevistados que marcaron 1 en la pregunta B1, ahora tienen un puntaje de 0. Los 4,067 que marcaron 2, ahora tienen un puntaje de 16.67, es decir 2-1=1/6=0.1667*100=16.67. Esta misma operación se pudo hacer con el comando car::recode, siguiendo la siguiente regla de recodificación:

  • Valor de 1 en variable original se recodifica como 0 en nueva variable
  • Valor de 2 en variable original se recodifica como 16.67 en nueva variable
  • Valor de 3 en variable original se recodifica como 33.33 en nueva variable
  • Valor de 4 en variable original se recodifica como 50 en nueva variable
  • Valor de 5 en variable original se recodifica como 66.67 en nueva variable
  • Valor de 6 en variable original se recodifica como 83.33 en nueva variable
  • Valor de 7 en variable original se recodifica como 100 en nueva variable

Esta manera de recodificar, sin embargo, es poco eficiente. Es más simple usar la fórmula para calcular la recodificación.

Para calcular el índice de apoyo al sistema, el reporte indica que “El índice de apoyo al sistema es el promedio de cinco preguntas: B1, B2, B3, B4 y B6” (p.46). Es decir, con las variables reescaladas tenemos que calcular el promedio de estas cinco variables para cada individuo (es decir, en cada fila de la base de datos). Podríamos calcular esta operación del promedio de forma manual.

Apoyo al sistema = (b1rec + b2rec + b3rec + b4rec + b6rec)/5

En R tenemos el comando rowMeans que sirva para calcular promedios de ciertas columnas por cada fila. La sintaxis [, 86:90] indica que realizaremos el cálculo del promedio por filas para todas las filas y usando las columnas 86 a 90 del dataframe “lapop18” (podríamos hacer el cálculo para algunas filas en particular definiendo [fila_n:fila_m, 86:90]). Este promedio lo guardamos en una nueva variable “apoyo”, que describimos.

lapop18$apoyo = rowMeans(lapop18[,85:89])
table(lapop18$apoyo)
## 
##                0 3.33333333333333 6.66666666666667               10 
##              634              368              439              525 
## 13.3333333333333 16.6666666666667               20 23.3333333333333 
##              527              550              834              745 
## 26.6666666666667               30 33.3333333333333 36.6666666666667 
##              810              911             1063             1086 
##               40 43.3333333333333 46.6666666666667               50 
##             1287             1317             1254             1487 
## 53.3333333333333 56.6666666666667               60 63.3333333333333 
##             1397             1408             1449             1243 
## 66.6666666666667               70 73.3333333333333 76.6666666666667 
##             1227             1113              988              827 
##               80 83.3333333333333 86.6666666666667               90 
##              820              572              445              369 
## 93.3333333333333 96.6666666666667              100 
##              245              131              210

Con este índice podemos calcular el apoyo al sistema promedio para la última ronda del Barómetro de las Américas, así como los promedios de cada una de las variables que componen el índice. Usamos el comando mean para el promedio y la especificación na.rm=T para indicarle al comando que no tome en cuenta los valores perdidos de estas variables. Veremos estos estadísticos en más detalle en otras secciones.

mean(lapop18$apoyo, na.rm=T)
## [1] 48.79419
mean(lapop18$b1rec, na.rm=T) #Cortes garantizan juicio justo
## [1] 41.06032
mean(lapop18$b2rec, na.rm=T) #Respeto a las instituciones
## [1] 59.23937
mean(lapop18$b3rec, na.rm=T) #Derechos básicos están protegidos
## [1] 40.42406
mean(lapop18$b4rec, na.rm=T) #Orgullos por el sistema político
## [1] 47.41096
mean(lapop18$b6rec, na.rm=T) #Se debería apoyar al sistema político
## [1] 56.28337

Estos resultados son los que se muestran en el Gráfico 2.1 para la ronda 2018/19.

Calcular una variable de manera condicional

En algunas ocasiones el cálculo de una variable no requiere solamente la transformación numérica de la variable original, sino que los valores de la nueva variable dependen de valores de otras variables. Por ejemplo, el capítulo “Redes sociales y actitudes políticas” del reporte “El Pulso de la Democracia” de la ronda 2018/19 presenta los resultados para las variables “usuario de Whatsapp”, “usuario de Twitter” y “usuario de Facebook”. Para calcular estas variables, el pie de página 7 de este capítulo indica: “Para cada plataforma, se identifican los usuarios con una combinación de dos conjuntos de preguntas. Primero, se identifican como usuarios a quienes responden positivamente a las preguntas, SMEDIA1/SMEDIA4/SMEDIA7. ¿Tiene usted cuenta de Facebook/Twitter/Whatsapp? Luego, se recodifica como no usuario a quienes responden”nunca” a las preguntas siguientes, SMEDIA2/SMEDIA5/SMEDIA8. ¿Con qué frecuencia ve contenido en Facebook/Twitter/Whatsapp?” (p. 64).

Es decir, el usuario no solo es el que tiene una cuenta (SMEDIA1=1), sino el que la usa con cierta frecuencia (SMEDIA2=1, 2, 3, 4). De esta manera, el no usuario puede tener una cuenta, pero nunca usarla. Por lo tanto, la variable “usuario” depende de los valores de 2 variables. La regla de codificación que se sigue es:

  • Usuario de Facebook = 1 (sí es usuario) si SMEDIA1 = 1 (tiene cuenta) y SMEDIA2 <= 4 (la usa con alguna frecuencia)

  • Usuario de Facebook = 0 (no es usuario) si SMEDIA2 = 2 (no tiene cuenta) o SMEDIA2 = 5 (tiene cuenta pero nunca la usa)

Producimos esta regla de codificación con la siguiente sintaxis de R, que usa el comando ifelse. Esta sintaxis incluye la condición para asignar valores de 1 a una nueva variable y asigna a todas las demás observaciones el valor de 0. Describimos estas nuevas variables usando los comandos table para generar las frecuencias absolutas, prop.table para las frecuencias relativas y round para redondear los decimales. Estos comandos los veremos en más detalle en las siguientes secciones.

lapop18$fb_user = ifelse(lapop18$smedia1==1 & lapop18$smedia2<=4, 1, 0)
lapop18$tw_user = ifelse(lapop18$smedia4==1 & lapop18$smedia5<=4, 1, 0)
lapop18$wa_user = ifelse(lapop18$smedia7==1 & lapop18$smedia8<=4, 1, 0)
round(prop.table(table(lapop18$fb_user))*100, 1)
## 
##    0    1 
## 43.8 56.2
round(prop.table(table(lapop18$tw_user))*100, 1)
## 
##    0    1 
## 92.1  7.9
round(prop.table(table(lapop18$wa_user))*100, 1)
## 
##    0    1 
## 35.8 64.2

Estos resultados son los que se presentan en el Gráfico 3.1 del reporte en forma de gráficos circulares. Veremos este tipo de gráficos en la siguiente sección.

Observación del efecto de diseño

Tanto los resultados para apoyo al sistema, como los de usuarios de redes sociales difieren de los que aparecen en el reporte por dos motivos. En primer lugar, para apoyo al sistema, debido a que “Los valores a lo largo del tiempo se calculan incluyendo únicamente los países que el Barómetro de las Américas ha estudiado regularmente desde 2006: Argentina, Brasil, Bolivia, Chile, Colombia, Costa Rica, República Dominicana, Ecuador, El Salvador, Guatemala, Honduras, Jamaica, México, Nicaragua, Panamá, Paraguay, Perú, Uruguay” (p.46). El código solo filtra la última ronda, que incluye países que no están en esa lista, como Estados Unidos o Canadá. De otro lado, los cálculos reportados en la publicación incluyen el uso de factores de ponderación, que no hemos incluido en estos cálculos, pero que en otros documentos incorporaremos (ver aquí).

Resumen

En este documento hemos visto los elementos básicos de la manipulación y transformación de datos usando el Barómetro de las Américas. Hemos recodificado una variable usando el comando recode, hemos seleccionado casos usando subset y hemos calculado una nueva variable algebraicamente y con el comando ifelse.

LS0tCnRpdGxlOiAiTWFuZWpvIGRlIGRhdG9zIHVzYW5kbyBlbCBCYXLDs21ldHJvIGRlIGxhcyBBbcOpcmljYXMiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIGNvbGxhcHNlZDogZmFsc2UKICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UKICAgIHRvY19kZXB0aDogMQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgdGhlbWU6IGZsYXRseQogICAgI2NvZGVfZm9sZGluZzogaGlkZQplZGl0b3Jfb3B0aW9uczogCiAgbWFya2Rvd246IAogICAgd3JhcDogc2VudGVuY2UKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRSwgY2FjaGU9VFJVRSkKYGBgCgpgYGB7Y3NzIGNvbG9yLCBlY2hvPUZBTFNFfQouY29sdW1ucyB7ZGlzcGxheTogZmxleDt9CmgxIHtjb2xvcjogIzMzNjZDQzt9CmBgYAoKIyBJbnRyb2R1Y2Npw7NuCgpFbiBlc3RlIGRvY3VtZW50byB2ZXJlbW9zIGFzcGVjdG9zIGLDoXNpY29zIGRlbCBtYW5lam8gZGUgZGF0b3MsIGNvbW8gbGEgcmVjb2RpZmljYWNpw7NuIGRlIHVuYSB2YXJpYWJsZSwgbGEgc2VsZWNjacOzbiBkZSBkYXRvcyB5IGVsIGPDoWxjdWxvIGRlIHVuYSBudWV2YSB2YXJpYWJsZS4KQWwgZmluYWwgaW5jbHXDrW1vcyB1bmEgbm90YSBhY2VyY2EgZGUgbG9zIGPDoWxjdWxvcyBlc3RhZMOtc3RpY29zIGNvbnNpZGVyYW5kbyBlbCBlZmVjdG8gZGUgZGlzZcOxby4KCiMgU29icmUgbGEgYmFzZSBkZSBkYXRvcwoKTG9zIGRhdG9zIHF1ZSB2YW1vcyBhIHVzYXIgZGViZW4gY2l0YXJzZSBkZSBsYSBzaWd1aWVudGUgbWFuZXJhOiBGdWVudGU6IEJhcsOzbWV0cm8gZGUgbGFzIEFtw6lyaWNhcyBwb3IgZWwgUHJveWVjdG8gZGUgT3BpbmnDs24gUMO6YmxpY2EgZGUgQW3DqXJpY2EgTGF0aW5hIChMQVBPUCksIHd3d3cuTGFwb3BTdXJ2ZXlzLm9yZy4KCkVuIGVzdGUgZG9jdW1lbnRvIGNhcmdhbW9zIHVuYSBiYXNlIHF1ZSBzZSBlbmN1ZW50cmEgYWxvamFkYSBlbiBlbCByZXBvc2l0b3JpbyAibWF0ZXJpYWxzX2VkdSIgZGUgbGEgY3VlbnRhIGRlIExBUE9QIGVuIEdpdEh1Yi4KTWVkaWFudGUgbGEgbGlicmVyw61hIGByaW9gIHkgZWwgY29tYW5kbyBgaW1wb3J0YCBzZSBwdWVkZSBpbXBvcnRhciBlc3RhIGJhc2UgZGUgZGF0b3MgZGVzZGUgZXN0ZSByZXBvc2l0b3JpbywgdXNhbmRvIGVsIHNpZ3VpZW50ZSBjw7NkaWdvLgpJbXBvcnRhbW9zIGxhIGJhc2UgZGUgZGF0b3MgZW4gdW4gb2JqZXRvICJsYXBvcDIxIi4KRXN0YSBiYXNlIGRlIGRhdG9zIHRpZW5lIGV4dGVuc2nDs24gLlJEYXRhIHkgY3VhbmRvIHNlIGltcG9ydGEsIGNhcmdhIGxhcyB2YXJpYWJsZXMgY29tbyBkZWwgdGlwbyBkb3VibGUgKCJkYmwiKSwgcXVlIGVzIHVuIHRpcG8gZGUgdmFyaWFibGUgbnVtw6lyaWNhIHF1ZSBhY2VwdGEgZGVjaW1hbGVzLCBhIGRpZmVyZW5jaWEgZGVsIHRpcG8gaW50ZWdlciwgImludCIsIHF1ZSBzb2xvIGFjZXB0YSBlbnRlcm9zLgoKYGBge3IgYmFzZTIxLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KHJpbykKbGFwb3AyMSA9IGltcG9ydCgiaHR0cHM6Ly9yYXcuZ2l0aHViLmNvbS9sYXBvcC1jZW50cmFsL21hdGVyaWFsc19lZHUvbWFpbi9sYXBvcDIxLlJEYXRhIikKYGBgCgpFbiBlc3RlIHJlcG9zaXRvcmlvIHRhbWJpw6luIHNlIGVuY3VlbnRyYSBsYSBiYXNlIGRlIGRhdG9zIGRlIGxhIHJvbmRhIGFudGVyaW9yLCBsYSBxdWUgdGFtYmnDqW4gcG9kZW1vcyBjYXJnYXIgeSBsbGFtYXJsYSAibGFwb3AxOCIuCkVzIG5lY2VzYXJpbyBhY2xhcmFyIHF1ZSBlc3RhIGJhc2UgZGUgZGF0b3MsIGltcG9ydGFkYSBkZXNkZSB1biBhcmNoaXZvIFNQU1MsIGNhcmdhIGxhcyB2YXJpYWJsZXMgY29tbyBkZWwgdGlwbyBudW3DqXJpY2FzICgibnVtIikgcXVlIHBhcmEgZmluZXMgcHLDoWN0aWNvcyBlcyBpZ3VhbCBhbCBmb3JtYXRvIGRvYmxlICgiZGJsIikuCgpgYGB7ciBiYXNlMTh9CmxhcG9wMTggPSBpbXBvcnQoImh0dHBzOi8vcmF3LmdpdGh1Yi5jb20vbGFwb3AtY2VudHJhbC9tYXRlcmlhbHNfZWR1L21haW4vTEFQT1BfQUJfTWVyZ2VfMjAxOF92MS4wLnNhdiIpCmBgYAoKIyBSZWNvZGlmaWNhY2nDs24gZGUgdW5hIHZhcmlhYmxlCgpFbiBlc3RhIHNlY2Npw7NuIHVzYXJlbW9zIGVsIHJlcG9ydGUgIkVsIFB1bHNvIGRlIGxhIERlbW9jcmFjaWEiLCBjb24gbG9zIHJlc3VsdGFkb3MgZGUgbGEgw7psdGltYSByb25kYSAyMDIxIGRlbCBCYXLDs21ldHJvIGRlIGxhcyBBbcOpcmljYXMsIGRpc3BvbmlibGUgW2FxdcOtXShodHRwczovL3d3dy52YW5kZXJiaWx0LmVkdS9sYXBvcC9hYjIwMjEvMjAyMV9MQVBPUF9BbWVyaWNhc0Jhcm9tZXRlcl9QdWxzZV9vZl9EZW1vY3JhY3kucGRmKS4KRXN0ZSByZXBvcnRlIHByZXNlbnRhIGxvcyByZXN1bHRhZG9zIGFjZXJjYSBkZWwgYXBveW8gYSBsYSBkZW1vY3JhY2lhIGVuIGxhcyBBbcOpcmljYXMuCkVzdG9zIHJlc3VsdGFkb3Mgc2UgYmFzYW4gZW4gbGEgdmFyaWFibGUgSU5HNCBkZSBsYSBiYXNlIGRlIGRhdG9zLgpFc3RhIHZhcmlhYmxlIGVzdMOhIGZyYXNlYWRhIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6CgoqKklORzQuKiogKkNhbWJpYW5kbyBkZSBudWV2byBkZSB0ZW1hLCBwdWVkZSBxdWUgbGEgZGVtb2NyYWNpYSB0ZW5nYSBwcm9ibGVtYXMsIHBlcm8gZXMgbWVqb3IgcXVlIGN1YWxxdWllciBvdHJhIGZvcm1hIGRlIGdvYmllcm5vLiDCv0hhc3RhIHF1w6kgcHVudG8gZXN0w6EgZGUgYWN1ZXJkbyBvIGVuIGRlc2FjdWVyZG8gY29uIGVzdGEgZnJhc2U/KgoKRXN0YSB2YXJpYWJsZSBlc3TDoSBtZWRpZGEgZW4gdW5hIGVzY2FsYSBkZWwgMSBhIDcsIGRvbmRlIDEgc2lnbmlmaWNhICJtdXkgZW4gZGVzYWN1ZXJkbyIgeSA3IHNpZ25pZmljYSAibXV5IGRlIGFjdWVyZG8iLgpMdWVnbywgbG9zIHZhbG9yZXMgZW50cmUgNSBhIDcgc29uIHJlY29kaWZpY2Fkb3MgY29tbyBhcG95byBhIGxhIGRlbW9jcmFjaWEuClBhcmEgdmVyIGxhIGRpc3RyaWJ1Y2nDs24gZGUgcmVzcHVlc3RhcyBhIGVzdGEgdmFyaWFibGUsIHBvZGVtb3MgdXNhciBlbCBjb21hbmRvIGB0YWJsZWAuCgpgYGB7ciBkZXNjcmliaXIgaW5nNH0KdGFibGUobGFwb3AyMSRpbmc0KQpgYGAKCkRlIGVzdGEgbWFuZXJhIGNhbGN1bGFtb3MgbGFzIG9ic2VydmFjaW9uZXMgKGZyZWN1ZW5jaWFzIGFic29sdXRhcykgcG9yIGNhZGEgdmFsb3IgZGUgbGEgdmFyaWFibGUuClBhcmEgY2FsY3VsYXIgZWwgcG9yY2VudGFqZSBkZSBwZXJzb25hcyBxdWUgYXBveWEgYSBsYSBkZW1vY3JhY2lhIHRlbmVtb3MgcXVlIHJlY29kaWZpY2FyIGVzdGEgdmFyaWFibGUgeSBjcmVhciB1bmEgbnVldmEuCkVzIGRlY2lyLCBsYSB2YXJpYWJsZSBvcmlnaW5hbCBJTkc0LCBlbiB1bmEgZXNjYWxhIGRlIDEtNywgbGEgcmVjb2RpZmljYW1vcyBlbiB1bmEgbnVldmEgdmFyaWFibGUsIHNpZ3VpZW5kbyBsYSBzaWd1aWVudGUgcmVnbGE6CgoxLiAgVmFsb3JlcyBlbnRyZSAxLTQgZGUgSU5HNCBzZSB0cmFuc2Zvcm1hbiBlbiAwIGVuIHVuYSBudWV2YSB2YXJpYWJsZSBpbmc0cgoyLiAgVmFsb3JlcyBlbnRyZSA1LTcgZGUgSU5HNCBzZSB0cmFuc2Zvcm1lbiBlbiAxIGVuIHVuYSBudWV2YSB2YXJpYWJsZSBpbmc0cgoKVW4gZWplbXBsbyBkZSBjw7NtbyBzZSBwcmVzZW50YW4gZXN0b3MgZGF0b3MgcmVjb2RpZmljYWRvcyBlbiBlbCByZXBvcnRlIHNlIHB1ZWRlIHZlciBlbiBlbCBHcsOhZmljbyAxLjEuCkVzdGUgbXVlc3RyYSBlbCBwb3JjZW50YWplIGRlIGNpdWRhZGFub3MgcXVlIGFwb3lhIGEgbGEgZGVtb2NyYWNpYSBwb3IgcGHDrXMuCkVzIGRlY2lyLCBzZSBtdWVzdHJhIGVsIHBvcmNlbnRhamUgZGUgZW50cmV2aXN0YWRvcyBxdWUgcmVzcG9uZGllcm9uIGVudHJlIDUgeSA3IGEgbGEgcHJlZ3VudGEgSU5HNCBlbiBjYWRhIHBhw61zLgpEZSBhY3VlcmRvIGEgbGEgcmVjb2RpZmljYWNpw7NuIHBsYW50ZWFkYSwgZXN0ZSBncsOhZmljbyByZXByZXNlbnRhcsOtYSBlbCBwb3JjZW50YWplIGRlIGVudHJldmlzdGFkb3MgcXVlIHJlZ2lzdHJhIHVuIDEgZW4gbGEgdmFyaWFibGUgcmVjb2RpZmljYWRhLgoKIVtdKEdyYWZpY28xLjEucG5nKQoKRW4gZWwgaW5mb3JtZSBFbCBQdWxzbyBkZSBsYSBEZW1vY3JhY2lhIGRlIGxhIHJvbmRhIDIwMTgvMTksIGRpc3BvbmlibGUgW2FxdcOtXShodHRwczovL3d3dy52YW5kZXJiaWx0LmVkdS9sYXBvcC9hYjIwMTgvMjAxOC0xOV9BbWVyaWNhc0Jhcm9tZXRlcl9SZWdpb25hbF9SZXBvcnRfU3BhbmlzaF9XXzAzLjI3LjIwLnBkZiksIHRhbWJpw6luIHNlIHByZXNlbnRhIHVuIGdyw6FmaWNvIHNpbWlsYXIsIHVzYW5kbyBsYSBtaXNtYSB2YXJpYWJsZSB5IGxhIG1pc21hIHJlZ2xhIGRlIHJlY29kaWZpY2Fjw61vbi4KCiFbXShHcmFmMS4yLnBuZyl7d2lkdGg9IjM1MCJ9CgpQYXJhIHJlY29kaWZpY2FyIHVuYSB2YXJpYWJsZSBlbiBSIGhheSB2YXJpYXMgZm9ybWFzLgpVbmEgZGUgbGFzIGZvcm1hcyBtw6FzIGVmaWNpZW50ZXMgZGUgaGFjZXJsbyBlcyB1c2FuZG8gZWwgY29tYW5kbyBgcmVjb2RlYCBkZWwgcGFxdWV0ZSBgY2FyYC4KRWwgcGFxdWV0ZSBgZHBseXJgIHRpZW5lIHVuIGNvbWFuZG8gYHJlY29kZWAgcXVlIHB1ZWRlIGNvbmZ1bmRpciBhIFIuClBhcmEgZXZpdGFyIGNvbmZ1c2lvbmVzIHVzYXJlbW9zIGxhIHNpbnRheGlzIGBjYXI6OnJlY29kZWAgcGFyYSBsYSByZWNvZGlmaWNhY2nDs24sIGVzIGRlY2lyIHBhcmEgZXNwZWNpZmljYXIgcXVlIHNlIHVzZSBlbCBjb21hbmRvIGByZWNvZGVgZGVsIHBhcXVldGUgYGNhcmAgeSBubyBkZSBvdHJvLgpHdWFyZGFtb3MgbGEgdmFyaWFibGUgcmVjb2RpZmljYWRhIGNvbW8gImxhcG9wMjFcJGluZzRyZWMgKGVzIGRlY2lyLCBjcmVhbW9zIHVuYSBudWV2YSB2YXJpYWJsZSBvIHZlY3RvciBlbiBlbCBkYXRhZnJhbWUpLiBMdWVnbywgdXNhbW9zIGVsIGNvbWFuZG8gYHRhYmxlYCBwYXJhIGRlc2NyaWJpciBlc3RhIG51ZXZhIHZhcmlhYmxlLgoKYGBge3IgcmVjb2RpZmljYWNpb24sIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkoY2FyKQpsYXBvcDIxJGluZzRyZWMgPSBjYXI6OnJlY29kZShsYXBvcDIxJGluZzQsICIxOjQ9MDsgNTo3PTEiKQp0YWJsZShsYXBvcDIxJGluZzRyZWMpCmBgYAoKU2kgc3VtYW1vcyBsYXMgb2JzZXJ2YWNpb25lcyBlbnRyZSAxIHkgNCBkZSBsYSB2YXJpYWJsZSBvcmlnaW5hbCAoNTcwNCsyNTY3KzQ5ODArODE3NyksIHZlbW9zIHF1ZSBlcyBlbCByZXN1bHRhZG8gcXVlIHRlbmVtb3MgZW4gZWwgdmFsb3IgMCBkZSBsYSBudWV2YSB2YXJpYWJsZSAoMjE0MjgpLCB0YWwgY29tbyBwbGFudGVhbW9zIGVuIGxhIHJlY29kaWZpY2FjacOzbi4KVGFtYmnDqW4gZGViZW1vcyBub3RhciBxdWUgbGEgYmFzZSBkZSBkYXRvcyBlbiBlbCBFbnZpcm9ubWVudCBhaG9yYSB0aWVuZSB1bmEgdmFyaWFibGUgbcOhcywgdG90YWxpemFuZG8gMTgyNiB2YXJpYWJsZXMuCgojIFNlbGVjY2nDs24gZGUgY2Fzb3MKCkVsIGdyw6FmaWNvIDEuMSBtdWVzdHJhIHF1ZSBlbCBhcG95byBhIGxhIGRlbW9jcmFjaWEgdmEgZGUgdW4gbcOheGltbyBkZSA4MCUgZW4gVXJ1Z3VheSBhIHVuIG3DrW5pbW8gZGUgNDYlIGVuIEhhaXTDrS4KUGFyYSByZXBsaWNhciBlbCByZXN1bHRhZG8gY29ycmVzcG9uZGllbnRlIGEgVXJ1Z3VheSBwb2RlbW9zIHNlbGVjY2lvbmFyIGxhcyBvYnNlcnZhY2lvbmVzIGRlIGVzZSBwYcOtcy4KRGUgYWN1ZXJkbyBhIGxhIGNvZGlmaWNhY2nDs24gZGUgbGEgdmFyaWFibGUgInBhaXMiLCBVcnVndWF5IHRpZW5lIGVsIGPDs2RpZ28gMTQuCgohW10ocGFpcy5wbmcpe3dpZHRoPSI1NTIifQoKTGEgc2VsZWNjacOzbiBkZSBjYXNvcyBlbiBSIHNlIHB1ZWRlIGhhY2VyIGRlIG3Dumx0aXBsZXMgbWFuZXJhcy4KVW5hIGZvcm1hIGVzIHVzYXIgbG9zIGNvcmNoZXRlcyBgW+KApl1gLgpPdHJhIGZvcm1hIGVzIHVzYW5kbyBlbCBjb21hbmRvIGBzdWJzZXRgLgpDb24gZXN0ZSBjb21hbmRvIHNlbGVjY2lvbmFtb3MgbGFzIG9ic2VydmFjaW9uZXMgZGUgZXN0ZSBwYcOtcyB5IGd1YXJkYW1vcyBlc3RhIHNlbGVjY2nDs24gZW4gdW4gbnVldm8gZGF0YWZyYW1lICJsYXBvcDIiIHVzYW5kbyBlc3RlIMO6bHRpbW8gY29tYW5kby4KU2UgdGllbmUgMzAwOSBvYnNlcnZhY2lvbmVzIGVuIFVydWd1YXkuCgpgYGB7ciBzZWxlY2Npb25hciBVcnV9CmxhcG9wMSA9IHN1YnNldChsYXBvcDIxLCBwYWlzPT0xNCkKdGFibGUobGFwb3AxJHBhaXMpCmBgYAoKQ29uIGVzdGEgc2VsZWNjacOzbiBkZSBkYXRvcywgcG9kZW1vcyBjYWxjdWxhciBlbCBwb3JjZW50YWplIChmcmVjdWVuY2lhcyByZWxhdGl2YXMpIHVzYW5kbyBlbCBjb21hbmRvIGBwcm9wLnRhYmxlYC4KRXN0ZSBjb21hbmRvIG5vcyBicmluZGEgbGFzIGZyZWN1ZW5jaWFzIHJlbGF0aXZhcyAoZW4gdmFsb3JlcyBlbnRyZSAwIHkgMSkgZGUgdW5hIHRhYmxhIGRlIGZyZWN1ZW5jaWFzIGNhbGN1bGFkYSBjb24gYHRhYmxlYC4KRXN0YXMgZnJlY3VlbmNpYXMgcmVsYXRpdmFzIHNlIG11bHRpcGxpY2FuIHBvciAxMDAgcGFyYSByZXByb2R1Y2lyIGVsIHBvcmNlbnRhamUgZW4gY2FkYSBwYcOtcy4KRW4gZXN0ZSBjYXNvIHlhIG5vIHJlcXVlcmltb3MgdXNhciBsb3MgYFvigKZdYCBwYXJhIGhhY2VyIGxhIHNlbGVjY2nDs24gcG9ycXVlIGVsIGRhdGFmcmFtZSAibGFwb3AxIiBndWFyZGEgbG9zIGRhdG9zIHNlbGVjY2lvbmFkb3MgZGUgVXJ1Z3VheS4KCmBgYHtyIHBvcmNlbnRhamUgVXJ1fQpwcm9wLnRhYmxlKHRhYmxlKGxhcG9wMSRpbmc0cmVjKSkqMTAwCmBgYAoKRXN0b3MgcmVzdWx0YWRvcyBzb24gcG9yY2VudGFqZXMgKGVudHJlIDAgeSAxMDApLCBwZXJvIGluY2x1eWVuIG11Y2hvcyBkZWNpbWFsZXMuClBhcmEgcmVkb25kZWFyIGEgdW4gZGVjaW1hbCwgY29tbyBzZSBtdWVzdHJhIGVuIGVsIEdyw6FmaWNvIDEuMiwgcG9kZW1vcyB1c2FyIGVsIGNvbWFuZG8gYHJvdW5kYCwgZG9uZGUgYW5pZGFtb3MgdG9kYSBsYSBzaW50YXhpcyBhbnRlcmlvci4KRW4gZXN0ZSBjb21hbmRvLCBhZGVtw6FzLCB0ZW5lbW9zIHF1ZSBlc3BlY2lmaWNhciBlbCBuw7ptZXJvIGRlIGRlY2ltYWxlcyBxdWUgc2UgcXVpZXJlLCBxdWUgZW4gZXN0ZSBjYXNvIGVzIDEuCgpgYGB7ciByZWRvbmRlYXIgVXJ1fQpyb3VuZChwcm9wLnRhYmxlKHRhYmxlKGxhcG9wMSRpbmc0cmVjKSkqMTAwLCAxKQpgYGAKClNlZ8O6biBlc3RlIHJlc3VsdGFkbyA4NC41JSBkZSB1cnVndWF5b3MgYXBveWEgYSBsYSBkZW1vY3JhY2lhLgpFc3RlIHJlc3VsdGFkbyBlcyBkaXN0aW50byBhbCBxdWUgc2UgcmVwb3J0YSBlbiBlbCBncsOhZmljbyAxLjEsIGRvbmRlIGVsIHZhbG9yIHJlcG9ydGFkbyBlcyA4MCUuCkVzdGEgZGlmZXJlbmNpYSBlcyBkZWJpZG8gYSBxdWUgZXN0b3MgcHJpbWVyb3MgcHJvY2VkaW1pZW50b3Mgbm8gaW5jbHV5ZW4gZWwgZWZlY3RvIGRlIGRpc2XDsW8uCk3DoXMgYWJham8gdmVyZW1vcyBlbCBwcm9jZWRpbWllbnRvIHBhcmEgcmVwcm9kdWNpciBlbCByZXN1bHRhZG8gZXhhY3RvIHJlcG9ydGFkby4KCkVuIGVsIHJlcG9ydGUgZGUgbGEgcm9uZGEgMjAxOC8xOSBlbCByZXBvcnRlIGluZGljYSBxdWUgIkVsIEdyw6FmaWNvIDEuMiBtdWVzdHJhIGVsIHBvcmNlbnRhamUgZGUgcGVyc29uYXMgZW4gY2FkYSBwYcOtcyBxdWUgZXhwcmVzYSBhcG95YXIgbGEgZGVtb2NyYWNpYSBlbiAyMDE4LzE5LiBFbCBhcG95byBhIGxhIGRlbW9jcmFjaWEgdmEgZGUgdW4gbcOtbmltbyBkZSA0NSUgZW4gSG9uZHVyYXMgYSB1biBtw6F4aW1vIGRlIDc2LjIlIGVuIFVydWd1YXkiIChwLjExKS4KClBhcmEgcmVwbGljYXIgZXN0b3MgcmVzdWx0YWRvcyBhY2VyY2EgZGUgSG9uZHVyYXMgeSBkZSBVcnVndWF5IHBhcmEgMjAxOC8xOSwgcG9kZW1vcyBzZWxlY2Npb25hciBsb3MgZGF0b3MgZGUgZXN0b3MgZG9zIHBhw61zZXMuCkRlIGFjdWVyZG8gYWwgY3Vlc3Rpb25hcmlvLCBxdWUgc2UgcHVlZGUgdmVyIFthcXXDrV0oaHR0cHM6Ly93d3cudmFuZGVyYmlsdC5lZHUvbGFwb3AvYWIyMDE4L0FCMjAxOC12MTIuMC1TcGEtMTkwMTMxX1cucGRmKSwgSG9uZHVyYXMgZXMgZWwgcGHDrXMgNCB5IFVydWd1YXkgZXMgZWwgcGHDrXMgMTQgZGUgbGEgdmFyaWFibGUgInBhaXMiLCBxdWUgdGFtYmnDqW4gc2UgaGEgaW1wb3J0YW5kbyBjb21vIHVuYSB2YXJpYWJsZSBudW3DqXJpY2EuCgpTZSBpbmNsdXllIGVsIG9wZXJhZG9yICJvIiwgcXVlIGVuIFIgc2UgZGVub3RhIGNvbiAiXHwiLgpEZSBlc3RhIG1hbmVyYSBzZSBpbmRpY2EgcXVlIHNlIHNlbGVjY2lvbmVzIGxhcyBvYnNlcnZhY2lvbmVzIGRlIEhvbmR1cmFzIG8gZGUgVXJ1Z3VheSAoYHBhaXM9PTQgfCBwYWlzPT0xNGApLgpMYSBkZXNjcmlwY2nDs24gZGUgbGEgdmFyaWFibGUgInBhaXMiIG11ZXN0cmEgcXVlIHNvbG8gaW5jbHV5ZSBsb3MgY2Fzb3MgZGUgSG9uZHVyYXMgKDIpIHkgVXJ1Z3VheSAoMTQpLgoKYGBge3Igc2VsZWNjaW9uYXIgSG9uIHkgVXJ1fQojIGxhcG9wMiA8LSBsYXBvcDE4W2xhcG9wMTgkcGFpcyA9PSA0IHwgbGFwb3AxOCRwYWlzPT0xNCwgXQpsYXBvcDIgPSBzdWJzZXQobGFwb3AxOCwgcGFpcz09NCB8IHBhaXM9PTE0KQp0YWJsZShsYXBvcDIkcGFpcykKYGBgCgpFbCBudWV2byBkYXRhZnJhbWUgImxhcG9wMiIgdGllbmUgMzE0MSBvYnNlcnZhY2lvbmVzIHkgODQgdmFyaWFibGVzIGRlYmlkbyBhIHF1ZSBubyBoZW1vcyBjcmVhZG8gbGEgdmFyaWFibGUgcmVjb2RpZmljYWRhLgoKYGBge3IgYXBveW8gSG9uIHkgVXJ1fQpsYXBvcDIkaW5nNHJlYyA9IGNhcjo6cmVjb2RlKGxhcG9wMiRpbmc0LCAiMTo0PTA7IDU6Nz0xIikKYGBgCgpDb24gZXN0YSB2YXJpYWJsZSBwb2RlbW9zIHNlZ3VpciBsb3MgbWlzbW9zIHByb2NlZGltaWVudG9zIGFudGVyaW9ybWVudGUgZGVzY3JpdG9zIHBhcmEgcHJvZHVjaXIgbGEgdGFibGEgZGUgZnJlY3VlbmNpYXMgcmVsYXRpdmFzLgpDb21vIGVzdGUgZGF0YWZyYW1lIHRpZW5lIGxvcyBkYXRvcyBkZSBkb3MgcGHDrXNlcywgYXF1w60gc2kgcG9kZW1vcyB1c2FyIGxvcyBgW+KApl1gIHBhcmEgZXNwZWNpZmljYXIgcXVlIHF1ZXJlbW9zIHVuYSB0YWJsYSBkZSBVcnVndWF5IHkgZGUgSG9uZHVyYXMuCgpgYGB7ciBwb3JjZW50YWplcyBIb24geSBVcnV9CnByb3AudGFibGUodGFibGUobGFwb3AyJGluZzRyZWNbbGFwb3AyJHBhaXM9PTRdKSkqMTAwCnByb3AudGFibGUodGFibGUobGFwb3AyJGluZzRyZWNbbGFwb3AyJHBhaXM9PTE0XSkpKjEwMApgYGAKClkgbHVlZ28gcG9kZW1vcyBpbmNsdWlyIGVsIHJlZG9uZGVvLgoKYGBge3IgcmVkb25kZWFyIEhvbiB5IFVydX0Kcm91bmQocHJvcC50YWJsZSh0YWJsZShsYXBvcDIkaW5nNHJlY1tsYXBvcDIkcGFpcz09NF0pKSoxMDAsIDEpCnJvdW5kKHByb3AudGFibGUodGFibGUobGFwb3AyJGluZzRyZWNbbGFwb3AyJHBhaXM9PTE0XSkpKjEwMCwgMSkKYGBgCgpDb24gZXN0ZSBjw7NkaWdvIGhlbW9zIHJlcHJvZHVjaWRvIGxvcyByZXN1bHRhZG9zIGRlIGxvcyBwYcOtc2VzIGVuIGxvcyBleHRyZW1vcyBkZWwgR3LDoWZpY28gMS4yIGRlbCByZXBvcnRlLgpFbiBlc3RlIGNhc28sIGxvcyByZXN1bHRhZG9zIHPDrSBzb24gc2ltaWxhcmVzIGEgbG9zIHJlcG9ydGFkb3MgZW4gZWwgZ3LDoWZpY28uCgpBbWJvcyByZXBvcnRlcyB0YW1iacOpbiBpbmRpY2FuIHF1ZSBzZSBleGNsdXllIGRlIGxvcyBjw6FsY3Vsb3MgYSBFc3RhZG9zIFVuaWRvcyB5IENhbmFkw6EuCkxhIGJhc2UgZGUgZGF0b3MgY2FyZ2FkYSBjb21vICJsYXBvcDE4IiBpbmNsdXllIGEgdG9kb3MgbG9zIHBhw61zZXMgZGUgbGEgcm9uZGEuClBhcmEgZXhjbHVpciBhIGVzdG9zIGRvcyBwYcOtc2VzLCB0ZW5lbW9zIHF1ZSBzZWxlY2Npb25hciBsb3MgcGHDrXNlcyBxdWUgTk8gc29uIEVFLlVVLgp5IENhbmFkw6EuCkVzdGEgbnVldmEgc2VsZWNjacOzbiBsYSBndWFyZGFtb3MgZW4gdW4gbnVldm8gZGF0YWZyYW1lIG8gc2UgcHVlZGUgc29icmVlc2NyaWJpciBlbiBlbCBkYXRhZnJhbWUgb3JpZ2luYWwsIGNvbW8gc2UgaGFjZSBlbiBlc3RlIGNhc28gZGViaWRvIGEgcXVlIGxhIGV4Y2x1c2nDs24gZGUgZXN0b3MgcGHDrXNlcyBlcyBwYXJhIHRvZG9zIGxvcyBjw6FsY3Vsb3MgcXVlIHNpZ3Vlbi4KRGUgYWN1ZXJkbyBhbCBjdWVzdGlvbmFyaW8sIEVFLlVVLgp0aWVuZSBlbCBjw7NkaWdvIDQwIHkgQ2FuYWTDoSwgZWwgY8OzZGlnbyA0MSBlbiBsYSB2YXJpYWJsZSAicGFpcyIuClBhcmEgZXhjbHVpcmxvcyB0ZW5lbW9zIHF1ZSBpbmNsdWlyIGEgbG9zIHBhw61zZXMgcXVlIHRlbmdhbiB1biBjw7NkaWdvIG1lbm9yIGEgNDAgKG8gZGUgMzUgbyBtZW5vcykuClBhcmEgZXN0byBudWV2YW1lbnRlIHBvZGVtb3MgdXNhciBlbCBjb21hbmRvIGBzdWJzZXRgLgoKYGBge3IgZWxpbWluYXIgVVNBIHkgQ2FuYWRhIDE4fQpsYXBvcDE4ID0gc3Vic2V0KGxhcG9wMTgsIHBhaXM8PTM1KQpgYGAKClBvZGVtb3Mgb2JzZXJ2YXIgZW4gZWwgRW52aXJvbm1lbnQgcXVlIHNlIHJlZHVjZW4gbGFzIG9ic2VydmFjaW9uZXMgZGVsIGRhdGFmcmFtZSAibGFwb3AxOCIgbHVlZ28gZGUgY29ycmVyIGVzdGUgY8OzZGlnbywgcHVlcyBoZW1vcyBlbGltaW5hZG8gbGFzIG9ic2VydmFjaW9uZXMgZGUgZW50cmV2aXN0YWRvcyBlbiBlc3RvcyBkb3MgcGHDrXNlcy4KRWwgbsO6bWVybyBkZSBvYnNlcnZhY2lvbmVzIHBhc2EgZGUgMzEsMDUwIGEgMjgsMDQyLCBuw7ptZXJvIHF1ZSBjb2luY2lkZSBjb24gZWwgZGUgbGEgYmFzZSBkZSBkYXRvcyBlbiBmb3JtYXRvIC5SRGF0YSBxdWUgbm8gaW5jbHXDrWEgYSBlc3RvcyBwYcOtc2VzLgoKRGUgbGEgbWlzbWEgbWFuZXJhIHBvZGVtb3MgcHJvY2VkZXIgZW4gbGEgYmFzZSBkZSBkYXRvcyBkZSBsYSByb25kYSAyMDIxLCBjb24gbG8gcXVlIGRpc21pbnV5ZW4gbGFzIG9ic2VydmFjaW9uZXMgYSA2MDY2MS4KCmBgYHtyIGVsaW1pbmFyIFVTQSB5IENhbmFkYSAyMX0KbGFwb3AyMSA9IHN1YnNldChsYXBvcDIxLCBwYWlzPD0zNSkKYGBgCgojIENhbGN1bGFyIHVuYSB2YXJpYWJsZQoKVW5hIHByw6FjdGljYSBmcmVjdWVudGUgZGUgTEFQT1AgY29uIGxvcyBkYXRvcyBkZWwgQmFyw7NtZXRybyBkZSBsYXMgQW3DqXJpY2FzIGVzIGVsIHJlLWVzY2FsYW1pZW50byBkZSB2YXJpYWJsZXMuCkVsIGNhcMOtdHVsbyBzb2JyZSBsZWdpdGltaWRhZCBkZW1vY3LDoXRpY2EgZGVsIHJlcG9ydGUgYnJpbmRhIGVqZW1wbG9zIGRlIGVzdGUgcmUtZXNjYWxhbWllbnRvIGNvbiB2YXJpYWJsZXMgcmVsYWNpb25hZGFzIGFsIGFwb3lvIGFsIHNpc3RlbWEuClBhcmEgY2FsY3VsYXIgZXN0ZSDDrW5kaWNlIGRlIGFwb3lvIGFsIHNpc3RlbWEgc2UgdHJhYmFqYSBjb24gdW4gY29uanVudG8gZGUgY2luY28gdmFyaWFibGVzOgoKQjEuCirCv0hhc3RhIHF1w6kgcHVudG8gY3JlZSB1c3RlZCBxdWUgbG9zIHRyaWJ1bmFsZXMgZGUganVzdGljaWEgZGUgKHBhw61zKSBnYXJhbnRpemFuIHVuIGp1aWNpbyBqdXN0bz8qCgpCMi4KKsK/SGFzdGEgcXXDqSBwdW50byB0aWVuZSB1c3RlZCByZXNwZXRvIHBvciBsYXMgaW5zdGl0dWNpb25lcyBwb2zDrXRpY2FzIGRlIChwYcOtcyk/KgoKQjMuCirCv0hhc3RhIHF1w6kgcHVudG8gY3JlZSB1c3RlZCBxdWUgbG9zIGRlcmVjaG9zIGLDoXNpY29zIGRlbCBjaXVkYWRhbm8gZXN0w6FuIGJpZW4gcHJvdGVnaWRvcyBwb3IgZWwgc2lzdGVtYSBwb2zDrXRpY28gZGUgKHBhw61zKT8qCgpCNC4KKsK/SGFzdGEgcXXDqSBwdW50byBzZSBzaWVudGUgb3JndWxsb3NvIGRlIHZpdmlyIGJham8gZWwgc2lzdGVtYSBwb2zDrXRpY28gZGUgKHBhw61zKT8qCgpCNi4KKsK/SGFzdGEgcXXDqSBwdW50byBwaWVuc2EgdXN0ZWQgcXVlIHNlIGRlYmUgYXBveWFyIGFsIHNpc3RlbWEgcG9sw610aWNvIGRlIChwYcOtcyk/KgoKQ29tbyBpbmRpY2EgZWwgcmVwb3J0ZSAiUGFyYSBjYWRhIHByZWd1bnRhLCBsYSBlc2NhbGEgb3JpZ2luYWwgZGUgMSAoIk5hZGEiKSBhIDcgKCJNdWNobyIpIHNlIHJlY29kaWZpY2EgZW4gdW5hIGVzY2FsYSBkZSAwIGEgMTAwLCBkZSB0YWwgZm9ybWEgcXVlIDAgaW5kaWNhIGVsIG1lbm9yIG5pdmVsIGRlIGFwb3lvIGFsIHNpc3RlbWEgcG9sw610aWNvIHkgMTAwIGVzIGVsIG5pdmVsIG3DoXhpbW8gZGUgYXBveW8gYWwgc2lzdGVtYSBwb2zDrXRpY28uIEVzdGEgbnVldmEgZXNjYWxhIHNpZ3VlIGxhIHJlY29kaWZpY2FjacOzbiB0w61waWNhIGRlIExBUE9QIHkgcHVlZGUgc2VyIGludGVycHJldGFkYSBjb21vIHVuYSBtZWRpY2nDs24gZGVsIGFwb3lvIGVuIHVuaWRhZGVzLCBvIGdyYWRvcywgZW4gdW5hIGVzY2FsYSBjb250aW51YSBxdWUgdmEgZGUgMCBhIDEwMCIgKHAuMzQpLgpQYXJhIGNvbXByb2JhciBsYSBlc2NhbGEgb3JpZ2luYWwgZGUgZXN0YXMgdmFyaWFibGVzLCBzZSBwdWVkZSBkZXNjcmliaXIgZXN0YXMgdmFyaWFibGVzIHVzYW5kbyBlbCBjb21hbmRvIGB0YWJsZWAuCgpgYGB7ciBkZXNjcmliaXJ9CnRhYmxlKGxhcG9wMTgkYjEpCnRhYmxlKGxhcG9wMTgkYjIpCnRhYmxlKGxhcG9wMTgkYjMpCnRhYmxlKGxhcG9wMTgkYjQpCnRhYmxlKGxhcG9wMTgkYjYpCmBgYAoKT2JzZXJ2YW1vcyBxdWUgZWZlY3RpdmFtZW50ZSB0b2RhcyBsYXMgdmFyaWFibGVzIGVzdMOhbiBlbiB1bmEgZXNjYWxhIGRlIDEgYSA3LgpQYXJhIHJlZXNjYWxhciB1bmEgdmFyaWFibGUgZW4gdW5hIGVzY2FsYSBvcmlnaW5hbCBkZSAxIGEgNyBhIG90cmEgZGUgMCBhIDEwMCwgbG8gcHJpbWVybyBxdWUgdGVuZW1vcyBxdWUgaGFjZXIgZXMgcmVzdGFyIDEgdW5pZGFkLCBjb24gbG8gcXVlIGxhIHZhcmlhYmxlIHRlbmRyw61hIHVuYSBlc2NhbGEgZGUgMCBhIDYsIGx1ZWdvIGRpdmlkaXJsYSBlbnRyZSA2LCBjb24gbG8gcXVlIHZhcmlhcsOtYSBlbnRyZSAwIHkgMSB5LCBmaW5hbG1lbnRlLCBtdWx0aXBsaWNhcmxhIHBvciAxMDAuCkVzdG8gZXM6CgpWYXJpYWJsZSByZWVzY2FsYWRhID0gKCh2YXJpYWJsZSBvcmlnaW5hbCAtMSkvNilcKjEwMAoKYGBge3IgY2FsY3VsYXJ9CmxhcG9wMTgkYjFyZWMgPSAoKGxhcG9wMTgkYjEtMSkvNikqMTAwCmxhcG9wMTgkYjJyZWMgPSAoKGxhcG9wMTgkYjItMSkvNikqMTAwCmxhcG9wMTgkYjNyZWMgPSAoKGxhcG9wMTgkYjMtMSkvNikqMTAwCmxhcG9wMTgkYjRyZWMgPSAoKGxhcG9wMTgkYjQtMSkvNikqMTAwCmxhcG9wMTgkYjZyZWMgPSAoKGxhcG9wMTgkYjYtMSkvNikqMTAwCnRhYmxlKGxhcG9wMTgkYjFyZWMpCmBgYAoKQ29uIGVzdGEgdHJhbnNmb3JtYWNpw7NuIG9ic2VydmFtb3MgcXVlIGxvcyA0LDA4OSBlbnRyZXZpc3RhZG9zIHF1ZSBtYXJjYXJvbiAxIGVuIGxhIHByZWd1bnRhIEIxLCBhaG9yYSB0aWVuZW4gdW4gcHVudGFqZSBkZSAwLgpMb3MgNCwwNjcgcXVlIG1hcmNhcm9uIDIsIGFob3JhIHRpZW5lbiB1biBwdW50YWplIGRlIDE2LjY3LCBlcyBkZWNpciAyLTE9MS82PTAuMTY2N1wqMTAwPTE2LjY3LgpFc3RhIG1pc21hIG9wZXJhY2nDs24gc2UgcHVkbyBoYWNlciBjb24gZWwgY29tYW5kbyBgY2FyOjpyZWNvZGVgLCBzaWd1aWVuZG8gbGEgc2lndWllbnRlIHJlZ2xhIGRlIHJlY29kaWZpY2FjacOzbjoKCi0gICBWYWxvciBkZSAxIGVuIHZhcmlhYmxlIG9yaWdpbmFsIHNlIHJlY29kaWZpY2EgY29tbyAwIGVuIG51ZXZhIHZhcmlhYmxlCi0gICBWYWxvciBkZSAyIGVuIHZhcmlhYmxlIG9yaWdpbmFsIHNlIHJlY29kaWZpY2EgY29tbyAxNi42NyBlbiBudWV2YSB2YXJpYWJsZQotICAgVmFsb3IgZGUgMyBlbiB2YXJpYWJsZSBvcmlnaW5hbCBzZSByZWNvZGlmaWNhIGNvbW8gMzMuMzMgZW4gbnVldmEgdmFyaWFibGUKLSAgIFZhbG9yIGRlIDQgZW4gdmFyaWFibGUgb3JpZ2luYWwgc2UgcmVjb2RpZmljYSBjb21vIDUwIGVuIG51ZXZhIHZhcmlhYmxlCi0gICBWYWxvciBkZSA1IGVuIHZhcmlhYmxlIG9yaWdpbmFsIHNlIHJlY29kaWZpY2EgY29tbyA2Ni42NyBlbiBudWV2YSB2YXJpYWJsZQotICAgVmFsb3IgZGUgNiBlbiB2YXJpYWJsZSBvcmlnaW5hbCBzZSByZWNvZGlmaWNhIGNvbW8gODMuMzMgZW4gbnVldmEgdmFyaWFibGUKLSAgIFZhbG9yIGRlIDcgZW4gdmFyaWFibGUgb3JpZ2luYWwgc2UgcmVjb2RpZmljYSBjb21vIDEwMCBlbiBudWV2YSB2YXJpYWJsZQoKRXN0YSBtYW5lcmEgZGUgcmVjb2RpZmljYXIsIHNpbiBlbWJhcmdvLCBlcyBwb2NvIGVmaWNpZW50ZS4KRXMgbcOhcyBzaW1wbGUgdXNhciBsYSBmw7NybXVsYSBwYXJhIGNhbGN1bGFyIGxhIHJlY29kaWZpY2FjacOzbi4KClBhcmEgY2FsY3VsYXIgZWwgw61uZGljZSBkZSBhcG95byBhbCBzaXN0ZW1hLCBlbCByZXBvcnRlIGluZGljYSBxdWUgIkVsIMOtbmRpY2UgZGUgYXBveW8gYWwgc2lzdGVtYSBlcyBlbCBwcm9tZWRpbyBkZSBjaW5jbyBwcmVndW50YXM6IEIxLCBCMiwgQjMsIEI0IHkgQjYiIChwLjQ2KS4KRXMgZGVjaXIsIGNvbiBsYXMgdmFyaWFibGVzIHJlZXNjYWxhZGFzIHRlbmVtb3MgcXVlIGNhbGN1bGFyIGVsIHByb21lZGlvIGRlIGVzdGFzIGNpbmNvIHZhcmlhYmxlcyBwYXJhIGNhZGEgaW5kaXZpZHVvIChlcyBkZWNpciwgZW4gY2FkYSBmaWxhIGRlIGxhIGJhc2UgZGUgZGF0b3MpLgpQb2Ryw61hbW9zIGNhbGN1bGFyIGVzdGEgb3BlcmFjacOzbiBkZWwgcHJvbWVkaW8gZGUgZm9ybWEgbWFudWFsLgoKQXBveW8gYWwgc2lzdGVtYSA9IChiMXJlYyArIGIycmVjICsgYjNyZWMgKyBiNHJlYyArIGI2cmVjKS81CgpFbiBSIHRlbmVtb3MgZWwgY29tYW5kbyBgcm93TWVhbnNgIHF1ZSBzaXJ2YSBwYXJhIGNhbGN1bGFyIHByb21lZGlvcyBkZSBjaWVydGFzIGNvbHVtbmFzIHBvciBjYWRhIGZpbGEuCkxhIHNpbnRheGlzIGBbLCA4Njo5MF1gIGluZGljYSBxdWUgcmVhbGl6YXJlbW9zIGVsIGPDoWxjdWxvIGRlbCBwcm9tZWRpbyBwb3IgZmlsYXMgcGFyYSB0b2RhcyBsYXMgZmlsYXMgeSB1c2FuZG8gbGFzIGNvbHVtbmFzIDg2IGEgOTAgZGVsIGRhdGFmcmFtZSAibGFwb3AxOCIgKHBvZHLDrWFtb3MgaGFjZXIgZWwgY8OhbGN1bG8gcGFyYSBhbGd1bmFzIGZpbGFzIGVuIHBhcnRpY3VsYXIgZGVmaW5pZW5kbyBgW2ZpbGFfbjpmaWxhX20sIDg2OjkwXWApLgpFc3RlIHByb21lZGlvIGxvIGd1YXJkYW1vcyBlbiB1bmEgbnVldmEgdmFyaWFibGUgImFwb3lvIiwgcXVlIGRlc2NyaWJpbW9zLgoKYGBge3IgYXBveW8gYWwgc2lzdGVtYX0KbGFwb3AxOCRhcG95byA9IHJvd01lYW5zKGxhcG9wMThbLDg1Ojg5XSkKdGFibGUobGFwb3AxOCRhcG95bykKYGBgCgpDb24gZXN0ZSDDrW5kaWNlIHBvZGVtb3MgY2FsY3VsYXIgZWwgYXBveW8gYWwgc2lzdGVtYSBwcm9tZWRpbyBwYXJhIGxhIMO6bHRpbWEgcm9uZGEgZGVsIEJhcsOzbWV0cm8gZGUgbGFzIEFtw6lyaWNhcywgYXPDrSBjb21vIGxvcyBwcm9tZWRpb3MgZGUgY2FkYSB1bmEgZGUgbGFzIHZhcmlhYmxlcyBxdWUgY29tcG9uZW4gZWwgw61uZGljZS4KVXNhbW9zIGVsIGNvbWFuZG8gYG1lYW5gIHBhcmEgZWwgcHJvbWVkaW8geSBsYSBlc3BlY2lmaWNhY2nDs24gYG5hLnJtPVRgIHBhcmEgaW5kaWNhcmxlIGFsIGNvbWFuZG8gcXVlIG5vIHRvbWUgZW4gY3VlbnRhIGxvcyB2YWxvcmVzIHBlcmRpZG9zIGRlIGVzdGFzIHZhcmlhYmxlcy4KVmVyZW1vcyBlc3RvcyBlc3RhZMOtc3RpY29zIGVuIG3DoXMgZGV0YWxsZSBlbiBvdHJhcyBzZWNjaW9uZXMuCgpgYGB7ciBhcG95byBhbCBzaXN0ZW1hIDIwMTgvMTl9Cm1lYW4obGFwb3AxOCRhcG95bywgbmEucm09VCkKbWVhbihsYXBvcDE4JGIxcmVjLCBuYS5ybT1UKSAjQ29ydGVzIGdhcmFudGl6YW4ganVpY2lvIGp1c3RvCm1lYW4obGFwb3AxOCRiMnJlYywgbmEucm09VCkgI1Jlc3BldG8gYSBsYXMgaW5zdGl0dWNpb25lcwptZWFuKGxhcG9wMTgkYjNyZWMsIG5hLnJtPVQpICNEZXJlY2hvcyBiw6FzaWNvcyBlc3TDoW4gcHJvdGVnaWRvcwptZWFuKGxhcG9wMTgkYjRyZWMsIG5hLnJtPVQpICNPcmd1bGxvcyBwb3IgZWwgc2lzdGVtYSBwb2zDrXRpY28KbWVhbihsYXBvcDE4JGI2cmVjLCBuYS5ybT1UKSAjU2UgZGViZXLDrWEgYXBveWFyIGFsIHNpc3RlbWEgcG9sw610aWNvCmBgYAoKRXN0b3MgcmVzdWx0YWRvcyBzb24gbG9zIHF1ZSBzZSBtdWVzdHJhbiBlbiBlbCBHcsOhZmljbyAyLjEgcGFyYSBsYSByb25kYSAyMDE4LzE5LgoKIVtdKEdyYWYyLjEucG5nKXt3aWR0aD0iNjI5In0KCiMgQ2FsY3VsYXIgdW5hIHZhcmlhYmxlIGRlIG1hbmVyYSBjb25kaWNpb25hbAoKRW4gYWxndW5hcyBvY2FzaW9uZXMgZWwgY8OhbGN1bG8gZGUgdW5hIHZhcmlhYmxlIG5vIHJlcXVpZXJlIHNvbGFtZW50ZSBsYSB0cmFuc2Zvcm1hY2nDs24gbnVtw6lyaWNhIGRlIGxhIHZhcmlhYmxlIG9yaWdpbmFsLCBzaW5vIHF1ZSBsb3MgdmFsb3JlcyBkZSBsYSBudWV2YSB2YXJpYWJsZSBkZXBlbmRlbiBkZSB2YWxvcmVzIGRlIG90cmFzIHZhcmlhYmxlcy4KUG9yIGVqZW1wbG8sIGVsIGNhcMOtdHVsbyAiUmVkZXMgc29jaWFsZXMgeSBhY3RpdHVkZXMgcG9sw610aWNhcyIgZGVsIHJlcG9ydGUgIkVsIFB1bHNvIGRlIGxhIERlbW9jcmFjaWEiIGRlIGxhIHJvbmRhIDIwMTgvMTkgcHJlc2VudGEgbG9zIHJlc3VsdGFkb3MgcGFyYSBsYXMgdmFyaWFibGVzICJ1c3VhcmlvIGRlIFdoYXRzYXBwIiwgInVzdWFyaW8gZGUgVHdpdHRlciIgeSAidXN1YXJpbyBkZSBGYWNlYm9vayIuClBhcmEgY2FsY3VsYXIgZXN0YXMgdmFyaWFibGVzLCBlbCBwaWUgZGUgcMOhZ2luYSA3IGRlIGVzdGUgY2Fww610dWxvIGluZGljYTogIlBhcmEgY2FkYSBwbGF0YWZvcm1hLCBzZSBpZGVudGlmaWNhbiBsb3MgdXN1YXJpb3MgY29uIHVuYSBjb21iaW5hY2nDs24gZGUgZG9zIGNvbmp1bnRvcyBkZSBwcmVndW50YXMuIFByaW1lcm8sIHNlIGlkZW50aWZpY2FuIGNvbW8gdXN1YXJpb3MgYSBxdWllbmVzIHJlc3BvbmRlbiBwb3NpdGl2YW1lbnRlIGEgbGFzIHByZWd1bnRhcywgU01FRElBMS9TTUVESUE0L1NNRURJQTcuIMK/VGllbmUgdXN0ZWQgY3VlbnRhIGRlIEZhY2Vib29rL1R3aXR0ZXIvV2hhdHNhcHA/IEx1ZWdvLCBzZSByZWNvZGlmaWNhIGNvbW8gbm8gdXN1YXJpbyBhIHF1aWVuZXMgcmVzcG9uZGVuIm51bmNhIiBhIGxhcyBwcmVndW50YXMgc2lndWllbnRlcywgU01FRElBMi9TTUVESUE1L1NNRURJQTguIMK/Q29uIHF1w6kgZnJlY3VlbmNpYSB2ZSBjb250ZW5pZG8gZW4gRmFjZWJvb2svVHdpdHRlci9XaGF0c2FwcD8iIChwLiA2NCkuCgohW10oc21lZGlhLnBuZyl7d2lkdGg9IjQ2NiJ9CgpFcyBkZWNpciwgZWwgdXN1YXJpbyBubyBzb2xvIGVzIGVsIHF1ZSB0aWVuZSB1bmEgY3VlbnRhIChTTUVESUExPTEpLCBzaW5vIGVsIHF1ZSBsYSB1c2EgY29uIGNpZXJ0YSBmcmVjdWVuY2lhIChTTUVESUEyPTEsIDIsIDMsIDQpLgpEZSBlc3RhIG1hbmVyYSwgZWwgbm8gdXN1YXJpbyBwdWVkZSB0ZW5lciB1bmEgY3VlbnRhLCBwZXJvIG51bmNhIHVzYXJsYS4KUG9yIGxvIHRhbnRvLCBsYSB2YXJpYWJsZSAidXN1YXJpbyIgZGVwZW5kZSBkZSBsb3MgdmFsb3JlcyBkZSAyIHZhcmlhYmxlcy4KTGEgcmVnbGEgZGUgY29kaWZpY2FjacOzbiBxdWUgc2Ugc2lndWUgZXM6CgotICAgVXN1YXJpbyBkZSBGYWNlYm9vayA9IDEgKHPDrSBlcyB1c3VhcmlvKSBzaSBTTUVESUExID0gMSAodGllbmUgY3VlbnRhKSB5IFNNRURJQTIgXDw9IDQgKGxhIHVzYSBjb24gYWxndW5hIGZyZWN1ZW5jaWEpCgotICAgVXN1YXJpbyBkZSBGYWNlYm9vayA9IDAgKG5vIGVzIHVzdWFyaW8pIHNpIFNNRURJQTIgPSAyIChubyB0aWVuZSBjdWVudGEpIG8gU01FRElBMiA9IDUgKHRpZW5lIGN1ZW50YSBwZXJvIG51bmNhIGxhIHVzYSkKClByb2R1Y2ltb3MgZXN0YSByZWdsYSBkZSBjb2RpZmljYWNpw7NuIGNvbiBsYSBzaWd1aWVudGUgc2ludGF4aXMgZGUgUiwgcXVlIHVzYSBlbCBjb21hbmRvIGBpZmVsc2VgLgpFc3RhIHNpbnRheGlzIGluY2x1eWUgbGEgY29uZGljacOzbiBwYXJhIGFzaWduYXIgdmFsb3JlcyBkZSAxIGEgdW5hIG51ZXZhIHZhcmlhYmxlIHkgYXNpZ25hIGEgdG9kYXMgbGFzIGRlbcOhcyBvYnNlcnZhY2lvbmVzIGVsIHZhbG9yIGRlIDAuCkRlc2NyaWJpbW9zIGVzdGFzIG51ZXZhcyB2YXJpYWJsZXMgdXNhbmRvIGxvcyBjb21hbmRvcyBgdGFibGVgIHBhcmEgZ2VuZXJhciBsYXMgZnJlY3VlbmNpYXMgYWJzb2x1dGFzLCBgcHJvcC50YWJsZWAgcGFyYSBsYXMgZnJlY3VlbmNpYXMgcmVsYXRpdmFzIHkgYHJvdW5kYCBwYXJhIHJlZG9uZGVhciBsb3MgZGVjaW1hbGVzLgpFc3RvcyBjb21hbmRvcyBsb3MgdmVyZW1vcyBlbiBtw6FzIGRldGFsbGUgZW4gbGFzIHNpZ3VpZW50ZXMgc2VjY2lvbmVzLgoKYGBge3IgdXN1YXJpb3MsIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGFwb3AxOCRmYl91c2VyID0gaWZlbHNlKGxhcG9wMTgkc21lZGlhMT09MSAmIGxhcG9wMTgkc21lZGlhMjw9NCwgMSwgMCkKbGFwb3AxOCR0d191c2VyID0gaWZlbHNlKGxhcG9wMTgkc21lZGlhND09MSAmIGxhcG9wMTgkc21lZGlhNTw9NCwgMSwgMCkKbGFwb3AxOCR3YV91c2VyID0gaWZlbHNlKGxhcG9wMTgkc21lZGlhNz09MSAmIGxhcG9wMTgkc21lZGlhODw9NCwgMSwgMCkKcm91bmQocHJvcC50YWJsZSh0YWJsZShsYXBvcDE4JGZiX3VzZXIpKSoxMDAsIDEpCnJvdW5kKHByb3AudGFibGUodGFibGUobGFwb3AxOCR0d191c2VyKSkqMTAwLCAxKQpyb3VuZChwcm9wLnRhYmxlKHRhYmxlKGxhcG9wMTgkd2FfdXNlcikpKjEwMCwgMSkKYGBgCgpFc3RvcyByZXN1bHRhZG9zIHNvbiBsb3MgcXVlIHNlIHByZXNlbnRhbiBlbiBlbCBHcsOhZmljbyAzLjEgZGVsIHJlcG9ydGUgZW4gZm9ybWEgZGUgZ3LDoWZpY29zIGNpcmN1bGFyZXMuClZlcmVtb3MgZXN0ZSB0aXBvIGRlIGdyw6FmaWNvcyBlbiBsYSBzaWd1aWVudGUgc2VjY2nDs24uCgohW10oR3JhZjMuMS5wbmcpe3dpZHRoPSIzMjMifQoKIyBPYnNlcnZhY2nDs24gZGVsIGVmZWN0byBkZSBkaXNlw7FvCgpUYW50byBsb3MgcmVzdWx0YWRvcyBwYXJhIGFwb3lvIGFsIHNpc3RlbWEsIGNvbW8gbG9zIGRlIHVzdWFyaW9zIGRlIHJlZGVzIHNvY2lhbGVzIGRpZmllcmVuIGRlIGxvcyBxdWUgYXBhcmVjZW4gZW4gZWwgcmVwb3J0ZSBwb3IgZG9zIG1vdGl2b3MuCkVuIHByaW1lciBsdWdhciwgcGFyYSBhcG95byBhbCBzaXN0ZW1hLCBkZWJpZG8gYSBxdWUgIkxvcyB2YWxvcmVzIGEgbG8gbGFyZ28gZGVsIHRpZW1wbyBzZSBjYWxjdWxhbiBpbmNsdXllbmRvIMO6bmljYW1lbnRlIGxvcyBwYcOtc2VzIHF1ZSBlbCBCYXLDs21ldHJvIGRlIGxhcyBBbcOpcmljYXMgaGEgZXN0dWRpYWRvIHJlZ3VsYXJtZW50ZSBkZXNkZSAyMDA2OiBBcmdlbnRpbmEsIEJyYXNpbCwgQm9saXZpYSwgQ2hpbGUsIENvbG9tYmlhLCBDb3N0YSBSaWNhLCBSZXDDumJsaWNhIERvbWluaWNhbmEsIEVjdWFkb3IsIEVsIFNhbHZhZG9yLCBHdWF0ZW1hbGEsIEhvbmR1cmFzLCBKYW1haWNhLCBNw6l4aWNvLCBOaWNhcmFndWEsIFBhbmFtw6EsIFBhcmFndWF5LCBQZXLDuiwgVXJ1Z3VheSIgKHAuNDYpLgpFbCBjw7NkaWdvIHNvbG8gZmlsdHJhIGxhIMO6bHRpbWEgcm9uZGEsIHF1ZSBpbmNsdXllIHBhw61zZXMgcXVlIG5vIGVzdMOhbiBlbiBlc2EgbGlzdGEsIGNvbW8gRXN0YWRvcyBVbmlkb3MgbyBDYW5hZMOhLgpEZSBvdHJvIGxhZG8sIGxvcyBjw6FsY3Vsb3MgcmVwb3J0YWRvcyBlbiBsYSBwdWJsaWNhY2nDs24gaW5jbHV5ZW4gZWwgdXNvIGRlIGZhY3RvcmVzIGRlIHBvbmRlcmFjacOzbiwgcXVlIG5vIGhlbW9zIGluY2x1aWRvIGVuIGVzdG9zIGPDoWxjdWxvcywgcGVybyBxdWUgZW4gb3Ryb3MgZG9jdW1lbnRvcyBpbmNvcnBvcmFyZW1vcyAodmVyIFthcXXDrV0oaHR0cHM6Ly9ycHVicy5jb20vYXJ0dXJvX21hbGRvbmFkby83Mjg2MjYpKS4KCiMgUmVzdW1lbgoKRW4gZXN0ZSBkb2N1bWVudG8gaGVtb3MgdmlzdG8gbG9zIGVsZW1lbnRvcyBiw6FzaWNvcyBkZSBsYSBtYW5pcHVsYWNpw7NuIHkgdHJhbnNmb3JtYWNpw7NuIGRlIGRhdG9zIHVzYW5kbyBlbCBCYXLDs21ldHJvIGRlIGxhcyBBbcOpcmljYXMuCkhlbW9zIHJlY29kaWZpY2FkbyB1bmEgdmFyaWFibGUgdXNhbmRvIGVsIGNvbWFuZG8gYHJlY29kZWAsIGhlbW9zIHNlbGVjY2lvbmFkbyBjYXNvcyB1c2FuZG8gYHN1YnNldGAgeSBoZW1vcyBjYWxjdWxhZG8gdW5hIG51ZXZhIHZhcmlhYmxlIGFsZ2VicmFpY2FtZW50ZSB5IGNvbiBlbCBjb21hbmRvIGBpZmVsc2VgLgo=