Análise e pesquisa feitas por:

Bem vindos a esta humilde postagem que tentará visualizar algumas informações contidas nos dados das músicas do rei do baião (confesso que estou escutando agora mesmo). A princípio podemos observar como são compostos nossos dados extraídos da API do Spotify, quais campos temos ? quais seus tipos ? como podemos visualizá-los melhor ?

Importando libs

library(tidyverse)
library(here)
library(cowplot)
library(viridis)
library(ggridges)
library(ggplot2)
library(dplyr)
library(tidyr)
library(forcats)
library(GGally)
theme_set(theme_bw())

Lendo os dados

l_gonzaga = read_csv(here("data/gonzaga_musicas.csv"))

-- Column specification --------------------------------------------------------------------------------------
cols(
  .default = col_double(),
  album_uri = col_character(),
  album_name = col_character(),
  album_img = col_character(),
  album_release_date = col_character(),
  album_release_year = col_date(format = ""),
  track_name = col_character(),
  track_uri = col_character(),
  key = col_character(),
  mode = col_character(),
  key_mode = col_character()
)
i Use `spec()` for the full column specifications.

Nessa nossa primeira análise iremos mostrar dois valores, conhecidos como:

Vamos começar nossa análise buscando explorar quais são os 10 albuns mais e menos populares do Luiz gonzaga, podemos tentar visualizar se esses albuns possuem similaridades ou diferenças de tal maneira que o fizeram se destacar ou não, observando em quesitos de energia e valência.

pop_albuns = l_gonzaga %>%
    group_by(album_name) %>%
    summarise(album_popularity = max(album_popularity))

menos_pop = pop_albuns[order(pop_albuns$album_popularity),] %>%
    head(10)

menos_pop = l_gonzaga %>% 
    filter(album_name %in% menos_pop$album_name)

mais_pop = pop_albuns[order(pop_albuns$album_popularity),] %>%
    tail(10)

mais_pop = l_gonzaga %>% 
    filter(album_name %in% mais_pop$album_name)

menos_pop$pop <- 'menos popular'
mais_pop$pop <- 'mais popular'

pops <- rbind(menos_pop, mais_pop)
pops %>% 
    arrange(album_release_date) %>% 
    ggplot(aes(x = energy, 
               group = pop,
               label = track_name,
               y = valence)) + 
    stat_density2d(aes(fill=..level..), geom="polygon", n = 100, h = .25) +
    scale_fill_viridis() +  # escalas de cores contínuas mais legíveis que as default
    # geom_density2d() + # ou o stat_density ou geom_density
    facet_wrap(~pop) + 
    scale_x_continuous(limits = c(-.05, 1.05)) + 
    scale_y_continuous(limits = c(-.05, 1.05)) + 
    theme(legend.position = "None") + 
    labs(title = "Emoção nas gravações tropicalistas segundo o spotify", 
         subtitle = "A partir da análise de áudio de algumas centenas de faixas de cada um", 
         x = "Energia (+ = rápida, alta, cheia de sons)", 
         y = "Valência (+ = animada, alegre, eufórica)")

Aqui temos um gráfico de densidade para as músicas dos 10 albuns mais e menos populares do Luiz gonzaga, a princípio poderíamos pensar que os albuns menos populares pudessem ser diferentes se tratando de ambas as características, energia e valência, porém vemos no gráfico que o rei do baião se manteve com sua identidade com músicas mais animadas, alegres e rápidas.

Tá mais e ai ? será que os anos de lançamento dos albuns influenciaram na popularidade das músicas do Luiz gonzaga ?

# Plot
pops %>%
  mutate(album_name = fct_reorder(album_name, album_release_year)) %>%
  ggplot( aes(y=album_release_year, x=album_popularity, fill=album_name)) +
    geom_density_ridges(alpha=0.6, stat="binline", bins=20) +
    theme_ridges(
        center = TRUE
    ) +
    labs(title = "Popularidade dos albuns do Luiz Gonzaga ao longo dos anos") +
    theme(
        plot.title = element_text(hjust = 0.5),
        legend.position="bottom",
        panel.spacing = unit(0.1, "lines"),
        strip.text.x = element_text(size = 2)
    ) +
    xlab("Popularidade do album") +
    ylab("Ano de lançamento do album") +
    guides(fill=guide_legend(title="Nome do album"))

Com esse gráfico podemos observar que para os nossos 20 albuns anteriormente escolhidos como, 10 mais populares e 10 menos populares, a sua distribuição de popularidade ao longo dos anos possui um evidente limiar a partir dos albuns lançados entre os anos de 1990 e 2000, isso não quer dizer que seus albuns mais famosos foram lançados a partir dessa data, até porque ele faleceu no ano de 1989, oque podemos tentar sugerir é que alguns albuns conhecidos foram provavelmente re-lançados com melhor qualidade e portanto se torna um fator importante para as pessoas que querem escutar suas músicas.

Para finalizar que tal tentarmos obter a correlação entre todas os seguintes dados para cada música.

OBS: Para a tonalidade da música, que pode ser maior ou menor, optamos por transformar o dado em 1 para músicas com tonalidade maior e -1 para músicas com tonalidade menor.

new_l_gonzaga <- l_gonzaga %>%
    mutate(mode_c = ifelse(test = (mode == 'major'),
                           yes = 1,
                           no = -1
    )) %>% 
    select(danceability, energy, loudness, speechiness, acousticness, instrumentalness, liveness, valence, tempo, mode_c, track_popularity)

ggp = ggpairs(new_l_gonzaga, title="Correlações") 
print(ggp, progress = F)  # no progress bar

Podemos visualizar que os seguintes dados possuem um certa e esperada correlação entre si!

LS0tDQp0aXRsZTogIkFuw6FsaXNlIGRhcyBtw7pzaWNhcyBkZSBMdWl6IEdvbnphZ2Egbm8gU3BvdGlmeSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMjIyMgQW7DoWxpc2UgZSBwZXNxdWlzYSBmZWl0YXMgcG9yOg0KDQotIExlb25hcmRvIExpbWEgRmVsaXggZGEgU2lsdmEsIGluc3RhZ3JhbTogQGxlb19taXJhY2gNCi0gSm9zw6kgQXVndXN0byBCZXplcnJhIE5ldG8sIGluc3RhZ3JhbTogQGF1Z3VzdG9ubnQNCg0KQmVtIHZpbmRvcyBhIGVzdGEgaHVtaWxkZSBwb3N0YWdlbSBxdWUgdGVudGFyw6EgdmlzdWFsaXphciBhbGd1bWFzIGluZm9ybWHDp8O1ZXMgY29udGlkYXMgbm9zIGRhZG9zIGRhcyBtw7pzaWNhcyBkbyByZWkgZG8gYmFpw6NvIChjb25mZXNzbyBxdWUgZXN0b3UgZXNjdXRhbmRvIGFnb3JhIG1lc21vKS4NCkEgcHJpbmPDrXBpbyBwb2RlbW9zIG9ic2VydmFyIGNvbW8gc8OjbyBjb21wb3N0b3Mgbm9zc29zIGRhZG9zIGV4dHJhw61kb3MgZGEgQVBJIGRvIFNwb3RpZnksIHF1YWlzIGNhbXBvcyB0ZW1vcyA/IHF1YWlzIHNldXMgdGlwb3MgPyBjb21vIHBvZGVtb3MgdmlzdWFsaXrDoS1sb3MgbWVsaG9yID8NCg0KIyMjIyBJbXBvcnRhbmRvIGxpYnMNCg0KYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShoZXJlKQ0KbGlicmFyeShjb3dwbG90KQ0KbGlicmFyeSh2aXJpZGlzKQ0KbGlicmFyeShnZ3JpZGdlcykNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHRpZHlyKQ0KbGlicmFyeShmb3JjYXRzKQ0KbGlicmFyeShHR2FsbHkpDQp0aGVtZV9zZXQodGhlbWVfYncoKSkNCmBgYA0KDQojIyMjIExlbmRvIG9zIGRhZG9zDQoNCmBgYHtyfQ0KbF9nb256YWdhID0gcmVhZF9jc3YoDQogICAgaGVyZSgiZGF0YS9nb256YWdhX211c2ljYXMuY3N2IiksDQogICAgY29sX3R5cGVzID0gY29scygNCiAgICAgIC5kZWZhdWx0ID0gY29sX2RvdWJsZSgpLA0KICAgICAgYWxidW1fdXJpID0gY29sX2NoYXJhY3RlcigpLA0KICAgICAgYWxidW1fbmFtZSA9IGNvbF9jaGFyYWN0ZXIoKSwNCiAgICAgIGFsYnVtX2ltZyA9IGNvbF9jaGFyYWN0ZXIoKSwNCiAgICAgIGFsYnVtX3JlbGVhc2VfZGF0ZSA9IGNvbF9jaGFyYWN0ZXIoKSwNCiAgICAgIGFsYnVtX3JlbGVhc2VfeWVhciA9IGNvbF9kYXRlKGZvcm1hdCA9ICIiKSwNCiAgICAgIHRyYWNrX25hbWUgPSBjb2xfY2hhcmFjdGVyKCksDQogICAgICB0cmFja191cmkgPSBjb2xfY2hhcmFjdGVyKCksDQogICAgICBrZXkgPSBjb2xfY2hhcmFjdGVyKCksDQogICAgICBtb2RlID0gY29sX2NoYXJhY3RlcigpLA0KICAgICAga2V5X21vZGUgPSBjb2xfY2hhcmFjdGVyKCkNCiAgICApDQopDQpgYGANCg0KTmVzc2Egbm9zc2EgcHJpbWVpcmEgYW7DoWxpc2UgaXJlbW9zIG1vc3RyYXIgZG9pcyB2YWxvcmVzLCBjb25oZWNpZG9zIGNvbW86IA0KDQotICoqRW5lcmd5OioqIE5vcm1hbG1lbnRlLCBmYWl4YXMgZW5lcmfDqXRpY2FzIHF1ZSBzZSBwYXJlY2VtIHLDoXBpZGFzLCBhbHRhcyBlIGJhcnVsaGVudGFzDQotICoqVmFsZW5jZToqKiBGYWl4YXMgY29tIGFsdGEgdmFsw6puY2lhIHNvYW0gbWFpcyBwb3NpdGl2YXMgKHBvciBleGVtcGxvLCBmZWxpeiwgYWxlZ3JlLCBldWbDs3JpY28pLCBlbnF1YW50byBmYWl4YXMgY29tIGJhaXhhIHZhbMOqbmNpYSBzb2FtIG1haXMgbmVnYXRpdmFzIChwb3IgZXhlbXBsbywgdHJpc3RlLCBkZXByaW1pZG8sIGNvbSByYWl2YSkNCg0KKipWYW1vcyBjb21lw6dhcioqIG5vc3NhIGFuw6FsaXNlIGJ1c2NhbmRvIGV4cGxvcmFyIHF1YWlzIHPDo28gb3MgMTAgYWxidW5zIG1haXMgZSBtZW5vcyBwb3B1bGFyZXMgZG8gTHVpeiBnb256YWdhLCBwb2RlbW9zIHRlbnRhciB2aXN1YWxpemFyIHNlIGVzc2VzIGFsYnVucyBwb3NzdWVtIHNpbWlsYXJpZGFkZXMgb3UgZGlmZXJlbsOnYXMgZGUgdGFsIG1hbmVpcmEgcXVlIG8gZml6ZXJhbSBzZSBkZXN0YWNhciBvdSBuw6NvLCBvYnNlcnZhbmRvIGVtIHF1ZXNpdG9zIGRlIGVuZXJnaWEgZSB2YWzDqm5jaWEuDQoNCmBgYHtyfQ0KcG9wX2FsYnVucyA9IGxfZ29uemFnYSAlPiUNCiAgICBncm91cF9ieShhbGJ1bV9uYW1lKSAlPiUNCiAgICBzdW1tYXJpc2UoYWxidW1fcG9wdWxhcml0eSA9IG1heChhbGJ1bV9wb3B1bGFyaXR5KSkNCg0KbWVub3NfcG9wID0gcG9wX2FsYnVuc1tvcmRlcihwb3BfYWxidW5zJGFsYnVtX3BvcHVsYXJpdHkpLF0gJT4lDQogICAgaGVhZCgxMCkNCg0KbWVub3NfcG9wID0gbF9nb256YWdhICU+JSANCiAgICBmaWx0ZXIoYWxidW1fbmFtZSAlaW4lIG1lbm9zX3BvcCRhbGJ1bV9uYW1lKQ0KDQptYWlzX3BvcCA9IHBvcF9hbGJ1bnNbb3JkZXIocG9wX2FsYnVucyRhbGJ1bV9wb3B1bGFyaXR5KSxdICU+JQ0KICAgIHRhaWwoMTApDQoNCm1haXNfcG9wID0gbF9nb256YWdhICU+JSANCiAgICBmaWx0ZXIoYWxidW1fbmFtZSAlaW4lIG1haXNfcG9wJGFsYnVtX25hbWUpDQoNCm1lbm9zX3BvcCRwb3AgPC0gJ21lbm9zIHBvcHVsYXInDQptYWlzX3BvcCRwb3AgPC0gJ21haXMgcG9wdWxhcicNCg0KcG9wcyA8LSByYmluZChtZW5vc19wb3AsIG1haXNfcG9wKQ0KYGBgDQoNCg0KYGBge3J9DQpwb3BzICU+JSANCiAgICBhcnJhbmdlKGFsYnVtX3JlbGVhc2VfZGF0ZSkgJT4lIA0KICAgIGdncGxvdChhZXMoeCA9IGVuZXJneSwgDQogICAgICAgICAgICAgICBncm91cCA9IHBvcCwNCiAgICAgICAgICAgICAgIGxhYmVsID0gdHJhY2tfbmFtZSwNCiAgICAgICAgICAgICAgIHkgPSB2YWxlbmNlKSkgKyANCiAgICBzdGF0X2RlbnNpdHkyZChhZXMoZmlsbD0uLmxldmVsLi4pLCBnZW9tPSJwb2x5Z29uIiwgbiA9IDEwMCwgaCA9IC4yNSkgKw0KICAgIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsgICMgZXNjYWxhcyBkZSBjb3JlcyBjb250w61udWFzIG1haXMgbGVnw612ZWlzIHF1ZSBhcyBkZWZhdWx0DQogICAgIyBnZW9tX2RlbnNpdHkyZCgpICsgIyBvdSBvIHN0YXRfZGVuc2l0eSBvdSBnZW9tX2RlbnNpdHkNCiAgICBmYWNldF93cmFwKH5wb3ApICsgDQogICAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoLS4wNSwgMS4wNSkpICsgDQogICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLS4wNSwgMS4wNSkpICsgDQogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIk5vbmUiKSArIA0KICAgIGxhYnModGl0bGUgPSAiRW1vw6fDo28gbmFzIGdyYXZhw6fDtWVzIHRyb3BpY2FsaXN0YXMgc2VndW5kbyBvIHNwb3RpZnkiLCANCiAgICAgICAgIHN1YnRpdGxlID0gIkEgcGFydGlyIGRhIGFuw6FsaXNlIGRlIMOhdWRpbyBkZSBhbGd1bWFzIGNlbnRlbmFzIGRlIGZhaXhhcyBkZSBjYWRhIHVtIiwgDQogICAgICAgICB4ID0gIkVuZXJnaWEgKCsgPSByw6FwaWRhLCBhbHRhLCBjaGVpYSBkZSBzb25zKSIsIA0KICAgICAgICAgeSA9ICJWYWzDqm5jaWEgKCsgPSBhbmltYWRhLCBhbGVncmUsIGV1ZsOzcmljYSkiKQ0KYGBgDQpBcXVpIHRlbW9zIHVtIGdyw6FmaWNvIGRlIGRlbnNpZGFkZSBwYXJhIGFzIG3DunNpY2FzIGRvcyAxMCBhbGJ1bnMgbWFpcyBlIG1lbm9zIHBvcHVsYXJlcyBkbyBMdWl6IGdvbnphZ2EsIGEgcHJpbmPDrXBpbyBwb2RlcsOtYW1vcyBwZW5zYXIgcXVlIG9zIGFsYnVucyBtZW5vcyBwb3B1bGFyZXMgcHVkZXNzZW0gc2VyIGRpZmVyZW50ZXMgc2UgdHJhdGFuZG8gZGUgYW1iYXMgYXMgY2FyYWN0ZXLDrXN0aWNhcywgZW5lcmdpYSBlIHZhbMOqbmNpYSwgcG9yw6ltIHZlbW9zIG5vIGdyw6FmaWNvIHF1ZSBvIHJlaSBkbyBiYWnDo28gc2UgbWFudGV2ZSBjb20gc3VhIGlkZW50aWRhZGUgY29tIG3DunNpY2FzIG1haXMgYW5pbWFkYXMsIGFsZWdyZXMgZSByw6FwaWRhcy4gIA0KDQoqKlTDoSBtYWlzIGUgYWkgPyoqIHNlcsOhIHF1ZSBvcyBhbm9zIGRlIGxhbsOnYW1lbnRvIGRvcyBhbGJ1bnMgaW5mbHVlbmNpYXJhbSBuYSBwb3B1bGFyaWRhZGUgZGFzIG3DunNpY2FzIGRvIEx1aXogZ29uemFnYSA/DQoNCmBgYHtyLCBmaWcud2lkdGggPSAyMiwgZmlnLmhlaWdodD0gOH0NCiMgUGxvdA0KcG9wcyAlPiUNCiAgbXV0YXRlKGFsYnVtX25hbWUgPSBmY3RfcmVvcmRlcihhbGJ1bV9uYW1lLCBhbGJ1bV9yZWxlYXNlX3llYXIpKSAlPiUNCiAgZ2dwbG90KCBhZXMoeT1hbGJ1bV9yZWxlYXNlX3llYXIsIHg9YWxidW1fcG9wdWxhcml0eSwgZmlsbD1hbGJ1bV9uYW1lKSkgKw0KICAgIGdlb21fZGVuc2l0eV9yaWRnZXMoYWxwaGE9MC42LCBzdGF0PSJiaW5saW5lIiwgYmlucz0yMCkgKw0KICAgIHRoZW1lX3JpZGdlcygNCiAgICAgICAgY2VudGVyID0gVFJVRQ0KICAgICkgKw0KICAgIGxhYnModGl0bGUgPSAiUG9wdWxhcmlkYWRlIGRvcyBhbGJ1bnMgZG8gTHVpeiBHb256YWdhIGFvIGxvbmdvIGRvcyBhbm9zIikgKw0KICAgIHRoZW1lKA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJib3R0b20iLA0KICAgICAgICBwYW5lbC5zcGFjaW5nID0gdW5pdCgwLjEsICJsaW5lcyIpLA0KICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIpDQogICAgKSArDQogICAgeGxhYigiUG9wdWxhcmlkYWRlIGRvIGFsYnVtIikgKw0KICAgIHlsYWIoIkFubyBkZSBsYW7Dp2FtZW50byBkbyBhbGJ1bSIpICsNCiAgICBndWlkZXMoZmlsbD1ndWlkZV9sZWdlbmQodGl0bGU9Ik5vbWUgZG8gYWxidW0iKSkNCmBgYA0KQ29tIGVzc2UgZ3LDoWZpY28gcG9kZW1vcyBvYnNlcnZhciBxdWUgcGFyYSBvcyBub3Nzb3MgMjAgYWxidW5zIGFudGVyaW9ybWVudGUgZXNjb2xoaWRvcyBjb21vLCAxMCBtYWlzIHBvcHVsYXJlcyBlIDEwIG1lbm9zIHBvcHVsYXJlcywgYSBzdWEgZGlzdHJpYnVpw6fDo28gZGUgcG9wdWxhcmlkYWRlIGFvIGxvbmdvIGRvcyBhbm9zIHBvc3N1aSB1bSBldmlkZW50ZSBsaW1pYXIgYSBwYXJ0aXIgZG9zIGFsYnVucyBsYW7Dp2Fkb3MgZW50cmUgb3MgYW5vcyBkZSAxOTkwIGUgMjAwMCwgaXNzbyBuw6NvIHF1ZXIgZGl6ZXIgcXVlIHNldXMgYWxidW5zIG1haXMgZmFtb3NvcyBmb3JhbSBsYW7Dp2Fkb3MgYSBwYXJ0aXIgZGVzc2EgZGF0YSwgYXTDqSBwb3JxdWUgZWxlIGZhbGVjZXUgbm8gYW5vIGRlIDE5ODksIG9xdWUgcG9kZW1vcyB0ZW50YXIgc3VnZXJpciDDqSBxdWUgYWxndW5zIGFsYnVucyBjb25oZWNpZG9zIGZvcmFtIHByb3ZhdmVsbWVudGUgcmUtbGFuw6dhZG9zIGNvbSBtZWxob3IgcXVhbGlkYWRlIGUgcG9ydGFudG8gc2UgdG9ybmEgdW0gZmF0b3IgaW1wb3J0YW50ZSBwYXJhIGFzIHBlc3NvYXMgcXVlIHF1ZXJlbSBlc2N1dGFyIHN1YXMgbcO6c2ljYXMuDQoNCioqUGFyYSBmaW5hbGl6YXIqKiBxdWUgdGFsIHRlbnRhcm1vcyBvYnRlciBhIGNvcnJlbGHDp8OjbyBlbnRyZSB0b2RhcyBvcyBzZWd1aW50ZXMgZGFkb3MgcGFyYSBjYWRhIG3DunNpY2EuIA0KDQotICoqZGFuY2VhYmlsaXR5OioqIERlc2NyZXZlIGNvbW8gdW1hIGZhaXhhIMOpIGFkZXF1YWRhIHBhcmEgZGFuw6dhciBjb21iaW5hbmRvIGVsZW1lbnRvcyBtdXNpY2FpczsgdGVtcG8sIHJpdG1vLCBiYXRpZGEgZSByZWd1bGFyaWRhZGUgZ2VyYWwNCi0gKiplbmVyZ3k6KiogTm9ybWFsbWVudGUsIGZhaXhhcyBlbmVyZ8OpdGljYXMgcXVlIHNlIHBhcmVjZW0gcsOhcGlkYXMsIGFsdGFzIGUgYmFydWxoZW50YXMuDQotICoqbG91ZG5lc3M6KiogTyB2b2x1bWUgb3UgbsOtdmVsIGRlIGF1ZGliaWxpZGFkZSBkbyBzb20uDQotICoqc3BlZWNoaW5lc3M6KiogRGV0ZWN0YSBhIHByZXNlbsOnYSBkZSBwYWxhdnJhcyBmYWxhZGFzIGVtIHVtYSBmYWl4YS4NCi0gKiphY291c3RpbmVzczoqKiBSZXByZXNlbnRhIHNlIGEgZmFpeGEgw6kgYWPDunN0aWNhIG91IG7Do28uDQotICoqaW5zdHJ1bWVudGFsbmVzczoqKiBFc3RlIHZhbG9yIHJlcHJlc2VudGEgYSBxdWFudGlkYWRlIGRlIHZvY2FpcyBuYSBtw7pzaWNhLCBvdSBzZWphLCBxdWFudG8gbWFpcyBwcsOzeGltbyBhIDEgbWFpcyBzaWduaWZpY2lhIHF1ZSDDqSB1bWEgbcO6c2ljYSBpbnN0cnVtZW50YWwuDQotICoqbGl2ZW5lc3M6KiogRXN0ZSB2YWxvciBkZXNjcmV2ZSBhIHByb2JhYmlsaWRhZGUgZGUgYSBtw7pzaWNhIHRlciBzaWRvIGdyYXZhZGEgY29tIHVtIHDDumJsaWNvIGFvIHZpdm8uDQotICoqdmFsZW5jZToqKiBGYWl4YXMgY29tIGFsdGEgdmFsw6puY2lhIHNvYW0gbWFpcyBwb3NpdGl2YXMgKHBvciBleGVtcGxvLCBmZWxpeiwgYWxlZ3JlLCBldWbDs3JpY28pLCBlbnF1YW50byBmYWl4YXMgY29tIGJhaXhhIHZhbMOqbmNpYSBzb2FtIG1haXMgbmVnYXRpdmFzIChwb3IgZXhlbXBsbywgdHJpc3RlLCBkZXByaW1pZG8sIGNvbSByYWl2YSkuDQotICoqVGVtcG8gZGEgbcO6c2ljYToqKiA6cA0KLSAqKlRvbmFsaWRhZGUgZGEgbcO6c2ljYToqKiA6cA0KLSAqKlBvcHVsYXJpZGFkZSBkYSBtw7pzaWNhOioqIDpwDQoNCk9CUzogUGFyYSBhIHRvbmFsaWRhZGUgZGEgbcO6c2ljYSwgcXVlIHBvZGUgc2VyIG1haW9yIG91IG1lbm9yLCBvcHRhbW9zIHBvciB0cmFuc2Zvcm1hciBvIGRhZG8gZW0gMSBwYXJhIG3DunNpY2FzIGNvbSB0b25hbGlkYWRlIG1haW9yIGUgLTEgcGFyYSBtw7pzaWNhcyBjb20gdG9uYWxpZGFkZSBtZW5vci4NCg0KYGBge3IsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gOCwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCm5ld19sX2dvbnphZ2EgPC0gbF9nb256YWdhICU+JQ0KICAgIG11dGF0ZShtb2RlX2MgPSBpZmVsc2UodGVzdCA9IChtb2RlID09ICdtYWpvcicpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vID0gLTENCiAgICApKSAlPiUgDQogICAgc2VsZWN0KGRhbmNlYWJpbGl0eSwgZW5lcmd5LCBsb3VkbmVzcywgc3BlZWNoaW5lc3MsIGFjb3VzdGljbmVzcywgaW5zdHJ1bWVudGFsbmVzcywgbGl2ZW5lc3MsIHZhbGVuY2UsIHRlbXBvLCBtb2RlX2MsIHRyYWNrX3BvcHVsYXJpdHkpDQoNCmdncCA9IGdncGFpcnMobmV3X2xfZ29uemFnYSwgdGl0bGU9IkNvcnJlbGHDp8O1ZXMiKSANCnByaW50KGdncCwgcHJvZ3Jlc3MgPSBGKSAgIyBubyBwcm9ncmVzcyBiYXINCmBgYA0KUG9kZW1vcyB2aXN1YWxpemFyIHF1ZSBvcyBzZWd1aW50ZXMgZGFkb3MgcG9zc3VlbSB1bSBjZXJ0YSBlIGVzcGVyYWRhIGNvcnJlbGHDp8OjbyBlbnRyZSBzaSENCg0KLSAqKlZhbGVuY2UgZSBEYW5jZWFiaWxpdHkqKjogRmF6IHNlbnRpZG8hIHZpc3RvIHF1ZSBhbWJhcyBpbmRpY2FtIG3DunNpY2FzIGNvbSB2b2x1bWUgbWFpcyBhbHRvcyBvdSBtYWlzIGFuaW1hZGFzLg0KLSAqKlZhbGVuY2UgZSBFbmVyZ3kqKjogQXF1aSBvIG1lc21vIHNlIHJlcGV0ZSEgcGFyYSBtw7pzaWNhcyBhbHRhcywgcsOhcGlkYXMgZSBiYXJ1bGhlbnRhcy4NCi0gKipBY291c3RpbmVzcyBlIEVuZXJneSoqOiBJbnRlcmVzc2FudGUhIGFxdWkgcGFyYSBhcyBtw7pzaWNhcyBkbyBMdWl6LCBxdWFudG8gbWFpcyBhY3VzdGljYSDDqSBhIG3DunNpY2EsIG1haXMgZWxhIHRlbmRlIGEgdGVyIHZhbG9yZXMgbWVub3JlcyBkZSBlbmVyZ2lhLCBlIHZpY2UgZSB2ZXJzYS4NCi0gKipMb3VkbmVzcyBlIEVuZXJneSoqOiBTaW1pbGFyIGFzIG91dHJhcyBjb3JyZWxhw6fDtWVzIHZpc3RhcywgZGFkbyBxdWUgbyB2b2x1bWUgZGEgbcO6c2ljYSB0ZW5kZSBhIGF1bWVudGFyIHF1YW5kbyBlbGEgw6kgbWFpcyBhbmltYWRhIQ0K