Tabulação e descrição de dados de um formulário hipotético

Formulário para entrevista População alvo: alunos matriculados na disciplina de Estatística


Perguntas


Identificação do formulário Qual é o seu sexo? Qual é a sua idade em anos completos? Qual é a sua altura em cm? Exerce atividade remunerada durante o dia? Qual é o percentual de bolsa ou auxílio que recebe para pagar a mensalidade? Em que curso de graduação se matriculou? Pretende fazer pós-graduação? Qual foi a sua conta de ano (rendimento do ano anterior)? Estou satisfeito com o curso de graduação? Tem interesse em participar voluntariamente de projetos de pesquisa na área acadêmica? Quantos irmão possui?


Variáveis


  1. idt
  2. sexo
  3. idade
  4. altura
  5. atividade
  6. percentual 7 curso
  7. posgrad
  8. rendimento
  9. satisfação
  10. pesquisa
  11. irmao

Tabulação


Variável Códigos observação

  1. idt; lançar o número da entrevista
  2. sexo; lançar 1 ou 2 1 = masculino; 2 = feminino
  3. idade; lançar a idade em anos completos
  4. altura; lançar a altura em cm
  5. atividade; lançar 1 ou 2 1= sim 2 = não
  6. percentual; lançar de 0 a 100 não colocar o simbolo %
  7. curso; lançar 1, 2, 3 ou 4 1 = Mecânica; 2 = Produção; 3 = Elétrica; 4 = Civil
  8. posgrad; lançar 1 ou 2 1= sim 2 = não
  9. rendimento; lançar de 0 a 10 nota da conta de ano
  10. satisfacao; lançar de 1 a 5 1 = discordo totalmente; 2 = discordo; 3 = indiferente ; 4 = concordo; 5 = Concordo totalmente
  11. pesquisa; lançar 1 ou 2 1= sim 2 = não
  12. irmao; lançar a quantidade de irmãos de 0 a n

library(readxl)
dados <- read_excel("dados.xlsx",sheet = "dados")
head(dados)

Recodificar algumas variáveis

Dica: Poderiam recodificar os dados no excel antes de ler os dados no R

dados$sexo <- factor(dados$sexo, levels = c("1","2"), labels=c("Masculino", "Feminino"))
# veja como ficou
head(dados)
# vamos recodificar as demais variáveis
dados$atividade <- factor(dados$atividade, levels = c("1","2"), labels=c("Sim", "Não"))
dados$curso <- factor(dados$curso, levels = c("1","2","3","4"), labels=c("Eng. Mecânica", "Eng. Produção", "Eng Elétrica", "Eng. Civil"))
dados$posgrad <- factor(dados$posgrad, levels = c("1","2"), labels=c("Sim", "Não"))
dados$satisfacao <- factor(dados$satisfacao, levels = c("1","2","3","4","5"), labels=c("discordo totalmente","discordo","indiferente","concordo","Concordo totalmente"))
dados$pesquisa <- factor(dados$pesquisa, levels = c("1","2"), labels=c("Sim", "Não"))
dados

Descrição dos dados

Variável aleatória qualitativa nominal: sexo; atividade; curso; posgrad; pesquisa

Variável aleatória qualitativa ordinal: satisfacao

Variável aleatória quantitativa discreta: irmao

Variável aleatória quantitativa contínua: idade; altura; percentual; rendimento

algumas contagens

# tabulação simples
table(dados$sexo)

Masculino  Feminino 
       25        25 
table(dados$atividade)

Sim Não 
 20  30 
table(dados$curso)

Eng. Mecânica Eng. Produção  Eng Elétrica    Eng. Civil 
            8            20            11            11 
table(dados$posgrad)

Sim Não 
 34  16 
table(dados$satisfacao)

discordo totalmente            discordo         indiferente            concordo 
                  2                   4                   3                  29 
Concordo totalmente 
                 12 
table(dados$pesquisa)

Sim Não 
 22  28 
table(dados$irmao)

 0  1  2  3 
33 12  2  3 
# algumas tabulações cruzadas
table(dados$sexo, dados$atividade)
           
            Sim Não
  Masculino   9  16
  Feminino   11  14
table(dados$sexo, dados$curso)
           
            Eng. Mecânica Eng. Produção Eng Elétrica Eng. Civil
  Masculino             3            10            6          6
  Feminino              5            10            5          5
table(dados$sexo, dados$satisfacao)
           
            discordo totalmente discordo indiferente concordo Concordo totalmente
  Masculino                   0        2           2       15                   6
  Feminino                    2        2           1       14                   6

Estatísticas Descritivas

summary(dados)
       id               sexo        idade           altura      atividade
 Min.   : 1.00   Masculino:25   Min.   :15.00   Min.   :123.0   Sim:20   
 1st Qu.:13.25   Feminino :25   1st Qu.:18.00   1st Qu.:153.0   Não:30   
 Median :25.50                  Median :18.00   Median :160.5            
 Mean   :25.50                  Mean   :19.26   Mean   :160.6            
 3rd Qu.:37.75                  3rd Qu.:19.75   3rd Qu.:169.5            
 Max.   :50.00                  Max.   :39.00   Max.   :190.0            
   percentual              curso    posgrad    rendimento                  satisfacao
 Min.   : 10.0   Eng. Mecânica: 8   Sim:34   Min.   :5.062   discordo totalmente: 2  
 1st Qu.: 10.0   Eng. Produção:20   Não:16   1st Qu.:6.334   discordo           : 4  
 Median : 10.0   Eng Elétrica :11            Median :7.034   indiferente        : 3  
 Mean   : 19.6   Eng. Civil   :11            Mean   :6.951   concordo           :29  
 3rd Qu.: 20.0                               3rd Qu.:7.440   Concordo totalmente:12  
 Max.   :100.0                               Max.   :9.225                           
 pesquisa     irmao    
 Sim:22   Min.   :0.0  
 Não:28   1st Qu.:0.0  
          Median :0.0  
          Mean   :0.5  
          3rd Qu.:1.0  
          Max.   :3.0  
library(psych)
#separar somente dados quntitativos
names(dados)
 [1] "id"         "sexo"       "idade"      "altura"     "atividade"  "percentual"
 [7] "curso"      "posgrad"    "rendimento" "satisfacao" "pesquisa"   "irmao"     
dados2 <- dados[,c(3,4,6,9,12)]
names(dados2)
[1] "idade"      "altura"     "percentual" "rendimento" "irmao"     
describe(dados2)
           vars  n   mean    sd median trimmed   mad    min    max range  skew kurtosis
idade         1 50  19.26  3.75  18.00   18.52  1.48  15.00  39.00 24.00  3.40    13.84
altura        2 50 160.56 13.92 160.50  160.88 11.86 123.00 190.00 67.00 -0.24     0.24
percentual    3 50  19.60 16.41  10.00   15.75  0.00  10.00 100.00 90.00  2.78     9.55
rendimento    4 50   6.95  0.95   7.03    6.94  0.79   5.06   9.22  4.16  0.06    -0.11
irmao         5 50   0.50  0.84   0.00    0.30  0.00   0.00   3.00  3.00  1.73     2.25
             se
idade      0.53
altura     1.97
percentual 2.32
rendimento 0.13
irmao      0.12

alguns gráficos simples

library(ggplot2)
Need help? Try the ggplot2 mailing list:
http://groups.google.com/group/ggplot2.

Attaching package: 㤼㸱ggplot2㤼㸲

The following objects are masked from 㤼㸱package:psych㤼㸲:

    %+%, alpha
library(dplyr)

Attaching package: 㤼㸱dplyr㤼㸲

The following objects are masked from 㤼㸱package:stats㤼㸲:

    filter, lag

The following objects are masked from 㤼㸱package:base㤼㸲:

    intersect, setdiff, setequal, union
library(RColorBrewer)

Tabulando e criando gráficos para representar as variáveis qualitativas

vamos usar o pacote dplyer. Cada operação é marcada pelo símbolo %>% (pipe) Na sequência empregamos o pagote ggplot2

g1 <- dados %>% count(sexo)
g1
graf <- ggplot(g1, aes(x=sexo, y=n))
graf +  
  geom_bar(stat="identity", fill = "steelblue", width = .3) +
  geom_text(aes(label=n), vjust=1.5, colour="black",position=position_dodge(.9), size=3) +
  scale_fill_brewer(palette="Dark2") +
  labs(title = "Gráfico de colunas", x = "Variável", y = "Frequência")+
  theme_light()

g1 <- dados %>% count(sexo, atividade)
g1
graf <- ggplot(g1, aes(x=sexo, y=n, fill=atividade))
graf +  
  geom_bar(stat="identity", width = .3,position=position_dodge()) +
  geom_text(aes(label=n), vjust=1.5, colour="black",position=position_dodge(.9), size=3) +
  scale_fill_brewer(palette="Dark2") +
  labs(title = "Gráfico de colunas: Sexo x Atividade remunerada", x = "Variável", y = "Frequência")+
  theme_light()

g1 <- dados %>% count(sexo, atividade)
g1
graf <- ggplot(g1, aes(x="", y=n, fill=atividade))
graf +  
  geom_bar(stat="identity") +
  scale_fill_brewer(palette="Dark2") +
  labs(title = "Gráfico de Setor: Atividade remunerada", x = "", y = "")+
  theme_light()+
  coord_polar("y", start=0)

# temos que transformar a variável irmão em uma variável qualitativa para representá-la como categorias  
g1 <- dados %>% count(sexo, irmao) %>% mutate(irmao, irmao =as.factor(irmao))
g1
graf <- ggplot(g1, aes(x=sexo, y=n, fill=irmao))
graf +  
  geom_bar(stat="identity", width = .3,position=position_dodge()) +
  scale_fill_brewer(palette="Dark2") +
  labs(title = "Gráfico de colunas: Sexo x Número de irmãos", x = "Variável", y = "Frequência")+
  theme_light()

# boxplot (algumas possibilidades....)
e <- ggplot(dados, aes(x = sexo, y = rendimento))
# Basic box plot
e + geom_boxplot() + theme_light()

# Rotate the box plot
e + geom_boxplot() + coord_flip() + theme_light()

# Notched box plot
e + geom_boxplot(notch = TRUE) + theme_light()

# Box plot with mean points
e + geom_boxplot() +
stat_summary(fun.y = mean, geom = "point",
shape = 18, size = 4, color = "blue") + theme_light()

# com cores
# Basic box plot
# Basic box plot
e2 <- e + geom_boxplot(aes(fill=sexo)) + theme_light()  
e2 + scale_fill_brewer(palette="Set1")

e2 + scale_fill_brewer(palette="Set2")

e2 + scale_fill_brewer(palette="Set3")

# escolha as cores digitando ?scale_fill_brewer()
# gráfico de pontos
e <- ggplot(dados, aes(x = sexo, y = rendimento))
e + geom_dotplot(binaxis = "y", stackdir = "center", stackratio = 1.5, dotsize = 1.1)

e + geom_boxplot() +
  geom_dotplot(binaxis = "y", stackdir = "center", stackratio = 1.5, dotsize = 1.1) + theme_light() 

e + geom_boxplot(aes(fill=sexo)) +
  geom_dotplot(binaxis = "y", stackdir = "center", stackratio = 1.5, dotsize = 1.1) + theme_light()

e + geom_boxplot() +
  geom_dotplot(aes(fill = sexo), binaxis = "y", stackdir = "center", stackratio = 1.5, dotsize = 1.1) + theme_light() 

e2 <- ggplot(dados, aes(x = curso, y = rendimento))
e2 + geom_boxplot() +
  geom_dotplot(aes(fill = sexo), binaxis = "y", stackdir = "center", stackratio = 1.5, dotsize = 1.1) + theme_light() 

# variação do boxplot (violin plot)
e2 + geom_violin(trim = FALSE) + geom_jitter(position = position_jitter(0.2)) + theme_light() 

# diagrama de dispersão (scatter plot) 
f <- ggplot(dados, aes(x = percentual, y = rendimento))
f + geom_point(color = "blue", size = 2)

f + geom_jitter(position = position_jitter(width = 0.5, height = 0.5), size=2, color="blue")

f + geom_point(aes(shape = sexo, color = sexo), size = 2)

LS0tDQp0aXRsZTogIkPDk0RJR09TIMOaVEVJUyBFTSBSIC0gRGVzY3Jpw6fDo28gZGUgZGFkb3MgZGUgdW0gRm9ybXVsw6FyaW8iDQphdXRob3I6ICJQcm9mLiBEci4gTGVvbmksIFIuIEMuIg0KZW1haWw6ICJyY2xlb25pQHlhaG9vLmNvbS5iciINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMjIFRhYnVsYcOnw6NvIGUgZGVzY3Jpw6fDo28gZGUgZGFkb3MgZGUgdW0gZm9ybXVsw6FyaW8gaGlwb3TDqXRpY28NCg0KPiBGb3JtdWzDoXJpbyBwYXJhIGVudHJldmlzdGENCipQb3B1bGHDp8OjbyBhbHZvOiBhbHVub3MgbWF0cmljdWxhZG9zIG5hIGRpc2NpcGxpbmEgZGUgRXN0YXTDrXN0aWNhKiANCg0KLS0tDQoNCiMjIyAqKlBlcmd1bnRhcyoqDQoNCi0tLQ0KDQo+IElkZW50aWZpY2HDp8OjbyBkbyBmb3JtdWzDoXJpbw0KUXVhbCDDqSBvIHNldSBzZXhvPw0KUXVhbCDDqSBhIHN1YSBpZGFkZSBlbSBhbm9zIGNvbXBsZXRvcz8NClF1YWwgw6kgYSBzdWEgYWx0dXJhIGVtIGNtPw0KRXhlcmNlIGF0aXZpZGFkZSByZW11bmVyYWRhIGR1cmFudGUgbyBkaWE/DQpRdWFsIMOpIG8gcGVyY2VudHVhbCBkZSAgYm9sc2Egb3UgYXV4w61saW8gcXVlIHJlY2ViZSBwYXJhIHBhZ2FyIGEgbWVuc2FsaWRhZGU/DQpFbSBxdWUgY3Vyc28gZGUgZ3JhZHVhw6fDo28gc2UgbWF0cmljdWxvdT8NClByZXRlbmRlIGZhemVyIHDDs3MtZ3JhZHVhw6fDo28/DQpRdWFsIGZvaSBhIHN1YSBjb250YSBkZSBhbm8gKHJlbmRpbWVudG8gZG8gYW5vIGFudGVyaW9yKT8NCkVzdG91IHNhdGlzZmVpdG8gY29tIG8gY3Vyc28gZGUgZ3JhZHVhw6fDo28/DQpUZW0gaW50ZXJlc3NlIGVtIHBhcnRpY2lwYXIgdm9sdW50YXJpYW1lbnRlIGRlIHByb2pldG9zIGRlIHBlc3F1aXNhIG5hIMOhcmVhIGFjYWTDqm1pY2E/IA0KUXVhbnRvcyBpcm3Do28gcG9zc3VpPw0KDQotLS0NCg0KIyMjICAqKlZhcmnDoXZlaXMqKg0KDQotLS0NCg0KMS4gaWR0DQoyLiBzZXhvDQozLiBpZGFkZQ0KNC4gYWx0dXJhDQo1LiBhdGl2aWRhZGUNCjYuIHBlcmNlbnR1YWwNCjcgY3Vyc28NCjguIHBvc2dyYWQNCjkuIHJlbmRpbWVudG8NCjEwLiBzYXRpc2Zhw6fDo28NCjExLiBwZXNxdWlzYQ0KMTIuIGlybWFvDQoNCi0tLQ0KDQojIyMgKipUYWJ1bGHDp8OjbyoqDQoNCi0tLQ0KDQo+IFZhcmnDoXZlbAlDw7NkaWdvcwlvYnNlcnZhw6fDo28NCg0KMS4gaWR0OwlsYW7Dp2FyIG8gbsO6bWVybyBkYSBlbnRyZXZpc3RhCQ0KMi4gc2V4bzsJbGFuw6dhciAxIG91IDIJMSA9IG1hc2N1bGlubzsgMiA9IGZlbWluaW5vDQozLiBpZGFkZTsJbGFuw6dhciBhIGlkYWRlCWVtIGFub3MgY29tcGxldG9zDQo0LiBhbHR1cmE7CWxhbsOnYXIgYSBhbHR1cmEJZW0gY20NCjUuIGF0aXZpZGFkZTsJbGFuw6dhciAxIG91IDIJMT0gc2ltIDIgPSBuw6NvDQo2LiBwZXJjZW50dWFsOwlsYW7Dp2FyIGRlIDAgYSAxMDAJbsOjbyBjb2xvY2FyIG8gc2ltYm9sbyAlDQo3LiBjdXJzbzsJbGFuw6dhciAxLCAyLCAzIG91IDQJMSA9IE1lY8OibmljYTsgMiA9IFByb2R1w6fDo287IDMgPSBFbMOpdHJpY2E7IDQgPSBDaXZpbA0KOC4gcG9zZ3JhZDsJbGFuw6dhciAxIG91IDIJMT0gc2ltIDIgPSBuw6NvDQo5LiByZW5kaW1lbnRvOwlsYW7Dp2FyIGRlIDAgYSAxMAlub3RhIGRhIGNvbnRhIGRlIGFubyANCjEwLiBzYXRpc2ZhY2FvOwlsYW7Dp2FyIGRlIDEgYSA1CTEgPSBkaXNjb3JkbyB0b3RhbG1lbnRlOyAyID0gZGlzY29yZG87ICAzID0gaW5kaWZlcmVudGUgOyA0ID0gY29uY29yZG87ICA1ID0gQ29uY29yZG8gdG90YWxtZW50ZQ0KMTEuIHBlc3F1aXNhOwlsYW7Dp2FyIDEgb3UgMgkxPSBzaW0gMiA9IG7Do28NCjEyLiBpcm1hbzsgbGFuw6dhciBhIHF1YW50aWRhZGUgZGUgaXJtw6NvcyBkZSAwIGEgbiANCg0KLS0tDQoNCmBgYHtyfQ0KbGlicmFyeShyZWFkeGwpDQpkYWRvcyA8LSByZWFkX2V4Y2VsKCJkYWRvcy54bHN4IixzaGVldCA9ICJkYWRvcyIpDQpoZWFkKGRhZG9zKQ0KYGBgDQoNCiMjIyBSZWNvZGlmaWNhciBhbGd1bWFzIHZhcmnDoXZlaXMNCj4gRGljYTogUG9kZXJpYW0gcmVjb2RpZmljYXIgb3MgZGFkb3Mgbm8gZXhjZWwgYW50ZXMgZGUgbGVyIG9zIGRhZG9zIG5vIFINCg0KYGBge3J9DQoNCmRhZG9zJHNleG8gPC0gZmFjdG9yKGRhZG9zJHNleG8sIGxldmVscyA9IGMoIjEiLCIyIiksIGxhYmVscz1jKCJNYXNjdWxpbm8iLCAiRmVtaW5pbm8iKSkNCiMgdmVqYSBjb21vIGZpY291DQpoZWFkKGRhZG9zKQ0KIyB2YW1vcyByZWNvZGlmaWNhciBhcyBkZW1haXMgdmFyacOhdmVpcw0KZGFkb3MkYXRpdmlkYWRlIDwtIGZhY3RvcihkYWRvcyRhdGl2aWRhZGUsIGxldmVscyA9IGMoIjEiLCIyIiksIGxhYmVscz1jKCJTaW0iLCAiTsOjbyIpKQ0KDQpkYWRvcyRjdXJzbyA8LSBmYWN0b3IoZGFkb3MkY3Vyc28sIGxldmVscyA9IGMoIjEiLCIyIiwiMyIsIjQiKSwgbGFiZWxzPWMoIkVuZy4gTWVjw6JuaWNhIiwgIkVuZy4gUHJvZHXDp8OjbyIsICJFbmcgRWzDqXRyaWNhIiwgIkVuZy4gQ2l2aWwiKSkNCg0KZGFkb3MkcG9zZ3JhZCA8LSBmYWN0b3IoZGFkb3MkcG9zZ3JhZCwgbGV2ZWxzID0gYygiMSIsIjIiKSwgbGFiZWxzPWMoIlNpbSIsICJOw6NvIikpDQoNCmRhZG9zJHNhdGlzZmFjYW8gPC0gZmFjdG9yKGRhZG9zJHNhdGlzZmFjYW8sIGxldmVscyA9IGMoIjEiLCIyIiwiMyIsIjQiLCI1IiksIGxhYmVscz1jKCJkaXNjb3JkbyB0b3RhbG1lbnRlIiwiZGlzY29yZG8iLCJpbmRpZmVyZW50ZSIsImNvbmNvcmRvIiwiQ29uY29yZG8gdG90YWxtZW50ZSIpKQ0KDQpkYWRvcyRwZXNxdWlzYSA8LSBmYWN0b3IoZGFkb3MkcGVzcXVpc2EsIGxldmVscyA9IGMoIjEiLCIyIiksIGxhYmVscz1jKCJTaW0iLCAiTsOjbyIpKQ0KDQpkYWRvcw0KYGBgDQoNCiMjIyBEZXNjcmnDp8OjbyBkb3MgZGFkb3MNCg0KPiBWYXJpw6F2ZWwgYWxlYXTDs3JpYSBxdWFsaXRhdGl2YSBub21pbmFsOg0KKipzZXhvOyBhdGl2aWRhZGU7IGN1cnNvOyBwb3NncmFkOyBwZXNxdWlzYSoqDQoNCj4gVmFyacOhdmVsIGFsZWF0w7NyaWEgcXVhbGl0YXRpdmEgb3JkaW5hbDoNCioqc2F0aXNmYWNhbyoqDQoNCj4gVmFyacOhdmVsIGFsZWF0w7NyaWEgcXVhbnRpdGF0aXZhIGRpc2NyZXRhOg0KKippcm1hbyoqDQoNCj4gVmFyacOhdmVsIGFsZWF0w7NyaWEgcXVhbnRpdGF0aXZhIGNvbnTDrW51YToNCioqaWRhZGU7IGFsdHVyYTsgcGVyY2VudHVhbDsgcmVuZGltZW50byoqDQoNCiMjIyBhbGd1bWFzIGNvbnRhZ2Vucw0KDQpgYGB7cn0NCiMgdGFidWxhw6fDo28gc2ltcGxlcw0KdGFibGUoZGFkb3Mkc2V4bykNCnRhYmxlKGRhZG9zJGF0aXZpZGFkZSkNCnRhYmxlKGRhZG9zJGN1cnNvKQ0KdGFibGUoZGFkb3MkcG9zZ3JhZCkNCnRhYmxlKGRhZG9zJHNhdGlzZmFjYW8pDQp0YWJsZShkYWRvcyRwZXNxdWlzYSkNCnRhYmxlKGRhZG9zJGlybWFvKQ0KDQojIGFsZ3VtYXMgdGFidWxhw6fDtWVzIGNydXphZGFzDQp0YWJsZShkYWRvcyRzZXhvLCBkYWRvcyRhdGl2aWRhZGUpDQp0YWJsZShkYWRvcyRzZXhvLCBkYWRvcyRjdXJzbykNCnRhYmxlKGRhZG9zJHNleG8sIGRhZG9zJHNhdGlzZmFjYW8pDQpgYGANCg0KIyMjIEVzdGF0w61zdGljYXMgRGVzY3JpdGl2YXMNCg0KYGBge3J9DQpzdW1tYXJ5KGRhZG9zKQ0KDQoNCmxpYnJhcnkocHN5Y2gpDQoNCiNzZXBhcmFyIHNvbWVudGUgZGFkb3MgcXVudGl0YXRpdm9zDQpuYW1lcyhkYWRvcykNCmRhZG9zMiA8LSBkYWRvc1ssYygzLDQsNiw5LDEyKV0NCg0KbmFtZXMoZGFkb3MyKQ0KZGVzY3JpYmUoZGFkb3MyKQ0KDQoNCmBgYA0KDQoNCg0KDQojIyMgYWxndW5zIGdyw6FmaWNvcyBzaW1wbGVzDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoUkNvbG9yQnJld2VyKQ0KYGBgDQoNCiMjIyBUYWJ1bGFuZG8gZSBjcmlhbmRvIGdyw6FmaWNvcyBwYXJhIHJlcHJlc2VudGFyIGFzIHZhcmnDoXZlaXMgcXVhbGl0YXRpdmFzDQo+IHZhbW9zIHVzYXIgbyBwYWNvdGUgZHBseWVyLiBDYWRhIG9wZXJhw6fDo28gw6kgbWFyY2FkYSBwZWxvIHPDrW1ib2xvICAlPiUgKHBpcGUpDQo+IE5hIHNlcXXDqm5jaWEgZW1wcmVnYW1vcyBvIHBhZ290ZSBnZ3Bsb3QyDQoNCmBgYHtyfQ0KZzEgPC0gZGFkb3MgJT4lIGNvdW50KHNleG8pDQpnMQ0KDQpncmFmIDwtIGdncGxvdChnMSwgYWVzKHg9c2V4bywgeT1uKSkNCmdyYWYgKyAgDQogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgZmlsbCA9ICJzdGVlbGJsdWUiLCB3aWR0aCA9IC4zKSArDQogIGdlb21fdGV4dChhZXMobGFiZWw9biksIHZqdXN0PTEuNSwgY29sb3VyPSJibGFjayIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjkpLCBzaXplPTMpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iRGFyazIiKSArDQogIGxhYnModGl0bGUgPSAiR3LDoWZpY28gZGUgY29sdW5hcyIsIHggPSAiVmFyacOhdmVsIiwgeSA9ICJGcmVxdcOqbmNpYSIpKw0KICB0aGVtZV9saWdodCgpDQpgYGANCg0KYGBge3J9DQpnMSA8LSBkYWRvcyAlPiUgY291bnQoc2V4bywgYXRpdmlkYWRlKQ0KZzENCg0KZ3JhZiA8LSBnZ3Bsb3QoZzEsIGFlcyh4PXNleG8sIHk9biwgZmlsbD1hdGl2aWRhZGUpKQ0KZ3JhZiArICANCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCB3aWR0aCA9IC4zLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKCkpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1uKSwgdmp1c3Q9MS41LCBjb2xvdXI9ImJsYWNrIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSguOSksIHNpemU9MykgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJEYXJrMiIpICsNCiAgbGFicyh0aXRsZSA9ICJHcsOhZmljbyBkZSBjb2x1bmFzOiBTZXhvIHggQXRpdmlkYWRlIHJlbXVuZXJhZGEiLCB4ID0gIlZhcmnDoXZlbCIsIHkgPSAiRnJlcXXDqm5jaWEiKSsNCiAgdGhlbWVfbGlnaHQoKQ0KDQoNCmBgYA0KDQpgYGB7cn0NCmcxIDwtIGRhZG9zICU+JSBjb3VudChzZXhvLCBhdGl2aWRhZGUpDQpnMQ0KDQpncmFmIDwtIGdncGxvdChnMSwgYWVzKHg9IiIsIHk9biwgZmlsbD1hdGl2aWRhZGUpKQ0KZ3JhZiArICANCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9IkRhcmsyIikgKw0KICBsYWJzKHRpdGxlID0gIkdyw6FmaWNvIGRlIFNldG9yOiBBdGl2aWRhZGUgcmVtdW5lcmFkYSIsIHggPSAiIiwgeSA9ICIiKSsNCiAgdGhlbWVfbGlnaHQoKSsNCiAgY29vcmRfcG9sYXIoInkiLCBzdGFydD0wKQ0KYGBgDQpgYGB7cn0NCiMgdGVtb3MgcXVlIHRyYW5zZm9ybWFyIGEgdmFyacOhdmVsIGlybcOjbyBlbSB1bWEgdmFyacOhdmVsIHF1YWxpdGF0aXZhIHBhcmEgcmVwcmVzZW50w6EtbGEgY29tbyBjYXRlZ29yaWFzICANCmcxIDwtIGRhZG9zICU+JSBjb3VudChzZXhvLCBpcm1hbykgJT4lIG11dGF0ZShpcm1hbywgaXJtYW8gPWFzLmZhY3Rvcihpcm1hbykpDQpnMQ0KDQpncmFmIDwtIGdncGxvdChnMSwgYWVzKHg9c2V4bywgeT1uLCBmaWxsPWlybWFvKSkNCmdyYWYgKyAgDQogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5Iiwgd2lkdGggPSAuMyxwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9IkRhcmsyIikgKw0KICBsYWJzKHRpdGxlID0gIkdyw6FmaWNvIGRlIGNvbHVuYXM6IFNleG8geCBOw7ptZXJvIGRlIGlybcOjb3MiLCB4ID0gIlZhcmnDoXZlbCIsIHkgPSAiRnJlcXXDqm5jaWEiKSsNCiAgdGhlbWVfbGlnaHQoKQ0KYGBgDQoNCmBgYHtyfQ0KIyBib3hwbG90IChhbGd1bWFzIHBvc3NpYmlsaWRhZGVzLi4uLikNCg0KZSA8LSBnZ3Bsb3QoZGFkb3MsIGFlcyh4ID0gc2V4bywgeSA9IHJlbmRpbWVudG8pKQ0KIyBCYXNpYyBib3ggcGxvdA0KZSArIGdlb21fYm94cGxvdCgpICsgdGhlbWVfbGlnaHQoKQ0KIyBSb3RhdGUgdGhlIGJveCBwbG90DQplICsgZ2VvbV9ib3hwbG90KCkgKyBjb29yZF9mbGlwKCkgKyB0aGVtZV9saWdodCgpDQojIE5vdGNoZWQgYm94IHBsb3QNCmUgKyBnZW9tX2JveHBsb3Qobm90Y2ggPSBUUlVFKSArIHRoZW1lX2xpZ2h0KCkNCiMgQm94IHBsb3Qgd2l0aCBtZWFuIHBvaW50cw0KZSArIGdlb21fYm94cGxvdCgpICsNCnN0YXRfc3VtbWFyeShmdW4ueSA9IG1lYW4sIGdlb20gPSAicG9pbnQiLA0Kc2hhcGUgPSAxOCwgc2l6ZSA9IDQsIGNvbG9yID0gImJsdWUiKSArIHRoZW1lX2xpZ2h0KCkNCg0KIyBjb20gY29yZXMNCiMgQmFzaWMgYm94IHBsb3QNCiMgQmFzaWMgYm94IHBsb3QNCmUyIDwtIGUgKyBnZW9tX2JveHBsb3QoYWVzKGZpbGw9c2V4bykpICsgdGhlbWVfbGlnaHQoKSAgDQplMiArIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9IlNldDEiKQ0KZTIgKyBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJTZXQyIikNCmUyICsgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iU2V0MyIpDQojIGVzY29saGEgYXMgY29yZXMgZGlnaXRhbmRvID9zY2FsZV9maWxsX2JyZXdlcigpDQpgYGANCg0KDQoNCmBgYHtyfQ0KIyBncsOhZmljbyBkZSBwb250b3MNCmUgPC0gZ2dwbG90KGRhZG9zLCBhZXMoeCA9IHNleG8sIHkgPSByZW5kaW1lbnRvKSkNCg0KZSArIGdlb21fZG90cGxvdChiaW5heGlzID0gInkiLCBzdGFja2RpciA9ICJjZW50ZXIiLCBzdGFja3JhdGlvID0gMS41LCBkb3RzaXplID0gMS4xKQ0KDQplICsgZ2VvbV9ib3hwbG90KCkgKw0KICBnZW9tX2RvdHBsb3QoYmluYXhpcyA9ICJ5Iiwgc3RhY2tkaXIgPSAiY2VudGVyIiwgc3RhY2tyYXRpbyA9IDEuNSwgZG90c2l6ZSA9IDEuMSkgKyB0aGVtZV9saWdodCgpIA0KDQplICsgZ2VvbV9ib3hwbG90KGFlcyhmaWxsPXNleG8pKSArDQogIGdlb21fZG90cGxvdChiaW5heGlzID0gInkiLCBzdGFja2RpciA9ICJjZW50ZXIiLCBzdGFja3JhdGlvID0gMS41LCBkb3RzaXplID0gMS4xKSArIHRoZW1lX2xpZ2h0KCkNCg0KZSArIGdlb21fYm94cGxvdCgpICsNCiAgZ2VvbV9kb3RwbG90KGFlcyhmaWxsID0gc2V4byksIGJpbmF4aXMgPSAieSIsIHN0YWNrZGlyID0gImNlbnRlciIsIHN0YWNrcmF0aW8gPSAxLjUsIGRvdHNpemUgPSAxLjEpICsgdGhlbWVfbGlnaHQoKSANCg0KDQplMiA8LSBnZ3Bsb3QoZGFkb3MsIGFlcyh4ID0gY3Vyc28sIHkgPSByZW5kaW1lbnRvKSkNCg0KZTIgKyBnZW9tX2JveHBsb3QoKSArDQogIGdlb21fZG90cGxvdChhZXMoZmlsbCA9IHNleG8pLCBiaW5heGlzID0gInkiLCBzdGFja2RpciA9ICJjZW50ZXIiLCBzdGFja3JhdGlvID0gMS41LCBkb3RzaXplID0gMS4xKSArIHRoZW1lX2xpZ2h0KCkgDQoNCiMgdmFyaWHDp8OjbyBkbyBib3hwbG90ICh2aW9saW4gcGxvdCkNCmUyICsgZ2VvbV92aW9saW4odHJpbSA9IEZBTFNFKSArIGdlb21faml0dGVyKHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKDAuMikpICsgdGhlbWVfbGlnaHQoKSANCg0KDQoNCg0KYGBgDQoNCmBgYHtyfQ0KIyBkaWFncmFtYSBkZSBkaXNwZXJzw6NvIChzY2F0dGVyIHBsb3QpIA0KDQpmIDwtIGdncGxvdChkYWRvcywgYWVzKHggPSBwZXJjZW50dWFsLCB5ID0gcmVuZGltZW50bykpDQoNCmYgKyBnZW9tX3BvaW50KGNvbG9yID0gImJsdWUiLCBzaXplID0gMikNCg0KZiArIGdlb21faml0dGVyKHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHdpZHRoID0gMC41LCBoZWlnaHQgPSAwLjUpLCBzaXplPTIsIGNvbG9yPSJibHVlIikNCg0KZiArIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gc2V4bywgY29sb3IgPSBzZXhvKSwgc2l6ZSA9IDIpDQpgYGANCg0K