1. Introducción

Este es un cuaderno realizado en RStudio Cloud que tiene como objetivo ayudar a los estudiantes de Geomática Básica de la Universidad Nacional de Colombia a familiarizarse con las funcionalidades geoespaciales proporcionadas por el entorno del software R. En este cuaderno se describen conceptos básicos de interpolación espacial y además se aplican 3 técnicas de interpolación a un conjunto de datos de precipitación que cubren el departamento del Valle del Cauca.

La interpolación sirve para predecir valores para las celdas de un ráster a partir de una cantidad limitada de puntos de datos de muestra. Esta herramienta se puede utilizar para prever valores que no se conocen de cualquier dato de un punto geográfico como por ejemplo la elevación y precipitación. (1)

Las herramientas de interpolación de superficie crean una superficie continua (o predicción) a partir de valores de punto de muestra. Lo anterior se hace viable cuando se hace la suposición de que los objetos distribuidos espacialmente están correlacionados espacialmente, o sea, las cosas que están cerca, tienden a parecerce. Así, los puntos cercanos a los puntos de muestra, tienen más posibilidades de ser más similares que los que están más alejados. Para esto, existen diferentes maneras de derivar una predicción para cada ubicación; cada método se denomina modelo. Con cada modelo, se realizan diferentes suposiciones acerca de los datos, y algunos modelos son más aplicables para determinados datos y cada uno produce predicciones usando diferentes cálculos. (1)

En el presente trabajo, se realizarán 3 métodos de interpolación los cuales se describen a continuación:

Tabla 1. Herramientas de interpolación que se aplicarán a datos de precipitación
Descripción Herramienta de Interpolación
Interpola una superficie de ráster a partir de puntos Kriggin
Interpola una superficie de ráster a partir de puntos utilizando una técnica de distancia inversa ponderada IDW
Se basa en considerar que los puntos de una zona coinciden con el valor medido más próximo y generan, como consecuencia, zonas de influencia siendo el resultado la unión de polígonos que generan distintas zonas temáticas Polígonos de Thiessen

2. Descripción de la zona de estudio

El Departamento del Valle del Cauca está ubicado al suroccidente del país, formando parte de las regiones andina y pacífica; localizado entre los 05º02’08’’ y 03º04’02’’ de latitud norte y a los 72º42’27’’ y 74º27’13’’ de longitud oeste. Cuenta con una superficie de 22.140 km² lo que representa el 1.9 % del territorio nacional. Limita por el Norte con los departamentos de Chocó, Caldas y Quindío; por el Este con los departamentos del Quindío y Tolima, por el Sur con el departamento del Cauca y por el Oeste con el océano Pacífico y el departamento del Chocó. Según la Gobernación del Valle del Cauca (2018) el territorio colombiano se divide en secciones, con el objetivo de una mejor administración. Cada una posee límites determinados y se llaman departamentos, el país cuenta hoy en día con treinta y dos (32) en total. El nombre del departamento se deriva porque su llanura es atravesada por un río que lleva su mismo nombre (Cauca). El departamento se encuentra divido en 42 municinipios, su capital es Santiago de Cali la cual cuenta con 2,228 millones de habitantes, un porcentaje significativo frente a la población total del departamento. (2)

Las siguientes figuras fueron elaboradas en QGis. La figura 1 enseña la ubicación del departamento en el territorio nacional y la figura 2 muestra los diferentes municipios del departamento:

Figura 1. Ubicación del Valle del Cauca en Colombia

Figura 1. Ubicación del Valle del Cauca en Colombia

Figura 2. Mapa político del Valle del Cauca

Figura 2. Mapa político del Valle del Cauca

El Valle es reconocido por su industria azucarera, la cual provee los mercados colombianos y paises vecinos. El azúcar es obtenida de los grandes sembrados de caña de azúcar, obteniendo unos de los mayores rendimientos por hectárea a nivel mundial, debido a la industrialización y economía de escala que se aplica en la zona Vallecaucana. De igual forma se destaca la producción industrial de la ciudad de Yumbo (capital industrial de Colombia), donde se encuentran numerosas empresas, especialmente de papel, química y de cemento y la producción agroindustrial que circunda a las ciudades de Palmira, Tuluá, Buga, Cartago y Zarzal, además de la importantísima producción cafetera y frutícula de Sevilla, Caicedonia y demás poblaciones nortevallecaucanas. El puerto de Buenaventura es el principal puerto de Colombia sobre el Océano Pacífico, permitiendo la entrada y salida de productos y siendo de gran importancia para la economía del departamento y del país, además de ser vía primordial para la ya establecida Alianza del Pacífico, asociación económica de primer orden que tiene al Valle del Cauca como principal protagonista. En la Tabla 2 se analiza el porcentaje de participaciíon del departamento a nivel nacional con respecto a diferentes sectores económicos. (2)

Tabla 2. Actividades económicas en el Valle del Cauca
Actividad económica Porcentaje de participación a nivel nacional (%)
Agricultura 5,37
Productos de pesca 36
Industria 13,81
Servicios de tranporte 12,52
Comercio 11,34

Por otra parte, el Valle del Cauca tiene características climáticas variadas, siendo los 25 grados centígrados la temperatura promedio, para un altura de 1000m sobre el nivel del mar.

En cuanto a la hidrografía del departamento, el Valle del Cauca lo conforman dos sistemas hidrográficos perfectamente diferenciados, la vertiente del Pacífico, en la cual se ubican los ríos que drenan desde la vertiente occidental de la cordillera Occidental hacia el Océano Pacífico, y la vertiente del río Cauca a la cual vierten sus aguas los ríos que drenan de la vertiente oriental de la cordillera Occidental y la vertiente occidental de la cordillera Central. (3)

Figura 3. Mapa hidrográfico del Valle del Cauca

Figura 3. Mapa hidrográfico del Valle del Cauca

Continuando con el tema del clima, en cuanto a la precipitación del Valle del Cauca, el régimen de lluvias durante el año es de tipo bimodal. Los meses de mayores precipitaciones son abril-mayo en el primer semestre y octubre-noviembre, en el segundo, siendo ligeramente mayores los volúmenes del segundo semestre. La temporada seca principal ocurre hacia mediados de año, con mayor intensidad en los meses de junio-julio-agosto. La segunda temporada seca, aunque menos marcada, se presenta en los meses de enero a marzo. Sobre la franja del litoral Pacífico, no existe una temporada seca definida y prácticamente llueve durante todo el año. En algunos sitios, se observa una disminución de lluvias hacia el inicio del año. (4)

A continuación se muestran las precipitaciones en el departamento al final del mes de abril, siendo las partes moradas las zonas donde más llueve y las naranjas donde menos:

En otro orden de ideas, en cuanto a necesidades básicas insatisfechas (NBI) un indicador que mide la condición de pobreza estructural y se expresa como el porcentaje de personas vs. hogares sobre la población total vs. total de hogares que tiene al menos una necesidad básica insatisfecha. En Colombia y según el DANE, se tienen en cuenta las siguientes NBI: viviendas con hacinamiento crítico, con condiciones físicas impropias para el alojamiento humano, servicios inadecuados, alta dependencia económica o niños en edad escolar que no asisten a la escuela. (5)

En la siguiente gráfica se puede observar como se distribuyen las NBI en los municipios del Valle del Cauca, teniendo en cuenta que el tono más oscuro corresponde a una variable de mayor porcentaje de NBI y el tono más claro corresponde a una variable de menor porcentaje de NBI.

3. Descripción de datos y métodos

3.1 Datos

Para este reporte técnico se manejarán datos de precipitación obtenidos de la página de CHIRPS, el cual es un fondo que ha desarrollado técnicas para producir mapas de lluvia, principalmente en aquellas áreas donde los datos de superficie son escasos. La resolución de los datos es de 0,05°, estos se obtubieron con imágenes de satélite combinadas con datos de estaciones. CHIRPS tiene convenios con todos los paises y reciben diariamente información climatológica. De este modo, crean un formato raster tifs de precipitación que logran por medio de algoritmos que integran esta información, el cual es util para monitoriar precipitación o predecir tiempos de sequía.

Se descargó un conjunto de datos de precipitación de los últimos días de abril (del 23 al 30), en donde se tienen 2000 filas, 7200 columnas y 14400000 celdas y se encuentran en coordenadas geográficas.

Por otro lado, se necesita tambíen un shapefile que representa el departamento del Valle del Cauca que se encuentra en coordenadas WGS84 y tiene 42 municipios, con el objetivo de asociar los datos de precipitación al área de estudio.

3.2 Métodos

Se utilizarán puntos que expresan precipitación para realizar las técnicas de interpolación, aplicados en el Valle del Cauca los cuales se muestran en la siguiente gráfica:

A continuación se abordarán las técnicas de interpolación que se utilizarán en el trabajo:

  • IDW

La interpolación mediante distancia inversa ponderada es útil para determiar los valores de celda mediante una combinación ponderada linealmente de un conjunto de puntos de muestra. La ponderación es una función de la distancia inversa. La superficie que se interpola debe ser la de una variable dependiente de la ubicación. Así mismo, este método presupone que la variable que se representa cartográficamente disminuye su influencia a mayor distancia desde su ubicación de muestra, es decir, asume que los valores más cercanos están más relacionados que otros con su función. IDW es un método de interpolación espacial muy flexible ya que se puede configurar la interpolación de diferentes maneras, pues se puede espicificar el radio de búsqueda y la interpolación sólo utilizará el número de puntos conocidos dentro del radio de búsqueda. También se pueden establecer barreras. Si hay crestas en un perfil de elevación, o barreras de ruido, entonces estos son ejemplos apropiados para usar una barrera. Esta barrera de polilínea impide buscar los puntos de entrada de la muestra. (1)

  • Polígonos de Thiessen

La interpolación de áreas utiliza el concepto de polígonos de Thiessen para dibujar límites en torno a las áreas que tienen el mismo valor. Este tipo de interpolador se llama interpolador proximal. Esta técnica construye polígonos mediante la asignación por cada punto de un área de interés un valor del punto de muestra que sea más cercano. Crea superficies escalonadas, donde los valores pueden cambiar drásticamente en distancias cortas, es decir, un valor estimado está representado dentro del área de cada polígono. (6)

  • Kriging

Es una herramienta de interpolación que basicamente interpola una superficie de ráster a partir de puntos. Este es un proceso intensivo del procesador, por ende, la velocidad de ejecución depende de la calidad de puntos en el conjunto de datos o dataset (1), es deicr, datos que corresponden a los contenidos de una única tabla de base de datos o una única matriz de datos de estadística, donde cada columna de la tabla representa una variable en particular, y cada fila representa a un miembro determinado del conjunto de datos que se están tratando. En un conjunto de datos o dataset tenemos todos los valores que puede tener cada una de las variables, como por ejemplo la altura y el peso de un objeto, que corresponden a cada miembro del conjunto de datos. Cada uno de estos valores se conoce con el nombre de dato. (7)

Kriging presupone que la distancia o la dirección entre los puntos de muestra reflejan una correlación espacial que puede utilizarse para explicar la variación en la superficie. Además ajusta una función matemática a una cantidad especificada de puntos o a todos los puntos dentro de un radio específico para determinar el valor de salida para cada ubicación. (1)

Pondera los valores medidos circundantes para calcular una predicción de una ubicación sin mediciones, estas ponderaciones están basadas no solo en la distancia entre los puntos medidos y la ubicación de la predicción, sino también en la disposición espacial general de los puntos medidos. Para utilizar la disposición espacial en las ponderaciones, la correlación espacial debe estar cuantificada. Por lo tanto, en un kriging ordinario, la ponderación depende de un modelo ajustado a los puntos medidos, la distancia a la ubicación de la predicción y las relaciones espaciales entre los valores medidos alrededor de la ubicación de la predicción. (1)

4. Presentación de resultados

5. Analisis de resultados

5.1 Resultados de interpolación por IDW

Se usó una potencia de 2.0, debido a que es un grado aceptable en el que disminiuye la interacción espacial en función inversa a la distancia.

Con base a los resultados se puede decir que es un método acertado, pues este coincide con las zonas en las que las precipitaciones son mayores (occidente) y con las zonas en las que las precipitaciones son menores (norte y oriente)

En la siguiente gráfica se muestra cual es el valor de precipitación observada en el eje X y la predicha en interpolación en el eje Y teniendo en cuenta que se usó una potencia=2.0

Por otro lado, el error medio cuadrático es de 7.3 mm, es decir, el promedio de equivocación es de 7.3 mm cuando se usa esta interpolación.

[1] 7.307215

IDW es un buen método para interpolar. Sin embargo, para este caso se puede observar que el promedio de equivación es alto.

5.2. Resultados de interpolación por polígonos Thiessen

Este método permite que la precipitación que antes estaba unicamente en los puntos, ahora se encuentra en toda el área de estudio para áreas que son completamente rectangulares. Opera uniendo los puntos a a través de rectas. A las rectas luego se les trazan sus mediatrices hasta que se intersectan entre sí, generando los polígonos que en este caso son cuadrados porque los datos vienen de una grilla regular y tienen la misma distancia tanto en el eje X como en el Y. Cabe restaltar que cuando la distribución de puntos no es irregular no crea cuadrados por lo que se hace más apropiado este método para interpolar. La interpolación por polígonos de Thiessen es sencilla pero no brinda una presisión y exactitud confiables a la hora de estudiar alguna variable puesto que se hace uso de poligonos unidos por mediatrices y no superficies continuas a la hora de hacer la interpolación, lo que redunda en el hecho de que se ignoran algunos valores.

5.3 Resultados de interpolación por Kriging

Por medio de este método se obtiene un producto de mejor resolución que tenían los datos, se puede observar que los resultados siguen la tendencia natural de lo que se midio. Este método es más adecuado cuando se sabe que hay una influencia direccional o de la distancia correlacionada espacialmente en los datos, este presupone que la distancia o la dirección entre los puntos de muestra reflejan una correlación espacial que puede utilizarse para explicar la variación en la superficie. En los resultados se puede observar que la zona con mayor precipitación es el occidente del departamento, lo cual tiene bastante sentido puesto que esta zona corresponde a la ciudad de Buenaventura; ciudad cercana al departamento del Chocó, el cual es el departamento que presenta mayores precipitaciones en el país (4)

Conclusiones

Bibliografía

  1. Anónimo (sf) Vista general del conjutno de herramientas de interpolación, recuperdo el 20/06/2020 de https://desktop.arcgis.com/es/arcmap/10.3/tools/spatial-analyst-toolbox/an-overview-of-the-interpolation-tools.htm

  2. Gobernación Valle del Cauca (2018) Información del departamento Valle del Cauca, recuperado en 20/06/2020 de https://www.valledelcauca.gov.co/publicaciones/60135/identificacion-del-departamento/

  3. Anónimo (2015) Cu http://www.fgcsic.es/buro/docs/tu03mbm.php?id=cuales-son-los-departamentos-del-valle-del-cauca-0239f7

  4. Instituto de Hidrología, Meteorología y Estudios Ambientales (IDEAM) http://www.ideam.gov.co/ MAPAS: Atlas climatológico de Colombia - IDEAM

  5. DANE (2020) Necesidades básicas instatisfechas (NBI), recuperado el 20/06/2020 de https://www.dane.gov.co/index.php/estadisticas-por-tema/pobreza-y-condiciones-de-vida/necesidades-basicas-insatisfechas-nbi

  6. Jiménez J. (2018) Interpolación con la Distancia Inversa Ponderada (IDW), recuperado el 20/06/2020 de https://acolita.com/interpolacion-con-la-distancia-inversa-ponderada-idw/

  7. Balagueró T. (2018) ¿Qué son los datasets y los dataframes en el Big Data? recuperado el 20/06/2020 de https://www.deustoformacion.com/blog/programacion-diseno-web/que-son-datasets-dataframes-big-data

LS0tCnRpdGxlOiAiSW50ZXJwb2xhY2nDs24gZGUgZGF0b3MgZGUgcHJlY2lwaXRhY2nDs24iCmF1dGhvcjogIk5pY29sw6FzIENpZnVlbnRlcyBTYW50YSIKZGF0ZTogIjI0IGRlIEp1bmlvIGRlbCAyMDIwIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgojIyAxLiBJbnRyb2R1Y2Npw7NuCgpFc3RlIGVzIHVuIGN1YWRlcm5vIHJlYWxpemFkbyBlbiBSU3R1ZGlvIENsb3VkIHF1ZSB0aWVuZSBjb21vIG9iamV0aXZvIGF5dWRhciBhIGxvcyBlc3R1ZGlhbnRlcyBkZSBHZW9tw6F0aWNhIELDoXNpY2EgZGUgbGEgVW5pdmVyc2lkYWQgTmFjaW9uYWwgZGUgQ29sb21iaWEgYSBmYW1pbGlhcml6YXJzZSBjb24gbGFzIGZ1bmNpb25hbGlkYWRlcyBnZW9lc3BhY2lhbGVzIHByb3BvcmNpb25hZGFzIHBvciBlbCBlbnRvcm5vIGRlbCBzb2Z0d2FyZSBSLiBFbiBlc3RlIGN1YWRlcm5vIHNlIGRlc2NyaWJlbiBjb25jZXB0b3MgYsOhc2ljb3MgZGUgaW50ZXJwb2xhY2nDs24gZXNwYWNpYWwgeSBhZGVtw6FzIHNlIGFwbGljYW4gMyB0w6ljbmljYXMgZGUgaW50ZXJwb2xhY2nDs24gYSB1biBjb25qdW50byBkZSBkYXRvcyBkZSBwcmVjaXBpdGFjacOzbiBxdWUgY3VicmVuIGVsIGRlcGFydGFtZW50byBkZWwgVmFsbGUgZGVsIENhdWNhLiAKCkxhIGludGVycG9sYWNpw7NuIHNpcnZlIHBhcmEgcHJlZGVjaXIgdmFsb3JlcyBwYXJhIGxhcyBjZWxkYXMgZGUgdW4gcsOhc3RlciBhIHBhcnRpciBkZSB1bmEgY2FudGlkYWQgbGltaXRhZGEgZGUgcHVudG9zIGRlIGRhdG9zIGRlIG11ZXN0cmEuIEVzdGEgaGVycmFtaWVudGEgc2UgcHVlZGUgdXRpbGl6YXIgcGFyYSBwcmV2ZXIgdmFsb3JlcyBxdWUgbm8gc2UgY29ub2NlbiBkZSBjdWFscXVpZXIgZGF0byBkZSB1biBwdW50byBnZW9ncsOhZmljbyBjb21vIHBvciBlamVtcGxvIGxhIGVsZXZhY2nDs24geSBwcmVjaXBpdGFjacOzbi4gKDEpCgpMYXMgaGVycmFtaWVudGFzIGRlIGludGVycG9sYWNpw7NuIGRlIHN1cGVyZmljaWUgY3JlYW4gdW5hIHN1cGVyZmljaWUgY29udGludWEgKG8gcHJlZGljY2nDs24pIGEgcGFydGlyIGRlIHZhbG9yZXMgZGUgcHVudG8gZGUgbXVlc3RyYS4gTG8gYW50ZXJpb3Igc2UgaGFjZSB2aWFibGUgY3VhbmRvIHNlIGhhY2UgbGEgc3Vwb3NpY2nDs24gZGUgcXVlIGxvcyBvYmpldG9zIGRpc3RyaWJ1aWRvcyBlc3BhY2lhbG1lbnRlIGVzdMOhbiBjb3JyZWxhY2lvbmFkb3MgZXNwYWNpYWxtZW50ZSwgbyBzZWEsIGxhcyBjb3NhcyBxdWUgZXN0w6FuIGNlcmNhLCB0aWVuZGVuIGEgcGFyZWNlcmNlLiBBc8OtLCBsb3MgcHVudG9zIGNlcmNhbm9zIGEgbG9zIHB1bnRvcyBkZSBtdWVzdHJhLCB0aWVuZW4gbcOhcyBwb3NpYmlsaWRhZGVzIGRlIHNlciBtw6FzIHNpbWlsYXJlcyBxdWUgbG9zIHF1ZSBlc3TDoW4gbcOhcyBhbGVqYWRvcy4gUGFyYSBlc3RvLCBleGlzdGVuIGRpZmVyZW50ZXMgbWFuZXJhcyBkZSBkZXJpdmFyIHVuYSBwcmVkaWNjacOzbiBwYXJhIGNhZGEgdWJpY2FjacOzbjsgY2FkYSBtw6l0b2RvIHNlIGRlbm9taW5hIG1vZGVsby4gQ29uIGNhZGEgbW9kZWxvLCBzZSByZWFsaXphbiBkaWZlcmVudGVzIHN1cG9zaWNpb25lcyBhY2VyY2EgZGUgbG9zIGRhdG9zLCB5IGFsZ3Vub3MgbW9kZWxvcyBzb24gbcOhcyBhcGxpY2FibGVzIHBhcmEgZGV0ZXJtaW5hZG9zIGRhdG9zIHkgY2FkYSB1bm8gcHJvZHVjZSBwcmVkaWNjaW9uZXMgdXNhbmRvIGRpZmVyZW50ZXMgY8OhbGN1bG9zLiAoMSkKCkVuIGVsIHByZXNlbnRlIHRyYWJham8sIHNlIHJlYWxpemFyw6FuIDMgbcOpdG9kb3MgZGUgaW50ZXJwb2xhY2nDs24gbG9zIGN1YWxlcyBzZSBkZXNjcmliZW4gYSBjb250aW51YWNpw7NuOgoKIyMjIyMgKipUYWJsYSAxLioqIEhlcnJhbWllbnRhcyBkZSBpbnRlcnBvbGFjacOzbiBxdWUgc2UgYXBsaWNhcsOhbiBhIGRhdG9zIGRlIHByZWNpcGl0YWNpw7NuCgpEZXNjcmlwY2nDs24gfCBIZXJyYW1pZW50YSBkZSBJbnRlcnBvbGFjacOzbgotLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLSAKSW50ZXJwb2xhIHVuYSBzdXBlcmZpY2llIGRlIHLDoXN0ZXIgYSBwYXJ0aXIgZGUgcHVudG9zICB8ICBLcmlnZ2luIApJbnRlcnBvbGEgdW5hIHN1cGVyZmljaWUgZGUgcsOhc3RlciBhIHBhcnRpciBkZSBwdW50b3MgdXRpbGl6YW5kbyB1bmEgdMOpY25pY2EgZGUgZGlzdGFuY2lhIGludmVyc2EgcG9uZGVyYWRhICB8ICBJRFcKU2UgYmFzYSBlbiBjb25zaWRlcmFyIHF1ZSBsb3MgcHVudG9zIGRlIHVuYSB6b25hIGNvaW5jaWRlbiBjb24gZWwgdmFsb3IgbWVkaWRvIG3DoXMgcHLDs3hpbW8geSBnZW5lcmFuLCBjb21vIGNvbnNlY3VlbmNpYSwgem9uYXMgZGUgaW5mbHVlbmNpYSBzaWVuZG8gZWwgcmVzdWx0YWRvIGxhIHVuacOzbiBkZSBwb2zDrWdvbm9zIHF1ZSBnZW5lcmFuIGRpc3RpbnRhcyB6b25hcyB0ZW3DoXRpY2FzICB8ICBQb2zDrWdvbm9zIGRlIFRoaWVzc2VuIAoKIyMgMi4gRGVzY3JpcGNpw7NuIGRlIGxhIHpvbmEgZGUgZXN0dWRpbyAgCgpFbCBEZXBhcnRhbWVudG8gZGVsIFZhbGxlIGRlbCBDYXVjYSBlc3TDoSB1YmljYWRvIGFsIHN1cm9jY2lkZW50ZSBkZWwgcGHDrXMsIGZvcm1hbmRvIHBhcnRlIGRlIGxhcyByZWdpb25lcyBhbmRpbmEgeSBwYWPDrWZpY2E7IGxvY2FsaXphZG8gZW50cmUgbG9zIDA1wrowMuKAmTA44oCZ4oCZIHkgMDPCujA04oCZMDLigJnigJkgZGUgbGF0aXR1ZCBub3J0ZSB5IGEgbG9zIDcywro0MuKAmTI34oCZ4oCZIHkgNzTCujI34oCZMTPigJnigJkgZGUgbG9uZ2l0dWQgb2VzdGUuIEN1ZW50YSBjb24gdW5hIHN1cGVyZmljaWUgZGUgMjIuMTQwIGttwrIgbG8gcXVlIHJlcHJlc2VudGEgZWwgMS45ICUgZGVsIHRlcnJpdG9yaW8gbmFjaW9uYWwuIExpbWl0YSBwb3IgZWwgTm9ydGUgY29uIGxvcyBkZXBhcnRhbWVudG9zIGRlIENob2PDsywgQ2FsZGFzIHkgUXVpbmTDrW87IHBvciBlbCBFc3RlIGNvbiBsb3MgZGVwYXJ0YW1lbnRvcyBkZWwgUXVpbmTDrW8geSBUb2xpbWEsIHBvciBlbCBTdXIgY29uIGVsIGRlcGFydGFtZW50byBkZWwgQ2F1Y2EgeSBwb3IgZWwgT2VzdGUgY29uIGVsIG9jw6lhbm8gUGFjw61maWNvIHkgZWwgZGVwYXJ0YW1lbnRvIGRlbCBDaG9jw7MuIApTZWfDum4gbGEgR29iZXJuYWNpw7NuIGRlbCBWYWxsZSBkZWwgQ2F1Y2EgKDIwMTgpIGVsIHRlcnJpdG9yaW8gY29sb21iaWFubyBzZSBkaXZpZGUgZW4gc2VjY2lvbmVzLCBjb24gZWwgb2JqZXRpdm8gZGUgdW5hIG1lam9yIGFkbWluaXN0cmFjacOzbi4gQ2FkYSB1bmEgcG9zZWUgbMOtbWl0ZXMgZGV0ZXJtaW5hZG9zIHkgc2UgbGxhbWFuIGRlcGFydGFtZW50b3MsIGVsIHBhw61zIGN1ZW50YSBob3kgZW4gZMOtYSBjb24gdHJlaW50YSB5IGRvcyAoMzIpIGVuIHRvdGFsLiBFbCBub21icmUgZGVsIGRlcGFydGFtZW50byBzZSBkZXJpdmEgcG9ycXVlIHN1IGxsYW51cmEgZXMgYXRyYXZlc2FkYSBwb3IgdW4gcsOtbyBxdWUgbGxldmEgc3UgbWlzbW8gbm9tYnJlIChDYXVjYSkuCkVsIGRlcGFydGFtZW50byBzZSBlbmN1ZW50cmEgZGl2aWRvIGVuIDQyIG11bmljaW5pcGlvcywgc3UgY2FwaXRhbCBlcyBTYW50aWFnbyBkZSBDYWxpIGxhIGN1YWwgY3VlbnRhIGNvbiAyLDIyOCBtaWxsb25lcyBkZSBoYWJpdGFudGVzLCB1biBwb3JjZW50YWplIHNpZ25pZmljYXRpdm8gZnJlbnRlIGEgbGEgcG9ibGFjacOzbiB0b3RhbCBkZWwgZGVwYXJ0YW1lbnRvLiAoMikKCkxhcyBzaWd1aWVudGVzIGZpZ3VyYXMgZnVlcm9uIGVsYWJvcmFkYXMgZW4gUUdpcy4gTGEgZmlndXJhIDEgZW5zZcOxYSBsYSB1YmljYWNpw7NuIGRlbCBkZXBhcnRhbWVudG8gZW4gZWwgdGVycml0b3JpbyBuYWNpb25hbCB5IGxhIGZpZ3VyYSAyIG11ZXN0cmEgbG9zIGRpZmVyZW50ZXMgbXVuaWNpcGlvcyBkZWwgZGVwYXJ0YW1lbnRvOiAgCgohW0ZpZ3VyYSAxLiBVYmljYWNpw7NuIGRlbCBWYWxsZSBkZWwgQ2F1Y2EgZW4gQ29sb21iaWFdKHZhbGxlLnBuZyl7d2lkdGg9NjAlfQoKIVtGaWd1cmEgMi4gTWFwYSBwb2zDrXRpY28gZGVsIFZhbGxlIGRlbCBDYXVjYV0ocG9saXRpY28ucG5nKXt3aWR0aD01MCV9CgpFbCBWYWxsZSBlcyByZWNvbm9jaWRvIHBvciBzdSBpbmR1c3RyaWEgYXp1Y2FyZXJhLCBsYSBjdWFsIHByb3ZlZSBsb3MgbWVyY2Fkb3MgY29sb21iaWFub3MgeSBwYWlzZXMgdmVjaW5vcy4gCkVsIGF6w7pjYXIgZXMgb2J0ZW5pZGEgZGUgbG9zIGdyYW5kZXMgc2VtYnJhZG9zIGRlIGNhw7FhIGRlIGF6w7pjYXIsIG9idGVuaWVuZG8gdW5vcyBkZSBsb3MgbWF5b3JlcyByZW5kaW1pZW50b3MgcG9yIGhlY3TDoXJlYSBhIG5pdmVsIG11bmRpYWwsIGRlYmlkbyBhIGxhIGluZHVzdHJpYWxpemFjacOzbiB5IGVjb25vbcOtYSBkZSBlc2NhbGEgcXVlIHNlIGFwbGljYSBlbiBsYSB6b25hIFZhbGxlY2F1Y2FuYS4KRGUgaWd1YWwgZm9ybWEgc2UgZGVzdGFjYSBsYSBwcm9kdWNjacOzbiBpbmR1c3RyaWFsIGRlIGxhIGNpdWRhZCBkZSBZdW1ibyAoY2FwaXRhbCBpbmR1c3RyaWFsIGRlIENvbG9tYmlhKSwgZG9uZGUgc2UgZW5jdWVudHJhbiBudW1lcm9zYXMgZW1wcmVzYXMsIGVzcGVjaWFsbWVudGUgZGUgcGFwZWwsIHF1w61taWNhIHkgZGUgY2VtZW50byB5IGxhIHByb2R1Y2Npw7NuIGFncm9pbmR1c3RyaWFsIHF1ZSBjaXJjdW5kYSBhIGxhcyBjaXVkYWRlcyBkZSBQYWxtaXJhLCBUdWx1w6EsIEJ1Z2EsIENhcnRhZ28geSBaYXJ6YWwsIGFkZW3DoXMgZGUgbGEgaW1wb3J0YW50w61zaW1hIHByb2R1Y2Npw7NuIGNhZmV0ZXJhIHkgZnJ1dMOtY3VsYSBkZSBTZXZpbGxhLCBDYWljZWRvbmlhIHkgZGVtw6FzIHBvYmxhY2lvbmVzIG5vcnRldmFsbGVjYXVjYW5hcy4gRWwgcHVlcnRvIGRlIEJ1ZW5hdmVudHVyYSBlcyBlbCBwcmluY2lwYWwgcHVlcnRvIGRlIENvbG9tYmlhIHNvYnJlIGVsIE9jw6lhbm8gUGFjw61maWNvLCBwZXJtaXRpZW5kbyBsYSBlbnRyYWRhIHkgc2FsaWRhIGRlIHByb2R1Y3RvcyB5IHNpZW5kbyBkZSBncmFuIGltcG9ydGFuY2lhIHBhcmEgbGEgZWNvbm9tw61hIGRlbCBkZXBhcnRhbWVudG8geSBkZWwgcGHDrXMsIGFkZW3DoXMgZGUgc2VyIHbDrWEgcHJpbW9yZGlhbCBwYXJhIGxhIHlhIGVzdGFibGVjaWRhIEFsaWFuemEgZGVsIFBhY8OtZmljbywgYXNvY2lhY2nDs24gZWNvbsOzbWljYSBkZSBwcmltZXIgb3JkZW4gcXVlIHRpZW5lIGFsIFZhbGxlIGRlbCBDYXVjYSBjb21vIHByaW5jaXBhbCBwcm90YWdvbmlzdGEuIEVuIGxhIFRhYmxhIDIgc2UgYW5hbGl6YSBlbCBwb3JjZW50YWplIGRlIHBhcnRpY2lwYWNpw61vbiBkZWwgZGVwYXJ0YW1lbnRvIGEgbml2ZWwgbmFjaW9uYWwgY29uIHJlc3BlY3RvIGEgZGlmZXJlbnRlcyBzZWN0b3JlcyBlY29uw7NtaWNvcy4gKDIpCgojIyMjIyAqKlRhYmxhIDIuKiogQWN0aXZpZGFkZXMgZWNvbsOzbWljYXMgZW4gZWwgVmFsbGUgZGVsIENhdWNhCgpBY3RpdmlkYWQgZWNvbsOzbWljYSB8IFBvcmNlbnRhamUgZGUgcGFydGljaXBhY2nDs24gYSBuaXZlbCBuYWNpb25hbCAoJSkKLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0gCkFncmljdWx0dXJhIHwgNSwzNwpQcm9kdWN0b3MgZGUgcGVzY2EgfCAzNgpJbmR1c3RyaWEgIHwgIDEzLDgxClNlcnZpY2lvcyBkZSB0cmFucG9ydGUgIHwgIDEyLDUyCkNvbWVyY2lvICB8ICAxMSwzNAoKClBvciBvdHJhIHBhcnRlLCBlbCBWYWxsZSBkZWwgQ2F1Y2EgdGllbmUgY2FyYWN0ZXLDrXN0aWNhcyBjbGltw6F0aWNhcyB2YXJpYWRhcywgc2llbmRvIGxvcyAyNSBncmFkb3MgY2VudMOtZ3JhZG9zIGxhIHRlbXBlcmF0dXJhIHByb21lZGlvLCBwYXJhIHVuIGFsdHVyYSBkZSAxMDAwbSBzb2JyZSBlbCBuaXZlbCBkZWwgbWFyLiAKCkVuIGN1YW50byBhIGxhIGhpZHJvZ3JhZsOtYSBkZWwgZGVwYXJ0YW1lbnRvLCBlbCBWYWxsZSBkZWwgQ2F1Y2EgbG8gY29uZm9ybWFuIGRvcyBzaXN0ZW1hcyBoaWRyb2dyw6FmaWNvcyBwZXJmZWN0YW1lbnRlIGRpZmVyZW5jaWFkb3MsIGxhIHZlcnRpZW50ZSBkZWwgUGFjw61maWNvLCBlbiBsYSBjdWFsIHNlIHViaWNhbiBsb3MgcsOtb3MgcXVlIGRyZW5hbiBkZXNkZSBsYSB2ZXJ0aWVudGUgb2NjaWRlbnRhbCBkZSBsYSBjb3JkaWxsZXJhIE9jY2lkZW50YWwgaGFjaWEgZWwgT2PDqWFubyBQYWPDrWZpY28sIHkgbGEgdmVydGllbnRlIGRlbCByw61vIENhdWNhIGEgbGEgY3VhbCB2aWVydGVuIHN1cyBhZ3VhcyBsb3MgcsOtb3MgcXVlIGRyZW5hbiBkZSBsYSB2ZXJ0aWVudGUgb3JpZW50YWwgZGUgbGEgY29yZGlsbGVyYSBPY2NpZGVudGFsIHkgbGEgdmVydGllbnRlIG9jY2lkZW50YWwgZGUgbGEgY29yZGlsbGVyYSBDZW50cmFsLiAoMykKCjxjZW50ZXI+CgohW0ZpZ3VyYSAzLiBNYXBhIGhpZHJvZ3LDoWZpY28gZGVsIFZhbGxlIGRlbCBDYXVjYV0oaGlkcm9nYWZpY28uanBnKXt3aWR0aD02MCV9Cgo8L2NlbnRlcj4KCkNvbnRpbnVhbmRvIGNvbiBlbCB0ZW1hIGRlbCBjbGltYSwgZW4gY3VhbnRvIGEgbGEgcHJlY2lwaXRhY2nDs24gZGVsIFZhbGxlIGRlbCBDYXVjYSwgZWwgcsOpZ2ltZW4gZGUgbGx1dmlhcyBkdXJhbnRlIGVsIGHDsW8gZXMgZGUgdGlwbyBiaW1vZGFsLiBMb3MgbWVzZXMgZGUgbWF5b3JlcyBwcmVjaXBpdGFjaW9uZXMgc29uIGFicmlsLW1heW8gZW4gZWwgcHJpbWVyIHNlbWVzdHJlIHkgb2N0dWJyZS1ub3ZpZW1icmUsIGVuIGVsIHNlZ3VuZG8sIHNpZW5kbyBsaWdlcmFtZW50ZSBtYXlvcmVzIGxvcyB2b2zDum1lbmVzIGRlbCBzZWd1bmRvIHNlbWVzdHJlLiBMYSB0ZW1wb3JhZGEgc2VjYSBwcmluY2lwYWwgb2N1cnJlIGhhY2lhIG1lZGlhZG9zIGRlIGHDsW8sIGNvbiBtYXlvciBpbnRlbnNpZGFkIGVuIGxvcyBtZXNlcyBkZSBqdW5pby1qdWxpby1hZ29zdG8uIExhIHNlZ3VuZGEgdGVtcG9yYWRhIHNlY2EsIGF1bnF1ZSBtZW5vcyBtYXJjYWRhLCBzZSBwcmVzZW50YSBlbiBsb3MgbWVzZXMgZGUgZW5lcm8gYSBtYXJ6by4gU29icmUgbGEgZnJhbmphIGRlbCBsaXRvcmFsIFBhY8OtZmljbywgbm8gZXhpc3RlIHVuYSB0ZW1wb3JhZGEgc2VjYSBkZWZpbmlkYSB5IHByw6FjdGljYW1lbnRlIGxsdWV2ZSBkdXJhbnRlIHRvZG8gZWwgYcOxby4gRW4gYWxndW5vcyBzaXRpb3MsIHNlIG9ic2VydmEgdW5hIGRpc21pbnVjacOzbiBkZSBsbHV2aWFzIGhhY2lhIGVsIGluaWNpbyBkZWwgYcOxby4gKDQpCgpBIGNvbnRpbnVhY2nDs24gc2UgbXVlc3RyYW4gbGFzIHByZWNpcGl0YWNpb25lcyBlbiBlbCBkZXBhcnRhbWVudG8gYWwgZmluYWwgZGVsIG1lcyBkZSBhYnJpbCwgc2llbmRvIGxhcyBwYXJ0ZXMgbW9yYWRhcyBsYXMgem9uYXMgZG9uZGUgbcOhcyBsbHVldmUgeSBsYXMgbmFyYW5qYXMgZG9uZGUgbWVub3M6CgpgYGB7ciBlY2hvPUZBTFNFLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0KbGlicmFyeShsZWFmbGV0KQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKcGFsIDwtIGNvbG9yTnVtZXJpYyhjKCJyZWQiLCAib3JhbmdlIiwgInllbGxvdyIsICJibHVlIiwgImRhcmtibHVlIiksIHZhbHVlcyhwcmVjaXAubWFzayksCiAgbmEuY29sb3IgPSAidHJhbnNwYXJlbnQiKQoKbGVhZmxldCgpICU+JSBhZGRUaWxlcygpICU+JQogIGFkZFJhc3RlckltYWdlKHByZWNpcC5tYXNrLCBjb2xvcnMgPSBwYWwsIG9wYWNpdHkgPSAwLjYpICU+JQogIGFkZExlZ2VuZChwYWwgPSBwYWwsIHZhbHVlcyA9IHZhbHVlcyhwcmVjaXAubWFzayksCiAgICB0aXRsZSA9ICJQcmVjaXBpdGFjaXBuZXMgZW4gZWwgVmFsbGUgZGVsIENhdWNhIGFsIGZpbmFsIGRlbCBtZXMgYWJyaWwgW21tXSIpCmBgYAoKCgpFbiBvdHJvIG9yZGVuIGRlIGlkZWFzLCBlbiBjdWFudG8gYSBuZWNlc2lkYWRlcyBiw6FzaWNhcyBpbnNhdGlzZmVjaGFzIChOQkkpIHVuIGluZGljYWRvciBxdWUgbWlkZSBsYSBjb25kaWNpw7NuIGRlIHBvYnJlemEgZXN0cnVjdHVyYWwgeSBzZSBleHByZXNhIGNvbW8gZWwgcG9yY2VudGFqZSBkZSBwZXJzb25hcyB2cy4gaG9nYXJlcyBzb2JyZSBsYSBwb2JsYWNpw7NuIHRvdGFsIHZzLiB0b3RhbCBkZSBob2dhcmVzIHF1ZSB0aWVuZSBhbCBtZW5vcyB1bmEgbmVjZXNpZGFkIGLDoXNpY2EgaW5zYXRpc2ZlY2hhLiBFbiBDb2xvbWJpYSB5IHNlZ8O6biBlbCBEQU5FLCBzZSB0aWVuZW4gZW4gY3VlbnRhIGxhcyBzaWd1aWVudGVzIE5CSTogdml2aWVuZGFzIGNvbiBoYWNpbmFtaWVudG8gY3LDrXRpY28sIGNvbiBjb25kaWNpb25lcyBmw61zaWNhcyBpbXByb3BpYXMgcGFyYSBlbCBhbG9qYW1pZW50byBodW1hbm8sIHNlcnZpY2lvcyBpbmFkZWN1YWRvcywgYWx0YSBkZXBlbmRlbmNpYSBlY29uw7NtaWNhIG8gbmnDsW9zIGVuIGVkYWQgZXNjb2xhciBxdWUgbm8gYXNpc3RlbiBhIGxhIGVzY3VlbGEuICg1KQoKRW4gbGEgc2lndWllbnRlIGdyw6FmaWNhIHNlIHB1ZWRlIG9ic2VydmFyIGNvbW8gc2UgZGlzdHJpYnV5ZW4gbGFzIE5CSSBlbiBsb3MgbXVuaWNpcGlvcyBkZWwgVmFsbGUgZGVsIENhdWNhLCB0ZW5pZW5kbyBlbiBjdWVudGEgcXVlIGVsIHRvbm8gbcOhcyBvc2N1cm8gY29ycmVzcG9uZGUgYSB1bmEgdmFyaWFibGUgZGUgbWF5b3IgcG9yY2VudGFqZSBkZSBOQkkgeSBlbCB0b25vIG3DoXMgY2xhcm8gY29ycmVzcG9uZGUgYSB1bmEgdmFyaWFibGUgZGUgbWVub3IgcG9yY2VudGFqZSBkZSBOQkkuCgohW10obmJpLnBuZykKIAoKIyMgMy4gRGVzY3JpcGNpw7NuIGRlIGRhdG9zIHkgbcOpdG9kb3MKCiMjIyAzLjEgRGF0b3MKClBhcmEgZXN0ZSByZXBvcnRlIHTDqWNuaWNvIHNlIG1hbmVqYXLDoW4gZGF0b3MgZGUgcHJlY2lwaXRhY2nDs24gb2J0ZW5pZG9zIGRlIGxhIHDDoWdpbmEgZGUgQ0hJUlBTLCBlbCBjdWFsIGVzIHVuIGZvbmRvIHF1ZSBoYSBkZXNhcnJvbGxhZG8gdMOpY25pY2FzIHBhcmEgcHJvZHVjaXIgbWFwYXMgZGUgbGx1dmlhLCBwcmluY2lwYWxtZW50ZSBlbiBhcXVlbGxhcyDDoXJlYXMgZG9uZGUgbG9zIGRhdG9zIGRlIHN1cGVyZmljaWUgc29uIGVzY2Fzb3MuIExhIHJlc29sdWNpw7NuIGRlIGxvcyBkYXRvcyBlcyBkZSAwLDA1wrAsIGVzdG9zIHNlIG9idHViaWVyb24gY29uIGltw6FnZW5lcyBkZSBzYXTDqWxpdGUgY29tYmluYWRhcyBjb24gZGF0b3MgZGUgZXN0YWNpb25lcy4gQ0hJUlBTIHRpZW5lIGNvbnZlbmlvcyBjb24gdG9kb3MgbG9zIHBhaXNlcyB5IHJlY2liZW4gZGlhcmlhbWVudGUgaW5mb3JtYWNpw7NuIGNsaW1hdG9sw7NnaWNhLiBEZSBlc3RlIG1vZG8sIGNyZWFuIHVuIGZvcm1hdG8gcmFzdGVyIHRpZnMgZGUgcHJlY2lwaXRhY2nDs24gcXVlIGxvZ3JhbiBwb3IgbWVkaW8gZGUgYWxnb3JpdG1vcyBxdWUgaW50ZWdyYW4gZXN0YSBpbmZvcm1hY2nDs24sIGVsIGN1YWwgZXMgdXRpbCBwYXJhIG1vbml0b3JpYXIgcHJlY2lwaXRhY2nDs24gbyBwcmVkZWNpciB0aWVtcG9zIGRlIHNlcXXDrWEuCgpTZSBkZXNjYXJnw7MgdW4gY29uanVudG8gZGUgZGF0b3MgZGUgcHJlY2lwaXRhY2nDs24gZGUgbG9zIMO6bHRpbW9zIGTDrWFzIGRlIGFicmlsIChkZWwgMjMgYWwgMzApLCBlbiBkb25kZSAgc2UgdGllbmVuIDIwMDAgZmlsYXMsIDcyMDAgY29sdW1uYXMgeSAxNDQwMDAwMCBjZWxkYXMgeSBzZSAgZW5jdWVudHJhbiBlbiBjb29yZGVuYWRhcyBnZW9ncsOhZmljYXMuCgpQb3Igb3RybyBsYWRvLCBzZSBuZWNlc2l0YSB0YW1iw61lbiB1biBzaGFwZWZpbGUgcXVlIHJlcHJlc2VudGEgZWwgZGVwYXJ0YW1lbnRvIGRlbCBWYWxsZSBkZWwgQ2F1Y2EgcXVlIHNlIGVuY3VlbnRyYSBlbiBjb29yZGVuYWRhcyBXR1M4NCB5IHRpZW5lIDQyIG11bmljaXBpb3MsIGNvbiBlbCBvYmpldGl2byBkZSBhc29jaWFyIGxvcyBkYXRvcyBkZSBwcmVjaXBpdGFjacOzbiBhbCDDoXJlYSBkZSBlc3R1ZGlvLgogCiMjIyAzLjIgTcOpdG9kb3MKClNlIHV0aWxpemFyw6FuIHB1bnRvcyBxdWUgZXhwcmVzYW4gcHJlY2lwaXRhY2nDs24gcGFyYSByZWFsaXphciBsYXMgdMOpY25pY2FzIGRlIGludGVycG9sYWNpw7NuLCBhcGxpY2Fkb3MgZW4gZWwgVmFsbGUgZGVsIENhdWNhIGxvcyBjdWFsZXMgc2UgbXVlc3RyYW4gZW4gbGEgc2lndWllbnRlIGdyw6FmaWNhOgoKYGBge3IgZWNobz1GQUxTRSx3YXJuaW5nPUZBTFNFfQpwbG90KHByZWNpcC5tYXNrLCBtYWluPSAiUHJlY2lwaXRhY2lvbmVzIGVuIGVsIFZhbGxlIGRlbCBDYXVjYSBhbCBmaW5hbCBkZSBhYnJpbCBbbW1dIikKcGxvdChhb2ksIGFkZD1UUlVFKQpwb2ludHMocHJlY2lwLnBvaW50cyR4LCBwcmVjaXAucG9pbnRzJHksIGNvbCA9ICJyZWQiLCBjZXggPSAuNikKYGBgCgoKQSBjb250aW51YWNpw7NuIHNlIGFib3JkYXLDoW4gbGFzIHTDqWNuaWNhcyBkZSBpbnRlcnBvbGFjacOzbiBxdWUgc2UgdXRpbGl6YXLDoW4gZW4gZWwgdHJhYmFqbzoKCi0gKipJRFcqKgoKTGEgaW50ZXJwb2xhY2nDs24gbWVkaWFudGUgZGlzdGFuY2lhIGludmVyc2EgcG9uZGVyYWRhIGVzIMO6dGlsIHBhcmEgZGV0ZXJtaWFyIGxvcyB2YWxvcmVzIGRlIGNlbGRhIG1lZGlhbnRlIHVuYSBjb21iaW5hY2nDs24gcG9uZGVyYWRhIGxpbmVhbG1lbnRlIGRlIHVuIGNvbmp1bnRvIGRlIHB1bnRvcyBkZSBtdWVzdHJhLiBMYSBwb25kZXJhY2nDs24gZXMgdW5hIGZ1bmNpw7NuIGRlIGxhIGRpc3RhbmNpYSBpbnZlcnNhLiBMYSBzdXBlcmZpY2llIHF1ZSBzZSBpbnRlcnBvbGEgZGViZSBzZXIgbGEgZGUgdW5hIHZhcmlhYmxlIGRlcGVuZGllbnRlIGRlIGxhIHViaWNhY2nDs24uIEFzw60gbWlzbW8sIGVzdGUgbcOpdG9kbyBwcmVzdXBvbmUgcXVlIGxhIHZhcmlhYmxlIHF1ZSBzZSByZXByZXNlbnRhIGNhcnRvZ3LDoWZpY2FtZW50ZSBkaXNtaW51eWUgc3UgaW5mbHVlbmNpYSBhIG1heW9yIGRpc3RhbmNpYSBkZXNkZSBzdSB1YmljYWNpw7NuIGRlIG11ZXN0cmEsIGVzIGRlY2lyLCBhc3VtZSBxdWUgbG9zIHZhbG9yZXMgbcOhcyBjZXJjYW5vcyBlc3TDoW4gbcOhcyByZWxhY2lvbmFkb3MgcXVlIG90cm9zIGNvbiBzdSBmdW5jacOzbi4KSURXIGVzIHVuIG3DqXRvZG8gZGUgaW50ZXJwb2xhY2nDs24gZXNwYWNpYWwgbXV5IGZsZXhpYmxlIHlhIHF1ZSBzZSBwdWVkZSBjb25maWd1cmFyIGxhIGludGVycG9sYWNpw7NuIGRlIGRpZmVyZW50ZXMgbWFuZXJhcywgcHVlcyBzZSBwdWVkZSBlc3BpY2lmaWNhciBlbCByYWRpbyBkZSBiw7pzcXVlZGEgeSBsYSBpbnRlcnBvbGFjacOzbiBzw7NsbyB1dGlsaXphcsOhIGVsIG7Dum1lcm8gZGUgcHVudG9zIGNvbm9jaWRvcyBkZW50cm8gZGVsIHJhZGlvIGRlIGLDunNxdWVkYS4gVGFtYmnDqW4gc2UgcHVlZGVuIGVzdGFibGVjZXIgYmFycmVyYXMuIFNpIGhheSBjcmVzdGFzIGVuIHVuIHBlcmZpbCBkZSBlbGV2YWNpw7NuLCBvIGJhcnJlcmFzIGRlIHJ1aWRvLCBlbnRvbmNlcyBlc3RvcyBzb24gZWplbXBsb3MgYXByb3BpYWRvcyBwYXJhIHVzYXIgdW5hIGJhcnJlcmEuIEVzdGEgYmFycmVyYSBkZSBwb2xpbMOtbmVhIGltcGlkZSBidXNjYXIgbG9zIHB1bnRvcyBkZSBlbnRyYWRhIGRlIGxhIG11ZXN0cmEuICgxKSAKCiAKLSAqKlBvbMOtZ29ub3MgZGUgVGhpZXNzZW4qKgoKTGEgaW50ZXJwb2xhY2nDs24gZGUgw6FyZWFzIHV0aWxpemEgZWwgY29uY2VwdG8gZGUgcG9sw61nb25vcyBkZSBUaGllc3NlbiBwYXJhIGRpYnVqYXIgbMOtbWl0ZXMgZW4gdG9ybm8gYSBsYXMgw6FyZWFzIHF1ZSB0aWVuZW4gZWwgbWlzbW8gdmFsb3IuIEVzdGUgdGlwbyBkZSBpbnRlcnBvbGFkb3Igc2UgbGxhbWEgaW50ZXJwb2xhZG9yIHByb3hpbWFsLiAKRXN0YSB0w6ljbmljYSBjb25zdHJ1eWUgcG9sw61nb25vcyBtZWRpYW50ZSBsYSBhc2lnbmFjacOzbiBwb3IgY2FkYSBwdW50byBkZSB1biDDoXJlYSBkZSBpbnRlcsOpcyB1biB2YWxvciBkZWwgcHVudG8gZGUgbXVlc3RyYSBxdWUgc2VhIG3DoXMgY2VyY2Fuby4gQ3JlYSBzdXBlcmZpY2llcyBlc2NhbG9uYWRhcywgZG9uZGUgbG9zIHZhbG9yZXMgcHVlZGVuIGNhbWJpYXIgZHLDoXN0aWNhbWVudGUgZW4gZGlzdGFuY2lhcyBjb3J0YXMsIGVzIGRlY2lyLCB1biB2YWxvciBlc3RpbWFkbyBlc3TDoSByZXByZXNlbnRhZG8gZGVudHJvIGRlbCDDoXJlYSBkZSBjYWRhIHBvbMOtZ29uby4gKDYpCgotICoqS3JpZ2luZyoqCgpFcyB1bmEgaGVycmFtaWVudGEgZGUgaW50ZXJwb2xhY2nDs24gcXVlIGJhc2ljYW1lbnRlIGludGVycG9sYSB1bmEgc3VwZXJmaWNpZSBkZSByw6FzdGVyIGEgcGFydGlyIGRlIHB1bnRvcy4gRXN0ZSBlcyB1biBwcm9jZXNvIGludGVuc2l2byBkZWwgcHJvY2VzYWRvciwgcG9yIGVuZGUsIGxhIHZlbG9jaWRhZCBkZSBlamVjdWNpw7NuIGRlcGVuZGUgZGUgbGEgY2FsaWRhZCBkZSBwdW50b3MgZW4gZWwgY29uanVudG8gZGUgZGF0b3MgbyBkYXRhc2V0ICgxKSwgZXMgZGVpY3IsIGRhdG9zIHF1ZSBjb3JyZXNwb25kZW4gYSBsb3MgY29udGVuaWRvcyBkZSB1bmEgw7puaWNhIHRhYmxhIGRlIGJhc2UgZGUgZGF0b3MgbyB1bmEgw7puaWNhIG1hdHJpeiBkZSBkYXRvcyBkZSBlc3RhZMOtc3RpY2EsIGRvbmRlIGNhZGEgY29sdW1uYSBkZSBsYSB0YWJsYSByZXByZXNlbnRhIHVuYSB2YXJpYWJsZSBlbiBwYXJ0aWN1bGFyLCB5IGNhZGEgZmlsYSByZXByZXNlbnRhIGEgdW4gbWllbWJybyBkZXRlcm1pbmFkbyBkZWwgY29uanVudG8gZGUgZGF0b3MgcXVlIHNlIGVzdMOhbiB0cmF0YW5kby4gRW4gdW4gY29uanVudG8gZGUgZGF0b3MgbyBkYXRhc2V0IHRlbmVtb3MgdG9kb3MgbG9zIHZhbG9yZXMgcXVlIHB1ZWRlIHRlbmVyIGNhZGEgdW5hIGRlIGxhcyB2YXJpYWJsZXMsIGNvbW8gcG9yIGVqZW1wbG8gbGEgYWx0dXJhIHkgZWwgcGVzbyBkZSB1biBvYmpldG8sIHF1ZSBjb3JyZXNwb25kZW4gYSBjYWRhIG1pZW1icm8gZGVsIGNvbmp1bnRvIGRlIGRhdG9zLiBDYWRhIHVubyBkZSBlc3RvcyB2YWxvcmVzIHNlIGNvbm9jZSBjb24gZWwgbm9tYnJlIGRlIGRhdG8uICg3KQoKS3JpZ2luZyBwcmVzdXBvbmUgcXVlIGxhIGRpc3RhbmNpYSBvIGxhIGRpcmVjY2nDs24gZW50cmUgbG9zIHB1bnRvcyBkZSBtdWVzdHJhIHJlZmxlamFuIHVuYSBjb3JyZWxhY2nDs24gZXNwYWNpYWwgcXVlIHB1ZWRlIHV0aWxpemFyc2UgcGFyYSBleHBsaWNhciBsYSB2YXJpYWNpw7NuIGVuIGxhIHN1cGVyZmljaWUuIEFkZW3DoXMgYWp1c3RhIHVuYSBmdW5jacOzbiBtYXRlbcOhdGljYSBhIHVuYSBjYW50aWRhZCBlc3BlY2lmaWNhZGEgZGUgcHVudG9zIG8gYSB0b2RvcyBsb3MgcHVudG9zIGRlbnRybyBkZSB1biByYWRpbyBlc3BlY8OtZmljbyBwYXJhIGRldGVybWluYXIgZWwgdmFsb3IgZGUgc2FsaWRhIHBhcmEgY2FkYSB1YmljYWNpw7NuLiAoMSkKClBvbmRlcmEgbG9zIHZhbG9yZXMgbWVkaWRvcyBjaXJjdW5kYW50ZXMgcGFyYSBjYWxjdWxhciB1bmEgcHJlZGljY2nDs24gZGUgdW5hIHViaWNhY2nDs24gc2luIG1lZGljaW9uZXMsIGVzdGFzIHBvbmRlcmFjaW9uZXMgZXN0w6FuIGJhc2FkYXMgbm8gc29sbyBlbiBsYSBkaXN0YW5jaWEgZW50cmUgbG9zIHB1bnRvcyBtZWRpZG9zIHkgbGEgdWJpY2FjacOzbiBkZSBsYSBwcmVkaWNjacOzbiwgc2lubyB0YW1iacOpbiBlbiBsYSBkaXNwb3NpY2nDs24gZXNwYWNpYWwgZ2VuZXJhbCBkZSBsb3MgcHVudG9zIG1lZGlkb3MuIFBhcmEgdXRpbGl6YXIgbGEgZGlzcG9zaWNpw7NuIGVzcGFjaWFsIGVuIGxhcyBwb25kZXJhY2lvbmVzLCBsYSBjb3JyZWxhY2nDs24gZXNwYWNpYWwgZGViZSBlc3RhciBjdWFudGlmaWNhZGEuIFBvciBsbyB0YW50bywgZW4gdW4ga3JpZ2luZyBvcmRpbmFyaW8sIGxhIHBvbmRlcmFjacOzbgpkZXBlbmRlIGRlIHVuIG1vZGVsbyBhanVzdGFkbyBhIGxvcyBwdW50b3MgbWVkaWRvcywgbGEgZGlzdGFuY2lhIGEgbGEgdWJpY2FjacOzbiBkZSBsYSBwcmVkaWNjacOzbiB5IGxhcyByZWxhY2lvbmVzIGVzcGFjaWFsZXMgZW50cmUgbG9zIHZhbG9yZXMgbWVkaWRvcyBhbHJlZGVkb3IgZGUgbGEgdWJpY2FjacOzbiBkZSBsYSBwcmVkaWNjacOzbi4gKDEpCgoKIyMgNC4gUHJlc2VudGFjacOzbiBkZSByZXN1bHRhZG9zCgoKLSBVc2FuZG8gZWwgbcOpdG9kbyBJRFcgCgpgYGB7ciBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQp0bV9zaGFwZShyLm0pICsgCiAgdG1fcmFzdGVyKG49MTAscGFsZXR0ZSA9ICJCckJHIiwgYXV0by5wYWxldHRlLm1hcHBpbmcgPSBGQUxTRSwKICAgICAgICAgICAgdGl0bGU9IkRpc3RhbmNpYSBJbnZlcnNhIFBvbmRlcmFkYSBcblByZWNpcGl0YWNpw7NuIHByZWRpY2hhIFxuKGVuIG1tKSIpICsgCiAgdG1fc2hhcGUocHJlY2lwMikgKyB0bV9kb3RzKHNpemU9MC4yKSArCiAgdG1fbGVnZW5kKGxlZ2VuZC5vdXRzaWRlPVRSVUUpCmBgYAoKCgotIFVzYW5kbyBlbCBtw6l0b2RvIGRlIFBvbMOtZ29ub3MgZGUgVGhpZXNzZW4KCmBgYHtyIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnRtX3NoYXBlKHRoLmNscCkgKyAKICB0bV9wb2x5Z29ucyhjb2w9ImxsdXZpYSIsIHBhbGV0dGU9IlJkQnUiLCBtaWRwb2ludD0zLjAsCiAgICAgICAgICAgICAgdGl0bGU9IlBvbMOtZ29ub3MgZGUgVGhpZXNzZW4gXG5QcmVjaXBpdGFjacOzbiBwcmVkaWNoYSBcbihpbiBtbSkiKSArCiAgdG1fbGVnZW5kKGxlZ2VuZC5vdXRzaWRlPVRSVUUpCmBgYAoKLSBVc2FuZG8gZWwgbcOpdG9kbyBLcmlnaW5nCgpgYGB7ciBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIFBsb3QgdGhlIG1hcAp0bV9zaGFwZShyLm0pICsgCiAgdG1fcmFzdGVyKG49MTAsIHBhbGV0dGU9IlJkQnUiLCBhdXRvLnBhbGV0dGUubWFwcGluZz1GQUxTRSwgCiAgICAgICAgICAgIHRpdGxlPSJLcmlnaW5nIFVuaXZlcnNhbFxuUHJlY2lwaXRhY2nDs24gcHJlY2lkY2hhIFxuKGVuIG1tKSIpICsKICB0bV9zaGFwZShQKSArIHRtX2RvdHMoc2l6ZT0wLjIpICsKICB0bV9sZWdlbmQobGVnZW5kLm91dHNpZGU9VFJVRSkKYGBgCgojIyA1LiBBbmFsaXNpcyBkZSByZXN1bHRhZG9zCgojIyMgNS4xIFJlc3VsdGFkb3MgZGUgaW50ZXJwb2xhY2nDs24gcG9yIElEVwoKU2UgdXPDsyB1bmEgcG90ZW5jaWEgZGUgMi4wLCBkZWJpZG8gYSBxdWUgZXMgdW4gZ3JhZG8gYWNlcHRhYmxlIGVuIGVsIHF1ZSBkaXNtaW5pdXllIGxhIGludGVyYWNjacOzbiBlc3BhY2lhbCBlbiBmdW5jacOzbiBpbnZlcnNhIGEgbGEgZGlzdGFuY2lhLgoKQ29uIGJhc2UgYSBsb3MgcmVzdWx0YWRvcyBzZSBwdWVkZSBkZWNpciBxdWUgZXMgdW4gbcOpdG9kbyBhY2VydGFkbywgcHVlcyBlc3RlIGNvaW5jaWRlIGNvbiBsYXMgem9uYXMgZW4gbGFzIHF1ZSBsYXMgcHJlY2lwaXRhY2lvbmVzIHNvbiBtYXlvcmVzIChvY2NpZGVudGUpIHkgY29uIGxhcyB6b25hcyBlbiBsYXMgcXVlIGxhcyBwcmVjaXBpdGFjaW9uZXMgc29uIG1lbm9yZXMgKG5vcnRlIHkgb3JpZW50ZSkKCkVuIGxhIHNpZ3VpZW50ZSBncsOhZmljYSBzZSBtdWVzdHJhIGN1YWwgZXMgZWwgdmFsb3IgZGUgcHJlY2lwaXRhY2nDs24gb2JzZXJ2YWRhIGVuIGVsIGVqZSBYIHkgbGEgcHJlZGljaGEgZW4gaW50ZXJwb2xhY2nDs24gZW4gZWwgZWplIFkgdGVuaWVuZG8gZW4gY3VlbnRhIHF1ZSBzZSB1c8OzIHVuYSBwb3RlbmNpYT0yLjAKCgpgYGB7ciBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpPUCA8LSBwYXIocHR5PSJzIiwgbWFyPWMoNCwzLDAsMCkpCiAgcGxvdChJRFcub3V0IH4gUCRsbHV2aWEsIGFzcD0xLCB4bGFiPSJPYnNlcnZhZG8iLCB5bGFiPSJQcmVkaWNobyIsIHBjaD0xNiwKICAgICAgIGNvbD1yZ2IoMCwwLDAsMC41KSkKICBhYmxpbmUobG0oSURXLm91dCB+IFAkbGx1dmlhKSwgY29sPSJyZWQiLCBsdz0yLGx0eT0yKQogIGFibGluZSgwLDEpCmBgYApQb3Igb3RybyBsYWRvLCBlbCBlcnJvciBtZWRpbyBjdWFkcsOhdGljbyBlcyBkZSA3LjMgbW0sIGVzIGRlY2lyLCBlbCBwcm9tZWRpbyBkZSBlcXVpdm9jYWNpw7NuIGVzIGRlIDcuMyBtbSBjdWFuZG8gc2UgdXNhIGVzdGEgaW50ZXJwb2xhY2nDs24uIAoKYGBge3IgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0Kc3FydCggc3VtKChJRFcub3V0IC0gUCRsbHV2aWEpXjIpIC8gbGVuZ3RoKFApKQpgYGAKIElEVyBlcyB1biBidWVuIG3DqXRvZG8gcGFyYSBpbnRlcnBvbGFyLiBTaW4gZW1iYXJnbywgcGFyYSBlc3RlIGNhc28gc2UgcHVlZGUgb2JzZXJ2YXIgcXVlIGVsIHByb21lZGlvIGRlIGVxdWl2YWNpw7NuIGVzIGFsdG8uCgpgYGB7ciBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpmLjEgPC0gYXMuZm9ybXVsYShsbHV2aWEgfiBYICsgWSkgCiAKIyBBZGQgWCBhbmQgWSB0byBQClAkWCA8LSBjb29yZGluYXRlcyhQKVssMV0KUCRZIDwtIGNvb3JkaW5hdGVzKFApWywyXQoKIyBSdW4gdGhlIHJlZ3Jlc3Npb24gbW9kZWwKbG0uMSA8LSBsbSggZi4xLCBkYXRhPVApCgojIFVzZSB0aGUgcmVncmVzc2lvbiBtb2RlbCBvdXRwdXQgdG8gaW50ZXJwb2xhdGUgdGhlIHN1cmZhY2UKZGF0LjFzdCA8LSBTcGF0aWFsR3JpZERhdGFGcmFtZShncmQsIGRhdGEuZnJhbWUodmFyMS5wcmVkID0gcHJlZGljdChsbS4xLCBuZXdkYXRhPWdyZCkpKSAKYGBgCgoKCiMjIyA1LjIuIFJlc3VsdGFkb3MgZGUgaW50ZXJwb2xhY2nDs24gcG9yIHBvbMOtZ29ub3MgVGhpZXNzZW4KCkVzdGUgbcOpdG9kbyBwZXJtaXRlIHF1ZSBsYSBwcmVjaXBpdGFjacOzbiBxdWUgYW50ZXMgZXN0YWJhIHVuaWNhbWVudGUgZW4gbG9zIHB1bnRvcywgYWhvcmEgc2UgZW5jdWVudHJhIGVuIHRvZGEgZWwgw6FyZWEgZGUgZXN0dWRpbyBwYXJhIMOhcmVhcyBxdWUgc29uIGNvbXBsZXRhbWVudGUgcmVjdGFuZ3VsYXJlcy4gT3BlcmEgdW5pZW5kbyBsb3MgcHVudG9zIGEgYSB0cmF2w6lzIGRlIHJlY3Rhcy4gQSBsYXMgcmVjdGFzIGx1ZWdvIHNlIGxlcyB0cmF6YW4gc3VzIG1lZGlhdHJpY2VzIGhhc3RhIHF1ZSBzZSBpbnRlcnNlY3RhbiBlbnRyZSBzw60sIGdlbmVyYW5kbyBsb3MgcG9sw61nb25vcyBxdWUgZW4gZXN0ZSBjYXNvIHNvbiBjdWFkcmFkb3MgcG9ycXVlIGxvcyBkYXRvcyB2aWVuZW4gZGUgdW5hIGdyaWxsYSByZWd1bGFyIHkgdGllbmVuIGxhIG1pc21hIGRpc3RhbmNpYSB0YW50byBlbiBlbCBlamUgWCBjb21vIGVuIGVsIFkuCkNhYmUgcmVzdGFsdGFyIHF1ZSBjdWFuZG8gbGEgZGlzdHJpYnVjacOzbiBkZSBwdW50b3Mgbm8gZXMgaXJyZWd1bGFyIG5vIGNyZWEgY3VhZHJhZG9zIHBvciBsbyBxdWUgc2UgaGFjZSBtw6FzIGFwcm9waWFkbyBlc3RlIG3DqXRvZG8gcGFyYSBpbnRlcnBvbGFyLgpMYSBpbnRlcnBvbGFjacOzbiBwb3IgcG9sw61nb25vcyBkZSBUaGllc3NlbiBlcyBzZW5jaWxsYSBwZXJvIG5vIGJyaW5kYSB1bmEgcHJlc2lzacOzbiB5IGV4YWN0aXR1ZCBjb25maWFibGVzIGEgbGEgaG9yYSBkZSBlc3R1ZGlhciBhbGd1bmEgdmFyaWFibGUgcHVlc3RvIHF1ZSBzZSBoYWNlIHVzbyBkZSBwb2xpZ29ub3MgdW5pZG9zIHBvciBtZWRpYXRyaWNlcyB5IG5vIHN1cGVyZmljaWVzIGNvbnRpbnVhcyBhIGxhIGhvcmEgZGUgaGFjZXIgbGEgaW50ZXJwb2xhY2nDs24sIGxvIHF1ZSByZWR1bmRhIGVuIGVsIGhlY2hvIGRlIHF1ZSBzZSBpZ25vcmFuIGFsZ3Vub3MgdmFsb3Jlcy4KCgojIyMgNS4zIFJlc3VsdGFkb3MgZGUgaW50ZXJwb2xhY2nDs24gcG9yIEtyaWdpbmcKClBvciBtZWRpbyBkZSBlc3RlIG3DqXRvZG8gc2Ugb2J0aWVuZSB1biBwcm9kdWN0byBkZSBtZWpvciByZXNvbHVjacOzbiBxdWUgdGVuw61hbiBsb3MgZGF0b3MsIHNlIHB1ZWRlIG9ic2VydmFyIHF1ZSBsb3MgcmVzdWx0YWRvcyBzaWd1ZW4gbGEgdGVuZGVuY2lhIG5hdHVyYWwgZGUgbG8gcXVlIHNlIG1pZGlvLiAKRXN0ZSBtw6l0b2RvIGVzIG3DoXMgYWRlY3VhZG8gY3VhbmRvIHNlIHNhYmUgcXVlIGhheSB1bmEgaW5mbHVlbmNpYSBkaXJlY2Npb25hbCBvIGRlIGxhIGRpc3RhbmNpYSBjb3JyZWxhY2lvbmFkYSBlc3BhY2lhbG1lbnRlIGVuIGxvcyBkYXRvcywgZXN0ZSBwcmVzdXBvbmUgcXVlIGxhIGRpc3RhbmNpYSBvIGxhIGRpcmVjY2nDs24gZW50cmUgbG9zIHB1bnRvcyBkZSBtdWVzdHJhIHJlZmxlamFuIHVuYSBjb3JyZWxhY2nDs24gZXNwYWNpYWwgcXVlIHB1ZWRlIHV0aWxpemFyc2UgcGFyYSBleHBsaWNhciBsYSB2YXJpYWNpw7NuIGVuIGxhIHN1cGVyZmljaWUuCkVuIGxvcyByZXN1bHRhZG9zIHNlIHB1ZWRlIG9ic2VydmFyIHF1ZSBsYSB6b25hIGNvbiBtYXlvciBwcmVjaXBpdGFjacOzbiBlcyBlbCBvY2NpZGVudGUgZGVsIGRlcGFydGFtZW50bywgbG8gY3VhbCB0aWVuZSBiYXN0YW50ZSBzZW50aWRvIHB1ZXN0byBxdWUgZXN0YSB6b25hIGNvcnJlc3BvbmRlIGEgbGEgY2l1ZGFkIGRlIEJ1ZW5hdmVudHVyYTsgY2l1ZGFkIGNlcmNhbmEgYWwgZGVwYXJ0YW1lbnRvIGRlbCBDaG9jw7MsIGVsIGN1YWwgZXMgZWwgZGVwYXJ0YW1lbnRvIHF1ZSBwcmVzZW50YSBtYXlvcmVzIHByZWNpcGl0YWNpb25lcyBlbiBlbCBwYcOtcyAoNCkKCgoKYGBge3IgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0KcHJlY2lwIDwtIHJhc3RlcigiLi9jaGlycHMvY2hpcnBzLXYyLjAuMjAyMC4wNC42LnRpZiIpCmBgYAoKYGBge3IgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0KcHJlY2lwCmBgYAoKYGBge3IgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0KKGFvaSA8LSBzaGFwZWZpbGUoIi4vQURNSU5JU1RSQVRJVk8vTUdOX01QSU9fUE9MSVRJQ08uc2hwIikpCmBgYAoKYGBge3IgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0KcHJlY2lwLmNyb3AgPC0gcmFzdGVyOjpjcm9wKHByZWNpcCwgZXh0ZW50KGFvaSkpCmBgYAoKYGBge3IgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0KcHJlY2lwLm1hc2sgPC0gbWFzayh4ID0gcHJlY2lwLmNyb3AsIG1hc2sgPSBhb2kpCmBgYAoKCmBgYHtyIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnRtX3NoYXBlKHRoLmNscCkgKyAKICB0bV9wb2x5Z29ucyhjb2w9ImxsdXZpYSIsIHBhbGV0dGU9IlJkQnUiLCBtaWRwb2ludD0zLjAsCiAgICAgICAgICAgICAgdGl0bGU9IlRoaWVzc2VuIFBvbHlnb25zIFxuUHJlZGljdGVkIHByZWNpcGl0YXRpb24gXG4oaW4gbW0pIikgKwogIHRtX2xlZ2VuZChsZWdlbmQub3V0c2lkZT1UUlVFKQpgYGAKCiMjIENvbmNsdXNpb25lcwoKLSBMYSBpbnRlcnBvbGFjacOzbiBlcyDDunRpbCBlbiBtw7psdGlwbGVzIGRpc2NpcGxpbmFzLCBlc3BlY2lhbG1lbnRlIGVuIGxhIGluZ2VuaWVyw61hIGFncm9ub23Ds21pY2EsIHB1ZXMgZ3JhY2lhcyBhIGVzdGEgaGVycmFtaWVudGEgc2UgcHVlZGVuIGVzdGltYXIgZGF0b3MgaW1wb3J0YW50ZXMgcmVsYWNpb25hZG9zIGEgbGEgcHJvZHVjY2nDs24gYWdyYXJpYSBxdWUsIHBvc3Rlcmlvcm1lbnRlIGF5dWRhcsOhbiBhIGxhIGVsYWJvcmFjacOzbiBkZSBwbGFuZXMgZGUgcHJvZHVjY2nDs24uCgotIFNlIHB1ZWRlbiB1dGlsaXphciBkZSBtYW5lcmEgY29uZmlhYmxlIGVuIGxhcyBoZXJyYW1pZW50YXMgZGUgaW50ZXJwb2xhY2nDs24gSURXIHkgS3JpZ2dpbiBwYXJhIGFwbGljYXIgYWxnw7puIG3DqXRvZG8gY2llbnTDrWZpY28uCgotIEludGVycG9sYXIgZXMgdW5hIGVzdHJhdGVnaWEgdmlhYmxlIHBhcmEgaGFsbGFyIGFsZ8O6biB2YWxvciBkZWwgcXVlIG5vIHNlIHRpZW5lIGNvbm9jaW1pZW50bywgeSBxdWUgYWRlbcOhcywgZXMgbmVjZXNhcmlvIGNvbm9jZSBwYXJhIGxvZ3JhciBhbGfDum4gY8OhbGN1bG8gcGFyYSBhbGfDum4gcHJvYmxlbWEgZGUgYXBsaWNhY2nDs24uCgotIEVtcGxlYXIgZWwgbcOpdG9kbyBkZSBwb2zDrWdvbm9zIGRlIFRoaWVzc2VuIHBhcmEgdW5hIGludGVycG9sYWNpw7NuIG5vIG9mcmVjZSB0YW50YSBwcmVjaXNpw7NuIGNvbW8gSURXIHkgS3JpZ2luZwoKCiMjIEJpYmxpb2dyYWbDrWEKKDEpIEFuw7NuaW1vIChzZikgVmlzdGEgZ2VuZXJhbCBkZWwgY29uanV0bm8gZGUgaGVycmFtaWVudGFzIGRlIGludGVycG9sYWNpw7NuLCByZWN1cGVyZG8gZWwgMjAvMDYvMjAyMCBkZSBodHRwczovL2Rlc2t0b3AuYXJjZ2lzLmNvbS9lcy9hcmNtYXAvMTAuMy90b29scy9zcGF0aWFsLWFuYWx5c3QtdG9vbGJveC9hbi1vdmVydmlldy1vZi10aGUtaW50ZXJwb2xhdGlvbi10b29scy5odG0KCigyKSBHb2Jlcm5hY2nDs24gVmFsbGUgZGVsIENhdWNhICgyMDE4KSBJbmZvcm1hY2nDs24gZGVsIGRlcGFydGFtZW50byBWYWxsZSBkZWwgQ2F1Y2EsIHJlY3VwZXJhZG8gZW4gMjAvMDYvMjAyMCBkZSBodHRwczovL3d3dy52YWxsZWRlbGNhdWNhLmdvdi5jby9wdWJsaWNhY2lvbmVzLzYwMTM1L2lkZW50aWZpY2FjaW9uLWRlbC1kZXBhcnRhbWVudG8vCgooMykgQW7Ds25pbW8gKDIwMTUpIEN1IGh0dHA6Ly93d3cuZmdjc2ljLmVzL2J1cm8vZG9jcy90dTAzbWJtLnBocD9pZD1jdWFsZXMtc29uLWxvcy1kZXBhcnRhbWVudG9zLWRlbC12YWxsZS1kZWwtY2F1Y2EtMDIzOWY3CgooNCkgSW5zdGl0dXRvIGRlIEhpZHJvbG9nw61hLCBNZXRlb3JvbG9nw61hIHkgRXN0dWRpb3MgQW1iaWVudGFsZXMgKElERUFNKSBodHRwOi8vd3d3LmlkZWFtLmdvdi5jby8KTUFQQVM6IEF0bGFzIGNsaW1hdG9sw7NnaWNvIGRlIENvbG9tYmlhIC0gSURFQU0gCgooNSkgREFORSAoMjAyMCkgTmVjZXNpZGFkZXMgYsOhc2ljYXMgaW5zdGF0aXNmZWNoYXMgKE5CSSksIHJlY3VwZXJhZG8gZWwgMjAvMDYvMjAyMCBkZSBodHRwczovL3d3dy5kYW5lLmdvdi5jby9pbmRleC5waHAvZXN0YWRpc3RpY2FzLXBvci10ZW1hL3BvYnJlemEteS1jb25kaWNpb25lcy1kZS12aWRhL25lY2VzaWRhZGVzLWJhc2ljYXMtaW5zYXRpc2ZlY2hhcy1uYmkKCig2KSBKaW3DqW5leiBKLiAoMjAxOCkgSW50ZXJwb2xhY2nDs24gY29uIGxhIERpc3RhbmNpYSBJbnZlcnNhIFBvbmRlcmFkYSAoSURXKSwgcmVjdXBlcmFkbyBlbCAyMC8wNi8yMDIwIGRlICBodHRwczovL2Fjb2xpdGEuY29tL2ludGVycG9sYWNpb24tY29uLWxhLWRpc3RhbmNpYS1pbnZlcnNhLXBvbmRlcmFkYS1pZHcvCgooNykgQmFsYWd1ZXLDsyBULiAoMjAxOCkgwr9RdcOpIHNvbiBsb3MgZGF0YXNldHMgeSBsb3MgZGF0YWZyYW1lcyBlbiBlbCBCaWcgRGF0YT8gcmVjdXBlcmFkbyBlbCAyMC8wNi8yMDIwIGRlIGh0dHBzOi8vd3d3LmRldXN0b2Zvcm1hY2lvbi5jb20vYmxvZy9wcm9ncmFtYWNpb24tZGlzZW5vLXdlYi9xdWUtc29uLWRhdGFzZXRzLWRhdGFmcmFtZXMtYmlnLWRhdGE=