Bibliotecas
library(tidyverse)
library(readxl)
library(plotly)
Objetivos del
experimento
- Determinar qué frecuencia en Hz es considerada una voz agradable o
atractiva.
- Analizar las distintas frecuencias del tono de la voz y comparar
cómo varía el mismo entre hombres y mujeres.
Marco
teórico
La voz puede representar nuestra personalidad y nos permite
relacionarnos socialmente, por lo que el tono y otras cualidades
acústicas de la voz son importantes, pues “los estudios también
demuestran que aunque alguien nos guste al principio, la atracción puede
desaparecer enseguida, por su forma de comunicación,especialmente a
causa de su voz, porque lo más importante no es qué alguien dice sino
cómo lo dice” (Glass, 1994: 205-206).
Emma Rodero Antón (2001) expone en su trabajo “El tono de la voz
masculina y femenina en los informativos radiofónicos: un análisis
comparativo” la diferencia que puede haber entre hombres y mujeres en el
tono de voz que siempre logra ser marcado, además, para el contexto de
su trabajo en el caso de la voz masculina, la voz más grave fue la más
atractiva para los oyentes radiofónicos ya que les representaba
credibilidad, seguridad, etc, en el caso de las mujeres los resultados
fueron más variables, pero se puedo concluir que la elegida para los
oyentes fue las voz más grave. Esa variación en la voz se da por una
diferenciación durante la pubertad, es por ello que la voz masculina
tiende a ser más grave y con un tono más bajo, porque poseen cuerdas
vocales más largas y más gruesas que las de las mujeres.
Rodero Antón, Emma, and Universidad Pontificia de Salamanca. El tono
de la voz masculina y femenina en los informativos radiofónicos: un
análisis comparativo. Noviembre 2001, https://www.researchgate.net/profile/Emma-Rodero/publication/287491072_La_voz_masculina_y_femenina_en_los_informativos_radiofonicos/links/56771bab08ae502c99d2efd6/La-voz-masculina-y-femenina-en-los-informativos-radiofonicos.pdf.
Hipótesis:
- Nosotras suponemos que la voz más grave en los hombres va a ser más
atractiva para las mujeres y la voz más aguda en las mujeres va a ser
más atractiva para los hombres.
- Deducimos que va a haber una amplia diferencia entre el tono de voz
de ambos géneros.
- Suponemos que va a haber más variación en los tonos de voz de los
hombres que en las mujeres.
- Que un tono con frecuencia baja es el usado para persuadir a una
persona.
Marco
Metodológico
- Se le medirán el tono de voz a 16 personas (8 hombres y 8 mujeres)
con el sensor de Arduino Science Journal y simultáneamente se les
grabara la voz.
- Por medio de la media se clasificarán los tonos de voz de la más
grave a la más aguda.
- Después de clasificar los tonos de voz, se les pondrá a varias
personas a escuchar las voces para que decidan qué voz les agrada más y
¿por qué?
- Luego, sacaremos los resultados con respecto a que tono de voz
masculino es más atractivo para las mujeres y viceversa, al igual que
tanta discordancia hay entre los tonos de voz en el mismo género.
- Por último, realizaremos las conclusiones con respecto a nuestra
hipótesis.
Variable
respuesta
Nuestra variable respuesta es el tono. Como sabemos,
el tono es la sensación auditiva o atributo psicológico de los sonidos
que los caracteriza por ser más agudos o más graves en función de la
frecuencia, cuyas propiedades son físicas.
Desde hace un tiempo nos hemos preguntado qué tanto influye el tono
de la voz sobre otras personas, sin son las voces graves o agudas las
que más atractivas se le hacen tanto a hombres como mujeres, por lo que
nos surgieron las siguientes preguntas: ¿Es el tono de voz un
determinante a la hora de conseguir pareja o persuadir a una persona?,
¿Cuál es el rango de frecuencia que es más atractivo en ambos casos y
cómo discrepa el tono en el mismo género? Es por ello que deseamos
investigar dentro de qué frecuencia se encuentran estas voces,
comparando nuestros resultados con investigaciones anteriores.
Variables de
control
- Vamos a medir como es el comportamiento de la frecuencia del tono
entre géneros (Mujeres Vs Hombres)
Datos
Datos
Hombres
voz1_hombre <- read.csv("voz_hombre1.csv") %>%
mutate( voz = "voz_hombre",
frecuencia = "voz1")
voz2_hombre <- read.csv("voz_hombre2.csv") %>%
mutate( voz = "voz_hombre",
frecuencia = "voz2")
voz3_hombre <- read.csv("voz_hombre3.csv") %>%
mutate( voz = "voz_hombre",
frecuencia = "voz3")
voz4_hombre <- read.csv("voz_hombre4.csv") %>%
mutate( voz = "voz_hombre",
frecuencia = "voz4")
voz5_hombre <- read.csv("voz_hombre5.csv") %>%
mutate( voz = "voz_hombre",
frecuencia = "voz5")
voz6_hombre <- read.csv("voz_hombre6.csv") %>%
mutate( voz = "voz_hombre",
frecuencia = "voz6")
voz7_hombre <- read.csv("voz_hombre7.csv") %>%
mutate( voz = "voz_hombre",
frecuencia = "voz7")
voz8_hombre <- read.csv("voz_hombre8.csv") %>%
mutate( voz = "voz_hombre",
frecuencia = "voz8")
Datos
Mujeres
voz1_mujer <- read.csv("voz_mujer1.csv") %>%
mutate( voz = "voz_mujer",
frecuencia = "voz1")
voz2_mujer <- read.csv("voz_mujer2.csv") %>%
mutate( voz = "voz_mujer",
frecuencia = "voz2")
voz3_mujer <- read.csv("voz_mujer3.csv") %>%
mutate( voz = "voz_mujer",
frecuencia = "voz3")
voz4_mujer <- read.csv("voz_mujer4.csv") %>%
mutate( voz = "voz_mujer",
frecuencia = "voz4")
voz5_mujer <- read.csv("voz_mujer5.csv") %>%
mutate( voz = "voz_mujer",
frecuencia = "voz5")
voz6_mujer <- read.csv("voz_mujer6.csv") %>%
mutate( voz = "voz_mujer",
frecuencia = "voz6")
voz7_mujer <- read.csv("voz_mujer7.csv") %>%
mutate( voz = "voz_mujer",
frecuencia = "voz7")
voz8_mujer <- read.csv("voz_mujer8.csv") %>%
mutate( voz = "voz_mujer",
frecuencia = "voz8")
Datos
completos
datos_completos <- bind_rows(voz1_hombre, voz2_hombre, voz3_hombre, voz4_hombre, voz5_hombre, voz6_hombre, voz7_hombre, voz8_hombre, voz1_mujer, voz2_mujer, voz3_mujer, voz4_mujer, voz5_mujer, voz6_mujer, voz7_mujer, voz8_mujer) %>% rename(tono = PitchSensor)
datos_completos %>% head
datos_hombres <- bind_rows(voz1_hombre, voz2_hombre, voz3_hombre, voz4_hombre, voz5_hombre, voz6_hombre, voz7_hombre, voz8_hombre) %>% rename(tono = PitchSensor)
datos_mujeres <- bind_rows(voz1_mujer, voz2_mujer, voz3_mujer, voz4_mujer, voz5_mujer, voz6_mujer, voz7_mujer, voz8_mujer) %>% rename(tono = PitchSensor)
Hombres
- En los siguientes gráficos observaremos el comportamiento de la
frecuencia del tono de la voz de los hombres, añadiendole una linea de
suavizacion para poder visualizar su comportamiento.
datos_completos %>%
filter( voz == "voz_hombre" ) %>%
ggplot(aes(x = timestamp, y = tono, color = frecuencia)) +
facet_wrap(~frecuencia, scales = "free") +
geom_line() + geom_smooth()

Mujeres
- En los siguientes gráficos observaremos el comportamiento de la
frecuencia del tono de la voz de las mujeres, añadiendole una linea de
suavizacion para poder visualizar su comportamiento.
datos_completos %>%
filter( voz == "voz_mujer" ) %>%
ggplot(aes(x = timestamp, y = tono, color = frecuencia)) +
facet_wrap(~frecuencia, scales = "free") +
geom_line() + geom_smooth()

Distribuciones
- ¿Son similares las frecuencias del tono entre hombres o varían
mucho?
datos_completos %>%
filter(voz=="voz_hombre") %>%
ggplot(aes(x = tono, color = frecuencia)) +
geom_density() +
scale_x_log10()

- ¿Son similares las frecuencias del tono entre mujeres o varían
mucho?
datos_completos %>%
filter(voz=="voz_mujer") %>%
ggplot(aes(x = tono, color = frecuencia)) +
geom_density() +
scale_x_log10()

- ¿Son similares las frecuencias del tono entre hombres y mujeres, o
varían mucho?
datos_completos %>%
ggplot(aes(x = tono, color = voz)) +
geom_density() +
scale_x_log10()

Métricas
Promedio
personal
datos_completos %>%
group_by(frecuencia, voz) %>%
summarise(promedio= mean(tono))
Gráficos en
boxplot
datos_completos %>%
ggplot(aes(x= frecuencia,y= tono))+
facet_wrap(~voz, scales = "free") +
geom_violin()+
geom_boxplot(width = 0.2) +
scale_y_log10()

Gráficos
-Datos en tiempo relativo
datos_completos %>%
filter(voz== "voz_hombre") %>%
filter(frecuencia== "voz1") %>%
mutate(tiempo=1:n()) %>%
mutate(tiempo_r= tiempo/max(tiempo))
datos_completos %>%
group_by(voz,frecuencia) %>%
mutate(tiempo=1:n()) %>%
mutate(tiempo_r= tiempo/max(tiempo)) %>%
ggplot(aes(x= tiempo_r, y= tono, color= voz)) +
facet_wrap(~voz) +
geom_line()

- Gráfico general con diferenciación de cada voz
datos_completos %>%
group_by(voz,frecuencia) %>%
mutate(tiempo=1:n()) %>%
mutate(tiempo_r= tiempo/max(tiempo)) %>%
ggplot(aes(x= tiempo_r, y= tono, color= frecuencia)) +
facet_wrap(~voz) +
geom_line()

ggplotly(datos_completos %>%
group_by(voz,frecuencia) %>%
mutate(tiempo=1:n()) %>%
mutate(tiempo_r= tiempo/max(tiempo)) %>%
ggplot(aes(x= tiempo_r, y= tono, color= frecuencia)) +
facet_wrap(~voz) +
geom_line())
Resultados de
encuesta sobre preferencia de voz
encuesta <- read_xlsx("Encuesta.xlsx")
encuesta %>%
count(Mujeres, sort = TRUE) %>%
ggplot(aes(x = reorder (Mujeres,n), y = n, color = Mujeres, fill = Mujeres )) +
geom_col(show.legend = FALSE) +
labs(x = "Mujeres", y = "n",
title = "Resultados de encuesta Mujeres")

encuesta %>%
count(Hombres, sort = TRUE) %>%
ggplot(aes(x = reorder (Hombres,n), y = n, color = Hombres, fill = Hombres )) +
geom_col(show.legend = FALSE) +
labs(x = "Hombres", y = "n",
title = "Resultados de encuesta Hombres")

Resultados
Obtuvimos como resultado que los tonos de voz entre los hombres
es más variado que entre mujeres, además entre géneros discrepa bastate,
esto lo observamos al hallar el coeficiente de variación, obteniendo que
en hombres varia un 121% y en mujeres un 70%.
El rango de voz de los hombres en nuestra investigación va desde
118 a 164 Hz y en mujeres va desde 193 a 236 Hz.
La voz masculina 6 fue la que más le gustó a las mujeres
encuestadas, esta fue una voz bastante homógenea y que tiene un promedio
de 153 Hz.
La voz femenina 8 fue la que más le gustó a los hombres
encuestados, es una voz con un promedio de 208 Hz
Discución
En nuestros resultados hallamos unos rangos de tono de voz que se
encuentran dentro de los rangos establecidos, ya que para
hombres el rango esta entre 85 y 180 Hz y para
mujeres es un rango de 165 a 255 Hz. Podemos deducir
que si seguimos investigando a mas personas los tonos de voz siempre van
a estar dentro de los establecidos.
Podemos decir que aunque en las mujeres se presenta una pequeña
variación todas siempre tiene una tendencia a ser aguda, mientras que en
los hombres la variación es mayor y podemos encontrar de todo tipo de
voz desde graves a agudas.
Conclusiones
Podemos decir que el tono de los hombres y de las mujeres
presentan una significativa diferencia, esto lo podemos observar a
través del coefiente de variación y los gráficos comparativos, tambien
podemos recalcar que los promedios obtenidos se encuentran dentro de los
rangos estableciodos de frecuencia para hombre y mujeres
adultos.
Podimos concluir con este trabajo que el tono de voz de las
personas si puede influir a la hora de pretender a una persona, pues
encontramos una gran variedad de preferencias en la encuesta realizada.
Además, también pudimos darnos cuenta que las personas tienden a asociar
al tono de voz con un tipo de persona.
LS0tDQp0aXRsZTogIkV4cGVyaW1lbnRvIFRvbm8iDQpzdWJ0aXRsZTogIlZhcmlhY2nDs24gZGUgdG9ubyBlbnRyZSBob21icmVzIHkgbXVqZXJlcyINCmF1dGhvcjogIkF5bGluIENyaXN0aW5hIEVjaGF2YXJyaWEgTWVuZG96YSB5IFNhcmEgTWVsaXNhIFBhbGFjaW8gUmVnaW5vIg0KZGF0ZTogIjI3LTExLTIwMjIiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiA1DQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgdGhlbWU6IGNvc21vDQogICAgaGlnaGxpZ2h0OiBicmVlemVkYXJrDQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBldmFsID0gVFJVRSwgZmlnLmFsaWduID0gImNlbnRlciIsDQogICAgICAgICAgICAgICAgICAgICAgZmlnLndpZHRoID0gNS41LCBmaWcuaGVpZ2h0ID0gNC41LCB3YXJuaW5nID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFKQ0KYGBgDQoNCg0KIyAqKkJpYmxpb3RlY2FzKioNCg0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShwbG90bHkpDQpgYGANCg0KIyAqKk9iamV0aXZvcyBkZWwgZXhwZXJpbWVudG8qKg0KDQotIERldGVybWluYXIgcXXDqSBmcmVjdWVuY2lhIGVuIEh6IGVzIGNvbnNpZGVyYWRhIHVuYSB2b3ogYWdyYWRhYmxlIG8gYXRyYWN0aXZhLg0KLSBBbmFsaXphciBsYXMgZGlzdGludGFzIGZyZWN1ZW5jaWFzIGRlbCB0b25vIGRlIGxhIHZveiB5IGNvbXBhcmFyIGPDs21vIHZhcsOtYSBlbCBtaXNtbyBlbnRyZSBob21icmVzIHkgbXVqZXJlcy4NCg0KIyAqKk1hcmNvIHRlw7NyaWNvKioNCg0KTGEgdm96IHB1ZWRlIHJlcHJlc2VudGFyIG51ZXN0cmEgcGVyc29uYWxpZGFkIHkgbm9zIHBlcm1pdGUgcmVsYWNpb25hcm5vcyBzb2NpYWxtZW50ZSwgcG9yIGxvIHF1ZSBlbCB0b25vIHkgb3RyYXMgY3VhbGlkYWRlcyBhY8O6c3RpY2FzIGRlIGxhIHZveiBzb24gaW1wb3J0YW50ZXMsIHB1ZXMg4oCcbG9zIGVzdHVkaW9zIHRhbWJpw6luIGRlbXVlc3RyYW4gcXVlIGF1bnF1ZSBhbGd1aWVuIG5vcyBndXN0ZSBhbCBwcmluY2lwaW8sIGxhIGF0cmFjY2nDs24gcHVlZGUgZGVzYXBhcmVjZXIgZW5zZWd1aWRhLCBwb3Igc3UgZm9ybWEgZGUgY29tdW5pY2FjacOzbixlc3BlY2lhbG1lbnRlIGEgY2F1c2EgZGUgc3Ugdm96LCBwb3JxdWUgbG8gbcOhcyBpbXBvcnRhbnRlIG5vIGVzIHF1w6kgYWxndWllbiBkaWNlIHNpbm8gY8OzbW8gbG8gZGljZeKAnSAoR2xhc3MsIDE5OTQ6IDIwNS0yMDYpLg0KDQpFbW1hIFJvZGVybyBBbnTDs24gKDIwMDEpIGV4cG9uZSBlbiBzdSB0cmFiYWpvICDigJxFbCB0b25vIGRlIGxhIHZveiBtYXNjdWxpbmEgeSBmZW1lbmluYSBlbiBsb3MgaW5mb3JtYXRpdm9zIHJhZGlvZsOzbmljb3M6IHVuIGFuw6FsaXNpcyBjb21wYXJhdGl2b+KAnSBsYSBkaWZlcmVuY2lhIHF1ZSBwdWVkZSBoYWJlciBlbnRyZSBob21icmVzIHkgbXVqZXJlcyBlbiBlbCB0b25vIGRlIHZveiBxdWUgc2llbXByZSBsb2dyYSBzZXIgbWFyY2FkbywgYWRlbcOhcywgcGFyYSBlbCBjb250ZXh0byBkZSBzdSB0cmFiYWpvIGVuIGVsIGNhc28gZGUgbGEgdm96IG1hc2N1bGluYSwgbGEgdm96IG3DoXMgZ3JhdmUgZnVlIGxhIG3DoXMgYXRyYWN0aXZhIHBhcmEgbG9zIG95ZW50ZXMgcmFkaW9mw7NuaWNvcyB5YSBxdWUgbGVzIHJlcHJlc2VudGFiYSBjcmVkaWJpbGlkYWQsIHNlZ3VyaWRhZCwgZXRjLCBlbiBlbCBjYXNvIGRlIGxhcyBtdWplcmVzIGxvcyByZXN1bHRhZG9zIGZ1ZXJvbiBtw6FzIHZhcmlhYmxlcywgcGVybyBzZSBwdWVkbyBjb25jbHVpciBxdWUgbGEgZWxlZ2lkYSBwYXJhIGxvcyAgb3llbnRlcyBmdWUgbGFzIHZveiBtw6FzIGdyYXZlLg0KRXNhIHZhcmlhY2nDs24gZW4gbGEgdm96IHNlIGRhIHBvciB1bmEgZGlmZXJlbmNpYWNpw7NuIGR1cmFudGUgbGEgcHViZXJ0YWQsIGVzIHBvciBlbGxvIHF1ZSBsYSB2b3ogbWFzY3VsaW5hIHRpZW5kZSBhIHNlciBtw6FzIGdyYXZlIHkgY29uIHVuIHRvbm8gbcOhcyBiYWpvLCBwb3JxdWUgcG9zZWVuIGN1ZXJkYXMgdm9jYWxlcyBtw6FzIGxhcmdhcyB5IG3DoXMgZ3J1ZXNhcyBxdWUgbGFzIGRlIGxhcyBtdWplcmVzLiANCg0KUm9kZXJvIEFudMOzbiwgRW1tYSwgYW5kIFVuaXZlcnNpZGFkIFBvbnRpZmljaWEgZGUgU2FsYW1hbmNhLiBFbCB0b25vIGRlIGxhIHZveiBtYXNjdWxpbmEgeSBmZW1lbmluYSBlbiBsb3MgaW5mb3JtYXRpdm9zIHJhZGlvZsOzbmljb3M6IHVuIGFuw6FsaXNpcyBjb21wYXJhdGl2by4gTm92aWVtYnJlIDIwMDEsIGh0dHBzOi8vd3d3LnJlc2VhcmNoZ2F0ZS5uZXQvcHJvZmlsZS9FbW1hLVJvZGVyby9wdWJsaWNhdGlvbi8yODc0OTEwNzJfTGFfdm96X21hc2N1bGluYV95X2ZlbWVuaW5hX2VuX2xvc19pbmZvcm1hdGl2b3NfcmFkaW9mb25pY29zL2xpbmtzLzU2NzcxYmFiMDhhZTUwMmM5OWQyZWZkNi9MYS12b3otbWFzY3VsaW5hLXktZmVtZW5pbmEtZW4tbG9zLWluZm9ybWF0aXZvcy1yYWRpb2Zvbmljb3MucGRmLg0KDQojICoqSGlww7N0ZXNpczoqKg0KDQotIE5vc290cmFzIHN1cG9uZW1vcyBxdWUgbGEgdm96IG3DoXMgZ3JhdmUgZW4gbG9zIGhvbWJyZXMgdmEgYSBzZXIgbcOhcyBhdHJhY3RpdmEgcGFyYSBsYXMgbXVqZXJlcyB5IGxhIHZveiBtw6FzIGFndWRhIGVuIGxhcyBtdWplcmVzIHZhIGEgc2VyIG3DoXMgYXRyYWN0aXZhIHBhcmEgbG9zIGhvbWJyZXMuIA0KLSBEZWR1Y2ltb3MgcXVlIHZhIGEgaGFiZXIgdW5hIGFtcGxpYSBkaWZlcmVuY2lhIGVudHJlIGVsIHRvbm8gZGUgdm96IGRlIGFtYm9zIGfDqW5lcm9zLg0KLSBTdXBvbmVtb3MgcXVlIHZhIGEgaGFiZXIgbcOhcyB2YXJpYWNpw7NuIGVuIGxvcyB0b25vcyBkZSB2b3ogZGUgbG9zIGhvbWJyZXMgcXVlIGVuIGxhcyBtdWplcmVzLg0KLSBRdWUgdW4gdG9ubyBjb24gZnJlY3VlbmNpYSBiYWphIGVzIGVsIHVzYWRvIHBhcmEgcGVyc3VhZGlyIGEgdW5hIHBlcnNvbmEuDQoNCg0KIyAqKk1hcmNvIE1ldG9kb2zDs2dpY28qKg0KDQotIFNlIGxlIG1lZGlyw6FuIGVsIHRvbm8gZGUgdm96IGEgMTYgcGVyc29uYXMgKDggaG9tYnJlcyB5IDggbXVqZXJlcykgY29uIGVsIHNlbnNvciBkZSBBcmR1aW5vIFNjaWVuY2UgSm91cm5hbCB5IHNpbXVsdMOhbmVhbWVudGUgc2UgbGVzIGdyYWJhcmEgbGEgdm96Lg0KLSBQb3IgbWVkaW8gZGUgbGEgbWVkaWEgc2UgY2xhc2lmaWNhcsOhbiBsb3MgdG9ub3MgZGUgdm96IGRlIGxhIG3DoXMgZ3JhdmUgYSBsYSBtw6FzIGFndWRhLg0KLSBEZXNwdcOpcyBkZSBjbGFzaWZpY2FyIGxvcyB0b25vcyBkZSB2b3osIHNlIGxlcyBwb25kcsOhIGEgdmFyaWFzIHBlcnNvbmFzIGEgZXNjdWNoYXIgbGFzIHZvY2VzIHBhcmEgcXVlIGRlY2lkYW4gcXXDqSB2b3ogbGVzIGFncmFkYSBtw6FzIHkgwr9wb3IgcXXDqT8NCi0gTHVlZ28sIHNhY2FyZW1vcyBsb3MgcmVzdWx0YWRvcyBjb24gcmVzcGVjdG8gYSBxdWUgdG9ubyBkZSB2b3ogbWFzY3VsaW5vIGVzIG3DoXMgYXRyYWN0aXZvIHBhcmEgbGFzIG11amVyZXMgeSB2aWNldmVyc2EsIGFsIGlndWFsIHF1ZSB0YW50YSBkaXNjb3JkYW5jaWEgaGF5IGVudHJlIGxvcyB0b25vcyBkZSB2b3ogZW4gZWwgbWlzbW8gZ8OpbmVyby4NCi0gUG9yIMO6bHRpbW8sIHJlYWxpemFyZW1vcyBsYXMgY29uY2x1c2lvbmVzIGNvbiByZXNwZWN0byBhIG51ZXN0cmEgaGlww7N0ZXNpcy4NCg0KIyAqKlZhcmlhYmxlIHJlc3B1ZXN0YSoqDQoNCioqTnVlc3RyYSB2YXJpYWJsZSByZXNwdWVzdGEgZXMgZWwgdG9ubyoqLiBDb21vIHNhYmVtb3MsIGVsIHRvbm8gZXMgbGEgc2Vuc2FjacOzbiBhdWRpdGl2YSBvIGF0cmlidXRvIHBzaWNvbMOzZ2ljbyBkZSBsb3Mgc29uaWRvcyBxdWUgbG9zIGNhcmFjdGVyaXphIHBvciBzZXIgbcOhcyBhZ3Vkb3MgbyBtw6FzIGdyYXZlcyBlbiBmdW5jacOzbiBkZSBsYSBmcmVjdWVuY2lhLCBjdXlhcyBwcm9waWVkYWRlcyBzb24gZsOtc2ljYXMuIA0KDQpEZXNkZSBoYWNlIHVuIHRpZW1wbyBub3MgaGVtb3MgcHJlZ3VudGFkbyBxdcOpIHRhbnRvIGluZmx1eWUgZWwgdG9ubyBkZSBsYSB2b3ogc29icmUgb3RyYXMgcGVyc29uYXMsIHNpbiBzb24gbGFzIHZvY2VzIGdyYXZlcyBvIGFndWRhcyBsYXMgcXVlIG3DoXMgYXRyYWN0aXZhcyBzZSBsZSBoYWNlbiB0YW50byBhIGhvbWJyZXMgY29tbyBtdWplcmVzLCBwb3IgbG8gcXVlIG5vcyBzdXJnaWVyb24gbGFzIHNpZ3VpZW50ZXMgcHJlZ3VudGFzOiDCv0VzIGVsIHRvbm8gZGUgdm96IHVuIGRldGVybWluYW50ZSBhIGxhIGhvcmEgZGUgY29uc2VndWlyIHBhcmVqYSBvIHBlcnN1YWRpciBhIHVuYSBwZXJzb25hPywgwr9DdcOhbCBlcyBlbCByYW5nbyBkZSBmcmVjdWVuY2lhIHF1ZSBlcyBtw6FzIGF0cmFjdGl2byBlbiBhbWJvcyBjYXNvcyB5IGPDs21vIGRpc2NyZXBhIGVsIHRvbm8gZW4gZWwgbWlzbW8gZ8OpbmVybz8gRXMgcG9yIGVsbG8gcXVlIGRlc2VhbW9zIGludmVzdGlnYXIgZGVudHJvIGRlIHF1w6kgZnJlY3VlbmNpYSBzZSBlbmN1ZW50cmFuIGVzdGFzIHZvY2VzLCBjb21wYXJhbmRvIG51ZXN0cm9zIHJlc3VsdGFkb3MgY29uIGludmVzdGlnYWNpb25lcyBhbnRlcmlvcmVzLg0KDQojICoqVmFyaWFibGVzIGRlIGNvbnRyb2wqKg0KDQotIFZhbW9zIGEgbWVkaXIgY29tbyBlcyBlbCBjb21wb3J0YW1pZW50byBkZSBsYSBmcmVjdWVuY2lhIGRlbCB0b25vIGVudHJlIGfDqW5lcm9zIChNdWplcmVzIFZzIEhvbWJyZXMpIA0KDQojICoqRGF0b3MqKg0KDQojIyAqRGF0b3MgSG9tYnJlcyoNCg0KYGBge3J9DQp2b3oxX2hvbWJyZSA8LSByZWFkLmNzdigidm96X2hvbWJyZTEuY3N2IikgJT4lIA0KICBtdXRhdGUoIHZveiA9ICJ2b3pfaG9tYnJlIiwNCiAgICAgICAgIGZyZWN1ZW5jaWEgPSAidm96MSIpDQoNCnZvejJfaG9tYnJlIDwtIHJlYWQuY3N2KCJ2b3pfaG9tYnJlMi5jc3YiKSAlPiUgDQogIG11dGF0ZSggdm96ID0gInZvel9ob21icmUiLA0KICAgICAgICAgZnJlY3VlbmNpYSA9ICJ2b3oyIikNCg0Kdm96M19ob21icmUgPC0gcmVhZC5jc3YoInZvel9ob21icmUzLmNzdiIpICU+JSANCiAgbXV0YXRlKCB2b3ogPSAidm96X2hvbWJyZSIsDQogICAgICAgICBmcmVjdWVuY2lhID0gInZvejMiKQ0KDQp2b3o0X2hvbWJyZSA8LSByZWFkLmNzdigidm96X2hvbWJyZTQuY3N2IikgJT4lIA0KICBtdXRhdGUoIHZveiA9ICJ2b3pfaG9tYnJlIiwNCiAgICAgICAgIGZyZWN1ZW5jaWEgPSAidm96NCIpDQp2b3o1X2hvbWJyZSA8LSByZWFkLmNzdigidm96X2hvbWJyZTUuY3N2IikgJT4lIA0KICBtdXRhdGUoIHZveiA9ICJ2b3pfaG9tYnJlIiwNCiAgICAgICAgIGZyZWN1ZW5jaWEgPSAidm96NSIpDQp2b3o2X2hvbWJyZSA8LSByZWFkLmNzdigidm96X2hvbWJyZTYuY3N2IikgJT4lIA0KICBtdXRhdGUoIHZveiA9ICJ2b3pfaG9tYnJlIiwNCiAgICAgICAgIGZyZWN1ZW5jaWEgPSAidm96NiIpDQp2b3o3X2hvbWJyZSA8LSByZWFkLmNzdigidm96X2hvbWJyZTcuY3N2IikgJT4lIA0KICBtdXRhdGUoIHZveiA9ICJ2b3pfaG9tYnJlIiwNCiAgICAgICAgIGZyZWN1ZW5jaWEgPSAidm96NyIpDQp2b3o4X2hvbWJyZSA8LSByZWFkLmNzdigidm96X2hvbWJyZTguY3N2IikgJT4lIA0KICBtdXRhdGUoIHZveiA9ICJ2b3pfaG9tYnJlIiwNCiAgICAgICAgIGZyZWN1ZW5jaWEgPSAidm96OCIpDQpgYGANCg0KIyMgKkRhdG9zIE11amVyZXMqDQoNCmBgYHtyfQ0KDQp2b3oxX211amVyIDwtIHJlYWQuY3N2KCJ2b3pfbXVqZXIxLmNzdiIpICU+JSANCiAgbXV0YXRlKCB2b3ogPSAidm96X211amVyIiwNCiAgICAgICAgIGZyZWN1ZW5jaWEgPSAidm96MSIpDQoNCnZvejJfbXVqZXIgPC0gcmVhZC5jc3YoInZvel9tdWplcjIuY3N2IikgJT4lIA0KICBtdXRhdGUoIHZveiA9ICJ2b3pfbXVqZXIiLA0KICAgICAgICAgZnJlY3VlbmNpYSA9ICJ2b3oyIikNCg0Kdm96M19tdWplciA8LSByZWFkLmNzdigidm96X211amVyMy5jc3YiKSAlPiUgDQogIG11dGF0ZSggdm96ID0gInZvel9tdWplciIsDQogICAgICAgICBmcmVjdWVuY2lhID0gInZvejMiKQ0KDQp2b3o0X211amVyIDwtIHJlYWQuY3N2KCJ2b3pfbXVqZXI0LmNzdiIpICU+JSANCiAgbXV0YXRlKCB2b3ogPSAidm96X211amVyIiwNCiAgICAgICAgIGZyZWN1ZW5jaWEgPSAidm96NCIpDQp2b3o1X211amVyIDwtIHJlYWQuY3N2KCJ2b3pfbXVqZXI1LmNzdiIpICU+JSANCiAgbXV0YXRlKCB2b3ogPSAidm96X211amVyIiwNCiAgICAgICAgIGZyZWN1ZW5jaWEgPSAidm96NSIpDQp2b3o2X211amVyIDwtIHJlYWQuY3N2KCJ2b3pfbXVqZXI2LmNzdiIpICU+JSANCiAgbXV0YXRlKCB2b3ogPSAidm96X211amVyIiwNCiAgICAgICAgIGZyZWN1ZW5jaWEgPSAidm96NiIpDQp2b3o3X211amVyIDwtIHJlYWQuY3N2KCJ2b3pfbXVqZXI3LmNzdiIpICU+JSANCiAgbXV0YXRlKCB2b3ogPSAidm96X211amVyIiwNCiAgICAgICAgIGZyZWN1ZW5jaWEgPSAidm96NyIpDQp2b3o4X211amVyIDwtIHJlYWQuY3N2KCJ2b3pfbXVqZXI4LmNzdiIpICU+JSANCiAgbXV0YXRlKCB2b3ogPSAidm96X211amVyIiwNCiAgICAgICAgIGZyZWN1ZW5jaWEgPSAidm96OCIpDQpgYGANCg0KIyMgKkRhdG9zIGNvbXBsZXRvcyoNCg0KYGBge3J9DQpkYXRvc19jb21wbGV0b3MgPC0gYmluZF9yb3dzKHZvejFfaG9tYnJlLCB2b3oyX2hvbWJyZSwgdm96M19ob21icmUsIHZvejRfaG9tYnJlLCB2b3o1X2hvbWJyZSwgdm96Nl9ob21icmUsIHZvejdfaG9tYnJlLCB2b3o4X2hvbWJyZSwgdm96MV9tdWplciwgdm96Ml9tdWplciwgdm96M19tdWplciwgdm96NF9tdWplciwgdm96NV9tdWplciwgdm96Nl9tdWplciwgdm96N19tdWplciwgdm96OF9tdWplcikgJT4lIHJlbmFtZSh0b25vID0gUGl0Y2hTZW5zb3IpDQoNCmRhdG9zX2NvbXBsZXRvcyAlPiUgaGVhZA0KDQpkYXRvc19ob21icmVzIDwtIGJpbmRfcm93cyh2b3oxX2hvbWJyZSwgdm96Ml9ob21icmUsIHZvejNfaG9tYnJlLCB2b3o0X2hvbWJyZSwgdm96NV9ob21icmUsIHZvejZfaG9tYnJlLCB2b3o3X2hvbWJyZSwgdm96OF9ob21icmUpICU+JSByZW5hbWUodG9ubyA9IFBpdGNoU2Vuc29yKQ0KDQpkYXRvc19tdWplcmVzIDwtIGJpbmRfcm93cyh2b3oxX211amVyLCB2b3oyX211amVyLCB2b3ozX211amVyLCB2b3o0X211amVyLCB2b3o1X211amVyLCB2b3o2X211amVyLCB2b3o3X211amVyLCB2b3o4X211amVyKSAlPiUgcmVuYW1lKHRvbm8gPSBQaXRjaFNlbnNvcikNCmBgYA0KDQojICoqSG9tYnJlcyoqDQoNCi0gRW4gbG9zIHNpZ3VpZW50ZXMgZ3LDoWZpY29zIG9ic2VydmFyZW1vcyBlbCBjb21wb3J0YW1pZW50byBkZSBsYSBmcmVjdWVuY2lhIGRlbCB0b25vIGRlIGxhIHZveiBkZSBsb3MgaG9tYnJlcywgYcOxYWRpZW5kb2xlIHVuYSBsaW5lYSBkZSBzdWF2aXphY2lvbiBwYXJhIHBvZGVyIHZpc3VhbGl6YXIgc3UgY29tcG9ydGFtaWVudG8uIA0KDQpgYGB7cn0NCmRhdG9zX2NvbXBsZXRvcyAlPiUgDQogIGZpbHRlciggdm96ID09ICJ2b3pfaG9tYnJlIiApICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gdGltZXN0YW1wLCB5ID0gdG9ubywgY29sb3IgPSBmcmVjdWVuY2lhKSkgKw0KICBmYWNldF93cmFwKH5mcmVjdWVuY2lhLCBzY2FsZXMgPSAiZnJlZSIpICsNCiAgZ2VvbV9saW5lKCkgKyBnZW9tX3Ntb290aCgpDQoNCmBgYA0KDQojICoqTXVqZXJlcyoqDQoNCi0gRW4gbG9zIHNpZ3VpZW50ZXMgZ3LDoWZpY29zIG9ic2VydmFyZW1vcyBlbCBjb21wb3J0YW1pZW50byBkZSBsYSBmcmVjdWVuY2lhIGRlbCB0b25vIGRlIGxhIHZveiBkZSBsYXMgbXVqZXJlcywgYcOxYWRpZW5kb2xlIHVuYSBsaW5lYSBkZSBzdWF2aXphY2lvbiBwYXJhIHBvZGVyIHZpc3VhbGl6YXIgc3UgY29tcG9ydGFtaWVudG8uIA0KDQpgYGB7cn0NCmRhdG9zX2NvbXBsZXRvcyAlPiUgDQogIGZpbHRlciggdm96ID09ICJ2b3pfbXVqZXIiICkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSB0aW1lc3RhbXAsIHkgPSB0b25vLCBjb2xvciA9IGZyZWN1ZW5jaWEpKSArDQogIGZhY2V0X3dyYXAofmZyZWN1ZW5jaWEsIHNjYWxlcyA9ICJmcmVlIikgKw0KICBnZW9tX2xpbmUoKSArIGdlb21fc21vb3RoKCkNCmBgYA0KDQoNCiMgKipEaXN0cmlidWNpb25lcyoqDQoNCi0gwr9Tb24gc2ltaWxhcmVzIGxhcyBmcmVjdWVuY2lhcyBkZWwgdG9ubyBlbnRyZSBob21icmVzIG8gdmFyw61hbiBtdWNobz8NCg0KYGBge3J9DQoNCmRhdG9zX2NvbXBsZXRvcyAlPiUgDQogIGZpbHRlcih2b3o9PSJ2b3pfaG9tYnJlIikgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSB0b25vLCBjb2xvciA9IGZyZWN1ZW5jaWEpKSArDQogIGdlb21fZGVuc2l0eSgpICsNCiAgc2NhbGVfeF9sb2cxMCgpDQoNCmBgYA0KDQotIMK/U29uIHNpbWlsYXJlcyBsYXMgZnJlY3VlbmNpYXMgZGVsIHRvbm8gZW50cmUgbXVqZXJlcyBvIHZhcsOtYW4gbXVjaG8/DQoNCmBgYHtyfQ0KDQpkYXRvc19jb21wbGV0b3MgJT4lIA0KICBmaWx0ZXIodm96PT0idm96X211amVyIikgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSB0b25vLCBjb2xvciA9IGZyZWN1ZW5jaWEpKSArDQogIGdlb21fZGVuc2l0eSgpICsNCiAgc2NhbGVfeF9sb2cxMCgpDQoNCmBgYA0KDQotIMK/U29uIHNpbWlsYXJlcyBsYXMgZnJlY3VlbmNpYXMgZGVsIHRvbm8gZW50cmUgaG9tYnJlcyB5IG11amVyZXMsIG8gdmFyw61hbiBtdWNobz8NCg0KYGBge3J9DQpkYXRvc19jb21wbGV0b3MgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSB0b25vLCBjb2xvciA9IHZveikpICsNCiAgZ2VvbV9kZW5zaXR5KCkgKw0KICBzY2FsZV94X2xvZzEwKCkNCmBgYA0KDQojICoqTcOpdHJpY2FzKioNCg0KIyMgKlByb21lZGlvIHBlcnNvbmFsKg0KDQpgYGB7cn0NCmRhdG9zX2NvbXBsZXRvcyAlPiUgDQogIGdyb3VwX2J5KGZyZWN1ZW5jaWEsIHZveikgJT4lIA0KICBzdW1tYXJpc2UocHJvbWVkaW89IG1lYW4odG9ubykpDQogIA0KYGBgDQoNCiMjICpQcm9tZWRpbyBnZW5lcmFsLCBtZWRpYW5hLCBtw61uaW1vLCBtw6F4aW1vLCBkZXN2aWFjacOzbiBlc3TDoW5kYXIgeSBjb2VmaWNpZW50ZSBkZSB2YXJpYWNpw7NuKg0KDQpgYGB7cn0NCmRhdG9zX2NvbXBsZXRvcyAlPiUgDQogIGdyb3VwX2J5KHZveikgJT4lIA0KICBzdW1tYXJpc2UocHJvbWVkaW89IG1lYW4odG9ubyksDQogICAgICAgICAgICBtZWRpYW5hID0gbWVkaWFuKHRvbm8pLA0KICAgICAgICAgICAgbWluaW1vPSBtaW4odG9ubyksDQogICAgICAgICAgICBtYXhpbW89IG1heCh0b25vKSwNCiAgICAgICAgICAgIGRlc3YgPSBzZCh0b25vKSwNCiAgICAgICAgICAgIGN2ID0gZGVzdi9wcm9tZWRpbykNCmBgYA0KDQojICoqR3LDoWZpY29zIGVuIGJveHBsb3QqKg0KDQpgYGB7cn0NCmRhdG9zX2NvbXBsZXRvcyAlPiUgDQogIGdncGxvdChhZXMoeD0gZnJlY3VlbmNpYSx5PSB0b25vKSkrDQogIGZhY2V0X3dyYXAofnZveiwgc2NhbGVzID0gImZyZWUiKSArDQogIGdlb21fdmlvbGluKCkrDQogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMikgKyANCiAgc2NhbGVfeV9sb2cxMCgpDQpgYGANCg0KIyAqKkdyw6FmaWNvcyoqDQoNCi1EYXRvcyBlbiB0aWVtcG8gcmVsYXRpdm8NCg0KYGBge3J9DQpkYXRvc19jb21wbGV0b3MgJT4lIA0KICBmaWx0ZXIodm96PT0gInZvel9ob21icmUiKSAlPiUgDQogIGZpbHRlcihmcmVjdWVuY2lhPT0gInZvejEiKSAlPiUgDQogIG11dGF0ZSh0aWVtcG89MTpuKCkpICU+JSANCiAgbXV0YXRlKHRpZW1wb19yPSB0aWVtcG8vbWF4KHRpZW1wbykpDQpgYGANCi0gR3LDoWZpY28gZ2VuZXJhbA0KDQpgYGB7cn0NCmRhdG9zX2NvbXBsZXRvcyAlPiUgDQogIGdyb3VwX2J5KHZveixmcmVjdWVuY2lhKSAlPiUgDQogIG11dGF0ZSh0aWVtcG89MTpuKCkpICU+JSANCiAgbXV0YXRlKHRpZW1wb19yPSB0aWVtcG8vbWF4KHRpZW1wbykpICU+JSANCiAgIGdncGxvdChhZXMoeD0gdGllbXBvX3IsIHk9IHRvbm8sIGNvbG9yPSB2b3opKSArDQogIGZhY2V0X3dyYXAofnZveikgKw0KICBnZW9tX2xpbmUoKQ0KYGBgDQoNCi0gR3LDoWZpY28gZ2VuZXJhbCBjb24gZGlmZXJlbmNpYWNpw7NuIGRlIGNhZGEgdm96DQoNCmBgYHtyfQ0KZGF0b3NfY29tcGxldG9zICU+JSANCiAgZ3JvdXBfYnkodm96LGZyZWN1ZW5jaWEpICU+JSANCiAgbXV0YXRlKHRpZW1wbz0xOm4oKSkgJT4lIA0KICBtdXRhdGUodGllbXBvX3I9IHRpZW1wby9tYXgodGllbXBvKSkgJT4lIA0KICAgZ2dwbG90KGFlcyh4PSB0aWVtcG9fciwgeT0gdG9ubywgY29sb3I9IGZyZWN1ZW5jaWEpKSArDQogIGZhY2V0X3dyYXAofnZveikgKw0KICBnZW9tX2xpbmUoKQ0KYGBgDQoNCi0gR3LDoWZpY28gaW50ZXJhY3Rpdm8NCg0KYGBge3J9DQpnZ3Bsb3RseShkYXRvc19jb21wbGV0b3MgJT4lIA0KICBncm91cF9ieSh2b3osZnJlY3VlbmNpYSkgJT4lIA0KICBtdXRhdGUodGllbXBvPTE6bigpKSAlPiUgDQogIG11dGF0ZSh0aWVtcG9fcj0gdGllbXBvL21heCh0aWVtcG8pKSAlPiUgDQogICBnZ3Bsb3QoYWVzKHg9IHRpZW1wb19yLCB5PSB0b25vLCBjb2xvcj0gZnJlY3VlbmNpYSkpICsNCiAgZmFjZXRfd3JhcCh+dm96KSArDQogIGdlb21fbGluZSgpKQ0KYGBgDQojICoqUmVzdWx0YWRvcyBkZSBlbmN1ZXN0YSBzb2JyZSBwcmVmZXJlbmNpYSBkZSB2b3oqKg0KDQpgYGB7cn0NCmVuY3Vlc3RhIDwtIHJlYWRfeGxzeCgiRW5jdWVzdGEueGxzeCIpIA0KZW5jdWVzdGEgJT4lIA0KICAgY291bnQoTXVqZXJlcywgc29ydCA9IFRSVUUpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlciAoTXVqZXJlcyxuKSwgeSA9IG4sIGNvbG9yID0gTXVqZXJlcywgZmlsbCA9IE11amVyZXMgKSkgKw0KICBnZW9tX2NvbChzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQogIGxhYnMoeCA9ICJNdWplcmVzIiwgeSA9ICJuIiwNCiAgICAgICB0aXRsZSA9ICJSZXN1bHRhZG9zIGRlIGVuY3Vlc3RhIE11amVyZXMiKQ0KDQplbmN1ZXN0YSAlPiUgDQogICBjb3VudChIb21icmVzLCBzb3J0ID0gVFJVRSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyIChIb21icmVzLG4pLCB5ID0gbiwgY29sb3IgPSBIb21icmVzLCBmaWxsID0gSG9tYnJlcyApKSArDQogIGdlb21fY29sKHNob3cubGVnZW5kID0gRkFMU0UpICsNCiAgbGFicyh4ID0gIkhvbWJyZXMiLCB5ID0gIm4iLA0KICAgICAgIHRpdGxlID0gIlJlc3VsdGFkb3MgZGUgZW5jdWVzdGEgSG9tYnJlcyIpDQoNCmBgYA0KDQoNCiMgKipSZXN1bHRhZG9zKioNCg0KLSBPYnR1dmltb3MgY29tbyByZXN1bHRhZG8gcXVlIGxvcyB0b25vcyBkZSB2b3ogZW50cmUgbG9zIGhvbWJyZXMgZXMgbcOhcyB2YXJpYWRvIHF1ZSBlbnRyZSBtdWplcmVzLCBhZGVtw6FzIGVudHJlIGfDqW5lcm9zIGRpc2NyZXBhIGJhc3RhdGUsIGVzdG8gbG8gb2JzZXJ2YW1vcyBhbCBoYWxsYXIgZWwgY29lZmljaWVudGUgZGUgdmFyaWFjacOzbiwgb2J0ZW5pZW5kbyBxdWUgZW4gaG9tYnJlcyB2YXJpYSB1biAxMjElIHkgZW4gbXVqZXJlcyB1biA3MCUuDQoNCi0gRWwgcmFuZ28gZGUgdm96IGRlIGxvcyBob21icmVzIGVuIG51ZXN0cmEgaW52ZXN0aWdhY2nDs24gdmEgZGVzZGUgMTE4IGEgMTY0IEh6IHkgZW4gbXVqZXJlcyB2YSBkZXNkZSAxOTMgYSAyMzYgSHouDQoNCi0gTGEgdm96IG1hc2N1bGluYSA2IGZ1ZSBsYSBxdWUgbcOhcyBsZSBndXN0w7MgYSBsYXMgbXVqZXJlcyBlbmN1ZXN0YWRhcywgZXN0YSBmdWUgdW5hIHZveiBiYXN0YW50ZSBob23Ds2dlbmVhIHkgcXVlIHRpZW5lIHVuIHByb21lZGlvIGRlIDE1MyBIei4NCg0KLSBMYSB2b3ogZmVtZW5pbmEgOCBmdWUgbGEgcXVlIG3DoXMgbGUgZ3VzdMOzIGEgbG9zIGhvbWJyZXMgZW5jdWVzdGFkb3MsIGVzIHVuYSB2b3ogY29uIHVuIHByb21lZGlvIGRlIDIwOCBIeg0KDQojICoqRGlzY3VjacOzbioqDQoNCi0gRW4gbnVlc3Ryb3MgcmVzdWx0YWRvcyBoYWxsYW1vcyB1bm9zIHJhbmdvcyBkZSB0b25vIGRlIHZveiBxdWUgc2UgZW5jdWVudHJhbiBkZW50cm8gZGUgbG9zIHJhbmdvcyBlc3RhYmxlY2lkb3MsIHlhIHF1ZSBwYXJhICoqaG9tYnJlcyoqIGVsIHJhbmdvIGVzdGEgZW50cmUgODUgeSAxODAgSHogeSBwYXJhICoqbXVqZXJlcyoqIGVzIHVuIHJhbmdvIGRlIDE2NSBhIDI1NSBIei4gUG9kZW1vcyBkZWR1Y2lyIHF1ZSBzaSBzZWd1aW1vcyBpbnZlc3RpZ2FuZG8gYSBtYXMgcGVyc29uYXMgbG9zIHRvbm9zIGRlIHZveiBzaWVtcHJlIHZhbiBhIGVzdGFyIGRlbnRybyBkZSBsb3MgZXN0YWJsZWNpZG9zLg0KDQotIFBvZGVtb3MgZGVjaXIgcXVlIGF1bnF1ZSBlbiBsYXMgbXVqZXJlcyBzZSBwcmVzZW50YSB1bmEgcGVxdWXDsWEgdmFyaWFjacOzbiB0b2RhcyBzaWVtcHJlIHRpZW5lIHVuYSB0ZW5kZW5jaWEgYSBzZXIgYWd1ZGEsIG1pZW50cmFzIHF1ZSBlbiBsb3MgaG9tYnJlcyBsYSB2YXJpYWNpw7NuIGVzIG1heW9yIHkgcG9kZW1vcyBlbmNvbnRyYXIgZGUgdG9kbyB0aXBvIGRlIHZveiBkZXNkZSBncmF2ZXMgYSBhZ3VkYXMuDQoNCiMgKipDb25jbHVzaW9uZXMqKg0KDQotIFBvZGVtb3MgZGVjaXIgcXVlIGVsIHRvbm8gZGUgbG9zIGhvbWJyZXMgeSBkZSBsYXMgbXVqZXJlcyBwcmVzZW50YW4gdW5hIHNpZ25pZmljYXRpdmEgZGlmZXJlbmNpYSwgZXN0byBsbyBwb2RlbW9zIG9ic2VydmFyIGEgdHJhdsOpcyBkZWwgY29lZmllbnRlIGRlIHZhcmlhY2nDs24geSBsb3MgZ3LDoWZpY29zIGNvbXBhcmF0aXZvcywgdGFtYmllbiBwb2RlbW9zIHJlY2FsY2FyIHF1ZSBsb3MgcHJvbWVkaW9zIG9idGVuaWRvcyBzZSBlbmN1ZW50cmFuIGRlbnRybyBkZSBsb3MgcmFuZ29zIGVzdGFibGVjaW9kb3MgZGUgZnJlY3VlbmNpYSBwYXJhIGhvbWJyZSB5IG11amVyZXMgYWR1bHRvcy4NCg0KLSBQb2RpbW9zIGNvbmNsdWlyIGNvbiBlc3RlIHRyYWJham8gcXVlIGVsIHRvbm8gZGUgdm96IGRlIGxhcyBwZXJzb25hcyBzaSBwdWVkZSBpbmZsdWlyIGEgbGEgaG9yYSBkZSBwcmV0ZW5kZXIgYSB1bmEgcGVyc29uYSwgcHVlcyBlbmNvbnRyYW1vcyB1bmEgZ3JhbiB2YXJpZWRhZCBkZSBwcmVmZXJlbmNpYXMgZW4gbGEgZW5jdWVzdGEgcmVhbGl6YWRhLiBBZGVtw6FzLCB0YW1iacOpbiBwdWRpbW9zIGRhcm5vcyBjdWVudGEgcXVlIGxhcyBwZXJzb25hcyB0aWVuZGVuIGEgYXNvY2lhciBhbCB0b25vIGRlIHZveiBjb24gdW4gdGlwbyBkZSBwZXJzb25hLg0KDQoNCg0K