Bosque de árboles aleatorios
La principal característica del algoritmo bosque
aleatorio es su flexibilidad, facilidad de uso y no se
necesitan grandes datos además se pueden utilizar tanto para la
regresión y clasificación.
Este algoritmo se trata en la creación y combinación de múltiples
árboles de decisión para generar una mayor precisión y que la predicción
sea más estable es decir trata de encontrar de una diversidad de datos
las mejores características de un subconjunto para un mejor modelo
(Faleiros, Henrique, & Maia Polo, 2018).
Estos son los pasos del modelo bosque aleatorio:
• Se define el número de árboles que contendrá el bosque.
• Aplicar un muestreo de sustitución del tamaño de su base de
entrenamiento (bootstrapping) para cada árbol.
• Elegir un número m menor o igual que el número de variables
independientes.
• Para cada árbol del algoritmo elegir m variables independientes en
forma aleatoria.
• Hacer crecer los árboles hasta una profundidad que ya no sea
posible que crezcan más.
• Tener en cuenta todas las predicciones de un individuo.
• En el caso de clasificación realizar una votación (por mayoría) y
una media en el caso de regresión para obtener la predicción final.
Regresión Lineal
Es más utilizado como un algoritmo de clasificación a pesar de tener
el nombre de algoritmo de regresión, y el más sencillo para empezar en
ML, su análisis permite hacer predicciones a través de datos históricos
continuos y su relación existente (Chollet, 2018).
En un algoritmo de regresión lineal cada dato de
entrada tiene su propio peso, donde los datos de entrada o variables
independientes se asignan en una matriz X y los pesos de regresión o
variables dependientes en una vector Y (Harrington, 2012).
La regresión utiliza ecuaciones lineales, ya sean simples donde solo
existe una variable independiente, y múltiples donde existe más de una
variable independiente, a continuación, la fórmula de una ecuación
lineal múltiple:
\[
y = b + m_1 x_1 + m_2 x_2 + ... + m_d x_d
\]
Donde: y = Variable dependiente. b = La constante o intersección. xi
= Las entradas o variables independientes. mi = Coeficiente, pendiente o
valor a determinar.
El objetivo de este algoritmo es minimizar la distancia entre los
datos y la línea para ello utiliza el criterio del error de los mínimos
cuadrados con los valores predichos y los reales, donde cuanto más cerca
pasen los puntos de la recta, es mejor.
Naive Bayes
Este clasificador es probabilístico y aplica el teorema de bayes,
digamos que las características de entrada \(x_1, x_2, ..., x_n\) por condición son
independientes entre sí, dado la etiqueta de clase Y, tal como:
\[
P\left(x_{1}, x_{2} \ldots x_{n} \mid Y\right)=\prod_{i=1}^{n}
P\left(x_{i} \mid Y\right)
\]
Para esta clasificación de dos clases donde \((i=0.1)\), se define como P (i | x) como la
probabilidad del vector de medidas \(x\) {\(x_1,x_2,..., x_n\)} pertenece a la clase
\(i\). Donde se define el puntaje de la
clasificación de la siguiente forma:
\[
\frac{P(1 \mid x)}{P(0 \mid x)}=\frac{\prod_{j=1}^{n} f\left(x_{j} \mid
1\right) P(1)}{\prod_{j=1}^{n} f\left(\boldsymbol{x}_{j} \mid
\mathbf{0}\right) P(\mathbf{0})}=\frac{P(1)}{P(0)}=\prod_{j=1}^{n}
\frac{f\left(\boldsymbol{x}_{j} \mid
\mathbf{1}\right)}{f\left(\boldsymbol{x}_{j} \mid \mathbf{0}\right.}
\] \[
\ln \frac{P(1 \mid x)}{P(0 \mid x)}=\ln \frac{P(1)}{P(0)}+\sum_{j=1}^{n}
\ln \frac{f\left(x_{j} \mid 1\right)}{f\left(x_{j} \mid 0\right.}
\]
Donde P\((i|x)\) es proporcional a
\(f (x|i) P(i)\) y \(f(x|i)\) es la estructura condicional de
\(x\) para objetos de la clase \(i\).
El modelo de Bayes es eficaz, e interesante ya que es simple y
robusto. Y no requiere la realización de esquemas complicados de
estimación iterativa de parámetros a grandes volúmenes de datos ya que
es muy fácil de construir y utilizar (Awad & Khanna, 2015, pág.
15).
Regresión Logística
Este algoritmo de regresión logística, es un modelo estadístico y
probabilístico que pronostica la probabilidad de que se manifieste un
suceso, ya que modela la relación entre la dependiente “X” y un
resultado característico “Y”.
Se expresa como:
\[
P(Y \mid X)=\frac{e^{\beta_{0}+\beta_{1} X}}{1+e^{\beta_{0}+\beta_{1}
X}}
\]
Esta función logística puede reformularse como la inversa que se le
llama logit o log-odds fundamental para generar sus coeficientes.
\[
\operatorname{logit}(P(Y \mid X))=\operatorname{In}\left[\frac{P(Y \mid
X)}{1-P(Y \mid X)}\right]=\beta_{0}+\beta_{1} X
\]
Esta función logística recibe un rango de valores de entrada (_0+_1X)
entre infinito positivo y negativo, y la salida P(Y|X) esta limitado a
los valores 0 y 1, como se muestra:
Red Neuronal Artificial
La red neuronal artificial es un modelo computacional que imita las
conexiones neuronales del cerebro, intentando realizar tareas de
clasificación de manera similar al ser humano. Las neuronas o unidades
están conectadas de manera direccional o bidireccional y cada conexión
tiene un peso para representar la fuerza de las conexiones neuronales,
contando con unidades de entrada y de salida (Biem, 2015).
Una red neuronal está compuesta por un modelo neuronal que indica
como una neurona devuelve una salida a partir de datos de entrada, la
arquitectura que describe las conexiones entre las neuronas, la política
de codificación, la política de codificación de datos de entrada y
etiquetas, y por último el algoritmo de entrenamiento (Biem, 2015).
La red neuronal está comúnmente descrita como un grafo, donde las
neuronas son los nodos y sus conexiones son las aristas que unen la
salida de una neurona con la entrada de otra, definiendo la entrada como
la suma ponderada de las salidas de las neuronas conectadas a ella. La
red neuronal puede estar distribuida en capas o subconjuntos, teniendo
como una capa de entrada V0 de n + 1 neuronas, donde n es la cantidad
del espacio de entrada, la salida de la neurona \(i\) en \(V_0\) es \(x_i\), la última neurona en este nivel es
una constante 1 (Shalev & Ben, 2014).
Denotamos \(V_t,i\), donde t es la
profundidad de la red o la cantidad de capas sin la considerar \(V_0\), calculando las salidas de las
neuronas de la capa t, se podrá calcular las salidas de las neuronas de
la capa t + 1 como sigue, cuando la red es alimentada con el vector de
entrada x. Las capas \(V_1\), . . .,
\(V_T - 1\) son las capas ocultas y la
última es la capa de salida. En la siguiente figura se muestra una red
neuronal de profundidad V = 2, tamaño 10 y anchura 5, con una neurona en
la capa oculta que no tiene aristas de entrada (Shalev & Ben,
2014).
LS0tDQp0aXRsZTogIlNpbnRheGlzIC0gQ29tYW5kb3MgTGF0ZXgiDQpzdWJ0aXRsZTogIkxhdGV4IC0gTWFya2Rvd24iDQphdXRob3I6ICJDZXNhciBDYW50b3JhbCBNb250ZWpvIg0KZGF0ZTogIjIwMjIvMDUvMDEiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogVFJVRQ0KLS0tDQoNCjwhLS1NaSBwcmltZXIgZG9jdW1lbnRvIGVuIE1hcmtkb3duLS0+DQoNCiMgQm9zcXVlIGRlIMOhcmJvbGVzIGFsZWF0b3Jpb3MNCg0KTGEgcHJpbmNpcGFsIGNhcmFjdGVyw61zdGljYSBkZWwgYWxnb3JpdG1vICoqYm9zcXVlIGFsZWF0b3JpbyoqIGVzIHN1IGZsZXhpYmlsaWRhZCwgZmFjaWxpZGFkIGRlIHVzbyB5IG5vIHNlIG5lY2VzaXRhbiBncmFuZGVzIGRhdG9zIGFkZW3DoXMgc2UgcHVlZGVuIHV0aWxpemFyIHRhbnRvIHBhcmEgbGEgcmVncmVzacOzbiB5IGNsYXNpZmljYWNpw7NuLg0KDQpFc3RlIGFsZ29yaXRtbyBzZSB0cmF0YSBlbiBsYSBjcmVhY2nDs24geSBjb21iaW5hY2nDs24gZGUgbcO6bHRpcGxlcyDDoXJib2xlcyBkZSBkZWNpc2nDs24gcGFyYSBnZW5lcmFyIHVuYSBtYXlvciBwcmVjaXNpw7NuIHkgcXVlIGxhIHByZWRpY2Npw7NuIHNlYSBtw6FzIGVzdGFibGUgZXMgZGVjaXIgdHJhdGEgZGUgZW5jb250cmFyIGRlIHVuYSBkaXZlcnNpZGFkIGRlIGRhdG9zIGxhcyBtZWpvcmVzIGNhcmFjdGVyw61zdGljYXMgZGUgdW4gc3ViY29uanVudG8gcGFyYSB1biBtZWpvciBtb2RlbG8gKEZhbGVpcm9zLCBIZW5yaXF1ZSwgJiBNYWlhIFBvbG8sIDIwMTgpLg0KDQpFc3RvcyBzb24gbG9zIHBhc29zIGRlbCBtb2RlbG8gYm9zcXVlIGFsZWF0b3JpbzoNCg0K4oCiIFNlIGRlZmluZSBlbCBuw7ptZXJvIGRlIMOhcmJvbGVzIHF1ZSBjb250ZW5kcsOhIGVsIGJvc3F1ZS4NCg0K4oCiIEFwbGljYXIgdW4gbXVlc3RyZW8gZGUgc3VzdGl0dWNpw7NuIGRlbCB0YW1hw7FvIGRlIHN1IGJhc2UgZGUgZW50cmVuYW1pZW50byAoYm9vdHN0cmFwcGluZykgcGFyYSBjYWRhIMOhcmJvbC4NCg0K4oCiIEVsZWdpciB1biBuw7ptZXJvIG0gbWVub3IgbyBpZ3VhbCBxdWUgZWwgbsO6bWVybyBkZSB2YXJpYWJsZXMgaW5kZXBlbmRpZW50ZXMuDQoNCuKAoiBQYXJhIGNhZGEgw6FyYm9sIGRlbCBhbGdvcml0bW8gZWxlZ2lyIG0gdmFyaWFibGVzIGluZGVwZW5kaWVudGVzIGVuIGZvcm1hIGFsZWF0b3JpYS4NCg0K4oCiIEhhY2VyIGNyZWNlciBsb3Mgw6FyYm9sZXMgaGFzdGEgdW5hIHByb2Z1bmRpZGFkIHF1ZSB5YSBubyBzZWEgcG9zaWJsZSBxdWUgY3JlemNhbiBtw6FzLg0KDQrigKIgVGVuZXIgZW4gY3VlbnRhIHRvZGFzIGxhcyBwcmVkaWNjaW9uZXMgZGUgdW4gaW5kaXZpZHVvLg0KDQrigKIgRW4gZWwgY2FzbyBkZSBjbGFzaWZpY2FjacOzbiByZWFsaXphciB1bmEgdm90YWNpw7NuIChwb3IgbWF5b3LDrWEpIHkgdW5hIG1lZGlhIGVuIGVsIGNhc28gZGUgcmVncmVzacOzbiBwYXJhIG9idGVuZXIgbGEgcHJlZGljY2nDs24gZmluYWwuDQoNCjxjZW50ZXI+DQohW10oYXJib2xlc2FsZWF0b3Jpb3MuanBnKQ0KPC9jZW50ZXI+DQoNCiMgUmVncmVzacOzbiBMaW5lYWwNCg0KRXMgbcOhcyB1dGlsaXphZG8gY29tbyB1biBhbGdvcml0bW8gZGUgY2xhc2lmaWNhY2nDs24gYSBwZXNhciBkZSB0ZW5lciBlbCBub21icmUgZGUgYWxnb3JpdG1vIGRlIHJlZ3Jlc2nDs24sIHkgZWwgbcOhcyBzZW5jaWxsbyBwYXJhIGVtcGV6YXIgZW4gTUwsIHN1IGFuw6FsaXNpcyBwZXJtaXRlIGhhY2VyIHByZWRpY2Npb25lcyBhIHRyYXbDqXMgZGUgZGF0b3MgaGlzdMOzcmljb3MgY29udGludW9zIHkgc3UgcmVsYWNpw7NuIGV4aXN0ZW50ZSAoQ2hvbGxldCwgMjAxOCkuDQoNCkVuIHVuIGFsZ29yaXRtbyBkZSAqKnJlZ3Jlc2nDs24gbGluZWFsKiogY2FkYSBkYXRvIGRlIGVudHJhZGEgdGllbmUgc3UgcHJvcGlvIHBlc28sIGRvbmRlIGxvcyBkYXRvcyBkZSBlbnRyYWRhIG8gdmFyaWFibGVzIGluZGVwZW5kaWVudGVzIHNlIGFzaWduYW4gZW4gdW5hIG1hdHJpeiBYIHkgbG9zIHBlc29zIGRlIHJlZ3Jlc2nDs24gbyB2YXJpYWJsZXMgZGVwZW5kaWVudGVzIGVuIHVuYSB2ZWN0b3IgWSAoSGFycmluZ3RvbiwgMjAxMikuDQoNCkxhIHJlZ3Jlc2nDs24gdXRpbGl6YSBlY3VhY2lvbmVzIGxpbmVhbGVzLCB5YSBzZWFuIHNpbXBsZXMgZG9uZGUgc29sbyBleGlzdGUgdW5hIHZhcmlhYmxlIGluZGVwZW5kaWVudGUsIHkgbcO6bHRpcGxlcyBkb25kZSBleGlzdGUgbcOhcyBkZSB1bmEgdmFyaWFibGUgaW5kZXBlbmRpZW50ZSwgYSBjb250aW51YWNpw7NuLCBsYSBmw7NybXVsYSBkZSB1bmEgZWN1YWNpw7NuIGxpbmVhbCBtw7psdGlwbGU6DQoNCiQkDQp5ID0gYiArIG1fMSB4XzEgKyBtXzIgeF8yICsgLi4uICsgbV9kIHhfZA0KJCQNCg0KRG9uZGU6IHkgPSBWYXJpYWJsZSBkZXBlbmRpZW50ZS4gYiA9IExhIGNvbnN0YW50ZSBvIGludGVyc2VjY2nDs24uIHhpID0gTGFzIGVudHJhZGFzIG8gdmFyaWFibGVzIGluZGVwZW5kaWVudGVzLiBtaSA9IENvZWZpY2llbnRlLCBwZW5kaWVudGUgbyB2YWxvciBhIGRldGVybWluYXIuDQoNCkVsIG9iamV0aXZvIGRlIGVzdGUgYWxnb3JpdG1vIGVzIG1pbmltaXphciBsYSBkaXN0YW5jaWEgZW50cmUgbG9zIGRhdG9zIHkgbGEgbMOtbmVhIHBhcmEgZWxsbyB1dGlsaXphIGVsIGNyaXRlcmlvIGRlbCBlcnJvciBkZSBsb3MgbcOtbmltb3MgY3VhZHJhZG9zIGNvbiBsb3MgdmFsb3JlcyBwcmVkaWNob3MgeSBsb3MgcmVhbGVzLCBkb25kZSBjdWFudG8gbcOhcyBjZXJjYSBwYXNlbiBsb3MgcHVudG9zIGRlIGxhIHJlY3RhLCBlcyBtZWpvci4NCg0KPGNlbnRlcj4NCiFbXShyZWdyZXNpb25saW5lYWwuanBnKQ0KPC9jZW50ZXI+DQoNCiMgTmFpdmUgQmF5ZXMNCg0KRXN0ZSBjbGFzaWZpY2Fkb3IgZXMgcHJvYmFiaWzDrXN0aWNvIHkgYXBsaWNhIGVsIHRlb3JlbWEgZGUgYmF5ZXMsIGRpZ2Ftb3MgcXVlIGxhcyBjYXJhY3RlcsOtc3RpY2FzIGRlIGVudHJhZGEgJHhfMSwgeF8yLCAuLi4sIHhfbiQgcG9yIGNvbmRpY2nDs24gc29uIGluZGVwZW5kaWVudGVzIGVudHJlIHPDrSwgZGFkbyBsYSBldGlxdWV0YSBkZSBjbGFzZSBZLCB0YWwgY29tbzoNCg0KJCQNClBcbGVmdCh4X3sxfSwgeF97Mn0gXGxkb3RzIHhfe259IFxtaWQgWVxyaWdodCk9XHByb2Rfe2k9MX1ee259IFBcbGVmdCh4X3tpfSBcbWlkIFlccmlnaHQpDQokJA0KDQpQYXJhIGVzdGEgY2xhc2lmaWNhY2nDs24gZGUgZG9zIGNsYXNlcyBkb25kZSAkKGk9MC4xKSQsIHNlIGRlZmluZSBjb21vIFDCoChpwqBcfMKgeCkgY29tbyBsYSBwcm9iYWJpbGlkYWQgZGVsIHZlY3RvciBkZSBtZWRpZGFzICR4JCB7JHhfMSx4XzIsLi4uLCB4X24kfSBwZXJ0ZW5lY2UgYSBsYSBjbGFzZSAkaSQuIERvbmRlIHNlIGRlZmluZSBlbCBwdW50YWplIGRlIGxhIGNsYXNpZmljYWNpw7NuIGRlIGxhIHNpZ3VpZW50ZSBmb3JtYToNCg0KJCQNClxmcmFje1AoMSBcbWlkIHgpfXtQKDAgXG1pZCB4KX09XGZyYWN7XHByb2Rfe2o9MX1ee259IGZcbGVmdCh4X3tqfSBcbWlkIDFccmlnaHQpIFAoMSl9e1xwcm9kX3tqPTF9XntufSBmXGxlZnQoXGJvbGRzeW1ib2x7eH1fe2p9IFxtaWQgXG1hdGhiZnswfVxyaWdodCkgUChcbWF0aGJmezB9KX09XGZyYWN7UCgxKX17UCgwKX09XHByb2Rfe2o9MX1ee259IFxmcmFje2ZcbGVmdChcYm9sZHN5bWJvbHt4fV97an0gXG1pZCBcbWF0aGJmezF9XHJpZ2h0KX17ZlxsZWZ0KFxib2xkc3ltYm9se3h9X3tqfSBcbWlkIFxtYXRoYmZ7MH1ccmlnaHQufQ0KJCQgJCQNClxsbiBcZnJhY3tQKDEgXG1pZCB4KX17UCgwIFxtaWQgeCl9PVxsbiBcZnJhY3tQKDEpfXtQKDApfStcc3VtX3tqPTF9XntufSBcbG4gXGZyYWN7ZlxsZWZ0KHhfe2p9IFxtaWQgMVxyaWdodCl9e2ZcbGVmdCh4X3tqfSBcbWlkIDBccmlnaHQufQ0KJCQNCg0KRG9uZGUgUCQoaXx4KSQgZXMgcHJvcG9yY2lvbmFsIGEgJGYgKHh8aSkgUChpKSQgeSAkZih4fGkpJCBlcyBsYSBlc3RydWN0dXJhIGNvbmRpY2lvbmFsIGRlICR4JCBwYXJhIG9iamV0b3MgZGUgbGEgY2xhc2UgJGkkLg0KDQpFbCBtb2RlbG8gZGUgQmF5ZXMgZXMgZWZpY2F6LCBlIGludGVyZXNhbnRlIHlhIHF1ZSBlcyBzaW1wbGUgeSByb2J1c3RvLiBZIG5vIHJlcXVpZXJlIGxhIHJlYWxpemFjacOzbiBkZSBlc3F1ZW1hcyBjb21wbGljYWRvcyBkZSBlc3RpbWFjacOzbiBpdGVyYXRpdmEgZGUgcGFyw6FtZXRyb3MgYSBncmFuZGVzIHZvbMO6bWVuZXMgZGUgZGF0b3MgeWEgcXVlIGVzIG11eSBmw6FjaWwgZGUgY29uc3RydWlyIHkgdXRpbGl6YXIgKEF3YWQgJiBLaGFubmEsIDIwMTUsIHDDoWcuIDE1KS4NCg0KIyBSZWdyZXNpw7NuIExvZ8Otc3RpY2ENCg0KRXN0ZSBhbGdvcml0bW8gZGUgcmVncmVzacOzbiBsb2fDrXN0aWNhLCBlcyB1biBtb2RlbG8gZXN0YWTDrXN0aWNvIHkgcHJvYmFiaWzDrXN0aWNvIHF1ZSBwcm9ub3N0aWNhIGxhIHByb2JhYmlsaWRhZCBkZSBxdWUgc2UgbWFuaWZpZXN0ZSB1biBzdWNlc28sIHlhIHF1ZSBtb2RlbGEgbGEgcmVsYWNpw7NuIGVudHJlIGxhIGRlcGVuZGllbnRlICJYIiB5IHVuIHJlc3VsdGFkbyBjYXJhY3RlcsOtc3RpY28gIlkiLg0KDQpTZSBleHByZXNhIGNvbW86DQoNCiQkDQpQKFkgXG1pZCBYKT1cZnJhY3tlXntcYmV0YV97MH0rXGJldGFfezF9IFh9fXsxK2Vee1xiZXRhX3swfStcYmV0YV97MX0gWH19DQokJA0KDQpFc3RhIGZ1bmNpw7NuIGxvZ8Otc3RpY2EgcHVlZGUgcmVmb3JtdWxhcnNlIGNvbW8gbGEgaW52ZXJzYSBxdWUgc2UgbGUgbGxhbWEgbG9naXQgbyBsb2ctb2RkcyBmdW5kYW1lbnRhbCBwYXJhIGdlbmVyYXIgc3VzIGNvZWZpY2llbnRlcy4NCg0KJCQNClxvcGVyYXRvcm5hbWV7bG9naXR9KFAoWSBcbWlkIFgpKT1cb3BlcmF0b3JuYW1le0lufVxsZWZ0W1xmcmFje1AoWSBcbWlkIFgpfXsxLVAoWSBcbWlkIFgpfVxyaWdodF09XGJldGFfezB9K1xiZXRhX3sxfSBYDQokJA0KDQpFc3RhIGZ1bmNpw7NuIGxvZ8Otc3RpY2EgcmVjaWJlIHVuIHJhbmdvIGRlIHZhbG9yZXMgZGUgZW50cmFkYSAoXGJldGFcXzArXGJldGFcXzFYKSBlbnRyZSBpbmZpbml0byBwb3NpdGl2byB5IG5lZ2F0aXZvLCB5IGxhIHNhbGlkYSBQXGxlZnQoWVx8WFxyaWdodCkgZXN0YSBsaW1pdGFkbyBhIGxvcyB2YWxvcmVzIDAgeSAxLCBjb21vIHNlIG11ZXN0cmE6DQoNCjxjZW50ZXI+DQohW10ocmVncmVzaW9ubG9naXN0aWNhLmpwZykNCjwvY2VudGVyPg0KDQojIFJlZCBOZXVyb25hbCBBcnRpZmljaWFsDQoNCkxhIHJlZCBuZXVyb25hbCBhcnRpZmljaWFsIGVzIHVuIG1vZGVsbyBjb21wdXRhY2lvbmFsIHF1ZSBpbWl0YSBsYXMgY29uZXhpb25lcyBuZXVyb25hbGVzIGRlbCBjZXJlYnJvLCBpbnRlbnRhbmRvIHJlYWxpemFyIHRhcmVhcyBkZSBjbGFzaWZpY2FjacOzbiBkZSBtYW5lcmEgc2ltaWxhciBhbCBzZXIgaHVtYW5vLiBMYXMgbmV1cm9uYXMgbyB1bmlkYWRlcyBlc3TDoW4gY29uZWN0YWRhcyBkZSBtYW5lcmEgZGlyZWNjaW9uYWwgbyBiaWRpcmVjY2lvbmFsIHkgY2FkYSBjb25leGnDs24gdGllbmUgdW4gcGVzbyBwYXJhIHJlcHJlc2VudGFyIGxhIGZ1ZXJ6YSBkZSBsYXMgY29uZXhpb25lcyBuZXVyb25hbGVzLCBjb250YW5kbyBjb24gdW5pZGFkZXMgZGUgZW50cmFkYSB5IGRlIHNhbGlkYSAoQmllbSwgMjAxNSkuDQoNClVuYSByZWQgbmV1cm9uYWwgZXN0w6EgY29tcHVlc3RhIHBvciB1biBtb2RlbG8gbmV1cm9uYWwgcXVlIGluZGljYSBjb21vIHVuYSBuZXVyb25hIGRldnVlbHZlIHVuYSBzYWxpZGEgYSBwYXJ0aXIgZGUgZGF0b3MgZGUgZW50cmFkYSwgbGEgYXJxdWl0ZWN0dXJhIHF1ZSBkZXNjcmliZSBsYXMgY29uZXhpb25lcyBlbnRyZSBsYXMgbmV1cm9uYXMsIGxhIHBvbMOtdGljYSBkZSBjb2RpZmljYWNpw7NuLCBsYSBwb2zDrXRpY2EgZGUgY29kaWZpY2FjacOzbiBkZSBkYXRvcyBkZSBlbnRyYWRhIHkgZXRpcXVldGFzLCB5IHBvciDDumx0aW1vIGVsIGFsZ29yaXRtbyBkZSBlbnRyZW5hbWllbnRvIChCaWVtLCAyMDE1KS4NCg0KTGEgcmVkIG5ldXJvbmFsIGVzdMOhIGNvbcO6bm1lbnRlIGRlc2NyaXRhIGNvbW8gdW4gZ3JhZm8sIGRvbmRlIGxhcyBuZXVyb25hcyBzb24gbG9zIG5vZG9zIHkgc3VzIGNvbmV4aW9uZXMgc29uIGxhcyBhcmlzdGFzIHF1ZSB1bmVuIGxhIHNhbGlkYSBkZSB1bmEgbmV1cm9uYSBjb24gbGEgZW50cmFkYSBkZSBvdHJhLCBkZWZpbmllbmRvIGxhIGVudHJhZGEgY29tbyBsYSBzdW1hIHBvbmRlcmFkYSBkZSBsYXMgc2FsaWRhcyBkZSBsYXMgbmV1cm9uYXMgY29uZWN0YWRhcyBhIGVsbGEuIExhIHJlZCBuZXVyb25hbCBwdWVkZSBlc3RhciBkaXN0cmlidWlkYSBlbiBjYXBhcyBvIHN1YmNvbmp1bnRvcywgdGVuaWVuZG8gY29tbyB1bmEgY2FwYSBkZSBlbnRyYWRhIFYwIGRlIG4gKyAxIG5ldXJvbmFzLCBkb25kZSBuIGVzIGxhIGNhbnRpZGFkIGRlbCBlc3BhY2lvIGRlIGVudHJhZGEsIGxhIHNhbGlkYSBkZSBsYSBuZXVyb25hICRpJCBlbiAkVl8wJCBlcyAkeF9pJCwgbGEgw7psdGltYSBuZXVyb25hIGVuIGVzdGUgbml2ZWwgZXMgdW5hIGNvbnN0YW50ZSAxIChTaGFsZXYgJiBCZW4sIDIwMTQpLg0KDQpEZW5vdGFtb3MgJFZfdCxpJCwgZG9uZGUgdCBlcyBsYSBwcm9mdW5kaWRhZCBkZSBsYSByZWQgbyBsYSBjYW50aWRhZCBkZSBjYXBhcyBzaW4gbGEgY29uc2lkZXJhciAkVl8wJCwgY2FsY3VsYW5kbyBsYXMgc2FsaWRhcyBkZSBsYXMgbmV1cm9uYXMgZGUgbGEgY2FwYSB0LCBzZSBwb2Ryw6EgY2FsY3VsYXIgbGFzIHNhbGlkYXMgZGUgbGFzIG5ldXJvbmFzIGRlIGxhIGNhcGEgdCArIDEgY29tbyBzaWd1ZSwgY3VhbmRvIGxhIHJlZCBlcyBhbGltZW50YWRhIGNvbiBlbCB2ZWN0b3IgZGUgZW50cmFkYSB4LiBMYXMgY2FwYXMgJFZfMSQsIC4gLiAuLCAkVl9UIC0gMSQgc29uIGxhcyBjYXBhcyBvY3VsdGFzIHkgbGEgw7psdGltYSBlcyBsYSBjYXBhIGRlIHNhbGlkYS4gRW4gbGEgc2lndWllbnRlIGZpZ3VyYSBzZSBtdWVzdHJhIHVuYSByZWQgbmV1cm9uYWwgZGUgcHJvZnVuZGlkYWQgViA9IDIsIHRhbWHDsW8gMTAgeSBhbmNodXJhIDUsIGNvbiB1bmEgbmV1cm9uYSBlbiBsYSBjYXBhIG9jdWx0YSBxdWUgbm8gdGllbmUgYXJpc3RhcyBkZSBlbnRyYWRhIChTaGFsZXYgJiBCZW4sIDIwMTQpLg0KDQo8Y2VudGVyPg0KIVtdKHJlZG5ldXJvbmFsLmpwZykNCjwvY2VudGVyPg0K