Essa é a solução para o Tema 1 de Métodos Experimentais do PPGA - Semestre 2024/1, Prof. Leonardo Nicolao

Primeiro passo, importando os dados

setwd("~/Meu Drive/GDrive/UFRGS/Ensino/20231/ADP - Experimentos/Temas/HW1")
getwd()
[1] "/Users/lnicolao/Meu Drive/GDrive/UFRGS/Ensino/20231/ADP - Experimentos/Temas/HW1"
library(readr)
dt1.raw <- read_csv("dados_TCC_Sofia.csv", col_names = FALSE, skip = 3)
Rows: 460 Columns: 68
── Column specification ─────────────────────────────────────────────
Delimiter: ","
chr   (6): X4, X9, X16, X17, X60, X61
dbl  (52): X3, X5, X6, X7, X14, X15, X18, X19, X20, X21, X22, X23...
lgl   (7): X10, X11, X12, X13, X49, X55, X57
dttm  (3): X1, X2, X8

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
nomes.base <- read_csv("dados_TCC_Sofia.csv", col_names = FALSE)[1,]
Rows: 463 Columns: 68
── Column specification ─────────────────────────────────────────────
Delimiter: ","
chr (68): X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13,...

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
names(dt1.raw) <- nomes.base

head(dt1.raw)

Limpando os dados

table(dt1.raw$Finished)

  0   1 
179 281 
names(dt1.raw)
 [1] "StartDate"                             
 [2] "EndDate"                               
 [3] "Status"                                
 [4] "IPAddress"                             
 [5] "Progress"                              
 [6] "Duration (in seconds)"                 
 [7] "Finished"                              
 [8] "RecordedDate"                          
 [9] "ResponseId"                            
[10] "RecipientLastName"                     
[11] "RecipientFirstName"                    
[12] "RecipientEmail"                        
[13] "ExternalReference"                     
[14] "LocationLatitude"                      
[15] "LocationLongitude"                     
[16] "DistributionChannel"                   
[17] "UserLanguage"                          
[18] "TERMO"                                 
[19] "Atitude_1"                             
[20] "Atitude_2"                             
[21] "Atitude_3"                             
[22] "Atitude_4"                             
[23] "Atitude_5"                             
[24] "Atitude_6"                             
[25] "Atitude_7"                             
[26] "Atitude_8"                             
[27] "Atitude_9"                             
[28] "Autenticidade_1"                       
[29] "Autenticidade_2"                       
[30] "Autenticidade_3"                       
[31] "Autenticidade_4"                       
[32] "atributos_69"                          
[33] "atributos_70"                          
[34] "atributos_71"                          
[35] "atributos_72"                          
[36] "atributos_73"                          
[37] "atributos_74"                          
[38] "atributos_75"                          
[39] "preço"                                 
[40] "check_1"                               
[41] "check_2"                               
[42] "check_3"                               
[43] "check_4"                               
[44] "check_5"                               
[45] "check_6"                               
[46] "Conhece"                               
[47] "Idade"                                 
[48] "Gênero"                                
[49] "Gênero_4_TEXT"                         
[50] "Etnia_1"                               
[51] "Etnia_2"                               
[52] "Etnia_3"                               
[53] "Etnia_4"                               
[54] "Etnia_5"                               
[55] "Etnia_6"                               
[56] "Etnia_7"                               
[57] "Etnia_6_TEXT"                          
[58] "Ensino"                                
[59] "Renda"                                 
[60] "Espaço Aberto"                         
[61] "Email"                                 
[62] "FL_15_DO_707_sustentavel"              
[63] "FL_15_DO_707_funcional"                
[64] "FL_15_DO_707_simbolico"                
[65] "AtitudeeAutenticidade_DO_Atitude"      
[66] "AtitudeeAutenticidade_DO_Autenticidade"
[67] "Percepção_DO_preço"                    
[68] "Percepção_DO_atributos"                
table(dt1.raw$TERMO)

  1   2 
458   2 
dt1 <- subset(dt1.raw, dt1.raw$Finished == 1 & dt1.raw$TERMO == 1)

table(dt1$Finished)

  1 
279 
names(dt1)
 [1] "StartDate"                             
 [2] "EndDate"                               
 [3] "Status"                                
 [4] "IPAddress"                             
 [5] "Progress"                              
 [6] "Duration (in seconds)"                 
 [7] "Finished"                              
 [8] "RecordedDate"                          
 [9] "ResponseId"                            
[10] "RecipientLastName"                     
[11] "RecipientFirstName"                    
[12] "RecipientEmail"                        
[13] "ExternalReference"                     
[14] "LocationLatitude"                      
[15] "LocationLongitude"                     
[16] "DistributionChannel"                   
[17] "UserLanguage"                          
[18] "TERMO"                                 
[19] "Atitude_1"                             
[20] "Atitude_2"                             
[21] "Atitude_3"                             
[22] "Atitude_4"                             
[23] "Atitude_5"                             
[24] "Atitude_6"                             
[25] "Atitude_7"                             
[26] "Atitude_8"                             
[27] "Atitude_9"                             
[28] "Autenticidade_1"                       
[29] "Autenticidade_2"                       
[30] "Autenticidade_3"                       
[31] "Autenticidade_4"                       
[32] "atributos_69"                          
[33] "atributos_70"                          
[34] "atributos_71"                          
[35] "atributos_72"                          
[36] "atributos_73"                          
[37] "atributos_74"                          
[38] "atributos_75"                          
[39] "preço"                                 
[40] "check_1"                               
[41] "check_2"                               
[42] "check_3"                               
[43] "check_4"                               
[44] "check_5"                               
[45] "check_6"                               
[46] "Conhece"                               
[47] "Idade"                                 
[48] "Gênero"                                
[49] "Gênero_4_TEXT"                         
[50] "Etnia_1"                               
[51] "Etnia_2"                               
[52] "Etnia_3"                               
[53] "Etnia_4"                               
[54] "Etnia_5"                               
[55] "Etnia_6"                               
[56] "Etnia_7"                               
[57] "Etnia_6_TEXT"                          
[58] "Ensino"                                
[59] "Renda"                                 
[60] "Espaço Aberto"                         
[61] "Email"                                 
[62] "FL_15_DO_707_sustentavel"              
[63] "FL_15_DO_707_funcional"                
[64] "FL_15_DO_707_simbolico"                
[65] "AtitudeeAutenticidade_DO_Atitude"      
[66] "AtitudeeAutenticidade_DO_Autenticidade"
[67] "Percepção_DO_preço"                    
[68] "Percepção_DO_atributos"                

Definindo as condições

dt1$condicao <- "Leo"
dt1$condicao[dt1$FL_15_DO_707_funcional==1] <- 0
dt1$condicao[dt1$FL_15_DO_707_simbolico==1] <- -1
dt1$condicao[dt1$FL_15_DO_707_sustentavel==1] <- +1

table(dt1$condicao)

-1  0  1 
93 89 97 
dt1$condicao.f <- factor(dt1$condicao, levels = c(-1,0,1),
                         labels = c("Simbólico","Funcional","Sustentável"))

table(dt1$condicao.f)

  Simbólico   Funcional Sustentável 
         93          89          97 
library(questionr)
freq(dt1$condicao.f, total = TRUE, valid = FALSE)

Gráficos

require(ggsci)
require(ggplot2)
dt1$genero.f <- factor(dt1$Gênero, levels = c(1,2,3),
                       labels = c("Feminino","Masculino","Não Binário"))

t.genero <- freq(dt1$genero.f, digits = 2, exclude = NA, total = T)
ggplot(t.genero[-4,], aes(x="", y=`%`,fill=rownames(t.genero[-4,]), label = round(`%`,2)))+
  geom_bar(width = 1, stat = "identity")+
  geom_text(position = position_stack(vjust = 0.5),size = 5)+
  scale_fill_npg() +
  labs(x=NULL,fill="Gênero",y="%",title="Gênero dos Respondentes")+
  coord_polar("y", start=0)

Idade dos Respondentes

mean(dt1$Idade, na.rm = T)
[1] 28.61993
sd(dt1$Idade, na.rm = T)
[1] 10.72758
library(psych)
psych::describe(dt1$Idade)

ggplot(dt1, aes(x=Idade)) + 
  geom_histogram(aes(y=..density..),binwidth = 1, color="grey",fill="grey")+
  geom_density(alpha=.2, fill="green")+
  geom_vline(aes(xintercept=mean(Idade,na.rm=T)),color="blue",linetype="dashed",size=1)+
  labs(title="Idade dos Respondentes",y=NULL,x="Idade")
Warning: Removed 8 rows containing non-finite outside the scale range
(`stat_bin()`).
Warning: Removed 8 rows containing non-finite outside the scale range
(`stat_density()`).

Renda dos Participantes

dt1$renda.f <- factor(dt1$Renda, levels = seq(1:8),
                      labels = c("Até R$ 1.100",
                                 "De R$ 1.101 a R$ 3.300",
                                 "De R$ 3.301 a R$ 6.600",
                                 "De R$ 6.601 a R$ 9.900",
                                 "De R$ 9.901 a R$ 13.200",
                                 "De R$ 13.201 a R$ 16.500",
                                 "Acima de R$ 16.501",
                                 "Prefiro não dizer"))

t.renda <- freq(dt1$renda.f, total = T, valid = F, digits = 2)
t.renda

ggplot(data=t.renda[-9,], aes(x=rownames(t.renda[-9,]), y=n)) +
  geom_bar(stat="identity", fill="purple")+
  labs(title="Renda dos Respondentes", y="Número de Respostas", x="Faixas de Renda")+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Atitude em Relação à Marca

dt1$atitude.df <- data.frame(dt1$Atitude_1,dt1$Atitude_2,dt1$Atitude_3,
                             dt1$Atitude_4,dt1$Atitude_5,dt1$Atitude_6,
                             dt1$Atitude_7,dt1$Atitude_8,dt1$Atitude_9)

dt1$atitude.media <- rowMeans(dt1$atitude.df)
psych::describe(dt1$atitude.media)

ggplot(dt1, aes(x=atitude.media)) + 
  geom_histogram(aes(y=..density..),binwidth = 1, color="grey",fill="grey")+
  geom_density(alpha=.2, fill="cyan")+
  geom_vline(aes(xintercept=mean(atitude.media,na.rm=T)),color="blue",linetype="dashed",size=1)+
  labs(title="Atitude Média em Relação à Marca",y=NULL,x="Atitude")

Tema 2 - Análise de Dados

Criando uma variável composta para autenticidade

dt1$autenticidade.df <- data.frame(dt1$Autenticidade_1,
                                   dt1$Autenticidade_2,
                                   dt1$Autenticidade_3,
                                   dt1$Autenticidade_4)
dt1$autenticidade <- rowMeans(dt1$autenticidade.df, na.rm = T)

ggplot(dt1, aes(x=autenticidade)) + 
  geom_histogram(aes(y=..density..),binwidth = 1, color="grey",fill="grey")+
  geom_density(alpha=.2, fill="orange")+
  geom_vline(aes(xintercept=mean(autenticidade,na.rm=T)),color="red",linetype="dashed",size=1)+
  labs(title="Autenticidade da Marca",y=NULL,x="Autenticidade")

Testar o efeito experimental na atitude em relação à marca

descritiva_atitude <- describeBy(dt1$atitude.media, dt1$condicao.f, digits = 2, mat = T)
rownames(descritiva_atitude) <- NULL
descritiva_atitude

anova_atitude <- aov(atitude.media ~ condicao.f, data = dt1)
summary(anova_atitude)
             Df Sum Sq Mean Sq F value   Pr(>F)    
condicao.f    2  10.68   5.341   11.19 2.13e-05 ***
Residuals   276 131.79   0.477                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Existe diferença significativa entre as médias de atitude em relação à marca entre as propagandas apresentadas de forma Sustentável, Funcional e Simbólica, F(2,276) = 11,19, p < 0,05.

Fazendo uma análise de contraste (Tukey) para descobrir de onde vêm as diferenças

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

Fit: aov(formula = atitude.media ~ condicao.f, data = dt1)

$condicao.f
                            diff        lwr       upr     p adj
Funcional-Simbólico   0.08000752 -0.1614495 0.3214645 0.7151336
Sustentável-Simbólico 0.44434591  0.2080316 0.6806602 0.0000402
Sustentável-Funcional 0.36433839  0.1253283 0.6033485 0.0011275

Essa diferença estatisticamente significante é observada entre as condições Sustentável e Simbólica, e Sustentável e Funcional (p < 0,05). As condições Simbólica e Funcional não são significativamente diferentes entre si.

Visualizando esse efeito.

ggplot(data=descritiva_atitude, aes(x=descritiva_atitude[,2], y=mean)) +
  geom_bar(stat="identity", fill="darkgreen")+
  labs(title="Atitude Média por Condição Experimental", y="Atitude Média", x="Condições Experimentais")+
  coord_cartesian(ylim=c(1,7))

descritiva_autenticidade <- describeBy(dt1$autenticidade, dt1$condicao.f, digits = 2, mat = T)
rownames(descritiva_autenticidade) <- NULL
descritiva_autenticidade

anova_autenticidade <- aov(autenticidade ~ condicao.f, data = dt1)
summary(anova_autenticidade)
             Df Sum Sq Mean Sq F value Pr(>F)  
condicao.f    2   3.58  1.7899   3.469 0.0325 *
Residuals   276 142.39  0.5159                 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
TukeyHSD(anova_autenticidade)
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = autenticidade ~ condicao.f, data = dt1)

$condicao.f
                            diff           lwr       upr     p adj
Funcional-Simbólico   0.01624985 -0.2347285204 0.2672282 0.9872497
Sustentável-Simbólico 0.24539962 -0.0002332771 0.4910325 0.0502793
Sustentável-Funcional 0.22914977 -0.0192851678 0.4775847 0.0775715

O posicionamento de marca que é percebido como mais autêntico é o Sustentável, F(2,276) = 3,46, p = 0,0325.

Colocando em gráfico

ggplot(data=descritiva_autenticidade, aes(x=descritiva_autenticidade[,2], y=mean)) +
  geom_bar(stat="identity", fill="lightblue")+
  labs(title="Autenticidade Média por Condição Experimental", y="Autenticidade Média", x="Condições Experimentais")+
  coord_cartesian(ylim=c(1,7))

Fim do Tema 2

#Fim do Tema 2
LS0tCnRpdGxlOiAiU29sdcOnw6NvIHBhcmEgbyBUZW1hIDEgZSAyIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKYXV0aG9yOiAiTGVvbmFyZG8gTmljb2xhbyIKLS0tCgpFc3NhIMOpIGEgc29sdcOnw6NvIHBhcmEgbyBUZW1hIDEgZGUgTcOpdG9kb3MgRXhwZXJpbWVudGFpcyBkbyBQUEdBIC0gU2VtZXN0cmUgMjAyNC8xLCBQcm9mLiBMZW9uYXJkbyBOaWNvbGFvCgpQcmltZWlybyBwYXNzbywgaW1wb3J0YW5kbyBvcyBkYWRvcwoKYGBge3J9CnNldHdkKCJ+L01ldSBEcml2ZS9HRHJpdmUvVUZSR1MvRW5zaW5vLzIwMjMxL0FEUCAtIEV4cGVyaW1lbnRvcy9UZW1hcy9IVzEiKQpnZXR3ZCgpCgpsaWJyYXJ5KHJlYWRyKQpkdDEucmF3IDwtIHJlYWRfY3N2KCJkYWRvc19UQ0NfU29maWEuY3N2IiwgY29sX25hbWVzID0gRkFMU0UsIHNraXAgPSAzKQpub21lcy5iYXNlIDwtIHJlYWRfY3N2KCJkYWRvc19UQ0NfU29maWEuY3N2IiwgY29sX25hbWVzID0gRkFMU0UpWzEsXQoKbmFtZXMoZHQxLnJhdykgPC0gbm9tZXMuYmFzZQoKaGVhZChkdDEucmF3KQpgYGAKCkxpbXBhbmRvIG9zIGRhZG9zCgpgYGB7cn0KdGFibGUoZHQxLnJhdyRGaW5pc2hlZCkKbmFtZXMoZHQxLnJhdykKdGFibGUoZHQxLnJhdyRURVJNTykKCmR0MSA8LSBzdWJzZXQoZHQxLnJhdywgZHQxLnJhdyRGaW5pc2hlZCA9PSAxICYgZHQxLnJhdyRURVJNTyA9PSAxKQoKdGFibGUoZHQxJEZpbmlzaGVkKQoKbmFtZXMoZHQxKQpgYGAKCkRlZmluaW5kbyBhcyBjb25kacOnw7VlcwoKYGBge3J9CmR0MSRjb25kaWNhbyA8LSAiTGVvIgpkdDEkY29uZGljYW9bZHQxJEZMXzE1X0RPXzcwN19mdW5jaW9uYWw9PTFdIDwtIDAKZHQxJGNvbmRpY2FvW2R0MSRGTF8xNV9ET183MDdfc2ltYm9saWNvPT0xXSA8LSAtMQpkdDEkY29uZGljYW9bZHQxJEZMXzE1X0RPXzcwN19zdXN0ZW50YXZlbD09MV0gPC0gKzEKCnRhYmxlKGR0MSRjb25kaWNhbykKZHQxJGNvbmRpY2FvLmYgPC0gZmFjdG9yKGR0MSRjb25kaWNhbywgbGV2ZWxzID0gYygtMSwwLDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiU2ltYsOzbGljbyIsIkZ1bmNpb25hbCIsIlN1c3RlbnTDoXZlbCIpKQoKdGFibGUoZHQxJGNvbmRpY2FvLmYpCmxpYnJhcnkocXVlc3Rpb25yKQpmcmVxKGR0MSRjb25kaWNhby5mLCB0b3RhbCA9IFRSVUUsIHZhbGlkID0gRkFMU0UpCmBgYAoKR3LDoWZpY29zCgpgYGB7cn0KcmVxdWlyZShnZ3NjaSkKcmVxdWlyZShnZ3Bsb3QyKQpkdDEkZ2VuZXJvLmYgPC0gZmFjdG9yKGR0MSRHw6puZXJvLCBsZXZlbHMgPSBjKDEsMiwzKSwKICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJGZW1pbmlubyIsIk1hc2N1bGlubyIsIk7Do28gQmluw6FyaW8iKSkKCnQuZ2VuZXJvIDwtIGZyZXEoZHQxJGdlbmVyby5mLCBkaWdpdHMgPSAyLCBleGNsdWRlID0gTkEsIHRvdGFsID0gVCkKZ2dwbG90KHQuZ2VuZXJvWy00LF0sIGFlcyh4PSIiLCB5PWAlYCxmaWxsPXJvd25hbWVzKHQuZ2VuZXJvWy00LF0pLCBsYWJlbCA9IHJvdW5kKGAlYCwyKSkpKwogIGdlb21fYmFyKHdpZHRoID0gMSwgc3RhdCA9ICJpZGVudGl0eSIpKwogIGdlb21fdGV4dChwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSxzaXplID0gNSkrCiAgc2NhbGVfZmlsbF9ucGcoKSArCiAgbGFicyh4PU5VTEwsZmlsbD0iR8OqbmVybyIseT0iJSIsdGl0bGU9IkfDqm5lcm8gZG9zIFJlc3BvbmRlbnRlcyIpKwogIGNvb3JkX3BvbGFyKCJ5Iiwgc3RhcnQ9MCkKYGBgCgpJZGFkZSBkb3MgUmVzcG9uZGVudGVzCgpgYGB7cn0KbWVhbihkdDEkSWRhZGUsIG5hLnJtID0gVCkKc2QoZHQxJElkYWRlLCBuYS5ybSA9IFQpCgpsaWJyYXJ5KHBzeWNoKQpwc3ljaDo6ZGVzY3JpYmUoZHQxJElkYWRlKQoKZ2dwbG90KGR0MSwgYWVzKHg9SWRhZGUpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5PS4uZGVuc2l0eS4uKSxiaW53aWR0aCA9IDEsIGNvbG9yPSJncmV5IixmaWxsPSJncmV5IikrCiAgZ2VvbV9kZW5zaXR5KGFscGhhPS4yLCBmaWxsPSJncmVlbiIpKwogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQ9bWVhbihJZGFkZSxuYS5ybT1UKSksY29sb3I9ImJsdWUiLGxpbmV0eXBlPSJkYXNoZWQiLHNpemU9MSkrCiAgbGFicyh0aXRsZT0iSWRhZGUgZG9zIFJlc3BvbmRlbnRlcyIseT1OVUxMLHg9IklkYWRlIikKYGBgCgpSZW5kYSBkb3MgUGFydGljaXBhbnRlcwoKYGBge3J9CmR0MSRyZW5kYS5mIDwtIGZhY3RvcihkdDEkUmVuZGEsIGxldmVscyA9IHNlcSgxOjgpLAogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQXTDqSBSJCAxLjEwMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZSBSJCAxLjEwMSBhIFIkIDMuMzAwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlIFIkIDMuMzAxIGEgUiQgNi42MDAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGUgUiQgNi42MDEgYSBSJCA5LjkwMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZSBSJCA5LjkwMSBhIFIkIDEzLjIwMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZSBSJCAxMy4yMDEgYSBSJCAxNi41MDAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWNpbWEgZGUgUiQgMTYuNTAxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByZWZpcm8gbsOjbyBkaXplciIpKQoKdC5yZW5kYSA8LSBmcmVxKGR0MSRyZW5kYS5mLCB0b3RhbCA9IFQsIHZhbGlkID0gRiwgZGlnaXRzID0gMikKdC5yZW5kYQoKZ2dwbG90KGRhdGE9dC5yZW5kYVstOSxdLCBhZXMoeD1yb3duYW1lcyh0LnJlbmRhWy05LF0pLCB5PW4pKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBmaWxsPSJwdXJwbGUiKSsKICBsYWJzKHRpdGxlPSJSZW5kYSBkb3MgUmVzcG9uZGVudGVzIiwgeT0iTsO6bWVybyBkZSBSZXNwb3N0YXMiLCB4PSJGYWl4YXMgZGUgUmVuZGEiKSsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQpgYGAKCkF0aXR1ZGUgZW0gUmVsYcOnw6NvIMOgIE1hcmNhCgpgYGB7cn0KZHQxJGF0aXR1ZGUuZGYgPC0gZGF0YS5mcmFtZShkdDEkQXRpdHVkZV8xLGR0MSRBdGl0dWRlXzIsZHQxJEF0aXR1ZGVfMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdDEkQXRpdHVkZV80LGR0MSRBdGl0dWRlXzUsZHQxJEF0aXR1ZGVfNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdDEkQXRpdHVkZV83LGR0MSRBdGl0dWRlXzgsZHQxJEF0aXR1ZGVfOSkKCmR0MSRhdGl0dWRlLm1lZGlhIDwtIHJvd01lYW5zKGR0MSRhdGl0dWRlLmRmKQpwc3ljaDo6ZGVzY3JpYmUoZHQxJGF0aXR1ZGUubWVkaWEpCgpnZ3Bsb3QoZHQxLCBhZXMoeD1hdGl0dWRlLm1lZGlhKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeT0uLmRlbnNpdHkuLiksYmlud2lkdGggPSAxLCBjb2xvcj0iZ3JleSIsZmlsbD0iZ3JleSIpKwogIGdlb21fZGVuc2l0eShhbHBoYT0uMiwgZmlsbD0iY3lhbiIpKwogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQ9bWVhbihhdGl0dWRlLm1lZGlhLG5hLnJtPVQpKSxjb2xvcj0iYmx1ZSIsbGluZXR5cGU9ImRhc2hlZCIsc2l6ZT0xKSsKICBsYWJzKHRpdGxlPSJBdGl0dWRlIE3DqWRpYSBlbSBSZWxhw6fDo28gw6AgTWFyY2EiLHk9TlVMTCx4PSJBdGl0dWRlIikKYGBgCgojIyMgVGVtYSAyIC0gQW7DoWxpc2UgZGUgRGFkb3MKCkNyaWFuZG8gdW1hIHZhcmnDoXZlbCBjb21wb3N0YSBwYXJhIGF1dGVudGljaWRhZGUKCmBgYHtyfQpkdDEkYXV0ZW50aWNpZGFkZS5kZiA8LSBkYXRhLmZyYW1lKGR0MSRBdXRlbnRpY2lkYWRlXzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHQxJEF1dGVudGljaWRhZGVfMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdDEkQXV0ZW50aWNpZGFkZV8zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0MSRBdXRlbnRpY2lkYWRlXzQpCmR0MSRhdXRlbnRpY2lkYWRlIDwtIHJvd01lYW5zKGR0MSRhdXRlbnRpY2lkYWRlLmRmLCBuYS5ybSA9IFQpCgpnZ3Bsb3QoZHQxLCBhZXMoeD1hdXRlbnRpY2lkYWRlKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeT0uLmRlbnNpdHkuLiksYmlud2lkdGggPSAxLCBjb2xvcj0iZ3JleSIsZmlsbD0iZ3JleSIpKwogIGdlb21fZGVuc2l0eShhbHBoYT0uMiwgZmlsbD0ib3JhbmdlIikrCiAgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdD1tZWFuKGF1dGVudGljaWRhZGUsbmEucm09VCkpLGNvbG9yPSJyZWQiLGxpbmV0eXBlPSJkYXNoZWQiLHNpemU9MSkrCiAgbGFicyh0aXRsZT0iQXV0ZW50aWNpZGFkZSBkYSBNYXJjYSIseT1OVUxMLHg9IkF1dGVudGljaWRhZGUiKQpgYGAKClRlc3RhciBvIGVmZWl0byBleHBlcmltZW50YWwgbmEgYXRpdHVkZSBlbSByZWxhw6fDo28gw6AgbWFyY2EKCmBgYHtyfQpkZXNjcml0aXZhX2F0aXR1ZGUgPC0gZGVzY3JpYmVCeShkdDEkYXRpdHVkZS5tZWRpYSwgZHQxJGNvbmRpY2FvLmYsIGRpZ2l0cyA9IDIsIG1hdCA9IFQpCnJvd25hbWVzKGRlc2NyaXRpdmFfYXRpdHVkZSkgPC0gTlVMTApkZXNjcml0aXZhX2F0aXR1ZGUKCmFub3ZhX2F0aXR1ZGUgPC0gYW92KGF0aXR1ZGUubWVkaWEgfiBjb25kaWNhby5mLCBkYXRhID0gZHQxKQpzdW1tYXJ5KGFub3ZhX2F0aXR1ZGUpCmBgYAoKRXhpc3RlIGRpZmVyZW7Dp2Egc2lnbmlmaWNhdGl2YSBlbnRyZSBhcyBtw6lkaWFzIGRlIGF0aXR1ZGUgZW0gcmVsYcOnw6NvIMOgIG1hcmNhIGVudHJlIGFzIHByb3BhZ2FuZGFzIGFwcmVzZW50YWRhcyBkZSBmb3JtYSBTdXN0ZW50w6F2ZWwsIEZ1bmNpb25hbCBlIFNpbWLDs2xpY2EsIEYoMiwyNzYpID0gMTEsMTksIHAgXDwgMCwwNS4KCkZhemVuZG8gdW1hIGFuw6FsaXNlIGRlIGNvbnRyYXN0ZSAoVHVrZXkpIHBhcmEgZGVzY29icmlyIGRlIG9uZGUgdsOqbSBhcyBkaWZlcmVuw6dhcwoKYGBge3J9ClR1a2V5SFNEKGFub3ZhX2F0aXR1ZGUpCmBgYAoKRXNzYSBkaWZlcmVuw6dhIGVzdGF0aXN0aWNhbWVudGUgc2lnbmlmaWNhbnRlIMOpIG9ic2VydmFkYSBlbnRyZSBhcyBjb25kacOnw7VlcyBTdXN0ZW50w6F2ZWwgZSBTaW1iw7NsaWNhLCBlIFN1c3RlbnTDoXZlbCBlIEZ1bmNpb25hbCAocCBcPCAwLDA1KS4gQXMgY29uZGnDp8O1ZXMgU2ltYsOzbGljYSBlIEZ1bmNpb25hbCBuw6NvIHPDo28gc2lnbmlmaWNhdGl2YW1lbnRlIGRpZmVyZW50ZXMgZW50cmUgc2kuCgpWaXN1YWxpemFuZG8gZXNzZSBlZmVpdG8uCgpgYGB7cn0KZ2dwbG90KGRhdGE9ZGVzY3JpdGl2YV9hdGl0dWRlLCBhZXMoeD1kZXNjcml0aXZhX2F0aXR1ZGVbLDJdLCB5PW1lYW4pKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBmaWxsPSJkYXJrZ3JlZW4iKSsKICBsYWJzKHRpdGxlPSJBdGl0dWRlIE3DqWRpYSBwb3IgQ29uZGnDp8OjbyBFeHBlcmltZW50YWwiLCB5PSJBdGl0dWRlIE3DqWRpYSIsIHg9IkNvbmRpw6fDtWVzIEV4cGVyaW1lbnRhaXMiKSsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKDEsNykpCmBgYAoKYGBge3J9CmRlc2NyaXRpdmFfYXV0ZW50aWNpZGFkZSA8LSBkZXNjcmliZUJ5KGR0MSRhdXRlbnRpY2lkYWRlLCBkdDEkY29uZGljYW8uZiwgZGlnaXRzID0gMiwgbWF0ID0gVCkKcm93bmFtZXMoZGVzY3JpdGl2YV9hdXRlbnRpY2lkYWRlKSA8LSBOVUxMCmRlc2NyaXRpdmFfYXV0ZW50aWNpZGFkZQoKYW5vdmFfYXV0ZW50aWNpZGFkZSA8LSBhb3YoYXV0ZW50aWNpZGFkZSB+IGNvbmRpY2FvLmYsIGRhdGEgPSBkdDEpCnN1bW1hcnkoYW5vdmFfYXV0ZW50aWNpZGFkZSkKClR1a2V5SFNEKGFub3ZhX2F1dGVudGljaWRhZGUpCmBgYAoKTyBwb3NpY2lvbmFtZW50byBkZSBtYXJjYSBxdWUgw6kgcGVyY2ViaWRvIGNvbW8gbWFpcyBhdXTDqm50aWNvIMOpIG8gU3VzdGVudMOhdmVsLCBGKDIsMjc2KSA9IDMsNDYsIHAgPSAwLDAzMjUuCgpDb2xvY2FuZG8gZW0gZ3LDoWZpY28KCmBgYHtyfQpnZ3Bsb3QoZGF0YT1kZXNjcml0aXZhX2F1dGVudGljaWRhZGUsIGFlcyh4PWRlc2NyaXRpdmFfYXV0ZW50aWNpZGFkZVssMl0sIHk9bWVhbikpICsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIGZpbGw9ImxpZ2h0Ymx1ZSIpKwogIGxhYnModGl0bGU9IkF1dGVudGljaWRhZGUgTcOpZGlhIHBvciBDb25kacOnw6NvIEV4cGVyaW1lbnRhbCIsIHk9IkF1dGVudGljaWRhZGUgTcOpZGlhIiwgeD0iQ29uZGnDp8O1ZXMgRXhwZXJpbWVudGFpcyIpKwogIGNvb3JkX2NhcnRlc2lhbih5bGltPWMoMSw3KSkKYGBgCgpGaW0gZG8gVGVtYSAyCgpgYGB7cn0KI0ZpbSBkbyBUZW1hIDIKYGBgCg==