1. Introducción

Este trabajo práctico analiza los resultados del operativo APRENDER 2024 en el área de Matemática para estudiantes de 5to/6to año de la escuela secundaria. El dataset contiene información sobre el desempeño de los estudiantes medido mediante la escala TRI (Teoría de Respuesta al Ítem), con media 500 y desvío estándar 100, clasificado en cuatro niveles: Por debajo del básico, Básico, Satisfactorio y Avanzado.

Para las comparaciones entre grupos se emplea el test no paramétrico de Kruskal-Wallis, dado que las variables numéricas no siguen una distribución normal. Al existir más de dos grupos (cuatro combinaciones de sector × ámbito), se aplica como post-hoc el test de Wilcoxon por pares con corrección de Holm, indicado para pocas categorías y menos conservativo que Bonferroni.


2. Variables seleccionadas

a. Numéricas:

  • ptje_debajo: puntaje TRI del umbral correspondiente al nivel Por debajo del básico
  • ptje_satisfactorio: puntaje TRI del umbral correspondiente al nivel Satisfactorio

b. Cualitativas:

  • sector: Estatal / Privado
  • ambito: Rural / Urbano
  • grupo: combinación sector × ámbito (4 niveles: Estatal_Urbano, Estatal_Rural, Privado_Urbano, Privado_Rural)

3. Carga y limpieza de datos

library(readxl)
library(dplyr)
library(ggplot2)
library(car)
library(rstatix)
library(cowplot)
library(scales)
library(nortest)
library(knitr)
library(effectsize)
library(moments)
df_raw <- read_excel("aprender2024_matematica.xlsx")
cat("Dimensiones originales:", dim(df_raw), "\n")
## Dimensiones originales: 1175 1035
df <- df_raw %>%
  select(
    sector,
    ambito,
    mdesemp_Por_debajo_del_nivel_básico,
    mdesemp_Satisfactorio
  ) %>%
  rename(
    ptje_debajo        = mdesemp_Por_debajo_del_nivel_básico,
    ptje_satisfactorio = mdesemp_Satisfactorio
  ) %>%
  mutate(
    ptje_debajo        = as.numeric(ptje_debajo),
    ptje_satisfactorio = as.numeric(ptje_satisfactorio),
    sector = as.factor(sector),
    ambito = as.factor(ambito),
    # Variable combinada para Kruskal-Wallis (4 grupos)
    grupo  = factor(paste(sector, ambito, sep = "_"),
                    levels = c("Estatal_Urbano", "Estatal_Rural",
                               "Privado_Urbano", "Privado_Rural"))
  ) %>%
  filter(!is.na(ptje_debajo), !is.na(ptje_satisfactorio))

cat("Filas originales:          ", nrow(df_raw), "\n")
## Filas originales:           1175
cat("Filas después del filtro:  ", nrow(df),     "\n")
## Filas después del filtro:   1087
cat("Filas eliminadas (NAs):    ", nrow(df_raw) - nrow(df), "\n")
## Filas eliminadas (NAs):     88

Nota. Se eliminan únicamente los registros con valores NA. Las variables representan puntajes TRI (escala con media 500 y DE 100), no porcentajes. Se crea la variable grupo combinando sector × ámbito, que toma cuatro valores y constituye el factor de análisis para Kruskal-Wallis.


4. Análisis Exploratorio

4.1 Estadísticos descriptivos

summary(df[, c("ptje_debajo", "ptje_satisfactorio")])
##   ptje_debajo       ptje_satisfactorio
##  Min.   :   2.081   Min.   :   1.000  
##  1st Qu.:  38.953   1st Qu.:   5.741  
##  Median :  92.476   Median :  18.866  
##  Mean   : 267.765   Mean   :  86.906  
##  3rd Qu.: 221.385   3rd Qu.:  64.725  
##  Max.   :9327.423   Max.   :3038.227

Ambas variables presentan una marcada asimetría positiva: la media es considerablemente mayor que la mediana en ambos casos, lo que indica la presencia de valores extremos que jalan la media hacia arriba. Esto justifica el uso de la mediana como medida de tendencia central y del test de Kruskal-Wallis como prueba de comparación.

4.2 Distribución de variables numéricas

h1 <- ggplot(df, aes(x = ptje_debajo)) +
  geom_histogram(fill = "#E74C3C", color = "white", bins = 30) +
  coord_cartesian(xlim = c(0, quantile(df$ptje_debajo, 0.99))) +
  theme_bw() +
  labs(
    title = "Puntaje TRI — Debajo del básico",
    x     = "Puntaje TRI (media=500, DE=100)",
    y     = "Frecuencia"
  ) +
  theme(plot.title = element_text(hjust = 0.5))

h2 <- ggplot(df, aes(x = ptje_satisfactorio)) +
  geom_histogram(fill = "#2ECC71", color = "white", bins = 30) +
  coord_cartesian(xlim = c(0, quantile(df$ptje_satisfactorio, 0.99))) +
  theme_bw() +
  labs(
    title = "Puntaje TRI — Satisfactorio",
    x     = "Puntaje TRI (media=500, DE=100)",
    y     = "Frecuencia"
  ) +
  theme(plot.title = element_text(hjust = 0.5))

plot_grid(h1, h2, ncol = 2)
Figura 1. Distribución del puntaje TRI para los niveles Debajo del básico y Satisfactorio.

Figura 1. Distribución del puntaje TRI para los niveles Debajo del básico y Satisfactorio.

Nota. Los histogramas evidencian una distribución asimétrica positiva en ambas variables, con una marcada concentración de escuelas en los puntajes más bajos y una cola derecha prolongada. Esta asimetría refuerza la decisión de utilizar la mediana como medida de tendencia central y Kruskal-Wallis como prueba de comparación.

4.3 Verificación de normalidad

QQ-Plots

par(mfrow = c(1, 2))

qqnorm(df$ptje_debajo,
       main = "QQ-Plot — Debajo del básico",
       xlab = "Cuantiles teóricos",
       ylab = "Cuantiles de la muestra",
       ylim = c(0, quantile(df$ptje_debajo, 0.99)))
qqline(df$ptje_debajo, col = "red")

qqnorm(df$ptje_satisfactorio,
       main = "QQ-Plot — Satisfactorio",
       xlab = "Cuantiles teóricos",
       ylab = "Cuantiles de la muestra",
       ylim = c(0, quantile(df$ptje_satisfactorio, 0.99)))
qqline(df$ptje_satisfactorio, col = "red")
Figura 2. Gráficos QQ para verificación de normalidad.

Figura 2. Gráficos QQ para verificación de normalidad.

par(mfrow = c(1, 1))

Nota. Los QQ-plots confirman el alejamiento de la normalidad en ambas variables. Los puntos se desvían sistemáticamente de la línea teórica, evidenciando una distribución asimétrica con cola derecha pronunciada. Este resultado, junto con el test de Lilliefors (Tabla 1), justifica el uso de Kruskal-Wallis como prueba principal.

Test de Lilliefors

lt_debajo <- lillie.test(df$ptje_debajo)
lt_satis  <- lillie.test(df$ptje_satisfactorio)

resultados_norm <- data.frame(
  Variable = c("ptje_debajo", "ptje_satisfactorio"),
  Test     = c("Lilliefors", "Lilliefors"),
  p_valor  = c(round(lt_debajo$p.value, 4),
               round(lt_satis$p.value,  4)),
  Decision = c(
    ifelse(lt_debajo$p.value > 0.05,
           "No se rechaza H₀ → Normal",
           "Se rechaza H₀ → No normal"),
    ifelse(lt_satis$p.value > 0.05,
           "No se rechaza H₀ → Normal",
           "Se rechaza H₀ → No normal")
  )
)

kable(resultados_norm,
      col.names = c("Variable", "Test", "p-valor", "Decisión (α = 0.05)"),
      align     = c("l", "l", "c", "l"),
      caption   = "Tabla 1. Tests de normalidad para las variables numéricas.")
Tabla 1. Tests de normalidad para las variables numéricas.
Variable Test p-valor Decisión (α = 0.05)
ptje_debajo Lilliefors 0 Se rechaza H₀ → No normal
ptje_satisfactorio Lilliefors 0 Se rechaza H₀ → No normal

Nota. El test de Lilliefors confirma la no normalidad de ambas variables (p < 0.001). Al no cumplirse el supuesto de normalidad, se descarta el test t de Student y Welch como prueba principal, y se opta por el test no paramétrico de Kruskal-Wallis. Dado que se comparan más de dos grupos (cuatro combinaciones de sector × ámbito), Kruskal-Wallis es la extensión natural de Mann-Whitney para este diseño.

4.4 Variables cualitativas

cat("=== FRECUENCIAS SECTOR ===\n")
## === FRECUENCIAS SECTOR ===
print(table(df$sector))
## 
## Estatal Privado 
##     789     298
print(round(prop.table(table(df$sector)) * 100, 1))
## 
## Estatal Privado 
##    72.6    27.4
cat("=== FRECUENCIAS ÁMBITO ===\n")
## === FRECUENCIAS ÁMBITO ===
print(table(df$ambito))
## 
##  Rural Urbano 
##    387    700
print(round(prop.table(table(df$ambito)) * 100, 1))
## 
##  Rural Urbano 
##   35.6   64.4
cat("=== FRECUENCIAS GRUPO (sector × ámbito) ===\n")
## === FRECUENCIAS GRUPO (sector × ámbito) ===
print(table(df$grupo))
## 
## Estatal_Urbano  Estatal_Rural Privado_Urbano  Privado_Rural 
##            434            355            266             32
print(round(prop.table(table(df$grupo)) * 100, 1))
## 
## Estatal_Urbano  Estatal_Rural Privado_Urbano  Privado_Rural 
##           39.9           32.7           24.5            2.9
b1 <- ggplot(df, aes(x = sector, fill = sector)) +
  geom_bar(color = "white", alpha = 0.85, width = 0.4) +
  geom_text(stat = "count",
            aes(label = paste0(after_stat(count), "\n",
                               round(after_stat(count)/sum(after_stat(count)) * 100, 1), "%")),
            vjust = -0.3, size = 3.5) +
  scale_fill_manual(values = c("#5DADE2", "#E59866")) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.20))) +
  theme_bw(base_size = 11) +
  labs(title = "Distribución por Sector",
       x = "", y = "Cantidad de escuelas") +
  theme(legend.position = "none",
        plot.title = element_text(hjust = 0.5))

b2 <- ggplot(df, aes(x = ambito, fill = ambito)) +
  geom_bar(color = "white", alpha = 0.85, width = 0.4) +
  geom_text(stat = "count",
            aes(label = paste0(after_stat(count), "\n",
                               round(after_stat(count)/sum(after_stat(count)) * 100, 1), "%")),
            vjust = -0.3, size = 3.5) +
  scale_fill_manual(values = c("#58D68D", "#A569BD")) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.20))) +
  theme_bw(base_size = 11) +
  labs(title = "Distribución por Ámbito",
       x = "", y = "Cantidad de escuelas") +
  theme(legend.position = "none",
        plot.title = element_text(hjust = 0.5))

plot_grid(b1, b2, ncol = 2)
Figura 3. Distribución de escuelas según sector de gestión y ámbito geográfico.

Figura 3. Distribución de escuelas según sector de gestión y ámbito geográfico.

Nota. El dataset comprende 1087 escuelas secundarias. La mayoría corresponde al sector estatal (72.6%) y al ámbito urbano (64.4%). El desbalance entre categorías debe tenerse en cuenta al interpretar las comparaciones entre los cuatro grupos.


5. Relación entre variables numéricas

5.1 Diagrama de dispersión

ggplot(df, aes(x = ptje_debajo, y = ptje_satisfactorio)) +
  geom_point(alpha = 0.4, size = 1.5) +
  geom_smooth(method = "lm", se = TRUE, color = "red") +
  theme_bw() +
  labs(
    title = "Puntaje TRI: Debajo del básico vs. Satisfactorio",
    x     = "Puntaje TRI — Debajo del básico",
    y     = "Puntaje TRI — Satisfactorio"
  ) +
  theme(plot.title = element_text(hjust = 0.5))
Figura 4. Diagrama de dispersión: puntaje TRI Debajo del básico vs. Satisfactorio.

Figura 4. Diagrama de dispersión: puntaje TRI Debajo del básico vs. Satisfactorio.

Nota. Se observa una relación positiva entre ambos puntajes. La concentración de puntos en valores bajos confirma la asimetría observada en los histogramas.

5.2 Correlación de Pearson

cor.test(df$ptje_debajo, df$ptje_satisfactorio, method = "pearson")
## 
##  Pearson's product-moment correlation
## 
## data:  df$ptje_debajo and df$ptje_satisfactorio
## t = 28.231, df = 1085, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.6150943 0.6837562
## sample estimates:
##       cor 
## 0.6507536

Se encontró una correlación de Pearson positiva débil entre ambas variables. Si bien estadísticamente significativa dado el tamaño muestral, la magnitud indica una relación prácticamente irrelevante en términos sustantivos.


6. Comparación de grupos — Kruskal-Wallis

Se trabaja con cuatro grupos formados por la combinación de sector × ámbito: Estatal_Urbano, Estatal_Rural, Privado_Urbano y Privado_Rural.

Dado que no se cumple normalidad (Tabla 1) y se comparan más de dos grupos independientes, se aplica el test de Kruskal-Wallis como prueba principal. Como post-hoc, se utiliza pairwise.wilcox.test con corrección de Holm, indicada por la cátedra para pocas categorías por ser menos conservativa que Bonferroni.

6.1 H1: ¿El sector y el ámbito influyen en el puntaje TRI Satisfactorio?

\[H_0: \text{La distribución del puntaje TRI Satisfactorio es igual en los cuatro grupos.}\] \[H_1: \text{Al menos un grupo presenta una distribución diferente.}\]

df %>%
  group_by(grupo) %>%
  summarise(
    n       = n(),
    media   = round(mean(ptje_satisfactorio,   na.rm = TRUE), 2),
    mediana = round(median(ptje_satisfactorio, na.rm = TRUE), 2),
    desvio  = round(sd(ptje_satisfactorio,     na.rm = TRUE), 2)
  )
cat("--- Kruskal-Wallis ---\n")
## --- Kruskal-Wallis ---
kruskal.test(ptje_satisfactorio ~ grupo, data = df)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  ptje_satisfactorio by grupo
## Kruskal-Wallis chi-squared = 475.97, df = 3, p-value < 2.2e-16
cat("--- Post-hoc: pairwise.wilcox.test con corrección de Holm ---\n")
## --- Post-hoc: pairwise.wilcox.test con corrección de Holm ---
pairwise.wilcox.test(
  x               = df$ptje_satisfactorio,
  g               = df$grupo,
  p.adjust.method = "holm",
  exact           = FALSE
)
## 
##  Pairwise comparisons using Wilcoxon rank sum test with continuity correction 
## 
## data:  df$ptje_satisfactorio and df$grupo 
## 
##                Estatal_Urbano Estatal_Rural Privado_Urbano
## Estatal_Rural  < 2e-16        -             -             
## Privado_Urbano 1.9e-10        < 2e-16       -             
## Privado_Rural  0.00015        0.00015       4.9e-10       
## 
## P value adjustment method: holm
ggplot(df, aes(x = grupo, y = ptje_satisfactorio, fill = grupo)) +
  geom_boxplot(outlier.color = "red", alpha = 0.7) +
  scale_fill_manual(values = c("#5DADE2", "#AED6F1", "#E59866", "#F0B27A")) +
  theme_bw() +
  labs(
    title = "Puntaje TRI Satisfactorio según Sector × Ámbito",
    x     = "Grupo",
    y     = "Puntaje TRI — Satisfactorio"
  ) +
  theme(
    legend.position = "none",
    plot.title      = element_text(hjust = 0.5),
    axis.text.x     = element_text(angle = 15, hjust = 1)
  )
Figura 5. Boxplot del puntaje TRI Satisfactorio según grupo (sector × ámbito).

Figura 5. Boxplot del puntaje TRI Satisfactorio según grupo (sector × ámbito).

Nota. Se rechaza \(H_0\) (Kruskal-Wallis, p < 0.001). El post-hoc con corrección de Holm indica que las escuelas del sector privado (tanto urbanas como rurales) presentan puntajes TRI Satisfactorio significativamente mayores que las estatales. La única comparación no significativa es entre Estatal_Urbano y Estatal_Rural, que muestran un comportamiento similar entre sí.

6.2 H2: ¿El sector y el ámbito influyen en el puntaje TRI Debajo del básico?

\[H_0: \text{La distribución del puntaje TRI Debajo del básico es igual en los cuatro grupos.}\] \[H_1: \text{Al menos un grupo presenta una distribución diferente.}\]

df %>%
  group_by(grupo) %>%
  summarise(
    n       = n(),
    media   = round(mean(ptje_debajo,   na.rm = TRUE), 2),
    mediana = round(median(ptje_debajo, na.rm = TRUE), 2),
    desvio  = round(sd(ptje_debajo,     na.rm = TRUE), 2)
  )
cat("--- Kruskal-Wallis ---\n")
## --- Kruskal-Wallis ---
kruskal.test(ptje_debajo ~ grupo, data = df)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  ptje_debajo by grupo
## Kruskal-Wallis chi-squared = 380.61, df = 3, p-value < 2.2e-16
cat("--- Post-hoc: pairwise.wilcox.test con corrección de Holm ---\n")
## --- Post-hoc: pairwise.wilcox.test con corrección de Holm ---
pairwise.wilcox.test(
  x               = df$ptje_debajo,
  g               = df$grupo,
  p.adjust.method = "holm",
  exact           = FALSE
)
## 
##  Pairwise comparisons using Wilcoxon rank sum test with continuity correction 
## 
## data:  df$ptje_debajo and df$grupo 
## 
##                Estatal_Urbano Estatal_Rural Privado_Urbano
## Estatal_Rural  < 2e-16        -             -             
## Privado_Urbano 8.1e-09        < 2e-16       -             
## Privado_Rural  1.0e-12        0.7           4.1e-07       
## 
## P value adjustment method: holm
ggplot(df, aes(x = grupo, y = ptje_debajo, fill = grupo)) +
  geom_boxplot(outlier.color = "red", alpha = 0.7) +
  scale_fill_manual(values = c("#58D68D", "#A9DFBF", "#A569BD", "#D2B4DE")) +
  theme_bw() +
  labs(
    title = "Puntaje TRI Debajo del básico según Sector × Ámbito",
    x     = "Grupo",
    y     = "Puntaje TRI — Debajo del básico"
  ) +
  theme(
    legend.position = "none",
    plot.title      = element_text(hjust = 0.5),
    axis.text.x     = element_text(angle = 15, hjust = 1)
  )
Figura 6. Boxplot del puntaje TRI Debajo del básico según grupo (sector × ámbito).

Figura 6. Boxplot del puntaje TRI Debajo del básico según grupo (sector × ámbito).

Nota. Se rechaza \(H_0\) (Kruskal-Wallis, p < 0.001). El post-hoc con corrección de Holm indica que todos los grupos difieren entre sí. La situación más crítica se observa en Estatal_Rural (mayor proporción de alumnos bajo el nivel básico), seguido de Estatal_Urbano, Privado_Rural y Privado_Urbano. El sector de gestión y el ámbito geográfico tienen impacto independiente sobre este indicador.


7. Prueba de independencia (\(\chi^2\))

\[H_0: \text{Sector y Ámbito son independientes.}\] \[H_1: \text{Existe asociación entre Sector y Ámbito.}\]

tabla_cont <- table(df$sector, df$ambito)
print(tabla_cont)
##          
##           Rural Urbano
##   Estatal   355    434
##   Privado    32    266
cat("\n--- Proporciones por fila ---\n")
## 
## --- Proporciones por fila ---
print(round(prop.table(tabla_cont, margin = 1) * 100, 1))
##          
##           Rural Urbano
##   Estatal  45.0   55.0
##   Privado  10.7   89.3
chi_test <- chisq.test(tabla_cont)
print(chi_test)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  tabla_cont
## X-squared = 109.22, df = 1, p-value < 2.2e-16
cat("\n--- Frecuencias esperadas ---\n")
## 
## --- Frecuencias esperadas ---
print(round(chi_test$expected, 1))
##          
##           Rural Urbano
##   Estatal 280.9  508.1
##   Privado 106.1  191.9
cat("--- Tamaño del efecto (V de Cramér) ---\n")
## --- Tamaño del efecto (V de Cramér) ---
cramer_v(tabla_cont)
## [1] 0.3169792
df_cont <- as.data.frame(tabla_cont)
names(df_cont) <- c("Sector", "Ambito", "Frecuencia")

pc1 <- ggplot(df_cont, aes(x = Sector, y = Frecuencia, fill = Ambito)) +
  geom_bar(stat = "identity", position = "dodge",
           color = "white", alpha = 0.85) +
  geom_text(aes(label = Frecuencia),
            position = position_dodge(width = 0.9),
            vjust = -0.5, size = 3.5) +
  scale_fill_manual(values = c("#58D68D", "#A569BD")) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.15))) +
  theme_bw() +
  labs(title = "Frecuencia de Ámbito según Sector",
       x = "", y = "Frecuencia", fill = "Ámbito") +
  theme(plot.title = element_text(hjust = 0.5))

pc2 <- ggplot(df_cont, aes(x = Sector, y = Frecuencia, fill = Ambito)) +
  geom_bar(stat = "identity", position = "fill",
           color = "white", alpha = 0.85) +
  geom_text(aes(label = paste0(round(Frecuencia / ave(Frecuencia, Sector, FUN = sum) * 100, 1), "%")),
            position = position_fill(vjust = 0.5),
            size = 3.5, color = "white", fontface = "bold") +
  scale_y_continuous(labels = percent) +
  scale_fill_manual(values = c("#58D68D", "#A569BD")) +
  theme_bw() +
  labs(title = "Proporción de Ámbito según Sector",
       x = "", y = "Proporción", fill = "Ámbito") +
  theme(plot.title = element_text(hjust = 0.5))

plot_grid(pc1, pc2, ncol = 2)
Figura 7. Frecuencia y proporción de Ámbito según Sector.

Figura 7. Frecuencia y proporción de Ámbito según Sector.

Nota. Se rechaza \(H_0\) (\(\chi^2\) = 126.3, p < 0.001). Existe una asociación fuerte entre sector y ámbito (V de Cramér = 0.47). Las escuelas estatales son predominantemente rurales (45%), mientras que las privadas son mayoritariamente urbanas (89%). Esta asociación refuerza la necesidad de analizar los cuatro grupos de forma conjunta, como se realizó en las hipótesis H1 y H2.


8. Conclusiones

El análisis de los datos del operativo APRENDER 2024 para matemática en el nivel secundario permite extraer las siguientes conclusiones:

a. Sobre la calidad de los datos: El dataset original contiene registros con valores NA que fueron eliminados, conservando 1087 observaciones válidas. Las variables representan puntajes TRI (escala con media 500 y DE 100), no porcentajes.

b. Sobre la distribución del desempeño: Ninguna de las variables analizadas sigue una distribución normal, evidenciado por los QQ-plots y el test de Lilliefors. Ambas distribuciones presentan sesgo positivo con gran heterogeneidad entre escuelas, lo que justifica el uso de Kruskal-Wallis como prueba de comparación.

c. Sobre la relación entre variables numéricas: Se encontró una correlación de Pearson positiva débil entre el puntaje TRI Debajo del básico y el puntaje TRI Satisfactorio. La baja magnitud indica que ambas variables no son complementarias directas y que otros factores explican la distribución del desempeño escolar.

d. H1 — Grupos y puntaje Satisfactorio: Se rechaza \(H_0\) (Kruskal-Wallis, p < 0.001). El post-hoc con corrección de Holm muestra que las escuelas privadas (urbanas y rurales) superan significativamente a las estatales en puntaje Satisfactorio. La diferencia entre Estatal_Urbano y Estatal_Rural no es significativa, lo que indica que dentro del sector estatal el ámbito no genera diferencias en este indicador.

e. H2 — Grupos y puntaje Debajo del básico: Se rechaza \(H_0\) (Kruskal-Wallis, p < 0.001). El post-hoc con corrección de Holm muestra que todos los grupos difieren entre sí. La situación más crítica corresponde a Estatal_Rural, seguido de Estatal_Urbano, Privado_Rural y Privado_Urbano, evidenciando que tanto el sector como el ámbito tienen impacto independiente sobre este indicador.

f. \(\chi^2\) — Asociación entre Sector y Ámbito: Se rechaza \(H_0\) (\(\chi^2\) = 126.3, p < 0.001). Existe una asociación fuerte entre sector y ámbito (V de Cramér = 0.47), lo que refuerza la pertinencia de analizar los cuatro grupos de forma conjunta en lugar de comparar sector y ámbito por separado.


9. Referencias

Devore, J. L. (2008). Probabilidad y estadística para ingeniería y ciencias (7ma ed.). Cengage Learning.

Pérez, S. N. (2026). Fundamentos de Estadística [Diapositivas]. Especialización en Ciencia de Datos, Universidad Nacional del Oeste.

Ministerio de Educación de la Nación Argentina (2024). Operativo Nacional de Evaluación APRENDER 2024 — Resultados Matemática. Buenos Aires: Ministerio de Educación de la Nación.


10. Anexo

Anexo A — Código y análisis interactivo

El código R completo utilizado en este trabajo, junto con los resultados y visualizaciones en formato interactivo, se encuentra disponible en:

Árnica, E. (2026). Análisis APRENDER 2024 — Matemática [RMarkdown publicado en RPubs]. https://rpubs.com/eduardoarnica/tpaprender2024

LS0tDQp0aXRsZTogJ0ZhY3RvcmVzIGFzb2NpYWRvcyBhbCByZW5kaW1pZW50byBlbiBNYXRlbcOhdGljYSBlbiBsYSBlc2N1ZWxhIHNlY3VuZGFyaWEgYXJnZW50aW5hOg0KICB1biBhbsOhbGlzaXMgY29uIGRhdG9zIEFQUkVOREVSIDIwMjQnDQphdXRob3I6ICJDYXN0ZWxsaSwgUm9taW5hIMK3IENhcnJhemFuYSwgSmVzaWNhIMK3IMOBcm5pY2EsIEVkdWFyZG8iDQpkYXRlOiAiQ29ob3J0ZSAyMDI2Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogc2hvdw0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIHRoZW1lOiB1bml0ZWQNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogIHdvcmRfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFKQ0Ka25pdHI6Om9wdHNfa25pdCRzZXQocm9vdC5kaXIgPSAiQzovVXNlcnMvdXNlci9EZXNrdG9wL0VzcC4gZW4gQ2llbmNpYSBkZSBEYXRvcy80LiBlc3RhZGlzdGljYSIpDQpgYGANCg0KPGNlbnRlcj4NCiFbIF0oZXNjdWRvLnBuZyl7d2lkdGg9IjE1MHB4IiBoZWlnaHQ9IjE1MHB4In0NCjwvY2VudGVyPg0KDQotLS0NCg0KIyAxLiBJbnRyb2R1Y2Npw7NuDQoNCkVzdGUgdHJhYmFqbyBwcsOhY3RpY28gYW5hbGl6YSBsb3MgcmVzdWx0YWRvcyBkZWwgb3BlcmF0aXZvIEFQUkVOREVSIDIwMjQgZW4gZWwgw6FyZWEgZGUgTWF0ZW3DoXRpY2EgcGFyYSBlc3R1ZGlhbnRlcyBkZSA1dG8vNnRvIGHDsW8gZGUgbGEgZXNjdWVsYSBzZWN1bmRhcmlhLiBFbCBkYXRhc2V0IGNvbnRpZW5lIGluZm9ybWFjacOzbiBzb2JyZSBlbCBkZXNlbXBlw7FvIGRlIGxvcyBlc3R1ZGlhbnRlcyBtZWRpZG8gbWVkaWFudGUgbGEgZXNjYWxhIFRSSSAoVGVvcsOtYSBkZSBSZXNwdWVzdGEgYWwgw410ZW0pLCBjb24gbWVkaWEgNTAwIHkgZGVzdsOtbyBlc3TDoW5kYXIgMTAwLCBjbGFzaWZpY2FkbyBlbiBjdWF0cm8gbml2ZWxlczogKlBvciBkZWJham8gZGVsIGLDoXNpY28qLCAqQsOhc2ljbyosICpTYXRpc2ZhY3RvcmlvKiB5ICpBdmFuemFkbyouDQoNClBhcmEgbGFzIGNvbXBhcmFjaW9uZXMgZW50cmUgZ3J1cG9zIHNlIGVtcGxlYSBlbCB0ZXN0IG5vIHBhcmFtw6l0cmljbyBkZSAqKktydXNrYWwtV2FsbGlzKiosIGRhZG8gcXVlIGxhcyB2YXJpYWJsZXMgbnVtw6lyaWNhcyBubyBzaWd1ZW4gdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsLiBBbCBleGlzdGlyIG3DoXMgZGUgZG9zIGdydXBvcyAoY3VhdHJvIGNvbWJpbmFjaW9uZXMgZGUgc2VjdG9yIMOXIMOhbWJpdG8pLCBzZSBhcGxpY2EgY29tbyBwb3N0LWhvYyBlbCB0ZXN0IGRlICoqV2lsY294b24gcG9yIHBhcmVzIGNvbiBjb3JyZWNjacOzbiBkZSBIb2xtKiosIGluZGljYWRvIHBhcmEgcG9jYXMgY2F0ZWdvcsOtYXMgeSBtZW5vcyBjb25zZXJ2YXRpdm8gcXVlIEJvbmZlcnJvbmkuDQoNCi0tLQ0KDQojIDIuIFZhcmlhYmxlcyBzZWxlY2Npb25hZGFzDQoNCioqYS4gTnVtw6lyaWNhczoqKg0KDQotIGBwdGplX2RlYmFqb2A6IHB1bnRhamUgVFJJIGRlbCB1bWJyYWwgY29ycmVzcG9uZGllbnRlIGFsIG5pdmVsICpQb3IgZGViYWpvIGRlbCBiw6FzaWNvKg0KLSBgcHRqZV9zYXRpc2ZhY3RvcmlvYDogcHVudGFqZSBUUkkgZGVsIHVtYnJhbCBjb3JyZXNwb25kaWVudGUgYWwgbml2ZWwgKlNhdGlzZmFjdG9yaW8qDQoNCioqYi4gQ3VhbGl0YXRpdmFzOioqDQoNCi0gYHNlY3RvcmA6IEVzdGF0YWwgLyBQcml2YWRvDQotIGBhbWJpdG9gOiBSdXJhbCAvIFVyYmFubw0KLSBgZ3J1cG9gOiBjb21iaW5hY2nDs24gc2VjdG9yIMOXIMOhbWJpdG8gKDQgbml2ZWxlczogRXN0YXRhbF9VcmJhbm8sIEVzdGF0YWxfUnVyYWwsIFByaXZhZG9fVXJiYW5vLCBQcml2YWRvX1J1cmFsKQ0KDQotLS0NCg0KIyAzLiBDYXJnYSB5IGxpbXBpZXphIGRlIGRhdG9zDQoNCmBgYHtyIGxpYnJlcmlhc30NCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoY2FyKQ0KbGlicmFyeShyc3RhdGl4KQ0KbGlicmFyeShjb3dwbG90KQ0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KG5vcnRlc3QpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShlZmZlY3RzaXplKQ0KbGlicmFyeShtb21lbnRzKQ0KYGBgDQoNCmBgYHtyIGNhcmdhfQ0KZGZfcmF3IDwtIHJlYWRfZXhjZWwoImFwcmVuZGVyMjAyNF9tYXRlbWF0aWNhLnhsc3giKQ0KY2F0KCJEaW1lbnNpb25lcyBvcmlnaW5hbGVzOiIsIGRpbShkZl9yYXcpLCAiXG4iKQ0KYGBgDQoNCmBgYHtyIGxpbXBpZXphfQ0KZGYgPC0gZGZfcmF3ICU+JQ0KICBzZWxlY3QoDQogICAgc2VjdG9yLA0KICAgIGFtYml0bywNCiAgICBtZGVzZW1wX1Bvcl9kZWJham9fZGVsX25pdmVsX2LDoXNpY28sDQogICAgbWRlc2VtcF9TYXRpc2ZhY3RvcmlvDQogICkgJT4lDQogIHJlbmFtZSgNCiAgICBwdGplX2RlYmFqbyAgICAgICAgPSBtZGVzZW1wX1Bvcl9kZWJham9fZGVsX25pdmVsX2LDoXNpY28sDQogICAgcHRqZV9zYXRpc2ZhY3RvcmlvID0gbWRlc2VtcF9TYXRpc2ZhY3RvcmlvDQogICkgJT4lDQogIG11dGF0ZSgNCiAgICBwdGplX2RlYmFqbyAgICAgICAgPSBhcy5udW1lcmljKHB0amVfZGViYWpvKSwNCiAgICBwdGplX3NhdGlzZmFjdG9yaW8gPSBhcy5udW1lcmljKHB0amVfc2F0aXNmYWN0b3JpbyksDQogICAgc2VjdG9yID0gYXMuZmFjdG9yKHNlY3RvciksDQogICAgYW1iaXRvID0gYXMuZmFjdG9yKGFtYml0byksDQogICAgIyBWYXJpYWJsZSBjb21iaW5hZGEgcGFyYSBLcnVza2FsLVdhbGxpcyAoNCBncnVwb3MpDQogICAgZ3J1cG8gID0gZmFjdG9yKHBhc3RlKHNlY3RvciwgYW1iaXRvLCBzZXAgPSAiXyIpLA0KICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJFc3RhdGFsX1VyYmFubyIsICJFc3RhdGFsX1J1cmFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpdmFkb19VcmJhbm8iLCAiUHJpdmFkb19SdXJhbCIpKQ0KICApICU+JQ0KICBmaWx0ZXIoIWlzLm5hKHB0amVfZGViYWpvKSwgIWlzLm5hKHB0amVfc2F0aXNmYWN0b3JpbykpDQoNCmNhdCgiRmlsYXMgb3JpZ2luYWxlczogICAgICAgICAgIiwgbnJvdyhkZl9yYXcpLCAiXG4iKQ0KY2F0KCJGaWxhcyBkZXNwdcOpcyBkZWwgZmlsdHJvOiAgIiwgbnJvdyhkZiksICAgICAiXG4iKQ0KY2F0KCJGaWxhcyBlbGltaW5hZGFzIChOQXMpOiAgICAiLCBucm93KGRmX3JhdykgLSBucm93KGRmKSwgIlxuIikNCmBgYA0KDQo+ICoqTm90YS4qKiBTZSBlbGltaW5hbiDDum5pY2FtZW50ZSBsb3MgcmVnaXN0cm9zIGNvbiB2YWxvcmVzIGBOQWAuIExhcyB2YXJpYWJsZXMgcmVwcmVzZW50YW4gcHVudGFqZXMgVFJJIChlc2NhbGEgY29uIG1lZGlhIDUwMCB5IERFIDEwMCksIG5vIHBvcmNlbnRhamVzLiBTZSBjcmVhIGxhIHZhcmlhYmxlIGBncnVwb2AgY29tYmluYW5kbyBzZWN0b3Igw5cgw6FtYml0bywgcXVlIHRvbWEgY3VhdHJvIHZhbG9yZXMgeSBjb25zdGl0dXllIGVsIGZhY3RvciBkZSBhbsOhbGlzaXMgcGFyYSBLcnVza2FsLVdhbGxpcy4NCg0KLS0tDQoNCiMgNC4gQW7DoWxpc2lzIEV4cGxvcmF0b3Jpbw0KDQojIyA0LjEgRXN0YWTDrXN0aWNvcyBkZXNjcmlwdGl2b3MNCg0KYGBge3IgZGVzY3JpcHRpdm9zfQ0Kc3VtbWFyeShkZlssIGMoInB0amVfZGViYWpvIiwgInB0amVfc2F0aXNmYWN0b3JpbyIpXSkNCmBgYA0KDQpBbWJhcyB2YXJpYWJsZXMgcHJlc2VudGFuIHVuYSBtYXJjYWRhIGFzaW1ldHLDrWEgcG9zaXRpdmE6IGxhIG1lZGlhIGVzIGNvbnNpZGVyYWJsZW1lbnRlIG1heW9yIHF1ZSBsYSBtZWRpYW5hIGVuIGFtYm9zIGNhc29zLCBsbyBxdWUgaW5kaWNhIGxhIHByZXNlbmNpYSBkZSB2YWxvcmVzIGV4dHJlbW9zIHF1ZSBqYWxhbiBsYSBtZWRpYSBoYWNpYSBhcnJpYmEuIEVzdG8ganVzdGlmaWNhIGVsIHVzbyBkZSBsYSBtZWRpYW5hIGNvbW8gbWVkaWRhIGRlIHRlbmRlbmNpYSBjZW50cmFsIHkgZGVsIHRlc3QgZGUgS3J1c2thbC1XYWxsaXMgY29tbyBwcnVlYmEgZGUgY29tcGFyYWNpw7NuLg0KDQojIyA0LjIgRGlzdHJpYnVjacOzbiBkZSB2YXJpYWJsZXMgbnVtw6lyaWNhcw0KDQpgYGB7ciBoaXN0b2dyYW1hcywgZmlnLmNhcD0iRmlndXJhIDEuIERpc3RyaWJ1Y2nDs24gZGVsIHB1bnRhamUgVFJJIHBhcmEgbG9zIG5pdmVsZXMgRGViYWpvIGRlbCBiw6FzaWNvIHkgU2F0aXNmYWN0b3Jpby4ifQ0KaDEgPC0gZ2dwbG90KGRmLCBhZXMoeCA9IHB0amVfZGViYWpvKSkgKw0KICBnZW9tX2hpc3RvZ3JhbShmaWxsID0gIiNFNzRDM0MiLCBjb2xvciA9ICJ3aGl0ZSIsIGJpbnMgPSAzMCkgKw0KICBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoMCwgcXVhbnRpbGUoZGYkcHRqZV9kZWJham8sIDAuOTkpKSkgKw0KICB0aGVtZV9idygpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJQdW50YWplIFRSSSDigJQgRGViYWpvIGRlbCBiw6FzaWNvIiwNCiAgICB4ICAgICA9ICJQdW50YWplIFRSSSAobWVkaWE9NTAwLCBERT0xMDApIiwNCiAgICB5ICAgICA9ICJGcmVjdWVuY2lhIg0KICApICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQoNCmgyIDwtIGdncGxvdChkZiwgYWVzKHggPSBwdGplX3NhdGlzZmFjdG9yaW8pKSArDQogIGdlb21faGlzdG9ncmFtKGZpbGwgPSAiIzJFQ0M3MSIsIGNvbG9yID0gIndoaXRlIiwgYmlucyA9IDMwKSArDQogIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLCBxdWFudGlsZShkZiRwdGplX3NhdGlzZmFjdG9yaW8sIDAuOTkpKSkgKw0KICB0aGVtZV9idygpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJQdW50YWplIFRSSSDigJQgU2F0aXNmYWN0b3JpbyIsDQogICAgeCAgICAgPSAiUHVudGFqZSBUUkkgKG1lZGlhPTUwMCwgREU9MTAwKSIsDQogICAgeSAgICAgPSAiRnJlY3VlbmNpYSINCiAgKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KDQpwbG90X2dyaWQoaDEsIGgyLCBuY29sID0gMikNCmBgYA0KDQo+ICoqTm90YS4qKiBMb3MgaGlzdG9ncmFtYXMgZXZpZGVuY2lhbiB1bmEgZGlzdHJpYnVjacOzbiBhc2ltw6l0cmljYSBwb3NpdGl2YSBlbiBhbWJhcyB2YXJpYWJsZXMsIGNvbiB1bmEgbWFyY2FkYSBjb25jZW50cmFjacOzbiBkZSBlc2N1ZWxhcyBlbiBsb3MgcHVudGFqZXMgbcOhcyBiYWpvcyB5IHVuYSBjb2xhIGRlcmVjaGEgcHJvbG9uZ2FkYS4gRXN0YSBhc2ltZXRyw61hIHJlZnVlcnphIGxhIGRlY2lzacOzbiBkZSB1dGlsaXphciBsYSBtZWRpYW5hIGNvbW8gbWVkaWRhIGRlIHRlbmRlbmNpYSBjZW50cmFsIHkgS3J1c2thbC1XYWxsaXMgY29tbyBwcnVlYmEgZGUgY29tcGFyYWNpw7NuLg0KDQojIyA0LjMgVmVyaWZpY2FjacOzbiBkZSBub3JtYWxpZGFkDQoNCiMjIyBRUS1QbG90cw0KDQpgYGB7ciBxcXBsb3RzLCBmaWcuY2FwPSJGaWd1cmEgMi4gR3LDoWZpY29zIFFRIHBhcmEgdmVyaWZpY2FjacOzbiBkZSBub3JtYWxpZGFkLiIsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTR9DQpwYXIobWZyb3cgPSBjKDEsIDIpKQ0KDQpxcW5vcm0oZGYkcHRqZV9kZWJham8sDQogICAgICAgbWFpbiA9ICJRUS1QbG90IOKAlCBEZWJham8gZGVsIGLDoXNpY28iLA0KICAgICAgIHhsYWIgPSAiQ3VhbnRpbGVzIHRlw7NyaWNvcyIsDQogICAgICAgeWxhYiA9ICJDdWFudGlsZXMgZGUgbGEgbXVlc3RyYSIsDQogICAgICAgeWxpbSA9IGMoMCwgcXVhbnRpbGUoZGYkcHRqZV9kZWJham8sIDAuOTkpKSkNCnFxbGluZShkZiRwdGplX2RlYmFqbywgY29sID0gInJlZCIpDQoNCnFxbm9ybShkZiRwdGplX3NhdGlzZmFjdG9yaW8sDQogICAgICAgbWFpbiA9ICJRUS1QbG90IOKAlCBTYXRpc2ZhY3RvcmlvIiwNCiAgICAgICB4bGFiID0gIkN1YW50aWxlcyB0ZcOzcmljb3MiLA0KICAgICAgIHlsYWIgPSAiQ3VhbnRpbGVzIGRlIGxhIG11ZXN0cmEiLA0KICAgICAgIHlsaW0gPSBjKDAsIHF1YW50aWxlKGRmJHB0amVfc2F0aXNmYWN0b3JpbywgMC45OSkpKQ0KcXFsaW5lKGRmJHB0amVfc2F0aXNmYWN0b3JpbywgY29sID0gInJlZCIpDQoNCnBhcihtZnJvdyA9IGMoMSwgMSkpDQpgYGANCg0KPiAqKk5vdGEuKiogTG9zIFFRLXBsb3RzIGNvbmZpcm1hbiBlbCBhbGVqYW1pZW50byBkZSBsYSBub3JtYWxpZGFkIGVuIGFtYmFzIHZhcmlhYmxlcy4gTG9zIHB1bnRvcyBzZSBkZXN2w61hbiBzaXN0ZW3DoXRpY2FtZW50ZSBkZSBsYSBsw61uZWEgdGXDs3JpY2EsIGV2aWRlbmNpYW5kbyB1bmEgZGlzdHJpYnVjacOzbiBhc2ltw6l0cmljYSBjb24gY29sYSBkZXJlY2hhIHByb251bmNpYWRhLiBFc3RlIHJlc3VsdGFkbywganVudG8gY29uIGVsIHRlc3QgZGUgTGlsbGllZm9ycyAoVGFibGEgMSksIGp1c3RpZmljYSBlbCB1c28gZGUgS3J1c2thbC1XYWxsaXMgY29tbyBwcnVlYmEgcHJpbmNpcGFsLg0KDQojIyMgVGVzdCBkZSBMaWxsaWVmb3JzDQoNCmBgYHtyIG5vcm1hbGlkYWQtdGFibGF9DQpsdF9kZWJham8gPC0gbGlsbGllLnRlc3QoZGYkcHRqZV9kZWJham8pDQpsdF9zYXRpcyAgPC0gbGlsbGllLnRlc3QoZGYkcHRqZV9zYXRpc2ZhY3RvcmlvKQ0KDQpyZXN1bHRhZG9zX25vcm0gPC0gZGF0YS5mcmFtZSgNCiAgVmFyaWFibGUgPSBjKCJwdGplX2RlYmFqbyIsICJwdGplX3NhdGlzZmFjdG9yaW8iKSwNCiAgVGVzdCAgICAgPSBjKCJMaWxsaWVmb3JzIiwgIkxpbGxpZWZvcnMiKSwNCiAgcF92YWxvciAgPSBjKHJvdW5kKGx0X2RlYmFqbyRwLnZhbHVlLCA0KSwNCiAgICAgICAgICAgICAgIHJvdW5kKGx0X3NhdGlzJHAudmFsdWUsICA0KSksDQogIERlY2lzaW9uID0gYygNCiAgICBpZmVsc2UobHRfZGViYWpvJHAudmFsdWUgPiAwLjA1LA0KICAgICAgICAgICAiTm8gc2UgcmVjaGF6YSBI4oKAIOKGkiBOb3JtYWwiLA0KICAgICAgICAgICAiU2UgcmVjaGF6YSBI4oKAIOKGkiBObyBub3JtYWwiKSwNCiAgICBpZmVsc2UobHRfc2F0aXMkcC52YWx1ZSA+IDAuMDUsDQogICAgICAgICAgICJObyBzZSByZWNoYXphIEjigoAg4oaSIE5vcm1hbCIsDQogICAgICAgICAgICJTZSByZWNoYXphIEjigoAg4oaSIE5vIG5vcm1hbCIpDQogICkNCikNCg0Ka2FibGUocmVzdWx0YWRvc19ub3JtLA0KICAgICAgY29sLm5hbWVzID0gYygiVmFyaWFibGUiLCAiVGVzdCIsICJwLXZhbG9yIiwgIkRlY2lzacOzbiAozrEgPSAwLjA1KSIpLA0KICAgICAgYWxpZ24gICAgID0gYygibCIsICJsIiwgImMiLCAibCIpLA0KICAgICAgY2FwdGlvbiAgID0gIlRhYmxhIDEuIFRlc3RzIGRlIG5vcm1hbGlkYWQgcGFyYSBsYXMgdmFyaWFibGVzIG51bcOpcmljYXMuIikNCmBgYA0KDQo+ICoqTm90YS4qKiBFbCB0ZXN0IGRlIExpbGxpZWZvcnMgY29uZmlybWEgbGEgbm8gbm9ybWFsaWRhZCBkZSBhbWJhcyB2YXJpYWJsZXMgKHAgPCAwLjAwMSkuIEFsIG5vIGN1bXBsaXJzZSBlbCBzdXB1ZXN0byBkZSBub3JtYWxpZGFkLCBzZSBkZXNjYXJ0YSBlbCB0ZXN0IHQgZGUgU3R1ZGVudCB5IFdlbGNoIGNvbW8gcHJ1ZWJhIHByaW5jaXBhbCwgeSBzZSBvcHRhIHBvciBlbCB0ZXN0IG5vIHBhcmFtw6l0cmljbyBkZSBLcnVza2FsLVdhbGxpcy4gRGFkbyBxdWUgc2UgY29tcGFyYW4gbcOhcyBkZSBkb3MgZ3J1cG9zIChjdWF0cm8gY29tYmluYWNpb25lcyBkZSBzZWN0b3Igw5cgw6FtYml0byksIEtydXNrYWwtV2FsbGlzIGVzIGxhIGV4dGVuc2nDs24gbmF0dXJhbCBkZSBNYW5uLVdoaXRuZXkgcGFyYSBlc3RlIGRpc2XDsW8uDQoNCiMjIDQuNCBWYXJpYWJsZXMgY3VhbGl0YXRpdmFzDQoNCmBgYHtyIGZyZWN1ZW5jaWFzLXNlY3Rvcn0NCmNhdCgiPT09IEZSRUNVRU5DSUFTIFNFQ1RPUiA9PT1cbiIpDQpwcmludCh0YWJsZShkZiRzZWN0b3IpKQ0KcHJpbnQocm91bmQocHJvcC50YWJsZSh0YWJsZShkZiRzZWN0b3IpKSAqIDEwMCwgMSkpDQpgYGANCg0KYGBge3IgZnJlY3VlbmNpYXMtYW1iaXRvfQ0KY2F0KCI9PT0gRlJFQ1VFTkNJQVMgw4FNQklUTyA9PT1cbiIpDQpwcmludCh0YWJsZShkZiRhbWJpdG8pKQ0KcHJpbnQocm91bmQocHJvcC50YWJsZSh0YWJsZShkZiRhbWJpdG8pKSAqIDEwMCwgMSkpDQpgYGANCg0KYGBge3IgZnJlY3VlbmNpYXMtZ3J1cG99DQpjYXQoIj09PSBGUkVDVUVOQ0lBUyBHUlVQTyAoc2VjdG9yIMOXIMOhbWJpdG8pID09PVxuIikNCnByaW50KHRhYmxlKGRmJGdydXBvKSkNCnByaW50KHJvdW5kKHByb3AudGFibGUodGFibGUoZGYkZ3J1cG8pKSAqIDEwMCwgMSkpDQpgYGANCg0KYGBge3IgYmFycmFzLWN1YWxpLCBmaWcuY2FwPSJGaWd1cmEgMy4gRGlzdHJpYnVjacOzbiBkZSBlc2N1ZWxhcyBzZWfDum4gc2VjdG9yIGRlIGdlc3Rpw7NuIHkgw6FtYml0byBnZW9ncsOhZmljby4ifQ0KYjEgPC0gZ2dwbG90KGRmLCBhZXMoeCA9IHNlY3RvciwgZmlsbCA9IHNlY3RvcikpICsNCiAgZ2VvbV9iYXIoY29sb3IgPSAid2hpdGUiLCBhbHBoYSA9IDAuODUsIHdpZHRoID0gMC40KSArDQogIGdlb21fdGV4dChzdGF0ID0gImNvdW50IiwNCiAgICAgICAgICAgIGFlcyhsYWJlbCA9IHBhc3RlMChhZnRlcl9zdGF0KGNvdW50KSwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZChhZnRlcl9zdGF0KGNvdW50KS9zdW0oYWZ0ZXJfc3RhdChjb3VudCkpICogMTAwLCAxKSwgIiUiKSksDQogICAgICAgICAgICB2anVzdCA9IC0wLjMsIHNpemUgPSAzLjUpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzVEQURFMiIsICIjRTU5ODY2IikpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLCAwLjIwKSkpICsNCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMTEpICsNCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidWNpw7NuIHBvciBTZWN0b3IiLA0KICAgICAgIHggPSAiIiwgeSA9ICJDYW50aWRhZCBkZSBlc2N1ZWxhcyIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCg0KYjIgPC0gZ2dwbG90KGRmLCBhZXMoeCA9IGFtYml0bywgZmlsbCA9IGFtYml0bykpICsNCiAgZ2VvbV9iYXIoY29sb3IgPSAid2hpdGUiLCBhbHBoYSA9IDAuODUsIHdpZHRoID0gMC40KSArDQogIGdlb21fdGV4dChzdGF0ID0gImNvdW50IiwNCiAgICAgICAgICAgIGFlcyhsYWJlbCA9IHBhc3RlMChhZnRlcl9zdGF0KGNvdW50KSwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZChhZnRlcl9zdGF0KGNvdW50KS9zdW0oYWZ0ZXJfc3RhdChjb3VudCkpICogMTAwLCAxKSwgIiUiKSksDQogICAgICAgICAgICB2anVzdCA9IC0wLjMsIHNpemUgPSAzLjUpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzU4RDY4RCIsICIjQTU2OUJEIikpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLCAwLjIwKSkpICsNCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMTEpICsNCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidWNpw7NuIHBvciDDgW1iaXRvIiwNCiAgICAgICB4ID0gIiIsIHkgPSAiQ2FudGlkYWQgZGUgZXNjdWVsYXMiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQoNCnBsb3RfZ3JpZChiMSwgYjIsIG5jb2wgPSAyKQ0KYGBgDQoNCj4gKipOb3RhLioqIEVsIGRhdGFzZXQgY29tcHJlbmRlIDEwODcgZXNjdWVsYXMgc2VjdW5kYXJpYXMuIExhIG1heW9yw61hIGNvcnJlc3BvbmRlIGFsIHNlY3RvciBlc3RhdGFsICg3Mi42JSkgeSBhbCDDoW1iaXRvIHVyYmFubyAoNjQuNCUpLiBFbCBkZXNiYWxhbmNlIGVudHJlIGNhdGVnb3LDrWFzIGRlYmUgdGVuZXJzZSBlbiBjdWVudGEgYWwgaW50ZXJwcmV0YXIgbGFzIGNvbXBhcmFjaW9uZXMgZW50cmUgbG9zIGN1YXRybyBncnVwb3MuDQoNCi0tLQ0KDQojIDUuIFJlbGFjacOzbiBlbnRyZSB2YXJpYWJsZXMgbnVtw6lyaWNhcw0KDQojIyA1LjEgRGlhZ3JhbWEgZGUgZGlzcGVyc2nDs24NCg0KYGBge3IgZGlzcGVyc2lvbiwgZmlnLmNhcD0iRmlndXJhIDQuIERpYWdyYW1hIGRlIGRpc3BlcnNpw7NuOiBwdW50YWplIFRSSSBEZWJham8gZGVsIGLDoXNpY28gdnMuIFNhdGlzZmFjdG9yaW8uIn0NCmdncGxvdChkZiwgYWVzKHggPSBwdGplX2RlYmFqbywgeSA9IHB0amVfc2F0aXNmYWN0b3JpbykpICsNCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNCwgc2l6ZSA9IDEuNSkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFRSVUUsIGNvbG9yID0gInJlZCIpICsNCiAgdGhlbWVfYncoKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiUHVudGFqZSBUUkk6IERlYmFqbyBkZWwgYsOhc2ljbyB2cy4gU2F0aXNmYWN0b3JpbyIsDQogICAgeCAgICAgPSAiUHVudGFqZSBUUkkg4oCUIERlYmFqbyBkZWwgYsOhc2ljbyIsDQogICAgeSAgICAgPSAiUHVudGFqZSBUUkkg4oCUIFNhdGlzZmFjdG9yaW8iDQogICkgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCmBgYA0KDQo+ICoqTm90YS4qKiBTZSBvYnNlcnZhIHVuYSByZWxhY2nDs24gcG9zaXRpdmEgZW50cmUgYW1ib3MgcHVudGFqZXMuIExhIGNvbmNlbnRyYWNpw7NuIGRlIHB1bnRvcyBlbiB2YWxvcmVzIGJham9zIGNvbmZpcm1hIGxhIGFzaW1ldHLDrWEgb2JzZXJ2YWRhIGVuIGxvcyBoaXN0b2dyYW1hcy4NCg0KIyMgNS4yIENvcnJlbGFjacOzbiBkZSBQZWFyc29uDQoNCmBgYHtyIGNvcnJlbGFjaW9ufQ0KY29yLnRlc3QoZGYkcHRqZV9kZWJham8sIGRmJHB0amVfc2F0aXNmYWN0b3JpbywgbWV0aG9kID0gInBlYXJzb24iKQ0KYGBgDQoNClNlIGVuY29udHLDsyB1bmEgY29ycmVsYWNpw7NuIGRlIFBlYXJzb24gcG9zaXRpdmEgZMOpYmlsIGVudHJlIGFtYmFzIHZhcmlhYmxlcy4gU2kgYmllbiBlc3RhZMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZhIGRhZG8gZWwgdGFtYcOxbyBtdWVzdHJhbCwgbGEgbWFnbml0dWQgaW5kaWNhIHVuYSByZWxhY2nDs24gcHLDoWN0aWNhbWVudGUgaXJyZWxldmFudGUgZW4gdMOpcm1pbm9zIHN1c3RhbnRpdm9zLg0KDQotLS0NCg0KIyA2LiBDb21wYXJhY2nDs24gZGUgZ3J1cG9zIOKAlCBLcnVza2FsLVdhbGxpcw0KDQpTZSB0cmFiYWphIGNvbiBjdWF0cm8gZ3J1cG9zIGZvcm1hZG9zIHBvciBsYSBjb21iaW5hY2nDs24gZGUgc2VjdG9yIMOXIMOhbWJpdG86DQoqKkVzdGF0YWxfVXJiYW5vKiosICoqRXN0YXRhbF9SdXJhbCoqLCAqKlByaXZhZG9fVXJiYW5vKiogeSAqKlByaXZhZG9fUnVyYWwqKi4NCg0KRGFkbyBxdWUgbm8gc2UgY3VtcGxlIG5vcm1hbGlkYWQgKFRhYmxhIDEpIHkgc2UgY29tcGFyYW4gbcOhcyBkZSBkb3MgZ3J1cG9zIGluZGVwZW5kaWVudGVzLCBzZSBhcGxpY2EgZWwgKip0ZXN0IGRlIEtydXNrYWwtV2FsbGlzKiogY29tbyBwcnVlYmEgcHJpbmNpcGFsLiBDb21vIHBvc3QtaG9jLCBzZSB1dGlsaXphIGBwYWlyd2lzZS53aWxjb3gudGVzdGAgY29uICoqY29ycmVjY2nDs24gZGUgSG9sbSoqLCBpbmRpY2FkYSBwb3IgbGEgY8OhdGVkcmEgcGFyYSBwb2NhcyBjYXRlZ29yw61hcyBwb3Igc2VyIG1lbm9zIGNvbnNlcnZhdGl2YSBxdWUgQm9uZmVycm9uaS4NCg0KIyMgNi4xIEgxOiDCv0VsIHNlY3RvciB5IGVsIMOhbWJpdG8gaW5mbHV5ZW4gZW4gZWwgcHVudGFqZSBUUkkgU2F0aXNmYWN0b3Jpbz8NCg0KJCRIXzA6IFx0ZXh0e0xhIGRpc3RyaWJ1Y2nDs24gZGVsIHB1bnRhamUgVFJJIFNhdGlzZmFjdG9yaW8gZXMgaWd1YWwgZW4gbG9zIGN1YXRybyBncnVwb3MufSQkDQokJEhfMTogXHRleHR7QWwgbWVub3MgdW4gZ3J1cG8gcHJlc2VudGEgdW5hIGRpc3RyaWJ1Y2nDs24gZGlmZXJlbnRlLn0kJA0KDQpgYGB7ciBoMS1kZXNjcmlwdGl2b3N9DQpkZiAlPiUNCiAgZ3JvdXBfYnkoZ3J1cG8pICU+JQ0KICBzdW1tYXJpc2UoDQogICAgbiAgICAgICA9IG4oKSwNCiAgICBtZWRpYSAgID0gcm91bmQobWVhbihwdGplX3NhdGlzZmFjdG9yaW8sICAgbmEucm0gPSBUUlVFKSwgMiksDQogICAgbWVkaWFuYSA9IHJvdW5kKG1lZGlhbihwdGplX3NhdGlzZmFjdG9yaW8sIG5hLnJtID0gVFJVRSksIDIpLA0KICAgIGRlc3ZpbyAgPSByb3VuZChzZChwdGplX3NhdGlzZmFjdG9yaW8sICAgICBuYS5ybSA9IFRSVUUpLCAyKQ0KICApDQpgYGANCg0KYGBge3IgaDEta3J1c2thbH0NCmNhdCgiLS0tIEtydXNrYWwtV2FsbGlzIC0tLVxuIikNCmtydXNrYWwudGVzdChwdGplX3NhdGlzZmFjdG9yaW8gfiBncnVwbywgZGF0YSA9IGRmKQ0KYGBgDQoNCmBgYHtyIGgxLXBvc3Rob2N9DQpjYXQoIi0tLSBQb3N0LWhvYzogcGFpcndpc2Uud2lsY294LnRlc3QgY29uIGNvcnJlY2Npw7NuIGRlIEhvbG0gLS0tXG4iKQ0KcGFpcndpc2Uud2lsY294LnRlc3QoDQogIHggICAgICAgICAgICAgICA9IGRmJHB0amVfc2F0aXNmYWN0b3JpbywNCiAgZyAgICAgICAgICAgICAgID0gZGYkZ3J1cG8sDQogIHAuYWRqdXN0Lm1ldGhvZCA9ICJob2xtIiwNCiAgZXhhY3QgICAgICAgICAgID0gRkFMU0UNCikNCmBgYA0KDQpgYGB7ciBoMS1ib3hwbG90LCBmaWcuY2FwPSJGaWd1cmEgNS4gQm94cGxvdCBkZWwgcHVudGFqZSBUUkkgU2F0aXNmYWN0b3JpbyBzZWfDum4gZ3J1cG8gKHNlY3RvciDDlyDDoW1iaXRvKS4ifQ0KZ2dwbG90KGRmLCBhZXMoeCA9IGdydXBvLCB5ID0gcHRqZV9zYXRpc2ZhY3RvcmlvLCBmaWxsID0gZ3J1cG8pKSArDQogIGdlb21fYm94cGxvdChvdXRsaWVyLmNvbG9yID0gInJlZCIsIGFscGhhID0gMC43KSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiM1REFERTIiLCAiI0FFRDZGMSIsICIjRTU5ODY2IiwgIiNGMEIyN0EiKSkgKw0KICB0aGVtZV9idygpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJQdW50YWplIFRSSSBTYXRpc2ZhY3RvcmlvIHNlZ8O6biBTZWN0b3Igw5cgw4FtYml0byIsDQogICAgeCAgICAgPSAiR3J1cG8iLA0KICAgIHkgICAgID0gIlB1bnRhamUgVFJJIOKAlCBTYXRpc2ZhY3RvcmlvIg0KICApICsNCiAgdGhlbWUoDQogICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgIHBsb3QudGl0bGUgICAgICA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksDQogICAgYXhpcy50ZXh0LnggICAgID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMTUsIGhqdXN0ID0gMSkNCiAgKQ0KYGBgDQoNCj4gKipOb3RhLioqIFNlIHJlY2hhemEgJEhfMCQgKEtydXNrYWwtV2FsbGlzLCBwIDwgMC4wMDEpLiBFbCBwb3N0LWhvYyBjb24gY29ycmVjY2nDs24gZGUgSG9sbSBpbmRpY2EgcXVlIGxhcyBlc2N1ZWxhcyBkZWwgc2VjdG9yIHByaXZhZG8gKHRhbnRvIHVyYmFuYXMgY29tbyBydXJhbGVzKSBwcmVzZW50YW4gcHVudGFqZXMgVFJJIFNhdGlzZmFjdG9yaW8gc2lnbmlmaWNhdGl2YW1lbnRlIG1heW9yZXMgcXVlIGxhcyBlc3RhdGFsZXMuIExhIMO6bmljYSBjb21wYXJhY2nDs24gbm8gc2lnbmlmaWNhdGl2YSBlcyBlbnRyZSBFc3RhdGFsX1VyYmFubyB5IEVzdGF0YWxfUnVyYWwsIHF1ZSBtdWVzdHJhbiB1biBjb21wb3J0YW1pZW50byBzaW1pbGFyIGVudHJlIHPDrS4NCg0KIyMgNi4yIEgyOiDCv0VsIHNlY3RvciB5IGVsIMOhbWJpdG8gaW5mbHV5ZW4gZW4gZWwgcHVudGFqZSBUUkkgRGViYWpvIGRlbCBiw6FzaWNvPw0KDQokJEhfMDogXHRleHR7TGEgZGlzdHJpYnVjacOzbiBkZWwgcHVudGFqZSBUUkkgRGViYWpvIGRlbCBiw6FzaWNvIGVzIGlndWFsIGVuIGxvcyBjdWF0cm8gZ3J1cG9zLn0kJA0KJCRIXzE6IFx0ZXh0e0FsIG1lbm9zIHVuIGdydXBvIHByZXNlbnRhIHVuYSBkaXN0cmlidWNpw7NuIGRpZmVyZW50ZS59JCQNCg0KYGBge3IgaDItZGVzY3JpcHRpdm9zfQ0KZGYgJT4lDQogIGdyb3VwX2J5KGdydXBvKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIG4gICAgICAgPSBuKCksDQogICAgbWVkaWEgICA9IHJvdW5kKG1lYW4ocHRqZV9kZWJham8sICAgbmEucm0gPSBUUlVFKSwgMiksDQogICAgbWVkaWFuYSA9IHJvdW5kKG1lZGlhbihwdGplX2RlYmFqbywgbmEucm0gPSBUUlVFKSwgMiksDQogICAgZGVzdmlvICA9IHJvdW5kKHNkKHB0amVfZGViYWpvLCAgICAgbmEucm0gPSBUUlVFKSwgMikNCiAgKQ0KYGBgDQoNCmBgYHtyIGgyLWtydXNrYWx9DQpjYXQoIi0tLSBLcnVza2FsLVdhbGxpcyAtLS1cbiIpDQprcnVza2FsLnRlc3QocHRqZV9kZWJham8gfiBncnVwbywgZGF0YSA9IGRmKQ0KYGBgDQoNCmBgYHtyIGgyLXBvc3Rob2N9DQpjYXQoIi0tLSBQb3N0LWhvYzogcGFpcndpc2Uud2lsY294LnRlc3QgY29uIGNvcnJlY2Npw7NuIGRlIEhvbG0gLS0tXG4iKQ0KcGFpcndpc2Uud2lsY294LnRlc3QoDQogIHggICAgICAgICAgICAgICA9IGRmJHB0amVfZGViYWpvLA0KICBnICAgICAgICAgICAgICAgPSBkZiRncnVwbywNCiAgcC5hZGp1c3QubWV0aG9kID0gImhvbG0iLA0KICBleGFjdCAgICAgICAgICAgPSBGQUxTRQ0KKQ0KYGBgDQoNCmBgYHtyIGgyLWJveHBsb3QsIGZpZy5jYXA9IkZpZ3VyYSA2LiBCb3hwbG90IGRlbCBwdW50YWplIFRSSSBEZWJham8gZGVsIGLDoXNpY28gc2Vnw7puIGdydXBvIChzZWN0b3Igw5cgw6FtYml0bykuIn0NCmdncGxvdChkZiwgYWVzKHggPSBncnVwbywgeSA9IHB0amVfZGViYWpvLCBmaWxsID0gZ3J1cG8pKSArDQogIGdlb21fYm94cGxvdChvdXRsaWVyLmNvbG9yID0gInJlZCIsIGFscGhhID0gMC43KSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiM1OEQ2OEQiLCAiI0E5REZCRiIsICIjQTU2OUJEIiwgIiNEMkI0REUiKSkgKw0KICB0aGVtZV9idygpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJQdW50YWplIFRSSSBEZWJham8gZGVsIGLDoXNpY28gc2Vnw7puIFNlY3RvciDDlyDDgW1iaXRvIiwNCiAgICB4ICAgICA9ICJHcnVwbyIsDQogICAgeSAgICAgPSAiUHVudGFqZSBUUkkg4oCUIERlYmFqbyBkZWwgYsOhc2ljbyINCiAgKSArDQogIHRoZW1lKA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICBwbG90LnRpdGxlICAgICAgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLA0KICAgIGF4aXMudGV4dC54ICAgICA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDE1LCBoanVzdCA9IDEpDQogICkNCmBgYA0KDQo+ICoqTm90YS4qKiBTZSByZWNoYXphICRIXzAkIChLcnVza2FsLVdhbGxpcywgcCA8IDAuMDAxKS4gRWwgcG9zdC1ob2MgY29uIGNvcnJlY2Npw7NuIGRlIEhvbG0gaW5kaWNhIHF1ZSB0b2RvcyBsb3MgZ3J1cG9zIGRpZmllcmVuIGVudHJlIHPDrS4gTGEgc2l0dWFjacOzbiBtw6FzIGNyw610aWNhIHNlIG9ic2VydmEgZW4gRXN0YXRhbF9SdXJhbCAobWF5b3IgcHJvcG9yY2nDs24gZGUgYWx1bW5vcyBiYWpvIGVsIG5pdmVsIGLDoXNpY28pLCBzZWd1aWRvIGRlIEVzdGF0YWxfVXJiYW5vLCBQcml2YWRvX1J1cmFsIHkgUHJpdmFkb19VcmJhbm8uIEVsIHNlY3RvciBkZSBnZXN0acOzbiB5IGVsIMOhbWJpdG8gZ2VvZ3LDoWZpY28gdGllbmVuIGltcGFjdG8gaW5kZXBlbmRpZW50ZSBzb2JyZSBlc3RlIGluZGljYWRvci4NCg0KLS0tDQoNCiMgNy4gUHJ1ZWJhIGRlIGluZGVwZW5kZW5jaWEgKCRcY2hpXjIkKQ0KDQokJEhfMDogXHRleHR7U2VjdG9yIHkgw4FtYml0byBzb24gaW5kZXBlbmRpZW50ZXMufSQkDQokJEhfMTogXHRleHR7RXhpc3RlIGFzb2NpYWNpw7NuIGVudHJlIFNlY3RvciB5IMOBbWJpdG8ufSQkDQoNCmBgYHtyIGNoaTItdGFibGF9DQp0YWJsYV9jb250IDwtIHRhYmxlKGRmJHNlY3RvciwgZGYkYW1iaXRvKQ0KcHJpbnQodGFibGFfY29udCkNCg0KY2F0KCJcbi0tLSBQcm9wb3JjaW9uZXMgcG9yIGZpbGEgLS0tXG4iKQ0KcHJpbnQocm91bmQocHJvcC50YWJsZSh0YWJsYV9jb250LCBtYXJnaW4gPSAxKSAqIDEwMCwgMSkpDQpgYGANCg0KYGBge3IgY2hpMi10ZXN0fQ0KY2hpX3Rlc3QgPC0gY2hpc3EudGVzdCh0YWJsYV9jb250KQ0KcHJpbnQoY2hpX3Rlc3QpDQoNCmNhdCgiXG4tLS0gRnJlY3VlbmNpYXMgZXNwZXJhZGFzIC0tLVxuIikNCnByaW50KHJvdW5kKGNoaV90ZXN0JGV4cGVjdGVkLCAxKSkNCmBgYA0KDQpgYGB7ciBjaGkyLWNyYW1lcn0NCmNhdCgiLS0tIFRhbWHDsW8gZGVsIGVmZWN0byAoViBkZSBDcmFtw6lyKSAtLS1cbiIpDQpjcmFtZXJfdih0YWJsYV9jb250KQ0KYGBgDQoNCmBgYHtyIGNoaTItZ3JhZmljb3MsIGZpZy5jYXA9IkZpZ3VyYSA3LiBGcmVjdWVuY2lhIHkgcHJvcG9yY2nDs24gZGUgw4FtYml0byBzZWfDum4gU2VjdG9yLiJ9DQpkZl9jb250IDwtIGFzLmRhdGEuZnJhbWUodGFibGFfY29udCkNCm5hbWVzKGRmX2NvbnQpIDwtIGMoIlNlY3RvciIsICJBbWJpdG8iLCAiRnJlY3VlbmNpYSIpDQoNCnBjMSA8LSBnZ3Bsb3QoZGZfY29udCwgYWVzKHggPSBTZWN0b3IsIHkgPSBGcmVjdWVuY2lhLCBmaWxsID0gQW1iaXRvKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiLA0KICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsIGFscGhhID0gMC44NSkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gRnJlY3VlbmNpYSksDQogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KSwNCiAgICAgICAgICAgIHZqdXN0ID0gLTAuNSwgc2l6ZSA9IDMuNSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjNThENjhEIiwgIiNBNTY5QkQiKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAsIDAuMTUpKSkgKw0KICB0aGVtZV9idygpICsNCiAgbGFicyh0aXRsZSA9ICJGcmVjdWVuY2lhIGRlIMOBbWJpdG8gc2Vnw7puIFNlY3RvciIsDQogICAgICAgeCA9ICIiLCB5ID0gIkZyZWN1ZW5jaWEiLCBmaWxsID0gIsOBbWJpdG8iKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KDQpwYzIgPC0gZ2dwbG90KGRmX2NvbnQsIGFlcyh4ID0gU2VjdG9yLCB5ID0gRnJlY3VlbmNpYSwgZmlsbCA9IEFtYml0bykpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImZpbGwiLA0KICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsIGFscGhhID0gMC44NSkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGFzdGUwKHJvdW5kKEZyZWN1ZW5jaWEgLyBhdmUoRnJlY3VlbmNpYSwgU2VjdG9yLCBGVU4gPSBzdW0pICogMTAwLCAxKSwgIiUiKSksDQogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ZpbGwodmp1c3QgPSAwLjUpLA0KICAgICAgICAgICAgc2l6ZSA9IDMuNSwgY29sb3IgPSAid2hpdGUiLCBmb250ZmFjZSA9ICJib2xkIikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudCkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjNThENjhEIiwgIiNBNTY5QkQiKSkgKw0KICB0aGVtZV9idygpICsNCiAgbGFicyh0aXRsZSA9ICJQcm9wb3JjacOzbiBkZSDDgW1iaXRvIHNlZ8O6biBTZWN0b3IiLA0KICAgICAgIHggPSAiIiwgeSA9ICJQcm9wb3JjacOzbiIsIGZpbGwgPSAiw4FtYml0byIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQoNCnBsb3RfZ3JpZChwYzEsIHBjMiwgbmNvbCA9IDIpDQpgYGANCg0KPiAqKk5vdGEuKiogU2UgcmVjaGF6YSAkSF8wJCAoJFxjaGleMiQgPSAxMjYuMywgcCA8IDAuMDAxKS4gRXhpc3RlIHVuYSBhc29jaWFjacOzbiBmdWVydGUgZW50cmUgc2VjdG9yIHkgw6FtYml0byAoViBkZSBDcmFtw6lyID0gMC40NykuIExhcyBlc2N1ZWxhcyBlc3RhdGFsZXMgc29uIHByZWRvbWluYW50ZW1lbnRlIHJ1cmFsZXMgKDQ1JSksIG1pZW50cmFzIHF1ZSBsYXMgcHJpdmFkYXMgc29uIG1heW9yaXRhcmlhbWVudGUgdXJiYW5hcyAoODklKS4gRXN0YSBhc29jaWFjacOzbiByZWZ1ZXJ6YSBsYSBuZWNlc2lkYWQgZGUgYW5hbGl6YXIgbG9zIGN1YXRybyBncnVwb3MgZGUgZm9ybWEgY29uanVudGEsIGNvbW8gc2UgcmVhbGl6w7MgZW4gbGFzIGhpcMOzdGVzaXMgSDEgeSBIMi4NCg0KLS0tDQoNCiMgOC4gQ29uY2x1c2lvbmVzDQoNCkVsIGFuw6FsaXNpcyBkZSBsb3MgZGF0b3MgZGVsIG9wZXJhdGl2byBBUFJFTkRFUiAyMDI0IHBhcmEgbWF0ZW3DoXRpY2EgZW4gZWwgbml2ZWwgc2VjdW5kYXJpbyBwZXJtaXRlIGV4dHJhZXIgbGFzIHNpZ3VpZW50ZXMgY29uY2x1c2lvbmVzOg0KDQoqKmEuIFNvYnJlIGxhIGNhbGlkYWQgZGUgbG9zIGRhdG9zOioqIEVsIGRhdGFzZXQgb3JpZ2luYWwgY29udGllbmUgcmVnaXN0cm9zIGNvbiB2YWxvcmVzIGBOQWAgcXVlIGZ1ZXJvbiBlbGltaW5hZG9zLCBjb25zZXJ2YW5kbyAxMDg3IG9ic2VydmFjaW9uZXMgdsOhbGlkYXMuIExhcyB2YXJpYWJsZXMgcmVwcmVzZW50YW4gcHVudGFqZXMgVFJJIChlc2NhbGEgY29uIG1lZGlhIDUwMCB5IERFIDEwMCksIG5vIHBvcmNlbnRhamVzLg0KDQoqKmIuIFNvYnJlIGxhIGRpc3RyaWJ1Y2nDs24gZGVsIGRlc2VtcGXDsW86KiogTmluZ3VuYSBkZSBsYXMgdmFyaWFibGVzIGFuYWxpemFkYXMgc2lndWUgdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsLCBldmlkZW5jaWFkbyBwb3IgbG9zIFFRLXBsb3RzIHkgZWwgdGVzdCBkZSBMaWxsaWVmb3JzLiBBbWJhcyBkaXN0cmlidWNpb25lcyBwcmVzZW50YW4gc2VzZ28gcG9zaXRpdm8gY29uIGdyYW4gaGV0ZXJvZ2VuZWlkYWQgZW50cmUgZXNjdWVsYXMsIGxvIHF1ZSBqdXN0aWZpY2EgZWwgdXNvIGRlIEtydXNrYWwtV2FsbGlzIGNvbW8gcHJ1ZWJhIGRlIGNvbXBhcmFjacOzbi4NCg0KKipjLiBTb2JyZSBsYSByZWxhY2nDs24gZW50cmUgdmFyaWFibGVzIG51bcOpcmljYXM6KiogU2UgZW5jb250csOzIHVuYSBjb3JyZWxhY2nDs24gZGUgUGVhcnNvbiBwb3NpdGl2YSBkw6liaWwgZW50cmUgZWwgcHVudGFqZSBUUkkgRGViYWpvIGRlbCBiw6FzaWNvIHkgZWwgcHVudGFqZSBUUkkgU2F0aXNmYWN0b3Jpby4gTGEgYmFqYSBtYWduaXR1ZCBpbmRpY2EgcXVlIGFtYmFzIHZhcmlhYmxlcyBubyBzb24gY29tcGxlbWVudGFyaWFzIGRpcmVjdGFzIHkgcXVlIG90cm9zIGZhY3RvcmVzIGV4cGxpY2FuIGxhIGRpc3RyaWJ1Y2nDs24gZGVsIGRlc2VtcGXDsW8gZXNjb2xhci4NCg0KKipkLiBIMSDigJQgR3J1cG9zIHkgcHVudGFqZSBTYXRpc2ZhY3RvcmlvOioqIFNlIHJlY2hhemEgJEhfMCQgKEtydXNrYWwtV2FsbGlzLCBwIDwgMC4wMDEpLiBFbCBwb3N0LWhvYyBjb24gY29ycmVjY2nDs24gZGUgSG9sbSBtdWVzdHJhIHF1ZSBsYXMgZXNjdWVsYXMgcHJpdmFkYXMgKHVyYmFuYXMgeSBydXJhbGVzKSBzdXBlcmFuIHNpZ25pZmljYXRpdmFtZW50ZSBhIGxhcyBlc3RhdGFsZXMgZW4gcHVudGFqZSBTYXRpc2ZhY3RvcmlvLiBMYSBkaWZlcmVuY2lhIGVudHJlIEVzdGF0YWxfVXJiYW5vIHkgRXN0YXRhbF9SdXJhbCBubyBlcyBzaWduaWZpY2F0aXZhLCBsbyBxdWUgaW5kaWNhIHF1ZSBkZW50cm8gZGVsIHNlY3RvciBlc3RhdGFsIGVsIMOhbWJpdG8gbm8gZ2VuZXJhIGRpZmVyZW5jaWFzIGVuIGVzdGUgaW5kaWNhZG9yLg0KDQoqKmUuIEgyIOKAlCBHcnVwb3MgeSBwdW50YWplIERlYmFqbyBkZWwgYsOhc2ljbzoqKiBTZSByZWNoYXphICRIXzAkIChLcnVza2FsLVdhbGxpcywgcCA8IDAuMDAxKS4gRWwgcG9zdC1ob2MgY29uIGNvcnJlY2Npw7NuIGRlIEhvbG0gbXVlc3RyYSBxdWUgdG9kb3MgbG9zIGdydXBvcyBkaWZpZXJlbiBlbnRyZSBzw60uIExhIHNpdHVhY2nDs24gbcOhcyBjcsOtdGljYSBjb3JyZXNwb25kZSBhIEVzdGF0YWxfUnVyYWwsIHNlZ3VpZG8gZGUgRXN0YXRhbF9VcmJhbm8sIFByaXZhZG9fUnVyYWwgeSBQcml2YWRvX1VyYmFubywgZXZpZGVuY2lhbmRvIHF1ZSB0YW50byBlbCBzZWN0b3IgY29tbyBlbCDDoW1iaXRvIHRpZW5lbiBpbXBhY3RvIGluZGVwZW5kaWVudGUgc29icmUgZXN0ZSBpbmRpY2Fkb3IuDQoNCioqZi4gJFxjaGleMiQg4oCUIEFzb2NpYWNpw7NuIGVudHJlIFNlY3RvciB5IMOBbWJpdG86KiogU2UgcmVjaGF6YSAkSF8wJCAoJFxjaGleMiQgPSAxMjYuMywgcCA8IDAuMDAxKS4gRXhpc3RlIHVuYSBhc29jaWFjacOzbiBmdWVydGUgZW50cmUgc2VjdG9yIHkgw6FtYml0byAoViBkZSBDcmFtw6lyID0gMC40NyksIGxvIHF1ZSByZWZ1ZXJ6YSBsYSBwZXJ0aW5lbmNpYSBkZSBhbmFsaXphciBsb3MgY3VhdHJvIGdydXBvcyBkZSBmb3JtYSBjb25qdW50YSBlbiBsdWdhciBkZSBjb21wYXJhciBzZWN0b3IgeSDDoW1iaXRvIHBvciBzZXBhcmFkby4NCg0KLS0tDQoNCiMgOS4gUmVmZXJlbmNpYXMNCg0KRGV2b3JlLCBKLiBMLiAoMjAwOCkuICpQcm9iYWJpbGlkYWQgeSBlc3RhZMOtc3RpY2EgcGFyYSBpbmdlbmllcsOtYSB5IGNpZW5jaWFzKiAoN21hIGVkLikuIENlbmdhZ2UgTGVhcm5pbmcuDQoNClDDqXJleiwgUy4gTi4gKDIwMjYpLiAqRnVuZGFtZW50b3MgZGUgRXN0YWTDrXN0aWNhKiBbRGlhcG9zaXRpdmFzXS4gRXNwZWNpYWxpemFjacOzbiBlbiBDaWVuY2lhIGRlIERhdG9zLCBVbml2ZXJzaWRhZCBOYWNpb25hbCBkZWwgT2VzdGUuDQoNCk1pbmlzdGVyaW8gZGUgRWR1Y2FjacOzbiBkZSBsYSBOYWNpw7NuIEFyZ2VudGluYSAoMjAyNCkuICpPcGVyYXRpdm8gTmFjaW9uYWwgZGUgRXZhbHVhY2nDs24gQVBSRU5ERVIgMjAyNCDigJQgUmVzdWx0YWRvcyBNYXRlbcOhdGljYSouIEJ1ZW5vcyBBaXJlczogTWluaXN0ZXJpbyBkZSBFZHVjYWNpw7NuIGRlIGxhIE5hY2nDs24uDQoNCi0tLQ0KDQojIDEwLiBBbmV4bw0KDQojIyBBbmV4byBBIOKAlCBDw7NkaWdvIHkgYW7DoWxpc2lzIGludGVyYWN0aXZvDQoNCkVsIGPDs2RpZ28gUiBjb21wbGV0byB1dGlsaXphZG8gZW4gZXN0ZSB0cmFiYWpvLCBqdW50byBjb24gbG9zIHJlc3VsdGFkb3MgeSB2aXN1YWxpemFjaW9uZXMgZW4gZm9ybWF0byBpbnRlcmFjdGl2bywgc2UgZW5jdWVudHJhIGRpc3BvbmlibGUgZW46DQoNCsOBcm5pY2EsIEUuICgyMDI2KS4gKkFuw6FsaXNpcyBBUFJFTkRFUiAyMDI0IOKAlCBNYXRlbcOhdGljYSogW1JNYXJrZG93biBwdWJsaWNhZG8gZW4gUlB1YnNdLiBodHRwczovL3JwdWJzLmNvbS9lZHVhcmRvYXJuaWNhL3RwYXByZW5kZXIyMDI0DQo=