Cargo Paquetes

library("tidyverse")
library("ggthemes")
library("ggplot2")
install.packages("nortest")
Error in install.packages : Updating loaded packages
library("nortest")

Abro mi df4

df5 <- read.csv("suma por areas y total.csv", header = TRUE, sep=",")
str(df5)
'data.frame':   34 obs. of  14 variables:
 $ Centro.Salud: Factor w/ 3 levels "Externo ","Paillaco",..: 2 2 2 2 2 2 2 2 2 2 ...
 $ Sexo        : Factor w/ 2 levels "F","M": 1 1 2 1 1 1 1 1 2 2 ...
 $ HOC1        : int  15 15 14 12 13 8 12 15 13 12 ...
 $ CFC1        : int  12 17 14 13 19 13 16 12 19 17 ...
 $ AEC1        : int  15 15 3 15 15 14 12 14 12 13 ...
 $ TOTALC1     : int  42 47 31 40 47 35 40 41 44 42 ...
 $ HOC2        : int  15 13 13 11 11 8 14 12 15 9 ...
 $ CFC2        : int  14 18 20 16 18 18 20 18 19 20 ...
 $ AEC2        : int  15 15 13 12 12 14 14 14 15 14 ...
 $ TOTALC2     : int  44 46 46 39 41 40 48 44 49 43 ...
 $ HOC3        : int  12 12 14 12 9 10 11 12 14 13 ...
 $ CFC3        : int  14 18 19 17 20 16 17 20 18 20 ...
 $ AEC3        : int  15 15 14 14 14 15 13 13 14 13 ...
 $ TOTALC3     : int  41 45 47 43 43 41 41 45 46 46 ...
summary(df5)
   Centro.Salud Sexo        HOC1            CFC1            AEC1          TOTALC1     
 Externo :13    F:21   Min.   : 6.00   Min.   : 6.00   Min.   : 3.00   Min.   :22.00  
 Paillaco:17    M:13   1st Qu.:10.00   1st Qu.:12.25   1st Qu.:11.25   1st Qu.:35.00  
 Privado : 4           Median :11.00   Median :15.00   Median :12.50   Median :39.00  
                       Mean   :11.26   Mean   :14.47   Mean   :12.21   Mean   :37.94  
                       3rd Qu.:13.00   3rd Qu.:17.00   3rd Qu.:14.75   3rd Qu.:43.00  
                       Max.   :15.00   Max.   :19.00   Max.   :15.00   Max.   :48.00  
      HOC2            CFC2            AEC2          TOTALC2           HOC3            CFC3      
 Min.   : 4.00   Min.   : 9.00   Min.   : 6.00   Min.   :24.00   "print" Min.   : 8.00  
 1st Qu.:10.00   1st Qu.:14.25   1st Qu.:12.00   1st Qu.:37.25   1st Qu.: 9.25   1st Qu.:14.50  
 Median :11.00   Median :18.00   Median :14.00   Median :41.50   Median :12.00   Median :18.00  
 Mean   :11.21   Mean   :16.47   Mean   :12.88   Mean   :40.56   Mean   :11.24   Mean   :16.56  
 3rd Qu.:13.00   3rd Qu.:19.00   3rd Qu.:14.00   3rd Qu.:44.75   3rd Qu.:13.00   3rd Qu.:19.00  
 Max.   :15.00   Max.   :20.00   Max.   :15.00   Max.   :49.00   Max.   :15.00   Max.   :20.00  
      AEC3          TOTALC3     
 Min.   : 5.00   Min.   :20.00  
 1st Qu.:13.00   1st Qu.:38.00  
 Median :14.00   Median :43.00  
 Mean   :13.29   Mean   :41.09  
 3rd Qu.:15.00   3rd Qu.:46.00  
 Max.   :15.00   Max.   :50.00  

agrego decimales para los calculos

options(digits=2)

Agrupo por centro de salud para el total de controles

df5 %>% 
  group_by(Centro.Salud) %>% 
  summarise(n = n(), 
            "Promedio(control1)" = mean(TOTALC1), 
            "SD(control1)" = sd(TOTALC1),
            "min(control1)"= min(TOTALC1),
            "max(control1)"=max(TOTALC1),
            "Promedio(control2)" = mean(TOTALC2), 
            "SD(control2)" = sd(TOTALC2) ,
            "min(control2)"=min(TOTALC2),
            "max(control2)"=max(TOTALC2),
            "Promedio(control3)" = mean(TOTALC3), 
            "SD(control3)" = sd(TOTALC3),
            "min(control3)"=min(TOTALC3),
            "max(control3"=max(TOTALC3))

Agrupo por Sexo para el total de los controles

df5 %>% 
 group_by(Sexo) %>% 
  summarise(n = n(), 
            "Promedio(control1)" = mean(TOTALC1), 
            "SD(control1)" = sd(TOTALC1),
            "min(control1)"= min(TOTALC1),
            "max(control1)"=max(TOTALC1),
            "Promedio(control2)" = mean(TOTALC2), 
            "SD(control2)" = sd(TOTALC2) ,
            "min(control2)"=min(TOTALC2),
            "max(control2)"=max(TOTALC2),
            "Promedio(control3)" = mean(TOTALC3), 
            "SD(control3)" = sd(TOTALC3),
            "min(control3)"=min(TOTALC3),
            "max(control3"=max(TOTALC3))

Calculo promedios y desviacion por centro de salud para cada uno de los controles del item higiene

df5 %>% 
  group_by(Centro.Salud) %>% 
  summarise(n = n(), 
            "PromedioOH(control1)" = mean(HOC1), 
            "SD OH(control1)" = sd(HOC1),
            "PromedioOH(control2)" = mean(HOC2), 
            "SD OH(control2)" = sd(HOC2) ,
            "Mean_OH(control3)" = mean(HOC3), 
            "SD OH(control3)" = sd(HOC3))

Calculo promedios y desviacion por centro de salud para cada uno de los controles del item confort

df5 %>% 
  group_by(Centro.Salud) %>% 
  summarise(n = n(), 
            "Promedio CF(control1)" = mean(CFC1), 
            "SD CF(control1)" = sd(CFC1),
            "Promedio CF(control2)" = mean(CFC2), 
            "SD CF(control2)" = sd(CFC2) ,
            "Mean CF(control3)" = mean(CFC3), 
            "SD CF(control3)" = sd(CFC3))

Calculo promedios y desviacion por centro de salud para cada uno de los controles del item autopercepcion estetica

df5 %>% 
  group_by(Centro.Salud) %>% 
  summarise(n = n(), 
            "Promedio AE(control1)" = mean(AEC1), 
            "SD AE(control1)" = sd(AEC1),
            "Promedio AE(control2)" = mean(AEC2), 
            "SD AE(control2)" = sd(AEC2) ,
            "Mean AE(control3)" = mean(AEC3), 
            "SD AE(control3)" = sd(AEC3))

Agrupo por sexo para cada uno de los controles del item higiene

df5 %>% 
  group_by(Sexo) %>% 
  summarise(n = n(), 
            "PromedioOH(control1)" = mean(HOC1), 
            "SD OH(control1)" = sd(HOC1),
            "PromedioOH(control2)" = mean(HOC2), 
            "SD OH(control2)" = sd(HOC2) ,
            "Mean_OH(control3)" = mean(HOC3), 
            "SD OH(control3)" = sd(HOC3))

Agrupo por sexo para cada uno de los controles del item confort

df5 %>% 
  group_by(Sexo) %>% 
  summarise(n = n(), 
            "Promedio CF(control1)" = mean(CFC1), 
            "SD CF(control1)" = sd(CFC1),
            "Promedio CF(control2)" = mean(CFC2), 
            "SD CF(control2)" = sd(CFC2) ,
            "Mean CF(control3)" = mean(CFC3), 
            "SD CF(control3)" = sd(CFC3))

Agrupo por sexo para cada uno de los controles del item autopercepcion

df5 %>% 
  group_by(Sexo) %>% 
  summarise(n = n(), 
            "Promedio AE(control1)" = mean(AEC1), 
            "SD AE(control1)" = sd(AEC1),
            "Promedio AE(control2)" = mean(AEC2), 
            "SD AE(control2)" = sd(AEC2) ,
            "Mean AE(control3)" = mean(AEC3), 
            "SD AE(control3)" = sd(AEC3))

Grafico para tipo de centro de salud y total del primer control

df5 %>% 
  ggplot(aes(x=Centro.Salud, y=TOTALC1, fill=Sexo)) +
  scale_fill_manual(values=c("black", "blue")) +
  geom_boxplot() +
  geom_jitter() +
  xlab("Centro de Salud") + 
  ylab("Puntaje encuesta") + 
  ggtitle("Puntaje total satisfaccion para primer control por centro de Salud") + 
  theme_economist() + 
  theme(legend.position = "right") + 
  scale_y_continuous(limits = c(0,50)) + 
  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="Sexo", labels=c("Femenino","Masculino"))
Scale for 'fill' is already present. Adding another scale for 'fill', which will replace the
existing scale.
install.packages("nortest")
probando la URL 'https://cran.rstudio.com/bin/macosx/el-capitan/contrib/3.4/nortest_1.0-4.tgz'
Content type 'application/x-gzip' length 28699 bytes (28 KB)
==================================================
downloaded 28 KB

tar: Failed to set default locale

The downloaded binary packages are in
    /var/folders/kk/vxjkvtsx4w13nnvfz58fmly40000gn/T//RtmpbAAv7n/downloaded_packages

Grafico para tipo de centro de salud y total del segundo control

df5 %>% 
  ggplot(aes(x=Centro.Salud, y=TOTALC2, fill=Sexo))+
  geom_boxplot() +
  geom_jitter() +
  xlab("Centro de Salud") +
  ylab("Puntaje encuesta") +
  ggtitle("Puntaje total segundo control por centro de Salud") +
  theme_economist() +
  scale_y_continuous(limits = c(0,50)) 

Grafico para tipo de centro de salud y total del tercer control

df5 %>% 
  ggplot(aes(x=Centro.Salud, y=(TOTALC3), fill= Sexo)) +
  geom_boxplot() +
  geom_jitter() +
  xlab("Centro de Salud") +
  ylab("Puntaje encuesta") +
  ggtitle("Puntaje total tercer control por centro de Salud") +
  theme_economist() +
  scale_y_continuous(limits = c(0,50)) 

Veo normalidad de mis datos

qqnorm(df5$TOTALC1, main = "Normalidad")

Shapito test para totalc1

shapiro.test(df5$TOTALC1)

    Shapiro-Wilk normality test

data:  df5$TOTALC1
W = 0.9, p-value = 0.02

test de anderson para totalC1

ad.test(df5$TOTALC1)

    Anderson-Darling normality test

data:  df5$TOTALC1
A = 0.8, p-value = 0.04

Existe diferencia entre centro de salud y la instalación en el primer control??

aov1 <- aov(df5$TOTALC1~df5$Centro.Salud)
summary(aov1)
                 Df Sum Sq Mean Sq F value Pr(>F)   
df5$Centro.Salud  2    495   247.6    6.49 0.0044 **
Residuals        31   1183    38.2                  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
TukeyHSD(aov1)
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = df5$TOTALC1 ~ df5$Centro.Salud)

$`df5$Centro.Salud`
                    diff lwr  upr p adj
Paillaco-Externo   -0.36  -6  5.2  0.99
Privado-Externo   -12.04 -21 -3.3  0.01
Privado-Paillaco  -11.68 -20 -3.2  0.01

Lo mismo para prueba no parametrica

kruskal.test(df5$TOTALC1~df5$Centro.Salud)

    Kruskal-Wallis rank sum test

data:  df5$TOTALC1 by df5$Centro.Salud
Kruskal-Wallis chi-squared = 7, df = 2, p-value = 0.02

Existe diferencia entre centro de salud y la instalación en el segundo control??

aov2 <- aov(df5$TOTALC2~df5$Centro.Salud)
summary(aov2)
                 Df Sum Sq Mean Sq F value Pr(>F)  
df5$Centro.Salud  2    261   130.7    3.78  0.034 *
Residuals        31   1071    34.5                 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Lo mismo para prueba no parametrica

kruskal.test(df5$TOTALC2~df5$Centro.Salud)

    Kruskal-Wallis rank sum test

data:  df5$TOTALC2 by df5$Centro.Salud
Kruskal-Wallis chi-squared = 5, df = 2, p-value = 0.08

Existe diferencia entre centro de salud y la instalación en el segundo control??

aov3 <- aov(df5$TOTALC3~df5$Centro.Salud)
summary(aov3)
                 Df Sum Sq Mean Sq F value Pr(>F)
df5$Centro.Salud  2    101    50.3    1.06   0.36
Residuals        31   1478    47.7               

Lo mismo para prueba no parametrica

kruskal.test(df5$TOTALC3~df5$Centro.Salud)

    Kruskal-Wallis rank sum test

data:  df5$TOTALC3 by df5$Centro.Salud
Kruskal-Wallis chi-squared = 1, df = 2, p-value = 0.6

Sumo por item los tres controles

df2 <- df5 %>% 
  mutate(SUMA_HO =HOC1  + HOC2 + HOC3, SUMA_CF= CFC1 + CFC2 + CFC3, SUMA_AE= AEC1 + AEC2 + AEC3)

Doy otra estructura a mi datos para los controles de higiene

long_df1 <- df2 %>%
  select(Centro.Salud, Sexo, HOC1, HOC2,HOC3) %>% 
  gather(HOC1, HOC2,HOC3, key = "Higiene", value = "SUMA_HO") 

Grafico item higiene oral (HO) por controles

long_df1 %>% 
  ggplot(aes(x=Higiene, y=SUMA_HO)) +
  geom_boxplot() +
  geom_jitter() +
xlab("Control por Higiene Oral") +
  ylab("Puntaje HO") +
  ggtitle("Puntaje de satisfaccion en HO") +
  theme_economist() +
  scale_y_continuous(limits = c(0,15)) 

Grafico item higiene oral (HO) por controles segun sexo

Existe diferencia entre el item de higiene y los diferentes controles ????

aov4 <- aov(long_df1$SUMA_HO~long_df1$Higiene)
summary(aov4)
                 Df Sum Sq Mean Sq F value Pr(>F)
long_df1$Higiene  2      0    0.03       0      1
Residuals        99    598    6.04               

Lo mismo para no parametrico

kruskal.test(long_df1$Higiene~long_df1$SUMA_HO)

    Kruskal-Wallis rank sum test

data:  long_df1$Higiene by long_df1$SUMA_HO
Kruskal-Wallis chi-squared = 20, df = 10, p-value = 0.06

Doy otra estructura a mi datos para los controles confort

long_df2 <- df2 %>%
  select(Centro.Salud, Sexo,CFC1, CFC2, CFC3) %>% 
  gather(CFC1, CFC2, CFC3, key = "Confort", value = "SUMA_CF") 

Grafico item CF (confort) por controles

long_df2 %>% 
  ggplot(aes(x=Confort, y=SUMA_CF)) +
  geom_boxplot() +
  geom_jitter() +
xlab("Control por confort") +
  ylab("Puntaje CF") +
  ggtitle("Puntaje de satisfaccion en CF") +
  theme_economist() + 
  scale_y_continuous(limits = c(0,20)) 

Grafico item CF (confort) por controles segun sexo

Existe diferencia entre el item de confort y los diferentes controles ????

aov5 <- aov(long_df2$SUMA_CF~long_df2$Confort)
summary(aov5)
                 Df Sum Sq Mean Sq F value Pr(>F)  
long_df2$Confort  2     95    47.4    4.36  0.015 *
Residuals        99   1077    10.9                 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Lo mismo para no parametricos

kruskal.test(long_df2$Confort~long_df2$SUMA_CF)

    Kruskal-Wallis rank sum test

data:  long_df2$Confort by long_df2$SUMA_CF
Kruskal-Wallis chi-squared = 20, df = 10, p-value = 0.3

Doy otra estructura a mi datos para los controles de autopercepcion

long_df3 <- df2 %>%
  select(Centro.Salud, Sexo,AEC1, AEC2, AEC3) %>% 
  gather(AEC1, AEC2, AEC3, key = "Autopercepcion", value = "SUMA_AE") 

Grafico item AE(autopercepcion estetica) por controles

long_df3 %>% 
  ggplot(aes(x=Autopercepcion, y=SUMA_AE)) +
  geom_boxplot() +
  geom_jitter() +
xlab("Control por autopercepcion") +
  ylab("Puntaje AE") +
  ggtitle("Puntaje de satisfaccion en AE") +
  theme_economist() +
  scale_y_continuous(limits = c(0,15)) 

Grafico item AE(autopercepcion estetica) por controles segun sexo

Grafico para autopercepcion por controles en barras pareadas

long_df3 %>% 
  ggplot(aes(x=Centro.Salud, y=Autopercepcion, fill= Autopercepcion)) +
  geom_col() +
  coord_flip() +
xlab("Centro de salud") +
  ylab("Puntaje satisfaccion para autopercepcion") +
  ggtitle("Puntaje de satisfaccion en AE en controles por centro de salud") +
  theme_economist()

Existe diferencia entre el item de confort y los diferentes controles ????

aov6 <- aov(long_df3$SUMA_AE~long_df3$Autopercepcion)
summary(aov6)
                        Df Sum Sq Mean Sq F value Pr(>F)
long_df3$Autopercepcion  2     21   10.26    1.69   0.19
Residuals               99    600    6.06               

Lo mismo para no parametricos

kruskal.test(long_df3$Autopercepcion~long_df3$SUMA_AE)

    Kruskal-Wallis rank sum test

data:  long_df3$Autopercepcion by long_df3$SUMA_AE
Kruskal-Wallis chi-squared = 10, df = 10, p-value = 0.4
LS0tCnRpdGxlOiAiMjAxN19TYXRpc2ZhY2Npb24gYnJhcXVldHMgb3J0b2RvbmNpYSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyBDYXJnbyBQYXF1ZXRlcwpgYGB7cn0KbGlicmFyeSgidGlkeXZlcnNlIikKbGlicmFyeSgiZ2d0aGVtZXMiKQpsaWJyYXJ5KCJnZ3Bsb3QyIikKaW5zdGFsbC5wYWNrYWdlcygibm9ydGVzdCIpCmxpYnJhcnkoIm5vcnRlc3QiKQpgYGAKI0Ficm8gbWkgZGY0CmBgYHtyfQpkZjUgPC0gcmVhZC5jc3YoInN1bWEgcG9yIGFyZWFzIHkgdG90YWwuY3N2IiwgaGVhZGVyID0gVFJVRSwgc2VwPSIsIikKc3RyKGRmNSkKc3VtbWFyeShkZjUpCmBgYAojYWdyZWdvIGRlY2ltYWxlcyBwYXJhIGxvcyBjYWxjdWxvcwpgYGB7cn0Kb3B0aW9ucyhkaWdpdHM9MikKYGBgCiNBZ3J1cG8gcG9yIGNlbnRybyBkZSBzYWx1ZCBwYXJhIGVsIHRvdGFsIGRlIGNvbnRyb2xlcyAKYGBge3J9CmRmNSAlPiUgCiAgZ3JvdXBfYnkoQ2VudHJvLlNhbHVkKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCksIAogICAgICAgICAgICAiUHJvbWVkaW8oY29udHJvbDEpIiA9IG1lYW4oVE9UQUxDMSksIAogICAgICAgICAgICAiU0QoY29udHJvbDEpIiA9IHNkKFRPVEFMQzEpLAogICAgICAgICAgICAibWluKGNvbnRyb2wxKSI9IG1pbihUT1RBTEMxKSwKICAgICAgICAgICAgIm1heChjb250cm9sMSkiPW1heChUT1RBTEMxKSwKICAgICAgICAgICAgIlByb21lZGlvKGNvbnRyb2wyKSIgPSBtZWFuKFRPVEFMQzIpLCAKICAgICAgICAgICAgIlNEKGNvbnRyb2wyKSIgPSBzZChUT1RBTEMyKSAsCiAgICAgICAgICAgICJtaW4oY29udHJvbDIpIj1taW4oVE9UQUxDMiksCiAgICAgICAgICAgICJtYXgoY29udHJvbDIpIj1tYXgoVE9UQUxDMiksCiAgICAgICAgICAgICJQcm9tZWRpbyhjb250cm9sMykiID0gbWVhbihUT1RBTEMzKSwgCiAgICAgICAgICAgICJTRChjb250cm9sMykiID0gc2QoVE9UQUxDMyksCiAgICAgICAgICAgICJtaW4oY29udHJvbDMpIj1taW4oVE9UQUxDMyksCiAgICAgICAgICAgICJtYXgoY29udHJvbDMiPW1heChUT1RBTEMzKSkKYGBgCiNBZ3J1cG8gcG9yIFNleG8gcGFyYSBlbCB0b3RhbCBkZSBsb3MgY29udHJvbGVzCmBgYHtyfQpkZjUgJT4lIAogZ3JvdXBfYnkoU2V4bykgJT4lIAogIHN1bW1hcmlzZShuID0gbigpLCAKICAgICAgICAgICAgIlByb21lZGlvKGNvbnRyb2wxKSIgPSBtZWFuKFRPVEFMQzEpLCAKICAgICAgICAgICAgIlNEKGNvbnRyb2wxKSIgPSBzZChUT1RBTEMxKSwKICAgICAgICAgICAgIm1pbihjb250cm9sMSkiPSBtaW4oVE9UQUxDMSksCiAgICAgICAgICAgICJtYXgoY29udHJvbDEpIj1tYXgoVE9UQUxDMSksCiAgICAgICAgICAgICJQcm9tZWRpbyhjb250cm9sMikiID0gbWVhbihUT1RBTEMyKSwgCiAgICAgICAgICAgICJTRChjb250cm9sMikiID0gc2QoVE9UQUxDMikgLAogICAgICAgICAgICAibWluKGNvbnRyb2wyKSI9bWluKFRPVEFMQzIpLAogICAgICAgICAgICAibWF4KGNvbnRyb2wyKSI9bWF4KFRPVEFMQzIpLAogICAgICAgICAgICAiUHJvbWVkaW8oY29udHJvbDMpIiA9IG1lYW4oVE9UQUxDMyksIAogICAgICAgICAgICAiU0QoY29udHJvbDMpIiA9IHNkKFRPVEFMQzMpLAogICAgICAgICAgICAibWluKGNvbnRyb2wzKSI9bWluKFRPVEFMQzMpLAogICAgICAgICAgICAibWF4KGNvbnRyb2wzIj1tYXgoVE9UQUxDMykpCmBgYAojQ2FsY3VsbyBwcm9tZWRpb3MgeSBkZXN2aWFjaW9uIHBvciBjZW50cm8gZGUgc2FsdWQgcGFyYSBjYWRhIHVubyBkZSBsb3MgY29udHJvbGVzIGRlbCBpdGVtIGhpZ2llbmUKYGBge3J9CmRmNSAlPiUgCiAgZ3JvdXBfYnkoQ2VudHJvLlNhbHVkKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCksIAogICAgICAgICAgICAiUHJvbWVkaW9PSChjb250cm9sMSkiID0gbWVhbihIT0MxKSwgCiAgICAgICAgICAgICJTRCBPSChjb250cm9sMSkiID0gc2QoSE9DMSksCiAgICAgICAgICAgICJQcm9tZWRpb09IKGNvbnRyb2wyKSIgPSBtZWFuKEhPQzIpLCAKICAgICAgICAgICAgIlNEIE9IKGNvbnRyb2wyKSIgPSBzZChIT0MyKSAsCiAgICAgICAgICAgICJNZWFuX09IKGNvbnRyb2wzKSIgPSBtZWFuKEhPQzMpLCAKICAgICAgICAgICAgIlNEIE9IKGNvbnRyb2wzKSIgPSBzZChIT0MzKSkKYGBgCiNDYWxjdWxvIHByb21lZGlvcyB5IGRlc3ZpYWNpb24gcG9yIGNlbnRybyBkZSBzYWx1ZCBwYXJhIGNhZGEgdW5vIGRlIGxvcyBjb250cm9sZXMgZGVsIGl0ZW0gY29uZm9ydApgYGB7cn0KZGY1ICU+JSAKICBncm91cF9ieShDZW50cm8uU2FsdWQpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSwgCiAgICAgICAgICAgICJQcm9tZWRpbyBDRihjb250cm9sMSkiID0gbWVhbihDRkMxKSwgCiAgICAgICAgICAgICJTRCBDRihjb250cm9sMSkiID0gc2QoQ0ZDMSksCiAgICAgICAgICAgICJQcm9tZWRpbyBDRihjb250cm9sMikiID0gbWVhbihDRkMyKSwgCiAgICAgICAgICAgICJTRCBDRihjb250cm9sMikiID0gc2QoQ0ZDMikgLAogICAgICAgICAgICAiTWVhbiBDRihjb250cm9sMykiID0gbWVhbihDRkMzKSwgCiAgICAgICAgICAgICJTRCBDRihjb250cm9sMykiID0gc2QoQ0ZDMykpCmBgYAojQ2FsY3VsbyBwcm9tZWRpb3MgeSBkZXN2aWFjaW9uIHBvciBjZW50cm8gZGUgc2FsdWQgcGFyYSBjYWRhIHVubyBkZSBsb3MgY29udHJvbGVzIGRlbCBpdGVtIGF1dG9wZXJjZXBjaW9uIGVzdGV0aWNhCmBgYHtyfQpkZjUgJT4lIAogIGdyb3VwX2J5KENlbnRyby5TYWx1ZCkgJT4lIAogIHN1bW1hcmlzZShuID0gbigpLCAKICAgICAgICAgICAgIlByb21lZGlvIEFFKGNvbnRyb2wxKSIgPSBtZWFuKEFFQzEpLCAKICAgICAgICAgICAgIlNEIEFFKGNvbnRyb2wxKSIgPSBzZChBRUMxKSwKICAgICAgICAgICAgIlByb21lZGlvIEFFKGNvbnRyb2wyKSIgPSBtZWFuKEFFQzIpLCAKICAgICAgICAgICAgIlNEIEFFKGNvbnRyb2wyKSIgPSBzZChBRUMyKSAsCiAgICAgICAgICAgICJNZWFuIEFFKGNvbnRyb2wzKSIgPSBtZWFuKEFFQzMpLCAKICAgICAgICAgICAgIlNEIEFFKGNvbnRyb2wzKSIgPSBzZChBRUMzKSkKYGBgCiNBZ3J1cG8gcG9yIHNleG8gcGFyYSBjYWRhIHVubyBkZSBsb3MgY29udHJvbGVzIGRlbCBpdGVtIGhpZ2llbmUKYGBge3J9CmRmNSAlPiUgCiAgZ3JvdXBfYnkoU2V4bykgJT4lIAogIHN1bW1hcmlzZShuID0gbigpLCAKICAgICAgICAgICAgIlByb21lZGlvT0goY29udHJvbDEpIiA9IG1lYW4oSE9DMSksIAogICAgICAgICAgICAiU0QgT0goY29udHJvbDEpIiA9IHNkKEhPQzEpLAogICAgICAgICAgICAiUHJvbWVkaW9PSChjb250cm9sMikiID0gbWVhbihIT0MyKSwgCiAgICAgICAgICAgICJTRCBPSChjb250cm9sMikiID0gc2QoSE9DMikgLAogICAgICAgICAgICAiTWVhbl9PSChjb250cm9sMykiID0gbWVhbihIT0MzKSwgCiAgICAgICAgICAgICJTRCBPSChjb250cm9sMykiID0gc2QoSE9DMykpCmBgYAojQWdydXBvIHBvciBzZXhvIHBhcmEgY2FkYSB1bm8gZGUgbG9zIGNvbnRyb2xlcyBkZWwgaXRlbSBjb25mb3J0CmBgYHtyfQpkZjUgJT4lIAogIGdyb3VwX2J5KFNleG8pICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSwgCiAgICAgICAgICAgICJQcm9tZWRpbyBDRihjb250cm9sMSkiID0gbWVhbihDRkMxKSwgCiAgICAgICAgICAgICJTRCBDRihjb250cm9sMSkiID0gc2QoQ0ZDMSksCiAgICAgICAgICAgICJQcm9tZWRpbyBDRihjb250cm9sMikiID0gbWVhbihDRkMyKSwgCiAgICAgICAgICAgICJTRCBDRihjb250cm9sMikiID0gc2QoQ0ZDMikgLAogICAgICAgICAgICAiTWVhbiBDRihjb250cm9sMykiID0gbWVhbihDRkMzKSwgCiAgICAgICAgICAgICJTRCBDRihjb250cm9sMykiID0gc2QoQ0ZDMykpCmBgYAojI0FncnVwbyBwb3Igc2V4byBwYXJhIGNhZGEgdW5vIGRlIGxvcyBjb250cm9sZXMgZGVsIGl0ZW0gYXV0b3BlcmNlcGNpb24KYGBge3J9CmRmNSAlPiUgCiAgZ3JvdXBfYnkoU2V4bykgJT4lIAogIHN1bW1hcmlzZShuID0gbigpLCAKICAgICAgICAgICAgIlByb21lZGlvIEFFKGNvbnRyb2wxKSIgPSBtZWFuKEFFQzEpLCAKICAgICAgICAgICAgIlNEIEFFKGNvbnRyb2wxKSIgPSBzZChBRUMxKSwKICAgICAgICAgICAgIlByb21lZGlvIEFFKGNvbnRyb2wyKSIgPSBtZWFuKEFFQzIpLCAKICAgICAgICAgICAgIlNEIEFFKGNvbnRyb2wyKSIgPSBzZChBRUMyKSAsCiAgICAgICAgICAgICJNZWFuIEFFKGNvbnRyb2wzKSIgPSBtZWFuKEFFQzMpLCAKICAgICAgICAgICAgIlNEIEFFKGNvbnRyb2wzKSIgPSBzZChBRUMzKSkKYGBgCiNHcmFmaWNvIHBhcmEgdGlwbyBkZSBjZW50cm8gZGUgc2FsdWQgeSB0b3RhbCBkZWwgcHJpbWVyIGNvbnRyb2wKYGBge3J9CmRmNSAlPiUgCiAgZ2dwbG90KGFlcyh4PUNlbnRyby5TYWx1ZCwgeT1UT1RBTEMxLCBmaWxsPVNleG8pKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImJsYWNrIiwgImJsdWUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBnZW9tX2ppdHRlcigpICsKICB4bGFiKCJDZW50cm8gZGUgU2FsdWQiKSArIAogIHlsYWIoIlB1bnRhamUgZW5jdWVzdGEiKSArIAogIGdndGl0bGUoIlB1bnRhamUgdG90YWwgc2F0aXNmYWNjaW9uIHBhcmEgcHJpbWVyIGNvbnRyb2wgcG9yIGNlbnRybyBkZSBTYWx1ZCIpICsgCiAgdGhlbWVfZWNvbm9taXN0KCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKSArIAogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsNTApKSArIAogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgdmp1c3Q9LTAuNSwgY29sb3VyPSJibGFjayIsIHNpemU9cmVsKDEpKSkgKyAKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIHZqdXN0PTEuNSwgY29sb3VyPSJibGFjayIsIHNpemU9cmVsKDEpKSkgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZT0iU2V4byIsIGxhYmVscz1jKCJGZW1lbmlubyIsIk1hc2N1bGlubyIpKQpgYGAKCiMjR3JhZmljbyBwYXJhIHRpcG8gZGUgY2VudHJvIGRlIHNhbHVkIHkgdG90YWwgZGVsIHNlZ3VuZG8gY29udHJvbApgYGB7cn0KZGY1ICU+JSAKICBnZ3Bsb3QoYWVzKHg9Q2VudHJvLlNhbHVkLCB5PVRPVEFMQzIsIGZpbGw9U2V4bykpKwogIGdlb21fYm94cGxvdCgpICsKICBnZW9tX2ppdHRlcigpICsKICB4bGFiKCJDZW50cm8gZGUgU2FsdWQiKSArCiAgeWxhYigiUHVudGFqZSBlbmN1ZXN0YSIpICsKICBnZ3RpdGxlKCJQdW50YWplIHRvdGFsIHNlZ3VuZG8gY29udHJvbCBwb3IgY2VudHJvIGRlIFNhbHVkIikgKwogIHRoZW1lX2Vjb25vbWlzdCgpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDUwKSkgCmBgYAojI0dyYWZpY28gcGFyYSB0aXBvIGRlIGNlbnRybyBkZSBzYWx1ZCB5IHRvdGFsIGRlbCB0ZXJjZXIgY29udHJvbApgYGB7cn0KZGY1ICU+JSAKICBnZ3Bsb3QoYWVzKHg9Q2VudHJvLlNhbHVkLCB5PShUT1RBTEMzKSwgZmlsbD0gU2V4bykpICsKICBnZW9tX2JveHBsb3QoKSArCiAgZ2VvbV9qaXR0ZXIoKSArCiAgeGxhYigiQ2VudHJvIGRlIFNhbHVkIikgKwogIHlsYWIoIlB1bnRhamUgZW5jdWVzdGEiKSArCiAgZ2d0aXRsZSgiUHVudGFqZSB0b3RhbCB0ZXJjZXIgY29udHJvbCBwb3IgY2VudHJvIGRlIFNhbHVkIikgKwogIHRoZW1lX2Vjb25vbWlzdCgpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDUwKSkgCmBgYAojVmVvIG5vcm1hbGlkYWQgZGUgbWlzIGRhdG9zCmBgYHtyfQpxcW5vcm0oZGY1JFRPVEFMQzEsIG1haW4gPSAiTm9ybWFsaWRhZCIpCmBgYAojU2hhcGl0byB0ZXN0IHBhcmEgdG90YWxjMQpgYGB7cn0Kc2hhcGlyby50ZXN0KGRmNSRUT1RBTEMxKQpgYGAKI3Rlc3QgZGUgYW5kZXJzb24gcGFyYSB0b3RhbEMxCmBgYHtyfQphZC50ZXN0KGRmNSRUT1RBTEMxKQpgYGAKI0V4aXN0ZSBkaWZlcmVuY2lhIGVudHJlIGNlbnRybyBkZSBzYWx1ZCB5IGxhIGluc3RhbGFjacOzbiBlbiBlbCBwcmltZXIgY29udHJvbD8/IApgYGB7cn0KYW92MSA8LSBhb3YoZGY1JFRPVEFMQzF+ZGY1JENlbnRyby5TYWx1ZCkKc3VtbWFyeShhb3YxKQpgYGAKYGBge3J9ClR1a2V5SFNEKGFvdjEpCmBgYAoKI0xvIG1pc21vIHBhcmEgcHJ1ZWJhIG5vIHBhcmFtZXRyaWNhCmBgYHtyfQprcnVza2FsLnRlc3QoZGY1JFRPVEFMQzF+ZGY1JENlbnRyby5TYWx1ZCkKYGBgCiNFeGlzdGUgZGlmZXJlbmNpYSBlbnRyZSBjZW50cm8gZGUgc2FsdWQgeSBsYSBpbnN0YWxhY2nDs24gZW4gZWwgc2VndW5kbyBjb250cm9sPz8gCmBgYHtyfQphb3YyIDwtIGFvdihkZjUkVE9UQUxDMn5kZjUkQ2VudHJvLlNhbHVkKQpzdW1tYXJ5KGFvdjIpCmBgYAojTG8gbWlzbW8gcGFyYSBwcnVlYmEgbm8gcGFyYW1ldHJpY2EKYGBge3J9CmtydXNrYWwudGVzdChkZjUkVE9UQUxDMn5kZjUkQ2VudHJvLlNhbHVkKQpgYGAKI0V4aXN0ZSBkaWZlcmVuY2lhIGVudHJlIGNlbnRybyBkZSBzYWx1ZCB5IGxhIGluc3RhbGFjacOzbiBlbiBlbCBzZWd1bmRvIGNvbnRyb2w/PyAKYGBge3J9CmFvdjMgPC0gYW92KGRmNSRUT1RBTEMzfmRmNSRDZW50cm8uU2FsdWQpCnN1bW1hcnkoYW92MykKYGBgCiNMbyBtaXNtbyBwYXJhIHBydWViYSBubyBwYXJhbWV0cmljYQpgYGB7cn0Ka3J1c2thbC50ZXN0KGRmNSRUT1RBTEMzfmRmNSRDZW50cm8uU2FsdWQpCmBgYAojU3VtbyBwb3IgaXRlbSBsb3MgdHJlcyBjb250cm9sZXMKYGBge3J9CmRmMiA8LSBkZjUgJT4lIAogIG11dGF0ZShTVU1BX0hPID1IT0MxICArIEhPQzIgKyBIT0MzLCBTVU1BX0NGPSBDRkMxICsgQ0ZDMiArIENGQzMsIFNVTUFfQUU9IEFFQzEgKyBBRUMyICsgQUVDMykKYGBgCiNEb3kgb3RyYSBlc3RydWN0dXJhIGEgbWkgZGF0b3MgcGFyYSBsb3MgY29udHJvbGVzIGRlIGhpZ2llbmUgCmBgYHtyfQpsb25nX2RmMSA8LSBkZjIgJT4lCiAgc2VsZWN0KENlbnRyby5TYWx1ZCwgU2V4bywgSE9DMSwgSE9DMixIT0MzKSAlPiUgCiAgZ2F0aGVyKEhPQzEsIEhPQzIsSE9DMywga2V5ID0gIkhpZ2llbmUiLCB2YWx1ZSA9ICJTVU1BX0hPIikgCmBgYAojR3JhZmljbyBpdGVtIGhpZ2llbmUgb3JhbCAoSE8pIHBvciBjb250cm9sZXMgCmBgYHtyfQpsb25nX2RmMSAlPiUgCiAgZ2dwbG90KGFlcyh4PUhpZ2llbmUsIHk9U1VNQV9ITykpICsKICBnZW9tX2JveHBsb3QoKSArCiAgZ2VvbV9qaXR0ZXIoKSArCnhsYWIoIkNvbnRyb2wgcG9yIEhpZ2llbmUgT3JhbCIpICsKICB5bGFiKCJQdW50YWplIEhPIikgKwogIGdndGl0bGUoIlB1bnRhamUgZGUgc2F0aXNmYWNjaW9uIGVuIEhPIikgKwogIHRoZW1lX2Vjb25vbWlzdCgpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDE1KSkgCmBgYAojR3JhZmljbyBpdGVtIGhpZ2llbmUgb3JhbCAoSE8pIHBvciBjb250cm9sZXMgc2VndW4gc2V4bwpgYGB7cn0KbG9uZ19kZjEgJT4lIAogIGdncGxvdChhZXMoeD1IaWdpZW5lLCB5PVNVTUFfSE8sIGZpbGw9IFNleG8pKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIGdlb21faml0dGVyKCkgKwp4bGFiKCJDb250cm9sIHBvciBIaWdpZW5lIE9yYWwiKSArCiAgeWxhYigiUHVudGFqZSBITyIpICsKICBnZ3RpdGxlKCJQdW50YWplIGRlIHNhdGlzZmFjY2lvbiBlbiBITyBzZWd1biBzZXhvIikgKwogIHRoZW1lX2Vjb25vbWlzdCgpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDE1KSkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKSArIAogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgdmp1c3Q9LTAuNSwgY29sb3VyPSJibGFjayIsIHNpemU9cmVsKDEpKSkgKyAKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIHZqdXN0PTEuNSwgY29sb3VyPSJibGFjayIsIHNpemU9cmVsKDEpKSkgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZT0iU2V4byIsIGxhYmVscz1jKCJGZW1lbmlubyIsIk1hc2N1bGlubyIpKQpgYGAKI0V4aXN0ZSBkaWZlcmVuY2lhIGVudHJlIGVsIGl0ZW0gZGUgaGlnaWVuZSB5IGxvcyBkaWZlcmVudGVzIGNvbnRyb2xlcyA/Pz8/IApgYGB7cn0KYW92NCA8LSBhb3YobG9uZ19kZjEkU1VNQV9IT35sb25nX2RmMSRIaWdpZW5lKQpzdW1tYXJ5KGFvdjQpCmBgYAojTG8gbWlzbW8gcGFyYSBubyBwYXJhbWV0cmljbwpgYGB7cn0Ka3J1c2thbC50ZXN0KGxvbmdfZGYxJEhpZ2llbmV+bG9uZ19kZjEkU1VNQV9ITykKYGBgCiNEb3kgb3RyYSBlc3RydWN0dXJhIGEgbWkgZGF0b3MgcGFyYSBsb3MgY29udHJvbGVzIGNvbmZvcnQgCmBgYHtyfQpsb25nX2RmMiA8LSBkZjIgJT4lCiAgc2VsZWN0KENlbnRyby5TYWx1ZCwgU2V4byxDRkMxLCBDRkMyLCBDRkMzKSAlPiUgCiAgZ2F0aGVyKENGQzEsIENGQzIsIENGQzMsIGtleSA9ICJDb25mb3J0IiwgdmFsdWUgPSAiU1VNQV9DRiIpIApgYGAKI0dyYWZpY28gaXRlbSBDRiAoY29uZm9ydCkgcG9yIGNvbnRyb2xlcwpgYGB7cn0KbG9uZ19kZjIgJT4lIAogIGdncGxvdChhZXMoeD1Db25mb3J0LCB5PVNVTUFfQ0YpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIGdlb21faml0dGVyKCkgKwp4bGFiKCJDb250cm9sIHBvciBjb25mb3J0IikgKwogIHlsYWIoIlB1bnRhamUgQ0YiKSArCiAgZ2d0aXRsZSgiUHVudGFqZSBkZSBzYXRpc2ZhY2Npb24gZW4gQ0YiKSArCiAgdGhlbWVfZWNvbm9taXN0KCkgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDIwKSkgCmBgYAojR3JhZmljbyBpdGVtIENGIChjb25mb3J0KSBwb3IgY29udHJvbGVzIHNlZ3VuIHNleG8KYGBge3J9CmxvbmdfZGYyICU+JSAKICBnZ3Bsb3QoYWVzKHg9Q29uZm9ydCwgeT1TVU1BX0NGLCBmaWxsPSBTZXhvKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBnZW9tX2ppdHRlcigpICsKeGxhYigiQ29udHJvbCBwb3IgY29uZm9ydCIpICsKICB5bGFiKCJQdW50YWplIENGIikgKwogIGdndGl0bGUoIlB1bnRhamUgZGUgc2F0aXNmYWNjaW9uIGVuIENGIHNlZ3VuIHNleG8iKSArCiAgdGhlbWVfZWNvbm9taXN0KCkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsMjApKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikgKyAKICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIHZqdXN0PS0wLjUsIGNvbG91cj0iYmxhY2siLCBzaXplPXJlbCgxKSkpICsgCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCB2anVzdD0xLjUsIGNvbG91cj0iYmxhY2siLCBzaXplPXJlbCgxKSkpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWU9IlNleG8iLCBsYWJlbHM9YygiRmVtZW5pbm8iLCJNYXNjdWxpbm8iKSkKYGBgCiNFeGlzdGUgZGlmZXJlbmNpYSBlbnRyZSBlbCBpdGVtIGRlIGNvbmZvcnQgeSBsb3MgZGlmZXJlbnRlcyBjb250cm9sZXMgPz8/PyAKYGBge3J9CmFvdjUgPC0gYW92KGxvbmdfZGYyJFNVTUFfQ0Z+bG9uZ19kZjIkQ29uZm9ydCkKc3VtbWFyeShhb3Y1KQpgYGAKI0xvIG1pc21vIHBhcmEgbm8gcGFyYW1ldHJpY29zCmBgYHtyfQprcnVza2FsLnRlc3QobG9uZ19kZjIkQ29uZm9ydH5sb25nX2RmMiRTVU1BX0NGKQpgYGAKI0RveSBvdHJhIGVzdHJ1Y3R1cmEgYSBtaSBkYXRvcyBwYXJhIGxvcyBjb250cm9sZXMgZGUgYXV0b3BlcmNlcGNpb24KYGBge3J9CmxvbmdfZGYzIDwtIGRmMiAlPiUKICBzZWxlY3QoQ2VudHJvLlNhbHVkLCBTZXhvLEFFQzEsIEFFQzIsIEFFQzMpICU+JSAKICBnYXRoZXIoQUVDMSwgQUVDMiwgQUVDMywga2V5ID0gIkF1dG9wZXJjZXBjaW9uIiwgdmFsdWUgPSAiU1VNQV9BRSIpIApgYGAKI0dyYWZpY28gaXRlbSBBRShhdXRvcGVyY2VwY2lvbiBlc3RldGljYSkgcG9yIGNvbnRyb2xlcwpgYGB7cn0KbG9uZ19kZjMgJT4lIAogIGdncGxvdChhZXMoeD1BdXRvcGVyY2VwY2lvbiwgeT1TVU1BX0FFKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBnZW9tX2ppdHRlcigpICsKeGxhYigiQ29udHJvbCBwb3IgYXV0b3BlcmNlcGNpb24iKSArCiAgeWxhYigiUHVudGFqZSBBRSIpICsKICBnZ3RpdGxlKCJQdW50YWplIGRlIHNhdGlzZmFjY2lvbiBlbiBBRSIpICsKICB0aGVtZV9lY29ub21pc3QoKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwxNSkpIApgYGAKI0dyYWZpY28gaXRlbSBBRShhdXRvcGVyY2VwY2lvbiBlc3RldGljYSkgcG9yIGNvbnRyb2xlcyBzZWd1biBzZXhvCmBgYHtyfQpsb25nX2RmMyAlPiUgCiAgZ2dwbG90KGFlcyh4PUF1dG9wZXJjZXBjaW9uLCB5PVNVTUFfQUUsIGZpbGw9IFNleG8pKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIGdlb21faml0dGVyKCkgKwp4bGFiKCJDb250cm9sIHBvciBhdXRvcGVyY2VwY2lvbiIpICsKICB5bGFiKCJQdW50YWplIEFFIikgKwogIGdndGl0bGUoIlB1bnRhamUgZGUgc2F0aXNmYWNjaW9uIGVuIEFFIHNlZ3VuIHNleG8iKSArCiAgdGhlbWVfZWNvbm9taXN0KCkgKwogICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDE1KSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpICsgCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCB2anVzdD0tMC41LCBjb2xvdXI9ImJsYWNrIiwgc2l6ZT1yZWwoMSkpKSArIAogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgdmp1c3Q9MS41LCBjb2xvdXI9ImJsYWNrIiwgc2l6ZT1yZWwoMSkpKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJTZXhvIiwgbGFiZWxzPWMoIkZlbWVuaW5vIiwiTWFzY3VsaW5vIikpCmBgYAojR3JhZmljbyBwYXJhIGF1dG9wZXJjZXBjaW9uIHBvciBjb250cm9sZXMgZW4gYmFycmFzIHBhcmVhZGFzCmBgYHtyfQpsb25nX2RmMyAlPiUgCiAgZ2dwbG90KGFlcyh4PUNlbnRyby5TYWx1ZCwgeT1BdXRvcGVyY2VwY2lvbiwgZmlsbD0gQXV0b3BlcmNlcGNpb24pKSArCiAgZ2VvbV9jb2woKSArCiAgY29vcmRfZmxpcCgpICsKeGxhYigiQ2VudHJvIGRlIHNhbHVkIikgKwogIHlsYWIoIlB1bnRhamUgc2F0aXNmYWNjaW9uIHBhcmEgYXV0b3BlcmNlcGNpb24iKSArCiAgZ2d0aXRsZSgiUHVudGFqZSBkZSBzYXRpc2ZhY2Npb24gZW4gQUUgZW4gY29udHJvbGVzIHBvciBjZW50cm8gZGUgc2FsdWQiKSArCiAgdGhlbWVfZWNvbm9taXN0KCkKYGBgCiNFeGlzdGUgZGlmZXJlbmNpYSBlbnRyZSBlbCBpdGVtIGRlIGNvbmZvcnQgeSBsb3MgZGlmZXJlbnRlcyBjb250cm9sZXMgPz8/PyAKYGBge3J9CmFvdjYgPC0gYW92KGxvbmdfZGYzJFNVTUFfQUV+bG9uZ19kZjMkQXV0b3BlcmNlcGNpb24pCnN1bW1hcnkoYW92NikKYGBgCiNMbyBtaXNtbyBwYXJhIG5vIHBhcmFtZXRyaWNvcwpgYGB7cn0Ka3J1c2thbC50ZXN0KGxvbmdfZGYzJEF1dG9wZXJjZXBjaW9ufmxvbmdfZGYzJFNVTUFfQUUpCmBgYAo=