E1U2

Víctor Manuel Cota García

26/11/2021

Nombre: Víctor Manuel Cota García Matrícula:00000230491 26/11/2021

1.- ¿Qué es la estadística y que aplicaciones tiene en ingeniería (según su ingeniería)?

  • La estadística es la ciencia de recopilar, analizar, presentar e interpretar datos, nos permite crear predicciones con base a los datos que poseemos y es una herramienta de suma importancia para el desarrollo humano, así mismo posee infinidad de aplicaciones en función del campo en el que se utilice:

  • Ingeniería ambiental

Estudios de suelo.

Calidad del aire y agua.

Estudios demográficos.

Predicciones climatológicas.

  • Ingeniería automotriz

Mejora de modelos.

Mejoras en la línea de producción.

Marketing.

  • Ingeniería en Software

Creación de algoritmos de software.

Creación de bases de datos. …

2.- Enliste y defina los tipos de variables usados en estadística, de 2 ejemplos de cada uno. Defina distribución de frecuencia y explique que es la distribución normal.

  • Variable cuantitativa: Representan cantidades, hay dos tipos de variables cuantitativas, discretas y continuas, las discretas son aquellas que cuentan elementos o valores individuales, como por ejemplo el número de archivos en una computadora según su tipo o las especies de abejas que habitan en un lugar determinado; las variables cuantitativas continuas son aquellas que miden valores continuos o no finitos, como por ejemplo el peso de un objeto o el volumen de este.

  • -Variables cualitativas_: Son aquellas que expresan características o cualidades, y no pueden ser medidas con números, se dividen en binarias, nominales y ordinales, en el caso de las binarias sólo pueden expresar si o no, por ejemplo el resultado de un partido de fútbol o el resultado de una lotería, mientras que una nominal es una característica propia, por ejemplo la nacionalidad de una persona o el color de sus ojos, y por último una variable ordinal son aquellas que pertenecen a un grupo con una jerarquía, por ejemplo la posición que ocupa un pescador en un torneo o tu puntaje crediticio.

  • Distribución de frecuencia: Una distribución de frecuencia es una representación, ya sea en formato gráfico o tabular, que muestra el número de observaciones dentro de un intervalo dado. El tamaño del intervalo depende de los datos que se analizan y de los objetivos del analista. Los intervalos deben ser mutuamente excluyentes y exhaustivos.

  • Distribución normal: Es una distribución de probabilidad que es simétrica con respecto a la media, lo que muestra que los datos cercanos a la media son más frecuentes que los datos alejados de la media.

Importar datos

library(readr)
library(fdth)
## 
## Attaching package: 'fdth'
## The following objects are masked from 'package:stats':
## 
##     sd, var
library(modeest)
## 
## Attaching package: 'modeest'
## The following object is masked from 'package:fdth':
## 
##     mfv
library(readxl)
pozos <- read_excel("pozos.xlsx")


ph <- t(pozos$PH)
ph <- ph[1:293]
temp <- t(pozos$TEMP)
temp <- temp[1:293]

Acidez-pH

Conjunto de datos \(pH\) ordenado de menor a mayor.

sort(ph, decreasing = FALSE)
##   [1] 6.1 6.3 6.4 6.4 6.4 6.4 6.4 6.4 6.4 6.5 6.5 6.5 6.5 6.5 6.5 6.5 6.5 6.5
##  [19] 6.5 6.5 6.5 6.5 6.5 6.5 6.5 6.5 6.6 6.6 6.6 6.6 6.6 6.6 6.6 6.6 6.6 6.6
##  [37] 6.6 6.6 6.6 6.6 6.6 6.6 6.6 6.6 6.6 6.6 6.6 6.6 6.6 6.7 6.7 6.7 6.7 6.7
##  [55] 6.7 6.7 6.7 6.7 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8
##  [73] 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8
##  [91] 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8
## [109] 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9
## [127] 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9
## [145] 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 7.0 7.0
## [163] 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0
## [181] 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0
## [199] 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0
## [217] 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0
## [235] 7.0 7.0 7.0 7.0 7.1 7.1 7.1 7.1 7.1 7.1 7.1 7.1 7.1 7.1 7.1 7.1 7.1 7.1
## [253] 7.1 7.1 7.1 7.1 7.1 7.1 7.1 7.1 7.1 7.1 7.1 7.1 7.1 7.1 7.1 7.1 7.2 7.2
## [271] 7.2 7.2 7.2 7.2 7.2 7.2 7.2 7.2 7.2 7.2 7.3 7.3 7.3 7.3 7.3 7.3 7.4 7.4
## [289] 7.4 7.4 7.4 7.4 7.5

Máximo del conjunto de datos \(pH\).

max(ph)
## [1] 7.5
  • El máximo del conjunto de datos es 7.5.

Mínimo del conjunto de datos \(pH\).

min(ph)
## [1] 6.1
  • El mínimo del conjunto de datos es 6.1.

Rango del conjunto de datos \(pH\).

range(ph)
## [1] 6.1 7.5
  • El conjunto de datos abarca del 6.1 al 7.5.

Número de intervalos de la clase según Surges

nclass.Sturges(ph)
## [1] 10
  • El número de intervalos de la clase es 10.

Tabla de frecuencias del conjunto de datos \(pH\).

distph <- fdt(ph,breaks="Sturges")
distph
##   Class limits   f   rf rf(%)  cf  cf(%)
##  [6.039,6.193)   1 0.00  0.34   1   0.34
##  [6.193,6.346)   1 0.00  0.34   2   0.68
##    [6.346,6.5)   7 0.02  2.39   9   3.07
##    [6.5,6.653)  40 0.14 13.65  49  16.72
##  [6.653,6.807)  67 0.23 22.87 116  39.59
##  [6.807,6.961)  44 0.15 15.02 160  54.61
##  [6.961,7.114) 108 0.37 36.86 268  91.47
##  [7.114,7.268)  12 0.04  4.10 280  95.56
##  [7.268,7.421)  12 0.04  4.10 292  99.66
##  [7.421,7.575)   1 0.00  0.34 293 100.00

La tabla se interpreta tal como:

  • \(f\) = frecuencia absoluta

  • \(rf\) = frecuencia relativa

  • \(rf\)(%) = frecuencia relativa porcentual

  • \(cf\) = frecuencia acumulada

  • \(cf\)(%) =frecuencia acumulada porcentual

  • Se observa que durante el primer intervalo \((6.039, 6.193)\) se concentran 1 de los valores que conforman la tabla, siendo estos 293 en total, esto nos da una frecuencia relativa del \(0.34\)%.

  • El intervalo \((6.653, 6.807)\) existen 67 datos, por esto la frecuencia acumulada aumenta un \(22.87\)% respecto al último intervalo, en \((7.114, 7.268)\) existan 12 valores que entran dentro de este intervalo, aumentado la frecuencia acumulada en un \(4.1\)%, el último valor se posiciona en el último intervalo \((7.421, 7.575)\) llevando la frecuencia acumulada a un \(100\)%.

Histogramas de pH

  • Frecuencia absoluta
plot(distph, type = "fh")

  • Polígonos de frecuencia absoluta
plot(distph, type = "fp")

  • Frecuencia relativa
plot(distph, type = "rfh")

  • Polígonos de frecuencia relativa
plot(distph, type = "rfp")

  • Frecuencia acumulada
plot(distph, type = "cfh")

  • Polígonos de frecuencia acumulada
plot(distph, type = "cfp")

Medidas de tendencia central del conjunto de datos pH

Media

mean(ph)
## [1] 6.890444
  • La media del conjunto de datos es \(6.890444\) ya que al cuantificar y promediar estos este es el valor promedio.

Mediana

median(ph)
## [1] 6.9
  • Entre los 293 datos del conjunto en el medio de este se encuentra el número \(6.9\).

Moda

mlv(ph, method = "mfv")
## [1] 7
  • Con un total de 78 veces, \(7\) es el valor que más se repite en todo el conjunto.

Medidas de Dispersión de Datos de pH

Varianza

 var(ph)
## [1] 0.04908645

Desviación Estándar

sd(ph)
## [1] 0.2215546

¿Pueden estas medidas ser negativas?

  • “El término varianza se refiere a la dispersión de los valores en un conjunto de datos determinado, la varianza no puede ser negativa. El valor más bajo que puede tomar es cero.”

  • “La desviación estándar no puede ser negativa. Surge de un promedio de cuadrados, por lo que nunca puede ser negativa. El valor más bajo posible es 0, cuando todos los valores sean iguales.”

Gráfico de caja y bigotes

boxplot(ph)

  • Se observa que el grueso de los datos se ubican en la parte central de la caja.

Temperatura

Conjunto de datos \(temperatura\) ordenado de menor a mayor.

sort(temp, decreasing = FALSE)
##   [1] 25.6 25.8 26.2 26.3 26.3 26.4 26.4 26.8 26.8 26.9 27.0 27.0 27.1 27.2 27.2
##  [16] 27.3 27.3 27.3 27.3 27.4 27.4 27.4 27.4 27.4 27.5 27.5 27.5 27.5 27.5 27.5
##  [31] 27.5 27.5 27.5 27.5 27.5 27.5 27.6 27.7 27.7 27.7 27.7 27.8 27.8 27.8 27.8
##  [46] 27.8 27.8 27.8 27.8 27.8 27.8 27.8 27.9 27.9 27.9 27.9 27.9 27.9 27.9 27.9
##  [61] 27.9 27.9 27.9 27.9 27.9 27.9 28.0 28.0 28.0 28.0 28.0 28.0 28.0 28.0 28.0
##  [76] 28.0 28.0 28.0 28.0 28.0 28.0 28.0 28.0 28.0 28.1 28.1 28.1 28.2 28.2 28.2
##  [91] 28.2 28.2 28.2 28.2 28.2 28.2 28.2 28.2 28.2 28.3 28.3 28.3 28.3 28.3 28.3
## [106] 28.3 28.4 28.4 28.4 28.4 28.4 28.4 28.4 28.5 28.5 28.5 28.5 28.5 28.5 28.5
## [121] 28.5 28.5 28.6 28.6 28.6 28.6 28.6 28.6 28.6 28.6 28.6 28.6 28.6 28.6 28.6
## [136] 28.6 28.6 28.6 28.6 28.6 28.6 28.7 28.7 28.7 28.7 28.7 28.7 28.7 28.7 28.7
## [151] 28.7 28.7 28.7 28.7 28.8 28.8 28.8 28.8 28.8 28.8 28.8 28.8 28.8 28.8 28.8
## [166] 28.8 28.9 28.9 28.9 28.9 28.9 28.9 28.9 28.9 28.9 28.9 28.9 28.9 28.9 28.9
## [181] 28.9 28.9 28.9 28.9 29.0 29.0 29.0 29.0 29.0 29.0 29.0 29.0 29.0 29.0 29.0
## [196] 29.0 29.0 29.0 29.1 29.1 29.1 29.1 29.1 29.1 29.1 29.1 29.1 29.1 29.1 29.2
## [211] 29.2 29.2 29.2 29.2 29.2 29.2 29.2 29.2 29.2 29.2 29.2 29.2 29.2 29.3 29.3
## [226] 29.3 29.3 29.4 29.4 29.4 29.4 29.4 29.4 29.4 29.4 29.4 29.4 29.4 29.5 29.5
## [241] 29.5 29.5 29.5 29.5 29.5 29.5 29.5 29.6 29.6 29.6 29.7 29.7 29.8 29.8 29.8
## [256] 29.8 29.8 29.8 29.9 29.9 29.9 29.9 30.0 30.0 30.0 30.0 30.0 30.0 30.1 30.1
## [271] 30.1 30.1 30.2 30.2 30.2 30.3 30.3 30.3 30.3 30.4 30.5 30.6 30.8 30.9 31.1
## [286] 31.1 31.1 31.2 31.4 31.5 31.7 31.9 32.1

Máximo del conjunto de datos \(temperatura\).

max(temp)
## [1] 32.1
  • El máximo del conjunto de datos es 32.1.

Mínimo del conjunto de datos \(temperatura\).

min(temp)
## [1] 25.6
  • El mínimo del conjunto de datos es 25.6.

Rango del conjunto de datos \(temperatura\).

range(temp)
## [1] 25.6 32.1
  • El conjunto de datos abarca del 25.6 al 32.1.

Número de intervalos de la clase según Surges

nclass.Sturges(temp)
## [1] 10
  • El número de intervalos de la clase es 10.

Tabla de frecuencias del conjunto de datos \(temperatura\).

disttemp <- fdt(temp,breaks="Sturges")
disttemp
##     Class limits  f   rf rf(%)  cf  cf(%)
##  [25.344,26.052)  2 0.01  0.68   2   0.68
##  [26.052,26.759)  5 0.02  1.71   7   2.39
##  [26.759,27.467) 17 0.06  5.80  24   8.19
##  [27.467,28.175) 63 0.22 21.50  87  29.69
##  [28.175,28.883) 79 0.27 26.96 166  56.66
##   [28.883,29.59) 81 0.28 27.65 247  84.30
##   [29.59,30.298) 28 0.10  9.56 275  93.86
##  [30.298,31.006)  9 0.03  3.07 284  96.93
##  [31.006,31.713)  7 0.02  2.39 291  99.32
##  [31.713,32.421)  2 0.01  0.68 293 100.00

La tabla se interpreta tal como:

  • \(f\) = frecuencia absoluta

  • \(rf\) = frecuencia relativa

  • \(rf\)(%) = frecuencia relativa porcentual

  • \(cf\) = frecuencia acumulada

  • \(cf\)(%) =frecuencia acumulada porcentual

  • Se observa que durante el primer intervalo \((25.344, 26.052)\) se concentran 2 de los valores que conforman la tabla, esto nos da una frecuencia relativa del \(0.68\)%.

  • En los intervalos 2 a 7 existen 273 valores, formando el \(93.18\)% de los valores.

  • El intervalo \((30.298, 31.006)\) contiene 9 valores formando estos el \(3.07\)% del volumen de datos, el siguiente intervalo abarca 7 de los valores del conjunto llevando la frecuencia acumulada de un \(99.32\)% a un \(83.28\)% y por último el intervalo final conforma un \(0.68\)% de los datos del conjunto llevando la frecuencia acumulada a un \(100\)%.

Histogramas de temperatura

  • Frecuencia absoluta
plot(disttemp, type = "fh")

  • Polígonos de frecuencia absoluta
plot(disttemp, type = "fp")

  • Frecuencia relativa
plot(disttemp, type = "rfh")

  • Polígonos de frecuencia relativa
plot(disttemp, type = "rfp")

  • Frecuencia acumulada
plot(disttemp, type = "cfh")

  • Polígonos de frecuencia acumulada
plot(disttemp, type = "cfp")

Medidas de tendencia central del conjunto de datos temperatura

Media

mean(temp)
## [1] 28.69795
  • Al promediar los datos obtenemos de media \(28.69795\).

Mediana

median(temp)
## [1] 28.7
  • Dentro del conjunto de datos, el valor \(28.7\) ocupa la posición central.

Moda

mlv(temp, method = "mfv")
## [1] 28.6
  • Dentro del conjunto de datos, el valor \(28.6\) es el que se repite más veces.

Medidas de Dispersión de Datos de pH

Varianza

 var(temp)
## [1] 1.035407

Desviación Estándar

sd(temp)
## [1] 1.017549

Gráfico de caja y bigotes

boxplot(temp)

Gráfica de dispersión de pH versus temperatura

plot(x = temp, y = ph, main = "ph vs. temperatura", xlab = "Temperatura", ylab = "pH")

  • ¿Considera que estas 2 variables están relacionadas?

La mayoría de datos se concentran en el centro, también podemos observar que cuando aumenta la temperatura la acidez tiende a disminuir, así que considero que las variables se relacionan de la siguiente manera, la temperatura disminuye y el pH aumenta, si la temperatura aumenta el pH disminuye.

LS0tDQp0aXRsZTogIkUxVTIiDQphdXRob3I6ICJWw61jdG9yIE1hbnVlbCBDb3RhIEdhcmPDrWEiDQpkYXRlOiAiMjYvMTEvMjAyMSINCm91dHB1dDogDQogIHJtZGZvcm1hdHM6OmRvd25jdXRlOg0KICAgIGhpZ2hsaWdodDogdGFuZ28NCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFDQotLS0NCk5vbWJyZTogIFbDrWN0b3IgTWFudWVsIENvdGEgR2FyY8OtYSAgIE1hdHLDrWN1bGE6MDAwMDAyMzA0OTEgIDI2LzExLzIwMjENCg0KXzEuLSDCv1F1w6kgZXMgbGEgZXN0YWTDrXN0aWNhIHkgcXVlIGFwbGljYWNpb25lcyB0aWVuZSBlbiBpbmdlbmllcsOtYSAoc2Vnw7puIHN1IGluZ2VuaWVyw61hKT9fDQoNCiogTGEgZXN0YWTDrXN0aWNhIGVzIGxhIGNpZW5jaWEgZGUgcmVjb3BpbGFyLCBhbmFsaXphciwgcHJlc2VudGFyIGUgaW50ZXJwcmV0YXIgZGF0b3MsIG5vcyBwZXJtaXRlIGNyZWFyIHByZWRpY2Npb25lcyBjb24gYmFzZSBhIGxvcyBkYXRvcyBxdWUgcG9zZWVtb3MgeSBlcyB1bmEgaGVycmFtaWVudGEgZGUgc3VtYSBpbXBvcnRhbmNpYSBwYXJhIGVsIGRlc2Fycm9sbG8gaHVtYW5vLCBhc8OtIG1pc21vIHBvc2VlIGluZmluaWRhZCBkZSBhcGxpY2FjaW9uZXMgZW4gZnVuY2nDs24gZGVsIGNhbXBvIGVuIGVsIHF1ZSBzZSB1dGlsaWNlOg0KDQoqIF9JbmdlbmllcsOtYSBhbWJpZW50YWxfDQoNCkVzdHVkaW9zIGRlIHN1ZWxvLg0KDQpDYWxpZGFkIGRlbCBhaXJlIHkgYWd1YS4NCg0KRXN0dWRpb3MgZGVtb2dyw6FmaWNvcy4gDQoNClByZWRpY2Npb25lcyBjbGltYXRvbMOzZ2ljYXMuIA0KDQoqIF9JbmdlbmllcsOtYSBhdXRvbW90cml6Xw0KDQpNZWpvcmEgZGUgbW9kZWxvcy4NCg0KTWVqb3JhcyBlbiBsYSBsw61uZWEgZGUgcHJvZHVjY2nDs24uDQoNCk1hcmtldGluZy4gDQoNCiogX0luZ2VuaWVyw61hIGVuIFNvZnR3YXJlXw0KDQpDcmVhY2nDs24gZGUgYWxnb3JpdG1vcyBkZSBzb2Z0d2FyZS4NCg0KQ3JlYWNpw7NuIGRlIGJhc2VzIGRlIGRhdG9zLg0KLi4uDQoNCl8yLi0gRW5saXN0ZSB5IGRlZmluYSBsb3MgdGlwb3MgZGUgdmFyaWFibGVzIHVzYWRvcyBlbiBlc3RhZMOtc3RpY2EsIGRlIDIgZWplbXBsb3MgZGUgY2FkYSB1bm8uIERlZmluYSBkaXN0cmlidWNpw7NuIGRlIGZyZWN1ZW5jaWEgeSBleHBsaXF1ZSBxdWUgZXMgbGEgZGlzdHJpYnVjacOzbiBub3JtYWwuXw0KDQoqIF9WYXJpYWJsZSBjdWFudGl0YXRpdmFfOiBSZXByZXNlbnRhbiBjYW50aWRhZGVzLCBoYXkgZG9zIHRpcG9zIGRlIHZhcmlhYmxlcyBjdWFudGl0YXRpdmFzLCBkaXNjcmV0YXMgeSBjb250aW51YXMsIGxhcyBkaXNjcmV0YXMgc29uIGFxdWVsbGFzIHF1ZSBjdWVudGFuIGVsZW1lbnRvcyBvIHZhbG9yZXMgaW5kaXZpZHVhbGVzLCBjb21vIHBvciBlamVtcGxvIGVsIG7Dum1lcm8gZGUgYXJjaGl2b3MgZW4gdW5hIGNvbXB1dGFkb3JhIHNlZ8O6biBzdSB0aXBvIG8gbGFzIGVzcGVjaWVzIGRlIGFiZWphcyBxdWUgaGFiaXRhbiBlbiB1biBsdWdhciBkZXRlcm1pbmFkbzsgbGFzIHZhcmlhYmxlcyBjdWFudGl0YXRpdmFzIGNvbnRpbnVhcyBzb24gYXF1ZWxsYXMgcXVlIG1pZGVuIHZhbG9yZXMgY29udGludW9zIG8gbm8gZmluaXRvcywgY29tbyBwb3IgZWplbXBsbyBlbCBwZXNvIGRlIHVuIG9iamV0byBvIGVsIHZvbHVtZW4gZGUgZXN0ZS4NCg0KKiAtVmFyaWFibGVzIGN1YWxpdGF0aXZhc186IFNvbiBhcXVlbGxhcyBxdWUgZXhwcmVzYW4gY2FyYWN0ZXLDrXN0aWNhcyBvIGN1YWxpZGFkZXMsIHkgbm8gcHVlZGVuIHNlciBtZWRpZGFzIGNvbiBuw7ptZXJvcywgc2UgZGl2aWRlbiBlbiBiaW5hcmlhcywgbm9taW5hbGVzIHkgb3JkaW5hbGVzLCBlbiBlbCBjYXNvIGRlIGxhcyBiaW5hcmlhcyBzw7NsbyBwdWVkZW4gZXhwcmVzYXIgc2kgbyBubywgcG9yIGVqZW1wbG8gZWwgcmVzdWx0YWRvIGRlIHVuIHBhcnRpZG8gZGUgZsO6dGJvbCBvIGVsIHJlc3VsdGFkbyBkZSB1bmEgbG90ZXLDrWEsIG1pZW50cmFzIHF1ZSB1bmEgbm9taW5hbCBlcyB1bmEgY2FyYWN0ZXLDrXN0aWNhIHByb3BpYSwgcG9yIGVqZW1wbG8gbGEgbmFjaW9uYWxpZGFkIGRlIHVuYSBwZXJzb25hIG8gZWwgY29sb3IgZGUgc3VzIG9qb3MsIHkgcG9yIMO6bHRpbW8gdW5hIHZhcmlhYmxlIG9yZGluYWwgc29uIGFxdWVsbGFzIHF1ZSBwZXJ0ZW5lY2VuIGEgdW4gZ3J1cG8gY29uIHVuYSBqZXJhcnF1w61hLCBwb3IgZWplbXBsbyBsYSBwb3NpY2nDs24gcXVlIG9jdXBhIHVuIHBlc2NhZG9yIGVuIHVuIHRvcm5lbyBvIHR1IHB1bnRhamUgY3JlZGl0aWNpby4NCg0KKiBfRGlzdHJpYnVjacOzbiBkZSBmcmVjdWVuY2lhXzogVW5hIGRpc3RyaWJ1Y2nDs24gZGUgZnJlY3VlbmNpYSBlcyB1bmEgcmVwcmVzZW50YWNpw7NuLCB5YSBzZWEgZW4gZm9ybWF0byBncsOhZmljbyBvIHRhYnVsYXIsIHF1ZSBtdWVzdHJhIGVsIG7Dum1lcm8gZGUgb2JzZXJ2YWNpb25lcyBkZW50cm8gZGUgdW4gaW50ZXJ2YWxvIGRhZG8uIEVsIHRhbWHDsW8gZGVsIGludGVydmFsbyBkZXBlbmRlIGRlIGxvcyBkYXRvcyBxdWUgc2UgYW5hbGl6YW4geSBkZSBsb3Mgb2JqZXRpdm9zIGRlbCBhbmFsaXN0YS4gTG9zIGludGVydmFsb3MgZGViZW4gc2VyIG11dHVhbWVudGUgZXhjbHV5ZW50ZXMgeSBleGhhdXN0aXZvcy4NCg0KKiBfRGlzdHJpYnVjacOzbiBub3JtYWxfOiBFcyB1bmEgZGlzdHJpYnVjacOzbiBkZSBwcm9iYWJpbGlkYWQgcXVlIGVzIHNpbcOpdHJpY2EgY29uIHJlc3BlY3RvIGEgbGEgbWVkaWEsIGxvIHF1ZSBtdWVzdHJhIHF1ZSBsb3MgZGF0b3MgY2VyY2Fub3MgYSBsYSBtZWRpYSBzb24gbcOhcyBmcmVjdWVudGVzIHF1ZSBsb3MgZGF0b3MgYWxlamFkb3MgZGUgbGEgbWVkaWEuDQoNCg0KDQoNCiMjIEltcG9ydGFyIGRhdG9zDQpgYGB7cn0NCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KGZkdGgpDQpsaWJyYXJ5KG1vZGVlc3QpDQpsaWJyYXJ5KHJlYWR4bCkNCnBvem9zIDwtIHJlYWRfZXhjZWwoInBvem9zLnhsc3giKQ0KDQoNCnBoIDwtIHQocG96b3MkUEgpDQpwaCA8LSBwaFsxOjI5M10NCnRlbXAgPC0gdChwb3pvcyRURU1QKQ0KdGVtcCA8LSB0ZW1wWzE6MjkzXQ0KDQoNCmBgYA0KDQojIEFjaWRlei1wSA0KDQpfQ29uanVudG8gZGUgZGF0b3MgJHBIJCBvcmRlbmFkbyBkZSBtZW5vciBhIG1heW9yLl8NCg0KYGBge3J9DQpzb3J0KHBoLCBkZWNyZWFzaW5nID0gRkFMU0UpDQpgYGANCg0KX03DoXhpbW8gZGVsIGNvbmp1bnRvIGRlIGRhdG9zICRwSCQuXw0KDQpgYGB7cn0NCm1heChwaCkNCmBgYA0KDQoqIEVsIG3DoXhpbW8gZGVsIGNvbmp1bnRvIGRlIGRhdG9zIGVzIDcuNS4NCg0KX03DrW5pbW8gZGVsIGNvbmp1bnRvIGRlIGRhdG9zICRwSCQuXw0KDQpgYGB7cn0NCm1pbihwaCkNCmBgYA0KICogRWwgbcOtbmltbyBkZWwgY29uanVudG8gZGUgZGF0b3MgZXMgNi4xLg0KIA0KX1JhbmdvIGRlbCBjb25qdW50byBkZSBkYXRvcyAkcEgkLl8NCg0KYGBge3J9DQpyYW5nZShwaCkNCmBgYA0KKiBFbCBjb25qdW50byBkZSBkYXRvcyBhYmFyY2EgZGVsIDYuMSBhbCA3LjUuDQoNCl9Ow7ptZXJvIGRlIGludGVydmFsb3MgZGUgbGEgY2xhc2Ugc2Vnw7puIFN1cmdlc18NCg0KYGBge3J9DQpuY2xhc3MuU3R1cmdlcyhwaCkNCmBgYA0KKiBFbCBuw7ptZXJvIGRlIGludGVydmFsb3MgZGUgbGEgY2xhc2UgZXMgMTAuDQoNCl9UYWJsYSBkZSBmcmVjdWVuY2lhcyBkZWwgY29uanVudG8gZGUgZGF0b3MgJHBIJC5fDQpgYGB7cn0NCmRpc3RwaCA8LSBmZHQocGgsYnJlYWtzPSJTdHVyZ2VzIikNCmRpc3RwaA0KYGBgDQoNCl9MYSB0YWJsYSBzZSBpbnRlcnByZXRhIHRhbCBjb21vOl8NCg0KKiBfJGYkID0gZnJlY3VlbmNpYSBhYnNvbHV0YV8NCg0KKiBfJHJmJCA9IGZyZWN1ZW5jaWEgcmVsYXRpdmFfDQoNCiogXyRyZiQoJSkgPSBmcmVjdWVuY2lhIHJlbGF0aXZhIHBvcmNlbnR1YWxfDQoNCiogXyRjZiQgPSBmcmVjdWVuY2lhIGFjdW11bGFkYV8NCg0KKiBfJGNmJCglKSA9ZnJlY3VlbmNpYSBhY3VtdWxhZGEgcG9yY2VudHVhbF8NCg0KKiBfU2Ugb2JzZXJ2YSBxdWUgZHVyYW50ZSBlbCBwcmltZXIgaW50ZXJ2YWxvICQoNi4wMzksIDYuMTkzKSQgc2UgY29uY2VudHJhbiAxIGRlIGxvcyB2YWxvcmVzIHF1ZSBjb25mb3JtYW4gbGEgdGFibGEsIHNpZW5kbyBlc3RvcyAyOTMgZW4gdG90YWwsIGVzdG8gbm9zIGRhIHVuYSBmcmVjdWVuY2lhIHJlbGF0aXZhIGRlbCAkMC4zNCQlLl8NCg0KKiBfRWwgaW50ZXJ2YWxvICQoNi42NTMsIDYuODA3KSQgZXhpc3RlbiAgNjcgZGF0b3MsIHBvciBlc3RvIGxhIGZyZWN1ZW5jaWEgYWN1bXVsYWRhIGF1bWVudGEgdW4gJDIyLjg3JCUgcmVzcGVjdG8gYWwgw7psdGltbyBpbnRlcnZhbG8sIGVuICQoNy4xMTQsIDcuMjY4KSQgZXhpc3RhbiAxMiB2YWxvcmVzIHF1ZSBlbnRyYW4gZGVudHJvIGRlIGVzdGUgaW50ZXJ2YWxvLCBhdW1lbnRhZG8gbGEgZnJlY3VlbmNpYSBhY3VtdWxhZGEgZW4gdW4gJDQuMSQlLCBlbCDDumx0aW1vIHZhbG9yIHNlIHBvc2ljaW9uYSBlbiBlbCDDumx0aW1vIGludGVydmFsbyAkKDcuNDIxLCA3LjU3NSkkIGxsZXZhbmRvIGxhIGZyZWN1ZW5jaWEgYWN1bXVsYWRhIGEgdW4gJDEwMCQlLl8NCg0KDQoNCiMjIF9IaXN0b2dyYW1hcyBkZSBwSF8NCg0KDQoqIF9GcmVjdWVuY2lhIGFic29sdXRhXw0KYGBge3J9DQpwbG90KGRpc3RwaCwgdHlwZSA9ICJmaCIpDQpgYGANCg0KKiBfUG9sw61nb25vcyBkZSBmcmVjdWVuY2lhIGFic29sdXRhXw0KYGBge3J9DQpwbG90KGRpc3RwaCwgdHlwZSA9ICJmcCIpDQpgYGANCg0KDQoqIF9GcmVjdWVuY2lhIHJlbGF0aXZhXw0KYGBge3J9DQpwbG90KGRpc3RwaCwgdHlwZSA9ICJyZmgiKQ0KYGBgDQoNCiogX1BvbMOtZ29ub3MgZGUgZnJlY3VlbmNpYSByZWxhdGl2YV8NCmBgYHtyfQ0KcGxvdChkaXN0cGgsIHR5cGUgPSAicmZwIikNCg0KYGBgDQoNCg0KKiBfRnJlY3VlbmNpYSBhY3VtdWxhZGFfDQpgYGB7cn0NCnBsb3QoZGlzdHBoLCB0eXBlID0gImNmaCIpDQoNCmBgYA0KDQoNCiogX1BvbMOtZ29ub3MgZGUgZnJlY3VlbmNpYSBhY3VtdWxhZGFfDQoNCmBgYHtyfQ0KcGxvdChkaXN0cGgsIHR5cGUgPSAiY2ZwIikNCmBgYA0KDQoNCiMjIF9NZWRpZGFzIGRlIHRlbmRlbmNpYSBjZW50cmFsIGRlbCBjb25qdW50byBkZSBkYXRvcyBwSF8NCg0KX01lZGlhXw0KYGBge3J9DQptZWFuKHBoKQ0KYGBgDQoNCiogTGEgbWVkaWEgZGVsIGNvbmp1bnRvIGRlIGRhdG9zIGVzICQ2Ljg5MDQ0NCQgeWEgcXVlIGFsIGN1YW50aWZpY2FyIHkgcHJvbWVkaWFyIGVzdG9zIGVzdGUgZXMgZWwgdmFsb3IgcHJvbWVkaW8uDQoNCl9NZWRpYW5hXw0KYGBge3J9DQptZWRpYW4ocGgpDQpgYGANCiogRW50cmUgbG9zIDI5MyBkYXRvcyBkZWwgY29uanVudG8gZW4gZWwgbWVkaW8gZGUgZXN0ZSBzZSBlbmN1ZW50cmEgZWwgbsO6bWVybyAkNi45JC4gDQoNCl9Nb2RhXw0KDQpgYGB7cn0NCm1sdihwaCwgbWV0aG9kID0gIm1mdiIpDQpgYGANCiogQ29uIHVuIHRvdGFsIGRlIDc4IHZlY2VzLCAkNyQgZXMgZWwgdmFsb3IgcXVlIG3DoXMgc2UgcmVwaXRlIGVuIHRvZG8gZWwgY29uanVudG8uDQoNCiMjIF9NZWRpZGFzIGRlIERpc3BlcnNpw7NuIGRlIERhdG9zIGRlIHBIXw0KDQpfVmFyaWFuemFfDQoNCmBgYHtyfQ0KIHZhcihwaCkNCmBgYA0KDQpfRGVzdmlhY2nDs24gRXN0w6FuZGFyXw0KDQpgYGB7cn0NCnNkKHBoKQ0KYGBgDQoNCl/Cv1B1ZWRlbiBlc3RhcyBtZWRpZGFzIHNlciBuZWdhdGl2YXM/Xw0KDQoqIF8iRWwgdMOpcm1pbm8gdmFyaWFuemEgc2UgcmVmaWVyZSBhIGxhIGRpc3BlcnNpw7NuIGRlIGxvcyB2YWxvcmVzIGVuIHVuIGNvbmp1bnRvIGRlIGRhdG9zIGRldGVybWluYWRvLCBsYSB2YXJpYW56YSBubyBwdWVkZSBzZXIgbmVnYXRpdmEuIEVsIHZhbG9yIG3DoXMgYmFqbyBxdWUgcHVlZGUgdG9tYXIgZXMgY2Vyby4iXw0KDQoqIF8iTGEgZGVzdmlhY2nDs24gZXN0w6FuZGFyIG5vIHB1ZWRlIHNlciBuZWdhdGl2YS4gU3VyZ2UgZGUgdW4gcHJvbWVkaW8gZGUgY3VhZHJhZG9zLCBwb3IgbG8gcXVlIG51bmNhIHB1ZWRlIHNlciBuZWdhdGl2YS4gRWwgdmFsb3IgbcOhcyBiYWpvIHBvc2libGUgZXMgMCwgY3VhbmRvIHRvZG9zIGxvcyB2YWxvcmVzIHNlYW4gaWd1YWxlcy4iXw0KDQoNCl9HcsOhZmljbyBkZSBjYWphIHkgYmlnb3Rlc18NCg0KYGBge3J9DQpib3hwbG90KHBoKQ0KYGBgDQoNCiogU2Ugb2JzZXJ2YSBxdWUgZWwgZ3J1ZXNvIGRlIGxvcyBkYXRvcyBzZSB1YmljYW4gZW4gbGEgcGFydGUgY2VudHJhbCBkZSBsYSBjYWphLg0KDQoNCg0KDQoNCg0KDQoNCg0KDQojIFRlbXBlcmF0dXJhDQoNCl9Db25qdW50byBkZSBkYXRvcyAkdGVtcGVyYXR1cmEkIG9yZGVuYWRvIGRlIG1lbm9yIGEgbWF5b3IuXw0KDQpgYGB7cn0NCnNvcnQodGVtcCwgZGVjcmVhc2luZyA9IEZBTFNFKQ0KYGBgDQoNCl9Nw6F4aW1vIGRlbCBjb25qdW50byBkZSBkYXRvcyAkdGVtcGVyYXR1cmEkLl8NCg0KYGBge3J9DQptYXgodGVtcCkNCmBgYA0KKiBFbCBtw6F4aW1vIGRlbCBjb25qdW50byBkZSBkYXRvcyBlcyAzMi4xLg0KDQpfTcOtbmltbyBkZWwgY29uanVudG8gZGUgZGF0b3MgJHRlbXBlcmF0dXJhJC5fDQoNCmBgYHtyfQ0KbWluKHRlbXApDQpgYGANCg0KICogRWwgbcOtbmltbyBkZWwgY29uanVudG8gZGUgZGF0b3MgZXMgMjUuNi4NCg0KDQpfUmFuZ28gZGVsIGNvbmp1bnRvIGRlIGRhdG9zICR0ZW1wZXJhdHVyYSQuXw0KDQpgYGB7cn0NCnJhbmdlKHRlbXApDQpgYGANCiogRWwgY29uanVudG8gZGUgZGF0b3MgYWJhcmNhIGRlbCAyNS42IGFsIDMyLjEuDQoNCl9Ow7ptZXJvIGRlIGludGVydmFsb3MgZGUgbGEgY2xhc2Ugc2Vnw7puIFN1cmdlc18NCg0KYGBge3J9DQpuY2xhc3MuU3R1cmdlcyh0ZW1wKQ0KYGBgDQoqIEVsIG7Dum1lcm8gZGUgaW50ZXJ2YWxvcyBkZSBsYSBjbGFzZSBlcyAxMC4NCg0KX1RhYmxhIGRlIGZyZWN1ZW5jaWFzIGRlbCBjb25qdW50byBkZSBkYXRvcyAkdGVtcGVyYXR1cmEkLl8NCmBgYHtyfQ0KZGlzdHRlbXAgPC0gZmR0KHRlbXAsYnJlYWtzPSJTdHVyZ2VzIikNCmRpc3R0ZW1wDQpgYGANCg0KX0xhIHRhYmxhIHNlIGludGVycHJldGEgdGFsIGNvbW86Xw0KDQoqIF8kZiQgPSBmcmVjdWVuY2lhIGFic29sdXRhXw0KDQoqIF8kcmYkID0gZnJlY3VlbmNpYSByZWxhdGl2YV8NCg0KKiBfJHJmJCglKSA9IGZyZWN1ZW5jaWEgcmVsYXRpdmEgcG9yY2VudHVhbF8NCg0KKiBfJGNmJCA9IGZyZWN1ZW5jaWEgYWN1bXVsYWRhXw0KDQoqIF8kY2YkKCUpID1mcmVjdWVuY2lhIGFjdW11bGFkYSBwb3JjZW50dWFsXw0KDQoNCiogX1NlIG9ic2VydmEgcXVlIGR1cmFudGUgZWwgcHJpbWVyIGludGVydmFsbyAkKDI1LjM0NCwgMjYuMDUyKSQgc2UgY29uY2VudHJhbiAyIGRlIGxvcyB2YWxvcmVzIHF1ZSBjb25mb3JtYW4gbGEgdGFibGEsIGVzdG8gbm9zIGRhIHVuYSBmcmVjdWVuY2lhIHJlbGF0aXZhIGRlbCAkMC42OCQlLl8NCg0KKiBfRW4gbG9zIGludGVydmFsb3MgMiBhIDcgZXhpc3RlbiAyNzMgdmFsb3JlcywgZm9ybWFuZG8gZWwgJDkzLjE4JCUgZGUgbG9zIHZhbG9yZXMuXw0KDQoqIF9FbCBpbnRlcnZhbG8gJCgzMC4yOTgsIDMxLjAwNikkIGNvbnRpZW5lIDkgdmFsb3JlcyBmb3JtYW5kbyBlc3RvcyBlbCAkMy4wNyQlIGRlbCB2b2x1bWVuIGRlIGRhdG9zLCBlbCBzaWd1aWVudGUgaW50ZXJ2YWxvIGFiYXJjYSA3IGRlIGxvcyB2YWxvcmVzIGRlbCBjb25qdW50byBsbGV2YW5kbyBsYSBmcmVjdWVuY2lhIGFjdW11bGFkYSBkZSB1biAkOTkuMzIkJSBhIHVuICQ4My4yOCQlIHkgcG9yIMO6bHRpbW8gZWwgaW50ZXJ2YWxvIGZpbmFsIGNvbmZvcm1hIHVuICQwLjY4JCUgZGUgbG9zIGRhdG9zIGRlbCBjb25qdW50byBsbGV2YW5kbyBsYSBmcmVjdWVuY2lhIGFjdW11bGFkYSBhIHVuICQxMDAkJS5fDQoNCiMjIF9IaXN0b2dyYW1hcyBkZSB0ZW1wZXJhdHVyYV8NCg0KDQoqIF9GcmVjdWVuY2lhIGFic29sdXRhXw0KYGBge3J9DQpwbG90KGRpc3R0ZW1wLCB0eXBlID0gImZoIikNCmBgYA0KDQoqIF9Qb2zDrWdvbm9zIGRlIGZyZWN1ZW5jaWEgYWJzb2x1dGFfDQpgYGB7cn0NCnBsb3QoZGlzdHRlbXAsIHR5cGUgPSAiZnAiKQ0KYGBgDQoNCg0KKiBfRnJlY3VlbmNpYSByZWxhdGl2YV8NCmBgYHtyfQ0KcGxvdChkaXN0dGVtcCwgdHlwZSA9ICJyZmgiKQ0KYGBgDQoNCiogX1BvbMOtZ29ub3MgZGUgZnJlY3VlbmNpYSByZWxhdGl2YV8NCmBgYHtyfQ0KcGxvdChkaXN0dGVtcCwgdHlwZSA9ICJyZnAiKQ0KDQpgYGANCg0KDQoqIF9GcmVjdWVuY2lhIGFjdW11bGFkYV8NCmBgYHtyfQ0KcGxvdChkaXN0dGVtcCwgdHlwZSA9ICJjZmgiKQ0KDQpgYGANCg0KDQoqIF9Qb2zDrWdvbm9zIGRlIGZyZWN1ZW5jaWEgYWN1bXVsYWRhXw0KDQpgYGB7cn0NCnBsb3QoZGlzdHRlbXAsIHR5cGUgPSAiY2ZwIikNCmBgYA0KDQoNCg0KIyMgX01lZGlkYXMgZGUgdGVuZGVuY2lhIGNlbnRyYWwgZGVsIGNvbmp1bnRvIGRlIGRhdG9zIHRlbXBlcmF0dXJhXw0KDQpfTWVkaWFfDQpgYGB7cn0NCm1lYW4odGVtcCkNCmBgYA0KKiBBbCBwcm9tZWRpYXIgbG9zIGRhdG9zIG9idGVuZW1vcyBkZSBtZWRpYSAkMjguNjk3OTUkLg0KDQpfTWVkaWFuYV8NCmBgYHtyfQ0KbWVkaWFuKHRlbXApDQpgYGANCiogRGVudHJvIGRlbCBjb25qdW50byBkZSBkYXRvcywgZWwgdmFsb3IgJDI4LjckIG9jdXBhIGxhIHBvc2ljacOzbiBjZW50cmFsLg0KDQpfTW9kYV8NCg0KYGBge3J9DQptbHYodGVtcCwgbWV0aG9kID0gIm1mdiIpDQpgYGANCiogRGVudHJvIGRlbCBjb25qdW50byBkZSBkYXRvcywgZWwgdmFsb3IgJDI4LjYkIGVzIGVsIHF1ZSBzZSByZXBpdGUgbcOhcyB2ZWNlcy4gDQoNCiMjIF9NZWRpZGFzIGRlIERpc3BlcnNpw7NuIGRlIERhdG9zIGRlIHBIXw0KDQpfVmFyaWFuemFfDQoNCmBgYHtyfQ0KIHZhcih0ZW1wKQ0KYGBgDQoNCl9EZXN2aWFjacOzbiBFc3TDoW5kYXJfDQoNCmBgYHtyfQ0Kc2QodGVtcCkNCmBgYA0KX0dyw6FmaWNvIGRlIGNhamEgeSBiaWdvdGVzXw0KDQpgYGB7cn0NCmJveHBsb3QodGVtcCkNCmBgYA0KDQoNCg0KDQoNCiMjIF9HcsOhZmljYSBkZSBkaXNwZXJzacOzbiBkZSBwSCB2ZXJzdXMgdGVtcGVyYXR1cmFfDQoNCmBgYHtyfQ0KcGxvdCh4ID0gdGVtcCwgeSA9IHBoLCBtYWluID0gInBoIHZzLiB0ZW1wZXJhdHVyYSIsIHhsYWIgPSAiVGVtcGVyYXR1cmEiLCB5bGFiID0gInBIIikNCmBgYA0KDQoqIMK/Q29uc2lkZXJhIHF1ZSBlc3RhcyAyIHZhcmlhYmxlcyBlc3TDoW4gcmVsYWNpb25hZGFzPw0KDQpfTGEgbWF5b3LDrWEgZGUgZGF0b3Mgc2UgY29uY2VudHJhbiBlbiBlbCBjZW50cm8sIHRhbWJpw6luIHBvZGVtb3MgIG9ic2VydmFyIHF1ZSBjdWFuZG8gYXVtZW50YSBsYSB0ZW1wZXJhdHVyYSBsYSBhY2lkZXogdGllbmRlIGEgZGlzbWludWlyLCBhc8OtIHF1ZSBjb25zaWRlcm8gcXVlIGxhcyB2YXJpYWJsZXMgc2UgcmVsYWNpb25hbiBkZSBsYSBzaWd1aWVudGUgbWFuZXJhLCBsYSB0ZW1wZXJhdHVyYSBkaXNtaW51eWUgeSBlbCBwSCBhdW1lbnRhLCBzaSBsYSB0ZW1wZXJhdHVyYSBhdW1lbnRhIGVsIHBIIGRpc21pbnV5ZS5fDQoNCg0KDQoNCg0KDQoNCg==