ANOVA de medidas repetidas de tres vías
library(tidyverse)
library(ggpubr)
library(rstatix)
library(readxl)
EJERCICIO3 <- read_excel("C:/vale/EJERCICIO3.xlsx")
View(EJERCICIO3)
Cargue los datos y muestre algunas filas aleatorias por grupos:
# Wide format
set.seed(123)
data("EJERCICIO3 ")
Warning: data set ‘EJERCICIO3 ’ not found
EJERCICIO3 %>% sample_n_by(bloque, variedad, size = 1)
# Gather the columns t1, t2 and t3 into long format.
# Convert id and time into factor variables
EJERCICIO3 <- EJERCICIO3 %>%
gather(key = "time", value = "score", X1, X2, X3, X4) %>%
convert_as_factor(ID, time, variedad, bloque)
# Inspect some random rows of the data by groups
set.seed(123)
EJERCICIO3 %>% sample_n_by(bloque, variedad, time, size = 1)
NA
Resumen estadístico
Agrupe los datos por bloque, variedad y time, y luego calcule algunas
estadísticas resumidas de la scorevariable: media y DE (desviación
estándar).
EJERCICIO3 %>%
group_by(bloque, variedad, time) %>%
get_summary_stats(score, type = "mean_sd")
Visualización
Crea diagramas de caja:
bxp <- ggboxplot(
EJERCICIO3, x = "variedad", y = "score",
color = "time", palette = "jco",
facet.by = "bloque", short.panel.labs = FALSE
)
bxp

Verifique los supuestos
Valores atípicos
EJERCICIO3%>%
group_by(bloque, variedad, time) %>%
identify_outliers(score)
Si hubo valores atipicos extremos ## Supuesto de normalidad Calcule
la prueba de Shapiro-Wilk para cada combinación de niveles de
factores:
EJERCICIO3 %>%
group_by(bloque, variedad, time) %>%
shapiro_test(score)
Se distribuye normalmente (p>0.05) pero hay una menor
ggqqplot(EJERCICIO3, "score", ggtheme = theme_bw()) +
facet_grid(bloque + variedad ~ time, labeller = "label_both")

Del gráfico anterior, como todos los puntos caen aproximadamente a lo
largo de la línea de referencia, podemos asumir normalidad.
calculo
res.aov <- anova_test(
data = EJERCICIO3, dv = score, wid = ID,
within = c(bloque, variedad, time)
)
get_anova_table(res.aov)
ANOVA Table (type III tests)
Effect DFn DFd F p p<.05 ges
1 bloque 1.00 4.0 0.338 5.92e-01 0.027
2 variedad 1.02 4.1 26.842 6.00e-03 * 0.510
3 time 3.00 12.0 4174.104 2.26e-18 * 0.942
4 bloque:variedad 2.00 8.0 0.108 8.99e-01 0.004
5 bloque:time 3.00 12.0 1.709 2.18e-01 0.008
6 variedad:time 6.00 24.0 2.466 5.30e-02 0.021
7 bloque:variedad:time 6.00 24.0 2.492 5.10e-02 0.016
Del resultado anterior, se puede ver que existen interacciones
triples estadísticamente significativas entre el bloque, la variedad y
el tiempo, F(6, 24) = 2,492, p = 0,051.
Pruebas post hoc
Calcular interacción bidireccional simple
Usted es libre de decidir qué dos variables formarán las
interacciones bidireccionales simples y qué variable actuará como la
tercera variable (moderadora). En el siguiente código R, hemos
considerado la interacción bidireccional simple de variedad*time en cada
nivel de bloque.
Agrupe los datos diety analice la interacción bidireccional simple
entre variedad y time:
# Two-way ANOVA at each diet level
two.way <- EJERCICIO3 %>%
group_by(bloque) %>%
anova_test(dv = score, wid = ID, within = c(variedad, time))
two.way
# Extract anova table
get_anova_table(two.way)
Los datos que proporcionaste son resultados de un análisis de
varianza (ANOVA) y el índice GES (Generalized Eta Squared). Aquí está la
interpretación:
Bloque_1:variedad:time
DFn (Grados de libertad numerador): 6. Indica los grados
de libertad asociados con las diferencias entre los grupos o condiciones
en tu estudio.
DFd (Grados de libertad denominador): 24. Representa los
grados de libertad asociados con la variabilidad dentro de los grupos o
condiciones.
F (Estadístico F): 1.265. El estadístico F es una
relación de varianzas y se utiliza para evaluar si hay diferencias
significativas entre las medias de los grupos. En este caso, el valor de
F es 1.265.
p (Valor p): 3.10e-01. Este es el valor p asociado con
el estadístico F. Indica la probabilidad de obtener el estadístico F
observado (o uno más extremo) si la hipótesis nula de que no hay
diferencias significativas entre los grupos es verdadera. En este caso,
el valor p es 0.31, lo que sugiere que no hay evidencia suficiente para
rechazar la hipótesis nula a un nivel de significancia convencional de
0.05.
ges (Generalized Eta Squared): 0.022. El índice GES es
una medida de efecto que indica la proporción de la varianza total
explicada por el efecto de interés. En este caso, el valor de GES es
0.022, lo que sugiere que alrededor del 2.2% de la variabilidad total
puede atribuirse al efecto de interés.
En resumen, los resultados indican que no hay evidencia significativa
para diferencias entre los grupos, y el índice GES proporciona
información sobre el tamaño del efecto. Es importante considerar el
contexto de tu estudio y la relevancia práctica de estos resultados.
bloque_2: variedad:time En el contexto de un análisis de varianza
(ANOVA), los datos que proporcionaste representan resultados
estadísticos clave. Aquí está la interpretación:
DFn (Grados de libertad numerador): 6. Indica los grados
de libertad asociados con las diferencias entre los grupos o condiciones
en tu estudio.
DFd (Grados de libertad denominador): 24. Representa los
grados de libertad asociados con la variabilidad dentro de los grupos o
condiciones.
F (Estadístico F): 4.022. El estadístico F es una
relación de varianzas y se utiliza para evaluar si hay diferencias
significativas entre las medias de los grupos. En este caso, el valor de
F es 4.022.
p (Valor p): 6.00e-03. Este es el valor p asociado con
el estadístico F. Indica la probabilidad de obtener el estadístico F
observado (o uno más extremo) si la hipótesis nula de que no hay
diferencias significativas entre los grupos es verdadera. En este caso,
el valor p es 0.006, lo que sugiere que hay evidencia significativa para
rechazar la hipótesis nula a un nivel de significancia convencional de
0.05.
ges (Generalized Eta Squared): 0.051. El índice GES es
una medida de efecto que indica la proporción de la varianza total
explicada por el efecto de interés. En este caso, el valor de GES es
0.051, lo que sugiere que alrededor del 5.1% de la variabilidad total
puede atribuirse al efecto de interés.
En resumen, los resultados indican que hay evidencia significativa de
diferencias entre los grupos, y el índice GES proporciona información
sobre el tamaño del efecto, indicando que el efecto tiene un impacto en
aproximadamente el 5.1% de la variabilidad total.
Calcular efecto principal simple simple
A una interacción bidireccional simple estadísticamente significativa
se le pueden seguir efectos principales simples y simples
# Effect of time at each diet X exercises cells
time.effect <- EJERCICIO3 %>%
group_by(bloque, variedad) %>%
anova_test(dv = score, wid = ID, within = time)
time.effect
# Extract anova table
get_anova_table(time.effect) %>%
filter(bloque == "Bloque_1")
Hubo un efecto principal simple estadísticamente significativo ##
Calcular comparaciones simples simples Un efecto principal simple
estadísticamente significativo puede ser seguido por múltiples
comparaciones por pares para determinar qué medias de grupo son
diferentes.
# Pairwise comparisons
pwc <- EJERCICIO3 %>%
group_by(bloque, variedad) %>%
pairwise_t_test(score ~ time, paired = TRUE, p.adjust.method = "bonferroni") %>%
select(-df, -statistic) # Remove details
# Show comparison results for "diet:no,exercises:yes" groups
pwc %>% filter(bloque == "Bloque_1", variedad == "Var_1") %>%
select(-p) # remove p columns
Todas las comparaciones simples por pares se realizaron entre los
diferentes puntos temporales para la prueba “bloque_1, var_1”. Se aplicó
el ajuste de Bonferroni. La puntuación media d fue significativamente
diferente en todas las comparaciones de puntos temporales cuando se
realizaron ejercicios (p <0,05).
# Visualization: box plots with p-values
pwc <- pwc %>% add_xy_position(x = "variedad")
pwc.filtered <- pwc %>%
filter(bloque == "Bloque_1", variedad == "Var_1")
bxp +
stat_pvalue_manual(pwc.filtered, tip.length = 0, hide.ns = TRUE) +
labs(
subtitle = get_test_label(res.aov, detailed = TRUE),
caption = get_pwc_label(pwc)
)

LS0tDQp0aXRsZTogIkRBVE9TIERFIE1FRElEQVMgUkVQRVRJVElWQVMiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KIyMgQU5PVkEgZGUgbWVkaWRhcyByZXBldGlkYXMgZGUgdHJlcyB2w61hcw0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZ2dwdWJyKQ0KbGlicmFyeShyc3RhdGl4KQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShyZWFkeGwpDQpFSkVSQ0lDSU8zIDwtIHJlYWRfZXhjZWwoIkM6L3ZhbGUvRUpFUkNJQ0lPMy54bHN4IikNClZpZXcoRUpFUkNJQ0lPMykNCmBgYA0KDQpDYXJndWUgbG9zIGRhdG9zIHkgbXVlc3RyZSBhbGd1bmFzIGZpbGFzIGFsZWF0b3JpYXMgcG9yIGdydXBvczoNCg0KYGBge3J9DQojIFdpZGUgZm9ybWF0DQpzZXQuc2VlZCgxMjMpDQpkYXRhKCJFSkVSQ0lDSU8zICIpDQpFSkVSQ0lDSU8zICU+JSBzYW1wbGVfbl9ieShibG9xdWUsIHZhcmllZGFkLCBzaXplID0gMSkNCmBgYA0KYGBge3J9DQojIEdhdGhlciB0aGUgY29sdW1ucyB0MSwgdDIgYW5kIHQzIGludG8gbG9uZyBmb3JtYXQuDQojIENvbnZlcnQgaWQgYW5kIHRpbWUgaW50byBmYWN0b3IgdmFyaWFibGVzDQogRUpFUkNJQ0lPMyA8LSAgRUpFUkNJQ0lPMyAlPiUNCiAgZ2F0aGVyKGtleSA9ICJ0aW1lIiwgdmFsdWUgPSAic2NvcmUiLCBYMSwgWDIsIFgzLCBYNCkgJT4lDQogIGNvbnZlcnRfYXNfZmFjdG9yKElELCB0aW1lLCB2YXJpZWRhZCwgYmxvcXVlKQ0KIyBJbnNwZWN0IHNvbWUgcmFuZG9tIHJvd3Mgb2YgdGhlIGRhdGEgYnkgZ3JvdXBzDQpzZXQuc2VlZCgxMjMpDQogRUpFUkNJQ0lPMyAlPiUgc2FtcGxlX25fYnkoYmxvcXVlLCB2YXJpZWRhZCwgdGltZSwgc2l6ZSA9IDEpDQoNCmBgYA0KDQojIyBSZXN1bWVuIGVzdGFkw61zdGljbw0KQWdydXBlIGxvcyBkYXRvcyBwb3IgYmxvcXVlLCB2YXJpZWRhZCB5IHRpbWUsIHkgbHVlZ28gY2FsY3VsZSBhbGd1bmFzIGVzdGFkw61zdGljYXMgcmVzdW1pZGFzIGRlIGxhIHNjb3JldmFyaWFibGU6IG1lZGlhIHkgREUgKGRlc3ZpYWNpw7NuIGVzdMOhbmRhcikuDQoNCmBgYHtyfQ0KRUpFUkNJQ0lPMyAlPiUNCiAgZ3JvdXBfYnkoYmxvcXVlLCB2YXJpZWRhZCwgdGltZSkgJT4lDQogIGdldF9zdW1tYXJ5X3N0YXRzKHNjb3JlLCB0eXBlID0gIm1lYW5fc2QiKQ0KYGBgDQojIyBWaXN1YWxpemFjacOzbg0KDQpDcmVhIGRpYWdyYW1hcyBkZSBjYWphOg0KDQpgYGB7cn0NCmJ4cCA8LSBnZ2JveHBsb3QoDQpFSkVSQ0lDSU8zLCB4ID0gInZhcmllZGFkIiwgeSA9ICJzY29yZSIsDQogIGNvbG9yID0gInRpbWUiLCBwYWxldHRlID0gImpjbyIsDQogIGZhY2V0LmJ5ID0gImJsb3F1ZSIsIHNob3J0LnBhbmVsLmxhYnMgPSBGQUxTRQ0KICApDQpieHANCmBgYA0KIyMgVmVyaWZpcXVlIGxvcyBzdXB1ZXN0b3MNCiMjIyBWYWxvcmVzIGF0w61waWNvcw0KYGBge3J9DQogRUpFUkNJQ0lPMyU+JQ0KICBncm91cF9ieShibG9xdWUsIHZhcmllZGFkLCB0aW1lKSAlPiUNCiAgaWRlbnRpZnlfb3V0bGllcnMoc2NvcmUpDQpgYGANClNpIGh1Ym8gdmFsb3JlcyBhdGlwaWNvcyBleHRyZW1vcw0KIyMgU3VwdWVzdG8gZGUgbm9ybWFsaWRhZA0KQ2FsY3VsZSBsYSBwcnVlYmEgZGUgU2hhcGlyby1XaWxrIHBhcmEgY2FkYSBjb21iaW5hY2nDs24gZGUgbml2ZWxlcyBkZSBmYWN0b3JlczoNCmBgYHtyfQ0KRUpFUkNJQ0lPMyAlPiUNCiAgZ3JvdXBfYnkoYmxvcXVlLCB2YXJpZWRhZCwgdGltZSkgJT4lDQogIHNoYXBpcm9fdGVzdChzY29yZSkNCmBgYA0KU2UgZGlzdHJpYnV5ZSBub3JtYWxtZW50ZSAocD4wLjA1KSBwZXJvIGhheSB1bmEgbWVub3IgDQoNCmBgYHtyfQ0KZ2dxcXBsb3QoRUpFUkNJQ0lPMywgInNjb3JlIiwgZ2d0aGVtZSA9IHRoZW1lX2J3KCkpICsNCiAgZmFjZXRfZ3JpZChibG9xdWUgKyB2YXJpZWRhZCB+IHRpbWUsIGxhYmVsbGVyID0gImxhYmVsX2JvdGgiKQ0KYGBgDQpEZWwgZ3LDoWZpY28gYW50ZXJpb3IsIGNvbW8gdG9kb3MgbG9zIHB1bnRvcyBjYWVuIGFwcm94aW1hZGFtZW50ZSBhIGxvIGxhcmdvIGRlIGxhIGzDrW5lYSBkZSByZWZlcmVuY2lhLCBwb2RlbW9zIGFzdW1pciBub3JtYWxpZGFkLg0KDQojIyBjYWxjdWxvDQoNCmBgYHtyfQ0KcmVzLmFvdiA8LSBhbm92YV90ZXN0KA0KICBkYXRhID0gRUpFUkNJQ0lPMywgZHYgPSBzY29yZSwgd2lkID0gSUQsDQogIHdpdGhpbiA9IGMoYmxvcXVlLCB2YXJpZWRhZCwgdGltZSkNCiAgKQ0KZ2V0X2Fub3ZhX3RhYmxlKHJlcy5hb3YpDQpgYGANCkRlbCByZXN1bHRhZG8gYW50ZXJpb3IsIHNlIHB1ZWRlIHZlciBxdWUgZXhpc3RlbiBpbnRlcmFjY2lvbmVzIHRyaXBsZXMgZXN0YWTDrXN0aWNhbWVudGUgc2lnbmlmaWNhdGl2YXMgZW50cmUgZWwgYmxvcXVlLCBsYSB2YXJpZWRhZCB5IGVsIHRpZW1wbywgRig2LCAyNCkgPSAyLDQ5MiwgcCA9IDAsMDUxLg0KDQojIyBQcnVlYmFzIHBvc3QgaG9jDQojIyMgQ2FsY3VsYXIgaW50ZXJhY2Npw7NuIGJpZGlyZWNjaW9uYWwgc2ltcGxlDQpVc3RlZCBlcyBsaWJyZSBkZSBkZWNpZGlyIHF1w6kgZG9zIHZhcmlhYmxlcyBmb3JtYXLDoW4gbGFzIGludGVyYWNjaW9uZXMgYmlkaXJlY2Npb25hbGVzIHNpbXBsZXMgeSBxdcOpIHZhcmlhYmxlIGFjdHVhcsOhIGNvbW8gbGEgdGVyY2VyYSB2YXJpYWJsZSAobW9kZXJhZG9yYSkuIEVuIGVsIHNpZ3VpZW50ZSBjw7NkaWdvIFIsIGhlbW9zIGNvbnNpZGVyYWRvIGxhIGludGVyYWNjacOzbiBiaWRpcmVjY2lvbmFsIHNpbXBsZSBkZSB2YXJpZWRhZCp0aW1lIGVuIGNhZGEgbml2ZWwgZGUgYmxvcXVlLg0KDQpBZ3J1cGUgbG9zIGRhdG9zIGRpZXR5IGFuYWxpY2UgbGEgaW50ZXJhY2Npw7NuIGJpZGlyZWNjaW9uYWwgc2ltcGxlIGVudHJlIHZhcmllZGFkIHkgdGltZToNCmBgYHtyfQ0KIyBUd28td2F5IEFOT1ZBIGF0IGVhY2ggZGlldCBsZXZlbA0KdHdvLndheSA8LSBFSkVSQ0lDSU8zICU+JQ0KICBncm91cF9ieShibG9xdWUpICU+JQ0KICBhbm92YV90ZXN0KGR2ID0gc2NvcmUsIHdpZCA9IElELCB3aXRoaW4gPSBjKHZhcmllZGFkLCB0aW1lKSkNCnR3by53YXkNCmBgYA0KDQpgYGB7cn0NCiMgRXh0cmFjdCBhbm92YSB0YWJsZQ0KZ2V0X2Fub3ZhX3RhYmxlKHR3by53YXkpDQpgYGANCkxvcyBkYXRvcyBxdWUgcHJvcG9yY2lvbmFzdGUgc29uIHJlc3VsdGFkb3MgZGUgdW4gYW7DoWxpc2lzIGRlIHZhcmlhbnphIChBTk9WQSkgeSBlbCDDrW5kaWNlIEdFUyAoR2VuZXJhbGl6ZWQgRXRhIFNxdWFyZWQpLiBBcXXDrSBlc3TDoSBsYSBpbnRlcnByZXRhY2nDs246DQoNCkJsb3F1ZV8xOnZhcmllZGFkOnRpbWUNCg0KLSAqREZuIChHcmFkb3MgZGUgbGliZXJ0YWQgbnVtZXJhZG9yKToqIDYuIEluZGljYSBsb3MgZ3JhZG9zIGRlIGxpYmVydGFkIGFzb2NpYWRvcyBjb24gbGFzIGRpZmVyZW5jaWFzIGVudHJlIGxvcyBncnVwb3MgbyBjb25kaWNpb25lcyBlbiB0dSBlc3R1ZGlvLg0KDQotICpERmQgKEdyYWRvcyBkZSBsaWJlcnRhZCBkZW5vbWluYWRvcik6KiAyNC4gUmVwcmVzZW50YSBsb3MgZ3JhZG9zIGRlIGxpYmVydGFkIGFzb2NpYWRvcyBjb24gbGEgdmFyaWFiaWxpZGFkIGRlbnRybyBkZSBsb3MgZ3J1cG9zIG8gY29uZGljaW9uZXMuDQoNCi0gKkYgKEVzdGFkw61zdGljbyBGKToqIDEuMjY1LiBFbCBlc3RhZMOtc3RpY28gRiBlcyB1bmEgcmVsYWNpw7NuIGRlIHZhcmlhbnphcyB5IHNlIHV0aWxpemEgcGFyYSBldmFsdWFyIHNpIGhheSBkaWZlcmVuY2lhcyBzaWduaWZpY2F0aXZhcyBlbnRyZSBsYXMgbWVkaWFzIGRlIGxvcyBncnVwb3MuIEVuIGVzdGUgY2FzbywgZWwgdmFsb3IgZGUgRiBlcyAxLjI2NS4NCg0KLSAqcCAoVmFsb3IgcCk6KiAzLjEwZS0wMS4gRXN0ZSBlcyBlbCB2YWxvciBwIGFzb2NpYWRvIGNvbiBlbCBlc3RhZMOtc3RpY28gRi4gSW5kaWNhIGxhIHByb2JhYmlsaWRhZCBkZSBvYnRlbmVyIGVsIGVzdGFkw61zdGljbyBGIG9ic2VydmFkbyAobyB1bm8gbcOhcyBleHRyZW1vKSBzaSBsYSBoaXDDs3Rlc2lzIG51bGEgZGUgcXVlIG5vIGhheSBkaWZlcmVuY2lhcyBzaWduaWZpY2F0aXZhcyBlbnRyZSBsb3MgZ3J1cG9zIGVzIHZlcmRhZGVyYS4gRW4gZXN0ZSBjYXNvLCBlbCB2YWxvciBwIGVzIDAuMzEsIGxvIHF1ZSBzdWdpZXJlIHF1ZSBubyBoYXkgZXZpZGVuY2lhIHN1ZmljaWVudGUgcGFyYSByZWNoYXphciBsYSBoaXDDs3Rlc2lzIG51bGEgYSB1biBuaXZlbCBkZSBzaWduaWZpY2FuY2lhIGNvbnZlbmNpb25hbCBkZSAwLjA1Lg0KDQotICpnZXMgKEdlbmVyYWxpemVkIEV0YSBTcXVhcmVkKToqIDAuMDIyLiBFbCDDrW5kaWNlIEdFUyBlcyB1bmEgbWVkaWRhIGRlIGVmZWN0byBxdWUgaW5kaWNhIGxhIHByb3BvcmNpw7NuIGRlIGxhIHZhcmlhbnphIHRvdGFsIGV4cGxpY2FkYSBwb3IgZWwgZWZlY3RvIGRlIGludGVyw6lzLiBFbiBlc3RlIGNhc28sIGVsIHZhbG9yIGRlIEdFUyBlcyAwLjAyMiwgbG8gcXVlIHN1Z2llcmUgcXVlIGFscmVkZWRvciBkZWwgMi4yJSBkZSBsYSB2YXJpYWJpbGlkYWQgdG90YWwgcHVlZGUgYXRyaWJ1aXJzZSBhbCBlZmVjdG8gZGUgaW50ZXLDqXMuDQoNCkVuIHJlc3VtZW4sIGxvcyByZXN1bHRhZG9zIGluZGljYW4gcXVlIG5vIGhheSBldmlkZW5jaWEgc2lnbmlmaWNhdGl2YSBwYXJhIGRpZmVyZW5jaWFzIGVudHJlIGxvcyBncnVwb3MsIHkgZWwgw61uZGljZSBHRVMgcHJvcG9yY2lvbmEgaW5mb3JtYWNpw7NuIHNvYnJlIGVsIHRhbWHDsW8gZGVsIGVmZWN0by4gRXMgaW1wb3J0YW50ZSBjb25zaWRlcmFyIGVsIGNvbnRleHRvIGRlIHR1IGVzdHVkaW8geSBsYSByZWxldmFuY2lhIHByw6FjdGljYSBkZSBlc3RvcyByZXN1bHRhZG9zLg0KDQpibG9xdWVfMjogdmFyaWVkYWQ6dGltZSANCkVuIGVsIGNvbnRleHRvIGRlIHVuIGFuw6FsaXNpcyBkZSB2YXJpYW56YSAoQU5PVkEpLCBsb3MgZGF0b3MgcXVlIHByb3BvcmNpb25hc3RlIHJlcHJlc2VudGFuIHJlc3VsdGFkb3MgZXN0YWTDrXN0aWNvcyBjbGF2ZS4gQXF1w60gZXN0w6EgbGEgaW50ZXJwcmV0YWNpw7NuOg0KDQotICpERm4gKEdyYWRvcyBkZSBsaWJlcnRhZCBudW1lcmFkb3IpOiogNi4gSW5kaWNhIGxvcyBncmFkb3MgZGUgbGliZXJ0YWQgYXNvY2lhZG9zIGNvbiBsYXMgZGlmZXJlbmNpYXMgZW50cmUgbG9zIGdydXBvcyBvIGNvbmRpY2lvbmVzIGVuIHR1IGVzdHVkaW8uDQoNCi0gKkRGZCAoR3JhZG9zIGRlIGxpYmVydGFkIGRlbm9taW5hZG9yKToqIDI0LiBSZXByZXNlbnRhIGxvcyBncmFkb3MgZGUgbGliZXJ0YWQgYXNvY2lhZG9zIGNvbiBsYSB2YXJpYWJpbGlkYWQgZGVudHJvIGRlIGxvcyBncnVwb3MgbyBjb25kaWNpb25lcy4NCg0KLSAqRiAoRXN0YWTDrXN0aWNvIEYpOiogNC4wMjIuIEVsIGVzdGFkw61zdGljbyBGIGVzIHVuYSByZWxhY2nDs24gZGUgdmFyaWFuemFzIHkgc2UgdXRpbGl6YSBwYXJhIGV2YWx1YXIgc2kgaGF5IGRpZmVyZW5jaWFzIHNpZ25pZmljYXRpdmFzIGVudHJlIGxhcyBtZWRpYXMgZGUgbG9zIGdydXBvcy4gRW4gZXN0ZSBjYXNvLCBlbCB2YWxvciBkZSBGIGVzIDQuMDIyLg0KDQotICpwIChWYWxvciBwKToqIDYuMDBlLTAzLiBFc3RlIGVzIGVsIHZhbG9yIHAgYXNvY2lhZG8gY29uIGVsIGVzdGFkw61zdGljbyBGLiBJbmRpY2EgbGEgcHJvYmFiaWxpZGFkIGRlIG9idGVuZXIgZWwgZXN0YWTDrXN0aWNvIEYgb2JzZXJ2YWRvIChvIHVubyBtw6FzIGV4dHJlbW8pIHNpIGxhIGhpcMOzdGVzaXMgbnVsYSBkZSBxdWUgbm8gaGF5IGRpZmVyZW5jaWFzIHNpZ25pZmljYXRpdmFzIGVudHJlIGxvcyBncnVwb3MgZXMgdmVyZGFkZXJhLiBFbiBlc3RlIGNhc28sIGVsIHZhbG9yIHAgZXMgMC4wMDYsIGxvIHF1ZSBzdWdpZXJlIHF1ZSBoYXkgZXZpZGVuY2lhIHNpZ25pZmljYXRpdmEgcGFyYSByZWNoYXphciBsYSBoaXDDs3Rlc2lzIG51bGEgYSB1biBuaXZlbCBkZSBzaWduaWZpY2FuY2lhIGNvbnZlbmNpb25hbCBkZSAwLjA1Lg0KDQotICpnZXMgKEdlbmVyYWxpemVkIEV0YSBTcXVhcmVkKToqIDAuMDUxLiBFbCDDrW5kaWNlIEdFUyBlcyB1bmEgbWVkaWRhIGRlIGVmZWN0byBxdWUgaW5kaWNhIGxhIHByb3BvcmNpw7NuIGRlIGxhIHZhcmlhbnphIHRvdGFsIGV4cGxpY2FkYSBwb3IgZWwgZWZlY3RvIGRlIGludGVyw6lzLiBFbiBlc3RlIGNhc28sIGVsIHZhbG9yIGRlIEdFUyBlcyAwLjA1MSwgbG8gcXVlIHN1Z2llcmUgcXVlIGFscmVkZWRvciBkZWwgNS4xJSBkZSBsYSB2YXJpYWJpbGlkYWQgdG90YWwgcHVlZGUgYXRyaWJ1aXJzZSBhbCBlZmVjdG8gZGUgaW50ZXLDqXMuDQoNCkVuIHJlc3VtZW4sIGxvcyByZXN1bHRhZG9zIGluZGljYW4gcXVlIGhheSBldmlkZW5jaWEgc2lnbmlmaWNhdGl2YSBkZSBkaWZlcmVuY2lhcyBlbnRyZSBsb3MgZ3J1cG9zLCB5IGVsIMOtbmRpY2UgR0VTIHByb3BvcmNpb25hIGluZm9ybWFjacOzbiBzb2JyZSBlbCB0YW1hw7FvIGRlbCBlZmVjdG8sIGluZGljYW5kbyBxdWUgZWwgZWZlY3RvIHRpZW5lIHVuIGltcGFjdG8gZW4gYXByb3hpbWFkYW1lbnRlIGVsIDUuMSUgZGUgbGEgdmFyaWFiaWxpZGFkIHRvdGFsLg0KDQojIyBDYWxjdWxhciBlZmVjdG8gcHJpbmNpcGFsIHNpbXBsZSBzaW1wbGUNCkEgdW5hIGludGVyYWNjacOzbiBiaWRpcmVjY2lvbmFsIHNpbXBsZSBlc3RhZMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZhIHNlIGxlIHB1ZWRlbiBzZWd1aXIgZWZlY3RvcyBwcmluY2lwYWxlcyBzaW1wbGVzIHkgc2ltcGxlcw0KDQpgYGB7cn0NCiMgRWZmZWN0IG9mIHRpbWUgYXQgZWFjaCBkaWV0IFggZXhlcmNpc2VzIGNlbGxzDQp0aW1lLmVmZmVjdCA8LSBFSkVSQ0lDSU8zICU+JQ0KICBncm91cF9ieShibG9xdWUsIHZhcmllZGFkKSAlPiUNCiAgYW5vdmFfdGVzdChkdiA9IHNjb3JlLCB3aWQgPSBJRCwgd2l0aGluID0gdGltZSkNCnRpbWUuZWZmZWN0DQpgYGANCmBgYHtyfQ0KIyBFeHRyYWN0IGFub3ZhIHRhYmxlDQpnZXRfYW5vdmFfdGFibGUodGltZS5lZmZlY3QpICU+JQ0KICBmaWx0ZXIoYmxvcXVlID09ICJCbG9xdWVfMSIpDQpgYGANCkh1Ym8gdW4gZWZlY3RvIHByaW5jaXBhbCBzaW1wbGUgZXN0YWTDrXN0aWNhbWVudGUgc2lnbmlmaWNhdGl2bw0KIyMgQ2FsY3VsYXIgY29tcGFyYWNpb25lcyBzaW1wbGVzIHNpbXBsZXMNClVuIGVmZWN0byBwcmluY2lwYWwgc2ltcGxlIGVzdGFkw61zdGljYW1lbnRlIHNpZ25pZmljYXRpdm8gcHVlZGUgc2VyIHNlZ3VpZG8gcG9yIG3Dumx0aXBsZXMgY29tcGFyYWNpb25lcyBwb3IgcGFyZXMgcGFyYSBkZXRlcm1pbmFyIHF1w6kgbWVkaWFzIGRlIGdydXBvIHNvbiBkaWZlcmVudGVzLg0KYGBge3J9DQojIFBhaXJ3aXNlIGNvbXBhcmlzb25zDQpwd2MgPC0gRUpFUkNJQ0lPMyAlPiUNCiAgZ3JvdXBfYnkoYmxvcXVlLCB2YXJpZWRhZCkgJT4lDQogIHBhaXJ3aXNlX3RfdGVzdChzY29yZSB+IHRpbWUsIHBhaXJlZCA9IFRSVUUsIHAuYWRqdXN0Lm1ldGhvZCA9ICJib25mZXJyb25pIikgJT4lDQogIHNlbGVjdCgtZGYsIC1zdGF0aXN0aWMpICMgUmVtb3ZlIGRldGFpbHMNCiMgU2hvdyBjb21wYXJpc29uIHJlc3VsdHMgZm9yICJkaWV0Om5vLGV4ZXJjaXNlczp5ZXMiIGdyb3Vwcw0KcHdjICU+JSBmaWx0ZXIoYmxvcXVlID09ICJCbG9xdWVfMSIsIHZhcmllZGFkID09ICJWYXJfMSIpICU+JQ0KICBzZWxlY3QoLXApICAgICAjIHJlbW92ZSBwIGNvbHVtbnMNCmBgYA0KVG9kYXMgbGFzIGNvbXBhcmFjaW9uZXMgc2ltcGxlcyBwb3IgcGFyZXMgc2UgcmVhbGl6YXJvbiBlbnRyZSBsb3MgZGlmZXJlbnRlcyBwdW50b3MgdGVtcG9yYWxlcyBwYXJhIGxhIHBydWViYSDigJxibG9xdWVfMSwgdmFyXzHigJ0uIFNlIGFwbGljw7MgZWwgYWp1c3RlIGRlIEJvbmZlcnJvbmkuIExhIHB1bnR1YWNpw7NuIG1lZGlhIGQgZnVlIHNpZ25pZmljYXRpdmFtZW50ZSBkaWZlcmVudGUgZW4gdG9kYXMgbGFzIGNvbXBhcmFjaW9uZXMgZGUgcHVudG9zIHRlbXBvcmFsZXMgY3VhbmRvIHNlIHJlYWxpemFyb24gZWplcmNpY2lvcyAocCA8MCwwNSkuDQoNCmBgYHtyfQ0KIyBWaXN1YWxpemF0aW9uOiBib3ggcGxvdHMgd2l0aCBwLXZhbHVlcw0KcHdjIDwtIHB3YyAlPiUgYWRkX3h5X3Bvc2l0aW9uKHggPSAidmFyaWVkYWQiKQ0KcHdjLmZpbHRlcmVkIDwtIHB3YyAlPiUgDQogIGZpbHRlcihibG9xdWUgPT0gIkJsb3F1ZV8xIiwgdmFyaWVkYWQgPT0gIlZhcl8xIikNCmJ4cCArIA0KICBzdGF0X3B2YWx1ZV9tYW51YWwocHdjLmZpbHRlcmVkLCB0aXAubGVuZ3RoID0gMCwgaGlkZS5ucyA9IFRSVUUpICsNCiAgbGFicygNCiAgICBzdWJ0aXRsZSA9IGdldF90ZXN0X2xhYmVsKHJlcy5hb3YsIGRldGFpbGVkID0gVFJVRSksDQogICAgY2FwdGlvbiA9IGdldF9wd2NfbGFiZWwocHdjKQ0KICApDQpgYGANCg0K