Visualização de dados do SUS

Prof. Heron OH

29 April, 2025

     Olá, esta é mais uma de um conjunto de práticas em bioinformática desenvolvidas para o curso de Biomedicina da PUC-MG. Você pode encontrar as demais práticas aqui.

     Hoje nós vamos trabalhar com dados obtidos do Sistema Único de Saúde, o SUS.

Introdução

Os dados do SUS

     O SUS mantém e disponibiliza diversos sistemas de informação contendo dados relacionados à doenças, condições, causas de óbito, quadros hospitalares e características de indivíduos brasileiros. Estes dados são anonimizados, o que significa que não se é possível associá-los ao indivíduo fonte, desta maneira garantindo a privacidade do cidadão.

O DATASUS disponibiliza informações que podem servir para subsidiar análises objetivas da situação sanitária, tomadas de decisão baseadas em evidências e elaboração de programas e ações em saúde. Estes dados podem ser coletados manualmente, através da interface TABNET, ou diversas outras fontes. Recentemente foi desenvolvido o pacote de R microdatasus, que possibilita baixar os dados através de interface programática, facilitando enormemente o processo.

Existem diversos sistemas distintos, vamos conhecer os principais:

Principais Sistemas

SIM - Sistema de Informações sobre Mortalidade

  • Objetivo: Registrar e monitorar os óbitos ocorridos no Brasil.
  • Fonte de dados: Declarações de Óbito (DO).
  • Informações coletadas:
    • Causa básica da morte (CID-10),
    • Idade,
    • Sexo,
    • Escolaridade,
    • Local de ocorrência.

O SIM é usado para análises de mortalidade por causas específicas, como doenças crônicas, infecções e causas externas (acidentes, homicídios).

SINASC - Sistema de Informações sobre Nascidos Vivos

  • Objetivo: Registrar todos os nascimentos vivos no país.
  • Fonte de dados: Declarações de Nascido Vivo (DNV).
  • Informações coletadas:
    • Peso ao nascer,
    • Idade gestacional,
    • Tipo de parto,
    • Escolaridade da mãe,
    • Local do parto.

O SINASC é importante para estudar indicadores como prematuridade, baixo peso ao nascer e saúde materno-infantil.

Outros Sistemas Relevantes

  • SIH-SUS (Sistema de Informações Hospitalares): registros de internações hospitalares no SUS.
  • SIA-SUS (Sistema de Informações Ambulatoriais): registros de atendimentos ambulatoriais no SUS.
  • SINAN (Sistema de Informação de Agravos de Notificação): monitora doenças de notificação obrigatória, como dengue, tuberculose e HIV.
  • CNES (Cadastro Nacional de Estabelecimentos de Saúde): registra informações sobre hospitais, postos de saúde e outros estabelecimentos de saúde.

O uso integrado desses sistemas permite compreender a situação de saúde da população brasileira, monitorar tendências e embasar decisões em saúde pública.

Prática

Nesta prática iremos explorar um subconjunto de dados do sistema SIM-DO, mais especificamente analisando óbitos relacionados ao CID J159: “Pneumonia bacteriana, não especificada”. Aproveitaremos também para revisar alguns consceitos importantes sobre a linguagem R e seu funcionamento.

Preparação

Carregar pacotes

# para instalar o pacote, caso ainda não tenha (só se instala uma vez)
install.packages("ggplot2")
install.packages("dplyr")

# execute para carregar o pacote, caso já instalado
library("ggplot2")
library("dplyr")

DICA 1: toda vez que você for reiniciar um sessão é necessário carregar os pacotes. Eles são a primeira coisa de qualquer código.

DICA 2: Se ao carregar o pacote você tiver uma mensagem de erro como pacote não disponível, package not available, etc, praticamente qualquer pacore pode ser instalado com o comando intall.packages(“nome_do_pacote”).

DICA 3: Cada pacote só precisa ser instalado uma única vez.

Obtendo os dados

Para a prática

Para facilitar, iremos trabalhar com um subconjunto já organizado, que deve ser baixado aqui. Você irá fazer download do arquivo e em seguida iremos carregar esse arquivo para o R.

Vamos ver o arquivo no formato tabular clássico, nesta tabela.

Para as análises da desta aula prática, você pode pular a próxima sessão.

DICA 1: Para prosseguir na análise que vamos desenvolver, copie e cole os blocos de código num novo documento do tipo .R.

DICA 2: utilize a tecla tab para autocompletar e evitar erros!

                             #complete usando a tecla TAB até chegar ao arquivo que você baixou
dados_SUS <- read.csv(file = "",
                      sep = ","
                      ) %>% 
  tibble::tibble()

Para outros projetos

Caso você tenha interesse em investigar outras questões sanitárias da população brasileira, você pode obter diferentes conjuntos de dados assim:

# executar apenas se estiver instalando em um computador windows ----
install.packages("read.dbc", repos = "https://packagemanager.posit.co/cran/2024-07-05")

#instalar pacotes necessários ----
install.packages("remotes")
remotes::install_github("rfsaldanha/microdatasus")

library(microdatasus)

# baixar dados ----
dados_brutos_SUS <- fetch_datasus(year_start = 2020,
                       year_end = 2023, 
                       uf = "MG", 
                       information_system = "SIM-DO")

dados_SUS <- process_sim(dados_brutos_SUS)

dados_SUS

Investigando os dados

   Nossos dados estão no formato tabular, ou seja, organizados em linhas e colunas. As linhas são as observações de qualquer tabela. No nosso caso elas correspondem a indivíduos. Já as colunas são conjuntos definidos de informação. Cada coluna armazena um tipo de informação única, como a idade, Sexo, município de nascimento, entre outros. Assim, uma coluna que armazena a idade terá apenas valores numéricos positivos, já a de município de nascimento terá apenas nomes de cidade, e a coluna Sexo terá apenas as classes de valores masculino, feminino ou não informado. Desta maneira, idade é uma variável contínua e numérica. Por outro lado, Sexo é uma variável discreta e categórica. Vamos entender isso melhor.

# ver a tabela de dados
dados_SUS

# qual o tamanho da tabela
dim(dados_SUS)

# qual o nome das colunas
colnames(dados_SUS)

# quais os valores de uma coluna
dados_SUS$Idade_anos 
dados_SUS$Sexo 

# quantas observações temos de cada tipo? 
dados_SUS$Idade_anos %>% table()
dados_SUS$Sexo %>% table()


# visualizar quantas observações temos de cada tipo
dados_SUS$Idade_anos %>% table() %>% plot()
dados_SUS$Sexo %>% table() %>% barplot()



#quais as 10 primeiras observações dessa tabela
dados_SUS[1:10,]

#quais asegunda coluna
dados_SUS[,2]


#qual a média de idades?
dados_SUS$Idade_anos %>% mean(na.rm = T)

Gráficos exploratórios

Gráfico escolaridade por Sexo

# grágico escolaridade por Sexo
 dados_SUS %>%
  mutate(Idade_anos = as.numeric(Idade_anos) ) %>% 
  filter(Sexo %in% c("Masculino", "Feminino")) %>% 
  ggplot(aes(x = CID_significado,
             group = Escolaridade,
             col = Escolaridade,
             fill  = Escolaridade)) +
  geom_bar(stat = "count",position = "dodge") +
  facet_grid(cols = vars(Sexo))

#### Gráfico de Sexo e escolaridade

 dados_SUS %>%
  mutate(Idade_anos = as.numeric(Idade_anos) ) %>% 
  filter(Sexo %in% c("Masculino", "Feminino")) %>% 
  ggplot(aes(x = CID_significado,
             group = Sexo,
             col = Sexo,
             fill  = Sexo)) +
  geom_bar(stat = "count",position = "dodge") +
  facet_grid(cols = vars(Escolaridade))

#### Gráfico aumento de mortes por grupo de escolaridade

 dados_SUS %>%
  filter(Sexo %in% c("Masculino", "Feminino")) %>% 
  ggplot(aes(x = Ano_obito,
             group = Sexo,
             col = Sexo,
             fill  = Sexo)) +
  geom_density(stat = "count",position = "stack") +
  facet_grid(cols = vars(Escolaridade)) +
   theme(axis.text.x = element_text(angle = 90))
## Warning: Removed 1 row containing non-finite outside the scale range
## (`stat_count()`).

#### Gráfico aumento de mortes total

 dados_SUS %>%
  filter(Sexo %in% c("Masculino", "Feminino")) %>% 
  ggplot(aes(x = Ano_obito,
             group = Sexo,
             col = Sexo,
             fill  = Sexo)) +
  geom_density(stat = "count",position = "stack") +
   theme(axis.text.x = element_text(angle = 90))
## Warning: Removed 1 row containing non-finite outside the scale range
## (`stat_count()`).

#### Gráfico aumento de mortes por ano e estado civil

 dados_SUS %>%
  filter(Sexo %in% c("Masculino", "Feminino")) %>% 
  ggplot(aes(x = Ano_obito,
             group = Estado_civil,
             col = Estado_civil,
             fill  = Estado_civil)) +
  geom_density(stat = "count",position = "stack") +
   theme(axis.text.x = element_text(angle = 90)) +
  facet_grid(cols = vars(Sexo)) 
## Warning: Removed 1 row containing non-finite outside the scale range
## (`stat_count()`).

#### Gráfico de média de idades por grupo de escolaridade

 dados_SUS %>%
  filter(Sexo %in% c("Masculino", "Feminino")) %>% 
  ggplot(aes(y = Idade_anos,
             x = Sexo,
             group = Sexo,
             fill  = Sexo)) +
  geom_boxplot() +
   # geom_jitter() +
   theme(axis.text.x = element_text(angle = 90)) +
  facet_grid(cols = vars(Escolaridade)) 
## Warning: Removed 237 rows containing non-finite outside the scale range
## (`stat_boxplot()`).

E por hoje ficamos por aqui!


Voltar para a página inicial

cat(’

’)

LS0tCnRpdGxlOiAiVmlzdWFsaXphw6fDo28gZGUgZGFkb3MgZG8gU1VTIgphdXRob3I6ICJQcm9mLiBIZXJvbiBPSCIKcGxhY2U6ICJCaW9tZWRpY2luYSAtIFBVQyBNaW5hcyIKZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJWQgJUIsICVZJylgIgpvdXRwdXQ6IAogIHJtZGZvcm1hdHM6OmRvd25jdXRlOgogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQogICAgdG9jX2RlcHRoOiA1CiAgICB0b2NfZmxvYXQ6IHllcwogICAgaGlnaGxpZ2h0OiB6ZW5idXJuCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMKZWRpdG9yX29wdGlvbnM6IAogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKCmxpYnJhcnkoImdncGxvdDIiKQpsaWJyYXJ5KCJkcGx5ciIpCmRhZG9zX1NVUyA8LSAgcmVhZC5jc3YoZmlsZSA9ICJ+L3ByamN0cy9iaW9pbmZvL21pc2MvZGFkb3NfU1VTX2ZpbHQuY3N2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXAgPSAiLCIpICU+JSB0aWJibGU6OnRpYmJsZSgpCmBgYAoKYGBge3IgY29sb3IsIGVjaG89RkFMU0UsIHJlc3VsdHM9J2FzaXMnfQojY29uZmlndXJhciBwcm9zICoqUioqZXN1bHRhZG9zIGRvIGJhc2ggc2FpcmVtIGNvbG9yaWRvcyBlIG7Do28gQU5TSQoKb2xkX2hvb2tzIDwtIGZhbnNpOjpzZXRfa25pdF9ob29rcygKICBrbml0cjo6a25pdF9ob29rcywgCiAgd2hpY2ggPSBjKCJvdXRwdXQiLCAibWVzc2FnZSIsICJlcnJvciIpCikKYGBgCgo8c3R5bGU+CmJvZHkgewp0ZXh0LWFsaWduOiBqdXN0aWZ5fQo8L3N0eWxlPgoKPHN0eWxlPgojdG9jIHVsLm5hdiBsaSB1bCBsaSB7CiAgICBkaXNwbGF5OiBub25lOwogICAgbWF4LWhlaWdodDogbm9uZTsKfQoKI3RvYyB1bC5uYXYgbGkuYWN0aXZlIHVsIGxpICB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIG1heC1oZWlnaHQ6IG5vbmU7Cn0KCiN0b2MgdWwubmF2IGxpIHVsIGxpIHVsIGxpIHsKICAgIG1heC1oZWlnaHQ6IG5vbmU7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KCiN0b2MgdWwubmF2IGxpIHVsIGxpLmFjdGl2ZSB1bCBsaSB7CiAgICBtYXgtaGVpZ2h0OiBub25lOwogICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKfQo8L3N0eWxlPgoKCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwpPbMOhLCBlc3RhIMOpIG1haXMgdW1hIGRlIHVtIGNvbmp1bnRvIGRlIHByw6F0aWNhcyBlbSBiaW9pbmZvcm3DoXRpY2EgZGVzZW52b2x2aWRhcyBwYXJhIG8gY3Vyc28gZGUgQmlvbWVkaWNpbmEgZGEgKlBVQy1NRyouClZvY8OqIHBvZGUgZW5jb250cmFyIGFzIGRlbWFpcyBwcsOhdGljYXMgWyphcXVpKl0oaHR0cHM6Ly9oZXJvbm9oLmdpdGh1Yi5pby9iaW9pbmZvL2F1bGFzKS4KCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwpIb2plIG7Ds3MgdmFtb3MgdHJhYmFsaGFyIGNvbSBkYWRvcyBvYnRpZG9zIGRvIF9TaXN0ZW1hIMOabmljbyBkZSBTYcO6ZGVfLCBvIF8qU1VTKl8uIAoKCiMgSW50cm9kdcOnw6NvCgojIyBPcyBkYWRvcyBkbyBTVVMKCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwpPIF8qU1VTKl8gbWFudMOpbSBlIGRpc3BvbmliaWxpemEgZGl2ZXJzb3Mgc2lzdGVtYXMgZGUgaW5mb3JtYcOnw6NvIGNvbnRlbmRvIGRhZG9zIHJlbGFjaW9uYWRvcyDDoCBkb2Vuw6dhcywgY29uZGnDp8O1ZXMsIGNhdXNhcyBkZSDDs2JpdG8sIHF1YWRyb3MgaG9zcGl0YWxhcmVzIGUgY2FyYWN0ZXLDrXN0aWNhcyBkZSBpbmRpdsOtZHVvcyBicmFzaWxlaXJvcy4gRXN0ZXMgZGFkb3Mgc8OjbyBfYW5vbmltaXphZG9zXywgbyBxdWUgc2lnbmlmaWNhIHF1ZSBuw6NvIHNlIMOpIHBvc3PDrXZlbCBhc3NvY2nDoS1sb3MgYW8gaW5kaXbDrWR1byBmb250ZSwgZGVzdGEgbWFuZWlyYSBnYXJhbnRpbmRvIGEgcHJpdmFjaWRhZGUgZG8gY2lkYWTDo28uCgpPICpfREFUQVNVU18qIGRpc3BvbmliaWxpemEgaW5mb3JtYcOnw7VlcyBxdWUgcG9kZW0gc2VydmlyIHBhcmEgc3Vic2lkaWFyICBhbsOhbGlzZXMgb2JqZXRpdmFzIGRhIHNpdHVhw6fDo28gc2FuaXTDoXJpYSwgdG9tYWRhcyBkZSBkZWNpc8OjbyBiYXNlYWRhcyBlbSBldmlkw6puY2lhcyBlIGVsYWJvcmHDp8OjbyBkZSBwcm9ncmFtYXMgZSBhw6fDtWVzIGVtIHNhw7pkZS4gRXN0ZXMgZGFkb3MgcG9kZW0gc2VyIGNvbGV0YWRvcyBtYW51YWxtZW50ZSwgYXRyYXbDqXMgZGEgaW50ZXJmYWNlIFsqVEFCTkVUKl0oaHR0cHM6Ly9kYXRhc3VzLnNhdWRlLmdvdi5ici9pbmZvcm1hY29lcy1kZS1zYXVkZS10YWJuZXQvKSwgb3UgZGl2ZXJzYXMgb3V0cmFzIGZvbnRlcy4gClJlY2VudGVtZW50ZSBmb2kgZGVzZW52b2x2aWRvIG8gcGFjb3RlIGRlIFIgWypfbWljcm9kYXRhc3VzXypdKGh0dHBzOi8vZ2l0aHViLmNvbS9yZnNhbGRhbmhhL21pY3JvZGF0YXN1cyksIHF1ZSBwb3NzaWJpbGl0YSBiYWl4YXIgb3MgZGFkb3MgYXRyYXbDqXMgZGUgaW50ZXJmYWNlIHByb2dyYW3DoXRpY2EsIGZhY2lsaXRhbmRvIGVub3JtZW1lbnRlIG8gcHJvY2Vzc28uCgpFeGlzdGVtIGRpdmVyc29zIHNpc3RlbWFzIGRpc3RpbnRvcywgdmFtb3MgY29uaGVjZXIgb3MgcHJpbmNpcGFpczoKCiMjIFByaW5jaXBhaXMgU2lzdGVtYXMKCiMjIyBTSU0gLSBTaXN0ZW1hIGRlIEluZm9ybWHDp8O1ZXMgc29icmUgTW9ydGFsaWRhZGUKCi0gKipPYmpldGl2bzoqKiBSZWdpc3RyYXIgZSBtb25pdG9yYXIgb3Mgw7NiaXRvcyBvY29ycmlkb3Mgbm8gQnJhc2lsLgotICoqRm9udGUgZGUgZGFkb3M6KiogRGVjbGFyYcOnw7VlcyBkZSDDk2JpdG8gKERPKS4KLSAqKkluZm9ybWHDp8O1ZXMgY29sZXRhZGFzOioqIAogIC0gQ2F1c2EgYsOhc2ljYSBkYSBtb3J0ZSAoQ0lELTEwKSwKICAtIElkYWRlLAogIC0gU2V4bywKICAtIEVzY29sYXJpZGFkZSwKICAtIExvY2FsIGRlIG9jb3Jyw6puY2lhLgoKTyBTSU0gw6kgdXNhZG8gcGFyYSBhbsOhbGlzZXMgZGUgbW9ydGFsaWRhZGUgcG9yIGNhdXNhcyBlc3BlY8OtZmljYXMsIGNvbW8gZG9lbsOnYXMgY3LDtG5pY2FzLCBpbmZlY8Onw7VlcyBlIGNhdXNhcyBleHRlcm5hcyAoYWNpZGVudGVzLCBob21pY8OtZGlvcykuCgojIyMgU0lOQVNDIC0gU2lzdGVtYSBkZSBJbmZvcm1hw6fDtWVzIHNvYnJlIE5hc2NpZG9zIFZpdm9zCgotICoqT2JqZXRpdm86KiogUmVnaXN0cmFyIHRvZG9zIG9zIG5hc2NpbWVudG9zIHZpdm9zIG5vIHBhw61zLgotICoqRm9udGUgZGUgZGFkb3M6KiogRGVjbGFyYcOnw7VlcyBkZSBOYXNjaWRvIFZpdm8gKEROVikuCi0gKipJbmZvcm1hw6fDtWVzIGNvbGV0YWRhczoqKgogIC0gUGVzbyBhbyBuYXNjZXIsCiAgLSBJZGFkZSBnZXN0YWNpb25hbCwKICAtIFRpcG8gZGUgcGFydG8sCiAgLSBFc2NvbGFyaWRhZGUgZGEgbcOjZSwKICAtIExvY2FsIGRvIHBhcnRvLgoKTyBTSU5BU0Mgw6kgaW1wb3J0YW50ZSBwYXJhIGVzdHVkYXIgaW5kaWNhZG9yZXMgY29tbyBwcmVtYXR1cmlkYWRlLCBiYWl4byBwZXNvIGFvIG5hc2NlciBlIHNhw7pkZSBtYXRlcm5vLWluZmFudGlsLgoKIyMjIE91dHJvcyBTaXN0ZW1hcyBSZWxldmFudGVzCgotICoqU0lILVNVUyoqIChTaXN0ZW1hIGRlIEluZm9ybWHDp8O1ZXMgSG9zcGl0YWxhcmVzKTogcmVnaXN0cm9zIGRlIGludGVybmHDp8O1ZXMgaG9zcGl0YWxhcmVzIG5vIFNVUy4KLSAqKlNJQS1TVVMqKiAoU2lzdGVtYSBkZSBJbmZvcm1hw6fDtWVzIEFtYnVsYXRvcmlhaXMpOiByZWdpc3Ryb3MgZGUgYXRlbmRpbWVudG9zIGFtYnVsYXRvcmlhaXMgbm8gU1VTLgotICoqU0lOQU4qKiAoU2lzdGVtYSBkZSBJbmZvcm1hw6fDo28gZGUgQWdyYXZvcyBkZSBOb3RpZmljYcOnw6NvKTogbW9uaXRvcmEgZG9lbsOnYXMgZGUgbm90aWZpY2HDp8OjbyBvYnJpZ2F0w7NyaWEsIGNvbW8gZGVuZ3VlLCB0dWJlcmN1bG9zZSBlIEhJVi4KLSAqKkNORVMqKiAoQ2FkYXN0cm8gTmFjaW9uYWwgZGUgRXN0YWJlbGVjaW1lbnRvcyBkZSBTYcO6ZGUpOiByZWdpc3RyYSBpbmZvcm1hw6fDtWVzIHNvYnJlIGhvc3BpdGFpcywgcG9zdG9zIGRlIHNhw7pkZSBlIG91dHJvcyBlc3RhYmVsZWNpbWVudG9zIGRlIHNhw7pkZS4KCgpPIHVzbyBpbnRlZ3JhZG8gZGVzc2VzIHNpc3RlbWFzIHBlcm1pdGUgY29tcHJlZW5kZXIgYSBzaXR1YcOnw6NvIGRlIHNhw7pkZSBkYSBwb3B1bGHDp8OjbyBicmFzaWxlaXJhLCBtb25pdG9yYXIgdGVuZMOqbmNpYXMgZSBlbWJhc2FyIGRlY2lzw7VlcyBlbSBzYcO6ZGUgcMO6YmxpY2EuCgoKCiMgUHLDoXRpY2EKCk5lc3RhIHByw6F0aWNhIGlyZW1vcyBleHBsb3JhciB1bSBzdWJjb25qdW50byBkZSBkYWRvcyBkbyBzaXN0ZW1hIFNJTS1ETywgbWFpcyBlc3BlY2lmaWNhbWVudGUgYW5hbGlzYW5kbyDDs2JpdG9zIHJlbGFjaW9uYWRvcyBhbyAqQ0lEIEoxNTkqOiBfIlBuZXVtb25pYSBiYWN0ZXJpYW5hLCBuw6NvIGVzcGVjaWZpY2FkYSJfLgpBcHJvdmVpdGFyZW1vcyB0YW1iw6ltIHBhcmEgcmV2aXNhciBhbGd1bnMgY29uc2NlaXRvcyBpbXBvcnRhbnRlcyBzb2JyZSBhIGxpbmd1YWdlbSBSIGUgc2V1IGZ1bmNpb25hbWVudG8uCgojIyBQcmVwYXJhw6fDo28KCiMjIyBDYXJyZWdhciBwYWNvdGVzCgoKYGBge3IgaW1wb3J0X2RhZG9zX1NVU3JhZG9zLCBlY2hvPVRSVUUsZXZhbD1GQUxTRX0KIyBwYXJhIGluc3RhbGFyIG8gcGFjb3RlLCBjYXNvIGFpbmRhIG7Do28gdGVuaGEgKHPDsyBzZSBpbnN0YWxhIHVtYSB2ZXopCmluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKQppbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpCgojIGV4ZWN1dGUgcGFyYSBjYXJyZWdhciBvIHBhY290ZSwgY2FzbyBqw6EgaW5zdGFsYWRvCmxpYnJhcnkoImdncGxvdDIiKQpsaWJyYXJ5KCJkcGx5ciIpCgpgYGAKCgo+IERJQ0EgMTogdG9kYSB2ZXogcXVlIHZvY8OqIGZvciByZWluaWNpYXIgdW0gc2Vzc8OjbyDDqSBuZWNlc3PDoXJpbyBjYXJyZWdhciBvcyBwYWNvdGVzLiBFbGVzIHPDo28gYSBwcmltZWlyYSBjb2lzYSBkZSBxdWFscXVlciBjw7NkaWdvLgoKPiBESUNBIDI6IFNlIGFvIGNhcnJlZ2FyIG8gcGFjb3RlIHZvY8OqIHRpdmVyIHVtYSBtZW5zYWdlbSBkZSBlcnJvIGNvbW8gX3BhY290ZSBuw6NvIGRpc3BvbsOtdmVsLCBwYWNrYWdlIG5vdCBhdmFpbGFibGUsIGV0Y18sIHByYXRpY2FtZW50ZSBxdWFscXVlciBwYWNvcmUgcG9kZSBzZXIgaW5zdGFsYWRvIGNvbSBvIGNvbWFuZG8gaW50YWxsLnBhY2thZ2VzKCJub21lX2RvX3BhY290ZSIpLgoKPiBESUNBIDM6IENhZGEgcGFjb3RlIHPDsyBwcmVjaXNhIHNlciBpbnN0YWxhZG8gdW1hIMO6bmljYSB2ZXouCgojIyBPYnRlbmRvIG9zIGRhZG9zCgojIyMgUGFyYSBhIHByw6F0aWNhCgpQYXJhIGZhY2lsaXRhciwgaXJlbW9zIHRyYWJhbGhhciBjb20gdW0gc3ViY29uanVudG8gasOhIG9yZ2FuaXphZG8sIHF1ZSBkZXZlIHNlciBiYWl4YWRvIFthcXVpXShodHRwczovL2RyaXZlLmdvb2dsZS5jb20vZmlsZS9kLzFjQmRINTRSaThDWURiMXdkWEU1ZGdkNlVXUXFiZEVpVS92aWV3P3VzcD1zaGFyaW5nKS4gVm9jw6ogaXLDoSBmYXplciBkb3dubG9hZCBkbyBhcnF1aXZvIGUgZW0gc2VndWlkYSBpcmVtb3MgY2FycmVnYXIgZXNzZSBhcnF1aXZvIHBhcmEgbyBSLiAKCgpWYW1vcyB2ZXIgbyBhcnF1aXZvIG5vIGZvcm1hdG8gdGFidWxhciBjbMOhc3NpY28sIG5lc3RhIFt0YWJlbGFdKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzF6NDZaYlFVbjc0X3pJMElKRzhSck5JMDk2WTBWWVBIZWJtMFViZzVDVDhZL2VkaXQ/dXNwPWRyaXZlX2xpbmspLgoKUGFyYSBhcyBhbsOhbGlzZXMgZGEgZGVzdGEgYXVsYSBwcsOhdGljYSwgdm9jw6ogcG9kZSBwdWxhciBhIHByw7N4aW1hIHNlc3PDo28uCgoKPiBESUNBIDE6IFBhcmEgcHJvc3NlZ3VpciBuYSBhbsOhbGlzZSBxdWUgdmFtb3MgZGVzZW52b2x2ZXIsIGNvcGllIGUgY29sZSBvcyBibG9jb3MgZGUgY8OzZGlnbyBudW0gbm92byBkb2N1bWVudG8gZG8gdGlwbyAqLlIqLgoKPiBESUNBIDI6IHV0aWxpemUgYSB0ZWNsYSAqKnRhYioqIHBhcmEgYXV0b2NvbXBsZXRhciBlIGV2aXRhciBlcnJvcyEKCmBgYHtyIGltcG9ydF9kYWRvc19TVVMsIGVjaG89VFJVRSxldmFsPUZBTFNFfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICNjb21wbGV0ZSB1c2FuZG8gYSB0ZWNsYSBUQUIgYXTDqSBjaGVnYXIgYW8gYXJxdWl2byBxdWUgdm9jw6ogYmFpeG91CmRhZG9zX1NVUyA8LSByZWFkLmNzdihmaWxlID0gIiIsCiAgICAgICAgICAgICAgICAgICAgICBzZXAgPSAiLCIKICAgICAgICAgICAgICAgICAgICAgICkgJT4lIAogIHRpYmJsZTo6dGliYmxlKCkKYGBgCgojIyMgUGFyYSBvdXRyb3MgcHJvamV0b3MKCkNhc28gdm9jw6ogdGVuaGEgaW50ZXJlc3NlIGVtIGludmVzdGlnYXIgb3V0cmFzIHF1ZXN0w7VlcyBzYW5pdMOhcmlhcyBkYSBwb3B1bGHDp8OjbyBicmFzaWxlaXJhLCB2b2PDqiBwb2RlIG9idGVyIGRpZmVyZW50ZXMgY29uanVudG9zIGRlIGRhZG9zIGFzc2ltOgoKYGBge3IgaW50YWxsX21pY3JvZGF0YXN1cywgZWNobz1UUlVFLGV2YWw9RkFMU0V9CiMgZXhlY3V0YXIgYXBlbmFzIHNlIGVzdGl2ZXIgaW5zdGFsYW5kbyBlbSB1bSBjb21wdXRhZG9yIHdpbmRvd3MgLS0tLQppbnN0YWxsLnBhY2thZ2VzKCJyZWFkLmRiYyIsIHJlcG9zID0gImh0dHBzOi8vcGFja2FnZW1hbmFnZXIucG9zaXQuY28vY3Jhbi8yMDI0LTA3LTA1IikKCiNpbnN0YWxhciBwYWNvdGVzIG5lY2Vzc8OhcmlvcyAtLS0tCmluc3RhbGwucGFja2FnZXMoInJlbW90ZXMiKQpyZW1vdGVzOjppbnN0YWxsX2dpdGh1YigicmZzYWxkYW5oYS9taWNyb2RhdGFzdXMiKQoKbGlicmFyeShtaWNyb2RhdGFzdXMpCgojIGJhaXhhciBkYWRvcyAtLS0tCmRhZG9zX2JydXRvc19TVVMgPC0gZmV0Y2hfZGF0YXN1cyh5ZWFyX3N0YXJ0ID0gMjAyMCwKICAgICAgICAgICAgICAgICAgICAgICB5ZWFyX2VuZCA9IDIwMjMsIAogICAgICAgICAgICAgICAgICAgICAgIHVmID0gIk1HIiwgCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb25fc3lzdGVtID0gIlNJTS1ETyIpCgpkYWRvc19TVVMgPC0gcHJvY2Vzc19zaW0oZGFkb3NfYnJ1dG9zX1NVUykKCmRhZG9zX1NVUwpgYGAKCiMjIEludmVzdGlnYW5kbyBvcyBkYWRvcwoKCiZuYnNwOyZuYnNwOwpOb3Nzb3MgZGFkb3MgZXN0w6NvIG5vIGZvcm1hdG8gX3RhYnVsYXJfLCBvdSBzZWphLCBvcmdhbml6YWRvcyBlbSAqbGluaGFzKiBlICpjb2x1bmFzKi4gQXMgbGluaGFzIHPDo28gYXMgb2JzZXJ2YcOnw7VlcyBkZSBxdWFscXVlciB0YWJlbGEuIE5vIG5vc3NvIGNhc28gZWxhcyBjb3JyZXNwb25kZW0gYSBpbmRpdsOtZHVvcy4gSsOhIGFzIGNvbHVuYXMgc8OjbyBjb25qdW50b3MgZGVmaW5pZG9zIGRlIGluZm9ybWHDp8Ojby4gQ2FkYSBjb2x1bmEgYXJtYXplbmEgdW0gdGlwbyBkZSBpbmZvcm1hw6fDo28gw7puaWNhLCBjb21vIGEgX2lkYWRlXywgX1NleG9fLCBfbXVuaWPDrXBpbyBkZSBuYXNjaW1lbnRvXywgZW50cmUgb3V0cm9zLiBBc3NpbSwgdW1hIGNvbHVuYSBxdWUgYXJtYXplbmEgYSBfaWRhZGVfIHRlcsOhIGFwZW5hcyB2YWxvcmVzIG51bcOpcmljb3MgcG9zaXRpdm9zLCBqw6EgYSBkZSBfbXVuaWPDrXBpbyBkZSBuYXNjaW1lbnRvXyB0ZXLDoSBhcGVuYXMgbm9tZXMgZGUgY2lkYWRlLCBlIGEgY29sdW5hIF9TZXhvXyB0ZXLDoSBhcGVuYXMgYXMgY2xhc3NlcyBkZSB2YWxvcmVzICptYXNjdWxpbm8qLCAqZmVtaW5pbm8qIG91ICpuw6NvIGluZm9ybWFkbyouIERlc3RhIG1hbmVpcmEsICppZGFkZSogw6kgdW1hIHZhcmnDoXZlbCBjb250w61udWEgZSBudW3DqXJpY2EuIFBvciBvdXRybyBsYWRvLCAqU2V4byogw6kgdW1hIHZhcmnDoXZlbCBkaXNjcmV0YSBlIGNhdGVnw7NyaWNhLiBWYW1vcyBlbnRlbmRlciBpc3NvIG1lbGhvci4KCmBgYHtyLCBlY2hvPVRSVUUsZXZhbD1GQUxTRX0KIyB2ZXIgYSB0YWJlbGEgZGUgZGFkb3MKZGFkb3NfU1VTCgojIHF1YWwgbyB0YW1hbmhvIGRhIHRhYmVsYQpkaW0oZGFkb3NfU1VTKQoKIyBxdWFsIG8gbm9tZSBkYXMgY29sdW5hcwpjb2xuYW1lcyhkYWRvc19TVVMpCgojIHF1YWlzIG9zIHZhbG9yZXMgZGUgdW1hIGNvbHVuYQpkYWRvc19TVVMkSWRhZGVfYW5vcyAKZGFkb3NfU1VTJFNleG8gCgojIHF1YW50YXMgb2JzZXJ2YcOnw7VlcyB0ZW1vcyBkZSBjYWRhIHRpcG8/IApkYWRvc19TVVMkSWRhZGVfYW5vcyAlPiUgdGFibGUoKQpkYWRvc19TVVMkU2V4byAlPiUgdGFibGUoKQoKCiMgdmlzdWFsaXphciBxdWFudGFzIG9ic2VydmHDp8O1ZXMgdGVtb3MgZGUgY2FkYSB0aXBvCmRhZG9zX1NVUyRJZGFkZV9hbm9zICU+JSB0YWJsZSgpICU+JSBwbG90KCkKZGFkb3NfU1VTJFNleG8gJT4lIHRhYmxlKCkgJT4lIGJhcnBsb3QoKQoKCgojcXVhaXMgYXMgMTAgcHJpbWVpcmFzIG9ic2VydmHDp8O1ZXMgZGVzc2EgdGFiZWxhCmRhZG9zX1NVU1sxOjEwLF0KCiNxdWFpcyBhc2VndW5kYSBjb2x1bmEKZGFkb3NfU1VTWywyXQoKCiNxdWFsIGEgbcOpZGlhIGRlIGlkYWRlcz8KZGFkb3NfU1VTJElkYWRlX2Fub3MgJT4lIG1lYW4obmEucm0gPSBUKQoKCmBgYAoKCiMjIyBHcsOhZmljb3MgZXhwbG9yYXTDs3Jpb3MKCgojIyMjIEdyw6FmaWNvIGVzY29sYXJpZGFkZSBwb3IgU2V4bwoKYGBge3IgZ3JhZmljb3MxLCBlY2hvPVRSVUUsZXZhbD1UUlVFfQoKCiMgZ3LDoWdpY28gZXNjb2xhcmlkYWRlIHBvciBTZXhvCiBkYWRvc19TVVMgJT4lCiAgbXV0YXRlKElkYWRlX2Fub3MgPSBhcy5udW1lcmljKElkYWRlX2Fub3MpICkgJT4lIAogIGZpbHRlcihTZXhvICVpbiUgYygiTWFzY3VsaW5vIiwgIkZlbWluaW5vIikpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBDSURfc2lnbmlmaWNhZG8sCiAgICAgICAgICAgICBncm91cCA9IEVzY29sYXJpZGFkZSwKICAgICAgICAgICAgIGNvbCA9IEVzY29sYXJpZGFkZSwKICAgICAgICAgICAgIGZpbGwgID0gRXNjb2xhcmlkYWRlKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiY291bnQiLHBvc2l0aW9uID0gImRvZGdlIikgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoU2V4bykpCgoKYGBgCiMjIyMgR3LDoWZpY28gZGUgU2V4byBlIGVzY29sYXJpZGFkZSAKCmBgYHtyIGdyYWZpY29zMiwgZWNobz1UUlVFLGV2YWw9VFJVRX0KCiBkYWRvc19TVVMgJT4lCiAgbXV0YXRlKElkYWRlX2Fub3MgPSBhcy5udW1lcmljKElkYWRlX2Fub3MpICkgJT4lIAogIGZpbHRlcihTZXhvICVpbiUgYygiTWFzY3VsaW5vIiwgIkZlbWluaW5vIikpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBDSURfc2lnbmlmaWNhZG8sCiAgICAgICAgICAgICBncm91cCA9IFNleG8sCiAgICAgICAgICAgICBjb2wgPSBTZXhvLAogICAgICAgICAgICAgZmlsbCAgPSBTZXhvKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiY291bnQiLHBvc2l0aW9uID0gImRvZGdlIikgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoRXNjb2xhcmlkYWRlKSkKCgoKYGBgCiMjIyMgR3LDoWZpY28gYXVtZW50byBkZSBtb3J0ZXMgcG9yIGdydXBvIGRlIGVzY29sYXJpZGFkZQoKYGBge3IgZ3JhZmljb3MzLCBlY2hvPVRSVUUsZXZhbD1UUlVFfQogZGFkb3NfU1VTICU+JQogIGZpbHRlcihTZXhvICVpbiUgYygiTWFzY3VsaW5vIiwgIkZlbWluaW5vIikpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBBbm9fb2JpdG8sCiAgICAgICAgICAgICBncm91cCA9IFNleG8sCiAgICAgICAgICAgICBjb2wgPSBTZXhvLAogICAgICAgICAgICAgZmlsbCAgPSBTZXhvKSkgKwogIGdlb21fZGVuc2l0eShzdGF0ID0gImNvdW50Iixwb3NpdGlvbiA9ICJzdGFjayIpICsKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKEVzY29sYXJpZGFkZSkpICsKICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgoKCmBgYAojIyMjIEdyw6FmaWNvIGF1bWVudG8gZGUgbW9ydGVzIHRvdGFsCgpgYGB7ciBncmFmaWNvczQsIGVjaG89VFJVRSxldmFsPVRSVUV9CgogZGFkb3NfU1VTICU+JQogIGZpbHRlcihTZXhvICVpbiUgYygiTWFzY3VsaW5vIiwgIkZlbWluaW5vIikpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBBbm9fb2JpdG8sCiAgICAgICAgICAgICBncm91cCA9IFNleG8sCiAgICAgICAgICAgICBjb2wgPSBTZXhvLAogICAgICAgICAgICAgZmlsbCAgPSBTZXhvKSkgKwogIGdlb21fZGVuc2l0eShzdGF0ID0gImNvdW50Iixwb3NpdGlvbiA9ICJzdGFjayIpICsKICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgoKYGBgCiMjIyMgR3LDoWZpY28gYXVtZW50byBkZSBtb3J0ZXMgcG9yIGFubyBlIGVzdGFkbyBjaXZpbAoKYGBge3IgZ3JhZmljb3M1LCBlY2hvPVRSVUUsZXZhbD1UUlVFfQogZGFkb3NfU1VTICU+JQogIGZpbHRlcihTZXhvICVpbiUgYygiTWFzY3VsaW5vIiwgIkZlbWluaW5vIikpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBBbm9fb2JpdG8sCiAgICAgICAgICAgICBncm91cCA9IEVzdGFkb19jaXZpbCwKICAgICAgICAgICAgIGNvbCA9IEVzdGFkb19jaXZpbCwKICAgICAgICAgICAgIGZpbGwgID0gRXN0YWRvX2NpdmlsKSkgKwogIGdlb21fZGVuc2l0eShzdGF0ID0gImNvdW50Iixwb3NpdGlvbiA9ICJzdGFjayIpICsKICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpICsKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKFNleG8pKSAKCmBgYAojIyMjIEdyw6FmaWNvIGRlIG3DqWRpYSBkZSBpZGFkZXMgcG9yIGdydXBvIGRlIGVzY29sYXJpZGFkZQoKYGBge3IgZ3JhZmljb3M2LCBlY2hvPVRSVUUsZXZhbD1UUlVFfQogZGFkb3NfU1VTICU+JQogIGZpbHRlcihTZXhvICVpbiUgYygiTWFzY3VsaW5vIiwgIkZlbWluaW5vIikpICU+JSAKICBnZ3Bsb3QoYWVzKHkgPSBJZGFkZV9hbm9zLAogICAgICAgICAgICAgeCA9IFNleG8sCiAgICAgICAgICAgICBncm91cCA9IFNleG8sCiAgICAgICAgICAgICBmaWxsICA9IFNleG8pKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogICAjIGdlb21faml0dGVyKCkgKwogICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoRXNjb2xhcmlkYWRlKSkgCgoKCmBgYAoKCkUgcG9yIGhvamUgZmljYW1vcyBwb3IgYXF1aSEKCgoqKioKCj4+Pj4gVm9sdGFyIHBhcmEgYSBbKnDDoWdpbmEgaW5pY2lhbCpdKGh0dHBzOi8vaGVyb25vaC5naXRodWIuaW8vYmlvaW5mbykKCgpjYXQoJwo8c2NyaXB0Pgpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24oKSB7CiAgdmFyIGNvZGVCbG9ja3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJwcmUgY29kZSIpOwogIGNvZGVCbG9ja3MuZm9yRWFjaChmdW5jdGlvbihjb2RlQmxvY2spIHsKICAgIHZhciBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTsKICAgIGJ1dHRvbi5jbGFzc05hbWUgPSAiY29weS1idXR0b24iOwogICAgYnV0dG9uLnR5cGUgPSAiYnV0dG9uIjsKICAgIGJ1dHRvbi5pbm5lclRleHQgPSAiQ29waWFyIjsKICAgIAogICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24oKSB7CiAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGNvZGVCbG9jay5pbm5lclRleHQpOwogICAgICBidXR0b24uaW5uZXJUZXh0ID0gIkNvcGlhZG8hIjsKICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICBidXR0b24uaW5uZXJUZXh0ID0gIkNvcGlhciI7CiAgICAgIH0sIDIwMDApOwogICAgfSk7ICAgCgogICAgdmFyIHByZSA9IGNvZGVCbG9jay5wYXJlbnROb2RlOwogICAgcHJlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGJ1dHRvbiwgcHJlKTsKICB9KTsKfSk7Cjwvc2NyaXB0PgoKPHN0eWxlPgouY29weS1idXR0b24gewogIGZsb2F0OiByaWdodDsKICBtYXJnaW46IDRweDsKICBwYWRkaW5nOiA0cHggOHB4OwogIGZvbnQtc2l6ZTogMTJweDsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjNDA2ZGRlOwogIGNvbG9yOiB3aGl0ZTsKICBib3JkZXI6IG5vbmU7CiAgYm9yZGVyLXJhZGl1czogNHB4OwogIGN1cnNvcjogcG9pbnRlcjsKfQouY29weS1idXR0b246aG92ZXIgewogIGJhY2tncm91bmQtY29sb3I6ICM0NWEwNDk7Cn0KPC9zdHlsZT4KJykKCgoKCg==