El objetivo principal del curso es aprender un poco, todo lo que
podamos, sobre una nueva disciplina: Ciencia de datos o Data Science. En
concreto, nos centraremos en aprender a manejar y analizar datos
utilizando una herramienta profesional como R. En el tema 2 hablaremos y
utilizaremos intensivamente R, de momento nos sobra con señalar que R es
un programa informático, más bien un entorno, con el que hacer análisis
de datos (o ciencia de datos), pero R también es un lenguaje de
programación. Lo veremos!!
Antes de empezar el cuerpo principal del curso voy a tratar de
explicar, en este tema introductorio, qué significan términos que todos
habéis oído como: Big Data, Inteligencia Artificial (IA), Machine
Learning (ML), algoritmos, redes neuronales, etc… etc… Puff!!! Muchas
cosas, pero … paso a paso.
1. ¿Qué es esto de la era del Big Data?
Pues no os voy a engañar, la principal razón de la presencia del
término “Big Data” en el título del curso es que me parecía que como el
título comienza con “Programación y manejo de datos …”, es posible que
nadie se apuntase al curso, así que había que añadir al título un
término de moda y un poco misterioso. ¿Estrategia de marketing? Un poco
sí, pero en realidad todos los cursos de Ciencia de Datos que están
apareciendo en el mundo, seguramente no habrían aparecido si no
estuviésemos en la “era del Big Data”. En el curso no usaremos técnicas
de Big Data pero sí hablaremos algo de ellas, principalmente en el tema
4.
Los tiempos están cambiando (The Times They Are A
Changin’) decía Bob Dylan en el 64. Quizás los tiempos siempre han
estado cambiando y siempre cambiarán, pero ahora mismo la mayoría de
nosotros tenemos la sensación de que todo va muy deprisa. En mi opinión
lo que está detrás de este cambio acelerado del mundo en muchos aspectos
tiene que ver con la tecnología, fundamentalmente con los ordenadores y
las redes que transmiten cantidades ingentes de datos.
Puede que nada ilustre más estos cambios que lo qué he hecho yo para
continuar este razonamiento: en lugar de buscar un libro he buscado en
Google “la era del Big Data”. En estos últimos años he leído bastante
sobre el tema, pero para empezar a pensar me he ido a Google y he
buscado el término. El tercer resultado me ha llevado a la Wikipedia
(otro de los milagros disruptivos que hemos vivido en las dos últimas
décadas). Igual que he hecho yo para informarme/documentarme, todos los
días utilizamos software, aplicaciones para gestionar la agenda,
escuchar radio, comprar, comunicarnos etc … La tecnología está presente
en todos los aspectos de nuestra vida porque llevamos un ordenador, el
teléfono móvil, en el bolsillo, y con él podemos comunicarnos y recibir
y transmitir información a través de la redes. Esto es lo que ha
cambiado el mundo y seguirá cambiándolo y afectará a todas las esferas
de nuestra vida, espero que para bien (seguro!!). Pero claro, en el
curso no vamos a hablar de todo esto, solo de trasfondo, sino que nos
centraremos en los datos, en como tratar, manejar y obtener información
de las grandes cantidades de datos que consumimos y generamos
constantemente; así que, dejemos las posibles implicaciones sociales,
políticas, filosóficas para otros cursos y bajemos a cosas más
concretas.
¿Qué significa, qué es Big Data?
Pues es un término polisémico, tiene distintos significados. Luego
seré más preciso y riguroso, pero de momento podemos pensar que Big Data
significa que tenemos muuuuuuchos datos, muchos. Esta disponibilidad de
datos es uno de los principales factores que explican porqué el
desarrollo técnico se ha acelerado en los últimos tiempos.
Lo que ha pasado es que, el hecho de que los científicos dispongan
ahora de muchos datos ha dado un fuerte impulso a un campo de la
Inteligencia Artificial (concretamente el campo del Machine
Learning/Deep Learning) que ha hecho que las máquinas, los ordenadores,
los robots, puedan hacer cosas que antes eran inimaginables, como por
ejemplo que Alexa nos entienda, que haya coches autónomos que conduzcan
mejor que los humanos, que un ordenador gane al campeón mundial de
ajedrez (esto paso ya hace mucho tiempo, en 1996, antes de la era del
Big data ).
En los medios, en la tele, se habla, aparece el término “la era del
Big data” significando más o menos lo que os he contado, que la
“abundancia de datos” está impulsando fuertemente el desarrollo
tecnológico, de forma que ahora tenemos acceso a aplicaciones que hasta
hace bien poco parecían ciencia ficción.
Este acelerado cambio técnico y sus aplicaciones, va a tener y está
teniendo innumerables efectos en todos los ámbitos de nuestra vida y
también en el de las empresas e industrias. Muchas industrias, como la
del transporte van a ver como el escenario cambia y, muy posiblemente,
las que no sepan entender y aprovechar los nuevos retos tecnológicos
posiblemente acaben despareciendo; evidentemente esto genera, ya sea
real o no, una urgencia en las empresas por intentar no quedarse fuera
de este cambio acelerado y esto, en principio, genera mayor demanda de
profesionales que sepan de tecnología y de datos. Bien, creo que ya
tenemos un poco más claro que significa esto de “la era del Big
Data”.
El término Big Data es relativamente nuevo, y en castellano se suele
traducir como “Datos masivos”, aunque ahora mismo en la wikipedia pone
“Macrodatos” y aquí
recomiendan el uso del término Macrodatos. A mi personalmente no me
acaba de gustar este término, pero quizás sea por el hecho de que tengo
formación de economista, y el término macrodatos me recuerda a los datos
macroeconómicos. En cualquier caso, el término usado habitualmente es el
inglés: Big Data.
El término tiene matices, y variantes, pero para mi, la
característica definitoria de datos Big es el hecho de que estos datos
tengan tal volumen (o complejidad) que no “quepan”, que no puedan
“manejarse” en un ordenador, en realidad que no puedan tratarse con las
aplicaciones informáticas habituales. Tal y como figura en la Wikipedia:
“es un término que hace referencia al concepto relativo a conjuntos de
datos tan grandes y complejos como para que hagan falta aplicaciones
informáticas no tradicionales de procesamiento de datos para tratarlos
adecuadamente”
Luego hay “definiciones” más elaboradas como una famosa, de 2001 en
la que se destacaban tres aspectos en el Big Data, las tres
“v’s” del Big Data: volumen, velocidad y
variedad: después se han añadido 2 uves más y se habla de 5
uves o 5 aspectos relacionados con el Big Data: volumen
de datos, velocidad con la que se obtienen y
transfieren, variedad de tipos de datos (texto,
imágenes etc…), veracidad de las fuentes, y un quinto
aspecto a considerar es el valor que aportan los datos.
En este
texto cortito lo explican bien.
Se pueden mirar más aspectos del Big data, pero lo fundamental es que
son datos, que ya sea por su volumen, por su variedad, o por su
velocidad no son fáciles de almacenar/tratar/manejar con las técnicas y
ordenadores habituales. Este hecho da lugar a que el mercado, las
empresas, necesiten personas que sean capaces de gestionar la
infraestructura de hardware y software para manejar datos masivos, estas
personas generalmente son ingenieros de software, o informáticos. Además
de almacenar y distribuir los datos las empresas también necesitan
personas que sean capaces de analizar y obtener información y valor de
esos datos, el perfil de estas personas es menos uniforme, puede que
sean ingenieros, matemáticos, estadísticos, economistas (why not?),
biólogos, sí en Biología con el estudio del genoma y los genes es uno de
los campos donde más se está haciendo Ciencia de Datos.
En cualquier caso, como es un área o campo de estudio relativamente
nueva y además en constante evolución, los términos y conceptos aún
están definiéndose y evolucionando; por ejemplo, ya se empieza a hablar
del “smart
data”. En este artículo señalan que:
“El término big data … hace referencia a conjuntos de datos que,
debido a su gran volumen, necesitan sistemas especializados de
almacenado y procesado para poder trabajar con ellos de manera eficiente
…. La información es importante, sí, pero demasiada puede llegar a ser
confusa y hasta contraproducente …. Aquí es donde el big data da un paso
hacia adelante, el smart data, que se encarga de detectar señales y
patrones relevantes a través de algoritmos inteligentes”.
Esto a mí me suena al objetivo fundamental de la Ciencia de Datos,
extraer información a partir de los datos de forma que se genere
conocimiento y/o valor.
Muchas veces si leéis un articulo relacionado con “el Big Data”
aparecen palabras extrañas: Keras, TensorFlow, Apache, ApacheSpark,
Mongo, MongoDB, Maria, Cassandra, …. y muchísimas más. Yo conozco
algunas un poco, otras me suenan y otras me suenan a chino. ¿Qué son?
Pues en general son nombres de aplicaciones informáticas, o repositorios
de datos, o empresas, o paquetes, frameworks, …, que se utilizan para
almacenar/tratar/manejar/estimar modelos con grandes volúmenes de datos.
Por ejemplo Apache
es una fundación de software libre, que se ocupa de hacer proyectos que
en la práctica posibilitan hacer Big data, implementar los nuevas
técnicas, con software y plataformas open source. Como la fundación
Apache tiene muchos proyectos y “productos”, por eso hay ApacheSpark,
Cassandra, Geronimo etc…
Esta infraestructura, tanto física (ordenadores, repositorios), como
de software/programas que se utilizan en Big Data cambian muy deprisa.
Constantemente están surgiendo nuevas empresas, nuevos métodos, un nuevo
algoritmo, una nueva implementación de algo ya existente, etc…
Nos acaba de parecer otra palabra importante en este campo de
conocimiento, los algoritmos, ya hablaremos de ellos y
su importancia en “la era del Big Data”.
Quiero llamaros la atención sobre varias ideas que, como muchísimas
otras no trataremos en el curso , algunas de ellas provienen de este
artículo:
Los datos hoy son omnipresentes y a menudo abrumadores.
Producimos, organizamos y consumimos datos de manera casi constante.
Estamos rodeados de información que no para de aumentar. Una de las
principales fuentes de datos son nuestras acciones en la red (clicks,
likes, rating, shares, etc… ), pero también hay muchos datos
provenientes de sensores en máquinas y procesos, piensa por ejemplo en
la información que genera un coche de Formula 1, o un sonda espacial, o
el VAR que hay en el fútbol. A modo de ejemplo, Data
Never Sleeps 8.0 de Domo informó que en cada minuto de 2020 hubo,
usando datos solamente de la la plataforma Zoom, un promedio de 208.333
personas conectadas en una reunión virtual y se crearon 347.222
historias en Instagram.
De la misma forma que Internet cambió radicalmente el mundo al
añadir comunicación, los datos masivos modificaran aspectos
fundamentales de nuestra vida otorgándole una dimensión cuantitativa que
nunca había tenido antes, piensa por ejemplo en aplicaciones médicas o
de monitorización de la actividad física. Ante tal volumen de datos, el
desafío es construir conocimiento usando los datos más relevantes y
diversos, no solo para nosotros, sino para nuestra sociedad en su
conjunto.
Hasta hace algunas décadas la recopilación de la información
estaba mayormente a cargo de los Estados nacionales, pero, ahora mismo,
gran parte de los datos están en manos de empresas privadas (Google,
Facebook, Amazon, … ). Esto tiene y puede tener fuertes implicaciones y
consecuencias.
El poseer datos puede dar poder/beneficio/ventajas competitivas a
quien los posea. Por ejemplo, según los expertos, el mejor traductor
online no es Google Translator sino DeepL. Los dos servicios
utilizan algoritmos de inteligencia artificial, pero parece ser que
DeepL tiene mejores datos. DeepL utiliza los datos del proyecto Linguee
que ha permitido construir una base de datos enorme. Lo explican aquí
El ejemplo anterior ilustra que lo que hay detrás de los avances
no son los algoritmos o la IA/ML/DL, sino los datos: el gran volumen de
datos es lo que ha hecho posible esta época de avances tecnológicos
acelerados; en este sentido se suele decir que los
datos son el nuevo petroleo, pero a diferencia de este, cuyas
reservas podemos considerar fijas, el volumen de datos no hace sino
crecer, son más fáciles de transportar y generan más valor para la
sociedad cuanta más gente los usa.
Obviamente, la gran disponibilidad de datos tiene también
aspectos más oscuros o con potenciales peligros, como por ejemplo
aspectos legales en la seguridad y privacidad,
o sesgos en los datos. Ya no sólo que los gobiernos corten internet o
espíen a los ciudadanos, como por ejemplo el caso Snowden o el plan de
crédito social chino, sino que está emergiendo un mercado
de espionaje digital.
En este
post hablan de cómo favorecer que las aplicaciones surgidas de la IA
sean socialmente responsables o que los algoritmos no acaben
reproduciendo los sesgos presentes en los datos. En esta
guía para el diseño responsable de sistemas de IA del Alan Turing
Institute desarrollan estás ideas.
Cuando se dispone de datos sensibles, por ejemplo datos médicos,
aparece el dilema entre privacidad e información que puede ser
beneficiosa para la sociedad. Siempre se puede tratar de anonimizar los
datos, pero parece ser que a los expertos les resulta no demasiado
complicado recuperar la información original; es decir, a veces es
posible la reidentificación
de ficheros anonimizados. Más sobre esto aquí y aquí.
Como en otras facetas de la vida, la información y transparencia
es clave a la hora de reducir los posibles riesgos de las aplicaciones
de IA. Es importante que el código fuente de las aplicaciones y
algoritmos sea de acceso libre. Como ejemplo este
artículo de Público o este paper.
2. IA, ML y DL
Inteligencia Artificial (IA), Machine Learning (ML) y Deep Learning
(DL)
son tres palabras/conceptos que aparecen constantemente en la era del
Big Data. Aquí
tienes un post sencillo y claro sobre estos tres términos.
La primera idea a retener está resumida en la infografía que veis más
abajo y que proviene de este post
Como se aprecia en la infografía, DL es un subconjunto del ML y ML es
un campo de la IA. Vamos que tanto DL como ML son aplicaciones
específicas de IA. La IA surgió en los 50 y el ML puede verse como un
enfoque de la IA que empezó a coger fuerza en los 80 y que supuso un
cambio de paradigma en como se afrontaba la IA.
Primero veamos qué es la IA. Para ello voy a recurrir de nuevo a la
Wikipedia
y a lo que ya sé sobre IA para redactar unos párrafos que os den cierta
idea de qué es la IA.
La Wikipedia empieza diciendo: “IA es la inteligencia llevada a cabo
por máquinas”. Esta primera frase no aclara mucho, pero es que a veces
la cosas cuestan. Lo intento yo: IA es un campo de conocimiento,
compartido por varias ciencias, cuyo objetivo podemos pensar qué es que
la maquinas sean inteligentes. Las maquinas no son humanos, nunca van a
poder ser inteligentes en un sentido amplio o humano, sólo en la
ciencia-ficción, pero sí pueden tener comportamientos “inteligentes”; es
decir que hagan cosas que simulen la inteligencia humana como por
ejemplo resolver problemas o dicho de forma más técnica, en función de
unas variables de entorno tomar una decisión (esto es lo que hace por
ejemplo un ordenador que juega al ajedrez, en función de las posiciones
de las piezas en el tablero toma una decisión sobre que pieza mover).
Una definición concisa del campo sería: el esfuerzo por automatizar las
tareas intelectuales normalmente realizadas por los seres humanos.
La idea fundamental en que se basa la Inteligencia Artificial es
conseguir que una computadora resuelva un problema complejo como lo
haría un humano. Es decir, según Andreas Kaplan y Michael Haenlein
definen la inteligencia artificial es “la capacidad de un sistema para
interpretar correctamente datos externos, para aprender de dichos datos
y emplear esos conocimientos para lograr tareas y metas concretas a
través de la adaptación flexible”. Por ejemplo, conducir un coche.
¿Desde cuando existe la inteligencia artificial? Pues desde hace
bastante ….. no habíais nacido, ni yo tampoco.
La inteligencia artificial nació en la década de 1950, cuando un
puñado de pioneros del campo de la informática comenzó a preguntarse si
las computadoras podían “pensar”, una pregunta cuyas ramificaciones se
están explorando todavía hoy. La idea principal que subyace al campo de
la IA es conseguir que una computadora resuelva un problema o tarea
compleja como lo haría un humano.
Durante las primeras etapas, mediados de los 60, se pensaba que la IA
podría lograrse elaborando un conjunto suficientemente grande de reglas
explícitas para manipular conocimiento o datos. En esta fase, se
desarrollaron aplicaciones conocidas como sistemas
expertos, en los que se creía que un potente ordenador y un
conjunto de reglas de razonamiento podrían emular el razonamiento
humano. Este enfoque se conoce como IA simbólica, y fue el paradigma
dominante en IA hasta finales de los 80.
La IA simbólica demostró ser adecuada para resolver problemas lógicos
bien definidos, como jugar al ajedrez, pero resultó difícil encontrar
reglas explícitas para resolver otro tipo de problemas complejos y
difusos, como la clasificación de imágenes, el reconocimiento de voz o
la traducción de textos; de forma que hoy en día se utiliza otro
enfoque: el Machine Learning o Aprendizaje Maquina.
Como señalan aquí,
no fue hasta los años 80, casi 30 años después del los inicios de la IA,
que empezó a cobrar importancia el aprendizaje automático o Machine
Learning. Se trata de una forma de IA que ya no necesita un programador
que codifique reglas, sino que es capaz de establecer sus propias reglas
y aprender por sí misma.
La idea básica detrás del ML consiste en que, en lugar de darle al
ordenador un conjunto de reglas para procesar los datos, es el propio
ordenador el que aprende esas reglas mirando/analizando los datos.
¿Cómo? Ya lo veremos, pero lo que está claro es que el enfoque/paradigma
ha cambiado: en lugar de programar y dar al ordenador unas reglas o
programa para procesar los datos y devolvernos respuestas/acciones, el
enfoque del ML provee a la maquina con los datos y las respuestas
esperadas con esos datos y nos devuelve las “reglas”. Estas reglas
pueden aplicarse a nuevos datos para producir las respuestas en esos
nuevos datos. Un sistema que usa ML no es explícitamente programado,
sino que se le provee de suficientes datos (relevantes para la tarea que
se espera que haga) y encuentra las reglas (o estructura estadística) en
esos datos o ejemplos y, si todo funciona bien, el sistema aprende y
encuentra las reglas/patrones para poder automatizar la tarea y que sea
llevada a cabo por la máquina. Un sistema/programa de ML es entrenado
más que explícitamente programado.
Un ejemplo puede ayudar a entenderlo: ¿Cómo se enseña a un niño qué
es un gato y qué es un perro? No se le provee de reglas, no se le dice,
mira un gato tiene dos orejas puntiagudas, bigotes, cola y cuatro patas;
generalmente se le enseña al niño con ejemplos, se le enseñan fotos de
gatos y perros y es el propio niño quien aprende las reglas de forma que
sin que nadie le diga nada, cuando ve un gato por la calle lo
identifica, quizás al principio se equivoca pero conforme se le dan más
ejemplos acaba aprendiendo a reconocer/etiquetar a los gatos. Conforme
el niño practica, cada vez lo hace mejor; es decir, aprende. Lo que es
destacable es que no es necesario enseñar ninguna regla al niño; es
decir, parece que los humanos tenemos “de serie” mecanismos de
clasificación, podemos inferir reglas de clasificación, reglas que
usamos pero que nos es difícil describir.
Este es el enfoque que utiliza el ML, no se programan las reglas (o
características) del problema o cuestión a analizar (identificar gatos),
sino que se le provee de datos (fotos de gatos y de perros)
correctamente etiquetadas y mediante técnicas estadísticas/algoritmos él
sólo encuentra las reglas para diferenciar entre perros y gatos. Una vez
el programa/ordenador ha encontrado las reglas, se le pueden pasar
nuevas fotos de perros y gatos (está vez sin etiquetar) y él las
etiquetará. En cierta forma el ordenador ha aprendido de los datos y
sabe diferenciar gatos de perros. Esta capacidad de generalizar, de
aplicar los conocimientos adquiridos a través de la formación a ejemplos
y situaciones nuevos, es una característica clave tanto del aprendizaje
humano como del aprendizaje automático. Por supuesto, el aprendizaje
humano es mucho más sofisticado que los algoritmos más avanzados de
aprendizaje automático, pero las computadoras tienen la ventaja de tener
mayor capacidad para el procesado de datos.
Los científicos que trabajan el campo del ML/DL utilizan técnicas de
ML para elaborar aplicaciones o programas que funcionen para
resolver/hacer una tarea concreta, como por ejemplo detectar spam,
sugerir una ruta de tráfico, clasificar una imagen, traducir un texto,
reconocer el lenguaje hablado, etc… Aquí puedes ver a
dos inteligencias artificiales aprendiendo a jugar al escondite. Después
de unas cuantos millones de partidas han aprendido bastante bien,
incluso a colaborar para esconderse mejor En este
artículo lo explican un poco.
En el campo del ML/DL se utilizan técnicas estadísticas/algoritmos de
aprendizaje. Hay muchos tipos de ellos. La elección del más adecuado,
dependerá del tipo de tarea que se quiera resolver en cada caso. Por
ejemplo, podemos hablar de algoritmos de clasificación como los árboles
de decisión, o Naïve Bayes, algoritmos de regresión, de clustering, de
análisis de componentes principales, redes neuronales, …
Con ML no nos encontraremos con ordenadores que piensan en el sentido
humano, solamente estaremos utilizando el poder de computo de los
ordenadores para obtener información a partir de un conjunto de datos;
en realidad estamos usando ML para dar sentido a los datos. Las técnicas de ML se
pueden aplicar a muchos campos, desde la política hasta las
neurociencias. Es una herramienta que se puede aplicar a muchos
problemas. Cualquier campo que necesite interpretar y actuar sobre los
datos puede beneficiarse de las técnicas de aprendizaje automático. De
hecho, estas técnicas, principalmente las de aprendizaje profundo, se
están convirtiendo en el motor que impulsa la economía moderna basada en
datos y para que ese motor funcione se necesita “energía”, y la energía
la proporcionan los datos. En ese sentido se dice que los datos son el
nuevo petroleo. Lo importante no son tanto las técnicas, sino los datos
que alimentan a los algoritmos.
Las técnicas de ML/DL esencialmente sirven para hacer
predicciones, en general, no permiten obtener la causa
de algo. Los datos masivos tratan del qué, no del porqué. No se obtienen
relaciones de causalidad sino correlaciones o
asociaciones. Bueno … a todos nos gusta conocer las causas, sobre todo a
los investigadores, pero, quizás, muchas veces esto no sea absolutamente
necesario y aunque esto choque con las prácticas establecidas hace
siglos y con nuestra comprensión más elemental sobre como tomar
decisiones y aprehender la realidad. Siendo un poco abogado del diablo,
no siempre necesitamos saber la causa; además, el método científico
tradicional se limitaba a contrastar un limitado número de hipótesis
mientras que con las técnicas de ML/DL el enfoque consiste, en cierta
forma, en dejar que los datos hablen por si mismos.
Respecto al Deep Learning, simplemente volver a
decir que es un subconjunto del ML. Son técnicas más complejas en
términos computacionales y por lo tanto necesitan para aprender un mayor
volumen de datos, pero su filosofía es la misma: proveer de datos para
que el ordenador aprenda a resolver y automatizar una tarea concreta.
Utilizan algoritmos más complejos o con más elementos o capas.
Prácticamente todas las aplicaciones exitosas utilizan técnicas de DL, y
generalmente algoritmos basados en redes neuronales.
Os dejo algunas ideas frases sobre DL provenientes de este
fantástico artículo:
El Deep Learning es una de las áreas de investigación más
populares dentro del campo de la Inteligencia Artificial en los últimos
años porque, gracias a estas técnicas, cosas como la visión artificial o
el procesamiento del lenguaje natural han saltado del ámbito de la
ciencia ficción a la realidad.
El Deep Learning es tan importante porque está permitiendo
resolver de forma más fácil y eficiente un gran número de problemas. Por
una parte, realiza de forma automática una de las tareas más complejas
del proceso de trabajo de Machine Learning: la ingeniería de atributos. Las redes
neuronales seleccionan de forma automática qué atributos son los
relevantes y cuáles se pueden desechar.
Otra de las grandes ventajas de trabajar con redes neuronales es
que permiten trabajar con cualquier tipo de input. Cualquiera: números,
imágenes, sonidos, textos, series temporales. Teniendo en cuenta que los
datos no estructurados, aquellos que no encajan en la estructura
tradicional filas/columnas de las bases de datos relacionales, suponen
más de un 90% de todos los datos generados, es fácil comprender la
importancia de poder manejarlos de forma eficiente. Estamos hablando de
datos como mensajes de correo, vídeos, ficheros de audio, páginas web,
mensajes en redes sociales etc.
Una red neuronal entrenada con datos etiquetados, también se
puede aplicar a datos no estructurados, lo cual les da a los algoritmos
de Deep Learning una gran ventaja respecto a otros algoritmos al poner a
su disposición un volumen de datos de entrenamiento mucho mayor.
Algoritmos no muy buenos entrenados con enormes conjuntos de datos
pueden dar mejores resultados que buenos algoritmos entrenemos con
conjuntos de datos reducidos. De hecho, mientras en el caso de los
algoritmos tradicionales usados en Machine Learning llega un momento en
el un mayor volumen de datos no implica un mejor rendimiento, en el caso
del Deep Learning no ocurre así. El rendimiento no deja de crecer, según
lo hacen el volumen de datos y el número de capas del modelo.
Como ya sabéis, aunque el curso tiene un tema sobre ML, el tercero,
en el que se hará una introducción a la terminología y principales
métodos del ML, en realidad el curso no está orientado al ML, ni mucho
menos al DL, sino que está más orientado a ser una introducción a la
ciencia de datos (DS).
¿Que qué es la Ciencia de datos? Pues voy a tratar de explicarlo en
el siguiente apartado.
3. Ciencia de Datos
Como se dijo en el prefacio, DS es una nueva disciplina que se incorpora poco
a poco, pero con mucha fuerza, a la mayoría de planes de estudio,
incluida la Economía. Por ejemplo, este
Máster de la LSE.
¿De qué se ocupa la ciencia de datos? Pues puede tener varias
respuestas, pero en definitiva el objetivo último de la ciencia de datos
es transformar los datos en información con sentido. Algunos dirán, pero
sí ese es el objetivo de la Estadística. Sí, es cierto, transformar
datos en información es, y ha sido siempre, el objetivo último de la
estadística, PERO lo que habitualmente conocemos por Estadística se fue
conformando con el paso de los años en un contexto en el que conseguir
datos era difícil, así que se desarrollaron métodos y técnicas
apropiadas para extraer el máximo de información con muestras de
reducido tamaño. El contexto ha cambiado, vivimos rodeados de datos, de
mayor volumen y variedad, lo que provoca nuevos retos a los analistas, y
tenemos mayor capacidad de computo, por lo que a veces ya no hay que
utilizar aproximaciones asintóticas. La American Statistical Asociation (ASA)
destaca la importancia de la Estadística en DS, pero reconoce en este
statement la diferencia entre DS y estadística.
No es estrictamente cierto, pero podemos pensar que la estadística
tradicional se concentra principalmente en las técnicas o métodos
estadísticos, además dado el contexto de escasez de datos, en un tipo
determinado de técnicas; sin embargo la óptica de la ciencia de datos es
más amplia. En Ciencia de datos se usan y necesitan técnicas
estadísticas, pero el enfoque es más global: se hace énfasis en que el
proceso de análisis de datos comienza desde que se recopilan los datos
hasta que se presentan los resultados. El siguiente diagrama ilustra este
proceso:
En la Ciencia de datos, etapas como el procesado y limpieza de datos
o el análisis gráfico, que ocupaban un lugar secundario cuando no
marginal en los libros tradicionales de estadística se han convertido en
partes fundamentales del trabajo de un científico de datos.
No solo se considera el análisis de datos como un proceso más global
compuesto de varias etapas, sino que dada la complejidad, volumen y
variedad de los datos actuales se necesita un fuerte componente
tecnológico generalmente apoyado en los ordenadores y la programación.
No se puede, o es extremadamente complicado, hacer ciencia de datos sin
saber programar. Además en la ciencia de datos se da una gran
importancia al contexto en el que se hace Data Science, en cierta forma
se reconoce que hace falta saber Economía para hacer ciencia de datos en
el campo de la economía.
La siguiente infografía puede ilustrar esta idea, mostrando que,
idealmente, para hacer DS se requieren, al menos, tres tipos de
competencias o conocimientos: 1) matemáticas y estadística, 2)
tecnología y programación y 3) conocimientos del campo de aplicación. En
este
post explican el diagrama en detalle, por ejemplo, qué es la “Danger
Zone”.
En este
post desarrollan estas ideas en el contexto concreto de la industria
manufacturera y hacen un listado de potenciales usos de la DS en el
campo de las manufacturas. En este otro post
puedes encontrar una visión de la DS un poco distinta, ya que incide en
la diferencias entre DS, ML e IA. Como resumen del post: “Data science
produces insights, Machine learning produces predictions, Artificial
intelligence produces actions”. En este otro
post argumentan que los científicos de datos son más necesarios que
nunca y que su labor no puede, al menos de momento, ser reemplazada por
procesos automatizados usando técnicas de ML.
Dos definiciones sencillas de DS:
@YBuhl
: This phrase by @juliesquid
is
worth retweeting it all over again: “Data Science is not just about #AI
or machine learning. It is the discipline of turning raw data into
understanding.”
@TiffanyTimbers
: Thinking a lot about the definition
of #DataScience. The best that I have read so far comes from
@rafalab
: “the processes used to extract value from data”.
I think we should extend this and say “the reproducible &
transparent processes used to extract value from data”
Por último, 3 “definiciones” de DS medio en broma:
Un científico de datos es un estadístico con pajarita
Un estadístico que trabaja en San Francisco
Científico de datos (n): Persona que sabe más de estadística que
cualquier programador y que a la vez sabe más de programación que
cualquier estadístico
¿Es fácil ser científico de datos?
Pues, como todo, depende, pero si que hay que tener en cuenta que es
un campo en continúa evolución. Estos post, 1,
2
y 3,
inciden en lo estresante que puede ser la vida de un científico de datos
que intente estar al día de las continuos cambios y evoluciones en este
campo.
Parecido a lo que sugiere este tweet:
Aunque también está bien desmitificar un poco y tomarse las cosas
menos en serio:
Como sugiere este otro tweet, no se puede saber todo, ni pasar por la
vida sin cometer errores:
Para finalizar, un hilo de Tweeter con muuuuuuchos errores:
4. Ciencia de datos en Economía
Evidentemente todo este cambio tecnológico acelerado al que asistimos
en la era del Big Data, y que muchas veces está asociado al ML/DL, ha
provocado y provocará grandes cambios tanto en la economía real como en
la ciencia económica. Una panorámica de trabajos que analizan las
implicaciones de estos cambios en la ciencia económica puede verse en Análisis
económico de la revolución digital.
Uno de los efectos más evidentes consiste en que las innovaciones
tecnológicas asociadas al ML seguramente cambiarán radicalmente, si es
que no lo han hecho ya, muchos sectores económicos; por ejemplo el
transporte o la banca, pero también muchos otros como los seguros,
servicios audiovisuales, la venta al por menor, la sanidad, etc…
Otro de los cambios más evidentes consiste en que actualmente las
principales corporaciones transnacionales, que antes pertenecían
principalmente a los sectores energético y financiero, ahora tienen un
fuerte componente tecnológico, las GAFA, un acrónimo
para hacer referencia a las cuatro grandes compañías tecnológicas:
Google, Amazon, Facebook y Apple.
Otra de los cambios significativos que han sido propiciados por las
nuevas tecnologías es la llamada economía colaborativa
al que están asociadas empresas como BlaBlaCar, Airbnb, …
Otro cambio evidente consiste en que ahora mismo hay una economía de
los datos. Los datos se han convertido en materia prima, capaz de crear
valor, fuente de innovación y servicios nuevos. Para una panorámica de
está economía de los datos puede verse la publicación Economía
de los Datos. Riqueza 4.0.
Se habla incluso de que estamos inmersos en una cuarta
revolución industrial. El concepto de cuarta revolución
industrial fue acuñado por Klaus Schwab fundador del Foro Económico
Mundial en el contexto de la edición del Foro Económico Mundial 2016 y
una de sus características es la utilización de la IA/ML/DL para la
automatización de tareas que antes sólo estaban al alcance de los
humanos. Una de las consecuencias más directas de la automatización será
el desplazamiento de empleos, no sólo manuales, por las
maquinas/algoritmos.
Desde el punto de vista de la ciencia, la actual abundancia de datos,
va a tener implicaciones directas:
“De la misma forma que el telescopio y el microscopio permitieron
ver el espacio y las células, las nuevas técnicas de recopilación y
análisis de datos ayudarán a ver el sentido de nuestro mundo de una
forma que apenas intuimos”.
“el cambio cuantitativo no es lo único importante, es el
cualitativo: una película es diferente de una pintura, también cuando
trabajas con muchos datos se pueden hacer otras cosas; es decir, al
cambiar la cantidad cambiamos la esencia”.
Ha surgido, incluso, una nuevo término: el dataísmo. Para un
“dataista”, en un mundo con cada vez mayor complejidad, confiar en los
datos puede reducir los sesgos cognitivos y descubrir patrones de
comportamiento. Según el filósofo y ensayista surcoreano Byung-Chul Han,
“el big data” debe liberar el conocimiento de la subjetividad. El
término dataismo fue popularizado en el libro Homo Deus de Harari. El
“dataismo” está en cierto modo relacionado con la idea, quizá un poco
exagerada, de que está surgiendo un cuarto paradigma científico basado
en el uso intensivo de datos. Está idea se atribuye a Jim Gray, ganador
del premio Turing. Gray afirma que “todo lo relacionado con la ciencia
está cambiando debido al impacto de la tecnología de la información y el
diluvio de datos” y que se está conformando un cuarto paradigma
científico tras los tres primeros (empírico, teórico, computacional).
Esta ideas se desarrollan en The
Fourth Paradigm: Data-intensive Scientific Discovery. Una traducción
al castellano puede encontrarse aquí.
Sin embargo, hay que recordar, como se hace en este
post de Jeff leek, que un resultado exitoso de un análisis de datos
puede ser que los datos no permiten resolver la pregunta. Esta misma
idea subyace en este tweet:
¿Afectará todo esto a la Economía/Econometría?
Todos vosotros sabéis que la Economía es una de las ciencias sociales
en la que más se utiliza la Estadística; de hecho la Econometría es
precisamente eso, una rama de la Economía que utiliza métodos
estadísticos en el estudio de los fenómenos económicos.
La respuesta a la pregunta anterior es que sí, no sé cuando ni como,
pero es evidente que la disponibilidad de nuevos datos, y el auge de los
métodos estadísticos asociados al ML/DL, tendrán que ir incorporándose
poco a poco a nuestra ciencia. Abajo algunas referencias sobre ello:
5. Investigación reproducible y software libre
Cada vez más se oye hablar de la Investigación Reproducible (IR) o
Reproducible Research (RR) en inglés. Creo y espero que en poco tiempo
se convierta en el estándar.
Según la Wikipedia española,
La reproducibilidad es la capacidad de una prueba o experimento de
ser reproducido o replicado por otros, en particular, por la comunidad
científica. La reproducibilidad es uno de los pilares del método
científico, siendo la falsabilidad el otro. …
… en muchas disciplinas, sobre todo en aquellas que implican el uso
de estadística y procesos computacionales, se entiende que un estudio es
reproducible si es posible recrear exactamente todos los resultados a
partir de los datos originales y el código informático
empleado para los análisis.
En este libro señalan
que la reproducibildad está ligada íntimamente al método científico como
ilustra el hecho de que el lema de la Royal Society una
de las sociedades científicas más antiguas del mundo es “Nullius in
verba” que quiere decir más o menos “no creas en la palabra de
nadie”. En el contexto científico quiere decir que las afirmaciones o
descubrimientos científicos deben ser probados mediante el método
científico.
A menudo se habla de la existencia de una crisis
de reproducibilidad refiriéndose con ello a la idea de que los
resultados de muchos de los experimentos científicos son difíciles o
imposibles a replicar en investigaciones posteriores. Uno de los casos
más sonados, asociados a esta idea, es el de Reinhart
y Rogoff.
La idea de que puede existir una crisis de reproducibilidad, junto al
hecho de que las nuevas tecnologías hacen cada vez más sencillo que los
artículos e investigaciones científicas sean reproducibles, ha provocado
cambios importantes en la política de asociaciones y revistas
científicas, como la de la American
Economic Association según la cual, sólo se publicarán artículos en
los que:
“the data and code used in the analysis are clearly and precisely
documented, and access to the data and code is clearly and precisely
documented and is non-exclusive to the authors”.
Aquí puedes encontrar un
listado de resultados de papers científicos en Psicología que han tenido
que ser revisitados tras estudios posteriores.
Para que un análisis con datos sea reproducible, no sólo es necesario
que los datos utilizados han de ser accesibles, sino que cómo mínimo
debería:
proporcionar los datos originales (obviamente documentar las
fuentes)
efectuar todo el proceso a través de código (scripts)
documentar el proceso de trabajo (por ejemplo el orden en que se
ejecutaron los scripts)
Como veis, uno de los requisitos para hacer investigación
reproducible es efectuar todo el proceso mediante scripts; es decir, hay
que saber programar. Mira lo que dice Frank Harrell:
Can one be a good data analyst without being a half-good programmer?
The short answer to that is, ‘No.’ The long answer to that is, ‘No.’
—Frank Harrell https://homerhanumat.github.io/r-notes/frames.html
Hacer una investigación completamente reproducible es COSTOSO; de
hecho, hay cursos completos sobre el tema, por ejemplo este, y muchos proyectos que
tratan de promoverla; por ejemplo este que pretende favorecer el uso de
datos abiertos a través de R. Afortunadamente, cada vez hay más
herramientas que facilitan hacer IR: Make, Git, Docker, Pandoc, Knitr,
markdown …
Hacer una investigación (completamente) reproducible no siempre es
posible; OK, PERO al menos acercarse … un poco. Nosotros, en el curso,
haremos análisis con datos e intentaremos que estos sean reproducibles.
En el entorno R cada vez es más fácil acercarse al
ideal de la IR. Para ello en el curso haremos siempre nuestros análisis
con scripts de R. Concretamente utilizaremos RStudio
para hacer análisis de datos, gestionando nuestros análisis a través de
Rprojects y generaremos los informes y resultados del
análisis con documentos Rmarkdown. Estos documentos
Rmarkdown o .Rmd
son reproducibles. En
breve veremos que significa esto y sus utilidades tanto para la
investigación como para la docencia. En estas
transparencias nos cuentan como R y su ecosistema facilitan el hacer
investigación o análisis reproducibles.
La razón para hacer los análisis reproducibles no sólo es cumplir con
los estándares científicos, que también, sino también hay un interés
personal para el analista. Para entenderlo puedes ver el siguiente video
de 1’44’’ que muestra una de las principales ventajas de la IR, y
sino ya lo experimentareis cuando hagamos hecho el primer análisis y os
diga que me he equivocado con los datos, que os había dado la versión
antigua de los datos. Os vais a reír si no habéis hecho vuestro análisis
reproducible.
En palabras de @TiffanyTimbers
:
Nothing like doing something manually 60+ times and making mistakes
to reinforce the idea “automate all the things”.
Software libre
El software libre es de vital importancia en el desarrollo de la
investigación reproducible. Piensa que por mucho que un investigador
haga accesibles sus datos y su código, si utiliza un software privativo,
en realidad su análisis no es reproducible, sólo lo será para aquellos
que puedan pagar la licencia.
De hecho, actualmente, al menos en el campo de la ciencia de datos,
el software libre, o es ya mayoritario, o va camino de serlo. Es verdad
que muchas empresas aún basan sus análisis de datos en programas como
Excel, SPSS, Stata o SAS, pero la tendencia está cambiando y es de
esperar que se acelere en un futuro próximo. Como ejemplo de esta idea
puedes ver está publicación: Big
Data y open source.
En este
post se plantea que el “open source” puede ser clave para la
competitividad en la UE. Para aquellos que creen que el software
comercial da más garantías, pueden leerse este
post.
Seguramente entre las empresas pequeñas y medianas Excel continúa
siendo el software de referencia para sus análisis cuantitativos. Sí,
Excel es un fantástico software, lo sé, pero no sirve para todo. Un
ejemplo de esto aquí,
o aquí.
Este
post explica porque Excel está obsoleto. En los
comentarios al post le atizan un poco. Un hilo
de Twitter con errores graves provocados por el mal uso. En un
tono más positivo, este
post explica porque abandonar Excel y migrar a R.
En palabras de Hadley en esta
entrevista
I think the tradeoff between Stata and R is: do you want a
point-and-click interface, or do you want a programming interface?
Point-and-click interfaces are great, because they lay out all of your
options in front of you, and you don’t have to remember anything. You
can navigate through the set of pre-supplied options. And that’s also
it’s greatest weakness, because first of all, you are constrained into
what the developer thought you should be able to do. And secondly,
because your primary interaction is with a mouse, it’s very difficult to
record what you did. And I think that’s a problem for science, because
ideally you want to say how you actually got these results. And then
simply do that reliably and have other people critique you on that. But
it’s also really hard when you are learning, because when you have a
problem, how do you communicate that problem to someone else? You
basically have to say, “I clicked here, then I clicked here, then I
clicked here, and I did this.” Or you make a screen cast, and it’s just
clunky)
Este tweet incide también en alguno de los problemas de Excel. Tienes
que ver la respuesta un poquito irónica de Dale Maschette, muy buena!!
Para ello pincha en el tweet:
Aquí tenemos un problema concreto que ha generado Excel al ser usado
en al análisis de datos: han tenido que renombrar los genes para evitar
que Excel interprete sus nombres como fechas.
En este post,
Bruno Rodrigues argumenta porqué no se puede usar Excel para hacer
Ciencia de Datos. Por supuesto que actualmente hay muchas
alternativas para hacer análisis de datos o
visualizaciones sin usar un lenguaje de programación, por
ejemplo aquí o aquí.
Yo no digo nada, pero …
Please, don’t look this
other one 😄 !!!
6. ¿Por qué R?
En el curso usaremos R y RStudio. En la actualidad, en el campo de la
ciencia de datos, hay sólo 2 alternativas, Phyton o R. De hecho hay un
intenso debate sobre cual es más adecuado. Hay muchas opiniones al
respecto, pero yo he seleccionado esta y esta, aunque la
verdad, tampoco es necesario elegir un sólo lenguaje, R
y Phyton pueden colaborar.
Evidentemente mi opinión es que para iniciarse ciencia de datos R
está varios pasos por delante de Phyton; si bien es verdad, que para
hacer ML, y principalmente DL, Phyton puede ser más adecuado. En
palabras de Hadley en esta
entrevista
For R and Python, Python is first and foremost a programming
language. And that has a lot of good features, but it tends to mean,
that if you are going to do data science in Python, you have to first
learn how to program in Python. Whereas I think you are going to get up
and running faster with R, than with Python because there’s just a bunch
more stuff built in and you don’t have to learn as many programming
concepts. You can focus on being a great political scientist or whatever
you do and learning enough R that you don’t have to become an expert
programmer as well to get stuff done.
Este tweet ejemplifica un poco la rivalidad (con
buen rollo) entre R y Phyton:
Aunque después de lo que dijo Elmo, yo creo que el debate está
zanjado:
R se está convirtiendo en el software estadístico de referencia en la
mayoría de los centros de investigación y universidades, y su uso se
está extendiendo también dentro de la empresa privada. R es software
libre, gratuito y está incorporando más rápidamente que otros programas
las técnicas avanzadas de análisis de datos que se están desarrollando
en los últimos años. Otro aspecto importante que convierte a R en una
herramienta muy potente es que incorpora un lenguaje de programación
sencillo y muy flexible, que permite tener un control total sobre el
análisis que se está desarrollando
Creo que en la actualidad R es el mejor programa para iniciarse y
hacer análisis de datos. Si no me acabas de creer, o quieres leer algo
sobre la importancia y capacidades de R puedes hacerlo aquí o aquí,
o aquí
o más recientemente aquí.
R es cada vez más usado, no sólo en la universidad y la docencia,
sino también en el mundo de la empresa, puedes verlo aquí
o aquí.
Una de las conferencias más importantes sobre el uso comercial de R es
The Enterprise Applications of the
R Language Conference (EARL).
Entre las empresas que usan R están: Google, Facebook, Twitter,
Microsoft, IBM, Uber, Ford, Airbnb, American Express, Barclays Bank, Bank
of America y muchas otras. Aquí o aquí
puedes encontrar un listado más completo.
Una de las mayores ventajas de usar R es que puedes usar Rmarkdown y
Shiny. Lo veremos, pero aquí
tienes un post que explica sus ventajas. Un ejemplo de utilización es está aplicación de
seguiminento del covid que ha implementado el departamento of Public
Health de California.
Si te gustan los rankings de lenguajes de programación, aquí
tienes uno, de enero de 2020, en el Phyton está en segundo lugar
mientras que R está en el puesto 13. Esto es lo que que se dice de
R:
In our first run of these rankings, R placed 17th. All these years
later it jumps two spots from the last quarter’s edition up to #13. In
the interim, it has ranked as high as 12th but mostly commonly is found
in the 13-15 range. Given the language’s specialized focus, this is
likely its effective ceiling, but it’s also an illustration of the
remarkable popularity of a language whose usage is restricted for all
intents and purposes to a single domain – those who work with and
operate on data. R’s success is an example of the power of an
academia-supported community to elevate a language beyond its expected
threshold, and it is notable that the aforementioned growth of Python
and its expansion into data analytics has not observably come at the
expense of traction in R.
Mientras reescribo estas notas, julio de 2020, R ha subido al puesto
8, mientras que Phyton está en el tercero. El ranking más actual puedes
verlo aquí.
¿Es complicado aprender R?
¿Aprender R es complicado? No, bueno … ya responderé a esto en clase.
No mires el siguiente tweet:
Aunque la verdad, esta dificultad/rareza de R es cosa de otros
tiempos. Con el tidyverse todo es más fácil y brillante. Como muestra el
tweet de Chris Albon, un miembro destacado de la comunidad Phyton.
Merece la pena echarle un ojo a algunas de las respuestas al tweet.
Algunos sitios a visitar
Rweekly. Cada semana envían un
archivo con los mejores análisis hechos con R esa semana. Tienes que
apuntarte aquí
Rbloggers. Un agregador
de blogs relacionados con R.
R Views. Es un blog
asociado a RStudio. Cada mes saca un post donde eligen los mejores 40
paquetes de ese mes; por ejemplo, aquí
tienes el de julio de 2019.
swirl. swirl teaches you R
programming and data science interactively, at your own pace, and right
in the R console!
LS0tCnRpdGxlOiAiVGVtYSAxOiBDaWVuY2lhIGRlIGRhdG9zIHkgbGEgZXJhIGRlbCBCaWcgRGF0YSIKYXV0aG9yOiAiUGVkcm8gSi4gUMOpcmV6IChwZWRyby5qLnBlcmV6QHV2LmVzKS4gVW5pdmVyc2l0YXQgZGUgVmFsw6huY2lhIDxicj4gPGJyPiBXZWIgZGVsIGN1cnNvOiA8aHR0cHM6Ly9wZXJlenA0NC5naXRodWIuaW8vaW50cm8tZHMtMjItMjMtd2ViLz4iCmRhdGU6ICJBZ29zdG8gZGUgMjAxOSAoYWN0dWFsaXphZG8gZWwgYHIgZm9ybWF0KFN5cy50aW1lKCksICclZC0lbS0lWScpYCkiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgY3NzOiAhZXhwciBoZXJlOjpoZXJlKCJhc3NldHMiLCAic3R5bGVzX3BqcC5jc3MiKSAjLWh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzU2NjgxODc5L2hvdy10by11c2UtaGVyZS1mb3ItcGF0aHMtdG8tY3NzLWJlZm9yZS1ib2R5LWFuZC1hZnRlci1ib2QKICAgIHRoZW1lOiBwYXBlcgogICAgaGlnaGxpZ2h0OiB0ZXh0bWF0ZSAKICAgIHRvYzogdHJ1ZQogICAgdG9jX2RlcHRoOiAzIAogICAgdG9jX2Zsb2F0OiAKICAgICAgY29sbGFwc2VkOiB0cnVlCiAgICAgIHNtb290aF9zY3JvbGw6IHRydWUKICAgIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgICBudW1iZXJfc2VjdGlvbnM6IGZhbHNlCiAgICBpbmNsdWRlczoKICAgICAgYWZ0ZXJfYm9keTogIWV4cHIgaGVyZTo6aGVyZSgiYXNzZXRzIiwgImZvb3Rlci5odG1sIikgCiAgICAgIGluX2hlYWRlcjogCiAgICAgICAgLSAhZXhwciBoZXJlOjpoZXJlKCJhc3NldHMiLCAiZ29vZ2xlLWFuYWx5dGljcy5odG1sIikgCiAgICAgICAgLSAhZXhwciBoZXJlOjpoZXJlKCJhc3NldHMiLCAiZmF2aWNvbi1zb2wuaHRtbCIpCiAgICAjY29kZV9mb2xkaW5nOiBzaG93CiAgICBkZl9wcmludDoga2FibGUKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKZWRpdG9yX29wdGlvbnM6IAogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlCiNiaWJsaW9ncmFwaHk6ICJgciBoZXJlOjpoZXJlKCdhc3NldHMnLCAnYmlibGlvLmJpYicpYCIgICMtIGpvb29kZXIuIHNpbmdsZSBxdW90ZXMgaHR0cHM6Ly9jb21tdW5pdHkucnN0dWRpby5jb20vdC91c2UtaGVyZS1oZXJlLWZ1bmN0aW9uLWluLXlhbWwtb3B0aW9uLzE4NjY3LzkKLS0tCgpgYGB7ciwgaW5jbHVkZSA9IEZBTFNFfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKYGBgCgpgYGB7ciBjaHVuay1zZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIGV2YWwgPSBUUlVFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgCiAgICAgICAgICAgICAgICAgICAgICAjcmVzdWx0cyA9ICJob2xkIiwKICAgICAgICAgICAgICAgICAgICAgIGNhY2hlID0gRkFMU0UsIGNhY2hlLnBhdGggPSAiL2NhY2hlcy8iLCBjb21tZW50ID0gIiM+IiwKICAgICAgICAgICAgICAgICAgICAgICNmaWcud2lkdGggPSA3LCAjZmlnLmhlaWdodD0gNywgICAKICAgICAgICAgICAgICAgICAgICAgICNvdXQud2lkdGggPSA3LCBvdXQuaGVpZ2h0ID0gNywKICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlID0gVFJVRSwgIGZpZy5zaG93ID0gImhvbGQiLAogICAgICAgICAgICAgICAgICAgICAgZmlnLmFzcCA9IDcvOSwgb3V0LndpZHRoID0gIjYwJSIsIGZpZy5hbGlnbiA9ICJjZW50ZXIiKQoKIy0gcGFyYSBtZWpvcmFyIGxvcyBncsOhZmljb3MsIGJ1ZW5vIGVuIHJlYWxpZGFkIHBhcmEgcXVlIHNlIHZlYW4gaWd1YWwgZW4gZGlzdGludG9zIFNPCiMtIGh0dHBzOi8vd3d3Lmp1bXBpbmdyaXZlcnMuY29tL2Jsb2cvci1rbml0ci1tYXJrZG93bi1wbmctcGRmLWdyYXBoaWNzLwprbml0cjo6b3B0c19jaHVuayRzZXQoZGV2ID0gInBuZyIsIGRldi5hcmdzID0gbGlzdCh0eXBlID0gImNhaXJvLXBuZyIpKQpgYGAKCmBgYHtyIG9wdGlvbnMtc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0Kb3B0aW9ucyhzY2lwZW4gPSA5OTkpICMtIHBhcmEgcXVpdGFyIGxhIG5vdGFjacOzbiBjaWVudMOtZmljYQpvcHRpb25zKCJ5YW1sLmV2YWwuZXhwciIgPSBUUlVFKSAjLSBodHRwczovL2dpdGh1Yi5jb20vdmlraW5nL3IteWFtbC9pc3N1ZXMvNDcgIChsbyBwdXNlIHggZWwgcGIgY29uIGVsIHdhcm5pbmcpIEVuIHJlYWxpZGFkIGNyZW8gcXVlIG1lam9yIHNlcsOtYSBwb25lcmxvIGVuIFJQcm9maWxlCmBgYAoKYGBge3Iga2xpcHB5LCBlY2hvID0gRkFMU0V9CmtsaXBweTo6a2xpcHB5KHBvc2l0aW9uID0gYygidG9wIiwgInJpZ2h0IikpICMtIHJlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJybGVzdXIva2xpcHB5IikKYGBgCgoKCi0tLS0tLS0tLS0tLS0tLS0tCgo8YnI+CgpFbCBvYmpldGl2byBwcmluY2lwYWwgZGVsIGN1cnNvIGVzIGFwcmVuZGVyIHVuIHBvY28sIHRvZG8gbG8gcXVlIHBvZGFtb3MsIHNvYnJlIHVuYSBudWV2YSBkaXNjaXBsaW5hOiBDaWVuY2lhIGRlIGRhdG9zIG8gRGF0YSBTY2llbmNlLiBFbiBjb25jcmV0bywgbm9zIGNlbnRyYXJlbW9zIGVuIGFwcmVuZGVyIGEgbWFuZWphciB5IGFuYWxpemFyIGRhdG9zIHV0aWxpemFuZG8gdW5hIGhlcnJhbWllbnRhIHByb2Zlc2lvbmFsIGNvbW8gUi4gIEVuIGVsIHRlbWEgMiBoYWJsYXJlbW9zIHkgdXRpbGl6YXJlbW9zIGludGVuc2l2YW1lbnRlIFIsIGRlIG1vbWVudG8gbm9zIHNvYnJhIGNvbiBzZcOxYWxhciBxdWUgUiBlcyB1biBwcm9ncmFtYSBpbmZvcm3DoXRpY28sIG3DoXMgYmllbiB1biBlbnRvcm5vLCBjb24gZWwgcXVlIGhhY2VyIGFuw6FsaXNpcyBkZSBkYXRvcyAobyBjaWVuY2lhIGRlIGRhdG9zKSwgcGVybyBSIHRhbWJpw6luIGVzIHVuIGxlbmd1YWplIGRlIHByb2dyYW1hY2nDs24uIExvIHZlcmVtb3MhISAKCkFudGVzIGRlIGVtcGV6YXIgZWwgY3VlcnBvIHByaW5jaXBhbCBkZWwgY3Vyc28gdm95IGEgdHJhdGFyIGRlIGV4cGxpY2FyLCBlbiBlc3RlIHRlbWEgaW50cm9kdWN0b3JpbywgcXXDqSBzaWduaWZpY2FuIHTDqXJtaW5vcyBxdWUgdG9kb3MgaGFiw6lpcyBvw61kbyBjb21vOiBCaWcgRGF0YSwgSW50ZWxpZ2VuY2lhIEFydGlmaWNpYWwgKElBKSwgTWFjaGluZSBMZWFybmluZyAoTUwpLCBhbGdvcml0bW9zLCByZWRlcyBuZXVyb25hbGVzLCBldGMuLi4gZXRjLi4uIFB1ZmYhISEgTXVjaGFzIGNvc2FzLCBwZXJvIC4uLiBwYXNvIGEgcGFzby4KCgojIyAxLiDCv1F1w6kgZXMgZXN0byBkZSBsYSBlcmEgZGVsIEJpZyBEYXRhPwoKUHVlcyBubyBvcyB2b3kgYSBlbmdhw7FhciwgbGEgcHJpbmNpcGFsIHJhesOzbiBkZSBsYSBwcmVzZW5jaWEgZGVsIHTDqXJtaW5vICJCaWcgRGF0YSIgZW4gZWwgdMOtdHVsbyBkZWwgY3Vyc28gZXMgcXVlIG1lIHBhcmVjw61hIHF1ZSBjb21vIGVsIHTDrXR1bG8gY29taWVuemEgY29uICJQcm9ncmFtYWNpw7NuIHkgbWFuZWpvIGRlIGRhdG9zIC4uLiIsIGVzIHBvc2libGUgcXVlIG5hZGllIHNlIGFwdW50YXNlIGFsIGN1cnNvLCBhc8OtIHF1ZSBoYWLDrWEgcXVlIGHDsWFkaXIgYWwgdMOtdHVsbyB1biB0w6lybWlubyBkZSBtb2RhIHkgdW4gcG9jbyBtaXN0ZXJpb3NvLiDCv0VzdHJhdGVnaWEgZGUgbWFya2V0aW5nPyBVbiBwb2NvIHPDrSwgcGVybyBlbiByZWFsaWRhZCB0b2RvcyBsb3MgY3Vyc29zIGRlIENpZW5jaWEgZGUgRGF0b3MgcXVlIGVzdMOhbiBhcGFyZWNpZW5kbyBlbiBlbCBtdW5kbywgc2VndXJhbWVudGUgbm8gaGFicsOtYW4gYXBhcmVjaWRvIHNpIG5vIGVzdHV2acOpc2Vtb3MgZW4gbGEgImVyYSBkZWwgQmlnIERhdGEiLiBFbiBlbCBjdXJzbyBubyB1c2FyZW1vcyB0w6ljbmljYXMgZGUgQmlnIERhdGEgcGVybyBzw60gaGFibGFyZW1vcyBhbGdvIGRlIGVsbGFzLCBwcmluY2lwYWxtZW50ZSBlbiBlbCB0ZW1hIDQuCgpMb3MgdGllbXBvcyBlc3TDoW4gY2FtYmlhbmRvIChbVGhlIFRpbWVzIFRoZXkgQXJlIEEgQ2hhbmdpbiddKGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9LWU3YjA5TDRqWTgpKSBkZWPDrWEgQm9iIER5bGFuIGVuIGVsIDY0LiBRdWl6w6FzIGxvcyB0aWVtcG9zIHNpZW1wcmUgaGFuIGVzdGFkbyBjYW1iaWFuZG8geSBzaWVtcHJlIGNhbWJpYXLDoW4sIHBlcm8gYWhvcmEgbWlzbW8gbGEgbWF5b3LDrWEgZGUgbm9zb3Ryb3MgdGVuZW1vcyBsYSBzZW5zYWNpw7NuIGRlIHF1ZSB0b2RvIHZhIG11eSBkZXByaXNhLiBFbiBtaSBvcGluacOzbiBsbyBxdWUgZXN0w6EgZGV0csOhcyBkZSBlc3RlIGNhbWJpbyBhY2VsZXJhZG8gZGVsIG11bmRvIGVuIG11Y2hvcyBhc3BlY3RvcyB0aWVuZSBxdWUgdmVyIGNvbiBsYSB0ZWNub2xvZ8OtYSwgZnVuZGFtZW50YWxtZW50ZSBjb24gbG9zIG9yZGVuYWRvcmVzIHkgbGFzIHJlZGVzIHF1ZSB0cmFuc21pdGVuIGNhbnRpZGFkZXMgaW5nZW50ZXMgZGUgZGF0b3MuCgoKUHVlZGUgcXVlIG5hZGEgaWx1c3RyZSBtw6FzIGVzdG9zIGNhbWJpb3MgcXVlIGxvIHF1w6kgaGUgaGVjaG8geW8gcGFyYSBjb250aW51YXIgZXN0ZSByYXpvbmFtaWVudG86IGVuIGx1Z2FyIGRlIGJ1c2NhciB1biBsaWJybyBoZSBidXNjYWRvIGVuIEdvb2dsZSAibGEgZXJhIGRlbCBCaWcgRGF0YSIuIEVuIGVzdG9zIMO6bHRpbW9zIGHDsW9zIGhlIGxlw61kbyBiYXN0YW50ZSBzb2JyZSBlbCB0ZW1hLCBwZXJvIHBhcmEgZW1wZXphciBhIHBlbnNhciBtZSBoZSBpZG8gYSBHb29nbGUgeSBoZSBidXNjYWRvIGVsIHTDqXJtaW5vLiBFbCB0ZXJjZXIgcmVzdWx0YWRvIG1lIGhhIGxsZXZhZG8gYSBsYSBXaWtpcGVkaWEgKG90cm8gZGUgbG9zIG1pbGFncm9zIGRpc3J1cHRpdm9zIHF1ZSBoZW1vcyB2aXZpZG8gZW4gbGFzIGRvcyDDumx0aW1hcyBkw6ljYWRhcykuIElndWFsIHF1ZSBoZSBoZWNobyB5byBwYXJhIGluZm9ybWFybWUvZG9jdW1lbnRhcm1lLCB0b2RvcyBsb3MgZMOtYXMgdXRpbGl6YW1vcyBzb2Z0d2FyZSwgYXBsaWNhY2lvbmVzIHBhcmEgZ2VzdGlvbmFyIGxhIGFnZW5kYSwgZXNjdWNoYXIgcmFkaW8sIGNvbXByYXIsIGNvbXVuaWNhcm5vcyBldGMgLi4uIExhIHRlY25vbG9nw61hIGVzdMOhIHByZXNlbnRlIGVuIHRvZG9zIGxvcyBhc3BlY3RvcyBkZSBudWVzdHJhIHZpZGEgcG9ycXVlIGxsZXZhbW9zIHVuIG9yZGVuYWRvciwgZWwgdGVsw6lmb25vIG3Ds3ZpbCwgZW4gZWwgYm9sc2lsbG8sIHkgY29uIMOpbCBwb2RlbW9zIGNvbXVuaWNhcm5vcyB5IHJlY2liaXIgeSB0cmFuc21pdGlyIGluZm9ybWFjacOzbiBhIHRyYXbDqXMgZGUgbGEgcmVkZXMuIEVzdG8gZXMgbG8gcXVlIGhhIGNhbWJpYWRvIGVsIG11bmRvIHkgc2VndWlyw6EgY2FtYmnDoW5kb2xvIHkgYWZlY3RhcsOhIGEgdG9kYXMgbGFzIGVzZmVyYXMgZGUgbnVlc3RyYSB2aWRhLCBlc3Blcm8gcXVlIHBhcmEgYmllbiAoc2VndXJvISEpLiBQZXJvIGNsYXJvLCBlbiBlbCBjdXJzbyBubyB2YW1vcyBhIGhhYmxhciBkZSB0b2RvIGVzdG8sIHNvbG8gZGUgdHJhc2ZvbmRvLCBzaW5vIHF1ZSBub3MgY2VudHJhcmVtb3MgZW4gbG9zIGRhdG9zLCBlbiBjb21vIHRyYXRhciwgbWFuZWphciB5IG9idGVuZXIgaW5mb3JtYWNpw7NuIGRlIGxhcyBncmFuZGVzIGNhbnRpZGFkZXMgZGUgZGF0b3MgcXVlIGNvbnN1bWltb3MgeSBnZW5lcmFtb3MgY29uc3RhbnRlbWVudGU7IGFzw60gcXVlLCBkZWplbW9zIGxhcyBwb3NpYmxlcyBpbXBsaWNhY2lvbmVzIHNvY2lhbGVzLCBwb2zDrXRpY2FzLCBmaWxvc8OzZmljYXMgcGFyYSBvdHJvcyBjdXJzb3MgeSBiYWplbW9zIGEgY29zYXMgbcOhcyBjb25jcmV0YXMuCgoKIyMjIMK/UXXDqSBzaWduaWZpY2EsIHF1w6kgZXMgQmlnIERhdGE/CgpQdWVzIGVzIHVuIHTDqXJtaW5vIHBvbGlzw6ltaWNvLCB0aWVuZSBkaXN0aW50b3Mgc2lnbmlmaWNhZG9zLiBMdWVnbyBzZXLDqSBtw6FzIHByZWNpc28geSByaWd1cm9zbywgcGVybyBkZSBtb21lbnRvIHBvZGVtb3MgcGVuc2FyIHF1ZSBCaWcgRGF0YSBzaWduaWZpY2EgcXVlIHRlbmVtb3MgbXV1dXV1dWNob3MgZGF0b3MsIG11Y2hvcy4gRXN0YSBkaXNwb25pYmlsaWRhZCBkZSBkYXRvcyBlcyB1bm8gZGUgbG9zIHByaW5jaXBhbGVzIGZhY3RvcmVzIHF1ZSBleHBsaWNhbiBwb3JxdcOpIGVsIGRlc2Fycm9sbG8gdMOpY25pY28gc2UgaGEgYWNlbGVyYWRvIGVuIGxvcyDDumx0aW1vcyB0aWVtcG9zLiAKCkxvIHF1ZSBoYSBwYXNhZG8gZXMgcXVlLCBlbCBoZWNobyBkZSBxdWUgbG9zIGNpZW50w61maWNvcyBkaXNwb25nYW4gYWhvcmEgZGUgbXVjaG9zIGRhdG9zIGhhIGRhZG8gdW4gZnVlcnRlIGltcHVsc28gYSB1biBjYW1wbyBkZSBsYSBJbnRlbGlnZW5jaWEgQXJ0aWZpY2lhbCAoY29uY3JldGFtZW50ZSBlbCBjYW1wbyBkZWwgTWFjaGluZSBMZWFybmluZy9EZWVwIExlYXJuaW5nKSBxdWUgaGEgaGVjaG8gcXVlIGxhcyBtw6FxdWluYXMsIGxvcyBvcmRlbmFkb3JlcywgbG9zIHJvYm90cywgcHVlZGFuIGhhY2VyIGNvc2FzIHF1ZSBhbnRlcyBlcmFuIGluaW1hZ2luYWJsZXMsIGNvbW8gcG9yIGVqZW1wbG8gcXVlIEFsZXhhIG5vcyBlbnRpZW5kYSwgcXVlIGhheWEgY29jaGVzIGF1dMOzbm9tb3MgcXVlIGNvbmR1emNhbiBtZWpvciBxdWUgbG9zIGh1bWFub3MsIHF1ZSB1biBvcmRlbmFkb3IgZ2FuZSBhbCBjYW1wZcOzbiBtdW5kaWFsIGRlIGFqZWRyZXogKGVzdG8gcGFzbyB5YSBoYWNlIG11Y2hvIHRpZW1wbywgZW4gMTk5NiwgYW50ZXMgZGUgbGEgZXJhIGRlbCBCaWcgZGF0YSBeW1JlYWxtZW50ZSBbRGVlcCBCbHVlXShodHRwczovL2VzLndpa2lwZWRpYS5vcmcvd2lraS9EZWVwX0JsdWVfKGNvbXB1dGFkb3JhKSksIGVsIG9yZGVuYWRvciBxdWUgZ2FubyBhIEthc3Bhcm92LCBubyBoYWNpYSB1c28gZGUgZGF0b3Mgc2lubyBxdWUgdXNhYmEgZWwgY2FsY3VsbyBkZSBwcm9iYWJpbGlkYWRlc10pLiAKCkVuIGxvcyBtZWRpb3MsIGVuIGxhIHRlbGUsIHNlIGhhYmxhLCBhcGFyZWNlIGVsIHTDqXJtaW5vICJsYSBlcmEgZGVsIEJpZyBkYXRhIiBzaWduaWZpY2FuZG8gbcOhcyBvIG1lbm9zIGxvIHF1ZSBvcyBoZSBjb250YWRvLCBxdWUgbGEgImFidW5kYW5jaWEgZGUgZGF0b3MiIGVzdMOhIGltcHVsc2FuZG8gZnVlcnRlbWVudGUgZWwgZGVzYXJyb2xsbyB0ZWNub2zDs2dpY28sIGRlIGZvcm1hIHF1ZSBhaG9yYSB0ZW5lbW9zIGFjY2VzbyBhIGFwbGljYWNpb25lcyBxdWUgaGFzdGEgaGFjZSBiaWVuIHBvY28gcGFyZWPDrWFuIGNpZW5jaWEgZmljY2nDs24uIAoKRXN0ZSBhY2VsZXJhZG8gY2FtYmlvIHTDqWNuaWNvIHkgc3VzIGFwbGljYWNpb25lcywgdmEgYSB0ZW5lciB5IGVzdMOhIHRlbmllbmRvIGlubnVtZXJhYmxlcyBlZmVjdG9zIGVuIHRvZG9zIGxvcyDDoW1iaXRvcyBkZSBudWVzdHJhIHZpZGEgeSB0YW1iacOpbiBlbiBlbCBkZSBsYXMgZW1wcmVzYXMgZSBpbmR1c3RyaWFzLiBNdWNoYXMgaW5kdXN0cmlhcywgY29tbyBsYSBkZWwgdHJhbnNwb3J0ZSB2YW4gYSB2ZXIgY29tbyBlbCBlc2NlbmFyaW8gY2FtYmlhIHksIG11eSBwb3NpYmxlbWVudGUsIGxhcyBxdWUgbm8gc2VwYW4gZW50ZW5kZXIgeSBhcHJvdmVjaGFyIGxvcyBudWV2b3MgcmV0b3MgdGVjbm9sw7NnaWNvcyBwb3NpYmxlbWVudGUgYWNhYmVuIGRlc3BhcmVjaWVuZG87IGV2aWRlbnRlbWVudGUgZXN0byBnZW5lcmEsIHlhIHNlYSByZWFsIG8gbm8sIHVuYSB1cmdlbmNpYSBlbiBsYXMgZW1wcmVzYXMgcG9yIGludGVudGFyIG5vIHF1ZWRhcnNlIGZ1ZXJhIGRlIGVzdGUgY2FtYmlvIGFjZWxlcmFkbyB5IGVzdG8sIGVuIHByaW5jaXBpbywgZ2VuZXJhIG1heW9yIGRlbWFuZGEgZGUgcHJvZmVzaW9uYWxlcyBxdWUgc2VwYW4gZGUgdGVjbm9sb2fDrWEgeSBkZSBkYXRvcy4gQmllbiwgY3JlbyBxdWUgeWEgdGVuZW1vcyB1biBwb2NvIG3DoXMgY2xhcm8gcXVlIHNpZ25pZmljYSBlc3RvIGRlICJsYSBlcmEgZGVsIEJpZyBEYXRhIi4KCkVsIHTDqXJtaW5vIEJpZyBEYXRhIGVzIHJlbGF0aXZhbWVudGUgbnVldm8sIHkgZW4gY2FzdGVsbGFubyBzZSBzdWVsZSB0cmFkdWNpciBjb21vICJEYXRvcyBtYXNpdm9zIiwgYXVucXVlIGFob3JhIG1pc21vIGVuIGxhIHdpa2lwZWRpYSBwb25lICJNYWNyb2RhdG9zIiB5IFthcXXDrV0oaHR0cHM6Ly93d3cuZnVuZGV1LmVzL3JlY29tZW5kYWNpb24vbWFjcm9kYXRvc2FsdGVybmF0aXZhLWFiaWctZGF0YS0xNTgyLykgcmVjb21pZW5kYW4gZWwgdXNvIGRlbCB0w6lybWlubyAgTWFjcm9kYXRvcy4gQSBtaSBwZXJzb25hbG1lbnRlIG5vIG1lIGFjYWJhIGRlIGd1c3RhciBlc3RlIHTDqXJtaW5vLCBwZXJvIHF1aXrDoXMgc2VhIHBvciBlbCBoZWNobyBkZSBxdWUgdGVuZ28gZm9ybWFjacOzbiBkZSBlY29ub21pc3RhLCB5IGVsIHTDqXJtaW5vIG1hY3JvZGF0b3MgbWUgcmVjdWVyZGEgYSBsb3MgZGF0b3MgbWFjcm9lY29uw7NtaWNvcy4gRW4gY3VhbHF1aWVyIGNhc28sIGVsIHTDqXJtaW5vIHVzYWRvIGhhYml0dWFsbWVudGUgZXMgZWwgaW5nbMOpczogQmlnIERhdGEuCgpFbCB0w6lybWlubyB0aWVuZSBtYXRpY2VzLCB5IHZhcmlhbnRlcywgcGVybyBwYXJhIG1pLCBsYSBjYXJhY3RlcsOtc3RpY2EgZGVmaW5pdG9yaWEgZGUgZGF0b3MgQmlnIGVzIGVsIGhlY2hvIGRlIHF1ZSBlc3RvcyBkYXRvcyB0ZW5nYW4gdGFsIHZvbHVtZW4gKG8gY29tcGxlamlkYWQpIHF1ZSBubyAicXVlcGFuIiwgcXVlIG5vIHB1ZWRhbiAibWFuZWphcnNlIiBlbiB1biBvcmRlbmFkb3IsIGVuIHJlYWxpZGFkIHF1ZSBubyBwdWVkYW4gdHJhdGFyc2UgY29uIGxhcyBhcGxpY2FjaW9uZXMgaW5mb3Jtw6F0aWNhcyBoYWJpdHVhbGVzLiBUYWwgeSBjb21vIGZpZ3VyYSBlbiBsYSBXaWtpcGVkaWE6ICJlcyB1biB0w6lybWlubyBxdWUgaGFjZSByZWZlcmVuY2lhIGFsIGNvbmNlcHRvIHJlbGF0aXZvIGEgY29uanVudG9zIGRlIGRhdG9zIHRhbiBncmFuZGVzIHkgY29tcGxlam9zIGNvbW8gcGFyYSBxdWUgaGFnYW4gZmFsdGEgYXBsaWNhY2lvbmVzIGluZm9ybcOhdGljYXMgbm8gdHJhZGljaW9uYWxlcyBkZSBwcm9jZXNhbWllbnRvIGRlIGRhdG9zIHBhcmEgdHJhdGFybG9zIGFkZWN1YWRhbWVudGUiCgpMdWVnbyBoYXkgImRlZmluaWNpb25lcyIgbcOhcyBlbGFib3JhZGFzIGNvbW8gdW5hIGZhbW9zYSwgZGUgMjAwMSBlbiBsYSBxdWUgc2UgZGVzdGFjYWJhbiB0cmVzIGFzcGVjdG9zIGVuIGVsIEJpZyBEYXRhLCAqKmxhcyB0cmVzICJ2J3MiKiogZGVsIEJpZyBEYXRhOiAqKnZvbHVtZW4sIHZlbG9jaWRhZCB5IHZhcmllZGFkKio6IGRlc3B1w6lzIHNlIGhhbiBhw7FhZGlkbyAyIHV2ZXMgbcOhcyB5IHNlIGhhYmxhIGRlIDUgdXZlcyBvICA1IGFzcGVjdG9zIHJlbGFjaW9uYWRvcyBjb24gZWwgQmlnIERhdGE6ICoqdioqb2x1bWVuIGRlIGRhdG9zLCAqKnYqKmVsb2NpZGFkIGNvbiBsYSBxdWUgc2Ugb2J0aWVuZW4geSB0cmFuc2ZpZXJlbiwgKip2KiphcmllZGFkIGRlIHRpcG9zIGRlIGRhdG9zICh0ZXh0bywgaW3DoWdlbmVzIGV0Yy4uLiksICoqdioqZXJhY2lkYWQgZGUgbGFzIGZ1ZW50ZXMsIHkgdW4gcXVpbnRvIGFzcGVjdG8gIGEgY29uc2lkZXJhciBlcyBlbCAqKnYqKmFsb3IgcXVlIGFwb3J0YW4gbG9zIGRhdG9zLiBFbiBbZXN0ZSB0ZXh0b10oaHR0cHM6Ly93d3cuYmJ2YS5jb20vZXMvbGFzLWNpbmNvLXV2ZXMtZGVsLWJpZy1kYXRhLykgY29ydGl0byBsbyBleHBsaWNhbiBiaWVuLgoKU2UgcHVlZGVuIG1pcmFyIG3DoXMgYXNwZWN0b3MgZGVsIEJpZyBkYXRhLCBwZXJvIGxvIGZ1bmRhbWVudGFsIGVzIHF1ZSBzb24gZGF0b3MsIHF1ZSB5YSBzZWEgcG9yIHN1IHZvbHVtZW4sIHBvciBzdSB2YXJpZWRhZCwgbyBwb3Igc3UgdmVsb2NpZGFkIG5vIHNvbiBmw6FjaWxlcyBkZSBhbG1hY2VuYXIvdHJhdGFyL21hbmVqYXIgY29uIGxhcyB0w6ljbmljYXMgeSBvcmRlbmFkb3JlcyBoYWJpdHVhbGVzLiBFc3RlIGhlY2hvIGRhIGx1Z2FyIGEgcXVlIGVsIG1lcmNhZG8sIGxhcyBlbXByZXNhcywgbmVjZXNpdGVuIHBlcnNvbmFzIHF1ZSBzZWFuIGNhcGFjZXMgZGUgZ2VzdGlvbmFyIGxhIGluZnJhZXN0cnVjdHVyYSBkZSBoYXJkd2FyZSB5IHNvZnR3YXJlIHBhcmEgbWFuZWphciBkYXRvcyBtYXNpdm9zLCBlc3RhcyBwZXJzb25hcyBnZW5lcmFsbWVudGUgc29uIGluZ2VuaWVyb3MgZGUgc29mdHdhcmUsIG8gaW5mb3Jtw6F0aWNvcy4gQWRlbcOhcyBkZSBhbG1hY2VuYXIgeSBkaXN0cmlidWlyIGxvcyBkYXRvcyBsYXMgZW1wcmVzYXMgdGFtYmnDqW4gbmVjZXNpdGFuIHBlcnNvbmFzIHF1ZSBzZWFuIGNhcGFjZXMgZGUgYW5hbGl6YXIgeSBvYnRlbmVyIGluZm9ybWFjacOzbiB5IHZhbG9yIGRlIGVzb3MgZGF0b3MsIGVsIHBlcmZpbCBkZSBlc3RhcyBwZXJzb25hcyBlcyBtZW5vcyB1bmlmb3JtZSwgcHVlZGUgcXVlIHNlYW4gaW5nZW5pZXJvcywgbWF0ZW3DoXRpY29zLCBlc3RhZMOtc3RpY29zLCBlY29ub21pc3RhcyAod2h5IG5vdD8pLCBiacOzbG9nb3MsIHPDrSBlbiBCaW9sb2fDrWEgY29uIGVsIGVzdHVkaW8gZGVsIGdlbm9tYSB5IGxvcyBnZW5lcyBlcyB1bm8gZGUgbG9zIGNhbXBvcyBkb25kZSBtw6FzIHNlIGVzdMOhIGhhY2llbmRvIENpZW5jaWEgZGUgRGF0b3MuCgpFbiBjdWFscXVpZXIgY2FzbywgY29tbyBlcyB1biDDoXJlYSBvIGNhbXBvIGRlIGVzdHVkaW8gcmVsYXRpdmFtZW50ZSBudWV2YSB5IGFkZW3DoXMgZW4gY29uc3RhbnRlIGV2b2x1Y2nDs24sIGxvcyB0w6lybWlub3MgeSBjb25jZXB0b3MgYcO6biBlc3TDoW4gZGVmaW5pw6luZG9zZSB5IGV2b2x1Y2lvbmFuZG87IHBvciBlamVtcGxvLCB5YSBzZSBlbXBpZXphIGEgaGFibGFyIGRlbCBbInNtYXJ0IGRhdGEiXShodHRwczovL3JldGluYS5lbHBhaXMuY29tL3JldGluYS8yMDE4LzAxLzEyL3RlbmRlbmNpYXMvMTUxNTc2MzQyMV83ODA1NzkuaHRtbCkuIEVuIGVzdGUgYXJ0w61jdWxvIHNlw7FhbGFuIHF1ZTogCgo+IkVsIHTDqXJtaW5vIGJpZyBkYXRhIC4uLiBoYWNlIHJlZmVyZW5jaWEgYSBjb25qdW50b3MgZGUgZGF0b3MgcXVlLCBkZWJpZG8gYSBzdSBncmFuIHZvbHVtZW4sIG5lY2VzaXRhbiBzaXN0ZW1hcyBlc3BlY2lhbGl6YWRvcyBkZSBhbG1hY2VuYWRvIHkgcHJvY2VzYWRvIHBhcmEgcG9kZXIgdHJhYmFqYXIgY29uIGVsbG9zIGRlIG1hbmVyYSBlZmljaWVudGUgLi4uLiBMYSBpbmZvcm1hY2nDs24gZXMgaW1wb3J0YW50ZSwgc8OtLCBwZXJvIGRlbWFzaWFkYSBwdWVkZSBsbGVnYXIgYSBzZXIgY29uZnVzYSB5IGhhc3RhIGNvbnRyYXByb2R1Y2VudGUgLi4uLiBBcXXDrSBlcyBkb25kZSBlbCBiaWcgZGF0YSBkYSB1biBwYXNvIGhhY2lhIGFkZWxhbnRlLCBlbCBzbWFydCBkYXRhLCBxdWUgc2UgZW5jYXJnYSBkZSBkZXRlY3RhciBzZcOxYWxlcyB5IHBhdHJvbmVzIHJlbGV2YW50ZXMgYSB0cmF2w6lzIGRlIGFsZ29yaXRtb3MgaW50ZWxpZ2VudGVzIi4gCgpFc3RvIGEgbcOtIG1lIHN1ZW5hIGFsIG9iamV0aXZvIGZ1bmRhbWVudGFsIGRlIGxhIENpZW5jaWEgZGUgRGF0b3MsIGV4dHJhZXIgaW5mb3JtYWNpw7NuIGEgcGFydGlyIGRlIGxvcyBkYXRvcyBkZSBmb3JtYSBxdWUgc2UgZ2VuZXJlIGNvbm9jaW1pZW50byB5L28gdmFsb3IuCgoKTXVjaGFzIHZlY2VzIHNpIGxlw6lpcyB1biBhcnRpY3VsbyByZWxhY2lvbmFkbyBjb24gImVsIEJpZyBEYXRhIiBhcGFyZWNlbiBwYWxhYnJhcyBleHRyYcOxYXM6IEtlcmFzLCBUZW5zb3JGbG93LCBBcGFjaGUsIEFwYWNoZVNwYXJrLCBNb25nbywgTW9uZ29EQiwgTWFyaWEsIENhc3NhbmRyYSwgIC4uLi4geSBtdWNow61zaW1hcyBtw6FzLiBZbyBjb25vemNvIGFsZ3VuYXMgdW4gcG9jbywgb3RyYXMgbWUgc3VlbmFuIHkgb3RyYXMgbWUgc3VlbmFuIGEgY2hpbm8uIMK/UXXDqSBzb24/IFB1ZXMgZW4gZ2VuZXJhbCBzb24gbm9tYnJlcyBkZSBhcGxpY2FjaW9uZXMgaW5mb3Jtw6F0aWNhcywgbyByZXBvc2l0b3Jpb3MgZGUgZGF0b3MsIG8gZW1wcmVzYXMsIG8gcGFxdWV0ZXMsIGZyYW1ld29ya3MsICAuLi4sIHF1ZSBzZSB1dGlsaXphbiBwYXJhIGFsbWFjZW5hci90cmF0YXIvbWFuZWphci9lc3RpbWFyIG1vZGVsb3MgY29uIGdyYW5kZXMgdm9sw7ptZW5lcyBkZSBkYXRvcy4gUG9yIGVqZW1wbG8gW0FwYWNoZV0oaHR0cHM6Ly9lcy53aWtpcGVkaWEub3JnL3dpa2kvQXBhY2hlX1NvZnR3YXJlX0ZvdW5kYXRpb24pIGVzIHVuYSBmdW5kYWNpw7NuIGRlIHNvZnR3YXJlIGxpYnJlLCBxdWUgc2Ugb2N1cGEgZGUgaGFjZXIgcHJveWVjdG9zIHF1ZSBlbiBsYSBwcsOhY3RpY2EgcG9zaWJpbGl0YW4gaGFjZXIgQmlnIGRhdGEsIGltcGxlbWVudGFyIGxvcyBudWV2YXMgdMOpY25pY2FzLCBjb24gc29mdHdhcmUgeSBwbGF0YWZvcm1hcyBvcGVuIHNvdXJjZS4gQ29tbyBsYSBmdW5kYWNpw7NuIEFwYWNoZSB0aWVuZSBtdWNob3MgcHJveWVjdG9zIHkgInByb2R1Y3RvcyIsIHBvciBlc28gaGF5IEFwYWNoZVNwYXJrLCBDYXNzYW5kcmEsIEdlcm9uaW1vIGV0Yy4uLiAKCgpFc3RhIGluZnJhZXN0cnVjdHVyYSwgdGFudG8gZsOtc2ljYSAob3JkZW5hZG9yZXMsIHJlcG9zaXRvcmlvcyksIGNvbW8gZGUgc29mdHdhcmUvcHJvZ3JhbWFzIHF1ZSBzZSB1dGlsaXphbiBlbiBCaWcgRGF0YSBjYW1iaWFuIG11eSBkZXByaXNhLiBDb25zdGFudGVtZW50ZSBlc3TDoW4gc3VyZ2llbmRvIG51ZXZhcyBlbXByZXNhcywgbnVldm9zIG3DqXRvZG9zLCB1biBudWV2byBhbGdvcml0bW8sIHVuYSBudWV2YSBpbXBsZW1lbnRhY2nDs24gZGUgYWxnbyB5YSBleGlzdGVudGUsIGV0Yy4uLiAKCgpOb3MgYWNhYmEgZGUgcGFyZWNlciBvdHJhIHBhbGFicmEgaW1wb3J0YW50ZSBlbiBlc3RlIGNhbXBvIGRlIGNvbm9jaW1pZW50bywgbG9zICoqYWxnb3JpdG1vcyoqLCB5YSBoYWJsYXJlbW9zIGRlIGVsbG9zIHkgc3UgaW1wb3J0YW5jaWEgZW4gImxhIGVyYSBkZWwgQmlnIERhdGEiLgoKClF1aWVybyBsbGFtYXJvcyBsYSBhdGVuY2nDs24gc29icmUgdmFyaWFzIGlkZWFzIHF1ZSwgY29tbyBtdWNow61zaW1hcyBvdHJhcyBubyB0cmF0YXJlbW9zIGVuIGVsIGN1cnNvIF5bRW4gcmVhbGlkYWQgY29uIGFwcmVuZGVyIGEgcHJvZ3JhbWFyIHVuIHBvY28sIHRvZG8gbG8gcXVlIHBvZGFtb3MsIGNvbiBSIHBhcmEgcG9kZXIgc2VyIG3DoXMgZWZpY2llbnRlcyB0cmFiYWphbmRvIGNvbiBkYXRvcyB5YSB0ZW5lbW9zIGJhc3RhbnRlIHRhcmVhIGVuIGVsIGN1cnNvXSwgYWxndW5hcyAgZGUgZWxsYXMgcHJvdmllbmVuIGRlIFtlc3RlIGFydMOtY3Vsb10oaHR0cHM6Ly93d3cuaW5mb2JhZS5jb20vb3Bpbmlvbi8yMDE4LzA4LzIyL2xhLWNpZW5jaWEtZGUtbG9zLWRhdG9zLXktc3UtaW1wYWN0by1lbi1sYS1lY29ub21pYS1sYS1wb2xpdGljYS15LWxhLXNvY2llZGFkLyk6CgotIExvcyBkYXRvcyBob3kgc29uIG9tbmlwcmVzZW50ZXMgeSBhIG1lbnVkbyBhYnJ1bWFkb3Jlcy4gUHJvZHVjaW1vcywgb3JnYW5pemFtb3MgeSBjb25zdW1pbW9zIGRhdG9zIGRlIG1hbmVyYSBjYXNpIGNvbnN0YW50ZS4gRXN0YW1vcyByb2RlYWRvcyBkZSBpbmZvcm1hY2nDs24gcXVlIG5vIHBhcmEgZGUgYXVtZW50YXIuIFVuYSBkZSBsYXMgcHJpbmNpcGFsZXMgZnVlbnRlcyBkZSBkYXRvcyBzb24gbnVlc3RyYXMgYWNjaW9uZXMgZW4gbGEgcmVkIChjbGlja3MsIGxpa2VzLCByYXRpbmcsIHNoYXJlcywgZXRjLi4uICksIHBlcm8gdGFtYmnDqW4gaGF5IG11Y2hvcyBkYXRvcyBwcm92ZW5pZW50ZXMgZGUgc2Vuc29yZXMgZW4gbcOhcXVpbmFzIHkgcHJvY2Vzb3MsIHBpZW5zYSBwb3IgZWplbXBsbyBlbiBsYSBpbmZvcm1hY2nDs24gcXVlIGdlbmVyYSB1biBjb2NoZSBkZSBGb3JtdWxhIDEsIG8gdW4gc29uZGEgZXNwYWNpYWwsIG8gZWwgVkFSIHF1ZSBoYXkgZW4gZWwgZsO6dGJvbC4gQSBtb2RvIGRlIGVqZW1wbG8sIFtEYXRhIE5ldmVyIFNsZWVwcyA4LjAgZGUgRG9tb10oaHR0cHM6Ly93d3cuZG9tby5jb20vbGVhcm4vaW5mb2dyYXBoaWMvZGF0YS1uZXZlci1zbGVlcHMtOCkgaW5mb3Jtw7MgcXVlIGVuIGNhZGEgbWludXRvIGRlIDIwMjAgaHVibywgdXNhbmRvIGRhdG9zIHNvbGFtZW50ZSBkZSBsYSBsYSBwbGF0YWZvcm1hIFpvb20sIHVuIHByb21lZGlvIGRlIDIwOC4zMzMgcGVyc29uYXMgY29uZWN0YWRhcyBlbiB1bmEgcmV1bmnDs24gdmlydHVhbCB5IHNlIGNyZWFyb24gMzQ3LjIyMiBoaXN0b3JpYXMgZW4gSW5zdGFncmFtLgoKLSBEZSBsYSBtaXNtYSBmb3JtYSBxdWUgIEludGVybmV0IGNhbWJpw7MgcmFkaWNhbG1lbnRlIGVsIG11bmRvIGFsIGHDsWFkaXIgY29tdW5pY2FjacOzbiwgbG9zIGRhdG9zIG1hc2l2b3MgbW9kaWZpY2FyYW4gYXNwZWN0b3MgZnVuZGFtZW50YWxlcyBkZSBudWVzdHJhIHZpZGEgb3RvcmfDoW5kb2xlIHVuYSBkaW1lbnNpw7NuIGN1YW50aXRhdGl2YSBxdWUgbnVuY2EgaGFiw61hIHRlbmlkbyBhbnRlcywgcGllbnNhIHBvciBlamVtcGxvIGVuIGFwbGljYWNpb25lcyBtw6lkaWNhcyBvIGRlIG1vbml0b3JpemFjacOzbiBkZSBsYSBhY3RpdmlkYWQgZsOtc2ljYS4gQW50ZSB0YWwgdm9sdW1lbiBkZSBkYXRvcywgZWwgZGVzYWbDrW8gZXMgY29uc3RydWlyIGNvbm9jaW1pZW50byB1c2FuZG8gbG9zIGRhdG9zIG3DoXMgcmVsZXZhbnRlcyB5IGRpdmVyc29zLCBubyBzb2xvIHBhcmEgbm9zb3Ryb3MsIHNpbm8gcGFyYSBudWVzdHJhIHNvY2llZGFkIGVuIHN1IGNvbmp1bnRvLgoKCi0gSGFzdGEgaGFjZSBhbGd1bmFzIGTDqWNhZGFzIGxhIHJlY29waWxhY2nDs24gZGUgbGEgaW5mb3JtYWNpw7NuIGVzdGFiYSBtYXlvcm1lbnRlIGEgY2FyZ28gZGUgbG9zIEVzdGFkb3MgbmFjaW9uYWxlcywgcGVybywgYWhvcmEgbWlzbW8sIGdyYW4gcGFydGUgZGUgbG9zIGRhdG9zIGVzdMOhbiBlbiBtYW5vcyBkZSBlbXByZXNhcyBwcml2YWRhcyAoR29vZ2xlLCBGYWNlYm9vaywgQW1hem9uLCAuLi4gKS4gRXN0byB0aWVuZSB5IHB1ZWRlIHRlbmVyIGZ1ZXJ0ZXMgaW1wbGljYWNpb25lcyB5IGNvbnNlY3VlbmNpYXMuCgoKLSAgRWwgcG9zZWVyIGRhdG9zIHB1ZWRlIGRhciBwb2Rlci9iZW5lZmljaW8vdmVudGFqYXMgY29tcGV0aXRpdmFzIGEgcXVpZW4gbG9zIHBvc2VhLiBQb3IgZWplbXBsbywgc2Vnw7puIGxvcyBleHBlcnRvcywgZWwgbWVqb3IgdHJhZHVjdG9yIG9ubGluZSBubyBlcyBHb29nbGUgVHJhbnNsYXRvciBzaW5vIFtEZWVwTF0oaHR0cHM6Ly93d3cuZGVlcGwuY29tL2VzL3RyYW5zbGF0b3IpLiBMb3MgZG9zIHNlcnZpY2lvcyB1dGlsaXphbiBhbGdvcml0bW9zIGRlIGludGVsaWdlbmNpYSBhcnRpZmljaWFsLCBwZXJvIHBhcmVjZSBzZXIgcXVlIERlZXBMIHRpZW5lIG1lam9yZXMgZGF0b3MuIERlZXBMIHV0aWxpemEgbG9zIGRhdG9zIGRlbCBwcm95ZWN0byBMaW5ndWVlIHF1ZSBoYSBwZXJtaXRpZG8gY29uc3RydWlyIHVuYSBiYXNlIGRlIGRhdG9zIGVub3JtZS4gTG8gZXhwbGljYW4gW2FxdcOtXShodHRwczovL3d3dy54YXRha2EuY29tL3NlcnZpY2lvcy9kZWVwbC12cy1nb29nbGUtdHJhbnNsYXRlLXF1aWVuLWdhbmEtYmF0YWxsYS10cmFkdWN0b3Jlcy1vbmxpbmUpCgotIEVsIGVqZW1wbG8gYW50ZXJpb3IgaWx1c3RyYSBxdWUgbG8gcXVlIGhheSBkZXRyw6FzIGRlIGxvcyBhdmFuY2VzIG5vIHNvbiBsb3MgYWxnb3JpdG1vcyBvIGxhIElBL01ML0RMLCBzaW5vIGxvcyBkYXRvczogZWwgZ3JhbiB2b2x1bWVuIGRlIGRhdG9zIGVzIGxvIHF1ZSBoYSBoZWNobyBwb3NpYmxlIGVzdGEgw6lwb2NhIGRlIGF2YW5jZXMgdGVjbm9sw7NnaWNvcyBhY2VsZXJhZG9zOyBlbiBlc3RlIHNlbnRpZG8gc2Ugc3VlbGUgZGVjaXIgcXVlIFtsb3MgZGF0b3Mgc29uIGVsIG51ZXZvIHBldHJvbGVvXShodHRwczovL3d3dy5ldXJvcGVhbmRhdGFwb3J0YWwuZXUvZW4vaGlnaGxpZ2h0cy9vZGUtb3Blbi1kYXRhLWJlbmVmaXRzLW9wZW4tZGF0YS1jb21wYXJlZC1vaWwpLCBwZXJvIGEgZGlmZXJlbmNpYSBkZSBlc3RlLCBjdXlhcyByZXNlcnZhcyBwb2RlbW9zIGNvbnNpZGVyYXIgZmlqYXMsIGVsIHZvbHVtZW4gZGUgZGF0b3Mgbm8gaGFjZSBzaW5vIGNyZWNlciwgc29uIG3DoXMgZsOhY2lsZXMgZGUgdHJhbnNwb3J0YXIgeSBnZW5lcmFuIG3DoXMgdmFsb3IgcGFyYSBsYSBzb2NpZWRhZCBjdWFudGEgbcOhcyBnZW50ZSBsb3MgdXNhLgoKLSBPYnZpYW1lbnRlLCBsYSBncmFuIGRpc3BvbmliaWxpZGFkIGRlIGRhdG9zIHRpZW5lIHRhbWJpw6luIGFzcGVjdG9zIG3DoXMgb3NjdXJvcyBvIGNvbiBwb3RlbmNpYWxlcyBwZWxpZ3JvcywgY29tbyBwb3IgZWplbXBsbyBhc3BlY3RvcyBsZWdhbGVzIGVuIGxhIHNlZ3VyaWRhZCB5IFtwcml2YWNpZGFkXShodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PXBUMTlWd0JBcUtBJmZlYXR1cmU9eW91dHUuYmUpLCBvIHNlc2dvcyBlbiBsb3MgZGF0b3MuIFlhIG5vIHPDs2xvIHF1ZSBsb3MgZ29iaWVybm9zIGNvcnRlbiBpbnRlcm5ldCBvIGVzcMOtZW4gYSBsb3MgY2l1ZGFkYW5vcywgY29tbyBwb3IgZWplbXBsbyBlbCBjYXNvIFNub3dkZW4gbyBlbCBwbGFuIGRlIGNyw6lkaXRvIHNvY2lhbCBjaGlubywgc2lubyBxdWUgZXN0w6EgZW1lcmdpZW5kbyB1biBbbWVyY2FkbyBkZSBlc3Bpb25hamUgZGlnaXRhbF0oaHR0cHM6Ly93d3cudmljZS5jb20vZW5fdXMvYXJ0aWNsZS9uZTg3OXovaS10cmFja2VkLXNvbWVvbmUtd2l0aC1saWNlbnNlLXBsYXRlLXJlYWRlcnMtZHJuKS4KCgpFbiBbZXN0ZSBwb3N0XShodHRwczovL3d3dy5mb3JiZXMuY29tL3NpdGVzL25laWxtYWxob3RyYS8yMDE5LzA3LzAxL21ha2luZy1zdXJlLWFpLWlzLXNvY2lhbGx5LXJlc3BvbnNpYmxlLyM2YTk2ZjE2YzY2MGMpIGhhYmxhbiBkZSBjw7NtbyBmYXZvcmVjZXIgcXVlIGxhcyBhcGxpY2FjaW9uZXMgc3VyZ2lkYXMgZGUgbGEgSUEgc2VhbiBzb2NpYWxtZW50ZSByZXNwb25zYWJsZXMgbyBxdWUgbG9zIGFsZ29yaXRtb3Mgbm8gYWNhYmVuIHJlcHJvZHVjaWVuZG8gbG9zIHNlc2dvcyBwcmVzZW50ZXMgZW4gbG9zIGRhdG9zLiBFbiBbZXN0YSBndcOtYSBwYXJhIGVsIGRpc2XDsW8gcmVzcG9uc2FibGUgZGUgc2lzdGVtYXMgZGUgSUFdKGh0dHBzOi8vd3d3LnR1cmluZy5hYy51ay9zaXRlcy9kZWZhdWx0L2ZpbGVzLzIwMTktMDYvdW5kZXJzdGFuZGluZ19hcnRpZmljaWFsX2ludGVsbGlnZW5jZV9ldGhpY3NfYW5kX3NhZmV0eS5wZGYpIGRlbCBBbGFuIFR1cmluZyBJbnN0aXR1dGUgZGVzYXJyb2xsYW4gZXN0w6FzIGlkZWFzLiAKCgotIEN1YW5kbyBzZSBkaXNwb25lIGRlIGRhdG9zIHNlbnNpYmxlcywgcG9yIGVqZW1wbG8gZGF0b3MgbcOpZGljb3MsIGFwYXJlY2UgZWwgZGlsZW1hIGVudHJlIHByaXZhY2lkYWQgZSBpbmZvcm1hY2nDs24gcXVlIHB1ZWRlIHNlciBiZW5lZmljaW9zYSBwYXJhIGxhIHNvY2llZGFkLiBTaWVtcHJlIHNlIHB1ZWRlIHRyYXRhciBkZSBhbm9uaW1pemFyIGxvcyBkYXRvcywgcGVybyBwYXJlY2Ugc2VyIHF1ZSBhIGxvcyBleHBlcnRvcyBsZXMgcmVzdWx0YSBubyBkZW1hc2lhZG8gY29tcGxpY2FkbyByZWN1cGVyYXIgbGEgaW5mb3JtYWNpw7NuIG9yaWdpbmFsOyBlcyAgZGVjaXIsIGEgdmVjZXMgZXMgcG9zaWJsZSBsYSBbcmVpZGVudGlmaWNhY2nDs25dKGh0dHBzOi8vd3d3LmRhdGFuYWx5dGljcy5jb20vMjAxOS8wOC8yNy9tYXMtc29icmUtbGEtYW5vbmltaWRhZC15LXJlaWRlbnRpZmljYWNpb24tZW4tZmljaGVyb3MtZGUtbWljcm9kYXRvcy8pIGRlIGZpY2hlcm9zIGFub25pbWl6YWRvcy4gTcOhcyBzb2JyZSBlc3RvIFthcXXDrV0oaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1wVDE5VndCQXFLQSkgeSBbYXF1w61dKGh0dHBzOi8vaGlwZXJ0ZXh0dWFsLmNvbS8yMDE5LzA5L3ByaXZhY2lkYWQtZGlmZXJlbmNpYWwtZGF0b3M/dXRtX21lZGl1bT1mZWVkJnV0bV9zb3VyY2U9ZmVlZHByZXNzLm1lJnV0bV9jYW1wYWlnbj1GZWVkJTNBK2hpcGVydGV4dHVhbCkuCgotIENvbW8gZW4gb3RyYXMgZmFjZXRhcyBkZSBsYSB2aWRhLCBsYSBpbmZvcm1hY2nDs24geSB0cmFuc3BhcmVuY2lhIGVzIGNsYXZlIGEgbGEgaG9yYSBkZSByZWR1Y2lyIGxvcyBwb3NpYmxlcyByaWVzZ29zIGRlIGxhcyBhcGxpY2FjaW9uZXMgZGUgSUEuIEVzIGltcG9ydGFudGUgcXVlIGVsIGPDs2RpZ28gZnVlbnRlIGRlIGxhcyBhcGxpY2FjaW9uZXMgeSBhbGdvcml0bW9zIHNlYSBkZSBhY2Nlc28gbGlicmUuIENvbW8gZWplbXBsbyBbZXN0ZSBhcnTDrWN1bG9dKGh0dHBzOi8vd3d3LnB1YmxpY28uZXMvc29jaWVkYWQvdHJhbnNwYXJlbmNpYS1nb2JpZXJuby1uby1xdWllcmUtcHVibGljYXItZnVuY2lvbmFuLWFwbGljYWNpb25lcy1hbGdvcml0bW9zLWRlYmVyYS1leHBsaWNhci5odG1sKSBkZSBQw7pibGljbyBvIGVzdGUgW3BhcGVyXShodHRwczovL3d3dy50YW5kZm9ubGluZS5jb20vZG9pL2Z1bGwvMTAuMTA4MC8xMzY5MTE4WC4yMDE4LjE0Nzc5NjcpLgoKPGJyPgoKIyMgMi4gSUEsIE1MIHkgREwKCkludGVsaWdlbmNpYSBBcnRpZmljaWFsIChJQSksIE1hY2hpbmUgTGVhcm5pbmcgKE1MKSB5IERlZXAgTGVhcm5pbmcgKERMKSBeW0xvcyBkb3Mgw7psdGltb3MgdMOpcm1pbm9zIGVuIGNhc3RlbGxhbm8gc2Vyw61hbjogQXByZW5kaXphamUgTcOhcXVpbmEgeSBBcHJlbmRpemFqZSBQcm9mdW5kb10gc29uIHRyZXMgcGFsYWJyYXMvY29uY2VwdG9zIHF1ZSBhcGFyZWNlbiBjb25zdGFudGVtZW50ZSBlbiBsYSBlcmEgZGVsIEJpZyBEYXRhLiBbQXF1w61dKGh0dHBzOi8vYmxvZ3RoaW5rYmlnLmNvbS9hcnRpZmljaWFsLWludGVsbGlnZW5jZS1tYWNoaW5lLWxlYXJuaW5nLXktZGVlcC1sZWFybmluZy1jb25vY2VzLWxhcy1kaWZlcmVuY2lhcykgdGllbmVzIHVuIHBvc3Qgc2VuY2lsbG8geSBjbGFybyBzb2JyZSBlc3RvcyB0cmVzIHTDqXJtaW5vcy4KCkxhIHByaW1lcmEgaWRlYSBhIHJldGVuZXIgZXN0w6EgcmVzdW1pZGEgZW4gbGEgaW5mb2dyYWbDrWEgcXVlIHZlaXMgbcOhcyBhYmFqbyB5IHF1ZSBwcm92aWVuZSBkZSBlc3RlIFtwb3N0XShodHRwczovL2hhY2tlcm5vb24uY29tL2FyZS15b3UtdXNpbmctdGhlLXRlcm0tYWktaW5jb3JyZWN0bHktOTExYWMyM2FiNGY1KQoKCgoKYGBge3IgLCBlY2hvPUZBTFNFLCBldmFsID0gVFJVRSwgZmlnLmFzcCA9IDQvMiwgb3V0LndpZHRoID0gIjc1JSIsIGZpZy5hbGlnbiA9ICJjZW50ZXIiLCBmaWcuY2FwID0gJ0lBLCBNTCB5IERMJ30Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1hZ2VuZXMiLCAidHRfMDFfaW1nXzAxX0FJLU1MLURMLnBuZyIpKQpgYGAKCgoKQ29tbyBzZSBhcHJlY2lhIGVuIGxhIGluZm9ncmFmw61hLCBETCBlcyB1biBzdWJjb25qdW50byBkZWwgTUwgeSBNTCBlcyB1biBjYW1wbyBkZSBsYSBJQS4gVmFtb3MgcXVlIHRhbnRvIERMIGNvbW8gTUwgc29uIGFwbGljYWNpb25lcyBlc3BlY8OtZmljYXMgZGUgSUEuIExhIElBIHN1cmdpw7MgZW4gbG9zIDUwIHkgZWwgTUwgcHVlZGUgdmVyc2UgY29tbyB1biBlbmZvcXVlIGRlIGxhIElBIHF1ZSBlbXBlesOzIGEgY29nZXIgZnVlcnphIGVuIGxvcyA4MCB5IHF1ZSBzdXB1c28gdW4gY2FtYmlvIGRlIHBhcmFkaWdtYSBlbiBjb21vIHNlIGFmcm9udGFiYSBsYSBJQS4KClByaW1lcm8gdmVhbW9zIHF1w6kgZXMgbGEgSUEuIFBhcmEgZWxsbyB2b3kgYSByZWN1cnJpciBkZSBudWV2byBhIGxhIFtXaWtpcGVkaWFdKGh0dHBzOi8vZXMud2lraXBlZGlhLm9yZy93aWtpL0ludGVsaWdlbmNpYV9hcnRpZmljaWFsKSB5IGEgbG8gcXVlIHlhIHPDqSBzb2JyZSBJQSBwYXJhIHJlZGFjdGFyIHVub3MgcMOhcnJhZm9zIHF1ZSBvcyBkZW4gY2llcnRhIGlkZWEgZGUgcXXDqSBlcyBsYSBJQS4gIAoKTGEgV2lraXBlZGlhIGVtcGllemEgZGljaWVuZG86ICJJQSBlcyBsYSBpbnRlbGlnZW5jaWEgbGxldmFkYSBhIGNhYm8gcG9yIG3DoXF1aW5hcyIuIEVzdGEgcHJpbWVyYSBmcmFzZSBubyBhY2xhcmEgbXVjaG8sIHBlcm8gZXMgcXVlICBhIHZlY2VzIGxhIGNvc2FzIGN1ZXN0YW4uIExvIGludGVudG8geW86IElBIGVzIHVuIGNhbXBvIGRlIGNvbm9jaW1pZW50bywgY29tcGFydGlkbyBwb3IgdmFyaWFzIGNpZW5jaWFzLCBjdXlvIG9iamV0aXZvIHBvZGVtb3MgcGVuc2FyIHF1w6kgZXMgcXVlIGxhIG1hcXVpbmFzIHNlYW4gaW50ZWxpZ2VudGVzLiBMYXMgbWFxdWluYXMgbm8gc29uIGh1bWFub3MsIG51bmNhIHZhbiBhIHBvZGVyIHNlciBpbnRlbGlnZW50ZXMgZW4gdW4gc2VudGlkbyBhbXBsaW8gbyBodW1hbm8sIHPDs2xvIGVuIGxhIGNpZW5jaWEtZmljY2nDs24sIHBlcm8gc8OtIHB1ZWRlbiB0ZW5lciBjb21wb3J0YW1pZW50b3MgImludGVsaWdlbnRlcyI7IGVzIGRlY2lyIHF1ZSBoYWdhbiBjb3NhcyBxdWUgc2ltdWxlbiBsYSBpbnRlbGlnZW5jaWEgaHVtYW5hIGNvbW8gcG9yIGVqZW1wbG8gcmVzb2x2ZXIgcHJvYmxlbWFzIG8gZGljaG8gZGUgZm9ybWEgbcOhcyB0w6ljbmljYSwgZW4gZnVuY2nDs24gZGUgdW5hcyB2YXJpYWJsZXMgZGUgZW50b3JubyB0b21hciB1bmEgZGVjaXNpw7NuIChlc3RvIGVzIGxvIHF1ZSBoYWNlIHBvciBlamVtcGxvIHVuIG9yZGVuYWRvciBxdWUganVlZ2EgYWwgYWplZHJleiwgZW4gZnVuY2nDs24gZGUgbGFzIHBvc2ljaW9uZXMgZGUgbGFzIHBpZXphcyBlbiBlbCB0YWJsZXJvIHRvbWEgdW5hIGRlY2lzacOzbiBzb2JyZSBxdWUgcGllemEgbW92ZXIpLiBVbmEgZGVmaW5pY2nDs24gY29uY2lzYSBkZWwgY2FtcG8gc2Vyw61hOiBlbCBlc2Z1ZXJ6byBwb3IgYXV0b21hdGl6YXIgbGFzIHRhcmVhcyBpbnRlbGVjdHVhbGVzIG5vcm1hbG1lbnRlIHJlYWxpemFkYXMgcG9yIGxvcyBzZXJlcyBodW1hbm9zLgoKTGEgaWRlYSBmdW5kYW1lbnRhbCBlbiBxdWUgc2UgYmFzYSBsYSBJbnRlbGlnZW5jaWEgQXJ0aWZpY2lhbCBlcyBjb25zZWd1aXIgcXVlIHVuYSBjb21wdXRhZG9yYSByZXN1ZWx2YSB1biBwcm9ibGVtYSBjb21wbGVqbyBjb21vIGxvIGhhcsOtYSB1biBodW1hbm8uIEVzIGRlY2lyLCBzZWfDum4gQW5kcmVhcyBLYXBsYW4geSBNaWNoYWVsIEhhZW5sZWluIGRlZmluZW4gbGEgaW50ZWxpZ2VuY2lhIGFydGlmaWNpYWwgZXMgImxhIGNhcGFjaWRhZCBkZSB1biBzaXN0ZW1hIHBhcmEgaW50ZXJwcmV0YXIgY29ycmVjdGFtZW50ZSBkYXRvcyBleHRlcm5vcywgcGFyYSBhcHJlbmRlciBkZSBkaWNob3MgZGF0b3MgeSBlbXBsZWFyIGVzb3MgY29ub2NpbWllbnRvcyBwYXJhIGxvZ3JhciB0YXJlYXMgeSBtZXRhcyBjb25jcmV0YXMgYSB0cmF2w6lzIGRlIGxhIGFkYXB0YWNpw7NuIGZsZXhpYmxlIi4gUG9yIGVqZW1wbG8sIGNvbmR1Y2lyIHVuIGNvY2hlLgoKCsK/RGVzZGUgY3VhbmRvIGV4aXN0ZSBsYSBpbnRlbGlnZW5jaWEgYXJ0aWZpY2lhbD8gUHVlcyBkZXNkZSBoYWNlIGJhc3RhbnRlIC4uLi4uIG5vIGhhYsOtYWlzIG5hY2lkbywgbmkgeW8gdGFtcG9jby4gCgpMYSBpbnRlbGlnZW5jaWEgYXJ0aWZpY2lhbCBuYWNpw7MgZW4gbGEgZMOpY2FkYSBkZSAxOTUwLCBjdWFuZG8gdW4gcHXDsWFkbyBkZSBwaW9uZXJvcyBkZWwgY2FtcG8gZGUgbGEgaW5mb3Jtw6F0aWNhIGNvbWVuesOzIGEgcHJlZ3VudGFyc2Ugc2kgbGFzIGNvbXB1dGFkb3JhcyBwb2TDrWFuICJwZW5zYXIiLCB1bmEgcHJlZ3VudGEgY3V5YXMgcmFtaWZpY2FjaW9uZXMgc2UgZXN0w6FuIGV4cGxvcmFuZG8gdG9kYXbDrWEgaG95LiBMYSBpZGVhIHByaW5jaXBhbCBxdWUgc3VieWFjZSBhbCBjYW1wbyBkZSBsYSBJQSBlcyBjb25zZWd1aXIgcXVlIHVuYSBjb21wdXRhZG9yYSByZXN1ZWx2YSB1biBwcm9ibGVtYSBvIHRhcmVhIGNvbXBsZWphIGNvbW8gbG8gaGFyw61hIHVuIGh1bWFuby4gCgoKRHVyYW50ZSBsYXMgcHJpbWVyYXMgZXRhcGFzLCBtZWRpYWRvcyBkZSBsb3MgNjAsIHNlIHBlbnNhYmEgcXVlIGxhIElBIHBvZHLDrWEgbG9ncmFyc2UgZWxhYm9yYW5kbyB1biBjb25qdW50byBzdWZpY2llbnRlbWVudGUgZ3JhbmRlIGRlIHJlZ2xhcyBleHBsw61jaXRhcyBwYXJhIG1hbmlwdWxhciBjb25vY2ltaWVudG8gbyBkYXRvcy4gRW4gZXN0YSBmYXNlLCBzZSBkZXNhcnJvbGxhcm9uIGFwbGljYWNpb25lcyBjb25vY2lkYXMgY29tbyAqKnNpc3RlbWFzIGV4cGVydG9zKiosIGVuIGxvcyBxdWUgc2UgY3Jlw61hIHF1ZSB1biBwb3RlbnRlIG9yZGVuYWRvciB5IHVuIGNvbmp1bnRvIGRlIHJlZ2xhcyBkZSByYXpvbmFtaWVudG8gcG9kcsOtYW4gZW11bGFyIGVsIHJhem9uYW1pZW50byBodW1hbm8uIEVzdGUgZW5mb3F1ZSBzZSBjb25vY2UgY29tbyBJQSBzaW1iw7NsaWNhLCB5IGZ1ZSBlbCBwYXJhZGlnbWEgZG9taW5hbnRlIGVuIElBIGhhc3RhIGZpbmFsZXMgZGUgbG9zIDgwLiAKCgpMYSBJQSBzaW1iw7NsaWNhIGRlbW9zdHLDsyBzZXIgYWRlY3VhZGEgcGFyYSByZXNvbHZlciBwcm9ibGVtYXMgbMOzZ2ljb3MgYmllbiBkZWZpbmlkb3MsIGNvbW8ganVnYXIgYWwgYWplZHJleiwgcGVybyByZXN1bHTDsyBkaWbDrWNpbCBlbmNvbnRyYXIgcmVnbGFzIGV4cGzDrWNpdGFzIHBhcmEgcmVzb2x2ZXIgb3RybyB0aXBvIGRlICBwcm9ibGVtYXMgY29tcGxlam9zIHkgZGlmdXNvcywgY29tbyBsYSBjbGFzaWZpY2FjacOzbiBkZSBpbcOhZ2VuZXMsIGVsIHJlY29ub2NpbWllbnRvIGRlIHZveiBvIGxhIHRyYWR1Y2Npw7NuIGRlIHRleHRvczsgZGUgZm9ybWEgcXVlIGhveSBlbiBkw61hIHNlIHV0aWxpemEgb3RybyBlbmZvcXVlOiBlbCBNYWNoaW5lIExlYXJuaW5nIG8gQXByZW5kaXphamUgTWFxdWluYS4gCgoKQ29tbyBzZcOxYWxhbiBbYXF1w61dKGh0dHBzOi8vZW1wcmVzYXMuYmxvZ3RoaW5rYmlnLmNvbS9hdHJldmV0ZS1jb24tZWwtZGVlcC1sZWFybmluZy8pLCBubyBmdWUgaGFzdGEgbG9zIGHDsW9zIDgwLCBjYXNpIDMwIGHDsW9zIGRlc3B1w6lzIGRlbCBsb3MgaW5pY2lvcyBkZSBsYSBJQSwgcXVlIGVtcGV6w7MgYSBjb2JyYXIgaW1wb3J0YW5jaWEgZWwgYXByZW5kaXphamUgYXV0b23DoXRpY28gbyBNYWNoaW5lIExlYXJuaW5nLiBTZSB0cmF0YSBkZSB1bmEgZm9ybWEgZGUgSUEgcXVlIHlhIG5vIG5lY2VzaXRhIHVuIHByb2dyYW1hZG9yIHF1ZSBjb2RpZmlxdWUgcmVnbGFzLCBzaW5vIHF1ZSBlcyBjYXBheiBkZSBlc3RhYmxlY2VyIHN1cyBwcm9waWFzIHJlZ2xhcyB5IGFwcmVuZGVyIHBvciBzw60gbWlzbWEuIAoKTGEgaWRlYSBiw6FzaWNhIGRldHLDoXMgZGVsIE1MIGNvbnNpc3RlIGVuIHF1ZSwgZW4gbHVnYXIgZGUgZGFybGUgYWwgb3JkZW5hZG9yIHVuIGNvbmp1bnRvIGRlIHJlZ2xhcyBwYXJhIHByb2Nlc2FyIGxvcyBkYXRvcywgZXMgZWwgcHJvcGlvIG9yZGVuYWRvciBlbCBxdWUgYXByZW5kZSBlc2FzIHJlZ2xhcyBtaXJhbmRvL2FuYWxpemFuZG8gbG9zIGRhdG9zLiDCv0PDs21vPyBZYSBsbyB2ZXJlbW9zLCBwZXJvIGxvIHF1ZSBlc3TDoSBjbGFybyBlcyBxdWUgZWwgZW5mb3F1ZS9wYXJhZGlnbWEgaGEgY2FtYmlhZG86IGVuIGx1Z2FyIGRlIHByb2dyYW1hciB5IGRhciBhbCBvcmRlbmFkb3IgdW5hcyByZWdsYXMgbyBwcm9ncmFtYSBwYXJhIHByb2Nlc2FyIGxvcyBkYXRvcyB5IGRldm9sdmVybm9zIHJlc3B1ZXN0YXMvYWNjaW9uZXMsIGVsIGVuZm9xdWUgZGVsIE1MIHByb3ZlZSBhIGxhIG1hcXVpbmEgY29uIGxvcyBkYXRvcyB5IGxhcyByZXNwdWVzdGFzIGVzcGVyYWRhcyBjb24gZXNvcyBkYXRvcyB5IG5vcyBkZXZ1ZWx2ZSBsYXMgInJlZ2xhcyIuIEVzdGFzIHJlZ2xhcyBwdWVkZW4gYXBsaWNhcnNlIGEgbnVldm9zIGRhdG9zIHBhcmEgcHJvZHVjaXIgbGFzIHJlc3B1ZXN0YXMgZW4gZXNvcyBudWV2b3MgZGF0b3MuIFVuIHNpc3RlbWEgcXVlIHVzYSBNTCBubyBlcyBleHBsw61jaXRhbWVudGUgcHJvZ3JhbWFkbywgc2lubyBxdWUgc2UgbGUgcHJvdmVlIGRlIHN1ZmljaWVudGVzIGRhdG9zIChyZWxldmFudGVzIHBhcmEgbGEgdGFyZWEgcXVlIHNlIGVzcGVyYSBxdWUgaGFnYSkgeSBlbmN1ZW50cmEgbGFzIHJlZ2xhcyAobyBlc3RydWN0dXJhIGVzdGFkw61zdGljYSkgZW4gZXNvcyBkYXRvcyBvIGVqZW1wbG9zIHksIHNpIHRvZG8gZnVuY2lvbmEgYmllbiwgZWwgc2lzdGVtYSBhcHJlbmRlIHkgZW5jdWVudHJhIGxhcyByZWdsYXMvcGF0cm9uZXMgcGFyYSBwb2RlciBhdXRvbWF0aXphciBsYSB0YXJlYSB5IHF1ZSBzZWEgbGxldmFkYSBhIGNhYm8gcG9yIGxhIG3DoXF1aW5hLiBVbiBzaXN0ZW1hL3Byb2dyYW1hIGRlIE1MIGVzIGVudHJlbmFkbyBtw6FzIHF1ZSBleHBsw61jaXRhbWVudGUgcHJvZ3JhbWFkby4KCgpVbiBlamVtcGxvIHB1ZWRlIGF5dWRhciBhIGVudGVuZGVybG86IMK/Q8OzbW8gc2UgZW5zZcOxYSBhIHVuIG5pw7FvIHF1w6kgZXMgdW4gZ2F0byB5IHF1w6kgZXMgdW4gcGVycm8/IE5vIHNlIGxlIHByb3ZlZSBkZSByZWdsYXMsIG5vIHNlIGxlIGRpY2UsIG1pcmEgdW4gZ2F0byB0aWVuZSBkb3Mgb3JlamFzIHB1bnRpYWd1ZGFzLCBiaWdvdGVzLCBjb2xhIHkgY3VhdHJvIHBhdGFzOyBnZW5lcmFsbWVudGUgc2UgbGUgZW5zZcOxYSBhbCBuacOxbyBjb24gZWplbXBsb3MsIHNlIGxlIGVuc2XDsWFuIGZvdG9zIGRlIGdhdG9zIHkgcGVycm9zIHkgZXMgZWwgcHJvcGlvIG5pw7FvIHF1aWVuIGFwcmVuZGUgbGFzIHJlZ2xhcyBkZSBmb3JtYSBxdWUgc2luIHF1ZSBuYWRpZSBsZSBkaWdhIG5hZGEsIGN1YW5kbyB2ZSB1biBnYXRvIHBvciBsYSBjYWxsZSBsbyBpZGVudGlmaWNhLCBxdWl6w6FzIGFsIHByaW5jaXBpbyBzZSBlcXVpdm9jYSBwZXJvIGNvbmZvcm1lIHNlIGxlIGRhbiBtw6FzIGVqZW1wbG9zIGFjYWJhIGFwcmVuZGllbmRvIGEgcmVjb25vY2VyL2V0aXF1ZXRhciBhIGxvcyBnYXRvcy4gQ29uZm9ybWUgZWwgbmnDsW8gcHJhY3RpY2EsIGNhZGEgdmV6IGxvIGhhY2UgbWVqb3I7IGVzIGRlY2lyLCBhcHJlbmRlLiBMbyBxdWUgZXMgZGVzdGFjYWJsZSBlcyBxdWUgbm8gZXMgbmVjZXNhcmlvIGVuc2XDsWFyIG5pbmd1bmEgcmVnbGEgYWwgbmnDsW87IGVzIGRlY2lyLCBwYXJlY2UgcXVlIGxvcyBodW1hbm9zIHRlbmVtb3MgImRlIHNlcmllIiBtZWNhbmlzbW9zIGRlIGNsYXNpZmljYWNpw7NuLCBwb2RlbW9zIGluZmVyaXIgcmVnbGFzIGRlIGNsYXNpZmljYWNpw7NuLCByZWdsYXMgcXVlIHVzYW1vcyBwZXJvIHF1ZSBub3MgZXMgZGlmw61jaWwgZGVzY3JpYmlyLiAKCgpFc3RlIGVzIGVsIGVuZm9xdWUgcXVlIHV0aWxpemEgZWwgTUwsIG5vIHNlIHByb2dyYW1hbiBsYXMgcmVnbGFzIChvIGNhcmFjdGVyw61zdGljYXMpIGRlbCBwcm9ibGVtYSBvIGN1ZXN0acOzbiBhIGFuYWxpemFyIChpZGVudGlmaWNhciBnYXRvcyksIHNpbm8gcXVlIHNlIGxlIHByb3ZlZSBkZSBkYXRvcyAoZm90b3MgZGUgZ2F0b3MgeSBkZSBwZXJyb3MpIGNvcnJlY3RhbWVudGUgZXRpcXVldGFkYXMgeSBtZWRpYW50ZSB0w6ljbmljYXMgZXN0YWTDrXN0aWNhcy9hbGdvcml0bW9zIMOpbCBzw7NsbyBlbmN1ZW50cmEgbGFzIHJlZ2xhcyBwYXJhIGRpZmVyZW5jaWFyIGVudHJlIHBlcnJvcyB5IGdhdG9zLiBVbmEgdmV6IGVsIHByb2dyYW1hL29yZGVuYWRvciBoYSBlbmNvbnRyYWRvIGxhcyByZWdsYXMsIHNlIGxlICBwdWVkZW4gcGFzYXIgbnVldmFzIGZvdG9zIGRlIHBlcnJvcyB5IGdhdG9zIChlc3TDoSB2ZXogc2luIGV0aXF1ZXRhcikgeSDDqWwgbGFzIGV0aXF1ZXRhcsOhLiBFbiBjaWVydGEgZm9ybWEgZWwgb3JkZW5hZG9yIGhhIGFwcmVuZGlkbyBkZSBsb3MgZGF0b3MgeSBzYWJlIGRpZmVyZW5jaWFyIGdhdG9zIGRlIHBlcnJvcy4gRXN0YSBjYXBhY2lkYWQgZGUgZ2VuZXJhbGl6YXIsIGRlIGFwbGljYXIgbG9zIGNvbm9jaW1pZW50b3MgYWRxdWlyaWRvcyBhIHRyYXbDqXMgZGUgbGEgZm9ybWFjacOzbiBhIGVqZW1wbG9zIHkgc2l0dWFjaW9uZXMgbnVldm9zLCBlcyB1bmEgY2FyYWN0ZXLDrXN0aWNhIGNsYXZlIHRhbnRvIGRlbCBhcHJlbmRpemFqZSBodW1hbm8gY29tbyBkZWwgYXByZW5kaXphamUgYXV0b23DoXRpY28uIFBvciBzdXB1ZXN0bywgZWwgYXByZW5kaXphamUgaHVtYW5vIGVzIG11Y2hvIG3DoXMgc29maXN0aWNhZG8gcXVlIGxvcyBhbGdvcml0bW9zIG3DoXMgYXZhbnphZG9zIGRlIGFwcmVuZGl6YWplIGF1dG9tw6F0aWNvLCBwZXJvIGxhcyBjb21wdXRhZG9yYXMgdGllbmVuIGxhIHZlbnRhamEgZGUgdGVuZXIgbWF5b3IgY2FwYWNpZGFkIHBhcmEgZWwgcHJvY2VzYWRvIGRlIGRhdG9zLiAKCkxvcyBjaWVudMOtZmljb3MgcXVlIHRyYWJhamFuIGVsIGNhbXBvIGRlbCBNTC9ETCB1dGlsaXphbiB0w6ljbmljYXMgZGUgTUwgcGFyYSBlbGFib3JhciBhcGxpY2FjaW9uZXMgbyBwcm9ncmFtYXMgcXVlIGZ1bmNpb25lbiBwYXJhIHJlc29sdmVyL2hhY2VyIHVuYSB0YXJlYSBjb25jcmV0YSwgY29tbyBwb3IgZWplbXBsbyBkZXRlY3RhciBzcGFtLCBzdWdlcmlyIHVuYSBydXRhIGRlIHRyw6FmaWNvLCBjbGFzaWZpY2FyIHVuYSBpbWFnZW4sIHRyYWR1Y2lyIHVuIHRleHRvLCByZWNvbm9jZXIgZWwgbGVuZ3VhamUgaGFibGFkbywgZXRjLi4uIFtBcXXDrV0oaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1rb3BvTHp2aDVqWSkgcHVlZGVzIHZlciBhIGRvcyBpbnRlbGlnZW5jaWFzIGFydGlmaWNpYWxlcyBhcHJlbmRpZW5kbyBhIGp1Z2FyIGFsIGVzY29uZGl0ZS4gRGVzcHXDqXMgZGUgdW5hcyBjdWFudG9zIG1pbGxvbmVzIGRlIHBhcnRpZGFzIGhhbiBhcHJlbmRpZG8gYmFzdGFudGUgYmllbiwgaW5jbHVzbyBhIGNvbGFib3JhciBwYXJhIGVzY29uZGVyc2UgbWVqb3IgRW4gW2VzdGUgYXJ0w61jdWxvXShodHRwczovL3d3dy50ZWNobm9sb2d5cmV2aWV3LmNvbS9zLzYxNDMyNS9vcGVuLWFpLWFsZ29yaXRobXMtbGVhcm5lZC10b29sLXVzZS1hbmQtY29vcGVyYXRpb24tYWZ0ZXItaGlkZS1hbmQtc2Vlay1nYW1lcy8pIGxvIGV4cGxpY2FuIHVuIHBvY28uCgpFbiBlbCBjYW1wbyBkZWwgTUwvREwgc2UgdXRpbGl6YW4gdMOpY25pY2FzIGVzdGFkw61zdGljYXMvYWxnb3JpdG1vcyBkZSBhcHJlbmRpemFqZS4gSGF5IG11Y2hvcyB0aXBvcyBkZSBlbGxvcy4gTGEgZWxlY2Npw7NuIGRlbCBtw6FzIGFkZWN1YWRvLCBkZXBlbmRlcsOhIGRlbCB0aXBvIGRlIHRhcmVhIHF1ZSBzZSBxdWllcmEgcmVzb2x2ZXIgZW4gY2FkYSBjYXNvLiBQb3IgZWplbXBsbywgcG9kZW1vcyBoYWJsYXIgZGUgYWxnb3JpdG1vcyBkZSBjbGFzaWZpY2FjacOzbiBjb21vIGxvcyDDoXJib2xlcyBkZSBkZWNpc2nDs24sIG8gTmHDr3ZlIEJheWVzLCBhbGdvcml0bW9zIGRlIHJlZ3Jlc2nDs24sIGRlIGNsdXN0ZXJpbmcsIGRlIGFuw6FsaXNpcyBkZSBjb21wb25lbnRlcyBwcmluY2lwYWxlcywgcmVkZXMgbmV1cm9uYWxlcywgLi4uCgpDb24gTUwgbm8gbm9zIGVuY29udHJhcmVtb3MgY29uIG9yZGVuYWRvcmVzIHF1ZSBwaWVuc2FuIGVuIGVsIHNlbnRpZG8gaHVtYW5vLCBzb2xhbWVudGUgZXN0YXJlbW9zIHV0aWxpemFuZG8gZWwgcG9kZXIgZGUgY29tcHV0byBkZSBsb3Mgb3JkZW5hZG9yZXMgcGFyYSBvYnRlbmVyIGluZm9ybWFjacOzbiBhIHBhcnRpciBkZSB1biBjb25qdW50byBkZSBkYXRvczsgZW4gcmVhbGlkYWQgZXN0YW1vcyB1c2FuZG8gTUwgcGFyYSBkYXIgc2VudGlkbyBhIGxvcyBkYXRvc15bTGEgcGFsYWJyYSBsZWFybmluZyBvIGFwcmVuZGl6YWplIGluZHVjZSBhIGVycm9yIHBvcnF1ZSBubyBzaWduaWZpY2EgcXVlIHNlIGVuc2XDsWUgYSBsb3Mgb3JkZW5hZG9yZXMgYSBwZW5zYXIgY29tbyB1biBzZXIgaHVtYW5vLCBzaW5vIHF1ZSBiw6FzaWNhbWVudGUgY29uc2lzdGUgZW4gYXBsaWNhciBhbGdvcml0bW9zIGEgZGF0b3MgbWFzaXZvcyBwYXJhIGluZmVyaXIgcHJvYmFiaWxpZGFkZXMuXS4gTGFzIHTDqWNuaWNhcyBkZSBNTCBzZSBwdWVkZW4gYXBsaWNhciBhIG11Y2hvcyBjYW1wb3MsIGRlc2RlIGxhIHBvbMOtdGljYSBoYXN0YSBsYXMgbmV1cm9jaWVuY2lhcy4gRXMgdW5hIGhlcnJhbWllbnRhIHF1ZSBzZSBwdWVkZSBhcGxpY2FyIGEgbXVjaG9zIHByb2JsZW1hcy4gQ3VhbHF1aWVyIGNhbXBvIHF1ZSBuZWNlc2l0ZSBpbnRlcnByZXRhciB5IGFjdHVhciBzb2JyZSBsb3MgZGF0b3MgcHVlZGUgYmVuZWZpY2lhcnNlIGRlIGxhcyB0w6ljbmljYXMgZGUgYXByZW5kaXphamUgYXV0b23DoXRpY28uIERlIGhlY2hvLCBlc3RhcyB0w6ljbmljYXMsIHByaW5jaXBhbG1lbnRlIGxhcyBkZSBhcHJlbmRpemFqZSBwcm9mdW5kbywgc2UgZXN0w6FuIGNvbnZpcnRpZW5kbyBlbiBlbCBtb3RvciBxdWUgaW1wdWxzYSBsYSBlY29ub23DrWEgbW9kZXJuYSBiYXNhZGEgZW4gZGF0b3MgeSBwYXJhIHF1ZSBlc2UgbW90b3IgZnVuY2lvbmUgc2UgbmVjZXNpdGEgImVuZXJnw61hIiwgeSBsYSBlbmVyZ8OtYSBsYSBwcm9wb3JjaW9uYW4gbG9zIGRhdG9zLiBFbiBlc2Ugc2VudGlkbyBzZSBkaWNlIHF1ZSBsb3MgZGF0b3Mgc29uIGVsIG51ZXZvIHBldHJvbGVvLiBMbyBpbXBvcnRhbnRlIG5vIHNvbiB0YW50byBsYXMgdMOpY25pY2FzLCBzaW5vIGxvcyBkYXRvcyBxdWUgYWxpbWVudGFuIGEgbG9zIGFsZ29yaXRtb3MuCgpMYXMgdMOpY25pY2FzIGRlIE1ML0RMIGVzZW5jaWFsbWVudGUgc2lydmVuIHBhcmEgaGFjZXIgKipwcmVkaWNjaW9uZXMqKiwgZW4gZ2VuZXJhbCwgbm8gcGVybWl0ZW4gb2J0ZW5lciBsYSBjYXVzYSBkZSBhbGdvLiBMb3MgZGF0b3MgbWFzaXZvcyB0cmF0YW4gZGVsIHF1w6ksIG5vIGRlbCBwb3JxdcOpLiBObyBzZSBvYnRpZW5lbiByZWxhY2lvbmVzIGRlICoqY2F1c2FsaWRhZCoqIHNpbm8gY29ycmVsYWNpb25lcyBvIGFzb2NpYWNpb25lcy4gQnVlbm8gLi4uIGEgdG9kb3Mgbm9zIGd1c3RhIGNvbm9jZXIgbGFzIGNhdXNhcywgc29icmUgdG9kbyBhIGxvcyBpbnZlc3RpZ2Fkb3JlcywgcGVybywgcXVpesOhcywgbXVjaGFzIHZlY2VzIGVzdG8gbm8gc2VhIGFic29sdXRhbWVudGUgbmVjZXNhcmlvIHkgYXVucXVlIGVzdG8gY2hvcXVlIGNvbiBsYXMgcHLDoWN0aWNhcyBlc3RhYmxlY2lkYXMgaGFjZSBzaWdsb3MgeSBjb24gbnVlc3RyYSBjb21wcmVuc2nDs24gbcOhcyBlbGVtZW50YWwgc29icmUgY29tbyB0b21hciBkZWNpc2lvbmVzIHkgYXByZWhlbmRlciBsYSByZWFsaWRhZC4gU2llbmRvIHVuIHBvY28gYWJvZ2FkbyBkZWwgZGlhYmxvLCBubyBzaWVtcHJlIG5lY2VzaXRhbW9zIHNhYmVyIGxhIGNhdXNhOyBhZGVtw6FzLCBlbCBtw6l0b2RvIGNpZW50w61maWNvIHRyYWRpY2lvbmFsIHNlIGxpbWl0YWJhIGEgY29udHJhc3RhciB1biBsaW1pdGFkbyBuw7ptZXJvIGRlIGhpcMOzdGVzaXMgbWllbnRyYXMgcXVlIGNvbiBsYXMgdMOpY25pY2FzIGRlIE1ML0RMIGVsIGVuZm9xdWUgY29uc2lzdGUsIGVuIGNpZXJ0YSBmb3JtYSwgZW4gZGVqYXIgcXVlIGxvcyBkYXRvcyBoYWJsZW4gcG9yIHNpIG1pc21vcy4KCgoKUmVzcGVjdG8gYWwgKipEZWVwIExlYXJuaW5nKiosIHNpbXBsZW1lbnRlIHZvbHZlciBhIGRlY2lyIHF1ZSBlcyB1biBzdWJjb25qdW50byBkZWwgTUwuIFNvbiB0w6ljbmljYXMgbcOhcyBjb21wbGVqYXMgZW4gdMOpcm1pbm9zIGNvbXB1dGFjaW9uYWxlcyB5IHBvciBsbyB0YW50byBuZWNlc2l0YW4gcGFyYSBhcHJlbmRlciB1biBtYXlvciB2b2x1bWVuIGRlIGRhdG9zLCBwZXJvIHN1IGZpbG9zb2bDrWEgZXMgbGEgbWlzbWE6IHByb3ZlZXIgZGUgZGF0b3MgcGFyYSBxdWUgZWwgb3JkZW5hZG9yIGFwcmVuZGEgYSByZXNvbHZlciB5IGF1dG9tYXRpemFyIHVuYSB0YXJlYSBjb25jcmV0YS4gVXRpbGl6YW4gYWxnb3JpdG1vcyBtw6FzIGNvbXBsZWpvcyBvIGNvbiBtw6FzIGVsZW1lbnRvcyBvIGNhcGFzLiBQcsOhY3RpY2FtZW50ZSB0b2RhcyBsYXMgYXBsaWNhY2lvbmVzIGV4aXRvc2FzIHV0aWxpemFuIHTDqWNuaWNhcyBkZSBETCwgeSBnZW5lcmFsbWVudGUgYWxnb3JpdG1vcyBiYXNhZG9zIGVuIHJlZGVzIG5ldXJvbmFsZXMuCgpPcyBkZWpvIGFsZ3VuYXMgaWRlYXMgZnJhc2VzIHNvYnJlIERMIHByb3ZlbmllbnRlcyBkZSBbZXN0ZSBmYW50w6FzdGljbyBhcnTDrWN1bG9dKGh0dHBzOi8vZW1wcmVzYXMuYmxvZ3RoaW5rYmlnLmNvbS9hdHJldmV0ZS1jb24tZWwtZGVlcC1sZWFybmluZy8pOgoKLSBFbCBEZWVwIExlYXJuaW5nIGVzIHVuYSBkZSBsYXMgw6FyZWFzIGRlIGludmVzdGlnYWNpw7NuIG3DoXMgcG9wdWxhcmVzIGRlbnRybyBkZWwgY2FtcG8gZGUgbGEgSW50ZWxpZ2VuY2lhIEFydGlmaWNpYWwgZW4gbG9zIMO6bHRpbW9zIGHDsW9zIHBvcnF1ZSwgZ3JhY2lhcyBhIGVzdGFzIHTDqWNuaWNhcywgY29zYXMgY29tbyBsYSB2aXNpw7NuIGFydGlmaWNpYWwgbyBlbCBwcm9jZXNhbWllbnRvIGRlbCBsZW5ndWFqZSBuYXR1cmFsIGhhbiBzYWx0YWRvIGRlbCDDoW1iaXRvIGRlIGxhIGNpZW5jaWEgZmljY2nDs24gYSBsYSByZWFsaWRhZC4KCi0gRWwgRGVlcCBMZWFybmluZyBlcyB0YW4gaW1wb3J0YW50ZSBwb3JxdWUgZXN0w6EgcGVybWl0aWVuZG8gcmVzb2x2ZXIgZGUgZm9ybWEgbcOhcyBmw6FjaWwgeSBlZmljaWVudGUgdW4gZ3JhbiBuw7ptZXJvIGRlIHByb2JsZW1hcy4gUG9yIHVuYSBwYXJ0ZSwgcmVhbGl6YSBkZSBmb3JtYSBhdXRvbcOhdGljYSB1bmEgZGUgbGFzIHRhcmVhcyBtw6FzIGNvbXBsZWphcyBkZWwgcHJvY2VzbyBkZSB0cmFiYWpvIGRlIE1hY2hpbmUgTGVhcm5pbmc6IGxhIGluZ2VuaWVyw61hIGRlIGF0cmlidXRvc15bZW4gTUwvREwgY3VhbmRvIGhhYmxhbiBkZSBhdHJpYnV0b3Mgc2UgcmVmaWVyZW4sIG3DoXMgbyBtZW5vcywgYWwgdGVybWlubyByZWdyZXNvcmVzIGVuIEVjb25vbWV0csOtYV0uIExhcyByZWRlcyBuZXVyb25hbGVzIHNlbGVjY2lvbmFuIGRlIGZvcm1hIGF1dG9tw6F0aWNhIHF1w6kgYXRyaWJ1dG9zIHNvbiBsb3MgcmVsZXZhbnRlcyB5IGN1w6FsZXMgc2UgcHVlZGVuIGRlc2VjaGFyLiAKCi0gT3RyYSBkZSBsYXMgZ3JhbmRlcyB2ZW50YWphcyBkZSB0cmFiYWphciBjb24gcmVkZXMgbmV1cm9uYWxlcyBlcyBxdWUgcGVybWl0ZW4gdHJhYmFqYXIgY29uIGN1YWxxdWllciB0aXBvIGRlIGlucHV0LiBDdWFscXVpZXJhOiBuw7ptZXJvcywgaW3DoWdlbmVzLCBzb25pZG9zLCB0ZXh0b3MsIHNlcmllcyB0ZW1wb3JhbGVzLiBUZW5pZW5kbyBlbiBjdWVudGEgcXVlIGxvcyBkYXRvcyBubyBlc3RydWN0dXJhZG9zLCBhcXVlbGxvcyBxdWUgbm8gZW5jYWphbiBlbiBsYSBlc3RydWN0dXJhIHRyYWRpY2lvbmFsIGZpbGFzL2NvbHVtbmFzIGRlIGxhcyBiYXNlcyBkZSBkYXRvcyByZWxhY2lvbmFsZXMsIHN1cG9uZW4gbcOhcyBkZSB1biA5MCUgZGUgdG9kb3MgbG9zIGRhdG9zIGdlbmVyYWRvcywgZXMgZsOhY2lsIGNvbXByZW5kZXIgbGEgaW1wb3J0YW5jaWEgZGUgcG9kZXIgbWFuZWphcmxvcyBkZSBmb3JtYSBlZmljaWVudGUuIEVzdGFtb3MgaGFibGFuZG8gZGUgZGF0b3MgY29tbyBtZW5zYWplcyBkZSBjb3JyZW8sIHbDrWRlb3MsIGZpY2hlcm9zIGRlIGF1ZGlvLCBww6FnaW5hcyB3ZWIsIG1lbnNhamVzIGVuIHJlZGVzIHNvY2lhbGVzIGV0Yy4KCi0gVW5hIHJlZCBuZXVyb25hbCBlbnRyZW5hZGEgY29uIGRhdG9zIGV0aXF1ZXRhZG9zLCB0YW1iacOpbiBzZSBwdWVkZSBhcGxpY2FyIGEgZGF0b3Mgbm8gZXN0cnVjdHVyYWRvcywgbG8gY3VhbCBsZXMgZGEgYSBsb3MgYWxnb3JpdG1vcyBkZSBEZWVwIExlYXJuaW5nIHVuYSBncmFuIHZlbnRhamEgcmVzcGVjdG8gYSBvdHJvcyBhbGdvcml0bW9zIGFsIHBvbmVyIGEgc3UgZGlzcG9zaWNpw7NuIHVuIHZvbHVtZW4gZGUgZGF0b3MgZGUgZW50cmVuYW1pZW50byBtdWNobyBtYXlvci4gQWxnb3JpdG1vcyBubyBtdXkgYnVlbm9zIGVudHJlbmFkb3MgY29uIGVub3JtZXMgY29uanVudG9zIGRlIGRhdG9zIHB1ZWRlbiBkYXIgbWVqb3JlcyByZXN1bHRhZG9zIHF1ZSBidWVub3MgYWxnb3JpdG1vcyBlbnRyZW5lbW9zIGNvbiBjb25qdW50b3MgZGUgZGF0b3MgcmVkdWNpZG9zLiBEZSBoZWNobywgbWllbnRyYXMgZW4gZWwgY2FzbyBkZSBsb3MgYWxnb3JpdG1vcyB0cmFkaWNpb25hbGVzIHVzYWRvcyBlbiBNYWNoaW5lIExlYXJuaW5nIGxsZWdhIHVuIG1vbWVudG8gZW4gZWwgdW4gbWF5b3Igdm9sdW1lbiBkZSBkYXRvcyBubyBpbXBsaWNhIHVuIG1lam9yIHJlbmRpbWllbnRvLCBlbiBlbCBjYXNvIGRlbCBEZWVwIExlYXJuaW5nIG5vIG9jdXJyZSBhc8OtLiBFbCByZW5kaW1pZW50byBubyBkZWphIGRlIGNyZWNlciwgc2Vnw7puIGxvIGhhY2VuIGVsIHZvbHVtZW4gZGUgZGF0b3MgeSBlbCBuw7ptZXJvIGRlIGNhcGFzIGRlbCBtb2RlbG8uCgoKQ29tbyB5YSBzYWLDqWlzLCBhdW5xdWUgZWwgY3Vyc28gdGllbmUgdW4gdGVtYSBzb2JyZSBNTCwgZWwgdGVyY2VybywgZW4gZWwgcXVlIHNlIGhhcsOhIHVuYSBpbnRyb2R1Y2Npw7NuIGEgbGEgdGVybWlub2xvZ8OtYSB5IHByaW5jaXBhbGVzIG3DqXRvZG9zIGRlbCBNTCwgZW4gcmVhbGlkYWQgZWwgY3Vyc28gbm8gZXN0w6Egb3JpZW50YWRvIGFsIE1MLCBuaSBtdWNobyBtZW5vcyBhbCBETCwgc2lubyBxdWUgZXN0w6EgbcOhcyBvcmllbnRhZG8gYSBzZXIgdW5hIGludHJvZHVjY2nDs24gYSBsYSBjaWVuY2lhIGRlIGRhdG9zIChEUykuCgrCv1F1ZSBxdcOpIGVzIGxhIENpZW5jaWEgZGUgZGF0b3M/IFB1ZXMgdm95IGEgdHJhdGFyIGRlIGV4cGxpY2FybG8gZW4gZWwgc2lndWllbnRlIGFwYXJ0YWRvLgoKCgojIyAzLiBDaWVuY2lhIGRlIERhdG9zCgpDb21vIHNlIGRpam8gZW4gZWwgcHJlZmFjaW8sIERTIGVzIHVuYSBudWV2YSBkaXNjaXBsaW5hXltBdW5xdWUgZWwgdMOpcm1pbm8gQ2llbmNpYSBkZSBkYXRvcyBzZSByZW1vbnRhLCBzZWfDum4gbGEgV2lraXBlZGlhIGFsIG1lbm9zIGEgcHJpbmNpcGlvcyBkZSBsb3MgNzBdIHF1ZSBzZSBpbmNvcnBvcmEgcG9jbyBhIHBvY28sIHBlcm8gY29uIG11Y2hhIGZ1ZXJ6YSwgYSBsYSBtYXlvcsOtYSBkZSBwbGFuZXMgZGUgZXN0dWRpbywgaW5jbHVpZGEgbGEgRWNvbm9tw61hLiBQb3IgZWplbXBsbywgW2VzdGUgTcOhc3RlciBkZSBsYSBMU0VdKGh0dHA6Ly93d3cubHNlLmFjLnVrL3N0dWR5LWF0LWxzZS9HcmFkdWF0ZS9EZWdyZWUtcHJvZ3JhbW1lcy0yMDE5L01TYy1EYXRhLVNjaWVuY2UpLiAKCgoKwr9EZSBxdcOpIHNlIG9jdXBhIGxhIGNpZW5jaWEgZGUgZGF0b3M/IFB1ZXMgcHVlZGUgdGVuZXIgdmFyaWFzIHJlc3B1ZXN0YXMsIHBlcm8gZW4gZGVmaW5pdGl2YSBlbCBvYmpldGl2byDDumx0aW1vIGRlIGxhIGNpZW5jaWEgZGUgZGF0b3MgZXMgdHJhbnNmb3JtYXIgbG9zIGRhdG9zIGVuIGluZm9ybWFjacOzbiBjb24gc2VudGlkby4gQWxndW5vcyBkaXLDoW4sIHBlcm8gc8OtIGVzZSBlcyBlbCBvYmpldGl2byBkZSBsYSBFc3RhZMOtc3RpY2EuIFPDrSwgZXMgY2llcnRvLCB0cmFuc2Zvcm1hciBkYXRvcyBlbiBpbmZvcm1hY2nDs24gZXMsIHkgaGEgc2lkbyBzaWVtcHJlLCBlbCBvYmpldGl2byDDumx0aW1vIGRlIGxhIGVzdGFkw61zdGljYSwgUEVSTyBsbyBxdWUgaGFiaXR1YWxtZW50ZSBjb25vY2Vtb3MgcG9yIEVzdGFkw61zdGljYSBzZSBmdWUgY29uZm9ybWFuZG8gY29uIGVsIHBhc28gZGUgbG9zIGHDsW9zIGVuIHVuIGNvbnRleHRvIGVuIGVsIHF1ZSBjb25zZWd1aXIgZGF0b3MgZXJhIGRpZsOtY2lsLCBhc8OtIHF1ZSBzZSBkZXNhcnJvbGxhcm9uIG3DqXRvZG9zIHkgdMOpY25pY2FzIGFwcm9waWFkYXMgcGFyYSBleHRyYWVyIGVsIG3DoXhpbW8gZGUgaW5mb3JtYWNpw7NuIGNvbiBtdWVzdHJhcyBkZSByZWR1Y2lkbyB0YW1hw7FvLiBFbCBjb250ZXh0byBoYSBjYW1iaWFkbywgdml2aW1vcyByb2RlYWRvcyBkZSBkYXRvcywgZGUgbWF5b3Igdm9sdW1lbiB5IHZhcmllZGFkLCBsbyBxdWUgcHJvdm9jYSBudWV2b3MgcmV0b3MgYSBsb3MgYW5hbGlzdGFzLCB5IHRlbmVtb3MgbWF5b3IgY2FwYWNpZGFkIGRlIGNvbXB1dG8sIHBvciBsbyBxdWUgYSB2ZWNlcyB5YSBubyBoYXkgcXVlIHV0aWxpemFyIGFwcm94aW1hY2lvbmVzIGFzaW50w7N0aWNhc15bVW5hIHZlcnNpw7NuIG3DoXMgYW1wbGlhIHkgZnVuZGFtZW50YWRhIGRlIGVzdGFzIGlkZWFzIHB1ZWRlIGVuY29udHJhcnNlIFthcXXDrV0oaHR0cHM6Ly9tZHNyLWJvb2suZ2l0aHViLmlvL21kc3IyZS9jaC1wcm9sb2d1ZS5odG1sKV0uIExhIEFtZXJpY2FuIFN0YXRpc3RpY2FsIEFzb2NpYXRpb24gKEFTQSkgZGVzdGFjYSBsYSBpbXBvcnRhbmNpYSBkZSBsYSBFc3RhZMOtc3RpY2EgZW4gRFMsIHBlcm8gcmVjb25vY2UgZW4gW2VzdGUgc3RhdGVtZW50XShodHRwczovL21hZ2F6aW5lLmFtc3RhdC5vcmcvYmxvZy8yMDE1LzEwLzAxL2FzYS1zdGF0ZW1lbnQtb24tdGhlLXJvbGUtb2Ytc3RhdGlzdGljcy1pbi1kYXRhLXNjaWVuY2UvKSBsYSBkaWZlcmVuY2lhIGVudHJlIERTIHkgZXN0YWTDrXN0aWNhLgoKCgpObyBlcyBlc3RyaWN0YW1lbnRlIGNpZXJ0bywgcGVybyBwb2RlbW9zIHBlbnNhciBxdWUgbGEgZXN0YWTDrXN0aWNhIHRyYWRpY2lvbmFsIHNlIGNvbmNlbnRyYSBwcmluY2lwYWxtZW50ZSBlbiBsYXMgdMOpY25pY2FzIG8gbcOpdG9kb3MgZXN0YWTDrXN0aWNvcywgYWRlbcOhcyBkYWRvIGVsIGNvbnRleHRvIGRlIGVzY2FzZXogZGUgZGF0b3MsIGVuIHVuIHRpcG8gZGV0ZXJtaW5hZG8gZGUgdMOpY25pY2FzOyBzaW4gZW1iYXJnbyBsYSDDs3B0aWNhIGRlIGxhIGNpZW5jaWEgZGUgZGF0b3MgZXMgbcOhcyBhbXBsaWEuIEVuIENpZW5jaWEgZGUgZGF0b3Mgc2UgdXNhbiB5IG5lY2VzaXRhbiB0w6ljbmljYXMgZXN0YWTDrXN0aWNhcywgcGVybyBlbCBlbmZvcXVlIGVzIG3DoXMgZ2xvYmFsOiBzZSBoYWNlIMOpbmZhc2lzIGVuIHF1ZSBlbCBwcm9jZXNvIGRlIGFuw6FsaXNpcyBkZSBkYXRvcyBjb21pZW56YSBkZXNkZSBxdWUgc2UgcmVjb3BpbGFuIGxvcyBkYXRvcyBoYXN0YSBxdWUgc2UgcHJlc2VudGFuIGxvcyByZXN1bHRhZG9zXltUYWwgY29tbyBhcmd1bWVudGEgW2VzdGUgcG9zdF0oaHR0cHM6Ly93d3cuYnJvZHJpZ3Vlcy5jby9ibG9nLzIwMjAtMTEtMDUtcmV0aXJlX2RhdGFfc2NpZW5jZS8pLCBsYSBhcGFyZW50ZSBkaWNvdG9tw61hIGVudHJlIGVzdGFkw61zdGljYSB5IGNpZW5jaWEgZGUgZGF0b3Mgc2UgcmVkdWNpcsOhIGNvbiBlbCB0aWVtcG8uXS4gRWwgc2lndWllbnRlIGRpYWdyYW1hIGlsdXN0cmEgZXN0ZSBwcm9jZXNvOgoKCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBvdXQud2lkdGggPSAiOTAlIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1hZ2VuZXMiLCAidHRfMDFfaW1nXzAyX0RTLXdvcmtmbG93LnBuZyIpLCBkcGkgPSAxNTApIApgYGAKCgoKRW4gbGEgQ2llbmNpYSBkZSBkYXRvcywgZXRhcGFzIGNvbW8gZWwgcHJvY2VzYWRvIHkgbGltcGllemEgZGUgZGF0b3MgbyBlbCBhbsOhbGlzaXMgZ3LDoWZpY28sIHF1ZSBvY3VwYWJhbiB1biBsdWdhciBzZWN1bmRhcmlvIGN1YW5kbyBubyBtYXJnaW5hbCBlbiBsb3MgbGlicm9zIHRyYWRpY2lvbmFsZXMgZGUgZXN0YWTDrXN0aWNhIHNlIGhhbiBjb252ZXJ0aWRvIGVuIHBhcnRlcyBmdW5kYW1lbnRhbGVzIGRlbCB0cmFiYWpvIGRlIHVuIGNpZW50w61maWNvIGRlIGRhdG9zLiAKCgpObyBzb2xvIHNlIGNvbnNpZGVyYSBlbCBhbsOhbGlzaXMgZGUgZGF0b3MgY29tbyB1biBwcm9jZXNvIG3DoXMgZ2xvYmFsIGNvbXB1ZXN0byBkZSB2YXJpYXMgZXRhcGFzLCBzaW5vIHF1ZSBkYWRhIGxhIGNvbXBsZWppZGFkLCB2b2x1bWVuIHkgdmFyaWVkYWQgZGUgbG9zIGRhdG9zIGFjdHVhbGVzIHNlIG5lY2VzaXRhIHVuIGZ1ZXJ0ZSBjb21wb25lbnRlIHRlY25vbMOzZ2ljbyBnZW5lcmFsbWVudGUgYXBveWFkbyBlbiBsb3Mgb3JkZW5hZG9yZXMgeSBsYSBwcm9ncmFtYWNpw7NuLiBObyBzZSBwdWVkZSwgbyBlcyBleHRyZW1hZGFtZW50ZSBjb21wbGljYWRvLCBoYWNlciBjaWVuY2lhIGRlIGRhdG9zIHNpbiBzYWJlciBwcm9ncmFtYXIuIEFkZW3DoXMgZW4gbGEgY2llbmNpYSBkZSBkYXRvcyBzZSBkYSB1bmEgZ3JhbiBpbXBvcnRhbmNpYSBhbCBjb250ZXh0byBlbiBlbCBxdWUgc2UgaGFjZSBEYXRhIFNjaWVuY2UsIGVuIGNpZXJ0YSBmb3JtYSBzZSByZWNvbm9jZSBxdWUgaGFjZSBmYWx0YSBzYWJlciBFY29ub23DrWEgcGFyYSBoYWNlciBjaWVuY2lhIGRlIGRhdG9zIGVuIGVsIGNhbXBvIGRlIGxhIGVjb25vbcOtYS4KCkxhIHNpZ3VpZW50ZSBpbmZvZ3JhZsOtYSBwdWVkZSBpbHVzdHJhciBlc3RhIGlkZWEsIG1vc3RyYW5kbyBxdWUsIGlkZWFsbWVudGUsIHBhcmEgaGFjZXIgRFMgc2UgcmVxdWllcmVuLCBhbCBtZW5vcywgdHJlcyB0aXBvcyBkZSBjb21wZXRlbmNpYXMgbyBjb25vY2ltaWVudG9zOiAxKSBtYXRlbcOhdGljYXMgeSBlc3RhZMOtc3RpY2EsIDIpIHRlY25vbG9nw61hIHkgcHJvZ3JhbWFjacOzbiB5IDMpIGNvbm9jaW1pZW50b3MgZGVsIGNhbXBvIGRlIGFwbGljYWNpw7NuLiBFbiBbZXN0ZSBwb3N0XShodHRwOi8vZHJld2NvbndheS5jb20vemlhLzIwMTMvMy8yNi90aGUtZGF0YS1zY2llbmNlLXZlbm4tZGlhZ3JhbSkgZXhwbGljYW4gZWwgZGlhZ3JhbWEgZW4gZGV0YWxsZSwgcG9yIGVqZW1wbG8sIHF1w6kgZXMgbGEgIkRhbmdlciBab25lIi4KCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBvdXQud2lkdGggPSAiNDAlIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1hZ2VuZXMiLCAidHRfMDFfaW1nXzAzX0RTLnBuZyIpKSAKYGBgCgpFbiBbZXN0ZSBwb3N0XShodHRwczovL21lZGl1bS5jb20vQE9EU0MvZGF0YS1zY2llbmNlLWluLW1hbnVmYWN0dXJpbmctYW4tb3ZlcnZpZXctZTZkNjQ4YmY5YzA4KSBkZXNhcnJvbGxhbiBlc3RhcyBpZGVhcyBlbiBlbCBjb250ZXh0byBjb25jcmV0byBkZSBsYSBpbmR1c3RyaWEgbWFudWZhY3R1cmVyYSB5IGhhY2VuIHVuIGxpc3RhZG8gZGUgcG90ZW5jaWFsZXMgdXNvcyBkZSBsYSBEUyBlbiBlbCBjYW1wbyBkZSBsYXMgbWFudWZhY3R1cmFzLiBFbiBbZXN0ZSBvdHJvIHBvc3RdKGh0dHA6Ly92YXJpYW5jZWV4cGxhaW5lZC5vcmcvci9kcy1tbC1haS8pIHB1ZWRlcyBlbmNvbnRyYXIgdW5hIHZpc2nDs24gZGUgbGEgRFMgdW4gcG9jbyBkaXN0aW50YSwgeWEgcXVlIGluY2lkZSBlbiBsYSBkaWZlcmVuY2lhcyBlbnRyZSBEUywgTUwgZSBJQS4gQ29tbyByZXN1bWVuIGRlbCBwb3N0OiAiRGF0YSBzY2llbmNlIHByb2R1Y2VzIGluc2lnaHRzLCBNYWNoaW5lIGxlYXJuaW5nIHByb2R1Y2VzIHByZWRpY3Rpb25zLCBBcnRpZmljaWFsIGludGVsbGlnZW5jZSBwcm9kdWNlcyBhY3Rpb25zIi4gRW4gZXN0ZSBbb3RybyBwb3N0XShodHRwczovL2Jsb2cucnN0dWRpby5jb20vMjAyMC8wNS8yNy9yb2xlLW9mLXRoZS1kYXRhLXNjaWVudGlzdC8pIGFyZ3VtZW50YW4gcXVlIGxvcyBjaWVudMOtZmljb3MgZGUgZGF0b3Mgc29uIG3DoXMgbmVjZXNhcmlvcyBxdWUgbnVuY2EgeSBxdWUgc3UgbGFib3Igbm8gcHVlZGUsIGFsIG1lbm9zIGRlIG1vbWVudG8sIHNlciByZWVtcGxhemFkYSBwb3IgcHJvY2Vzb3MgYXV0b21hdGl6YWRvcyB1c2FuZG8gdMOpY25pY2FzIGRlIE1MLgoKCkRvcyBkZWZpbmljaW9uZXMgc2VuY2lsbGFzIGRlIERTOgoKCi0gYEBZQnVobGA6IFRoaXMgcGhyYXNlIGJ5IGBAanVsaWVzcXVpZGAgaXMgd29ydGggcmV0d2VldGluZyBpdCBhbGwgb3ZlciBhZ2FpbjogCiJEYXRhIFNjaWVuY2UgaXMgbm90IGp1c3QgYWJvdXQgI0FJIG9yIG1hY2hpbmUgbGVhcm5pbmcuIEl0IGlzIHRoZSBkaXNjaXBsaW5lIG9mIHR1cm5pbmcgcmF3IGRhdGEgaW50byB1bmRlcnN0YW5kaW5nLiIgCgotIGBAVGlmZmFueVRpbWJlcnNgOiBUaGlua2luZyBhIGxvdCBhYm91dCB0aGUgZGVmaW5pdGlvbiBvZiAjRGF0YVNjaWVuY2UuIFRoZSBiZXN0IHRoYXQgSSBoYXZlIHJlYWQgc28gZmFyIGNvbWVzIGZyb20gYEByYWZhbGFiYDogInRoZSBwcm9jZXNzZXMgdXNlZCB0byBleHRyYWN0IHZhbHVlIGZyb20gZGF0YSIuIEkgdGhpbmsgd2Ugc2hvdWxkIGV4dGVuZCB0aGlzIGFuZCBzYXkgInRoZSByZXByb2R1Y2libGUgJiB0cmFuc3BhcmVudCBwcm9jZXNzZXMgdXNlZCB0byBleHRyYWN0IHZhbHVlIGZyb20gZGF0YSIKCgoKUG9yIMO6bHRpbW8sIDMgImRlZmluaWNpb25lcyIgZGUgRFMgbWVkaW8gZW4gYnJvbWE6CgotIFVuIGNpZW50w61maWNvIGRlIGRhdG9zIGVzIHVuIGVzdGFkw61zdGljbyBjb24gcGFqYXJpdGEKCi0gVW4gZXN0YWTDrXN0aWNvIHF1ZSB0cmFiYWphIGVuIFNhbiBGcmFuY2lzY28KCi0gQ2llbnTDrWZpY28gZGUgZGF0b3MgKG4pOiBQZXJzb25hIHF1ZSBzYWJlIG3DoXMgZGUgZXN0YWTDrXN0aWNhIHF1ZSBjdWFscXVpZXIgcHJvZ3JhbWFkb3IgeSBxdWUgYSBsYSB2ZXogc2FiZSBtw6FzIGRlIHByb2dyYW1hY2nDs24gcXVlIGN1YWxxdWllciBlc3RhZMOtc3RpY28KCgo8YnI+CgojIyMjIMK/RXMgZsOhY2lsIHNlciBjaWVudMOtZmljbyBkZSBkYXRvcz8gCgpQdWVzLCBjb21vIHRvZG8sIGRlcGVuZGUsIHBlcm8gc2kgcXVlIGhheSBxdWUgdGVuZXIgZW4gY3VlbnRhIHF1ZSBlcyB1biBjYW1wbyBlbiBjb250aW7DumEgZXZvbHVjacOzbi4gRXN0b3MgcG9zdCwgWzFdKGh0dHBzOi8vdG93YXJkc2RhdGFzY2llbmNlLmNvbS9ob3ctaXQtZmVlbHMtdG8tbGVhcm4tZGF0YS1zY2llbmNlLWluLTIwMTktNmVlNjg4NDk4MDI5KSwgWzJdKGh0dHBzOi8vbXVlc3RyZWFyLW5vLWVzLXBlY2Fkby5uZXRsaWZ5LmNvbS8yMDE5LzAyLzE4L2xhLW1vZGVybmlkYWQvKSB5IFszXShodHRwczovL2dpdGh1Yi5jb20vb2xpdmllcmdpbWVuZXovVGhpbmdzLWEtc2NpZW50aXN0LWlzLXN1cHBwb3NlZC10by1rbm93KSwgaW5jaWRlbiBlbiBsbyBlc3RyZXNhbnRlIHF1ZSBwdWVkZSBzZXIgbGEgdmlkYSBkZSB1biBjaWVudMOtZmljbyBkZSBkYXRvcyBxdWUgaW50ZW50ZSBlc3RhciBhbCBkw61hIGRlIGxhcyBjb250aW51b3MgY2FtYmlvcyB5IGV2b2x1Y2lvbmVzIGVuIGVzdGUgY2FtcG8uCgoKCgpQYXJlY2lkbyBhIGxvIHF1ZSBzdWdpZXJlIGVzdGUgdHdlZXQ6Cgo8YmxvY2txdW90ZSBjbGFzcz0idHdpdHRlci10d2VldCI+PHAgbGFuZz0iZW4iIGRpcj0ibHRyIj5XaHkgRGF0YSBTY2llbmNlIGlzIEhhcmTihKI8YnI+PGJyPihzbGlkZSB2aWEgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9icmFkdXJhbmk/cmVmX3NyYz10d3NyYyU1RXRmdyI+QGJyYWR1cmFuaTwvYT4gYXQgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL0xlYWREZXZBdXN0aW4/c3JjPWhhc2gmYW1wO3JlZl9zcmM9dHdzcmMlNUV0ZnciPiNMZWFkRGV2QXVzdGluPC9hPikgPGEgaHJlZj0iaHR0cHM6Ly90LmNvLzhRY1BsUk1henciPnBpYy50d2l0dGVyLmNvbS84UWNQbFJNYXp3PC9hPjwvcD4mbWRhc2g7IENhaXRsaW4gSHVkb27wn5Gp8J+PvArwn5K7IChAYmVlb25hcG9zeSkgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9iZWVvbmFwb3N5L3N0YXR1cy8xMDcwNzg3Mzk0Mjg5NDQ2OTEyP3JlZl9zcmM9dHdzcmMlNUV0ZnciPkRlY2VtYmVyIDYsIDIwMTg8L2E+PC9ibG9ja3F1b3RlPiA8c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly9wbGF0Zm9ybS50d2l0dGVyLmNvbS93aWRnZXRzLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+IAoKCjxicj4KCkF1bnF1ZSB0YW1iacOpbiBlc3TDoSBiaWVuIGRlc21pdGlmaWNhciB1biBwb2NvIHkgdG9tYXJzZSBsYXMgY29zYXMgbWVub3MgZW4gc2VyaW86CgoKCjxibG9ja3F1b3RlIGNsYXNzPSJ0d2l0dGVyLXR3ZWV0Ij48cCBsYW5nPSJlbiIgZGlyPSJsdHIiPkxvdmUgZGF0YSBzY2llbmNlIDxhIGhyZWY9Imh0dHBzOi8vdC5jby9SWjE4amFPSlJRIj5waWMudHdpdHRlci5jb20vUloxOGphT0pSUTwvYT48L3A+Jm1kYXNoOyBUaW0gSG9wcGVyIChAdGRob3BwZXIpIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vdGRob3BwZXIvc3RhdHVzLzczMDQyNTYzMjg2MjA0NDE2MT9yZWZfc3JjPXR3c3JjJTVFdGZ3Ij5NYXkgMTEsIDIwMTY8L2E+PC9ibG9ja3F1b3RlPiA8c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly9wbGF0Zm9ybS50d2l0dGVyLmNvbS93aWRnZXRzLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+IAoKCjxicj4KCkNvbW8gc3VnaWVyZSBlc3RlIG90cm8gdHdlZXQsIG5vIHNlIHB1ZWRlIHNhYmVyIHRvZG8sIG5pIHBhc2FyIHBvciBsYSB2aWRhIHNpbiBjb21ldGVyIGVycm9yZXM6CgoKPGJsb2NrcXVvdGUgY2xhc3M9InR3aXR0ZXItdHdlZXQiPjxwIGxhbmc9ImVuIiBkaXI9Imx0ciI+VnVsbmVyYWJsZSBidXQgaW1wb3J0YW50IHR3ZWV0cyBmb3IgZGF0YSBzY2llbnRpc3RzICZhbXA7IHByb2dyYW1tZXJzOjxicj48YnI+8J+kt0lESzogSSBkb24mIzM5O3Qga25vdzxicj7wn6egVElMOiB0b2RheSBJIGxlYXJuZWQ8YnI+8J+YrCBNaXN0YWtlcyBJJiMzOTt2ZSBtYWRlPGJyPjxicj5Ob3JtYWxpemluZyB0aGUgZmFjdCB0aGF0IG5vIG9uZSBrbm93cyBpdCBhbGwgKG5vdCBldmVuIHlvdSEpLCBldmVyeW9uZSBtYWtlcyBtaXN0YWtlcywgYW5kIGxlYXJuaW5nIGlzIGEgbGlmZWxvbmcgcHJvY2VzcyBoYXMgcHJvZm91bmQgaW1wYWN0cy48L3A+Jm1kYXNoOyBKZXNzZSBNb3N0aXBhayAoQGtpZXJpc2kpIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20va2llcmlzaS9zdGF0dXMvMTA2ODQ5NjIyOTQzOTU5ODU5Mj9yZWZfc3JjPXR3c3JjJTVFdGZ3Ij5Ob3ZlbWJlciAzMCwgMjAxODwvYT48L2Jsb2NrcXVvdGU+IDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3BsYXRmb3JtLnR3aXR0ZXIuY29tL3dpZGdldHMuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4gCgoKPGJyPgoKUGFyYSBmaW5hbGl6YXIsIHVuIGhpbG8gZGUgVHdlZXRlciBjb24gbXV1dXV1dWNob3MgZXJyb3JlczoKCgo8YmxvY2txdW90ZSBjbGFzcz0idHdpdHRlci10d2VldCI+PHAgbGFuZz0iZW4iIGRpcj0ibHRyIj5BIHNtYWxsIHNhbXBsZSBvZiBkYXRhIHNjaWVuY2UgbWlzdGFrZXMgSSYjMzk7dmUgbWFkZSBzbyBmYXIg8J+RhyA8YSBocmVmPSJodHRwczovL3QuY28vRWVpVm1tQW51SiI+cGljLnR3aXR0ZXIuY29tL0VlaVZtbUFudUo8L2E+PC9wPiZtZGFzaDsgQ2FpdGxpbiBIdWRvbvCfkanwn4+8CvCfkrsgKEBiZWVvbmFwb3N5KSA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2JlZW9uYXBvc3kvc3RhdHVzLzExMjI5NjQ1MDQ5MTA5MzgxMjE/cmVmX3NyYz10d3NyYyU1RXRmdyI+QXByaWwgMjksIDIwMTk8L2E+PC9ibG9ja3F1b3RlPiA8c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly9wbGF0Zm9ybS50d2l0dGVyLmNvbS93aWRnZXRzLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+IAoKPGJyPgoKCiMjIDQuIENpZW5jaWEgZGUgZGF0b3MgZW4gRWNvbm9tw61hCgpFdmlkZW50ZW1lbnRlIHRvZG8gZXN0ZSBjYW1iaW8gdGVjbm9sw7NnaWNvIGFjZWxlcmFkbyBhbCBxdWUgYXNpc3RpbW9zIGVuIGxhIGVyYSBkZWwgQmlnIERhdGEsIHkgcXVlIG11Y2hhcyB2ZWNlcyBlc3TDoSBhc29jaWFkbyBhbCBNTC9ETCwgaGEgcHJvdm9jYWRvIHkgcHJvdm9jYXLDoSBncmFuZGVzIGNhbWJpb3MgdGFudG8gZW4gbGEgZWNvbm9tw61hIHJlYWwgY29tbyBlbiBsYSBjaWVuY2lhIGVjb27Ds21pY2EuIFVuYSBwYW5vcsOhbWljYSBkZSB0cmFiYWpvcyBxdWUgYW5hbGl6YW4gbGFzIGltcGxpY2FjaW9uZXMgZGUgZXN0b3MgY2FtYmlvcyBlbiBsYSBjaWVuY2lhIGVjb27Ds21pY2EgcHVlZGUgdmVyc2UgZW4gW0Fuw6FsaXNpcyBlY29uw7NtaWNvIGRlIGxhIHJldm9sdWNpw7NuIGRpZ2l0YWxdKGh0dHBzOi8vYmxvZy5mdW5jYXMuZXMvd3AtY29udGVudC91cGxvYWRzLzIwMTgvMTEvRWNvbm9taWMtQW5hbHlzaXMtb2YtdGhlLURpZ2l0YWwtUmV2b2x1dGlvbi5wZGYpLgoKClVubyBkZSBsb3MgZWZlY3RvcyBtw6FzIGV2aWRlbnRlcyBjb25zaXN0ZSBlbiBxdWUgbGFzIGlubm92YWNpb25lcyB0ZWNub2zDs2dpY2FzIGFzb2NpYWRhcyBhbCBNTCBzZWd1cmFtZW50ZSBjYW1iaWFyw6FuIHJhZGljYWxtZW50ZSwgc2kgZXMgcXVlIG5vIGxvIGhhbiBoZWNobyB5YSwgbXVjaG9zIHNlY3RvcmVzIGVjb27Ds21pY29zOyBwb3IgZWplbXBsbyBlbCB0cmFuc3BvcnRlIG8gbGEgYmFuY2EsIHBlcm8gdGFtYmnDqW4gbXVjaG9zIG90cm9zIGNvbW8gbG9zIHNlZ3Vyb3MsIHNlcnZpY2lvcyBhdWRpb3Zpc3VhbGVzLCBsYSB2ZW50YSBhbCBwb3IgbWVub3IsIGxhIHNhbmlkYWQsIGV0Yy4uLgoKT3RybyBkZSBsb3MgY2FtYmlvcyBtw6FzIGV2aWRlbnRlcyBjb25zaXN0ZSBlbiBxdWUgYWN0dWFsbWVudGUgbGFzIHByaW5jaXBhbGVzIGNvcnBvcmFjaW9uZXMgdHJhbnNuYWNpb25hbGVzLCBxdWUgYW50ZXMgcGVydGVuZWPDrWFuIHByaW5jaXBhbG1lbnRlIGEgbG9zIHNlY3RvcmVzIGVuZXJnw6l0aWNvIHkgZmluYW5jaWVybywgYWhvcmEgdGllbmVuIHVuIGZ1ZXJ0ZSBjb21wb25lbnRlIHRlY25vbMOzZ2ljbywgbGFzICoqR0FGQSoqLCB1biBhY3LDs25pbW8gcGFyYSBoYWNlciByZWZlcmVuY2lhIGEgbGFzIGN1YXRybyBncmFuZGVzIGNvbXBhw7HDrWFzIHRlY25vbMOzZ2ljYXM6IEdvb2dsZSwgQW1hem9uLCBGYWNlYm9vayB5IEFwcGxlLgoKT3RyYSBkZSBsb3MgY2FtYmlvcyBzaWduaWZpY2F0aXZvcyBxdWUgaGFuIHNpZG8gcHJvcGljaWFkb3MgcG9yIGxhcyBudWV2YXMgdGVjbm9sb2fDrWFzIGVzIGxhIGxsYW1hZGEgKiplY29ub23DrWEgY29sYWJvcmF0aXZhKiogYWwgcXVlIGVzdMOhbiBhc29jaWFkYXMgZW1wcmVzYXMgY29tbyBCbGFCbGFDYXIsIEFpcmJuYiwgLi4uCgpPdHJvIGNhbWJpbyBldmlkZW50ZSBjb25zaXN0ZSBlbiBxdWUgYWhvcmEgbWlzbW8gaGF5IHVuYSBlY29ub23DrWEgZGUgbG9zIGRhdG9zLiBMb3MgZGF0b3Mgc2UgaGFuIGNvbnZlcnRpZG8gZW4gbWF0ZXJpYSBwcmltYSwgY2FwYXogZGUgY3JlYXIgdmFsb3IsIGZ1ZW50ZSBkZSBpbm5vdmFjacOzbiB5IHNlcnZpY2lvcyBudWV2b3MuIFBhcmEgdW5hIHBhbm9yw6FtaWNhIGRlIGVzdMOhIGVjb25vbcOtYSBkZSBsb3MgZGF0b3MgcHVlZGUgdmVyc2UgbGEgcHVibGljYWNpw7NuIFtFY29ub23DrWEgZGUgbG9zIERhdG9zLiBSaXF1ZXphIDQuMF0oaHR0cHM6Ly93d3cuZnVuZGFjaW9uY2Fyb2xpbmEuZXMvd3AtY29udGVudC91cGxvYWRzLzIwMTgvMTEvTGlicm8tRWNvbm9taWEtZGUtbG9zLURhdG9zLU9udGl2ZXJvcy5wZGYpLgoKClNlIGhhYmxhIGluY2x1c28gZGUgcXVlIGVzdGFtb3MgaW5tZXJzb3MgZW4gdW5hICoqY3VhcnRhIHJldm9sdWNpw7NuIGluZHVzdHJpYWwqKi4gRWwgY29uY2VwdG8gZGUgY3VhcnRhIHJldm9sdWNpw7NuIGluZHVzdHJpYWwgZnVlIGFjdcOxYWRvIHBvciBLbGF1cyBTY2h3YWIgZnVuZGFkb3IgZGVsIEZvcm8gRWNvbsOzbWljbyBNdW5kaWFsIGVuIGVsIGNvbnRleHRvIGRlIGxhIGVkaWNpw7NuIGRlbCBGb3JvIEVjb27Ds21pY28gTXVuZGlhbCAyMDE2IHkgdW5hIGRlIHN1cyBjYXJhY3RlcsOtc3RpY2FzIGVzIGxhIHV0aWxpemFjacOzbiBkZSBsYSBJQS9NTC9ETCBwYXJhIGxhIGF1dG9tYXRpemFjacOzbiBkZSB0YXJlYXMgcXVlIGFudGVzIHPDs2xvIGVzdGFiYW4gYWwgYWxjYW5jZSBkZSBsb3MgaHVtYW5vcy4gVW5hIGRlIGxhcyBjb25zZWN1ZW5jaWFzIG3DoXMgZGlyZWN0YXMgZGUgbGEgYXV0b21hdGl6YWNpw7NuIHNlcsOhIGVsICoqZGVzcGxhemFtaWVudG8gZGUgZW1wbGVvcyoqLCBubyBzw7NsbyBtYW51YWxlcywgcG9yIGxhcyBtYXF1aW5hcy9hbGdvcml0bW9zLgoKCkRlc2RlIGVsIHB1bnRvIGRlIHZpc3RhIGRlIGxhIGNpZW5jaWEsIGxhIGFjdHVhbCBhYnVuZGFuY2lhIGRlIGRhdG9zLCB2YSBhIHRlbmVyIGltcGxpY2FjaW9uZXMgZGlyZWN0YXM6CgotICJEZSBsYSBtaXNtYSBmb3JtYSBxdWUgZWwgdGVsZXNjb3BpbyB5IGVsIG1pY3Jvc2NvcGlvIHBlcm1pdGllcm9uIHZlciBlbCBlc3BhY2lvIHkgbGFzIGPDqWx1bGFzLCBsYXMgbnVldmFzIHTDqWNuaWNhcyBkZSByZWNvcGlsYWNpw7NuIHkgYW7DoWxpc2lzIGRlIGRhdG9zIGF5dWRhcsOhbiBhIHZlciBlbCBzZW50aWRvIGRlIG51ZXN0cm8gbXVuZG8gZGUgdW5hIGZvcm1hIHF1ZSBhcGVuYXMgaW50dWltb3MiLiAKCi0gImVsIGNhbWJpbyBjdWFudGl0YXRpdm8gbm8gZXMgbG8gw7puaWNvIGltcG9ydGFudGUsIGVzIGVsIGN1YWxpdGF0aXZvOiB1bmEgcGVsw61jdWxhIGVzIGRpZmVyZW50ZSBkZSB1bmEgcGludHVyYSwgdGFtYmnDqW4gY3VhbmRvIHRyYWJhamFzIGNvbiBtdWNob3MgZGF0b3Mgc2UgcHVlZGVuIGhhY2VyIG90cmFzIGNvc2FzOyBlcyBkZWNpciwgYWwgY2FtYmlhciBsYSBjYW50aWRhZCBjYW1iaWFtb3MgbGEgZXNlbmNpYSIuCgpIYSBzdXJnaWRvLCBpbmNsdXNvLCB1bmEgbnVldm8gdMOpcm1pbm86IGVsIFtkYXRhw61zbW9dKGh0dHBzOi8vZXMud2lraXBlZGlhLm9yZy93aWtpL0RhdGElQzMlQURzbW8pLiBQYXJhIHVuIOKAnGRhdGFpc3Rh4oCdLCBlbiB1biBtdW5kbyBjb24gY2FkYSB2ZXogbWF5b3IgY29tcGxlamlkYWQsIGNvbmZpYXIgZW4gbG9zIGRhdG9zIHB1ZWRlIHJlZHVjaXIgbG9zIHNlc2dvcyBjb2duaXRpdm9zIHkgZGVzY3VicmlyIHBhdHJvbmVzIGRlIGNvbXBvcnRhbWllbnRvLiBTZWfDum4gZWwgZmlsw7Nzb2ZvIHkgZW5zYXlpc3RhIHN1cmNvcmVhbm8gQnl1bmctQ2h1bCBIYW4sIOKAnGVsIGJpZyBkYXRh4oCdIGRlYmUgbGliZXJhciBlbCBjb25vY2ltaWVudG8gZGUgbGEgc3ViamV0aXZpZGFkLiBFbCB0w6lybWlubyBkYXRhaXNtbyBmdWUgcG9wdWxhcml6YWRvIGVuIGVsIGxpYnJvIEhvbW8gRGV1cyBkZSBIYXJhcmkuIEVsICJkYXRhaXNtbyIgZXN0w6EgZW4gY2llcnRvIG1vZG8gcmVsYWNpb25hZG8gY29uIGxhIGlkZWEsIHF1aXrDoSB1biBwb2NvIGV4YWdlcmFkYSwgZGUgcXVlIGVzdMOhIHN1cmdpZW5kbyB1biBjdWFydG8gcGFyYWRpZ21hIGNpZW50w61maWNvIGJhc2FkbyBlbiBlbCB1c28gaW50ZW5zaXZvIGRlIGRhdG9zLiBFc3TDoSBpZGVhIHNlIGF0cmlidXllIGEgSmltIEdyYXksIGdhbmFkb3IgZGVsIHByZW1pbyBUdXJpbmcuIEdyYXkgYWZpcm1hIHF1ZSAidG9kbyBsbyByZWxhY2lvbmFkbyBjb24gbGEgY2llbmNpYSBlc3TDoSBjYW1iaWFuZG8gZGViaWRvIGFsIGltcGFjdG8gZGUgbGEgdGVjbm9sb2fDrWEgZGUgbGEgaW5mb3JtYWNpw7NuIHkgZWwgZGlsdXZpbyBkZSBkYXRvcyIgeSBxdWUgc2UgZXN0w6EgY29uZm9ybWFuZG8gdW4gY3VhcnRvIHBhcmFkaWdtYSBjaWVudMOtZmljbyB0cmFzIGxvcyB0cmVzIHByaW1lcm9zIChlbXDDrXJpY28sIHRlw7NyaWNvLCBjb21wdXRhY2lvbmFsKS4gRXN0YSBpZGVhcyBzZSBkZXNhcnJvbGxhbiBlbiBbVGhlIEZvdXJ0aCBQYXJhZGlnbTogRGF0YS1pbnRlbnNpdmUgU2NpZW50aWZpYyBEaXNjb3ZlcnldKGh0dHBzOi8vYm9va3MuZ29vZ2xlLmVzL2Jvb2tzP2lkPW9Hc19BUUFBSUFBSiZyZWRpcl9lc2M9eSkuIFVuYSB0cmFkdWNjacOzbiBhbCBjYXN0ZWxsYW5vIHB1ZWRlIGVuY29udHJhcnNlIFthcXXDrV0oaHR0cDovL3d3dy51YW0ubXgvY2FzYWRlbGlicm9zYWJpZXJ0b3MvbGlicm9zZWxlY3Ryb25pY29zLzR0b3BhcmFkaWdtYS80dG9wYXJhZGlnbWEucGRmKS4KClNpbiBlbWJhcmdvLCBoYXkgcXVlIHJlY29yZGFyLCBjb21vIHNlIGhhY2UgZW4gW2VzdGUgcG9zdF0oaHR0cHM6Ly9zaW1wbHlzdGF0aXN0aWNzLm9yZy8yMDE2LzA2LzAzL2RlZmluaW5nLXN1Y2Nlc3MvKSBkZSBKZWZmIGxlZWssIHF1ZSB1biByZXN1bHRhZG8gZXhpdG9zbyBkZSB1biBhbsOhbGlzaXMgZGUgZGF0b3MgcHVlZGUgc2VyIHF1ZSBsb3MgZGF0b3Mgbm8gcGVybWl0ZW4gcmVzb2x2ZXIgbGEgcHJlZ3VudGEuIEVzdGEgbWlzbWEgaWRlYSBzdWJ5YWNlIGVuIGVzdGUgdHdlZXQ6CgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgZmlnLmFzcCA9IDcvOX0KdHdlZXRybWQ6OnR3ZWV0X2VtYmVkKCJodHRwczovL3R3aXR0ZXIuY29tL3NUZWFtVHJhZW4vc3RhdHVzLzEzNjEwNjc0MDg2NjA3ODMxMTUiLCB0aGVtZSA9ICJsaWdodCIsIGFsaWduID0gImNlbnRlciIsIGRudCA9IFRSVUUsIHBsYWluID0gVFJVRSwgbWF4d2lkdGggPSA0MDApCmBgYAoKCgo8YnI+CgoKIyMjIyDCv0FmZWN0YXLDoSB0b2RvIGVzdG8gYSBsYSBFY29ub23DrWEvRWNvbm9tZXRyw61hPwoKVG9kb3Mgdm9zb3Ryb3Mgc2Fiw6lpcyBxdWUgbGEgRWNvbm9tw61hIGVzIHVuYSBkZSBsYXMgY2llbmNpYXMgc29jaWFsZXMgZW4gbGEgcXVlIG3DoXMgc2UgdXRpbGl6YSBsYSBFc3RhZMOtc3RpY2E7IGRlIGhlY2hvIGxhIEVjb25vbWV0csOtYSBlcyBwcmVjaXNhbWVudGUgZXNvLCB1bmEgcmFtYSBkZSBsYSBFY29ub23DrWEgcXVlIHV0aWxpemEgbcOpdG9kb3MgZXN0YWTDrXN0aWNvcyBlbiBlbCBlc3R1ZGlvIGRlIGxvcyBmZW7Ds21lbm9zIGVjb27Ds21pY29zLgoKTGEgcmVzcHVlc3RhIGEgbGEgcHJlZ3VudGEgYW50ZXJpb3IgZXMgcXVlIHPDrSwgbm8gc8OpIGN1YW5kbyBuaSBjb21vLCBwZXJvIGVzIGV2aWRlbnRlIHF1ZSBsYSBkaXNwb25pYmlsaWRhZCBkZSBudWV2b3MgZGF0b3MsIHkgZWwgYXVnZSBkZSBsb3MgbcOpdG9kb3MgZXN0YWTDrXN0aWNvcyBhc29jaWFkb3MgYWwgTUwvREwsIHRlbmRyw6FuIHF1ZSBpciBpbmNvcnBvcsOhbmRvc2UgcG9jbyBhIHBvY28gYSBudWVzdHJhIGNpZW5jaWEuIEFiYWpvIGFsZ3VuYXMgcmVmZXJlbmNpYXMgc29icmUgZWxsbzoKCi0gW1RoZSBFY29ub21pY3Mgb2YgQXJ0aWZpY2lhbCBJbnRlbGxpZ2VuY2U6IEFuIEFnZW5kYV0oaHR0cHM6Ly93d3cubmJlci5vcmcvYm9va3MvYWdyYS0xKQoKLSBbSUEgeSBFY29ub23DrWFdKGh0dHBzOi8vd3d3LmZ1bmNhcy5lcy9hcnRpY3Vsb3MvYXBsaWNhY2lvbi1kZWwtYXByZW5kaXphamUtYXV0b21hdGljby1hbC1hbmFsaXNpcy1lY29ub21pY28teS1sYS1mb3JtdWxhY2lvbi1kZS1wb2xpdGljYXMvKQoKLSBbSUEgeSBtZXJjYWRvcyBmaW5hbmNpZXJvc10oaHR0cHM6Ly93d3cuZnVuY2FzLmVzL2FydGljdWxvcy9hcGxpY2FjaW9uZXMtZGUtbGEtaW50ZWxpZ2VuY2lhLWFydGlmaWNpYWwtYS1sb3MtbWVyY2Fkb3MtZmluYW5jaWVyb3MtbGEtZ2VzdGlvbi1kZS1sYS1pbmZvcm1hY2lvbi1lbi1iYW5jYS1kZS1sYXMtZmluYW56YXMtZGVsLWNvbXBvcnRhbWllbnRvLWEtbGEtaW50ZWxpZ2VuY2lhLWFydGlmaWNpYWwtMjAxOS1uLTE2Mi8pCgotIFtCaWcgRGF0YSBpbiBlY29ub21pY3NdKGh0dHBzOi8vd29sLml6YS5vcmcvYXJ0aWNsZXMvYmlnLWRhdGEtaW4tZWNvbm9taWNzL2xvbmcpCgotIFtNYWNoaW5lIExlYXJuaW5nOiBBbiBBcHBsaWVkIEVjb25vbWV0cmljIEFwcHJvYWNoXShodHRwczovL3d3dy5hZWF3ZWIub3JnL2FydGljbGVzP2lkPTEwLjEyNTcvamVwLjMxLjIuODcpCgotIFtUaGUgSW1wYWN0IG9mIE1hY2hpbmUgTGVhcm5pbmcgb24gRWNvbm9taWNzXShodHRwczovL3d3dy5uYmVyLm9yZy9jaGFwdGVycy9jMTQwMDkucGRmKQoKLSBbQmlnIERhdGE6IE5ldyBUcmlja3MgZm9yIEVjb25vbWV0cmljc10oaHR0cHM6Ly93d3cuYWVhd2ViLm9yZy9hcnRpY2xlcz9pZD0xMC4xMjU3L2plcC4yOC4yLjMpCgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCjxicj4KCgojIyA1LiBJbnZlc3RpZ2FjacOzbiByZXByb2R1Y2libGUgeSBzb2Z0d2FyZSBsaWJyZQoKQ2FkYSB2ZXogbcOhcyAgc2Ugb3llIGhhYmxhciBkZSBsYSBJbnZlc3RpZ2FjacOzbiBSZXByb2R1Y2libGUgKElSKSBvICBSZXByb2R1Y2libGUgUmVzZWFyY2ggKFJSKSBlbiBpbmdsw6lzLiBDcmVvIHkgZXNwZXJvIHF1ZSBlbiBwb2NvIHRpZW1wbyBzZSBjb252aWVydGEgZW4gZWwgZXN0w6FuZGFyLiAKClNlZ8O6biBsYSBXaWtpcGVkaWEgZXNwYcOxb2xhLCAgCgo+IExhIHJlcHJvZHVjaWJpbGlkYWQgZXMgbGEgY2FwYWNpZGFkIGRlIHVuYSBwcnVlYmEgbyBleHBlcmltZW50byBkZSBzZXIgcmVwcm9kdWNpZG8gbyByZXBsaWNhZG8gcG9yIG90cm9zLCBlbiBwYXJ0aWN1bGFyLCBwb3IgbGEgY29tdW5pZGFkIGNpZW50w61maWNhLiBMYSByZXByb2R1Y2liaWxpZGFkIGVzIHVubyBkZSBsb3MgcGlsYXJlcyBkZWwgbcOpdG9kbyBjaWVudMOtZmljbywgc2llbmRvIGxhIGZhbHNhYmlsaWRhZCBlbCBvdHJvLiAuLi4gCgo+IC4uLiBlbiBtdWNoYXMgZGlzY2lwbGluYXMsIHNvYnJlIHRvZG8gZW4gYXF1ZWxsYXMgcXVlIGltcGxpY2FuIGVsIHVzbyBkZSBlc3RhZMOtc3RpY2EgeSBwcm9jZXNvcyBjb21wdXRhY2lvbmFsZXMsIHNlIGVudGllbmRlIHF1ZSB1biBlc3R1ZGlvIGVzIHJlcHJvZHVjaWJsZSBzaSBlcyBwb3NpYmxlIHJlY3JlYXIgZXhhY3RhbWVudGUgdG9kb3MgbG9zIHJlc3VsdGFkb3MgYSBwYXJ0aXIgZGUgbG9zIGRhdG9zIG9yaWdpbmFsZXMgeSBlbCAqKmPDs2RpZ28gaW5mb3Jtw6F0aWNvKiogZW1wbGVhZG8gcGFyYSBsb3MgYW7DoWxpc2lzLgoKCkVuIGVzdGUgW2xpYnJvXShodHRwczovL3d3dy5wcmFjdGljZXJlcHJvZHVjaWJsZXJlc2VhcmNoLm9yZy8pIHNlw7FhbGFuIHF1ZSBsYSByZXByb2R1Y2liaWxkYWQgZXN0w6EgbGlnYWRhIMOtbnRpbWFtZW50ZSBhbCBtw6l0b2RvIGNpZW50w61maWNvIGNvbW8gaWx1c3RyYSBlbCBoZWNobyBkZSBxdWUgZWwgbGVtYSBkZSBsYSBbUm95YWwgU29jaWV0eV0oaHR0cHM6Ly9lcy53aWtpcGVkaWEub3JnL3dpa2kvUm95YWxfU29jaWV0eSkgdW5hIGRlIGxhcyBzb2NpZWRhZGVzIGNpZW50w61maWNhcyBtw6FzIGFudGlndWFzIGRlbCBtdW5kbyBlcyAqIk51bGxpdXMgaW4gdmVyYmEiKiBxdWUgcXVpZXJlIGRlY2lyIG3DoXMgbyBtZW5vcyAibm8gY3JlYXMgZW4gbGEgcGFsYWJyYSBkZSBuYWRpZSIuIEVuIGVsIGNvbnRleHRvIGNpZW50w61maWNvIHF1aWVyZSBkZWNpciBxdWUgbGFzIGFmaXJtYWNpb25lcyBvIGRlc2N1YnJpbWllbnRvcyBjaWVudMOtZmljb3MgZGViZW4gc2VyIHByb2JhZG9zIG1lZGlhbnRlIGVsIG3DqXRvZG8gY2llbnTDrWZpY28uCgoKQSBtZW51ZG8gc2UgaGFibGEgZGUgbGEgZXhpc3RlbmNpYSBkZSB1bmEgW2NyaXNpcyBkZSByZXByb2R1Y2liaWxpZGFkXShodHRwczovL2VzLndpa2lwZWRpYS5vcmcvd2lraS9DcmlzaXNfZGVfcmVwbGljYWNpJUMzJUIzbikgcmVmaXJpw6luZG9zZSBjb24gZWxsbyBhIGxhIGlkZWEgZGUgcXVlIGxvcyByZXN1bHRhZG9zIGRlIG11Y2hvcyBkZSBsb3MgZXhwZXJpbWVudG9zIGNpZW50w61maWNvcyBzb24gZGlmw61jaWxlcyBvIGltcG9zaWJsZXMgYSByZXBsaWNhciBlbiBpbnZlc3RpZ2FjaW9uZXMgcG9zdGVyaW9yZXMuIFVubyBkZSBsb3MgY2Fzb3MgbcOhcyBzb25hZG9zLCBhc29jaWFkb3MgYSBlc3RhIGlkZWEsIGVzIGVsIGRlIFtSZWluaGFydCB5IFJvZ29mZl0oaHR0cHM6Ly93d3cud2Vmb3J1bS5vcmcvYWdlbmRhLzIwMTMvMDQvdGhlLXJlaW5oYXJ0LWFuZC1yb2dvZmYtZGViYWNsZS8pLiAKCgpMYSBpZGVhIGRlIHF1ZSBwdWVkZSBleGlzdGlyIHVuYSBjcmlzaXMgZGUgcmVwcm9kdWNpYmlsaWRhZCwganVudG8gYWwgaGVjaG8gZGUgcXVlIGxhcyBudWV2YXMgdGVjbm9sb2fDrWFzIGhhY2VuIGNhZGEgdmV6IG3DoXMgc2VuY2lsbG8gcXVlIGxvcyBhcnTDrWN1bG9zIGUgaW52ZXN0aWdhY2lvbmVzIGNpZW50w61maWNhcyBzZWFuIHJlcHJvZHVjaWJsZXMsIGhhIHByb3ZvY2FkbyBjYW1iaW9zIGltcG9ydGFudGVzIGVuIGxhIHBvbMOtdGljYSBkZSBhc29jaWFjaW9uZXMgeSByZXZpc3RhcyBjaWVudMOtZmljYXMsIGNvbW8gbGEgZGUgbGEgW0FtZXJpY2FuIEVjb25vbWljIEFzc29jaWF0aW9uXShodHRwczovL3d3dy5hZWF3ZWIub3JnL2pvdXJuYWxzL3BvbGljaWVzL2RhdGEtY29kZS8pIHNlZ8O6biBsYSBjdWFsLCBzw7NsbyBzZSBwdWJsaWNhcsOhbiBhcnTDrWN1bG9zIGVuIGxvcyBxdWU6IAoKPiAidGhlIGRhdGEgYW5kIGNvZGUgdXNlZCBpbiB0aGUgYW5hbHlzaXMgYXJlIGNsZWFybHkgYW5kIHByZWNpc2VseSBkb2N1bWVudGVkLCBhbmQgYWNjZXNzIHRvIHRoZSBkYXRhIGFuZCBjb2RlIGlzIGNsZWFybHkgYW5kIHByZWNpc2VseSBkb2N1bWVudGVkIGFuZCBpcyBub24tZXhjbHVzaXZlIHRvIHRoZSBhdXRob3JzIi4KCgpbQXF1w61dKGh0dHBzOi8vd3d3LmdsZWVjaC5vcmcvcHN5Y2gpIHB1ZWRlcyBlbmNvbnRyYXIgdW4gbGlzdGFkbyBkZSByZXN1bHRhZG9zIGRlIHBhcGVycyBjaWVudMOtZmljb3MgZW4gUHNpY29sb2fDrWEgcXVlIGhhbiB0ZW5pZG8gcXVlIHNlciByZXZpc2l0YWRvcyB0cmFzIGVzdHVkaW9zIHBvc3RlcmlvcmVzLgoKCjxicj4KClBhcmEgcXVlIHVuIGFuw6FsaXNpcyBjb24gZGF0b3Mgc2VhIHJlcHJvZHVjaWJsZSwgbm8gc8OzbG8gZXMgbmVjZXNhcmlvIHF1ZSBsb3MgZGF0b3MgdXRpbGl6YWRvcyBoYW4gZGUgc2VyIGFjY2VzaWJsZXMsIHNpbm8gcXVlIGPDs21vIG3DrW5pbW8gZGViZXLDrWE6ICAgCgotIHByb3BvcmNpb25hciBsb3MgZGF0b3Mgb3JpZ2luYWxlcyAob2J2aWFtZW50ZSBkb2N1bWVudGFyIGxhcyBmdWVudGVzKSAKICAgIAotIGVmZWN0dWFyIHRvZG8gZWwgcHJvY2VzbyBhIHRyYXbDqXMgZGUgY8OzZGlnbyAoc2NyaXB0cykgIAogICAgCi0gZG9jdW1lbnRhciBlbCBwcm9jZXNvIGRlIHRyYWJham8gKHBvciBlamVtcGxvIGVsIG9yZGVuIGVuIHF1ZSBzZSBlamVjdXRhcm9uIGxvcyBzY3JpcHRzKSAgIAoKCjxicj4KCkNvbW8gdmVpcywgdW5vIGRlIGxvcyByZXF1aXNpdG9zIHBhcmEgaGFjZXIgaW52ZXN0aWdhY2nDs24gcmVwcm9kdWNpYmxlIGVzIGVmZWN0dWFyIHRvZG8gZWwgcHJvY2VzbyBtZWRpYW50ZSBzY3JpcHRzOyBlcyBkZWNpciwgaGF5IHF1ZSBzYWJlciBwcm9ncmFtYXIuIE1pcmEgbG8gcXVlIGRpY2UgRnJhbmsgSGFycmVsbDoKCgo+IENhbiBvbmUgYmUgYSBnb29kIGRhdGEgYW5hbHlzdCB3aXRob3V0IGJlaW5nIGEgaGFsZi1nb29kIHByb2dyYW1tZXI/IFRoZSBzaG9ydCBhbnN3ZXIgdG8gdGhhdCBpcywg4oCYTm8u4oCZIFRoZSBsb25nIGFuc3dlciB0byB0aGF0IGlzLCDigJhOby7igJkgICAg4oCURnJhbmsgSGFycmVsbCAgIGh0dHBzOi8vaG9tZXJoYW51bWF0LmdpdGh1Yi5pby9yLW5vdGVzL2ZyYW1lcy5odG1sCgoKCjxicj4KCgpIYWNlciB1bmEgaW52ZXN0aWdhY2nDs24gY29tcGxldGFtZW50ZSByZXByb2R1Y2libGUgZXMgQ09TVE9TTzsgZGUgaGVjaG8sIGhheSBjdXJzb3MgY29tcGxldG9zIHNvYnJlIGVsIHRlbWEsIHBvciBlamVtcGxvIFtlc3RlXShodHRwOi8va2Jyb21hbi5vcmcvVG9vbHM0UlIvKSwgeSBtdWNob3MgcHJveWVjdG9zIHF1ZSB0cmF0YW4gZGUgcHJvbW92ZXJsYTsgcG9yIGVqZW1wbG8gW2VzdGVdKGh0dHBzOi8vcm9wZW5zY2kub3JnLykgcXVlIHByZXRlbmRlIGZhdm9yZWNlciBlbCB1c28gZGUgZGF0b3MgYWJpZXJ0b3MgYSB0cmF2w6lzIGRlIFIuIEFmb3J0dW5hZGFtZW50ZSwgY2FkYSB2ZXogaGF5IG3DoXMgaGVycmFtaWVudGFzIHF1ZSBmYWNpbGl0YW4gaGFjZXIgSVI6IE1ha2UsIEdpdCwgRG9ja2VyLCBQYW5kb2MsIEtuaXRyLCBtYXJrZG93biAuLi4KCgoKSGFjZXIgdW5hIGludmVzdGlnYWNpw7NuIChjb21wbGV0YW1lbnRlKSByZXByb2R1Y2libGUgbm8gc2llbXByZSBlcyBwb3NpYmxlOyBPSywgUEVSTyBhbCBtZW5vcyBhY2VyY2Fyc2UgLi4uIHVuIHBvY28uIE5vc290cm9zLCBlbiBlbCBjdXJzbywgaGFyZW1vcyBhbsOhbGlzaXMgY29uIGRhdG9zIGUgaW50ZW50YXJlbW9zIHF1ZSBlc3RvcyBzZWFuIHJlcHJvZHVjaWJsZXMuIEVuIGVsIGVudG9ybm8gKipSKiogY2FkYSB2ZXogZXMgbcOhcyBmw6FjaWwgYWNlcmNhcnNlIGFsIGlkZWFsIGRlIGxhIElSLiBQYXJhIGVsbG8gZW4gZWwgY3Vyc28gaGFyZW1vcyBzaWVtcHJlIG51ZXN0cm9zIGFuw6FsaXNpcyBjb24gc2NyaXB0cyBkZSBSLiBDb25jcmV0YW1lbnRlIHV0aWxpemFyZW1vcyAqKlJTdHVkaW8qKiBwYXJhIGhhY2VyIGFuw6FsaXNpcyBkZSBkYXRvcywgZ2VzdGlvbmFuZG8gbnVlc3Ryb3MgYW7DoWxpc2lzIGEgdHJhdsOpcyBkZSAqKlJwcm9qZWN0cyoqIHkgZ2VuZXJhcmVtb3MgbG9zIGluZm9ybWVzIHkgcmVzdWx0YWRvcyBkZWwgYW7DoWxpc2lzIGNvbiBkb2N1bWVudG9zICoqUm1hcmtkb3duKipeW0VuIHNlZ3VpZGEgZXhwbGljYXJlbW9zIHF1ZSBzb24gdG9kYXMgZXN0YXMgcGFsYWJyYXMgcXVlIGVtcGllemFuIHBvciByOiBSLCBSU3R1ZGlvLCBScHJvamVjdCB5IFJtYXJrZG93bl0uIEVzdG9zIGRvY3VtZW50b3MgUm1hcmtkb3duIG8gKipgLlJtZGAqKiBzb24gcmVwcm9kdWNpYmxlcy4gRW4gYnJldmUgdmVyZW1vcyBxdWUgc2lnbmlmaWNhIGVzdG8geSBzdXMgdXRpbGlkYWRlcyB0YW50byBwYXJhIGxhIGludmVzdGlnYWNpw7NuIGNvbW8gcGFyYSBsYSBkb2NlbmNpYS4gRW4gW2VzdGFzIHRyYW5zcGFyZW5jaWFzXShodHRwczovL21yc2xhdmluaWFnLmdpdGh1Yi5pby94YXJpbmdhbl9wcmVzZW50YXRpb25zL3JsYWRpZXNfcHJlc2VudGF0aW9uXzIyX01heV8yMDE5Lmh0bWwpIG5vcyBjdWVudGFuIGNvbW8gUiB5IHN1IGVjb3Npc3RlbWEgZmFjaWxpdGFuIGVsIGhhY2VyIGludmVzdGlnYWNpw7NuIG8gYW7DoWxpc2lzIHJlcHJvZHVjaWJsZXMuIAoKCkxhIHJhesOzbiBwYXJhIGhhY2VyIGxvcyBhbsOhbGlzaXMgcmVwcm9kdWNpYmxlcyBubyBzw7NsbyBlcyBjdW1wbGlyIGNvbiBsb3MgZXN0w6FuZGFyZXMgY2llbnTDrWZpY29zLCBxdWUgdGFtYmnDqW4sIHNpbm8gdGFtYmnDqW4gaGF5IHVuIGludGVyw6lzIHBlcnNvbmFsIHBhcmEgZWwgYW5hbGlzdGEuIFBhcmEgZW50ZW5kZXJsbyBwdWVkZXMgdmVyIGVsIHNpZ3VpZW50ZSBbdmlkZW8gZGUgMSc0NCcnXShodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PXMzSmxkS29BMHp3JmZlYXR1cmU9eW91dHUuYmUpIHF1ZSBtdWVzdHJhIHVuYSBkZSBsYXMgcHJpbmNpcGFsZXMgdmVudGFqYXMgZGUgbGEgSVIsIHkgc2lubyB5YSBsbyBleHBlcmltZW50YXJlaXMgY3VhbmRvIGhhZ2Ftb3MgaGVjaG8gZWwgcHJpbWVyIGFuw6FsaXNpcyB5IG9zIGRpZ2EgcXVlIG1lIGhlIGVxdWl2b2NhZG8gY29uIGxvcyBkYXRvcywgcXVlIG9zIGhhYsOtYSBkYWRvIGxhIHZlcnNpw7NuIGFudGlndWEgZGUgbG9zIGRhdG9zLiBPcyB2YWlzIGEgcmXDrXIgc2kgbm8gaGFiw6lpcyBoZWNobyB2dWVzdHJvIGFuw6FsaXNpcyByZXByb2R1Y2libGUuCgoKRW4gcGFsYWJyYXMgZGUgYEBUaWZmYW55VGltYmVyc2A6IAoKPiBOb3RoaW5nIGxpa2UgZG9pbmcgc29tZXRoaW5nIG1hbnVhbGx5IDYwKyB0aW1lcyBhbmQgbWFraW5nIG1pc3Rha2VzIHRvIHJlaW5mb3JjZSB0aGUgaWRlYSAiYXV0b21hdGUgYWxsIHRoZSB0aGluZ3MiLiAKCgo8YnI+CgojIyMgU29mdHdhcmUgbGlicmUKCgpFbCBzb2Z0d2FyZSBsaWJyZSBlcyBkZSB2aXRhbCBpbXBvcnRhbmNpYSBlbiBlbCBkZXNhcnJvbGxvIGRlIGxhIGludmVzdGlnYWNpw7NuIHJlcHJvZHVjaWJsZS4gUGllbnNhIHF1ZSBwb3IgbXVjaG8gcXVlIHVuIGludmVzdGlnYWRvciBoYWdhIGFjY2VzaWJsZXMgc3VzIGRhdG9zIHkgc3UgY8OzZGlnbywgc2kgdXRpbGl6YSB1biBzb2Z0d2FyZSBwcml2YXRpdm8sIGVuIHJlYWxpZGFkIHN1IGFuw6FsaXNpcyBubyBlcyByZXByb2R1Y2libGUsIHPDs2xvIGxvIHNlcsOhIHBhcmEgYXF1ZWxsb3MgcXVlIHB1ZWRhbiBwYWdhciBsYSBsaWNlbmNpYV5bRWwgc29mdHdhcmUgbGlicmUgbyBjw7NkaWdvIGFiaWVydG8gdGFtYmnDqW4gZXMgdW5hIGdhcmFudGlhIGRlIHRyYW5zcGFyZW5jaWEsIGxpYmVydGFkZXMgeSBkZXJlY2hvcywgY29tbyBwdWVkZSB2ZXJzZSBlbiBlbCBzaWd1aWVudGUgW2hpbG8gZGUgVHdpdHRlcl0oaHR0cHM6Ly90d2l0dGVyLmNvbS9kY2Fiby9zdGF0dXMvMTMwNDQxODgyNzI3OTc3MzY5NyldLgoKRGUgaGVjaG8sIGFjdHVhbG1lbnRlLCBhbCBtZW5vcyBlbiBlbCBjYW1wbyBkZSBsYSBjaWVuY2lhIGRlIGRhdG9zLCBlbCBzb2Z0d2FyZSBsaWJyZSwgbyBlcyB5YSBtYXlvcml0YXJpbywgbyB2YSBjYW1pbm8gZGUgc2VybG8uIEVzIHZlcmRhZCBxdWUgbXVjaGFzIGVtcHJlc2FzIGHDum4gYmFzYW4gc3VzIGFuw6FsaXNpcyBkZSBkYXRvcyBlbiBwcm9ncmFtYXMgY29tbyBFeGNlbCwgU1BTUywgU3RhdGEgbyBTQVMsIHBlcm8gbGEgdGVuZGVuY2lhIGVzdMOhIGNhbWJpYW5kbyB5IGVzIGRlIGVzcGVyYXIgcXVlIHNlIGFjZWxlcmUgZW4gdW4gZnV0dXJvIHByw7N4aW1vLiBDb21vIGVqZW1wbG8gZGUgZXN0YSBpZGVhIHB1ZWRlcyB2ZXIgZXN0w6EgcHVibGljYWNpw7NuOiBbQmlnIERhdGEgeSBvcGVuIHNvdXJjZV0oaHR0cHM6Ly9oaXBlcnRleHR1YWwuY29tL3ByZXNlbnRhZG8tcG9yL2JidmEvYmlnLWRhdGEteS1vcGVuLXNvdXJjZSkuCgoKRW4gW2VzdGUgcG9zdF0oaHR0cHM6Ly93d3cuZW5yaXF1ZWRhbnMuY29tLzIwMjEvMDkvZWwtb3Blbi1zb3VyY2UtY29tby1iYXNlLWRlLWxhLWNvbXBldGl0aXZpZGFkLWV1cm9wZWEuaHRtbCkgc2UgcGxhbnRlYSBxdWUgZWwgIm9wZW4gc291cmNlIiBwdWVkZSBzZXIgY2xhdmUgcGFyYSBsYSBjb21wZXRpdGl2aWRhZCBlbiBsYSBVRS4gUGFyYSBhcXVlbGxvcyBxdWUgY3JlZW4gcXVlIGVsIHNvZnR3YXJlIGNvbWVyY2lhbCBkYSBtw6FzIGdhcmFudMOtYXMsIHB1ZWRlbiBsZWVyc2UgW2VzdGUgcG9zdF0oaHR0cHM6Ly9ub3RzdGF0c2NoYXQucmJpbmQuaW8vMjAxOS8wMi8xOC9hYnNvbHV0ZWx5LW5vLXdhcnJhbnR5LykuCgoKU2VndXJhbWVudGUgZW50cmUgbGFzIGVtcHJlc2FzIHBlcXVlw7FhcyB5IG1lZGlhbmFzIEV4Y2VsIGNvbnRpbsO6YSBzaWVuZG8gZWwgc29mdHdhcmUgZGUgcmVmZXJlbmNpYSBwYXJhIHN1cyBhbsOhbGlzaXMgY3VhbnRpdGF0aXZvcy4gU8OtLCBFeGNlbCBlcyB1biBmYW50w6FzdGljbyBzb2Z0d2FyZSwgbG8gc8OpLCBwZXJvIG5vIHNpcnZlIHBhcmEgdG9kby4gVW4gZWplbXBsbyBkZSBlc3RvIFthcXXDrV0oaHR0cHM6Ly93d3cuc2NpZW5jZW1hZy5vcmcvbmV3cy8yMDE2LzA4L29uZS1maXZlLWdlbmV0aWNzLXBhcGVycy1jb250YWlucy1lcnJvcnMtdGhhbmtzLW1pY3Jvc29mdC1leGNlbCksIG8gW2FxdcOtXShodHRwczovL3d3dy5qb2huZGNvb2suY29tL2Jsb2cvMjAxOS8wOS8wNy9leGNlbC1yLWJvbS8pLiBbRXN0ZSBwb3N0XShodHRwczovL2FwcHNpbG9uLmNvbS9leGNlbC1pcy1vYnNvbGV0ZS1oZXJlLWFyZS10aGUtdG9wLTItYWx0ZXJuYXRpdmVzLWZyb20tci1hbmQtcHl0aG9uLz91dG1fY2FtcGFpZ249TmV3cyZ1dG1fbWVkaXVtPUNvbW11bml0eSZ1dG1fc291cmNlPURhdGFDYW1wLmNvbSkgZXhwbGljYSBwb3JxdWUgKipFeGNlbCBlc3TDoSBvYnNvbGV0byoqLiBFbiBsb3MgY29tZW50YXJpb3MgYWwgcG9zdCBsZSBhdGl6YW4gdW4gcG9jby4gVW4gW2hpbG8gZGUgVHdpdHRlcl0oaHR0cHM6Ly90d2l0dGVyLmNvbS9hbGV4YW5kcmVhZm9uc28vc3RhdHVzLzEzMTMxODc1MzE3ODIwODI1NjIpIGNvbiBlcnJvcmVzIGdyYXZlcyBwcm92b2NhZG9zIHBvciBlbCBtYWwgdXNvXltBdW5xdWUgc2VndXJhbWVudGUsIGVzdG9zIGVycm9yZXMgcG9yIG1hbCB1c28gZGUgRXhjZWwgc2Ugdmllcm9uIGZhdm9yZWNpZG9zLCBjdWFuZG8gbm8gcHJvdm9jYWRvcywgcG9yIGVsIG1hbCBkaXNlw7FvIGRlIEV4Y2VsIGNvbW8gaGVycmFtaWVudGEgcGFyYSBtYW5lamFyIGRhdG9zXS4gRW4gdW4gdG9ubyBtw6FzIHBvc2l0aXZvLCBbZXN0ZSBwb3N0XShodHRwczovL291dHNpZGVyZGF0YS5uZXRsaWZ5LmNvbS9wb3N0L3doeS1pLW1pZ3JhdGVkLWZyb20tZXhjZWwtdG8tci8pIGV4cGxpY2EgcG9ycXVlIGFiYW5kb25hciBFeGNlbCB5IG1pZ3JhciBhIFIuIAoKCkVuIHBhbGFicmFzIGRlIEhhZGxleSBlbiBbZXN0YSBlbnRyZXZpc3RhXShodHRwczovL3d3dy5yLWJsb2dnZXJzLmNvbS9hZHZpY2UtdG8teW91bmctYW5kLW9sZC1wcm9ncmFtbWVycy1hLWNvbnZlcnNhdGlvbi13aXRoLWhhZGxleS13aWNraGFtL2FtcC8pCgo+IEkgdGhpbmsgdGhlIHRyYWRlb2ZmIGJldHdlZW4gU3RhdGEgYW5kIFIgaXM6IGRvIHlvdSB3YW50IGEgcG9pbnQtYW5kLWNsaWNrIGludGVyZmFjZSwgb3IgZG8geW91IHdhbnQgYSBwcm9ncmFtbWluZyBpbnRlcmZhY2U/IFBvaW50LWFuZC1jbGljayBpbnRlcmZhY2VzIGFyZSBncmVhdCwgYmVjYXVzZSB0aGV5IGxheSBvdXQgYWxsIG9mIHlvdXIgb3B0aW9ucyBpbiBmcm9udCBvZiB5b3UsIGFuZCB5b3UgZG9u4oCZdCBoYXZlIHRvIHJlbWVtYmVyIGFueXRoaW5nLiBZb3UgY2FuIG5hdmlnYXRlIHRocm91Z2ggdGhlIHNldCBvZiBwcmUtc3VwcGxpZWQgb3B0aW9ucy4gQW5kIHRoYXTigJlzIGFsc28gaXTigJlzIGdyZWF0ZXN0IHdlYWtuZXNzLCBiZWNhdXNlIGZpcnN0IG9mIGFsbCwgeW91IGFyZSBjb25zdHJhaW5lZCBpbnRvIHdoYXQgdGhlIGRldmVsb3BlciB0aG91Z2h0IHlvdSBzaG91bGQgYmUgYWJsZSB0byBkby4gQW5kIHNlY29uZGx5LCBiZWNhdXNlIHlvdXIgcHJpbWFyeSBpbnRlcmFjdGlvbiBpcyB3aXRoIGEgbW91c2UsIGl04oCZcyB2ZXJ5IGRpZmZpY3VsdCB0byByZWNvcmQgd2hhdCB5b3UgZGlkLiBBbmQgSSB0aGluayB0aGF04oCZcyBhIHByb2JsZW0gZm9yIHNjaWVuY2UsIGJlY2F1c2UgaWRlYWxseSB5b3Ugd2FudCB0byBzYXkgaG93IHlvdSBhY3R1YWxseSBnb3QgdGhlc2UgcmVzdWx0cy4gQW5kIHRoZW4gc2ltcGx5IGRvIHRoYXQgcmVsaWFibHkgYW5kIGhhdmUgb3RoZXIgcGVvcGxlIGNyaXRpcXVlIHlvdSBvbiB0aGF0LiBCdXQgaXTigJlzIGFsc28gcmVhbGx5IGhhcmQgd2hlbiB5b3UgYXJlIGxlYXJuaW5nLCBiZWNhdXNlIHdoZW4geW91IGhhdmUgYSBwcm9ibGVtLCBob3cgZG8geW91IGNvbW11bmljYXRlIHRoYXQgcHJvYmxlbSB0byBzb21lb25lIGVsc2U/IFlvdSBiYXNpY2FsbHkgaGF2ZSB0byBzYXksIOKAnEkgY2xpY2tlZCBoZXJlLCB0aGVuIEkgY2xpY2tlZCBoZXJlLCB0aGVuIEkgY2xpY2tlZCBoZXJlLCBhbmQgSSBkaWQgdGhpcy7igJ0gT3IgeW91IG1ha2UgYSBzY3JlZW4gY2FzdCwgYW5kIGl04oCZcyBqdXN0IGNsdW5reSkKCgpFc3RlIHR3ZWV0IGluY2lkZSB0YW1iacOpbiBlbiBhbGd1bm8gZGUgbG9zIHByb2JsZW1hcyBkZSBFeGNlbC4gVGllbmVzIHF1ZSB2ZXIgbGEgcmVzcHVlc3RhIHVuIHBvcXVpdG8gaXLDs25pY2EgZGUgRGFsZSBNYXNjaGV0dGUsIG11eSBidWVuYSEhIFBhcmEgZWxsbyBwaW5jaGEgZW4gZWwgdHdlZXQ6CgoKCmBgYHtyLCBlY2hvID0gRkFMU0UsIGZpZy5hc3AgPSA3Lzl9CnR3ZWV0cm1kOjp0d2VldF9lbWJlZCgiaHR0cHM6Ly90d2l0dGVyLmNvbS9EYWxlX01hc2NoL3N0YXR1cy8xMTM4NTY0MzE2NTk0OTcwNjI0IiwgdGhlbWUgPSAibGlnaHQiLCBhbGlnbiA9ICJjZW50ZXIiLCBkbnQgPSBUUlVFLCBwbGFpbiA9IFRSVUUsIG1heHdpZHRoID0gNDAwKQpgYGAKCjxicj4KCkFxdcOtIHRlbmVtb3MgdW4gcHJvYmxlbWEgY29uY3JldG8gcXVlIGhhIGdlbmVyYWRvIEV4Y2VsIGFsIHNlciB1c2FkbyBlbiBhbCBhbsOhbGlzaXMgZGUgZGF0b3M6IGhhbiB0ZW5pZG8gcXVlIHJlbm9tYnJhciBsb3MgZ2VuZXMgcGFyYSBldml0YXIgcXVlIEV4Y2VsIGludGVycHJldGUgc3VzIG5vbWJyZXMgY29tbyBmZWNoYXMuCgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgZmlnLmFzcCA9IDcvOX0KdHdlZXRybWQ6OnR3ZWV0X2VtYmVkKCJodHRwczovL3R3aXR0ZXIuY29tL19Db2xpbkZheS9zdGF0dXMvMTI5NDIwODYyMjA4MDIwNDgwMCIsIHRoZW1lID0gImxpZ2h0IiwgYWxpZ24gPSAiY2VudGVyIiwgZG50ID0gVFJVRSwgcGxhaW4gPSBUUlVFLCBtYXh3aWR0aCA9IDQwMCkKYGBgCgoKCjxicj4KCgpFbiBlc3RlIFtwb3N0XShodHRwczovL3d3dy5icm9kcmlndWVzLmNvL2Jsb2cvMjAyMC0xMS0yMS1ndWlzX21pc3Rha2UvKSwgQnJ1bm8gUm9kcmlndWVzIGFyZ3VtZW50YSBwb3JxdcOpIG5vIHNlIHB1ZWRlIHVzYXIgRXhjZWwgcGFyYSBoYWNlciBDaWVuY2lhIGRlIERhdG9zLiBQb3Igc3VwdWVzdG8gcXVlIGFjdHVhbG1lbnRlIGhheSBtdWNoYXMgKiphbHRlcm5hdGl2YXMgcGFyYSBoYWNlciBhbsOhbGlzaXMgZGUgZGF0b3MgbyB2aXN1YWxpemFjaW9uZXMqKiBzaW4gdXNhciB1biBsZW5ndWFqZSBkZSBwcm9ncmFtYWNpw7NuLCBwb3IgZWplbXBsbyBbYXF1w61dKGh0dHBzOi8vYXBwc2lsb24uY29tL3RvcC0zLWJpLXRvb2xzLykgbyBbYXF1w61dKGh0dHBzOi8vd3d3LnN0b3J5dGVsbGluZ3dpdGhkYXRhLmNvbS9ibG9nLzIwMTkvMS8yNC9uZXcteWVhci1uZXctdG9vbHMpLiBZbyBubyBkaWdvIG5hZGEsIHBlcm8gLi4uCgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgZXZhbCA9IFRSVUUsIGZpZy5hc3AgPSA0LzIsIG91dC53aWR0aCA9ICI3NSUiLCBmaWcuYWxpZ24gPSAiY2VudGVyIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiLi9pbWFnZW5lcy9SX2NvbW9fY2Fycy5qcGVnIikpCmBgYAoKPGJyPgoKUGxlYXNlLCAqKmRvbid0IGxvb2sqKiBbdGhpcyBvdGhlciBvbmVdKGh0dHA6Ly9jcmFzaHdvcmtzLm9yZy9pZl9wcm9ncmFtbWluZ19sYW5ndWFnZXNfd2VyZV92ZWhpY2xlcy8pICBgciBlbW86OmppKCJzbWlsZSIpYCAhISEKCgoKPGJyPgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCiMjIDYuIMK/UG9yIHF1w6kgUj8KCkVuIGVsIGN1cnNvIHVzYXJlbW9zIFIgeSBSU3R1ZGlvLiBFbiBsYSBhY3R1YWxpZGFkLCBlbiBlbCBjYW1wbyBkZSBsYSBjaWVuY2lhIGRlIGRhdG9zLCBoYXkgc8OzbG8gMiBhbHRlcm5hdGl2YXMsIFBoeXRvbiBvIFIuIERlIGhlY2hvIGhheSB1biBpbnRlbnNvIGRlYmF0ZSBzb2JyZSBjdWFsIGVzIG3DoXMgYWRlY3VhZG8uIEhheSBtdWNoYXMgb3BpbmlvbmVzIGFsIHJlc3BlY3RvLCBwZXJvIHlvIGhlIHNlbGVjY2lvbmFkbyBbZXN0YV0oaHR0cHM6Ly9tY2hvdy5jb20vcG9zdHMvZGF0YS1zY2llbmNlLWNiay8pIHkgW2VzdGFdKGh0dHBzOi8vYmxvZy5zaG90d2VsbC5jYS9wb3N0cy93aHlfaV91c2Vfci8pLCBhdW5xdWUgbGEgdmVyZGFkLCB0YW1wb2NvIGVzIG5lY2VzYXJpbyBlbGVnaXIgdW4gc8OzbG8gbGVuZ3VhamUsIFtSIHkgUGh5dG9uIHB1ZWRlbiBjb2xhYm9yYXJdKGh0dHBzOi8vYmxvZy5yc3R1ZGlvLmNvbS8yMDE5LzEyLzE3L3ItdnMtcHl0aG9uLXdoYXQtcy10aGUtYmVzdC1mb3ItbGFuZ3VhZ2UtZm9yLWRhdGEtc2NpZW5jZS8pLgoKRXZpZGVudGVtZW50ZSBtaSBvcGluacOzbiBlcyBxdWUgcGFyYSBpbmljaWFyc2UgY2llbmNpYSBkZSBkYXRvcyBSIGVzdMOhIHZhcmlvcyBwYXNvcyBwb3IgZGVsYW50ZSBkZSBQaHl0b247IHNpIGJpZW4gZXMgdmVyZGFkLCBxdWUgcGFyYSBoYWNlciBNTCwgeSBwcmluY2lwYWxtZW50ZSBETCwgUGh5dG9uIHB1ZWRlIHNlciBtw6FzIGFkZWN1YWRvLiBFbiBwYWxhYnJhcyBkZSBIYWRsZXkgZW4gW2VzdGEgZW50cmV2aXN0YV0oaHR0cHM6Ly93d3cuci1ibG9nZ2Vycy5jb20vYWR2aWNlLXRvLXlvdW5nLWFuZC1vbGQtcHJvZ3JhbW1lcnMtYS1jb252ZXJzYXRpb24td2l0aC1oYWRsZXktd2lja2hhbS9hbXAvKQoKCj4gRm9yIFIgYW5kIFB5dGhvbiwgUHl0aG9uIGlzIGZpcnN0IGFuZCBmb3JlbW9zdCBhIHByb2dyYW1taW5nIGxhbmd1YWdlLiBBbmQgdGhhdCBoYXMgYSBsb3Qgb2YgZ29vZCBmZWF0dXJlcywgYnV0IGl0IHRlbmRzIHRvIG1lYW4sIHRoYXQgaWYgeW91IGFyZSBnb2luZyB0byBkbyBkYXRhIHNjaWVuY2UgaW4gUHl0aG9uLCB5b3UgaGF2ZSB0byBmaXJzdCBsZWFybiBob3cgdG8gcHJvZ3JhbSBpbiBQeXRob24uIFdoZXJlYXMgSSB0aGluayB5b3UgYXJlIGdvaW5nIHRvIGdldCB1cCBhbmQgcnVubmluZyBmYXN0ZXIgd2l0aCBSLCB0aGFuIHdpdGggUHl0aG9uIGJlY2F1c2UgdGhlcmXigJlzIGp1c3QgYSBidW5jaCBtb3JlIHN0dWZmIGJ1aWx0IGluIGFuZCB5b3UgZG9u4oCZdCBoYXZlIHRvIGxlYXJuIGFzIG1hbnkgcHJvZ3JhbW1pbmcgY29uY2VwdHMuIFlvdSBjYW4gZm9jdXMgb24gYmVpbmcgYSBncmVhdCBwb2xpdGljYWwgc2NpZW50aXN0IG9yIHdoYXRldmVyIHlvdSBkbyBhbmQgbGVhcm5pbmcgZW5vdWdoIFIgdGhhdCB5b3UgZG9u4oCZdCBoYXZlIHRvIGJlY29tZSBhbiBleHBlcnQgcHJvZ3JhbW1lciBhcyB3ZWxsIHRvIGdldCBzdHVmZiBkb25lLgoKCkVzdGUgdHdlZXReW0FsZ3VuYXMgZGUgbGFzIHJlc3B1ZXN0YXMgYWwgdHdlZXQgc29uIG11eSBidWVuYXNdIGVqZW1wbGlmaWNhIHVuIHBvY28gbGEgcml2YWxpZGFkIChjb24gYnVlbiByb2xsbykgZW50cmUgUiB5IFBoeXRvbjoKCmBgYHtyLCBlY2hvID0gRkFMU0UsIGZpZy5hc3AgPSA3Lzl9CnR3ZWV0cm1kOjp0d2VldF9lbWJlZCgiaHR0cHM6Ly90d2l0dGVyLmNvbS9kaW5nYTkyL3N0YXR1cy8xMjczNjg1NDgwOTU4MjQyODIzIiwgdGhlbWUgPSAibGlnaHQiLCBhbGlnbiA9ICJjZW50ZXIiLCBkbnQgPSBUUlVFLCBwbGFpbiA9IFRSVUUsIG1heHdpZHRoID0gNDAwKQpgYGAKCgpBdW5xdWUgZGVzcHXDqXMgZGUgbG8gcXVlIGRpam8gRWxtbywgeW8gY3JlbyBxdWUgZWwgZGViYXRlIGVzdMOhIHphbmphZG86CgpgYGB7ciwgZWNobyA9IEZBTFNFLCBmaWcuYXNwID0gNy85fQpsaWJyYXJ5KHR3ZWV0cm1kKSAgICMtIGRldnRvb2xzOjppbnN0YWxsX2dpdGh1YigiZ2FkZW5idWllL3R3ZWV0cm1kIikKdHdlZXRybWQ6OnR3ZWV0X2VtYmVkKCJodHRwczovL3R3aXR0ZXIuY29tL21pbmVib2Nlay9zdGF0dXMvMTE3NDM4MjYyMzQ5OTY2MTMxMiIsIHRoZW1lID0gImRhcmsiLCBhbGlnbiA9ICJjZW50ZXIiLCBkbnQgPSBUUlVFLCBwbGFpbiA9IFRSVUUsIG1heHdpZHRoID0gMzAwKQpgYGAKCgoKUiBzZSBlc3TDoSBjb252aXJ0aWVuZG8gZW4gZWwgc29mdHdhcmUgZXN0YWTDrXN0aWNvIGRlIHJlZmVyZW5jaWEgZW4gbGEgbWF5b3LDrWEgZGUgbG9zIGNlbnRyb3MgZGUgaW52ZXN0aWdhY2nDs24geSB1bml2ZXJzaWRhZGVzLCB5IHN1IHVzbyBzZSBlc3TDoSBleHRlbmRpZW5kbyB0YW1iacOpbiBkZW50cm8gZGUgbGEgZW1wcmVzYSBwcml2YWRhLiBSIGVzIHNvZnR3YXJlIGxpYnJlLCBncmF0dWl0byB5IGVzdMOhIGluY29ycG9yYW5kbyBtw6FzIHLDoXBpZGFtZW50ZSBxdWUgb3Ryb3MgcHJvZ3JhbWFzIGxhcyB0w6ljbmljYXMgYXZhbnphZGFzIGRlIGFuw6FsaXNpcyBkZSBkYXRvcyBxdWUgc2UgZXN0w6FuIGRlc2Fycm9sbGFuZG8gZW4gbG9zIMO6bHRpbW9zIGHDsW9zLiBPdHJvIGFzcGVjdG8gaW1wb3J0YW50ZSBxdWUgY29udmllcnRlIGEgUiBlbiB1bmEgaGVycmFtaWVudGEgbXV5IHBvdGVudGUgZXMgcXVlIGluY29ycG9yYSB1biBsZW5ndWFqZSBkZSBwcm9ncmFtYWNpw7NuIHNlbmNpbGxvIHkgbXV5IGZsZXhpYmxlLCBxdWUgcGVybWl0ZSB0ZW5lciB1biBjb250cm9sIHRvdGFsIHNvYnJlIGVsIGFuw6FsaXNpcyBxdWUgc2UgZXN0w6EgZGVzYXJyb2xsYW5kbwoKCkNyZW8gcXVlIGVuIGxhIGFjdHVhbGlkYWQgUiBlcyBlbCBtZWpvciBwcm9ncmFtYSBwYXJhIGluaWNpYXJzZSB5IGhhY2VyIGFuw6FsaXNpcyBkZSBkYXRvcy4gU2kgbm8gbWUgYWNhYmFzIGRlIGNyZWVyLCBvIHF1aWVyZXMgbGVlciBhbGdvIHNvYnJlIGxhIGltcG9ydGFuY2lhIHkgY2FwYWNpZGFkZXMgZGUgUiBwdWVkZXMgaGFjZXJsbyBbYXF1w61dKGh0dHA6Ly9uYWRhZXNncmF0aXMuZXMvZmVybmFuZGV6LXZpbGxhdmVyZGUvcikgbyBbYXF1w61dKGh0dHBzOi8vd3d3LnItYmxvZ2dlcnMuY29tL3doeS1yLWlzLXRoZS1iZXN0LWRhdGEtc2NpZW5jZS1sYW5ndWFnZS10by1sZWFybi10b2RheS8pLCBvIFthcXXDrV0oaHR0cHM6Ly9zaGlyaW5zcGxheWdyb3VuZC5uZXRsaWZ5LmNvbS8yMDE3LzA5L29kZV90b19yLykgbyBtw6FzIHJlY2llbnRlbWVudGUgW2FxdcOtXShodHRwczovL3d3dy5lb2RhLmRlL2VuL3dpc3Nlbi9ibG9nL3ItcHl0aG9uLWp1bGlhLWRhdGEtc2NpZW5jZS0yMDE5KS4KCjxicj4KClIgZXMgY2FkYSB2ZXogbcOhcyB1c2Fkbywgbm8gc8OzbG8gZW4gbGEgdW5pdmVyc2lkYWQgeSBsYSBkb2NlbmNpYSwgc2lubyB0YW1iacOpbiBlbiBlbCBtdW5kbyBkZSBsYSBlbXByZXNhLCBwdWVkZXMgdmVybG8gW2FxdcOtXShodHRwczovL3d3dy5yLWJsb2dnZXJzLmNvbS9zaXgtcmVhc29ucy10by1sZWFybi1yLWZvci1idXNpbmVzcy8pIG8gW2FxdcOtXShodHRwOi8vYmxvZy5zZWxsb3JtLmNvbS8yMDE2LzExLzI2L3RhbGstci1pcy1wcm9kdWN0aW9uLXNhZmUvKS4gVW5hIGRlIGxhcyBjb25mZXJlbmNpYXMgbcOhcyBpbXBvcnRhbnRlcyBzb2JyZSBlbCB1c28gY29tZXJjaWFsIGRlIFIgZXMgW1RoZSBFbnRlcnByaXNlIEFwcGxpY2F0aW9ucyBvZiB0aGUgUiBMYW5ndWFnZSBDb25mZXJlbmNlIChFQVJMKV0oaHR0cHM6Ly9lYXJsY29uZi5jb20vI2luZm8pLgoKRW50cmUgbGFzIGVtcHJlc2FzIHF1ZSB1c2FuIFIgZXN0w6FuOiBHb29nbGUsIEZhY2Vib29rLCBUd2l0dGVyLCBNaWNyb3NvZnQsIElCTSwgVWJlciwgRm9yZCwgQWlyYm5iLCBBbWVyaWNhbiBFeHByZXNzLCAgQmFyY2xheXMgQmFuaywgW0Jhbmsgb2YgQW1lcmljYV0oaHR0cHM6Ly93d3cuci1ibG9nZ2Vycy5jb20vYmFuay1vZi1hbWVyaWNhLXVzZXMtci1mb3ItcmVwb3J0aW5nLykgeSBtdWNoYXMgb3RyYXMuIFtBcXXDrV0oaHR0cHM6Ly9naXRodWIuY29tL1RoaW5rUi1vcGVuL2NvbXBhbmllcy11c2luZy1yKSBvIFthcXXDrV0oaHR0cHM6Ly93d3cubGlzdGVuZGF0YS5jb20vMjAxNi8xMi9jb21wYW5pZXMtdXNpbmctci5odG1sKSBwdWVkZXMgZW5jb250cmFyIHVuIGxpc3RhZG8gbcOhcyBjb21wbGV0by4gCgoKVW5hIGRlIGxhcyBtYXlvcmVzIHZlbnRhamFzIGRlIHVzYXIgUiBlcyBxdWUgcHVlZGVzIHVzYXIgUm1hcmtkb3duIHkgU2hpbnkuIExvIHZlcmVtb3MsIHBlcm8gW2FxdcOtXShodHRwczovL3Jmb3J0aGVyZXN0b2Z1cy5jb20vMjAxOS8wMy9yLWtpbGxlci1mZWF0dXJlLXJtYXJrZG93bi8pIHRpZW5lcyB1biBwb3N0IHF1ZSBleHBsaWNhIHN1cyB2ZW50YWphcy4gVW4gZWplbXBsbyBkZSB1dGlsaXphY2nDs24gZXMgW2VzdMOhIGFwbGljYWNpw7NuIGRlIHNlZ3VpbWluZW50byBkZWwgY292aWRdKGh0dHBzOi8vY2FsY2F0LmNvdmlkMTkuY2EuZ292L2NhY292aWRtb2RlbHMvKSBxdWUgaGEgaW1wbGVtZW50YWRvIGVsIGRlcGFydGFtZW50byBvZiBQdWJsaWMgSGVhbHRoIGRlIENhbGlmb3JuaWEuCgpTaSB0ZSBndXN0YW4gbG9zIHJhbmtpbmdzIGRlIGxlbmd1YWplcyBkZSBwcm9ncmFtYWNpw7NuLCBbYXF1w61dKGh0dHBzOi8vcmVkbW9uay5jb20vc29ncmFkeS8yMDIwLzAyLzI4L2xhbmd1YWdlLXJhbmtpbmdzLTEtMjAvKSB0aWVuZXMgdW5vLCBkZSBlbmVybyBkZSAyMDIwLCBlbiBlbCBQaHl0b24gZXN0w6EgZW4gc2VndW5kbyBsdWdhciBtaWVudHJhcyBxdWUgUiBlc3TDoSBlbiBlbCBwdWVzdG8gMTMuIEVzdG8gZXMgbG8gcXVlIHF1ZSBzZSBkaWNlIGRlIFI6Cgo+ICBJbiBvdXIgZmlyc3QgcnVuIG9mIHRoZXNlIHJhbmtpbmdzLCBSIHBsYWNlZCAxN3RoLiBBbGwgdGhlc2UgeWVhcnMgbGF0ZXIgaXQganVtcHMgdHdvIHNwb3RzIGZyb20gdGhlIGxhc3QgcXVhcnRlcuKAmXMgZWRpdGlvbiB1cCB0byAjMTMuIEluIHRoZSBpbnRlcmltLCBpdCBoYXMgcmFua2VkIGFzIGhpZ2ggYXMgMTJ0aCBidXQgbW9zdGx5IGNvbW1vbmx5IGlzIGZvdW5kIGluIHRoZSAxMy0xNSByYW5nZS4gR2l2ZW4gdGhlIGxhbmd1YWdl4oCZcyBzcGVjaWFsaXplZCBmb2N1cywgdGhpcyBpcyBsaWtlbHkgaXRzIGVmZmVjdGl2ZSBjZWlsaW5nLCBidXQgaXTigJlzIGFsc28gYW4gaWxsdXN0cmF0aW9uIG9mIHRoZSByZW1hcmthYmxlIHBvcHVsYXJpdHkgb2YgYSBsYW5ndWFnZSB3aG9zZSB1c2FnZSBpcyByZXN0cmljdGVkIGZvciBhbGwgaW50ZW50cyBhbmQgcHVycG9zZXMgdG8gYSBzaW5nbGUgZG9tYWluIOKAkyB0aG9zZSB3aG8gd29yayB3aXRoIGFuZCBvcGVyYXRlIG9uIGRhdGEuIFLigJlzIHN1Y2Nlc3MgaXMgYW4gZXhhbXBsZSBvZiB0aGUgcG93ZXIgb2YgYW4gYWNhZGVtaWEtc3VwcG9ydGVkIGNvbW11bml0eSB0byBlbGV2YXRlIGEgbGFuZ3VhZ2UgYmV5b25kIGl0cyBleHBlY3RlZCB0aHJlc2hvbGQsIGFuZCBpdCBpcyBub3RhYmxlIHRoYXQgdGhlIGFmb3JlbWVudGlvbmVkIGdyb3d0aCBvZiBQeXRob24gYW5kIGl0cyBleHBhbnNpb24gaW50byBkYXRhIGFuYWx5dGljcyBoYXMgbm90IG9ic2VydmFibHkgY29tZSBhdCB0aGUgZXhwZW5zZSBvZiB0cmFjdGlvbiBpbiBSLgoKCk1pZW50cmFzIHJlZXNjcmlibyBlc3RhcyBub3RhcywganVsaW8gZGUgMjAyMCwgUiBoYSBzdWJpZG8gYWwgcHVlc3RvIDgsIG1pZW50cmFzIHF1ZSBQaHl0b24gZXN0w6EgZW4gZWwgdGVyY2Vyby4gRWwgcmFua2luZyBtw6FzIGFjdHVhbCBwdWVkZXMgdmVybG8gW2FxdcOtXShodHRwczovL3d3dy50aW9iZS5jb20vdGlvYmUtaW5kZXgvKS4KCgojIyMgwr9FcyBjb21wbGljYWRvIGFwcmVuZGVyIFI/CgoKwr9BcHJlbmRlciBSIGVzIGNvbXBsaWNhZG8/IE5vLCBidWVubyAuLi4geWEgcmVzcG9uZGVyw6kgYSBlc3RvIGVuIGNsYXNlLiBObyBtaXJlcyBlbCBzaWd1aWVudGUgdHdlZXQ6CgoKCmBgYHtyLCBlY2hvID0gRkFMU0V9CnR3ZWV0cm1kOjp0d2VldF9lbWJlZCgiaHR0cHM6Ly90d2l0dGVyLmNvbS9yb2dpZXJLL3N0YXR1cy83MzA4NjM3Mjk0MjA3MDE2OTciLCB0aGVtZSA9ICJsaWdodCIsIGFsaWduID0gImNlbnRlciIsIGRudCA9IFRSVUUsIHBsYWluID0gVFJVRSwgbWF4d2lkdGggPSA0MDApCmBgYAoKCjxicj4KCkF1bnF1ZSBsYSB2ZXJkYWQsIGVzdGEgZGlmaWN1bHRhZC9yYXJlemEgZGUgUiBlcyBjb3NhIGRlIG90cm9zIHRpZW1wb3MuIENvbiBlbCB0aWR5dmVyc2UgdG9kbyBlcyBtw6FzIGbDoWNpbCB5IGJyaWxsYW50ZS4gQ29tbyBtdWVzdHJhIGVsIHR3ZWV0IGRlIENocmlzIEFsYm9uLCB1biBtaWVtYnJvIGRlc3RhY2FkbyBkZSBsYSBjb211bmlkYWQgUGh5dG9uLiBNZXJlY2UgbGEgcGVuYSBlY2hhcmxlIHVuIG9qbyBhIGFsZ3VuYXMgZGUgbGFzIHJlc3B1ZXN0YXMgYWwgdHdlZXQuCgoKPGJsb2NrcXVvdGUgY2xhc3M9InR3aXR0ZXItdHdlZXQiPjxwIGxhbmc9ImVuIiBkaXI9Imx0ciI+SSB1c2VkIFIgZm9yIG1hbnkgeWVhcnMgYnV0IHdoZW5ldmVyIEkgaGVhciBhYm91dCBpdCBub3cgaXQgZmVlbHMgbGlrZSBJIHdhdGNoZWQgUiBzZWFzb24gb25lIGFuZCBub3cgaXQgaXMgb24gYSBzcGluLW9mZiBiYXNlZCBvbiB0aGUgY2hhcmFjdGVycyBvZiBzZWFzb24gMTMuPC9wPiZtZGFzaDsgQ2hyaXMgQWxib24gKFxAY2hyaXNhbGJvbikgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9jaHJpc2FsYm9uL3N0YXR1cy8xMjI1NTkyNDQwMjMwNDgxOTIwP3JlZl9zcmM9dHdzcmMlNUV0ZnciPkZlYnJ1YXJ5IDcsIDIwMjA8L2E+PC9ibG9ja3F1b3RlPiA8c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly9wbGF0Zm9ybS50d2l0dGVyLmNvbS93aWRnZXRzLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+IAoKPGJyPgoKCgojIyMgQWxndW5vcyBzaXRpb3MgYSB2aXNpdGFyCgoKLSBbUndlZWtseV0oaHR0cHM6Ly9yd2Vla2x5Lm9yZy8pLiBDYWRhIHNlbWFuYSBlbnbDrWFuIHVuIGFyY2hpdm8gY29uIGxvcyBtZWpvcmVzIGFuw6FsaXNpcyBoZWNob3MgY29uIFIgZXNhIHNlbWFuYS4gVGllbmVzIHF1ZSBhcHVudGFydGUgW2FxdcOtXShodHRwczovL2ZlZWRidXJuZXIuZ29vZ2xlLmNvbS9mYi9hL21haWx2ZXJpZnk/dXJpPXJ3ZWVrbHkmbG9jPWVuX1VTKQoKLSBbUmJsb2dnZXJzXShodHRwczovL3d3dy5yLWJsb2dnZXJzLmNvbS8pLiBVbiBhZ3JlZ2Fkb3IgZGUgYmxvZ3MgcmVsYWNpb25hZG9zIGNvbiBSLgoKLSBbUiBWaWV3c10oaHR0cHM6Ly9ydmlld3MucnN0dWRpby5jb20vKS4gRXMgdW4gYmxvZyBhc29jaWFkbyBhIFJTdHVkaW8uIENhZGEgbWVzIHNhY2EgdW4gcG9zdCBkb25kZSBlbGlnZW4gbG9zIG1lam9yZXMgNDAgcGFxdWV0ZXMgZGUgZXNlIG1lczsgcG9yIGVqZW1wbG8sIFthcXXDrV0oaHR0cHM6Ly9ydmlld3MucnN0dWRpby5jb20vMjAxOS8wOC8yOS9qdWx5LTIwMTktdG9wLTQwLXItcGFja2FnZXMvKSB0aWVuZXMgZWwgZGUganVsaW8gZGUgMjAxOS4KCi0gW3N3aXJsXShodHRwczovL3N3aXJsc3RhdHMuY29tLykuIHN3aXJsIHRlYWNoZXMgeW91IFIgcHJvZ3JhbW1pbmcgYW5kIGRhdGEgc2NpZW5jZSBpbnRlcmFjdGl2ZWx5LCBhdCB5b3VyIG93biBwYWNlLCBhbmQgcmlnaHQgaW4gdGhlIFIgY29uc29sZSEKCgo8YnI+Cgo8YnI+Cg==