0. Libraries & Data

library(readxl)
library(dplyr)
library(tidyr)
library(stringr)
library(ggplot2)
library(sf)
library(reshape2)
library(rnaturalearth)
library(rnaturalearthdata)
file <- "C:/Users/migue/OneDrive/Desktop/inegi_exports_datasetpanel.xlsx"

data            <- read_excel(file, sheet = "data")
exports         <- read_excel(file, sheet = "exports")
fdi             <- read_excel(file, sheet = "fdi")
panel_2016_2024 <- read_excel(file, sheet = "panel")
ts_exports_raw  <- read_excel(file, sheet = "ts_exports")

I. Mexico’s Exports Performance

a. Performance 2015–2025: 3 Main Characteristics

ts_exports_plot <- ts_exports_raw %>%
  mutate(date = as.Date(paste0(str_replace(date, "/", "-"), "-01"))) %>%
  filter(date >= as.Date("2015-01-01"),
         date <= as.Date("2025-12-31"))
ggplot(ts_exports_plot, aes(x = date, y = ts_exports, group = 1)) +
  annotate("rect",
           xmin = as.Date("2020-01-01"),
           xmax = as.Date("2021-12-31"),
           ymin = -Inf, ymax = Inf,
           fill = "red", alpha = 0.2) +
  geom_line(color = "#1874CD", linewidth = 0.8) +
  scale_x_date(date_breaks = "1 year", date_labels = "%Y") +
  labs(
    title    = "Desempeño de las Exportaciones de México (2015–2025)",
    subtitle = "Zona roja: periodo de pandemia COVID-19",
    x        = "Año",
    y        = "Exportaciones (MXN)"
  ) +
  theme_minimal()

  • Tendencia creciente en el largo plazo. Las exportaciones de México muestran una tendencia general al alza durante la última década, reflejo de la integración progresiva del país a cadenas de valor globales.

  • Caída significativa en 2020. Se observa una disminución abrupta alrededor del año 2020, siendo la mayor disrupción del periodo analizado. Esta caída está directamente asociada a las interrupciones del comercio internacional provocadas por la pandemia de COVID-19.

  • Fuerte recuperación post-pandemia (2021–2025). Después de 2020, las exportaciones se recuperan rápidamente y retoman su trayectoria ascendente. Para 2023–2025, los niveles alcanzan e incluso superan los valores previos a la pandemia.


b. ¿Cómo contribuye el análisis de datos panel?

El análisis de datos panel combina información transversal (entre estados) y temporal (a lo largo de los años), lo que permite analizar cómo diferentes factores económicos influyen en el desempeño exportador de cada región. Este enfoque controla características no observables que permanecen constantes en el tiempo —como la infraestructura o la ubicación geográfica— facilitando la identificación de los determinantes estructurales que explican el comportamiento de las exportaciones en México.


c. ¿Cómo puede predecir el desempeño exportador a 1–2 años?

Al aprovechar la evolución histórica de las exportaciones en cada estado, el análisis de datos panel permite estimar el efecto de variables económicas a lo largo del tiempo. Esto facilita proyectar el comportamiento futuro de las exportaciones y anticipar posibles cambios en la demanda externa, permitiendo estimar su desempeño en el corto plazo, como en los próximos 1 a 2 años.


d. ¿Cómo pueden las herramientas de BI identificar vulnerabilidades ante cambios del USMCA?

Las herramientas de Business Intelligence permiten analizar grandes volúmenes de datos comerciales y económicos para identificar patrones en el comportamiento exportador. La analítica predictiva facilita estimar el impacto potencial de cambios en aranceles o reglas comerciales, permitiendo anticipar qué estados o sectores podrían verse más afectados. Además, estas herramientas ayudan a monitorear la dependencia comercial hacia Estados Unidos, identificando aquellas regiones cuya actividad exportadora es más sensible a modificaciones en las políticas comerciales.


II. Exploratory Data Analysis – EDA

Descriptive Statistics

Selección de variables por correlación

panel_num <- panel_2016_2024 %>%
  select(where(is.numeric))

cor_matrix  <- cor(panel_num, use = "complete.obs")
cor_exports <- cor_matrix["real_exports", ]
cor_exports <- sort(cor_exports, decreasing = TRUE)

cor_exports
##              real_exports              lq_secondary  border_economic_activity 
##               1.000000000               0.708024001               0.645127331 
##      average_daily_salary       gdp_per_capita_2018               fdi_inflows 
##               0.399570893               0.347703254               0.297079006 
##                crime_rate         college_education                      inpc 
##               0.148297493               0.058223300               0.030297127 
##                      year             exchange_rate real_public_investment_pc 
##               0.026519615               0.002299666              -0.068831138 
##               pop_density                lq_primary               lq_tertiary 
##              -0.125956361              -0.336599268              -0.518744646 
##           border_distance 
##              -0.750170777

Con base en las correlaciones con real_exports, se seleccionan las siguientes variables de interés:

vars <- c("real_exports",
          "lq_secondary",
          "border_economic_activity",
          "average_daily_salary")

a. Promedio por región

regional_avg <- panel_2016_2024 %>%
  group_by(region) %>%
  summarise(across(all_of(vars), ~ mean(.x, na.rm = TRUE))) %>%
  pivot_longer(cols      = -region,
               names_to  = "variable",
               values_to = "avg_value")

ggplot(regional_avg, aes(x = region, y = avg_value, fill = region)) +
  geom_col(show.legend = FALSE) +
  facet_wrap(~ variable, scales = "free_y", ncol = 2) +
  coord_cartesian(clip = "off") +
  scale_fill_brewer(palette = "Set2") +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    strip.text  = element_text(size = 10),
    plot.margin = margin(10, 10, 30, 30)
  ) +
  labs(
    title = "Promedio Regional de Variables Clave",
    x     = "Región",
    y     = "Promedio"
  )

Se observa que el Noreste presenta los mayores niveles de exportaciones, acompañados de mayor especialización en el sector secundario y salarios promedio más altos, lo que sugiere una estructura productiva más orientada a la actividad industrial. En contraste, el Sur presenta menores niveles en todas estas variables, reflejando una menor participación en actividades vinculadas a mercados externos.


b. Histogramas

panel_long <- panel_2016_2024 %>%
  select(all_of(vars)) %>%
  pivot_longer(
    cols      = everything(),
    names_to  = "variable",
    values_to = "value"
  ) %>%
  mutate(
    value = if_else(variable == "real_exports",
                    log1p(pmax(value, 0)),
                    value)
  )

ggplot(panel_long, aes(x = value, fill = variable)) +
  geom_histogram(bins = 30, alpha = 0.8) +
  facet_wrap(~ variable, scales = "free") +
  scale_fill_brewer(palette = "Set2") +
  theme_minimal() +
  theme(
    strip.text      = element_text(size = 11),
    legend.position = "none"
  ) +
  labs(
    title    = "Histogramas de Variables Seleccionadas",
    subtitle = "real_exports graficado en escala log"
  )


Statistics of Dispersion

a. Boxplots por región

box_data <- panel_2016_2024 %>%
  select(region, all_of(vars)) %>%
  pivot_longer(
    cols      = -region,
    names_to  = "variable",
    values_to = "value"
  )

ggplot(box_data, aes(x = region, y = value, fill = variable)) +
  geom_boxplot(alpha = 0.7) +
  facet_wrap(~ variable, scales = "free_y") +
  scale_fill_brewer(palette = "Set2") +
  theme_minimal() +
  theme(
    axis.line       = element_line(color = "black"),
    axis.ticks      = element_line(color = "black"),
    panel.grid      = element_blank(),
    axis.text.x     = element_text(angle = 45, hjust = 1),
    strip.text      = element_text(size = 11),
    legend.position = "none"
  ) +
  labs(
    title = "Distribución de Variables por Región",
    x     = "Región",
    y     = "Valor"
  )

Las exportaciones reales presentan una distribución sesgada hacia la derecha, indicando que solo algunas regiones concentran niveles altos de exportación. El Noreste muestra la mayor mediana y dispersión, acompañado de mayor especialización industrial y salarios más altos. La concentración de valores negativos en border_economic_activity indica que la mayoría de los estados presentan menor actividad económica vinculada al comercio con EE.UU.


Visualization across Time

a. Evolución anual de exportaciones

ts_annual <- panel_2016_2024 %>%
  group_by(year) %>%
  summarise(
    avg_exports = mean(real_exports, na.rm = TRUE),
    .groups     = "drop"
  ) %>%
  mutate(avg_exports_log = log1p(avg_exports))

ggplot(ts_annual, aes(x = year, y = avg_exports_log)) +
  geom_line(color = "#52A8BC", linewidth = 1.2) +
  geom_point(color = "#E84746", size = 2) +
  theme_minimal() +
  labs(
    title = "Evolución de las Exportaciones Reales (Log)",
    x     = "Año",
    y     = "Log de Exportaciones Promedio"
  )

Las exportaciones reales muestran una tendencia general al alza, con caídas en años como 2018, 2021 y 2024. Debido al rezago temporal incorporado en las variables, estas disminuciones reflejan choques ocurridos en el año previo. La recuperación en 2024 indica una reactivación exportadora tras periodos de contracción.


b. Evolución de exportaciones por región

ts_region <- panel_2016_2024 %>%
  group_by(region, year) %>%
  summarise(
    avg_exports = mean(real_exports, na.rm = TRUE),
    .groups     = "drop"
  ) %>%
  mutate(avg_exports_log = log1p(avg_exports))

ggplot(ts_region, aes(x = year, y = avg_exports_log, color = region)) +
  geom_line(linewidth = 1.2) +
  geom_point(size = 2) +
  theme_minimal() +
  labs(
    title = "Evolución de Exportaciones Reales por Región (Log)",
    x     = "Año",
    y     = "Log de Exportaciones Promedio",
    color = "Región"
  )

Las regiones no reaccionan de forma uniforme ante choques económicos. Algunas muestran mayor estabilidad mientras que otras presentan variaciones más pronunciadas, evidenciando heterogeneidad regional y la existencia de choques generales que afectan simultáneamente a varias regiones.


c. Exportaciones vs. Tipo de Cambio

ts_macro <- panel_2016_2024 %>%
  group_by(year) %>%
  summarise(
    avg_exports = mean(real_exports,  na.rm = TRUE),
    avg_exrate  = mean(exchange_rate, na.rm = TRUE),
    .groups     = "drop"
  ) %>%
  mutate(
    exports_std = as.numeric(scale(log1p(avg_exports))),
    exrate_std  = as.numeric(scale(avg_exrate))
  ) %>%
  select(year, exports_std, exrate_std) %>%
  pivot_longer(
    cols      = -year,
    names_to  = "variable",
    values_to = "value"
  )

ggplot(ts_macro, aes(x = year, y = value, color = variable)) +
  geom_line(linewidth = 1.2) +
  geom_point(size = 2) +
  scale_color_manual(
    values = c("exports_std" = "#1874CD", "exrate_std" = "#E84746"),
    labels = c("exports_std" = "Exportaciones (std)", "exrate_std" = "Tipo de Cambio (std)")
  ) +
  theme_minimal() +
  labs(
    title = "Exports Inflows vs. Exchange Rate Performance",
    x     = "Year",
    y     = "Standardized Value",
    color = "Indicator"
  )

Se observan movimientos simultáneos en 2021 y 2024. Cuando el tipo de cambio disminuye (el peso se aprecia frente al dólar), los ingresos por exportaciones en pesos tienden a reducirse, ya que los dólares recibidos se traducen en menos pesos.


Regional Differences

a. Norte vs. Sur a lo largo del tiempo

bar_ns_time <- panel_2016_2024 %>%
  mutate(
    macro_region = case_when(
      region %in% c("Noroeste", "Noreste") ~ "North",
      region == "Sur"                      ~ "South",
      TRUE                                 ~ "Other"
    )
  ) %>%
  filter(macro_region %in% c("North", "South")) %>%
  group_by(year, macro_region) %>%
  summarise(
    avg_exports = mean(real_exports, na.rm = TRUE),
    .groups     = "drop"
  )

ggplot(bar_ns_time, aes(x = factor(year), y = avg_exports, fill = macro_region)) +
  geom_col(position = "dodge", alpha = 0.85) +
  scale_fill_manual(values = c("North" = "#52A8BC", "South" = "#E84746")) +
  theme_minimal() +
  labs(
    title = "Exportaciones Reales: Norte vs. Sur (2016–2024)",
    x     = "Año",
    y     = "Exportaciones Promedio",
    fill  = "Región"
  )


b. Mapa de exportaciones promedio por estado

exports_avg <- panel_2016_2024 %>%
  group_by(state) %>%
  summarise(
    avg_exports = mean(real_exports, na.rm = TRUE),
    .groups     = "drop"
  )

mexico_map  <- ne_states(country = "mexico", returnclass = "sf")

mexico_data <- mexico_map %>%
  left_join(exports_avg, by = c("name" = "state"))

ggplot(mexico_data) +
  geom_sf(aes(fill = avg_exports)) +
  scale_fill_gradient(low  = "lightyellow",
                      high = "#E84746",
                      name = "Exportaciones\npromedio") +
  labs(title = "Promedio de Exportaciones por Estado en México (2016–2024)") +
  theme_minimal()


c. Norte vs. Sur: Exposición a mercados internacionales

data_ns <- panel_2016_2024 %>%
  mutate(
    north_south = case_when(
      region %in% c("Noroeste", "Noreste") ~ "North",
      region == "Sur"                      ~ "South",
      TRUE                                 ~ NA_character_
    )
  ) %>%
  filter(!is.na(north_south))

data_ns_long <- data_ns %>%
  select(north_south, real_exports, fdi_inflows,
         border_economic_activity, border_distance) %>%
  pivot_longer(
    cols      = -north_south,
    names_to  = "variable",
    values_to = "value"
  )

ggplot(data_ns_long, aes(x = north_south, y = value, fill = north_south)) +
  geom_boxplot(alpha = 0.7, outlier.alpha = 0.5) +
  facet_wrap(~ variable, scales = "free") +
  scale_fill_manual(values = c("North" = "#52A8BC", "South" = "#E84746")) +
  theme_minimal() +
  theme(legend.position = "none") +
  labs(
    title = "Norte vs. Sur: Exposición a los Mercados Internacionales",
    x     = "",
    y     = "Value"
  )

Al comparar las regiones del Norte y Sur, se observan diferencias importantes en su nivel de exposición a los mercados internacionales. Estas diferencias se explican por los siguientes factores estructurales:

  • Proximidad geográfica a EE.UU. Los estados del Norte están más cerca de la frontera, lo que reduce costos logísticos y facilita la integración a cadenas globales de valor.
  • Mayores flujos de FDI. La mayor entrada de inversión extranjera en el Norte contribuye al desarrollo de infraestructura productiva orientada a la exportación.
  • Mayor especialización industrial (lq_secondary). Los estados del Norte concentran más actividades manufactureras vinculadas al comercio internacional.
  • Mayor actividad económica fronteriza. Una mayor intensidad de intercambios en la frontera incrementa la integración económica con otros países.
  • Menor distancia al mercado externo. La menor distancia a la frontera reduce tiempos y costos de traslado, incrementando la competitividad exportadora.

Correlation and Relationships

a. Matriz de correlación (Heatmap)

corr_melt <- melt(cor_matrix)

ggplot(corr_melt, aes(x = Var1, y = Var2, fill = value)) +
  geom_tile() +
  geom_tile(
    data      = subset(corr_melt, Var1 == "real_exports" | Var2 == "real_exports"),
    color     = "black",
    linewidth = 0.7
  ) +
  scale_fill_gradient2(
    low      = "#E84746",
    high     = "#52A8BC",
    mid      = "white",
    midpoint = 0,
    limit    = c(-1, 1),
    name     = "Correlation"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  labs(
    title = "Matriz de Correlación – Variables del Panel",
    x     = "",
    y     = ""
  )


b. Scatterplots: Exportaciones vs. Variables Clave

scatter_data <- panel_2016_2024 %>%
  select(real_exports, lq_secondary,
         border_economic_activity,
         average_daily_salary,
         fdi_inflows) %>%
  pivot_longer(
    cols      = -real_exports,
    names_to  = "variable",
    values_to = "value"
  )

ggplot(scatter_data, aes(x = value, y = real_exports)) +
  geom_point(alpha = 0.6, color = "#52A8BC") +
  geom_smooth(method = "lm", color = "#E84746", se = TRUE) +
  facet_wrap(~ variable, scales = "free") +
  theme_minimal() +
  labs(
    title = "Exportaciones vs. Variables Económicas Seleccionadas",
    x     = "Variable Independiente",
    y     = "Exportaciones Reales"
  )

Los scatterplots muestran relaciones positivas entre las exportaciones y las variables seleccionadas. La especialización en el sector secundario y los flujos de FDI presentan las asociaciones más fuertes con el desempeño exportador, mientras que el salario diario promedio también muestra una relación positiva consistente con la teoría económica.


III. Hypotheses Statements

Con base en los resultados del EDA, se plantean las siguientes hipótesis:

H1 – Especialización industrial y exportaciones. Los estados con mayor especialización en el sector secundario (lq_secondary) presentan niveles significativamente más altos de exportaciones reales, controlando por efectos fijos de estado y año.

H2 – Salario y competitividad exportadora. Existe una relación positiva entre el salario diario promedio y las exportaciones reales, dado que salarios más altos reflejan mayor productividad y sofisticación industrial en los estados exportadores.

H3 – FDI como determinante de exportaciones. Los estados que reciben mayores flujos de Inversión Extranjera Directa presentan un mayor desempeño exportador, ya que la IED facilita la integración a cadenas de valor globales.

H4 – Proximidad a la frontera y exportaciones. Los estados con menor distancia a la frontera norte muestran mayores niveles de exportación, debido a menores costos logísticos y mayor acceso a los mercados de América del Norte.

H5 – Tipo de cambio y exportaciones. Una depreciación del tipo de cambio (aumento en el valor del dólar relativo al peso) se asocia positivamente con el nivel de exportaciones reales, al hacer más competitivos los productos mexicanos en el exterior.


IV. Main Findings

Con base en los resultados del análisis exploratorio, se identifican los siguientes hallazgos principales:

1. Tendencia creciente con choque pandémico. Las exportaciones crecieron sostenidamente entre 2016 y 2024, con una caída abrupta en 2020 por COVID-19 y una recuperación acelerada posterior que superó los niveles pre-pandemia hacia 2023–2024.

2. Alta concentración regional en el Norte. El Noreste y Noroeste concentran la mayor parte del valor exportado. Esta brecha Norte–Sur es estructural y se mantiene consistente a lo largo de todo el periodo analizado.

3. La especialización industrial es el principal correlacionado de las exportaciones. El cociente de localización del sector secundario (lq_secondary) muestra una de las correlaciones más altas con real_exports, lo que sugiere que los estados más industrializados son también los más exportadores.

4. El FDI y la cercanía a la frontera son factores diferenciadores clave. Los estados del Norte concentran mayores flujos de IED y menor distancia geográfica a EE.UU., lo que explica en gran medida su mayor integración a mercados internacionales respecto al Sur.

5. El tipo de cambio co-mueve con las exportaciones. Se identificaron periodos (2021 y 2024) donde movimientos en el tipo de cambio coinciden con cambios en el desempeño exportador, consistente con la teoría económica sobre competitividad cambiaria.

6. Distribución sesgada de exportaciones. La distribución de exportaciones reales está fuertemente sesgada hacia la derecha: la mayoría de los estados exportan volúmenes bajos, mientras que unos pocos concentran niveles muy altos.

7. Heterogeneidad regional ante choques externos. Las series de tiempo por región muestran que los choques económicos no afectan de igual forma a todas las regiones, lo que justifica el uso de datos panel con efectos fijos para controlar esta heterogeneidad no observada en modelos econométricos posteriores.

LS0tDQp0aXRsZTogIkFzc2lnbm1lbnQgMSDigJMgRXhwbG9yYXRvcnkgUGFuZWwgRGF0YSBBbmFseXNpcyINCnN1YnRpdGxlOiAiQ0QzMDAxQiDCtyBGdXR1cmUgU2NlbmFyaW8gR2VuZXJhdGlvbiB1c2luZyBBbmFseXRpY3MiDQphdXRob3I6ICJLYXJsYSBNaXJleWEgVmVsZGVycmFpbiDCtyBBMDAyMjc0MTEsIE1pZ3VlbCBBbmdlbCBMb3BleiBBMDExNzgxNDIsIERhcmlvIEdhbGxhcmRvIEEwMTI4NTczNiINCmRhdGU6ICJGZWJyZXJvIDE4IDIwMjYiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgdG9jX2RlcHRoOiAzDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIHRoZW1lOiBjZXJ1bGVhbg0KICAgIGhpZ2hsaWdodDogdGFuZ28NCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldCgNCiAgd2FybmluZyA9IEZBTFNFLA0KICBtZXNzYWdlID0gRkFMU0UsDQogIGZpZy5hbGlnbiA9ICJjZW50ZXIiDQopDQpgYGANCg0KLS0tDQoNCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6I0U4NDc0NiI+IDAuIExpYnJhcmllcyAmIERhdGEgPC9zcGFuPg0KDQpgYGB7ciBsaWJyYXJpZXN9DQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHRpZHlyKQ0KbGlicmFyeShzdHJpbmdyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShzZikNCmxpYnJhcnkocmVzaGFwZTIpDQpsaWJyYXJ5KHJuYXR1cmFsZWFydGgpDQpsaWJyYXJ5KHJuYXR1cmFsZWFydGhkYXRhKQ0KYGBgDQoNCmBgYHtyIGxvYWQtZGF0YX0NCmZpbGUgPC0gIkM6L1VzZXJzL21pZ3VlL09uZURyaXZlL0Rlc2t0b3AvaW5lZ2lfZXhwb3J0c19kYXRhc2V0cGFuZWwueGxzeCINCg0KZGF0YSAgICAgICAgICAgIDwtIHJlYWRfZXhjZWwoZmlsZSwgc2hlZXQgPSAiZGF0YSIpDQpleHBvcnRzICAgICAgICAgPC0gcmVhZF9leGNlbChmaWxlLCBzaGVldCA9ICJleHBvcnRzIikNCmZkaSAgICAgICAgICAgICA8LSByZWFkX2V4Y2VsKGZpbGUsIHNoZWV0ID0gImZkaSIpDQpwYW5lbF8yMDE2XzIwMjQgPC0gcmVhZF9leGNlbChmaWxlLCBzaGVldCA9ICJwYW5lbCIpDQp0c19leHBvcnRzX3JhdyAgPC0gcmVhZF9leGNlbChmaWxlLCBzaGVldCA9ICJ0c19leHBvcnRzIikNCmBgYA0KDQotLS0NCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6I0U4NDc0NiI+IEkuIE1leGljbydzIEV4cG9ydHMgUGVyZm9ybWFuY2UgPC9zcGFuPg0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6I0NEMTA3NiI+IGEuIFBlcmZvcm1hbmNlIDIwMTXigJMyMDI1OiAzIE1haW4gQ2hhcmFjdGVyaXN0aWNzIDwvc3Bhbj4NCg0KYGBge3IgdHMtZXhwb3J0cy1wcmVwfQ0KdHNfZXhwb3J0c19wbG90IDwtIHRzX2V4cG9ydHNfcmF3ICU+JQ0KICBtdXRhdGUoZGF0ZSA9IGFzLkRhdGUocGFzdGUwKHN0cl9yZXBsYWNlKGRhdGUsICIvIiwgIi0iKSwgIi0wMSIpKSkgJT4lDQogIGZpbHRlcihkYXRlID49IGFzLkRhdGUoIjIwMTUtMDEtMDEiKSwNCiAgICAgICAgIGRhdGUgPD0gYXMuRGF0ZSgiMjAyNS0xMi0zMSIpKQ0KYGBgDQoNCmBgYHtyIHRzLWV4cG9ydHMtcGxvdH0NCmdncGxvdCh0c19leHBvcnRzX3Bsb3QsIGFlcyh4ID0gZGF0ZSwgeSA9IHRzX2V4cG9ydHMsIGdyb3VwID0gMSkpICsNCiAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICB4bWluID0gYXMuRGF0ZSgiMjAyMC0wMS0wMSIpLA0KICAgICAgICAgICB4bWF4ID0gYXMuRGF0ZSgiMjAyMS0xMi0zMSIpLA0KICAgICAgICAgICB5bWluID0gLUluZiwgeW1heCA9IEluZiwNCiAgICAgICAgICAgZmlsbCA9ICJyZWQiLCBhbHBoYSA9IDAuMikgKw0KICBnZW9tX2xpbmUoY29sb3IgPSAiIzE4NzRDRCIsIGxpbmV3aWR0aCA9IDAuOCkgKw0KICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMSB5ZWFyIiwgZGF0ZV9sYWJlbHMgPSAiJVkiKSArDQogIGxhYnMoDQogICAgdGl0bGUgICAgPSAiRGVzZW1wZcOxbyBkZSBsYXMgRXhwb3J0YWNpb25lcyBkZSBNw6l4aWNvICgyMDE14oCTMjAyNSkiLA0KICAgIHN1YnRpdGxlID0gIlpvbmEgcm9qYTogcGVyaW9kbyBkZSBwYW5kZW1pYSBDT1ZJRC0xOSIsDQogICAgeCAgICAgICAgPSAiQcOxbyIsDQogICAgeSAgICAgICAgPSAiRXhwb3J0YWNpb25lcyAoTVhOKSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCi0gKipUZW5kZW5jaWEgY3JlY2llbnRlIGVuIGVsIGxhcmdvIHBsYXpvLioqIExhcyBleHBvcnRhY2lvbmVzIGRlIE3DqXhpY28gbXVlc3RyYW4gdW5hIHRlbmRlbmNpYSBnZW5lcmFsIGFsIGFsemEgZHVyYW50ZSBsYSDDumx0aW1hIGTDqWNhZGEsIHJlZmxlam8gZGUgbGEgaW50ZWdyYWNpw7NuIHByb2dyZXNpdmEgZGVsIHBhw61zIGEgY2FkZW5hcyBkZSB2YWxvciBnbG9iYWxlcy4NCg0KLSAqKkNhw61kYSBzaWduaWZpY2F0aXZhIGVuIDIwMjAuKiogU2Ugb2JzZXJ2YSB1bmEgZGlzbWludWNpw7NuIGFicnVwdGEgYWxyZWRlZG9yIGRlbCBhw7FvIDIwMjAsIHNpZW5kbyBsYSBtYXlvciBkaXNydXBjacOzbiBkZWwgcGVyaW9kbyBhbmFsaXphZG8uIEVzdGEgY2HDrWRhIGVzdMOhIGRpcmVjdGFtZW50ZSBhc29jaWFkYSBhIGxhcyBpbnRlcnJ1cGNpb25lcyBkZWwgY29tZXJjaW8gaW50ZXJuYWNpb25hbCBwcm92b2NhZGFzIHBvciBsYSBwYW5kZW1pYSBkZSBDT1ZJRC0xOS4NCg0KLSAqKkZ1ZXJ0ZSByZWN1cGVyYWNpw7NuIHBvc3QtcGFuZGVtaWEgKDIwMjHigJMyMDI1KS4qKiBEZXNwdcOpcyBkZSAyMDIwLCBsYXMgZXhwb3J0YWNpb25lcyBzZSByZWN1cGVyYW4gcsOhcGlkYW1lbnRlIHkgcmV0b21hbiBzdSB0cmF5ZWN0b3JpYSBhc2NlbmRlbnRlLiBQYXJhIDIwMjPigJMyMDI1LCBsb3Mgbml2ZWxlcyBhbGNhbnphbiBlIGluY2x1c28gc3VwZXJhbiBsb3MgdmFsb3JlcyBwcmV2aW9zIGEgbGEgcGFuZGVtaWEuDQoNCi0tLQ0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6I0NEMTA3NiI+IGIuIMK/Q8OzbW8gY29udHJpYnV5ZSBlbCBhbsOhbGlzaXMgZGUgZGF0b3MgcGFuZWw/IDwvc3Bhbj4NCg0KRWwgYW7DoWxpc2lzIGRlIGRhdG9zIHBhbmVsIGNvbWJpbmEgaW5mb3JtYWNpw7NuIHRyYW5zdmVyc2FsIChlbnRyZSBlc3RhZG9zKSB5IHRlbXBvcmFsIChhIGxvIGxhcmdvIGRlIGxvcyBhw7FvcyksIGxvIHF1ZSBwZXJtaXRlIGFuYWxpemFyIGPDs21vIGRpZmVyZW50ZXMgZmFjdG9yZXMgZWNvbsOzbWljb3MgaW5mbHV5ZW4gZW4gZWwgZGVzZW1wZcOxbyBleHBvcnRhZG9yIGRlIGNhZGEgcmVnacOzbi4gRXN0ZSBlbmZvcXVlIGNvbnRyb2xhIGNhcmFjdGVyw61zdGljYXMgbm8gb2JzZXJ2YWJsZXMgcXVlIHBlcm1hbmVjZW4gY29uc3RhbnRlcyBlbiBlbCB0aWVtcG8g4oCUY29tbyBsYSBpbmZyYWVzdHJ1Y3R1cmEgbyBsYSB1YmljYWNpw7NuIGdlb2dyw6FmaWNh4oCUIGZhY2lsaXRhbmRvIGxhIGlkZW50aWZpY2FjacOzbiBkZSBsb3MgZGV0ZXJtaW5hbnRlcyBlc3RydWN0dXJhbGVzIHF1ZSBleHBsaWNhbiBlbCBjb21wb3J0YW1pZW50byBkZSBsYXMgZXhwb3J0YWNpb25lcyBlbiBNw6l4aWNvLg0KDQotLS0NCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiNDRDEwNzYiPiBjLiDCv0PDs21vIHB1ZWRlIHByZWRlY2lyIGVsIGRlc2VtcGXDsW8gZXhwb3J0YWRvciBhIDHigJMyIGHDsW9zPyA8L3NwYW4+DQoNCkFsIGFwcm92ZWNoYXIgbGEgZXZvbHVjacOzbiBoaXN0w7NyaWNhIGRlIGxhcyBleHBvcnRhY2lvbmVzIGVuIGNhZGEgZXN0YWRvLCBlbCBhbsOhbGlzaXMgZGUgZGF0b3MgcGFuZWwgcGVybWl0ZSBlc3RpbWFyIGVsIGVmZWN0byBkZSB2YXJpYWJsZXMgZWNvbsOzbWljYXMgYSBsbyBsYXJnbyBkZWwgdGllbXBvLiBFc3RvIGZhY2lsaXRhIHByb3llY3RhciBlbCBjb21wb3J0YW1pZW50byBmdXR1cm8gZGUgbGFzIGV4cG9ydGFjaW9uZXMgeSBhbnRpY2lwYXIgcG9zaWJsZXMgY2FtYmlvcyBlbiBsYSBkZW1hbmRhIGV4dGVybmEsIHBlcm1pdGllbmRvIGVzdGltYXIgc3UgZGVzZW1wZcOxbyBlbiBlbCBjb3J0byBwbGF6bywgY29tbyBlbiBsb3MgcHLDs3hpbW9zIDEgYSAyIGHDsW9zLg0KDQotLS0NCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiNDRDEwNzYiPiBkLiDCv0PDs21vIHB1ZWRlbiBsYXMgaGVycmFtaWVudGFzIGRlIEJJIGlkZW50aWZpY2FyIHZ1bG5lcmFiaWxpZGFkZXMgYW50ZSBjYW1iaW9zIGRlbCBVU01DQT8gPC9zcGFuPg0KDQpMYXMgaGVycmFtaWVudGFzIGRlIEJ1c2luZXNzIEludGVsbGlnZW5jZSBwZXJtaXRlbiBhbmFsaXphciBncmFuZGVzIHZvbMO6bWVuZXMgZGUgZGF0b3MgY29tZXJjaWFsZXMgeSBlY29uw7NtaWNvcyBwYXJhIGlkZW50aWZpY2FyIHBhdHJvbmVzIGVuIGVsIGNvbXBvcnRhbWllbnRvIGV4cG9ydGFkb3IuIExhIGFuYWzDrXRpY2EgcHJlZGljdGl2YSBmYWNpbGl0YSBlc3RpbWFyIGVsIGltcGFjdG8gcG90ZW5jaWFsIGRlIGNhbWJpb3MgZW4gYXJhbmNlbGVzIG8gcmVnbGFzIGNvbWVyY2lhbGVzLCBwZXJtaXRpZW5kbyBhbnRpY2lwYXIgcXXDqSBlc3RhZG9zIG8gc2VjdG9yZXMgcG9kcsOtYW4gdmVyc2UgbcOhcyBhZmVjdGFkb3MuIEFkZW3DoXMsIGVzdGFzIGhlcnJhbWllbnRhcyBheXVkYW4gYSBtb25pdG9yZWFyIGxhIGRlcGVuZGVuY2lhIGNvbWVyY2lhbCBoYWNpYSBFc3RhZG9zIFVuaWRvcywgaWRlbnRpZmljYW5kbyBhcXVlbGxhcyByZWdpb25lcyBjdXlhIGFjdGl2aWRhZCBleHBvcnRhZG9yYSBlcyBtw6FzIHNlbnNpYmxlIGEgbW9kaWZpY2FjaW9uZXMgZW4gbGFzIHBvbMOtdGljYXMgY29tZXJjaWFsZXMuDQoNCi0tLQ0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjojRTg0NzQ2Ij4gSUkuIEV4cGxvcmF0b3J5IERhdGEgQW5hbHlzaXMg4oCTIEVEQSA8L3NwYW4+DQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjojQ0QxMDc2Ij4gRGVzY3JpcHRpdmUgU3RhdGlzdGljcyA8L3NwYW4+DQoNCiMjIyBTZWxlY2Npw7NuIGRlIHZhcmlhYmxlcyBwb3IgY29ycmVsYWNpw7NuDQoNCmBgYHtyIGNvcnJlbGF0aW9uLXNlbGVjdGlvbn0NCnBhbmVsX251bSA8LSBwYW5lbF8yMDE2XzIwMjQgJT4lDQogIHNlbGVjdCh3aGVyZShpcy5udW1lcmljKSkNCg0KY29yX21hdHJpeCAgPC0gY29yKHBhbmVsX251bSwgdXNlID0gImNvbXBsZXRlLm9icyIpDQpjb3JfZXhwb3J0cyA8LSBjb3JfbWF0cml4WyJyZWFsX2V4cG9ydHMiLCBdDQpjb3JfZXhwb3J0cyA8LSBzb3J0KGNvcl9leHBvcnRzLCBkZWNyZWFzaW5nID0gVFJVRSkNCg0KY29yX2V4cG9ydHMNCmBgYA0KDQpDb24gYmFzZSBlbiBsYXMgY29ycmVsYWNpb25lcyBjb24gYHJlYWxfZXhwb3J0c2AsIHNlIHNlbGVjY2lvbmFuIGxhcyBzaWd1aWVudGVzIHZhcmlhYmxlcyBkZSBpbnRlcsOpczoNCg0KYGBge3IgdmFyc30NCnZhcnMgPC0gYygicmVhbF9leHBvcnRzIiwNCiAgICAgICAgICAibHFfc2Vjb25kYXJ5IiwNCiAgICAgICAgICAiYm9yZGVyX2Vjb25vbWljX2FjdGl2aXR5IiwNCiAgICAgICAgICAiYXZlcmFnZV9kYWlseV9zYWxhcnkiKQ0KYGBgDQoNCiMjIyBhLiBQcm9tZWRpbyBwb3IgcmVnacOzbg0KDQpgYGB7ciByZWdpb25hbC1hdmctcGxvdH0NCnJlZ2lvbmFsX2F2ZyA8LSBwYW5lbF8yMDE2XzIwMjQgJT4lDQogIGdyb3VwX2J5KHJlZ2lvbikgJT4lDQogIHN1bW1hcmlzZShhY3Jvc3MoYWxsX29mKHZhcnMpLCB+IG1lYW4oLngsIG5hLnJtID0gVFJVRSkpKSAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgICAgICA9IC1yZWdpb24sDQogICAgICAgICAgICAgICBuYW1lc190byAgPSAidmFyaWFibGUiLA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gImF2Z192YWx1ZSIpDQoNCmdncGxvdChyZWdpb25hbF9hdmcsIGFlcyh4ID0gcmVnaW9uLCB5ID0gYXZnX3ZhbHVlLCBmaWxsID0gcmVnaW9uKSkgKw0KICBnZW9tX2NvbChzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQogIGZhY2V0X3dyYXAofiB2YXJpYWJsZSwgc2NhbGVzID0gImZyZWVfeSIsIG5jb2wgPSAyKSArDQogIGNvb3JkX2NhcnRlc2lhbihjbGlwID0gIm9mZiIpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLA0KICAgIHN0cmlwLnRleHQgID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oMTAsIDEwLCAzMCwgMzApDQogICkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlByb21lZGlvIFJlZ2lvbmFsIGRlIFZhcmlhYmxlcyBDbGF2ZSIsDQogICAgeCAgICAgPSAiUmVnacOzbiIsDQogICAgeSAgICAgPSAiUHJvbWVkaW8iDQogICkNCmBgYA0KDQpTZSBvYnNlcnZhIHF1ZSBlbCBOb3Jlc3RlIHByZXNlbnRhIGxvcyBtYXlvcmVzIG5pdmVsZXMgZGUgZXhwb3J0YWNpb25lcywgYWNvbXBhw7FhZG9zIGRlIG1heW9yIGVzcGVjaWFsaXphY2nDs24gZW4gZWwgc2VjdG9yIHNlY3VuZGFyaW8geSBzYWxhcmlvcyBwcm9tZWRpbyBtw6FzIGFsdG9zLCBsbyBxdWUgc3VnaWVyZSB1bmEgZXN0cnVjdHVyYSBwcm9kdWN0aXZhIG3DoXMgb3JpZW50YWRhIGEgbGEgYWN0aXZpZGFkIGluZHVzdHJpYWwuIEVuIGNvbnRyYXN0ZSwgZWwgU3VyIHByZXNlbnRhIG1lbm9yZXMgbml2ZWxlcyBlbiB0b2RhcyBlc3RhcyB2YXJpYWJsZXMsIHJlZmxlamFuZG8gdW5hIG1lbm9yIHBhcnRpY2lwYWNpw7NuIGVuIGFjdGl2aWRhZGVzIHZpbmN1bGFkYXMgYSBtZXJjYWRvcyBleHRlcm5vcy4NCg0KLS0tDQoNCiMjIyBiLiBIaXN0b2dyYW1hcw0KDQpgYGB7ciBoaXN0b2dyYW1zfQ0KcGFuZWxfbG9uZyA8LSBwYW5lbF8yMDE2XzIwMjQgJT4lDQogIHNlbGVjdChhbGxfb2YodmFycykpICU+JQ0KICBwaXZvdF9sb25nZXIoDQogICAgY29scyAgICAgID0gZXZlcnl0aGluZygpLA0KICAgIG5hbWVzX3RvICA9ICJ2YXJpYWJsZSIsDQogICAgdmFsdWVzX3RvID0gInZhbHVlIg0KICApICU+JQ0KICBtdXRhdGUoDQogICAgdmFsdWUgPSBpZl9lbHNlKHZhcmlhYmxlID09ICJyZWFsX2V4cG9ydHMiLA0KICAgICAgICAgICAgICAgICAgICBsb2cxcChwbWF4KHZhbHVlLCAwKSksDQogICAgICAgICAgICAgICAgICAgIHZhbHVlKQ0KICApDQoNCmdncGxvdChwYW5lbF9sb25nLCBhZXMoeCA9IHZhbHVlLCBmaWxsID0gdmFyaWFibGUpKSArDQogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAzMCwgYWxwaGEgPSAwLjgpICsNCiAgZmFjZXRfd3JhcCh+IHZhcmlhYmxlLCBzY2FsZXMgPSAiZnJlZSIpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBzdHJpcC50ZXh0ICAgICAgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDExKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSINCiAgKSArDQogIGxhYnMoDQogICAgdGl0bGUgICAgPSAiSGlzdG9ncmFtYXMgZGUgVmFyaWFibGVzIFNlbGVjY2lvbmFkYXMiLA0KICAgIHN1YnRpdGxlID0gInJlYWxfZXhwb3J0cyBncmFmaWNhZG8gZW4gZXNjYWxhIGxvZyINCiAgKQ0KYGBgDQoNCi0tLQ0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6I0NEMTA3NiI+IFN0YXRpc3RpY3Mgb2YgRGlzcGVyc2lvbiA8L3NwYW4+DQoNCiMjIyBhLiBCb3hwbG90cyBwb3IgcmVnacOzbg0KDQpgYGB7ciBib3hwbG90cy1yZWdpb259DQpib3hfZGF0YSA8LSBwYW5lbF8yMDE2XzIwMjQgJT4lDQogIHNlbGVjdChyZWdpb24sIGFsbF9vZih2YXJzKSkgJT4lDQogIHBpdm90X2xvbmdlcigNCiAgICBjb2xzICAgICAgPSAtcmVnaW9uLA0KICAgIG5hbWVzX3RvICA9ICJ2YXJpYWJsZSIsDQogICAgdmFsdWVzX3RvID0gInZhbHVlIg0KICApDQoNCmdncGxvdChib3hfZGF0YSwgYWVzKHggPSByZWdpb24sIHkgPSB2YWx1ZSwgZmlsbCA9IHZhcmlhYmxlKSkgKw0KICBnZW9tX2JveHBsb3QoYWxwaGEgPSAwLjcpICsNCiAgZmFjZXRfd3JhcCh+IHZhcmlhYmxlLCBzY2FsZXMgPSAiZnJlZV95IikgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIGF4aXMubGluZSAgICAgICA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIpLA0KICAgIGF4aXMudGlja3MgICAgICA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIpLA0KICAgIHBhbmVsLmdyaWQgICAgICA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBheGlzLnRleHQueCAgICAgPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSwNCiAgICBzdHJpcC50ZXh0ICAgICAgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDExKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSINCiAgKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiRGlzdHJpYnVjacOzbiBkZSBWYXJpYWJsZXMgcG9yIFJlZ2nDs24iLA0KICAgIHggICAgID0gIlJlZ2nDs24iLA0KICAgIHkgICAgID0gIlZhbG9yIg0KICApDQpgYGANCg0KTGFzIGV4cG9ydGFjaW9uZXMgcmVhbGVzIHByZXNlbnRhbiB1bmEgZGlzdHJpYnVjacOzbiBzZXNnYWRhIGhhY2lhIGxhIGRlcmVjaGEsIGluZGljYW5kbyBxdWUgc29sbyBhbGd1bmFzIHJlZ2lvbmVzIGNvbmNlbnRyYW4gbml2ZWxlcyBhbHRvcyBkZSBleHBvcnRhY2nDs24uIEVsIE5vcmVzdGUgbXVlc3RyYSBsYSBtYXlvciBtZWRpYW5hIHkgZGlzcGVyc2nDs24sIGFjb21wYcOxYWRvIGRlIG1heW9yIGVzcGVjaWFsaXphY2nDs24gaW5kdXN0cmlhbCB5IHNhbGFyaW9zIG3DoXMgYWx0b3MuIExhIGNvbmNlbnRyYWNpw7NuIGRlIHZhbG9yZXMgbmVnYXRpdm9zIGVuIGBib3JkZXJfZWNvbm9taWNfYWN0aXZpdHlgIGluZGljYSBxdWUgbGEgbWF5b3LDrWEgZGUgbG9zIGVzdGFkb3MgcHJlc2VudGFuIG1lbm9yIGFjdGl2aWRhZCBlY29uw7NtaWNhIHZpbmN1bGFkYSBhbCBjb21lcmNpbyBjb24gRUUuVVUuDQoNCi0tLQ0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6I0NEMTA3NiI+IFZpc3VhbGl6YXRpb24gYWNyb3NzIFRpbWUgPC9zcGFuPg0KDQojIyMgYS4gRXZvbHVjacOzbiBhbnVhbCBkZSBleHBvcnRhY2lvbmVzDQoNCmBgYHtyIHRzLWFubnVhbH0NCnRzX2FubnVhbCA8LSBwYW5lbF8yMDE2XzIwMjQgJT4lDQogIGdyb3VwX2J5KHllYXIpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgYXZnX2V4cG9ydHMgPSBtZWFuKHJlYWxfZXhwb3J0cywgbmEucm0gPSBUUlVFKSwNCiAgICAuZ3JvdXBzICAgICA9ICJkcm9wIg0KICApICU+JQ0KICBtdXRhdGUoYXZnX2V4cG9ydHNfbG9nID0gbG9nMXAoYXZnX2V4cG9ydHMpKQ0KDQpnZ3Bsb3QodHNfYW5udWFsLCBhZXMoeCA9IHllYXIsIHkgPSBhdmdfZXhwb3J0c19sb2cpKSArDQogIGdlb21fbGluZShjb2xvciA9ICIjNTJBOEJDIiwgbGluZXdpZHRoID0gMS4yKSArDQogIGdlb21fcG9pbnQoY29sb3IgPSAiI0U4NDc0NiIsIHNpemUgPSAyKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiRXZvbHVjacOzbiBkZSBsYXMgRXhwb3J0YWNpb25lcyBSZWFsZXMgKExvZykiLA0KICAgIHggICAgID0gIkHDsW8iLA0KICAgIHkgICAgID0gIkxvZyBkZSBFeHBvcnRhY2lvbmVzIFByb21lZGlvIg0KICApDQpgYGANCg0KTGFzIGV4cG9ydGFjaW9uZXMgcmVhbGVzIG11ZXN0cmFuIHVuYSB0ZW5kZW5jaWEgZ2VuZXJhbCBhbCBhbHphLCBjb24gY2HDrWRhcyBlbiBhw7FvcyBjb21vIDIwMTgsIDIwMjEgeSAyMDI0LiBEZWJpZG8gYWwgcmV6YWdvIHRlbXBvcmFsIGluY29ycG9yYWRvIGVuIGxhcyB2YXJpYWJsZXMsIGVzdGFzIGRpc21pbnVjaW9uZXMgcmVmbGVqYW4gY2hvcXVlcyBvY3Vycmlkb3MgZW4gZWwgYcOxbyBwcmV2aW8uIExhIHJlY3VwZXJhY2nDs24gZW4gMjAyNCBpbmRpY2EgdW5hIHJlYWN0aXZhY2nDs24gZXhwb3J0YWRvcmEgdHJhcyBwZXJpb2RvcyBkZSBjb250cmFjY2nDs24uDQoNCi0tLQ0KDQojIyMgYi4gRXZvbHVjacOzbiBkZSBleHBvcnRhY2lvbmVzIHBvciByZWdpw7NuDQoNCmBgYHtyIHRzLXJlZ2lvbn0NCnRzX3JlZ2lvbiA8LSBwYW5lbF8yMDE2XzIwMjQgJT4lDQogIGdyb3VwX2J5KHJlZ2lvbiwgeWVhcikgJT4lDQogIHN1bW1hcmlzZSgNCiAgICBhdmdfZXhwb3J0cyA9IG1lYW4ocmVhbF9leHBvcnRzLCBuYS5ybSA9IFRSVUUpLA0KICAgIC5ncm91cHMgICAgID0gImRyb3AiDQogICkgJT4lDQogIG11dGF0ZShhdmdfZXhwb3J0c19sb2cgPSBsb2cxcChhdmdfZXhwb3J0cykpDQoNCmdncGxvdCh0c19yZWdpb24sIGFlcyh4ID0geWVhciwgeSA9IGF2Z19leHBvcnRzX2xvZywgY29sb3IgPSByZWdpb24pKSArDQogIGdlb21fbGluZShsaW5ld2lkdGggPSAxLjIpICsNCiAgZ2VvbV9wb2ludChzaXplID0gMikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkV2b2x1Y2nDs24gZGUgRXhwb3J0YWNpb25lcyBSZWFsZXMgcG9yIFJlZ2nDs24gKExvZykiLA0KICAgIHggICAgID0gIkHDsW8iLA0KICAgIHkgICAgID0gIkxvZyBkZSBFeHBvcnRhY2lvbmVzIFByb21lZGlvIiwNCiAgICBjb2xvciA9ICJSZWdpw7NuIg0KICApDQpgYGANCg0KTGFzIHJlZ2lvbmVzIG5vIHJlYWNjaW9uYW4gZGUgZm9ybWEgdW5pZm9ybWUgYW50ZSBjaG9xdWVzIGVjb27Ds21pY29zLiBBbGd1bmFzIG11ZXN0cmFuIG1heW9yIGVzdGFiaWxpZGFkIG1pZW50cmFzIHF1ZSBvdHJhcyBwcmVzZW50YW4gdmFyaWFjaW9uZXMgbcOhcyBwcm9udW5jaWFkYXMsIGV2aWRlbmNpYW5kbyBoZXRlcm9nZW5laWRhZCByZWdpb25hbCB5IGxhIGV4aXN0ZW5jaWEgZGUgY2hvcXVlcyBnZW5lcmFsZXMgcXVlIGFmZWN0YW4gc2ltdWx0w6FuZWFtZW50ZSBhIHZhcmlhcyByZWdpb25lcy4NCg0KLS0tDQoNCiMjIyBjLiBFeHBvcnRhY2lvbmVzIHZzLiBUaXBvIGRlIENhbWJpbw0KDQpgYGB7ciB0cy1tYWNyb30NCnRzX21hY3JvIDwtIHBhbmVsXzIwMTZfMjAyNCAlPiUNCiAgZ3JvdXBfYnkoeWVhcikgJT4lDQogIHN1bW1hcmlzZSgNCiAgICBhdmdfZXhwb3J0cyA9IG1lYW4ocmVhbF9leHBvcnRzLCAgbmEucm0gPSBUUlVFKSwNCiAgICBhdmdfZXhyYXRlICA9IG1lYW4oZXhjaGFuZ2VfcmF0ZSwgbmEucm0gPSBUUlVFKSwNCiAgICAuZ3JvdXBzICAgICA9ICJkcm9wIg0KICApICU+JQ0KICBtdXRhdGUoDQogICAgZXhwb3J0c19zdGQgPSBhcy5udW1lcmljKHNjYWxlKGxvZzFwKGF2Z19leHBvcnRzKSkpLA0KICAgIGV4cmF0ZV9zdGQgID0gYXMubnVtZXJpYyhzY2FsZShhdmdfZXhyYXRlKSkNCiAgKSAlPiUNCiAgc2VsZWN0KHllYXIsIGV4cG9ydHNfc3RkLCBleHJhdGVfc3RkKSAlPiUNCiAgcGl2b3RfbG9uZ2VyKA0KICAgIGNvbHMgICAgICA9IC15ZWFyLA0KICAgIG5hbWVzX3RvICA9ICJ2YXJpYWJsZSIsDQogICAgdmFsdWVzX3RvID0gInZhbHVlIg0KICApDQoNCmdncGxvdCh0c19tYWNybywgYWVzKHggPSB5ZWFyLCB5ID0gdmFsdWUsIGNvbG9yID0gdmFyaWFibGUpKSArDQogIGdlb21fbGluZShsaW5ld2lkdGggPSAxLjIpICsNCiAgZ2VvbV9wb2ludChzaXplID0gMikgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwoDQogICAgdmFsdWVzID0gYygiZXhwb3J0c19zdGQiID0gIiMxODc0Q0QiLCAiZXhyYXRlX3N0ZCIgPSAiI0U4NDc0NiIpLA0KICAgIGxhYmVscyA9IGMoImV4cG9ydHNfc3RkIiA9ICJFeHBvcnRhY2lvbmVzIChzdGQpIiwgImV4cmF0ZV9zdGQiID0gIlRpcG8gZGUgQ2FtYmlvIChzdGQpIikNCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiRXhwb3J0cyBJbmZsb3dzIHZzLiBFeGNoYW5nZSBSYXRlIFBlcmZvcm1hbmNlIiwNCiAgICB4ICAgICA9ICJZZWFyIiwNCiAgICB5ICAgICA9ICJTdGFuZGFyZGl6ZWQgVmFsdWUiLA0KICAgIGNvbG9yID0gIkluZGljYXRvciINCiAgKQ0KYGBgDQoNClNlIG9ic2VydmFuIG1vdmltaWVudG9zIHNpbXVsdMOhbmVvcyBlbiAyMDIxIHkgMjAyNC4gQ3VhbmRvIGVsIHRpcG8gZGUgY2FtYmlvIGRpc21pbnV5ZSAoZWwgcGVzbyBzZSBhcHJlY2lhIGZyZW50ZSBhbCBkw7NsYXIpLCBsb3MgaW5ncmVzb3MgcG9yIGV4cG9ydGFjaW9uZXMgZW4gcGVzb3MgdGllbmRlbiBhIHJlZHVjaXJzZSwgeWEgcXVlIGxvcyBkw7NsYXJlcyByZWNpYmlkb3Mgc2UgdHJhZHVjZW4gZW4gbWVub3MgcGVzb3MuDQoNCi0tLQ0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6I0NEMTA3NiI+IFJlZ2lvbmFsIERpZmZlcmVuY2VzIDwvc3Bhbj4NCg0KIyMjIGEuIE5vcnRlIHZzLiBTdXIgYSBsbyBsYXJnbyBkZWwgdGllbXBvDQoNCmBgYHtyIGJhci1ub3J0aC1zb3V0aH0NCmJhcl9uc190aW1lIDwtIHBhbmVsXzIwMTZfMjAyNCAlPiUNCiAgbXV0YXRlKA0KICAgIG1hY3JvX3JlZ2lvbiA9IGNhc2Vfd2hlbigNCiAgICAgIHJlZ2lvbiAlaW4lIGMoIk5vcm9lc3RlIiwgIk5vcmVzdGUiKSB+ICJOb3J0aCIsDQogICAgICByZWdpb24gPT0gIlN1ciIgICAgICAgICAgICAgICAgICAgICAgfiAiU291dGgiLA0KICAgICAgVFJVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4gIk90aGVyIg0KICAgICkNCiAgKSAlPiUNCiAgZmlsdGVyKG1hY3JvX3JlZ2lvbiAlaW4lIGMoIk5vcnRoIiwgIlNvdXRoIikpICU+JQ0KICBncm91cF9ieSh5ZWFyLCBtYWNyb19yZWdpb24pICU+JQ0KICBzdW1tYXJpc2UoDQogICAgYXZnX2V4cG9ydHMgPSBtZWFuKHJlYWxfZXhwb3J0cywgbmEucm0gPSBUUlVFKSwNCiAgICAuZ3JvdXBzICAgICA9ICJkcm9wIg0KICApDQoNCmdncGxvdChiYXJfbnNfdGltZSwgYWVzKHggPSBmYWN0b3IoeWVhciksIHkgPSBhdmdfZXhwb3J0cywgZmlsbCA9IG1hY3JvX3JlZ2lvbikpICsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiLCBhbHBoYSA9IDAuODUpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiTm9ydGgiID0gIiM1MkE4QkMiLCAiU291dGgiID0gIiNFODQ3NDYiKSkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkV4cG9ydGFjaW9uZXMgUmVhbGVzOiBOb3J0ZSB2cy4gU3VyICgyMDE24oCTMjAyNCkiLA0KICAgIHggICAgID0gIkHDsW8iLA0KICAgIHkgICAgID0gIkV4cG9ydGFjaW9uZXMgUHJvbWVkaW8iLA0KICAgIGZpbGwgID0gIlJlZ2nDs24iDQogICkNCmBgYA0KDQotLS0NCg0KIyMjIGIuIE1hcGEgZGUgZXhwb3J0YWNpb25lcyBwcm9tZWRpbyBwb3IgZXN0YWRvDQoNCmBgYHtyIG1hcH0NCmV4cG9ydHNfYXZnIDwtIHBhbmVsXzIwMTZfMjAyNCAlPiUNCiAgZ3JvdXBfYnkoc3RhdGUpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgYXZnX2V4cG9ydHMgPSBtZWFuKHJlYWxfZXhwb3J0cywgbmEucm0gPSBUUlVFKSwNCiAgICAuZ3JvdXBzICAgICA9ICJkcm9wIg0KICApDQoNCm1leGljb19tYXAgIDwtIG5lX3N0YXRlcyhjb3VudHJ5ID0gIm1leGljbyIsIHJldHVybmNsYXNzID0gInNmIikNCg0KbWV4aWNvX2RhdGEgPC0gbWV4aWNvX21hcCAlPiUNCiAgbGVmdF9qb2luKGV4cG9ydHNfYXZnLCBieSA9IGMoIm5hbWUiID0gInN0YXRlIikpDQoNCmdncGxvdChtZXhpY29fZGF0YSkgKw0KICBnZW9tX3NmKGFlcyhmaWxsID0gYXZnX2V4cG9ydHMpKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ICA9ICJsaWdodHllbGxvdyIsDQogICAgICAgICAgICAgICAgICAgICAgaGlnaCA9ICIjRTg0NzQ2IiwNCiAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIkV4cG9ydGFjaW9uZXNcbnByb21lZGlvIikgKw0KICBsYWJzKHRpdGxlID0gIlByb21lZGlvIGRlIEV4cG9ydGFjaW9uZXMgcG9yIEVzdGFkbyBlbiBNw6l4aWNvICgyMDE24oCTMjAyNCkiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCi0tLQ0KDQojIyMgYy4gTm9ydGUgdnMuIFN1cjogRXhwb3NpY2nDs24gYSBtZXJjYWRvcyBpbnRlcm5hY2lvbmFsZXMNCg0KYGBge3IgbnMtZXhwb3N1cmV9DQpkYXRhX25zIDwtIHBhbmVsXzIwMTZfMjAyNCAlPiUNCiAgbXV0YXRlKA0KICAgIG5vcnRoX3NvdXRoID0gY2FzZV93aGVuKA0KICAgICAgcmVnaW9uICVpbiUgYygiTm9yb2VzdGUiLCAiTm9yZXN0ZSIpIH4gIk5vcnRoIiwNCiAgICAgIHJlZ2lvbiA9PSAiU3VyIiAgICAgICAgICAgICAgICAgICAgICB+ICJTb3V0aCIsDQogICAgICBUUlVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfiBOQV9jaGFyYWN0ZXJfDQogICAgKQ0KICApICU+JQ0KICBmaWx0ZXIoIWlzLm5hKG5vcnRoX3NvdXRoKSkNCg0KZGF0YV9uc19sb25nIDwtIGRhdGFfbnMgJT4lDQogIHNlbGVjdChub3J0aF9zb3V0aCwgcmVhbF9leHBvcnRzLCBmZGlfaW5mbG93cywNCiAgICAgICAgIGJvcmRlcl9lY29ub21pY19hY3Rpdml0eSwgYm9yZGVyX2Rpc3RhbmNlKSAlPiUNCiAgcGl2b3RfbG9uZ2VyKA0KICAgIGNvbHMgICAgICA9IC1ub3J0aF9zb3V0aCwNCiAgICBuYW1lc190byAgPSAidmFyaWFibGUiLA0KICAgIHZhbHVlc190byA9ICJ2YWx1ZSINCiAgKQ0KDQpnZ3Bsb3QoZGF0YV9uc19sb25nLCBhZXMoeCA9IG5vcnRoX3NvdXRoLCB5ID0gdmFsdWUsIGZpbGwgPSBub3J0aF9zb3V0aCkpICsNCiAgZ2VvbV9ib3hwbG90KGFscGhhID0gMC43LCBvdXRsaWVyLmFscGhhID0gMC41KSArDQogIGZhY2V0X3dyYXAofiB2YXJpYWJsZSwgc2NhbGVzID0gImZyZWUiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIk5vcnRoIiA9ICIjNTJBOEJDIiwgIlNvdXRoIiA9ICIjRTg0NzQ2IikpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiTm9ydGUgdnMuIFN1cjogRXhwb3NpY2nDs24gYSBsb3MgTWVyY2Fkb3MgSW50ZXJuYWNpb25hbGVzIiwNCiAgICB4ICAgICA9ICIiLA0KICAgIHkgICAgID0gIlZhbHVlIg0KICApDQpgYGANCg0KQWwgY29tcGFyYXIgbGFzIHJlZ2lvbmVzIGRlbCBOb3J0ZSB5IFN1ciwgc2Ugb2JzZXJ2YW4gZGlmZXJlbmNpYXMgaW1wb3J0YW50ZXMgZW4gc3Ugbml2ZWwgZGUgZXhwb3NpY2nDs24gYSBsb3MgbWVyY2Fkb3MgaW50ZXJuYWNpb25hbGVzLiBFc3RhcyBkaWZlcmVuY2lhcyBzZSBleHBsaWNhbiBwb3IgbG9zIHNpZ3VpZW50ZXMgZmFjdG9yZXMgZXN0cnVjdHVyYWxlczoNCg0KLSAqKlByb3hpbWlkYWQgZ2VvZ3LDoWZpY2EgYSBFRS5VVS4qKiBMb3MgZXN0YWRvcyBkZWwgTm9ydGUgZXN0w6FuIG3DoXMgY2VyY2EgZGUgbGEgZnJvbnRlcmEsIGxvIHF1ZSByZWR1Y2UgY29zdG9zIGxvZ8Otc3RpY29zIHkgZmFjaWxpdGEgbGEgaW50ZWdyYWNpw7NuIGEgY2FkZW5hcyBnbG9iYWxlcyBkZSB2YWxvci4NCi0gKipNYXlvcmVzIGZsdWpvcyBkZSBGREkuKiogTGEgbWF5b3IgZW50cmFkYSBkZSBpbnZlcnNpw7NuIGV4dHJhbmplcmEgZW4gZWwgTm9ydGUgY29udHJpYnV5ZSBhbCBkZXNhcnJvbGxvIGRlIGluZnJhZXN0cnVjdHVyYSBwcm9kdWN0aXZhIG9yaWVudGFkYSBhIGxhIGV4cG9ydGFjacOzbi4NCi0gKipNYXlvciBlc3BlY2lhbGl6YWNpw7NuIGluZHVzdHJpYWwgKGxxX3NlY29uZGFyeSkuKiogTG9zIGVzdGFkb3MgZGVsIE5vcnRlIGNvbmNlbnRyYW4gbcOhcyBhY3RpdmlkYWRlcyBtYW51ZmFjdHVyZXJhcyB2aW5jdWxhZGFzIGFsIGNvbWVyY2lvIGludGVybmFjaW9uYWwuDQotICoqTWF5b3IgYWN0aXZpZGFkIGVjb27Ds21pY2EgZnJvbnRlcml6YS4qKiBVbmEgbWF5b3IgaW50ZW5zaWRhZCBkZSBpbnRlcmNhbWJpb3MgZW4gbGEgZnJvbnRlcmEgaW5jcmVtZW50YSBsYSBpbnRlZ3JhY2nDs24gZWNvbsOzbWljYSBjb24gb3Ryb3MgcGHDrXNlcy4NCi0gKipNZW5vciBkaXN0YW5jaWEgYWwgbWVyY2FkbyBleHRlcm5vLioqIExhIG1lbm9yIGRpc3RhbmNpYSBhIGxhIGZyb250ZXJhIHJlZHVjZSB0aWVtcG9zIHkgY29zdG9zIGRlIHRyYXNsYWRvLCBpbmNyZW1lbnRhbmRvIGxhIGNvbXBldGl0aXZpZGFkIGV4cG9ydGFkb3JhLg0KDQotLS0NCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiNDRDEwNzYiPiBDb3JyZWxhdGlvbiBhbmQgUmVsYXRpb25zaGlwcyA8L3NwYW4+DQoNCiMjIyBhLiBNYXRyaXogZGUgY29ycmVsYWNpw7NuIChIZWF0bWFwKQ0KDQpgYGB7ciBoZWF0bWFwfQ0KY29ycl9tZWx0IDwtIG1lbHQoY29yX21hdHJpeCkNCg0KZ2dwbG90KGNvcnJfbWVsdCwgYWVzKHggPSBWYXIxLCB5ID0gVmFyMiwgZmlsbCA9IHZhbHVlKSkgKw0KICBnZW9tX3RpbGUoKSArDQogIGdlb21fdGlsZSgNCiAgICBkYXRhICAgICAgPSBzdWJzZXQoY29ycl9tZWx0LCBWYXIxID09ICJyZWFsX2V4cG9ydHMiIHwgVmFyMiA9PSAicmVhbF9leHBvcnRzIiksDQogICAgY29sb3IgICAgID0gImJsYWNrIiwNCiAgICBsaW5ld2lkdGggPSAwLjcNCiAgKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnQyKA0KICAgIGxvdyAgICAgID0gIiNFODQ3NDYiLA0KICAgIGhpZ2ggICAgID0gIiM1MkE4QkMiLA0KICAgIG1pZCAgICAgID0gIndoaXRlIiwNCiAgICBtaWRwb2ludCA9IDAsDQogICAgbGltaXQgICAgPSBjKC0xLCAxKSwNCiAgICBuYW1lICAgICA9ICJDb3JyZWxhdGlvbiINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJNYXRyaXogZGUgQ29ycmVsYWNpw7NuIOKAkyBWYXJpYWJsZXMgZGVsIFBhbmVsIiwNCiAgICB4ICAgICA9ICIiLA0KICAgIHkgICAgID0gIiINCiAgKQ0KYGBgDQoNCi0tLQ0KDQojIyMgYi4gU2NhdHRlcnBsb3RzOiBFeHBvcnRhY2lvbmVzIHZzLiBWYXJpYWJsZXMgQ2xhdmUNCg0KYGBge3Igc2NhdHRlcnBsb3RzfQ0Kc2NhdHRlcl9kYXRhIDwtIHBhbmVsXzIwMTZfMjAyNCAlPiUNCiAgc2VsZWN0KHJlYWxfZXhwb3J0cywgbHFfc2Vjb25kYXJ5LA0KICAgICAgICAgYm9yZGVyX2Vjb25vbWljX2FjdGl2aXR5LA0KICAgICAgICAgYXZlcmFnZV9kYWlseV9zYWxhcnksDQogICAgICAgICBmZGlfaW5mbG93cykgJT4lDQogIHBpdm90X2xvbmdlcigNCiAgICBjb2xzICAgICAgPSAtcmVhbF9leHBvcnRzLA0KICAgIG5hbWVzX3RvICA9ICJ2YXJpYWJsZSIsDQogICAgdmFsdWVzX3RvID0gInZhbHVlIg0KICApDQoNCmdncGxvdChzY2F0dGVyX2RhdGEsIGFlcyh4ID0gdmFsdWUsIHkgPSByZWFsX2V4cG9ydHMpKSArDQogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjYsIGNvbG9yID0gIiM1MkE4QkMiKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gIiNFODQ3NDYiLCBzZSA9IFRSVUUpICsNCiAgZmFjZXRfd3JhcCh+IHZhcmlhYmxlLCBzY2FsZXMgPSAiZnJlZSIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJFeHBvcnRhY2lvbmVzIHZzLiBWYXJpYWJsZXMgRWNvbsOzbWljYXMgU2VsZWNjaW9uYWRhcyIsDQogICAgeCAgICAgPSAiVmFyaWFibGUgSW5kZXBlbmRpZW50ZSIsDQogICAgeSAgICAgPSAiRXhwb3J0YWNpb25lcyBSZWFsZXMiDQogICkNCmBgYA0KDQpMb3Mgc2NhdHRlcnBsb3RzIG11ZXN0cmFuIHJlbGFjaW9uZXMgcG9zaXRpdmFzIGVudHJlIGxhcyBleHBvcnRhY2lvbmVzIHkgbGFzIHZhcmlhYmxlcyBzZWxlY2Npb25hZGFzLiBMYSBlc3BlY2lhbGl6YWNpw7NuIGVuIGVsIHNlY3RvciBzZWN1bmRhcmlvIHkgbG9zIGZsdWpvcyBkZSBGREkgcHJlc2VudGFuIGxhcyBhc29jaWFjaW9uZXMgbcOhcyBmdWVydGVzIGNvbiBlbCBkZXNlbXBlw7FvIGV4cG9ydGFkb3IsIG1pZW50cmFzIHF1ZSBlbCBzYWxhcmlvIGRpYXJpbyBwcm9tZWRpbyB0YW1iacOpbiBtdWVzdHJhIHVuYSByZWxhY2nDs24gcG9zaXRpdmEgY29uc2lzdGVudGUgY29uIGxhIHRlb3LDrWEgZWNvbsOzbWljYS4NCg0KLS0tDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiNFODQ3NDYiPiBJSUkuIEh5cG90aGVzZXMgU3RhdGVtZW50cyA8L3NwYW4+DQoNCkNvbiBiYXNlIGVuIGxvcyByZXN1bHRhZG9zIGRlbCBFREEsIHNlIHBsYW50ZWFuIGxhcyBzaWd1aWVudGVzIGhpcMOzdGVzaXM6DQoNCioqSDEg4oCTIEVzcGVjaWFsaXphY2nDs24gaW5kdXN0cmlhbCB5IGV4cG9ydGFjaW9uZXMuKioNCkxvcyBlc3RhZG9zIGNvbiBtYXlvciBlc3BlY2lhbGl6YWNpw7NuIGVuIGVsIHNlY3RvciBzZWN1bmRhcmlvIChgbHFfc2Vjb25kYXJ5YCkgcHJlc2VudGFuIG5pdmVsZXMgc2lnbmlmaWNhdGl2YW1lbnRlIG3DoXMgYWx0b3MgZGUgZXhwb3J0YWNpb25lcyByZWFsZXMsIGNvbnRyb2xhbmRvIHBvciBlZmVjdG9zIGZpam9zIGRlIGVzdGFkbyB5IGHDsW8uDQoNCioqSDIg4oCTIFNhbGFyaW8geSBjb21wZXRpdGl2aWRhZCBleHBvcnRhZG9yYS4qKg0KRXhpc3RlIHVuYSByZWxhY2nDs24gcG9zaXRpdmEgZW50cmUgZWwgc2FsYXJpbyBkaWFyaW8gcHJvbWVkaW8geSBsYXMgZXhwb3J0YWNpb25lcyByZWFsZXMsIGRhZG8gcXVlIHNhbGFyaW9zIG3DoXMgYWx0b3MgcmVmbGVqYW4gbWF5b3IgcHJvZHVjdGl2aWRhZCB5IHNvZmlzdGljYWNpw7NuIGluZHVzdHJpYWwgZW4gbG9zIGVzdGFkb3MgZXhwb3J0YWRvcmVzLg0KDQoqKkgzIOKAkyBGREkgY29tbyBkZXRlcm1pbmFudGUgZGUgZXhwb3J0YWNpb25lcy4qKg0KTG9zIGVzdGFkb3MgcXVlIHJlY2liZW4gbWF5b3JlcyBmbHVqb3MgZGUgSW52ZXJzacOzbiBFeHRyYW5qZXJhIERpcmVjdGEgcHJlc2VudGFuIHVuIG1heW9yIGRlc2VtcGXDsW8gZXhwb3J0YWRvciwgeWEgcXVlIGxhIElFRCBmYWNpbGl0YSBsYSBpbnRlZ3JhY2nDs24gYSBjYWRlbmFzIGRlIHZhbG9yIGdsb2JhbGVzLg0KDQoqKkg0IOKAkyBQcm94aW1pZGFkIGEgbGEgZnJvbnRlcmEgeSBleHBvcnRhY2lvbmVzLioqDQpMb3MgZXN0YWRvcyBjb24gbWVub3IgZGlzdGFuY2lhIGEgbGEgZnJvbnRlcmEgbm9ydGUgbXVlc3RyYW4gbWF5b3JlcyBuaXZlbGVzIGRlIGV4cG9ydGFjacOzbiwgZGViaWRvIGEgbWVub3JlcyBjb3N0b3MgbG9nw61zdGljb3MgeSBtYXlvciBhY2Nlc28gYSBsb3MgbWVyY2Fkb3MgZGUgQW3DqXJpY2EgZGVsIE5vcnRlLg0KDQoqKkg1IOKAkyBUaXBvIGRlIGNhbWJpbyB5IGV4cG9ydGFjaW9uZXMuKioNClVuYSBkZXByZWNpYWNpw7NuIGRlbCB0aXBvIGRlIGNhbWJpbyAoYXVtZW50byBlbiBlbCB2YWxvciBkZWwgZMOzbGFyIHJlbGF0aXZvIGFsIHBlc28pIHNlIGFzb2NpYSBwb3NpdGl2YW1lbnRlIGNvbiBlbCBuaXZlbCBkZSBleHBvcnRhY2lvbmVzIHJlYWxlcywgYWwgaGFjZXIgbcOhcyBjb21wZXRpdGl2b3MgbG9zIHByb2R1Y3RvcyBtZXhpY2Fub3MgZW4gZWwgZXh0ZXJpb3IuDQoNCi0tLQ0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjojRTg0NzQ2Ij4gSVYuIE1haW4gRmluZGluZ3MgPC9zcGFuPg0KDQpDb24gYmFzZSBlbiBsb3MgcmVzdWx0YWRvcyBkZWwgYW7DoWxpc2lzIGV4cGxvcmF0b3Jpbywgc2UgaWRlbnRpZmljYW4gbG9zIHNpZ3VpZW50ZXMgaGFsbGF6Z29zIHByaW5jaXBhbGVzOg0KDQoqKjEuIFRlbmRlbmNpYSBjcmVjaWVudGUgY29uIGNob3F1ZSBwYW5kw6ltaWNvLioqDQpMYXMgZXhwb3J0YWNpb25lcyBjcmVjaWVyb24gc29zdGVuaWRhbWVudGUgZW50cmUgMjAxNiB5IDIwMjQsIGNvbiB1bmEgY2HDrWRhIGFicnVwdGEgZW4gMjAyMCBwb3IgQ09WSUQtMTkgeSB1bmEgcmVjdXBlcmFjacOzbiBhY2VsZXJhZGEgcG9zdGVyaW9yIHF1ZSBzdXBlcsOzIGxvcyBuaXZlbGVzIHByZS1wYW5kZW1pYSBoYWNpYSAyMDIz4oCTMjAyNC4NCg0KKioyLiBBbHRhIGNvbmNlbnRyYWNpw7NuIHJlZ2lvbmFsIGVuIGVsIE5vcnRlLioqDQpFbCBOb3Jlc3RlIHkgTm9yb2VzdGUgY29uY2VudHJhbiBsYSBtYXlvciBwYXJ0ZSBkZWwgdmFsb3IgZXhwb3J0YWRvLiBFc3RhIGJyZWNoYSBOb3J0ZeKAk1N1ciBlcyBlc3RydWN0dXJhbCB5IHNlIG1hbnRpZW5lIGNvbnNpc3RlbnRlIGEgbG8gbGFyZ28gZGUgdG9kbyBlbCBwZXJpb2RvIGFuYWxpemFkby4NCg0KKiozLiBMYSBlc3BlY2lhbGl6YWNpw7NuIGluZHVzdHJpYWwgZXMgZWwgcHJpbmNpcGFsIGNvcnJlbGFjaW9uYWRvIGRlIGxhcyBleHBvcnRhY2lvbmVzLioqDQpFbCBjb2NpZW50ZSBkZSBsb2NhbGl6YWNpw7NuIGRlbCBzZWN0b3Igc2VjdW5kYXJpbyAoYGxxX3NlY29uZGFyeWApIG11ZXN0cmEgdW5hIGRlIGxhcyBjb3JyZWxhY2lvbmVzIG3DoXMgYWx0YXMgY29uIGByZWFsX2V4cG9ydHNgLCBsbyBxdWUgc3VnaWVyZSBxdWUgbG9zIGVzdGFkb3MgbcOhcyBpbmR1c3RyaWFsaXphZG9zIHNvbiB0YW1iacOpbiBsb3MgbcOhcyBleHBvcnRhZG9yZXMuDQoNCioqNC4gRWwgRkRJIHkgbGEgY2VyY2Fuw61hIGEgbGEgZnJvbnRlcmEgc29uIGZhY3RvcmVzIGRpZmVyZW5jaWFkb3JlcyBjbGF2ZS4qKg0KTG9zIGVzdGFkb3MgZGVsIE5vcnRlIGNvbmNlbnRyYW4gbWF5b3JlcyBmbHVqb3MgZGUgSUVEIHkgbWVub3IgZGlzdGFuY2lhIGdlb2dyw6FmaWNhIGEgRUUuVVUuLCBsbyBxdWUgZXhwbGljYSBlbiBncmFuIG1lZGlkYSBzdSBtYXlvciBpbnRlZ3JhY2nDs24gYSBtZXJjYWRvcyBpbnRlcm5hY2lvbmFsZXMgcmVzcGVjdG8gYWwgU3VyLg0KDQoqKjUuIEVsIHRpcG8gZGUgY2FtYmlvIGNvLW11ZXZlIGNvbiBsYXMgZXhwb3J0YWNpb25lcy4qKg0KU2UgaWRlbnRpZmljYXJvbiBwZXJpb2RvcyAoMjAyMSB5IDIwMjQpIGRvbmRlIG1vdmltaWVudG9zIGVuIGVsIHRpcG8gZGUgY2FtYmlvIGNvaW5jaWRlbiBjb24gY2FtYmlvcyBlbiBlbCBkZXNlbXBlw7FvIGV4cG9ydGFkb3IsIGNvbnNpc3RlbnRlIGNvbiBsYSB0ZW9yw61hIGVjb27Ds21pY2Egc29icmUgY29tcGV0aXRpdmlkYWQgY2FtYmlhcmlhLg0KDQoqKjYuIERpc3RyaWJ1Y2nDs24gc2VzZ2FkYSBkZSBleHBvcnRhY2lvbmVzLioqDQpMYSBkaXN0cmlidWNpw7NuIGRlIGV4cG9ydGFjaW9uZXMgcmVhbGVzIGVzdMOhIGZ1ZXJ0ZW1lbnRlIHNlc2dhZGEgaGFjaWEgbGEgZGVyZWNoYTogbGEgbWF5b3LDrWEgZGUgbG9zIGVzdGFkb3MgZXhwb3J0YW4gdm9sw7ptZW5lcyBiYWpvcywgbWllbnRyYXMgcXVlIHVub3MgcG9jb3MgY29uY2VudHJhbiBuaXZlbGVzIG11eSBhbHRvcy4NCg0KKio3LiBIZXRlcm9nZW5laWRhZCByZWdpb25hbCBhbnRlIGNob3F1ZXMgZXh0ZXJub3MuKioNCkxhcyBzZXJpZXMgZGUgdGllbXBvIHBvciByZWdpw7NuIG11ZXN0cmFuIHF1ZSBsb3MgY2hvcXVlcyBlY29uw7NtaWNvcyBubyBhZmVjdGFuIGRlIGlndWFsIGZvcm1hIGEgdG9kYXMgbGFzIHJlZ2lvbmVzLCBsbyBxdWUganVzdGlmaWNhIGVsIHVzbyBkZSBkYXRvcyBwYW5lbCBjb24gZWZlY3RvcyBmaWpvcyBwYXJhIGNvbnRyb2xhciBlc3RhIGhldGVyb2dlbmVpZGFkIG5vIG9ic2VydmFkYSBlbiBtb2RlbG9zIGVjb25vbcOpdHJpY29zIHBvc3RlcmlvcmVzLg0K