1. R Markdown.

1.1. ¿Qué es R Markdown?

R Markdown puede definirse como un ecosistema dentro de R y R Studio que permite la elaboración de diversos tipos de textos (documentos de texto, presentaciones, aplicaciones basadas en texto), y que permmite la integración de elementos diferentes como texto (en formato Markdown, código de R, resultados de análisis derivados de dichos códigos, así como formato de acuerdo a las necesidades de los autores, lo que se delimita en la sección de los metadados o YAML).

1.2. Partes de un documento en formato Rmarkdown.

Un documento en formato rmarkdown() está integrado por 3 partes:

  1. *YAML** (Yet Another Markdown Language), que contiene los metadatos del documento.
  2. La sección de texto enriquecido, donde el autor presenta la redacción deseada, utilizando las características de escritura de markdown.
  3. Las secciones de código de R, que se pueden integrar mediante dos maneras:
  1. a través de chunks o “trozos” de código,
  2. a través de código dentro de cada línea de texto en la redacción.

2. Markdown

2.1. ¿Qué es Markdown?

Es un lenguaje de “marcado ligero” creado por John Gruber en el año 2004 que trata de lograr o permitir facilidad en la lectura y en la escritura de documentos, evitando distracciones y complicaciones, y que puede ser renderizado (transformado) en diversos formatos.
Es una manera de simplificar la escritura en la era digital, en donde se debe publicar el mismo texto en formatos diferentes. De manera más concreta, Markdown es una sintaxis que permite incorporar elementos de texto enriquecido en elementos de texto plano.

El texto enriquecido consiste en caracteres de texto a los que se les añade formato (negritas, cursivas, subrayado, interlineado, espacios entre palabras, etc.). El texto plano solo consiste en letras, números, signos de puntuación y algunos símbolos, sin elementos de formato.  La sintaxis consiste en el sistema para utilizar símbolos y caracteres, que le explican al procesador de una computadora la manera en que se deben realizar algunas tareas y, específicamente se refiere a la apariencia deseada del texto.

2.2. Ventajas de escribir en formato Markdown.

  1. Enfocarse en la escritura y no procrastinar con elementos de formato.
  2. Permite exportar el contenido de Markdown a formatos diversos (html, pdf, word, web pages).
  3. Los archivos se pueden abrir en cualquier formato, aún cuando en el futuro cambien los programas de texto.
  4. Los archivos son “ligeros” y fáciles de sincronizar entre distintos dispositivos.
  5. Facilidad para compartir y colaborar.
  6. Las citaciones se pueden autoformatear.

2.3. Elementos de sintaxis en Markdown

2.3.1. Resaltar texto

  • Si se desea resaltar una palabra en negritas e itálica a la vez, se usa triple *** antes y después de la palabra.
palabra en ***negritas e itálica***
  • Si se desea resaltar una palabra en negritas se usa doble ** antes y después de la palabra.
palabra en **negritas**
  • Si se desea resaltar una palabra en itálicas se usa un * sencillo antes y después de la palabra.
palabra en *itálicas*
  • Si se desea incluir un sub índice se utiliza la tilde de la “ñ”, de manera que F2.
incluir el subíndice 2 en F:  F~2~
  • Si se desea incluir un super índice se utiliza el acento circunflejo, de manera que F2.
incluir el super índice 4 en F:  F^2^

2.3.1.1. Cambiar de color al texto.

Esto depende del tipo de formato de salida: html o pdf, pues se usan comandos diferentes.

  • Para html, el texto a cambiar de color se incluye en <span> y posteriormente <span style="color: red;">texto</span>, por ejemplo:
Roses are <span style="color: green;">red</span>, violets are <span style="color: red;">blue</span>.

El resultado es:

Roses are red, violets are blue.

  • Para un pdf, se usan comandos de LaTeX \textcolor{color}{texto}, de manera que, por ejemplo:
Roses are \textcolor{red}{red}, violets are \textcolor{blue}{blue}.

El primer paréntesis refiere el color deseado y el segundo contiene el texto sobre el que se debe aplicar el color.

El resultado es:

Roses are , violets are .

2.3.2. Apartados y sub apartados.

Para asignar apartados y sub apartados se utiliza el signo de “#” (número). El apartado inicial o mayor se indica con solo un signo “#”, y a medida que se aumenta la cantidad de signos, entonces se van posicionando como sub apartados, y el tamaño de la tipografía va decreciendo.
Por ejemplo:

1. Apartado principal. (1 #)

1.1. Primer partado secundario. (2 ##)

1.1.1. Sub apartado primero del Primer apartado secundario. (3 ###)

1.1.1.1. Sub sub apartado primero del Primer apartado secundario. (4 ####)

1.1.2. Sub apartado segundo del Primer apartado secundario. (3 ###)

1.2. Segundo apartado secundario. (2 ##)

2. Segundo apartado principal. (1 #)

2.3.2.1. Omitir encabezados.

En caso de desear que un encabezado (que comience con “#” no sea incluido en la ennumeración o listado correspondiente) se utiliza el script {.unlisted .unnumbered} después del título señalado con ““#”, de la siguiente manera:

# Section heading {.unlisted .unnumbered}

2.3.3.Listados.

En R Markdown se pueden realizar dos tipos o formatos de listas: ordenadas o numeradas y las no ordenadas.

La realización de listados ordenados se realiza anteponiendo el número y un espacio antes de cada texto, además de dejar un espacio entre el párrafo previo y el inicio del listado, por ejemplo:

1.  El primer elemento.
2.  El segundo elemento.
3.  El tercer elemento.
4.  Etc.

El resultado es:

  1. El primer elemento.
  2. El segundo elemento.
  3. El tercer elemento.
  4. Etc.

También se pueden ordenar utilizando letras:

a.  Primer elemento
b.  Segundo elemento
c.  Tercer elemento

El resultado es:

  1. Primer elemento
  2. Segundo elemento
  3. Tercer elemento

En caso de realizar un listado sin jerarquía o numeración, solo se coloca un “*” o un guión intermedio “-” y un espacio antes de cada texto:

-   Primer elemento.
-   Segundo elemento.
-   Tercer elemento.
-   Etc.

El resultado es:

  • Primer elemento.
  • Segundo elemento.
  • Tercer elemento.
  • Etc.

Otra opción son listados mezclados, para lo que se usa dos “tab” para los sub elementos:

1.  Primer elemento

2.  Segundo elemento

    1.  Primer sub elemento (incluye dos "tab")
    2.  Segundo sub elemento (incluye dos "tab")

3.  Tercer elemento

    -   Otro sub elemento no ordenado (incluye dos "tab")
    -   Otro sub elemento no ordenado (incluye dos "tab")

El resultado es:

  1. Primer elemento

  2. Segundo elemento

    1. Primer sub elemento (incluye dos “tab”)
    2. Segundo sub elemento (incluye dos “tab”)
  3. Tercer elemento

    • Otro sub elemento no ordenado (incluye dos “tab”)
    • Otro sub elemento no ordenado (incluye dos “tab”)

2.3.4. Separación.

2.3.4.1. Renglones continuos.

La manera de escribir un párrafo en R Markdown es a partir de ubicar el cursor en una línea numerada y, así, continuar escribiendo sin detenerse hasta el punto final. A medida que el párrafo sea cada vez más largo, automáticamente el texto irá bajando de líneas, pero ahora estas no están numeradas. R Mardown lee estas líneas no-numeradas como parte de un mismo párrafo, y no hace cortes ni saltos.

Aún si se da un solo “click” a la tecla “ENTER”, y en el visor de R Markdown se cambia de línea numerada, en el caso del “output” (html, pdf o word) no habrá ocurrido un salto de párrafo, sino que continua como parte de un mismo párrafo. Por ejemplo:

"Este es el párrafo de la línea 80.
Este es el párrafor de la línea 81."

El resultado es:
“Este es el párrafo de la línea 80. Este es el párrafo de la línea 81.”

2.3.4.2. Separación entre renglones.

Para lograr laseparación entre líneas o “saltar líneas seguidas” dentro de un mismo párrafo, se utiliza un “doble espacio” al final del renglón que se desea separar (dos veces a la barra espaciadora); también se puede utilizar una barra diagonal palabra final.\, “\” al final del renglón. Por ejemplo:

"Este es el párrafo de la línea 85.\
Este es el párrafor de la línea 86".

El resultado es: “Este es el párrafo de la línea 85.
Este es el párrafo de la línea 86.”

2.3.4.3. Separación entre párrafos.

Para separar párrafos entre sí se deja una línea numerada vacía entre ambos, por ejemplo:

""Por segundo año consecutivo, la mayoría de los programas sociales del
Gobierno de López Obrador tuvieron en 2020 un bajo desempeño y algunos
de ellos operaron también en condiciones de opacidad.

Así lo revela el Índice de Desempeño de los Programas Públicos Federales
2021 (INDEP) elaborado por la organización Agencia para el Desarrollo (...)."

El resultado es:

“Por segundo año consecutivo, la mayoría de los programas sociales del Gobierno de López Obrador tuvieron en 2020 un bajo desempeño y algunos de ellos operaron también en condiciones de opacidad.

Así lo revela el Índice de Desempeño de los Programas Públicos Federales 2021 (INDEP) elaborado por la organización Agencia para el Desarrollo (…).” (Ureste, 2021, 3 de noviembre de 2021)

2.3.5. Insertar un salto de página.

Para insertar un salto de página se utiliza el script \newpage, que es parte del lenguaje de LaTeX pero que, a su vez, reconoce el paquete de rmarkdown.

Por ejemplo:

"Contenido de página 1. \newpage 
Contenido de página 2."

“Contenido de página 1. Contenido de página 2.”

2.3.4. Insertar citas largas en párrafos separados.

En caso de una cita larga y de la que se desea separar un bloque de texto, se utiliza el signo de \> y se añade un “espacio” antes del inicio del párrafo, por ejemplo:

> Entre los programas con un escaso desempeño hay algunos de los
considerados 'estrella' en la presente administración, como Sembrando
Vida, el programa de reforestación con el que el Gobierno actual ha
dicho que busca combatir los efectos del cambio climático en México.
Otros con bajo rendimiento son el de Becas para personas con
discapacidad, y el programa de Universidades para el Bienestar Benito
Juárez. Por el contrario, el programa de Pensión para Adultos Mayores
está entre los que mejor rendimiento han tenido.

El resultado es:

Entre los programas con un escaso desempeño hay algunos de los considerados ‘estrella’ en la presente administración, como Sembrando Vida, el programa de reforestación con el que el Gobierno actual ha dicho que busca combatir los efectos del cambio climático en México. Otros con bajo rendimiento son el de Becas para personas con discapacidad, y el programa de Universidades para el Bienestar Benito Juárez. Por el contrario, el programa de Pensión para Adultos Mayores está entre los que mejor rendimiento han tenido.

2.3.4.1. Insertar sangrías.

Una manera “cruda” de colocar sangría es mediante la tecla | al inicio de un párrafo. Se debe recordar que markdown no reconoce los espacios en blanco, o los ignora y junta renglones separados. Por ello se le debe indicar el lugar de los espacios vacíos a manera de sangrías.

| When dollars appear it's a sign
|   that your code does not quite align  
| Ensure that your math  
|   in xaringan hath  
|   been placed on a single long line

El resultado es:

When dollars appear it’s a sign
  that your code does not quite align
Ensure that your math
  in xaringan hath
  been placed on a single long line

2.3.5. Notas al pie.

Para insertar notas al pie se utilizan, primero, los paréntesis cuadrados [], adentro se coloca el signo ^1 y se añade un identificador.
Aparte, en cualquier parte del texto, se añade la misma sintaxis, se agrega un signo de “:” (dos puntos) y se añade el texto de la nota al pie, por ejemplo:

"Por ejemplo, para el programa Beca Universal para Estudiantes de
Educación Media Superior Benito Juárez, uno de los dos incluidos en la
'Caja Negra', el Ejecutivo propone que para el próximo año disponga de
34 mil 999 millones de pesos, es decir, 4% más [^1] que el presupuesto
aprobado en este 2021." (Ureste, 2021, 3 de noviembre)

[^1]: Esta nota es mía y no se encuentra en el texto original.

El resultado es:

“Por ejemplo, para el programa Beca Universal para Estudiantes de Educación Media Superior Benito Juárez, uno de los dos incluidos en la ‘Caja Negra’, el Ejecutivo propone que para el próximo año disponga de 34 mil 999 millones de pesos, es decir, 4% más 1 que el presupuesto aprobado en este 2021.” (Ureste, 2021, 3 de noviembre)

2.3.6. Tablas de contenido.

En Markdown es posible incluir tablas en formato sencillo, y se elaboran manualmente mediante el uso de signos ‘|’ para separar columnas y los guiones intermedios ‘-’ para separar la fila de encabezado respecto de las filas con contenido.
En el caso de desear incluir un título a la tabla, al final de ésta se incluye el signo ‘:’ y posteriormente se redacta el título, por ejemplo:

| Número |       Ítem       |
|:------:|:----------------:|
|   1    | primer elemento  |
|   2    | segundo elemento |
|   3    | tercer elemento  |

: Aquí se escribe el título de la tabla

El resultado es:

Aquí se escribe el título de la tabla
Número Ítem
1 primer elemento
2 segundo elemento
3 tercer elemento

La página tables generator es una alternativa de apoyo para generar tablas en formato markdown.

2.3.7. Incluir una dirección de URL.

Esto se logra a partir de dos elementos: primero se refiere el nombre o etiqueta de referencia, y se ubica entre paréntesis cuadrados [etiqueta] y a continuación se incluye la dirección URL ubicada entre paréntesis ().  Por ejemplo:

[página web de tables generator](https://www.tablesgenerator.com/markdown_tables)

El resultado es:

página web de tables generator

En caso de desear que se visualice la liga URL completa, entonces se usan los signos de < > al inicio y al final de la dirección URL, por ejemplo:

la página "tables generator" `<https://www.tablesgenerator.com/markdown_tables>`.

Esta es la liga URL de la página “tables generator” <https://www.tablesgenerator.com/markdown_tables>.

2.3.8. Incluir una imagen en el texto.

Esto se logra a partir de varios elementos: ! + [etiqueta] + (ruta de acceso a la imagen dentro del disco duro).

Por defecto, R Markdown buscará la imágenes dentro del directorio de trabajo en que se encuentra enraizado, por lo que, si la imagen se encuentra dentro del mismo directorio entonces solo se requiere escribir el nombre del archivo de imagen dentro de los paréntesis, incluyendo el formato del archivo de imagen (ya sea .jpg, .jpeg, .pdf, .png u otro).

![imagen dentro del directorio de trabajo](intervalo_confianza.png)

El resultado es: imagen dentro del directorio de trabajo

En caso de que la imagen se encuentre fuera del directorio de trabajo pero, a su vez, se encuentra dentro del disco duro, entonces sí se debe escribir la ruta de acceso al archivo de imagen dentro de los paréntesis.

![imagen dentro del disco duro](~/Dropbox/R/Rmarkdown/prueba_uso_markdown_files/imagen_prueba.png)⁩

El resultado es:

Otra opción para insertar imágenes es a partir de “traer” al texto archivos que se encuentran ubicados en internet, para ello se requiere señalar la dirección URL del archivo de imagen, lo que se escribe dentro de los paréntesis.

![imagen en
URL](https://economipedia.com/wp-content/uploads/Captura-de-pantalla-2019-09-10-a-les-11.09.35.png)

El resultado es:

imagen en URL

2.3.8.1. Controlar el tamaño de las imágenes.

Hay diversas maneras de controlar el tamaño de las imágenes. Aquí se revisa la manera de hacerlo directamente sobre el comando que inserta una imagen (en vez de hacerlo desde el “chunk” de código).
Para ello se utiliza el comando del lenguaje Markdown: ![nombre del objeto](path/to/image.png) y posteriormente se le añade el argumento que define su tamaño mediante los argumentos {width = 50%} o {height = 50%}, de la siguiente manera:

![nombre del objeto](path/to/image.png){width = 50% height=50%}

Por ejemplo:

El tamaño original de la imagen es: imagen dentro de directorio de trabajo

Y se solicita el cambio de tamaño al 50% de la imagen original, de la siguiente manera:

![imagen dentro de directorio de
trabajo](poblacion_muestra.png){width="50%" height="50%"}

imagen dentro de directorio de trabajo

2.3.9. Incluir comentarios en el texto sin que aparezcan en el “output”.

Para incluir comentarios en el texto y que no aparezcan en el “output” se incluye el script <!-- your comment -->, y el texto puede tener una o varias líneas de longitud. También existen “shortcut” con el teclado para incluir el script: Ctrl + Shift + C (Command + Shift + C enmacOS). Por ejemplo:

"Por ejemplo, para el programa Beca Universal para Estudiantes de
Educación Media Superior Benito Juárez <!-- Debo comprobar los datos sobre esta política educativa -->, uno de los dos incluidos en la
'Caja Negra', el Ejecutivo propone que para el próximo año disponga de
34 mil 999 millones de pesos, (...)."

El resultado es: “Por ejemplo, para el programa Beca Universal para Estudiantes de Educación Media Superior Benito Juárez , uno de los dos incluidos en la ‘Caja Negra’, el Ejecutivo propone que para el próximo año disponga de 34 mil 999 millones de pesos, (…).”

3. Ejercicio.

Instrucciones: Elabora la redacción de un texto, puede ser de tu autoría propia o citado de alguna otra fuente.
A partir de dicho texto, modifícalo como tu desees, pero utiliza la mayoría de las opciones de sintaxis revisadas en este documento.
Incluye alguna imagen en el documento, puede estar vinculada temáticamente o no. Inserta la imagen en su formato original y posteriormente vuelve a insertarla en un tamaño menor. Finalmente, guarda el archivo en el formato .Rmd.


  1. Esta nota es mía y no se encuentra en el texto original.↩︎

LS0tCnRpdGxlOiAiTGFib3JhdG9yaW8gZGUgZXN0YWTDrXN0aWNhIGNvbiBSLCBJSS4iCnN1YnRpdGxlOiAiQ29tYW5kb3MgYsOhc2ljb3MgZGUgbGEgc2ludGF4aXMgZGUgTWFya2Rvd24uIgphdXRob3I6ICJHdXN0YXZvIE1hcnTDrW5lei1WYWxkZXMiCmRhdGU6ICIyLzQvMjAyMiIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IFRSVUUKICAgIHRvY19kZXB0aDogNQogICAgdG9jX2Zsb2F0OiBUUlVFCiAgICBudW1iZXJfc2VjdGlvbjogRkFMU0UKICAgIHRoZW1lOiAiY29zbW8iCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCmVkaXRvcl9vcHRpb25zOiAKICBtYXJrZG93bjogCiAgICB3cmFwOiA3MgotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmBgYAojIDEuIFIgTWFya2Rvd24uCgojIyAxLjEuIMK/UXXDqSBlcyBSIE1hcmtkb3duPwoKUiBNYXJrZG93biBwdWVkZSBkZWZpbmlyc2UgY29tbyB1biBlY29zaXN0ZW1hIGRlbnRybyBkZSAqKlIqKiB5ICoqUiBTdHVkaW8qKiBxdWUgcGVybWl0ZSBsYSBlbGFib3JhY2nDs24gZGUgZGl2ZXJzb3MgdGlwb3MgZGUgdGV4dG9zIChkb2N1bWVudG9zIGRlIHRleHRvLCBwcmVzZW50YWNpb25lcywgYXBsaWNhY2lvbmVzIGJhc2FkYXMgZW4gdGV4dG8pLCB5IHF1ZSBwZXJtbWl0ZSBsYSBpbnRlZ3JhY2nDs24gZGUgZWxlbWVudG9zIGRpZmVyZW50ZXMgY29tbyB0ZXh0byAoZW4gZm9ybWF0byAqKk1hcmtkb3duKiosIGPDs2RpZ28gZGUgKipSKiosIHJlc3VsdGFkb3MgZGUgYW7DoWxpc2lzIGRlcml2YWRvcyBkZSBkaWNob3MgY8OzZGlnb3MsIGFzw60gY29tbyBmb3JtYXRvIGRlIGFjdWVyZG8gYSBsYXMgbmVjZXNpZGFkZXMgZGUgbG9zIGF1dG9yZXMsIGxvIHF1ZSBzZSBkZWxpbWl0YSBlbiBsYSBzZWNjacOzbiBkZSBsb3MgKm1ldGFkYWRvcyogbyAqKllBTUwqKikuCgojIyAxLjIuIFBhcnRlcyBkZSB1biBkb2N1bWVudG8gZW4gZm9ybWF0byAqKlJtYXJrZG93bioqLgpVbiBkb2N1bWVudG8gZW4gZm9ybWF0byBgcm1hcmtkb3duKClgIGVzdMOhIGludGVncmFkbyBwb3IgMyBwYXJ0ZXM6CgoxLiAqWUFNTCoqIChZZXQgQW5vdGhlciBNYXJrZG93biBMYW5ndWFnZSksIHF1ZSBjb250aWVuZSBsb3MgbWV0YWRhdG9zIGRlbCBkb2N1bWVudG8uCjIuIExhIHNlY2Npw7NuIGRlICoqdGV4dG8gZW5yaXF1ZWNpZG8qKiwgZG9uZGUgZWwgYXV0b3IgcHJlc2VudGEgbGEgcmVkYWNjacOzbiBkZXNlYWRhLCB1dGlsaXphbmRvIGxhcyBjYXJhY3RlcsOtc3RpY2FzIGRlIGVzY3JpdHVyYSBkZSAqKm1hcmtkb3duKiouCjMuIExhcyBzZWNjaW9uZXMgZGUgKipjw7NkaWdvIGRlIFIqKiwgcXVlIHNlIHB1ZWRlbiBpbnRlZ3JhciBtZWRpYW50ZSBkb3MgbWFuZXJhczoKICBpLiBhIHRyYXbDqXMgZGUgYGNodW5rc2AgbyAidHJvem9zIiBkZSBjw7NkaWdvLAogIGlpLiBhIHRyYXbDqXMgZGUgY8OzZGlnbyBkZW50cm8gZGUgY2FkYSBsw61uZWEgZGUgdGV4dG8gZW4gbGEgcmVkYWNjacOzbi4KCgojIDIuIE1hcmtkb3duCgojIyAyLjEuIMK/UXXDqSBlcyBNYXJrZG93bj8KCkVzIHVuIGxlbmd1YWplIGRlICJtYXJjYWRvIGxpZ2VybyIgY3JlYWRvIHBvciBKb2huIEdydWJlciBlbiBlbCBhw7FvIDIwMDQgcXVlIHRyYXRhIGRlIGxvZ3JhciBvIHBlcm1pdGlyIGZhY2lsaWRhZCBlbiBsYSBsZWN0dXJhIHkgZW4gbGEgZXNjcml0dXJhIGRlIGRvY3VtZW50b3MsIGV2aXRhbmRvIGRpc3RyYWNjaW9uZXMgeSBjb21wbGljYWNpb25lcywgeSBxdWUgcHVlZGUgc2VyICpyZW5kZXJpemFkbyogKHRyYW5zZm9ybWFkbykgZW4gZGl2ZXJzb3MgZm9ybWF0b3MuXApFcyB1bmEgbWFuZXJhIGRlIHNpbXBsaWZpY2FyIGxhIGVzY3JpdHVyYSBlbiBsYSBlcmEgZGlnaXRhbCwgZW4gZG9uZGUgc2UKZGViZSBwdWJsaWNhciBlbCBtaXNtbyB0ZXh0byBlbiBmb3JtYXRvcyBkaWZlcmVudGVzLiBEZSBtYW5lcmEgbcOhcwpjb25jcmV0YSwgKipNYXJrZG93bioqIGVzIHVuYSBzaW50YXhpcyBxdWUgcGVybWl0ZSBpbmNvcnBvcmFyIGVsZW1lbnRvcwpkZSAqdGV4dG8gZW5yaXF1ZWNpZG8qIGVuIGVsZW1lbnRvcyBkZSAqdGV4dG8gcGxhbm8qLlwKCkVsICp0ZXh0byBlbnJpcXVlY2lkbyogY29uc2lzdGUgZW4gY2FyYWN0ZXJlcyBkZSB0ZXh0byBhIGxvcyBxdWUgc2UgbGVzCmHDsWFkZSBmb3JtYXRvIChuZWdyaXRhcywgY3Vyc2l2YXMsIHN1YnJheWFkbywgaW50ZXJsaW5lYWRvLCBlc3BhY2lvcwplbnRyZSBwYWxhYnJhcywgZXRjLikuIEVsICp0ZXh0byBwbGFubyogc29sbyBjb25zaXN0ZSBlbiBsZXRyYXMsCm7Dum1lcm9zLCBzaWdub3MgZGUgcHVudHVhY2nDs24geSBhbGd1bm9zIHPDrW1ib2xvcywgc2luIGVsZW1lbnRvcyBkZQpmb3JtYXRvLlwgCkxhICpzaW50YXhpcyogY29uc2lzdGUgZW4gZWwgc2lzdGVtYSBwYXJhIHV0aWxpemFyIHPDrW1ib2xvcyB5CmNhcmFjdGVyZXMsIHF1ZSBsZSBleHBsaWNhbiBhbCBwcm9jZXNhZG9yIGRlIHVuYSBjb21wdXRhZG9yYSBsYSBtYW5lcmEKZW4gcXVlIHNlIGRlYmVuIHJlYWxpemFyIGFsZ3VuYXMgdGFyZWFzIHksIGVzcGVjw61maWNhbWVudGUgc2UgcmVmaWVyZSBhCmxhIGFwYXJpZW5jaWEgZGVzZWFkYSBkZWwgdGV4dG8uCgoKIyMgMi4yLiBWZW50YWphcyBkZSBlc2NyaWJpciBlbiBmb3JtYXRvICoqTWFya2Rvd24qKi4KCjEuICBFbmZvY2Fyc2UgZW4gbGEgZXNjcml0dXJhIHkgbm8gcHJvY3Jhc3RpbmFyIGNvbiBlbGVtZW50b3MgZGUKICAgIGZvcm1hdG8uCjIuICBQZXJtaXRlIGV4cG9ydGFyIGVsIGNvbnRlbmlkbyBkZSBNYXJrZG93biBhIGZvcm1hdG9zIGRpdmVyc29zIChodG1sLCBwZGYsCiAgICB3b3JkLCB3ZWIgcGFnZXMpLgozLiAgTG9zIGFyY2hpdm9zIHNlIHB1ZWRlbiBhYnJpciBlbiBjdWFscXVpZXIgZm9ybWF0bywgYcO6biBjdWFuZG8gZW4gZWwKICAgIGZ1dHVybyBjYW1iaWVuIGxvcyBwcm9ncmFtYXMgZGUgdGV4dG8uCjQuICBMb3MgYXJjaGl2b3Mgc29uICJsaWdlcm9zIiB5IGbDoWNpbGVzIGRlIHNpbmNyb25pemFyIGVudHJlIGRpc3RpbnRvcwogICAgZGlzcG9zaXRpdm9zLgo1LiAgRmFjaWxpZGFkIHBhcmEgY29tcGFydGlyIHkgY29sYWJvcmFyLgo2LiAgTGFzIGNpdGFjaW9uZXMgc2UgcHVlZGVuIGF1dG9mb3JtYXRlYXIuCgoKCiMjIDIuMy4gRWxlbWVudG9zIGRlIHNpbnRheGlzIGVuICoqTWFya2Rvd24qKgoKIyMjIDIuMy4xLiBSZXNhbHRhciB0ZXh0bwoKKiBTaSBzZSBkZXNlYSByZXNhbHRhciB1bmEgcGFsYWJyYSBlbiAqKipuZWdyaXRhcyBlIGl0w6FsaWNhKioqIGEgbGEgdmV6LApzZSB1c2EgdHJpcGxlIFwqXCpcKiBhbnRlcyB5IGRlc3B1w6lzIGRlIGxhIHBhbGFicmEuXApgYGAKcGFsYWJyYSBlbiAqKipuZWdyaXRhcyBlIGl0w6FsaWNhKioqCmBgYAoKKiBTaSBzZSBkZXNlYSByZXNhbHRhciB1bmEgcGFsYWJyYSBlbiAqKm5lZ3JpdGFzKiogc2UgdXNhIGRvYmxlIFwqXCogYW50ZXMKeSBkZXNwdcOpcyBkZSBsYSBwYWxhYnJhLlwKYGBgCnBhbGFicmEgZW4gKipuZWdyaXRhcyoqCmBgYAoKKiBTaSBzZSBkZXNlYSByZXNhbHRhciB1bmEgcGFsYWJyYSBlbiAqaXTDoWxpY2FzKiBzZSB1c2EgdW4gXCogc2VuY2lsbG8KYW50ZXMgeSBkZXNwdcOpcyBkZSBsYSBwYWxhYnJhLlwKYGBgCnBhbGFicmEgZW4gKml0w6FsaWNhcyoKYGBgCgoqIFNpIHNlIGRlc2VhIGluY2x1aXIgdW4gKnN1YiDDrW5kaWNlKiBzZSB1dGlsaXphIGxhIHRpbGRlIGRlIGxhICLDsSIsIGRlCm1hbmVyYSBxdWUgRn4yfi5cCmBgYAppbmNsdWlyIGVsIHN1YsOtbmRpY2UgMiBlbiBGOiAgRn4yfgpgYGAKCiogU2kgc2UgZGVzZWEgaW5jbHVpciB1biAqc3VwZXIgw61uZGljZSogc2UgdXRpbGl6YSBlbCBhY2VudG8gY2lyY3VuZmxlam8sCmRlIG1hbmVyYSBxdWUgRl4yXi4KYGBgCmluY2x1aXIgZWwgc3VwZXIgw61uZGljZSA0IGVuIEY6ICBGXjJeCmBgYAoKIyMjIyAyLjMuMS4xLiBDYW1iaWFyIGRlIGNvbG9yIGFsIHRleHRvLgoKRXN0byBkZXBlbmRlIGRlbCB0aXBvIGRlIGZvcm1hdG8gZGUgc2FsaWRhOiBodG1sIG8gcGRmLCBwdWVzIHNlIHVzYW4gY29tYW5kb3MgZGlmZXJlbnRlcy4KCi0gUGFyYSAqKmh0bWwqKiwgZWwgdGV4dG8gYSBjYW1iaWFyIGRlIGNvbG9yIHNlIGluY2x1eWUgZW4gYDxzcGFuPmAgeSBwb3N0ZXJpb3JtZW50ZSBgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij50ZXh0bzwvc3Bhbj5gLCBwb3IgZWplbXBsbzoKYGBgClJvc2VzIGFyZSA8c3BhbiBzdHlsZT0iY29sb3I6IGdyZWVuOyI+cmVkPC9zcGFuPiwgdmlvbGV0cyBhcmUgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5ibHVlPC9zcGFuPi4KYGBgCgpFbCByZXN1bHRhZG8gZXM6IAoKUm9zZXMgYXJlIDxzcGFuIHN0eWxlPSJjb2xvcjogZ3JlZW47Ij5yZWQ8L3NwYW4+LCB2aW9sZXRzIGFyZSA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPmJsdWU8L3NwYW4+LgoKCi0gUGFyYSB1biAqKnBkZioqLCBzZSB1c2FuIGNvbWFuZG9zIGRlIExhVGVYIGBcdGV4dGNvbG9ye2NvbG9yfXt0ZXh0b31gLCBkZSBtYW5lcmEgcXVlLCBwb3IgZWplbXBsbzogCmBgYApSb3NlcyBhcmUgXHRleHRjb2xvcntyZWR9e3JlZH0sIHZpb2xldHMgYXJlIFx0ZXh0Y29sb3J7Ymx1ZX17Ymx1ZX0uCmBgYApFbCBwcmltZXIgcGFyw6ludGVzaXMgcmVmaWVyZSBlbCBjb2xvciBkZXNlYWRvIHkgZWwgc2VndW5kbyBjb250aWVuZSBlbCB0ZXh0byBzb2JyZSBlbCBxdWUgc2UgZGViZSBhcGxpY2FyIGVsIGNvbG9yLgoKRWwgcmVzdWx0YWRvIGVzOgoKUm9zZXMgYXJlIFx0ZXh0Y29sb3Ige3JlZH17cmVkfSwgdmlvbGV0cyBhcmUgXHRleHRjb2xvciB7Ymx1ZX17Ymx1ZX0uCgojIyMgMi4zLjIuIEFwYXJ0YWRvcyB5IHN1YiBhcGFydGFkb3MuXApQYXJhIGFzaWduYXIgYXBhcnRhZG9zIHkgc3ViIGFwYXJ0YWRvcyBzZSB1dGlsaXphIGVsIHNpZ25vIGRlICIjIgoobsO6bWVybykuIEVsIGFwYXJ0YWRvIGluaWNpYWwgbyBtYXlvciBzZSBpbmRpY2EgY29uIHNvbG8gdW4gc2lnbm8gIiMiLCB5CmEgbWVkaWRhIHF1ZSBzZSBhdW1lbnRhIGxhIGNhbnRpZGFkIGRlIHNpZ25vcywgZW50b25jZXMgc2UgdmFuCnBvc2ljaW9uYW5kbyBjb21vIHN1YiBhcGFydGFkb3MsIHkgZWwgdGFtYcOxbyBkZSBsYSB0aXBvZ3JhZsOtYSB2YSBkZWNyZWNpZW5kby5cClBvciBlamVtcGxvOgoKIyAxLiBBcGFydGFkbyBwcmluY2lwYWwuICgxICMpCgojIyAxLjEuIFByaW1lciBwYXJ0YWRvIHNlY3VuZGFyaW8uICgyICMjKQoKIyMjIDEuMS4xLiBTdWIgYXBhcnRhZG8gcHJpbWVybyBkZWwgUHJpbWVyIGFwYXJ0YWRvIHNlY3VuZGFyaW8uICgzICMjIykKCiMjIyMgMS4xLjEuMS4gU3ViIHN1YiBhcGFydGFkbyBwcmltZXJvIGRlbCBQcmltZXIgYXBhcnRhZG8gc2VjdW5kYXJpby4gKDQgIyMjIykKCiMjIyAxLjEuMi4gU3ViIGFwYXJ0YWRvIHNlZ3VuZG8gZGVsIFByaW1lciBhcGFydGFkbyBzZWN1bmRhcmlvLiAoMyAjIyMpCgojIyAxLjIuIFNlZ3VuZG8gYXBhcnRhZG8gc2VjdW5kYXJpby4gKDIgIyMpCgojIDIuIFNlZ3VuZG8gYXBhcnRhZG8gcHJpbmNpcGFsLiAoMSAjKQoKIyMjIyAyLjMuMi4xLiBPbWl0aXIgZW5jYWJlemFkb3MuCgpFbiBjYXNvIGRlIGRlc2VhciBxdWUgdW4gZW5jYWJlemFkbyAocXVlIGNvbWllbmNlIGNvbiAiXCMiIG5vIHNlYSBpbmNsdWlkbyBlbiBsYSBlbm51bWVyYWNpw7NuIG8gbGlzdGFkbyBjb3JyZXNwb25kaWVudGUpIHNlIHV0aWxpemEgZWwgc2NyaXB0IGB7LnVubGlzdGVkIC51bm51bWJlcmVkfWAgZGVzcHXDqXMgZGVsIHTDrXR1bG8gc2XDsWFsYWRvIGNvbiAiIlwjIiwgZGUgbGEgc2lndWllbnRlIG1hbmVyYTogCmBgYAojIFNlY3Rpb24gaGVhZGluZyB7LnVubGlzdGVkIC51bm51bWJlcmVkfQpgYGAKCgojIyMgMi4zLjMuTGlzdGFkb3MuXApFbiBSIE1hcmtkb3duIHNlIHB1ZWRlbiByZWFsaXphciBkb3MgdGlwb3MgbyBmb3JtYXRvcyBkZSBsaXN0YXM6Cm9yZGVuYWRhcyBvIG51bWVyYWRhcyB5IGxhcyBubyBvcmRlbmFkYXMuXAoKTGEgcmVhbGl6YWNpw7NuIGRlIGxpc3RhZG9zIG9yZGVuYWRvcyBzZSByZWFsaXphIGFudGVwb25pZW5kbyBlbCBuw7ptZXJvIHkgdW4gZXNwYWNpbyBhbnRlcyBkZSBjYWRhCnRleHRvLCBhZGVtw6FzIGRlIGRlamFyIHVuIGVzcGFjaW8gZW50cmUgZWwgcMOhcnJhZm8gcHJldmlvIHkgZWwgaW5pY2lvIGRlbCBsaXN0YWRvLCBwb3IgZWplbXBsbzoKYGBgCjEuICBFbCBwcmltZXIgZWxlbWVudG8uCjIuICBFbCBzZWd1bmRvIGVsZW1lbnRvLgozLiAgRWwgdGVyY2VyIGVsZW1lbnRvLgo0LiAgRXRjLgpgYGAKCkVsIHJlc3VsdGFkbyBlczoKCjEuICBFbCBwcmltZXIgZWxlbWVudG8uCjIuICBFbCBzZWd1bmRvIGVsZW1lbnRvLgozLiAgRWwgdGVyY2VyIGVsZW1lbnRvLgo0LiAgRXRjLgoKVGFtYmnDqW4gc2UgcHVlZGVuIG9yZGVuYXIgdXRpbGl6YW5kbyBsZXRyYXM6CmBgYAphLiAgUHJpbWVyIGVsZW1lbnRvCmIuICBTZWd1bmRvIGVsZW1lbnRvCmMuICBUZXJjZXIgZWxlbWVudG8KYGBgCgpFbCByZXN1bHRhZG8gZXM6CgphLiAgUHJpbWVyIGVsZW1lbnRvCmIuICBTZWd1bmRvIGVsZW1lbnRvCmMuICBUZXJjZXIgZWxlbWVudG8KCkVuIGNhc28gZGUgcmVhbGl6YXIgdW4gbGlzdGFkbyBzaW4gamVyYXJxdcOtYSBvIG51bWVyYWNpw7NuLCBzb2xvIHNlCmNvbG9jYSB1biAiXCoiIG8gdW4gZ3Vpw7NuIGludGVybWVkaW8gIlwtIiB5IHVuIGVzcGFjaW8gYW50ZXMgZGUgY2FkYSB0ZXh0bzoKYGBgCi0gICBQcmltZXIgZWxlbWVudG8uCi0gICBTZWd1bmRvIGVsZW1lbnRvLgotICAgVGVyY2VyIGVsZW1lbnRvLgotICAgRXRjLgpgYGAKCkVsIHJlc3VsdGFkbyBlczoKCi0gICBQcmltZXIgZWxlbWVudG8uCi0gICBTZWd1bmRvIGVsZW1lbnRvLgotICAgVGVyY2VyIGVsZW1lbnRvLgotICAgRXRjLgoKT3RyYSBvcGNpw7NuIHNvbiBsaXN0YWRvcyBtZXpjbGFkb3MsIHBhcmEgbG8gcXVlIHNlIHVzYSBkb3MgInRhYiIgcGFyYQpsb3Mgc3ViIGVsZW1lbnRvczoKYGBgCjEuICBQcmltZXIgZWxlbWVudG8KCjIuICBTZWd1bmRvIGVsZW1lbnRvCgogICAgMS4gIFByaW1lciBzdWIgZWxlbWVudG8gKGluY2x1eWUgZG9zICJ0YWIiKQogICAgMi4gIFNlZ3VuZG8gc3ViIGVsZW1lbnRvIChpbmNsdXllIGRvcyAidGFiIikKCjMuICBUZXJjZXIgZWxlbWVudG8KCiAgICAtICAgT3RybyBzdWIgZWxlbWVudG8gbm8gb3JkZW5hZG8gKGluY2x1eWUgZG9zICJ0YWIiKQogICAgLSAgIE90cm8gc3ViIGVsZW1lbnRvIG5vIG9yZGVuYWRvIChpbmNsdXllIGRvcyAidGFiIikKYGBgCgpFbCByZXN1bHRhZG8gZXM6CgoxLiAgUHJpbWVyIGVsZW1lbnRvCgoyLiAgU2VndW5kbyBlbGVtZW50bwoKICAgIDEuICBQcmltZXIgc3ViIGVsZW1lbnRvIChpbmNsdXllIGRvcyAidGFiIikKICAgIDIuICBTZWd1bmRvIHN1YiBlbGVtZW50byAoaW5jbHV5ZSBkb3MgInRhYiIpCgozLiAgVGVyY2VyIGVsZW1lbnRvCgogICAgLSAgIE90cm8gc3ViIGVsZW1lbnRvIG5vIG9yZGVuYWRvIChpbmNsdXllIGRvcyAidGFiIikKICAgIC0gICBPdHJvIHN1YiBlbGVtZW50byBubyBvcmRlbmFkbyAoaW5jbHV5ZSBkb3MgInRhYiIpCgoKIyMjIDIuMy40LiBTZXBhcmFjacOzbi5cCgojIyMjIDIuMy40LjEuIFJlbmdsb25lcyBjb250aW51b3MuCkxhIG1hbmVyYSBkZSBlc2NyaWJpciB1biBww6FycmFmbyBlbiBSIE1hcmtkb3duIGVzIGEgcGFydGlyIGRlIHViaWNhciBlbApjdXJzb3IgZW4gdW5hIGzDrW5lYSBudW1lcmFkYSB5LCBhc8OtLCBjb250aW51YXIgZXNjcmliaWVuZG8gc2luIGRldGVuZXJzZQpoYXN0YSBlbCBwdW50byBmaW5hbC4gQSBtZWRpZGEgcXVlIGVsIHDDoXJyYWZvIHNlYSBjYWRhIHZleiBtw6FzIGxhcmdvLAphdXRvbcOhdGljYW1lbnRlIGVsIHRleHRvIGlyw6EgYmFqYW5kbyBkZSBsw61uZWFzLCBwZXJvIGFob3JhIGVzdGFzIG5vCmVzdMOhbiBudW1lcmFkYXMuIFIgTWFyZG93biBsZWUgZXN0YXMgbMOtbmVhcyBuby1udW1lcmFkYXMgY29tbyBwYXJ0ZSBkZQp1biBtaXNtbyBww6FycmFmbywgeSBubyBoYWNlIGNvcnRlcyBuaSBzYWx0b3MuCgpBw7puIHNpIHNlIGRhIHVuIHNvbG8gImNsaWNrIiBhIGxhIHRlY2xhICJFTlRFUiIsIHkgZW4gZWwgdmlzb3IgZGUgUiBNYXJrZG93bgpzZSBjYW1iaWEgZGUgbMOtbmVhIG51bWVyYWRhLCBlbiBlbCBjYXNvIGRlbCAib3V0cHV0IiAoaHRtbCwgcGRmIG8gd29yZCkgbm8gaGFicsOhCm9jdXJyaWRvIHVuIHNhbHRvIGRlIHDDoXJyYWZvLCBzaW5vIHF1ZSBjb250aW51YSBjb21vIHBhcnRlIGRlIHVuIG1pc21vCnDDoXJyYWZvLiBQb3IgZWplbXBsbzoKCmBgYAoiRXN0ZSBlcyBlbCBww6FycmFmbyBkZSBsYSBsw61uZWEgODAuCkVzdGUgZXMgZWwgcMOhcnJhZm9yIGRlIGxhIGzDrW5lYSA4MS4iCmBgYApFbCByZXN1bHRhZG8gZXM6XAoiRXN0ZSBlcyBlbCBww6FycmFmbyBkZSBsYSBsw61uZWEgODAuIApFc3RlIGVzIGVsIHDDoXJyYWZvIGRlIGxhIGzDrW5lYSA4MS4iCgojIyMjIDIuMy40LjIuIFNlcGFyYWNpw7NuIGVudHJlIHJlbmdsb25lcy4KUGFyYSBsb2dyYXIgbGEqc2VwYXJhY2nDs24gZW50cmUgbMOtbmVhcyogbyAic2FsdGFyIGzDrW5lYXMgc2VndWlkYXMiIGRlbnRybyBkZSB1bgptaXNtbyBww6FycmFmbywgc2UgdXRpbGl6YSB1biAiZG9ibGUgZXNwYWNpbyIgYWwgZmluYWwgZGVsIHJlbmdsw7NuIHF1ZSBzZSBkZXNlYSBzZXBhcmFyIChkb3MgdmVjZXMgYSBsYSBiYXJyYQplc3BhY2lhZG9yYSk7IHRhbWJpw6luIHNlIHB1ZWRlIHV0aWxpemFyIHVuYSBiYXJyYSBkaWFnb25hbCBgcGFsYWJyYSBmaW5hbC5cYCwgIlxcIiBhbCBmaW5hbCBkZWwgcmVuZ2zDs24uClBvciBlamVtcGxvOgpgYGAKIkVzdGUgZXMgZWwgcMOhcnJhZm8gZGUgbGEgbMOtbmVhIDg1LlwKRXN0ZSBlcyBlbCBww6FycmFmb3IgZGUgbGEgbMOtbmVhIDg2Ii4KYGBgCkVsIHJlc3VsdGFkbyBlczogCiJFc3RlIGVzIGVsIHDDoXJyYWZvIGRlIGxhIGzDrW5lYSA4NS5cCkVzdGUgZXMgZWwgcMOhcnJhZm8gZGUgbGEgbMOtbmVhIDg2LiIKCiMjIyMgMi4zLjQuMy4gU2VwYXJhY2nDs24gZW50cmUgcMOhcnJhZm9zLgpQYXJhICpzZXBhcmFyIHDDoXJyYWZvcyBlbnRyZSBzw60qIHNlIGRlamEgdW5hIGzDrW5lYSBudW1lcmFkYSB2YWPDrWEgZW50cmUKYW1ib3MsIHBvciBlamVtcGxvOlwKYGBgCiIiUG9yIHNlZ3VuZG8gYcOxbyBjb25zZWN1dGl2bywgbGEgbWF5b3LDrWEgZGUgbG9zIHByb2dyYW1hcyBzb2NpYWxlcyBkZWwKR29iaWVybm8gZGUgTMOzcGV6IE9icmFkb3IgdHV2aWVyb24gZW4gMjAyMCB1biBiYWpvIGRlc2VtcGXDsW8geSBhbGd1bm9zCmRlIGVsbG9zIG9wZXJhcm9uIHRhbWJpw6luIGVuIGNvbmRpY2lvbmVzIGRlIG9wYWNpZGFkLgoKQXPDrSBsbyByZXZlbGEgZWwgw41uZGljZSBkZSBEZXNlbXBlw7FvIGRlIGxvcyBQcm9ncmFtYXMgUMO6YmxpY29zIEZlZGVyYWxlcwoyMDIxIChJTkRFUCkgZWxhYm9yYWRvIHBvciBsYSBvcmdhbml6YWNpw7NuIEFnZW5jaWEgcGFyYSBlbCBEZXNhcnJvbGxvICguLi4pLiIKYGBgCgpFbCByZXN1bHRhZG8gZXM6CgoiUG9yIHNlZ3VuZG8gYcOxbyBjb25zZWN1dGl2bywgbGEgbWF5b3LDrWEgZGUgbG9zIHByb2dyYW1hcyBzb2NpYWxlcyBkZWwKR29iaWVybm8gZGUgTMOzcGV6IE9icmFkb3IgdHV2aWVyb24gZW4gMjAyMCB1biBiYWpvIGRlc2VtcGXDsW8geSBhbGd1bm9zCmRlIGVsbG9zIG9wZXJhcm9uIHRhbWJpw6luIGVuIGNvbmRpY2lvbmVzIGRlIG9wYWNpZGFkLgoKQXPDrSBsbyByZXZlbGEgZWwgw41uZGljZSBkZSBEZXNlbXBlw7FvIGRlIGxvcyBQcm9ncmFtYXMgUMO6YmxpY29zIEZlZGVyYWxlcwoyMDIxIChJTkRFUCkgZWxhYm9yYWRvIHBvciBsYSBvcmdhbml6YWNpw7NuIEFnZW5jaWEgcGFyYSBlbCBEZXNhcnJvbGxvICguLi4pLiIgKFVyZXN0ZSwgMjAyMSwgMyBkZSBub3ZpZW1icmUgZGUKMjAyMSkKCgojIyMgMi4zLjUuIEluc2VydGFyIHVuIHNhbHRvIGRlIHDDoWdpbmEuCgpQYXJhIGluc2VydGFyIHVuIHNhbHRvIGRlIHDDoWdpbmEgc2UgdXRpbGl6YSBlbCBzY3JpcHQgYFxuZXdwYWdlYCwgcXVlIGVzIHBhcnRlIGRlbCBsZW5ndWFqZSBkZSBMYVRlWCBwZXJvIHF1ZSwgYSBzdSB2ZXosIHJlY29ub2NlIGVsIHBhcXVldGUgZGUgYHJtYXJrZG93bmAuCgpQb3IgZWplbXBsbzpcCmBgYAoiQ29udGVuaWRvIGRlIHDDoWdpbmEgMS4gXG5ld3BhZ2UgCkNvbnRlbmlkbyBkZSBww6FnaW5hIDIuIgpgYGAKCiJDb250ZW5pZG8gZGUgcMOhZ2luYSAxLiBcbmV3cGFnZSAKQ29udGVuaWRvIGRlIHDDoWdpbmEgMi4iCgoKIyMjIDIuMy40LiBJbnNlcnRhciBjaXRhcyBsYXJnYXMgZW4gcMOhcnJhZm9zIHNlcGFyYWRvcy4KRW4gY2FzbyBkZSB1bmEgKmNpdGEgbGFyZ2EqIHkgZGUgbGEgcXVlIHNlIGRlc2VhIHNlcGFyYXIgdW4gYmxvcXVlIGRlCnRleHRvLCBzZSB1dGlsaXphIGVsIHNpZ25vIGRlIGBcPmAgeSBzZSBhw7FhZGUgdW4gImVzcGFjaW8iIGFudGVzIGRlbCBpbmljaW8gZGVsCnDDoXJyYWZvLCBwb3IgZWplbXBsbzoKCmBgYAo+IEVudHJlIGxvcyBwcm9ncmFtYXMgY29uIHVuIGVzY2FzbyBkZXNlbXBlw7FvIGhheSBhbGd1bm9zIGRlIGxvcwpjb25zaWRlcmFkb3MgJ2VzdHJlbGxhJyBlbiBsYSBwcmVzZW50ZSBhZG1pbmlzdHJhY2nDs24sIGNvbW8gU2VtYnJhbmRvClZpZGEsIGVsIHByb2dyYW1hIGRlIHJlZm9yZXN0YWNpw7NuIGNvbiBlbCBxdWUgZWwgR29iaWVybm8gYWN0dWFsIGhhCmRpY2hvIHF1ZSBidXNjYSBjb21iYXRpciBsb3MgZWZlY3RvcyBkZWwgY2FtYmlvIGNsaW3DoXRpY28gZW4gTcOpeGljby4KT3Ryb3MgY29uIGJham8gcmVuZGltaWVudG8gc29uIGVsIGRlIEJlY2FzIHBhcmEgcGVyc29uYXMgY29uCmRpc2NhcGFjaWRhZCwgeSBlbCBwcm9ncmFtYSBkZSBVbml2ZXJzaWRhZGVzIHBhcmEgZWwgQmllbmVzdGFyIEJlbml0bwpKdcOhcmV6LiBQb3IgZWwgY29udHJhcmlvLCBlbCBwcm9ncmFtYSBkZSBQZW5zacOzbiBwYXJhIEFkdWx0b3MgTWF5b3Jlcwplc3TDoSBlbnRyZSBsb3MgcXVlIG1lam9yIHJlbmRpbWllbnRvIGhhbiB0ZW5pZG8uCmBgYApFbCByZXN1bHRhZG8gZXM6XAoKPiBFbnRyZSBsb3MgcHJvZ3JhbWFzIGNvbiB1biBlc2Nhc28gZGVzZW1wZcOxbyBoYXkgYWxndW5vcyBkZSBsb3MgY29uc2lkZXJhZG9zICdlc3RyZWxsYScgZW4gbGEgcHJlc2VudGUgYWRtaW5pc3RyYWNpw7NuLCBjb21vIFNlbWJyYW5kbwpWaWRhLCBlbCBwcm9ncmFtYSBkZSByZWZvcmVzdGFjacOzbiBjb24gZWwgcXVlIGVsIEdvYmllcm5vIGFjdHVhbCBoYQpkaWNobyBxdWUgYnVzY2EgY29tYmF0aXIgbG9zIGVmZWN0b3MgZGVsIGNhbWJpbyBjbGltw6F0aWNvIGVuIE3DqXhpY28uCk90cm9zIGNvbiBiYWpvIHJlbmRpbWllbnRvIHNvbiBlbCBkZSBCZWNhcyBwYXJhIHBlcnNvbmFzIGNvbgpkaXNjYXBhY2lkYWQsIHkgZWwgcHJvZ3JhbWEgZGUgVW5pdmVyc2lkYWRlcyBwYXJhIGVsIEJpZW5lc3RhciBCZW5pdG8KSnXDoXJlei4gUG9yIGVsIGNvbnRyYXJpbywgZWwgcHJvZ3JhbWEgZGUgUGVuc2nDs24gcGFyYSBBZHVsdG9zIE1heW9yZXMKZXN0w6EgZW50cmUgbG9zIHF1ZSBtZWpvciByZW5kaW1pZW50byBoYW4gdGVuaWRvLgoKIyMjIyAyLjMuNC4xLiBJbnNlcnRhciBzYW5ncsOtYXMuClVuYSBtYW5lcmEgImNydWRhIiBkZSBjb2xvY2FyIHNhbmdyw61hIGVzIG1lZGlhbnRlIGxhIHRlY2xhIGB8YCBhbCBpbmljaW8gZGUgdW4gcMOhcnJhZm8uClNlIGRlYmUgcmVjb3JkYXIgcXVlIG1hcmtkb3duIG5vIHJlY29ub2NlIGxvcyBlc3BhY2lvcyBlbiBibGFuY28sIG8gbG9zIGlnbm9yYSB5IGp1bnRhIHJlbmdsb25lcyBzZXBhcmFkb3MuIFBvciBlbGxvIHNlIGxlIGRlYmUgaW5kaWNhciBlbCBsdWdhciBkZSBsb3MgZXNwYWNpb3MgdmFjw61vcyBhIG1hbmVyYSBkZSBzYW5ncsOtYXMuCmBgYAp8IFdoZW4gZG9sbGFycyBhcHBlYXIgaXQncyBhIHNpZ24KfCAgIHRoYXQgeW91ciBjb2RlIGRvZXMgbm90IHF1aXRlIGFsaWduICAKfCBFbnN1cmUgdGhhdCB5b3VyIG1hdGggIAp8ICAgaW4geGFyaW5nYW4gaGF0aCAgCnwgICBiZWVuIHBsYWNlZCBvbiBhIHNpbmdsZSBsb25nIGxpbmUKYGBgCgpFbCByZXN1bHRhZG8gZXM6Cgp8IFdoZW4gZG9sbGFycyBhcHBlYXIgaXQncyBhIHNpZ24KfCAgIHRoYXQgeW91ciBjb2RlIGRvZXMgbm90IHF1aXRlIGFsaWduICAKfCBFbnN1cmUgdGhhdCB5b3VyIG1hdGggIAp8ICAgaW4geGFyaW5nYW4gaGF0aCAgCnwgICBiZWVuIHBsYWNlZCBvbiBhIHNpbmdsZSBsb25nIGxpbmUKCgojIyMgMi4zLjUuIE5vdGFzIGFsIHBpZS4KUGFyYSBpbnNlcnRhciBub3RhcyBhbCBwaWUgc2UgdXRpbGl6YW4sIHByaW1lcm8sIGxvcyBwYXLDqW50ZXNpcwpjdWFkcmFkb3MgYFtdYCwgYWRlbnRybyBzZSBjb2xvY2EgZWwgc2lnbm8gYF4xYCB5IHNlIGHDsWFkZSB1bgppZGVudGlmaWNhZG9yLlwKQXBhcnRlLCBlbiBjdWFscXVpZXIgcGFydGUgZGVsIHRleHRvLCBzZSBhw7FhZGUgbGEgbWlzbWEKc2ludGF4aXMsIHNlIGFncmVnYSB1biBzaWdubyBkZSAiOiIgKGRvcyBwdW50b3MpIHkgc2UgYcOxYWRlIGVsIHRleHRvIGRlCmxhIG5vdGEgYWwgcGllLCBwb3IgZWplbXBsbzoKYGBgCiJQb3IgZWplbXBsbywgcGFyYSBlbCBwcm9ncmFtYSBCZWNhIFVuaXZlcnNhbCBwYXJhIEVzdHVkaWFudGVzIGRlCkVkdWNhY2nDs24gTWVkaWEgU3VwZXJpb3IgQmVuaXRvIEp1w6FyZXosIHVubyBkZSBsb3MgZG9zIGluY2x1aWRvcyBlbiBsYQonQ2FqYSBOZWdyYScsIGVsIEVqZWN1dGl2byBwcm9wb25lIHF1ZSBwYXJhIGVsIHByw7N4aW1vIGHDsW8gZGlzcG9uZ2EgZGUKMzQgbWlsIDk5OSBtaWxsb25lcyBkZSBwZXNvcywgZXMgZGVjaXIsIDQlIG3DoXMgW14xXSBxdWUgZWwgcHJlc3VwdWVzdG8KYXByb2JhZG8gZW4gZXN0ZSAyMDIxLiIgKFVyZXN0ZSwgMjAyMSwgMyBkZSBub3ZpZW1icmUpCgpbXjFdOiBFc3RhIG5vdGEgZXMgbcOtYSB5IG5vIHNlIGVuY3VlbnRyYSBlbiBlbCB0ZXh0byBvcmlnaW5hbC4KYGBgCgpFbCByZXN1bHRhZG8gZXM6XAoKIlBvciBlamVtcGxvLCBwYXJhIGVsIHByb2dyYW1hIEJlY2EgVW5pdmVyc2FsIHBhcmEgRXN0dWRpYW50ZXMgZGUKRWR1Y2FjacOzbiBNZWRpYSBTdXBlcmlvciBCZW5pdG8gSnXDoXJleiwgdW5vIGRlIGxvcyBkb3MgaW5jbHVpZG9zIGVuIGxhCidDYWphIE5lZ3JhJywgZWwgRWplY3V0aXZvIHByb3BvbmUgcXVlIHBhcmEgZWwgcHLDs3hpbW8gYcOxbyBkaXNwb25nYSBkZQozNCBtaWwgOTk5IG1pbGxvbmVzIGRlIHBlc29zLCBlcyBkZWNpciwgNCUgbcOhcyBbXjFdIHF1ZSBlbCBwcmVzdXB1ZXN0bwphcHJvYmFkbyBlbiBlc3RlIDIwMjEuIiAoVXJlc3RlLCAyMDIxLCAzIGRlIG5vdmllbWJyZSkKClteMV06IEVzdGEgbm90YSBlcyBtw61hIHkgbm8gc2UgZW5jdWVudHJhIGVuIGVsIHRleHRvIG9yaWdpbmFsLgoKCiMjIyAyLjMuNi4gVGFibGFzIGRlIGNvbnRlbmlkby4KCkVuIE1hcmtkb3duIGVzIHBvc2libGUgaW5jbHVpciB0YWJsYXMgZW4gZm9ybWF0byBzZW5jaWxsbywgeSBzZSBlbGFib3JhbiBtYW51YWxtZW50ZSBtZWRpYW50ZSBlbCB1c28gZGUgc2lnbm9zICd8JyBwYXJhIHNlcGFyYXIgY29sdW1uYXMgeSBsb3MgZ3Vpb25lcyBpbnRlcm1lZGlvcyAnLScgcGFyYSBzZXBhcmFyIGxhIGZpbGEgZGUgZW5jYWJlemFkbyByZXNwZWN0byBkZSBsYXMgZmlsYXMgY29uIGNvbnRlbmlkby5cCkVuIGVsIGNhc28gZGUgZGVzZWFyIGluY2x1aXIgdW4gdMOtdHVsbyBhIGxhIHRhYmxhLCBhbCBmaW5hbCBkZSDDqXN0YSBzZSBpbmNsdXllIGVsIHNpZ25vICc6JyB5IHBvc3Rlcmlvcm1lbnRlIHNlIHJlZGFjdGEgZWwgdMOtdHVsbywgcG9yIGVqZW1wbG86CmBgYAp8IE7Dum1lcm8gfCAgICAgICDDjXRlbSAgICAgICB8Cnw6LS0tLS0tOnw6LS0tLS0tLS0tLS0tLS0tLTp8CnwgICAxICAgIHwgcHJpbWVyIGVsZW1lbnRvICB8CnwgICAyICAgIHwgc2VndW5kbyBlbGVtZW50byB8CnwgICAzICAgIHwgdGVyY2VyIGVsZW1lbnRvICB8Cgo6IEFxdcOtIHNlIGVzY3JpYmUgZWwgdMOtdHVsbyBkZSBsYSB0YWJsYQoKYGBgCkVsIHJlc3VsdGFkbyBlczoKCnwgTsO6bWVybyB8ICAgICAgIMONdGVtICAgICAgIHwKfDotLS0tLS06fDotLS0tLS0tLS0tLS0tLS0tOnwKfCAgIDEgICAgfCBwcmltZXIgZWxlbWVudG8gIHwKfCAgIDIgICAgfCBzZWd1bmRvIGVsZW1lbnRvIHwKfCAgIDMgICAgfCB0ZXJjZXIgZWxlbWVudG8gIHwKCjogQXF1w60gc2UgZXNjcmliZSBlbCB0w610dWxvIGRlIGxhIHRhYmxhCgpMYSBww6FnaW5hIFt0YWJsZXMKZ2VuZXJhdG9yXShodHRwczovL3d3dy50YWJsZXNnZW5lcmF0b3IuY29tL21hcmtkb3duX3RhYmxlcykgZXMgdW5hCmFsdGVybmF0aXZhIGRlIGFwb3lvIHBhcmEgZ2VuZXJhciB0YWJsYXMgZW4gZm9ybWF0byBtYXJrZG93bi4KCgojIyMgMi4zLjcuIEluY2x1aXIgdW5hIGRpcmVjY2nDs24gZGUgVVJMLgoKRXN0byBzZSBsb2dyYSBhIHBhcnRpciBkZSBkb3MgZWxlbWVudG9zOiBwcmltZXJvIHNlIHJlZmllcmUgZWwgbm9tYnJlIG8KZXRpcXVldGEgZGUgcmVmZXJlbmNpYSwgeSBzZSB1YmljYSBlbnRyZSBwYXLDqW50ZXNpcyBjdWFkcmFkb3MKYFtldGlxdWV0YV1gIHkgYSBjb250aW51YWNpw7NuIHNlIGluY2x1eWUgbGEgZGlyZWNjacOzbiBVUkwgdWJpY2FkYQplbnRyZSBwYXLDqW50ZXNpcyBgKClgLlwgClBvciBlamVtcGxvOiAKYGBgCltww6FnaW5hIHdlYiBkZSB0YWJsZXMgZ2VuZXJhdG9yXShodHRwczovL3d3dy50YWJsZXNnZW5lcmF0b3IuY29tL21hcmtkb3duX3RhYmxlcykKYGBgCgpFbCByZXN1bHRhZG8gZXM6CgpbcMOhZ2luYSB3ZWIgZGUgdGFibGVzIGdlbmVyYXRvcl0oaHR0cHM6Ly93d3cudGFibGVzZ2VuZXJhdG9yLmNvbS9tYXJrZG93bl90YWJsZXMpCgoKRW4gY2FzbyBkZSBkZXNlYXIgcXVlIHNlIHZpc3VhbGljZSBsYSBsaWdhIFVSTCBjb21wbGV0YSwgZW50b25jZXMgc2UKdXNhbiBsb3Mgc2lnbm9zIGRlIGA8ID5gIGFsIGluaWNpbyB5IGFsIGZpbmFsIGRlIGxhIGRpcmVjY2nDs24gVVJMLCBwb3IKZWplbXBsbzpcCmBgYApsYSBww6FnaW5hICJ0YWJsZXMgZ2VuZXJhdG9yIiBgPGh0dHBzOi8vd3d3LnRhYmxlc2dlbmVyYXRvci5jb20vbWFya2Rvd25fdGFibGVzPmAuCmBgYApFc3RhIGVzIGxhIGxpZ2EgVVJMIGRlIGxhIHDDoWdpbmEgInRhYmxlcyBnZW5lcmF0b3IiIGA8aHR0cHM6Ly93d3cudGFibGVzZ2VuZXJhdG9yLmNvbS9tYXJrZG93bl90YWJsZXM+YC4KCgojIyMgMi4zLjguIEluY2x1aXIgdW5hIGltYWdlbiBlbiBlbCB0ZXh0by4KCkVzdG8gc2UgbG9ncmEgYSBwYXJ0aXIgZGUgdmFyaW9zIGVsZW1lbnRvczogYCEgKyBbZXRpcXVldGFdICsgKHJ1dGEgZGUKYWNjZXNvIGEgbGEgaW1hZ2VuIGRlbnRybyBkZWwgZGlzY28gZHVybylgLlwKClBvciBkZWZlY3RvLCBSIE1hcmtkb3duIGJ1c2NhcsOhIGxhIGltw6FnZW5lcyBkZW50cm8gZGVsICpkaXJlY3RvcmlvIGRlIHRyYWJham8qIGVuIHF1ZSBzZSBlbmN1ZW50cmEgZW5yYWl6YWRvLCBwb3IgbG8gcXVlLCBzaSBsYSBpbWFnZW4gc2UgZW5jdWVudHJhIGRlbnRybyBkZWwgbWlzbW8gZGlyZWN0b3JpbyBlbnRvbmNlcyBzb2xvIHNlIHJlcXVpZXJlIGVzY3JpYmlyIGVsIG5vbWJyZSBkZWwgYXJjaGl2byBkZSBpbWFnZW4gZGVudHJvIGRlIGxvcwpwYXLDqW50ZXNpcywgaW5jbHV5ZW5kbyBlbCBmb3JtYXRvIGRlbCBhcmNoaXZvIGRlIGltYWdlbiAoeWEgc2VhIC5qcGcsIC5qcGVnLCAucGRmLCAucG5nIHUgb3RybykuXApgYGAKIVtpbWFnZW4gZGVudHJvIGRlbCBkaXJlY3RvcmlvIGRlIHRyYWJham9dKGludGVydmFsb19jb25maWFuemEucG5nKQpgYGAKRWwgcmVzdWx0YWRvIGVzOgohW2ltYWdlbiBkZW50cm8gZGVsIGRpcmVjdG9yaW8gZGUgdHJhYmFqb10oaW50ZXJ2YWxvX2NvbmZpYW56YS5wbmcpCgoKRW4gY2FzbyBkZSBxdWUgbGEgaW1hZ2VuIHNlIGVuY3VlbnRyZSBmdWVyYSBkZWwgKmRpcmVjdG9yaW8gZGUgdHJhYmFqbyoKcGVybywgYSBzdSB2ZXosIHNlIGVuY3VlbnRyYSBkZW50cm8gZGVsIGRpc2NvIGR1cm8sIGVudG9uY2VzIHPDrSBzZSBkZWJlCmVzY3JpYmlyIGxhIHJ1dGEgZGUgYWNjZXNvIGFsIGFyY2hpdm8gZGUgaW1hZ2VuIGRlbnRybyBkZSBsb3MKcGFyw6ludGVzaXMuCmBgYAohW2ltYWdlbiBkZW50cm8gZGVsIGRpc2NvIGR1cm9dKH4vRHJvcGJveC9SL1JtYXJrZG93bi9wcnVlYmFfdXNvX21hcmtkb3duX2ZpbGVzL2ltYWdlbl9wcnVlYmEucG5nKeKBqQpgYGAKRWwgcmVzdWx0YWRvIGVzOgoKCgpPdHJhIG9wY2nDs24gcGFyYSBpbnNlcnRhciBpbcOhZ2VuZXMgZXMgYSBwYXJ0aXIgZGUgInRyYWVyIiBhbCB0ZXh0bwphcmNoaXZvcyBxdWUgc2UgZW5jdWVudHJhbiB1YmljYWRvcyBlbiBpbnRlcm5ldCwgcGFyYSBlbGxvIHNlIHJlcXVpZXJlCnNlw7FhbGFyIGxhIGRpcmVjY2nDs24gVVJMIGRlbCBhcmNoaXZvIGRlIGltYWdlbiwgbG8gcXVlIHNlIGVzY3JpYmUgZGVudHJvCmRlIGxvcyBwYXLDqW50ZXNpcy4KCmBgYAohW2ltYWdlbiBlbgpVUkxdKGh0dHBzOi8vZWNvbm9taXBlZGlhLmNvbS93cC1jb250ZW50L3VwbG9hZHMvQ2FwdHVyYS1kZS1wYW50YWxsYS0yMDE5LTA5LTEwLWEtbGVzLTExLjA5LjM1LnBuZykKYGBgCkVsIHJlc3VsdGFkbyBlczoKCiFbaW1hZ2VuIGVuClVSTF0oaHR0cHM6Ly9lY29ub21pcGVkaWEuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy9DYXB0dXJhLWRlLXBhbnRhbGxhLTIwMTktMDktMTAtYS1sZXMtMTEuMDkuMzUucG5nKQoKCiMjIyAyLjMuOC4xLiBDb250cm9sYXIgZWwgdGFtYcOxbyBkZSBsYXMgaW3DoWdlbmVzLgoKSGF5IGRpdmVyc2FzIG1hbmVyYXMgZGUgY29udHJvbGFyIGVsIHRhbWHDsW8gZGUgbGFzIGltw6FnZW5lcy4gQXF1w60gc2UgcmV2aXNhIGxhIG1hbmVyYSBkZSBoYWNlcmxvIGRpcmVjdGFtZW50ZSBzb2JyZSBlbCBjb21hbmRvIHF1ZSBpbnNlcnRhIHVuYSBpbWFnZW4gKGVuIHZleiBkZSBoYWNlcmxvIGRlc2RlIGVsICJjaHVuayIgZGUgY8OzZGlnbykuXApQYXJhIGVsbG8gc2UgdXRpbGl6YSBlbCBjb21hbmRvIGRlbCBsZW5ndWFqZSBNYXJrZG93bjogYCFbbm9tYnJlIGRlbCBvYmpldG9dKHBhdGgvdG8vaW1hZ2UucG5nKWAgeSBwb3N0ZXJpb3JtZW50ZSBzZSBsZSBhw7FhZGUgZWwgYXJndW1lbnRvIHF1ZSBkZWZpbmUgc3UgdGFtYcOxbyBtZWRpYW50ZSBsb3MgYXJndW1lbnRvcyBge3dpZHRoID0gNTAlfWAgbyBge2hlaWdodCA9IDUwJX1gLCBkZSBsYSBzaWd1aWVudGUgbWFuZXJhOgpgYGAKIVtub21icmUgZGVsIG9iamV0b10ocGF0aC90by9pbWFnZS5wbmcpe3dpZHRoID0gNTAlIGhlaWdodD01MCV9CmBgYApQb3IgZWplbXBsbzoKCkVsIHRhbWHDsW8gb3JpZ2luYWwgZGUgbGEgaW1hZ2VuIGVzOgohW2ltYWdlbiBkZW50cm8gZGUgZGlyZWN0b3JpbyBkZSB0cmFiYWpvXShwb2JsYWNpb25fbXVlc3RyYS5wbmcpCgpZIHNlIHNvbGljaXRhIGVsIGNhbWJpbyBkZSB0YW1hw7FvIGFsIDUwJSBkZSBsYSBpbWFnZW4gb3JpZ2luYWwsIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6CmBgYAohW2ltYWdlbiBkZW50cm8gZGUgZGlyZWN0b3JpbyBkZQp0cmFiYWpvXShwb2JsYWNpb25fbXVlc3RyYS5wbmcpe3dpZHRoPSI1MCUiIGhlaWdodD0iNTAlIn0KYGBgCgohW2ltYWdlbiBkZW50cm8gZGUgZGlyZWN0b3JpbyBkZQp0cmFiYWpvXShwb2JsYWNpb25fbXVlc3RyYS5wbmcpe3dpZHRoPSI1MCUiIGhlaWdodD0iNTAlIn0KCgojIyMgMi4zLjkuIEluY2x1aXIgY29tZW50YXJpb3MgZW4gZWwgdGV4dG8gc2luIHF1ZSBhcGFyZXpjYW4gZW4gZWwgIm91dHB1dCIuCgpQYXJhIGluY2x1aXIgY29tZW50YXJpb3MgZW4gZWwgdGV4dG8geSBxdWUgbm8gYXBhcmV6Y2FuIGVuIGVsICJvdXRwdXQiIHNlIGluY2x1eWUgZWwgc2NyaXB0IGA8IS0tIHlvdXIgY29tbWVudCAtLT5gLCB5IGVsIHRleHRvIHB1ZWRlIHRlbmVyIHVuYSBvIHZhcmlhcyBsw61uZWFzIGRlIGxvbmdpdHVkLgpUYW1iacOpbiBleGlzdGVuICJzaG9ydGN1dCIgY29uIGVsIHRlY2xhZG8gcGFyYSBpbmNsdWlyIGVsIHNjcmlwdDogYEN0cmwgKyBTaGlmdCArIENgIChgQ29tbWFuZCArIFNoaWZ0ICsgQ2AgZW5tYWNPUykuClBvciBlamVtcGxvOgpgYGAKIlBvciBlamVtcGxvLCBwYXJhIGVsIHByb2dyYW1hIEJlY2EgVW5pdmVyc2FsIHBhcmEgRXN0dWRpYW50ZXMgZGUKRWR1Y2FjacOzbiBNZWRpYSBTdXBlcmlvciBCZW5pdG8gSnXDoXJleiA8IS0tIERlYm8gY29tcHJvYmFyIGxvcyBkYXRvcyBzb2JyZSBlc3RhIHBvbMOtdGljYSBlZHVjYXRpdmEgLS0+LCB1bm8gZGUgbG9zIGRvcyBpbmNsdWlkb3MgZW4gbGEKJ0NhamEgTmVncmEnLCBlbCBFamVjdXRpdm8gcHJvcG9uZSBxdWUgcGFyYSBlbCBwcsOzeGltbyBhw7FvIGRpc3BvbmdhIGRlCjM0IG1pbCA5OTkgbWlsbG9uZXMgZGUgcGVzb3MsICguLi4pLiIKYGBgCgpFbCByZXN1bHRhZG8gZXM6CiJQb3IgZWplbXBsbywgcGFyYSBlbCBwcm9ncmFtYSBCZWNhIFVuaXZlcnNhbCBwYXJhIEVzdHVkaWFudGVzIGRlCkVkdWNhY2nDs24gTWVkaWEgU3VwZXJpb3IgQmVuaXRvIEp1w6FyZXogPCEtLSBEZWJvIGNvbXByb2JhciBsb3MgZGF0b3Mgc29icmUgZXN0YSBwb2zDrXRpY2EgZWR1Y2F0aXZhIC0tPiwgdW5vIGRlIGxvcyBkb3MgaW5jbHVpZG9zIGVuIGxhCidDYWphIE5lZ3JhJywgZWwgRWplY3V0aXZvIHByb3BvbmUgcXVlIHBhcmEgZWwgcHLDs3hpbW8gYcOxbyBkaXNwb25nYSBkZQozNCBtaWwgOTk5IG1pbGxvbmVzIGRlIHBlc29zLCAoLi4uKS4iCgoKIyAzLiBFamVyY2ljaW8uCkluc3RydWNjaW9uZXM6IEVsYWJvcmEgbGEgcmVkYWNjacOzbiBkZSB1biB0ZXh0bywgcHVlZGUgc2VyIGRlIHR1IGF1dG9yw61hIHByb3BpYSBvIGNpdGFkbyBkZSBhbGd1bmEgb3RyYSBmdWVudGUuICAKQSBwYXJ0aXIgZGUgZGljaG8gdGV4dG8sIG1vZGlmw61jYWxvIGNvbW8gdHUgZGVzZWVzLCBwZXJvIHV0aWxpemEgbGEgbWF5b3LDrWEgZGUgbGFzIG9wY2lvbmVzIGRlIHNpbnRheGlzIHJldmlzYWRhcyBlbiBlc3RlIGRvY3VtZW50by4gIApJbmNsdXllIGFsZ3VuYSBpbWFnZW4gZW4gZWwgZG9jdW1lbnRvLCBwdWVkZSBlc3RhciB2aW5jdWxhZGEgdGVtw6F0aWNhbWVudGUgbyBuby4gSW5zZXJ0YSBsYSBpbWFnZW4gZW4gc3UgZm9ybWF0byBvcmlnaW5hbCB5IHBvc3Rlcmlvcm1lbnRlIHZ1ZWx2ZSBhIGluc2VydGFybGEgZW4gdW4gdGFtYcOxbyBtZW5vci4KRmluYWxtZW50ZSwgZ3VhcmRhIGVsIGFyY2hpdm8gZW4gZWwgZm9ybWF0byBgLlJtZGAu