Introducción

Preguntas

¿Qué es un análisis exploratorio de los datos?

El Análisis Exploratorio de los Datos (EDA por sus siglas en inglés) es un proceso crítico a la hora de manipular datasets, en el cual se suelen implementar distintas técnicas de visualización con el fin de tener un primer acercamiento con el conjunto de datos y sus variables, identificando patrones o el comportamiento en general de estas, para lograr esto podemos hacer uso de las medidas descriptivas y de dispersión así como la implementación de gráficos que faciliten la comprensión visual de patrones, anomalías y comenzar a generar suposiciones correctas sobre los datos.

¿Cómo contribuye el análisis exploratorio de los datos a mejorar el proceso y los resultados de analítica descriptiva?

El EDA es parte fundamental de cualquier análisis de datos, pues mediante este mismo es que se tiene un primer acercamiento con los datos logrando conocer sus principales características como estructura de los datos, tipos de variables y las relaciones que existen entre ellas, entre otas muchas que podemos descubrir gracias a la implementación de diversos métodos de visualización, una vez concluido el EDA se espera tener una mejor noción de la naturaleza de los datos y como manipular los datasets de la mejor manera posible, de esta manera logramos una comprensión sólida y completa de los datos con los que se estarán trabajando durante las siguientes etapas del proyecto.

Antecedentes FORM

Visión: En 2033 seremos una de las cinco mejores compañías de México que generan valor dentro de la cadena de suministro de las industrias que más valoran la forma en la que se protegen y trasladan las cosas.

Misión: Transformar nuestro entorno y resolver retos industriales de nuestros clientes a través de la colaboración, provocando nuevas oportunidades que potencian nuestro modelo de negocio, para alcanzar nuestros ideales.

Ojetivos estratégicos:
* Impulso Sostenible e Innovador: Desarrollar e implementar soluciones de empaque automotriz que fusionen la sustentabilidad y la innovación, priorizando la adopción de materiales ecoamigables y la constante búsqueda de nuevas tecnologías para reducir el impacto ambiental y mejorar la eficiencia en toda la cadena de suministro.

  • Efectividad y Calidad Colaborativas: Implementar prácticas que potencien la efectividad operativa y la excelencia en la calidad del empaque automotriz, asegurando que cada proceso contribuya a la eficiencia total y a la satisfacción del cliente.

  • Desarrollo Integral del Personal: Fomentar un entorno laboral que promueva la integridad, la transparencia y el desarrollo continuo de los colaboradores, contribuyendo a la retención de talento y al fortalecimiento de la cultura organizacional.

Contexto de la Industria

Las fuentes de datos utilizadas para realizar los gráficos fueron: mex_exports_autoparts, Importers of Cartons boxes of corrugated paper or board 2020-2021, Exporters of Cartons boxes of corrugated paper or board 2020-2021, mx_automotive_industry, y US_Auto_Production_Sales.

Cartón

Los Top 5 países con mayores exportaciones de cartón durante el 2020 y el 2021 con sus respectivas cantidades fueron: China (1,593,052,767), Alemania (1,413,035,728), Estados Unidos (1,319,071,812), Países Bajos (651,558,509), Polonia (609,084,661).

Los Top 5 países con mayores importaciones de cartón durante el 2020 y el 2021 con sus respectivas cantidades fueron: Alemania (989,233,288), Estados Unidos (956,481,957), Países Bajos (850,169,637), México (778,911,138), Francia (682135350)

En esta sección se observó que para las exportaciones, Europa realizó más exportaciones, pero la cantidad de contenido exportado fue mayor por parte del continente Asiático. En cuanto a las importaciones, Europa fue el país con mayores exportaciones y contenido exportado.

Autopartes

Los Estados de México que exportaron más autopartes en 2021 fueron Coahuila, Querétaro, Guanajuato, Ciudad de México y Nuevo León. En 2022, Coahuila se mantuvo como el Estado que más exportaciones de autopartes realizó, seguido por Puebla, Querétaro, Guanajuato y Ciudad de México.

Las 5 principales autopartes que exportó Estados Unidos en 2021 fueron: todas las demás piezas de automóviles, piezas de carrocería excepto cabinas, cajas de cambios, ejes motrices con diferencial y frenos y piezas.

Automotriz

Se observa que de las importaciones que realizó México del 2018 a 2022, alrededor del 50% fueron de Estados Unidos. También, se encontró que México tiene una tendencia a lo largo de los años en cuestiones producción automotriz, exportaciones e importaciones. México tiene una mayor producción local de la que importa y exporta; así mismo, exporta más productos de la industria automotriz de los que importa. El tamaño de mercado de la industria automotriz en México ha ido fluctuando a través de los años; sin embargo, muestra una tendencia a la alza. En 2018 el tamaño de mercado era de 77% y en 2022 esta cifra aumentó a 79.7%. En cuanto al tipo de cambio, se ha mantenido entre 19.22 y 20.4.

En cuanto a las Exportaciones de piezas de EE. UU, se observó que México ha sido el principal país al que EU le ha exportado desde el 2018 (con un promedio de 29,584,281,308 piezas), seguido por Canadá y China. En cuanto a la producción anual de vehículos de motor y ventas internas en EE. UU. (miles de unidades). Se observa que en los últimos 20 años EE.UU. ha producido y vendido más vehículos comerciales que carros para pasajeros. En 2021, produjo 1, 563,000 carros de pasajeros, y 7,594,000 carros comerciales. Y vendió 2,376,000 carros de pasajeros, y 9,455 carros comerciales.

Amenazas y oportunidades identificados

Amenazas:

  • La dependencia de las importaciones de Estados Unidos: México importa un alto porcentaje de partes automotrices de EE.UU. si llegará a haber algún cambio en una política comercial o en la relación entre los dos países, eso afectaría en gran cantidad a México.

  • El tipo de cambio: Si la moneda mexicana se deprecia, eso podría afectar significativamente los costos de producción y las exportaciones.

  • Competencia internacional: China y Alemania tienen una gran presencia en la importación y exportación de autopartes y vehículos, esos países y otros pueden ser competencia del mercado internacional para México.

Oportunidades:

  • Crecimiento de la industria: La tendencia en aumento del mercado de la industria automotriz, es una oportunidad para que México crezca en la industria y aporté más valor al desarrollo económico del país.

  • Relación con Estados Unidos: Ya que EE.UU. exporta principalmente a México piezas de automóviles, existe la oportunidad de seguir fortaleciendo la relación comercial entre estos dos países.

  • Vehículos comerciales: Estados Unidos produce y vende más vehículos comerciales que carros para pasajeros, México podría diversificar su producción de automóviles para que se asocie con EE.UU. en el comercio de los vehículos comerciales y tenga mayores ventas.

  • Producción local: México ha tenido una mayor producción local que importaciones y exportaciones automotrices en los últimos años, puede aprovechar esto para aumentar la producción manufacturera dentro del país y aumentar su autonomía para no depender tanto de otros países.

Motivación

Situación problema Recursos Humanos
La empresa FORM experimenta una alta tasa de abandono de empleo al tener de 1 a 4 bajas diarias, la falta de personal provoca mayor gasto en el área de Recursos Humanos ya que los procesos de reclutamiento se vuelven repetitivos, FORM además de su propia área de Recursos Humanos ha contratado otras 3 empresas para mejorar su proceso de reclutamiento. Debemos identificar las razones del abandono de empleo ya que se han tomado medidas como aumento de sueldos, mejores prestaciones o mejores condiciones laborales sin embargo estas no han tenido éxito.

Situación problema Pronóstico de Demanda
La empresa FORM ha presentado desafíos operativos, la variabilidad de la demanda de sus clientes sumado con el problema de rotación de empleados que tiene ha ocasionado problemas para tener una buena eficiencia operativa, pronosticando la demanda de sus productos FORM puede tener una mejor planificación de compra de materia prima, capacidad de personal o de producto terminado y aumentar la eficiencia y capacidad operativa lo que se verá traducido en mayores ganancias.

FODA Cruzado

PESTLE

México

Políticos

Elecciones políticas: 2024 es un año donde en México hay elecciones políticas para determinar al próximo presidente por lo que es algo que tenemos que tomar en cuenta, una de las principales consecuencias que tenemos es la incertidumbre en el mercado, no sabemos si tendremos un mejor escenario o un escenario desfavorable, el resultado de las elecciones puede traer como consecuencia cambios en la inversión, cambios en las relaciones exteriores entre muchas cosas más por lo que es algo que se debe tomar en cuenta para tener la capacidad de adaptarse a la nueva realidad.

Económicos

Nearshoring: México es uno de los países que pueden sacar una mejor ventaja de este fenómeno, después de la pandemia covid-19 y el colapso de varias cadenas de suministros el fenómeno nearshoring se volvió más fuerte, la posición geográfica de méxico lo hace un excelente candidato para reubicar cadenas de suministros ya que se encuentra cerca de los principales destinos finales de las producciones, como si fuera poco México cuenta con una mano de obra barata y también es uno de los países con más tratados y acuerdos comerciales, algunas ventajas que tendría México gracias a este fenómeno es el crecimiento de su economía en un 3.5% anual y un aumento de inversión de un 7.5% aprox, pero así como existen ventajas y beneficios México cuenta con una serie de problemas que podrían afectar a este fenómeno, los problemas sociales, crimen organizado, corrupción entre otros, pero el verdadero problema es si México cuenta con la infraestructura necesaria como transporte, aeropuertos, energías limpias que permitan a las empresas reubicar sus cadenas de suministros en nuestro país.

Autopartes: Se estima que en 2024 se reciban más de 2 mil 300 millones de dólares en inversión en el sector de autopartes en México, más del 14% de lo que se recibió en 2023, Alemania y Japón son los dos países con más inversión en nuestro país.

En enero de 2024 se exportaron más de 250 mil autos ensamblados, esta es una cifra jamás antes vista en el país, Estados Unidos es el mejor socio de México, para dimensionar esta asociación 8 de cada 10 autos exportados terminan en el mercado de Estados Unidos.

Sociales

Características de la población: La esperanza de vida en nuestro país es de 75.5 años, en Nuevo León se está por encima del promedio de esperanza de vida ya que en el estado la esperanza de vida es de 76. 2 años de edad.

Un gran problema de la sociedad mexicana es la inseguridad y esta no solo afecta en el aspecto social, afecta en la mayoría de aspectos analizados, el crimen organizado, en los últimos 8 años la tasa de crimen organizado ha aumentado más de 60% por lo que es un problema social a tomar en cuenta.

Tecnológicos

Autos eléctricos: En 2023 se superó la producción de más de 100 mil autos eléctricos lo que significa que el año pasado el mercado de estos coches creció en un 36%, se espera que en 2024 aumente este crecimiento ya que marcas como Toyota, Tesla (Nuevo León) y BMX (San Luis Potosí) están por iniciar producción de autos eléctricos en nuestro país en 2024.

La transición a los autos eléctricos es una estrategia de la industria mexicana ya que se quiere lograr una reducción del 45% de las emisiones de CO2 para el año 2050.

Legales

Leyes laborales: En México las leyes laborales regulan la relación entre los empleados y las empresas, existen leyes ya establecidas, algunas de las más importantes son: La Ley Federal del Trabajo (LFT), La Ley de la Seguridad Social (LSS), La Ley de la Responsabilidad Social Empresarial (LRS), por otra parte con desde el primer dia de enero de 2024 el salario mínimo aumentó un 20% y nadie puede ganar menos de 7,468 pesos al mes y por ley no se puede trabajar más de 8 horas por jornada laboral.

Ambientales

Energías limpias: México es un jugador nuevo en este sector ya que apenas en 2025 se aprobó la ley que permite la participación de energías limpias o renovables, aproximadamente un 20% de la energía utilizada en México viene de energías verdes siendo la energía hidroeléctrica la más utilizada con un 8%, si nos situamos a la ubicación del socio formador nos podemos encontrar un problema, actualmente Nuevo León enfrente problemas ambientales muy grandes, la contaminación atmosférica es uno de ellos y la presencia de industrias como la refinería de Cadereyta aumentan este problema cada día más, la contaminación de la atmósfera no solo afecta a la calidad del aire también puede afectar la sustentabilidad en la región a un mediano plazo, por lo que es necesario una transición a energías limpias, las empresas juegan un papel fundamental en esta transición ya que deben desempeñar actividades sostenibles dentro de sus procesos.

Reciclaje de cartón: Como menciona la secretaría de medio ambiente y recursos naturales de México aproximadamente se desechan más de 2.5 millones de toneladas de papel y cartón al año lo que implica tala de árboles y procesos químicos que utiliza el cartón para ser fabricado, afortunadamente México en los últimos años ha estado consciente de que el reciclaje es una parte fundamental para la conservación del medio ambiente y ya cuenta con plantas recicladoras, un ejemplo es la planta recicladora de pet más grande de América Latina.

Estados Unidos

Políticos

Elecciones políticas: Al igual que en México, en el primer semestre del 2024 serán las elecciones en este país. Actualmente, Joe Biden publicó la Ley de Reducción de la Inflación, en la que se otorgan estímulos fiscales a los consumidores de coches eléctricos pero también a las armadoras. Dependiendo del ganador de las elecciones de este año, dichos incentivos pueden desaparecer, y tendría un impacto en México.

Económicos

Nearshoring: Estados Unidos se beneficia del 76% dentro del 90% del total de producción de vehículos. Dichas exportaciones mexicanas a Estados Unidos incluyen productos como camiones ligeros, vehículos de pasajeros y piezas de automóviles. Igualmente se benefician de las habilidades técnicas y la rentabilidad de obra mexicana, una programación de producción simplificada dentro de una zona horaria simplificada y tiempos reducidos de transportes para materias primas y bienes.

Algunos otros factores que influyen en que más empresas de Estados Unidos se sitúen en México son: las difíciles relaciones que tienen con China, el T-MEC que facilita el comercio de EU, México y Canadá, la proximidad de ambos países, los bajos costos laborales en México, las cadenas de suministros rápidas y seguras, el buen desempeño de la industria nacional, sobre todo en la industria automotriz.

La facilidad de nearshoring de México a Estados Unidos puede afectar a las empresas mexicanas debido a la alta competencia que traería.

Autopartes: Existe una gran cantidad de empresas que invierten en México para la fabricación de autopartes, de las cuales el 28% son de Estados Unidos. El comercio de autopartes con Estados Unidos ha sido estratégico para el crecimiento de la industria a pesar del impacto que tuvo la huelga automotriz en 2023.

Sociales

Desigualdad económica: la desigualdad de ingresos en Estados Unidos es muy alta en comparación con otros países ricos. El 10% de los que más ganan abarca casi la mitad de todos los ingresos y el 50% inferior obtiene solo el 13% Características de la población: Estados Unidos ganó más de 1.6 millones de personas en 2023, indicando un crecimiento del 0.5%. A pesar de la disminución de los nacimientos, la reducción significativa de muertes impulsó el crecimiento de la nación. Estados Unidos se encuentra en medio de un cambio demográfico significativo que podría tener implicaciones en términos de representación política, desarrollo económico y distribución de recursos.

Tecnológicos

Autos eléctricos: Estados Unidos es el mayor fabricante de coches híbridos y eléctricos de América del norte y como consecuencia el país también es el principal mercado para estos coches.

En estados Unidos la tasa de lealtad a los coches eléctricos han bajado, aproximadamente el 48% de los conductores de autos eléctricos volverían a los coches de gasolina en su próxima compra, Estados Unidos está muy por detrás de Países como China en el uso de autos eléctricos, aunque existen estados como California donde se está desarrollando más rápido este nuevo segmento.

Legales

Leyes laborales: Actualmente se cuentan con leyes como Ley de Normas Justas de Trabajo, donde establece salario mínimo federal, regula el pago de horas extras, y establece estándares para el empleo de menores de edad. Ley Nacional de Relaciones Laborales, la cual protege el derecho de los empleados a organizarse y negociar colectivamente a través de sindicatos. Es relevante mencionar que en 2023 hubo una huelga en donde trabajadores de la industria automotriz piden un salario justo.

Igualmente, Biden promueve la Ley de Reducción de Inflación, la cual impulsa a los fabricantes de vehículos a acelerar la producción de vehículos limpios.

Ambientales

Acción Climática: Estados Unidos se encuentra dentro del acuerdo USMCA el cual incluye un nuevo capítulo sobre el medio ambiente y disposiciones para reducir la contaminación y promover el uso de energías renovables. Estas medidas están diseñadas para que la industria automotriz y metalmecánica sea más sostenible y competitiva a nivel mundial. Algunas medidas incluyen: que se adopten estándares comunes de emisiones para los vehículos, promocionen el uso de energías renovables y establece un nuevo fondo para apoyar a las empresas de la industria automotriz y metalmecánica a desarrollar nuevas tecnologías que reduzcan su impacto ambiental.

Reciclaje de cartón: Las cajas de cartón son el material de empaquetado más reciclado en Estados Unidos. En 2022, la tasa de reciclaje de cajas de cartón fue superior al 93%, un aumento con respecto a la tasa del año pasado.

Estrategias

Diversificación de productos: Aprovechando factores como el Nearshoring o la creciente inversión extranjera en el sector de autopartes, introducir nuevos tipos de empaques o nuevos productos que puedan ser llamativos para estas industrias que se encuentra en tendencia creciente, como se puede apreciar en el PESTLE estos factores provocan que más empresas lleguen al mercado por lo que tener más variedad de producto puede ser una oportunidad de expansión o consolidación en el mercado.

Monitoreo del mercado: Al tener una industria en crecimiento, surgirán nuevos competidores por lo que tienes que saber cual es tu valor agregado el cual te diferencia de tu competencia, mantener tu producto actualizado para satisfacer las necesidades y exigencias del mercado.

Pronóstico de Nearshoring

Pronositco del evento Nearshoring en la industria

# setting time series format 
Nearshoring$Fecha=as.yearqtr(Nearshoring$Fecha,format="%Y/%q")

# time series plot 
IEDxts<-xts(Nearshoring$IED_REAL,order.by=Nearshoring$Fecha)
dygraph(IEDxts, main = "Foreign Direct Investment Flows") %>% 
  dyOptions(colors = RColorBrewer::brewer.pal(4, "Dark2"))
IEDts<-ts(Nearshoring$IED_REAL,frequency=4,start=c(1999,1))
IED_ts_decompose<-decompose(IEDts)
plot(IED_ts_decompose)

Pruebas

# Stationary Test 
# H0: Non-stationary and HA: Stationary. p-values < 0.05 reject the H0.
adf.test(IEDts)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  IEDts
## Dickey-Fuller = -4.3846, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary
# Serial Autocorrelation
acf(IEDts,main="Significant Autocorrelations")

Modelo

summary(IED_ARIMA<-arima(IEDts,order=c(0,0,0),seasonal = c(2,0,0))) 
## 
## Call:
## arima(x = IEDts, order = c(0, 0, 0), seasonal = c(2, 0, 0))
## 
## Coefficients:
##         sar1    sar2  intercept
##       0.1779  0.2418   231.3254
## s.e.  0.0977  0.0975   117.4993
## 
## sigma^2 estimated as 501382:  log likelihood = -790.52,  aic = 1589.05
## 
## Training set error measures:
##                    ME    RMSE      MAE       MPE     MAPE      MASE        ACF1
## Training set 6.741251 708.083 372.0404 -20.35875 346.8635 0.6136686 -0.02059352

Diagnostico

### Residuals are stationary ?
IED_ARIMA_residuals<-IED_ARIMA$residuals
adf.test(na.omit(IED_ARIMA_residuals))
## 
##  Augmented Dickey-Fuller Test
## 
## data:  na.omit(IED_ARIMA_residuals)
## Dickey-Fuller = -4.8948, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary
# ADF test suggest that ARMA residuals are stationary since p-value is < 0.05. 

### Residuals show serial autocorrelation ?
Box.test(IED_ARIMA_residuals,lag=3,type="Ljung-Box")
## 
##  Box-Ljung test
## 
## data:  IED_ARIMA_residuals
## X-squared = 0.33711, df = 3, p-value = 0.9529

Pronostico

temp_forecast<-autoplot(forecast(IED_ARIMA))
plot(temp_forecast)

forecast(IED_ARIMA,h=5)
##         Point Forecast     Lo 80     Hi 80      Lo 95    Hi 95
## 2023 Q4     118.270281 -789.1746 1025.7152 -1269.5469 1506.087
## 2024 Q1      63.172197 -844.2727  970.6171 -1324.6450 1450.989
## 2024 Q2     428.659330 -478.7856 1336.1042  -959.1579 1816.477
## 2024 Q3     257.420849 -650.0240 1164.8657 -1130.3963 1645.238
## 2024 Q4       7.801777 -913.8885  929.4921 -1401.8019 1417.405

Preguntas de Análisis

1- ¿En qué año hubo más renuncias?
2- ¿Hay factores en común entre los empleados que no abandonan el empleo?
3- ¿Hay factores en común entre los empleados que abandonan el empleo?
4- ¿En qué área de la empresa han sucedido más bajas?

EDA

Base de datos Encuesta

Identificación de NA’s

nas_por_columna <- colSums(is.na(df_n))
nas_por_columna
##    Antiguedad_meses       Razon_ingreso  Percepcion_salario        Prestaciones 
##                   0                   0                   0                   0 
##     Jornada_laboral        Herramientas         Temperatura        Estres_nivel 
##                   0                   0                   0                   0 
##          Transporte        Zona_trabajo    Sigue_trabajando situacion_conflicto 
##                   0                   0                   0                   0 
##      Insatisfaccion          Percepcion                Edad              Genero 
##                   0                   0                   0                   0 
##        Estado_civil           Municipio         Escolaridad       Depend_econom 
##                   0                   0                   0                   0 
##              Puesto 
##                   0
nas_por_columna <- colSums(is.na(df_c))
nas_por_columna
##    Antiguedad_meses       Razon_ingreso  Percepcion_salario        Prestaciones 
##                   0                   0                   0                   0 
##     Jornada_laboral        Herramientas         Temperatura        Estres_nivel 
##                   0                   0                   0                   0 
##          Transporte        Zona_trabajo    Sigue_trabajando situacion_conflicto 
##                   0                   0                   0                   0 
##      Insatisfaccion          Percepcion                Edad              Genero 
##                   0                   0                   0                   0 
##        Estado_civil           Municipio         Escolaridad       Depend_econom 
##                   0                   0                   0                   0 
##              Puesto 
##                   0

Nos aseguramos que no haya valores faltantes en el dataframe.

Medidas descriptivas

library(psych) 
describe(df_n)
##                     vars   n  mean    sd median trimmed   mad min max range
## Antiguedad_meses       1 103 13.61 14.35      7   12.43  8.90   1  36    35
## Razon_ingreso          2 103  3.96  1.71      4    4.07  2.97   1   6     5
## Percepcion_salario     3 103  3.80  1.34      4    3.99  1.48   1   5     4
## Prestaciones           4 103  3.29  1.54      4    3.36  1.48   1   5     4
## Jornada_laboral        5 103  4.17  1.25      5    4.42  0.00   1   5     4
## Herramientas           6 103  3.90  1.55      5    4.12  0.00   1   5     4
## Temperatura            7 103  3.11  1.71      3    3.13  2.97   1   5     4
## Estres_nivel           8 103  3.72  1.38      4    3.89  1.48   1   5     4
## Transporte             9 103  4.01  1.51      5    4.25  0.00   1   5     4
## Zona_trabajo          10 103  4.33  1.22      5    4.63  0.00   1   5     4
## Sigue_trabajando      11 103  4.02  1.29      5    4.25  0.00   1   5     4
## situacion_conflicto   12 103  1.17  0.40      1    1.07  0.00   1   3     2
## Insatisfaccion*       13 103 42.61 23.17     44   43.41 29.65   1  79    78
## Percepcion*           14 103 23.21 17.02     15   21.82 14.83   1  59    58
## Edad                  15 103 35.49 12.23     33   34.70 13.34  18  68    50
## Genero                16 103  1.35  0.48      1    1.31  0.00   1   2     1
## Estado_civil          17 103  1.95  1.11      2    1.82  1.48   1   4     3
## Municipio             18 103  1.76  1.43      1    1.41  0.00   1   6     5
## Escolaridad           19 103  2.44  1.02      3    2.39  1.48   1   5     4
## Depend_econom         20 103  1.07  1.09      1    0.96  1.48   0   3     3
## Puesto                21 103  1.67  0.80      1    1.59  0.00   1   3     2
##                      skew kurtosis   se
## Antiguedad_meses     0.67    -1.28 1.41
## Razon_ingreso       -0.47    -1.20 0.17
## Percepcion_salario  -0.94    -0.39 0.13
## Prestaciones        -0.28    -1.48 0.15
## Jornada_laboral     -1.40     0.78 0.12
## Herramientas        -1.06    -0.53 0.15
## Temperatura         -0.14    -1.71 0.17
## Estres_nivel        -0.73    -0.75 0.14
## Transporte          -1.16    -0.35 0.15
## Zona_trabajo        -1.81     2.01 0.12
## Sigue_trabajando    -1.15     0.14 0.13
## situacion_conflicto  2.23     4.20 0.04
## Insatisfaccion*     -0.20    -1.17 2.28
## Percepcion*          0.65    -0.98 1.68
## Edad                 0.48    -0.90 1.21
## Genero               0.62    -1.63 0.05
## Estado_civil         0.94    -0.54 0.11
## Municipio            1.80     2.07 0.14
## Escolaridad          0.17    -0.45 0.10
## Depend_econom        0.50    -1.14 0.11
## Puesto               0.65    -1.14 0.08

Aquí se observan por cada variable valores como: promedio, desviación estándar, mediana, min, max, etc.

Medidas de dispersión

#Aquí calculé de la variable Antiguedad_meses sus medidas de dispersión.
media <- mean(df_n$Antiguedad_meses)
media # 13.61165
## [1] 13.61165
desviacion_estandar <- sd(df_n$Antiguedad_meses)
desviacion_estandar # 14.34534
## [1] 14.34534
coeficiente_variacion <- (desviacion_estandar / media) * 100
coeficiente_variacion  #105.3902
## [1] 105.3902
rango <- range(df_n$Antiguedad_meses)
rango #1 36
## [1]  1 36
varianza <- var(df_n$Antiguedad_meses)
varianza # 205.7889
## [1] 205.7889

La variable dependiente es Antiguedad_meses y sus medidas de dispersión son las siguientes:
* Media: 13.61165
* Desviación estándar: 14.34534
* Coeficiente de variación: 105.3902
* Rango: 1 36
* Varianza: 205.7889

Estos datos podemos interpretarlos de la siguiente manera:
* Los empleados tienen una antigüedad promedio de 13.6 meses.
* Los valores están dispersos en aprox. 14 meses de la media.
* Hay una alta variabilidad en relación con la media.
* La antigüedad de los empleados es desde 1 mes hasta 36 meses.
* La varianza nos dice que los valores varían en 205 meses al cuadrado respecto a la media.

Gráficos

##                             [,1]
## Antiguedad_meses     1.000000000
## Razon_ingreso       -0.098276978
## Percepcion_salario  -0.110373225
## Prestaciones         0.129066759
## Jornada_laboral     -0.005125116
## Herramientas         0.060019295
## Temperatura          0.074649577
## Estres_nivel        -0.104466536
## Transporte           0.098300633
## Zona_trabajo         0.018102147
## Sigue_trabajando     0.255070305
## situacion_conflicto  0.182841453
## Edad                 0.304281259
## Genero               0.007103936
## Estado_civil        -0.020808305
## Municipio           -0.007023634
## Escolaridad          0.095142518
## Depend_econom        0.110476284
## Puesto               0.196213192

En la matriz de correlación vemos que la variable dependiente “Antiguedad_meses” se correlaciona en gran manera con las variables de: Sigue_trabajando y Edad.

Esto significa que, mientras más antigüedad tenga un empleado, es más probable que siga trabajando en FORM y que tenga más edad.

La variable Puesto también tiene una correlación positiva con Antiguedad_meses, aunque en menor medida, esto significa que, el puesto que ocupe un colaborador también influye en su antigüedad dentro de la empresa.

Las variables: Razon_ingreso, Percepcion_salario, Estres_nivel y Estado_civi están correlacionadas negativamente con Antiguedad_meses, pero esta correlación es muy baja.

## $`1`

## 
## $`2`

## 
## attr(,"class")
## [1] "list"      "ggarrange"

Se observa que las variables: Transporte, Sigue_trabajando, Herramientas, Jornada_Laboral, Zona_trabajo y Estres_nivel presentan un sesgo a la izquierda.

Y las variables: Puesto, Genero, Estado_civil, Situacion_conflicto y Depend.econom presentan un sesgo a la derecha.

Se observa que la mayor parte de los trabajadores son mujeres.

Se observa que la mayoría de los empleados residen en el Municipio de Apodaca, seguido por Juárez.

Se observa que la mayoría de los colaboradores cuentan con una escolaridad de Secundaria, seguida por Preparatoria, Licenciatura, Primaria y Otro.

La mayor parte de los colabroadores se ubican entre los 20 y 30 años.

La mayoría de los empleados ocupan puestos de Producción (Costurera, Ayudante General, Soldador).

La mayoría de los colaboradores son solteros, seguidos por un estado civil de casado, unión libre y divorciado.

La mayoría de los trabajadores no se sienten estresados durante su jornada laboral.

Con base en las respuestas de la variable Percepcion, se observa que la mayoría de los empleados de FORM sienten alegría y confianza.

Tablas (frecuencia, contingencia)

  • Tabla de contingencia: Situación de Conflicto vs. Genero
##                      
##                       Femenino Masculino Sum
##   No                        56        31  87
##   Prefiero no decirlo        1         0   1
##   Si                        10         5  15
##   Sum                       67        36 103

Se observa que de los empleados actuales 15 de 103 han experimentado acoso, conflicto o se han sentido inseguros dentro de la empresa. Y 10 de esos 15 casos han sido mujeres.

  • Tabla de contingencia: Situación de Genero vs. Razón de Ingreso
##            
##             Ambiente de trabajo Otro Por el salario Prestaciones
##   Femenino                    8   12             12            1
##   Masculino                   4    9              7            1
##   Sum                        12   21             19            2
##            
##             Razones personales Ubicación de la empresa Sum
##   Femenino                  14                      20  67
##   Masculino                  5                      10  36
##   Sum                       19                      30 103

Se observa que la razón por la que entraron a trabajar la mayoría de los colaboradores a FORM (30 de 103) fue por la ubicación de la empresa. Las mujeres entraron a trabajar más que los hombres por razones de Ambiente de trabajo, salario y razones personales.

  • Tabla de frecuencia: Sigue Trabajando
## 
##        Medianamente de acuerdo     Medianamente en desacuerdo 
##                             20                              5 
## Ni de acuerdo ni en desacuerdo          Totalmente de acuerdo 
##                             15                             54 
##       Totalmente en desacuerdo 
##                              9

Se observa que de los actuales trabajadores de FORM, poco más de la mitad planea seguir trabajando en la empresa (54 de 103), mientras que 9 de los 103 encuestados planean no seguir laborando en FORM.

Base de datos Bajas

Identificación de NA’s

##  Motivo de Baja          Puesto            Dpto              SD    Estado_Civil 
##             112               0             254               0               0 
##          Genero             Año          Estado       Municipio Dias_trabajados 
##               0               0               0               0             112 
##           Meses            Edad 
##             112               0

Dado que hay NA’s en Dias_trabajados y Meses, se sustituirán los NA por la mediana de cada variable.

# Calcular la mediana de las variables correspondientes
mediana_dias_trabajados <- median(bajas$Dias_trabajados, na.rm = TRUE)
mediana_meses <- median(bajas$Meses, na.rm = TRUE)

# Reemplazar los NA por la mediana en las columnas correspondientes
bajas <- bajas %>%
  mutate(Dias_trabajados = ifelse(is.na(Dias_trabajados), mediana_dias_trabajados, Dias_trabajados),
         Meses = ifelse(is.na(Meses), mediana_meses, Meses))

Medidas descriptivas

summary(bajas)
##  Motivo de Baja        Puesto              Dpto                 SD       
##  Length:391         Length:391         Length:391         Min.   :144.4  
##  Class :character   Class :character   Class :character   1st Qu.:180.7  
##  Mode  :character   Mode  :character   Mode  :character   Median :217.6  
##                                                           Mean   :200.2  
##                                                           3rd Qu.:217.6  
##                                                           Max.   :337.1  
##                                                                          
##       Estado_Civil       Genero      Año             Estado   
##  DIVORCIO   :  3   FEMENINO :206   2022:112   COAHUILA  : 21  
##  MATRIMONIO :117   MASCULINO:185   2023:279   NUEVO LEÓN:370  
##  SOLTERIA   :184                                              
##  UNION LIBRE: 87                                              
##                                                               
##                                                               
##                                                               
##         Municipio   Dias_trabajados       Meses             Edad      
##  APODACA     :265   Min.   :   1.00   Min.   : 1.000   Min.   :18.00  
##  PESQUERIA   : 39   1st Qu.:  13.00   1st Qu.: 1.000   1st Qu.:23.00  
##  JUAREZ      : 38   Median :  22.00   Median : 1.000   Median :30.00  
##  GUADALUPE   : 17   Mean   :  72.28   Mean   : 2.898   Mean   :32.89  
##  RAMOS ARIZPE: 15   3rd Qu.:  54.00   3rd Qu.: 2.000   3rd Qu.:41.00  
##  MONTERREY   :  6   Max.   :1861.00   Max.   :63.000   Max.   :74.00  
##  (Other)     : 11
describe(bajas)
##                 vars   n   mean     sd median trimmed   mad    min     max
## Motivo de Baja*    1 279   4.80   0.85   5.00    5.00  0.00   1.00    5.00
## Puesto*            2 391   8.70   6.69   6.00    6.80  0.00   1.00   31.00
## Dpto*              3 137  13.43   6.86  16.00   13.54  7.41   1.00   24.00
## SD                 4 391 200.16  23.65 217.64  202.12  0.00 144.45  337.05
## Estado_Civil*      5 391   2.91   0.74   3.00    2.89  1.48   1.00    4.00
## Genero*            6 391   1.47   0.50   1.00    1.47  0.00   1.00    2.00
## Año*               7 391   1.71   0.45   2.00    1.77  0.00   1.00    2.00
## Estado*            8 391   1.95   0.23   2.00    2.00  0.00   1.00    2.00
## Municipio*         9 391   2.66   2.58   1.00    2.21  0.00   1.00   10.00
## Dias_trabajados   10 391  72.28 168.61  22.00   34.09 17.79   1.00 1861.00
## Meses             11 391   2.90   5.64   1.00    1.57  0.00   1.00   63.00
## Edad              12 391  32.89  11.44  30.00   31.68 11.86  18.00   74.00
##                  range  skew kurtosis   se
## Motivo de Baja*    4.0 -4.09    15.11 0.05
## Puesto*           30.0  2.32     3.97 0.34
## Dpto*             23.0 -0.28    -1.27 0.59
## SD               192.6  0.06     1.95 1.20
## Estado_Civil*      3.0  0.03    -0.91 0.04
## Genero*            1.0  0.11    -1.99 0.03
## Año*               1.0 -0.94    -1.12 0.02
## Estado*            1.0 -3.94    13.59 0.01
## Municipio*         9.0  1.14    -0.22 0.13
## Dias_trabajados 1860.0  5.67    42.71 8.53
## Meses             62.0  5.70    43.29 0.29
## Edad              56.0  0.80    -0.21 0.58

Aquí se observan por cada variable valores como: promedio, desviación estándar, mediana, min, max, etc.

Medidas de dispersión

#Aquí calculé de la variable Dias_trabajados sus medidas de dispersión.
media <- mean(bajas$Dias_trabajados)
media # 72.27621
## [1] 72.27621
desviacion_estandar <- sd(bajas$Dias_trabajados)
desviacion_estandar # 168.6122
## [1] 168.6122
coeficiente_variacion <- (desviacion_estandar / media) * 100
coeficiente_variacion  # 233.2886
## [1] 233.2886
rango <- range(bajas$Dias_trabajados)
rango # 1 1861
## [1]    1 1861
varianza <- var(bajas$Dias_trabajados)
varianza # 28430.06
## [1] 28430.06

La variable dependiente es Dias_trabajados y sus medidas de dispersión son las siguientes:
* Media: 72.27621
* Desviación estándar: 168.6122
* Coeficiente de variación: 233.2886
* Rango: 1 1861
* Varianza: 28430.06

Estos datos podemos interpretarlos de la siguiente manera:
* Los antiguos empleados llevaban en promedio de 72 días trabajando.
* Los valores están dispersos en aprox. 168 días de la media.
* Hay una alta variablilidad en relación con la media.
* Los días trabajados de los antiguos empleados van desde 1 día hasta 1861 días.
* La varianza nos dice que los valores varían en 28430 días al cuadrado respecto a la media.

Gráficos

En esta gráfica se puede observar la distribución de bajas segmentadas por salario diario, donde es notoria una tendencia hacia valores menores. El comportamiento de esta variable es muy marcado, la mediana se encuentra en $217.6, siendo este el mismo valor encontrado en el 3er cuartil, haciendo que los valores que se encuentren después del grupo más frecuente del histograma se puedan hasta considerar valores atípicos.

En esta gráfica se puede observar que no existe una alta diferencia de género en las bajas registradas en 2022 y 2023, por lo que se puede inferir que no serían altamente significativas para la clasificación por si solas. Estas variables pueden tener mayor impacto considerando en conjunto otras variables como Estado Civil y/o Edad.

En esta gráfica se puede observar que existe una tendencia para el estado civil de soltera/o para ser una baja, mientras que existen muy pocos registros de personas divorciadas siendo bajas en la empresa. Se podría realizar un análisis con más variables.

En el histograma de Edad podemos observar que la variable no cuenta con una distribución normal, sino que tiene un sesgo de cola derecha, haciendo clara la diferencia de bajas entre los grupos de edades, siendo más común tener una baja de personal entre 20-30 años de edad. Sería interesante analizar cuestiones generacionales y su respuesta hacia ciertas compensaciones.

Se observa que de las personas que renuncian en Monterrey, la mediana es de alrededor de 55 años. En los demás Municipios las personas que renuncian tienen una edad más pequeña (entre 20 y 40 años), son más jóvenes.

Se observa que tanto hombres como mujeres tienen una mediana similar en la cantidad de meses a los que renuncian.

Se observa que las personas solteras duran un poco más antes de renuciar que las personas que están casadas o en unión libre. Cabe resaltar que, la diferencia de días entre los que renuncia una persona soltera y alguien con otro estado civil difiere en muy poca cantidad. También, es importante resaltar que son muy pocas personas divorciadas que han renunciado.

El departamento de calidad es el departamento con más número de bajas. Su número de bajas es bastante significativo en comparación con los otros departamentos.

Tablas (frecuencia, contingencia)

  • Tabla de contingencia: Situación de Genero vs. Motivo de baja
##                                       
##                                        FEMENINO MASCULINO Sum
##   Inducida                                    4         8  12
##   Inducida (Faltas no dio los tiempos)        1         0   1
##   Inducida (Faltas)                           0         2   2
##   Inducida.                                   1         0   1
##   Separacion voluntaria                     140       123 263
##   Sum                                       146       133 279

Se observa que el principal motivo de renuncia fue separación voluntaria tanto para hombres como para mujeres.

  • Tabla de frecuencia: Año
## 
## 2022 2023 
##  112  279

Se observa que hubo más renuncias en 2023, de hecho, la cantidad de bajas fue más del doble que en 2022.

Base de datos Ventas

Estadísticas descriptivas

colSums(is.na(ventas))
##      Fecha     Carton Retornable  Servicios      Total 
##          0         15         15         24          3
summary(ventas)
##      Fecha                         Carton          Retornable     
##  Min.   :2020-01-01 00:00:00   Min.   :4247178   Min.   : 182166  
##  1st Qu.:2020-09-23 12:00:00   1st Qu.:5109380   1st Qu.: 892584  
##  Median :2021-06-16 00:00:00   Median :5967880   Median :1238011  
##  Mean   :2021-06-16 10:40:00   Mean   :6065727   Mean   :1981658  
##  3rd Qu.:2022-03-08 18:00:00   3rd Qu.:6823014   3rd Qu.:3200035  
##  Max.   :2022-12-01 00:00:00   Max.   :8873296   Max.   :5304410  
##                                NA's   :15        NA's   :15       
##    Servicios           Total         
##  Min.   :  13500   Min.   : 2235669  
##  1st Qu.:  38945   1st Qu.: 6358278  
##  Median :  99213   Median : 7872345  
##  Mean   : 368072   Mean   : 7841740  
##  3rd Qu.: 509159   3rd Qu.: 9219847  
##  Max.   :1375979   Max.   :12285123  
##  NA's   :24        NA's   :3

Medidas de dispersión

range(na.omit(ventas$Total))
## [1]  2235669 12285123
sd(na.omit(ventas$Total))
## [1] 2227534
var(na.omit(ventas$Total))
## [1] 4961909722941
median(na.omit(ventas$Total))
## [1] 7872345
median(na.omit(ventas$Carton))
## [1] 5967880
median(na.omit(ventas$Retornable))
## [1] 1238011
median(na.omit(ventas$Servicios))
## [1] 99212.5
range(na.omit(ventas$Carton))
## [1] 4247178 8873296
range(na.omit(ventas$Retornable))
## [1]  182166 5304410
range(na.omit(ventas$Servicios))
## [1]   13500 1375979

Estos datos podemos interpretarlos de la siguiente manera:
* Las ventas totales promedio son de $7, 872, 345.
* Los valores están dispersos en aprox. $2, 227, 534 de la media.
* Las ventas van desde los $2,235,669 hasta los $12,285,123 por mes entre 2020-2022.

Visualización

numeric_columns <- sapply(ventas, is.numeric)
numeric_data <- ventas[, numeric_columns]
correlation_matrix <- cor(na.omit(numeric_data))
corrplot(correlation_matrix)

La variable con mayor correlación al total de ventas es el cartón.

# Crear un histograma de ventas por mes
ggplot(ventas, aes(x = ventas$Fecha,"%Y", y = ventas$Carton)) +
  geom_bar(stat = "identity", fill = "orange") +
  labs(title = "Ventas de Carton por Mes",
       x = "Mes",
       y = "Ventas Carton") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1)) + 
  scale_y_continuous(labels = scales::comma) +
  theme_minimal()

Aunque podemos notar que en 2022 aumentaron las ventas en cartón, siguen habiendo fluctuaciones conforme pasan los meses.

# Calcular la suma de las ventas de cada producto
suma_ventas <- colSums(ventas[, c("Carton", "Retornable", "Servicios")], na.rm = TRUE)

# Crear un dataframe con los totales de ventas para cada producto
ventas_totales <- data.frame(producto = names(suma_ventas), ventas = suma_ventas)

colores_naranjas <- c("#FFA500", "#FF7F50", "#FDFD96")  # Puedes ajustar estos códigos de color según tus preferencias

# Crear el gráfico con la paleta de colores naranjas
ggplot(ventas_totales, aes(x = "", y = ventas, fill = producto)) +
  geom_col(width = 1) +
  coord_polar(theta = "y") +
  labs(title = "Comparación de Ventas Totales",
       fill = "Producto",
       x = NULL,
       y = NULL) +
  scale_fill_manual(values = colores_naranjas) +  # Usar la paleta de colores naranjas definida anteriormente
  theme_minimal() +
  theme(axis.text.x = element_blank(), 
        axis.ticks.x = element_blank())

Las ventas totales se distribuyen en aproximadamente 75% de cartón, y el resto en retornable y servicios respectivamente.

# Separar el año de la columna de fecha
ventas$Año <- format(ventas$Fecha, "%Y")

# Calcular las ventas totales por año
ventas_por_año <- ventas %>%
  group_by(Año) %>%
  summarise(ventas_totales = sum(na.omit(Retornable)))

# Crear un histograma de ventas por año
ggplot(ventas_por_año, aes(x = Año, y = ventas_totales)) +
  geom_bar(stat = "identity", fill = "orange") +
  labs(title = "VENTAS DE RETORNABLE POR AÑO",
       x = "AÑO",
       y = "SUMA DE RETORNABLE") +
  scale_y_continuous(labels = scales::comma) + 
  theme_minimal()

Es importante tomar en cuenta que en 2022 no tenemos los datos de los últimos 3 meses. Sin embargo, las ventas de retornables es notablemente mayor en 2021.

Predicción de ventas

# Ajustar un modelo de regresión lineal
modelo <- lm(Total ~ Carton + Retornable + Servicios, data = ventas)

# Hacer predicciones
nuevos_datos <- data.frame(Carton = c(5000000, 6000000,7000000), Retornable = c(1000000, 2000000, 3000000), Servicios = c(100000,500000,1000000))
predicciones <- predict(modelo, newdata = nuevos_datos)

# Mostrar las predicciones
print(predicciones)
##        1        2        3 
##  6062916  8432782 10906212

Las preguntas de análisis fueron las siguientes:

¿En qué año hubo más renuncias?

En el 2023 (279 bajas) hubo más bajas en comparación con el año 2022 (112 bajas).

¿Hay factores en común entre los empleados que no abandonan el empleo ?
  • Mientras más antigüedad tenga un empleado es más probable que no renuncie.
  • Mientras más edad tenga un empelado es más probable que no renuncie.
  • La mayoría residen en Apodaca.
  • La mayoría cuentan con escolaridad Secundaria.
  • La mayoría son solteros o casados.
  • No se sienten estresados.
  • Entraron a trabajar a FORM porque les queda cerca la empresa.
  • La mayoría se ubican en puestos de Producción.
  • La mayoría no ha experimentado situaciones de conflicto o acoso.
  • La mayoría tiene entre 20 y 30 años (este dato es interesante porque de los que renuncian la mayoría se encuentran en este rango de edad también, por lo que puede que la mayor parte de los trabajadores de FORM se encuentren en este intervalo de edad).
  • La mayoría de los empleados de FORM sienten alegría y confianza.
¿Hay factores en común entre los empleados que abandonan el empleo?
  • La mayoría recibía un salario diario entre $175 y $230 MXN.
  • La mayoría eran mujeres (igual que los empleados actuales que no han renunciado; esto sucede porque hay más mujeres que hombres en FORM).
  • La mayoría eran solteros o casados (igual que los empleados actuales; puede que de manera general, la mayoría de los empleados de FORM tengan estos estados civiles).
  • De las personas que renuncian en Monterrey, la mediana es de alrededor de 55 años. En los demás Municipios las personas que renuncian tienen una edad más pequeña (entre 20 y 40 años), son más jóvenes. (Cabe mencionar que, la mayoría de los empleados actuales de FORM tienen entre 20 y 30 años).
  • El departamento de calidad es el departamento con más número de bajas. Su número de bajas es bastante significativo en comparación con los otros departamentos.
  • La mayoría de los empleados, tanto hombres como mujeres, renunciaron por motivos de separación voluntaria.
¿En qué área de la empresa han sucedido más bajas?
  • El puesto “Ayudante general” es el departamento con más número de bajas (lo cual es obvio debido a que es el puesto con mayir número de empleados)
  • Actualmente hay más trabajadores en Puestos de Producción (Costurera, Ayudante General, Soldador), seguidos por puestos Especializados y de Administración.

Hallazgos

Principales hallazgos EDA

  • Como primer hallazgo que obtuve a lo largo de las bases de datos que fueron analizadas durante estos análisis exploratorios fue que la mayoría de las bases requirieron leves modificaciones tanto a la estructura de dichas bases como dentro de los mismos datos, una vez realizadas pudimos realizar adecuadamente el EDA, obteniendo los siguientes hallazgos…
  • En cuanto a la base de datos “encuesta” logramos identificar gracias a la matriz de confusión algunas relaciones, tomando en cuenta cuales son las principales problemáticas presentadas por el S.F. aquellas con relaciones con mayor relevancia son:
    ** Sigue trabajando con prestaciones, salario, estrés, antiguedad y edad
    ** Percepción de salario con razón de ingreso
    ** Nivel de estrés con salario, prestaciones y herramientas
    Estos niveles de relaciones pueden ser un primer acercamiento a posibles explicaciones de como se comporta nuestra población y cuales son las razones que pudiesen estar provocando el nacimiento de la situación problema.
  • Los análisis de emociones no generaron información valiosa o alertante que explique directamente la situación problema.
  • En el caso de la base de datos “Bajas” buscamos poder explicar la variable dependiente que en este caso son la cantidad de días trabajados por lo que identificar correctamente la realcion e impacto que otras variables tienen sobre esta es fundamental durante la segunda parte del EDA, durante los gráficos podemos observar que los días en los que la gente renuncia son números muy bajos y alertantes.
  • No hay información suficiente para decir que existe una relación entre bajas y género, pero sí existe una relación entre bajas y estado civil.
  • En cuanto a la base de datos de ventas, podemos observar una tendencia a la alza en temporalidades grandes a pesar de que en temporalidades bajas contamos con una alta volatilidad o cambios más significativos, esto podría sugerir algún tipo de estacionalidad.
  • Las ventas de “retornable” no son la principal fuente de ingresos de FORM, sin embargo muestran ser más constantes y estables.

Relación predicción nearshoring y S.P. del socio formador

  • Como podemos observar el flujo de Foreing Direct Investment ha mostrado una fluctuación bastante grande a lo largo de los años, podemos observar outliers en algunos años que precisamente coinciden con eventos únicos y externos que no podemos controlar, sin embargo mediante el pronóstico realizado podemos observar que la inversión extranjerae continuará con una tendencia neutra o demasiado baja pero positiva, es decir que no se llegan a pronosticar picos o alguna tendencia con inclinación considerablemente alte pero podemos observar que los valores continuarán siendo positivos y constantes, esto se relaciona directamente a la situación problema expuesta pode el socio formador en cuanto al pronóstico de ventas que podemos lograr si aprovechamos este tentativo comportamiento constante para poder anticiparnos a la demanda del mercado lo cual pudiera posicionnar a FORM en una ventaja competitiva bastante valiosa.

Referencias

FORM. “The Form Way -.” Form, 23 Aug. 2021, form.com.mx/the-form-way/ Accessed 7 Mar. 2024.

Navarrete, F. (2024, 8 febrero). México ‘se pone las pilas’: producción de autos eléctricos acelera 36%. El Financiero. Recuperado 7 de marzo de 2024, de https://www.elfinanciero.com.mx/empresas/2024/02/07/mexico-se-pone-las-pilas-produccion-de-autos-electricos-acelera-36/

Plerk. (2023, 30 enero). 3 leyes laborales en México que debes conocer. El Economista. Recuperado 7 de marzo de 2024, de https://es.linkedin.com/pulse/3-leyes-laborales-en-m%C3%A9xico-que-debes-conocer-plerk

Anónimo (2024). Lissely Ancira: Transformando el horizonte energético de Nuevo Leon. El financiero. Recuperado de :https://www.elfinanciero.com.mx/monterrey/2024/01/26/lissely-ancira-transformando-el-horizonte-energetico-de-nuevo-leon/

Israel Zamarrón (Octubre 2023). Nearshoring en México: estos son los beneficios que podría obtener el país a 2030. Forbes México. Recuperado de: https://www.forbes.com.mx/nearshoring-en-mexico-estos-son-los-beneficios-que-podria-obtener-el-pais-a-2030/

Anónimo.(2023). Energia verde, soluciones disponibles en México. Enel, recuperado de: https://www.enel.mx/es/blog/conociendo-el-mercado-energetico/Energia-verde-soluciones-disponibles-en-Mexico

De Luna, T. (2024, 7 febrero). La exportación de autos hechos en México toca una cifra histórica. Expansión. Recuperado 7 de marzo de 2024, de https://expansion.mx/empresas/2024/02/07/exportacion-autos-hechos-mexico-cifra-historica

Cantera, S. (2024, 10 enero). Proyectan fabricar 4.1 millones de autos nuevos durante 2024. El Universal. https://www.eluniversal.com.mx/cartera/proyectan-fabricar-41-millones-de-autos-nuevos-durante-2024/

Thomson Reuters Mexico. (s. f.). Nearshoring: La solución actual para el comercio exterior. https://www.thomsonreutersmexico.com/es-mx/soluciones-de-comercio-exterior/blog-comercio-exterior/nearshoring-la-solucion-actual-para-el-comercio-exteior#:~:text=%C2%BFQu%C3%A9%20es%20nearshoring%3F,con%20una%20zona%20horaria%20semejante.

Martínez, A., Martínez, A., & Martínez, A. (2023, 20 septiembre). ¿Por qué hay una huelga automotriz en Estados Unidos contra GM, Ford y Stellantis? El País México. https://elpais.com/mexico/2023-09-20/por-que-hay-una-huelga-automotriz-en-estados-unidos-contra-gm-ford-y-stellantis.html

Metalmecánica. (2023, 26 julio). Norteamérica en marcha hacia la sostenibilidad automotrizbr. Metalmecánica. https://www.metalmecanica.com/es/noticias/norteamerica-en-marcha-hacia-la-sostenibilidad-automotriz

Teleuniverso. (2024, 3 febrero). Cambios demográficos marcará una era en Estados Unidos. @Teleuniverso. https://teleuniversotv.com/cambios-demograficos-marcara-una-era-en-estados-unidos/

LS0tDQp0aXRsZTogIkV2aWRlbmNpYSAxIg0KYXV0aG9yOiAiTHVpcyBEYXZpZCBTw6FuY2hleiBDYXN0aWxsbyAtIEEwMTI3NTY1NSAtIEVxdWlwbyAzIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IFRSVUUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQotLS0NCiFbXShDOlxcVXNlcnNcXEx1aXNEXFxEb2N1bWVudHNcXENvbmNlbnRyYWNpw7NuXFxmb3JtMS5qcGcpDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCB3YXJuaW5nPUZBTFNFKQ0KYGBgDQoNCmBgYHtyIExpYnJlcmlhcywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHh0cykNCmxpYnJhcnkoZHlncmFwaHMpDQpsaWJyYXJ5KHRzZXJpZXMpDQpsaWJyYXJ5KGZvcmVjYXN0KQ0KbGlicmFyeSh6b28pDQpsaWJyYXJ5KGNvcnJwbG90KQ0KbGlicmFyeShnZ3B1YnIpDQpgYGANCg0KIyBJbnRyb2R1Y2Npw7NuDQoNCiMjIFByZWd1bnRhcyAgDQogKirCv1F1w6kgZXMgdW4gYW7DoWxpc2lzIGV4cGxvcmF0b3JpbyBkZSBsb3MgZGF0b3M/KiogIA0KDQpFbCBBbsOhbGlzaXMgRXhwbG9yYXRvcmlvIGRlIGxvcyBEYXRvcyAoKipFREEqKiBwb3Igc3VzIHNpZ2xhcyBlbiBpbmdsw6lzKSBlcyB1biAqKnByb2Nlc28gY3LDrXRpY28qKiBhIGxhIGhvcmEgZGUgKiptYW5pcHVsYXIgZGF0YXNldHMqKiwgZW4gZWwgY3VhbCBzZSBzdWVsZW4gaW1wbGVtZW50YXIgZGlzdGludGFzIHTDqWNuaWNhcyBkZSAqKnZpc3VhbGl6YWNpw7NuKiogY29uIGVsIGZpbiBkZSB0ZW5lciB1biAqKnByaW1lciBhY2VyY2FtaWVudG8qKiBjb24gZWwgY29uanVudG8gZGUgZGF0b3MgeSBzdXMgdmFyaWFibGVzLCBpZGVudGlmaWNhbmRvICoqcGF0cm9uZXMqKiBvIGVsICoqY29tcG9ydGFtaWVudG8qKiBlbiBnZW5lcmFsIGRlIGVzdGFzLCBwYXJhIGxvZ3JhciBlc3RvIHBvZGVtb3MgaGFjZXIgdXNvIGRlIGxhcyBtZWRpZGFzIGRlc2NyaXB0aXZhcyB5IGRlIGRpc3BlcnNpw7NuIGFzw60gY29tbyBsYSBpbXBsZW1lbnRhY2nDs24gZGUgZ3LDoWZpY29zIHF1ZSBmYWNpbGl0ZW4gbGEgY29tcHJlbnNpw7NuIHZpc3VhbCBkZSBwYXRyb25lcywgYW5vbWFsw61hcyB5IGNvbWVuemFyIGEgZ2VuZXJhciBzdXBvc2ljaW9uZXMgY29ycmVjdGFzIHNvYnJlIGxvcyBkYXRvcy4gICAgDQogIA0KICoqwr9Dw7NtbyBjb250cmlidXllIGVsIGFuw6FsaXNpcyBleHBsb3JhdG9yaW8gZGUgbG9zIGRhdG9zIGEgbWVqb3JhciBlbCBwcm9jZXNvIHkgbG9zIHJlc3VsdGFkb3MgZGUgYW5hbMOtdGljYSBkZXNjcmlwdGl2YT8qKiAgDQoNCkVsIEVEQSBlcyBwYXJ0ZSBmdW5kYW1lbnRhbCBkZSBjdWFscXVpZXIgYW7DoWxpc2lzIGRlIGRhdG9zLCBwdWVzIG1lZGlhbnRlIGVzdGUgbWlzbW8gZXMgcXVlIHNlIHRpZW5lIHVuIHByaW1lciBhY2VyY2FtaWVudG8gY29uIGxvcyBkYXRvcyBsb2dyYW5kbyBjb25vY2VyIHN1cyAqKnByaW5jaXBhbGVzIGNhcmFjdGVyw61zdGljYXMqKiBjb21vIGVzdHJ1Y3R1cmEgZGUgbG9zIGRhdG9zLCB0aXBvcyBkZSAqKnZhcmlhYmxlcyoqIHkgbGFzICoqcmVsYWNpb25lcyoqIHF1ZSBleGlzdGVuIGVudHJlIGVsbGFzLCBlbnRyZSBvdGFzIG11Y2hhcyBxdWUgcG9kZW1vcyBkZXNjdWJyaXIgZ3JhY2lhcyBhIGxhIGltcGxlbWVudGFjacOzbiBkZSBkaXZlcnNvcyAqKm3DqXRvZG9zIGRlIHZpc3VhbGl6YWNpw7NuKiosIHVuYSB2ZXogY29uY2x1aWRvIGVsIEVEQSBzZSBlc3BlcmEgdGVuZXIgdW5hIG1lam9yICoqbm9jacOzbioqIGRlIGxhIG5hdHVyYWxlemEgZGUgbG9zIGRhdG9zIHkgY29tbyAqKm1hbmlwdWxhciBsb3MgZGF0YXNldHMqKiBkZSBsYSBtZWpvciBtYW5lcmEgcG9zaWJsZSwgZGUgZXN0YSBtYW5lcmEgbG9ncmFtb3MgdW5hICoqY29tcHJlbnNpw7NuIHPDs2xpZGEgeSBjb21wbGV0YSoqIGRlIGxvcyBkYXRvcyBjb24gbG9zIHF1ZSBzZSBlc3RhcsOhbiB0cmFiYWphbmRvIGR1cmFudGUgbGFzIHNpZ3VpZW50ZXMgZXRhcGFzIGRlbCBwcm95ZWN0by4gIA0KDQoNCg0KIyMgQW50ZWNlZGVudGVzIEZPUk0NCg0KKipWaXNpw7NuOioqIEVuIDIwMzMgc2VyZW1vcyB1bmEgZGUgbGFzIGNpbmNvIG1lam9yZXMgY29tcGHDscOtYXMgZGUgTcOpeGljbyBxdWUgZ2VuZXJhbiB2YWxvciBkZW50cm8gZGUgbGEgY2FkZW5hIGRlIHN1bWluaXN0cm8gZGUgbGFzIGluZHVzdHJpYXMgcXVlIG3DoXMgdmFsb3JhbiBsYSBmb3JtYSBlbiBsYSBxdWUgc2UgcHJvdGVnZW4geSB0cmFzbGFkYW4gbGFzIGNvc2FzLiAgDQoNCioqTWlzacOzbjoqKiBUcmFuc2Zvcm1hciBudWVzdHJvIGVudG9ybm8geSByZXNvbHZlciByZXRvcyBpbmR1c3RyaWFsZXMgZGUgbnVlc3Ryb3MgY2xpZW50ZXMgYSB0cmF2w6lzIGRlIGxhIGNvbGFib3JhY2nDs24sIHByb3ZvY2FuZG8gbnVldmFzIG9wb3J0dW5pZGFkZXMgcXVlIHBvdGVuY2lhbiBudWVzdHJvIG1vZGVsbyBkZSBuZWdvY2lvLCBwYXJhIGFsY2FuemFyIG51ZXN0cm9zIGlkZWFsZXMuICANCg0KKipPamV0aXZvcyBlc3RyYXTDqWdpY29zOioqICANCiogKkltcHVsc28gU29zdGVuaWJsZSBlIElubm92YWRvcjoqIERlc2Fycm9sbGFyIGUgaW1wbGVtZW50YXIgc29sdWNpb25lcyBkZSBlbXBhcXVlIGF1dG9tb3RyaXogcXVlIGZ1c2lvbmVuIGxhIHN1c3RlbnRhYmlsaWRhZCB5IGxhIGlubm92YWNpw7NuLCBwcmlvcml6YW5kbyBsYSBhZG9wY2nDs24gZGUgbWF0ZXJpYWxlcyBlY29hbWlnYWJsZXMgeSBsYSBjb25zdGFudGUgYsO6c3F1ZWRhIGRlIG51ZXZhcyB0ZWNub2xvZ8OtYXMgcGFyYSByZWR1Y2lyIGVsIGltcGFjdG8gYW1iaWVudGFsIHkgbWVqb3JhciBsYSBlZmljaWVuY2lhIGVuIHRvZGEgbGEgY2FkZW5hIGRlIHN1bWluaXN0cm8uICANCg0KKiAqRWZlY3RpdmlkYWQgeSBDYWxpZGFkIENvbGFib3JhdGl2YXM6KiBJbXBsZW1lbnRhciBwcsOhY3RpY2FzIHF1ZSBwb3RlbmNpZW4gbGEgZWZlY3RpdmlkYWQgb3BlcmF0aXZhIHkgbGEgZXhjZWxlbmNpYSBlbiBsYSBjYWxpZGFkIGRlbCBlbXBhcXVlIGF1dG9tb3RyaXosIGFzZWd1cmFuZG8gcXVlIGNhZGEgcHJvY2VzbyBjb250cmlidXlhIGEgbGEgZWZpY2llbmNpYSB0b3RhbCB5IGEgbGEgc2F0aXNmYWNjacOzbiBkZWwgY2xpZW50ZS4gIA0KDQoqICpEZXNhcnJvbGxvIEludGVncmFsIGRlbCBQZXJzb25hbDoqIEZvbWVudGFyIHVuIGVudG9ybm8gbGFib3JhbCBxdWUgcHJvbXVldmEgbGEgaW50ZWdyaWRhZCwgbGEgdHJhbnNwYXJlbmNpYSB5IGVsIGRlc2Fycm9sbG8gY29udGludW8gZGUgbG9zIGNvbGFib3JhZG9yZXMsIGNvbnRyaWJ1eWVuZG8gYSBsYSByZXRlbmNpw7NuIGRlIHRhbGVudG8geSBhbCBmb3J0YWxlY2ltaWVudG8gZGUgbGEgY3VsdHVyYSBvcmdhbml6YWNpb25hbC4gIA0KDQoNCg0KIyMgQ29udGV4dG8gZGUgbGEgSW5kdXN0cmlhDQoNCkxhcyBmdWVudGVzIGRlIGRhdG9zIHV0aWxpemFkYXMgcGFyYSByZWFsaXphciBsb3MgZ3LDoWZpY29zIGZ1ZXJvbjogbWV4X2V4cG9ydHNfYXV0b3BhcnRzLCBJbXBvcnRlcnMgb2YgQ2FydG9ucyBib3hlcyBvZiBjb3JydWdhdGVkIHBhcGVyIG9yIGJvYXJkIDIwMjAtMjAyMSwgRXhwb3J0ZXJzIG9mIENhcnRvbnMgYm94ZXMgb2YgY29ycnVnYXRlZCBwYXBlciBvciBib2FyZCAyMDIwLTIwMjEsIG14X2F1dG9tb3RpdmVfaW5kdXN0cnksIHkgVVNfQXV0b19Qcm9kdWN0aW9uX1NhbGVzLiAgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQppbXBvcnRfY2FydG9uIDwtIHJlYWQuY3N2KCJDOlxcVXNlcnNcXEx1aXNEXFxEb2N1bWVudHNcXENvbmNlbnRyYWNpw7NuXFxSRVRPXFxJbXBvcnRlcnMgb2YgQ2FydG9ucyBib3hlcyBjYXNlcyBvZiBjb3JydWdhdGVkIHBhcGVyIG9yIGJvYXJkIDIwMjAtMjAyMS5jc3YiKQ0KZXhwb3J0X2NhcnRvbiA8LSByZWFkLmNzdigiQzpcXFVzZXJzXFxMdWlzRFxcRG9jdW1lbnRzXFxDb25jZW50cmFjacOzblxcUkVUT1xcRXhwb3J0ZXJzIG9mIENhcnRvbiBib3hlcyBjYXNlcyBvZiBjb3JydWdhdGVkIHBhcGVyIG9yIGJvYXJkIDIwMjAtMjAyMS5jc3YiKQ0KbWV4X2V4cF9hdXRvcGFydHMgPC0gcmVhZC5jc3YoIkM6XFxVc2Vyc1xcTHVpc0RcXERvY3VtZW50c1xcQ29uY2VudHJhY2nDs25cXFJFVE9cXG1leF9leHBvcnRzX2F1dG9wYXJ0cy5jc3YiKQ0KZGYgPC0gcmVhZC5jc3YoIkM6XFxVc2Vyc1xcTHVpc0RcXERvY3VtZW50c1xcQ29uY2VudHJhY2nDs25cXFJFVE9cXGluZGF1dG8uY3N2IikNCmRmMSA8LSByZWFkLmNzdigiQzpcXFVzZXJzXFxMdWlzRFxcRG9jdW1lbnRzXFxDb25jZW50cmFjacOzblxcUkVUT1xcTGlicm8yLmNzdiIpDQp2ZW50YXMgPSByZWFkeGw6OnJlYWRfeGxzeCgiQzpcXFVzZXJzXFxMdWlzRFxcRG9jdW1lbnRzXFxDb25jZW50cmFjacOzblxcUkVUT1xcZm9ybV9iYWphcy54bHN4Iiwgc2hlZXQgPSAiVmVudGFzX21lbnN1YWxlcyIpDQpOZWFyc2hvcmluZyA9IHJlYWR4bDo6cmVhZF94bHN4KCJDOlxcVXNlcnNcXEx1aXNEXFxEb2N1bWVudHNcXENvbmNlbnRyYWNpw7NuXFxSRVRPXFxpZWRfY2FydG9uX3BhcGVsXzIwMjMueGxzeCIpDQpgYGANCg0KIyMjIENhcnTDs24NCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIENhbGN1bGFyIGxhIHN1bWEgZGUgVHJhZGUuVmFsdWUgcG9yIGNvbnRpbmVudGUgcGFyYSBleHBvcnRhY2lvbmVzDQp0b3RhbF9wb3JfY29udGluZW50ZV9leHBvcnRhY2lvbmVzIDwtIGFnZ3JlZ2F0ZShUcmFkZS5WYWx1ZSB+IENvbnRpbmVudCwgZGF0YSA9IGV4cG9ydF9jYXJ0b24sIHN1bSkNCg0KIyBDcmVhciB1biBkYXRhZnJhbWUgcGFyYSBlbCBncsOhZmljbyBkZSBwaWUNCnBpZV9kYXRhIDwtIGRhdGEuZnJhbWUobGFiZWxzID0gdG90YWxfcG9yX2NvbnRpbmVudGVfZXhwb3J0YWNpb25lcyRDb250aW5lbnQsIHZhbHVlcyA9IHRvdGFsX3Bvcl9jb250aW5lbnRlX2V4cG9ydGFjaW9uZXMkVHJhZGUuVmFsdWUpDQoNCiMgQ2FsY3VsYXIgcG9yY2VudGFqZXMNCnBpZV9kYXRhJHBlcmNlbnRhZ2VzIDwtIChwaWVfZGF0YSR2YWx1ZXMgLyBzdW0ocGllX2RhdGEkdmFsdWVzKSkgKiAxMDANCg0KIyBDcmVhciBncsOhZmljb3MgaW5kaXZpZHVhbGVzDQpkaXN0X2V4cCA8LSBnZ3Bsb3QocGllX2RhdGEsIGFlcyh4ID0gIiIsIHkgPSB2YWx1ZXMsIGZpbGwgPSBsYWJlbHMpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCB3aWR0aCA9IDEpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBhc3RlMChyb3VuZChwZXJjZW50YWdlcywgMSksICIlIikpLA0KICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSkpICsNCiAgY29vcmRfcG9sYXIoInkiKSArDQogIGdndGl0bGUoIkV4cG9ydGFjaW9uZXMgcG9yIENvbnRpbmVudGUiKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBDYWxjdWxhciBsYSBzdW1hIGRlIFRyYWRlLlZhbHVlIHBvciBjb250aW5lbnRlIHBhcmEgZXhwb3J0YWNpb25lcw0KdG90YWxfcG9yX2NvbnRpbmVudGVfZXhwb3J0YWNpb25lcyA8LSBhZ2dyZWdhdGUoVHJhZGUuVmFsdWUgfiBDb250aW5lbnQsIGRhdGEgPSBpbXBvcnRfY2FydG9uLCBzdW0pDQoNCiMgQ3JlYXIgdW4gZGF0YWZyYW1lIHBhcmEgZWwgZ3LDoWZpY28gZGUgcGllDQpwaWVfZGF0YSA8LSBkYXRhLmZyYW1lKGxhYmVscyA9IHRvdGFsX3Bvcl9jb250aW5lbnRlX2V4cG9ydGFjaW9uZXMkQ29udGluZW50LCB2YWx1ZXMgPSB0b3RhbF9wb3JfY29udGluZW50ZV9leHBvcnRhY2lvbmVzJFRyYWRlLlZhbHVlKQ0KDQojIENhbGN1bGFyIHBvcmNlbnRhamVzDQpwaWVfZGF0YSRwZXJjZW50YWdlcyA8LSAocGllX2RhdGEkdmFsdWVzIC8gc3VtKHBpZV9kYXRhJHZhbHVlcykpICogMTAwDQoNCmRpc3RfaW1wIDwtIGdncGxvdChwaWVfZGF0YSwgYWVzKHggPSAiIiwgeSA9IHZhbHVlcywgZmlsbCA9IGxhYmVscykpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHdpZHRoID0gMSkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGFzdGUwKHJvdW5kKHBlcmNlbnRhZ2VzLCAxKSwgIiUiKSksDQogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSkgKw0KICBjb29yZF9wb2xhcigieSIpICsNCiAgZ2d0aXRsZSgiSW1wb3J0YWNpb25lcyBwb3IgQ29udGluZW50ZSIpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gYygwLjg1LCAwLjIpLCBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpDQoNCmNvbWJpbmVkX3Bsb3QgPC0gY293cGxvdDo6cGxvdF9ncmlkKGRpc3RfZXhwLCBkaXN0X2ltcCwgbmNvbCA9IDIsIHJlbF93aWR0aHMgPSBjKDAuOCwgMC44KSkNCnByaW50KGNvbWJpbmVkX3Bsb3QpDQpgYGANCg0KTG9zIFRvcCA1IHBhw61zZXMgY29uIG1heW9yZXMgZXhwb3J0YWNpb25lcyBkZSBjYXJ0w7NuIGR1cmFudGUgZWwgMjAyMCB5IGVsIDIwMjEgY29uIHN1cyByZXNwZWN0aXZhcyBjYW50aWRhZGVzIGZ1ZXJvbjogQ2hpbmEgKDEsNTkzLDA1Miw3NjcpLCBBbGVtYW5pYSAoMSw0MTMsMDM1LDcyOCksICBFc3RhZG9zIFVuaWRvcyAoMSwzMTksMDcxLDgxMiksIFBhw61zZXMgQmFqb3MgKDY1MSw1NTgsNTA5KSwgUG9sb25pYSAoNjA5LDA4NCw2NjEpLiAgDQoNCkxvcyBUb3AgNSBwYcOtc2VzIGNvbiBtYXlvcmVzIGltcG9ydGFjaW9uZXMgZGUgY2FydMOzbiBkdXJhbnRlIGVsIDIwMjAgeSBlbCAyMDIxIGNvbiBzdXMgcmVzcGVjdGl2YXMgY2FudGlkYWRlcyBmdWVyb246IEFsZW1hbmlhICg5ODksMjMzLDI4OCksIEVzdGFkb3MgVW5pZG9zICg5NTYsNDgxLDk1NyksIFBhw61zZXMgQmFqb3MgKDg1MCwxNjksNjM3KSwgTcOpeGljbyAoNzc4LDkxMSwxMzgpLCBGcmFuY2lhICg2ODIxMzUzNTApICANCg0KRW4gZXN0YSBzZWNjacOzbiBzZSBvYnNlcnbDsyBxdWUgcGFyYSBsYXMgZXhwb3J0YWNpb25lcywgRXVyb3BhIHJlYWxpesOzIG3DoXMgZXhwb3J0YWNpb25lcywgcGVybyBsYSBjYW50aWRhZCBkZSBjb250ZW5pZG8gZXhwb3J0YWRvIGZ1ZSBtYXlvciBwb3IgcGFydGUgZGVsIGNvbnRpbmVudGUgQXNpw6F0aWNvLiBFbiBjdWFudG8gYSBsYXMgaW1wb3J0YWNpb25lcywgRXVyb3BhIGZ1ZSBlbCBwYcOtcyBjb24gbWF5b3JlcyBleHBvcnRhY2lvbmVzIHkgY29udGVuaWRvIGV4cG9ydGFkby4NCg0KDQojIyMgQXV0b3BhcnRlcw0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgRmlsdHJhciBkYXRvcyBwYXJhIGVsIGHDsW8gMjAyMQ0KZXhwb3J0XzIwMjEgPC0gbWV4X2V4cF9hdXRvcGFydHMgJT4lIGZpbHRlcih5ZWFyID09IDIwMjEpDQoNCiMgT2J0ZW5lciBlbCB0b3AgNSBkZSBlc3RhZG9zIGNvbiBtYXlvcmVzIGV4cG9ydGFjaW9uZXMgZW4gMjAyMQ0KdG9wNV8yMDIxIDwtIGV4cG9ydF8yMDIxICU+JQ0KICBncm91cF9ieShTdGF0ZSkgJT4lDQogIHN1bW1hcml6ZShUb3RhbF9FeHBvcnRhY2lvbmVzID0gc3VtKHRyYWRlX3ZhbHVlKSkgJT4lDQogIHRvcF9uKDUsIHd0ID0gVG90YWxfRXhwb3J0YWNpb25lcykgJT4lDQogIGFycmFuZ2UoZGVzYyhUb3RhbF9FeHBvcnRhY2lvbmVzKSkNCg0KIyBDcmVhciBncsOhZmljbyBkZSBiYXJyYXMgcGFyYSBlbCB0b3AgNSBkZSBlc3RhZG9zIGVuIDIwMjENCmdncGxvdCh0b3A1XzIwMjEsIGFlcyh4ID0gcmVvcmRlcihTdGF0ZSwgLVRvdGFsX0V4cG9ydGFjaW9uZXMpLCB5ID0gVG90YWxfRXhwb3J0YWNpb25lcywgZmlsbCA9IFN0YXRlKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKw0KICBsYWJzKHRpdGxlID0gIlRvcCA1IEVzdGFkb3MgY29uIE1heW9yIEV4cG9ydGFjacOzbiBkZSBBdXRvcGFydGVzIGVuIDIwMjEiLA0KICAgICAgIHggPSAiRXN0YWRvIiwNCiAgICAgICB5ID0gIlRvdGFsIGRlIEV4cG9ydGFjaW9uZXMiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQoNCiAgDQojIEZpbHRyYXIgZGF0b3MgcGFyYSBlbCBhw7FvIDIwMjINCmV4cG9ydF8yMDIyIDwtIG1leF9leHBfYXV0b3BhcnRzICU+JSBmaWx0ZXIoeWVhciA9PSAyMDIyKQ0KDQojIE9idGVuZXIgZWwgdG9wIDUgZGUgZXN0YWRvcyBjb24gbWF5b3JlcyBleHBvcnRhY2lvbmVzIGVuIDIwMjINCnRvcDVfMjAyMiA8LSBleHBvcnRfMjAyMiAlPiUNCiAgZ3JvdXBfYnkoU3RhdGUpICU+JQ0KICBzdW1tYXJpemUoVG90YWxfRXhwb3J0YWNpb25lcyA9IHN1bSh0cmFkZV92YWx1ZSkpICU+JQ0KICB0b3Bfbig1LCB3dCA9IFRvdGFsX0V4cG9ydGFjaW9uZXMpICU+JQ0KICBhcnJhbmdlKGRlc2MoVG90YWxfRXhwb3J0YWNpb25lcykpDQoNCiMgQ3JlYXIgZ3LDoWZpY28gZGUgYmFycmFzIHBhcmEgZWwgdG9wIDUgZGUgZXN0YWRvcyBlbiAyMDIyDQpnZ3Bsb3QodG9wNV8yMDIyLCBhZXMoeCA9IHJlb3JkZXIoU3RhdGUsIC1Ub3RhbF9FeHBvcnRhY2lvbmVzKSwgeSA9IFRvdGFsX0V4cG9ydGFjaW9uZXMsIGZpbGwgPSBTdGF0ZSkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsNCiAgbGFicyh0aXRsZSA9ICJUb3AgNSBFc3RhZG9zIGNvbiBNYXlvciBFeHBvcnRhY2nDs24gZGUgQXV0b3BhcnRlcyBlbiAyMDIyIiwNCiAgICAgICB4ID0gIkVzdGFkbyIsDQogICAgICAgeSA9ICJUb3RhbCBkZSBFeHBvcnRhY2lvbmVzIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KDQpgYGANCg0KTG9zIEVzdGFkb3MgZGUgTcOpeGljbyBxdWUgZXhwb3J0YXJvbiBtw6FzIGF1dG9wYXJ0ZXMgZW4gMjAyMSBmdWVyb24gQ29haHVpbGEsIFF1ZXLDqXRhcm8sIEd1YW5hanVhdG8sIENpdWRhZCBkZSBNw6l4aWNvIHkgTnVldm8gTGXDs24uIEVuIDIwMjIsIENvYWh1aWxhIHNlIG1hbnR1dm8gY29tbyBlbCBFc3RhZG8gcXVlIG3DoXMgZXhwb3J0YWNpb25lcyBkZSBhdXRvcGFydGVzIHJlYWxpesOzLCBzZWd1aWRvIHBvciBQdWVibGEsIFF1ZXLDqXRhcm8sIEd1YW5hanVhdG8geSBDaXVkYWQgZGUgTcOpeGljby4gICANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCiMgT3JkZW5hciBwb3IgbGEgY29sdW1uYSAnMjAyMScgZW4gb3JkZW4gZGVzY2VuZGVudGUgeSBzZWxlY2Npb25hciBsYXMgNSBwcmltZXJhcyBmaWxhcw0KdG9wNV9hdXRvcGFydGVzXzIwMjEgPC0gZGYxICU+JQ0KICBhcnJhbmdlKGRlc2MoYFgyMDIxYCkpICU+JQ0KICBzbGljZSgxOjUpDQp0b3A1X2F1dG9wYXJ0ZXNfMjAyMQ0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIENyZWFyIGdyw6FmaWNvIGRlIGJhcnJhcyBwYXJhIGVsIHRvcCA1IGRlIGF1dG9wYXJ0ZXMgZW4gMjAyMQ0KZ2dwbG90KHRvcDVfYXV0b3BhcnRlc18yMDIxLCBhZXMoeCA9IHJlb3JkZXIoQXV0b19QYXJ0LCAtYFgyMDIxYCksIHkgPSBgWDIwMjFgLCBmaWxsID0gQXV0b19QYXJ0KSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKw0KICBsYWJzKHRpdGxlID0gIlRvcCA1IEF1dG9wYXJ0ZXMgTcOhcyBFeHBvcnRhZGFzIGRlIEVFLlVVLiBlbiAyMDIxIiwNCiAgICAgICB4ID0gIkF1dG9wYXJ0ZSIsDQogICAgICAgeSA9ICJUb3RhbCBkZSBFeHBvcnRhY2lvbmVzIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KYGBgDQoNCkxhcyA1IHByaW5jaXBhbGVzIGF1dG9wYXJ0ZXMgcXVlIGV4cG9ydMOzIEVzdGFkb3MgVW5pZG9zIGVuIDIwMjEgZnVlcm9uOiB0b2RhcyBsYXMgZGVtw6FzIHBpZXphcyBkZSBhdXRvbcOzdmlsZXMsIHBpZXphcyBkZSBjYXJyb2NlcsOtYSBleGNlcHRvIGNhYmluYXMsIGNhamFzIGRlIGNhbWJpb3MsIGVqZXMgbW90cmljZXMgY29uIGRpZmVyZW5jaWFsIHkgZnJlbm9zIHkgcGllemFzLiAgDQoNCiMjIyBBdXRvbW90cml6DQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBHcsOhZmljbyBkZSBsw61uZWFzIHBhcmEgcHJvZHVjY2nDs24gbG9jYWwsIGV4cG9ydGFjaW9uZXMgeSBpbXBvcnRhY2lvbmVzIGEgbG8gbGFyZ28gZGUgbG9zIGHDsW9zDQpnZ3Bsb3QoZGYsIGFlcyh4ID0geWVhcikpICsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gdG90YWxfbG9jYWxfcHJvZHVjdGlvbiwgY29sb3IgPSAiUHJvZHVjY2nDs24gTG9jYWwiKSwgc2l6ZSA9IDEuNSkgKw0KICBnZW9tX2xpbmUoYWVzKHkgPSB0b3RhbF9leHBvcnRzLCBjb2xvciA9ICJFeHBvcnRhY2lvbmVzIiksIHNpemUgPSAxLjUpICsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gdG90YWxfaW1wb3J0cywgY29sb3IgPSAiSW1wb3J0YWNpb25lcyIpLCBzaXplID0gMS41KSArDQogIGxhYnModGl0bGUgPSAiVGVuZGVuY2lhcyBkZSBQcm9kdWNjacOzbiwgRXhwb3J0YWNpb25lcyBlIEltcG9ydGFjaW9uZXMgYSBsbyBsYXJnbyBkZSBsb3MgYcOxb3MiLA0KICAgICAgIHkgPSAiQ2FudGlkYWQiLA0KICAgICAgIGNvbG9yID0gIlZhcmlhYmxlIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KIyBHcsOhZmljbyBkZSBiYXJyYXMgYWdydXBhZGFzIHBhcmEgaW1wb3J0YWNpb25lcyB0b3RhbGVzIHkgZGUgRUUuIFVVLg0KZ2dwbG90KGRmLCBhZXMoeCA9IHllYXIpKSArDQogIGdlb21fYmFyKGFlcyh5ID0gdG90YWxfaW1wb3J0cywgZmlsbCA9ICJUb3RhbCBJbXBvcnRhY2lvbmVzIiksIHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgZ2VvbV9iYXIoYWVzKHkgPSBpbXBvcnRzX2Zyb21fVVMsIGZpbGwgPSAiSW1wb3J0YWNpb25lcyBkZXNkZSBFRS4gVVUuIiksIHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgbGFicyh0aXRsZSA9ICJDb21wYXJhY2nDs24gZGUgSW1wb3J0YWNpb25lcyBUb3RhbGVzIHkgZGVzZGUgRUUuIFVVLiBhIGxvIGxhcmdvIGRlIGxvcyBhw7FvcyIsDQogICAgICAgeSA9ICJDYW50aWRhZCIsDQogICAgICAgZmlsbCA9ICJWYXJpYWJsZSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGAgDQoNClNlIG9ic2VydmEgcXVlIGRlIGxhcyBpbXBvcnRhY2lvbmVzIHF1ZSByZWFsaXrDsyBNw6l4aWNvIGRlbCAyMDE4IGEgMjAyMiwgYWxyZWRlZG9yIGRlbCA1MCUgZnVlcm9uIGRlIEVzdGFkb3MgVW5pZG9zLiBUYW1iacOpbiwgc2UgZW5jb250csOzIHF1ZSBNw6l4aWNvIHRpZW5lIHVuYSB0ZW5kZW5jaWEgYSBsbyBsYXJnbyBkZSBsb3MgYcOxb3MgZW4gY3Vlc3Rpb25lcyBwcm9kdWNjacOzbiBhdXRvbW90cml6LCBleHBvcnRhY2lvbmVzIGUgaW1wb3J0YWNpb25lcy4gTcOpeGljbyB0aWVuZSB1bmEgbWF5b3IgcHJvZHVjY2nDs24gbG9jYWwgZGUgbGEgcXVlIGltcG9ydGEgeSBleHBvcnRhOyBhc8OtIG1pc21vLCBleHBvcnRhIG3DoXMgcHJvZHVjdG9zIGRlIGxhIGluZHVzdHJpYSBhdXRvbW90cml6IGRlIGxvcyBxdWUgaW1wb3J0YS4gRWwgdGFtYcOxbyBkZSBtZXJjYWRvIGRlIGxhIGluZHVzdHJpYSBhdXRvbW90cml6IGVuIE3DqXhpY28gaGEgaWRvIGZsdWN0dWFuZG8gYSB0cmF2w6lzIGRlIGxvcyBhw7Fvczsgc2luIGVtYmFyZ28sIG11ZXN0cmEgdW5hIHRlbmRlbmNpYSBhIGxhIGFsemEuIEVuIDIwMTggZWwgdGFtYcOxbyBkZSBtZXJjYWRvIGVyYSBkZSA3NyUgeSBlbiAyMDIyIGVzdGEgY2lmcmEgYXVtZW50w7MgYSA3OS43JS4gRW4gY3VhbnRvIGFsIHRpcG8gZGUgY2FtYmlvLCBzZSBoYSBtYW50ZW5pZG8gZW50cmUgMTkuMjIgeSAyMC40LiAgDQoNCkVuIGN1YW50byBhIGxhcyBFeHBvcnRhY2lvbmVzIGRlIHBpZXphcyBkZSBFRS4gVVUsIHNlIG9ic2VydsOzIHF1ZSBNw6l4aWNvIGhhIHNpZG8gZWwgcHJpbmNpcGFsIHBhw61zIGFsIHF1ZSBFVSBsZSBoYSBleHBvcnRhZG8gZGVzZGUgZWwgMjAxOCAoY29uIHVuIHByb21lZGlvIGRlIDI5LDU4NCwyODEsMzA4IHBpZXphcyksIHNlZ3VpZG8gcG9yIENhbmFkw6EgeSBDaGluYS4gRW4gY3VhbnRvIGEgbGEgcHJvZHVjY2nDs24gYW51YWwgZGUgdmVow61jdWxvcyBkZSBtb3RvciB5IHZlbnRhcyBpbnRlcm5hcyBlbiBFRS4gVVUuIChtaWxlcyBkZSB1bmlkYWRlcykuIFNlIG9ic2VydmEgcXVlIGVuIGxvcyDDumx0aW1vcyAyMCBhw7FvcyBFRS5VVS4gaGEgcHJvZHVjaWRvIHkgdmVuZGlkbyBtw6FzIHZlaMOtY3Vsb3MgY29tZXJjaWFsZXMgcXVlICBjYXJyb3MgcGFyYSBwYXNhamVyb3MuIEVuIDIwMjEsIHByb2R1am8gMSwgNTYzLDAwMCBjYXJyb3MgZGUgcGFzYWplcm9zLCB5IDcsNTk0LDAwMCBjYXJyb3MgY29tZXJjaWFsZXMuIFkgdmVuZGnDsyAyLDM3NiwwMDAgY2Fycm9zIGRlIHBhc2FqZXJvcywgeSA5LDQ1NSBjYXJyb3MgY29tZXJjaWFsZXMuIA0KDQojIyMgQW1lbmF6YXMgeSBvcG9ydHVuaWRhZGVzIGlkZW50aWZpY2Fkb3MgDQoNCioqQW1lbmF6YXM6KiogIA0KDQoqIExhIGRlcGVuZGVuY2lhIGRlIGxhcyBpbXBvcnRhY2lvbmVzIGRlIEVzdGFkb3MgVW5pZG9zOiBNw6l4aWNvIGltcG9ydGEgdW4gYWx0byBwb3JjZW50YWplIGRlIHBhcnRlcyBhdXRvbW90cmljZXMgZGUgRUUuVVUuIHNpIGxsZWdhcsOhIGEgaGFiZXIgYWxnw7puIGNhbWJpbyBlbiB1bmEgcG9sw610aWNhIGNvbWVyY2lhbCBvIGVuIGxhIHJlbGFjacOzbiBlbnRyZSBsb3MgZG9zIHBhw61zZXMsIGVzbyBhZmVjdGFyw61hIGVuIGdyYW4gY2FudGlkYWQgYSBNw6l4aWNvLiAgDQoNCiogRWwgdGlwbyBkZSBjYW1iaW86ICBTaSBsYSBtb25lZGEgbWV4aWNhbmEgc2UgZGVwcmVjaWEsIGVzbyBwb2Ryw61hIGFmZWN0YXIgc2lnbmlmaWNhdGl2YW1lbnRlIGxvcyBjb3N0b3MgZGUgcHJvZHVjY2nDs24geSBsYXMgZXhwb3J0YWNpb25lcy4gIA0KDQoqIENvbXBldGVuY2lhIGludGVybmFjaW9uYWw6IENoaW5hIHkgQWxlbWFuaWEgdGllbmVuIHVuYSBncmFuIHByZXNlbmNpYSBlbiBsYSBpbXBvcnRhY2nDs24geSBleHBvcnRhY2nDs24gZGUgYXV0b3BhcnRlcyB5IHZlaMOtY3Vsb3MsIGVzb3MgcGHDrXNlcyB5IG90cm9zIHB1ZWRlbiBzZXIgY29tcGV0ZW5jaWEgZGVsIG1lcmNhZG8gaW50ZXJuYWNpb25hbCBwYXJhIE3DqXhpY28uDQoNCioqT3BvcnR1bmlkYWRlczoqKiAgDQoNCiogQ3JlY2ltaWVudG8gZGUgbGEgaW5kdXN0cmlhOiBMYSB0ZW5kZW5jaWEgZW4gYXVtZW50byBkZWwgbWVyY2FkbyBkZSBsYSBpbmR1c3RyaWEgYXV0b21vdHJpeiwgZXMgdW5hIG9wb3J0dW5pZGFkIHBhcmEgcXVlIE3DqXhpY28gY3JlemNhIGVuIGxhIGluZHVzdHJpYSB5IGFwb3J0w6kgbcOhcyB2YWxvciBhbCBkZXNhcnJvbGxvIGVjb27Ds21pY28gZGVsIHBhw61zLiAgDQoNCiogUmVsYWNpw7NuIGNvbiBFc3RhZG9zIFVuaWRvczogWWEgcXVlIEVFLlVVLiBleHBvcnRhIHByaW5jaXBhbG1lbnRlIGEgTcOpeGljbyBwaWV6YXMgZGUgYXV0b23Ds3ZpbGVzLCBleGlzdGUgbGEgb3BvcnR1bmlkYWQgZGUgc2VndWlyIGZvcnRhbGVjaWVuZG8gbGEgcmVsYWNpw7NuIGNvbWVyY2lhbCBlbnRyZSBlc3RvcyBkb3MgcGHDrXNlcy4gIA0KDQoqIFZlaMOtY3Vsb3MgY29tZXJjaWFsZXM6IEVzdGFkb3MgVW5pZG9zIHByb2R1Y2UgeSB2ZW5kZSBtw6FzIHZlaMOtY3Vsb3MgY29tZXJjaWFsZXMgcXVlIGNhcnJvcyBwYXJhIHBhc2FqZXJvcywgTcOpeGljbyBwb2Ryw61hIGRpdmVyc2lmaWNhciBzdSBwcm9kdWNjacOzbiBkZSBhdXRvbcOzdmlsZXMgcGFyYSBxdWUgc2UgYXNvY2llIGNvbiBFRS5VVS4gZW4gZWwgY29tZXJjaW8gZGUgbG9zIHZlaMOtY3Vsb3MgY29tZXJjaWFsZXMgeSB0ZW5nYSBtYXlvcmVzIHZlbnRhcy4gIA0KDQoqIFByb2R1Y2Npw7NuIGxvY2FsOiBNw6l4aWNvIGhhIHRlbmlkbyB1bmEgbWF5b3IgcHJvZHVjY2nDs24gbG9jYWwgcXVlIGltcG9ydGFjaW9uZXMgeSBleHBvcnRhY2lvbmVzIGF1dG9tb3RyaWNlcyBlbiBsb3Mgw7psdGltb3MgYcOxb3MsIHB1ZWRlIGFwcm92ZWNoYXIgZXN0byBwYXJhIGF1bWVudGFyIGxhIHByb2R1Y2Npw7NuIG1hbnVmYWN0dXJlcmEgZGVudHJvIGRlbCBwYcOtcyB5IGF1bWVudGFyIHN1IGF1dG9ub23DrWEgcGFyYSBubyBkZXBlbmRlciB0YW50byBkZSBvdHJvcyBwYcOtc2VzLg0KDQojIE1vdGl2YWNpw7NuDQoNCj4gKipTaXR1YWNpw7NuIHByb2JsZW1hIFJlY3Vyc29zIEh1bWFub3MqKiAgDQpMYSBlbXByZXNhIEZPUk0gZXhwZXJpbWVudGEgdW5hIGFsdGEgdGFzYSBkZSBhYmFuZG9ubyBkZSBlbXBsZW8gYWwgdGVuZXIgZGUgMSBhIDQgYmFqYXMgZGlhcmlhcywgbGEgZmFsdGEgZGUgcGVyc29uYWwgcHJvdm9jYSBtYXlvciBnYXN0byBlbiBlbCDDoXJlYSBkZSBSZWN1cnNvcyBIdW1hbm9zIHlhIHF1ZSBsb3MgcHJvY2Vzb3MgZGUgcmVjbHV0YW1pZW50byBzZSB2dWVsdmVuIHJlcGV0aXRpdm9zLCBGT1JNIGFkZW3DoXMgZGUgc3UgcHJvcGlhIMOhcmVhIGRlIFJlY3Vyc29zIEh1bWFub3MgaGEgY29udHJhdGFkbyBvdHJhcyAzIGVtcHJlc2FzIHBhcmEgbWVqb3JhciBzdSBwcm9jZXNvIGRlIHJlY2x1dGFtaWVudG8uIERlYmVtb3MgaWRlbnRpZmljYXIgbGFzIHJhem9uZXMgZGVsIGFiYW5kb25vIGRlIGVtcGxlbyB5YSBxdWUgc2UgaGFuIHRvbWFkbyBtZWRpZGFzIGNvbW8gYXVtZW50byBkZSBzdWVsZG9zLCBtZWpvcmVzIHByZXN0YWNpb25lcyBvIG1lam9yZXMgY29uZGljaW9uZXMgbGFib3JhbGVzIHNpbiBlbWJhcmdvIGVzdGFzIG5vIGhhbiB0ZW5pZG8gw6l4aXRvLiAgIA0KDQo+ICoqU2l0dWFjacOzbiBwcm9ibGVtYSBQcm9uw7NzdGljbyBkZSBEZW1hbmRhKiogIA0KTGEgZW1wcmVzYSBGT1JNIGhhIHByZXNlbnRhZG8gZGVzYWbDrW9zIG9wZXJhdGl2b3MsIGxhIHZhcmlhYmlsaWRhZCBkZSBsYSBkZW1hbmRhIGRlIHN1cyBjbGllbnRlcyBzdW1hZG8gY29uIGVsIHByb2JsZW1hIGRlIHJvdGFjacOzbiBkZSBlbXBsZWFkb3MgcXVlIHRpZW5lIGhhIG9jYXNpb25hZG8gcHJvYmxlbWFzIHBhcmEgdGVuZXIgdW5hIGJ1ZW5hIGVmaWNpZW5jaWEgb3BlcmF0aXZhLCBwcm9ub3N0aWNhbmRvIGxhIGRlbWFuZGEgZGUgc3VzIHByb2R1Y3RvcyBGT1JNIHB1ZWRlIHRlbmVyIHVuYSBtZWpvciBwbGFuaWZpY2FjacOzbiBkZSBjb21wcmEgZGUgbWF0ZXJpYSBwcmltYSwgY2FwYWNpZGFkIGRlIHBlcnNvbmFsIG8gZGUgcHJvZHVjdG8gdGVybWluYWRvIHkgYXVtZW50YXIgbGEgZWZpY2llbmNpYSB5IGNhcGFjaWRhZCBvcGVyYXRpdmEgbG8gcXVlIHNlIHZlcsOhIHRyYWR1Y2lkbyBlbiBtYXlvcmVzIGdhbmFuY2lhcy4gDQoNCiMgRk9EQSBDcnV6YWRvDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBvdXQud2lkdGg9JzgwJScsIGZpZy5hbGlnbj0nY2VudGVyJ30NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJDOlxcVXNlcnNcXEx1aXNEXFxEb2N1bWVudHNcXENvbmNlbnRyYWNpw7NuXFxSRVRPXFxmb2RhLmpwZyIpDQpgYGANCg0KIyBQRVNUTEUNCg0KIyMjIE3DqXhpY28NCiMjIyMgUG9sw610aWNvcyAgDQoqKkVsZWNjaW9uZXMgcG9sw610aWNhczoqKiAyMDI0IGVzIHVuIGHDsW8gZG9uZGUgZW4gTcOpeGljbyBoYXkgZWxlY2Npb25lcyBwb2zDrXRpY2FzIHBhcmEgZGV0ZXJtaW5hciBhbCBwcsOzeGltbyBwcmVzaWRlbnRlIHBvciBsbyBxdWUgZXMgYWxnbyBxdWUgdGVuZW1vcyBxdWUgdG9tYXIgZW4gY3VlbnRhLCB1bmEgZGUgbGFzIHByaW5jaXBhbGVzIGNvbnNlY3VlbmNpYXMgcXVlIHRlbmVtb3MgZXMgbGEgaW5jZXJ0aWR1bWJyZSBlbiBlbCBtZXJjYWRvLCBubyBzYWJlbW9zIHNpIHRlbmRyZW1vcyB1biBtZWpvciBlc2NlbmFyaW8gbyB1biBlc2NlbmFyaW8gZGVzZmF2b3JhYmxlLCBlbCByZXN1bHRhZG8gZGUgbGFzIGVsZWNjaW9uZXMgcHVlZGUgdHJhZXIgY29tbyBjb25zZWN1ZW5jaWEgY2FtYmlvcyBlbiBsYSBpbnZlcnNpw7NuLCBjYW1iaW9zIGVuIGxhcyByZWxhY2lvbmVzIGV4dGVyaW9yZXMgZW50cmUgbXVjaGFzIGNvc2FzIG3DoXMgcG9yIGxvIHF1ZSBlcyBhbGdvIHF1ZSBzZSBkZWJlIHRvbWFyIGVuIGN1ZW50YSBwYXJhIHRlbmVyIGxhIGNhcGFjaWRhZCBkZSBhZGFwdGFyc2UgYSBsYSBudWV2YSByZWFsaWRhZC4gIA0KDQojIyMjIEVjb27Ds21pY29zICANCioqTmVhcnNob3Jpbmc6KiogTcOpeGljbyBlcyB1bm8gZGUgbG9zIHBhw61zZXMgcXVlIHB1ZWRlbiBzYWNhciB1bmEgbWVqb3IgdmVudGFqYSBkZSBlc3RlIGZlbsOzbWVubywgZGVzcHXDqXMgZGUgbGEgcGFuZGVtaWEgY292aWQtMTkgeSBlbCBjb2xhcHNvIGRlIHZhcmlhcyBjYWRlbmFzIGRlIHN1bWluaXN0cm9zIGVsIGZlbsOzbWVubyBuZWFyc2hvcmluZyBzZSB2b2x2acOzIG3DoXMgZnVlcnRlLCBsYSBwb3NpY2nDs24gZ2VvZ3LDoWZpY2EgZGUgbcOpeGljbyBsbyBoYWNlIHVuIGV4Y2VsZW50ZSBjYW5kaWRhdG8gcGFyYSByZXViaWNhciBjYWRlbmFzIGRlIHN1bWluaXN0cm9zIHlhIHF1ZSBzZSBlbmN1ZW50cmEgY2VyY2EgZGUgbG9zIHByaW5jaXBhbGVzIGRlc3Rpbm9zIGZpbmFsZXMgZGUgbGFzIHByb2R1Y2Npb25lcywgY29tbyBzaSBmdWVyYSBwb2NvIE3DqXhpY28gY3VlbnRhIGNvbiB1bmEgbWFubyBkZSBvYnJhIGJhcmF0YSB5IHRhbWJpw6luIGVzIHVubyBkZSBsb3MgcGHDrXNlcyBjb24gbcOhcyB0cmF0YWRvcyB5IGFjdWVyZG9zIGNvbWVyY2lhbGVzLCBhbGd1bmFzIHZlbnRhamFzIHF1ZSB0ZW5kcsOtYSBNw6l4aWNvIGdyYWNpYXMgYSBlc3RlIGZlbsOzbWVubyBlcyBlbCBjcmVjaW1pZW50byBkZSBzdSBlY29ub23DrWEgZW4gdW4gMy41JSBhbnVhbCB5IHVuIGF1bWVudG8gZGUgaW52ZXJzacOzbiBkZSB1biA3LjUlIGFwcm94LCBwZXJvIGFzw60gY29tbyBleGlzdGVuIHZlbnRhamFzIHkgYmVuZWZpY2lvcyBNw6l4aWNvIGN1ZW50YSBjb24gdW5hIHNlcmllIGRlIHByb2JsZW1hcyBxdWUgcG9kcsOtYW4gYWZlY3RhciBhIGVzdGUgZmVuw7NtZW5vLCBsb3MgcHJvYmxlbWFzIHNvY2lhbGVzLCBjcmltZW4gb3JnYW5pemFkbywgY29ycnVwY2nDs24gZW50cmUgb3Ryb3MsIHBlcm8gZWwgdmVyZGFkZXJvIHByb2JsZW1hIGVzIHNpIE3DqXhpY28gY3VlbnRhIGNvbiBsYSBpbmZyYWVzdHJ1Y3R1cmEgbmVjZXNhcmlhIGNvbW8gdHJhbnNwb3J0ZSwgYWVyb3B1ZXJ0b3MsIGVuZXJnw61hcyBsaW1waWFzIHF1ZSBwZXJtaXRhbiBhIGxhcyBlbXByZXNhcyByZXViaWNhciBzdXMgY2FkZW5hcyBkZSBzdW1pbmlzdHJvcyBlbiBudWVzdHJvIHBhw61zLiAgDQoNCioqQXV0b3BhcnRlczoqKiBTZSBlc3RpbWEgcXVlIGVuIDIwMjQgc2UgcmVjaWJhbiBtw6FzIGRlIDIgbWlsIDMwMCBtaWxsb25lcyBkZSBkw7NsYXJlcyBlbiBpbnZlcnNpw7NuIGVuIGVsIHNlY3RvciBkZSBhdXRvcGFydGVzIGVuIE3DqXhpY28sIG3DoXMgZGVsIDE0JSBkZSBsbyBxdWUgc2UgcmVjaWJpw7MgZW4gMjAyMywgQWxlbWFuaWEgeSBKYXDDs24gc29uIGxvcyBkb3MgcGHDrXNlcyBjb24gbcOhcyBpbnZlcnNpw7NuIGVuIG51ZXN0cm8gcGHDrXMuICANCg0KRW4gZW5lcm8gZGUgMjAyNCBzZSBleHBvcnRhcm9uIG3DoXMgZGUgMjUwIG1pbCBhdXRvcyBlbnNhbWJsYWRvcywgZXN0YSBlcyB1bmEgY2lmcmEgamFtw6FzIGFudGVzIHZpc3RhIGVuIGVsIHBhw61zLCBFc3RhZG9zIFVuaWRvcyBlcyBlbCBtZWpvciBzb2NpbyBkZSBNw6l4aWNvLCBwYXJhIGRpbWVuc2lvbmFyIGVzdGEgYXNvY2lhY2nDs24gOCBkZSBjYWRhIDEwIGF1dG9zIGV4cG9ydGFkb3MgdGVybWluYW4gZW4gZWwgbWVyY2FkbyBkZSBFc3RhZG9zIFVuaWRvcy4gICANCg0KIyMjIyBTb2NpYWxlcyAgDQoqKkNhcmFjdGVyw61zdGljYXMgZGUgbGEgcG9ibGFjacOzbjoqKiBMYSBlc3BlcmFuemEgZGUgdmlkYSBlbiBudWVzdHJvIHBhw61zIGVzIGRlIDc1LjUgYcOxb3MsIGVuIE51ZXZvIExlw7NuIHNlIGVzdMOhIHBvciBlbmNpbWEgZGVsIHByb21lZGlvIGRlIGVzcGVyYW56YSBkZSB2aWRhIHlhIHF1ZSBlbiBlbCBlc3RhZG8gbGEgZXNwZXJhbnphIGRlIHZpZGEgZXMgZGUgNzYuIDIgYcOxb3MgZGUgZWRhZC4gDQoNClVuIGdyYW4gcHJvYmxlbWEgZGUgbGEgc29jaWVkYWQgbWV4aWNhbmEgZXMgbGEgaW5zZWd1cmlkYWQgeSBlc3RhIG5vIHNvbG8gYWZlY3RhIGVuIGVsIGFzcGVjdG8gc29jaWFsLCBhZmVjdGEgZW4gbGEgbWF5b3LDrWEgZGUgYXNwZWN0b3MgYW5hbGl6YWRvcywgZWwgY3JpbWVuIG9yZ2FuaXphZG8sIGVuIGxvcyDDumx0aW1vcyA4IGHDsW9zIGxhIHRhc2EgZGUgY3JpbWVuIG9yZ2FuaXphZG8gaGEgYXVtZW50YWRvIG3DoXMgZGUgNjAlIHBvciBsbyBxdWUgZXMgdW4gcHJvYmxlbWEgc29jaWFsIGEgdG9tYXIgZW4gY3VlbnRhLiAgDQoNCiMjIyMgVGVjbm9sw7NnaWNvcyAgDQoqKkF1dG9zIGVsw6ljdHJpY29zOioqIEVuIDIwMjMgc2Ugc3VwZXLDsyBsYSBwcm9kdWNjacOzbiBkZSBtw6FzIGRlIDEwMCBtaWwgYXV0b3MgZWzDqWN0cmljb3MgbG8gcXVlIHNpZ25pZmljYSBxdWUgZWwgYcOxbyBwYXNhZG8gZWwgbWVyY2FkbyBkZSBlc3RvcyBjb2NoZXMgY3JlY2nDsyBlbiB1biAzNiUsIHNlIGVzcGVyYSBxdWUgZW4gMjAyNCBhdW1lbnRlIGVzdGUgY3JlY2ltaWVudG8geWEgcXVlIG1hcmNhcyBjb21vIFRveW90YSwgVGVzbGEgKE51ZXZvIExlw7NuKSB5IEJNWCAoU2FuIEx1aXMgUG90b3PDrSkgZXN0w6FuIHBvciBpbmljaWFyIHByb2R1Y2Npw7NuIGRlIGF1dG9zIGVsw6ljdHJpY29zIGVuIG51ZXN0cm8gcGHDrXMgZW4gMjAyNC4NCg0KTGEgdHJhbnNpY2nDs24gYSBsb3MgYXV0b3MgZWzDqWN0cmljb3MgZXMgdW5hIGVzdHJhdGVnaWEgZGUgbGEgaW5kdXN0cmlhIG1leGljYW5hIHlhIHF1ZSBzZSBxdWllcmUgbG9ncmFyIHVuYSByZWR1Y2Npw7NuIGRlbCA0NSUgZGUgbGFzIGVtaXNpb25lcyBkZSBDTzIgcGFyYSBlbCBhw7FvIDIwNTAuDQoNCiMjIyMgTGVnYWxlcyAgDQoqKkxleWVzIGxhYm9yYWxlczoqKiBFbiBNw6l4aWNvIGxhcyBsZXllcyBsYWJvcmFsZXMgcmVndWxhbiBsYSByZWxhY2nDs24gZW50cmUgbG9zIGVtcGxlYWRvcyB5IGxhcyBlbXByZXNhcywgZXhpc3RlbiBsZXllcyB5YSBlc3RhYmxlY2lkYXMsIGFsZ3VuYXMgZGUgbGFzIG3DoXMgaW1wb3J0YW50ZXMgc29uOiBMYSBMZXkgRmVkZXJhbCBkZWwgVHJhYmFqbyAoTEZUKSwgTGEgTGV5IGRlIGxhIFNlZ3VyaWRhZCBTb2NpYWwgKExTUyksIExhIExleSBkZSBsYSBSZXNwb25zYWJpbGlkYWQgU29jaWFsIEVtcHJlc2FyaWFsIChMUlMpLCBwb3Igb3RyYSBwYXJ0ZSBjb24gZGVzZGUgZWwgcHJpbWVyIGRpYSBkZSBlbmVybyBkZSAyMDI0IGVsIHNhbGFyaW8gbcOtbmltbyBhdW1lbnTDsyB1biAyMCUgeSBuYWRpZSBwdWVkZSBnYW5hciBtZW5vcyBkZSA3LDQ2OCBwZXNvcyBhbCBtZXMgeSBwb3IgbGV5IG5vIHNlIHB1ZWRlIHRyYWJhamFyIG3DoXMgZGUgOCBob3JhcyBwb3Igam9ybmFkYSBsYWJvcmFsLiANCg0KIyMjIyBBbWJpZW50YWxlcyAgDQoqKkVuZXJnw61hcyBsaW1waWFzOioqIE3DqXhpY28gZXMgdW4ganVnYWRvciBudWV2byBlbiBlc3RlIHNlY3RvciB5YSBxdWUgYXBlbmFzIGVuIDIwMjUgc2UgYXByb2LDsyBsYSBsZXkgcXVlIHBlcm1pdGUgbGEgcGFydGljaXBhY2nDs24gZGUgZW5lcmfDrWFzIGxpbXBpYXMgbyByZW5vdmFibGVzLCBhcHJveGltYWRhbWVudGUgdW4gMjAlIGRlIGxhIGVuZXJnw61hIHV0aWxpemFkYSBlbiBNw6l4aWNvIHZpZW5lIGRlIGVuZXJnw61hcyB2ZXJkZXMgc2llbmRvIGxhIGVuZXJnw61hIGhpZHJvZWzDqWN0cmljYSBsYSBtw6FzIHV0aWxpemFkYSBjb24gdW4gOCUsIHNpIG5vcyBzaXR1YW1vcyBhIGxhIHViaWNhY2nDs24gZGVsIHNvY2lvIGZvcm1hZG9yIG5vcyBwb2RlbW9zIGVuY29udHJhciB1biBwcm9ibGVtYSwgYWN0dWFsbWVudGUgTnVldm8gTGXDs24gZW5mcmVudGUgcHJvYmxlbWFzIGFtYmllbnRhbGVzIG11eSBncmFuZGVzLCBsYSBjb250YW1pbmFjacOzbiBhdG1vc2bDqXJpY2EgZXMgdW5vIGRlIGVsbG9zIHkgbGEgcHJlc2VuY2lhIGRlIGluZHVzdHJpYXMgY29tbyBsYSByZWZpbmVyw61hIGRlIENhZGVyZXl0YSBhdW1lbnRhbiBlc3RlIHByb2JsZW1hIGNhZGEgZMOtYSBtw6FzLCBsYSBjb250YW1pbmFjacOzbiBkZSBsYSBhdG3Ds3NmZXJhIG5vIHNvbG8gYWZlY3RhIGEgbGEgY2FsaWRhZCBkZWwgYWlyZSB0YW1iacOpbiBwdWVkZSBhZmVjdGFyIGxhIHN1c3RlbnRhYmlsaWRhZCBlbiBsYSByZWdpw7NuIGEgdW4gbWVkaWFubyBwbGF6bywgcG9yIGxvIHF1ZSBlcyBuZWNlc2FyaW8gdW5hIHRyYW5zaWNpw7NuIGEgZW5lcmfDrWFzIGxpbXBpYXMsIGxhcyBlbXByZXNhcyBqdWVnYW4gdW4gcGFwZWwgZnVuZGFtZW50YWwgZW4gZXN0YSB0cmFuc2ljacOzbiB5YSBxdWUgZGViZW4gZGVzZW1wZcOxYXIgYWN0aXZpZGFkZXMgc29zdGVuaWJsZXMgZGVudHJvIGRlIHN1cyBwcm9jZXNvcy4gDQoNClJlY2ljbGFqZSBkZSBjYXJ0w7NuOiBDb21vIG1lbmNpb25hIGxhIHNlY3JldGFyw61hIGRlIG1lZGlvIGFtYmllbnRlIHkgcmVjdXJzb3MgbmF0dXJhbGVzIGRlIE3DqXhpY28gYXByb3hpbWFkYW1lbnRlIHNlIGRlc2VjaGFuIG3DoXMgZGUgMi41IG1pbGxvbmVzIGRlIHRvbmVsYWRhcyBkZSBwYXBlbCB5IGNhcnTDs24gYWwgYcOxbyBsbyBxdWUgaW1wbGljYSB0YWxhIGRlIMOhcmJvbGVzIHkgcHJvY2Vzb3MgcXXDrW1pY29zIHF1ZSB1dGlsaXphIGVsIGNhcnTDs24gcGFyYSBzZXIgZmFicmljYWRvLCBhZm9ydHVuYWRhbWVudGUgTcOpeGljbyBlbiBsb3Mgw7psdGltb3MgYcOxb3MgaGEgZXN0YWRvIGNvbnNjaWVudGUgZGUgcXVlIGVsIHJlY2ljbGFqZSBlcyB1bmEgcGFydGUgZnVuZGFtZW50YWwgcGFyYSBsYSBjb25zZXJ2YWNpw7NuIGRlbCBtZWRpbyBhbWJpZW50ZSB5IHlhIGN1ZW50YSBjb24gcGxhbnRhcyByZWNpY2xhZG9yYXMsIHVuIGVqZW1wbG8gZXMgbGEgcGxhbnRhIHJlY2ljbGFkb3JhIGRlIHBldCBtw6FzIGdyYW5kZSBkZSBBbcOpcmljYSBMYXRpbmEuIA0KDQoNCiMjIyBFc3RhZG9zIFVuaWRvcw0KIyMjIyBQb2zDrXRpY29zICANCioqRWxlY2Npb25lcyBwb2zDrXRpY2FzOioqIEFsIGlndWFsIHF1ZSBlbiBNw6l4aWNvLCBlbiBlbCBwcmltZXIgc2VtZXN0cmUgZGVsIDIwMjQgc2Vyw6FuIGxhcyBlbGVjY2lvbmVzIGVuIGVzdGUgcGHDrXMuIEFjdHVhbG1lbnRlLCBKb2UgQmlkZW4gcHVibGljw7MgbGEgTGV5IGRlIFJlZHVjY2nDs24gZGUgbGEgSW5mbGFjacOzbiwgZW4gbGEgcXVlIHNlIG90b3JnYW4gZXN0w61tdWxvcyBmaXNjYWxlcyBhIGxvcyBjb25zdW1pZG9yZXMgZGUgY29jaGVzIGVsw6ljdHJpY29zIHBlcm8gdGFtYmnDqW4gYSBsYXMgYXJtYWRvcmFzLiBEZXBlbmRpZW5kbyBkZWwgZ2FuYWRvciBkZSBsYXMgZWxlY2Npb25lcyBkZSBlc3RlIGHDsW8sIGRpY2hvcyBpbmNlbnRpdm9zIHB1ZWRlbiBkZXNhcGFyZWNlciwgeSB0ZW5kcsOtYSB1biBpbXBhY3RvIGVuIE3DqXhpY28uIA0KDQojIyMjIEVjb27Ds21pY29zICANCioqTmVhcnNob3Jpbmc6KiogRXN0YWRvcyBVbmlkb3Mgc2UgYmVuZWZpY2lhIGRlbCA3NiUgZGVudHJvIGRlbCA5MCUgZGVsIHRvdGFsIGRlIHByb2R1Y2Npw7NuIGRlIHZlaMOtY3Vsb3MuIERpY2hhcyBleHBvcnRhY2lvbmVzIG1leGljYW5hcyBhIEVzdGFkb3MgVW5pZG9zIGluY2x1eWVuIHByb2R1Y3RvcyBjb21vIGNhbWlvbmVzIGxpZ2Vyb3MsIHZlaMOtY3Vsb3MgZGUgcGFzYWplcm9zIHkgcGllemFzIGRlIGF1dG9tw7N2aWxlcy4gSWd1YWxtZW50ZSBzZSBiZW5lZmljaWFuIGRlIGxhcyBoYWJpbGlkYWRlcyB0w6ljbmljYXMgeSBsYSByZW50YWJpbGlkYWQgZGUgb2JyYSBtZXhpY2FuYSwgdW5hIHByb2dyYW1hY2nDs24gZGUgcHJvZHVjY2nDs24gc2ltcGxpZmljYWRhIGRlbnRybyBkZSB1bmEgem9uYSBob3JhcmlhIHNpbXBsaWZpY2FkYSB5IHRpZW1wb3MgcmVkdWNpZG9zIGRlIHRyYW5zcG9ydGVzIHBhcmEgbWF0ZXJpYXMgcHJpbWFzIHkgYmllbmVzLiANCg0KQWxndW5vcyBvdHJvcyBmYWN0b3JlcyBxdWUgaW5mbHV5ZW4gZW4gcXVlIG3DoXMgZW1wcmVzYXMgZGUgRXN0YWRvcyBVbmlkb3Mgc2Ugc2l0w7plbiBlbiBNw6l4aWNvIHNvbjogbGFzIGRpZsOtY2lsZXMgcmVsYWNpb25lcyBxdWUgdGllbmVuIGNvbiBDaGluYSwgZWwgVC1NRUMgcXVlIGZhY2lsaXRhIGVsIGNvbWVyY2lvIGRlIEVVLCBNw6l4aWNvIHkgQ2FuYWTDoSwgbGEgcHJveGltaWRhZCBkZSBhbWJvcyBwYcOtc2VzLCBsb3MgYmFqb3MgY29zdG9zIGxhYm9yYWxlcyBlbiBNw6l4aWNvLCBsYXMgY2FkZW5hcyBkZSBzdW1pbmlzdHJvcyByw6FwaWRhcyB5IHNlZ3VyYXMsIGVsIGJ1ZW4gZGVzZW1wZcOxbyBkZSBsYSBpbmR1c3RyaWEgbmFjaW9uYWwsIHNvYnJlIHRvZG8gZW4gbGEgaW5kdXN0cmlhIGF1dG9tb3RyaXouDQoNCkxhIGZhY2lsaWRhZCBkZSBuZWFyc2hvcmluZyBkZSBNw6l4aWNvIGEgRXN0YWRvcyBVbmlkb3MgcHVlZGUgYWZlY3RhciBhIGxhcyBlbXByZXNhcyBtZXhpY2FuYXMgZGViaWRvIGEgbGEgYWx0YSBjb21wZXRlbmNpYSBxdWUgdHJhZXLDrWEuIA0KDQoqKkF1dG9wYXJ0ZXM6KiogRXhpc3RlIHVuYSBncmFuIGNhbnRpZGFkIGRlIGVtcHJlc2FzIHF1ZSBpbnZpZXJ0ZW4gZW4gTcOpeGljbyBwYXJhIGxhIGZhYnJpY2FjacOzbiBkZSBhdXRvcGFydGVzLCBkZSBsYXMgY3VhbGVzIGVsIDI4JSBzb24gZGUgRXN0YWRvcyBVbmlkb3MuIEVsIGNvbWVyY2lvIGRlIGF1dG9wYXJ0ZXMgY29uIEVzdGFkb3MgVW5pZG9zIGhhIHNpZG8gZXN0cmF0w6lnaWNvIHBhcmEgZWwgY3JlY2ltaWVudG8gZGUgbGEgaW5kdXN0cmlhIGEgcGVzYXIgZGVsIGltcGFjdG8gcXVlIHR1dm8gbGEgaHVlbGdhIGF1dG9tb3RyaXogZW4gMjAyMy4gDQoNCiMjIyMgU29jaWFsZXMgIA0KKipEZXNpZ3VhbGRhZCBlY29uw7NtaWNhOioqIGxhIGRlc2lndWFsZGFkIGRlIGluZ3Jlc29zIGVuIEVzdGFkb3MgVW5pZG9zIGVzIG11eSBhbHRhIGVuIGNvbXBhcmFjacOzbiBjb24gb3Ryb3MgcGHDrXNlcyByaWNvcy4gRWwgMTAlIGRlIGxvcyBxdWUgbcOhcyBnYW5hbiBhYmFyY2EgY2FzaSBsYSBtaXRhZCBkZSB0b2RvcyBsb3MgaW5ncmVzb3MgeSBlbCA1MCUgaW5mZXJpb3Igb2J0aWVuZSBzb2xvIGVsIDEzJSANCioqQ2FyYWN0ZXLDrXN0aWNhcyBkZSBsYSBwb2JsYWNpw7NuOioqIEVzdGFkb3MgVW5pZG9zIGdhbsOzIG3DoXMgZGUgMS42IG1pbGxvbmVzIGRlIHBlcnNvbmFzIGVuIDIwMjMsIGluZGljYW5kbyB1biBjcmVjaW1pZW50byBkZWwgMC41JS4gQSBwZXNhciBkZSBsYSBkaXNtaW51Y2nDs24gZGUgbG9zIG5hY2ltaWVudG9zLCBsYSByZWR1Y2Npw7NuIHNpZ25pZmljYXRpdmEgZGUgbXVlcnRlcyBpbXB1bHPDsyBlbCBjcmVjaW1pZW50byBkZSBsYSBuYWNpw7NuLiBFc3RhZG9zIFVuaWRvcyBzZSBlbmN1ZW50cmEgZW4gbWVkaW8gZGUgdW4gY2FtYmlvIGRlbW9ncsOhZmljbyBzaWduaWZpY2F0aXZvIHF1ZSBwb2Ryw61hIHRlbmVyIGltcGxpY2FjaW9uZXMgZW4gdMOpcm1pbm9zIGRlIHJlcHJlc2VudGFjacOzbiBwb2zDrXRpY2EsIGRlc2Fycm9sbG8gZWNvbsOzbWljbyB5IGRpc3RyaWJ1Y2nDs24gZGUgcmVjdXJzb3MuIA0KDQojIyMjIFRlY25vbMOzZ2ljb3MgIA0KKipBdXRvcyBlbMOpY3RyaWNvczoqKiBFc3RhZG9zIFVuaWRvcyBlcyBlbCBtYXlvciBmYWJyaWNhbnRlIGRlIGNvY2hlcyBow61icmlkb3MgeSBlbMOpY3RyaWNvcyBkZSBBbcOpcmljYSBkZWwgbm9ydGUgeSBjb21vIGNvbnNlY3VlbmNpYSBlbCBwYcOtcyB0YW1iacOpbiBlcyBlbCBwcmluY2lwYWwgbWVyY2FkbyBwYXJhIGVzdG9zIGNvY2hlcy4NCg0KRW4gZXN0YWRvcyBVbmlkb3MgbGEgdGFzYSBkZSBsZWFsdGFkIGEgbG9zIGNvY2hlcyBlbMOpY3RyaWNvcyBoYW4gYmFqYWRvLCBhcHJveGltYWRhbWVudGUgZWwgNDglIGRlIGxvcyBjb25kdWN0b3JlcyBkZSBhdXRvcyBlbMOpY3RyaWNvcyB2b2x2ZXLDrWFuIGEgbG9zIGNvY2hlcyBkZSBnYXNvbGluYSBlbiBzdSBwcsOzeGltYSBjb21wcmEsIEVzdGFkb3MgVW5pZG9zIGVzdMOhIG11eSBwb3IgZGV0csOhcyBkZSBQYcOtc2VzIGNvbW8gQ2hpbmEgZW4gZWwgdXNvIGRlIGF1dG9zIGVsw6ljdHJpY29zLCBhdW5xdWUgZXhpc3RlbiBlc3RhZG9zIGNvbW8gQ2FsaWZvcm5pYSBkb25kZSBzZSBlc3TDoSBkZXNhcnJvbGxhbmRvIG3DoXMgcsOhcGlkbyBlc3RlIG51ZXZvIHNlZ21lbnRvLiANCg0KIyMjIyBMZWdhbGVzICANCioqTGV5ZXMgbGFib3JhbGVzOioqIEFjdHVhbG1lbnRlIHNlIGN1ZW50YW4gY29uIGxleWVzIGNvbW8gTGV5IGRlIE5vcm1hcyBKdXN0YXMgZGUgVHJhYmFqbywgZG9uZGUgZXN0YWJsZWNlIHNhbGFyaW8gbcOtbmltbyBmZWRlcmFsLCByZWd1bGEgZWwgcGFnbyBkZSBob3JhcyBleHRyYXMsIHkgZXN0YWJsZWNlIGVzdMOhbmRhcmVzIHBhcmEgZWwgZW1wbGVvIGRlIG1lbm9yZXMgZGUgZWRhZC4gTGV5IE5hY2lvbmFsIGRlIFJlbGFjaW9uZXMgTGFib3JhbGVzLCBsYSBjdWFsIHByb3RlZ2UgZWwgZGVyZWNobyBkZSBsb3MgZW1wbGVhZG9zIGEgb3JnYW5pemFyc2UgeSBuZWdvY2lhciBjb2xlY3RpdmFtZW50ZSBhIHRyYXbDqXMgZGUgc2luZGljYXRvcy4gRXMgcmVsZXZhbnRlIG1lbmNpb25hciBxdWUgZW4gMjAyMyBodWJvIHVuYSBodWVsZ2EgZW4gZG9uZGUgdHJhYmFqYWRvcmVzIGRlIGxhIGluZHVzdHJpYSBhdXRvbW90cml6IHBpZGVuIHVuIHNhbGFyaW8ganVzdG8uIA0KDQpJZ3VhbG1lbnRlLCBCaWRlbiBwcm9tdWV2ZSBsYSBMZXkgZGUgUmVkdWNjacOzbiBkZSBJbmZsYWNpw7NuLCBsYSBjdWFsIGltcHVsc2EgYSBsb3MgZmFicmljYW50ZXMgZGUgdmVow61jdWxvcyBhIGFjZWxlcmFyIGxhIHByb2R1Y2Npw7NuIGRlIHZlaMOtY3Vsb3MgbGltcGlvcy4gDQoNCiMjIyMgQW1iaWVudGFsZXMgIA0KKipBY2Npw7NuIENsaW3DoXRpY2E6KiogRXN0YWRvcyBVbmlkb3Mgc2UgZW5jdWVudHJhIGRlbnRybyBkZWwgYWN1ZXJkbyBVU01DQSBlbCBjdWFsIGluY2x1eWUgdW4gbnVldm8gY2Fww610dWxvIHNvYnJlIGVsIG1lZGlvIGFtYmllbnRlIHkgZGlzcG9zaWNpb25lcyBwYXJhIHJlZHVjaXIgbGEgY29udGFtaW5hY2nDs24geSBwcm9tb3ZlciBlbCB1c28gZGUgZW5lcmfDrWFzIHJlbm92YWJsZXMuIEVzdGFzIG1lZGlkYXMgZXN0w6FuIGRpc2XDsWFkYXMgcGFyYSBxdWUgbGEgaW5kdXN0cmlhIGF1dG9tb3RyaXogeSBtZXRhbG1lY8OhbmljYSBzZWEgbcOhcyBzb3N0ZW5pYmxlIHkgY29tcGV0aXRpdmEgYSBuaXZlbCBtdW5kaWFsLiBBbGd1bmFzIG1lZGlkYXMgaW5jbHV5ZW46IHF1ZSBzZSBhZG9wdGVuIGVzdMOhbmRhcmVzIGNvbXVuZXMgZGUgZW1pc2lvbmVzIHBhcmEgbG9zIHZlaMOtY3Vsb3MsIHByb21vY2lvbmVuIGVsIHVzbyBkZSBlbmVyZ8OtYXMgcmVub3ZhYmxlcyB5IGVzdGFibGVjZSB1biBudWV2byBmb25kbyBwYXJhIGFwb3lhciBhIGxhcyBlbXByZXNhcyBkZSBsYSBpbmR1c3RyaWEgYXV0b21vdHJpeiB5IG1ldGFsbWVjw6FuaWNhIGEgZGVzYXJyb2xsYXIgbnVldmFzIHRlY25vbG9nw61hcyBxdWUgcmVkdXpjYW4gc3UgaW1wYWN0byBhbWJpZW50YWwuICANCg0KKipSZWNpY2xhamUgZGUgY2FydMOzbjoqKiBMYXMgY2FqYXMgZGUgY2FydMOzbiBzb24gZWwgbWF0ZXJpYWwgZGUgZW1wYXF1ZXRhZG8gbcOhcyByZWNpY2xhZG8gZW4gRXN0YWRvcyBVbmlkb3MuIEVuIDIwMjIsIGxhIHRhc2EgZGUgcmVjaWNsYWplIGRlIGNhamFzIGRlIGNhcnTDs24gZnVlIHN1cGVyaW9yIGFsIDkzJSwgdW4gYXVtZW50byBjb24gcmVzcGVjdG8gYSBsYSB0YXNhIGRlbCBhw7FvIHBhc2Fkby4gIA0KDQojIyMgRXN0cmF0ZWdpYXMNCioqRGl2ZXJzaWZpY2FjacOzbiBkZSBwcm9kdWN0b3M6KiogQXByb3ZlY2hhbmRvIGZhY3RvcmVzIGNvbW8gZWwgTmVhcnNob3JpbmcgbyBsYSBjcmVjaWVudGUgaW52ZXJzacOzbiBleHRyYW5qZXJhIGVuIGVsIHNlY3RvciBkZSBhdXRvcGFydGVzLCBpbnRyb2R1Y2lyIG51ZXZvcyB0aXBvcyBkZSBlbXBhcXVlcyBvIG51ZXZvcyBwcm9kdWN0b3MgcXVlIHB1ZWRhbiBzZXIgbGxhbWF0aXZvcyBwYXJhIGVzdGFzIGluZHVzdHJpYXMgcXVlIHNlIGVuY3VlbnRyYSBlbiB0ZW5kZW5jaWEgY3JlY2llbnRlLCBjb21vIHNlIHB1ZWRlIGFwcmVjaWFyIGVuIGVsIFBFU1RMRSBlc3RvcyBmYWN0b3JlcyBwcm92b2NhbiBxdWUgbcOhcyBlbXByZXNhcyBsbGVndWVuIGFsIG1lcmNhZG8gcG9yIGxvIHF1ZSB0ZW5lciBtw6FzIHZhcmllZGFkIGRlIHByb2R1Y3RvIHB1ZWRlIHNlciB1bmEgb3BvcnR1bmlkYWQgZGUgZXhwYW5zacOzbiBvIGNvbnNvbGlkYWNpw7NuIGVuIGVsIG1lcmNhZG8uICANCg0KKipNb25pdG9yZW8gZGVsIG1lcmNhZG86KiogQWwgdGVuZXIgdW5hIGluZHVzdHJpYSBlbiBjcmVjaW1pZW50bywgc3VyZ2lyw6FuIG51ZXZvcyBjb21wZXRpZG9yZXMgcG9yIGxvIHF1ZSB0aWVuZXMgcXVlIHNhYmVyIGN1YWwgZXMgdHUgdmFsb3IgYWdyZWdhZG8gZWwgY3VhbCB0ZSBkaWZlcmVuY2lhIGRlIHR1IGNvbXBldGVuY2lhLCBtYW50ZW5lciB0dSBwcm9kdWN0byBhY3R1YWxpemFkbyBwYXJhIHNhdGlzZmFjZXIgbGFzIG5lY2VzaWRhZGVzIHkgZXhpZ2VuY2lhcyBkZWwgbWVyY2Fkby4NCg0KIyBQcm9uw7NzdGljbyBkZSAqTmVhcnNob3JpbmcqDQojIyMgUHJvbm9zaXRjbyBkZWwgZXZlbnRvICpOZWFyc2hvcmluZyogZW4gbGEgaW5kdXN0cmlhDQoNCmBgYHtyfQ0KIyBzZXR0aW5nIHRpbWUgc2VyaWVzIGZvcm1hdCANCk5lYXJzaG9yaW5nJEZlY2hhPWFzLnllYXJxdHIoTmVhcnNob3JpbmckRmVjaGEsZm9ybWF0PSIlWS8lcSIpDQoNCiMgdGltZSBzZXJpZXMgcGxvdCANCklFRHh0czwteHRzKE5lYXJzaG9yaW5nJElFRF9SRUFMLG9yZGVyLmJ5PU5lYXJzaG9yaW5nJEZlY2hhKQ0KZHlncmFwaChJRUR4dHMsIG1haW4gPSAiRm9yZWlnbiBEaXJlY3QgSW52ZXN0bWVudCBGbG93cyIpICU+JSANCiAgZHlPcHRpb25zKGNvbG9ycyA9IFJDb2xvckJyZXdlcjo6YnJld2VyLnBhbCg0LCAiRGFyazIiKSkNCg0KSUVEdHM8LXRzKE5lYXJzaG9yaW5nJElFRF9SRUFMLGZyZXF1ZW5jeT00LHN0YXJ0PWMoMTk5OSwxKSkNCklFRF90c19kZWNvbXBvc2U8LWRlY29tcG9zZShJRUR0cykNCnBsb3QoSUVEX3RzX2RlY29tcG9zZSkNCmBgYA0KDQojIyMjIFBydWViYXMNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIFN0YXRpb25hcnkgVGVzdCANCiMgSDA6IE5vbi1zdGF0aW9uYXJ5IGFuZCBIQTogU3RhdGlvbmFyeS4gcC12YWx1ZXMgPCAwLjA1IHJlamVjdCB0aGUgSDAuDQphZGYudGVzdChJRUR0cykNCg0KIyBTZXJpYWwgQXV0b2NvcnJlbGF0aW9uDQphY2YoSUVEdHMsbWFpbj0iU2lnbmlmaWNhbnQgQXV0b2NvcnJlbGF0aW9ucyIpDQpgYGANCg0KIyMjIyBNb2RlbG8NCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpzdW1tYXJ5KElFRF9BUklNQTwtYXJpbWEoSUVEdHMsb3JkZXI9YygwLDAsMCksc2Vhc29uYWwgPSBjKDIsMCwwKSkpIA0KYGBgDQoNCiMjIyMgRGlhZ25vc3RpY28NCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIyMgUmVzaWR1YWxzIGFyZSBzdGF0aW9uYXJ5ID8NCklFRF9BUklNQV9yZXNpZHVhbHM8LUlFRF9BUklNQSRyZXNpZHVhbHMNCmFkZi50ZXN0KG5hLm9taXQoSUVEX0FSSU1BX3Jlc2lkdWFscykpDQojIEFERiB0ZXN0IHN1Z2dlc3QgdGhhdCBBUk1BIHJlc2lkdWFscyBhcmUgc3RhdGlvbmFyeSBzaW5jZSBwLXZhbHVlIGlzIDwgMC4wNS4gDQoNCiMjIyBSZXNpZHVhbHMgc2hvdyBzZXJpYWwgYXV0b2NvcnJlbGF0aW9uID8NCkJveC50ZXN0KElFRF9BUklNQV9yZXNpZHVhbHMsbGFnPTMsdHlwZT0iTGp1bmctQm94IikNCmBgYA0KDQojIyMjIFByb25vc3RpY28NCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQp0ZW1wX2ZvcmVjYXN0PC1hdXRvcGxvdChmb3JlY2FzdChJRURfQVJJTUEpKQ0KcGxvdCh0ZW1wX2ZvcmVjYXN0KQ0KDQpmb3JlY2FzdChJRURfQVJJTUEsaD01KQ0KYGBgDQojIFByZWd1bnRhcyBkZSBBbsOhbGlzaXMNCg0KMS0gwr9FbiBxdcOpIGHDsW8gaHVibyBtw6FzIHJlbnVuY2lhcz8gIA0KMi0gwr9IYXkgZmFjdG9yZXMgZW4gY29tw7puIGVudHJlIGxvcyBlbXBsZWFkb3MgcXVlIG5vIGFiYW5kb25hbiBlbCBlbXBsZW8/ICANCjMtIMK/SGF5IGZhY3RvcmVzIGVuIGNvbcO6biBlbnRyZSBsb3MgZW1wbGVhZG9zIHF1ZSBhYmFuZG9uYW4gZWwgZW1wbGVvPyAgDQo0LSDCv0VuIHF1w6kgw6FyZWEgZGUgbGEgZW1wcmVzYSBoYW4gc3VjZWRpZG8gbcOhcyBiYWphcz8gIA0KDQojIEVEQQ0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KZGY8LSByZWFkeGw6OnJlYWRfeGxzeCgiQzpcXFVzZXJzXFxMdWlzRFxcRG9jdW1lbnRzXFxDb25jZW50cmFjacOzblxcUkVUT1xcRW5jdWVzdGFfRGF0b3NfRk9STV9GYWxsMjAyMy54bHN4IikNCmBgYA0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KI1Jlbm9tYnJhbW9zIGxhcyB2YXJpYWJsZXMgDQpkZiA8LSBkZiAlPiUNCiAgcmVuYW1lKCJQdWVzdG8iID0gIlB1ZXN0byBkZSB0cmFiYWpvIC0gU2VsZWN0ZWQgQ2hvaWNlIiwNCiAgICAgICAgICJPdHJvX3B1ZXN0byIgPSAiUHVlc3RvIGRlIHRyYWJham8gLSBPdHJvIC0gVGV4dCIsDQogICAgICAgICAiQW50aWd1ZWRhZF9tZXNlcyI9ICJBbnRpZ3VlZGFkIGVuIGxhIGVtcHJlc2EgLSBNZXNlcyIsDQogICAgICAgICAiUmF6b25faW5ncmVzbyI9ICLCv0N1w6FsIGZ1ZSBsYSBwcmluY2lwYWwgcmF6w7NuIHBvciBsYSBxdWUgZW50cmFzdGUgYSBlc3RlIHRyYWJham8/IiwNCiAgICAgICAgICJQZXJjZXBjaW9uX3NhbGFyaW8iID0gIjEgLSBDb25zaWRlcm8gcXVlIGVsIHNhbGFyaW8gcXVlIHJlY2libyBlcyBidWVubyBwYXJhIGVsIHRyYWJham8gcXVlIHJlYWxpem8iLA0KICAgICAgICAgIlByZXN0YWNpb25lcyI9ICIyIC0gTWlzIHByZXN0YWNpb25lcyBzb24gYWxnbyBxdWUgaGFjZSBxdWUgbWUgcXVlZGUgZW4gbGEgZW1wcmVzYSIsDQogICAgICAgICAiSm9ybmFkYV9sYWJvcmFsIj0gIjMgLSBMYSBqb3JuYWRhIGxhYm9yYWwgbm8gZXMgZXhjZXNpdmEiLA0KICAgICAgICAgIkhlcnJhbWllbnRhcyI9ICI0IC0gRk9STSBtZSBoYSBvZnJlY2lkbyBsYXMgaGVycmFtaWVudGFzIG5lY2VzYXJpYXMgcGFyYSBtaSBkZXNlbXBlw7FvIHkgYXByZW5kaXphamUiLA0KICAgICAgICAgIlRlbXBlcmF0dXJhIj0gIjUgLSBRdWUgaGFnYSBtdWNobyBmcsOtbyBvIGNhbG9yIGVuIG1pIMOhcmVhIGRlIHRyYWJham8gbm8gZXMgYWxnbyBxdWUgbWUgbW9sZXN0ZSIsDQogICAgICAgICAiRXN0cmVzX25pdmVsIiA9ICI2IC0gTWkgbml2ZWwgZGUgZXN0csOpcyBkdXJhbnRlIGxhIGpvcm5hZGEgbGFib3JhbCBlcyBiYWpvIiwNCiAgICAgICAgICJUcmFuc3BvcnRlIj0gIjcgLSBNZSBwdWVkbyB0cmFuc3BvcnRhciBkZSBmb3JtYSBzZWd1cmEgZGUgbWkgY2FzYSBhIG1pIHRyYWJham8geSBubyBtZSBjdWVzdGEgZGVtYXNpYWRvIGVzZnVlcnpvIGxsZWdhciIsDQogICAgICAgICAiWm9uYV90cmFiYWpvIiA9ICI4IC0gTWkgem9uYSBkZSB0cmFiYWpvIGVzIGPDs21vZGEgeSBzZWd1cmEgcGFyYSBoYWNlciBtaXMgYWN0aXZpZGFkZXMiLA0KICAgICAgICAgIlNpZ3VlX3RyYWJhamFuZG8iID0gIjkgLSBFcyBtdXkgcHJvYmFibGUgcXVlIHNpZ2EgdHJhYmFqYW5kbyBlbiBGT1JNIGVuIHVuIGZ1dHVybyIsDQogICAgICAgICAic2l0dWFjaW9uX2NvbmZsaWN0byIgPSAiwr9IYXMgZXhwZXJpbWVudGFkbyBzaXR1YWNpb25lcyBkZSBjb25mbGljdG8sIGFjb3NvICBvIHF1ZSB0ZSBoYXlhbiBoZWNobyBzZW50aXIgaW5zZWd1cm8gZHVyYW50ZSB0dSB0aWVtcG8gZW4gbGEgZW1wcmVzYT8iLA0KICAgICAgICAgIkluc2F0aXNmYWNjaW9uIiA9ICJFbiAzIHBhbGFicmFzIG8gbWVub3Mgwr9RdcOpIGFzcGVjdG9zIGRlIHR1IHB1ZXN0byBhY3R1YWwgdGUgcmVzdWx0YW4gbWVub3Mgc2F0aXNmYWN0b3Jpb3M/IiwNCiAgICAgICAgICJQZXJjZXBjaW9uIiA9ICLCv0PDs21vIHRlIHNpZW50ZXMgZW4gRk9STT8iLA0KICAgICAgICAgIkdlbmVybyIgPSAiR8OpbmVybyIsDQogICAgICAgICAiRXN0YWRvX2NpdmlsIiA9ICJFc3RhZG8gY2l2aWwiLA0KICAgICAgICAgIk11bmljaXBpbyIgPSAiTXVuaWNpcGlvIGRlIHJlc2lkZW5jaWEiLA0KICAgICAgICAgIkVzY29sYXJpZGFkIiA9ICJOaXZlbCBkZSBlc2NvbGFyaWRhZCIsDQogICAgICAgICAiRGVwZW5kX2Vjb25vbSIgPSAiTsO6bWVybyBkZSBkZXBlbmRpZW50ZXMgZWNvbsOzbWljb3MgKHBlcnNvbmFzIHF1ZSBkZXBlbmRlbiBkZSB0aSkiDQogICAgICAgICApDQoNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KI0VsaW1pbmFtb3MgbGEgY29sdW1uYSBkZWwgSUQgIkVuY3Vlc3RhIg0KZGYgPC0gc3Vic2V0KGRmLCBzZWxlY3QgPSAtRW5jdWVzdGEpDQoNCiNDYW1iaWFyIHZhcmlhYmxlIGVkYWQgYSBudW1lcmljYQ0KZGYkRWRhZCA8LSBhcy5udW1lcmljKGRmJEVkYWQpDQoNCiNDb3JyZWdpciBlcnJvciBvcnRvZ3LDoWZpY28gZW4gVHJhbnNwb3J0ZQ0KZGYgPC0gZGYgJT4lDQogIG11dGF0ZShUcmFuc3BvcnRlID0gcmVjb2RlKFRyYW5zcG9ydGUsICJUb3RhbG1lbmRlIGVuIGRlc2FjdWVyZG8iID0gIlRvdGFsbWVudGUgZW4gZGVzYWN1ZXJkbyIpKQ0KDQojQWdyZWdhbW9zIGVsIHZhbG9yIGRlICJPdHJvX3B1ZXN0byIgYSBsb3Mgbml2ZWxlcyBkZSAiUHVlc3RvIiBxdWUgaGF5YW4gc2VsZWNjaW9uYWRvIGxhIG9wY2nDs24gIk90cm8iDQpkZiA8LSBkZiAlPiUNCiAgbXV0YXRlKFB1ZXN0byA9IGlmX2Vsc2UoUHVlc3RvID09ICJPdHJvIiwgT3Ryb19wdWVzdG8sIFB1ZXN0bykpDQoNCiNFbGltaW5hbW9zIGxhIGNvbHVtbmEgIk90cm9fcHVlc3RvIiBwdWVzIHlhIG5vIHNlcsOhIHJlbGV2YW50ZQ0KZGYgPC0gc3Vic2V0KGRmLCBzZWxlY3QgPSAtT3Ryb19wdWVzdG8pDQoNCiMgRWxpbWluYW1vcyB0YW1iacOpbiBhIGxhcyBwZXJzb25hcyBxdWUgbm8gaGF5YW4gc2VsZWNjaW9uYWRvIG5pbmfDum4gcHVlc3RvIGRlIHRyYWJham8NCmRmIDwtIG5hLm9taXQoZGYpDQpgYGANCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCiNDb252ZXJ0aW1vcyBsYSB2YXJpYWJsZSBQdWVzdG8gYSBmYWN0b3IgDQoNCmRmJFB1ZXN0byA8LSBhcy5mYWN0b3IoZGYkUHVlc3RvKQ0KDQojQXNpZ25hbW9zIHVuYSBjYXRlZ29yw61hIGRlcGVuZGllbmRvIGFsIHB1ZXN0byBkZSB0cmFiYWpvDQpjYXRlZ29yaWFzIDwtIGxpc3QoDQogIFByb2R1Y2Npb24gPSBjKCJBc2lzdGVudGUgZGUgcHJvZHVjY2nDs24iLCAiQXl1ZGFudGUgZ2VuZXJhbCIsICJkZXNnYWpvIiwgIk9wZXJhZG9yIiwgIlN1cGVydmlzb3IiKSwNCiAgRXNwZWNpYWxpemFkb3MgPSBjKCJjYWxpZGFkIiwgIkNhbGlkYWQiLCAiQ29zdHVyZXJhIiwgIkRlc2ZhamFkb3JhIiwgImVtYmFycXVlIiwgIkVuZmVybWVyYSIsICJJbmdlbmllcsOtYSIsICJMYW1pbmFkbyIsICJtYXF1aW5hIGNuYyIsICJNw6FxdWluYXMiLCAibWF0ZXJpYWxlcyIsICJtb250YWNhcmd1aXN0YSIsICJNb250YWNhcmd1aXN0YSIsICJwaW50dXJhIiwgIlNvbGRhZG9yIiwiTWFudGVuaW1pZW50byIsICJMaW1waWV6YSIpLA0KICBBZG1pbmlzdHJhY2lvbiA9IGMoIkNvbWVyY2lhbCIsICJBZG1pbmlzdHJhdGl2byIsICJjb29yZGluYWRvcmEiLCAiZGlyZWN0b3IiLCAiSW50ZXJuL3ByYWN0aWNhbnRlIiwgIkplZmUgZGUgU0dDIikNCikNCg0KI0FncmVnYW1vcyBsYSBjb2x1bW5hIENhdGVnb3LDrWEgZGVwZW5kaWVuZG8gZGUgc3UgcHVlc3RvIGRlIHRyYWJham8NCmFzaWduYXJfY2F0ZWdvcmlhIDwtIGZ1bmN0aW9uKHB1ZXN0bykgew0KICBmb3IgKGNhdGVnb3JpYSBpbiBuYW1lcyhjYXRlZ29yaWFzKSkgew0KICAgIGlmIChwdWVzdG8gJWluJSBjYXRlZ29yaWFzW1tjYXRlZ29yaWFdXSkgew0KICAgICAgcmV0dXJuKGNhdGVnb3JpYSkNCiAgICB9DQogIH0NCiAgcmV0dXJuKCJPdHJvcyIpIA0KfQ0KDQpkZiA8LSBkZiAlPiUNCiAgbXV0YXRlKENhdGVnb3JpYSA9IGNhc2Vfd2hlbigNCiAgICBQdWVzdG8gJWluJSBjYXRlZ29yaWFzJFByb2R1Y2Npb24gfiAiUHJvZHVjY2lvbiIsDQogICAgUHVlc3RvICVpbiUgY2F0ZWdvcmlhcyRFc3BlY2lhbGl6YWRvcyB+ICJFc3BlY2lhbGl6YWRvcyIsDQogICAgUHVlc3RvICVpbiUgY2F0ZWdvcmlhcyRBZG1pbmlzdHJhY2lvbiB+ICJBZG1pbmlzdHJhY2lvbiIsDQogICAgUHVlc3RvICVpbiUgY2F0ZWdvcmlhcyRNYW50ZW5pbWllbnRvIH4gIk1hbnRlbmltaWVudG8iLA0KICAgIFRSVUUgfiAiT3Ryb3MiDQogICkpIA0KI1BvbmVtb3MgbGFzIGNhdGVnb3LDrWFzIGRlIHRyYWJham8gY29tbyBmYWN0b3INCmRmJENhdGVnb3JpYSA8LSBhcy5mYWN0b3IoZGYkQ2F0ZWdvcmlhKQ0KDQojRmluYWxtZW50ZSBlbGltaW5hbW9zIGxhIGNvbHVtbmEgcHVlc3RvIHkgbGEgY2F0ZWdvcsOtYSBsYSByZW5vbWJyYW1vcyBjb21vIG51ZXN0cmEgbnVldmEgdmFyaWFibGUgIlB1ZXN0byIsIGVuIHBvY2FzIHBhbGFicmFzIHJlbXBsYXphbW9zIGVsIHB1ZXN0byBlc3BlY8OtZmljbyBwb3IgbGEgY2F0ZWdvcsOtYSBhIGxhIHF1ZSBwZXJ0ZW5lY2VuDQpkZiA8LSBzdWJzZXQoZGYsIHNlbGVjdCA9IC1QdWVzdG8pDQpkZiA8LSBkZiAlPiUNCiAgcmVuYW1lKCJQdWVzdG8iID0gIkNhdGVnb3JpYSIpDQoNCiNBaG9yYSBwb2RlbW9zIHZlciBjdWFudGFzIHBlcnNvbmFzIHJlc3BvbmRpZXJvbiBsYSBlbmN1ZXN0YSBkZXBlbmRpZW5kbyBkZSBzdSBwdWVzdG8gZGUgdHJhYmFqbw0Kc3VtbWFyeShkZiRQdWVzdG8pDQpgYGANCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmRmX2M8LWRmDQpgYGANCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmRmX2MkUmF6b25faW5ncmVzbyA8LSBhcy5mYWN0b3IoZGZfYyRSYXpvbl9pbmdyZXNvKQ0KZGZfYyRQZXJjZXBjaW9uX3NhbGFyaW8gPC0gYXMuZmFjdG9yKGRmX2MkUGVyY2VwY2lvbl9zYWxhcmlvKQ0KZGZfYyRQcmVzdGFjaW9uZXMgPC0gYXMuZmFjdG9yKGRmX2MkUHJlc3RhY2lvbmVzKQ0KZGZfYyRKb3JuYWRhX2xhYm9yYWwgPC0gYXMuZmFjdG9yKGRmX2MkSm9ybmFkYV9sYWJvcmFsKQ0KZGZfYyRIZXJyYW1pZW50YXMgPC0gYXMuZmFjdG9yKGRmX2MkSGVycmFtaWVudGFzKQ0KZGZfYyRUZW1wZXJhdHVyYSA8LSBhcy5mYWN0b3IoZGZfYyRUZW1wZXJhdHVyYSkNCmRmX2MkRXN0cmVzX25pdmVsIDwtIGFzLmZhY3RvcihkZl9jJEVzdHJlc19uaXZlbCkNCmRmX2MkVHJhbnNwb3J0ZSA8LSBhcy5mYWN0b3IoZGZfYyRUcmFuc3BvcnRlKQ0KZGZfYyRab25hX3RyYWJham8gPC0gYXMuZmFjdG9yKGRmX2MkWm9uYV90cmFiYWpvKQ0KZGZfYyRTaWd1ZV90cmFiYWphbmRvIDwtIGFzLmZhY3RvcihkZl9jJFNpZ3VlX3RyYWJhamFuZG8pDQpkZl9jJHNpdHVhY2lvbl9jb25mbGljdG8gPC0gYXMuZmFjdG9yKGRmX2Mkc2l0dWFjaW9uX2NvbmZsaWN0bykNCmRmX2MkR2VuZXJvIDwtIGFzLmZhY3RvcihkZl9jJEdlbmVybykNCmRmX2MkRXN0YWRvX2NpdmlsIDwtIGFzLmZhY3RvcihkZl9jJEVzdGFkb19jaXZpbCkNCmRmX2MkTXVuaWNpcGlvIDwtIGFzLmZhY3RvcihkZl9jJE11bmljaXBpbykNCmRmX2MkRXNjb2xhcmlkYWQgPC0gYXMuZmFjdG9yKGRmX2MkRXNjb2xhcmlkYWQpDQpkZl9jJEVkYWQgPC0gYXMubnVtZXJpYyhkZl9jJEVkYWQpDQoNCnN1bW1hcnkoZGZfYykNCmBgYA0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KZGZfbjwtZGZfYw0KYGBgDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpudWV2b3Nfbm9tYnJlc19yYXpvbnQgPC0gYygNCiAgIkFtYmllbnRlIGRlIHRyYWJham8iID0gMSwNCiAgIlBvciBlbCBzYWxhcmlvIiA9IDIsDQogICJQcmVzdGFjaW9uZXMiID0gMywNCiAgIlJhem9uZXMgcGVyc29uYWxlcyIgPSA0LA0KICAiVWJpY2FjacOzbiBkZSBsYSBlbXByZXNhIiA9IDUsDQogICJPdHJvIiA9IDYNCikNCmRmX24gPC0gZGZfbiAlPiUNCiAgbXV0YXRlKFJhem9uX2luZ3Jlc28gPSByZWNvZGUoUmF6b25faW5ncmVzbywgISEhbnVldm9zX25vbWJyZXNfcmF6b250KSkNCg0KbnVldm9zX25vbWJyZXMgPC0gYygNCiAgIlRvdGFsbWVudGUgZW4gZGVzYWN1ZXJkbyIgPSAxLA0KICAiTWVkaWFuYW1lbnRlIGVuIGRlc2FjdWVyZG8iID0gMiwNCiAgIk5pIGRlIGFjdWVyZG8gbmkgZW4gZGVzYWN1ZXJkbyIgPSAzLA0KICAiTWVkaWFuYW1lbnRlIGRlIGFjdWVyZG8iID0gNCwNCiAgIlRvdGFsbWVudGUgZGUgYWN1ZXJkbyIgPSA1DQopDQoNCmRmX24gPC0gZGZfbiAlPiUNCiAgbXV0YXRlKFBlcmNlcGNpb25fc2FsYXJpbyA9IHJlY29kZShQZXJjZXBjaW9uX3NhbGFyaW8sICEhIW51ZXZvc19ub21icmVzKSkgJT4lDQogIG11dGF0ZShQcmVzdGFjaW9uZXMgPSByZWNvZGUoUHJlc3RhY2lvbmVzLCAhISFudWV2b3Nfbm9tYnJlcykpICU+JQ0KICBtdXRhdGUoSm9ybmFkYV9sYWJvcmFsID0gcmVjb2RlKEpvcm5hZGFfbGFib3JhbCwgISEhbnVldm9zX25vbWJyZXMpKSAlPiUNCiAgbXV0YXRlKEhlcnJhbWllbnRhcyA9IHJlY29kZShIZXJyYW1pZW50YXMsICEhIW51ZXZvc19ub21icmVzKSkgJT4lDQogIG11dGF0ZShUZW1wZXJhdHVyYSA9IHJlY29kZShUZW1wZXJhdHVyYSwgISEhbnVldm9zX25vbWJyZXMpKSAlPiUNCiAgbXV0YXRlKEVzdHJlc19uaXZlbCA9IHJlY29kZShFc3RyZXNfbml2ZWwsICEhIW51ZXZvc19ub21icmVzKSkgJT4lDQogIG11dGF0ZShUcmFuc3BvcnRlID0gcmVjb2RlKFRyYW5zcG9ydGUsICEhIW51ZXZvc19ub21icmVzKSkgJT4lDQogIG11dGF0ZShab25hX3RyYWJham8gPSByZWNvZGUoWm9uYV90cmFiYWpvLCAhISFudWV2b3Nfbm9tYnJlcykpICU+JQ0KICBtdXRhdGUoU2lndWVfdHJhYmFqYW5kbyA9IHJlY29kZShTaWd1ZV90cmFiYWphbmRvLCAhISFudWV2b3Nfbm9tYnJlcykpDQoNCg0KbnVldm9zX25vbWJyZXNfY29uZmxpY3RvIDwtIGMoDQogICJObyIgPSAxLA0KICAiU2kiID0gMiwNCiAgIlByZWZpZXJvIG5vIGRlY2lybG8iID0gMykNCmRmX24gPC0gZGZfbiAlPiUNCiAgbXV0YXRlKHNpdHVhY2lvbl9jb25mbGljdG8gPSByZWNvZGUoc2l0dWFjaW9uX2NvbmZsaWN0bywgISEhbnVldm9zX25vbWJyZXNfY29uZmxpY3RvKSkNCg0KZGZfbiA8LSBkZl9uICU+JQ0KICBtdXRhdGUoR2VuZXJvID0gaWZlbHNlKEdlbmVybyA9PSAiRmVtZW5pbm8iLCAxLCAyKSkNCg0KbnVldm9zX25vbWJyZXNfY2l2aWwgPC0gYygNCiAgIlNvbHRlcm8iID0gMSwNCiAgIkNhc2FkbyIgPSAyLA0KICAiRGl2b3JjaWFkbyIgPSAzLA0KICAiVW5pw7NuIGxpYnJlIiA9IDQpDQpkZl9uIDwtIGRmX24gJT4lDQogIG11dGF0ZShFc3RhZG9fY2l2aWwgPSByZWNvZGUoRXN0YWRvX2NpdmlsLCAhISFudWV2b3Nfbm9tYnJlc19jaXZpbCkpDQoNCm51ZXZvc19ub21icmVzX211bmljaXBpbyA8LSBjKA0KICAiQXBvZGFjYSIgPSAxLA0KICAiR3VhZGFsdXBlIiA9IDIsDQogICJKdcOhcmV6IiA9IDMsDQogICJNb250ZXJyZXkiID0gNCwNCiAgIlBlc3F1ZXLDrWEiID0gNSwNCiAgIk90cm8iID0gNg0KKQ0KZGZfbiA8LSBkZl9uICU+JQ0KICBtdXRhdGUoTXVuaWNpcGlvID0gcmVjb2RlKE11bmljaXBpbywgISEhbnVldm9zX25vbWJyZXNfbXVuaWNpcGlvKSkNCg0KbnVldm9zX25vbWJyZXNfZXNjb2wgPC0gYygNCiAgIkxpY2VuY2lhdHVyYSIgPSAxLA0KICAiUHJlcGFyYXRvcmlhIiA9IDIsDQogICJTZWN1bmRhcmlhIiA9IDMsDQogICJQcmltYXJpYSIgPSA0LA0KICAiT3RybyIgPSA1DQopDQpkZl9uIDwtIGRmX24gJT4lDQogIG11dGF0ZShFc2NvbGFyaWRhZCA9IHJlY29kZShFc2NvbGFyaWRhZCwgISEhbnVldm9zX25vbWJyZXNfZXNjb2wpKQ0KDQpudWV2b3Nfbm9tYnJlc19wdWVzdG8gPC0gYygNCiAgIlByb2R1Y2Npb24iID0gMSwNCiAgIkVzcGVjaWFsaXphZG9zIiA9IDIsDQogICJBZG1pbmlzdHJhY2lvbiIgPSAzKQ0KZGZfbiA8LSBkZl9uICU+JQ0KICBtdXRhdGUoUHVlc3RvID0gcmVjb2RlKFB1ZXN0bywgISEhbnVldm9zX25vbWJyZXNfcHVlc3RvKSkNCmBgYA0KDQojIyMgQmFzZSBkZSBkYXRvcyAqKkVuY3Vlc3RhKioNCiMjIyMgSWRlbnRpZmljYWNpw7NuIGRlIE5BJ3MNCg0KYGBge3J9DQpuYXNfcG9yX2NvbHVtbmEgPC0gY29sU3Vtcyhpcy5uYShkZl9uKSkNCm5hc19wb3JfY29sdW1uYQ0KYGBgDQoNCmBgYHtyfQ0KbmFzX3Bvcl9jb2x1bW5hIDwtIGNvbFN1bXMoaXMubmEoZGZfYykpDQpuYXNfcG9yX2NvbHVtbmENCmBgYA0KTm9zIGFzZWd1cmFtb3MgcXVlIG5vIGhheWEgdmFsb3JlcyBmYWx0YW50ZXMgZW4gZWwgZGF0YWZyYW1lLiANCg0KIyMjIyBNZWRpZGFzIGRlc2NyaXB0aXZhcyAgDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShwc3ljaCkgDQpkZXNjcmliZShkZl9uKQ0KYGBgDQoNCkFxdcOtIHNlIG9ic2VydmFuIHBvciBjYWRhIHZhcmlhYmxlIHZhbG9yZXMgY29tbzogcHJvbWVkaW8sIGRlc3ZpYWNpw7NuIGVzdMOhbmRhciwgbWVkaWFuYSwgbWluLCBtYXgsIGV0Yy4NCg0KDQojIyMjIE1lZGlkYXMgZGUgZGlzcGVyc2nDs24gIA0KDQpgYGB7cn0NCiNBcXXDrSBjYWxjdWzDqSBkZSBsYSB2YXJpYWJsZSBBbnRpZ3VlZGFkX21lc2VzIHN1cyBtZWRpZGFzIGRlIGRpc3BlcnNpw7NuLg0KbWVkaWEgPC0gbWVhbihkZl9uJEFudGlndWVkYWRfbWVzZXMpDQptZWRpYSAjIDEzLjYxMTY1DQpkZXN2aWFjaW9uX2VzdGFuZGFyIDwtIHNkKGRmX24kQW50aWd1ZWRhZF9tZXNlcykNCmRlc3ZpYWNpb25fZXN0YW5kYXIgIyAxNC4zNDUzNA0KY29lZmljaWVudGVfdmFyaWFjaW9uIDwtIChkZXN2aWFjaW9uX2VzdGFuZGFyIC8gbWVkaWEpICogMTAwDQpjb2VmaWNpZW50ZV92YXJpYWNpb24gICMxMDUuMzkwMg0KcmFuZ28gPC0gcmFuZ2UoZGZfbiRBbnRpZ3VlZGFkX21lc2VzKQ0KcmFuZ28gIzEgMzYNCnZhcmlhbnphIDwtIHZhcihkZl9uJEFudGlndWVkYWRfbWVzZXMpDQp2YXJpYW56YSAjIDIwNS43ODg5DQpgYGANCg0KTGEgdmFyaWFibGUgZGVwZW5kaWVudGUgZXMgQW50aWd1ZWRhZF9tZXNlcyB5IHN1cyBtZWRpZGFzIGRlIGRpc3BlcnNpw7NuIHNvbiBsYXMgc2lndWllbnRlczogIA0KICogTWVkaWE6IDEzLjYxMTY1ICANCiAqIERlc3ZpYWNpw7NuIGVzdMOhbmRhcjogMTQuMzQ1MzQgIA0KICogQ29lZmljaWVudGUgZGUgdmFyaWFjacOzbjogMTA1LjM5MDIgIA0KICogUmFuZ286IDEgMzYgIA0KICogVmFyaWFuemE6IDIwNS43ODg5ICANCg0KRXN0b3MgZGF0b3MgcG9kZW1vcyBpbnRlcnByZXRhcmxvcyBkZSBsYSBzaWd1aWVudGUgbWFuZXJhOiAgIA0KICogTG9zIGVtcGxlYWRvcyB0aWVuZW4gdW5hIGFudGlnw7xlZGFkIHByb21lZGlvIGRlIDEzLjYgbWVzZXMuICANCiAqIExvcyB2YWxvcmVzIGVzdMOhbiBkaXNwZXJzb3MgZW4gYXByb3guIDE0IG1lc2VzIGRlIGxhIG1lZGlhLiAgDQogKiBIYXkgdW5hIGFsdGEgdmFyaWFiaWxpZGFkIGVuIHJlbGFjacOzbiBjb24gbGEgbWVkaWEuICANCiAqIExhIGFudGlnw7xlZGFkIGRlIGxvcyBlbXBsZWFkb3MgZXMgZGVzZGUgMSBtZXMgaGFzdGEgMzYgbWVzZXMuICANCiAqIExhIHZhcmlhbnphIG5vcyBkaWNlIHF1ZSBsb3MgdmFsb3JlcyB2YXLDrWFuIGVuIDIwNSBtZXNlcyBhbCBjdWFkcmFkbyByZXNwZWN0byBhIGxhIG1lZGlhLiAgDQoNCiMjIyMgR3LDoWZpY29zDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpudW1lcmljX2NvbHVtbnMgPC0gc2FwcGx5KGRmX24sIGlzLm51bWVyaWMpDQpudW1lcmljX2RhdGEgPC0gZGZfblssIG51bWVyaWNfY29sdW1uc10NCmNvcnJlbGF0aW9uX21hdHJpeCA8LSBjb3IobnVtZXJpY19kYXRhKQ0KY29ycnBsb3QoY29ycmVsYXRpb25fbWF0cml4KQ0KDQoNCm51bWVyaWNfY29sdW1ucyA8LSBzYXBwbHkoZGZfbiwgaXMubnVtZXJpYykNCm51bWVyaWNfZGF0YSA8LSBkZl9uWywgbnVtZXJpY19jb2x1bW5zXQ0KY29ycmVsYXRpb25fbWF0cml4IDwtIGNvcihudW1lcmljX2RhdGEsIGRmX24kQW50aWd1ZWRhZF9tZXNlcykNCnByaW50KGNvcnJlbGF0aW9uX21hdHJpeCkNCmBgYA0KDQpFbiBsYSBtYXRyaXogZGUgY29ycmVsYWNpw7NuIHZlbW9zIHF1ZSBsYSB2YXJpYWJsZSBkZXBlbmRpZW50ZSAiQW50aWd1ZWRhZF9tZXNlcyIgc2UgY29ycmVsYWNpb25hIGVuIGdyYW4gbWFuZXJhIGNvbiBsYXMgdmFyaWFibGVzIGRlOiBTaWd1ZV90cmFiYWphbmRvIHkgRWRhZC4gICANCg0KRXN0byBzaWduaWZpY2EgcXVlLCBtaWVudHJhcyBtw6FzIGFudGlnw7xlZGFkIHRlbmdhIHVuIGVtcGxlYWRvLCBlcyBtw6FzIHByb2JhYmxlIHF1ZSBzaWdhIHRyYWJhamFuZG8gZW4gRk9STSB5IHF1ZSB0ZW5nYSBtw6FzIGVkYWQuICANCg0KTGEgdmFyaWFibGUgUHVlc3RvIHRhbWJpw6luIHRpZW5lIHVuYSBjb3JyZWxhY2nDs24gcG9zaXRpdmEgY29uIEFudGlndWVkYWRfbWVzZXMsIGF1bnF1ZSBlbiBtZW5vciBtZWRpZGEsIGVzdG8gc2lnbmlmaWNhIHF1ZSwgZWwgcHVlc3RvIHF1ZSBvY3VwZSB1biBjb2xhYm9yYWRvciB0YW1iacOpbiBpbmZsdXllIGVuIHN1IGFudGlnw7xlZGFkIGRlbnRybyBkZSBsYSBlbXByZXNhLiAgICAgDQoNCkxhcyB2YXJpYWJsZXM6IFJhem9uX2luZ3Jlc28sIFBlcmNlcGNpb25fc2FsYXJpbywgRXN0cmVzX25pdmVsIHkgRXN0YWRvX2NpdmkgZXN0w6FuIGNvcnJlbGFjaW9uYWRhcyBuZWdhdGl2YW1lbnRlIGNvbiBBbnRpZ3VlZGFkX21lc2VzLCBwZXJvIGVzdGEgY29ycmVsYWNpw7NuIGVzIG11eSBiYWphLiANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCm51bWVyaWNfZGF0YSA8LSBkZl9uICU+JSBzZWxlY3RfaWYoaXMubnVtZXJpYykNCnBsb3RzIDwtIGxpc3QoKQ0KZm9yIChjb2wgaW4gbmFtZXMobnVtZXJpY19kYXRhKSkgew0KICBwbG90IDwtIGdncGxvdChkZl9uLCBhZXMoeCA9ICEhc3ltKGNvbCkpKSArDQogICAgZ2VvbV9oaXN0b2dyYW0oY29sb3IgPSAicmVkIiwgZmlsbCA9ICJibHVlIiwgYWxwaGEgPSAwLjEpICsNCiAgICBnZW9tX2RlbnNpdHkoKSArDQogICAgZ2d0aXRsZShwYXN0ZSgiSGlzdG9ncmFtYSBkZSIsIGNvbCkpDQogIA0KICBwbG90c1tbY29sXV0gPC0gcGxvdA0KfQ0KZ2dhcnJhbmdlKHBsb3RsaXN0ID0gcGxvdHMsIG5jb2wgPSA0LCBucm93ID0gY2VpbGluZyhsZW5ndGgocGxvdHMpIC8gNykpDQpgYGANCg0KU2Ugb2JzZXJ2YSBxdWUgbGFzIHZhcmlhYmxlczogVHJhbnNwb3J0ZSwgU2lndWVfdHJhYmFqYW5kbywgSGVycmFtaWVudGFzLCBKb3JuYWRhX0xhYm9yYWwsIFpvbmFfdHJhYmFqbyB5IEVzdHJlc19uaXZlbCBwcmVzZW50YW4gdW4gc2VzZ28gYSBsYSBpenF1aWVyZGEuICANCg0KWSBsYXMgdmFyaWFibGVzOiBQdWVzdG8sIEdlbmVybywgRXN0YWRvX2NpdmlsLCBTaXR1YWNpb25fY29uZmxpY3RvIHkgRGVwZW5kLmVjb25vbSBwcmVzZW50YW4gdW4gc2VzZ28gYSBsYSBkZXJlY2hhLiAgDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpwaWVfY2hhcnQgPC0gZ2dwbG90KGRmX2MsIGFlcyh4ID0gIiIsIGZpbGwgPSBHZW5lcm8pKSArDQogIGdlb21fYmFyKHdpZHRoID0gMSwgc3RhdCA9ICJjb3VudCIpICsNCiAgY29vcmRfcG9sYXIoInkiKSArDQogIHRoZW1lX3ZvaWQoKSArIA0KICBnZ3RpdGxlKCJEaXN0cmlidWNpw7NuIGRlIEVtcGxlYWRvcyBwb3IgR8OpbmVybyIpDQpwcmludChwaWVfY2hhcnQpICANCmBgYA0KDQpTZSBvYnNlcnZhIHF1ZSBsYSBtYXlvciBwYXJ0ZSBkZSBsb3MgdHJhYmFqYWRvcmVzIHNvbiBtdWplcmVzLiAgDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpnZ3Bsb3QoZGZfYywgYWVzKHggPSBNdW5pY2lwaW8sIGZpbGwgPSBNdW5pY2lwaW8pKSArDQogIGdlb21fYmFyKCkgKw0KICBsYWJzKHggPSAiTXVuaWNpcGlvIiwgeSA9ICJGcmVjdWVuY2lhIiwgdGl0bGUgPSAiRGlzdHJpYnVjacOzbiBkZSBFbXBsZWFkb3MgcG9yIE11bmljaXBpbyBkZSBSZXNpZGVuY2lhIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQpTZSBvYnNlcnZhIHF1ZSBsYSBtYXlvcsOtYSBkZSBsb3MgZW1wbGVhZG9zIHJlc2lkZW4gZW4gZWwgTXVuaWNpcGlvIGRlIEFwb2RhY2EsIHNlZ3VpZG8gcG9yIEp1w6FyZXouICANCg0KYGBge3IgZWNobz1GQUxTRX0NCmdncGxvdChkZl9jLCBhZXMoeCA9IEVzY29sYXJpZGFkLCBmaWxsID0gRXNjb2xhcmlkYWQpKSArDQogIGdlb21fYmFyKCkgKw0KICBsYWJzKHggPSAiRXNjb2xhcmlkYWQiLCB5ID0gIkZyZWN1ZW5jaWEiLCB0aXRsZSA9ICJEaXN0cmlidWNpw7NuIGRlIEVtcGxlYWRvcyBwb3IgRXNjb2xhcmlkYWQiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNClNlIG9ic2VydmEgcXVlIGxhIG1heW9yw61hIGRlIGxvcyBjb2xhYm9yYWRvcmVzIGN1ZW50YW4gY29uIHVuYSBlc2NvbGFyaWRhZCBkZSBTZWN1bmRhcmlhLCBzZWd1aWRhIHBvciBQcmVwYXJhdG9yaWEsIExpY2VuY2lhdHVyYSwgUHJpbWFyaWEgeSBPdHJvLiAgDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpnZ3Bsb3QoZGZfYywgYWVzKHggPSBFZGFkLCBmaWxsID0gRWRhZCkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oZmlsbCA9ICJsaWdodGJsdWUiLCBjb2xvciA9ICJibGFjayIsIGJpbnMgPSA3KSArDQogIGxhYnModGl0bGUgPSAiRGlzdHJpYnVjacOzbiBkZSBFbXBsZWFkb3MgcG9yIEVkYWQiLCB4ID0gIkVkYWQiLCB5ID0gIkZyZWN1ZW5jaWEiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCkxhIG1heW9yIHBhcnRlIGRlIGxvcyBjb2xhYnJvYWRvcmVzIHNlIHViaWNhbiBlbnRyZSBsb3MgMjAgeSAzMCBhw7Fvcy4gIA0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KZ2dwbG90KGRmX2MsIGFlcyh4ID0gUHVlc3RvLCBmaWxsID0gUHVlc3RvKSkgKw0KICBnZW9tX2JhcigpICsNCiAgbGFicyh4ID0gIlB1ZXN0byIsIHkgPSAiRnJlY3VlbmNpYSIsIHRpdGxlID0gIkRpc3RyaWJ1Y2nDs24gZGUgRW1wbGVhZG9zIHBvciBQdWVzdG8iKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCkxhIG1heW9yw61hIGRlIGxvcyBlbXBsZWFkb3Mgb2N1cGFuIHB1ZXN0b3MgZGUgUHJvZHVjY2nDs24gKENvc3R1cmVyYSwgQXl1ZGFudGUgR2VuZXJhbCwgU29sZGFkb3IpLiAgDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpnZ3Bsb3QoZGZfYywgYWVzKHggPSBFc3RhZG9fY2l2aWwsIGZpbGwgPSBFc3RhZG9fY2l2aWwpKSArDQogIGdlb21fYmFyKCkgKw0KICBsYWJzKHggPSAiRXN0YWRvX2NpdmlsIiwgeSA9ICJGcmVjdWVuY2lhIiwgdGl0bGUgPSAiRGlzdHJpYnVjacOzbiBkZSBFbXBsZWFkb3MgcG9yIEVzdGFkbyBDaXZpbCIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KTGEgbWF5b3LDrWEgZGUgbG9zIGNvbGFib3JhZG9yZXMgc29uIHNvbHRlcm9zLCBzZWd1aWRvcyBwb3IgdW4gZXN0YWRvIGNpdmlsIGRlIGNhc2FkbywgdW5pw7NuIGxpYnJlIHkgZGl2b3JjaWFkby4gIA0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KZ2dwbG90KGRmX2MsIGFlcyh4ID0gRXN0cmVzX25pdmVsLCBmaWxsID0gRXN0cmVzX25pdmVsKSkgKw0KICBnZW9tX2JhcigpICsNCiAgbGFicyh4ID0gIkVzdHJlc19uaXZlbCIsIHkgPSAiRnJlY3VlbmNpYSIsIHRpdGxlID0gIsK/RWwgbml2ZWwgZGUgZXN0csOpcyBkdXJhbnRlIGxhIGpvcm5hZGEgbGFib3JhbCBlcyBiYWpvPyIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpDQpgYGANCg0KTGEgbWF5b3LDrWEgZGUgbG9zIHRyYWJhamFkb3JlcyBubyBzZSBzaWVudGVuIGVzdHJlc2Fkb3MgZHVyYW50ZSBzdSBqb3JuYWRhIGxhYm9yYWwuIA0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KHRpZHl0ZXh0KQ0KbGlicmFyeShzeXV6aGV0KQ0KDQp0b2tlbnMgPC0gZGZfYyAlPiUNCiAgdW5uZXN0X3Rva2Vucyh3b3JkLCBQZXJjZXBjaW9uKSAlPiUNCiAgcHVsbCh3b3JkKQ0KDQplbW9jaW9uZXNfZGYgPC0gZ2V0X25yY19zZW50aW1lbnQodG9rZW5zLCBsYW5ndWFnZSA9ICJzcGFuaXNoIikNCg0KZnJlY3VlbmNpYV9lbW9jaW9uZXMgPC0gY29sU3Vtcyhwcm9wLnRhYmxlKGVtb2Npb25lc19kZlssIDE6OF0pKQ0KDQpkZl9lbW9jaW9uZXMgPC0gZGF0YS5mcmFtZShlbW9jaW9uID0gbmFtZXMoZnJlY3VlbmNpYV9lbW9jaW9uZXMpLCBmcmVjdWVuY2lhID0gZnJlY3VlbmNpYV9lbW9jaW9uZXMpDQoNCmdncGxvdChkZl9lbW9jaW9uZXMsIGFlcyh4ID0gZW1vY2lvbiwgeSA9IGZyZWN1ZW5jaWEpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsID0gInNreWJsdWUiKSArDQogIGxhYnMoeCA9ICJFbW9jacOzbiIsIHkgPSAiRnJlY3VlbmNpYSIsIHRpdGxlID0gIkFuw6FsaXNpcyBkZSBzZW50aW1pZW50b3M6IMK/Q8OzbW8gc2Ugc2llbnRlbiBsb3MgZW1wbGVhZG9zIGVuIEZPUk0/IikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KDQpgYGANCg0KQ29uIGJhc2UgZW4gbGFzIHJlc3B1ZXN0YXMgZGUgbGEgdmFyaWFibGUgUGVyY2VwY2lvbiwgc2Ugb2JzZXJ2YSBxdWUgbGEgbWF5b3LDrWEgZGUgbG9zIGVtcGxlYWRvcyBkZSBGT1JNIHNpZW50ZW4gYWxlZ3LDrWEgeSBjb25maWFuemEuDQoNCiMjIyMgVGFibGFzIChmcmVjdWVuY2lhLCBjb250aW5nZW5jaWEpDQoNCiAqIFRhYmxhIGRlIGNvbnRpbmdlbmNpYTogU2l0dWFjacOzbiBkZSBDb25mbGljdG8gdnMuIEdlbmVybw0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KIyBUYWJsYSBkZSBjb250aW5nZW5jaWE6IFNpdHVhY2nDs24gZGUgQ29uZmxpY3RvIHZzLiBHZW5lcm8NCnRhYmxhX2NvbnRpbmdlbmNpYTEgPC0gdGFibGUoZGZfYyRzaXR1YWNpb25fY29uZmxpY3RvLCBkZl9jJEdlbmVybykNCnRhYmxhX2NvbnRpbmdlbmNpYTFfY29uX3RvdGFsZXMgPC0gYWRkbWFyZ2lucyh0YWJsYV9jb250aW5nZW5jaWExLCBtYXJnaW4gPSAxOjIpDQpwcmludCh0YWJsYV9jb250aW5nZW5jaWExX2Nvbl90b3RhbGVzKQ0KYGBgDQoNClNlIG9ic2VydmEgcXVlIGRlIGxvcyBlbXBsZWFkb3MgYWN0dWFsZXMgMTUgZGUgMTAzIGhhbiBleHBlcmltZW50YWRvIGFjb3NvLCBjb25mbGljdG8gbyBzZSBoYW4gc2VudGlkbyBpbnNlZ3Vyb3MgZGVudHJvIGRlIGxhIGVtcHJlc2EuIFkgMTAgZGUgZXNvcyAxNSBjYXNvcyBoYW4gc2lkbyBtdWplcmVzLiAgDQoNCiAqIFRhYmxhIGRlIGNvbnRpbmdlbmNpYTogU2l0dWFjacOzbiBkZSBHZW5lcm8gdnMuIFJhesOzbiBkZSBJbmdyZXNvDQoNCmBgYHtyIGVjaG89RkFMU0V9DQojIFRhYmxhIGRlIGNvbnRpbmdlbmNpYTogU2l0dWFjacOzbiBkZSBHZW5lcm8gdnMuIFJhesOzbiBkZSBJbmdyZXNvDQp0YWJsYV9jb250aW5nZW5jaWEyIDwtIHRhYmxlKGRmX2MkR2VuZXJvLCBkZl9jJFJhem9uX2luZ3Jlc28pDQp0YWJsYV9jb250aW5nZW5jaWEyX2Nvbl90b3RhbGVzIDwtIGFkZG1hcmdpbnModGFibGFfY29udGluZ2VuY2lhMiwgbWFyZ2luID0gMToyKQ0KcHJpbnQodGFibGFfY29udGluZ2VuY2lhMl9jb25fdG90YWxlcykNCmBgYA0KDQpTZSBvYnNlcnZhIHF1ZSBsYSByYXrDs24gcG9yIGxhIHF1ZSBlbnRyYXJvbiBhIHRyYWJhamFyIGxhIG1heW9yw61hIGRlIGxvcyBjb2xhYm9yYWRvcmVzIGEgRk9STSAoMzAgZGUgMTAzKSBmdWUgcG9yIGxhIHViaWNhY2nDs24gZGUgbGEgZW1wcmVzYS4gTGFzIG11amVyZXMgZW50cmFyb24gYSB0cmFiYWphciBtw6FzIHF1ZSBsb3MgaG9tYnJlcyBwb3IgcmF6b25lcyBkZSBBbWJpZW50ZSBkZSB0cmFiYWpvLCBzYWxhcmlvIHkgcmF6b25lcyBwZXJzb25hbGVzLiAgDQoNCiAqIFRhYmxhIGRlIGZyZWN1ZW5jaWE6IFNpZ3VlIFRyYWJhamFuZG8NCg0KYGBge3IgZWNobz1GQUxTRX0NCiMgVGFibGEgZGUgZnJlY3VlbmNpYTogU2lndWUgVHJhYmFqYW5kbw0KdGFibGFfZnJlY3VlbmNpYSA8LSB0YWJsZShkZl9jJFNpZ3VlX3RyYWJhamFuZG8pDQpwcmludCh0YWJsYV9mcmVjdWVuY2lhKQ0KYGBgDQoNClNlIG9ic2VydmEgcXVlIGRlIGxvcyBhY3R1YWxlcyB0cmFiYWphZG9yZXMgZGUgRk9STSwgcG9jbyBtw6FzIGRlIGxhIG1pdGFkIHBsYW5lYSBzZWd1aXIgdHJhYmFqYW5kbyBlbiBsYSBlbXByZXNhICg1NCBkZSAxMDMpLCBtaWVudHJhcyBxdWUgOSBkZSBsb3MgMTAzIGVuY3Vlc3RhZG9zIHBsYW5lYW4gbm8gc2VndWlyIGxhYm9yYW5kbyBlbiBGT1JNLiAgDQoNCg0KIyMjIEJhc2UgZGUgZGF0b3MgKipCYWphcyoqDQoNCmBgYHtyIERhdG9zLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KYmFqYXMgPSByZWFkeGw6OnJlYWRfeGxzeCgiQzpcXFVzZXJzXFxMdWlzRFxcRG9jdW1lbnRzXFxDb25jZW50cmFjacOzblxcUkVUT1xcZm9ybV9iYWphcy54bHN4Iiwgc2hlZXQgPSAiQmFqYXMiKQ0KdmVudGFzID0gcmVhZHhsOjpyZWFkX3hsc3goIkM6XFxVc2Vyc1xcTHVpc0RcXERvY3VtZW50c1xcQ29uY2VudHJhY2nDs25cXFJFVE9cXGZvcm1fYmFqYXMueGxzeCIsIHNoZWV0ID0gIlZlbnRhc19tZW5zdWFsZXMiKQ0KYGBgDQoNCmBgYHtyIE1hbmlwdWxhY2lvbiwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCmNvbG5hbWVzKGJhamFzKVtjb2xuYW1lcyhiYWphcykgPT0gIkVzdGFkbyBDaXZpbCJdID0gIkVzdGFkb19DaXZpbCINCmJhamFzIDwtIHN1YnNldChiYWphcywgU0QgIT0gIjQ0MTM3NTciKSMgU2UgZWxpbWluw7MgdW4gdmFsb3IgYXTDrXBpY28gcXVlIHNlIHBvZMOtYSBjb3JyZWdpciBhcmJpdHJhcmlhbWVudGUNCg0KIyMjIFVuaWZpY2FyIHJlZ2lzdHJvcw0KIyBFc3RhZG8gQ2l2aWwNCmJhamFzJEVzdGFkb19DaXZpbCA9IHRvdXBwZXIoYmFqYXMkRXN0YWRvX0NpdmlsKQ0KYmFqYXMkRXN0YWRvX0NpdmlsW2JhamFzJEVzdGFkb19DaXZpbCA9PSAiQ0FTQURBIl0gPSAiTUFUUklNT05JTyINCmJhamFzJEVzdGFkb19DaXZpbFtiYWphcyRFc3RhZG9fQ2l2aWwgPT0gIkNBU0FETyJdID0gIk1BVFJJTU9OSU8iDQpiYWphcyRFc3RhZG9fQ2l2aWxbYmFqYXMkRXN0YWRvX0NpdmlsID09ICJTT0xURVJBIl0gPSAiU09MVEVSSUEiDQpiYWphcyRFc3RhZG9fQ2l2aWxbYmFqYXMkRXN0YWRvX0NpdmlsID09ICJTT0xURVJPIl0gPSAiU09MVEVSSUEiDQojIEdlbmVybw0KYmFqYXMkR2VuZXJvID0gdG91cHBlcihiYWphcyRHZW5lcm8pDQojIFB1ZXN0by9EcHRvIGJuDQpiYWphcyRQdWVzdG8gPSB0b3VwcGVyKGJhamFzJFB1ZXN0bykNCmJhamFzJERwdG8gPSB0b3VwcGVyKGJhamFzJERwdG8pDQojIEdFT3MNCmJhamFzJEVzdGFkbyA9IHRvdXBwZXIoYmFqYXMkRXN0YWRvKQ0KYmFqYXMkTXVuaWNpcGlvID0gdG91cHBlcihiYWphcyRNdW5pY2lwaW8pDQpiYWphcyRFc3RhZG9bYmFqYXMkRXN0YWRvID09ICJOVUVWTyBMRU9OIl0gPSAiTlVFVk8gTEXDk04iDQpiYWphcyRNdW5pY2lwaW9bYmFqYXMkTXVuaWNpcGlvID09ICJTQU4gTklDT0xBUyBERSBMT1MgRyJdID0gIlNBTiBOSUNPTEFTIg0KYmFqYXMkTXVuaWNpcGlvW2JhamFzJE11bmljaXBpbyA9PSAiUkFNT1ogQVJJWlBFIl0gPSAiUkFNT1MgQVJJWlBFIg0KDQojIyMgRGVsaW1pdGFyIHRpcG9zIGRlIGRhdG9zDQpiYWphcyRHZW5lcm8gPSBhcy5mYWN0b3IoYmFqYXMkR2VuZXJvKQ0KYmFqYXMkRXN0YWRvX0NpdmlsPSBhcy5mYWN0b3IoYmFqYXMkRXN0YWRvX0NpdmlsKQ0KYmFqYXMkQcOxbyA9IGFzLmZhY3RvcihiYWphcyRBw7FvKQ0KYmFqYXMkRXN0YWRvPSBhcy5mYWN0b3IoYmFqYXMkRXN0YWRvKQ0KYmFqYXMkTXVuaWNpcGlvID0gYXMuZmFjdG9yKGJhamFzJE11bmljaXBpbykNCmJhamFzJFNEID0gYXMubnVtZXJpYyhiYWphcyRTRCkNCm9wdGlvbnMoc2NpcGVuID0gOTk5KQ0KDQojIyMgTkFzDQpiYWphcyA8LSBiYWphcyAlPiUNCiAgbXV0YXRlKEVkYWQgPSBpZmVsc2UoaXMubmEoRWRhZCksIG1lZGlhbihFZGFkLCBuYS5ybSA9IFRSVUUpLEVkYWQpKQ0KDQojIyMgQ3JlYWNpw7NuIGRlIHN1YnNldHMNCmJhamFzMjIgPSBiYWphc1tiYWphcyRBw7FvID09ICIyMDIyIixdICU+JQ0KICBkcGx5cjo6c2VsZWN0KFB1ZXN0bywgRHB0bywgU0QsIEVzdGFkb19DaXZpbCwgR2VuZXJvLCBBw7FvLCBFc3RhZG8sIE11bmljaXBpbywgRWRhZCkNCmJhamFzMjMgPSBiYWphc1tiYWphcyRBw7FvID09ICIyMDIzIixdICU+JQ0KICBkcGx5cjo6c2VsZWN0KFB1ZXN0bywgRHB0bywgU0QsIEVzdGFkb19DaXZpbCwgR2VuZXJvLCBBw7FvLCBFc3RhZG8sIE11bmljaXBpbywgYE1vdGl2byBkZSBCYWphYCxEaWFzX3RyYWJhamFkb3MsIE1lc2VzLEVkYWQpDQpgYGANCg0KDQojIyMjIElkZW50aWZpY2FjacOzbiBkZSBOQSdzDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpuYXNfcG9yX2NvbHVtbmEgPC0gY29sU3Vtcyhpcy5uYShiYWphcykpDQpuYXNfcG9yX2NvbHVtbmENCmBgYA0KDQpEYWRvIHF1ZSBoYXkgTkEncyBlbiBEaWFzX3RyYWJhamFkb3MgeSBNZXNlcywgc2Ugc3VzdGl0dWlyw6FuIGxvcyBOQSBwb3IgbGEgbWVkaWFuYSBkZSBjYWRhIHZhcmlhYmxlLg0KDQpgYGB7cn0NCiMgQ2FsY3VsYXIgbGEgbWVkaWFuYSBkZSBsYXMgdmFyaWFibGVzIGNvcnJlc3BvbmRpZW50ZXMNCm1lZGlhbmFfZGlhc190cmFiYWphZG9zIDwtIG1lZGlhbihiYWphcyREaWFzX3RyYWJhamFkb3MsIG5hLnJtID0gVFJVRSkNCm1lZGlhbmFfbWVzZXMgPC0gbWVkaWFuKGJhamFzJE1lc2VzLCBuYS5ybSA9IFRSVUUpDQoNCiMgUmVlbXBsYXphciBsb3MgTkEgcG9yIGxhIG1lZGlhbmEgZW4gbGFzIGNvbHVtbmFzIGNvcnJlc3BvbmRpZW50ZXMNCmJhamFzIDwtIGJhamFzICU+JQ0KICBtdXRhdGUoRGlhc190cmFiYWphZG9zID0gaWZlbHNlKGlzLm5hKERpYXNfdHJhYmFqYWRvcyksIG1lZGlhbmFfZGlhc190cmFiYWphZG9zLCBEaWFzX3RyYWJhamFkb3MpLA0KICAgICAgICAgTWVzZXMgPSBpZmVsc2UoaXMubmEoTWVzZXMpLCBtZWRpYW5hX21lc2VzLCBNZXNlcykpDQpgYGANCg0KDQojIyMjIE1lZGlkYXMgZGVzY3JpcHRpdmFzICANCg0KYGBge3J9DQpzdW1tYXJ5KGJhamFzKQ0KZGVzY3JpYmUoYmFqYXMpDQpgYGANCg0KDQpBcXXDrSBzZSBvYnNlcnZhbiBwb3IgY2FkYSB2YXJpYWJsZSB2YWxvcmVzIGNvbW86IHByb21lZGlvLCBkZXN2aWFjacOzbiBlc3TDoW5kYXIsIG1lZGlhbmEsIG1pbiwgbWF4LCBldGMuDQoNCg0KIyMjIyBNZWRpZGFzIGRlIGRpc3BlcnNpw7NuICANCg0KYGBge3J9DQojQXF1w60gY2FsY3Vsw6kgZGUgbGEgdmFyaWFibGUgRGlhc190cmFiYWphZG9zIHN1cyBtZWRpZGFzIGRlIGRpc3BlcnNpw7NuLg0KbWVkaWEgPC0gbWVhbihiYWphcyREaWFzX3RyYWJhamFkb3MpDQptZWRpYSAjIDcyLjI3NjIxDQpkZXN2aWFjaW9uX2VzdGFuZGFyIDwtIHNkKGJhamFzJERpYXNfdHJhYmFqYWRvcykNCmRlc3ZpYWNpb25fZXN0YW5kYXIgIyAxNjguNjEyMg0KY29lZmljaWVudGVfdmFyaWFjaW9uIDwtIChkZXN2aWFjaW9uX2VzdGFuZGFyIC8gbWVkaWEpICogMTAwDQpjb2VmaWNpZW50ZV92YXJpYWNpb24gICMgMjMzLjI4ODYNCnJhbmdvIDwtIHJhbmdlKGJhamFzJERpYXNfdHJhYmFqYWRvcykNCnJhbmdvICMgMSAxODYxDQp2YXJpYW56YSA8LSB2YXIoYmFqYXMkRGlhc190cmFiYWphZG9zKQ0KdmFyaWFuemEgIyAyODQzMC4wNg0KYGBgDQoNCkxhIHZhcmlhYmxlIGRlcGVuZGllbnRlIGVzIERpYXNfdHJhYmFqYWRvcyB5IHN1cyBtZWRpZGFzIGRlIGRpc3BlcnNpw7NuIHNvbiBsYXMgc2lndWllbnRlczogIA0KICogTWVkaWE6IDcyLjI3NjIxICANCiAqIERlc3ZpYWNpw7NuIGVzdMOhbmRhcjogMTY4LjYxMjIgIA0KICogQ29lZmljaWVudGUgZGUgdmFyaWFjacOzbjogMjMzLjI4ODYgIA0KICogUmFuZ286IDEgMTg2MSAgDQogKiBWYXJpYW56YTogMjg0MzAuMDYgIA0KDQpFc3RvcyBkYXRvcyBwb2RlbW9zIGludGVycHJldGFybG9zIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6ICAgDQogKiBMb3MgYW50aWd1b3MgZW1wbGVhZG9zIGxsZXZhYmFuIGVuIHByb21lZGlvIGRlIDcyIGTDrWFzIHRyYWJhamFuZG8uICANCiAqIExvcyB2YWxvcmVzIGVzdMOhbiBkaXNwZXJzb3MgZW4gYXByb3guIDE2OCBkw61hcyBkZSBsYSBtZWRpYS4gIA0KICogSGF5IHVuYSBhbHRhIHZhcmlhYmxpbGlkYWQgZW4gcmVsYWNpw7NuIGNvbiBsYSBtZWRpYS4gIA0KICogTG9zIGTDrWFzIHRyYWJhamFkb3MgZGUgbG9zIGFudGlndW9zIGVtcGxlYWRvcyB2YW4gZGVzZGUgMSBkw61hIGhhc3RhIDE4NjEgZMOtYXMuICANCiAqIExhIHZhcmlhbnphIG5vcyBkaWNlIHF1ZSBsb3MgdmFsb3JlcyB2YXLDrWFuIGVuIDI4NDMwIGTDrWFzIGFsIGN1YWRyYWRvIHJlc3BlY3RvIGEgbGEgbWVkaWEuDQoNCg0KIyMjIyBHcsOhZmljb3MNCg0KYGBge3IgU2FsYXJpb3MsIGVjaG89RkFMU0V9DQpnZ3Bsb3QoYmFqYXMsIGFlcyh4ID0gU0QpKSArDQogIGdlb21faGlzdG9ncmFtKGZpbGwgPSAibGlnaHRibHVlIiwgY29sb3IgPSAiYmxhY2siLCBiaW5zID0gNykgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1Y2nDs24gZGUgU2FsYXJpb3MgZW4gQmFqYXMiLCB4ID0gIlNhbGFyaW8gRGlhcmlvIiwgeSA9ICJGcmVjdWVuY2lhIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQpFbiBlc3RhIGdyw6FmaWNhIHNlIHB1ZWRlIG9ic2VydmFyIGxhIGRpc3RyaWJ1Y2nDs24gZGUgYmFqYXMgc2VnbWVudGFkYXMgcG9yIHNhbGFyaW8gZGlhcmlvLCBkb25kZSBlcyBub3RvcmlhIHVuYSB0ZW5kZW5jaWEgaGFjaWEgdmFsb3JlcyBtZW5vcmVzLiBFbCBjb21wb3J0YW1pZW50byBkZSBlc3RhIHZhcmlhYmxlIGVzIG11eSBtYXJjYWRvLCBsYSBtZWRpYW5hIHNlIGVuY3VlbnRyYSBlbiAkMjE3LjYsIHNpZW5kbyBlc3RlIGVsIG1pc21vIHZhbG9yIGVuY29udHJhZG8gZW4gZWwgM2VyIGN1YXJ0aWwsIGhhY2llbmRvIHF1ZSBsb3MgdmFsb3JlcyBxdWUgc2UgZW5jdWVudHJlbiBkZXNwdcOpcyBkZWwgZ3J1cG8gbcOhcyBmcmVjdWVudGUgZGVsIGhpc3RvZ3JhbWEgc2UgcHVlZGFuIGhhc3RhIGNvbnNpZGVyYXIgdmFsb3JlcyBhdMOtcGljb3MuICANCg0KDQpgYGB7ciBHZW5lcm8sIGVjaG89RkFMU0V9DQpnZ3Bsb3QoYmFqYXMsIGFlcyh4ID0gR2VuZXJvLCBmaWxsID0gR2VuZXJvKSkgKw0KICBnZW9tX2JhcigpICsNCiAgbGFicyh4ID0gIkdlbmVybyIsIHkgPSAiRnJlY3VlbmNpYSIsIHRpdGxlID0gIkRpc3RyaWJ1Y2nDs24gZGUgQmFqYXMgcG9yIEfDqW5lcm8iKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCkVuIGVzdGEgZ3LDoWZpY2Egc2UgcHVlZGUgb2JzZXJ2YXIgcXVlIG5vIGV4aXN0ZSB1bmEgYWx0YSBkaWZlcmVuY2lhIGRlIGfDqW5lcm8gZW4gbGFzIGJhamFzIHJlZ2lzdHJhZGFzIGVuIDIwMjIgeSAyMDIzLCBwb3IgbG8gcXVlIHNlIHB1ZWRlIGluZmVyaXIgcXVlIG5vIHNlcsOtYW4gYWx0YW1lbnRlIHNpZ25pZmljYXRpdmFzIHBhcmEgbGEgY2xhc2lmaWNhY2nDs24gcG9yIHNpIHNvbGFzLiBFc3RhcyB2YXJpYWJsZXMgcHVlZGVuIHRlbmVyIG1heW9yIGltcGFjdG8gY29uc2lkZXJhbmRvIGVuIGNvbmp1bnRvIG90cmFzIHZhcmlhYmxlcyBjb21vIEVzdGFkbyBDaXZpbCB5L28gRWRhZC4gIA0KICANCg0KYGBge3IgZXN0YWRvX2NpdmlsLCBlY2hvPUZBTFNFfQ0KZ2dwbG90KGJhamFzLCBhZXMoeCA9IEVzdGFkb19DaXZpbCwgZmlsbCA9IEVzdGFkb19DaXZpbCkpICsNCiAgZ2VvbV9iYXIoKSArDQogIGxhYnMoeCA9ICJFc3RhZG8gQ2l2aWwiLCB5ID0gIkZyZWN1ZW5jaWEiLCB0aXRsZSA9ICJEaXN0cmlidWNpw7NuIGRlIEJhamFzIHBvciBFc3RhZG8gQ2l2aWwiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCkVuIGVzdGEgZ3LDoWZpY2Egc2UgcHVlZGUgb2JzZXJ2YXIgcXVlIGV4aXN0ZSB1bmEgdGVuZGVuY2lhIHBhcmEgZWwgZXN0YWRvIGNpdmlsIGRlIHNvbHRlcmEvbyBwYXJhIHNlciB1bmEgYmFqYSwgbWllbnRyYXMgcXVlIGV4aXN0ZW4gbXV5IHBvY29zIHJlZ2lzdHJvcyBkZSBwZXJzb25hcyBkaXZvcmNpYWRhcyBzaWVuZG8gYmFqYXMgZW4gbGEgZW1wcmVzYS4gU2UgcG9kcsOtYSByZWFsaXphciB1biBhbsOhbGlzaXMgY29uIG3DoXMgdmFyaWFibGVzLiAgDQogIA0KDQpgYGB7ciBFZGFkLCBlY2hvPUZBTFNFfQ0KZ2dwbG90KGJhamFzLCBhZXMoeCA9IEVkYWQpKSArDQogIGdlb21faGlzdG9ncmFtKGZpbGwgPSAibGlnaHRibHVlIiwgY29sb3IgPSAiYmxhY2siLCBiaW5zID0gNykgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1Y2nDs24gZGUgRWRhZGVzIGVuIGJhamFzIiwgeCA9ICJFZGFkIiwgeSA9ICJGcmVjdWVuY2lhIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQpFbiBlbCBoaXN0b2dyYW1hIGRlIEVkYWQgcG9kZW1vcyBvYnNlcnZhciBxdWUgbGEgdmFyaWFibGUgbm8gY3VlbnRhIGNvbiB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwsIHNpbm8gcXVlIHRpZW5lIHVuIHNlc2dvIGRlIGNvbGEgZGVyZWNoYSwgaGFjaWVuZG8gY2xhcmEgbGEgZGlmZXJlbmNpYSBkZSBiYWphcyBlbnRyZSBsb3MgZ3J1cG9zIGRlIGVkYWRlcywgc2llbmRvIG3DoXMgY29tw7puIHRlbmVyIHVuYSBiYWphIGRlIHBlcnNvbmFsIGVudHJlIDIwLTMwIGHDsW9zIGRlIGVkYWQuIFNlcsOtYSBpbnRlcmVzYW50ZSBhbmFsaXphciBjdWVzdGlvbmVzIGdlbmVyYWNpb25hbGVzIHkgc3UgcmVzcHVlc3RhIGhhY2lhIGNpZXJ0YXMgY29tcGVuc2FjaW9uZXMuICANCiAgDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpib3hwbG90X3VubyA8LSBnZ3Bsb3QoYmFqYXMsIGFlcyh4ID0gTXVuaWNpcGlvLCB5ID0gRWRhZCkpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBnZ3RpdGxlKCJCb3hwbG90IGRlIEVkYWQgcG9yIE11bmljaXBpbyIpICsNCiAgeGxhYigiTXVuaWNpcGlvIikgKw0KICB5bGFiKCJFZGFkIikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKSAgIyBSb3RhciBsYXMgZXRpcXVldGFzIGRlbCBlamUgeA0KcHJpbnQoYm94cGxvdF91bm8pIA0KYGBgDQoNClNlIG9ic2VydmEgcXVlIGRlIGxhcyBwZXJzb25hcyBxdWUgcmVudW5jaWFuIGVuIE1vbnRlcnJleSwgbGEgbWVkaWFuYSBlcyBkZSBhbHJlZGVkb3IgZGUgNTUgYcOxb3MuIEVuIGxvcyBkZW3DoXMgTXVuaWNpcGlvcyBsYXMgcGVyc29uYXMgcXVlIHJlbnVuY2lhbiB0aWVuZW4gdW5hIGVkYWQgbcOhcyBwZXF1ZcOxYSAoZW50cmUgMjAgeSA0MCBhw7FvcyksIHNvbiBtw6FzIGrDs3ZlbmVzLiAgDQoNCg0KYGBge3IgZWNobz1GQUxTRX0NCmJveHBsb3RfZG9zIDwtIGdncGxvdChiYWphcywgYWVzKHggPSBHZW5lcm8sIHkgPSBNZXNlcykpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBnZ3RpdGxlKCJCb3hwbG90IGRlIE1lc2VzIHBvciBHw6luZXJvIikgKw0KICB4bGFiKCJHZW5lcm8iKSArDQogIHlsYWIoIk1lc2VzIikNCnByaW50KGJveHBsb3RfZG9zKSANCmBgYA0KDQpTZSBvYnNlcnZhIHF1ZSB0YW50byBob21icmVzIGNvbW8gbXVqZXJlcyB0aWVuZW4gdW5hIG1lZGlhbmEgc2ltaWxhciBlbiBsYSBjYW50aWRhZCBkZSBtZXNlcyBhIGxvcyBxdWUgcmVudW5jaWFuLiANCg0KYGBge3IgZWNobz1GQUxTRX0NCmJveHBsb3RfdHJlcyA8LSBnZ3Bsb3QoYmFqYXMsIGFlcyh4ID0gRXN0YWRvX0NpdmlsLCB5ID0gRGlhc190cmFiYWphZG9zKSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIGdndGl0bGUoIkJveHBsb3QgZGUgRMOtYXMgVHJhYmFqYWRvcyBwb3IgRXN0YWRvIENpdmlsIikgKw0KICB4bGFiKCJFc3RhZG8gQ2l2aWwiKSArDQogIHlsYWIoIkRpYXNfdHJhYmFqYWRvcyIpDQpwcmludChib3hwbG90X3RyZXMpIA0KYGBgDQoNClNlIG9ic2VydmEgcXVlIGxhcyBwZXJzb25hcyBzb2x0ZXJhcyBkdXJhbiB1biBwb2NvIG3DoXMgYW50ZXMgZGUgcmVudWNpYXIgcXVlIGxhcyBwZXJzb25hcyBxdWUgZXN0w6FuIGNhc2FkYXMgbyBlbiB1bmnDs24gbGlicmUuIENhYmUgcmVzYWx0YXIgcXVlLCBsYSBkaWZlcmVuY2lhIGRlIGTDrWFzIGVudHJlIGxvcyBxdWUgcmVudW5jaWEgdW5hIHBlcnNvbmEgc29sdGVyYSB5IGFsZ3VpZW4gY29uIG90cm8gZXN0YWRvIGNpdmlsIGRpZmllcmUgZW4gbXV5IHBvY2EgY2FudGlkYWQuIFRhbWJpw6luLCBlcyBpbXBvcnRhbnRlIHJlc2FsdGFyIHF1ZSBzb24gbXV5IHBvY2FzIHBlcnNvbmFzIGRpdm9yY2lhZGFzIHF1ZSBoYW4gcmVudW5jaWFkby4gDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpnZ3Bsb3QoYmFqYXMsIGFlcyh4ID0gUHVlc3RvLCBmaWxsID0gUHVlc3RvKSkgKw0KICBnZW9tX2JhcigpICsNCiAgbGFicyh4ID0gIkVzdGFkbyBDaXZpbCIsIHkgPSAiRnJlY3VlbmNpYSIsIHRpdGxlID0gIkRpc3RyaWJ1Y2nDs24gZGUgQmFqYXMgcG9yIEVzdGFkbyBDaXZpbCIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpDQpgYGANCg0KRWwgZGVwYXJ0YW1lbnRvIGRlIGNhbGlkYWQgZXMgZWwgZGVwYXJ0YW1lbnRvIGNvbiBtw6FzIG7Dum1lcm8gZGUgYmFqYXMuIFN1IG7Dum1lcm8gZGUgYmFqYXMgZXMgYmFzdGFudGUgc2lnbmlmaWNhdGl2byBlbiBjb21wYXJhY2nDs24gY29uIGxvcyBvdHJvcyBkZXBhcnRhbWVudG9zLiAgDQoNCiMjIyMgVGFibGFzIChmcmVjdWVuY2lhLCBjb250aW5nZW5jaWEpDQoNCiAqIFRhYmxhIGRlIGNvbnRpbmdlbmNpYTogU2l0dWFjacOzbiBkZSBHZW5lcm8gdnMuIE1vdGl2byBkZSBiYWphDQogDQpgYGB7ciBlY2hvPUZBTFNFfQ0KdGFibGFfY29udGluZ2VuY2lhMyA8LSB0YWJsZShiYWphcyRgTW90aXZvIGRlIEJhamFgLCBiYWphcyRHZW5lcm8pDQp0YWJsYV9jb250aW5nZW5jaWEzX2Nvbl90b3RhbGVzIDwtIGFkZG1hcmdpbnModGFibGFfY29udGluZ2VuY2lhMywgbWFyZ2luID0gMToyKQ0KcHJpbnQodGFibGFfY29udGluZ2VuY2lhM19jb25fdG90YWxlcykNCmBgYA0KDQpTZSBvYnNlcnZhIHF1ZSBlbCBwcmluY2lwYWwgbW90aXZvIGRlIHJlbnVuY2lhIGZ1ZSBzZXBhcmFjacOzbiB2b2x1bnRhcmlhIHRhbnRvIHBhcmEgaG9tYnJlcyBjb21vIHBhcmEgbXVqZXJlcy4gIA0KDQogKiBUYWJsYSBkZSBmcmVjdWVuY2lhOiBBw7FvDQoNCmBgYHtyIGVjaG89RkFMU0V9DQp0YWJsYV9mcmVjdWVuY2lhMiA8LSB0YWJsZShiYWphcyRBw7FvKQ0KcHJpbnQodGFibGFfZnJlY3VlbmNpYTIpDQpgYGANCg0KU2Ugb2JzZXJ2YSBxdWUgaHVibyBtw6FzIHJlbnVuY2lhcyBlbiAyMDIzLCBkZSBoZWNobywgbGEgY2FudGlkYWQgZGUgYmFqYXMgZnVlIG3DoXMgZGVsIGRvYmxlIHF1ZSBlbiAyMDIyLiAgDQoNCiMjIyBCYXNlIGRlIGRhdG9zICoqVmVudGFzKioNCg0KIyMjIyBFc3RhZMOtc3RpY2FzIGRlc2NyaXB0aXZhcw0KDQpgYGB7cn0NCmNvbFN1bXMoaXMubmEodmVudGFzKSkNCmBgYA0KDQpgYGB7cn0NCnN1bW1hcnkodmVudGFzKQ0KYGBgDQoNCiMjIyMgTWVkaWRhcyBkZSBkaXNwZXJzacOzbg0KDQpgYGB7cn0NCnJhbmdlKG5hLm9taXQodmVudGFzJFRvdGFsKSkNCmBgYA0KDQpgYGB7cn0NCnNkKG5hLm9taXQodmVudGFzJFRvdGFsKSkNCmBgYA0KDQpgYGB7cn0NCnZhcihuYS5vbWl0KHZlbnRhcyRUb3RhbCkpDQpgYGANCg0KYGBge3J9DQptZWRpYW4obmEub21pdCh2ZW50YXMkVG90YWwpKQ0KYGBgDQoNCmBgYHtyfQ0KbWVkaWFuKG5hLm9taXQodmVudGFzJENhcnRvbikpDQptZWRpYW4obmEub21pdCh2ZW50YXMkUmV0b3JuYWJsZSkpDQptZWRpYW4obmEub21pdCh2ZW50YXMkU2VydmljaW9zKSkNCmBgYA0KDQpgYGB7cn0NCnJhbmdlKG5hLm9taXQodmVudGFzJENhcnRvbikpDQpyYW5nZShuYS5vbWl0KHZlbnRhcyRSZXRvcm5hYmxlKSkNCnJhbmdlKG5hLm9taXQodmVudGFzJFNlcnZpY2lvcykpDQpgYGANCg0KRXN0b3MgZGF0b3MgcG9kZW1vcyBpbnRlcnByZXRhcmxvcyBkZSBsYSBzaWd1aWVudGUgbWFuZXJhOiAgIA0KICogTGFzIHZlbnRhcyB0b3RhbGVzIHByb21lZGlvIHNvbiBkZSAkNywgODcyLCAzNDUuICANCiAqIExvcyB2YWxvcmVzIGVzdMOhbiBkaXNwZXJzb3MgZW4gYXByb3guICQyLCAyMjcsIDUzNCBkZSBsYSBtZWRpYS4gIA0KICogTGFzIHZlbnRhcyB2YW4gZGVzZGUgbG9zICQyLDIzNSw2NjkgaGFzdGEgbG9zICQxMiwyODUsMTIzIHBvciBtZXMgZW50cmUgMjAyMC0yMDIyLiAgDQoNCiMjIyMgVmlzdWFsaXphY2nDs24NCg0KYGBge3J9DQpudW1lcmljX2NvbHVtbnMgPC0gc2FwcGx5KHZlbnRhcywgaXMubnVtZXJpYykNCm51bWVyaWNfZGF0YSA8LSB2ZW50YXNbLCBudW1lcmljX2NvbHVtbnNdDQpjb3JyZWxhdGlvbl9tYXRyaXggPC0gY29yKG5hLm9taXQobnVtZXJpY19kYXRhKSkNCmNvcnJwbG90KGNvcnJlbGF0aW9uX21hdHJpeCkNCmBgYA0KDQpMYSB2YXJpYWJsZSBjb24gbWF5b3IgY29ycmVsYWNpw7NuIGFsIHRvdGFsIGRlIHZlbnRhcyBlcyBlbCBjYXJ0w7NuLg0KDQpgYGB7cn0NCiMgQ3JlYXIgdW4gaGlzdG9ncmFtYSBkZSB2ZW50YXMgcG9yIG1lcw0KZ2dwbG90KHZlbnRhcywgYWVzKHggPSB2ZW50YXMkRmVjaGEsIiVZIiwgeSA9IHZlbnRhcyRDYXJ0b24pKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsID0gIm9yYW5nZSIpICsNCiAgbGFicyh0aXRsZSA9ICJWZW50YXMgZGUgQ2FydG9uIHBvciBNZXMiLA0KICAgICAgIHggPSAiTWVzIiwNCiAgICAgICB5ID0gIlZlbnRhcyBDYXJ0b24iKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdCA9IDEpKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpjb21tYSkgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KYGBgDQoNCkF1bnF1ZSBwb2RlbW9zIG5vdGFyIHF1ZSBlbiAyMDIyIGF1bWVudGFyb24gbGFzIHZlbnRhcyBlbiBjYXJ0w7NuLCBzaWd1ZW4gaGFiaWVuZG8gZmx1Y3R1YWNpb25lcyBjb25mb3JtZSBwYXNhbiBsb3MgbWVzZXMuIA0KDQpgYGB7cn0NCiMgQ2FsY3VsYXIgbGEgc3VtYSBkZSBsYXMgdmVudGFzIGRlIGNhZGEgcHJvZHVjdG8NCnN1bWFfdmVudGFzIDwtIGNvbFN1bXModmVudGFzWywgYygiQ2FydG9uIiwgIlJldG9ybmFibGUiLCAiU2VydmljaW9zIildLCBuYS5ybSA9IFRSVUUpDQoNCiMgQ3JlYXIgdW4gZGF0YWZyYW1lIGNvbiBsb3MgdG90YWxlcyBkZSB2ZW50YXMgcGFyYSBjYWRhIHByb2R1Y3RvDQp2ZW50YXNfdG90YWxlcyA8LSBkYXRhLmZyYW1lKHByb2R1Y3RvID0gbmFtZXMoc3VtYV92ZW50YXMpLCB2ZW50YXMgPSBzdW1hX3ZlbnRhcykNCg0KY29sb3Jlc19uYXJhbmphcyA8LSBjKCIjRkZBNTAwIiwgIiNGRjdGNTAiLCAiI0ZERkQ5NiIpICAjIFB1ZWRlcyBhanVzdGFyIGVzdG9zIGPDs2RpZ29zIGRlIGNvbG9yIHNlZ8O6biB0dXMgcHJlZmVyZW5jaWFzDQoNCiMgQ3JlYXIgZWwgZ3LDoWZpY28gY29uIGxhIHBhbGV0YSBkZSBjb2xvcmVzIG5hcmFuamFzDQpnZ3Bsb3QodmVudGFzX3RvdGFsZXMsIGFlcyh4ID0gIiIsIHkgPSB2ZW50YXMsIGZpbGwgPSBwcm9kdWN0bykpICsNCiAgZ2VvbV9jb2wod2lkdGggPSAxKSArDQogIGNvb3JkX3BvbGFyKHRoZXRhID0gInkiKSArDQogIGxhYnModGl0bGUgPSAiQ29tcGFyYWNpw7NuIGRlIFZlbnRhcyBUb3RhbGVzIiwNCiAgICAgICBmaWxsID0gIlByb2R1Y3RvIiwNCiAgICAgICB4ID0gTlVMTCwNCiAgICAgICB5ID0gTlVMTCkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcmVzX25hcmFuamFzKSArICAjIFVzYXIgbGEgcGFsZXRhIGRlIGNvbG9yZXMgbmFyYW5qYXMgZGVmaW5pZGEgYW50ZXJpb3JtZW50ZQ0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwgDQogICAgICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSkNCmBgYCAgDQoNCkxhcyB2ZW50YXMgdG90YWxlcyBzZSBkaXN0cmlidXllbiBlbiBhcHJveGltYWRhbWVudGUgNzUlIGRlIGNhcnTDs24sIHkgZWwgcmVzdG8gZW4gcmV0b3JuYWJsZSB5IHNlcnZpY2lvcyByZXNwZWN0aXZhbWVudGUuIA0KDQpgYGB7cn0NCiMgU2VwYXJhciBlbCBhw7FvIGRlIGxhIGNvbHVtbmEgZGUgZmVjaGENCnZlbnRhcyRBw7FvIDwtIGZvcm1hdCh2ZW50YXMkRmVjaGEsICIlWSIpDQoNCiMgQ2FsY3VsYXIgbGFzIHZlbnRhcyB0b3RhbGVzIHBvciBhw7FvDQp2ZW50YXNfcG9yX2HDsW8gPC0gdmVudGFzICU+JQ0KICBncm91cF9ieShBw7FvKSAlPiUNCiAgc3VtbWFyaXNlKHZlbnRhc190b3RhbGVzID0gc3VtKG5hLm9taXQoUmV0b3JuYWJsZSkpKQ0KDQojIENyZWFyIHVuIGhpc3RvZ3JhbWEgZGUgdmVudGFzIHBvciBhw7FvDQpnZ3Bsb3QodmVudGFzX3Bvcl9hw7FvLCBhZXMoeCA9IEHDsW8sIHkgPSB2ZW50YXNfdG90YWxlcykpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGZpbGwgPSAib3JhbmdlIikgKw0KICBsYWJzKHRpdGxlID0gIlZFTlRBUyBERSBSRVRPUk5BQkxFIFBPUiBBw5FPIiwNCiAgICAgICB4ID0gIkHDkU8iLA0KICAgICAgIHkgPSAiU1VNQSBERSBSRVRPUk5BQkxFIikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpjb21tYSkgKyANCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KRXMgaW1wb3J0YW50ZSB0b21hciBlbiBjdWVudGEgcXVlIGVuIDIwMjIgbm8gdGVuZW1vcyBsb3MgZGF0b3MgZGUgbG9zIMO6bHRpbW9zIDMgbWVzZXMuIFNpbiBlbWJhcmdvLCBsYXMgdmVudGFzIGRlIHJldG9ybmFibGVzIGVzIG5vdGFibGVtZW50ZSBtYXlvciBlbiAyMDIxLiANCg0KIyMjIyBQcmVkaWNjacOzbiBkZSB2ZW50YXMNCmBgYHtyfQ0KIyBBanVzdGFyIHVuIG1vZGVsbyBkZSByZWdyZXNpw7NuIGxpbmVhbA0KbW9kZWxvIDwtIGxtKFRvdGFsIH4gQ2FydG9uICsgUmV0b3JuYWJsZSArIFNlcnZpY2lvcywgZGF0YSA9IHZlbnRhcykNCg0KIyBIYWNlciBwcmVkaWNjaW9uZXMNCm51ZXZvc19kYXRvcyA8LSBkYXRhLmZyYW1lKENhcnRvbiA9IGMoNTAwMDAwMCwgNjAwMDAwMCw3MDAwMDAwKSwgUmV0b3JuYWJsZSA9IGMoMTAwMDAwMCwgMjAwMDAwMCwgMzAwMDAwMCksIFNlcnZpY2lvcyA9IGMoMTAwMDAwLDUwMDAwMCwxMDAwMDAwKSkNCnByZWRpY2Npb25lcyA8LSBwcmVkaWN0KG1vZGVsbywgbmV3ZGF0YSA9IG51ZXZvc19kYXRvcykNCg0KIyBNb3N0cmFyIGxhcyBwcmVkaWNjaW9uZXMNCnByaW50KHByZWRpY2Npb25lcykNCmBgYA0KDQoNCkxhcyBwcmVndW50YXMgZGUgYW7DoWxpc2lzIGZ1ZXJvbiBsYXMgc2lndWllbnRlczogIA0KDQojIyMjIyDCv0VuIHF1w6kgYcOxbyBodWJvIG3DoXMgcmVudW5jaWFzPyAgDQpFbiBlbCAyMDIzICgyNzkgYmFqYXMpIGh1Ym8gbcOhcyBiYWphcyBlbiBjb21wYXJhY2nDs24gY29uIGVsIGHDsW8gMjAyMiAoMTEyIGJhamFzKS4gIA0KDQojIyMjIyDCv0hheSBmYWN0b3JlcyBlbiBjb23Dum4gZW50cmUgbG9zIGVtcGxlYWRvcyBxdWUgbm8gYWJhbmRvbmFuIGVsIGVtcGxlbyA/ICANCiogTWllbnRyYXMgbcOhcyBhbnRpZ8O8ZWRhZCB0ZW5nYSB1biBlbXBsZWFkbyBlcyBtw6FzIHByb2JhYmxlIHF1ZSBubyByZW51bmNpZS4gIA0KKiBNaWVudHJhcyBtw6FzIGVkYWQgdGVuZ2EgdW4gZW1wZWxhZG8gZXMgbcOhcyBwcm9iYWJsZSBxdWUgbm8gcmVudW5jaWUuICANCiogTGEgbWF5b3LDrWEgcmVzaWRlbiBlbiBBcG9kYWNhLiAgDQoqIExhIG1heW9yw61hIGN1ZW50YW4gY29uIGVzY29sYXJpZGFkIFNlY3VuZGFyaWEuICANCiogTGEgbWF5b3LDrWEgc29uIHNvbHRlcm9zIG8gY2FzYWRvcy4gIA0KKiBObyBzZSBzaWVudGVuIGVzdHJlc2Fkb3MuICANCiogRW50cmFyb24gYSB0cmFiYWphciBhIEZPUk0gcG9ycXVlIGxlcyBxdWVkYSBjZXJjYSBsYSBlbXByZXNhLiAgDQoqIExhIG1heW9yw61hIHNlIHViaWNhbiBlbiBwdWVzdG9zIGRlIFByb2R1Y2Npw7NuLiAgDQoqIExhIG1heW9yw61hIG5vIGhhIGV4cGVyaW1lbnRhZG8gc2l0dWFjaW9uZXMgZGUgY29uZmxpY3RvIG8gYWNvc28uICANCiogTGEgbWF5b3LDrWEgdGllbmUgZW50cmUgMjAgeSAzMCBhw7FvcyAoZXN0ZSBkYXRvIGVzIGludGVyZXNhbnRlIHBvcnF1ZSBkZSBsb3MgcXVlIHJlbnVuY2lhbiBsYSBtYXlvcsOtYSBzZSBlbmN1ZW50cmFuIGVuIGVzdGUgcmFuZ28gZGUgZWRhZCB0YW1iacOpbiwgcG9yIGxvIHF1ZSBwdWVkZSBxdWUgbGEgbWF5b3IgcGFydGUgZGUgbG9zIHRyYWJhamFkb3JlcyBkZSBGT1JNIHNlIGVuY3VlbnRyZW4gZW4gZXN0ZSBpbnRlcnZhbG8gZGUgZWRhZCkuICANCiogTGEgbWF5b3LDrWEgZGUgbG9zIGVtcGxlYWRvcyBkZSBGT1JNIHNpZW50ZW4gYWxlZ3LDrWEgeSBjb25maWFuemEuDQoNCg0KIyMjIyMgwr9IYXkgZmFjdG9yZXMgZW4gY29tw7puIGVudHJlIGxvcyBlbXBsZWFkb3MgcXVlIGFiYW5kb25hbiBlbCBlbXBsZW8/ICANCiogTGEgbWF5b3LDrWEgcmVjaWLDrWEgdW4gc2FsYXJpbyBkaWFyaW8gZW50cmUgJDE3NSB5ICQyMzAgTVhOLiAgDQoqIExhIG1heW9yw61hIGVyYW4gbXVqZXJlcyAoaWd1YWwgcXVlIGxvcyBlbXBsZWFkb3MgYWN0dWFsZXMgcXVlIG5vIGhhbiByZW51bmNpYWRvOyBlc3RvIHN1Y2VkZSBwb3JxdWUgaGF5IG3DoXMgbXVqZXJlcyBxdWUgaG9tYnJlcyBlbiBGT1JNKS4gIA0KKiBMYSBtYXlvcsOtYSBlcmFuIHNvbHRlcm9zIG8gY2FzYWRvcyAoaWd1YWwgcXVlIGxvcyBlbXBsZWFkb3MgYWN0dWFsZXM7IHB1ZWRlIHF1ZSBkZSBtYW5lcmEgZ2VuZXJhbCwgbGEgbWF5b3LDrWEgZGUgbG9zIGVtcGxlYWRvcyBkZSBGT1JNIHRlbmdhbiBlc3RvcyBlc3RhZG9zIGNpdmlsZXMpLiAgDQoqIERlIGxhcyBwZXJzb25hcyBxdWUgcmVudW5jaWFuIGVuIE1vbnRlcnJleSwgbGEgbWVkaWFuYSBlcyBkZSBhbHJlZGVkb3IgZGUgNTUgYcOxb3MuIEVuIGxvcyBkZW3DoXMgTXVuaWNpcGlvcyBsYXMgcGVyc29uYXMgcXVlIHJlbnVuY2lhbiB0aWVuZW4gdW5hIGVkYWQgbcOhcyBwZXF1ZcOxYSAoZW50cmUgMjAgeSA0MCBhw7FvcyksIHNvbiBtw6FzIGrDs3ZlbmVzLiAoQ2FiZSBtZW5jaW9uYXIgcXVlLCBsYSBtYXlvcsOtYSBkZSBsb3MgZW1wbGVhZG9zIGFjdHVhbGVzIGRlIEZPUk0gdGllbmVuIGVudHJlIDIwIHkgMzAgYcOxb3MpLiAgDQoqIEVsIGRlcGFydGFtZW50byBkZSBjYWxpZGFkIGVzIGVsIGRlcGFydGFtZW50byBjb24gbcOhcyBuw7ptZXJvIGRlIGJhamFzLiBTdSBuw7ptZXJvIGRlIGJhamFzIGVzIGJhc3RhbnRlIHNpZ25pZmljYXRpdm8gZW4gY29tcGFyYWNpw7NuIGNvbiBsb3Mgb3Ryb3MgZGVwYXJ0YW1lbnRvcy4gIA0KKiBMYSBtYXlvcsOtYSBkZSBsb3MgZW1wbGVhZG9zLCB0YW50byBob21icmVzIGNvbW8gbXVqZXJlcywgcmVudW5jaWFyb24gcG9yIG1vdGl2b3MgZGUgc2VwYXJhY2nDs24gdm9sdW50YXJpYS4gDQoNCg0KIyMjIyMgwr9FbiBxdcOpIMOhcmVhIGRlIGxhIGVtcHJlc2EgaGFuIHN1Y2VkaWRvIG3DoXMgYmFqYXM/ICANCiogRWwgcHVlc3RvICJBeXVkYW50ZSBnZW5lcmFsIiBlcyBlbCBkZXBhcnRhbWVudG8gY29uIG3DoXMgbsO6bWVybyBkZSBiYWphcyAobG8gY3VhbCBlcyBvYnZpbyBkZWJpZG8gYSBxdWUgZXMgZWwgcHVlc3RvIGNvbiBtYXlpciBuw7ptZXJvIGRlIGVtcGxlYWRvcykNCiogQWN0dWFsbWVudGUgaGF5IG3DoXMgdHJhYmFqYWRvcmVzIGVuIFB1ZXN0b3MgZGUgUHJvZHVjY2nDs24gKENvc3R1cmVyYSwgQXl1ZGFudGUgR2VuZXJhbCwgU29sZGFkb3IpLCBzZWd1aWRvcyBwb3IgcHVlc3RvcyBFc3BlY2lhbGl6YWRvcyB5IGRlIEFkbWluaXN0cmFjacOzbi4gIA0KDQojIEhhbGxhemdvcw0KIyMgUHJpbmNpcGFsZXMgaGFsbGF6Z29zIEVEQSAgDQoqIENvbW8gcHJpbWVyIGhhbGxhemdvIHF1ZSBvYnR1dmUgYSBsbyBsYXJnbyBkZSBsYXMgYmFzZXMgZGUgZGF0b3MgcXVlIGZ1ZXJvbiBhbmFsaXphZGFzIGR1cmFudGUgZXN0b3MgYW7DoWxpc2lzIGV4cGxvcmF0b3Jpb3MgZnVlIHF1ZSBsYSBtYXlvcsOtYSBkZSBsYXMgYmFzZXMgcmVxdWlyaWVyb24gbGV2ZXMgbW9kaWZpY2FjaW9uZXMgdGFudG8gYSBsYSBlc3RydWN0dXJhIGRlIGRpY2hhcyBiYXNlcyBjb21vIGRlbnRybyBkZSBsb3MgbWlzbW9zIGRhdG9zLCB1bmEgdmV6IHJlYWxpemFkYXMgcHVkaW1vcyByZWFsaXphciBhZGVjdWFkYW1lbnRlIGVsIEVEQSwgb2J0ZW5pZW5kbyBsb3Mgc2lndWllbnRlcyBoYWxsYXpnb3MuLi4gIA0KKiBFbiBjdWFudG8gYSBsYSBiYXNlIGRlIGRhdG9zICJlbmN1ZXN0YSIgbG9ncmFtb3MgaWRlbnRpZmljYXIgZ3JhY2lhcyBhIGxhIG1hdHJpeiBkZSBjb25mdXNpw7NuIGFsZ3VuYXMgcmVsYWNpb25lcywgdG9tYW5kbyBlbiBjdWVudGEgY3VhbGVzIHNvbiBsYXMgcHJpbmNpcGFsZXMgcHJvYmxlbcOhdGljYXMgcHJlc2VudGFkYXMgcG9yIGVsIFMuRi4gYXF1ZWxsYXMgY29uIHJlbGFjaW9uZXMgY29uIG1heW9yIHJlbGV2YW5jaWEgc29uOiAgDQoqKiBTaWd1ZSB0cmFiYWphbmRvIGNvbiBwcmVzdGFjaW9uZXMsIHNhbGFyaW8sIGVzdHLDqXMsIGFudGlndWVkYWQgeSBlZGFkICANCioqIFBlcmNlcGNpw7NuIGRlIHNhbGFyaW8gY29uIHJhesOzbiBkZSBpbmdyZXNvICANCioqIE5pdmVsIGRlIGVzdHLDqXMgY29uIHNhbGFyaW8sIHByZXN0YWNpb25lcyB5IGhlcnJhbWllbnRhcyAgDQpFc3RvcyBuaXZlbGVzIGRlIHJlbGFjaW9uZXMgcHVlZGVuIHNlciB1biBwcmltZXIgYWNlcmNhbWllbnRvIGEgcG9zaWJsZXMgZXhwbGljYWNpb25lcyBkZSBjb21vIHNlIGNvbXBvcnRhIG51ZXN0cmEgcG9ibGFjacOzbiB5IGN1YWxlcyBzb24gbGFzIHJhem9uZXMgcXVlIHB1ZGllc2VuIGVzdGFyIHByb3ZvY2FuZG8gZWwgbmFjaW1pZW50byBkZSBsYSBzaXR1YWNpw7NuIHByb2JsZW1hLiAgDQoqIExvcyBhbsOhbGlzaXMgZGUgZW1vY2lvbmVzIG5vIGdlbmVyYXJvbiBpbmZvcm1hY2nDs24gdmFsaW9zYSBvIGFsZXJ0YW50ZSBxdWUgZXhwbGlxdWUgZGlyZWN0YW1lbnRlIGxhIHNpdHVhY2nDs24gcHJvYmxlbWEuICANCiogRW4gZWwgY2FzbyBkZSBsYSBiYXNlIGRlIGRhdG9zICJCYWphcyIgYnVzY2Ftb3MgcG9kZXIgZXhwbGljYXIgbGEgdmFyaWFibGUgZGVwZW5kaWVudGUgcXVlIGVuIGVzdGUgY2FzbyBzb24gbGEgY2FudGlkYWQgZGUgZMOtYXMgdHJhYmFqYWRvcyBwb3IgbG8gcXVlIGlkZW50aWZpY2FyIGNvcnJlY3RhbWVudGUgbGEgcmVhbGNpb24gZSBpbXBhY3RvIHF1ZSBvdHJhcyB2YXJpYWJsZXMgdGllbmVuIHNvYnJlIGVzdGEgZXMgZnVuZGFtZW50YWwgZHVyYW50ZSBsYSBzZWd1bmRhIHBhcnRlIGRlbCBFREEsIGR1cmFudGUgbG9zIGdyw6FmaWNvcyBwb2RlbW9zIG9ic2VydmFyIHF1ZSBsb3MgZMOtYXMgZW4gbG9zIHF1ZSBsYSBnZW50ZSByZW51bmNpYSBzb24gbsO6bWVyb3MgbXV5IGJham9zIHkgYWxlcnRhbnRlcy4gIA0KKiBObyBoYXkgaW5mb3JtYWNpw7NuIHN1ZmljaWVudGUgcGFyYSBkZWNpciBxdWUgZXhpc3RlIHVuYSByZWxhY2nDs24gZW50cmUgYmFqYXMgeSBnw6luZXJvLCBwZXJvIHPDrSBleGlzdGUgdW5hIHJlbGFjacOzbiBlbnRyZSBiYWphcyB5IGVzdGFkbyBjaXZpbC4gIA0KKiBFbiBjdWFudG8gYSBsYSBiYXNlIGRlIGRhdG9zIGRlIHZlbnRhcywgcG9kZW1vcyBvYnNlcnZhciB1bmEgdGVuZGVuY2lhIGEgbGEgYWx6YSBlbiB0ZW1wb3JhbGlkYWRlcyBncmFuZGVzIGEgcGVzYXIgZGUgcXVlIGVuIHRlbXBvcmFsaWRhZGVzIGJhamFzIGNvbnRhbW9zIGNvbiB1bmEgYWx0YSB2b2xhdGlsaWRhZCBvIGNhbWJpb3MgbcOhcyBzaWduaWZpY2F0aXZvcywgZXN0byBwb2Ryw61hIHN1Z2VyaXIgYWxnw7puIHRpcG8gZGUgZXN0YWNpb25hbGlkYWQuICANCiogTGFzIHZlbnRhcyBkZSAicmV0b3JuYWJsZSIgbm8gc29uIGxhIHByaW5jaXBhbCBmdWVudGUgZGUgaW5ncmVzb3MgZGUgRk9STSwgc2luIGVtYmFyZ28gbXVlc3RyYW4gc2VyIG3DoXMgY29uc3RhbnRlcyB5IGVzdGFibGVzLiAgDQoNCiMjIFJlbGFjacOzbiBwcmVkaWNjacOzbiBuZWFyc2hvcmluZyB5IFMuUC4gZGVsIHNvY2lvIGZvcm1hZG9yICANCiogQ29tbyBwb2RlbW9zIG9ic2VydmFyIGVsIGZsdWpvIGRlIEZvcmVpbmcgRGlyZWN0IEludmVzdG1lbnQgaGEgbW9zdHJhZG8gdW5hIGZsdWN0dWFjacOzbiBiYXN0YW50ZSBncmFuZGUgYSBsbyBsYXJnbyBkZSBsb3MgYcOxb3MsIHBvZGVtb3Mgb2JzZXJ2YXIgb3V0bGllcnMgZW4gYWxndW5vcyBhw7FvcyBxdWUgcHJlY2lzYW1lbnRlIGNvaW5jaWRlbiBjb24gZXZlbnRvcyDDum5pY29zIHkgZXh0ZXJub3MgcXVlIG5vIHBvZGVtb3MgY29udHJvbGFyLCBzaW4gZW1iYXJnbyBtZWRpYW50ZSBlbCBwcm9uw7NzdGljbyByZWFsaXphZG8gcG9kZW1vcyBvYnNlcnZhciBxdWUgbGEgaW52ZXJzacOzbiBleHRyYW5qZXJhZSBjb250aW51YXLDoSBjb24gdW5hIHRlbmRlbmNpYSBuZXV0cmEgbyBkZW1hc2lhZG8gYmFqYSBwZXJvIHBvc2l0aXZhLCBlcyBkZWNpciBxdWUgbm8gc2UgbGxlZ2FuIGEgcHJvbm9zdGljYXIgcGljb3MgbyBhbGd1bmEgdGVuZGVuY2lhIGNvbiBpbmNsaW5hY2nDs24gY29uc2lkZXJhYmxlbWVudGUgYWx0ZSBwZXJvIHBvZGVtb3Mgb2JzZXJ2YXIgcXVlIGxvcyB2YWxvcmVzIGNvbnRpbnVhcsOhbiBzaWVuZG8gcG9zaXRpdm9zIHkgY29uc3RhbnRlcywgZXN0byBzZSByZWxhY2lvbmEgZGlyZWN0YW1lbnRlIGEgbGEgc2l0dWFjacOzbiBwcm9ibGVtYSBleHB1ZXN0YSBwb2RlIGVsIHNvY2lvIGZvcm1hZG9yIGVuIGN1YW50byBhbCBwcm9uw7NzdGljbyBkZSB2ZW50YXMgcXVlIHBvZGVtb3MgbG9ncmFyIHNpIGFwcm92ZWNoYW1vcyBlc3RlIHRlbnRhdGl2byBjb21wb3J0YW1pZW50byBjb25zdGFudGUgcGFyYSBwb2RlciBhbnRpY2lwYXJub3MgYSBsYSBkZW1hbmRhIGRlbCBtZXJjYWRvIGxvIGN1YWwgcHVkaWVyYSBwb3NpY2lvbm5hciBhIEZPUk0gZW4gdW5hIHZlbnRhamEgY29tcGV0aXRpdmEgYmFzdGFudGUgdmFsaW9zYS4gIA0KDQoNCiMgUmVmZXJlbmNpYXMgDQoNCkZPUk0uIOKAnFRoZSBGb3JtIFdheSAtLuKAnSBGb3JtLCAyMyBBdWcuIDIwMjEsIGZvcm0uY29tLm14L3RoZS1mb3JtLXdheS8NCkFjY2Vzc2VkIDcgTWFyLiAyMDI0Lg0KDQpOYXZhcnJldGUsIEYuICgyMDI0LCA4IGZlYnJlcm8pLiBNw6l4aWNvIOKAmHNlIHBvbmUgbGFzIHBpbGFz4oCZOiBwcm9kdWNjacOzbiBkZSBhdXRvcyBlbMOpY3RyaWNvcyBhY2VsZXJhIDM2JS4gRWwgRmluYW5jaWVyby4gUmVjdXBlcmFkbyA3IGRlIG1hcnpvIGRlIDIwMjQsIGRlIGh0dHBzOi8vd3d3LmVsZmluYW5jaWVyby5jb20ubXgvZW1wcmVzYXMvMjAyNC8wMi8wNy9tZXhpY28tc2UtcG9uZS1sYXMtcGlsYXMtcHJvZHVjY2lvbi1kZS1hdXRvcy1lbGVjdHJpY29zLWFjZWxlcmEtMzYvDQoNClBsZXJrLiAoMjAyMywgMzAgZW5lcm8pLiAzIGxleWVzIGxhYm9yYWxlcyBlbiBNw6l4aWNvIHF1ZSBkZWJlcyBjb25vY2VyLiBFbCBFY29ub21pc3RhLiBSZWN1cGVyYWRvIDcgZGUgbWFyem8gZGUgMjAyNCwgZGUgaHR0cHM6Ly9lcy5saW5rZWRpbi5jb20vcHVsc2UvMy1sZXllcy1sYWJvcmFsZXMtZW4tbSVDMyVBOXhpY28tcXVlLWRlYmVzLWNvbm9jZXItcGxlcmsNCg0KQW7Ds25pbW8gKDIwMjQpLiBMaXNzZWx5IEFuY2lyYTogVHJhbnNmb3JtYW5kbyBlbCBob3Jpem9udGUgZW5lcmfDqXRpY28gZGUgTnVldm8gTGVvbi4gRWwgZmluYW5jaWVyby4gUmVjdXBlcmFkbyAgZGUgOmh0dHBzOi8vd3d3LmVsZmluYW5jaWVyby5jb20ubXgvbW9udGVycmV5LzIwMjQvMDEvMjYvbGlzc2VseS1hbmNpcmEtdHJhbnNmb3JtYW5kby1lbC1ob3Jpem9udGUtZW5lcmdldGljby1kZS1udWV2by1sZW9uLw0KDQpJc3JhZWwgWmFtYXJyw7NuIChPY3R1YnJlIDIwMjMpLiBOZWFyc2hvcmluZyBlbiBNw6l4aWNvOiBlc3RvcyBzb24gbG9zIGJlbmVmaWNpb3MgcXVlIHBvZHLDrWEgb2J0ZW5lciBlbCBwYcOtcyBhIDIwMzAuIEZvcmJlcyBNw6l4aWNvLiBSZWN1cGVyYWRvIGRlOiBodHRwczovL3d3dy5mb3JiZXMuY29tLm14L25lYXJzaG9yaW5nLWVuLW1leGljby1lc3Rvcy1zb24tbG9zLWJlbmVmaWNpb3MtcXVlLXBvZHJpYS1vYnRlbmVyLWVsLXBhaXMtYS0yMDMwLw0KDQpBbsOzbmltby4oMjAyMykuIEVuZXJnaWEgdmVyZGUsIHNvbHVjaW9uZXMgZGlzcG9uaWJsZXMgZW4gTcOpeGljby4gRW5lbCwgcmVjdXBlcmFkbyBkZTogaHR0cHM6Ly93d3cuZW5lbC5teC9lcy9ibG9nL2Nvbm9jaWVuZG8tZWwtbWVyY2Fkby1lbmVyZ2V0aWNvL0VuZXJnaWEtdmVyZGUtc29sdWNpb25lcy1kaXNwb25pYmxlcy1lbi1NZXhpY28NCg0KRGUgTHVuYSwgVC4gKDIwMjQsIDcgZmVicmVybykuIExhIGV4cG9ydGFjacOzbiBkZSBhdXRvcyBoZWNob3MgZW4gTcOpeGljbyB0b2NhIHVuYSBjaWZyYSBoaXN0w7NyaWNhLiBFeHBhbnNpw7NuLiBSZWN1cGVyYWRvIDcgZGUgbWFyem8gZGUgMjAyNCwgZGUgaHR0cHM6Ly9leHBhbnNpb24ubXgvZW1wcmVzYXMvMjAyNC8wMi8wNy9leHBvcnRhY2lvbi1hdXRvcy1oZWNob3MtbWV4aWNvLWNpZnJhLWhpc3RvcmljYQ0KDQpDYW50ZXJhLCBTLiAoMjAyNCwgMTAgZW5lcm8pLiBQcm95ZWN0YW4gZmFicmljYXIgICAgNC4xIG1pbGxvbmVzIGRlIGF1dG9zIG51ZXZvcyBkdXJhbnRlIDIwMjQuIEVsIFVuaXZlcnNhbC4gaHR0cHM6Ly93d3cuZWx1bml2ZXJzYWwuY29tLm14L2NhcnRlcmEvcHJveWVjdGFuLWZhYnJpY2FyLTQxLW1pbGxvbmVzLWRlLWF1dG9zLW51ZXZvcy1kdXJhbnRlLTIwMjQvDQoNClRob21zb24gUmV1dGVycyBNZXhpY28uIChzLiBmLikuIE5lYXJzaG9yaW5nOiBMYSBzb2x1Y2nDs24gYWN0dWFsIHBhcmEgZWwgY29tZXJjaW8gZXh0ZXJpb3IuIGh0dHBzOi8vd3d3LnRob21zb25yZXV0ZXJzbWV4aWNvLmNvbS9lcy1teC9zb2x1Y2lvbmVzLWRlLWNvbWVyY2lvLWV4dGVyaW9yL2Jsb2ctY29tZXJjaW8tZXh0ZXJpb3IvbmVhcnNob3JpbmctbGEtc29sdWNpb24tYWN0dWFsLXBhcmEtZWwtY29tZXJjaW8tZXh0ZWlvciM6fjp0ZXh0PSVDMiVCRlF1JUMzJUE5JTIwZXMlMjBuZWFyc2hvcmluZyUzRixjb24lMjB1bmElMjB6b25hJTIwaG9yYXJpYSUyMHNlbWVqYW50ZS4NCg0KTWFydMOtbmV6LCBBLiwgTWFydMOtbmV6LCBBLiwgJiBNYXJ0w61uZXosIEEuICgyMDIzLCAyMCBzZXB0aWVtYnJlKS4gwr9Qb3IgcXXDqSBoYXkgdW5hIGh1ZWxnYSBhdXRvbW90cml6IGVuIEVzdGFkb3MgVW5pZG9zIGNvbnRyYSBHTSwgRm9yZCB5IFN0ZWxsYW50aXM/IEVsIFBhw61zIE3DqXhpY28uIGh0dHBzOi8vZWxwYWlzLmNvbS9tZXhpY28vMjAyMy0wOS0yMC9wb3ItcXVlLWhheS11bmEtaHVlbGdhLWF1dG9tb3RyaXotZW4tZXN0YWRvcy11bmlkb3MtY29udHJhLWdtLWZvcmQteS1zdGVsbGFudGlzLmh0bWwNCg0KTWV0YWxtZWPDoW5pY2EuICgyMDIzLCAyNiBqdWxpbykuIE5vcnRlYW3DqXJpY2EgZW4gbWFyY2hhIGhhY2lhIGxhIHNvc3RlbmliaWxpZGFkIGF1dG9tb3RyaXpici4gTWV0YWxtZWPDoW5pY2EuIGh0dHBzOi8vd3d3Lm1ldGFsbWVjYW5pY2EuY29tL2VzL25vdGljaWFzL25vcnRlYW1lcmljYS1lbi1tYXJjaGEtaGFjaWEtbGEtc29zdGVuaWJpbGlkYWQtYXV0b21vdHJpeg0KDQpUZWxldW5pdmVyc28uICgyMDI0LCAzIGZlYnJlcm8pLiBDYW1iaW9zIGRlbW9ncsOhZmljb3MgbWFyY2Fyw6EgdW5hIGVyYSBlbiBFc3RhZG9zIFVuaWRvcy4gQFRlbGV1bml2ZXJzby4gaHR0cHM6Ly90ZWxldW5pdmVyc290di5jb20vY2FtYmlvcy1kZW1vZ3JhZmljb3MtbWFyY2FyYS11bmEtZXJhLWVuLWVzdGFkb3MtdW5pZG9zLw0KDQoNCg==