1. Introducción
El análisis espacial es el estudio y exploración razonada de una gran cantidad de datos cuantitativos y cualitativos con el fin de establecer las características, dinámicas y comportamientos de diversos procesos en un espacio determinado, para ello define los elementos que lo conforman y la forma como estos estan relacionados, con el objetivo de extraer información nueva y significativa a partir de los datos originales, permitiendo a su vez proponer alternativas encaminadas a favorecer el entorno espacial estudiado proporcionando una explicación objetiva de la dinámica espacial (Ojea & Tovar, 2016). Asimismo tiene como finalidad aportar una representación simplificada del objeto de estudio.
De esta manera, se puede utilizar un Sistema de Información Geográfica (SIG) para realizar un análisis espacial puesto que proporciona instrumentos utiles para calcular estadísticas de las entidades y realizar actividades de geoprocesamiento como la interpolación de datos (ArcGIs,2020). En este contexto, la interpolación espacial es el proceso de utilizar puntos con valores conocidos para estimar valores desconocidos en otros puntos, asimismo, la interpolación espacial es factible para cualquier variable ambiental continua, lo que permite generar por ejemplo, mapas de precipitación de un lugar sin tener que tener muchas estaciones metereologicas que esten distribuidas uniformente y que cubran toda la región, lo cual no ocurre (QGIS, 2020).
No obtante, no existe una única técnica de interpolacíon sino por el contrario existen varios métodos de interpolación, los cuales se clasifican en geoestadísticos y deterministas, en donde unos utilizan propiedades estadisticas de los puntos medidos mientras que otros se basan en la extensión de la similitud entre los puntos, respectivamente (ArcGISMap, 2020). Dicho esto, cabe aclarar que no hay un método específico a utilizar para interpolar alguna propiedad, por lo cual es necesario realizar la interpolación de la propiedad utilizando distintos métodos con el fin de elegir la interpolación que presente la menor incertidumbre y por tanto, visuelice de forma más certera la información.
De este modo, el objetivo del siguiente informe es realizar la interpolación de unos datos de precipitación pertenecientes al departamento del Meta mediante tres técnicas diferentes de interpolación con el fin de poder comparar los resultados de estas interpolaciones y analizar cual de estas representa de mejor manera la información.
2. Descripción de la zona de estudio
El Departamento del Meta se localiza en el centro del país, en la región de la Orinoquia, se situa entre los 04º54’25’’ y los 01º36’52’’ de latitud norte, y los 71º4’38’’ y 74º53’57’’ de longitud oeste, limita por el Norte con el departamento de Cundinamarca y los ríos Upía y Meta que lo separan del departamento del Casanare; por el Sur, con el departamento del Caquetá y el río Guaviare, por el Este con Vichada y por el oeste con los departamentos de Huila y Cundinamarca (ver figura 1), asimismo, es el cuarto departamento más grande del país con una extensión territorial de 85.635 Km^2, por lo cual representa el 7.5% del territorio nacional(PNUD,2008). Igualmente, el departamento esta conformado por 29 municipios y su capital es Villavicencio, él cual es el principal lugar de desarrollo del departamento y concentra la mitad de su población (Controlaria, 2015).
Con respecto a su territorio, el departamento fisiograficamente se divide en tres regiones: la primera hace referencia a la parte este de la cordillera Oriental, donde sus montañas alcanzan alturas de hasta los 4.000 m.s.n.m, la segunda unidad corresponde a la planicie llanera, la cual hace parte del escudo guayanés en las zonas central y oriental del departamento, en donde las elevaciones no sobrepasan los 200 m.s.n.m y la tercera unidad corresponde a la región selvática del Amazonas (Instituto De Turismo del Meta, 2020).
En cuanto al clima del departamento, Meta está en la Zona de Confluencia Intertropical o ZCIT, llas precipitaciones anuales varían desde 2.100 mm, en las partes altas de la cordillera, hasta los 6.000 mm o más, en los municipios de Lejanias, Villavicencio y Restrepo. En cuanto a la temperatura media anual del departamento, esta se encuentra entre los 23.4ºC y los 26.6ºC, además su promedio anual de horas/días esta entre las 3.7 y 5.5, igualmente, presenta una humedad relativa anual que varia entre el 77 y 87% (IDEAM, 2020)
Con relación a las actividades económicas del departamento del Meta, la economía se basa principalmente en la agricultura, la ganadería, el petróleo, el comercio y la industria. Siendo los cultivos de arroz, palma africana, plátano y maíz, además de los de cacao, cítricos y otros frutales, los principales que se dan en la región (Universidad del Rosario, s.f)
3. Descripción de datos y métodos
3.1 Descripción de datos
El Grupo de Riesgos Climáticos de precipitación infrarroja con datos de estación (CHIRPS) es un conjunto de datos de precipitación de más de 35 años, desde 1981 hasta ahora; Con un cubrimiento casi global de 50 ° S hasta 50 ° N (y todas las longitudes), fue creado en colaboración con científicos del Centro de Observación y Ciencia de los Recursos de la Tierra (EROS) del USGS (USAID, 2020).
CHIRPS son conjuntos de datos completos, confiables y actualizados que permite una alerta temprana, como el análisis de tendencias y el seguimiento estacional de la sequía puesto que produce una series de tiempo de lluvia raster mediante la incorporaciòn de la climatología interna, CHPclim, imágenes satelitales con resolución de 0.05°, es decir, que cada pixel representa un área de 5.5 km y datos de estación in situ (USAID, 2020).
Los datos pueden ser descargados en mosaicos globales bajo resoluciones temporales diarias, de cada cinco dìas, cada 2 meses, cada 3 meses , anuales y bajo formatos georeferenciados BIL, TIF o NetCDF, en este este caso, los datos CHIPS con los que se va a trabajar es un archivo TIF que representa la precipitaciòn acumulada entre los dìas del 26 al 31 de marzo de 2020, específicamente en el departamento del Meta.
3.2 Descripcion de los métodos de interpolación espacial
El proceso de interpolación espacial permite obtener lo que se conoce habitualmente por el nombre de superficie estadística, una superficie continua con valores interpolados a partir de otros conocidos (ArcGIS,2020).
Como se ya se menciono, existen varios métodos de interpolación que permiten generar superficies continuas a partir de puntos muestrales, estos se pueden clasificar según su naturaleza en: deterministas y geoestadísticos, en este caso se realizará la interpolaciòn de los datos de precipitaciòn con los métodos: IDW (Distancia Inversa Ponderada), kriging y los polígonos de Thiessen.
3.2.1 Método de Distancia Inversa Ponderada
Esta interpolación se cataloga como determinista e interpola una superficie ráster a partir de puntos basandose principalmente en la inversa de la distancia elevada a una potencia matemática, en este método los puntos de muestreo se ponderan durante la interpolación, por lo cual, la influencia de un punto en relación con otros se reduce o disminuye a medida que aumenta la distancia entre ellos (ArcgGIS, 2020).
El parámetro Potencia permite controlar el peso¨o influencia de puntos conocidos en los valores interpolados basándose en la distancia desde el punto de salida; su valor suele ser 2, sin embargo, cuanto mayor sea el coeficiente de potencia, mayor será el peso de los puntos cercanos como se puede deducir de la ecuación que estima el valor z en una ubicación no muestreada j (ArcgGIS, 2020).
n es el parámetro de peso que se aplica como exponente a la distancia, amplificando así la irrelevancia de un punto en la ubicación i a medida que aumenta la distancia a j.
3.2.2 Kriging
Kriging es un método de interpolación geoestadístico por lo cual está basado en modelos estadísticos que incluyen la autocorrelación, esto permite no solo producir una superficie de predicción sino también proporcionar alguna medida de certeza o precisión de las predicciones.
Al igual que el método IDW, kriging pondera los valores medidos circundantes para calcular una predicción de una ubicación sin mediciones.
La fórmula general empleada en el método es la siguiente:
donde: Z(xi) = el valor medido en la ubicación n.º i
λi = un peso desconocido para el valor medido en la ubicación n.º i
x0 = la ubicación de la predicción
N = el número de valores medidos
Asimismo, en el método kriging, las ponderaciones están basadas no sólo 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, mientras que en el método IDW el peso, depende solamente de la distancia a la ubicación de la predicción. Igualmente, para utilizar la disposición espacial en las ponderaciones, la correlación espacial debe estar cuantificada (ArcGIS Pro, 2020).
Por otro lado, para la realización de kriging es nesario la variografía (ajuste de un modelo) de la estructura de los puntos medidos, para ello, se comienza con el gráfico del semivariograma empírico, éste suministra información sobre la autocorrelación espacial de los datasets, pero no brinda información para todas las direcciones y distancias posibles (ArcMap, 2016)
Por lo anterior y porque se necesita que las predicciones de kriging tengan varianzas de kriging positivas, se hace necesario ajustar un modelo al semivariograma empírico. Para ajustar un modelo al semivariograma empírico, se debe seleccionar una función que sirva como modelo, entre estoS modelos se encuantra por ejemplo: el circular, el esférico, el exponencial, el gaussiano, el lineal, entre otros(ArcMap, 2016). En este caso se utilizó el modelo Matern
3.2.3 Polígonos de Thiessen
Este método de interpolación es uno de los métodos más simples, es un análisis de vecindad y se basa en la distancia euclidiana, los polígonos se generan al unir los puntos entre sí, trazando mediatrices de los segmentos de unión. Las intersecciones de estas mediatrices determinan una serie de polígonos en un espacio bidimensional alrededor de un conjunto de puntos de control de manera que el perímetro de los polígonos generados sea equidistante a los puntos vecinos y designando su área de influencia. Asimismo, los valores de los puntos desconocidos, vienen dados por el valor del punto conocido más cercano (Aragón et al, 2019). Es una metodología objetiva y se puede obtener resultados satisfactorios si se tiene datos adecuados.
4. Presentación de resultados
4.1 Método Distancia Inversa Ponderada
A continuación se presenta la superficie continua del departamento del Meta de los datos de precipitación obtenida mediante el método IDW
Warning messages:
1: In readChar(file, size, TRUE) : truncating string with embedded nuls
2: In readChar(file, size, TRUE) : truncating string with embedded nuls
3: In readChar(file, size, TRUE) : truncating string with embedded nuls
4: In readChar(file, size, TRUE) : truncating string with embedded nuls
5: In readChar(file, size, TRUE) : truncating string with embedded nuls
6: In readChar(file, size, TRUE) : truncating string with embedded nuls
7: In readChar(file, size, TRUE) : truncating string with embedded nuls
8: In readChar(file, size, TRUE) : truncating string with embedded nuls
Discarded datum Unknown based on GRS80 ellipsoid in CRS definition,
but +towgs84= values preservedDiscarded ellps WGS 84 in CRS definition: +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defsDiscarded datum WGS_1984 in CRS definitionDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
but +towgs84= values preservedUsing PROJ not WKT2 stringsDiscarded ellps WGS 84 in CRS definition: +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defsDiscarded datum WGS_1984 in CRS definitionDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
but +towgs84= values preservedDiscarded ellps WGS 84 in CRS definition: +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defsDiscarded datum WGS_1984 in CRS definitionDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
but +towgs84= values preservedUsing PROJ not WKT2 stringsDiscarded ellps WGS 84 in CRS definition: +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defsDiscarded datum WGS_1984 in CRS definitionDiscarded ellps WGS 84 in CRS definition: +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defsDiscarded datum WGS_1984 in CRS definitionUsing PROJ not WKT2 stringsDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
but +towgs84= values preservedDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
but +towgs84= values preservedDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
but +towgs84= values preservedDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
but +towgs84= values preservedDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
but +towgs84= values preservedDiscarded ellps WGS 84 in CRS definition: +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defsDiscarded datum WGS_1984 in CRS definitionDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
but +towgs84= values preservedUsing PROJ not WKT2 stringsDiscarded ellps WGS 84 in CRS definition: +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defsDiscarded datum WGS_1984 in CRS definitionDiscarded ellps WGS 84 in CRS definition: +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defsDiscarded datum WGS_1984 in CRS definitionDiscarded ellps WGS 84 in CRS definition: +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defsDiscarded datum WGS_1984 in CRS definitionUsing PROJ not WKT2 strings
La siguiente gráfica, presenta la relación entre los datos de precipitación y los estimados durante la interpolación:

De este modo, el error medio cuadrático, es el siguiente:
[1] 2.365522
Asimismo, a continuación se muestra el mapa de validación cruzada, él cual mide que tanta incertidumbre presenta los resultados. Este presenta un intervalo de confianza del 95% del modelo de interpolación. Para ello se utilizó un parámetro de potencia de 2 (idp = 2.0).
CRS object has comment, which is lost in outputDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
but +towgs84= values preservedDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
but +towgs84= values preservedDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
but +towgs84= values preservedCRS object has comment, which is lost in output

4.2 Método Kriging
Variograma, modelo Matern

Superficie generada:
There were 11 warnings (use warnings() to see them)
Discarded datum Unknown based on GRS80 ellipsoid in CRS definition,
but +towgs84= values preservedDiscarded ellps WGS 84 in CRS definition: +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defsDiscarded datum WGS_1984 in CRS definitionDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
but +towgs84= values preservedUsing PROJ not WKT2 stringsDiscarded ellps WGS 84 in CRS definition: +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defsDiscarded datum WGS_1984 in CRS definitionDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
but +towgs84= values preservedDiscarded ellps WGS 84 in CRS definition: +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defsDiscarded datum WGS_1984 in CRS definitionDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
but +towgs84= values preservedUsing PROJ not WKT2 stringsDiscarded ellps WGS 84 in CRS definition: +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defsDiscarded datum WGS_1984 in CRS definitionDiscarded ellps WGS 84 in CRS definition: +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defsDiscarded datum WGS_1984 in CRS definitionUsing PROJ not WKT2 stringsDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
but +towgs84= values preservedDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
but +towgs84= values preservedDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
but +towgs84= values preservedDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
but +towgs84= values preservedDiscarded ellps WGS 84 in CRS definition: +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defsDiscarded datum WGS_1984 in CRS definitionDiscarded ellps WGS 84 in CRS definition: +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defsDiscarded datum WGS_1984 in CRS definitionDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
but +towgs84= values preservedDiscarded ellps WGS 84 in CRS definition: +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defsDiscarded datum WGS_1984 in CRS definitionDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
but +towgs84= values preservedUsing PROJ not WKT2 stringsDiscarded ellps WGS 84 in CRS definition: +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defsDiscarded datum WGS_1984 in CRS definitionDiscarded ellps WGS 84 in CRS definition: +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defsDiscarded datum WGS_1984 in CRS definitionDiscarded ellps WGS 84 in CRS definition: +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defsDiscarded datum WGS_1984 in CRS definitionUsing PROJ not WKT2 stringsSome values were outside the color scale and will be treated as NASome values were outside the color scale and will be treated as NA
Mapa de varianza de la interpolación con el método kriging
CRS object has comment, which is lost in outputDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
but +towgs84= values preservedDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
but +towgs84= values preservedDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
but +towgs84= values preservedCRS object has comment, which is lost in output

Ahora, el mapa con un intervalo de confianza del 95% el cual se generó a partir del mapa de varianza.
CRS object has comment, which is lost in outputDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
but +towgs84= values preservedDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
but +towgs84= values preservedDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
but +towgs84= values preservedDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
but +towgs84= values preservedDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
but +towgs84= values preservedCRS object has comment, which is lost in output

4.3 Poligonos de Thiessen
Superficie generada mediante el método: polígonos de Thiessen
CRS object has comment, which is lost in output

5. Análisis de resultados
Se observó que es posible realizar la interpolación de los datos de precipitación CHIRPS, ya sea con el método IDW, kriging o polígonos de Thiessen, los cuales en general estiman los valores desconocidos con un error asociado bajo (IDW Y Kriging), si embargo, se aprecia algunos direferencias en las interpolaciones principalmente en los sectores del departamento que registran precipitaciones más altas (>20 mm).
El resultado de la de interpolación con el método IDW es una predicción aproximada de la realidad, esto se puede entender al observar el valor obtenido del cálculo del error cuadrático (2.36), lo que indica un error en la predicción en promedio 2.36 mm, esto no es muy significativo debido a que a las precipitaciones que registra el departemanto van de 0.9 a 34.3 mm. Igualmente, al análizar el mapa con un intervalo de confianza del 95% de destaca que gran parte del departamento presentan errores bajos en la interpolación (de 0 a 0.5 mm), aunque hay pequeñas zonas con errores entre 2 a 2.5 mm. Por otro lado, también se observa que la superficie generada no visualiza las precipitaciones más altas que presenta algunos sectores, por ejemplo de los municipios de San Luis de Currabaral y Lejanías
El Método de kriging, por su parte, generó una superficie bastante cercana a los datos presentes, lo cual se puede entender tanto al comparar la superficie generada con la visualización de los datos Chirps como, principalmente, al observar el mapa de varianza de la interpolacón, el cual visualiza que gran parte del departamento presenta errores bajos en el proceso de interpolación, siendo estos de 1 a 2 mm, o de 2 a 3 mm en algunas zonas. Asimismo, se puede decir que el uso del modelo Matern en el ajuste del variograma fue correcto.
Por último, el método de los polígonos de Thiessen, aunque fue el más fácil de realizar tiene como problema que no es posible estimar el error asociado, debido a que cada punto se obtiene a partir de un solo punto, igualmente, se observa que la interpolación con este método muestra cambios bruscos entre puntos, por lo que no seria buena idea utilizarlo en zonas muy irregulares. Sin embargo, la superficie generada por este método, a primera vista hace una predicción cercana de los datos CHIRPS.
6. Conclusiones
Los datos CHIRPS dado a su cubrimiento casi global proporciona información completa y confiable, son de fácil análisis permiten obtener tendencias y realizar monitoreos de la precipitación en diferentes zonas de interes, lo cual es de gran importancia para realizar en dado caso, algún tipo de alerta de forma temprana.
La interpolación de datos es una actividad de geoprocesamiento útil para realizar algún tipo de análisis espacial, asimismo, permite generar algún tipo de mapa, lo cual ayuda a representar la información del objeto de forma más simplificada.
La superficie generada por los métodos de interpolación IDW, kriging y los polígnos de Thiessen presentraron algunas diferencias especialmente en las áreas de los munipios que presentan valores mayores de precipitación, sin embargo, se aprecia en este caso que tanto los métodos deterministas (IDW) como los geoestadisticos (kriging) u otros (Polígonos de Thiessen) proporcionaron superficies en general similares.
El método de interpolacíón que generó una superfie más acertada en este caso fue el método kriging debido a que se observa que el error en la interpolación en gran parte del departamento es de tan solo 1 a 2 mm, sin embargo, cabe destacar que el método IDW, generó una superficie con un error en la predicción en promedio de 2.36 mm, por lo cual cualquiera de estos métodos de interpolación podrian ser aplicados.
El método de los polígonos de Thiessen es un método que podria ser aprovechado en estudios menos rigurosos donde no sea totalmente necesario conococer el error asociado al proceso de interpolación, no obstante, se debe tener presente que los datos a utilizar sean los adecuados y la zona de estudio no sea muy irregular.
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIyMjIyMgRmVjaGE6IDI0LzA2LzIwDQojIyMjIyMgTm9tYnJlOiBFcmlrYSBBcGFyaWNpbw0KDQojIyBJbmZvcm1lIGRlbCBkZXBhcnRhbWVudG8gZGVsIE1ldGEgDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KIyMjIDEuIEludHJvZHVjY2nDs24NCg0KRWwgYW7DoWxpc2lzIGVzcGFjaWFsIGVzIGVsIGVzdHVkaW8geSBleHBsb3JhY2nDs24gcmF6b25hZGEgZGUgdW5hIGdyYW4gY2FudGlkYWQgZGUgZGF0b3MgY3VhbnRpdGF0aXZvcyB5IGN1YWxpdGF0aXZvcyBjb24gZWwgZmluIGRlIGVzdGFibGVjZXIgbGFzIGNhcmFjdGVyw61zdGljYXMsIGRpbsOhbWljYXMgeSBjb21wb3J0YW1pZW50b3MgZGUgZGl2ZXJzb3MgcHJvY2Vzb3MgZW4gdW4gZXNwYWNpbyBkZXRlcm1pbmFkbywgcGFyYSBlbGxvIGRlZmluZSBsb3MgZWxlbWVudG9zIHF1ZSBsbyBjb25mb3JtYW4geSBsYSBmb3JtYSBjb21vIGVzdG9zIGVzdGFuIHJlbGFjaW9uYWRvcywgY29uIGVsIG9iamV0aXZvIGRlIGV4dHJhZXIgaW5mb3JtYWNpw7NuIG51ZXZhIHkgc2lnbmlmaWNhdGl2YSBhIHBhcnRpciBkZSBsb3MgZGF0b3Mgb3JpZ2luYWxlcywgIHBlcm1pdGllbmRvIGEgc3UgdmV6IHByb3BvbmVyIGFsdGVybmF0aXZhcyBlbmNhbWluYWRhcyBhIGZhdm9yZWNlciBlbCBlbnRvcm5vIGVzcGFjaWFsIGVzdHVkaWFkbyBwcm9wb3JjaW9uYW5kbyB1bmEgZXhwbGljYWNpw7NuIG9iamV0aXZhIGRlIGxhIGRpbsOhbWljYSBlc3BhY2lhbCAoT2plYSAmIFRvdmFyLCAyMDE2KS4gQXNpbWlzbW8gdGllbmUgY29tbyBmaW5hbGlkYWQgYXBvcnRhciB1bmEgcmVwcmVzZW50YWNpw7NuIHNpbXBsaWZpY2FkYSBkZWwgb2JqZXRvIGRlIGVzdHVkaW8uDQoNCkRlIGVzdGEgbWFuZXJhLCBzZSBwdWVkZSB1dGlsaXphciB1biBTaXN0ZW1hIGRlIEluZm9ybWFjacOzbiBHZW9ncsOhZmljYSAoU0lHKSBwYXJhIHJlYWxpemFyIHVuIGFuw6FsaXNpcyBlc3BhY2lhbCBwdWVzdG8gcXVlIHByb3BvcmNpb25hIGluc3RydW1lbnRvcyB1dGlsZXMgcGFyYSBjYWxjdWxhciBlc3RhZMOtc3RpY2FzIGRlIGxhcyBlbnRpZGFkZXMgeSByZWFsaXphciBhY3RpdmlkYWRlcyBkZSBnZW9wcm9jZXNhbWllbnRvIGNvbW8gbGEgaW50ZXJwb2xhY2nDs24gZGUgZGF0b3MgKEFyY0dJcywyMDIwKS4gRW4gZXN0ZSBjb250ZXh0bywgbGEgaW50ZXJwb2xhY2nDs24gZXNwYWNpYWwgZXMgZWwgcHJvY2VzbyBkZSB1dGlsaXphciBwdW50b3MgY29uIHZhbG9yZXMgY29ub2NpZG9zIHBhcmEgZXN0aW1hciB2YWxvcmVzIGRlc2Nvbm9jaWRvcyBlbiBvdHJvcyBwdW50b3MsIGFzaW1pc21vLCBsYSBpbnRlcnBvbGFjacOzbiBlc3BhY2lhbCBlcyBmYWN0aWJsZSBwYXJhIGN1YWxxdWllciB2YXJpYWJsZSBhbWJpZW50YWwgY29udGludWEsIGxvIHF1ZSBwZXJtaXRlIGdlbmVyYXIgcG9yIGVqZW1wbG8sIG1hcGFzIGRlIHByZWNpcGl0YWNpw7NuIGRlIHVuIGx1Z2FyIHNpbiB0ZW5lciBxdWUgdGVuZXIgbXVjaGFzIGVzdGFjaW9uZXMgbWV0ZXJlb2xvZ2ljYXMgcXVlIGVzdGVuIGRpc3RyaWJ1aWRhcyB1bmlmb3JtZW50ZSB5IHF1ZSBjdWJyYW4gdG9kYSBsYSByZWdpw7NuLCBsbyBjdWFsIG5vIG9jdXJyZSAoUUdJUywgMjAyMCkuDQoNCk5vIG9idGFudGUsIG5vIGV4aXN0ZSB1bmEgw7puaWNhIHTDqWNuaWNhIGRlIGludGVycG9sYWPDrW9uIHNpbm8gcG9yIGVsIGNvbnRyYXJpbyBleGlzdGVuIHZhcmlvcyBtw6l0b2RvcyBkZSBpbnRlcnBvbGFjacOzbiwgbG9zIGN1YWxlcyBzZSBjbGFzaWZpY2FuIGVuIGdlb2VzdGFkw61zdGljb3MgeSBkZXRlcm1pbmlzdGFzLCBlbiBkb25kZSB1bm9zIHV0aWxpemFuIHByb3BpZWRhZGVzIGVzdGFkaXN0aWNhcyBkZSBsb3MgcHVudG9zIG1lZGlkb3MgbWllbnRyYXMgcXVlIG90cm9zIHNlIGJhc2FuIGVuIGxhIGV4dGVuc2nDs24gZGUgbGEgc2ltaWxpdHVkIGVudHJlIGxvcyBwdW50b3MsIHJlc3BlY3RpdmFtZW50ZSAoQXJjR0lTTWFwLCAyMDIwKS4gRGljaG8gZXN0bywgY2FiZSBhY2xhcmFyIHF1ZSBubyBoYXkgdW4gbcOpdG9kbyBlc3BlY8OtZmljbyBhIHV0aWxpemFyIHBhcmEgaW50ZXJwb2xhciBhbGd1bmEgcHJvcGllZGFkLCBwb3IgbG8gY3VhbCBlcyBuZWNlc2FyaW8gcmVhbGl6YXIgbGEgaW50ZXJwb2xhY2nDs24gZGUgbGEgcHJvcGllZGFkIHV0aWxpemFuZG8gZGlzdGludG9zIG3DqXRvZG9zIGNvbiBlbCBmaW4gZGUgZWxlZ2lyIGxhIGludGVycG9sYWNpw7NuIHF1ZSBwcmVzZW50ZSBsYSBtZW5vciBpbmNlcnRpZHVtYnJlIHkgcG9yIHRhbnRvLCB2aXN1ZWxpY2UgZGUgZm9ybWEgbcOhcyBjZXJ0ZXJhIGxhIGluZm9ybWFjacOzbi4gDQoNCkRlIGVzdGUgbW9kbywgZWwgb2JqZXRpdm8gZGVsIHNpZ3VpZW50ZSBpbmZvcm1lIGVzIHJlYWxpemFyIGxhIGludGVycG9sYWNpw7NuIGRlIHVub3MgZGF0b3MgZGUgcHJlY2lwaXRhY2nDs24gcGVydGVuZWNpZW50ZXMgYWwgZGVwYXJ0YW1lbnRvIGRlbCBNZXRhIG1lZGlhbnRlIHRyZXMgdMOpY25pY2FzIGRpZmVyZW50ZXMgZGUgaW50ZXJwb2xhY2nDs24gY29uIGVsIGZpbiBkZSBwb2RlciBjb21wYXJhciBsb3MgcmVzdWx0YWRvcyBkZSBlc3RhcyBpbnRlcnBvbGFjaW9uZXMgeSBhbmFsaXphciBjdWFsIGRlIGVzdGFzIHJlcHJlc2VudGEgZGUgbWVqb3IgbWFuZXJhIGxhIGluZm9ybWFjacOzbi4gICANCg0KPGRpdi8+DQoNCiMjIyAyLiBEZXNjcmlwY2nDs24gZGUgbGEgem9uYSBkZSBlc3R1ZGlvDQoNCkVsIERlcGFydGFtZW50byBkZWwgTWV0YSBzZSBsb2NhbGl6YSBlbiBlbCBjZW50cm8gZGVsIHBhw61zLCBlbiBsYSByZWdpw7NuIGRlIGxhIE9yaW5vcXVpYSwgc2Ugc2l0dWEgZW50cmUgbG9zIDA0wro1NOKAmTI14oCZ4oCZIHkgbG9zIDAxwrozNuKAmTUy4oCZ4oCZIGRlIGxhdGl0dWQgbm9ydGUsIHkgbG9zIDcxwro04oCZMzjigJnigJkgeSA3NMK6NTPigJk1N+KAmeKAmSBkZSBsb25naXR1ZCBvZXN0ZSwgbGltaXRhIHBvciBlbCBOb3J0ZSBjb24gZWwgZGVwYXJ0YW1lbnRvIGRlIEN1bmRpbmFtYXJjYSB5IGxvcyByw61vcyBVcMOtYSB5IE1ldGEgcXVlIGxvIHNlcGFyYW4gZGVsIGRlcGFydGFtZW50byBkZWwgQ2FzYW5hcmU7IHBvciBlbCBTdXIsIGNvbiBlbCBkZXBhcnRhbWVudG8gZGVsIENhcXVldMOhIHkgZWwgcsOtbyBHdWF2aWFyZSwgcG9yIGVsIEVzdGUgY29uIFZpY2hhZGEgeSBwb3IgZWwgb2VzdGUgY29uIGxvcyBkZXBhcnRhbWVudG9zIGRlIEh1aWxhIHkgQ3VuZGluYW1hcmNhICh2ZXIgZmlndXJhIDEpLCBhc2ltaXNtbywgZXMgZWwgY3VhcnRvIGRlcGFydGFtZW50byBtw6FzIGdyYW5kZSBkZWwgcGHDrXMgY29uIHVuYSBleHRlbnNpw7NuIHRlcnJpdG9yaWFsIGRlIDg1LjYzNSBLbV4yLCBwb3IgbG8gY3VhbCByZXByZXNlbnRhIGVsIDcuNSUgZGVsIHRlcnJpdG9yaW8gbmFjaW9uYWwoUE5VRCwyMDA4KS4gSWd1YWxtZW50ZSwgZWwgZGVwYXJ0YW1lbnRvIGVzdGEgY29uZm9ybWFkbyBwb3IgMjkgbXVuaWNpcGlvcyB5IHN1IGNhcGl0YWwgZXMgVmlsbGF2aWNlbmNpbywgw6lsIGN1YWwgZXMgZWwgcHJpbmNpcGFsIGx1Z2FyIGRlIGRlc2Fycm9sbG8gZGVsIGRlcGFydGFtZW50byB5IGNvbmNlbnRyYSBsYSBtaXRhZCBkZSBzdSBwb2JsYWNpw7NuIChDb250cm9sYXJpYSwgMjAxNSkuIA0KDQpDb24gcmVzcGVjdG8gYSBzdSB0ZXJyaXRvcmlvLCBlbCBkZXBhcnRhbWVudG8gZmlzaW9ncmFmaWNhbWVudGUgc2UgZGl2aWRlIGVuIHRyZXMgcmVnaW9uZXM6IGxhIHByaW1lcmEgaGFjZSByZWZlcmVuY2lhIGEgbGEgcGFydGUgZXN0ZSBkZSBsYSBjb3JkaWxsZXJhIE9yaWVudGFsLCBkb25kZSBzdXMgbW9udGHDsWFzIGFsY2FuemFuIGFsdHVyYXMgZGUgaGFzdGEgbG9zIDQuMDAwIG0ucy5uLm0sIGxhIHNlZ3VuZGEgdW5pZGFkIGNvcnJlc3BvbmRlIGEgbGEgcGxhbmljaWUgbGxhbmVyYSwgbGEgY3VhbCBoYWNlIHBhcnRlIGRlbCBlc2N1ZG8gZ3VheWFuw6lzIGVuIGxhcyB6b25hcyBjZW50cmFsIHkgb3JpZW50YWwgZGVsIGRlcGFydGFtZW50bywgZW4gZG9uZGUgbGFzIGVsZXZhY2lvbmVzIG5vIHNvYnJlcGFzYW4gbG9zIDIwMCBtLnMubi5tIHkgbGEgdGVyY2VyYSB1bmlkYWQgY29ycmVzcG9uZGUgYSBsYSByZWdpw7NuIHNlbHbDoXRpY2EgZGVsIEFtYXpvbmFzIChJbnN0aXR1dG8gRGUgVHVyaXNtbyBkZWwgTWV0YSwgMjAyMCkuIA0KDQpFbiBjdWFudG8gYWwgY2xpbWEgZGVsIGRlcGFydGFtZW50bywgTWV0YSBlc3TDoSBlbiBsYSBab25hIGRlIENvbmZsdWVuY2lhIEludGVydHJvcGljYWwgbyBaQ0lULCBsbGFzIHByZWNpcGl0YWNpb25lcyBhbnVhbGVzIHZhcsOtYW4gZGVzZGUgMi4xMDAgbW0sIGVuIGxhcyBwYXJ0ZXMgYWx0YXMgZGUgbGEgY29yZGlsbGVyYSwgaGFzdGEgbG9zIDYuMDAwIG1tIG8gbcOhcywgZW4gbG9zIG11bmljaXBpb3MgZGUgTGVqYW5pYXMsIFZpbGxhdmljZW5jaW8geSBSZXN0cmVwby4gRW4gY3VhbnRvIGEgbGEgdGVtcGVyYXR1cmEgbWVkaWEgYW51YWwgZGVsIGRlcGFydGFtZW50bywgZXN0YSBzZSBlbmN1ZW50cmEgZW50cmUgbG9zIDIzLjTCukMgeSBsb3MgMjYuNsK6QywgYWRlbcOhcyBzdSBwcm9tZWRpbyBhbnVhbCBkZSBob3Jhcy9kw61hcyBlc3RhIGVudHJlIGxhcyAgMy43IHkgNS41LCBpZ3VhbG1lbnRlLCBwcmVzZW50YSB1bmEgaHVtZWRhZCByZWxhdGl2YSBhbnVhbCBxdWUgdmFyaWEgZW50cmUgZWwgNzcgeSA4NyUgKElERUFNLCAyMDIwKQ0KDQpDb24gcmVsYWNpw7NuIGEgbGFzIGFjdGl2aWRhZGVzIGVjb27Ds21pY2FzIGRlbCBkZXBhcnRhbWVudG8gZGVsIE1ldGEsIGxhIGVjb25vbcOtYSBzZSBiYXNhIHByaW5jaXBhbG1lbnRlIGVuIGxhIGFncmljdWx0dXJhLCBsYSBnYW5hZGVyw61hLCBlbCBwZXRyw7NsZW8sIGVsIGNvbWVyY2lvIHkgbGEgaW5kdXN0cmlhLiBTaWVuZG8gbG9zIGN1bHRpdm9zIGRlIGFycm96LCBwYWxtYSBhZnJpY2FuYSwgcGzDoXRhbm8geSBtYcOteiwgYWRlbcOhcyBkZSBsb3MgZGUgY2FjYW8sIGPDrXRyaWNvcyB5IG90cm9zIGZydXRhbGVzLCBsb3MgcHJpbmNpcGFsZXMgcXVlIHNlIGRhbiBlbiBsYSByZWdpw7NuIChVbml2ZXJzaWRhZCBkZWwgUm9zYXJpbywgcy5mKQ0KDQohW0ZpZyAxLiBEaXZpc2nDs24gcG9sw610aWNvLWFkbWluaXN0cmF0aXZhIGRlbCBEZXBhcnRhbWVudG8gZGVsIE1ldGEsIElHQUMsIDIwMDJdKEM6L1VzZXJzL2Ftb3IvRGVza3RvcC9Sc3R1ZGlvL01hcGFkbS5qcGcpDQoNCg0KDQojIyMgMy4gRGVzY3JpcGNpw7NuIGRlIGRhdG9zIHkgbcOpdG9kb3MNCg0KIyMjIyAzLjEgRGVzY3JpcGNpw7NuIGRlIGRhdG9zIA0KDQpFbCBHcnVwbyBkZSBSaWVzZ29zIENsaW3DoXRpY29zIGRlIHByZWNpcGl0YWNpw7NuIGluZnJhcnJvamEgY29uIGRhdG9zIGRlIGVzdGFjacOzbiAoQ0hJUlBTKSBlcyB1biBjb25qdW50byBkZSBkYXRvcyBkZSBwcmVjaXBpdGFjacOzbiAgZGUgbcOhcyBkZSAzNSBhw7FvcywgZGVzZGUgMTk4MSBoYXN0YSBhaG9yYTsgQ29uIHVuIGN1YnJpbWllbnRvIGNhc2kgZ2xvYmFsIGRlIDUwIMKwIFMgaGFzdGEgNTAgwrAgTiAoeSB0b2RhcyBsYXMgbG9uZ2l0dWRlcyksIGZ1ZSBjcmVhZG8gZW4gY29sYWJvcmFjacOzbiBjb24gY2llbnTDrWZpY29zIGRlbCBDZW50cm8gZGUgT2JzZXJ2YWNpw7NuIHkgQ2llbmNpYSBkZSBsb3MgUmVjdXJzb3MgZGUgbGEgVGllcnJhIChFUk9TKSBkZWwgVVNHUyAoVVNBSUQsIDIwMjApLg0KDQpDSElSUFMgIHNvbiAgY29uanVudG9zIGRlIGRhdG9zIGNvbXBsZXRvcywgY29uZmlhYmxlcyB5IGFjdHVhbGl6YWRvcyBxdWUgcGVybWl0ZSB1bmEgYWxlcnRhIHRlbXByYW5hLCBjb21vIGVsIGFuw6FsaXNpcyBkZSB0ZW5kZW5jaWFzIHkgZWwgc2VndWltaWVudG8gZXN0YWNpb25hbCBkZSBsYSBzZXF1w61hIHB1ZXN0byBxdWUgcHJvZHVjZSB1bmEgIHNlcmllcyBkZSB0aWVtcG8gZGUgbGx1dmlhIHJhc3RlciBtZWRpYW50ZSBsYSBpbmNvcnBvcmFjacOybiBkZSAgbGEgY2xpbWF0b2xvZ8OtYSBpbnRlcm5hLCBDSFBjbGltLCBpbcOhZ2VuZXMgc2F0ZWxpdGFsZXMgY29uIHJlc29sdWNpw7NuIGRlIDAuMDXCsCwgZXMgZGVjaXIsIHF1ZSBjYWRhIHBpeGVsIHJlcHJlc2VudGEgdW4gw6FyZWEgZGUgNS41IGttICB5IGRhdG9zIGRlIGVzdGFjacOzbiBpbiBzaXR1IChVU0FJRCwgMjAyMCkuDQoNCkxvcyBkYXRvcyBwdWVkZW4gc2VyIGRlc2NhcmdhZG9zIGVuIG1vc2FpY29zIGdsb2JhbGVzIGJham8gcmVzb2x1Y2lvbmVzIHRlbXBvcmFsZXMgZGlhcmlhcywgZGUgY2FkYSBjaW5jbyBkw6xhcywgY2FkYSAyIG1lc2VzLCBjYWRhIDMgbWVzZXMgLCBhbnVhbGVzIHkgYmFqbyBmb3JtYXRvcyBnZW9yZWZlcmVuY2lhZG9zIEJJTCwgVElGIG8gTmV0Q0RGLCBlbiBlc3RlIGVzdGUgY2FzbywgbG9zIGRhdG9zIENISVBTIGNvbiBsb3MgcXVlIHNlIHZhIGEgdHJhYmFqYXIgZXMgdW4gYXJjaGl2byBUSUYgcXVlIHJlcHJlc2VudGEgbGEgcHJlY2lwaXRhY2nDsm4gIGFjdW11bGFkYSBlbnRyZSBsb3MgZMOsYXMgZGVsIDI2IGFsIDMxIGRlIG1hcnpvIGRlIDIwMjAsIGVzcGVjw61maWNhbWVudGUgZW4gZWwgZGVwYXJ0YW1lbnRvIGRlbCBNZXRhLg0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbHBsb3QNCmBgYA0KDQojIyMjIDMuMiBEZXNjcmlwY2lvbiBkZSBsb3MgbcOpdG9kb3MgZGUgaW50ZXJwb2xhY2nDs24gZXNwYWNpYWwNCg0KRWwgcHJvY2VzbyAgZGUgaW50ZXJwb2xhY2nDs24gZXNwYWNpYWwgcGVybWl0ZSBvYnRlbmVyIGxvIHF1ZSBzZSBjb25vY2UgaGFiaXR1YWxtZW50ZSBwb3IgZWwgbm9tYnJlIGRlIHN1cGVyZmljaWUgZXN0YWTDrXN0aWNhLCB1bmEgc3VwZXJmaWNpZSBjb250aW51YSBjb24gdmFsb3JlcyBpbnRlcnBvbGFkb3MgYSBwYXJ0aXIgZGUgb3Ryb3MgY29ub2NpZG9zIChBcmNHSVMsMjAyMCkuDQoNCkNvbW8gc2UgeWEgc2UgbWVuY2lvbm8sIGV4aXN0ZW4gdmFyaW9zIG3DqXRvZG9zIGRlIGludGVycG9sYWNpw7NuIHF1ZSBwZXJtaXRlbiBnZW5lcmFyIHN1cGVyZmljaWVzIGNvbnRpbnVhcyBhIHBhcnRpciBkZSBwdW50b3MgbXVlc3RyYWxlcywgZXN0b3MgIHNlIHB1ZWRlbiBjbGFzaWZpY2FyIHNlZ8O6biBzdSBuYXR1cmFsZXphIGVuOiBkZXRlcm1pbmlzdGFzIHkgZ2VvZXN0YWTDrXN0aWNvcywgIGVuIGVzdGUgY2FzbyBzZSByZWFsaXphcsOhIGxhIGludGVycG9sYWNpw7JuIGRlIGxvcyBkYXRvcyBkZSBwcmVjaXBpdGFjacOybiBjb24gbG9zIG3DqXRvZG9zOiBJRFcgIChEaXN0YW5jaWEgSW52ZXJzYSBQb25kZXJhZGEpLCBrcmlnaW5nIHkgbG9zIHBvbMOtZ29ub3MgZGUgVGhpZXNzZW4uDQoNCiMjIyMgMy4yLjEgTcOpdG9kbyBkZSBEaXN0YW5jaWEgSW52ZXJzYSBQb25kZXJhZGENCg0KRXN0YSBpbnRlcnBvbGFjacOzbiBzZSBjYXRhbG9nYSBjb21vIGRldGVybWluaXN0YSBlIGludGVycG9sYSB1bmEgc3VwZXJmaWNpZSByw6FzdGVyIGEgcGFydGlyIGRlIHB1bnRvcyBiYXNhbmRvc2UgcHJpbmNpcGFsbWVudGUgZW4gbGEgaW52ZXJzYSBkZSBsYSBkaXN0YW5jaWEgZWxldmFkYSBhIHVuYSBwb3RlbmNpYSBtYXRlbcOhdGljYSwgZW4gZXN0ZSBtw6l0b2RvIGxvcyBwdW50b3MgZGUgbXVlc3RyZW8gc2UgcG9uZGVyYW4gZHVyYW50ZSBsYSBpbnRlcnBvbGFjacOzbiwgcG9yIGxvIGN1YWwsIGxhIGluZmx1ZW5jaWEgZGUgdW4gcHVudG8gZW4gcmVsYWNpw7NuIGNvbiBvdHJvcyBzZSByZWR1Y2UgbyBkaXNtaW51eWUgYSBtZWRpZGEgcXVlIGF1bWVudGEgbGEgZGlzdGFuY2lhIGVudHJlIGVsbG9zIChBcmNnR0lTLCAyMDIwKS4NCg0KRWwgcGFyw6FtZXRybyBQb3RlbmNpYSAgcGVybWl0ZSBjb250cm9sYXIgZWwgcGVzb8KobyBpbmZsdWVuY2lhIGRlIHB1bnRvcyBjb25vY2lkb3MgZW4gbG9zIHZhbG9yZXMgaW50ZXJwb2xhZG9zIGJhc8OhbmRvc2UgZW4gbGEgZGlzdGFuY2lhIGRlc2RlIGVsIHB1bnRvIGRlIHNhbGlkYTsgc3UgdmFsb3Igc3VlbGUgc2VyIDIsIHNpbiBlbWJhcmdvLCBjdWFudG8gbWF5b3Igc2VhIGVsIGNvZWZpY2llbnRlIGRlIHBvdGVuY2lhLCBtYXlvciBzZXLDoSBlbCBwZXNvIGRlIGxvcyBwdW50b3MgY2VyY2Fub3MgY29tbyBzZSBwdWVkZSBkZWR1Y2lyIGRlIGxhIGVjdWFjacOzbiBxdWUgZXN0aW1hIGVsIHZhbG9yIHogZW4gdW5hIHViaWNhY2nDs24gbm8gbXVlc3RyZWFkYSBqIChBcmNnR0lTLCAyMDIwKS4NCg0KIA0KIVtFY3VhY2nDs24gdXRpbGl6YWRhIGVuIElEV10oQzovVXNlcnMvYW1vci9EZXNrdG9wL1JzdHVkaW8vaWR3LnBuZykNCg0KbiBlcyBlbCBwYXLDoW1ldHJvIGRlIHBlc28gcXVlIHNlIGFwbGljYSBjb21vIGV4cG9uZW50ZSBhIGxhIGRpc3RhbmNpYSwgYW1wbGlmaWNhbmRvIGFzw60gbGEgaXJyZWxldmFuY2lhIGRlIHVuIHB1bnRvIGVuIGxhIHViaWNhY2nDs24gaSBhIG1lZGlkYSBxdWUgYXVtZW50YSBsYSBkaXN0YW5jaWEgYSBqLiANCg0KDQoNCiMjIyMgMy4yLjIgS3JpZ2luZyANCg0KS3JpZ2luZyBlcyB1biBtw6l0b2RvIGRlIGludGVycG9sYWNpw7NuIGdlb2VzdGFkw61zdGljbyBwb3IgbG8gY3VhbCBlc3TDoSBiYXNhZG8gZW4gbW9kZWxvcyBlc3RhZMOtc3RpY29zIHF1ZSBpbmNsdXllbiBsYSBhdXRvY29ycmVsYWNpw7NuLCBlc3RvIHBlcm1pdGUgbm8gc29sbyBwcm9kdWNpciAgdW5hIHN1cGVyZmljaWUgZGUgcHJlZGljY2nDs24gc2lubyB0YW1iacOpbiBwcm9wb3JjaW9uYXIgYWxndW5hIG1lZGlkYSBkZSBjZXJ0ZXphIG8gcHJlY2lzacOzbiBkZSBsYXMgcHJlZGljY2lvbmVzLiANCg0KQWwgaWd1YWwgcXVlIGVsIG3DqXRvZG8gSURXLCBrcmlnaW5nIHBvbmRlcmEgbG9zIHZhbG9yZXMgbWVkaWRvcyBjaXJjdW5kYW50ZXMgcGFyYSBjYWxjdWxhciB1bmEgcHJlZGljY2nDs24gZGUgdW5hIHViaWNhY2nDs24gc2luIG1lZGljaW9uZXMuIA0KDQpMYSBmw7NybXVsYSBnZW5lcmFsIGVtcGxlYWRhIGVuIGVsIG3DqXRvZG8gZXMgbGEgc2lndWllbnRlOiANCg0KIVtGw7NybXVsYSBlbXBsZWFkYSBlbiBlbCBtw6l0b2RvIGtyaWdpbmddKEM6L1VzZXJzL2Ftb3IvRGVza3RvcC9Sc3R1ZGlvL2tyaS5qcGcpDQoNCg0KZG9uZGU6DQpaKHhpKSA9IGVsIHZhbG9yIG1lZGlkbyBlbiBsYSB1YmljYWNpw7NuIG4uwrogaQ0KDQrOu2kgPSB1biBwZXNvIGRlc2Nvbm9jaWRvIHBhcmEgZWwgdmFsb3IgbWVkaWRvIGVuIGxhIHViaWNhY2nDs24gbi7CuiBpDQoNCngwID0gbGEgdWJpY2FjacOzbiBkZSBsYSBwcmVkaWNjacOzbg0KDQpOID0gZWwgbsO6bWVybyBkZSB2YWxvcmVzIG1lZGlkb3MNCg0KQXNpbWlzbW8sIGVuIGVsIG3DqXRvZG8ga3JpZ2luZywgbGFzIHBvbmRlcmFjaW9uZXMgZXN0w6FuIGJhc2FkYXMgbm8gc8OzbG8gZW4gbGEgZGlzdGFuY2lhIGVudHJlIGxvcyBwdW50b3MgbWVkaWRvcyB5IGxhIHViaWNhY2nDs24gZGUgbGEgcHJlZGljY2nDs24sIHNpbm8gdGFtYmnDqW4gZW4gbGEgZGlzcG9zaWNpw7NuIGVzcGFjaWFsIGdlbmVyYWwgZGUgbG9zIHB1bnRvcyBtZWRpZG9zLCBtaWVudHJhcyBxdWUgZW4gZWwgbcOpdG9kbyBJRFcgDQplbCBwZXNvLCBkZXBlbmRlIHNvbGFtZW50ZSBkZSBsYSBkaXN0YW5jaWEgYSBsYSB1YmljYWNpw7NuIGRlIGxhIHByZWRpY2Npw7NuLiBJZ3VhbG1lbnRlLCBwYXJhIHV0aWxpemFyIGxhIGRpc3Bvc2ljacOzbiBlc3BhY2lhbCBlbiBsYXMgcG9uZGVyYWNpb25lcywgbGEgY29ycmVsYWNpw7NuIGVzcGFjaWFsIGRlYmUgZXN0YXIgY3VhbnRpZmljYWRhIChBcmNHSVMgUHJvLCAyMDIwKS4gDQoNClBvciBvdHJvIGxhZG8sIHBhcmEgbGEgcmVhbGl6YWNpw7NuIGRlIGtyaWdpbmcgZXMgbmVzYXJpbyBsYSB2YXJpb2dyYWbDrWEgKGFqdXN0ZSBkZSB1biBtb2RlbG8pIGRlIGxhIGVzdHJ1Y3R1cmEgZGUgbG9zIHB1bnRvcyBtZWRpZG9zLCBwYXJhIGVsbG8sIHNlIGNvbWllbnphIGNvbiBlbCBncsOhZmljbyBkZWwgc2VtaXZhcmlvZ3JhbWEgZW1ww61yaWNvLCDDqXN0ZSBzdW1pbmlzdHJhIGluZm9ybWFjacOzbiBzb2JyZSBsYSBhdXRvY29ycmVsYWNpw7NuIGVzcGFjaWFsIGRlIGxvcyBkYXRhc2V0cywgcGVybyBubyBicmluZGEgaW5mb3JtYWNpw7NuIHBhcmEgdG9kYXMgbGFzIGRpcmVjY2lvbmVzIHkgZGlzdGFuY2lhcyBwb3NpYmxlcyAoQXJjTWFwLCAyMDE2KQ0KDQpQb3IgbG8gYW50ZXJpb3IgeSBwb3JxdWUgc2UgbmVjZXNpdGEgIHF1ZSBsYXMgcHJlZGljY2lvbmVzIGRlIGtyaWdpbmcgdGVuZ2FuIHZhcmlhbnphcyBkZSBrcmlnaW5nIHBvc2l0aXZhcywgc2UgaGFjZSBuZWNlc2FyaW8gIGFqdXN0YXIgdW4gbW9kZWxvIGFsIHNlbWl2YXJpb2dyYW1hIGVtcMOtcmljby4gDQpQYXJhIGFqdXN0YXIgdW4gbW9kZWxvIGFsIHNlbWl2YXJpb2dyYW1hIGVtcMOtcmljbywgc2UgZGViZSBzZWxlY2Npb25hciB1bmEgZnVuY2nDs24gcXVlIHNpcnZhIGNvbW8gbW9kZWxvLCBlbnRyZSBlc3RvUyBtb2RlbG9zIHNlIGVuY3VhbnRyYSBwb3IgZWplbXBsbzogZWwgY2lyY3VsYXIsIGVsIGVzZsOpcmljbywgZWwgZXhwb25lbmNpYWwsIGVsIGdhdXNzaWFubywgZWwgbGluZWFsLCBlbnRyZSBvdHJvcyhBcmNNYXAsIDIwMTYpLiBFbiBlc3RlIGNhc28gc2UgdXRpbGl6w7MgZWwgbW9kZWxvIE1hdGVybiANCg0KIyMjIyAzLjIuMyBQb2zDrWdvbm9zIGRlIFRoaWVzc2VuIA0KDQpFc3RlICBtw6l0b2RvIGRlIGludGVycG9sYWNpw7NuICBlcyAgdW5vIGRlIGxvcyBtw6l0b2RvcyBtw6FzIHNpbXBsZXMsIGVzIHVuIGFuw6FsaXNpcyBkZSB2ZWNpbmRhZCB5IHNlIGJhc2EgZW4gbGEgZGlzdGFuY2lhIGV1Y2xpZGlhbmEsIGxvcyBwb2zDrWdvbm9zIHNlIGdlbmVyYW4gYWwgdW5pciBsb3MgcHVudG9zIGVudHJlIHPDrSwgdHJhemFuZG8gbWVkaWF0cmljZXMgZGUgbG9zIHNlZ21lbnRvcyBkZSB1bmnDs24uIExhcyBpbnRlcnNlY2Npb25lcyBkZSBlc3RhcyBtZWRpYXRyaWNlcyBkZXRlcm1pbmFuIHVuYSBzZXJpZSBkZSBwb2zDrWdvbm9zIGVuIHVuIGVzcGFjaW8gYmlkaW1lbnNpb25hbCBhbHJlZGVkb3IgZGUgdW4gY29uanVudG8gZGUgcHVudG9zIGRlIGNvbnRyb2wgZGUgbWFuZXJhIHF1ZSBlbCBwZXLDrW1ldHJvIGRlIGxvcyBwb2zDrWdvbm9zIGdlbmVyYWRvcyBzZWEgZXF1aWRpc3RhbnRlIGEgbG9zIHB1bnRvcyB2ZWNpbm9zIHkgZGVzaWduYW5kbyBzdSDDoXJlYSBkZSBpbmZsdWVuY2lhLiBBc2ltaXNtbywgbG9zIHZhbG9yZXMgZGUgbG9zIHB1bnRvcyBkZXNjb25vY2lkb3MsIHZpZW5lbiBkYWRvcyBwb3IgZWwgdmFsb3IgZGVsIHB1bnRvIGNvbm9jaWRvIG3DoXMgY2VyY2FubyAoQXJhZ8OzbiBldCBhbCwgMjAxOSkuIEVzIHVuYSBtZXRvZG9sb2fDrWEgb2JqZXRpdmEgeSBzZSBwdWVkZSBvYnRlbmVyIHJlc3VsdGFkb3Mgc2F0aXNmYWN0b3Jpb3Mgc2kgc2UgdGllbmUgZGF0b3MgYWRlY3VhZG9zLg0KDQohW1BvbMOtZ29ub3MgZGUgVGhpZXNzZW5dKEM6L1VzZXJzL2Ftb3IvRGVza3RvcC9Sc3R1ZGlvL3RoaWUuanBnKQ0KDQojIyMgNC4gUHJlc2VudGFjacOzbiBkZSByZXN1bHRhZG9zDQoNCiMjIyMgNC4xIE3DqXRvZG8gRGlzdGFuY2lhIEludmVyc2EgUG9uZGVyYWRhIA0KDQpBIGNvbnRpbnVhY2nDs24gc2UgcHJlc2VudGEgbGEgc3VwZXJmaWNpZSBjb250aW51YSBkZWwgZGVwYXJ0YW1lbnRvIGRlbCBNZXRhIGRlIGxvcyBkYXRvcyBkZSBwcmVjaXBpdGFjacOzbiBvYnRlbmlkYSBtZWRpYW50ZSBlbCBtw6l0b2RvIElEVyANCg0KYGBge3IsIGVjaG89RkFMU0V9DQoNCmxpYnJhcnkobGVhZmxldCkNCmxpYnJhcnkoUkNvbG9yQnJld2VyKQ0KcGFsIDwtIGNvbG9yTnVtZXJpYyhjKCJyZWQiLCAib3JhbmdlIiwgInllbGxvdyIsICJibHVlIiwgImRhcmtibHVlIiksIHZhbHVlcyhwcmVjaXAubWFzayksDQogIG5hLmNvbG9yID0gInRyYW5zcGFyZW50IikNCg0KbGVhZmxldCgpICU+JSBhZGRUaWxlcygpICU+JQ0KICBhZGRSYXN0ZXJJbWFnZShyLm0sIGNvbG9ycyA9IHBhbCwgb3BhY2l0eSA9IDAuNikgJT4lDQogIGFkZExlZ2VuZChwYWwgPSBwYWwsIHZhbHVlcyA9IHZhbHVlcyhyLm0pLA0KICAgIHRpdGxlID0gIiBJbnRlcnBvbGFjacOzbiBJRFcgUHJlY2lwaXRhY2nDs24gZW4gTWV0YVxuIGRlIDI2LjAzIHRvIDMwLjAzIGVuIGVsIDIwMjAgW21tXSIpDQpgYGANCg0KTGEgc2lndWllbnRlIGdyw6FmaWNhLCBwcmVzZW50YSBsYSByZWxhY2nDs24gZW50cmUgbG9zIGRhdG9zIGRlIHByZWNpcGl0YWNpw7NuICB5IGxvcyBlc3RpbWFkb3MgZHVyYW50ZSBsYSBpbnRlcnBvbGFjacOzbjoNCg0KYGBge3IsIGVjaG89RkFMU0V9DQoNCiMgUGxvdCB0aGUgZGlmZmVyZW5jZXMNCk9QIDwtIHBhcihwdHk9InMiLCBtYXI9Yyg0LDMsMCwwKSkNCiAgcGxvdChJRFcub3V0IH4gUCRwcmVjaXBpdGFjaW9uZXMsIGFzcD0xLCB4bGFiPSJPYnNlcnZlZCIsIHlsYWI9IlByZWRpY3RlZCIsIHBjaD0xNiwNCiAgICAgICBjb2w9cmdiKDAsMCwwLDAuNSkpDQogIGFibGluZShsbShJRFcub3V0IH4gUCRwcmVjaXBpdGFjaW9uZXMpLCBjb2w9InJlZCIsIGx3PTIsbHR5PTIpDQogIGFibGluZSgwLDEpDQpgYGANCkRlIGVzdGUgbW9kbywgZWwgZXJyb3IgbWVkaW8gY3VhZHLDoXRpY28sIGVzIGVsIHNpZ3VpZW50ZTogDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0Kc3FydCggc3VtKChJRFcub3V0IC0gUCRwcmVjaXBpdGFjaW9uZXMpXjIpIC8gbGVuZ3RoKFApKQ0KYGBgDQpBc2ltaXNtbywgYSBjb250aW51YWNpw7NuIHNlIG11ZXN0cmEgZWwgbWFwYSBkZSB2YWxpZGFjacOzbiBjcnV6YWRhLCDDqWwgY3VhbCBtaWRlIHF1ZSB0YW50YSBpbmNlcnRpZHVtYnJlIHByZXNlbnRhIGxvcyByZXN1bHRhZG9zLiBFc3RlIHByZXNlbnRhIHVuIGludGVydmFsbyBkZSBjb25maWFuemEgZGVsIDk1JSBkZWwgbW9kZWxvIGRlIGludGVycG9sYWNpw7NuLiBQYXJhIGVsbG8gc2UgdXRpbGl6w7MgIHVuIHBhcsOhbWV0cm8gZGUgcG90ZW5jaWEgZGUgMiAoaWRwID0gMi4wKS4NCg0KYGBge3IsZWNobz1GYWxzb30NCiMgQ2xpcCB0aGUgY29uZmlkZW5jZSByYXN0ZXIgdG8gQU9JDQpyIDwtIHJhc3RlcihpbWcuc2lnLCBsYXllcj0idiIpDQpyLm0gPC0gcmFzdGVyOjptYXNrKHIsIG1ldGEyKQ0KDQojIFBsb3QgdGhlIG1hcA0KdG1fc2hhcGUoci5tKSArIHRtX3Jhc3RlcihuPTcsdGl0bGU9IklEV1xuIEludGVydmFsbyBkZSBjb25maWFuemEgZGVsIDk1JSBcbihlbiBtbSkiKSArDQogIHRtX3NoYXBlKFApICsgdG1fZG90cyhzaXplPTAuMikgKw0KICANCiAgdG1fbGVnZW5kKGxlZ2VuZC5vdXRzaWRlPVRSVUUpDQpgYGANCg0KIyMjIyA0LjIgTcOpdG9kbyBLcmlnaW5nIA0KDQpWYXJpb2dyYW1hLCBtb2RlbG8gTWF0ZXJuDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KIyBMYSBzaWd1aWVudGUgcGxvdCBub3MgcGVybWl0ZSBldmFsdWFyIGVsIGFqdXN0ZQ0KcGxvdCh2YXIuc21wbCwgZGF0LmZpdCwgeGxpbT1jKDAsMTUwMDAwKSkNCmBgYA0KDQpTdXBlcmZpY2llIGdlbmVyYWRhOg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCmxpYnJhcnkobGVhZmxldCkNCmxpYnJhcnkoUkNvbG9yQnJld2VyKQ0KcGFsIDwtIGNvbG9yTnVtZXJpYyhjKCJyZWQiLCAib3JhbmdlIiwgInllbGxvdyIsICJibHVlIiwgImRhcmtibHVlIiksIHZhbHVlcyhwcmVjaXAubWFzayksDQogIG5hLmNvbG9yID0gInRyYW5zcGFyZW50IikNCg0KbGVhZmxldCgpICU+JSBhZGRUaWxlcygpICU+JQ0KICBhZGRSYXN0ZXJJbWFnZShyLm0sIGNvbG9ycyA9IHBhbCwgb3BhY2l0eSA9IDAuNikgJT4lDQogIGFkZExlZ2VuZChwYWwgPSBwYWwsIHZhbHVlcyA9IHZhbHVlcyhyLm0pLA0KICAgIHRpdGxlID0gIlByZWNpcGl0YWNpw7NuIEludGVycG9sYWNpw7NuIEtyaWdpbmcgZW4gTWV0YVxuIERlbCAgMjYuMDMgYWwgMzAuMDMgZW4gMjAyMCBbbW1dIikNCmBgYA0KDQpNYXBhIGRlIHZhcmlhbnphIGRlIGxhIGludGVycG9sYWNpw7NuIGNvbiBlbCBtw6l0b2RvIGtyaWdpbmcgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KDQpyICAgPC0gcmFzdGVyKGRhdC5rcmcsIGxheWVyPSJ2YXIxLnZhciIpDQpyLm0gPC0gcmFzdGVyOjptYXNrKHIsIG1ldGEyKQ0KDQp0bV9zaGFwZShyLm0pICsgDQogIHRtX3Jhc3RlcihuPTcsIHBhbGV0dGUgPSJSZWRzIiwNCiAgICAgICAgICAgIHRpdGxlPSJJbnRlcnBvbGFjacOzbiBrcmlnaW5nIFxuTWFwYSBkZSB2YXJpYW56YSBcbihlbiBtbSkiKSArdG1fc2hhcGUoUCkgKyB0bV9kb3RzKHNpemU9MC4wMikgKw0KICB0bV9sZWdlbmQobGVnZW5kLm91dHNpZGU9VFJVRSkNCmBgYA0KDQpBaG9yYSwgZWwgbWFwYSBjb24gdW4gaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSBkZWwgOTUlIGVsIGN1YWwgc2UgZ2VuZXLDsyBhIHBhcnRpciBkZWwgbWFwYSBkZSB2YXJpYW56YS4gDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KDQpyICAgPC0gc3FydChyYXN0ZXIoZGF0LmtyZywgbGF5ZXI9InZhcjEudmFyIikpICogMS45Ng0Kci5tIDwtIHJhc3Rlcjo6bWFzayhyLCBtZXRhMikNCg0KdG1fc2hhcGUoci5tKSArIA0KICB0bV9yYXN0ZXIobj03LCBwYWxldHRlID0iUmVkcyIsDQogICAgICAgICAgICB0aXRsZT0iSW50ZXJwb2xhY2nDs24gS3JpZ2luZ1xuIG1hcGEgY29uIDk1JSBJQyBcbihlbiBtbSkiKSArdG1fc2hhcGUoUCkgKyB0bV9kb3RzKHNpemU9MC4yKSArDQogIHRtX2xlZ2VuZChsZWdlbmQub3V0c2lkZT1UUlVFKQ0KYGBgDQoNCiMjIyMgNC4zIFBvbGlnb25vcyBkZSBUaGllc3NlbiANCg0KU3VwZXJmaWNpZSBnZW5lcmFkYSBtZWRpYW50ZSBlbCBtw6l0b2RvOiBwb2zDrWdvbm9zIGRlIFRoaWVzc2VuIA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCg0KdG1fc2hhcGUodGguY2xwKSArIA0KICB0bV9wb2x5Z29ucyhjb2w9InByZWNpcGl0YWNpb25lcyIsIHBhbGV0dGU9IlJkQnUiLCBtaWRwb2ludD0zMC4wLA0KICAgICAgICAgICAgICB0aXRsZT0iUG9sw61nb25vcyBkZSBUaGllc3NlbiBcblByZWRpY2Npw7NuIGRlIHByZWNpcGl0YWNpw7NuIFxuKGVuIG1tKSIpICsNCiAgdG1fbGVnZW5kKGxlZ2VuZC5vdXRzaWRlPVRSVUUpDQpgYGANCg0KIyMjIDUuIEFuw6FsaXNpcyBkZSByZXN1bHRhZG9zDQoNClNlIG9ic2VydsOzIHF1ZSBlcyBwb3NpYmxlIHJlYWxpemFyIGxhIGludGVycG9sYWNpw7NuIGRlIGxvcyBkYXRvcyBkZSBwcmVjaXBpdGFjacOzbiBDSElSUFMsIHlhIHNlYSBjb24gZWwgbcOpdG9kbyBJRFcsIGtyaWdpbmcgbyBwb2zDrWdvbm9zIGRlIFRoaWVzc2VuLCBsb3MgY3VhbGVzIGVuIGdlbmVyYWwgZXN0aW1hbiBsb3MgdmFsb3JlcyBkZXNjb25vY2lkb3MgY29uIHVuIGVycm9yIGFzb2NpYWRvIGJham8gKElEVyBZIEtyaWdpbmcpLCBzaSBlbWJhcmdvLCBzZSBhcHJlY2lhIGFsZ3Vub3MgZGlyZWZlcmVuY2lhcyBlbiBsYXMgaW50ZXJwb2xhY2lvbmVzIHByaW5jaXBhbG1lbnRlIGVuIGxvcyBzZWN0b3JlcyBkZWwgZGVwYXJ0YW1lbnRvIHF1ZSByZWdpc3RyYW4gcHJlY2lwaXRhY2lvbmVzIG3DoXMgYWx0YXMgKD4yMCBtbSkuDQoNCkVsIHJlc3VsdGFkbyBkZSBsYSBkZSBpbnRlcnBvbGFjacOzbiBjb24gZWwgbcOpdG9kbyBJRFcgZXMgdW5hIHByZWRpY2Npw7NuIGFwcm94aW1hZGEgZGUgbGEgcmVhbGlkYWQsIGVzdG8gc2UgcHVlZGUgZW50ZW5kZXIgYWwgb2JzZXJ2YXIgZWwgdmFsb3Igb2J0ZW5pZG8gZGVsIGPDoWxjdWxvIGRlbCBlcnJvciBjdWFkcsOhdGljbyAgKDIuMzYpLCBsbyBxdWUgaW5kaWNhIHVuIGVycm9yIGVuIGxhIHByZWRpY2Npw7NuIGVuIHByb21lZGlvIDIuMzYgbW0sIGVzdG8gbm8gZXMgbXV5IHNpZ25pZmljYXRpdm8gZGViaWRvIGEgcXVlIGEgbGFzIHByZWNpcGl0YWNpb25lcyBxdWUgcmVnaXN0cmEgZWwgZGVwYXJ0ZW1hbnRvIHZhbiBkZSAwLjkgYSAzNC4zIG1tLiBJZ3VhbG1lbnRlLCBhbCBhbsOhbGl6YXIgZWwgbWFwYSBjb24gdW4gaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSBkZWwgOTUlIGRlIGRlc3RhY2EgcXVlIGdyYW4gcGFydGUgZGVsIGRlcGFydGFtZW50byBwcmVzZW50YW4gZXJyb3JlcyBiYWpvcyBlbiBsYSBpbnRlcnBvbGFjacOzbiAoZGUgMCBhIDAuNSBtbSksIGF1bnF1ZSBoYXkgcGVxdWXDsWFzIHpvbmFzIGNvbiBlcnJvcmVzIGVudHJlIDIgYSAyLjUgbW0uIFBvciBvdHJvIGxhZG8sIHRhbWJpw6luIHNlIG9ic2VydmEgcXVlIGxhIHN1cGVyZmljaWUgZ2VuZXJhZGEgbm8gdmlzdWFsaXphIGxhcyBwcmVjaXBpdGFjaW9uZXMgbcOhcyBhbHRhcyBxdWUgcHJlc2VudGEgYWxndW5vcyBzZWN0b3JlcywgcG9yIGVqZW1wbG8gZGUgbG9zIG11bmljaXBpb3MgZGUgU2FuIEx1aXMgZGUgQ3VycmFiYXJhbCB5IExlamFuw61hcw0KDQpFbCBNw6l0b2RvIGRlIGtyaWdpbmcsIHBvciBzdSBwYXJ0ZSwgIGdlbmVyw7MgdW5hIHN1cGVyZmljaWUgYmFzdGFudGUgY2VyY2FuYSBhIGxvcyBkYXRvcyBwcmVzZW50ZXMsIGxvIGN1YWwgc2UgcHVlZGUgZW50ZW5kZXIgdGFudG8gYWwgY29tcGFyYXIgbGEgc3VwZXJmaWNpZSBnZW5lcmFkYSBjb24gbGEgdmlzdWFsaXphY2nDs24gZGUgbG9zIGRhdG9zIENoaXJwcyBjb21vLCBwcmluY2lwYWxtZW50ZSwgYWwgb2JzZXJ2YXIgZWwgbWFwYSBkZSB2YXJpYW56YSBkZSBsYSBpbnRlcnBvbGFjw7NuLCBlbCBjdWFsIHZpc3VhbGl6YSBxdWUgZ3JhbiBwYXJ0ZSBkZWwgZGVwYXJ0YW1lbnRvIHByZXNlbnRhIGVycm9yZXMgYmFqb3MgZW4gZWwgcHJvY2VzbyBkZSAgaW50ZXJwb2xhY2nDs24sIHNpZW5kbyBlc3RvcyBkZSAxIGEgMiBtbSwgbyBkZSAyIGEgMyBtbSBlbiBhbGd1bmFzIHpvbmFzLiBBc2ltaXNtbywgc2UgcHVlZGUgZGVjaXIgcXVlIGVsIHVzbyBkZWwgbW9kZWxvIE1hdGVybiBlbiBlbCBhanVzdGUgZGVsIHZhcmlvZ3JhbWEgZnVlIGNvcnJlY3RvLiANCg0KUG9yIMO6bHRpbW8sIGVsIG3DqXRvZG8gZGUgbG9zIHBvbMOtZ29ub3MgZGUgVGhpZXNzZW4sIGF1bnF1ZSBmdWUgZWwgbcOhcyBmw6FjaWwgZGUgcmVhbGl6YXIgdGllbmUgY29tbyBwcm9ibGVtYSBxdWUgbm8gZXMgcG9zaWJsZSBlc3RpbWFyIGVsIGVycm9yIGFzb2NpYWRvLCBkZWJpZG8gYSBxdWUgY2FkYSBwdW50byBzZSBvYnRpZW5lIGEgcGFydGlyIGRlIHVuIHNvbG8gcHVudG8sIGlndWFsbWVudGUsICBzZSBvYnNlcnZhIHF1ZSBsYSBpbnRlcnBvbGFjacOzbiBjb24gZXN0ZSBtw6l0b2RvIG11ZXN0cmEgY2FtYmlvcyBicnVzY29zIGVudHJlIHB1bnRvcywgcG9yIGxvIHF1ZSBubyBzZXJpYSBidWVuYSBpZGVhIHV0aWxpemFybG8gZW4gem9uYXMgbXV5IGlycmVndWxhcmVzLiBTaW4gZW1iYXJnbywgbGEgc3VwZXJmaWNpZSBnZW5lcmFkYSBwb3IgZXN0ZSBtw6l0b2RvLCBhIHByaW1lcmEgdmlzdGEgaGFjZSB1bmEgcHJlZGljY2nDs24gY2VyY2FuYSBkZSBsb3MgZGF0b3MgQ0hJUlBTLg0KDQoNCiMjIyA2LiBDb25jbHVzaW9uZXMNCg0KTG9zIGRhdG9zIENISVJQUyBkYWRvIGEgc3UgY3VicmltaWVudG8gY2FzaSBnbG9iYWwgcHJvcG9yY2lvbmEgaW5mb3JtYWNpw7NuIGNvbXBsZXRhIHkgY29uZmlhYmxlLCBzb24gZGUgZsOhY2lsIGFuw6FsaXNpcyBwZXJtaXRlbiBvYnRlbmVyIHRlbmRlbmNpYXMgeSByZWFsaXphciBtb25pdG9yZW9zIGRlIGxhIHByZWNpcGl0YWNpw7NuICBlbiBkaWZlcmVudGVzIHpvbmFzIGRlIGludGVyZXMsIGxvIGN1YWwgZXMgZGUgZ3JhbiBpbXBvcnRhbmNpYSBwYXJhIHJlYWxpemFyIGVuIGRhZG8gY2FzbywgYWxnw7puIHRpcG8gZGUgYWxlcnRhIGRlIGZvcm1hIHRlbXByYW5hLiAgDQoNCkxhIGludGVycG9sYWNpw7NuIGRlIGRhdG9zIGVzIHVuYSBhY3RpdmlkYWQgZGUgZ2VvcHJvY2VzYW1pZW50byDDunRpbCBwYXJhIHJlYWxpemFyIGFsZ8O6biB0aXBvIGRlIGFuw6FsaXNpcyBlc3BhY2lhbCwgYXNpbWlzbW8sIHBlcm1pdGUgZ2VuZXJhciBhbGfDum4gdGlwbyBkZSBtYXBhLCBsbyBjdWFsIGF5dWRhIGEgcmVwcmVzZW50YXIgbGEgaW5mb3JtYWNpw7NuIGRlbCBvYmpldG8gZGUgZm9ybWEgbcOhcyBzaW1wbGlmaWNhZGEuDQoNCkxhIHN1cGVyZmljaWUgZ2VuZXJhZGEgcG9yIGxvcyBtw6l0b2RvcyBkZSBpbnRlcnBvbGFjacOzbiBJRFcsIGtyaWdpbmcgeSBsb3MgcG9sw61nbm9zIGRlIFRoaWVzc2VuIHByZXNlbnRyYXJvbiBhbGd1bmFzIGRpZmVyZW5jaWFzIGVzcGVjaWFsbWVudGUgZW4gbGFzIMOhcmVhcyBkZSBsb3MgbXVuaXBpb3MgcXVlIHByZXNlbnRhbiB2YWxvcmVzIG1heW9yZXMgZGUgcHJlY2lwaXRhY2nDs24sIHNpbiBlbWJhcmdvLCBzZSBhcHJlY2lhIGVuIGVzdGUgY2FzbyBxdWUgdGFudG8gbG9zIG3DqXRvZG9zIGRldGVybWluaXN0YXMgKElEVykgY29tbyBsb3MgZ2VvZXN0YWRpc3RpY29zIChrcmlnaW5nKSB1IG90cm9zIChQb2zDrWdvbm9zIGRlIFRoaWVzc2VuKSBwcm9wb3JjaW9uYXJvbiBzdXBlcmZpY2llcyBlbiBnZW5lcmFsIHNpbWlsYXJlcy4gDQoNCkVsIG3DqXRvZG8gZGUgaW50ZXJwb2xhY8Otw7NuIHF1ZSBnZW5lcsOzIHVuYSBzdXBlcmZpZSBtw6FzIGFjZXJ0YWRhIGVuIGVzdGUgY2FzbyBmdWUgZWwgbcOpdG9kbyBrcmlnaW5nIGRlYmlkbyBhIHF1ZSBzZSBvYnNlcnZhIHF1ZSBlbCBlcnJvciBlbiBsYSBpbnRlcnBvbGFjacOzbiBlbiBncmFuIHBhcnRlIGRlbCBkZXBhcnRhbWVudG8gZXMgZGUgdGFuIHNvbG8gMSBhIDIgbW0sIHNpbiBlbWJhcmdvLCBjYWJlIGRlc3RhY2FyIHF1ZSBlbCBtw6l0b2RvIElEVywgZ2VuZXLDsyB1bmEgc3VwZXJmaWNpZSBjb24gdW4gZXJyb3IgZW4gbGEgcHJlZGljY2nDs24gZW4gcHJvbWVkaW8gZGUgMi4zNiBtbSwgcG9yIGxvIGN1YWwgY3VhbHF1aWVyYSBkZSBlc3RvcyBtw6l0b2RvcyBkZSBpbnRlcnBvbGFjacOzbiBwb2RyaWFuIHNlciBhcGxpY2Fkb3MuIA0KDQpFbCBtw6l0b2RvIGRlIGxvcyBwb2zDrWdvbm9zIGRlIFRoaWVzc2VuIGVzIHVuIG3DqXRvZG8gcXVlIHBvZHJpYSBzZXIgYXByb3ZlY2hhZG8gZW4gZXN0dWRpb3MgbWVub3MgcmlndXJvc29zIGRvbmRlIG5vIHNlYSB0b3RhbG1lbnRlIG5lY2VzYXJpbyBjb25vY29jZXIgZWwgZXJyb3IgYXNvY2lhZG8gYWwgcHJvY2VzbyBkZSBpbnRlcnBvbGFjacOzbiwgbm8gb2JzdGFudGUsIHNlIGRlYmUgdGVuZXIgcHJlc2VudGUgcXVlIGxvcyBkYXRvcyBhIHV0aWxpemFyIHNlYW4gbG9zIGFkZWN1YWRvcyB5IGxhIHpvbmEgZGUgZXN0dWRpbyBubyBzZWEgbXV5IGlycmVndWxhci4gDQoNCg0KIyMjIDcuIFJlZmVyZW5jaWFzDQoNCg0KUEVOVUQuIDIwMDguIEVsIGRlcGFydGFtZW50byBkZWwgTWV0YSBmcmVudGUgYSBsb3Mgb2JqZXRpdm9zIGRlIGRlc2Fycm9sbG8gZGVsIE1pbGVuaW8uIE9idGVuaWRvIGRlIGh0dHBzOi8vd3d3LmNlcGFsLm9yZy9NREcvbm90aWNpYXMvcGFnaW5hcy82LzQ0MzM2L01ldGFfZmluYWwucGRmDQoNCkNvbnRyb2xhcmlhLiAyMDE1LiBQZXJmaWwgZGUgbGEgZ2VzdGlvbiBmaXNjYWwgZGVsIGRlcGFydGFtZW50byBkZWwgTWV0YS4gT2J0ZW5pZG8gZGUgaHR0cHM6Ly93d3cuY29udHJhbG9yaWEuZ292LmNvL2RvY3VtZW50cy80ODc2MzUvNTIwOTI4L1BlcmZpbCtnZXN0aSVDMyVCM24rTUVUQS5wZGYvNmRjZmIyOTQtN2MwYi00NzcxLWFhNDgtNTk1YWFlZTU4YjUyP3ZlcnNpb249MS4wDQoNCkluc3RpdHV0byBEZSBUdXJpc21vIGRlbCBNZXRhLiAyMDIwLiBNZXRhLCBJbmZvcm1hY2nDs24gZ2VuZXJhbC4gT2J0ZW5pZG8gZGUgaHR0cDovL3d3dy50dXJpc21vbWV0YS5nb3YuY28vZWwtbWV0YS9pbmZvcm1hY2lvbi1nZW5lcmFsLmh0bWwNCg0KSURFQU0uIDIwMjAuIFByb21lZGlvcyBjbGltYXRvbMOzZ2ljb3MgKDE5ODEtMjAxMCkuT2J0ZW5pZG8gZGUgaHR0cDovL3d3dy5pZGVhbS5nb3YuY28vd2ViL3RpZW1wby15LWNsaW1hL2NsaW1hDQoNCg0KT2plYSwgTC4sIFRvdmFyLCBMLigyMDE2KS4gRWwgYW7DoWxpc2lzIGVzcGFjaWFsIGNvbW8gdW5hIGhlcnJhbWllbnRhIHBhcmEgZWwgZXN0dWRpbyBkZSB0cmFuc3BvcnRlIGRlIGNhcmdhIHVyYmFuby4gWElJIENvbmdyZXNvIGRlIEluZ2VuaWVyw61hIGRlbCBUcmFuc3BvcnRlDQpWYWzDqG5jaWEsIFVuaXZlcnNpZGFkIFBvbGl0w6ljbmljYSBkZSBWYWzDqG5jaWEsIE9idGVuaWRvIGRlIGh0dHA6Ly9vY3MuZWRpdG9yaWFsLnVwdi5lcy9pbmRleC5waHAvQ0lUL0NJVDIwMTYvcGFwZXIvdmlld0ZpbGUvNDEyNS8xNDQ4DQoNCkFyY0dJUywgMjAyMC4gQW7DoWxpc2lzIGVzcGFjaWFsLiBFbiBBcmNHSVMgUHJvLiBPYnRlbmlkbyAgZGU6ICBodHRwczovL3Byby5hcmNnaXMuY29tL2VzL3Byby1hcHAvaGVscC9hbmFseXNpcy9pbnRyb2R1Y3Rpb24vc3BhdGlhbC1hbmFseXNpcy1pbi1hcmNnaXMtcHJvLmh0bQ0KDQpBcmNHSVNNYXAgaHR0cHM6Ly9kZXNrdG9wLmFyY2dpcy5jb20vZXMvYXJjbWFwLzEwLjQvZXh0ZW5zaW9ucy9nZW9zdGF0aXN0aWNhbC1hbmFseXN0L2RldGVybWluaXN0aWMtbWV0aG9kcy1mb3Itc3BhdGlhbC1pbnRlcnBvbGF0aW9uLmh0bQ0KDQpVU0FJRCwgMjAyMC4gQ0hJUlBTOiBSYWluZmFsbCBFc3RpbWF0ZXMgZnJvbSBSYWluIEdhdWdlIGFuZCBTYXRlbGxpdGUgT2JzZXJ2YXRpb25zLiBvYnRlbmlkbyBkZSBodHRwczovL2NoYy51Y3NiLmVkdS9kYXRhL2NoaXJwcw0KDQpVbml2ZXJyc2lkYWQgZGVsIFJvc2FyaW8uIFMuZi4gTWV0YS4gb2J0ZW5pZG8gZGU6IGh0dHBzOi8vcmVwb3NpdG9yeS51cm9zYXJpby5lZHUuY28vYml0c3RyZWFtL2hhbmRsZS8xMDMzNi84NjgxLzEwMjA3NjMyNTEtMTUucGRmP3NlcXVlbmNlPTE1DQoNClFHSVMuIDIwMjAuIEFuw6FsaXNpcyBFc3BhY2lhbCAoSW50ZXJwb2xhY2nDs24pLiBPYnRlbmlkbyBkZTogDQpodHRwczovL2RvY3MucWdpcy5vcmcvMi4xNC9lcy9kb2NzL2dlbnRsZV9naXNfaW50cm9kdWN0aW9uL3NwYXRpYWxfYW5hbHlzaXNfaW50ZXJwb2xhdGlvbi5odG1sDQoNCg0KDQoNCg0KDQoNCg==