Luis Anunciação, Lucas Barrozo

last updated: 16 July, 2021

1 Load packages

pacman::p_load(knitr,
               kableExtra,
               tidyverse,
               janitor,
               summarytools,
               DataExplorer,
               readxl)

2 import database: T1

ds_original_t1 <- read_csv("C:/Users/luisf/Dropbox/Puc-Rio/Projeto - COVID longitudinal/COVID-19 (respostas) - Respostas ao formulário 1.csv")
Duplicated column names deduplicated: 'Sexo' => 'Sexo_1' [137], 'Idade (em anos):' => 'Idade (em anos):_1' [138], 'Sua escolaridade:' => 'Sua escolaridade:_1' [139], 'Estado civil' => 'Estado civil_1' [140], 'O estado que voc攼㹡 mora 攼㸹:' => 'O estado que voc攼㹡 mora 攼㸹:_1' [141], 'A cidade que voc攼㹡 mora 攼㸹?' => 'A cidade que voc攼㹡 mora 攼㸹?_1' [142], 'Quantos filhos voc攼㹡 tem?' => 'Quantos filhos voc攼㹡 tem?_1' [143], 'Voc攼㹡 tem plano de sa昼㹡de?' => 'Voc攼㹡 tem plano de sa昼㹡de?_1' [144], 'Qual das seguintes alternativas melhor descrevem sua situa攼㸷攼㸳o no momento?' => 'Qual das seguintes alternativas melhor descrevem sua situa攼㸷攼㸳o no momento?_1' [145], 'Quantas pessoas, contando com voc攼㹡, moram em sua casa?' => 'Quantas pessoas, contando com voc攼㹡, moram em sua casa?_1' [146], 'Em rela攼㸷攼㸳o 攼㸰 sua renda familiar mensal, ou seja, a renda das pessoas moradoras da mesma casa.' => 'Em rela攼㸷攼㸳o 攼㸰 sua renda familiar mensal, ou seja, a renda das pessoas moradoras da mesma casa._1' [147], 'Quantas pessoas do grupo de risco moram contigo? (ex: pesosas com 60 anos ou mais, portadores de doen攼㸷as card攼㹤acas, hipertens攼㸳o, diabetes, etc)' => 'Quantas pessoas do grupo de risco moram contigo? (ex: pesosas com 60 anos ou mais, portadores de doen攼㸷as card攼㹤acas, hipertens攼㸳o, diabetes, etc)_1' [148], 'N昼㸳s sabemos que quest昼㸵es pol攼㹤ticas s攼㸳o densas e merecem uma especial aten攼㸷攼㸳o. No entanto,  em rela攼㸷攼㸳o 攼㸰 orienta攼㸷攼㸳o pol攼㹤tica, eu me considero:' => 'N昼㸳s sabemos que quest昼㸵es pol攼㹤ticas s攼㸳o densas e merecem uma especial aten攼㸷攼㸳o. No entanto,  em rela攼㸷攼㸳o 攼㸰 orienta攼㸷攼㸳o pol攼㹤tica, eu me considero:_1' [149], 'No futuro, podemos te contactar para saber sobre sua sa昼㹡de? Se sim, qual 攼㸹 seu e-mail?' => 'No futuro, podemos te contactar para saber sobre sua sa昼㹡de? Se sim, qual 攼㸹 seu e-mail?_1' [150]
-- Column specification ---------------------------------------------------------------------------------------------------------------------------------------------------------------
cols(
  .default = col_character(),
  `Idade (em anos):` = col_double(),
  `Idade (em anos):_1` = col_double(),
  `Quantas pessoas, contando com voc攼㹡, moram em sua casa?_1` = col_double()
)
i Use `spec()` for the full column specifications.
backup_ds_t1 <- ds_original_t1

2.1 Clean

modificar nomes

ds_original_t1 <- clean_names(ds_original_t1)

Remove columns and rows with all missing

ds_original_t1 <- janitor::remove_empty(ds_original_t1, c("rows", "cols")) #useless here

3 Fix to match T1

3.1 Fix T1

3.1.1 email

Nome

ds_original_t1 <- ds_original_t1 %>% 
  rename(email = no_futuro_podemos_te_contactar_para_saber_sobre_sua_saude_se_sim_qual_e_seu_e_mail)

Formato do email

ds_original_t1 <- ds_original_t1 %>% 
  mutate(email_corrigido = tolower(email))

ds_original_t1 <- ds_original_t1 %>%
  mutate(email_corrigido = stringi::stri_trans_general(email_corrigido,"Latin-ASCII"))
ds_original_t1 %>% 
  count(email_corrigido) %>% 
  arrange(email_corrigido)

Alterar o e-mail deixando apenas os válidos

ds_original_t1 <- ds_original_t1 %>% 
  mutate(email_corrigido2 = stringr::str_extract(email_corrigido, '@')) %>% #controle
  mutate(email_valido = if_else(email_corrigido2 == "@",1,0)) %>%  #controle
  mutate(email_corrigido = if_else(email_valido == 1, email_corrigido, NA_character_)) %>% 
  select(-email_corrigido2, -email_valido)

Tirar caracteres invalidos e respostas invalidas (sim, -)

ds_original_t1 <- ds_original_t1 %>% 
  mutate(email_corrigido = str_remove_all(email_corrigido, "^sim -")) %>% 
  mutate(email_corrigido = str_remove_all(email_corrigido, "^sim,")) %>% 
  mutate(email_corrigido = str_remove_all(email_corrigido, "^sim.")) 

Tirar espaços

ds_original_t1 <- ds_original_t1 %>% 
  mutate(email_corrigido = str_trim(email_corrigido, side = c("both", "left", "right")))

Correções manuais feitas post-hoc (após identificar pareamento)

ds_original_t1  %>% 
  filter(email_corrigido == "henrique.88@anjos@gmail.com")
ds_original_t1 <- ds_original_t1 %>% 
  mutate(email_corrigido = replace(email_corrigido, 
                                        email_corrigido == "henrique.88@anjos@gmail.com", "henrique.88anjos@gmail.com")) 
ds_original_t1  %>% 
  filter(email_corrigido == "liseane.thives@ufsc.br")
ds_original_t1 <- ds_original_t1 %>% 
  mutate(email_corrigido = replace(email_corrigido, 
                                        email_corrigido == "liseane.thives@ufsc.br", "liseanethives@gmail.com")) 

[Email lucas em março 25, 2021]

ds_original_t1  %>% 
  filter(email_corrigido == "henrique.88@anjos@gmail.com") %>% nrow
[1] 0
ds_original_t1  %>% 
  filter(email_corrigido == "henrique.88anjos@gmail.com") %>% nrow
[1] 1
ds_original_t1  %>% 
  filter(email_corrigido == "liseane.thives@ufsc.br") %>% nrow
[1] 0
ds_original_t1  %>% 
  filter(email_corrigido == "liseanethives@gmail.com") %>% nrow
[1] 1

Verificar duplicados

ds_original_t1 %>% 
  filter(!is.na(email_corrigido)) %>% #descartar missing
  group_by(email_corrigido) %>% #agrupar por email
  mutate(estudo_1 = length(email_corrigido)) %>% #contar quantas vezes cada participante fez a atividade
  filter(estudo_1 >1) %>% 
  count(email_corrigido) %>% 
  adorn_totals()
            email_corrigido  n
 isabelle.bbastos@gmail.com  2
        itamaralucia@me.com  2
    janaina.mocho@gmail.com  2
     juliocamacho@gmail.com  2
    leoliveira_@outlook.com  2
   loraynemercess@gmail.com  2
     louiseenunes@gmail.com  2
     lramoschaves@gmail.com  2
     marianargaze@gmail.com  4
                      Total 20

A base correta deverá ter quantos casos?

544-20+9
[1] 533

3.1.2 Ajustar pelas escalas

3.1.3 CES

criar uma duplicada para os itens de depressao

ds_original_t1 <- ds_original_t1 %>% 
  mutate_at(vars(abaixo_ha_uma_lista_de_sentimentos_e_comportamentos_por_favor_assinale_a_frequencia_com_que_lhe_ocorreram_na_ultima_semana_eu_me_chateei_por_coisas_que_normalmente_nao_me_chateavam:abaixo_ha_uma_lista_de_sentimentos_e_comportamentos_por_favor_assinale_a_frequencia_com_que_lhe_ocorreram_na_ultima_semana_eu_me_sinto_desanimado),
            list(cat = ~paste0(.))) %>% #copy all variables (duplicate) 
  rename_at(vars(ends_with( "_cat")), list(~paste0("ces_t1_", 1:20))) 

ajustar valores t1

ds_original_t1 <- ds_original_t1 %>% 
  mutate_at(vars(starts_with("ces_t1_")),
            ~replace(.,. == "Raramente (menos que 1 dia)", 0))
ds_original_t1 <- ds_original_t1 %>% 
  mutate_at(vars(starts_with("ces_t1_")),
            ~replace(.,. == "Poucas vezes (1-2 dias)", 1))
ds_original_t1 <- ds_original_t1 %>% 
  mutate_at(vars(starts_with("ces_t1_")),
            ~replace(.,. == "Às vezes (3-4 dias)", 2))
ds_original_t1 <- ds_original_t1 %>% 
  mutate_at(vars(starts_with("ces_t1_")),
            ~replace(.,. == "Quase sempre ou sempre (5-7 dias)", 3))

Converter para numerico

ds_original_t1 <- ds_original_t1 %>% 
  mutate_at(vars(starts_with("ces_t1_")), as.numeric)
NAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercion

checar respostas t1

ds_original_t1 %>% 
  select(starts_with("ces_t1_")) %>% 
  pivot_longer(everything()) %>% 
  ggplot(., aes(name, value)) +
  geom_boxplot() +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust=1)) +
  labs(x = "", y = "")

Inversão dos itens t1

ds_original_t1 <- ds_original_t1 %>% 
  mutate_at(vars(ces_t1_4, 
                 ces_t1_8, 
                 ces_t1_12, 
                 ces_t1_16), list(~paste(abs(3-.)) %>% as.numeric(.)))
NAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercion

Checar se não há casos ausentes

ds_original_t1 %>% 
  filter(neste_momento_em_sua_cidade_ha_alguma_recomendacao_oficial_para_ficar_em_casa_e_ou_evitar_sair != "Não") %>% 
  select(ces_t1_1:ces_t1_20) %>% 
  DataExplorer::profile_missing()

Checar se os valores numericos estão corretos

ds_original_t1 %>% 
  select(abaixo_ha_uma_lista_de_sentimentos_e_comportamentos_por_favor_assinale_a_frequencia_com_que_lhe_ocorreram_na_ultima_semana_eu_me_chateei_por_coisas_que_normalmente_nao_me_chateavam, ces_t1_1)

Checar os invertidos

ds_original_t1 %>% 
  select(abaixo_ha_uma_lista_de_sentimentos_e_comportamentos_por_favor_assinale_a_frequencia_com_que_lhe_ocorreram_na_ultima_semana_eu_me_senti_tao_bem_quanto_as_outras_pessoas, ces_t1_4)

3.1.4 calcular totais CES (T1)

# EScala de depressão); (20 itens)
ds_original_t1 <- ds_original_t1 %>% 
  mutate(total_ces_t1 = rowSums(select(.,ces_t1_1:ces_t1_20)))
ds_original_t1 %>% select(total_ces_t1) %>% head()

Ok

3.1.5 GAD

Criar uma duplicada com os itens do GAD

ds_original_t1 <-  ds_original_t1 %>% 
  mutate_at(vars(durante_as_ultimas_02_semanas_com_que_frequencia_voce_foi_incomodado_a_pelos_problemas_abaixo_sentir_se_nervoso_ansioso_ou_muito_tenso:durante_as_ultimas_02_semanas_com_que_frequencia_voce_foi_incomodado_a_pelos_problemas_abaixo_sentir_medo_como_se_algo_horrivel_fosse_acontecer),
            list(cat = ~paste0(.))) %>% #copy all variables (duplicate) 
  rename_at(vars(ends_with( "_cat")), list(~paste0("gad_t1_", 1:7))) 

ajustar valores t1

ds_original_t1 <- ds_original_t1 %>% 
   mutate_at(vars(starts_with("gad_t1_")),
            ~replace(.,. == "Nenhuma vez", 0))

ds_original_t1 <- ds_original_t1 %>% 
   mutate_at(vars(starts_with("gad_t1_")),
            ~replace(.,. == "Poucos dias", 1))

ds_original_t1 <- ds_original_t1 %>% 
   mutate_at(vars(starts_with("gad_t1_")),
            ~replace(.,. == "Mais da metade do tempo", 2))

ds_original_t1 <- ds_original_t1 %>% 
   mutate_at(vars(starts_with("gad_t1_")),
            ~replace(.,. == "Quase todos os dias", 3))

Transformar em numérica t1

ds_original_t1 <- ds_original_t1 %>% 
  mutate_at(vars(starts_with("gad_t1_")), as.numeric)
NAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercion

checar respostas t1

ds_original_t1 %>% 
  select(starts_with("gad_t1_")) %>% 
  pivot_longer(everything()) %>% 
  ggplot(., aes(name, value)) +
  geom_boxplot() +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust=1)) +
  labs(x = "", y = "")

3.1.6 calcular totais t1

# EScala de ansiedade; (7 itens)
ds_original_t1 <- ds_original_t1 %>% 
  mutate(total_gad_t1 = rowSums(select(.,starts_with("gad_t1_"))))

3.2 Tomar uma decisao sobre o que fazer com respostas duplicadas

Quais sao os casos duplicados

ds_original_t1 %>% 
  filter(!is.na(email_corrigido)) %>% #descartar missing
  group_by(email_corrigido) %>% #agrupar por email
  mutate(estudo_1 = length(email_corrigido)) %>% #contar quantas vezes cada participante fez a atividade
  filter(estudo_1 >1) %>% 
  count(email_corrigido) %>% 
  adorn_totals()
            email_corrigido  n
 isabelle.bbastos@gmail.com  2
        itamaralucia@me.com  2
    janaina.mocho@gmail.com  2
     juliocamacho@gmail.com  2
    leoliveira_@outlook.com  2
   loraynemercess@gmail.com  2
     louiseenunes@gmail.com  2
     lramoschaves@gmail.com  2
     marianargaze@gmail.com  4
                      Total 20

Verificar os resultados são iguais para CES e GAD

ds_original_t1 %>% 
  filter(!is.na(email_corrigido)) %>% #descartar missing
  group_by(email_corrigido) %>% #agrupar por email
  mutate(estudo_1 = length(email_corrigido)) %>% #contar quantas vezes cada participante fez a atividade
  filter(estudo_1 > 1) %>% 
  select(total_ces_t1, total_gad_t1) %>% 
  arrange(email_corrigido) %>% 
  mutate(lag_ces_t1 = lag(total_ces_t1)-total_ces_t1) %>% #verificar se o valor duplicado é igual
  mutate(lag_gad_t1 = lag(total_gad_t1)-total_gad_t1)
Adding missing grouping variables: `email_corrigido`

Deixar apenas 1 resultado

#(533)
ds_original_t1 <- ds_original_t1 %>%
  mutate(row_id = row_number()) %>% #criar um numero para cada linha
  mutate(email_corrigido = if_else(is.na(email_corrigido),
                                   paste0(row_number()),
                                   email_corrigido)) %>% #se o email é missing, colocar um numero unico
  group_by(email_corrigido) %>% #agrupar por email
  mutate(group_id = cur_group_id()) %>% #criar uma identificacao unica
  mutate(estudo_1 = length(email_corrigido)) %>%  #verificar quantas vezes cada participante fez o estudo 1
  distinct(email_corrigido, .keep_all = TRUE) %>%  #deixar apenas 1 email se houver dois ou mais
  ungroup() %>% #desagrupar
  mutate(email_corrigido = if_else(str_detect(email_corrigido, "@"), 
                                   email_corrigido, NA_character_)) %>% #novamente, colocar missing pros e-mails
  select(group_id, row_id,email_corrigido,estudo_1,everything())

Checar se só há uma pessoa para cada caso duplicado

ds_original_t1 %>% 
  filter(email_corrigido == "isabelle.bbastos@gmail.com" | email_corrigido == "itamaralucia@me.com")
NA

Verificar o tamanho da base

ds_original_t1 %>% nrow
[1] 533

3.3 Sociodemographic features

ds_original_t1 %>% names

Rename

ds_original_t1 <- ds_original_t1 %>% 
  rename(
    fica_em_casa_t1 = incluindo_as_horas_que_voce_dorme_quantas_horas_voce_tem_ficado_em_casa,
    tem_saido_de_casa = em_media_quantas_vezes_voce_tem_saido_de_casa,
    falou_familia_pessoalmente = com_quantas_pessoas_de_sua_familia_voce_falou_hoje_pessoalmente,
    falou_familia_telefone = com_quantas_pessoas_de_sua_familia_voce_falou_hoje_por_telefone_ou_video_conferencia,
    falou_amigos_telefone = com_quantos_amigos_voce_falou_hoje_por_telefone_ou_video_conferencia,
    testou_coronavirus = voce_ja_foi_testado_para_coronavirus,
    conhece_alguem_coronavirus = voce_ja_teve_contato_com_alguem_com_coronavirus,
    segue_recomendacoes = voce_tem_seguido_as_recomendacoes_gerais_de_higiene_lavar_as_maos_evitar_tocar_no_rosto_etc,
    concordo_covid_preocupacao_saude = indique_o_quanto_voce_concorda_o_coronavirus_e_uma_grande_preocupacao_de_saude_publica,
    concordo_quarentena = indique_o_quanto_voce_concorda_a_quarentena_foi_uma_medida_acertada,
    trabalho_antes_quarentena = antes_da_epoca_de_quarentena_coronavirus_voce,
    trabalho_agora_quarentena = agora_nesta_epoca_de_quarantena_coronavirus,
    area_profissao = se_voce_trabalha_sua_area_profissional_principal_e,
    profissao = a_sua_profissao_e,
    renda_antes = em_media_sua_renda_mensal_bruta_em_reais_antes_da_quarentena_coronavirus_era,
    renda_quarentena = em_media_sua_renda_mensal_bruta_em_reais_agora_durante_a_quarentena_coronavirus_e,
    preocupacao_pagar_conta = voce_esta_preocupado_por_ter_dificuldades_em_pagar_suas_contas_principais_como_aluguel_ou_prestacoes_deste_mes_devido_a_quarentena_coronaviru,
    pensa_em_adiar_pagamento = em_caso_afirmativo_pensa_em_adiamento_deste_mes,
    preocupacao_economia_geral = qual_e_a_sua_preocupacao_em_relacao_aos_itens_abaixo_a_economia_em_geral,
    preocupacao_situacao_financeira = qual_e_a_sua_preocupacao_em_relacao_aos_itens_abaixo_a_sua_propria_situacao_financeira,
    preocupacao_sua_saude = qual_e_a_sua_preocupacao_em_relacao_aos_itens_abaixo_a_sua_saude_se_nao_estiver_infectada,
    preocupacao_saude_amigos_familia = qual_e_a_sua_preocupacao_em_relacao_aos_itens_abaixo_a_saude_dos_membros_da_familia_e_dos_amigos_proximos,
    preocupacao_coesao_social = qual_e_a_sua_preocupacao_em_relacao_aos_itens_abaixo_a_coesao_social,
    preocupacao_produtos_alimentacao_higiene_medicamentos = qual_e_a_sua_preocupacao_em_relacao_aos_itens_abaixo_fornecimento_de_produtos_importantes_como_alimentos_produtos_de_higiene_e_medicamentos,
    preocupacao_preco_produtos = qual_e_a_sua_preocupacao_em_relacao_aos_itens_abaixo_a_acessibilidade_dos_precos_destes_produtos,
    preocupacao_preco_acoes = qual_e_a_sua_preocupacao_em_relacao_aos_itens_abaixo_a_evolucao_do_preco_das_acoes_e_de_outras_formas_de_investimento,
    preocupacao_realizacao_escolar_filho = qual_e_a_sua_preocupacao_em_relacao_aos_itens_abaixo_as_realizacoes_escolares_dos_seus_filhos,
    bebida_que_usa = qual_o_tipo_de_bebida_alcoolica_que_voce_mais_consome_deixe_em_branco_se_nenhuma,
    idade = idade_em_anos,
    escolaridade = sua_escolaridade,
    estado = o_estado_que_voce_mora_e,
    cidade = a_cidade_que_voce_mora_e,
    quantos_filhos = quantos_filhos_voce_tem,
    plano_saude = voce_tem_plano_de_saude,
    como_vive = qual_das_seguintes_alternativas_melhor_descrevem_sua_situacao_no_momento,
    pessoas_na_casa = quantas_pessoas_contando_com_voce_moram_em_sua_casa,
    renda_familiar_mensal = em_relacao_a_sua_renda_familiar_mensal_ou_seja_a_renda_das_pessoas_moradoras_da_mesma_casa,
    pessoas_em_risco_casa = quantas_pessoas_do_grupo_de_risco_moram_contigo_ex_pesosas_com_60_anos_ou_mais_portadores_de_doencas_cardiacas_hipertensao_diabetes_etc,
    orientacao_politica = nos_sabemos_que_questoes_politicas_sao_densas_e_merecem_uma_especial_atencao_no_entanto_em_relacao_a_orientacao_politica_eu_me_considero
  )

Transform into factor

ds_original_t1 <- ds_original_t1 %>% 
  mutate(across(c(fica_em_casa_t1,
                  tem_saido_de_casa,
                  falou_familia_pessoalmente,
                  falou_familia_telefone,
                  falou_amigos_telefone,
                  testou_coronavirus,
                  conhece_alguem_coronavirus,
                  segue_recomendacoes,
                  concordo_covid_preocupacao_saude,
                  concordo_quarentena,
                  trabalho_antes_quarentena,
                  trabalho_agora_quarentena,
                  area_profissao,

                  preocupacao_pagar_conta,
                  pensa_em_adiar_pagamento,
                  preocupacao_economia_geral,
                  preocupacao_situacao_financeira,
                  preocupacao_sua_saude,
                  preocupacao_saude_amigos_familia,
                  preocupacao_coesao_social,
                  preocupacao_produtos_alimentacao_higiene_medicamentos,
                  preocupacao_preco_produtos,
                  preocupacao_preco_acoes,
                  preocupacao_realizacao_escolar_filho,
                  bebida_que_usa,
                  sexo,
                  escolaridade,
                  estado,
                  cidade,
                  plano_saude,
                  como_vive,
                  renda_familiar_mensal,
                  pessoas_em_risco_casa,
                  orientacao_politica),
                factor))

Fix some factor levels

Fica em casa

ds_original_t1 <- ds_original_t1 %>% 
  mutate_at(vars(fica_em_casa_t1), ~fct_relevel(., 
                                      c("Entre 1 a 4 horas por dia",
                                        "Entre 5 a 8 horas por dia", 
                                        "Entre 9 a 12 horas por dia", 
                                        "Entre 13 a 16 horas por dia", 
                                        "Entre 17 a 20 horas por dia", 
                                        "Mais de 20 horas por dia ou o dia todo")))

Sai de casa

ds_original_t1 <- ds_original_t1 %>% 
  mutate_at(vars(tem_saido_de_casa), ~fct_relevel(., 
                                      c("Nenhuma",
                                        "1 vez por dia",
                                        "2 vezes por dia", 
                                        "3 vezes por dia", 
                                        "Mais de 3 vezes por dia")))

Falou familia pessoalmente

ds_original_t1 <- ds_original_t1 %>% 
  mutate_at(vars(falou_familia_pessoalmente), ~fct_relevel(., 
                                      c("Nenhuma"))) 

Preocupacao covid e saude

ds_original_t1 <- ds_original_t1 %>% 
  mutate_at(vars(concordo_quarentena, concordo_covid_preocupacao_saude), ~fct_relevel(., 
                                      c("Eu discordo fortemente",
                                        "Eu discordo",
                                        "Estou neutro", 
                                        "Eu concordo", 
                                        "Eu concordo fortemente")))

preocupacao geral

ds_original_t1 <- ds_original_t1 %>% 
  mutate_at(vars(starts_with("preocupacao_")), ~fct_relevel(., 
                                      c("Nenhuma",
                                        "Pouca",
                                        "Bastante", 
                                        "Extrema")))
Unknown levels in `f`: Nenhuma, Pouca, Bastante, Extrema

quanto_tempo_voce_acha_que_que_a_vida_voltara_ao_normal

ds_original_t1 <- ds_original_t1 %>% 
  mutate_at(vars(quanto_tempo_voce_acha_que_que_a_vida_voltara_ao_normal), ~fct_relevel(., 
                                      c("Antes do segundo semestre de 2020",
                                        "No segundo semestre de 2020",
                                        "Só em 2021", 
                                        "2022 ou depois")))

fumo

ds_original_t1 <- ds_original_t1 %>% 
  mutate_at(vars(antes_da_quarentena_coronavirus_voce_fumava), ~fct_relevel(., 
                                      c("Não, não fumava",
                                        "Entre 1 e 5 cigarro por dia",
                                        "Até 20 cigarros por dia",
                                        "Mais de 20 cigarros por dia")))
ds_original_t1 <- ds_original_t1 %>% 
  mutate_at(vars(agora_durante_a_quarentena_coronavirus_voce_fuma), ~fct_relevel(., 
                                      c("Não, não fumo",
                                        "Entre 1 e 5 cigarro por dia",
                                        "Até 20 cigarros por dia",
                                        "Mais de 20 cigarros por dia")))

Bebida

ds_original_t1 <- ds_original_t1 %>% 
  mutate_at(vars(antes_da_quarentena_coronavirus_voce_bebia), ~fct_relevel(., 
                                      c("Não, não bebia")))
ds_original_t1 <- ds_original_t1 %>% 
  mutate_at(vars(agora_durante_a_quarentena_coronavirus_voce_bebe), ~fct_relevel(., 
                                      c("Não, não bebo")))

Exercicios físicos

ds_original_t1 <- ds_original_t1 %>% 
  mutate_at(vars(antes_da_quarentena_coronavirus_voce_fazia_exercicios_fisicos, agora_durante_a_quarentena_coronavirus_voce_faz_exercicios_fisicos), ~fct_relevel(.,
                                                                                                                                                                  c("Não, nenhum",
          "Pouco (1 vez por semana)",
          "Moderado (2 a 3 vezes por semana)",
          "Muito (mais que 3 vezes por semana)")))

Escolaridade

ds_original_t1 <- ds_original_t1 %>% 
  mutate_at(vars(escolaridade), ~fct_relevel(., 
                                      c("Ensino fundamental incompleto",
                                        "Ensino fundamental completo",
                                        "Ensino médio incompleto",
                                        "Ensino médio completo",
                                        "Ensino superior incompleto",
                                        "Ensino superior completo",
                                        "Pós-graduação")))

Rio e sao paulo

ds_original_t1 <- ds_original_t1 %>% 
  mutate(rio_sp =  case_when(
    estado == "Rio de Janeiro (RJ)" ~ "RJ",
    estado == "São Paulo (SP)" ~ "SP",
    is.na(estado) ~ NA_character_,
    TRUE ~ "Outros"))

ds_original_t1 <- ds_original_t1 %>% mutate(rio_sp=as.factor(rio_sp))

Qtos filhos

ds_original_t1 <- ds_original_t1 %>% 
  mutate_at(vars(quantos_filhos), ~fct_relevel(., 
                                      c("Nenhum")))

Pessoas na casa

ds_original_t1 <- ds_original_t1 %>% 
  mutate(pessoas_na_casa = as.numeric(pessoas_na_casa))

Pessoas em risco

ds_original_t1 <- ds_original_t1 %>% 
  mutate_at(vars(pessoas_em_risco_casa), ~fct_relevel(., 
                                      c("Nenhuma")))

Renda familiar

ds_original_t1 <- ds_original_t1 %>% 
  mutate_at(vars(renda_familiar_mensal), ~fct_relevel(., 
                                      c("Até R$ 1.908",
                                        "Mais de R$ 1.908 até R$ 2.862",
                                        "Mais de R$ 2.862 até R$ 5.724",
                                        "Mais de R$ 5.724 até R$ 9.540",
                                        "Mais de R$ 9.540 até R$ 14.310",
                                        "Acima de R$ 14.310 ate R$ 23.850",
                                        "Acima de R$ 23.850")))

Orientação política

ds_original_t1 <- ds_original_t1 %>% 
  mutate_at(vars(orientacao_politica), ~fct_relevel(., 
                                      c("Sou apolítico",
                                        "De esquerda",
                                        "De centro esquerda",
                                        "De centro",
                                        "De centro direita",
                                        "De direita")))

Orientacao politica (esquerda vs direita)

ds_original_t1<-ds_original_t1 %>% mutate(politica_dir_esq = 
                                  factor(case_when(
                                    orientacao_politica == "De esquerda" ~ "esquerda",
                                    orientacao_politica == "De centro esquerda" ~ "esquerda",
                                    orientacao_politica == "De centro" ~ "centro",
                                    orientacao_politica == "De centro direita" ~ "direita",
                                    orientacao_politica == "De direita" ~ "direita",
                                    orientacao_politica == "Sou apolítico" ~ "apolitico")))
ds_original_t1 %>% count(politica_dir_esq)

Estado civil

ds_original_t1 %>% count(estado_civil)
ds_original_t1 <- ds_original_t1 %>% 
  mutate(estado_civil_corrigido = case_when(
    estado_civil == "União estável (mesmo que sem reconhecimento legal)" ~ "Casado(a)",
    TRUE ~ estado_civil))

ds_original_t1 <- ds_original_t1 %>% 
  mutate(estado_civil_corrigido = factor(estado_civil_corrigido))

ds_original_t1 %>% count(estado_civil_corrigido)

Escolaridade superior

ds_original_t1 <- ds_original_t1 %>% mutate(escolaridade_superior = 
                                  factor(case_when(
                                    escolaridade == "Ensino superior completo" ~ "Superior",
                                    escolaridade == "Pós-graduação" ~ "Superior",
                                    TRUE ~ "outros")))
ds_original_t1 %>% count(escolaridade_superior)

4 Import T2

ds_original_t2 <- read_csv("C:/Users/luisf/Dropbox/Puc-Rio/Projeto - COVID longitudinal/COVID-19 - T2 (Responses) - Form Responses 1.csv")

-- Column specification ---------------------------------------------------------------------------------------------------------------------------------------------------------------
cols(
  .default = col_character()
)
i Use `spec()` for the full column specifications.
backup_ds_t2 <- ds_original_t2

4.1 clean

Modificar nomes

ds_original_t2 <- clean_names(ds_original_t2)

Remove when all missing

ds_original_t2 <- janitor::remove_empty(ds_original_t2, c("rows", "cols"))

5 Fix to Match T2

5.1 Fix T2

5.1.1 email

Nome

ds_original_t2 <- ds_original_t2 %>% 
  rename(email = para_conseguirmos_verificar_suas_respostas_dadas_inicialmente_qual_e_o_seu_e_mail)

Formato do email

ds_original_t2 <- ds_original_t2 %>% 
  mutate(email_corrigido = tolower(email))

ds_original_t2 <- ds_original_t2 %>%
  mutate(email_corrigido = stringi::stri_trans_general(email_corrigido,"Latin-ASCII"))

Tirar espaços

ds_original_t2 <- ds_original_t2 %>% 
  mutate(email_corrigido = str_trim(email_corrigido, side = c("both", "left", "right"))) %>% 
  mutate(email_corrigido = str_replace_all(email_corrigido, "\\s", "")) #spaces between
ds_original_t2 %>% select(email_corrigido) %>% View()

Verificar duplicados

ds_original_t2 %>% 
  filter(!is.na(email_corrigido)) %>% #descartar missing
  group_by(email_corrigido) %>% #agrupar por email
  mutate(estudo_2 = length(email_corrigido)) %>% #contar quantas vezes cada participante fez a atividade
  filter(estudo_2 >1) %>% 
  count(email_corrigido) %>% 
  data.frame() %>%
  mutate(linha=row_number()) %>% 
  adorn_totals()
             email_corrigido  n linha
      bea.virginio@gmail.com  2     1
      je_souza63@hotmail.com  2     2
    lene.arnunes14@gmail.com  2     3
       liayukimura@gmail.com  2     4
 lpof666.luizpaulo@gmail.com  3     5
   lucianamario@yahoo.com.br  2     6
  mn.morenogodinho@gmail.com  2     7
   rodrigogr1980@hotmail.com  3     8
 tassiana1oliveira@gmail.com  2     9
               yleskow@pm.me  2    10
                       Total 22    55

A base correta deverá ter quantos casos?

148-22+10
[1] 136

5.1.2 Ajustar pelas escalas

5.1.3 CES

criar uma duplicada para os itens de depressao

ds_original_t2 <- ds_original_t2 %>% 
  mutate_at(vars(abaixo_ha_uma_lista_de_sentimentos_e_comportamentos_por_favor_assinale_a_frequencia_com_que_lhe_ocorreram_na_ultima_semana_eu_me_chateei_por_coisas_que_normalmente_nao_me_chateavam:abaixo_ha_uma_lista_de_sentimentos_e_comportamentos_por_favor_assinale_a_frequencia_com_que_lhe_ocorreram_na_ultima_semana_eu_me_sinto_desanimado),
            list(cat = ~paste0(.))) %>% #copy all variables (duplicate) 
  rename_at(vars(ends_with( "_cat")), list(~paste0("ces_t2_", 1:20))) 

ajustar valores t2

ds_original_t2 <- ds_original_t2 %>% 
  mutate_at(vars(starts_with("ces_t2_")),
            ~replace(.,. == "Raramente (menos que 1 dia)", 0))
ds_original_t2 <- ds_original_t2 %>% 
  mutate_at(vars(starts_with("ces_t2_")),
            ~replace(.,. == "Poucas vezes (1-2 dias)", 1))
ds_original_t2 <- ds_original_t2 %>% 
  mutate_at(vars(starts_with("ces_t2_")),
            ~replace(.,. == "Às vezes (3-4 dias)", 2))
ds_original_t2 <- ds_original_t2 %>% 
  mutate_at(vars(starts_with("ces_t2_")),
            ~replace(.,. == "Quase sempre ou sempre (5-7 dias)", 3))

Converter para numerico

ds_original_t2 <- ds_original_t2 %>% 
  mutate_at(vars(starts_with("ces_t2_")), as.numeric)
NAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercion

checar respostas t2

ds_original_t2 %>% 
  select(starts_with("ces_t2_")) %>% 
  pivot_longer(everything()) %>% 
  ggplot(., aes(name, value)) +
  geom_boxplot() +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust=1)) +
  labs(x = "", y = "")

Inversão dos itens t2

ds_original_t2 <- ds_original_t2 %>% 
  mutate_at(vars(ces_t2_4, 
                 ces_t2_8, 
                 ces_t2_12, 
                 ces_t2_16), list(~paste(abs(3-.)) %>% as.numeric(.)))
NAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercion

Checar se não há casos ausentes

ds_original_t2 %>% 
  filter(!str_detect(covid_19_aspectos_economicos_e_saude_de_jovens_e_adultos, "Não")) %>% #deixar apenas quem quis participar
  select(ces_t2_1:ces_t2_20) %>% 
  DataExplorer::profile_missing()

Checar se os valores numericos estão corretos

ds_original_t2 %>% 
  select(abaixo_ha_uma_lista_de_sentimentos_e_comportamentos_por_favor_assinale_a_frequencia_com_que_lhe_ocorreram_na_ultima_semana_eu_me_chateei_por_coisas_que_normalmente_nao_me_chateavam, ces_t2_1)

Checar os invertidos

ds_original_t2 %>% 
  select(abaixo_ha_uma_lista_de_sentimentos_e_comportamentos_por_favor_assinale_a_frequencia_com_que_lhe_ocorreram_na_ultima_semana_eu_me_senti_tao_bem_quanto_as_outras_pessoas, ces_t2_4)

5.1.4 calcular totais CES (T2)

# EScala de depressão); (20 itens)
ds_original_t2 <- ds_original_t2 %>% 
  mutate(total_ces_t2 = rowSums(select(.,ces_t2_1:ces_t2_20)))
ds_original_t2 %>% select(total_ces_t2) %>% head()

Ok

5.1.5 GAD

Criar uma duplicada com os itens do GAD

ds_original_t2 <-  ds_original_t2 %>% 
  mutate_at(vars(durante_as_ultimas_02_semanas_com_que_frequencia_voce_foi_incomodado_a_pelos_problemas_abaixo_sentir_se_nervoso_ansioso_ou_muito_tenso:durante_as_ultimas_02_semanas_com_que_frequencia_voce_foi_incomodado_a_pelos_problemas_abaixo_sentir_medo_como_se_algo_horrivel_fosse_acontecer),
            list(cat = ~paste0(.))) %>% #copy all variables (duplicate) 
  rename_at(vars(ends_with( "_cat")), list(~paste0("gad_t2_", 1:7))) 

ajustar valores t2

ds_original_t2 <- ds_original_t2 %>% 
   mutate_at(vars(starts_with("gad_t2_")),
            ~replace(.,. == "Nenhuma vez", 0))

ds_original_t2 <- ds_original_t2 %>% 
   mutate_at(vars(starts_with("gad_t2_")),
            ~replace(.,. == "Poucos dias", 1))

ds_original_t2 <- ds_original_t2 %>% 
   mutate_at(vars(starts_with("gad_t2_")),
            ~replace(.,. == "Mais da metade do tempo", 2))

ds_original_t2 <- ds_original_t2 %>% 
   mutate_at(vars(starts_with("gad_t2_")),
            ~replace(.,. == "Quase todos os dias", 3))

Transformar em numérica t2

ds_original_t2 <- ds_original_t2 %>% 
  mutate_at(vars(starts_with("gad_t2_")), as.numeric)
NAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercion

checar respostas t2

ds_original_t2 %>% 
  select(starts_with("gad_t2_")) %>% 
  pivot_longer(everything()) %>% 
  ggplot(., aes(name, value)) +
  geom_boxplot() +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust=1)) +
  labs(x = "", y = "")

5.1.6 calcular totais GAD (T2)

# EScala de ansiedade; (7 itens)
ds_original_t2 <- ds_original_t2 %>% 
  mutate(total_gad_t2 = rowSums(select(.,starts_with("gad_t2_"))))

5.2 Tomar uma decisao sobre o que fazer com respostas duplicadas (T2)

Quais sao os casos duplicados

duplicate_cases_t2 <- ds_original_t2 %>% 
  filter(!is.na(email_corrigido)) %>% #descartar missing
  group_by(email_corrigido) %>% #agrupar por email
  mutate(estudo_2 = length(email_corrigido)) %>% #contar quantas vezes cada participante fez a atividade
  filter(estudo_2 >1) %>% 
  count(email_corrigido) %>% 
  data.frame() %>% 
  mutate(linha = row_number()) %>% 
  adorn_totals()
duplicate_cases_t2
             email_corrigido  n linha
      bea.virginio@gmail.com  2     1
      je_souza63@hotmail.com  2     2
    lene.arnunes14@gmail.com  2     3
       liayukimura@gmail.com  2     4
 lpof666.luizpaulo@gmail.com  3     5
   lucianamario@yahoo.com.br  2     6
  mn.morenogodinho@gmail.com  2     7
   rodrigogr1980@hotmail.com  3     8
 tassiana1oliveira@gmail.com  2     9
               yleskow@pm.me  2    10
                       Total 22    55

Nesta nova base, deverão ficar 136 participantes se os resultados forem iguais

Verificar os resultados são iguais para CES e GAD

equal_t2_ces <- ds_original_t2 %>% 
  filter(!is.na(email_corrigido)) %>% #descartar missing
  group_by(email_corrigido) %>% #agrupar por email
  mutate(estudo_2 = length(email_corrigido)) %>% #contar quantas vezes cada participante fez a atividade
  filter(estudo_2 > 1) %>%  #deixar apenas pessoas que fizeram mais de uma vez o estudo
  select(total_ces_t2) %>% 
  group_by(email_corrigido) %>% #agrupar pela mesma pessoa
  mutate(diferenca_ces = total_ces_t2 - lag(total_ces_t2)) %>% #computar diferenças
  mutate(quantas_diferencas = length(diferenca_ces)) %>%  #quantas vezes a pessoa fez
  filter(diferenca_ces == 0 & quantas_diferencas == 2) %>%  #se o cara fez duas vezes e respostas iguais, ele fica
  arrange(email_corrigido)
Adding missing grouping variables: `email_corrigido`
equal_t2_gad <- ds_original_t2 %>% 
  filter(!is.na(email_corrigido)) %>% #descartar missing
  group_by(email_corrigido) %>% #agrupar por email
  mutate(estudo_2 = length(email_corrigido)) %>% #contar quantas vezes cada participante fez a atividade
  filter(estudo_2 > 1) %>%  #deixar apenas pessoas que fizeram mais de uma vez o estudo
  select(total_gad_t2) %>% 
  group_by(email_corrigido) %>% #agrupar pela mesma pessoa
  mutate(diferenca_gad = total_gad_t2 - lag(total_gad_t2)) %>% #computar diferenças
  mutate(quantas_diferencas = length(diferenca_gad)) %>%  #quantas vezes a pessoa fez
  filter(diferenca_gad == 0 & quantas_diferencas == 2) %>%  #se o cara fez duas vezes e respostas iguais, ele fica
  arrange(email_corrigido)
Adding missing grouping variables: `email_corrigido`

Criar uma base para ver quais participantes tem os mesmos resultados

equal_t2 <- equal_t2_ces %>% 
  filter(email_corrigido %in% equal_t2_gad)

Refefinir a base para remover os casos em que os valores duplicados são diferentes

duplicate_cases_t2 <- duplicate_cases_t2 %>% 
  filter(!email_corrigido %in% equal_t2)

Deixar apenas 1 resultado

ds_original_t2 <- ds_original_t2 %>%
  filter(!email_corrigido %in% duplicate_cases_t2$email_corrigido)

Tirar o duplicado (o participante que ficou ficou duplicado)

ds_original_t2 <- ds_original_t2 %>% 
  arrange(email_corrigido) %>% 
  mutate(row_id = row_number()) %>% #criar um numero para cada linha
  mutate(email_corrigido = if_else(is.na(email_corrigido),
                                   paste0(row_number()),
                                   email_corrigido)) %>% #se o email é missing, colocar um numero unico
  group_by(email_corrigido) %>% #agrupar por email
  mutate(group_id = cur_group_id()) %>% #criar uma identificacao unica
  mutate(estudo_2 = length(email_corrigido)) %>%  #verificar quantas vezes cada participante fez o estudo 1
  distinct(email_corrigido, .keep_all = TRUE) %>%  #deixar apenas 1 email se houver dois ou mais
  ungroup() %>% #desagrupar
  mutate(email_corrigido = if_else(str_detect(email_corrigido, "@"), 
                                   email_corrigido, NA_character_)) %>% #novamente, colocar missing pros e-mails
  select(group_id, row_id,email_corrigido,estudo_2,everything()) 

Remover bases provisórias

rm(equal_t2, equal_t2_ces, equal_t2_gad)

5.3 Sociodemographic features

ds_original_t2 %>% names
view(dfSummary(ds_original_t2)) 

Rename

#utils::View(ds_original_t2)
ds_original_t2 <- ds_original_t2 %>% 
  rename(
    fica_em_casa_t2 = atualmente_incluindo_as_horas_que_voce_dorme_quantas_horas_voce_tem_ficado_em_casa,
    tem_saido_de_casa = atualmente_em_media_quantas_vezes_voce_tem_saido_de_casa,
    
    segue_recomendacoes = atualmente_voce_tem_seguido_as_recomendacoes_gerais_de_higiene_lavar_as_maos_evitar_tocar_no_rosto_etc,

    falou_familia_pessoalmente = com_quantas_pessoas_de_sua_familia_voce_falou_hoje_pessoalmente,
    falou_familia_telefone = com_quantas_pessoas_de_sua_familia_voce_falou_hoje_por_telefone_ou_video_conferencia,
    falou_amigos_telefone = com_quantos_amigos_voce_falou_hoje_por_telefone_ou_video_conferencia,

    concordo_covid_preocupacao_saude = indique_o_quanto_voce_concorda_o_coronavirus_e_uma_grande_preocupacao_de_saude_publica,
    concordo_quarentena = indique_o_quanto_voce_concorda_a_quarentena_foi_uma_medida_acertada,
    
    trabalho_apos_quarentena = atualmente_voce,

    renda_agora = atualmente_em_media_sua_renda_mensal_bruta_em_reais_e,
    
    preocupacao_pagar_conta = atualmente_voce_esta_preocupado_por_ter_dificuldades_em_pagar_suas_contas_principais_como_aluguel_ou_prestacoes_deste_mes,
    pensa_em_adiar_pagamento = em_caso_afirmativo_pensa_em_adiamento_deste_mes,

    preocupacao_economia_geral = qual_e_a_sua_preocupacao_em_relacao_aos_itens_abaixo_a_economia_em_geral,
    preocupacao_situacao_financeira = qual_e_a_sua_preocupacao_em_relacao_aos_itens_abaixo_a_sua_propria_situacao_financeira,
    preocupacao_sua_saude = qual_e_a_sua_preocupacao_em_relacao_aos_itens_abaixo_a_sua_saude_se_nao_estiver_infectado,
    preocupacao_saude_amigos_familia = qual_e_a_sua_preocupacao_em_relacao_aos_itens_abaixo_a_saude_dos_membros_da_familia_e_dos_amigos_proximos,
    preocupacao_coesao_social = qual_e_a_sua_preocupacao_em_relacao_aos_itens_abaixo_a_coesao_social,
    preocupacao_produtos_alimentacao_higiene_medicamentos = qual_e_a_sua_preocupacao_em_relacao_aos_itens_abaixo_fornecimento_de_produtos_importantes_como_alimentos_produtos_de_higiene_e_medicamentos,
    preocupacao_preco_produtos = qual_e_a_sua_preocupacao_em_relacao_aos_itens_abaixo_a_acessibilidade_dos_precos_destes_produtos,
    preocupacao_preco_acoes = qual_e_a_sua_preocupacao_em_relacao_aos_itens_abaixo_a_evolucao_do_preco_das_acoes_e_de_outras_formas_de_investimento,
    preocupacao_realizacao_escolar_filho = qual_e_a_sua_preocupacao_em_relacao_aos_itens_abaixo_as_realizacoes_escolares_dos_seus_filhos,
    
    bebida_que_usa = qual_o_tipo_de_bebida_alcoolica_que_voce_mais_consome_deixe_em_branco_se_nenhuma,

   plano_saude = voce_tem_plano_de_saude,
    como_vive = qual_das_seguintes_alternativas_melhor_descrevem_sua_situacao_no_momento,

    pessoas_na_casa = quantas_pessoas_contando_com_voce_moram_em_sua_casa,
    renda_familiar_mensal = em_relacao_a_sua_renda_familiar_mensal_ou_seja_a_renda_das_pessoas_moradoras_da_mesma_casa,
    
    pessoas_em_risco_casa = quantas_pessoas_do_grupo_de_risco_moram_contigo_ex_pesosas_com_60_anos_ou_mais_portadores_de_doencas_cardiacas_hipertensao_diabetes_etc,
   
   orientacao_politica = nos_sabemos_que_questoes_politicas_sao_densas_e_merecem_uma_especial_atencao_no_entanto_em_relacao_a_orientacao_politica_eu_me_considero
  )

Transform into factor

ds_original_t2 <- ds_original_t2 %>% 
  mutate(across(c(
    fica_em_casa_t2, 
    tem_saido_de_casa, 
    falou_familia_pessoalmente, 
    falou_familia_telefone, 
    falou_amigos_telefone, 
    segue_recomendacoes,
    
    
    concordo_covid_preocupacao_saude, 
    concordo_quarentena, 
    trabalho_apos_quarentena, 
    renda_agora, 
    
    preocupacao_pagar_conta, 
    pensa_em_adiar_pagamento, 
    preocupacao_economia_geral, 
    preocupacao_situacao_financeira, 
    preocupacao_sua_saude,
    preocupacao_saude_amigos_familia, 
    preocupacao_coesao_social, 
    preocupacao_produtos_alimentacao_higiene_medicamentos, 
    preocupacao_preco_produtos, 
    preocupacao_preco_acoes, 
    preocupacao_realizacao_escolar_filho, 
    
    atualmente_voce_fuma,
    atualmente_voce_bebe,
    atualmente_voce_faz_exercicios_fisicos,
    atualmente_sua_alimentacao,
    atualmente_seu_peso,
    
    bebida_que_usa, 
    plano_saude, 
    como_vive, 
    renda_familiar_mensal, 
    pessoas_em_risco_casa,
    
    orientacao_politica
  ),
  factor))

Fix some factor levels

Pessoas na casa

ds_original_t2 <- ds_original_t2 %>% 
  mutate(pessoas_na_casa = as.numeric(pessoas_na_casa))

Pessoas em risco

ds_original_t2 <- ds_original_t2 %>% 
  mutate_at(vars(pessoas_em_risco_casa), ~fct_relevel(., 
                                      c("Nenhuma")))

Renda familiar

ds_original_t2 <- ds_original_t2 %>% 
  mutate_at(vars(renda_familiar_mensal), ~fct_relevel(., 
                                      c("Até R$ 1.908",
                                        "Mais de R$ 1.908 até R$ 2.862",
                                        "Mais de R$ 2.862 até R$ 5.724",
                                        "Mais de R$ 5.724 até R$ 9.540",
                                        "Mais de R$ 9.540 até R$ 14.310",
                                        "Acima de R$ 14.310 ate R$ 23.850",
                                        "Acima de R$ 23.850")))

Orientação política

ds_original_t2 <- ds_original_t2 %>% 
  mutate_at(vars(orientacao_politica), ~fct_relevel(., 
                                      c("Sou apolítico",
                                        "De esquerda",
                                        "De centro esquerda",
                                        "De centro",
                                        "De centro direita",
                                        "De direita")))

Orientação política direita vs esquerda (t2)

ds_original_t2 <- ds_original_t2 %>% mutate(politica_dir_esq = 
                                  factor(case_when(
                                    orientacao_politica == "De esquerda" ~ "esquerda",
                                    orientacao_politica == "De centro esquerda" ~ "esquerda",
                                    orientacao_politica == "De centro" ~ "centro",
                                    orientacao_politica == "De centro direita" ~ "direita",
                                    orientacao_politica == "De direita" ~ "direita",
                                    orientacao_politica == "Sou apolítico" ~ "apolitico")))

Fica em casa

ds_original_t2 <- ds_original_t2 %>% 
  mutate_at(vars(fica_em_casa_t2), ~fct_relevel(., 
                                      c("Entre 5 a 8 horas por dia", 
                                        "Entre 9 a 12 horas por dia", 
                                        "Entre 13 a 16 horas por dia", 
                                        "Entre 17 a 20 horas por dia", 
                                        "Mais de 20 horas por dia ou o dia todo")))

Sai de casa

ds_original_t2 <- ds_original_t2 %>% 
  mutate_at(vars(tem_saido_de_casa), ~fct_relevel(., 
                                      c("Nenhuma",
                                        "1 vez por dia",
                                        "2 vezes por dia", 
                                        "3 vezes por dia", 
                                        "Mais de 3 vezes por dia")))

Falou familia pessoalmente

ds_original_t2 <- ds_original_t2 %>% 
  mutate_at(vars(falou_familia_pessoalmente), ~fct_relevel(., 
                                      c("Nenhuma"))) 

Preocupacao covid e saude

ds_original_t2 <- ds_original_t2 %>% 
  mutate_at(vars(concordo_quarentena, concordo_covid_preocupacao_saude), ~fct_relevel(., 
                                      c("Eu discordo fortemente",
                                        "Eu discordo",
                                        "Estou neutro", 
                                        "Eu concordo", 
                                        "Eu concordo fortemente")))

preocupacao geral

ds_original_t2 <- ds_original_t2 %>% 
  mutate_at(vars(starts_with("preocupacao_"),-preocupacao_pagar_conta), ~fct_relevel(., 
                                      c("Nenhuma",
                                        "Pouca",
                                        "Bastante", 
                                        "Extrema")))

quanto_tempo_voce_acha_que_que_a_vida_voltara_ao_normal

#diferent from t1
ds_original_t2 <- ds_original_t2 %>% 
  mutate_at(vars(quanto_tempo_voce_acha_que_que_a_vida_voltara_ao_normal), ~fct_relevel(., 
                                      c("Já está normal",
                                        "Ainda neste segundo semestre de 2020",
                                        "Só em 2021", 
                                        "2022 ou depois")))

fumo

ds_original_t2 <- ds_original_t2 %>% 
  mutate_at(vars(atualmente_voce_fuma), ~fct_relevel(., 
                                      c("Não, não fumo",
                                        "Entre 1 e 5 cigarro por dia",
                                        "Até 20 cigarros por dia",
                                        "Mais de 20 cigarros por dia")))

Bebida

ds_original_t2 <- ds_original_t2 %>% 
  mutate_at(vars(atualmente_voce_bebe), ~fct_relevel(., 
                                      c("Não, não bebo")))

Exercicios físicos

ds_original_t2 <- ds_original_t2 %>% 
  mutate_at(vars(atualmente_voce_faz_exercicios_fisicos), ~fct_relevel(.,
                                                                       c("Não, nenhum",
                                                                         "Pouco (1 vez por semana)",
                                                                         "Moderado (2 a 3 vezes por semana)",
                                                                         "Muito (mais que 3 vezes por semana)")))

Done

6 Create a ds with the same participants

ds_t1_t2 <-right_join(
  ds_original_t1 %>% filter(!is.na(email_corrigido)), 
  ds_original_t2 %>% filter(!is.na(email_corrigido)),
          by = "email_corrigido")

Some participants at T2 were not at t1 …

ds_t1_t2 <- ds_t1_t2 %>% 
  filter(!is.na(total_ces_t1)) %>% #nao usar dados ausentes 
  select(email_corrigido, fica_em_casa_t1, fica_em_casa_t2, total_ces_t1, total_ces_t2, everything()) %>% #organizar
  select(-estudo_1, -estudo_2) #tirar indexador do estudo

Create index of leave group

ds_t1_t2 <- ds_t1_t2 %>% 
  mutate(unique_id = factor(row_number()))%>% 
  mutate(dif = as.numeric(fica_em_casa_t1)-as.numeric(fica_em_casa_t2)) %>% 
  mutate(group = factor(if_else(dif > 1,"Leave from home","Stay at home"))) %>% #atencao aqui aos niveis das variaveis categoricas
  select(email_corrigido, fica_em_casa_t1, fica_em_casa_t2, dif, group, everything())
ds_t1_t2

frequency of people in each group

ds_t1_t2 %>% count(group)
ds_t1_t2 %>% count(dif)

Create an index to assign all participants that were facing depression and anxiety sympthons at both times

ds_t1_t2 <- ds_t1_t2 %>% 
  mutate(depression_yes  = factor(if_else(total_ces_t1 >= 16 & total_ces_t2 >= 16,"yes","no")))
ds_t1_t2 <- ds_t1_t2 %>% 
  mutate(anxiety_yes = if_else(total_gad_t1 >= 10 & total_gad_t2 >= 10, "yes","no"))

Count them

ds_t1_t2 %>% count(depression_yes)
ds_t1_t2 %>% count(anxiety_yes)

Create some categorical variables based on raw data

#categorical variables
ds_t1_t2 <- ds_t1_t2 %>% 
  mutate(across(c(sexo, escolaridade_superior, estado_civil_corrigido, quantos_filhos, plano_saude.x, como_vive.x, renda_familiar_mensal.x, pessoas_em_risco_casa.x,politica_dir_esq.x, politica_dir_esq.y), 
                .fns = list(cat = ~as.factor(.)),
                .names = "{fn}_{col}")) 

Create mudanca politica

ds_original_t1 %>% count(orientacao_politica, politica_dir_esq)
ds_original_t2 %>% count(orientacao_politica, politica_dir_esq)
ds_t1_t2 <- ds_t1_t2 %>% 
  mutate(politica_mudanca = 
           case_when(politica_dir_esq.x == politica_dir_esq.y ~ "igual",
                     TRUE ~ "diferente"))


ds_t1_t2 %>% count(politica_mudanca)

Check political wing transition

ds_t1_t2 %>% 
  filter(politica_mudanca == "diferente") %>% 
  select(politica_dir_esq.x, politica_dir_esq.y)
ds_t1_t2 %>% filter(!is.na(politica_dir_esq.x), !is.na(politica_dir_esq.y)) %>% count(politica_dir_esq.x)
ds_t1_t2 %>% filter(!is.na(politica_dir_esq.x), !is.na(politica_dir_esq.y)) %>% count(politica_dir_esq.y)

ds_t1_t2 %>% 
  filter(!is.na(politica_dir_esq.x), !is.na(politica_dir_esq.y)) %>% 
  tabyl(politica_dir_esq.x, politica_dir_esq.y) %>% #apresentar tabela
  adorn_totals(c("row", "col")) %>% 
  adorn_percentages("row") %>% 
  adorn_pct_formatting(rounding = "half up", digits = 1) %>% 
  adorn_ns()
 politica_dir_esq.x  apolitico    centro    direita   esquerda        Total
          apolitico 75.0% (18)  8.3% (2)  8.3%  (2)  8.3%  (2) 100.0%  (24)
             centro 11.1%  (1) 33.3% (3)  0.0%  (0) 55.6%  (5) 100.0%   (9)
            direita 11.1%  (3)  7.4% (2) 77.8% (21)  3.7%  (1) 100.0%  (27)
           esquerda  7.3%  (4)  1.8% (1)  3.6%  (2) 87.3% (48) 100.0%  (55)
              Total 22.6% (26)  7.0% (8) 21.7% (25) 48.7% (56) 100.0% (115)

plot political wing transition

#create a long dataset
d<-ds_t1_t2 %>% 
   mutate(subject = row_number()) %>%
  filter(!is.na(politica_dir_esq.x), !is.na(politica_dir_esq.y)) %>% 
  select(subject, politica_dir_esq.x, politica_dir_esq.y) %>% 
  pivot_longer(-subject, names_to = "survey", values_to = "response")

d<-d %>% 
  group_by(survey,subject, response) %>% 
  count() %>% 
  mutate(pct = n / sum(n))
  
library(ggalluvial)
#change levels order
d <- transform(d,response = factor(response, rev(levels(response))))

#plot
ggplot(d,
       aes(x = survey, stratum = response, alluvium = subject,
           y = n,
           fill = response)) + #data
  scale_x_discrete(expand = c(.1, .1)) + #
  geom_flow() + #shade area conecting the rectangles
  geom_stratum(alpha = .7) + 
  geom_text(aes(label = paste0(..stratum.., "\n", n, "\n", 
                             scales::percent(..prop..) )), stat = "stratum", size = 3) + #text inside each rectangle
  scale_fill_brewer(type = "qual", palette = "Set2") +
  theme_void() +
  theme(legend.position = "none") #hide legends

check the significance of the political transition

ds_t1_t2 %>% 
   mutate(subject = row_number()) %>%
  filter(!is.na(politica_dir_esq.x), !is.na(politica_dir_esq.y)) %>% 
  {mcnemar.test(.$politica_dir_esq.x, .$politica_dir_esq.y)}

    McNemar's Chi-squared test

data:  .$politica_dir_esq.x and .$politica_dir_esq.y
McNemar's chi-squared = 6.2, df = 6, p-value = 0.4012

Formalize political wing

ds_t1_t2 <- ds_t1_t2 %>% mutate(politica_dir_esq_ok = politica_dir_esq.x)
pacman::p_load_gh(
  "davidsjoberg/ggsankey"
)
df <- ds_t1_t2 %>% 
   mutate(subject = row_number()) %>% 
  select(subject, politica_dir_esq.x, politica_dir_esq.y) %>% 
  make_long(politica_dir_esq.x, politica_dir_esq.y)

ggplot(df, aes(x = x, next_x = next_x, node = node, next_node = next_node, fill = factor(node), label = node)) +
  geom_alluvial(flow.alpha = .6) +
  geom_alluvial_text(size = 3, color = "black") +
  #scale_fill_viridis_d() +
  theme_alluvial(base_size = 18) +
  labs(x = NULL) +
  theme(legend.position = "none",
        plot.title = element_text(hjust = .5))
rm(d, duplicate_cases_t2)
save.image("C:/Users/luisf/Dropbox/Puc-Rio/Projeto - COVID longitudinal/R base - covid 19 longitudinal.RData")

6.1 done

LS0tDQp0aXRsZTogIkNPVklELTE5IC0gKE1hbnVzY3JpcHQpIERhdGEgcHJvY2Vzc2luZyINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0aGVtZTogdW5pdGVkDQogICAgaGlnaGxpZ2h0OiB0ZXh0bWF0ZQ0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lDQotLS0NCg0KTHVpcyBBbnVuY2lhw6fDo28sIEx1Y2FzIEJhcnJvem8NCg0KDQpsYXN0IHVwZGF0ZWQ6IGByIGZvcm1hdChTeXMudGltZSgpLCAnJWQgJUIsICVZJylgDQoNCiMgTG9hZCBwYWNrYWdlcw0KDQpgYGAge3IgcGFja2FnZXMgfQ0KcGFjbWFuOjpwX2xvYWQoa25pdHIsDQogICAgICAgICAgICAgICBrYWJsZUV4dHJhLA0KICAgICAgICAgICAgICAgdGlkeXZlcnNlLA0KICAgICAgICAgICAgICAgamFuaXRvciwNCiAgICAgICAgICAgICAgIHN1bW1hcnl0b29scywNCiAgICAgICAgICAgICAgIERhdGFFeHBsb3JlciwNCiAgICAgICAgICAgICAgIHJlYWR4bCkNCg0KYGBgDQoNCiMgaW1wb3J0IGRhdGFiYXNlOiBUMSANCg0KYGBge3J9DQpkc19vcmlnaW5hbF90MSA8LSByZWFkX2NzdigiQzovVXNlcnMvbHVpc2YvRHJvcGJveC9QdWMtUmlvL1Byb2pldG8gLSBDT1ZJRCBsb25naXR1ZGluYWwvQ09WSUQtMTkgKHJlc3Bvc3RhcykgLSBSZXNwb3N0YXMgYW8gZm9ybXVsw6FyaW8gMS5jc3YiKQ0KYmFja3VwX2RzX3QxIDwtIGRzX29yaWdpbmFsX3QxDQpgYGANCg0KIyMgQ2xlYW4NCg0KPm1vZGlmaWNhciBub21lcw0KDQpgYGB7cn0NCmRzX29yaWdpbmFsX3QxIDwtIGNsZWFuX25hbWVzKGRzX29yaWdpbmFsX3QxKQ0KYGBgDQoNCj5SZW1vdmUgY29sdW1ucyBhbmQgcm93cyB3aXRoIGFsbCBtaXNzaW5nDQoNCmBgYHtyfQ0KZHNfb3JpZ2luYWxfdDEgPC0gamFuaXRvcjo6cmVtb3ZlX2VtcHR5KGRzX29yaWdpbmFsX3QxLCBjKCJyb3dzIiwgImNvbHMiKSkgI3VzZWxlc3MgaGVyZQ0KYGBgDQoNCg0KIyBGaXggdG8gbWF0Y2ggVDENCg0KIyMgRml4IFQxDQoNCiMjIyBlbWFpbA0KDQo+IE5vbWUNCg0KYGBge3J9DQpkc19vcmlnaW5hbF90MSA8LSBkc19vcmlnaW5hbF90MSAlPiUgDQogIHJlbmFtZShlbWFpbCA9IG5vX2Z1dHVyb19wb2RlbW9zX3RlX2NvbnRhY3Rhcl9wYXJhX3NhYmVyX3NvYnJlX3N1YV9zYXVkZV9zZV9zaW1fcXVhbF9lX3NldV9lX21haWwpDQpgYGANCg0KPiBGb3JtYXRvIGRvIGVtYWlsDQoNCmBgYHtyfQ0KZHNfb3JpZ2luYWxfdDEgPC0gZHNfb3JpZ2luYWxfdDEgJT4lIA0KICBtdXRhdGUoZW1haWxfY29ycmlnaWRvID0gdG9sb3dlcihlbWFpbCkpDQoNCmRzX29yaWdpbmFsX3QxIDwtIGRzX29yaWdpbmFsX3QxICU+JQ0KICBtdXRhdGUoZW1haWxfY29ycmlnaWRvID0gc3RyaW5naTo6c3RyaV90cmFuc19nZW5lcmFsKGVtYWlsX2NvcnJpZ2lkbywiTGF0aW4tQVNDSUkiKSkNCmBgYA0KDQoNCmBgYHtyfQ0KZHNfb3JpZ2luYWxfdDEgJT4lIA0KICBjb3VudChlbWFpbF9jb3JyaWdpZG8pICU+JSANCiAgYXJyYW5nZShlbWFpbF9jb3JyaWdpZG8pDQpgYGANCg0KPiBBbHRlcmFyIG8gZS1tYWlsIGRlaXhhbmRvIGFwZW5hcyBvcyB2w6FsaWRvcw0KDQpgYGB7cn0NCmRzX29yaWdpbmFsX3QxIDwtIGRzX29yaWdpbmFsX3QxICU+JSANCiAgbXV0YXRlKGVtYWlsX2NvcnJpZ2lkbzIgPSBzdHJpbmdyOjpzdHJfZXh0cmFjdChlbWFpbF9jb3JyaWdpZG8sICdAJykpICU+JSAjY29udHJvbGUNCiAgbXV0YXRlKGVtYWlsX3ZhbGlkbyA9IGlmX2Vsc2UoZW1haWxfY29ycmlnaWRvMiA9PSAiQCIsMSwwKSkgJT4lICAjY29udHJvbGUNCiAgbXV0YXRlKGVtYWlsX2NvcnJpZ2lkbyA9IGlmX2Vsc2UoZW1haWxfdmFsaWRvID09IDEsIGVtYWlsX2NvcnJpZ2lkbywgTkFfY2hhcmFjdGVyXykpICU+JSANCiAgc2VsZWN0KC1lbWFpbF9jb3JyaWdpZG8yLCAtZW1haWxfdmFsaWRvKQ0KYGBgDQoNCj4gVGlyYXIgY2FyYWN0ZXJlcyBpbnZhbGlkb3MgZSByZXNwb3N0YXMgaW52YWxpZGFzIChzaW0sIC0pDQoNCmBgYHtyfQ0KZHNfb3JpZ2luYWxfdDEgPC0gZHNfb3JpZ2luYWxfdDEgJT4lIA0KICBtdXRhdGUoZW1haWxfY29ycmlnaWRvID0gc3RyX3JlbW92ZV9hbGwoZW1haWxfY29ycmlnaWRvLCAiXnNpbSAtIikpICU+JSANCiAgbXV0YXRlKGVtYWlsX2NvcnJpZ2lkbyA9IHN0cl9yZW1vdmVfYWxsKGVtYWlsX2NvcnJpZ2lkbywgIl5zaW0sIikpICU+JSANCiAgbXV0YXRlKGVtYWlsX2NvcnJpZ2lkbyA9IHN0cl9yZW1vdmVfYWxsKGVtYWlsX2NvcnJpZ2lkbywgIl5zaW0uIikpIA0KYGBgDQoNCj4gVGlyYXIgZXNwYcOnb3MNCg0KYGBge3J9DQpkc19vcmlnaW5hbF90MSA8LSBkc19vcmlnaW5hbF90MSAlPiUgDQogIG11dGF0ZShlbWFpbF9jb3JyaWdpZG8gPSBzdHJfdHJpbShlbWFpbF9jb3JyaWdpZG8sIHNpZGUgPSBjKCJib3RoIiwgImxlZnQiLCAicmlnaHQiKSkpDQpgYGANCg0KPiBDb3JyZcOnw7VlcyBtYW51YWlzIGZlaXRhcyBwb3N0LWhvYyAoYXDDs3MgaWRlbnRpZmljYXIgcGFyZWFtZW50bykNCg0KYGBge3J9DQpkc19vcmlnaW5hbF90MSAgJT4lIA0KICBmaWx0ZXIoZW1haWxfY29ycmlnaWRvID09ICJoZW5yaXF1ZS44OEBhbmpvc0BnbWFpbC5jb20iKQ0KYGBgDQoNCmBgYHtyfQ0KZHNfb3JpZ2luYWxfdDEgPC0gZHNfb3JpZ2luYWxfdDEgJT4lIA0KICBtdXRhdGUoZW1haWxfY29ycmlnaWRvID0gcmVwbGFjZShlbWFpbF9jb3JyaWdpZG8sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtYWlsX2NvcnJpZ2lkbyA9PSAiaGVucmlxdWUuODhAYW5qb3NAZ21haWwuY29tIiwgImhlbnJpcXVlLjg4YW5qb3NAZ21haWwuY29tIikpIA0KYGBgDQoNCg0KYGBge3J9DQpkc19vcmlnaW5hbF90MSAgJT4lIA0KICBmaWx0ZXIoZW1haWxfY29ycmlnaWRvID09ICJsaXNlYW5lLnRoaXZlc0B1ZnNjLmJyIikNCmBgYA0KDQoNCmBgYHtyfQ0KZHNfb3JpZ2luYWxfdDEgPC0gZHNfb3JpZ2luYWxfdDEgJT4lIA0KICBtdXRhdGUoZW1haWxfY29ycmlnaWRvID0gcmVwbGFjZShlbWFpbF9jb3JyaWdpZG8sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtYWlsX2NvcnJpZ2lkbyA9PSAibGlzZWFuZS50aGl2ZXNAdWZzYy5iciIsICJsaXNlYW5ldGhpdmVzQGdtYWlsLmNvbSIpKSANCmBgYA0KDQoNCltFbWFpbCBsdWNhcyBlbSBtYXLDp28gMjUsIDIwMjFdDQoNCmBgYHtyfQ0KZHNfb3JpZ2luYWxfdDEgICU+JSANCiAgZmlsdGVyKGVtYWlsX2NvcnJpZ2lkbyA9PSAiaGVucmlxdWUuODhAYW5qb3NAZ21haWwuY29tIikgJT4lIG5yb3cNCmBgYA0KYGBge3J9DQpkc19vcmlnaW5hbF90MSAgJT4lIA0KICBmaWx0ZXIoZW1haWxfY29ycmlnaWRvID09ICJoZW5yaXF1ZS44OGFuam9zQGdtYWlsLmNvbSIpICU+JSBucm93DQpgYGANCg0KDQpgYGB7cn0NCmRzX29yaWdpbmFsX3QxICAlPiUgDQogIGZpbHRlcihlbWFpbF9jb3JyaWdpZG8gPT0gImxpc2VhbmUudGhpdmVzQHVmc2MuYnIiKSAlPiUgbnJvdw0KYGBgDQoNCg0KYGBge3J9DQpkc19vcmlnaW5hbF90MSAgJT4lIA0KICBmaWx0ZXIoZW1haWxfY29ycmlnaWRvID09ICJsaXNlYW5ldGhpdmVzQGdtYWlsLmNvbSIpICU+JSBucm93DQpgYGANCg0KDQo+IFZlcmlmaWNhciBkdXBsaWNhZG9zDQoNCg0KYGBge3J9DQpkc19vcmlnaW5hbF90MSAlPiUgDQogIGZpbHRlcighaXMubmEoZW1haWxfY29ycmlnaWRvKSkgJT4lICNkZXNjYXJ0YXIgbWlzc2luZw0KICBncm91cF9ieShlbWFpbF9jb3JyaWdpZG8pICU+JSAjYWdydXBhciBwb3IgZW1haWwNCiAgbXV0YXRlKGVzdHVkb18xID0gbGVuZ3RoKGVtYWlsX2NvcnJpZ2lkbykpICU+JSAjY29udGFyIHF1YW50YXMgdmV6ZXMgY2FkYSBwYXJ0aWNpcGFudGUgZmV6IGEgYXRpdmlkYWRlDQogIGZpbHRlcihlc3R1ZG9fMSA+MSkgJT4lIA0KICBjb3VudChlbWFpbF9jb3JyaWdpZG8pICU+JSANCiAgYWRvcm5fdG90YWxzKCkNCmBgYA0KDQo+IEEgYmFzZSBjb3JyZXRhIGRldmVyw6EgdGVyIHF1YW50b3MgY2Fzb3M/IA0KDQpgYGB7cn0NCjU0NC0yMCs5DQpgYGANCg0KDQoNCiMjIyBBanVzdGFyIHBlbGFzIGVzY2FsYXMgDQoNCg0KIyMjIENFUyANCg0KPiBjcmlhciB1bWEgZHVwbGljYWRhIHBhcmEgb3MgaXRlbnMgZGUgZGVwcmVzc2FvIA0KDQpgYGB7cn0NCmRzX29yaWdpbmFsX3QxIDwtIGRzX29yaWdpbmFsX3QxICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoYWJhaXhvX2hhX3VtYV9saXN0YV9kZV9zZW50aW1lbnRvc19lX2NvbXBvcnRhbWVudG9zX3Bvcl9mYXZvcl9hc3NpbmFsZV9hX2ZyZXF1ZW5jaWFfY29tX3F1ZV9saGVfb2NvcnJlcmFtX25hX3VsdGltYV9zZW1hbmFfZXVfbWVfY2hhdGVlaV9wb3JfY29pc2FzX3F1ZV9ub3JtYWxtZW50ZV9uYW9fbWVfY2hhdGVhdmFtOmFiYWl4b19oYV91bWFfbGlzdGFfZGVfc2VudGltZW50b3NfZV9jb21wb3J0YW1lbnRvc19wb3JfZmF2b3JfYXNzaW5hbGVfYV9mcmVxdWVuY2lhX2NvbV9xdWVfbGhlX29jb3JyZXJhbV9uYV91bHRpbWFfc2VtYW5hX2V1X21lX3NpbnRvX2Rlc2FuaW1hZG8pLA0KICAgICAgICAgICAgbGlzdChjYXQgPSB+cGFzdGUwKC4pKSkgJT4lICNjb3B5IGFsbCB2YXJpYWJsZXMgKGR1cGxpY2F0ZSkgDQogIHJlbmFtZV9hdCh2YXJzKGVuZHNfd2l0aCggIl9jYXQiKSksIGxpc3QofnBhc3RlMCgiY2VzX3QxXyIsIDE6MjApKSkgDQpgYGANCg0KDQo+IGFqdXN0YXIgdmFsb3JlcyB0MQ0KDQpgYGB7ciB9DQpkc19vcmlnaW5hbF90MSA8LSBkc19vcmlnaW5hbF90MSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJjZXNfdDFfIikpLA0KICAgICAgICAgICAgfnJlcGxhY2UoLiwuID09ICJSYXJhbWVudGUgKG1lbm9zIHF1ZSAxIGRpYSkiLCAwKSkNCmRzX29yaWdpbmFsX3QxIDwtIGRzX29yaWdpbmFsX3QxICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoImNlc190MV8iKSksDQogICAgICAgICAgICB+cmVwbGFjZSguLC4gPT0gIlBvdWNhcyB2ZXplcyAoMS0yIGRpYXMpIiwgMSkpDQpkc19vcmlnaW5hbF90MSA8LSBkc19vcmlnaW5hbF90MSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJjZXNfdDFfIikpLA0KICAgICAgICAgICAgfnJlcGxhY2UoLiwuID09ICLDgHMgdmV6ZXMgKDMtNCBkaWFzKSIsIDIpKQ0KZHNfb3JpZ2luYWxfdDEgPC0gZHNfb3JpZ2luYWxfdDEgJT4lIA0KICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiY2VzX3QxXyIpKSwNCiAgICAgICAgICAgIH5yZXBsYWNlKC4sLiA9PSAiUXVhc2Ugc2VtcHJlIG91IHNlbXByZSAoNS03IGRpYXMpIiwgMykpDQpgYGANCg0KDQo+IENvbnZlcnRlciBwYXJhIG51bWVyaWNvIA0KDQpgYGB7ciB9DQpkc19vcmlnaW5hbF90MSA8LSBkc19vcmlnaW5hbF90MSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJjZXNfdDFfIikpLCBhcy5udW1lcmljKQ0KYGBgDQoNCj4gY2hlY2FyIHJlc3Bvc3RhcyB0MQ0KDQpgYGB7cn0NCmRzX29yaWdpbmFsX3QxICU+JSANCiAgc2VsZWN0KHN0YXJ0c193aXRoKCJjZXNfdDFfIikpICU+JSANCiAgcGl2b3RfbG9uZ2VyKGV2ZXJ5dGhpbmcoKSkgJT4lIA0KICBnZ3Bsb3QoLiwgYWVzKG5hbWUsIHZhbHVlKSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIHRoZW1lX2J3KCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdD0xKSkgKw0KICBsYWJzKHggPSAiIiwgeSA9ICIiKQ0KYGBgDQoNCj4gSW52ZXJzw6NvIGRvcyBpdGVucyB0MQ0KDQpgYGB7ciAgfQ0KZHNfb3JpZ2luYWxfdDEgPC0gZHNfb3JpZ2luYWxfdDEgJT4lIA0KICBtdXRhdGVfYXQodmFycyhjZXNfdDFfNCwgDQogICAgICAgICAgICAgICAgIGNlc190MV84LCANCiAgICAgICAgICAgICAgICAgY2VzX3QxXzEyLCANCiAgICAgICAgICAgICAgICAgY2VzX3QxXzE2KSwgbGlzdCh+cGFzdGUoYWJzKDMtLikpICU+JSBhcy5udW1lcmljKC4pKSkNCmBgYA0KDQo+IENoZWNhciBzZSBuw6NvIGjDoSBjYXNvcyBhdXNlbnRlcyAgDQoNCmBgYHtyfQ0KZHNfb3JpZ2luYWxfdDEgJT4lIA0KICBmaWx0ZXIobmVzdGVfbW9tZW50b19lbV9zdWFfY2lkYWRlX2hhX2FsZ3VtYV9yZWNvbWVuZGFjYW9fb2ZpY2lhbF9wYXJhX2ZpY2FyX2VtX2Nhc2FfZV9vdV9ldml0YXJfc2FpciAhPSAiTsOjbyIpICU+JSANCiAgc2VsZWN0KGNlc190MV8xOmNlc190MV8yMCkgJT4lIA0KICBEYXRhRXhwbG9yZXI6OnByb2ZpbGVfbWlzc2luZygpDQpgYGANCg0KPiBDaGVjYXIgc2Ugb3MgdmFsb3JlcyBudW1lcmljb3MgZXN0w6NvIGNvcnJldG9zDQoNCmBgYHtyfQ0KZHNfb3JpZ2luYWxfdDEgJT4lIA0KICBzZWxlY3QoYWJhaXhvX2hhX3VtYV9saXN0YV9kZV9zZW50aW1lbnRvc19lX2NvbXBvcnRhbWVudG9zX3Bvcl9mYXZvcl9hc3NpbmFsZV9hX2ZyZXF1ZW5jaWFfY29tX3F1ZV9saGVfb2NvcnJlcmFtX25hX3VsdGltYV9zZW1hbmFfZXVfbWVfY2hhdGVlaV9wb3JfY29pc2FzX3F1ZV9ub3JtYWxtZW50ZV9uYW9fbWVfY2hhdGVhdmFtLCBjZXNfdDFfMSkNCmBgYA0KDQo+IENoZWNhciBvcyBpbnZlcnRpZG9zDQoNCmBgYHtyfQ0KZHNfb3JpZ2luYWxfdDEgJT4lIA0KICBzZWxlY3QoYWJhaXhvX2hhX3VtYV9saXN0YV9kZV9zZW50aW1lbnRvc19lX2NvbXBvcnRhbWVudG9zX3Bvcl9mYXZvcl9hc3NpbmFsZV9hX2ZyZXF1ZW5jaWFfY29tX3F1ZV9saGVfb2NvcnJlcmFtX25hX3VsdGltYV9zZW1hbmFfZXVfbWVfc2VudGlfdGFvX2JlbV9xdWFudG9fYXNfb3V0cmFzX3Blc3NvYXMsIGNlc190MV80KQ0KYGBgDQoNCg0KIyMjIGNhbGN1bGFyIHRvdGFpcyBDRVMgKFQxKQ0KDQpgYGB7ciB9DQojIEVTY2FsYSBkZSBkZXByZXNzw6NvKTsgKDIwIGl0ZW5zKQ0KZHNfb3JpZ2luYWxfdDEgPC0gZHNfb3JpZ2luYWxfdDEgJT4lIA0KICBtdXRhdGUodG90YWxfY2VzX3QxID0gcm93U3VtcyhzZWxlY3QoLixjZXNfdDFfMTpjZXNfdDFfMjApKSkNCmBgYA0KDQoNCmBgYHtyfQ0KZHNfb3JpZ2luYWxfdDEgJT4lIHNlbGVjdCh0b3RhbF9jZXNfdDEpICU+JSBoZWFkKCkNCmBgYA0KDQoNCj4gT2sNCg0KDQojIyMgR0FEIA0KDQoNCj4gQ3JpYXIgdW1hIGR1cGxpY2FkYSBjb20gb3MgaXRlbnMgZG8gR0FEIA0KDQpgYGB7ciB9DQpkc19vcmlnaW5hbF90MSA8LSAgZHNfb3JpZ2luYWxfdDEgJT4lIA0KICBtdXRhdGVfYXQodmFycyhkdXJhbnRlX2FzX3VsdGltYXNfMDJfc2VtYW5hc19jb21fcXVlX2ZyZXF1ZW5jaWFfdm9jZV9mb2lfaW5jb21vZGFkb19hX3BlbG9zX3Byb2JsZW1hc19hYmFpeG9fc2VudGlyX3NlX25lcnZvc29fYW5zaW9zb19vdV9tdWl0b190ZW5zbzpkdXJhbnRlX2FzX3VsdGltYXNfMDJfc2VtYW5hc19jb21fcXVlX2ZyZXF1ZW5jaWFfdm9jZV9mb2lfaW5jb21vZGFkb19hX3BlbG9zX3Byb2JsZW1hc19hYmFpeG9fc2VudGlyX21lZG9fY29tb19zZV9hbGdvX2hvcnJpdmVsX2Zvc3NlX2Fjb250ZWNlciksDQogICAgICAgICAgICBsaXN0KGNhdCA9IH5wYXN0ZTAoLikpKSAlPiUgI2NvcHkgYWxsIHZhcmlhYmxlcyAoZHVwbGljYXRlKSANCiAgcmVuYW1lX2F0KHZhcnMoZW5kc193aXRoKCAiX2NhdCIpKSwgbGlzdCh+cGFzdGUwKCJnYWRfdDFfIiwgMTo3KSkpIA0KDQpgYGANCg0KPiBhanVzdGFyIHZhbG9yZXMgdDENCg0KYGBge3IgfQ0KZHNfb3JpZ2luYWxfdDEgPC0gZHNfb3JpZ2luYWxfdDEgJT4lIA0KICAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoImdhZF90MV8iKSksDQogICAgICAgICAgICB+cmVwbGFjZSguLC4gPT0gIk5lbmh1bWEgdmV6IiwgMCkpDQoNCmRzX29yaWdpbmFsX3QxIDwtIGRzX29yaWdpbmFsX3QxICU+JSANCiAgIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJnYWRfdDFfIikpLA0KICAgICAgICAgICAgfnJlcGxhY2UoLiwuID09ICJQb3Vjb3MgZGlhcyIsIDEpKQ0KDQpkc19vcmlnaW5hbF90MSA8LSBkc19vcmlnaW5hbF90MSAlPiUgDQogICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiZ2FkX3QxXyIpKSwNCiAgICAgICAgICAgIH5yZXBsYWNlKC4sLiA9PSAiTWFpcyBkYSBtZXRhZGUgZG8gdGVtcG8iLCAyKSkNCg0KZHNfb3JpZ2luYWxfdDEgPC0gZHNfb3JpZ2luYWxfdDEgJT4lIA0KICAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoImdhZF90MV8iKSksDQogICAgICAgICAgICB+cmVwbGFjZSguLC4gPT0gIlF1YXNlIHRvZG9zIG9zIGRpYXMiLCAzKSkNCg0KYGBgDQoNCg0KPiBUcmFuc2Zvcm1hciBlbSBudW3DqXJpY2EgdDENCg0KYGBge3IgfQ0KZHNfb3JpZ2luYWxfdDEgPC0gZHNfb3JpZ2luYWxfdDEgJT4lIA0KICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiZ2FkX3QxXyIpKSwgYXMubnVtZXJpYykNCmBgYA0KDQo+IGNoZWNhciByZXNwb3N0YXMgdDENCg0KYGBge3J9DQpkc19vcmlnaW5hbF90MSAlPiUgDQogIHNlbGVjdChzdGFydHNfd2l0aCgiZ2FkX3QxXyIpKSAlPiUgDQogIHBpdm90X2xvbmdlcihldmVyeXRoaW5nKCkpICU+JSANCiAgZ2dwbG90KC4sIGFlcyhuYW1lLCB2YWx1ZSkpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICB0aGVtZV9idygpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3Q9MSkpICsNCiAgbGFicyh4ID0gIiIsIHkgPSAiIikNCmBgYA0KDQoNCiMjIyBjYWxjdWxhciB0b3RhaXMgdDENCg0KYGBge3IgfQ0KIyBFU2NhbGEgZGUgYW5zaWVkYWRlOyAoNyBpdGVucykNCmRzX29yaWdpbmFsX3QxIDwtIGRzX29yaWdpbmFsX3QxICU+JSANCiAgbXV0YXRlKHRvdGFsX2dhZF90MSA9IHJvd1N1bXMoc2VsZWN0KC4sc3RhcnRzX3dpdGgoImdhZF90MV8iKSkpKQ0KYGBgDQoNCg0KDQojIyBUb21hciB1bWEgZGVjaXNhbyBzb2JyZSBvIHF1ZSBmYXplciBjb20gcmVzcG9zdGFzIGR1cGxpY2FkYXMNCg0KPiBRdWFpcyBzYW8gb3MgY2Fzb3MgZHVwbGljYWRvcw0KDQpgYGB7cn0NCmRzX29yaWdpbmFsX3QxICU+JSANCiAgZmlsdGVyKCFpcy5uYShlbWFpbF9jb3JyaWdpZG8pKSAlPiUgI2Rlc2NhcnRhciBtaXNzaW5nDQogIGdyb3VwX2J5KGVtYWlsX2NvcnJpZ2lkbykgJT4lICNhZ3J1cGFyIHBvciBlbWFpbA0KICBtdXRhdGUoZXN0dWRvXzEgPSBsZW5ndGgoZW1haWxfY29ycmlnaWRvKSkgJT4lICNjb250YXIgcXVhbnRhcyB2ZXplcyBjYWRhIHBhcnRpY2lwYW50ZSBmZXogYSBhdGl2aWRhZGUNCiAgZmlsdGVyKGVzdHVkb18xID4xKSAlPiUgDQogIGNvdW50KGVtYWlsX2NvcnJpZ2lkbykgJT4lIA0KICBhZG9ybl90b3RhbHMoKQ0KYGBgDQoNCj4gVmVyaWZpY2FyIG9zIHJlc3VsdGFkb3Mgc8OjbyBpZ3VhaXMgcGFyYSBDRVMgZSBHQUQNCg0KYGBge3J9DQpkc19vcmlnaW5hbF90MSAlPiUgDQogIGZpbHRlcighaXMubmEoZW1haWxfY29ycmlnaWRvKSkgJT4lICNkZXNjYXJ0YXIgbWlzc2luZw0KICBncm91cF9ieShlbWFpbF9jb3JyaWdpZG8pICU+JSAjYWdydXBhciBwb3IgZW1haWwNCiAgbXV0YXRlKGVzdHVkb18xID0gbGVuZ3RoKGVtYWlsX2NvcnJpZ2lkbykpICU+JSAjY29udGFyIHF1YW50YXMgdmV6ZXMgY2FkYSBwYXJ0aWNpcGFudGUgZmV6IGEgYXRpdmlkYWRlDQogIGZpbHRlcihlc3R1ZG9fMSA+IDEpICU+JSANCiAgc2VsZWN0KHRvdGFsX2Nlc190MSwgdG90YWxfZ2FkX3QxKSAlPiUgDQogIGFycmFuZ2UoZW1haWxfY29ycmlnaWRvKSAlPiUgDQogIG11dGF0ZShsYWdfY2VzX3QxID0gbGFnKHRvdGFsX2Nlc190MSktdG90YWxfY2VzX3QxKSAlPiUgI3ZlcmlmaWNhciBzZSBvIHZhbG9yIGR1cGxpY2FkbyDDqSBpZ3VhbA0KICBtdXRhdGUobGFnX2dhZF90MSA9IGxhZyh0b3RhbF9nYWRfdDEpLXRvdGFsX2dhZF90MSkNCmBgYA0KDQoNCj4gRGVpeGFyIGFwZW5hcyAxIHJlc3VsdGFkbw0KDQpgYGB7cn0NCiMoNTMzKQ0KZHNfb3JpZ2luYWxfdDEgPC0gZHNfb3JpZ2luYWxfdDEgJT4lDQogIG11dGF0ZShyb3dfaWQgPSByb3dfbnVtYmVyKCkpICU+JSAjY3JpYXIgdW0gbnVtZXJvIHBhcmEgY2FkYSBsaW5oYQ0KICBtdXRhdGUoZW1haWxfY29ycmlnaWRvID0gaWZfZWxzZShpcy5uYShlbWFpbF9jb3JyaWdpZG8pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAocm93X251bWJlcigpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1haWxfY29ycmlnaWRvKSkgJT4lICNzZSBvIGVtYWlsIMOpIG1pc3NpbmcsIGNvbG9jYXIgdW0gbnVtZXJvIHVuaWNvDQogIGdyb3VwX2J5KGVtYWlsX2NvcnJpZ2lkbykgJT4lICNhZ3J1cGFyIHBvciBlbWFpbA0KICBtdXRhdGUoZ3JvdXBfaWQgPSBjdXJfZ3JvdXBfaWQoKSkgJT4lICNjcmlhciB1bWEgaWRlbnRpZmljYWNhbyB1bmljYQ0KICBtdXRhdGUoZXN0dWRvXzEgPSBsZW5ndGgoZW1haWxfY29ycmlnaWRvKSkgJT4lICAjdmVyaWZpY2FyIHF1YW50YXMgdmV6ZXMgY2FkYSBwYXJ0aWNpcGFudGUgZmV6IG8gZXN0dWRvIDENCiAgZGlzdGluY3QoZW1haWxfY29ycmlnaWRvLCAua2VlcF9hbGwgPSBUUlVFKSAlPiUgICNkZWl4YXIgYXBlbmFzIDEgZW1haWwgc2UgaG91dmVyIGRvaXMgb3UgbWFpcw0KICB1bmdyb3VwKCkgJT4lICNkZXNhZ3J1cGFyDQogIG11dGF0ZShlbWFpbF9jb3JyaWdpZG8gPSBpZl9lbHNlKHN0cl9kZXRlY3QoZW1haWxfY29ycmlnaWRvLCAiQCIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1haWxfY29ycmlnaWRvLCBOQV9jaGFyYWN0ZXJfKSkgJT4lICNub3ZhbWVudGUsIGNvbG9jYXIgbWlzc2luZyBwcm9zIGUtbWFpbHMNCiAgc2VsZWN0KGdyb3VwX2lkLCByb3dfaWQsZW1haWxfY29ycmlnaWRvLGVzdHVkb18xLGV2ZXJ5dGhpbmcoKSkNCmBgYA0KDQoNCj4gQ2hlY2FyIHNlIHPDsyBow6EgdW1hIHBlc3NvYSBwYXJhIGNhZGEgY2FzbyBkdXBsaWNhZG8NCg0KYGBge3J9DQpkc19vcmlnaW5hbF90MSAlPiUgDQogIGZpbHRlcihlbWFpbF9jb3JyaWdpZG8gPT0gImlzYWJlbGxlLmJiYXN0b3NAZ21haWwuY29tIiB8IGVtYWlsX2NvcnJpZ2lkbyA9PSAiaXRhbWFyYWx1Y2lhQG1lLmNvbSIpDQoNCmBgYA0KDQo+IFZlcmlmaWNhciBvIHRhbWFuaG8gZGEgYmFzZQ0KDQpgYGB7cn0NCmRzX29yaWdpbmFsX3QxICU+JSBucm93DQpgYGANCiMjIFNvY2lvZGVtb2dyYXBoaWMgZmVhdHVyZXMNCg0KYGBge3IsIGV2YWwgPSBGQUxTRSB9DQpkc19vcmlnaW5hbF90MSAlPiUgbmFtZXMNCmBgYA0KDQoNCj4gUmVuYW1lIA0KDQpgYGB7cn0NCmRzX29yaWdpbmFsX3QxIDwtIGRzX29yaWdpbmFsX3QxICU+JSANCiAgcmVuYW1lKA0KICAgIGZpY2FfZW1fY2FzYV90MSA9IGluY2x1aW5kb19hc19ob3Jhc19xdWVfdm9jZV9kb3JtZV9xdWFudGFzX2hvcmFzX3ZvY2VfdGVtX2ZpY2Fkb19lbV9jYXNhLA0KICAgIHRlbV9zYWlkb19kZV9jYXNhID0gZW1fbWVkaWFfcXVhbnRhc192ZXplc192b2NlX3RlbV9zYWlkb19kZV9jYXNhLA0KICAgIGZhbG91X2ZhbWlsaWFfcGVzc29hbG1lbnRlID0gY29tX3F1YW50YXNfcGVzc29hc19kZV9zdWFfZmFtaWxpYV92b2NlX2ZhbG91X2hvamVfcGVzc29hbG1lbnRlLA0KICAgIGZhbG91X2ZhbWlsaWFfdGVsZWZvbmUgPSBjb21fcXVhbnRhc19wZXNzb2FzX2RlX3N1YV9mYW1pbGlhX3ZvY2VfZmFsb3VfaG9qZV9wb3JfdGVsZWZvbmVfb3VfdmlkZW9fY29uZmVyZW5jaWEsDQogICAgZmFsb3VfYW1pZ29zX3RlbGVmb25lID0gY29tX3F1YW50b3NfYW1pZ29zX3ZvY2VfZmFsb3VfaG9qZV9wb3JfdGVsZWZvbmVfb3VfdmlkZW9fY29uZmVyZW5jaWEsDQogICAgdGVzdG91X2Nvcm9uYXZpcnVzID0gdm9jZV9qYV9mb2lfdGVzdGFkb19wYXJhX2Nvcm9uYXZpcnVzLA0KICAgIGNvbmhlY2VfYWxndWVtX2Nvcm9uYXZpcnVzID0gdm9jZV9qYV90ZXZlX2NvbnRhdG9fY29tX2FsZ3VlbV9jb21fY29yb25hdmlydXMsDQogICAgc2VndWVfcmVjb21lbmRhY29lcyA9IHZvY2VfdGVtX3NlZ3VpZG9fYXNfcmVjb21lbmRhY29lc19nZXJhaXNfZGVfaGlnaWVuZV9sYXZhcl9hc19tYW9zX2V2aXRhcl90b2Nhcl9ub19yb3N0b19ldGMsDQogICAgY29uY29yZG9fY292aWRfcHJlb2N1cGFjYW9fc2F1ZGUgPSBpbmRpcXVlX29fcXVhbnRvX3ZvY2VfY29uY29yZGFfb19jb3JvbmF2aXJ1c19lX3VtYV9ncmFuZGVfcHJlb2N1cGFjYW9fZGVfc2F1ZGVfcHVibGljYSwNCiAgICBjb25jb3Jkb19xdWFyZW50ZW5hID0gaW5kaXF1ZV9vX3F1YW50b192b2NlX2NvbmNvcmRhX2FfcXVhcmVudGVuYV9mb2lfdW1hX21lZGlkYV9hY2VydGFkYSwNCiAgICB0cmFiYWxob19hbnRlc19xdWFyZW50ZW5hID0gYW50ZXNfZGFfZXBvY2FfZGVfcXVhcmVudGVuYV9jb3JvbmF2aXJ1c192b2NlLA0KICAgIHRyYWJhbGhvX2Fnb3JhX3F1YXJlbnRlbmEgPSBhZ29yYV9uZXN0YV9lcG9jYV9kZV9xdWFyYW50ZW5hX2Nvcm9uYXZpcnVzLA0KICAgIGFyZWFfcHJvZmlzc2FvID0gc2Vfdm9jZV90cmFiYWxoYV9zdWFfYXJlYV9wcm9maXNzaW9uYWxfcHJpbmNpcGFsX2UsDQogICAgcHJvZmlzc2FvID0gYV9zdWFfcHJvZmlzc2FvX2UsDQogICAgcmVuZGFfYW50ZXMgPSBlbV9tZWRpYV9zdWFfcmVuZGFfbWVuc2FsX2JydXRhX2VtX3JlYWlzX2FudGVzX2RhX3F1YXJlbnRlbmFfY29yb25hdmlydXNfZXJhLA0KICAgIHJlbmRhX3F1YXJlbnRlbmEgPSBlbV9tZWRpYV9zdWFfcmVuZGFfbWVuc2FsX2JydXRhX2VtX3JlYWlzX2Fnb3JhX2R1cmFudGVfYV9xdWFyZW50ZW5hX2Nvcm9uYXZpcnVzX2UsDQogICAgcHJlb2N1cGFjYW9fcGFnYXJfY29udGEgPSB2b2NlX2VzdGFfcHJlb2N1cGFkb19wb3JfdGVyX2RpZmljdWxkYWRlc19lbV9wYWdhcl9zdWFzX2NvbnRhc19wcmluY2lwYWlzX2NvbW9fYWx1Z3VlbF9vdV9wcmVzdGFjb2VzX2Rlc3RlX21lc19kZXZpZG9fYV9xdWFyZW50ZW5hX2Nvcm9uYXZpcnUsDQogICAgcGVuc2FfZW1fYWRpYXJfcGFnYW1lbnRvID0gZW1fY2Fzb19hZmlybWF0aXZvX3BlbnNhX2VtX2FkaWFtZW50b19kZXN0ZV9tZXMsDQogICAgcHJlb2N1cGFjYW9fZWNvbm9taWFfZ2VyYWwgPSBxdWFsX2VfYV9zdWFfcHJlb2N1cGFjYW9fZW1fcmVsYWNhb19hb3NfaXRlbnNfYWJhaXhvX2FfZWNvbm9taWFfZW1fZ2VyYWwsDQogICAgcHJlb2N1cGFjYW9fc2l0dWFjYW9fZmluYW5jZWlyYSA9IHF1YWxfZV9hX3N1YV9wcmVvY3VwYWNhb19lbV9yZWxhY2FvX2Fvc19pdGVuc19hYmFpeG9fYV9zdWFfcHJvcHJpYV9zaXR1YWNhb19maW5hbmNlaXJhLA0KICAgIHByZW9jdXBhY2FvX3N1YV9zYXVkZSA9IHF1YWxfZV9hX3N1YV9wcmVvY3VwYWNhb19lbV9yZWxhY2FvX2Fvc19pdGVuc19hYmFpeG9fYV9zdWFfc2F1ZGVfc2VfbmFvX2VzdGl2ZXJfaW5mZWN0YWRhLA0KICAgIHByZW9jdXBhY2FvX3NhdWRlX2FtaWdvc19mYW1pbGlhID0gcXVhbF9lX2Ffc3VhX3ByZW9jdXBhY2FvX2VtX3JlbGFjYW9fYW9zX2l0ZW5zX2FiYWl4b19hX3NhdWRlX2Rvc19tZW1icm9zX2RhX2ZhbWlsaWFfZV9kb3NfYW1pZ29zX3Byb3hpbW9zLA0KICAgIHByZW9jdXBhY2FvX2NvZXNhb19zb2NpYWwgPSBxdWFsX2VfYV9zdWFfcHJlb2N1cGFjYW9fZW1fcmVsYWNhb19hb3NfaXRlbnNfYWJhaXhvX2FfY29lc2FvX3NvY2lhbCwNCiAgICBwcmVvY3VwYWNhb19wcm9kdXRvc19hbGltZW50YWNhb19oaWdpZW5lX21lZGljYW1lbnRvcyA9IHF1YWxfZV9hX3N1YV9wcmVvY3VwYWNhb19lbV9yZWxhY2FvX2Fvc19pdGVuc19hYmFpeG9fZm9ybmVjaW1lbnRvX2RlX3Byb2R1dG9zX2ltcG9ydGFudGVzX2NvbW9fYWxpbWVudG9zX3Byb2R1dG9zX2RlX2hpZ2llbmVfZV9tZWRpY2FtZW50b3MsDQogICAgcHJlb2N1cGFjYW9fcHJlY29fcHJvZHV0b3MgPSBxdWFsX2VfYV9zdWFfcHJlb2N1cGFjYW9fZW1fcmVsYWNhb19hb3NfaXRlbnNfYWJhaXhvX2FfYWNlc3NpYmlsaWRhZGVfZG9zX3ByZWNvc19kZXN0ZXNfcHJvZHV0b3MsDQogICAgcHJlb2N1cGFjYW9fcHJlY29fYWNvZXMgPSBxdWFsX2VfYV9zdWFfcHJlb2N1cGFjYW9fZW1fcmVsYWNhb19hb3NfaXRlbnNfYWJhaXhvX2FfZXZvbHVjYW9fZG9fcHJlY29fZGFzX2Fjb2VzX2VfZGVfb3V0cmFzX2Zvcm1hc19kZV9pbnZlc3RpbWVudG8sDQogICAgcHJlb2N1cGFjYW9fcmVhbGl6YWNhb19lc2NvbGFyX2ZpbGhvID0gcXVhbF9lX2Ffc3VhX3ByZW9jdXBhY2FvX2VtX3JlbGFjYW9fYW9zX2l0ZW5zX2FiYWl4b19hc19yZWFsaXphY29lc19lc2NvbGFyZXNfZG9zX3NldXNfZmlsaG9zLA0KICAgIGJlYmlkYV9xdWVfdXNhID0gcXVhbF9vX3RpcG9fZGVfYmViaWRhX2FsY29vbGljYV9xdWVfdm9jZV9tYWlzX2NvbnNvbWVfZGVpeGVfZW1fYnJhbmNvX3NlX25lbmh1bWEsDQogICAgaWRhZGUgPSBpZGFkZV9lbV9hbm9zLA0KICAgIGVzY29sYXJpZGFkZSA9IHN1YV9lc2NvbGFyaWRhZGUsDQogICAgZXN0YWRvID0gb19lc3RhZG9fcXVlX3ZvY2VfbW9yYV9lLA0KICAgIGNpZGFkZSA9IGFfY2lkYWRlX3F1ZV92b2NlX21vcmFfZSwNCiAgICBxdWFudG9zX2ZpbGhvcyA9IHF1YW50b3NfZmlsaG9zX3ZvY2VfdGVtLA0KICAgIHBsYW5vX3NhdWRlID0gdm9jZV90ZW1fcGxhbm9fZGVfc2F1ZGUsDQogICAgY29tb192aXZlID0gcXVhbF9kYXNfc2VndWludGVzX2FsdGVybmF0aXZhc19tZWxob3JfZGVzY3JldmVtX3N1YV9zaXR1YWNhb19ub19tb21lbnRvLA0KICAgIHBlc3NvYXNfbmFfY2FzYSA9IHF1YW50YXNfcGVzc29hc19jb250YW5kb19jb21fdm9jZV9tb3JhbV9lbV9zdWFfY2FzYSwNCiAgICByZW5kYV9mYW1pbGlhcl9tZW5zYWwgPSBlbV9yZWxhY2FvX2Ffc3VhX3JlbmRhX2ZhbWlsaWFyX21lbnNhbF9vdV9zZWphX2FfcmVuZGFfZGFzX3Blc3NvYXNfbW9yYWRvcmFzX2RhX21lc21hX2Nhc2EsDQogICAgcGVzc29hc19lbV9yaXNjb19jYXNhID0gcXVhbnRhc19wZXNzb2FzX2RvX2dydXBvX2RlX3Jpc2NvX21vcmFtX2NvbnRpZ29fZXhfcGVzb3Nhc19jb21fNjBfYW5vc19vdV9tYWlzX3BvcnRhZG9yZXNfZGVfZG9lbmNhc19jYXJkaWFjYXNfaGlwZXJ0ZW5zYW9fZGlhYmV0ZXNfZXRjLA0KICAgIG9yaWVudGFjYW9fcG9saXRpY2EgPSBub3Nfc2FiZW1vc19xdWVfcXVlc3RvZXNfcG9saXRpY2FzX3Nhb19kZW5zYXNfZV9tZXJlY2VtX3VtYV9lc3BlY2lhbF9hdGVuY2FvX25vX2VudGFudG9fZW1fcmVsYWNhb19hX29yaWVudGFjYW9fcG9saXRpY2FfZXVfbWVfY29uc2lkZXJvDQogICkNCmBgYA0KDQo+IFRyYW5zZm9ybSBpbnRvIGZhY3Rvcg0KDQoNCmBgYHtyfQ0KZHNfb3JpZ2luYWxfdDEgPC0gZHNfb3JpZ2luYWxfdDEgJT4lIA0KICBtdXRhdGUoYWNyb3NzKGMoZmljYV9lbV9jYXNhX3QxLA0KICAgICAgICAgICAgICAgICAgdGVtX3NhaWRvX2RlX2Nhc2EsDQogICAgICAgICAgICAgICAgICBmYWxvdV9mYW1pbGlhX3Blc3NvYWxtZW50ZSwNCiAgICAgICAgICAgICAgICAgIGZhbG91X2ZhbWlsaWFfdGVsZWZvbmUsDQogICAgICAgICAgICAgICAgICBmYWxvdV9hbWlnb3NfdGVsZWZvbmUsDQogICAgICAgICAgICAgICAgICB0ZXN0b3VfY29yb25hdmlydXMsDQogICAgICAgICAgICAgICAgICBjb25oZWNlX2FsZ3VlbV9jb3JvbmF2aXJ1cywNCiAgICAgICAgICAgICAgICAgIHNlZ3VlX3JlY29tZW5kYWNvZXMsDQogICAgICAgICAgICAgICAgICBjb25jb3Jkb19jb3ZpZF9wcmVvY3VwYWNhb19zYXVkZSwNCiAgICAgICAgICAgICAgICAgIGNvbmNvcmRvX3F1YXJlbnRlbmEsDQogICAgICAgICAgICAgICAgICB0cmFiYWxob19hbnRlc19xdWFyZW50ZW5hLA0KICAgICAgICAgICAgICAgICAgdHJhYmFsaG9fYWdvcmFfcXVhcmVudGVuYSwNCiAgICAgICAgICAgICAgICAgIGFyZWFfcHJvZmlzc2FvLA0KDQogICAgICAgICAgICAgICAgICBwcmVvY3VwYWNhb19wYWdhcl9jb250YSwNCiAgICAgICAgICAgICAgICAgIHBlbnNhX2VtX2FkaWFyX3BhZ2FtZW50bywNCiAgICAgICAgICAgICAgICAgIHByZW9jdXBhY2FvX2Vjb25vbWlhX2dlcmFsLA0KICAgICAgICAgICAgICAgICAgcHJlb2N1cGFjYW9fc2l0dWFjYW9fZmluYW5jZWlyYSwNCiAgICAgICAgICAgICAgICAgIHByZW9jdXBhY2FvX3N1YV9zYXVkZSwNCiAgICAgICAgICAgICAgICAgIHByZW9jdXBhY2FvX3NhdWRlX2FtaWdvc19mYW1pbGlhLA0KICAgICAgICAgICAgICAgICAgcHJlb2N1cGFjYW9fY29lc2FvX3NvY2lhbCwNCiAgICAgICAgICAgICAgICAgIHByZW9jdXBhY2FvX3Byb2R1dG9zX2FsaW1lbnRhY2FvX2hpZ2llbmVfbWVkaWNhbWVudG9zLA0KICAgICAgICAgICAgICAgICAgcHJlb2N1cGFjYW9fcHJlY29fcHJvZHV0b3MsDQogICAgICAgICAgICAgICAgICBwcmVvY3VwYWNhb19wcmVjb19hY29lcywNCiAgICAgICAgICAgICAgICAgIHByZW9jdXBhY2FvX3JlYWxpemFjYW9fZXNjb2xhcl9maWxobywNCiAgICAgICAgICAgICAgICAgIGJlYmlkYV9xdWVfdXNhLA0KICAgICAgICAgICAgICAgICAgc2V4bywNCiAgICAgICAgICAgICAgICAgIGVzY29sYXJpZGFkZSwNCiAgICAgICAgICAgICAgICAgIGVzdGFkbywNCiAgICAgICAgICAgICAgICAgIGNpZGFkZSwNCiAgICAgICAgICAgICAgICAgIHBsYW5vX3NhdWRlLA0KICAgICAgICAgICAgICAgICAgY29tb192aXZlLA0KICAgICAgICAgICAgICAgICAgcmVuZGFfZmFtaWxpYXJfbWVuc2FsLA0KICAgICAgICAgICAgICAgICAgcGVzc29hc19lbV9yaXNjb19jYXNhLA0KICAgICAgICAgICAgICAgICAgb3JpZW50YWNhb19wb2xpdGljYSksDQogICAgICAgICAgICAgICAgZmFjdG9yKSkNCmBgYA0KDQo+IEZpeCBzb21lIGZhY3RvciBsZXZlbHMNCg0KRmljYSBlbSBjYXNhDQoNCmBgYHtyfQ0KZHNfb3JpZ2luYWxfdDEgPC0gZHNfb3JpZ2luYWxfdDEgJT4lIA0KICBtdXRhdGVfYXQodmFycyhmaWNhX2VtX2Nhc2FfdDEpLCB+ZmN0X3JlbGV2ZWwoLiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoIkVudHJlIDEgYSA0IGhvcmFzIHBvciBkaWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbnRyZSA1IGEgOCBob3JhcyBwb3IgZGlhIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVudHJlIDkgYSAxMiBob3JhcyBwb3IgZGlhIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVudHJlIDEzIGEgMTYgaG9yYXMgcG9yIGRpYSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbnRyZSAxNyBhIDIwIGhvcmFzIHBvciBkaWEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFpcyBkZSAyMCBob3JhcyBwb3IgZGlhIG91IG8gZGlhIHRvZG8iKSkpDQpgYGANCg0KU2FpIGRlIGNhc2ENCg0KYGBge3J9DQpkc19vcmlnaW5hbF90MSA8LSBkc19vcmlnaW5hbF90MSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKHRlbV9zYWlkb19kZV9jYXNhKSwgfmZjdF9yZWxldmVsKC4sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJOZW5odW1hIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMSB2ZXogcG9yIGRpYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIgdmV6ZXMgcG9yIGRpYSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzIHZlemVzIHBvciBkaWEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFpcyBkZSAzIHZlemVzIHBvciBkaWEiKSkpDQpgYGANCg0KRmFsb3UgZmFtaWxpYSBwZXNzb2FsbWVudGUNCg0KYGBge3J9DQpkc19vcmlnaW5hbF90MSA8LSBkc19vcmlnaW5hbF90MSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGZhbG91X2ZhbWlsaWFfcGVzc29hbG1lbnRlKSwgfmZjdF9yZWxldmVsKC4sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJOZW5odW1hIikpKSANCg0KYGBgDQoNCg0KUHJlb2N1cGFjYW8gY292aWQgZSBzYXVkZQ0KDQpgYGB7cn0NCmRzX29yaWdpbmFsX3QxIDwtIGRzX29yaWdpbmFsX3QxICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoY29uY29yZG9fcXVhcmVudGVuYSwgY29uY29yZG9fY292aWRfcHJlb2N1cGFjYW9fc2F1ZGUpLCB+ZmN0X3JlbGV2ZWwoLiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoIkV1IGRpc2NvcmRvIGZvcnRlbWVudGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFdSBkaXNjb3JkbyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVzdG91IG5ldXRybyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFdSBjb25jb3JkbyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFdSBjb25jb3JkbyBmb3J0ZW1lbnRlIikpKQ0KYGBgDQoNCnByZW9jdXBhY2FvIGdlcmFsDQoNCmBgYHtyfQ0KZHNfb3JpZ2luYWxfdDEgPC0gZHNfb3JpZ2luYWxfdDEgJT4lIA0KICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgicHJlb2N1cGFjYW9fIikpLCB+ZmN0X3JlbGV2ZWwoLiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoIk5lbmh1bWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3VjYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhc3RhbnRlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4dHJlbWEiKSkpDQpgYGANCg0KcXVhbnRvX3RlbXBvX3ZvY2VfYWNoYV9xdWVfcXVlX2FfdmlkYV92b2x0YXJhX2FvX25vcm1hbA0KDQpgYGB7cn0NCmRzX29yaWdpbmFsX3QxIDwtIGRzX29yaWdpbmFsX3QxICU+JSANCiAgbXV0YXRlX2F0KHZhcnMocXVhbnRvX3RlbXBvX3ZvY2VfYWNoYV9xdWVfcXVlX2FfdmlkYV92b2x0YXJhX2FvX25vcm1hbCksIH5mY3RfcmVsZXZlbCguLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiQW50ZXMgZG8gc2VndW5kbyBzZW1lc3RyZSBkZSAyMDIwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gc2VndW5kbyBzZW1lc3RyZSBkZSAyMDIwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU8OzIGVtIDIwMjEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAyMiBvdSBkZXBvaXMiKSkpDQpgYGANCg0KZnVtbw0KDQpgYGB7cn0NCmRzX29yaWdpbmFsX3QxIDwtIGRzX29yaWdpbmFsX3QxICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoYW50ZXNfZGFfcXVhcmVudGVuYV9jb3JvbmF2aXJ1c192b2NlX2Z1bWF2YSksIH5mY3RfcmVsZXZlbCguLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiTsOjbywgbsOjbyBmdW1hdmEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbnRyZSAxIGUgNSBjaWdhcnJvIHBvciBkaWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdMOpIDIwIGNpZ2Fycm9zIHBvciBkaWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYWlzIGRlIDIwIGNpZ2Fycm9zIHBvciBkaWEiKSkpDQpgYGANCg0KDQpgYGB7cn0NCmRzX29yaWdpbmFsX3QxIDwtIGRzX29yaWdpbmFsX3QxICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoYWdvcmFfZHVyYW50ZV9hX3F1YXJlbnRlbmFfY29yb25hdmlydXNfdm9jZV9mdW1hKSwgfmZjdF9yZWxldmVsKC4sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJOw6NvLCBuw6NvIGZ1bW8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbnRyZSAxIGUgNSBjaWdhcnJvIHBvciBkaWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdMOpIDIwIGNpZ2Fycm9zIHBvciBkaWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYWlzIGRlIDIwIGNpZ2Fycm9zIHBvciBkaWEiKSkpDQpgYGANCg0KQmViaWRhDQoNCmBgYHtyfQ0KZHNfb3JpZ2luYWxfdDEgPC0gZHNfb3JpZ2luYWxfdDEgJT4lIA0KICBtdXRhdGVfYXQodmFycyhhbnRlc19kYV9xdWFyZW50ZW5hX2Nvcm9uYXZpcnVzX3ZvY2VfYmViaWEpLCB+ZmN0X3JlbGV2ZWwoLiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoIk7Do28sIG7Do28gYmViaWEiKSkpDQpgYGANCg0KYGBge3J9DQpkc19vcmlnaW5hbF90MSA8LSBkc19vcmlnaW5hbF90MSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGFnb3JhX2R1cmFudGVfYV9xdWFyZW50ZW5hX2Nvcm9uYXZpcnVzX3ZvY2VfYmViZSksIH5mY3RfcmVsZXZlbCguLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiTsOjbywgbsOjbyBiZWJvIikpKQ0KYGBgDQoNCg0KRXhlcmNpY2lvcyBmw61zaWNvcw0KDQpgYGB7cn0NCmRzX29yaWdpbmFsX3QxIDwtIGRzX29yaWdpbmFsX3QxICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoYW50ZXNfZGFfcXVhcmVudGVuYV9jb3JvbmF2aXJ1c192b2NlX2ZhemlhX2V4ZXJjaWNpb3NfZmlzaWNvcywgYWdvcmFfZHVyYW50ZV9hX3F1YXJlbnRlbmFfY29yb25hdmlydXNfdm9jZV9mYXpfZXhlcmNpY2lvc19maXNpY29zKSwgfmZjdF9yZWxldmVsKC4sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJOw6NvLCBuZW5odW0iLA0KICAgICAgICAgICJQb3VjbyAoMSB2ZXogcG9yIHNlbWFuYSkiLA0KICAgICAgICAgICJNb2RlcmFkbyAoMiBhIDMgdmV6ZXMgcG9yIHNlbWFuYSkiLA0KICAgICAgICAgICJNdWl0byAobWFpcyBxdWUgMyB2ZXplcyBwb3Igc2VtYW5hKSIpKSkNCmBgYA0KDQpFc2NvbGFyaWRhZGUNCg0KYGBge3J9DQpkc19vcmlnaW5hbF90MSA8LSBkc19vcmlnaW5hbF90MSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGVzY29sYXJpZGFkZSksIH5mY3RfcmVsZXZlbCguLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiRW5zaW5vIGZ1bmRhbWVudGFsIGluY29tcGxldG8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbnNpbm8gZnVuZGFtZW50YWwgY29tcGxldG8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbnNpbm8gbcOpZGlvIGluY29tcGxldG8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbnNpbm8gbcOpZGlvIGNvbXBsZXRvIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW5zaW5vIHN1cGVyaW9yIGluY29tcGxldG8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbnNpbm8gc3VwZXJpb3IgY29tcGxldG8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQw7NzLWdyYWR1YcOnw6NvIikpKQ0KYGBgDQoNCg0KUmlvIGUgc2FvIHBhdWxvDQoNCmBgYHtyfQ0KZHNfb3JpZ2luYWxfdDEgPC0gZHNfb3JpZ2luYWxfdDEgJT4lIA0KICBtdXRhdGUocmlvX3NwID0gIGNhc2Vfd2hlbigNCiAgICBlc3RhZG8gPT0gIlJpbyBkZSBKYW5laXJvIChSSikiIH4gIlJKIiwNCiAgICBlc3RhZG8gPT0gIlPDo28gUGF1bG8gKFNQKSIgfiAiU1AiLA0KICAgIGlzLm5hKGVzdGFkbykgfiBOQV9jaGFyYWN0ZXJfLA0KICAgIFRSVUUgfiAiT3V0cm9zIikpDQoNCmRzX29yaWdpbmFsX3QxIDwtIGRzX29yaWdpbmFsX3QxICU+JSBtdXRhdGUocmlvX3NwPWFzLmZhY3RvcihyaW9fc3ApKQ0KYGBgDQoNCg0KDQpRdG9zIGZpbGhvcw0KDQpgYGB7cn0NCmRzX29yaWdpbmFsX3QxIDwtIGRzX29yaWdpbmFsX3QxICU+JSANCiAgbXV0YXRlX2F0KHZhcnMocXVhbnRvc19maWxob3MpLCB+ZmN0X3JlbGV2ZWwoLiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoIk5lbmh1bSIpKSkNCmBgYA0KDQoNClBlc3NvYXMgbmEgY2FzYQ0KDQpgYGB7cn0NCmRzX29yaWdpbmFsX3QxIDwtIGRzX29yaWdpbmFsX3QxICU+JSANCiAgbXV0YXRlKHBlc3NvYXNfbmFfY2FzYSA9IGFzLm51bWVyaWMocGVzc29hc19uYV9jYXNhKSkNCmBgYA0KDQoNClBlc3NvYXMgZW0gcmlzY28NCg0KYGBge3J9DQpkc19vcmlnaW5hbF90MSA8LSBkc19vcmlnaW5hbF90MSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKHBlc3NvYXNfZW1fcmlzY29fY2FzYSksIH5mY3RfcmVsZXZlbCguLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiTmVuaHVtYSIpKSkNCmBgYA0KDQoNClJlbmRhIGZhbWlsaWFyDQoNCmBgYHtyfQ0KZHNfb3JpZ2luYWxfdDEgPC0gZHNfb3JpZ2luYWxfdDEgJT4lIA0KICBtdXRhdGVfYXQodmFycyhyZW5kYV9mYW1pbGlhcl9tZW5zYWwpLCB+ZmN0X3JlbGV2ZWwoLiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoIkF0w6kgUiQgMS45MDgiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYWlzIGRlIFIkIDEuOTA4IGF0w6kgUiQgMi44NjIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYWlzIGRlIFIkIDIuODYyIGF0w6kgUiQgNS43MjQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYWlzIGRlIFIkIDUuNzI0IGF0w6kgUiQgOS41NDAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYWlzIGRlIFIkIDkuNTQwIGF0w6kgUiQgMTQuMzEwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWNpbWEgZGUgUiQgMTQuMzEwIGF0ZSBSJCAyMy44NTAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBY2ltYSBkZSBSJCAyMy44NTAiKSkpDQpgYGANCg0KDQoNCk9yaWVudGHDp8OjbyBwb2zDrXRpY2ENCg0KYGBge3J9DQpkc19vcmlnaW5hbF90MSA8LSBkc19vcmlnaW5hbF90MSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKG9yaWVudGFjYW9fcG9saXRpY2EpLCB+ZmN0X3JlbGV2ZWwoLiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoIlNvdSBhcG9sw610aWNvIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGUgZXNxdWVyZGEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZSBjZW50cm8gZXNxdWVyZGEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZSBjZW50cm8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZSBjZW50cm8gZGlyZWl0YSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlIGRpcmVpdGEiKSkpDQpgYGANCg0KDQpPcmllbnRhY2FvIHBvbGl0aWNhIChlc3F1ZXJkYSB2cyBkaXJlaXRhKQ0KDQpgYGB7cn0NCmRzX29yaWdpbmFsX3QxPC1kc19vcmlnaW5hbF90MSAlPiUgbXV0YXRlKHBvbGl0aWNhX2Rpcl9lc3EgPSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3IoY2FzZV93aGVuKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50YWNhb19wb2xpdGljYSA9PSAiRGUgZXNxdWVyZGEiIH4gImVzcXVlcmRhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudGFjYW9fcG9saXRpY2EgPT0gIkRlIGNlbnRybyBlc3F1ZXJkYSIgfiAiZXNxdWVyZGEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50YWNhb19wb2xpdGljYSA9PSAiRGUgY2VudHJvIiB+ICJjZW50cm8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50YWNhb19wb2xpdGljYSA9PSAiRGUgY2VudHJvIGRpcmVpdGEiIH4gImRpcmVpdGEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50YWNhb19wb2xpdGljYSA9PSAiRGUgZGlyZWl0YSIgfiAiZGlyZWl0YSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmllbnRhY2FvX3BvbGl0aWNhID09ICJTb3UgYXBvbMOtdGljbyIgfiAiYXBvbGl0aWNvIikpKQ0KDQpgYGANCg0KYGBge3J9DQpkc19vcmlnaW5hbF90MSAlPiUgY291bnQocG9saXRpY2FfZGlyX2VzcSkNCmBgYA0KDQoNCkVzdGFkbyBjaXZpbA0KDQpgYGB7cn0NCmRzX29yaWdpbmFsX3QxICU+JSBjb3VudChlc3RhZG9fY2l2aWwpDQpkc19vcmlnaW5hbF90MSA8LSBkc19vcmlnaW5hbF90MSAlPiUgDQogIG11dGF0ZShlc3RhZG9fY2l2aWxfY29ycmlnaWRvID0gY2FzZV93aGVuKA0KICAgIGVzdGFkb19jaXZpbCA9PSAiVW5pw6NvIGVzdMOhdmVsIChtZXNtbyBxdWUgc2VtIHJlY29uaGVjaW1lbnRvIGxlZ2FsKSIgfiAiQ2FzYWRvKGEpIiwNCiAgICBUUlVFIH4gZXN0YWRvX2NpdmlsKSkNCg0KZHNfb3JpZ2luYWxfdDEgPC0gZHNfb3JpZ2luYWxfdDEgJT4lIA0KICBtdXRhdGUoZXN0YWRvX2NpdmlsX2NvcnJpZ2lkbyA9IGZhY3Rvcihlc3RhZG9fY2l2aWxfY29ycmlnaWRvKSkNCg0KZHNfb3JpZ2luYWxfdDEgJT4lIGNvdW50KGVzdGFkb19jaXZpbF9jb3JyaWdpZG8pDQpgYGANCg0KRXNjb2xhcmlkYWRlIHN1cGVyaW9yIA0KDQpgYGB7cn0NCmRzX29yaWdpbmFsX3QxIDwtIGRzX29yaWdpbmFsX3QxICU+JSBtdXRhdGUoZXNjb2xhcmlkYWRlX3N1cGVyaW9yID0gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yKGNhc2Vfd2hlbigNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY29sYXJpZGFkZSA9PSAiRW5zaW5vIHN1cGVyaW9yIGNvbXBsZXRvIiB+ICJTdXBlcmlvciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc2NvbGFyaWRhZGUgPT0gIlDDs3MtZ3JhZHVhw6fDo28iIH4gIlN1cGVyaW9yIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAib3V0cm9zIikpKQ0KDQpgYGANCg0KYGBge3J9DQpkc19vcmlnaW5hbF90MSAlPiUgY291bnQoZXNjb2xhcmlkYWRlX3N1cGVyaW9yKQ0KYGBgDQoNCg0KDQojIEltcG9ydCBUMg0KDQpgYGB7cn0NCmRzX29yaWdpbmFsX3QyIDwtIHJlYWRfY3N2KCJDOi9Vc2Vycy9sdWlzZi9Ecm9wYm94L1B1Yy1SaW8vUHJvamV0byAtIENPVklEIGxvbmdpdHVkaW5hbC9DT1ZJRC0xOSAtIFQyIChSZXNwb25zZXMpIC0gRm9ybSBSZXNwb25zZXMgMS5jc3YiKQ0KYmFja3VwX2RzX3QyIDwtIGRzX29yaWdpbmFsX3QyDQpgYGANCg0KIyMgY2xlYW4NCg0KPk1vZGlmaWNhciBub21lcw0KDQpgYGB7cn0NCmRzX29yaWdpbmFsX3QyIDwtIGNsZWFuX25hbWVzKGRzX29yaWdpbmFsX3QyKQ0KYGBgDQoNCj5SZW1vdmUgd2hlbiBhbGwgbWlzc2luZw0KDQpgYGB7cn0NCmRzX29yaWdpbmFsX3QyIDwtIGphbml0b3I6OnJlbW92ZV9lbXB0eShkc19vcmlnaW5hbF90MiwgYygicm93cyIsICJjb2xzIikpDQpgYGANCg0KDQoNCiMgRml4IHRvIE1hdGNoIFQyDQoNCiMjIEZpeCBUMg0KDQojIyMgZW1haWwNCg0KPiBOb21lDQoNCmBgYHtyfQ0KZHNfb3JpZ2luYWxfdDIgPC0gZHNfb3JpZ2luYWxfdDIgJT4lIA0KICByZW5hbWUoZW1haWwgPSBwYXJhX2NvbnNlZ3Vpcm1vc192ZXJpZmljYXJfc3Vhc19yZXNwb3N0YXNfZGFkYXNfaW5pY2lhbG1lbnRlX3F1YWxfZV9vX3NldV9lX21haWwpDQpgYGANCg0KPiBGb3JtYXRvIGRvIGVtYWlsDQoNCmBgYHtyfQ0KZHNfb3JpZ2luYWxfdDIgPC0gZHNfb3JpZ2luYWxfdDIgJT4lIA0KICBtdXRhdGUoZW1haWxfY29ycmlnaWRvID0gdG9sb3dlcihlbWFpbCkpDQoNCmRzX29yaWdpbmFsX3QyIDwtIGRzX29yaWdpbmFsX3QyICU+JQ0KICBtdXRhdGUoZW1haWxfY29ycmlnaWRvID0gc3RyaW5naTo6c3RyaV90cmFuc19nZW5lcmFsKGVtYWlsX2NvcnJpZ2lkbywiTGF0aW4tQVNDSUkiKSkNCmBgYA0KDQoNCj4gVGlyYXIgZXNwYcOnb3MNCg0KYGBge3J9DQpkc19vcmlnaW5hbF90MiA8LSBkc19vcmlnaW5hbF90MiAlPiUgDQogIG11dGF0ZShlbWFpbF9jb3JyaWdpZG8gPSBzdHJfdHJpbShlbWFpbF9jb3JyaWdpZG8sIHNpZGUgPSBjKCJib3RoIiwgImxlZnQiLCAicmlnaHQiKSkpICU+JSANCiAgbXV0YXRlKGVtYWlsX2NvcnJpZ2lkbyA9IHN0cl9yZXBsYWNlX2FsbChlbWFpbF9jb3JyaWdpZG8sICJcXHMiLCAiIikpICNzcGFjZXMgYmV0d2Vlbg0KYGBgDQoNCg0KYGBge3IsIGV2YWwgPSBGQUxTRSB9DQpkc19vcmlnaW5hbF90MiAlPiUgc2VsZWN0KGVtYWlsX2NvcnJpZ2lkbykgJT4lIFZpZXcoKQ0KYGBgDQoNCg0KPiBWZXJpZmljYXIgZHVwbGljYWRvcw0KDQpgYGB7cn0NCmRzX29yaWdpbmFsX3QyICU+JSANCiAgZmlsdGVyKCFpcy5uYShlbWFpbF9jb3JyaWdpZG8pKSAlPiUgI2Rlc2NhcnRhciBtaXNzaW5nDQogIGdyb3VwX2J5KGVtYWlsX2NvcnJpZ2lkbykgJT4lICNhZ3J1cGFyIHBvciBlbWFpbA0KICBtdXRhdGUoZXN0dWRvXzIgPSBsZW5ndGgoZW1haWxfY29ycmlnaWRvKSkgJT4lICNjb250YXIgcXVhbnRhcyB2ZXplcyBjYWRhIHBhcnRpY2lwYW50ZSBmZXogYSBhdGl2aWRhZGUNCiAgZmlsdGVyKGVzdHVkb18yID4xKSAlPiUgDQogIGNvdW50KGVtYWlsX2NvcnJpZ2lkbykgJT4lIA0KICBkYXRhLmZyYW1lKCkgJT4lDQogIG11dGF0ZShsaW5oYT1yb3dfbnVtYmVyKCkpICU+JSANCiAgYWRvcm5fdG90YWxzKCkNCmBgYA0KDQo+IEEgYmFzZSBjb3JyZXRhIGRldmVyw6EgdGVyIHF1YW50b3MgY2Fzb3M/IA0KDQpgYGB7cn0NCjE0OC0yMisxMA0KYGBgDQoNCiMjIyBBanVzdGFyIHBlbGFzIGVzY2FsYXMgDQoNCg0KIyMjIENFUyANCg0KPiBjcmlhciB1bWEgZHVwbGljYWRhIHBhcmEgb3MgaXRlbnMgZGUgZGVwcmVzc2FvIA0KDQpgYGB7cn0NCmRzX29yaWdpbmFsX3QyIDwtIGRzX29yaWdpbmFsX3QyICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoYWJhaXhvX2hhX3VtYV9saXN0YV9kZV9zZW50aW1lbnRvc19lX2NvbXBvcnRhbWVudG9zX3Bvcl9mYXZvcl9hc3NpbmFsZV9hX2ZyZXF1ZW5jaWFfY29tX3F1ZV9saGVfb2NvcnJlcmFtX25hX3VsdGltYV9zZW1hbmFfZXVfbWVfY2hhdGVlaV9wb3JfY29pc2FzX3F1ZV9ub3JtYWxtZW50ZV9uYW9fbWVfY2hhdGVhdmFtOmFiYWl4b19oYV91bWFfbGlzdGFfZGVfc2VudGltZW50b3NfZV9jb21wb3J0YW1lbnRvc19wb3JfZmF2b3JfYXNzaW5hbGVfYV9mcmVxdWVuY2lhX2NvbV9xdWVfbGhlX29jb3JyZXJhbV9uYV91bHRpbWFfc2VtYW5hX2V1X21lX3NpbnRvX2Rlc2FuaW1hZG8pLA0KICAgICAgICAgICAgbGlzdChjYXQgPSB+cGFzdGUwKC4pKSkgJT4lICNjb3B5IGFsbCB2YXJpYWJsZXMgKGR1cGxpY2F0ZSkgDQogIHJlbmFtZV9hdCh2YXJzKGVuZHNfd2l0aCggIl9jYXQiKSksIGxpc3QofnBhc3RlMCgiY2VzX3QyXyIsIDE6MjApKSkgDQpgYGANCg0KDQo+IGFqdXN0YXIgdmFsb3JlcyB0Mg0KDQpgYGB7ciB9DQpkc19vcmlnaW5hbF90MiA8LSBkc19vcmlnaW5hbF90MiAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJjZXNfdDJfIikpLA0KICAgICAgICAgICAgfnJlcGxhY2UoLiwuID09ICJSYXJhbWVudGUgKG1lbm9zIHF1ZSAxIGRpYSkiLCAwKSkNCmRzX29yaWdpbmFsX3QyIDwtIGRzX29yaWdpbmFsX3QyICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoImNlc190Ml8iKSksDQogICAgICAgICAgICB+cmVwbGFjZSguLC4gPT0gIlBvdWNhcyB2ZXplcyAoMS0yIGRpYXMpIiwgMSkpDQpkc19vcmlnaW5hbF90MiA8LSBkc19vcmlnaW5hbF90MiAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJjZXNfdDJfIikpLA0KICAgICAgICAgICAgfnJlcGxhY2UoLiwuID09ICLDgHMgdmV6ZXMgKDMtNCBkaWFzKSIsIDIpKQ0KZHNfb3JpZ2luYWxfdDIgPC0gZHNfb3JpZ2luYWxfdDIgJT4lIA0KICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiY2VzX3QyXyIpKSwNCiAgICAgICAgICAgIH5yZXBsYWNlKC4sLiA9PSAiUXVhc2Ugc2VtcHJlIG91IHNlbXByZSAoNS03IGRpYXMpIiwgMykpDQoNCmBgYA0KDQoNCj4gQ29udmVydGVyIHBhcmEgbnVtZXJpY28gDQoNCmBgYHtyIH0NCmRzX29yaWdpbmFsX3QyIDwtIGRzX29yaWdpbmFsX3QyICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoImNlc190Ml8iKSksIGFzLm51bWVyaWMpDQpgYGANCg0KPiBjaGVjYXIgcmVzcG9zdGFzIHQyDQoNCmBgYHtyfQ0KZHNfb3JpZ2luYWxfdDIgJT4lIA0KICBzZWxlY3Qoc3RhcnRzX3dpdGgoImNlc190Ml8iKSkgJT4lIA0KICBwaXZvdF9sb25nZXIoZXZlcnl0aGluZygpKSAlPiUgDQogIGdncGxvdCguLCBhZXMobmFtZSwgdmFsdWUpKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgdGhlbWVfYncoKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0PTEpKSArDQogIGxhYnMoeCA9ICIiLCB5ID0gIiIpDQpgYGANCg0KPiBJbnZlcnPDo28gZG9zIGl0ZW5zIHQyDQoNCmBgYHtyICB9DQpkc19vcmlnaW5hbF90MiA8LSBkc19vcmlnaW5hbF90MiAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGNlc190Ml80LCANCiAgICAgICAgICAgICAgICAgY2VzX3QyXzgsIA0KICAgICAgICAgICAgICAgICBjZXNfdDJfMTIsIA0KICAgICAgICAgICAgICAgICBjZXNfdDJfMTYpLCBsaXN0KH5wYXN0ZShhYnMoMy0uKSkgJT4lIGFzLm51bWVyaWMoLikpKQ0KYGBgDQoNCg0KPiBDaGVjYXIgc2UgbsOjbyBow6EgY2Fzb3MgYXVzZW50ZXMgIA0KDQpgYGB7cn0NCmRzX29yaWdpbmFsX3QyICU+JSANCiAgZmlsdGVyKCFzdHJfZGV0ZWN0KGNvdmlkXzE5X2FzcGVjdG9zX2Vjb25vbWljb3NfZV9zYXVkZV9kZV9qb3ZlbnNfZV9hZHVsdG9zLCAiTsOjbyIpKSAlPiUgI2RlaXhhciBhcGVuYXMgcXVlbSBxdWlzIHBhcnRpY2lwYXINCiAgc2VsZWN0KGNlc190Ml8xOmNlc190Ml8yMCkgJT4lIA0KICBEYXRhRXhwbG9yZXI6OnByb2ZpbGVfbWlzc2luZygpDQpgYGANCg0KPiBDaGVjYXIgc2Ugb3MgdmFsb3JlcyBudW1lcmljb3MgZXN0w6NvIGNvcnJldG9zDQoNCmBgYHtyfQ0KZHNfb3JpZ2luYWxfdDIgJT4lIA0KICBzZWxlY3QoYWJhaXhvX2hhX3VtYV9saXN0YV9kZV9zZW50aW1lbnRvc19lX2NvbXBvcnRhbWVudG9zX3Bvcl9mYXZvcl9hc3NpbmFsZV9hX2ZyZXF1ZW5jaWFfY29tX3F1ZV9saGVfb2NvcnJlcmFtX25hX3VsdGltYV9zZW1hbmFfZXVfbWVfY2hhdGVlaV9wb3JfY29pc2FzX3F1ZV9ub3JtYWxtZW50ZV9uYW9fbWVfY2hhdGVhdmFtLCBjZXNfdDJfMSkNCmBgYA0KDQo+IENoZWNhciBvcyBpbnZlcnRpZG9zDQoNCmBgYHtyfQ0KZHNfb3JpZ2luYWxfdDIgJT4lIA0KICBzZWxlY3QoYWJhaXhvX2hhX3VtYV9saXN0YV9kZV9zZW50aW1lbnRvc19lX2NvbXBvcnRhbWVudG9zX3Bvcl9mYXZvcl9hc3NpbmFsZV9hX2ZyZXF1ZW5jaWFfY29tX3F1ZV9saGVfb2NvcnJlcmFtX25hX3VsdGltYV9zZW1hbmFfZXVfbWVfc2VudGlfdGFvX2JlbV9xdWFudG9fYXNfb3V0cmFzX3Blc3NvYXMsIGNlc190Ml80KQ0KYGBgDQoNCg0KIyMjIGNhbGN1bGFyIHRvdGFpcyBDRVMgKFQyKQ0KDQpgYGB7ciB9DQojIEVTY2FsYSBkZSBkZXByZXNzw6NvKTsgKDIwIGl0ZW5zKQ0KZHNfb3JpZ2luYWxfdDIgPC0gZHNfb3JpZ2luYWxfdDIgJT4lIA0KICBtdXRhdGUodG90YWxfY2VzX3QyID0gcm93U3VtcyhzZWxlY3QoLixjZXNfdDJfMTpjZXNfdDJfMjApKSkNCmBgYA0KDQpgYGB7cn0NCmRzX29yaWdpbmFsX3QyICU+JSBzZWxlY3QodG90YWxfY2VzX3QyKSAlPiUgaGVhZCgpDQpgYGANCg0KDQo+IE9rDQoNCg0KIyMjIEdBRCANCg0KDQo+IENyaWFyIHVtYSBkdXBsaWNhZGEgY29tIG9zIGl0ZW5zIGRvIEdBRCANCg0KYGBge3IgfQ0KZHNfb3JpZ2luYWxfdDIgPC0gIGRzX29yaWdpbmFsX3QyICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoZHVyYW50ZV9hc191bHRpbWFzXzAyX3NlbWFuYXNfY29tX3F1ZV9mcmVxdWVuY2lhX3ZvY2VfZm9pX2luY29tb2RhZG9fYV9wZWxvc19wcm9ibGVtYXNfYWJhaXhvX3NlbnRpcl9zZV9uZXJ2b3NvX2Fuc2lvc29fb3VfbXVpdG9fdGVuc286ZHVyYW50ZV9hc191bHRpbWFzXzAyX3NlbWFuYXNfY29tX3F1ZV9mcmVxdWVuY2lhX3ZvY2VfZm9pX2luY29tb2RhZG9fYV9wZWxvc19wcm9ibGVtYXNfYWJhaXhvX3NlbnRpcl9tZWRvX2NvbW9fc2VfYWxnb19ob3JyaXZlbF9mb3NzZV9hY29udGVjZXIpLA0KICAgICAgICAgICAgbGlzdChjYXQgPSB+cGFzdGUwKC4pKSkgJT4lICNjb3B5IGFsbCB2YXJpYWJsZXMgKGR1cGxpY2F0ZSkgDQogIHJlbmFtZV9hdCh2YXJzKGVuZHNfd2l0aCggIl9jYXQiKSksIGxpc3QofnBhc3RlMCgiZ2FkX3QyXyIsIDE6NykpKSANCg0KYGBgDQoNCj4gYWp1c3RhciB2YWxvcmVzIHQyDQoNCmBgYHtyIH0NCmRzX29yaWdpbmFsX3QyIDwtIGRzX29yaWdpbmFsX3QyICU+JSANCiAgIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJnYWRfdDJfIikpLA0KICAgICAgICAgICAgfnJlcGxhY2UoLiwuID09ICJOZW5odW1hIHZleiIsIDApKQ0KDQpkc19vcmlnaW5hbF90MiA8LSBkc19vcmlnaW5hbF90MiAlPiUgDQogICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiZ2FkX3QyXyIpKSwNCiAgICAgICAgICAgIH5yZXBsYWNlKC4sLiA9PSAiUG91Y29zIGRpYXMiLCAxKSkNCg0KZHNfb3JpZ2luYWxfdDIgPC0gZHNfb3JpZ2luYWxfdDIgJT4lIA0KICAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoImdhZF90Ml8iKSksDQogICAgICAgICAgICB+cmVwbGFjZSguLC4gPT0gIk1haXMgZGEgbWV0YWRlIGRvIHRlbXBvIiwgMikpDQoNCmRzX29yaWdpbmFsX3QyIDwtIGRzX29yaWdpbmFsX3QyICU+JSANCiAgIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJnYWRfdDJfIikpLA0KICAgICAgICAgICAgfnJlcGxhY2UoLiwuID09ICJRdWFzZSB0b2RvcyBvcyBkaWFzIiwgMykpDQpgYGANCg0KDQo+IFRyYW5zZm9ybWFyIGVtIG51bcOpcmljYSB0Mg0KDQpgYGB7ciB9DQpkc19vcmlnaW5hbF90MiA8LSBkc19vcmlnaW5hbF90MiAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJnYWRfdDJfIikpLCBhcy5udW1lcmljKQ0KYGBgDQoNCj4gY2hlY2FyIHJlc3Bvc3RhcyB0Mg0KDQpgYGB7cn0NCmRzX29yaWdpbmFsX3QyICU+JSANCiAgc2VsZWN0KHN0YXJ0c193aXRoKCJnYWRfdDJfIikpICU+JSANCiAgcGl2b3RfbG9uZ2VyKGV2ZXJ5dGhpbmcoKSkgJT4lIA0KICBnZ3Bsb3QoLiwgYWVzKG5hbWUsIHZhbHVlKSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIHRoZW1lX2J3KCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdD0xKSkgKw0KICBsYWJzKHggPSAiIiwgeSA9ICIiKQ0KYGBgDQoNCg0KIyMjIGNhbGN1bGFyIHRvdGFpcyBHQUQgKFQyKQ0KDQpgYGB7ciB9DQojIEVTY2FsYSBkZSBhbnNpZWRhZGU7ICg3IGl0ZW5zKQ0KZHNfb3JpZ2luYWxfdDIgPC0gZHNfb3JpZ2luYWxfdDIgJT4lIA0KICBtdXRhdGUodG90YWxfZ2FkX3QyID0gcm93U3VtcyhzZWxlY3QoLixzdGFydHNfd2l0aCgiZ2FkX3QyXyIpKSkpDQpgYGANCg0KDQojIyBUb21hciB1bWEgZGVjaXNhbyBzb2JyZSBvIHF1ZSBmYXplciBjb20gcmVzcG9zdGFzIGR1cGxpY2FkYXMgKFQyKQ0KDQo+IFF1YWlzIHNhbyBvcyBjYXNvcyBkdXBsaWNhZG9zDQoNCmBgYHtyfQ0KZHVwbGljYXRlX2Nhc2VzX3QyIDwtIGRzX29yaWdpbmFsX3QyICU+JSANCiAgZmlsdGVyKCFpcy5uYShlbWFpbF9jb3JyaWdpZG8pKSAlPiUgI2Rlc2NhcnRhciBtaXNzaW5nDQogIGdyb3VwX2J5KGVtYWlsX2NvcnJpZ2lkbykgJT4lICNhZ3J1cGFyIHBvciBlbWFpbA0KICBtdXRhdGUoZXN0dWRvXzIgPSBsZW5ndGgoZW1haWxfY29ycmlnaWRvKSkgJT4lICNjb250YXIgcXVhbnRhcyB2ZXplcyBjYWRhIHBhcnRpY2lwYW50ZSBmZXogYSBhdGl2aWRhZGUNCiAgZmlsdGVyKGVzdHVkb18yID4xKSAlPiUgDQogIGNvdW50KGVtYWlsX2NvcnJpZ2lkbykgJT4lIA0KICBkYXRhLmZyYW1lKCkgJT4lIA0KICBtdXRhdGUobGluaGEgPSByb3dfbnVtYmVyKCkpICU+JSANCiAgYWRvcm5fdG90YWxzKCkNCmR1cGxpY2F0ZV9jYXNlc190Mg0KYGBgDQoNCk5lc3RhIG5vdmEgYmFzZSwgZGV2ZXLDo28gZmljYXIgYHIgMTQ4IC0gMjIgKyAxMGAgcGFydGljaXBhbnRlcyBzZSBvcyByZXN1bHRhZG9zIGZvcmVtIGlndWFpcw0KDQo+IFZlcmlmaWNhciBvcyByZXN1bHRhZG9zIHPDo28gaWd1YWlzIHBhcmEgQ0VTIGUgR0FEDQoNCmBgYHtyfQ0KZXF1YWxfdDJfY2VzIDwtIGRzX29yaWdpbmFsX3QyICU+JSANCiAgZmlsdGVyKCFpcy5uYShlbWFpbF9jb3JyaWdpZG8pKSAlPiUgI2Rlc2NhcnRhciBtaXNzaW5nDQogIGdyb3VwX2J5KGVtYWlsX2NvcnJpZ2lkbykgJT4lICNhZ3J1cGFyIHBvciBlbWFpbA0KICBtdXRhdGUoZXN0dWRvXzIgPSBsZW5ndGgoZW1haWxfY29ycmlnaWRvKSkgJT4lICNjb250YXIgcXVhbnRhcyB2ZXplcyBjYWRhIHBhcnRpY2lwYW50ZSBmZXogYSBhdGl2aWRhZGUNCiAgZmlsdGVyKGVzdHVkb18yID4gMSkgJT4lICAjZGVpeGFyIGFwZW5hcyBwZXNzb2FzIHF1ZSBmaXplcmFtIG1haXMgZGUgdW1hIHZleiBvIGVzdHVkbw0KICBzZWxlY3QodG90YWxfY2VzX3QyKSAlPiUgDQogIGdyb3VwX2J5KGVtYWlsX2NvcnJpZ2lkbykgJT4lICNhZ3J1cGFyIHBlbGEgbWVzbWEgcGVzc29hDQogIG11dGF0ZShkaWZlcmVuY2FfY2VzID0gdG90YWxfY2VzX3QyIC0gbGFnKHRvdGFsX2Nlc190MikpICU+JSAjY29tcHV0YXIgZGlmZXJlbsOnYXMNCiAgbXV0YXRlKHF1YW50YXNfZGlmZXJlbmNhcyA9IGxlbmd0aChkaWZlcmVuY2FfY2VzKSkgJT4lICAjcXVhbnRhcyB2ZXplcyBhIHBlc3NvYSBmZXoNCiAgZmlsdGVyKGRpZmVyZW5jYV9jZXMgPT0gMCAmIHF1YW50YXNfZGlmZXJlbmNhcyA9PSAyKSAlPiUgICNzZSBvIGNhcmEgZmV6IGR1YXMgdmV6ZXMgZSByZXNwb3N0YXMgaWd1YWlzLCBlbGUgZmljYQ0KICBhcnJhbmdlKGVtYWlsX2NvcnJpZ2lkbykNCg0KZXF1YWxfdDJfZ2FkIDwtIGRzX29yaWdpbmFsX3QyICU+JSANCiAgZmlsdGVyKCFpcy5uYShlbWFpbF9jb3JyaWdpZG8pKSAlPiUgI2Rlc2NhcnRhciBtaXNzaW5nDQogIGdyb3VwX2J5KGVtYWlsX2NvcnJpZ2lkbykgJT4lICNhZ3J1cGFyIHBvciBlbWFpbA0KICBtdXRhdGUoZXN0dWRvXzIgPSBsZW5ndGgoZW1haWxfY29ycmlnaWRvKSkgJT4lICNjb250YXIgcXVhbnRhcyB2ZXplcyBjYWRhIHBhcnRpY2lwYW50ZSBmZXogYSBhdGl2aWRhZGUNCiAgZmlsdGVyKGVzdHVkb18yID4gMSkgJT4lICAjZGVpeGFyIGFwZW5hcyBwZXNzb2FzIHF1ZSBmaXplcmFtIG1haXMgZGUgdW1hIHZleiBvIGVzdHVkbw0KICBzZWxlY3QodG90YWxfZ2FkX3QyKSAlPiUgDQogIGdyb3VwX2J5KGVtYWlsX2NvcnJpZ2lkbykgJT4lICNhZ3J1cGFyIHBlbGEgbWVzbWEgcGVzc29hDQogIG11dGF0ZShkaWZlcmVuY2FfZ2FkID0gdG90YWxfZ2FkX3QyIC0gbGFnKHRvdGFsX2dhZF90MikpICU+JSAjY29tcHV0YXIgZGlmZXJlbsOnYXMNCiAgbXV0YXRlKHF1YW50YXNfZGlmZXJlbmNhcyA9IGxlbmd0aChkaWZlcmVuY2FfZ2FkKSkgJT4lICAjcXVhbnRhcyB2ZXplcyBhIHBlc3NvYSBmZXoNCiAgZmlsdGVyKGRpZmVyZW5jYV9nYWQgPT0gMCAmIHF1YW50YXNfZGlmZXJlbmNhcyA9PSAyKSAlPiUgICNzZSBvIGNhcmEgZmV6IGR1YXMgdmV6ZXMgZSByZXNwb3N0YXMgaWd1YWlzLCBlbGUgZmljYQ0KICBhcnJhbmdlKGVtYWlsX2NvcnJpZ2lkbykNCg0KYGBgDQoNCg0KPiBDcmlhciB1bWEgYmFzZSBwYXJhIHZlciBxdWFpcyBwYXJ0aWNpcGFudGVzIHRlbSBvcyBtZXNtb3MgcmVzdWx0YWRvcw0KDQpgYGB7cn0NCmVxdWFsX3QyIDwtIGVxdWFsX3QyX2NlcyAlPiUgDQogIGZpbHRlcihlbWFpbF9jb3JyaWdpZG8gJWluJSBlcXVhbF90Ml9nYWQpDQpgYGANCg0KDQoNCj4gUmVmZWZpbmlyIGEgYmFzZSBwYXJhIHJlbW92ZXIgb3MgY2Fzb3MgZW0gcXVlIG9zIHZhbG9yZXMgZHVwbGljYWRvcyBzw6NvIGRpZmVyZW50ZXMNCg0KDQpgYGB7cn0NCmR1cGxpY2F0ZV9jYXNlc190MiA8LSBkdXBsaWNhdGVfY2FzZXNfdDIgJT4lIA0KICBmaWx0ZXIoIWVtYWlsX2NvcnJpZ2lkbyAlaW4lIGVxdWFsX3QyKQ0KYGBgDQoNCg0KPiBEZWl4YXIgYXBlbmFzIDEgcmVzdWx0YWRvDQoNCmBgYHtyfQ0KZHNfb3JpZ2luYWxfdDIgPC0gZHNfb3JpZ2luYWxfdDIgJT4lDQogIGZpbHRlcighZW1haWxfY29ycmlnaWRvICVpbiUgZHVwbGljYXRlX2Nhc2VzX3QyJGVtYWlsX2NvcnJpZ2lkbykNCmBgYA0KDQo+IFRpcmFyIG8gZHVwbGljYWRvIChvIHBhcnRpY2lwYW50ZSBxdWUgZmljb3UgZmljb3UgZHVwbGljYWRvKQ0KDQpgYGB7cn0NCmRzX29yaWdpbmFsX3QyIDwtIGRzX29yaWdpbmFsX3QyICU+JSANCiAgYXJyYW5nZShlbWFpbF9jb3JyaWdpZG8pICU+JSANCiAgbXV0YXRlKHJvd19pZCA9IHJvd19udW1iZXIoKSkgJT4lICNjcmlhciB1bSBudW1lcm8gcGFyYSBjYWRhIGxpbmhhDQogIG11dGF0ZShlbWFpbF9jb3JyaWdpZG8gPSBpZl9lbHNlKGlzLm5hKGVtYWlsX2NvcnJpZ2lkbyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMChyb3dfbnVtYmVyKCkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWFpbF9jb3JyaWdpZG8pKSAlPiUgI3NlIG8gZW1haWwgw6kgbWlzc2luZywgY29sb2NhciB1bSBudW1lcm8gdW5pY28NCiAgZ3JvdXBfYnkoZW1haWxfY29ycmlnaWRvKSAlPiUgI2FncnVwYXIgcG9yIGVtYWlsDQogIG11dGF0ZShncm91cF9pZCA9IGN1cl9ncm91cF9pZCgpKSAlPiUgI2NyaWFyIHVtYSBpZGVudGlmaWNhY2FvIHVuaWNhDQogIG11dGF0ZShlc3R1ZG9fMiA9IGxlbmd0aChlbWFpbF9jb3JyaWdpZG8pKSAlPiUgICN2ZXJpZmljYXIgcXVhbnRhcyB2ZXplcyBjYWRhIHBhcnRpY2lwYW50ZSBmZXogbyBlc3R1ZG8gMQ0KICBkaXN0aW5jdChlbWFpbF9jb3JyaWdpZG8sIC5rZWVwX2FsbCA9IFRSVUUpICU+JSAgI2RlaXhhciBhcGVuYXMgMSBlbWFpbCBzZSBob3V2ZXIgZG9pcyBvdSBtYWlzDQogIHVuZ3JvdXAoKSAlPiUgI2Rlc2FncnVwYXINCiAgbXV0YXRlKGVtYWlsX2NvcnJpZ2lkbyA9IGlmX2Vsc2Uoc3RyX2RldGVjdChlbWFpbF9jb3JyaWdpZG8sICJAIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWFpbF9jb3JyaWdpZG8sIE5BX2NoYXJhY3Rlcl8pKSAlPiUgI25vdmFtZW50ZSwgY29sb2NhciBtaXNzaW5nIHByb3MgZS1tYWlscw0KICBzZWxlY3QoZ3JvdXBfaWQsIHJvd19pZCxlbWFpbF9jb3JyaWdpZG8sZXN0dWRvXzIsZXZlcnl0aGluZygpKSANCmBgYA0KDQoNCj4gUmVtb3ZlciBiYXNlcyBwcm92aXPDs3JpYXMNCg0KYGBge3J9DQpybShlcXVhbF90MiwgZXF1YWxfdDJfY2VzLCBlcXVhbF90Ml9nYWQpDQpgYGANCg0KDQojIyBTb2Npb2RlbW9ncmFwaGljIGZlYXR1cmVzDQoNCmBgYHtyLCBldmFsID0gRkFMU0UgfQ0KZHNfb3JpZ2luYWxfdDIgJT4lIG5hbWVzDQp2aWV3KGRmU3VtbWFyeShkc19vcmlnaW5hbF90MikpIA0KYGBgDQoNCj4gUmVuYW1lIA0KDQpgYGB7cn0NCiN1dGlsczo6Vmlldyhkc19vcmlnaW5hbF90MikNCmRzX29yaWdpbmFsX3QyIDwtIGRzX29yaWdpbmFsX3QyICU+JSANCiAgcmVuYW1lKA0KICAgIGZpY2FfZW1fY2FzYV90MiA9IGF0dWFsbWVudGVfaW5jbHVpbmRvX2FzX2hvcmFzX3F1ZV92b2NlX2Rvcm1lX3F1YW50YXNfaG9yYXNfdm9jZV90ZW1fZmljYWRvX2VtX2Nhc2EsDQogICAgdGVtX3NhaWRvX2RlX2Nhc2EgPSBhdHVhbG1lbnRlX2VtX21lZGlhX3F1YW50YXNfdmV6ZXNfdm9jZV90ZW1fc2FpZG9fZGVfY2FzYSwNCiAgICANCiAgICBzZWd1ZV9yZWNvbWVuZGFjb2VzID0gYXR1YWxtZW50ZV92b2NlX3RlbV9zZWd1aWRvX2FzX3JlY29tZW5kYWNvZXNfZ2VyYWlzX2RlX2hpZ2llbmVfbGF2YXJfYXNfbWFvc19ldml0YXJfdG9jYXJfbm9fcm9zdG9fZXRjLA0KDQogICAgZmFsb3VfZmFtaWxpYV9wZXNzb2FsbWVudGUgPSBjb21fcXVhbnRhc19wZXNzb2FzX2RlX3N1YV9mYW1pbGlhX3ZvY2VfZmFsb3VfaG9qZV9wZXNzb2FsbWVudGUsDQogICAgZmFsb3VfZmFtaWxpYV90ZWxlZm9uZSA9IGNvbV9xdWFudGFzX3Blc3NvYXNfZGVfc3VhX2ZhbWlsaWFfdm9jZV9mYWxvdV9ob2plX3Bvcl90ZWxlZm9uZV9vdV92aWRlb19jb25mZXJlbmNpYSwNCiAgICBmYWxvdV9hbWlnb3NfdGVsZWZvbmUgPSBjb21fcXVhbnRvc19hbWlnb3Nfdm9jZV9mYWxvdV9ob2plX3Bvcl90ZWxlZm9uZV9vdV92aWRlb19jb25mZXJlbmNpYSwNCg0KICAgIGNvbmNvcmRvX2NvdmlkX3ByZW9jdXBhY2FvX3NhdWRlID0gaW5kaXF1ZV9vX3F1YW50b192b2NlX2NvbmNvcmRhX29fY29yb25hdmlydXNfZV91bWFfZ3JhbmRlX3ByZW9jdXBhY2FvX2RlX3NhdWRlX3B1YmxpY2EsDQogICAgY29uY29yZG9fcXVhcmVudGVuYSA9IGluZGlxdWVfb19xdWFudG9fdm9jZV9jb25jb3JkYV9hX3F1YXJlbnRlbmFfZm9pX3VtYV9tZWRpZGFfYWNlcnRhZGEsDQogICAgDQogICAgdHJhYmFsaG9fYXBvc19xdWFyZW50ZW5hID0gYXR1YWxtZW50ZV92b2NlLA0KDQogICAgcmVuZGFfYWdvcmEgPSBhdHVhbG1lbnRlX2VtX21lZGlhX3N1YV9yZW5kYV9tZW5zYWxfYnJ1dGFfZW1fcmVhaXNfZSwNCiAgICANCiAgICBwcmVvY3VwYWNhb19wYWdhcl9jb250YSA9IGF0dWFsbWVudGVfdm9jZV9lc3RhX3ByZW9jdXBhZG9fcG9yX3Rlcl9kaWZpY3VsZGFkZXNfZW1fcGFnYXJfc3Vhc19jb250YXNfcHJpbmNpcGFpc19jb21vX2FsdWd1ZWxfb3VfcHJlc3RhY29lc19kZXN0ZV9tZXMsDQogICAgcGVuc2FfZW1fYWRpYXJfcGFnYW1lbnRvID0gZW1fY2Fzb19hZmlybWF0aXZvX3BlbnNhX2VtX2FkaWFtZW50b19kZXN0ZV9tZXMsDQoNCiAgICBwcmVvY3VwYWNhb19lY29ub21pYV9nZXJhbCA9IHF1YWxfZV9hX3N1YV9wcmVvY3VwYWNhb19lbV9yZWxhY2FvX2Fvc19pdGVuc19hYmFpeG9fYV9lY29ub21pYV9lbV9nZXJhbCwNCiAgICBwcmVvY3VwYWNhb19zaXR1YWNhb19maW5hbmNlaXJhID0gcXVhbF9lX2Ffc3VhX3ByZW9jdXBhY2FvX2VtX3JlbGFjYW9fYW9zX2l0ZW5zX2FiYWl4b19hX3N1YV9wcm9wcmlhX3NpdHVhY2FvX2ZpbmFuY2VpcmEsDQogICAgcHJlb2N1cGFjYW9fc3VhX3NhdWRlID0gcXVhbF9lX2Ffc3VhX3ByZW9jdXBhY2FvX2VtX3JlbGFjYW9fYW9zX2l0ZW5zX2FiYWl4b19hX3N1YV9zYXVkZV9zZV9uYW9fZXN0aXZlcl9pbmZlY3RhZG8sDQogICAgcHJlb2N1cGFjYW9fc2F1ZGVfYW1pZ29zX2ZhbWlsaWEgPSBxdWFsX2VfYV9zdWFfcHJlb2N1cGFjYW9fZW1fcmVsYWNhb19hb3NfaXRlbnNfYWJhaXhvX2Ffc2F1ZGVfZG9zX21lbWJyb3NfZGFfZmFtaWxpYV9lX2Rvc19hbWlnb3NfcHJveGltb3MsDQogICAgcHJlb2N1cGFjYW9fY29lc2FvX3NvY2lhbCA9IHF1YWxfZV9hX3N1YV9wcmVvY3VwYWNhb19lbV9yZWxhY2FvX2Fvc19pdGVuc19hYmFpeG9fYV9jb2VzYW9fc29jaWFsLA0KICAgIHByZW9jdXBhY2FvX3Byb2R1dG9zX2FsaW1lbnRhY2FvX2hpZ2llbmVfbWVkaWNhbWVudG9zID0gcXVhbF9lX2Ffc3VhX3ByZW9jdXBhY2FvX2VtX3JlbGFjYW9fYW9zX2l0ZW5zX2FiYWl4b19mb3JuZWNpbWVudG9fZGVfcHJvZHV0b3NfaW1wb3J0YW50ZXNfY29tb19hbGltZW50b3NfcHJvZHV0b3NfZGVfaGlnaWVuZV9lX21lZGljYW1lbnRvcywNCiAgICBwcmVvY3VwYWNhb19wcmVjb19wcm9kdXRvcyA9IHF1YWxfZV9hX3N1YV9wcmVvY3VwYWNhb19lbV9yZWxhY2FvX2Fvc19pdGVuc19hYmFpeG9fYV9hY2Vzc2liaWxpZGFkZV9kb3NfcHJlY29zX2Rlc3Rlc19wcm9kdXRvcywNCiAgICBwcmVvY3VwYWNhb19wcmVjb19hY29lcyA9IHF1YWxfZV9hX3N1YV9wcmVvY3VwYWNhb19lbV9yZWxhY2FvX2Fvc19pdGVuc19hYmFpeG9fYV9ldm9sdWNhb19kb19wcmVjb19kYXNfYWNvZXNfZV9kZV9vdXRyYXNfZm9ybWFzX2RlX2ludmVzdGltZW50bywNCiAgICBwcmVvY3VwYWNhb19yZWFsaXphY2FvX2VzY29sYXJfZmlsaG8gPSBxdWFsX2VfYV9zdWFfcHJlb2N1cGFjYW9fZW1fcmVsYWNhb19hb3NfaXRlbnNfYWJhaXhvX2FzX3JlYWxpemFjb2VzX2VzY29sYXJlc19kb3Nfc2V1c19maWxob3MsDQogICAgDQogICAgYmViaWRhX3F1ZV91c2EgPSBxdWFsX29fdGlwb19kZV9iZWJpZGFfYWxjb29saWNhX3F1ZV92b2NlX21haXNfY29uc29tZV9kZWl4ZV9lbV9icmFuY29fc2VfbmVuaHVtYSwNCg0KICAgcGxhbm9fc2F1ZGUgPSB2b2NlX3RlbV9wbGFub19kZV9zYXVkZSwNCiAgICBjb21vX3ZpdmUgPSBxdWFsX2Rhc19zZWd1aW50ZXNfYWx0ZXJuYXRpdmFzX21lbGhvcl9kZXNjcmV2ZW1fc3VhX3NpdHVhY2FvX25vX21vbWVudG8sDQoNCiAgICBwZXNzb2FzX25hX2Nhc2EgPSBxdWFudGFzX3Blc3NvYXNfY29udGFuZG9fY29tX3ZvY2VfbW9yYW1fZW1fc3VhX2Nhc2EsDQogICAgcmVuZGFfZmFtaWxpYXJfbWVuc2FsID0gZW1fcmVsYWNhb19hX3N1YV9yZW5kYV9mYW1pbGlhcl9tZW5zYWxfb3Vfc2VqYV9hX3JlbmRhX2Rhc19wZXNzb2FzX21vcmFkb3Jhc19kYV9tZXNtYV9jYXNhLA0KICAgIA0KICAgIHBlc3NvYXNfZW1fcmlzY29fY2FzYSA9IHF1YW50YXNfcGVzc29hc19kb19ncnVwb19kZV9yaXNjb19tb3JhbV9jb250aWdvX2V4X3Blc29zYXNfY29tXzYwX2Fub3Nfb3VfbWFpc19wb3J0YWRvcmVzX2RlX2RvZW5jYXNfY2FyZGlhY2FzX2hpcGVydGVuc2FvX2RpYWJldGVzX2V0YywNCiAgIA0KICAgb3JpZW50YWNhb19wb2xpdGljYSA9IG5vc19zYWJlbW9zX3F1ZV9xdWVzdG9lc19wb2xpdGljYXNfc2FvX2RlbnNhc19lX21lcmVjZW1fdW1hX2VzcGVjaWFsX2F0ZW5jYW9fbm9fZW50YW50b19lbV9yZWxhY2FvX2Ffb3JpZW50YWNhb19wb2xpdGljYV9ldV9tZV9jb25zaWRlcm8NCiAgKQ0KYGBgDQoNCj4gVHJhbnNmb3JtIGludG8gZmFjdG9yDQoNCg0KYGBge3J9DQpkc19vcmlnaW5hbF90MiA8LSBkc19vcmlnaW5hbF90MiAlPiUgDQogIG11dGF0ZShhY3Jvc3MoYygNCiAgICBmaWNhX2VtX2Nhc2FfdDIsIA0KICAgIHRlbV9zYWlkb19kZV9jYXNhLCANCiAgICBmYWxvdV9mYW1pbGlhX3Blc3NvYWxtZW50ZSwgDQogICAgZmFsb3VfZmFtaWxpYV90ZWxlZm9uZSwgDQogICAgZmFsb3VfYW1pZ29zX3RlbGVmb25lLCANCiAgICBzZWd1ZV9yZWNvbWVuZGFjb2VzLA0KICAgIA0KICAgIA0KICAgIGNvbmNvcmRvX2NvdmlkX3ByZW9jdXBhY2FvX3NhdWRlLCANCiAgICBjb25jb3Jkb19xdWFyZW50ZW5hLCANCiAgICB0cmFiYWxob19hcG9zX3F1YXJlbnRlbmEsIA0KICAgIHJlbmRhX2Fnb3JhLCANCiAgICANCiAgICBwcmVvY3VwYWNhb19wYWdhcl9jb250YSwgDQogICAgcGVuc2FfZW1fYWRpYXJfcGFnYW1lbnRvLCANCiAgICBwcmVvY3VwYWNhb19lY29ub21pYV9nZXJhbCwgDQogICAgcHJlb2N1cGFjYW9fc2l0dWFjYW9fZmluYW5jZWlyYSwgDQogICAgcHJlb2N1cGFjYW9fc3VhX3NhdWRlLA0KICAgIHByZW9jdXBhY2FvX3NhdWRlX2FtaWdvc19mYW1pbGlhLCANCiAgICBwcmVvY3VwYWNhb19jb2VzYW9fc29jaWFsLCANCiAgICBwcmVvY3VwYWNhb19wcm9kdXRvc19hbGltZW50YWNhb19oaWdpZW5lX21lZGljYW1lbnRvcywgDQogICAgcHJlb2N1cGFjYW9fcHJlY29fcHJvZHV0b3MsIA0KICAgIHByZW9jdXBhY2FvX3ByZWNvX2Fjb2VzLCANCiAgICBwcmVvY3VwYWNhb19yZWFsaXphY2FvX2VzY29sYXJfZmlsaG8sIA0KICAgIA0KICAgIGF0dWFsbWVudGVfdm9jZV9mdW1hLA0KICAgIGF0dWFsbWVudGVfdm9jZV9iZWJlLA0KICAgIGF0dWFsbWVudGVfdm9jZV9mYXpfZXhlcmNpY2lvc19maXNpY29zLA0KICAgIGF0dWFsbWVudGVfc3VhX2FsaW1lbnRhY2FvLA0KICAgIGF0dWFsbWVudGVfc2V1X3Blc28sDQogICAgDQogICAgYmViaWRhX3F1ZV91c2EsIA0KICAgIHBsYW5vX3NhdWRlLCANCiAgICBjb21vX3ZpdmUsIA0KICAgIHJlbmRhX2ZhbWlsaWFyX21lbnNhbCwgDQogICAgcGVzc29hc19lbV9yaXNjb19jYXNhLA0KICAgIA0KICAgIG9yaWVudGFjYW9fcG9saXRpY2ENCiAgKSwNCiAgZmFjdG9yKSkNCmBgYA0KDQoNCj4gRml4IHNvbWUgZmFjdG9yIGxldmVscw0KDQpQZXNzb2FzIG5hIGNhc2ENCg0KYGBge3J9DQpkc19vcmlnaW5hbF90MiA8LSBkc19vcmlnaW5hbF90MiAlPiUgDQogIG11dGF0ZShwZXNzb2FzX25hX2Nhc2EgPSBhcy5udW1lcmljKHBlc3NvYXNfbmFfY2FzYSkpDQpgYGANCg0KDQpQZXNzb2FzIGVtIHJpc2NvDQoNCmBgYHtyfQ0KZHNfb3JpZ2luYWxfdDIgPC0gZHNfb3JpZ2luYWxfdDIgJT4lIA0KICBtdXRhdGVfYXQodmFycyhwZXNzb2FzX2VtX3Jpc2NvX2Nhc2EpLCB+ZmN0X3JlbGV2ZWwoLiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoIk5lbmh1bWEiKSkpDQpgYGANCg0KDQoNClJlbmRhIGZhbWlsaWFyDQoNCmBgYHtyfQ0KZHNfb3JpZ2luYWxfdDIgPC0gZHNfb3JpZ2luYWxfdDIgJT4lIA0KICBtdXRhdGVfYXQodmFycyhyZW5kYV9mYW1pbGlhcl9tZW5zYWwpLCB+ZmN0X3JlbGV2ZWwoLiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoIkF0w6kgUiQgMS45MDgiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYWlzIGRlIFIkIDEuOTA4IGF0w6kgUiQgMi44NjIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYWlzIGRlIFIkIDIuODYyIGF0w6kgUiQgNS43MjQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYWlzIGRlIFIkIDUuNzI0IGF0w6kgUiQgOS41NDAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYWlzIGRlIFIkIDkuNTQwIGF0w6kgUiQgMTQuMzEwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWNpbWEgZGUgUiQgMTQuMzEwIGF0ZSBSJCAyMy44NTAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBY2ltYSBkZSBSJCAyMy44NTAiKSkpDQpgYGANCg0KDQoNCk9yaWVudGHDp8OjbyBwb2zDrXRpY2ENCg0KYGBge3J9DQpkc19vcmlnaW5hbF90MiA8LSBkc19vcmlnaW5hbF90MiAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKG9yaWVudGFjYW9fcG9saXRpY2EpLCB+ZmN0X3JlbGV2ZWwoLiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoIlNvdSBhcG9sw610aWNvIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGUgZXNxdWVyZGEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZSBjZW50cm8gZXNxdWVyZGEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZSBjZW50cm8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZSBjZW50cm8gZGlyZWl0YSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlIGRpcmVpdGEiKSkpDQpgYGANCg0KT3JpZW50YcOnw6NvIHBvbMOtdGljYSBkaXJlaXRhIHZzIGVzcXVlcmRhICh0MikNCg0KYGBge3J9DQpkc19vcmlnaW5hbF90MiA8LSBkc19vcmlnaW5hbF90MiAlPiUgbXV0YXRlKHBvbGl0aWNhX2Rpcl9lc3EgPSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3IoY2FzZV93aGVuKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50YWNhb19wb2xpdGljYSA9PSAiRGUgZXNxdWVyZGEiIH4gImVzcXVlcmRhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudGFjYW9fcG9saXRpY2EgPT0gIkRlIGNlbnRybyBlc3F1ZXJkYSIgfiAiZXNxdWVyZGEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50YWNhb19wb2xpdGljYSA9PSAiRGUgY2VudHJvIiB+ICJjZW50cm8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50YWNhb19wb2xpdGljYSA9PSAiRGUgY2VudHJvIGRpcmVpdGEiIH4gImRpcmVpdGEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50YWNhb19wb2xpdGljYSA9PSAiRGUgZGlyZWl0YSIgfiAiZGlyZWl0YSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmllbnRhY2FvX3BvbGl0aWNhID09ICJTb3UgYXBvbMOtdGljbyIgfiAiYXBvbGl0aWNvIikpKQ0KDQpgYGANCg0KDQpGaWNhIGVtIGNhc2ENCg0KYGBge3J9DQpkc19vcmlnaW5hbF90MiA8LSBkc19vcmlnaW5hbF90MiAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGZpY2FfZW1fY2FzYV90MiksIH5mY3RfcmVsZXZlbCguLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiRW50cmUgNSBhIDggaG9yYXMgcG9yIGRpYSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbnRyZSA5IGEgMTIgaG9yYXMgcG9yIGRpYSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbnRyZSAxMyBhIDE2IGhvcmFzIHBvciBkaWEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW50cmUgMTcgYSAyMCBob3JhcyBwb3IgZGlhIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1haXMgZGUgMjAgaG9yYXMgcG9yIGRpYSBvdSBvIGRpYSB0b2RvIikpKQ0KYGBgDQoNCg0KU2FpIGRlIGNhc2ENCg0KYGBge3J9DQpkc19vcmlnaW5hbF90MiA8LSBkc19vcmlnaW5hbF90MiAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKHRlbV9zYWlkb19kZV9jYXNhKSwgfmZjdF9yZWxldmVsKC4sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJOZW5odW1hIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMSB2ZXogcG9yIGRpYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIgdmV6ZXMgcG9yIGRpYSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzIHZlemVzIHBvciBkaWEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFpcyBkZSAzIHZlemVzIHBvciBkaWEiKSkpDQpgYGANCg0KDQoNCkZhbG91IGZhbWlsaWEgcGVzc29hbG1lbnRlDQoNCmBgYHtyfQ0KZHNfb3JpZ2luYWxfdDIgPC0gZHNfb3JpZ2luYWxfdDIgJT4lIA0KICBtdXRhdGVfYXQodmFycyhmYWxvdV9mYW1pbGlhX3Blc3NvYWxtZW50ZSksIH5mY3RfcmVsZXZlbCguLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiTmVuaHVtYSIpKSkgDQoNCmBgYA0KDQoNClByZW9jdXBhY2FvIGNvdmlkIGUgc2F1ZGUNCg0KYGBge3J9DQpkc19vcmlnaW5hbF90MiA8LSBkc19vcmlnaW5hbF90MiAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGNvbmNvcmRvX3F1YXJlbnRlbmEsIGNvbmNvcmRvX2NvdmlkX3ByZW9jdXBhY2FvX3NhdWRlKSwgfmZjdF9yZWxldmVsKC4sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJFdSBkaXNjb3JkbyBmb3J0ZW1lbnRlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXUgZGlzY29yZG8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFc3RvdSBuZXV0cm8iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXUgY29uY29yZG8iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXUgY29uY29yZG8gZm9ydGVtZW50ZSIpKSkNCmBgYA0KDQpwcmVvY3VwYWNhbyBnZXJhbA0KDQpgYGB7cn0NCmRzX29yaWdpbmFsX3QyIDwtIGRzX29yaWdpbmFsX3QyICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoInByZW9jdXBhY2FvXyIpLC1wcmVvY3VwYWNhb19wYWdhcl9jb250YSksIH5mY3RfcmVsZXZlbCguLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiTmVuaHVtYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBvdWNhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFzdGFudGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXh0cmVtYSIpKSkNCmBgYA0KDQoNCnF1YW50b190ZW1wb192b2NlX2FjaGFfcXVlX3F1ZV9hX3ZpZGFfdm9sdGFyYV9hb19ub3JtYWwNCg0KYGBge3J9DQojZGlmZXJlbnQgZnJvbSB0MQ0KZHNfb3JpZ2luYWxfdDIgPC0gZHNfb3JpZ2luYWxfdDIgJT4lIA0KICBtdXRhdGVfYXQodmFycyhxdWFudG9fdGVtcG9fdm9jZV9hY2hhX3F1ZV9xdWVfYV92aWRhX3ZvbHRhcmFfYW9fbm9ybWFsKSwgfmZjdF9yZWxldmVsKC4sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJKw6EgZXN0w6Egbm9ybWFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWluZGEgbmVzdGUgc2VndW5kbyBzZW1lc3RyZSBkZSAyMDIwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU8OzIGVtIDIwMjEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAyMiBvdSBkZXBvaXMiKSkpDQpgYGANCg0KDQpmdW1vDQoNCmBgYHtyfQ0KZHNfb3JpZ2luYWxfdDIgPC0gZHNfb3JpZ2luYWxfdDIgJT4lIA0KICBtdXRhdGVfYXQodmFycyhhdHVhbG1lbnRlX3ZvY2VfZnVtYSksIH5mY3RfcmVsZXZlbCguLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiTsOjbywgbsOjbyBmdW1vIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW50cmUgMSBlIDUgY2lnYXJybyBwb3IgZGlhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXTDqSAyMCBjaWdhcnJvcyBwb3IgZGlhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFpcyBkZSAyMCBjaWdhcnJvcyBwb3IgZGlhIikpKQ0KYGBgDQoNCg0KQmViaWRhDQoNCmBgYHtyfQ0KZHNfb3JpZ2luYWxfdDIgPC0gZHNfb3JpZ2luYWxfdDIgJT4lIA0KICBtdXRhdGVfYXQodmFycyhhdHVhbG1lbnRlX3ZvY2VfYmViZSksIH5mY3RfcmVsZXZlbCguLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiTsOjbywgbsOjbyBiZWJvIikpKQ0KYGBgDQoNCg0KRXhlcmNpY2lvcyBmw61zaWNvcw0KDQpgYGB7cn0NCmRzX29yaWdpbmFsX3QyIDwtIGRzX29yaWdpbmFsX3QyICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoYXR1YWxtZW50ZV92b2NlX2Zhel9leGVyY2ljaW9zX2Zpc2ljb3MpLCB+ZmN0X3JlbGV2ZWwoLiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiTsOjbywgbmVuaHVtIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG91Y28gKDEgdmV6IHBvciBzZW1hbmEpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTW9kZXJhZG8gKDIgYSAzIHZlemVzIHBvciBzZW1hbmEpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTXVpdG8gKG1haXMgcXVlIDMgdmV6ZXMgcG9yIHNlbWFuYSkiKSkpDQpgYGANCg0KDQoNCj4gRG9uZQ0KDQojIENyZWF0ZSBhIGRzIHdpdGggdGhlIHNhbWUgcGFydGljaXBhbnRzDQoNCg0KYGBge3J9DQpkc190MV90MiA8LXJpZ2h0X2pvaW4oDQogIGRzX29yaWdpbmFsX3QxICU+JSBmaWx0ZXIoIWlzLm5hKGVtYWlsX2NvcnJpZ2lkbykpLCANCiAgZHNfb3JpZ2luYWxfdDIgJT4lIGZpbHRlcighaXMubmEoZW1haWxfY29ycmlnaWRvKSksDQogICAgICAgICAgYnkgPSAiZW1haWxfY29ycmlnaWRvIikNCmBgYA0KDQo+IFNvbWUgcGFydGljaXBhbnRzIGF0IFQyIHdlcmUgbm90IGF0IHQxIC4uLg0KDQpgYGB7cn0NCmRzX3QxX3QyIDwtIGRzX3QxX3QyICU+JSANCiAgZmlsdGVyKCFpcy5uYSh0b3RhbF9jZXNfdDEpKSAlPiUgI25hbyB1c2FyIGRhZG9zIGF1c2VudGVzIA0KICBzZWxlY3QoZW1haWxfY29ycmlnaWRvLCBmaWNhX2VtX2Nhc2FfdDEsIGZpY2FfZW1fY2FzYV90MiwgdG90YWxfY2VzX3QxLCB0b3RhbF9jZXNfdDIsIGV2ZXJ5dGhpbmcoKSkgJT4lICNvcmdhbml6YXINCiAgc2VsZWN0KC1lc3R1ZG9fMSwgLWVzdHVkb18yKSAjdGlyYXIgaW5kZXhhZG9yIGRvIGVzdHVkbw0KYGBgDQoNCg0KPiBDcmVhdGUgaW5kZXggb2YgbGVhdmUgZ3JvdXANCg0KYGBge3J9DQpkc190MV90MiA8LSBkc190MV90MiAlPiUgDQogIG11dGF0ZSh1bmlxdWVfaWQgPSBmYWN0b3Iocm93X251bWJlcigpKSklPiUgDQogIG11dGF0ZShkaWYgPSBhcy5udW1lcmljKGZpY2FfZW1fY2FzYV90MSktYXMubnVtZXJpYyhmaWNhX2VtX2Nhc2FfdDIpKSAlPiUgDQogIG11dGF0ZShncm91cCA9IGZhY3RvcihpZl9lbHNlKGRpZiA+IDEsIkxlYXZlIGZyb20gaG9tZSIsIlN0YXkgYXQgaG9tZSIpKSkgJT4lICNhdGVuY2FvIGFxdWkgYW9zIG5pdmVpcyBkYXMgdmFyaWF2ZWlzIGNhdGVnb3JpY2FzDQogIHNlbGVjdChlbWFpbF9jb3JyaWdpZG8sIGZpY2FfZW1fY2FzYV90MSwgZmljYV9lbV9jYXNhX3QyLCBkaWYsIGdyb3VwLCBldmVyeXRoaW5nKCkpDQoNCmBgYA0KDQpgYGB7cn0NCmRzX3QxX3QyDQpgYGANCj4gZnJlcXVlbmN5IG9mIHBlb3BsZSBpbiBlYWNoIGdyb3VwDQoNCmBgYHtyfQ0KZHNfdDFfdDIgJT4lIGNvdW50KGdyb3VwKQ0KYGBgDQoNCg0KDQpgYGB7cn0NCmRzX3QxX3QyICU+JSBjb3VudChkaWYpDQpgYGANCg0KDQoNCj4gQ3JlYXRlIGFuIGluZGV4IHRvIGFzc2lnbiBhbGwgcGFydGljaXBhbnRzIHRoYXQgd2VyZSBmYWNpbmcgZGVwcmVzc2lvbiBhbmQgYW54aWV0eSBzeW1wdGhvbnMgYXQgYm90aCB0aW1lcw0KDQoNCmBgYHtyfQ0KZHNfdDFfdDIgPC0gZHNfdDFfdDIgJT4lIA0KICBtdXRhdGUoZGVwcmVzc2lvbl95ZXMgID0gZmFjdG9yKGlmX2Vsc2UodG90YWxfY2VzX3QxID49IDE2ICYgdG90YWxfY2VzX3QyID49IDE2LCJ5ZXMiLCJubyIpKSkNCmRzX3QxX3QyIDwtIGRzX3QxX3QyICU+JSANCiAgbXV0YXRlKGFueGlldHlfeWVzID0gaWZfZWxzZSh0b3RhbF9nYWRfdDEgPj0gMTAgJiB0b3RhbF9nYWRfdDIgPj0gMTAsICJ5ZXMiLCJubyIpKQ0KYGBgDQoNCg0KPiBDb3VudCB0aGVtDQoNCmBgYHtyfQ0KZHNfdDFfdDIgJT4lIGNvdW50KGRlcHJlc3Npb25feWVzKQ0KYGBgDQoNCg0KYGBge3J9DQpkc190MV90MiAlPiUgY291bnQoYW54aWV0eV95ZXMpDQpgYGANCg0KDQo+IENyZWF0ZSBzb21lIGNhdGVnb3JpY2FsIHZhcmlhYmxlcyBiYXNlZCBvbiByYXcgZGF0YQ0KDQoNCmBgYHtyfQ0KI2NhdGVnb3JpY2FsIHZhcmlhYmxlcw0KZHNfdDFfdDIgPC0gZHNfdDFfdDIgJT4lIA0KICBtdXRhdGUoYWNyb3NzKGMoc2V4bywgZXNjb2xhcmlkYWRlX3N1cGVyaW9yLCBlc3RhZG9fY2l2aWxfY29ycmlnaWRvLCBxdWFudG9zX2ZpbGhvcywgcGxhbm9fc2F1ZGUueCwgY29tb192aXZlLngsIHJlbmRhX2ZhbWlsaWFyX21lbnNhbC54LCBwZXNzb2FzX2VtX3Jpc2NvX2Nhc2EueCxwb2xpdGljYV9kaXJfZXNxLngsIHBvbGl0aWNhX2Rpcl9lc3EueSksIA0KICAgICAgICAgICAgICAgIC5mbnMgPSBsaXN0KGNhdCA9IH5hcy5mYWN0b3IoLikpLA0KICAgICAgICAgICAgICAgIC5uYW1lcyA9ICJ7Zm59X3tjb2x9IikpIA0KYGBgDQoNCg0KPiBDcmVhdGUgbXVkYW5jYSBwb2xpdGljYQ0KDQoNCmBgYHtyfQ0KZHNfb3JpZ2luYWxfdDEgJT4lIGNvdW50KG9yaWVudGFjYW9fcG9saXRpY2EsIHBvbGl0aWNhX2Rpcl9lc3EpDQpkc19vcmlnaW5hbF90MiAlPiUgY291bnQob3JpZW50YWNhb19wb2xpdGljYSwgcG9saXRpY2FfZGlyX2VzcSkNCmBgYA0KDQoNCmBgYHtyfQ0KZHNfdDFfdDIgPC0gZHNfdDFfdDIgJT4lIA0KICBtdXRhdGUocG9saXRpY2FfbXVkYW5jYSA9IA0KICAgICAgICAgICBjYXNlX3doZW4ocG9saXRpY2FfZGlyX2VzcS54ID09IHBvbGl0aWNhX2Rpcl9lc3EueSB+ICJpZ3VhbCIsDQogICAgICAgICAgICAgICAgICAgICBUUlVFIH4gImRpZmVyZW50ZSIpKQ0KDQoNCmRzX3QxX3QyICU+JSBjb3VudChwb2xpdGljYV9tdWRhbmNhKQ0KYGBgDQoNCg0KPiBDaGVjayBwb2xpdGljYWwgd2luZyB0cmFuc2l0aW9uDQoNCmBgYHtyfQ0KZHNfdDFfdDIgJT4lIA0KICBmaWx0ZXIocG9saXRpY2FfbXVkYW5jYSA9PSAiZGlmZXJlbnRlIikgJT4lIA0KICBzZWxlY3QocG9saXRpY2FfZGlyX2VzcS54LCBwb2xpdGljYV9kaXJfZXNxLnkpDQpgYGANCg0KDQpgYGB7cn0NCmRzX3QxX3QyICU+JSBmaWx0ZXIoIWlzLm5hKHBvbGl0aWNhX2Rpcl9lc3EueCksICFpcy5uYShwb2xpdGljYV9kaXJfZXNxLnkpKSAlPiUgY291bnQocG9saXRpY2FfZGlyX2VzcS54KQ0KZHNfdDFfdDIgJT4lIGZpbHRlcighaXMubmEocG9saXRpY2FfZGlyX2VzcS54KSwgIWlzLm5hKHBvbGl0aWNhX2Rpcl9lc3EueSkpICU+JSBjb3VudChwb2xpdGljYV9kaXJfZXNxLnkpDQoNCmRzX3QxX3QyICU+JSANCiAgZmlsdGVyKCFpcy5uYShwb2xpdGljYV9kaXJfZXNxLngpLCAhaXMubmEocG9saXRpY2FfZGlyX2VzcS55KSkgJT4lIA0KICB0YWJ5bChwb2xpdGljYV9kaXJfZXNxLngsIHBvbGl0aWNhX2Rpcl9lc3EueSkgJT4lICNhcHJlc2VudGFyIHRhYmVsYQ0KICBhZG9ybl90b3RhbHMoYygicm93IiwgImNvbCIpKSAlPiUgDQogIGFkb3JuX3BlcmNlbnRhZ2VzKCJyb3ciKSAlPiUgDQogIGFkb3JuX3BjdF9mb3JtYXR0aW5nKHJvdW5kaW5nID0gImhhbGYgdXAiLCBkaWdpdHMgPSAxKSAlPiUgDQogIGFkb3JuX25zKCkNCmBgYA0KDQo+IHBsb3QgcG9saXRpY2FsIHdpbmcgdHJhbnNpdGlvbg0KDQoNCmBgYHtyfQ0KI2NyZWF0ZSBhIGxvbmcgZGF0YXNldA0KZDwtZHNfdDFfdDIgJT4lIA0KICAgbXV0YXRlKHN1YmplY3QgPSByb3dfbnVtYmVyKCkpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKHBvbGl0aWNhX2Rpcl9lc3EueCksICFpcy5uYShwb2xpdGljYV9kaXJfZXNxLnkpKSAlPiUgDQogIHNlbGVjdChzdWJqZWN0LCBwb2xpdGljYV9kaXJfZXNxLngsIHBvbGl0aWNhX2Rpcl9lc3EueSkgJT4lIA0KICBwaXZvdF9sb25nZXIoLXN1YmplY3QsIG5hbWVzX3RvID0gInN1cnZleSIsIHZhbHVlc190byA9ICJyZXNwb25zZSIpDQoNCmQ8LWQgJT4lIA0KICBncm91cF9ieShzdXJ2ZXksc3ViamVjdCwgcmVzcG9uc2UpICU+JSANCiAgY291bnQoKSAlPiUgDQogIG11dGF0ZShwY3QgPSBuIC8gc3VtKG4pKQ0KICANCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dhbGx1dmlhbCkNCiNjaGFuZ2UgbGV2ZWxzIG9yZGVyDQpkIDwtIHRyYW5zZm9ybShkLHJlc3BvbnNlID0gZmFjdG9yKHJlc3BvbnNlLCByZXYobGV2ZWxzKHJlc3BvbnNlKSkpKQ0KDQojcGxvdA0KZ2dwbG90KGQsDQogICAgICAgYWVzKHggPSBzdXJ2ZXksIHN0cmF0dW0gPSByZXNwb25zZSwgYWxsdXZpdW0gPSBzdWJqZWN0LA0KICAgICAgICAgICB5ID0gbiwNCiAgICAgICAgICAgZmlsbCA9IHJlc3BvbnNlKSkgKyAjZGF0YQ0KICBzY2FsZV94X2Rpc2NyZXRlKGV4cGFuZCA9IGMoLjEsIC4xKSkgKyAjDQogIGdlb21fZmxvdygpICsgI3NoYWRlIGFyZWEgY29uZWN0aW5nIHRoZSByZWN0YW5nbGVzDQogIGdlb21fc3RyYXR1bShhbHBoYSA9IC43KSArIA0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGFzdGUwKC4uc3RyYXR1bS4uLCAiXG4iLCBuLCAiXG4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVzOjpwZXJjZW50KC4ucHJvcC4uKSApKSwgc3RhdCA9ICJzdHJhdHVtIiwgc2l6ZSA9IDMpICsgI3RleHQgaW5zaWRlIGVhY2ggcmVjdGFuZ2xlDQogIHNjYWxlX2ZpbGxfYnJld2VyKHR5cGUgPSAicXVhbCIsIHBhbGV0dGUgPSAiU2V0MiIpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSAjaGlkZSBsZWdlbmRzDQpgYGANCg0KPiBjaGVjayB0aGUgc2lnbmlmaWNhbmNlIG9mIHRoZSBwb2xpdGljYWwgdHJhbnNpdGlvbg0KDQpgYGB7cn0NCmRzX3QxX3QyICU+JSANCiAgIG11dGF0ZShzdWJqZWN0ID0gcm93X251bWJlcigpKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShwb2xpdGljYV9kaXJfZXNxLngpLCAhaXMubmEocG9saXRpY2FfZGlyX2VzcS55KSkgJT4lIA0KICB7bWNuZW1hci50ZXN0KC4kcG9saXRpY2FfZGlyX2VzcS54LCAuJHBvbGl0aWNhX2Rpcl9lc3EueSl9DQpgYGANCj4gRm9ybWFsaXplIHBvbGl0aWNhbCB3aW5nDQoNCg0KYGBge3J9DQpkc190MV90MiA8LSBkc190MV90MiAlPiUgbXV0YXRlKHBvbGl0aWNhX2Rpcl9lc3Ffb2sgPSBwb2xpdGljYV9kaXJfZXNxLngpDQpgYGANCg0KDQoNCmBgYHtyLCBldmFsID0gRkFMU0UgfQ0KcGFjbWFuOjpwX2xvYWRfZ2goDQogICJkYXZpZHNqb2JlcmcvZ2dzYW5rZXkiDQopDQpkZiA8LSBkc190MV90MiAlPiUgDQogICBtdXRhdGUoc3ViamVjdCA9IHJvd19udW1iZXIoKSkgJT4lIA0KICBzZWxlY3Qoc3ViamVjdCwgcG9saXRpY2FfZGlyX2VzcS54LCBwb2xpdGljYV9kaXJfZXNxLnkpICU+JSANCiAgbWFrZV9sb25nKHBvbGl0aWNhX2Rpcl9lc3EueCwgcG9saXRpY2FfZGlyX2VzcS55KQ0KDQpnZ3Bsb3QoZGYsIGFlcyh4ID0geCwgbmV4dF94ID0gbmV4dF94LCBub2RlID0gbm9kZSwgbmV4dF9ub2RlID0gbmV4dF9ub2RlLCBmaWxsID0gZmFjdG9yKG5vZGUpLCBsYWJlbCA9IG5vZGUpKSArDQogIGdlb21fYWxsdXZpYWwoZmxvdy5hbHBoYSA9IC42KSArDQogIGdlb21fYWxsdXZpYWxfdGV4dChzaXplID0gMywgY29sb3IgPSAiYmxhY2siKSArDQogICNzY2FsZV9maWxsX3ZpcmlkaXNfZCgpICsNCiAgdGhlbWVfYWxsdXZpYWwoYmFzZV9zaXplID0gMTgpICsNCiAgbGFicyh4ID0gTlVMTCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAuNSkpDQpgYGANCg0KDQoNCg0KDQpgYGB7cn0NCnJtKGQsIGR1cGxpY2F0ZV9jYXNlc190MikNCmBgYA0KDQoNCg0KDQpgYGB7ciwgZXZhbCA9IEZBTFNFIH0NCnNhdmUuaW1hZ2UoIkM6L1VzZXJzL2x1aXNmL0Ryb3Bib3gvUHVjLVJpby9Qcm9qZXRvIC0gQ09WSUQgbG9uZ2l0dWRpbmFsL1IgYmFzZSAtIGNvdmlkIDE5IGxvbmdpdHVkaW5hbC5SRGF0YSIpDQpgYGANCg0KDQoNCg0KIyMgZG9uZQ0KDQo=