climas = read_csv(here::here("data/clima_cg_jp-semanal.csv"), 
                  col_types = "cTdddddd")

glimpse(climas)
Rows: 2,748
Columns: 8
$ cidade <chr> "Campina Grande", "Campina Grande", "Campina Grande", "Campina Grande", "C…
$ semana <dttm> 1992-12-27, 1993-01-03, 1993-01-10, 1993-01-31, 1993-02-07, 1993-02-14, 1…
$ tmedia <dbl> 26.13333, 26.11905, 25.76667, 25.74000, 26.31429, 26.28571, 26.47143, 26.5…
$ tmax   <dbl> 30.4, 32.4, 32.2, 32.0, 32.7, 32.7, 32.3, 32.3, 32.1, 31.2, 32.2, 31.7, 32…
$ tmin   <dbl> 20.7, 19.3, 19.7, 19.9, 19.6, 20.0, 20.4, 21.2, 19.0, 19.0, 19.3, 19.9, 19…
$ chuva  <dbl> 0.0, 0.0, 0.0, 0.4, 0.3, 0.0, 4.9, 0.0, 0.0, 6.1, 0.4, 1.2, 0.0, 1.6, 0.0,…
$ mes    <dbl> 12, 1, 1, 1, 2, 2, 2, 2, 10, 11, 11, 11, 11, 12, 12, 12, 12, 1, 1, 1, 1, 1…
$ ano    <dbl> 1992, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 19…

Calcular a temperatura da semana anterior em cada linha

climas = climas %>% 
  mutate(tanterior = lag(tmedia, n = 1)) 

Q1: Qual a cidade é mais quente? Isso muda se considerarmos apenas o período de janeiro e fevereiro (pico do verão)?

climas %>% 
  group_by(cidade) %>% 
  ggplot(aes(x = cidade, y = tmedia)) + 
  geom_boxplot()

Utilizando boxplots para uma visualização geral de máximos, mínimos, mediana e quartis, pudemos observar que pelo menos 75% das amostras de temperatura média para a cidade de João Pessoa durante todo o período são maiores do que pelo menos 75% das amostras de temperatura média para a cidade de Campina Grande, o que nos leva a concluir que João Pessoa é a cidade mais quente.

Já se considerarmos apenas o período de Janeiro e Fevereiro:

climas %>%
    filter(mes %in% c("1", "2")) %>%
    group_by(cidade) %>%
    ggplot(aes(x = cidade, y = tmedia)) + 
    geom_boxplot()

Para este caso, o resultado fica ainda mais ainda mais consagrado, tendo em vista que 100% dos valores de temperatura (desconsiderando os outliers) para a cidade de João Pessoa são maiores que pelo menos 75% dos valores de temperatura para a cidade de Campina Grande. Outra métrica é que 75% dos valores de temperatura média para a cidade de João Pessoa são maiores que todos os dados de temperatura média para a cidade de Campina Grande.

Q2: Quais os meses mais quentes e mais frios? Como você descreveria a temperatura das festas juninas das cidades nos últimos anos?

climas %>% 
    mutate(mes = as.character(mes)) %>%
    group_by(mes) %>% 
    ggplot(aes(x = reorder(mes, tmedia, median), y = tmedia)) + 
    geom_boxplot()

Utilizando boxplots para visualização descritiva dos dados, ordenando pela mediana, percebe-se que o mês mais quente do ano é Fevereiro e o mês mais frio é Julho. A temperatura nas festas juninas são as menos registradas, visto que as festas geralmente ocorrem nos meses Junho e Julho, os mesmos que apresentam as medianas mais baixas.

Q3: Quanto chove por semana em JP e CG? Descreva a distribuição do volume de chuvas para as cidades?

Utilizando histograma para uma melhor análise da distribuição:

hist_chuva_cg = climas %>%
    filter(cidade == "Campina Grande") %>% 
    ggplot(aes(x = chuva)) + 
    ggtitle("Chuvas em Campina Grande") + 
    geom_histogram(binwidth = 10, color = "#F6511D", fill = "white")


hist_chuva_jp = climas %>%
    filter(cidade == "João Pessoa") %>% 
    ggplot(aes(x = chuva)) + 
    ggtitle("Chuvas em João Pessoa") +
    geom_histogram(binwidth = 10, color = "#F6511D", fill = "white")

grid.arrange(hist_chuva_cg, hist_chuva_jp, ncol = 2)

Vemos que a chuva segue uma distribuição normal assimétrica a direita com viés positivo para as duas cidades. Em média, quanto chove nas cidades é:

Campina Grande:

climas %>% filter(cidade == "Campina Grande") %>% .$chuva %>% mean()
[1] 13.9973

João Pessoa:

climas %>% filter(cidade == "João Pessoa") %>% .$chuva %>% mean()
[1] 32.64849

Q4: Qual a relação entre a temperatura de uma semana e a temperatura da semana anterior (descreva para as duas cidades)?

Campina Grande

Primeiro vamos observar a distribuição da temperatura e o comportamento:

hist_temp_cg = climas %>%
    filter(cidade == "Campina Grande") %>% 
    ggplot(aes(x = tmedia)) + 
    ggtitle("Histograma temperatura CG") + 
    geom_histogram(binwidth = .5, color = "#F6511D", fill = "white")

temp_cg = climas %>%
    filter(cidade == "Campina Grande") %>% 
    ggplot(aes(x=semana, y=tmedia)) + 
    ggtitle("Temperatura média em CG") +
    geom_point() +
    theme_void()

grid.arrange(hist_temp_cg, temp_cg, ncol = 2)

Observamos que apesar dos dados seguirem uma distribuição semelhante a normal com assimetria, os dados possuem característica não-linear, o que torna o uso de Pearson para correlação não recomendado. Sendo assim, utilizando Spearman e Kendall:

climas %>% filter(cidade == "Campina Grande") %>% summarise(
    spearman = cor(tmedia, tanterior, method = "spearman", use="complete.obs"), 
    kendall = cor(tmedia, tanterior, method = "kendall", use="complete.obs")
)

Utilizando o coeficiente de spearman temos uma relação forte e utilizando Kendall temos uma relação moderada.

João Pessoa

Primeiro vamos observar a distribuição da temperatura e o comportamento:

hist_temp_jp = climas %>%
    filter(cidade == "João Pessoa") %>% 
    ggplot(aes(x = tmedia)) + 
    ggtitle("Histograma temperatura JP") + 
    geom_histogram(binwidth = .5, color = "#F6511D", fill = "white")

temp_jp = climas %>%
    filter(cidade == "João Pessoa") %>% 
    ggplot(aes(x=semana, y=tmedia)) + 
    ggtitle("Temperatura média em JP") +
    geom_point() +
    theme_void()

grid.arrange(hist_temp_jp, temp_jp, ncol = 2)

Observamos que apesar dos dados seguirem uma distribuição semelhante a normal com assimetria, os dados possuem característica não-linear, o que torna o uso de Pearson para correlação não recomendado. Sendo assim, utilizando Spearman e Kendall:

climas %>% filter(cidade == "João Pessoa") %>% summarise(
    spearman = cor(tmedia, tanterior, method = "spearman", use="complete.obs"), 
    kendall = cor(tmedia, tanterior, method = "kendall", use="complete.obs")
)

O resultado foi semelhante ao de Campina Grande. Utilizando o coeficiente de spearman temos uma relação forte e utilizando Kendall temos uma relação moderada.

Q5: Qual a relação entre temperatura e chuvas nas semanas em que choveu (descreva para as duas cidades)?

Campina Grande

Primeiro vamos plotar a curva temperatura x chuva:

climas %>% filter(cidade == "Campina Grande" & chuva > 0) %>%
    ggplot(aes(x=chuva, y=tmedia)) +
    geom_point()

Devido a característica não-linear, utilizaremos os métodos de correlação de Spearman e Kendall:

climas %>% filter(cidade == "Campina Grande" & chuva > 0) %>% summarise(
    spearman = cor(tmedia, chuva, method = "spearman", use="complete.obs"), 
    kendall = cor(tmedia, chuva, method = "kendall", use="complete.obs")
)

A relação entre temperatura e chuvas para a cidade de Campina Grande é fraca.

João Pessoa

Primeiro vamos plotar a curva temperatura x chuva:

climas %>% filter(cidade == "João Pessoa" & chuva > 0) %>%
    ggplot(aes(x=chuva, y=tmedia)) +
    geom_point()

Devido a característica não-linear, utilizaremos os métodos de correlação de Spearman e Kendall:

climas %>% filter(cidade == "João Pessoa" & chuva > 0) %>% summarise(
    spearman = cor(tmedia, chuva, method = "spearman", use="complete.obs"), 
    kendall = cor(tmedia, chuva, method = "kendall", use="complete.obs")
)

A relação entre temperatura e chuvas para a cidade de João Pessoa é fraca.

LS0tCnRpdGxlOiAiVGVtcGVyYXR1cmEgSlAgeCBDRyIKYXV0aG9yOiAiUGxhdGVueSBQb25jaGV0IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKdGhlbWU6IHNhbmRzdG9uZQotLS0KCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGhlcmUpCmxpYnJhcnkobHVicmlkYXRlKQpsaWJyYXJ5KGdnYmVlc3dhcm0pCnRoZW1lX3NldCh0aGVtZV9idygpKQpgYGAKCmBgYHtyIHJlYWR9CmNsaW1hcyA9IHJlYWRfY3N2KGhlcmU6OmhlcmUoImRhdGEvY2xpbWFfY2dfanAtc2VtYW5hbC5jc3YiKSwgCiAgICAgICAgICAgICAgICAgIGNvbF90eXBlcyA9ICJjVGRkZGRkZCIpCgpnbGltcHNlKGNsaW1hcykKYGBgCgpDYWxjdWxhciBhIHRlbXBlcmF0dXJhIGRhIHNlbWFuYSBhbnRlcmlvciBlbSBjYWRhIGxpbmhhCgpgYGB7cn0KY2xpbWFzID0gY2xpbWFzICU+JSAKICBtdXRhdGUodGFudGVyaW9yID0gbGFnKHRtZWRpYSwgbiA9IDEpKSAKYGBgCgojIyMgUTE6IFF1YWwgYSBjaWRhZGUgw6kgbWFpcyBxdWVudGU/IElzc28gbXVkYSBzZSBjb25zaWRlcmFybW9zIGFwZW5hcyBvIHBlcsOtb2RvIGRlIGphbmVpcm8gZSBmZXZlcmVpcm8gKHBpY28gZG8gdmVyw6NvKT8KCmBgYHtyIHExfQpjbGltYXMgJT4lIAogIGdyb3VwX2J5KGNpZGFkZSkgJT4lIAogIGdncGxvdChhZXMoeCA9IGNpZGFkZSwgeSA9IHRtZWRpYSkpICsgCiAgZ2VvbV9ib3hwbG90KCkKYGBgCgpVdGlsaXphbmRvIGJveHBsb3RzIHBhcmEgdW1hIHZpc3VhbGl6YcOnw6NvIGdlcmFsIGRlIG3DoXhpbW9zLCBtw61uaW1vcywgbWVkaWFuYSBlIHF1YXJ0aXMsIHB1ZGVtb3Mgb2JzZXJ2YXIgcXVlIHBlbG8gbWVub3MgNzUlIGRhcyBhbW9zdHJhcyBkZSB0ZW1wZXJhdHVyYSBtw6lkaWEgcGFyYSBhIGNpZGFkZSBkZSBKb8OjbyBQZXNzb2EgZHVyYW50ZSB0b2RvIG8gcGVyw61vZG8gc8OjbyBtYWlvcmVzIGRvIHF1ZSBwZWxvIG1lbm9zIDc1JSBkYXMgYW1vc3RyYXMgZGUgdGVtcGVyYXR1cmEgbcOpZGlhIHBhcmEgYSBjaWRhZGUgZGUgQ2FtcGluYSBHcmFuZGUsIG8gcXVlIG5vcyBsZXZhIGEgY29uY2x1aXIgcXVlIEpvw6NvIFBlc3NvYSDDqSBhIGNpZGFkZSBtYWlzIHF1ZW50ZS4KCkrDoSBzZSBjb25zaWRlcmFybW9zIGFwZW5hcyBvIHBlcsOtb2RvIGRlIEphbmVpcm8gZSBGZXZlcmVpcm86CmBgYHtyfQpjbGltYXMgJT4lCiAgICBmaWx0ZXIobWVzICVpbiUgYygiMSIsICIyIikpICU+JQogICAgZ3JvdXBfYnkoY2lkYWRlKSAlPiUKICAgIGdncGxvdChhZXMoeCA9IGNpZGFkZSwgeSA9IHRtZWRpYSkpICsgCiAgICBnZW9tX2JveHBsb3QoKQpgYGAKClBhcmEgZXN0ZSBjYXNvLCBvIHJlc3VsdGFkbyBmaWNhIGFpbmRhIG1haXMgYWluZGEgbWFpcyBjb25zYWdyYWRvLCB0ZW5kbyBlbSB2aXN0YSBxdWUgMTAwJSBkb3MgdmFsb3JlcyBkZSB0ZW1wZXJhdHVyYSAoZGVzY29uc2lkZXJhbmRvIG9zIG91dGxpZXJzKSBwYXJhIGEgY2lkYWRlIGRlIEpvw6NvIFBlc3NvYSBzw6NvIG1haW9yZXMgcXVlIHBlbG8gbWVub3MgNzUlIGRvcyB2YWxvcmVzIGRlIHRlbXBlcmF0dXJhIHBhcmEgYSBjaWRhZGUgZGUgQ2FtcGluYSBHcmFuZGUuIE91dHJhIG3DqXRyaWNhIMOpIHF1ZSA3NSUgZG9zIHZhbG9yZXMgZGUgdGVtcGVyYXR1cmEgbcOpZGlhIHBhcmEgYSBjaWRhZGUgZGUgSm/Do28gUGVzc29hIHPDo28gbWFpb3JlcyBxdWUgdG9kb3Mgb3MgZGFkb3MgZGUgdGVtcGVyYXR1cmEgbcOpZGlhIHBhcmEgYSBjaWRhZGUgZGUgQ2FtcGluYSBHcmFuZGUuCgojIyMgUTI6IFF1YWlzIG9zIG1lc2VzIG1haXMgcXVlbnRlcyBlIG1haXMgZnJpb3M/IENvbW8gdm9jw6ogZGVzY3JldmVyaWEgYSB0ZW1wZXJhdHVyYSBkYXMgZmVzdGFzIGp1bmluYXMgZGFzIGNpZGFkZXMgbm9zIMO6bHRpbW9zIGFub3M/CmBgYHtyfQpjbGltYXMgJT4lIAogICAgbXV0YXRlKG1lcyA9IGFzLmNoYXJhY3RlcihtZXMpKSAlPiUKICAgIGdyb3VwX2J5KG1lcykgJT4lIAogICAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihtZXMsIHRtZWRpYSwgbWVkaWFuKSwgeSA9IHRtZWRpYSkpICsgCiAgICBnZW9tX2JveHBsb3QoKQpgYGAKVXRpbGl6YW5kbyBib3hwbG90cyBwYXJhIHZpc3VhbGl6YcOnw6NvIGRlc2NyaXRpdmEgZG9zIGRhZG9zLCBvcmRlbmFuZG8gcGVsYSBtZWRpYW5hLCBwZXJjZWJlLXNlIHF1ZSBvIG3DqnMgbWFpcyBxdWVudGUgZG8gYW5vIMOpIEZldmVyZWlybyBlIG8gbcOqcyBtYWlzIGZyaW8gw6kgSnVsaG8uIEEgdGVtcGVyYXR1cmEgbmFzIGZlc3RhcyBqdW5pbmFzIHPDo28gYXMgbWVub3MgcmVnaXN0cmFkYXMsIHZpc3RvIHF1ZSBhcyBmZXN0YXMgZ2VyYWxtZW50ZSBvY29ycmVtIG5vcyBtZXNlcyBKdW5obyBlIEp1bGhvLCBvcyBtZXNtb3MgcXVlIGFwcmVzZW50YW0gYXMgbWVkaWFuYXMgbWFpcyBiYWl4YXMuCgojIyMgUTM6IFF1YW50byBjaG92ZSBwb3Igc2VtYW5hIGVtIEpQIGUgQ0c/IERlc2NyZXZhIGEgZGlzdHJpYnVpw6fDo28gZG8gdm9sdW1lIGRlIGNodXZhcyBwYXJhIGFzIGNpZGFkZXM/CgpVdGlsaXphbmRvIGhpc3RvZ3JhbWEgcGFyYSB1bWEgbWVsaG9yIGFuw6FsaXNlIGRhIGRpc3RyaWJ1acOnw6NvOgoKYGBge3J9Cmhpc3RfY2h1dmFfY2cgPSBjbGltYXMgJT4lCiAgICBmaWx0ZXIoY2lkYWRlID09ICJDYW1waW5hIEdyYW5kZSIpICU+JSAKICAgIGdncGxvdChhZXMoeCA9IGNodXZhKSkgKyAKICAgIGdndGl0bGUoIkNodXZhcyBlbSBDYW1waW5hIEdyYW5kZSIpICsgCiAgICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEwLCBjb2xvciA9ICIjRjY1MTFEIiwgZmlsbCA9ICJ3aGl0ZSIpCgoKaGlzdF9jaHV2YV9qcCA9IGNsaW1hcyAlPiUKICAgIGZpbHRlcihjaWRhZGUgPT0gIkpvw6NvIFBlc3NvYSIpICU+JSAKICAgIGdncGxvdChhZXMoeCA9IGNodXZhKSkgKyAKICAgIGdndGl0bGUoIkNodXZhcyBlbSBKb8OjbyBQZXNzb2EiKSArCiAgICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEwLCBjb2xvciA9ICIjRjY1MTFEIiwgZmlsbCA9ICJ3aGl0ZSIpCgpncmlkLmFycmFuZ2UoaGlzdF9jaHV2YV9jZywgaGlzdF9jaHV2YV9qcCwgbmNvbCA9IDIpCmBgYAoKVmVtb3MgcXVlIGEgY2h1dmEgc2VndWUgdW1hIGRpc3RyaWJ1acOnw6NvIG5vcm1hbCBhc3NpbcOpdHJpY2EgYSBkaXJlaXRhIGNvbSB2acOpcyBwb3NpdGl2byBwYXJhIGFzIGR1YXMgY2lkYWRlcy4gRW0gbcOpZGlhLCBxdWFudG8gY2hvdmUgbmFzIGNpZGFkZXMgw6k6CgpDYW1waW5hIEdyYW5kZToKYGBge3J9CmNsaW1hcyAlPiUgZmlsdGVyKGNpZGFkZSA9PSAiQ2FtcGluYSBHcmFuZGUiKSAlPiUgLiRjaHV2YSAlPiUgbWVhbigpCmBgYApKb8OjbyBQZXNzb2E6CmBgYHtyfQpjbGltYXMgJT4lIGZpbHRlcihjaWRhZGUgPT0gIkpvw6NvIFBlc3NvYSIpICU+JSAuJGNodXZhICU+JSBtZWFuKCkKYGBgCgojIyMgUTQ6IFF1YWwgYSByZWxhw6fDo28gZW50cmUgYSB0ZW1wZXJhdHVyYSBkZSB1bWEgc2VtYW5hIGUgYSB0ZW1wZXJhdHVyYSBkYSBzZW1hbmEgYW50ZXJpb3IgKGRlc2NyZXZhIHBhcmEgYXMgZHVhcyBjaWRhZGVzKT8KCiMjIyMgQ2FtcGluYSBHcmFuZGUKUHJpbWVpcm8gdmFtb3Mgb2JzZXJ2YXIgYSBkaXN0cmlidWnDp8OjbyBkYSB0ZW1wZXJhdHVyYSBlIG8gY29tcG9ydGFtZW50bzoKCmBgYHtyfQpoaXN0X3RlbXBfY2cgPSBjbGltYXMgJT4lCiAgICBmaWx0ZXIoY2lkYWRlID09ICJDYW1waW5hIEdyYW5kZSIpICU+JSAKICAgIGdncGxvdChhZXMoeCA9IHRtZWRpYSkpICsgCiAgICBnZ3RpdGxlKCJIaXN0b2dyYW1hIHRlbXBlcmF0dXJhIENHIikgKyAKICAgIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gLjUsIGNvbG9yID0gIiNGNjUxMUQiLCBmaWxsID0gIndoaXRlIikKCnRlbXBfY2cgPSBjbGltYXMgJT4lCiAgICBmaWx0ZXIoY2lkYWRlID09ICJDYW1waW5hIEdyYW5kZSIpICU+JSAKICAgIGdncGxvdChhZXMoeD1zZW1hbmEsIHk9dG1lZGlhKSkgKyAKICAgIGdndGl0bGUoIlRlbXBlcmF0dXJhIG3DqWRpYSBlbSBDRyIpICsKICAgIGdlb21fcG9pbnQoKSArCiAgICB0aGVtZV92b2lkKCkKCmdyaWQuYXJyYW5nZShoaXN0X3RlbXBfY2csIHRlbXBfY2csIG5jb2wgPSAyKQpgYGAKT2JzZXJ2YW1vcyBxdWUgYXBlc2FyIGRvcyBkYWRvcyBzZWd1aXJlbSB1bWEgZGlzdHJpYnVpw6fDo28gc2VtZWxoYW50ZSBhIG5vcm1hbCBjb20gYXNzaW1ldHJpYSwgb3MgZGFkb3MgcG9zc3VlbSBjYXJhY3RlcsOtc3RpY2EgbsOjby1saW5lYXIsIG8gcXVlIHRvcm5hIG8gdXNvIGRlIFBlYXJzb24gcGFyYSBjb3JyZWxhw6fDo28gbsOjbyByZWNvbWVuZGFkby4gU2VuZG8gYXNzaW0sIHV0aWxpemFuZG8gU3BlYXJtYW4gZSBLZW5kYWxsOgoKYGBge3J9CmNsaW1hcyAlPiUgZmlsdGVyKGNpZGFkZSA9PSAiQ2FtcGluYSBHcmFuZGUiKSAlPiUgc3VtbWFyaXNlKAogICAgc3BlYXJtYW4gPSBjb3IodG1lZGlhLCB0YW50ZXJpb3IsIG1ldGhvZCA9ICJzcGVhcm1hbiIsIHVzZT0iY29tcGxldGUub2JzIiksIAogICAga2VuZGFsbCA9IGNvcih0bWVkaWEsIHRhbnRlcmlvciwgbWV0aG9kID0gImtlbmRhbGwiLCB1c2U9ImNvbXBsZXRlLm9icyIpCikKYGBgCgpVdGlsaXphbmRvIG8gY29lZmljaWVudGUgZGUgc3BlYXJtYW4gdGVtb3MgdW1hIHJlbGHDp8OjbyBmb3J0ZSBlIHV0aWxpemFuZG8gS2VuZGFsbCB0ZW1vcyB1bWEgcmVsYcOnw6NvIG1vZGVyYWRhLgoKIyMjIyBKb8OjbyBQZXNzb2EKUHJpbWVpcm8gdmFtb3Mgb2JzZXJ2YXIgYSBkaXN0cmlidWnDp8OjbyBkYSB0ZW1wZXJhdHVyYSBlIG8gY29tcG9ydGFtZW50bzoKCmBgYHtyfQpoaXN0X3RlbXBfanAgPSBjbGltYXMgJT4lCiAgICBmaWx0ZXIoY2lkYWRlID09ICJKb8OjbyBQZXNzb2EiKSAlPiUgCiAgICBnZ3Bsb3QoYWVzKHggPSB0bWVkaWEpKSArIAogICAgZ2d0aXRsZSgiSGlzdG9ncmFtYSB0ZW1wZXJhdHVyYSBKUCIpICsgCiAgICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IC41LCBjb2xvciA9ICIjRjY1MTFEIiwgZmlsbCA9ICJ3aGl0ZSIpCgp0ZW1wX2pwID0gY2xpbWFzICU+JQogICAgZmlsdGVyKGNpZGFkZSA9PSAiSm/Do28gUGVzc29hIikgJT4lIAogICAgZ2dwbG90KGFlcyh4PXNlbWFuYSwgeT10bWVkaWEpKSArIAogICAgZ2d0aXRsZSgiVGVtcGVyYXR1cmEgbcOpZGlhIGVtIEpQIikgKwogICAgZ2VvbV9wb2ludCgpICsKICAgIHRoZW1lX3ZvaWQoKQoKZ3JpZC5hcnJhbmdlKGhpc3RfdGVtcF9qcCwgdGVtcF9qcCwgbmNvbCA9IDIpCmBgYAoKT2JzZXJ2YW1vcyBxdWUgYXBlc2FyIGRvcyBkYWRvcyBzZWd1aXJlbSB1bWEgZGlzdHJpYnVpw6fDo28gc2VtZWxoYW50ZSBhIG5vcm1hbCBjb20gYXNzaW1ldHJpYSwgb3MgZGFkb3MgcG9zc3VlbSBjYXJhY3RlcsOtc3RpY2EgbsOjby1saW5lYXIsIG8gcXVlIHRvcm5hIG8gdXNvIGRlIFBlYXJzb24gcGFyYSBjb3JyZWxhw6fDo28gbsOjbyByZWNvbWVuZGFkby4gU2VuZG8gYXNzaW0sIHV0aWxpemFuZG8gU3BlYXJtYW4gZSBLZW5kYWxsOgoKYGBge3J9CmNsaW1hcyAlPiUgZmlsdGVyKGNpZGFkZSA9PSAiSm/Do28gUGVzc29hIikgJT4lIHN1bW1hcmlzZSgKICAgIHNwZWFybWFuID0gY29yKHRtZWRpYSwgdGFudGVyaW9yLCBtZXRob2QgPSAic3BlYXJtYW4iLCB1c2U9ImNvbXBsZXRlLm9icyIpLCAKICAgIGtlbmRhbGwgPSBjb3IodG1lZGlhLCB0YW50ZXJpb3IsIG1ldGhvZCA9ICJrZW5kYWxsIiwgdXNlPSJjb21wbGV0ZS5vYnMiKQopCmBgYAoKTyByZXN1bHRhZG8gZm9pIHNlbWVsaGFudGUgYW8gZGUgQ2FtcGluYSBHcmFuZGUuIFV0aWxpemFuZG8gbyBjb2VmaWNpZW50ZSBkZSBzcGVhcm1hbiB0ZW1vcyB1bWEgcmVsYcOnw6NvIGZvcnRlIGUgdXRpbGl6YW5kbyBLZW5kYWxsIHRlbW9zIHVtYSByZWxhw6fDo28gbW9kZXJhZGEuCgojIyMgUTU6IFF1YWwgYSByZWxhw6fDo28gZW50cmUgdGVtcGVyYXR1cmEgZSBjaHV2YXMgbmFzIHNlbWFuYXMgZW0gcXVlIGNob3ZldSAoZGVzY3JldmEgcGFyYSBhcyBkdWFzIGNpZGFkZXMpPwoKIyMjIyBDYW1waW5hIEdyYW5kZQpQcmltZWlybyB2YW1vcyBwbG90YXIgYSBjdXJ2YSB0ZW1wZXJhdHVyYSB4IGNodXZhOgoKYGBge3J9CmNsaW1hcyAlPiUgZmlsdGVyKGNpZGFkZSA9PSAiQ2FtcGluYSBHcmFuZGUiICYgY2h1dmEgPiAwKSAlPiUKICAgIGdncGxvdChhZXMoeD1jaHV2YSwgeT10bWVkaWEpKSArCiAgICBnZW9tX3BvaW50KCkKYGBgCkRldmlkbyBhIGNhcmFjdGVyw61zdGljYSBuw6NvLWxpbmVhciwgdXRpbGl6YXJlbW9zIG9zIG3DqXRvZG9zIGRlIGNvcnJlbGHDp8OjbyBkZSBTcGVhcm1hbiBlIEtlbmRhbGw6CmBgYHtyfQpjbGltYXMgJT4lIGZpbHRlcihjaWRhZGUgPT0gIkNhbXBpbmEgR3JhbmRlIiAmIGNodXZhID4gMCkgJT4lIHN1bW1hcmlzZSgKICAgIHNwZWFybWFuID0gY29yKHRtZWRpYSwgY2h1dmEsIG1ldGhvZCA9ICJzcGVhcm1hbiIsIHVzZT0iY29tcGxldGUub2JzIiksIAogICAga2VuZGFsbCA9IGNvcih0bWVkaWEsIGNodXZhLCBtZXRob2QgPSAia2VuZGFsbCIsIHVzZT0iY29tcGxldGUub2JzIikKKQpgYGAKQSByZWxhw6fDo28gZW50cmUgdGVtcGVyYXR1cmEgZSBjaHV2YXMgcGFyYSBhIGNpZGFkZSBkZSBDYW1waW5hIEdyYW5kZSDDqSBmcmFjYS4KCiMjIyMgSm/Do28gUGVzc29hClByaW1laXJvIHZhbW9zIHBsb3RhciBhIGN1cnZhIHRlbXBlcmF0dXJhIHggY2h1dmE6CgpgYGB7cn0KY2xpbWFzICU+JSBmaWx0ZXIoY2lkYWRlID09ICJKb8OjbyBQZXNzb2EiICYgY2h1dmEgPiAwKSAlPiUKICAgIGdncGxvdChhZXMoeD1jaHV2YSwgeT10bWVkaWEpKSArCiAgICBnZW9tX3BvaW50KCkKYGBgCkRldmlkbyBhIGNhcmFjdGVyw61zdGljYSBuw6NvLWxpbmVhciwgdXRpbGl6YXJlbW9zIG9zIG3DqXRvZG9zIGRlIGNvcnJlbGHDp8OjbyBkZSBTcGVhcm1hbiBlIEtlbmRhbGw6CmBgYHtyfQpjbGltYXMgJT4lIGZpbHRlcihjaWRhZGUgPT0gIkpvw6NvIFBlc3NvYSIgJiBjaHV2YSA+IDApICU+JSBzdW1tYXJpc2UoCiAgICBzcGVhcm1hbiA9IGNvcih0bWVkaWEsIGNodXZhLCBtZXRob2QgPSAic3BlYXJtYW4iLCB1c2U9ImNvbXBsZXRlLm9icyIpLCAKICAgIGtlbmRhbGwgPSBjb3IodG1lZGlhLCBjaHV2YSwgbWV0aG9kID0gImtlbmRhbGwiLCB1c2U9ImNvbXBsZXRlLm9icyIpCikKYGBgCkEgcmVsYcOnw6NvIGVudHJlIHRlbXBlcmF0dXJhIGUgY2h1dmFzIHBhcmEgYSBjaWRhZGUgZGUgSm/Do28gUGVzc29hIMOpIGZyYWNhLg==