los packages

library("tidyverse")
library("forcats")
library("ggthemes")
library("ggsignif")
library("broom")
library("viridis")
library("viridisLite")

Abro mi df

df <- read.csv("datos diego.csv", header = TRUE, sep=",")

Summary de datos

summary(df)
            M..todo     Pregunta.1      Pregunta.2      Pregunta.3      Pregunta.4   
 Aceptacion ICAV:42   Min.   :2.000   Min.   :2.000   Min.   :3.000   Min.   :3.000  
 Tradicional    :46   1st Qu.:3.000   1st Qu.:3.000   1st Qu.:4.000   1st Qu.:4.000  
                      Median :4.000   Median :4.000   Median :5.000   Median :5.000  
                      Mean   :4.023   Mean   :3.852   Mean   :4.568   Mean   :4.545  
                      3rd Qu.:5.000   3rd Qu.:5.000   3rd Qu.:5.000   3rd Qu.:5.000  
                      Max.   :5.000   Max.   :5.000   Max.   :5.000   Max.   :5.000  
   Pregunta.5      Pregunta.6         Suma        Genero.1H.2M      Genero        Edad      
 Min.   :3.000   Min.   :2.000   Min.   :19.00   Min.   :1.000   Hombre:41   Min.   :20.00  
 1st Qu.:4.000   1st Qu.:3.000   1st Qu.:23.00   1st Qu.:1.000   Mujer :47   1st Qu.:21.00  
 Median :5.000   Median :4.000   Median :25.50   Median :2.000               Median :22.00  
 Mean   :4.545   Mean   :3.852   Mean   :25.39   Mean   :1.534               Mean   :22.09  
 3rd Qu.:5.000   3rd Qu.:5.000   3rd Qu.:28.00   3rd Qu.:2.000               3rd Qu.:23.00  
 Max.   :5.000   Max.   :5.000   Max.   :30.00   Max.   :2.000               Max.   :27.00  
    Estatura    
 Min.   :1.500  
 1st Qu.:1.600  
 Median :1.685  
 Mean   :1.673  
 3rd Qu.:1.740  
 Max.   :1.830  

Agrupo por metodo y calculo promedios y sd

Grafico histograma edad

hist(df$Edad)

Graficas histograma para estatura

hist(df$Estatura)

Grafico para puntaje total y tipo de metodo

df %>% 
ggplot(aes(x=M..todo, y=Suma)) +
  geom_boxplot() +
  xlab("Tipo de metodo") + 
  ylab("Puntaje total encuesta") + 
  ggtitle("Puntaje total por tipo de metodo") +
  theme_classic()+
  geom_signif(comparisons = list(c("Aceptacion ICAV", "Tradicional")),
               map_signif_level = TRUE, textsize = 4)

Existe diferencia entre el método y el puntaje total de encuesta???

t.test(Suma ~ M..todo, data=df) # Existen diferencias

    Welch Two Sample t-test

data:  Suma by M..todo
t = 10.199, df = 85.016, p-value < 2.2e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 3.475237 5.158304
sample estimates:
mean in group Aceptacion ICAV     mean in group Tradicional 
                     27.64286                      23.32609 

Algo similar pero filtro por genero

df %>% 
ggplot(aes(x=M..todo, y=Suma, fill=Genero)) +
  scale_fill_manual(values=c("black", "blue")) +
  geom_boxplot() +
  xlab("Tipo metodo") + 
  ylab("Puntaje total encuesta") + 
  ggtitle("Puntaje total por tipo de metodo segun sexo") + 
  theme_classic() + 
  theme(legend.position = "right") + 
  scale_y_continuous(limits = c(0,40)) + 
  theme(axis.title.x = element_text(face="bold", vjust=-0.5, colour="black", size=rel(1))) + 
  theme(axis.title.y = element_text(face="bold", vjust=1.5, colour="black", size=rel(1))) +
  scale_fill_discrete(name="Genero", labels=c("Femenino","Masculino"))
Scale for 'fill' is already present. Adding another scale for 'fill', which will replace the
existing scale.

Existen diferencias entre la suma y el genero ????

t.test(Suma ~ Genero, data=df) #No existen 

    Welch Two Sample t-test

data:  Suma by Genero
t = 0.22709, df = 80.251, p-value = 0.8209
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -1.119901  1.408433
sample estimates:
mean in group Hombre  mean in group Mujer 
            25.46341             25.31915 

Ahora grafico método por estatura y filtro por genero

df %>% 
ggplot(aes(x=M..todo, y=Estatura, fill=Genero)) +
  geom_boxplot() 

existe diferencia entre el método y estatura ??

t.test(Estatura ~ M..todo, data=df) #No existen diferencias

    Welch Two Sample t-test

data:  Estatura by M..todo
t = -0.57897, df = 83.813, p-value = 0.5642
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.04632257  0.02543231
sample estimates:
mean in group Aceptacion ICAV     mean in group Tradicional 
                     1.667381                      1.677826 

Modelo de regresion para estatura y suma

model <- lm(df$Estatura ~ df$Suma, data = df)
summary(model)

Call:
lm(formula = df$Estatura ~ df$Suma, data = df)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.16126 -0.06980  0.01020  0.07036  0.16992 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept)  1.762460   0.078339  22.498   <2e-16 ***
df$Suma     -0.003530   0.003066  -1.152    0.253    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.08378 on 86 degrees of freedom
Multiple R-squared:  0.01518,   Adjusted R-squared:  0.003733 
F-statistic: 1.326 on 1 and 86 DF,  p-value: 0.2527
plot(model)

Ahora lo grafico

Ahora reformateo mis datos del df1

long_grafico1 <- df %>% 
gather(key = "Preguntas", value = "Puntaje", Pregunta.1:Pregunta.6)

Ahora selecciono lo que necesito

long2 <- long_grafico1 %>% 
select(M..todo,Preguntas,Puntaje)

Ahora grafico y filtro por pregunta

long2 %>% 
  ggplot(aes(x=M..todo, y=Puntaje, fill= Preguntas)) +
 geom_boxplot()

Ahora grafico y filtro por metodo

long2 %>% 
  ggplot(aes(x=Preguntas, y=Puntaje, fill= M..todo)) +
 geom_boxplot()+
  facet_wrap(~ M..todo) +
  ylab("Puntaje") +
  xlab("Numero de pregunta") +
  ggtitle("Puntaje por preguntas segun tipo de metodo") +
  scale_fill_discrete(name="Metodo") +
  annotate("text", x = 1, y = 6, label = "*", size = 5) +
  annotate("text", x = 2, y = 6, label = "*", size = 5) +
  annotate("text", x = 6, y = 6, label = "*", size = 5) +
   scale_y_continuous(limit = c(0,7)) +
  theme_classic()+
  coord_flip()

aov para preguntas y puntaje

aov <- aov(long2$Puntaje~long2$Preguntas)
summary(aov)
                 Df Sum Sq Mean Sq F value   Pr(>F)    
long2$Preguntas   5   56.5  11.294   17.17 9.66e-16 ***
Residuals       522  343.3   0.658                     
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Ahora donde estan esas diferencias ????

TukeyHSD(aov) 
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = long2$Puntaje ~ long2$Preguntas)

$`long2$Preguntas`
                               diff        lwr        upr     p adj
Pregunta.2-Pregunta.1 -1.704545e-01 -0.5201729  0.1792638 0.7306199
Pregunta.3-Pregunta.1  5.454545e-01  0.1957362  0.8951729 0.0001449
Pregunta.4-Pregunta.1  5.227273e-01  0.1730089  0.8724457 0.0003258
Pregunta.5-Pregunta.1  5.227273e-01  0.1730089  0.8724457 0.0003258
Pregunta.6-Pregunta.1 -1.704545e-01 -0.5201729  0.1792638 0.7306199
Pregunta.3-Pregunta.2  7.159091e-01  0.3661907  1.0656275 0.0000001
Pregunta.4-Pregunta.2  6.931818e-01  0.3434634  1.0429002 0.0000004
Pregunta.5-Pregunta.2  6.931818e-01  0.3434634  1.0429002 0.0000004
Pregunta.6-Pregunta.2 -1.776357e-15 -0.3497184  0.3497184 1.0000000
Pregunta.4-Pregunta.3 -2.272727e-02 -0.3724457  0.3269911 0.9999693
Pregunta.5-Pregunta.3 -2.272727e-02 -0.3724457  0.3269911 0.9999693
Pregunta.6-Pregunta.3 -7.159091e-01 -1.0656275 -0.3661907 0.0000001
Pregunta.5-Pregunta.4  1.776357e-15 -0.3497184  0.3497184 1.0000000
Pregunta.6-Pregunta.4 -6.931818e-01 -1.0429002 -0.3434634 0.0000004
Pregunta.6-Pregunta.5 -6.931818e-01 -1.0429002 -0.3434634 0.0000004

en otra visualizacion

long2 %>% 
  ggplot(aes(x = Puntaje)) + 
  geom_histogram(bins = 7) + 
  facet_grid(Preguntas~M..todo)

Ahora reformateo los datos para calcular los promedios por preguntas

long2 %>% 
  group_by(M..todo, Preguntas) %>% 
  summarise( "Promedios" = mean(Puntaje))

Lo tranformo a objeto para poder graficar los promedios

long3 <- long2 %>% 
  group_by(M..todo, Preguntas) %>% 
  summarise( "Promedios" = mean(Puntaje))

Ahora puedo graficar los promedios por pregunta (para col)

long3 %>% 
   ggplot(aes(x=Preguntas, y=Promedios, fill= M..todo, color=M..todo)) +
 geom_col()+
  coord_flip()

Otro grafico

long3 %>% 
   ggplot(aes(x=Preguntas, y=Promedios, fill= M..todo, color=M..todo)) +
 geom_jitter()

long3 %>% 
   ggplot(aes(x=Preguntas, y=Promedios, fill= M..todo, color=M..todo)) +
 geom_col()+
  facet_wrap(~ M..todo)+
  coord_flip()

Abro los datos 2

df2 <- read.csv("datos diego2.csv", header = TRUE, sep=",")

Summary

summary(df2)
         Metodo   EXTENSION.M.D   EXTENSION.B.L   ELIMINACION.TECHO   SOCAVADOS    
 ICAV       :34   Min.   :2.000   Min.   :1.000   Min.   :1.000     Min.   :1.000  
 Tradicional:38   1st Qu.:3.000   1st Qu.:3.000   1st Qu.:2.750     1st Qu.:3.000  
                  Median :4.000   Median :4.000   Median :3.500     Median :4.000  
                  Mean   :3.528   Mean   :3.319   Mean   :3.208     Mean   :3.458  
                  3rd Qu.:4.000   3rd Qu.:4.000   3rd Qu.:4.000     3rd Qu.:4.000  
                  Max.   :4.000   Max.   :4.000   Max.   :4.000     Max.   :4.000  
 AMPLITUD.CERVICAL      SUMA           TIEMPO     
 Min.   :1.000     Min.   : 9.00   Min.   :22.00  
 1st Qu.:2.750     1st Qu.:14.00   1st Qu.:28.00  
 Median :3.000     Median :18.00   Median :32.50  
 Mean   :3.125     Mean   :16.64   Mean   :33.51  
 3rd Qu.:4.000     3rd Qu.:20.00   3rd Qu.:39.25  
 Max.   :4.000     Max.   :20.00   Max.   :45.00  

Veo estructura de mis datos

str(df2)
'data.frame':   72 obs. of  8 variables:
 $ Metodo           : Factor w/ 2 levels "ICAV","Tradicional": 1 1 1 1 1 1 1 1 1 1 ...
 $ EXTENSION.M.D    : int  4 4 2 4 3 4 3 4 4 3 ...
 $ EXTENSION.B.L    : int  4 1 1 4 2 3 2 4 4 3 ...
 $ ELIMINACION.TECHO: int  4 4 1 4 3 3 3 4 4 3 ...
 $ SOCAVADOS        : int  4 1 4 4 3 4 4 4 4 1 ...
 $ AMPLITUD.CERVICAL: int  4 1 1 4 3 4 4 4 4 2 ...
 $ SUMA             : int  20 11 9 20 14 18 16 20 20 12 ...
 $ TIEMPO           : int  35 43 31 25 35 31 32 44 35 41 ...

Grafico para tipo de metodo y puntaje de desempeno

df2 %>% 
  ggplot(aes(x=Metodo, y=SUMA)) +
  geom_boxplot() +
  xlab("Tipo de metodo") + 
  ylab("Puntaje total de desempeno") + 
  ggtitle("Puntaje total del desempeno segun tipo de metodo") +
  theme_classic()

Existen diferencias entre el tipo de metodo y la suma total ???

t.test(df2$SUMA~df2$Metodo)

    Welch Two Sample t-test

data:  df2$SUMA by df2$Metodo
t = -1.1626, df = 66.672, p-value = 0.2492
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -2.5319999  0.6682228
sample estimates:
       mean in group ICAV mean in group Tradicional 
                 16.14706                  17.07895 

Grafico para tipo de metodo y tiempo

df2 %>% 
  ggplot(aes(x=Metodo, y=TIEMPO)) +
  geom_boxplot() +
  xlab("Tipo de metodo") + 
  ylab("Tiempo") + 
  ggtitle("Tiempo segun tipo de metodo") +
  theme_classic()

Existen diferencias entre metodo y tiempo????

t.test(df2$TIEMPO~df2$Metodo)

    Welch Two Sample t-test

data:  df2$TIEMPO by df2$Metodo
t = 1.4595, df = 69.342, p-value = 0.1489
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.7669473  4.9496099
sample estimates:
       mean in group ICAV mean in group Tradicional 
                 34.61765                  32.52632 

Modelo regresion entre tiempo y suma total de desempeno

model2 <- lm(df2$TIEMPO ~ df2$SUMA, data = df2)
summary(model2)

Call:
lm(formula = df2$TIEMPO ~ df2$SUMA, data = df2)

Residuals:
     Min       1Q   Median       3Q      Max 
-10.5764  -5.1794  -0.1794   4.8428  12.8206 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  40.1202     3.5826  11.198   <2e-16 ***
df2$SUMA     -0.3970     0.2111  -1.881   0.0641 .  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 6.017 on 70 degrees of freedom
Multiple R-squared:  0.04812,   Adjusted R-squared:  0.03452 
F-statistic: 3.539 on 1 and 70 DF,  p-value: 0.06411
plot(model2)

Lo grafico (lm 2/modelo)

LS0tCnRpdGxlOiAiRW5jdWVzdGEgYWNlcHRhY2nDs25fRGllZ28iCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KI2xvcyBwYWNrYWdlcwpgYGB7cn0KbGlicmFyeSgidGlkeXZlcnNlIikKbGlicmFyeSgiZm9yY2F0cyIpCmxpYnJhcnkoImdndGhlbWVzIikKbGlicmFyeSgiZ2dzaWduaWYiKQpsaWJyYXJ5KCJicm9vbSIpCmxpYnJhcnkoInZpcmlkaXMiKQpsaWJyYXJ5KCJ2aXJpZGlzTGl0ZSIpCmBgYAojQWJybyBtaSBkZgpgYGB7cn0KZGYgPC0gcmVhZC5jc3YoImRhdG9zIGRpZWdvLmNzdiIsIGhlYWRlciA9IFRSVUUsIHNlcD0iLCIpCmBgYAojU3VtbWFyeSBkZSBkYXRvcwpgYGB7cn0Kc3VtbWFyeShkZikKYGBgCiNBZ3J1cG8gcG9yIG1ldG9kbyB5IGNhbGN1bG8gcHJvbWVkaW9zIHkgc2QKYGBge3J9CmRmICU+JSAKICBncm91cF9ieShNLi50b2RvKSAlPiUgCiAgc3VtbWFyaXNlKG51bWVybyA9IG4oKSwgCiAgICAgICAgICAgICJQcmVndW50YTEiID0gbWVhbihQcmVndW50YS4xKSwgCiAgICAgICAgICAgICJTRDEiID0gc2QoUHJlZ3VudGEuMSksCiAgICAgICAgICAgICJQcmVndW50YTIiID0gbWVhbihQcmVndW50YS4yKSwgCiAgICAgICAgICAgICJTRDIiID0gc2QoUHJlZ3VudGEuMikgLAogICAgICAgICAgICAiUHJlZ3VudGEzIiA9IG1lYW4oUHJlZ3VudGEuMyksIAogICAgICAgICAgICAiU0QzIiA9IHNkKFByZWd1bnRhLjMpLAogICAgICAgICAgICAiUHJvbWVkaW80Ij0gbWVhbihQcmVndW50YS40KSwKICAgICAgICAgICAgIlNENCI9IHNkKFByZWd1bnRhLjQpLAogICAgICAgICAgICAiUHJvbWVkaW81Ij0gbWVhbihQcmVndW50YS41KSwKICAgICAgICAgICAgIlNENSI9IHNkKFByZWd1bnRhLjUpLAogICAgICAgICAgICAiUHJvbWVkaW8gc3VtYSI9IG1lYW4oU3VtYSksCiAgICAgICAgICAgICJTRFN1bWEiPXNkKFN1bWEpKQpgYGAKI0dyYWZpY28gaGlzdG9ncmFtYSBlZGFkCmBgYHtyfQpoaXN0KGRmJEVkYWQpCmBgYAojR3JhZmljYXMgaGlzdG9ncmFtYSBwYXJhIGVzdGF0dXJhCmBgYHtyfQpoaXN0KGRmJEVzdGF0dXJhKQpgYGAKCgojR3JhZmljbyBwYXJhIHB1bnRhamUgdG90YWwgeSB0aXBvIGRlIG1ldG9kbwpgYGB7cn0KZGYgJT4lIApnZ3Bsb3QoYWVzKHg9TS4udG9kbywgeT1TdW1hKSkgKwogIGdlb21fYm94cGxvdCgpICsKICB4bGFiKCJUaXBvIGRlIG1ldG9kbyIpICsgCiAgeWxhYigiUHVudGFqZSB0b3RhbCBlbmN1ZXN0YSIpICsgCiAgZ2d0aXRsZSgiUHVudGFqZSB0b3RhbCBwb3IgdGlwbyBkZSBtZXRvZG8iKSArCiAgdGhlbWVfY2xhc3NpYygpKwogIGdlb21fc2lnbmlmKGNvbXBhcmlzb25zID0gbGlzdChjKCJBY2VwdGFjaW9uIElDQVYiLCAiVHJhZGljaW9uYWwiKSksCiAgICAgICAgICAgICAgIG1hcF9zaWduaWZfbGV2ZWwgPSBUUlVFLCB0ZXh0c2l6ZSA9IDQpCmBgYAojRXhpc3RlIGRpZmVyZW5jaWEgZW50cmUgZWwgbcOpdG9kbyB5IGVsIHB1bnRhamUgdG90YWwgZGUgZW5jdWVzdGE/Pz8gCmBgYHtyfQp0LnRlc3QoU3VtYSB+IE0uLnRvZG8sIGRhdGE9ZGYpICMgRXhpc3RlbiBkaWZlcmVuY2lhcwpgYGAKI0FsZ28gc2ltaWxhciBwZXJvIGZpbHRybyBwb3IgZ2VuZXJvCmBgYHtyfQpkZiAlPiUgCmdncGxvdChhZXMoeD1NLi50b2RvLCB5PVN1bWEsIGZpbGw9R2VuZXJvKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJibGFjayIsICJibHVlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgeGxhYigiVGlwbyBtZXRvZG8iKSArIAogIHlsYWIoIlB1bnRhamUgdG90YWwgZW5jdWVzdGEiKSArIAogIGdndGl0bGUoIlB1bnRhamUgdG90YWwgcG9yIHRpcG8gZGUgbWV0b2RvIHNlZ3VuIHNleG8iKSArIAogIHRoZW1lX2NsYXNzaWMoKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCw0MCkpICsgCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCB2anVzdD0tMC41LCBjb2xvdXI9ImJsYWNrIiwgc2l6ZT1yZWwoMSkpKSArIAogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgdmp1c3Q9MS41LCBjb2xvdXI9ImJsYWNrIiwgc2l6ZT1yZWwoMSkpKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJHZW5lcm8iLCBsYWJlbHM9YygiRmVtZW5pbm8iLCJNYXNjdWxpbm8iKSkKYGBgCiNFeGlzdGVuIGRpZmVyZW5jaWFzIGVudHJlIGxhIHN1bWEgeSBlbCBnZW5lcm8gPz8/PyAKYGBge3J9CnQudGVzdChTdW1hIH4gR2VuZXJvLCBkYXRhPWRmKSAjTm8gZXhpc3RlbiAKYGBgCiNBaG9yYSBncmFmaWNvIG3DqXRvZG8gcG9yIGVzdGF0dXJhIHkgZmlsdHJvIHBvciBnZW5lcm8KYGBge3J9CmRmICU+JSAKZ2dwbG90KGFlcyh4PU0uLnRvZG8sIHk9RXN0YXR1cmEsIGZpbGw9R2VuZXJvKSkgKwogIGdlb21fYm94cGxvdCgpIApgYGAKI2V4aXN0ZSBkaWZlcmVuY2lhIGVudHJlIGVsIG3DqXRvZG8geSBlc3RhdHVyYSA/PyAKYGBge3J9CnQudGVzdChFc3RhdHVyYSB+IE0uLnRvZG8sIGRhdGE9ZGYpICNObyBleGlzdGVuIGRpZmVyZW5jaWFzCmBgYAojTW9kZWxvIGRlIHJlZ3Jlc2lvbiBwYXJhIGVzdGF0dXJhIHkgc3VtYQpgYGB7cn0KbW9kZWwgPC0gbG0oZGYkRXN0YXR1cmEgfiBkZiRTdW1hLCBkYXRhID0gZGYpCnN1bW1hcnkobW9kZWwpCmBgYApgYGB7cn0KcGxvdChtb2RlbCkKYGBgCiNBaG9yYSBsbyBncmFmaWNvIApgYGB7cn0KZGYgJT4lIAogICBnZ3Bsb3QoYWVzKHggPSBTdW1hLCB5ID0gRXN0YXR1cmEpKSArIAogIGdlb21fcG9pbnQoKSsKICB0aGVtZV9taW5pbWFsKCkrCiAgIGdlb21fc21vb3RoKCkrCiAgeGxhYigiU3VtYSBwdW50YWplIikgKwogIHlsYWIoIkVzdGF0dXRhIChtdCkiKSArCiAgZ2d0aXRsZSgiQ29ycmVsYWNpb24gZW50cmUgcHVudGFqZSBvYnRlbmlkbyB5IGVzdGF0dXJhIikKYGBgCgoKI0Fob3JhIHJlZm9ybWF0ZW8gbWlzIGRhdG9zIGRlbCBkZjEKYGBge3J9CmxvbmdfZ3JhZmljbzEgPC0gZGYgJT4lIApnYXRoZXIoa2V5ID0gIlByZWd1bnRhcyIsIHZhbHVlID0gIlB1bnRhamUiLCBQcmVndW50YS4xOlByZWd1bnRhLjYpCmBgYAojQWhvcmEgc2VsZWNjaW9ubyBsbyBxdWUgbmVjZXNpdG8KYGBge3J9CmxvbmcyIDwtIGxvbmdfZ3JhZmljbzEgJT4lIApzZWxlY3QoTS4udG9kbyxQcmVndW50YXMsUHVudGFqZSkKYGBgCiNBaG9yYSBncmFmaWNvIHkgZmlsdHJvIHBvciBwcmVndW50YQpgYGB7cn0KbG9uZzIgJT4lIAogIGdncGxvdChhZXMoeD1NLi50b2RvLCB5PVB1bnRhamUsIGZpbGw9IFByZWd1bnRhcykpICsKIGdlb21fYm94cGxvdCgpCmBgYAojQWhvcmEgZ3JhZmljbyB5IGZpbHRybyBwb3IgbWV0b2RvCmBgYHtyfQpsb25nMiAlPiUgCiAgZ2dwbG90KGFlcyh4PVByZWd1bnRhcywgeT1QdW50YWplLCBmaWxsPSBNLi50b2RvKSkgKwogZ2VvbV9ib3hwbG90KCkrCiAgZmFjZXRfd3JhcCh+IE0uLnRvZG8pICsKICB5bGFiKCJQdW50YWplIikgKwogIHhsYWIoIk51bWVybyBkZSBwcmVndW50YSIpICsKICBnZ3RpdGxlKCJQdW50YWplIHBvciBwcmVndW50YXMgc2VndW4gdGlwbyBkZSBtZXRvZG8iKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJNZXRvZG8iKSArCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMSwgeSA9IDYsIGxhYmVsID0gIioiLCBzaXplID0gNSkgKwogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDIsIHkgPSA2LCBsYWJlbCA9ICIqIiwgc2l6ZSA9IDUpICsKICBhbm5vdGF0ZSgidGV4dCIsIHggPSA2LCB5ID0gNiwgbGFiZWwgPSAiKiIsIHNpemUgPSA1KSArCiAgIHNjYWxlX3lfY29udGludW91cyhsaW1pdCA9IGMoMCw3KSkgKwogIHRoZW1lX2NsYXNzaWMoKSsKICBjb29yZF9mbGlwKCkKYGBgCiNhb3YgcGFyYSBwcmVndW50YXMgeSBwdW50YWplCmBgYHtyfQphb3YgPC0gYW92KGxvbmcyJFB1bnRhamV+bG9uZzIkUHJlZ3VudGFzKQpzdW1tYXJ5KGFvdikKYGBgCiNBaG9yYSBkb25kZSBlc3RhbiBlc2FzIGRpZmVyZW5jaWFzID8/Pz8KYGBge3J9ClR1a2V5SFNEKGFvdikgCmBgYAojZW4gb3RyYSB2aXN1YWxpemFjaW9uIApgYGB7cn0KbG9uZzIgJT4lIAogIGdncGxvdChhZXMoeCA9IFB1bnRhamUpKSArIAogIGdlb21faGlzdG9ncmFtKGJpbnMgPSA3KSArIAogIGZhY2V0X2dyaWQoUHJlZ3VudGFzfk0uLnRvZG8pCmBgYAojQWhvcmEgcmVmb3JtYXRlbyBsb3MgZGF0b3MgcGFyYSBjYWxjdWxhciBsb3MgcHJvbWVkaW9zIHBvciBwcmVndW50YXMKYGBge3J9CmxvbmcyICU+JSAKICBncm91cF9ieShNLi50b2RvLCBQcmVndW50YXMpICU+JSAKICBzdW1tYXJpc2UoICJQcm9tZWRpb3MiID0gbWVhbihQdW50YWplKSkKYGBgCiNMbyB0cmFuZm9ybW8gYSBvYmpldG8gcGFyYSBwb2RlciBncmFmaWNhciBsb3MgcHJvbWVkaW9zCmBgYHtyfQpsb25nMyA8LSBsb25nMiAlPiUgCiAgZ3JvdXBfYnkoTS4udG9kbywgUHJlZ3VudGFzKSAlPiUgCiAgc3VtbWFyaXNlKCAiUHJvbWVkaW9zIiA9IG1lYW4oUHVudGFqZSkpCmBgYAojQWhvcmEgcHVlZG8gZ3JhZmljYXIgbG9zIHByb21lZGlvcyBwb3IgcHJlZ3VudGEgKHBhcmEgY29sKQpgYGB7cn0KbG9uZzMgJT4lIAogICBnZ3Bsb3QoYWVzKHg9UHJlZ3VudGFzLCB5PVByb21lZGlvcywgZmlsbD0gTS4udG9kbywgY29sb3I9TS4udG9kbykpICsKIGdlb21fY29sKCkrCiAgY29vcmRfZmxpcCgpCmBgYAojT3RybyBncmFmaWNvCmBgYHtyfQpsb25nMyAlPiUgCiAgIGdncGxvdChhZXMoeD1QcmVndW50YXMsIHk9UHJvbWVkaW9zLCBmaWxsPSBNLi50b2RvLCBjb2xvcj1NLi50b2RvKSkgKwogZ2VvbV9qaXR0ZXIoKQpgYGAKCmBgYHtyfQpsb25nMyAlPiUgCiAgIGdncGxvdChhZXMoeD1QcmVndW50YXMsIHk9UHJvbWVkaW9zLCBmaWxsPSBNLi50b2RvLCBjb2xvcj1NLi50b2RvKSkgKwogZ2VvbV9jb2woKSsKICBmYWNldF93cmFwKH4gTS4udG9kbykrCiAgY29vcmRfZmxpcCgpCmBgYAojQWJybyBsb3MgZGF0b3MgMgpgYGB7cn0KZGYyIDwtIHJlYWQuY3N2KCJkYXRvcyBkaWVnbzIuY3N2IiwgaGVhZGVyID0gVFJVRSwgc2VwPSIsIikKYGBgCiNTdW1tYXJ5CmBgYHtyfQpzdW1tYXJ5KGRmMikKYGBgCiNWZW8gZXN0cnVjdHVyYSBkZSBtaXMgZGF0b3MKYGBge3J9CnN0cihkZjIpCmBgYAojR3JhZmljbyBwYXJhIHRpcG8gZGUgbWV0b2RvIHkgcHVudGFqZSBkZSBkZXNlbXBlbm8KYGBge3J9CmRmMiAlPiUgCiAgZ2dwbG90KGFlcyh4PU1ldG9kbywgeT1TVU1BKSkgKwogIGdlb21fYm94cGxvdCgpICsKICB4bGFiKCJUaXBvIGRlIG1ldG9kbyIpICsgCiAgeWxhYigiUHVudGFqZSB0b3RhbCBkZSBkZXNlbXBlbm8iKSArIAogIGdndGl0bGUoIlB1bnRhamUgdG90YWwgZGVsIGRlc2VtcGVubyBzZWd1biB0aXBvIGRlIG1ldG9kbyIpICsKICB0aGVtZV9jbGFzc2ljKCkKYGBgCiNFeGlzdGVuIGRpZmVyZW5jaWFzIGVudHJlIGVsIHRpcG8gZGUgbWV0b2RvIHkgbGEgc3VtYSB0b3RhbCA/Pz8KYGBge3J9CnQudGVzdChkZjIkU1VNQX5kZjIkTWV0b2RvKQpgYGAKI0dyYWZpY28gcGFyYSB0aXBvIGRlIG1ldG9kbyB5IHRpZW1wbyAKYGBge3J9CmRmMiAlPiUgCiAgZ2dwbG90KGFlcyh4PU1ldG9kbywgeT1USUVNUE8pKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHhsYWIoIlRpcG8gZGUgbWV0b2RvIikgKyAKICB5bGFiKCJUaWVtcG8iKSArIAogIGdndGl0bGUoIlRpZW1wbyBzZWd1biB0aXBvIGRlIG1ldG9kbyIpICsKICB0aGVtZV9jbGFzc2ljKCkKYGBgCiNFeGlzdGVuIGRpZmVyZW5jaWFzIGVudHJlIG1ldG9kbyB5IHRpZW1wbz8/Pz8KYGBge3J9CnQudGVzdChkZjIkVElFTVBPfmRmMiRNZXRvZG8pCmBgYAojTW9kZWxvIHJlZ3Jlc2lvbiBlbnRyZSB0aWVtcG8geSBzdW1hIHRvdGFsIGRlIGRlc2VtcGVubwpgYGB7cn0KbW9kZWwyIDwtIGxtKGRmMiRUSUVNUE8gfiBkZjIkU1VNQSwgZGF0YSA9IGRmMikKc3VtbWFyeShtb2RlbDIpCmBgYApgYGB7cn0KcGxvdChtb2RlbDIpCmBgYAojTG8gZ3JhZmljbyAobG0gMi9tb2RlbG8pCmBgYHtyfQpkZjIgJT4lIAogICBnZ3Bsb3QoYWVzKHggPSBTVU1BLCB5ID0gVElFTVBPKSkgKyAKICBnZW9tX3BvaW50KCkrCiAgdGhlbWVfbWluaW1hbCgpKwogICBnZW9tX3Ntb290aCgpKwogIHhsYWIoIlN1bWEgcHVudGFqZSIpICsKICB5bGFiKCJUaWVtcG8iKSArCiAgZ2d0aXRsZSgiQ29ycmVsYWNpb24gZW50cmUgcHVudGFqZSB5IHRpZW1wbyIpCmBgYAoKCgoK