1 Objetivos do minicurso

  • Apresentar um panorama dos indicadores socioeconômicos do mundo do trabalho disponíveis para consulta.
  • Introduzir as possibilidades de análise da linguagem R para pesquisas desagregadas




2 Bases de Dados

library(rsconnect)
library(knitr)
library(tidyverse)
library(readxl)
library(kableExtra)

bds_trabalho = read_xlsx("./BDs_Trabalho.xlsx")

#bds_trabalho$Pesquisa = paste0("[", bds_trabalho$Pesquisa, "](", bds_trabalho$`Links para Consulta`, ")")

bds_trabalho = bds_trabalho %>% 
  mutate (Pesquisa = paste0("[", bds_trabalho$Pesquisa, "](", bds_trabalho$`Links para Consulta`, ")")) %>% 
  select (-`Links para Consulta`) 

kbl(bds_trabalho, booktabs = T, longtable = F) %>%
  kable_styling(full_width = F, font_size = 14, latex_options = "scale_down",
                bootstrap_options = c("striped", "bordered", "hover")) %>%
  column_spec(1, bold = T, color = "red", width_min = "8cm") %>%
  column_spec(6, width_min = "8cm") %>% 
  column_spec(7, width_min = "5cm") %>% 
  pack_rows(index = c("Nacional" = 9, "Regional" = 3, "Internacional" = 5))
Pesquisa Mantenedor Tipo Periodicidade Divulgação Observações Pacote R
Nacional
PNAD - Contínua - Pesquisa Nacional por Amostra de Domicílios IBGE Amostral 2012 - Atual Trimestral Pesquisas adicionais aprofundadas divulgadas anualmente
  • sidrar
  • PNADcIBGE
  • basedosdados
PNAD - Pesquisa Nacional por Amostra de Domicílios IBGE Amostral 1967 - 2015 Descontinuada Importante para séries históricas ou recortes temporais
  • sidrar
PNADCOVID19 IBGE Amostral 2020 (9 meses) Descontinuada Pesquisa específica para a pandemia com características de classificação de ocupações específica
  • sidrar
  • PNADCOVID
  • basedosdados
  • PME - Pesquisa Mensal de Emprego IBGE Amostral 1980 - 2016 Descontinuada Absorvida pela PNADc / Restrita a 6 (seis) regiões metropolitanas
    • sidrar
    RAIS - Relação Anual de Informações Sociais Antigo M.TE Censitária 1985-2019 Descontinuada Principais variáveis investigadas empregos em 31 de dezembro e admitidos e desligados segundo gênero, faixa etária, grau de escolaridade, tempo de serviço e rendimentos, desagregados em nível ocupacional, geográfico e setorial. Análises Estruturais
    • raisr
  • basedosdados
  • CAGED - Cadastro Geral de Empregados e Desempregados Antigo M.TE Censitária 2007-2019 Descontinuada Principais variáveis investigadas: um conjunto de informações que possibilita o cálculo do índice de emprego, taxa de rotatividade e a flutuação de emprego, desagregados em nível geográfico, setorial e ocupacional. Análises Conjunturais
    • basedosdados
    Novo CAGED - eSocial - Sistema de Escrituração Digital das Obrigações Fiscais, Previdenciárias e Trabalhistas ME Censitária 2020 - Atual Mensal Últimos estabelecimentos entram em novembro de 2021. Além de trabalhista é previdenciário e tributário. Mudança relevante entre CAGED e eSocial quanto a QUEM deve declarar NA
    Radar SIT UnB e ME Censitária 1995 ou 2012 - Atual Não Informado Base com dados dos AFTs para Acidentes de Trabalho e Trabalho Escravo NA
    Migração Internacional MJ Diversas Bases NA NA Coordenação Geral de Imigração Laboral (CGIL) / Sistema de Registro Nacional Migratório (SISMIGRA) / Sistema de Tráfego Internacional (STI) / STI-MAR (Sistema de Tráfego Internacional - Módulo de Alertas e Restrições) / CONARE NA
    Regional
    PED - Pesquisa de Emprego e Desemprego DIEESE Amostral A depender da região Mensal (DF) Diferenças metodológicas com o IBGE NA
    PDAD - Pesquisa Distrital por Amostra de Domicílios CODEPLAN/DF Amostral 2004 - 2021 (em realização) Trianual Diferenças metodológicas com o IBGE NA
    SEADE Trabalho SEADE/SP Amostral NA NA Somente BI NA
    Internacional
    ILO Stat OIT Amostral (Compilação) NA NA Bases da Organização Internacional do Trabalho
    • Rilostat
    WLVD - World Labour Values Database Curso no Evento NA NA NA Indicadores específicos como taxa de exploração. Utiliza o WIOD 13 e 16 com o acréscimo de 182 setores NA
    WIOD - World Input-Output Database NWO - Consórcio Europeu NA 2013 e 2016 NA The database covers 28 EU countries and 15 other major countries in the world for the period from 2000 to 2014. NA
    World Bank Open Data The World Bank NA NA NA NA
    • WDI
    OECD Data OCDE NA NA NA NA NA




    3 A utilização da linguagem R para análise de dados


    3.1 Como iniciar?

    1. Ambiente online (sem necessidade de instalação de programa) para prática: https://rstudio.cloud/

    2. Programa offline: RStudio: https://www.rstudio.com/products/rstudio/download/





    3.2 Vantagens do uso da linguagem R

    • Linguagem com foco em análise estatística.
    • Análise de grande volume de dados.
    • Comunidade ativa para busca de soluções em conjunto.




    3.3 Os pacotes do R (libraries)

    Para o minicurso serão utilizados como exemplos principais




    4 Aplicações do R nas pesquisas sobre trabalho

    4.1 Jornada de Trabalho (com o uso do pacote sidrar)

    Será utilizado como exemplo o pacote sidrar e a PNADC-T (https://sidra.ibge.gov.br/home/pnadct/brasil)

    Esse é um exemplo de análise de horas trabalhadas em R a partir da API do SIDRA/IBGE utilizando o pacote sidrar.

    Nessa primeira seção temos a utilização das seguintes tabelas:

    • Tabela 6371 - Média de horas habitualmente trabalhadas por semana e efetivamente trabalhadas na semana de referência, no trabalho principal e em todos os trabalhos, das pessoas de 14 anos ou mais de idade, por sexo

    • Tabela 6372 - Média de horas habitualmente trabalhadas por semana e efetivamente trabalhadas na semana de referência, no trabalho principal e em todos os trabalhos, das pessoas de 14 anos ou mais de idade, por grupos de idade

    • Tabela 6373 - Média de horas habitualmente trabalhadas por semana e efetivamente trabalhadas na semana de referência, no trabalho principal e em todos os trabalhos, das pessoas de 14 anos ou mais de idade, por níveis de instrução

    • Tabela 6374 - Média de horas habitualmente trabalhadas por semana e efetivamente trabalhadas na semana de referência, no trabalho principal, das pessoas de 14 anos ou mais de idade, por posição na ocupação

    Para pegar o link de referência da API, veja os passos no vídeo abaixo:



    4.1.1 Código Inicial e Tabelas

    #carrega bibliotecas
    library(tidyverse)
    library(sidrar)
    library(zoo)
    
    #armazena os dados da tabela escolhida
    #horas efetivamente
    #sexo
    horas_sexo = get_sidra(api = "/t/6371/n1/all/n3/all/v/8188/p/all/c2/all/d/v8188%201")
    
    #mostra o nome das colunas
    colnames(horas_sexo)

    [1] “Nível Territorial (Código)”
    [2] “Nível Territorial”
    [3] “Unidade de Medida (Código)”
    [4] “Unidade de Medida”
    [5] “Valor”
    [6] “Brasil e Unidade da Federação (Código)” [7] “Brasil e Unidade da Federação”
    [8] “Variável (Código)”
    [9] “Variável”
    [10] “Trimestre (Código)”
    [11] “Trimestre”
    [12] “Sexo (Código)”
    [13] “Sexo”

    #TABELA 1
    # tratamento da tabela e redução ao recorte "Brasil" e todos
    horas_sexo_df = horas_sexo %>%
      mutate(data = as.yearqtr(`Trimestre (Código)`, 
                               format='%Y%q')) %>% 
      rename(UF = "Brasil e Unidade da Federação", Hora = Valor) %>%
      select(data, UF, Hora, Sexo) %>% 
      filter(UF == "Brasil") %>% 
      group_by(data)
    
    #kable(head(horas_sexo_df))
    
    kbl(tail(horas_sexo_df), booktabs = T, longtable = F) %>%
      kable_styling(full_width = F, font_size = 14, latex_options = "scale_down",
                    bootstrap_options = c("striped", "bordered", "hover"))
    data UF Hora Sexo
    2021 Q1 Brasil 36.8 Total
    2021 Q1 Brasil 39.1 Homens
    2021 Q1 Brasil 33.8 Mulheres
    2021 Q2 Brasil 37.3 Total
    2021 Q2 Brasil 39.3 Homens
    2021 Q2 Brasil 34.6 Mulheres
    #idade
    horas_idade = get_sidra(api = "/t/6372/n1/all/n3/all/v/8188/p/all/c58/all/d/v8188%201")
    
    #mostra o nome das colunas
    colnames(horas_idade)

    [1] “Nível Territorial (Código)”
    [2] “Nível Territorial”
    [3] “Unidade de Medida (Código)”
    [4] “Unidade de Medida”
    [5] “Valor”
    [6] “Brasil e Unidade da Federação (Código)” [7] “Brasil e Unidade da Federação”
    [8] “Variável (Código)”
    [9] “Variável”
    [10] “Trimestre (Código)”
    [11] “Trimestre”
    [12] “Grupo de idade (Código)”
    [13] “Grupo de idade”

    #TABELA 2
    # tratamento da tabela e redução ao recorte "Brasil" e todos
    horas_idade_df = horas_idade %>%
      mutate(data = as.yearqtr(`Trimestre (Código)`, 
                               format='%Y%q')) %>% 
      rename(UF = "Brasil e Unidade da Federação", Hora = Valor) %>%
      select(data, UF, Hora, `Grupo de idade`) %>% 
      filter(UF == "Brasil") %>% 
      group_by(data)
    
    #kable(head(horas_idade_df))
    
    kbl(tail(horas_idade_df), booktabs = T, longtable = F) %>%
      kable_styling(full_width = F, font_size = 14, latex_options = "scale_down",
                    bootstrap_options = c("striped", "bordered", "hover"))
    data UF Hora Grupo de idade
    2020 Q1 Brasil 35.3 Total
    2020 Q1 Brasil 25.2 14 a 17 anos
    2020 Q1 Brasil 35.1 18 a 24 anos
    2020 Q1 Brasil 36.2 25 a 39 anos
    2020 Q1 Brasil 35.5 40 a 59 anos
    2020 Q1 Brasil 31.9 60 anos ou mais
    #instrução
    horas_instrucao = get_sidra(api = "/t/6373/n1/all/n3/all/v/8186/p/all/c1568/all/d/v8186%201")
    
    #mostra o nome das colunas
    colnames(horas_instrucao)

    [1] “Nível Territorial (Código)”
    [2] “Nível Territorial”
    [3] “Unidade de Medida (Código)”
    [4] “Unidade de Medida”
    [5] “Valor”
    [6] “Brasil e Unidade da Federação (Código)” [7] “Brasil e Unidade da Federação”
    [8] “Variável (Código)”
    [9] “Variável”
    [10] “Trimestre (Código)”
    [11] “Trimestre”
    [12] “Nível de instrução (Código)”
    [13] “Nível de instrução”

    #TABELA 3
    # tratamento da tabela e redução ao recorte "Brasil" e todos
    horas_instrucao_df = horas_instrucao %>%
      mutate(data = as.yearqtr(`Trimestre (Código)`, 
                               format='%Y%q')) %>% 
      rename(UF = "Brasil e Unidade da Federação", Hora = Valor) %>%
      select(data, UF, Hora, `Nível de instrução`) %>% 
      filter(UF == "Brasil") %>% 
      group_by(data)
    
    #kable(head(horas_instrucao_df))
    
    kbl(tail(horas_instrucao_df), booktabs = T, longtable = F) %>%
      kable_styling(full_width = F, font_size = 14, latex_options = "scale_down",
                    bootstrap_options = c("striped", "bordered", "hover"))
    data UF Hora Nível de instrução
    2020 Q1 Brasil 39.4 Ensino fundamental completo ou equivalente
    2020 Q1 Brasil 38.5 Ensino médio incompleto ou equivalente
    2020 Q1 Brasil 40.3 Ensino médio completo ou equivalente
    2020 Q1 Brasil 38.6 Ensino superior incompleto ou equivalente
    2020 Q1 Brasil 38.8 Ensino superior completo ou equivalente
    2020 Q1 Brasil NA Não determinado
    #ocupação
    horas_ocupacao = get_sidra(api = "/t/6374/n1/all/n3/all/v/8186/p/all/c2399/all/d/v8186%201")
    
    #mostra o nome das colunas
    colnames(horas_ocupacao)

    [1] “Nível Territorial (Código)”
    [2] “Nível Territorial”
    [3] “Unidade de Medida (Código)”
    [4] “Unidade de Medida”
    [5] “Valor”
    [6] “Brasil e Unidade da Federação (Código)” [7] “Brasil e Unidade da Federação”
    [8] “Variável (Código)”
    [9] “Variável”
    [10] “Trimestre (Código)”
    [11] “Trimestre”
    [12] “Posição na ocupação (Código)”
    [13] “Posição na ocupação”

    #TABELA 4
    # tratamento da tabela e redução ao recorte "Brasil" e todos
    horas_ocupacao_df = horas_ocupacao %>%
      mutate(data = as.yearqtr(`Trimestre (Código)`, 
                               format='%Y%q')) %>% 
      rename(UF = "Brasil e Unidade da Federação", Hora = Valor) %>%
      select(data, UF, Hora, `Posição na ocupação`) %>% 
      filter(UF == "Brasil") %>% 
      group_by(data)
    
    #kable(head(horas_ocupacao_df))
    
    kbl(tail(horas_ocupacao_df), booktabs = T, longtable = F) %>%
      kable_styling(full_width = F, font_size = 14, latex_options = "scale_down",
                    bootstrap_options = c("striped", "bordered", "hover"))
    data UF Hora Posição na ocupação
    2019 Q4 Brasil 28.4 Trabalhador familiar auxiliar
    2020 Q1 Brasil 39.1 Total
    2020 Q1 Brasil 39.7 Empregado
    2020 Q1 Brasil 37.3 Empregador
    2020 Q1 Brasil 45.7 Conta própria
    2020 Q1 Brasil 28.9 Trabalhador familiar auxiliar

    4.1.2 Gráficos

    ## carregar pacotes
    library(tidyverse)
    library(sidrar)
    library(scales)
    library(ggplot2)
    
    #GRÁFICO 1
    ggplot(horas_sexo_df, aes(x=data, y = Hora, color = Sexo))+
      geom_line(aes(linetype=Sexo)) +
      geom_point() +
      theme(axis.text.x=element_text(angle=45, hjust=1),
            plot.title = element_text(size=12, face='bold', hjust = 0.5),
            plot.subtitle = element_text(size=10, hjust = 0.5)) +
      scale_x_yearqtr(breaks = pretty_breaks(n=8),
                      format = "%YQ%q")+
      labs(x='Período', y='Horas',
           title = 'Horas Habitualmente Trabalhadas',
           subtitle='Todos os Trabalhos - Brasil',
           caption = 'Gráfico 1 - Dados extraídos da PNADc - Trimestral - IBGE')

    Error : The fig.showtext code chunk option must be TRUE

    #GRÁFICO 2
    ggplot(horas_idade_df, aes(x=data, y = Hora, color = `Grupo de idade`))+
      geom_line(aes(linetype=`Grupo de idade`)) +
      geom_point() +
      theme(axis.text.x=element_text(angle=45, hjust=1),
            plot.title = element_text(size=12, face='bold', hjust = 0.5),
            plot.subtitle = element_text(size=10, hjust = 0.5)) +
      scale_x_yearqtr(breaks = pretty_breaks(n=8),
                      format = "%YQ%q")+
      labs(x='Período', y='Horas',
           title = 'Horas Habitualmente Trabalhadas',
           subtitle='Todos os Trabalhos - Brasil',
           caption = 'Gráfico 1 - Dados extraídos da PNADc - Trimestral - IBGE')

    Error : The fig.showtext code chunk option must be TRUE

    #GRÁFICO 3
    ggplot(horas_instrucao_df, aes(x=data, y = Hora, color = `Nível de instrução`))+
      geom_line(aes(linetype=`Nível de instrução`)) +
      geom_point() +
      theme(axis.text.x=element_text(angle=45, hjust=1),
            plot.title = element_text(size=12, face='bold', hjust = 0.5),
            plot.subtitle = element_text(size=10, hjust = 0.5)) +
      scale_x_yearqtr(breaks = pretty_breaks(n=8),
                      format = "%YQ%q")+
      labs(x='Período', y='Horas',
           title = 'Horas Habitualmente Trabalhadas',
           subtitle='Todos os Trabalhos - Brasil',
           caption = 'Gráfico 1 - Dados extraídos da PNADc - Trimestral - IBGE')

    Error : The fig.showtext code chunk option must be TRUE

    #GRÁFICO 4
    ggplot(horas_ocupacao_df, aes(x=data, y = Hora, color = `Posição na ocupação`))+
      geom_line(aes(linetype=`Posição na ocupação`)) +
      geom_point() +
      theme(axis.text.x=element_text(angle=45, hjust=1),
            plot.title = element_text(size=12, face='bold', hjust = 0.5),
            plot.subtitle = element_text(size=10, hjust = 0.5)) +
      scale_x_yearqtr(breaks = pretty_breaks(n=8),
                      format = "%YQ%q")+
      labs(x='Período', y='Horas',
           title = 'Horas Habitualmente Trabalhadas',
           subtitle='Todos os Trabalhos - Brasil',
           caption = 'Gráfico 1 - Dados extraídos da PNADc - Trimestral - IBGE')

    Error : The fig.showtext code chunk option must be TRUE

    4.2 Comparação entre bases de dados - PNAD - Contínua e CAGED

    Exemplo do Vítor Wilher

    4.2.1 Código Inicial

    #########################################################
    ##### CAGED vs PNAD COntínua ############################
    
    ## Pacotes
    library(ecoseries)
    library(sidrar)
    library(xts)
    library(ggplot2)
    library(forecast)
    library(scales)
    library(astsa)
    library(gridExtra)
    library(seasonal)
    
    ## Baixar dados
    caged = ts(series_ipeadata('231410417',
                               periodicity = 'M')$serie_231410417$valor,
               start=c(1999,05), freq=12)
    
    po = get_sidra(api='/t/6320/n1/all/v/4090/p/all/c11913/allxt')
    carteira = po$Valor[po$`Posição na ocupação e categoria do emprego no trabalho principal (Código)`=='31722']
    pnad = ts(carteira, start=c(2012,03), freq=12)
    
    ## Dessazonalizar Caged
    cagedsa <- final(seas(caged))
    
    ## Window
    cagedsa = window(cagedsa, start=c(2012,06))
    pnad = window(pnad, end=c(2018,09))
    
    ## Juntar dados
    data = ts.intersect(cagedsa, pnad)
    
    df = data.frame(caged=data[,1], pnad=data[,2])

    4.2.2 CAGED

    g1 = autoplot(data[,1]/1000)+
      geom_line(size=.8, colour='red')+
      xlab('')+ylab('Mil Pessoas')+
      labs(title='Admitidos - CAGED/MTE')
    
    g1

    Error : The fig.showtext code chunk option must be TRUE

    4.2.3 PNAD

    g2 = autoplot(data[,2]/1000)+
      geom_line(size=.8, colour='darkblue')+
      xlab('')+ylab('Milhões Pessoas')+
      labs(title='População Ocupada com Carteira Assinada - PNAD Contínua (t-3)')
    
    g2

    Error : The fig.showtext code chunk option must be TRUE

    4.2.4 Comparação

    ## Gráfico lado a lado
    grid.arrange(g1, g2,
                 top = "CAGED vs. PNAD",
                 layout_matrix = matrix(c(2,1), 
                                       ncol=1, byrow=TRUE))

    Error : The fig.showtext code chunk option must be TRUE

    4.2.5 Regressão

    ggplot(df, aes(pnad, caged/1000))+
      geom_point(size=3, colour='darkblue')+
      geom_smooth(method = 'auto')+
      xlab('População Ocupada com Carteira Assinada - PNAD Contínua (t-3) - Mil Pessoas')+
      ylab('Fluxo de Admitidos - CAGED/MTE - Mil Pessoas')+
      labs(title='CAGED vs. PNAD Contínua')

    Error : The fig.showtext code chunk option must be TRUE




    4.3 Dados de trabalhadores por aplicativo (com o uso do pacote COVIDIBGE)

    O sidrar apresenta limitações quanto ao tempo de disponibilização dos dados.

    A principal vantagem do pacote é a disponibilização dos microdados.

    A segunda vantagem de destaque é a utilização do pacote survey que permite mostrar os erros estatísticos associados.

    A desvantagem é a dificuldade de construir séries históricas de forma nativa.

    Obs.: os pacotes PNADcIBGE e COVIDIBGE apresentam as mesmas funções.

    • É importante conhecer as bibliotecas de perguntas que foram realizadas nas pesquisas.

    Biblioteca PNADContínua - https://www.ibge.gov.br/estatisticas/sociais/populacao/9171-pesquisa-nacional-por-amostra-de-domicilios-continua-mensal.html?=&t=downloads



    4.3.1 Entregadores por Aplicativo (Usando dataframe simples)

    library(COVIDIBGE)
    
    #data frame simples e com rótulos (labels=TRUE)
    pnad_covid19_novembro_dfsimples = get_covid(year=2020, month=11, vars=c("Ano", "UF", "RM_RIDE", "UPA", "Estrato",
                                                                  "posest", "V1013", "V1030", "V1031", "V1032",
                                                                  "V1022", "A003", "A002", "A004", "A005", "B008",
                                                                  "B009B", "B009D", "B009F", "C007B", "C007C", 
                                                                  "C008", "C009", "C014", "C01012", "C007", "D0051",
                                                                  "E001"), labels=TRUE, deflator=TRUE,
                                      design=FALSE,savedir=tempdir())
    #teste populacional
    prof = c("Motoboy,", "Entregador de mercadorias (de restaurante, de farmácia, de loja, Uber Eats, IFood, Rappy etc.)")
    carteira = c("Sim, tem carteira de trabalho assinada", "Sim, é servidor público estatutário")
    
    pnad_covid_entregadores_dfsimples = pnad_covid19_novembro_dfsimples %>%
      mutate(teste_prof = C007C %in% prof) %>% 
      filter(teste_prof == "TRUE") %>%
      mutate(teste_carteira = C007B %in% carteira,
             renda_deflacionada = C01012*Efetivo,
             renda_deflacionada = round(renda_deflacionada, 2)) %>%
      filter(teste_carteira == "FALSE")
    
    qtde_sexo = pnad_covid_entregadores_dfsimples %>% 
      group_by(A003) %>% 
      summarise((n = sum(V1032, na.rm = T))) %>% 
      rename(Qtde = '(n = sum(V1032, na.rm = T))',
             Genero = A003)
    
    kbl(qtde_sexo)
    Genero Qtde
    Homem 644222.02
    Mulher 34304.55
    # raça
    
    raca_entregadores_covid = pnad_covid_entregadores_dfsimples %>% 
      select(V1032, A004) %>%
      group_by(A004) %>%
      summarise((n = sum(V1032, na.rm = T))) %>%
      rename(Qtde = '(n = sum(V1032, na.rm = T))',
             Raça = A004) %>%
      select(Raça, Qtde) %>%
      mutate(Qtde = round(Qtde, 0),
             Qtde = as.numeric(Qtde))
    
    kbl(raca_entregadores_covid)
    Raça Qtde
    Branca 271288
    Preta 86714
    Amarela 4474
    Parda 315089
    Indígena 962
    #escolaridade
    escolaridade_entregadores_covid = pnad_covid_entregadores_dfsimples %>% 
      select(V1032, A005) %>%
      group_by(A005) %>%
      summarise((n = sum(V1032, na.rm = T))) %>%
      rename(Qtde = '(n = sum(V1032, na.rm = T))',
             Escolaridade = A005) %>%
      select(Escolaridade, Qtde) %>%
      mutate(Qtde = round(Qtde, 0),
             Qtde = as.numeric(Qtde))
    
    kbl(escolaridade_entregadores_covid)
    Escolaridade Qtde
    Sem instrução 6321
    Fundamental incompleto 114667
    Fundamental completa 55769
    Médio incompleto 98915
    Médio completo 326070
    Superior incompleto 54189
    Superior completo 21952
    Pós-graduação, mestrado ou doutorado 642
    #UF
    
    uf_entregadores_covid = pnad_covid_entregadores_dfsimples %>% 
      select(UF, V1032) %>%
      group_by(UF) %>%
      summarise((n = sum(V1032, na.rm = T))) %>%
      rename(Qtde = '(n = sum(V1032, na.rm = T))') %>%
      mutate(Qtde = round(Qtde, 0),
             Qtde = as.numeric(Qtde))
    
    kbl(uf_entregadores_covid)
    UF Qtde
    Rondônia 3305
    Acre 2558
    Amazonas 13491
    Roraima 1632
    Pará 20182
    Amapá 3173
    Tocantins 4510
    Maranhão 21527
    Piauí 7304
    Ceará 38625
    Rio Grande do Norte 6879
    Paraíba 17538
    Pernambuco 41940
    Alagoas 10428
    Sergipe 10317
    Bahia 30867
    Minas Gerais 73683
    Espírito Santo 5911
    Rio de Janeiro 61916
    São Paulo 194799
    Paraná 31757
    Santa Catarina 7020
    Rio Grande do Sul 28919
    Mato Grosso do Sul 5370
    Mato Grosso 7790
    Goiás 19581
    Distrito Federal 7504

    4.3.2 Entregadores por Aplicativo (Usando pacote survey)

    library(PNADcIBGE)
    library(COVIDIBGE)
    library(survey)
    
    #objeto survey
    pnad_covid19_novembro = get_covid(year=2020, month=11, vars=c("Ano", "UF", "RM_RIDE", "UPA", "Estrato",
                                                                  "posest", "V1013", "V1030", "V1031", "V1032",
                                                                  "V1022", "A003", "A002", "A004", "A005", "B008",
                                                                  "B009B", "B009D", "B009F", "C007B", "C007C", 
                                                                  "C008", "C009", "C014", "C01012", "C007", "D0051",
                                                                  "E001"), labels=TRUE, deflator=TRUE,
                                      design=TRUE,savedir=tempdir())
    #teste populacional
    totalsexo = svytotal(~A003, pnad_covid19_novembro, na.rm = T)
    
    kbl(totalsexo)
    total SE
    A003Homem 103463417 0
    A003Mulher 108188952 0
    #TIPO SURVEY - SOMENTE ENTREGADORES SEM CARTEIRA ASSINADA - NOVEMBRO
    prof = c("Motoboy,", "Entregador de mercadorias (de restaurante, de farmácia, de loja, Uber Eats, IFood, Rappy etc.)")
    carteira = c("Sim, tem carteira de trabalho assinada", "Sim, é servidor público estatutário")
    entregadores_survey = subset(pnad_covid19_novembro, C007C %in% prof & !(C007B %in% carteira))
    
    #genero
    total_entregadores_sexo = svytotal(~A003, entregadores_survey, na.rm = T)
    
    kbl(total_entregadores_sexo)
    total SE
    A003Homem 644222.02 28088.361
    A003Mulher 34304.55 6182.571
    #raça
    raca_entregadores_survey <- round(svytotal(~A004, entregadores_survey, na.rm = T),0)
    
    kbl(raca_entregadores_survey)
    total SE
    A004Branca 271288 18391.8019
    A004Preta 86714 11572.1088
    A004Amarela 4474 2498.8403
    A004Parda 315089 18770.3030
    A004Indígena 962 742.3815
    A004Ignorado 0 0.0000
    #escolaridade
    escolaridade_entregadores_survey <- round(svytotal(~A005, entregadores_survey, na.rm = T),0)
    
    kbl(escolaridade_entregadores_survey)
    total SE
    A005Sem instrução 6321 2160.4212
    A005Fundamental incompleto 114667 10976.7126
    A005Fundamental completa 55769 9351.6581
    A005Médio incompleto 98915 10211.1380
    A005Médio completo 326070 20729.3021
    A005Superior incompleto 54189 7412.2732
    A005Superior completo 21952 4634.5955
    A005Pós-graduação, mestrado ou doutorado 642 470.0868

    4.3.3 Exemplos de Relatórios que podem ser gerados

    Pesquisa com recorte a partir da PNADCOVID19 (março a novembro de 2020)

    Entregadores por App - https://www.trabalhoemplataforma.org/post/relat%C3%B3rio-de-pesquisa-1-an%C3%A1lise-da-pnad-covid19-sobre-entregadores-por-app

    Motoristas por App - https://www.trabalhoemplataforma.org/post/relat%C3%B3rio-de-pesquisa-2-an%C3%A1lise-da-pnad-covid19-sobre-motoristas-por-app



    4.4 Análise de amostras complexas com o pacote “survey”

    4.4.1 Definindo a opção de codificação dos caracteres e linguagem

    aviso <- getOption("warn")
    options(warn=-1)
    options(encoding="latin1")
    options(warn=aviso)
    rm(aviso)

    4.4.2 Definindo a opção de exibição de números sem exponencial

    aviso <- getOption("warn")
    options(warn=-1)
    options(scipen=999)
    options(warn=aviso)
    rm(aviso)

    4.4.3 Pacotes exigidos

    library(survey)
    library(tidyverse) 
    library(srvyr)
    library(nnet)
    library(stargazer)
    library(PNADcIBGE)
    library(kableExtra)

    4.4.4 Selecionando as variáveis de interesse

    variaveis_de_interesse <- c("V2007", ### Sexo
                                "V2009", ### Idade do morador na data de referência
                                "V2010", ### Cor ou raça
                                "V4039", ### Quantas horas ... trabalhava normalmente, por semana, nesse trabalho principal?
                                "VD3004", ### Nível de instrução mais elevado alcançado (pessoas de 5 anos ou mais de idade) padronizado para o Ensino fundamental com duração de 9 anos
                                "VD4001", ### Condição em relação à força de trabalho na semana de referência para pessoas de 14 anos ou mais de idade
                                "VD4002", ### Condição de ocupação na semana de referência para pessoas de 14 anos ou mais de idade
                                "VD4007", ### Posição na ocupação no trabalho principal da semana de referência para pessoas de 14 anos ou mais de idade
                                "VD4016") ### Rendimento mensal habitual do trabalho principal para pessoas de 14 anos ou mais de idade (apenas para pessoas que receberam em dinheiro, produtos ou mercadorias no trabalho principal)

    4.4.5 Importando os microdados da PNAD Contínua com o plano amostral aplicado

    pnadc_2019 <- get_pnadc (year = 2019, interview = 1, vars = c(variaveis_de_interesse), design = TRUE)
    pnadc_2019 <- as_survey_design(pnadc_2019)

    4.4.6 Selecionando os trabalhadores assalariados de 18 a 65 anos

    assalariados_2019 <- subset(pnadc_2019, V2009 %in% c(18:65) &
                                  VD4007 == "Empregado (inclusive trabalhador doméstico)")

    4.4.7 Criando a variável cor ou raça agregada

    assalariados_2019 <- assalariados_2019 %>%
      mutate(
        raca = factor(
          case_when(
            V2010 == "Branca" ~ "Brancos",
            V2010 %in% c("Preta", "Parda") ~ "Negros"
          ),
          levels = c(
            "Brancos", "Negros"
          )
        )
      )

    4.4.8 Criando a variável jornadas de trabalho

    assalariados_2019 <- assalariados_2019 %>%
      mutate(
        jornadas = factor(
          case_when(
            V4039 <= 39 ~ "Jornadas parciais",
            V4039 %in% c(40:44) ~ "Jornadas-padrão",
            V4039 >= 45 ~ "Jornadas excessivas"
          ),
          levels = c(
            "Jornadas-padrão", "Jornadas parciais", "Jornadas excessivas"
          )
        )
      )

    4.4.9 Estimação da renda média

    media_renda <- svymean (~VD4016, assalariados_2019, na.rm = TRUE)
    
    kable(as.data.frame(media_renda)) %>% 
      kable_styling(full_width = F, latex_options = "scale_down", bootstrap_options = c("bordered", "hover"))
    mean VD4016
    VD4016 2197.383 27.32814

    4.4.10 Coeficiente de variação

    cv(media_renda)
           VD4016

    VD4016 0.01243668

    kable(as.data.frame(cv(media_renda))) %>% 
      kable_styling(full_width = F, latex_options = "scale_down", bootstrap_options = c("bordered", "hover"))
    VD4016
    VD4016 0.0124367

    4.4.11 Intervalos de confiança

    confint(media_renda)
          2.5 %   97.5 %

    VD4016 2143.821 2250.945

    kable(as.data.frame(confint(media_renda))) %>% 
      kable_styling(full_width = F, latex_options = "scale_down", bootstrap_options = c("bordered", "hover"))
    2.5 % 97.5 %
    VD4016 2143.821 2250.945

    4.4.12 Estimação da renda média por grupos selecionados

    media_renda_mulheres <- svymean(~VD4016, subset(assalariados_2019, V2007 == "Mulher"), na.rm = TRUE) 
    
    kable(as.data.frame(media_renda_mulheres)) %>% 
      kable_styling(full_width = F, latex_options = "scale_down", bootstrap_options = c("bordered", "hover"))
    mean VD4016
    VD4016 1941.615 22.79887
    mediarenda_homens <- svymean(~VD4016, subset(assalariados_2019, V2007 == "Homem"), na.rm = TRUE) 
    
    kable(as.data.frame(mediarenda_homens)) %>% 
      kable_styling(full_width = F, latex_options = "scale_down", bootstrap_options = c("bordered", "hover"))
    mean VD4016
    VD4016 2427.86 35.91201
    media_renda_mulheres_superior <- svymean(~VD4016, subset(assalariados_2019, V2007 == "Mulher" & 
                                                               VD3004 == "Superior completo"), na.rm = TRUE) 
    
    kable(as.data.frame(media_renda_mulheres_superior)) %>% 
      kable_styling(full_width = F, latex_options = "scale_down", bootstrap_options = c("bordered", "hover"))
    mean VD4016
    VD4016 3664.964 63.01323
    mediarenda_homens_superior <- svymean(~VD4016, subset(assalariados_2019, V2007 == "Homem" & 
                                                            VD3004 == "Superior completo"), na.rm = TRUE) 
    
    kable(as.data.frame(mediarenda_homens_superior)) %>% 
      kable_styling(full_width = F, latex_options = "scale_down", bootstrap_options = c("bordered", "hover"))
    mean VD4016
    VD4016 5860.425 154.4082

    4.4.13 Estimação da mediana e dos quantis 1, 5, 10, 25, 50, 75, 90, 95, 99

    quantis = svyquantile(~VD4016, assalariados_2019, quantiles = c(0.01, 0.05, 0.10, 0.25, 0.50, 0.75, 0.90, 0.95, 0.99), na.rm = TRUE)
    
    class(quantis) <- list("svyquantile", "list")
    
    kable(as.data.frame(quantis)) %>% 
      kable_styling(full_width = F, latex_options = "scale_down", bootstrap_options = c("bordered", "hover"))
    VD4016.quantile VD4016.ci.2.5 VD4016.ci.97.5 VD4016.se
    0.01 150 150 160 2.5507973
    0.05 400 400 450 12.7539863
    0.1 700 700 800 25.5079726
    0.25 998 998 1000 0.5101595
    0.5 1400 1400 1500 25.5079726
    0.75 2200 2200 2300 25.5079726
    0.9 4000 4000 4500 127.5398631
    0.95 6000 6000 7000 255.0797261
    0.99 15000 15000 17000 510.1594523

    4.4.14 Frequências absoluta e relativa das jornadas de trabalho

    total_jornadas <- svytotal (~jornadas, assalariados_2019, na.rm = TRUE)
    
    kable(as.data.frame(total_jornadas)) %>% 
      kable_styling(full_width = F, latex_options = "scale_down", bootstrap_options = c("bordered", "hover"))
    total SE
    jornadasJornadas-padrão 37231361 221442.0
    jornadasJornadas parciais 13195762 122352.4
    jornadasJornadas excessivas 11447280 151738.6
    freq_jornadas <- svymean (~jornadas, assalariados_2019, na.rm = TRUE)
    
    kable(as.data.frame(freq_jornadas)) %>% 
      kable_styling(full_width = F, latex_options = "scale_down", bootstrap_options = c("bordered", "hover"))
    mean SE
    jornadasJornadas-padrão 0.6017248 0.0027768
    jornadasJornadas parciais 0.2132669 0.0018439
    jornadasJornadas excessivas 0.1850083 0.0022425

    4.4.15 Frequências absoluta e relativa das jornadas de trabalho por cor ou raça agregada

    total_jornadas_raca <- svyby(~jornadas, ~raca, assalariados_2019, svytotal, na.rm = TRUE)
    
    kable(as.data.frame(total_jornadas_raca)) %>% 
      kable_styling(full_width = F, latex_options = "scale_down", bootstrap_options = c("bordered", "hover"))
    raca jornadasJornadas-padrão jornadasJornadas parciais jornadasJornadas excessivas se.jornadasJornadas-padrão se.jornadasJornadas parciais se.jornadasJornadas excessivas
    Brancos Brancos 17134129 5392662 4850070 165743.3 83712.15 98064.61
    Negros Negros 19731464 7654735 6494897 172988.0 89949.64 113946.31
    freq_jornadas_raca <- svyby(~jornadas, ~raca, assalariados_2019, svymean, na.rm = TRUE)
    
    kable(as.data.frame(freq_jornadas_raca)) %>% 
      kable_styling(full_width = F, latex_options = "scale_down", bootstrap_options = c("bordered", "hover"))
    raca jornadasJornadas-padrão jornadasJornadas parciais jornadasJornadas excessivas se.jornadasJornadas-padrão se.jornadasJornadas parciais se.jornadasJornadas excessivas
    Brancos Brancos 0.6258617 0.1969788 0.1771595 0.0038625 0.0026754 0.0031894
    Negros Negros 0.5823739 0.2259294 0.1916968 0.0034395 0.0024115 0.0028318
    svychisq(~jornadas + raca, assalariados_2019, statistic = "Chisq")
    Pearson's X^2: Rao & Scott adjustment

    data: NextMethod() X-squared = 901.56, df = 2, p-value < 0.00000000000000022

    Obs.: rejeita-se a hipótese nula (H0), testada contra a hipótese alternativa (H1), pois o p-valor é estatisticamente significativo ao nível de 5%. Portanto, as variáveis associadas são estatisticamente independentes.

    4.4.16 Construção de indicadores socioeconômicos

    txdesocup <- svyratio(~VD4002 == "Pessoas desocupadas",~VD4001 == "Pessoas na força de trabalho", pnadc_2019, na.rm = T)
    
    class(txdesocup) <- list("svyratio", "list")
    
    kable(as.data.frame(txdesocup)) %>% 
      kable_styling(full_width = F, latex_options = "scale_down", bootstrap_options = c("bordered", "hover"))
    VD4001…..Pessoas.na.força.de.trabalho. VD4001…..Pessoas.na.força.de.trabalho..1
    VD4002 == “Pessoas desocupadas” 0.1165897 0.0000015



    4.5 Regressão linear simples e múltipla

    library(sjPlot)
    library(sjmisc)
    library(sjlabelled)
    
    
    linear_simples <- lm(VD4016 ~ V2007, data = assalariados_2019) 
    
    #Para visualizar o summary no console basta tirar o "#" da linha seguinte
    #summary(linear_simples)
    
    tab_model(linear_simples)
      VD 4016
    Predictors Estimates CI p
    (Intercept) 2152.99 2134.49 – 2171.48 <0.001
    V2007 [Mulher] -412.55 -441.38 – -383.71 <0.001
    Observations 183011
    R2 / R2 adjusted 0.004 / 0.004
    linear_multipla <- lm(VD4016 ~ V2007 + V2009 + raca + VD3004, data = assalariados_2019) 
    
    #Para visualizar o summary no console basta tirar o "#" da linha seguinte
    #summary(linear_multipla)
    
    tab_model(linear_multipla)
      VD 4016
    Predictors Estimates CI p
    (Intercept) -397.80 -493.00 – -302.60 <0.001
    V2007 [Mulher] -905.98 -932.67 – -879.29 <0.001
    V2009 35.14 34.10 – 36.18 <0.001
    raca [Negros] -567.01 -593.63 – -540.38 <0.001
    VD3004 [Fundamental
    incompleto ou
    equivalente]
    589.83 511.63 – 668.03 <0.001
    VD3004 [Fundamental
    completo ou equivalente]
    1073.57 986.31 – 1160.84 <0.001
    VD3004 [Médio incompleto
    ou equivalente]
    1253.87 1162.25 – 1345.48 <0.001
    VD3004 [Médio completo ou
    equivalente]
    1530.13 1450.83 – 1609.42 <0.001
    VD3004 [Superior
    incompleto ou
    equivalente]
    2039.84 1945.45 – 2134.22 <0.001
    VD3004 [Superior
    completo]
    4121.85 4039.99 – 4203.71 <0.001
    Observations 181057
    R2 / R2 adjusted 0.191 / 0.191
    # Basta tirar o "#" da linha seguinte para gerar o arquivo em .doc
    
    #stargazer(linear_simples, linear_multipla, type="html", out="Modelos_lineares.doc")

    4.6 Regressão logística binária e multinomial

    log_binario <- glm(VD4002 ~ V2007 + V2009 + raca + VD3004, data = assalariados_2019, family = "binomial")
    
    #Para visualizar o summary no console basta tirar o "#" da linha seguinte
    #summary(log_binario)
    
    tab_model(log_binario)
      VD 4002
    Predictors Odds Ratios CI p
    (Intercept) 0.74 0.66 – 0.84 <0.001
    V2007 [Mulher] 1.74 1.69 – 1.79 <0.001
    V2009 0.95 0.95 – 0.95 <0.001
    raca [Negros] 1.41 1.36 – 1.45 <0.001
    VD3004 [Fundamental
    incompleto ou
    equivalente]
    0.82 0.74 – 0.90 <0.001
    VD3004 [Fundamental
    completo ou equivalente]
    0.81 0.73 – 0.90 <0.001
    VD3004 [Médio incompleto
    ou equivalente]
    0.86 0.77 – 0.96 0.006
    VD3004 [Médio completo ou
    equivalente]
    0.73 0.66 – 0.80 <0.001
    VD3004 [Superior
    incompleto ou
    equivalente]
    0.58 0.52 – 0.65 <0.001
    VD3004 [Superior
    completo]
    0.40 0.36 – 0.45 <0.001
    Observations 211203
    R2 Tjur 0.064
    #exp(coef(log_binario))
    
    kable(exp(coef(log_binario))) %>% 
      kable_styling(full_width = F, latex_options = "scale_down", bootstrap_options = c("bordered", "hover"))
    x
    (Intercept) 0.7447068
    V2007Mulher 1.7385447
    V2009 0.9469367
    racaNegros 1.4069800
    VD3004Fundamental incompleto ou equivalente 0.8161712
    VD3004Fundamental completo ou equivalente 0.8093607
    VD3004Médio incompleto ou equivalente 0.8594856
    VD3004Médio completo ou equivalente 0.7253498
    VD3004Superior incompleto ou equivalente 0.5795528
    VD3004Superior completo 0.4034014
    # Basta tirar o "#" da linha seguinte para gerar o arquivo em .doc
    
    #stargazer(log_binario, apply.coef = exp, type="html", out="Modelo_log_binario.doc")
    #log_multinomial <- multinom (jornadas ~ V2007 + V2009 + raca + VD3004, data = assalariados_2019)
    
    print_output(log_multinomial <- multinom (jornadas ~ V2007 + V2009 + raca + VD3004, data = assalariados_2019))

    Error : The fig.showtext code chunk option must be TRUE

    #Para visualizar o summary no console basta tirar o "#" da linha seguinte
    #summary(log_multinomial)
    
    tab_model(log_multinomial)
      jornadas
    Predictors Odds Ratios CI p Response
    (Intercept) 0.82 0.76 – 0.88 <0.001 Jornadas parciais
    V2007 [Mulher] 2.15 2.10 – 2.20 <0.001 Jornadas parciais
    V2009 1.00 1.00 – 1.00 0.955 Jornadas parciais
    raca [Negros] 1.27 1.24 – 1.30 <0.001 Jornadas parciais
    VD3004 [Fundamental
    incompleto ou
    equivalente]
    0.65 0.61 – 0.69 <0.001 Jornadas parciais
    VD3004 [Fundamental
    completo ou equivalente]
    0.46 0.43 – 0.50 <0.001 Jornadas parciais
    VD3004 [Médio incompleto
    ou equivalente]
    0.53 0.49 – 0.57 <0.001 Jornadas parciais
    VD3004 [Médio completo ou
    equivalente]
    0.30 0.28 – 0.32 <0.001 Jornadas parciais
    VD3004 [Superior
    incompleto ou
    equivalente]
    0.46 0.43 – 0.49 <0.001 Jornadas parciais
    VD3004 [Superior
    completo]
    0.33 0.31 – 0.36 <0.001 Jornadas parciais
    (Intercept) 0.45 0.41 – 0.49 <0.001 Jornadas excessivas
    V2007 [Mulher] 0.73 0.71 – 0.75 <0.001 Jornadas excessivas
    V2009 1.01 1.00 – 1.01 <0.001 Jornadas excessivas
    raca [Negros] 0.87 0.85 – 0.89 <0.001 Jornadas excessivas
    VD3004 [Fundamental
    incompleto ou
    equivalente]
    1.08 1.00 – 1.17 0.037 Jornadas excessivas
    VD3004 [Fundamental
    completo ou equivalente]
    1.05 0.97 – 1.14 0.258 Jornadas excessivas
    VD3004 [Médio incompleto
    ou equivalente]
    1.03 0.94 – 1.13 0.509 Jornadas excessivas
    VD3004 [Médio completo ou
    equivalente]
    0.88 0.81 – 0.95 0.001 Jornadas excessivas
    VD3004 [Superior
    incompleto ou
    equivalente]
    0.66 0.60 – 0.73 <0.001 Jornadas excessivas
    VD3004 [Superior
    completo]
    0.52 0.48 – 0.57 <0.001 Jornadas excessivas
    Observations 187770
    R2 Nagelkerke 0.098
    #exp(coef(log_multinomial))
    
    kable(exp(coef(log_multinomial))) %>% 
      kable_styling(full_width = F, latex_options = "scale_down", bootstrap_options = c("bordered", "hover"))
    (Intercept) V2007Mulher V2009 racaNegros VD3004Fundamental incompleto ou equivalente VD3004Fundamental completo ou equivalente VD3004Médio incompleto ou equivalente VD3004Médio completo ou equivalente VD3004Superior incompleto ou equivalente VD3004Superior completo
    Jornadas parciais 0.8179921 2.1515817 1.000025 1.2722703 0.6473448 0.4620274 0.5312773 0.3028614 0.4586115 0.3330221
    Jornadas excessivas 0.4510736 0.7275855 1.005819 0.8686788 1.0847341 1.0495799 1.0301935 0.8775556 0.6615155 0.5247825
    # Basta tirar o "#" da linha seguinte para gerar o arquivo em .doc
    
    #stargazer(log_multinomial, apply.coef = exp, type="html", out="Modelo_log_multinomial.doc")

    5 Obrigado!

    LS0tDQp0aXRsZTogSW50cm9kdcOnw6NvIMOgIGFuw6FsaXNlIGRlIGluZGljYWRvcmVzIHNvY2lvZWNvbsO0bWljb3MgZW0gZXN0dWRvcyBkZSB0cmFiYWxobw0KICBlbSBSDQphdXRob3I6ICJSYXBoYWVsIFNhbnRvcyBMYXBhIGUgSm/Do28gUGVkcm8gSW7DoWNpbyBQZWxlamEiDQpzdWJ0aXRsZTogViBFbmNvbnRybyBJbnRlcm5hY2lvbmFsIFRlb3JpYSBWYWxvciBUcmFiYWxobyBlIENpw6puY2lhcyBTb2NpYWlzDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZm9sZGluZzogc2hvdw0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogMg0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KICAgIHNlbGZfY29udGFpbmVkOiBmYWxzZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICB0aGVtZToNCiAgICAgIGJnOiAiI2RmZTNlYiINCiAgICAgIGZnOiAiIzA4MDgwOCINCiAgICAgIHByaW1hcnk6ICIjNTc1MmViIg0KICAgICAgc2Vjb25kYXJ5OiAiIzAwREFDNiINCiAgICAgIGJhc2VfZm9udDoNCiAgICAgICAgZ29vZ2xlOiBQcm9tcHQNCiAgICAgIGhlYWRpbmdfZm9udDoNCiAgICAgICAgZ29vZ2xlOiBQcm96YSBMaWJyZQ0KICAgICAgDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQppZiAocmVxdWlyZU5hbWVzcGFjZSgidGhlbWF0aWMiKSkgDQogIHRoZW1hdGljOjp0aGVtYXRpY19ybWQoZm9udCA9ICJhdXRvIikNCmBgYA0KDQo8L2JyPg0KPC9icj4NCg0KLS0tDQoNCiMgT2JqZXRpdm9zIGRvIG1pbmljdXJzbw0KDQo+LSBBcHJlc2VudGFyIHVtIHBhbm9yYW1hIGRvcyBpbmRpY2Fkb3JlcyBzb2Npb2Vjb27DtG1pY29zIGRvIG11bmRvIGRvIHRyYWJhbGhvIGRpc3BvbsOtdmVpcyBwYXJhIGNvbnN1bHRhLg0KDQo+LSBJbnRyb2R1emlyIGFzIHBvc3NpYmlsaWRhZGVzIGRlIGFuw6FsaXNlIGRhIGxpbmd1YWdlbSBSIHBhcmEgcGVzcXVpc2FzIGRlc2FncmVnYWRhcw0KDQo8L2JyPg0KPC9icj4NCg0KLS0tDQoNCiMgQmFzZXMgZGUgRGFkb3MNCg0KYGBge3IsIGVjaG89VCwgZXZhbD1ULCByZXN1bHRzPSdhc2lzJywgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9NCwgZmlnLmFsaWduPSdjZW50ZXInLCBvdXQud2lkdGg9IjFcXGxpbmV3aWR0aCIsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHNpemU9J3RpbnknfQ0KDQpsaWJyYXJ5KHJzY29ubmVjdCkNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KDQpiZHNfdHJhYmFsaG8gPSByZWFkX3hsc3goIi4vQkRzX1RyYWJhbGhvLnhsc3giKQ0KDQojYmRzX3RyYWJhbGhvJFBlc3F1aXNhID0gcGFzdGUwKCJbIiwgYmRzX3RyYWJhbGhvJFBlc3F1aXNhLCAiXSgiLCBiZHNfdHJhYmFsaG8kYExpbmtzIHBhcmEgQ29uc3VsdGFgLCAiKSIpDQoNCmJkc190cmFiYWxobyA9IGJkc190cmFiYWxobyAlPiUgDQogIG11dGF0ZSAoUGVzcXVpc2EgPSBwYXN0ZTAoIlsiLCBiZHNfdHJhYmFsaG8kUGVzcXVpc2EsICJdKCIsIGJkc190cmFiYWxobyRgTGlua3MgcGFyYSBDb25zdWx0YWAsICIpIikpICU+JSANCiAgc2VsZWN0ICgtYExpbmtzIHBhcmEgQ29uc3VsdGFgKSANCg0Ka2JsKGJkc190cmFiYWxobywgYm9va3RhYnMgPSBULCBsb25ndGFibGUgPSBGKSAlPiUNCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRiwgZm9udF9zaXplID0gMTQsIGxhdGV4X29wdGlvbnMgPSAic2NhbGVfZG93biIsDQogICAgICAgICAgICAgICAgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImJvcmRlcmVkIiwgImhvdmVyIikpICU+JQ0KICBjb2x1bW5fc3BlYygxLCBib2xkID0gVCwgY29sb3IgPSAicmVkIiwgd2lkdGhfbWluID0gIjhjbSIpICU+JQ0KICBjb2x1bW5fc3BlYyg2LCB3aWR0aF9taW4gPSAiOGNtIikgJT4lIA0KICBjb2x1bW5fc3BlYyg3LCB3aWR0aF9taW4gPSAiNWNtIikgJT4lIA0KICBwYWNrX3Jvd3MoaW5kZXggPSBjKCJOYWNpb25hbCIgPSA5LCAiUmVnaW9uYWwiID0gMywgIkludGVybmFjaW9uYWwiID0gNSkpDQpgYGANCg0KPC9icj4NCjwvYnI+DQoNCi0tLQ0KDQojIEEgdXRpbGl6YcOnw6NvIGRhIGxpbmd1YWdlbSBSIHBhcmEgYW7DoWxpc2UgZGUgZGFkb3MNCg0KPC9icj4NCg0KIyMgQ29tbyBpbmljaWFyPyANCg0KMS4gQW1iaWVudGUgb25saW5lIChzZW0gbmVjZXNzaWRhZGUgZGUgaW5zdGFsYcOnw6NvIGRlIHByb2dyYW1hKSBwYXJhIHByw6F0aWNhOiBodHRwczovL3JzdHVkaW8uY2xvdWQvIA0KDQoyLiBQcm9ncmFtYSBvZmZsaW5lOiBSU3R1ZGlvOiBodHRwczovL3d3dy5yc3R1ZGlvLmNvbS9wcm9kdWN0cy9yc3R1ZGlvL2Rvd25sb2FkLw0KDQo8L2JyPg0KDQoqIENvbW8gaW5zdGFsYXIgbyBSU3R1ZGlvDQogICsgaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj05ekhvYlNSRHZFYw0KDQoqIEN1cnNvcyBpbmljaWFpcyBncmF0dWl0b3M6DQogICsgaHR0cHM6Ly9kaWRhdGljYS50ZWNoL2N1cnNvLWRlLXItb25saW5lLXBhcmEtaW5pY2lhbnRlcy8NCiAgKyBodHRwczovL3d3dy5lc2NvbGF2aXJ0dWFsLmdvdi5ici9jdXJzby8zMjUNCiAgKyBodHRwczovL3JzdHVkaW8uY2xvdWQvbGVhcm4vcHJpbWVycy8xIA0KICArIERpdmVyc29zIGN1cnNvcyBjb20gZm9jb3MgZGlzdGludG9zIG5vIENvdXJzZXJhDQogICsgRXN0YXTDrXN0aWNhIELDoXNpY2EgY29tIFIgKEZHVikgaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj04SFFIZjVYQ1M3ZyZsaXN0PVBMdVFXV1hySFFMaWVqRUNwX2xkUlBFanVWbkpyRzdmVlMNCiAgKyBFc3RhdMOtc3RpY2EgQXBsaWNhZGEgKEF2YW7Dp2FkYSkgZW0gUiBodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PVdWb2dkU2xrN2dZJmxpc3Q9UExPdzYyY0JRNWo5VkU5WDRjQ0NmRk1qV19oaEVBSlVoVQ0KICArIE91dHJhcyBkw7p2aWRhcyAoTWVyY2VsIFNhbnRvcykgLSBodHRwczovL3d3dy55b3V0dWJlLmNvbS9jaGFubmVsL1VDTzZ4N3NRdXJGVHcwU3UwdnNleEU1ZyANCiAgKyBFc3RhdMOtc3RpY2EgZW0gUiAoSW5nbMOqcykgLSBjb20gZXhlbXBsb3MgLSBodHRwczovL2VtaWxodml0ZmVsZHQuZ2l0aHViLmlvL0lTTFItdGlkeW1vZGVscy1sYWJzL2luZGV4Lmh0bWwgDQoNCiogQ3Vyc29zIGF2YW7Dp2Fkb3MgcGFnb3M6DQogICsgQW7DoWxpc2UgTWFjcm8gLSBodHRwczovL2FuYWxpc2VtYWNyby5jb20uYnIvDQogICsgQ3Vyc28gLSBSIGh0dHBzOi8vY3Vyc28tci5jb20vDQoNCiogT3V0cm9zIGxpbmtzDQogICsgQ2hlYXRTaGVldHMgKFJlc3Vtb3MgZGUgQ29tYW5kb3MpIE9maWNpYWlzIC0gaHR0cHM6Ly93d3cucnN0dWRpby5jb20vcmVzb3VyY2VzL2NoZWF0c2hlZXRzLyANCiAgKyBSZXBvc2l0w7NyaW8gZGUgTGl2cm9zIGVtIGUgc29icmUgUiAtIGh0dHBzOi8vYm9va2Rvd24ub3JnLyANCiAgKyBBbmFseXplIFN1cnZleSBEYXRhIGZvciBGcmVlIC0gaHR0cDovL2FzZGZyZWUuY29tLyANCg0KPC9icj4NCjwvYnI+DQoNCi0tLQ0KDQojIyBWYW50YWdlbnMgZG8gdXNvIGRhIGxpbmd1YWdlbSBSDQoNCj4tIExpbmd1YWdlbSBjb20gZm9jbyBlbSBhbsOhbGlzZSBlc3RhdMOtc3RpY2EuDQo+LSBBbsOhbGlzZSBkZSBncmFuZGUgdm9sdW1lIGRlIGRhZG9zLg0KPi0gQ29tdW5pZGFkZSBhdGl2YSBwYXJhIGJ1c2NhIGRlIHNvbHXDp8O1ZXMgZW0gY29uanVudG8uDQoNCjwvYnI+DQo8L2JyPg0KDQotLS0NCg0KIyMgT3MgcGFjb3RlcyBkbyBSIChsaWJyYXJpZXMpDQoNClBhcmEgbyBtaW5pY3Vyc28gc2Vyw6NvIHV0aWxpemFkb3MgY29tbyBleGVtcGxvcyBwcmluY2lwYWlzDQoNCj4tIHNpZHJhciAoaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL3NpZHJhci9pbmRleC5odG1sKQ0KPi0gc3VydmV5IChodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvc3VydmV5L2luZGV4Lmh0bWwpDQo+LSBQTkFEY0lCR0UgKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9QTkFEY0lCR0UvaW5kZXguaHRtbCkNCg0KPC9icj4NCjwvYnI+DQoNCi0tLQ0KDQojIEFwbGljYcOnw7VlcyBkbyBSIG5hcyBwZXNxdWlzYXMgc29icmUgdHJhYmFsaG8NCg0KIyMgSm9ybmFkYSBkZSBUcmFiYWxobyAoY29tIG8gdXNvIGRvIHBhY290ZSBzaWRyYXIpIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQ0KDQpTZXLDoSB1dGlsaXphZG8gY29tbyBleGVtcGxvIG8gcGFjb3RlIHNpZHJhciBlIGEgUE5BREMtVCAoaHR0cHM6Ly9zaWRyYS5pYmdlLmdvdi5ici9ob21lL3BuYWRjdC9icmFzaWwpDQoNCkVzc2Ugw6kgdW0gZXhlbXBsbyBkZSBhbsOhbGlzZSBkZSBob3JhcyB0cmFiYWxoYWRhcyBlbSBSIGEgcGFydGlyIGRhIEFQSSBkbyBTSURSQS9JQkdFIHV0aWxpemFuZG8gbyBwYWNvdGUgc2lkcmFyLg0KDQpOZXNzYSBwcmltZWlyYSBzZcOnw6NvIHRlbW9zIGEgdXRpbGl6YcOnw6NvIGRhcyBzZWd1aW50ZXMgdGFiZWxhczoNCg0KKiAqKlRhYmVsYSA2MzcxKiogLSBNw6lkaWEgZGUgaG9yYXMgaGFiaXR1YWxtZW50ZSB0cmFiYWxoYWRhcyBwb3Igc2VtYW5hIGUgZWZldGl2YW1lbnRlIHRyYWJhbGhhZGFzIG5hIHNlbWFuYSBkZSByZWZlcsOqbmNpYSwgbm8gdHJhYmFsaG8gcHJpbmNpcGFsIGUgZW0gdG9kb3Mgb3MgdHJhYmFsaG9zLCBkYXMgcGVzc29hcyBkZSAxNCBhbm9zIG91IG1haXMgZGUgaWRhZGUsIHBvciBzZXhvDQoNCiogKipUYWJlbGEgNjM3MioqIC0gTcOpZGlhIGRlIGhvcmFzIGhhYml0dWFsbWVudGUgdHJhYmFsaGFkYXMgcG9yIHNlbWFuYSBlIGVmZXRpdmFtZW50ZSB0cmFiYWxoYWRhcyBuYSBzZW1hbmEgZGUgcmVmZXLDqm5jaWEsIG5vIHRyYWJhbGhvIHByaW5jaXBhbCBlIGVtIHRvZG9zIG9zIHRyYWJhbGhvcywgZGFzIHBlc3NvYXMgZGUgMTQgYW5vcyBvdSBtYWlzIGRlIGlkYWRlLCBwb3IgZ3J1cG9zIGRlIGlkYWRlDQoNCiogKipUYWJlbGEgNjM3MyoqIC0gTcOpZGlhIGRlIGhvcmFzIGhhYml0dWFsbWVudGUgdHJhYmFsaGFkYXMgcG9yIHNlbWFuYSBlIGVmZXRpdmFtZW50ZSB0cmFiYWxoYWRhcyBuYSBzZW1hbmEgZGUgcmVmZXLDqm5jaWEsIG5vIHRyYWJhbGhvIHByaW5jaXBhbCBlIGVtIHRvZG9zIG9zIHRyYWJhbGhvcywgZGFzIHBlc3NvYXMgZGUgMTQgYW5vcyBvdSBtYWlzIGRlIGlkYWRlLCBwb3IgbsOtdmVpcyBkZSBpbnN0cnXDp8Ojbw0KDQoqICoqVGFiZWxhIDYzNzQqKiAtIE3DqWRpYSBkZSBob3JhcyBoYWJpdHVhbG1lbnRlIHRyYWJhbGhhZGFzIHBvciBzZW1hbmEgZSBlZmV0aXZhbWVudGUgdHJhYmFsaGFkYXMgbmEgc2VtYW5hIGRlIHJlZmVyw6puY2lhLCBubyB0cmFiYWxobyBwcmluY2lwYWwsIGRhcyBwZXNzb2FzIGRlIDE0IGFub3Mgb3UgbWFpcyBkZSBpZGFkZSwgcG9yIHBvc2nDp8OjbyBuYSBvY3VwYcOnw6NvDQoNClBhcmEgcGVnYXIgbyBsaW5rIGRlIHJlZmVyw6puY2lhIGRhIEFQSSwgdmVqYSBvcyBwYXNzb3Mgbm8gdsOtZGVvIGFiYWl4bzoNCg0KPHZpZGVvIHdpZHRoPSI4MDAiIGhlaWdodD0iNjE2IiBjb250cm9scz4NCiAgPHNvdXJjZSBzcmM9InNpZHJhMS53ZWJtIiB0eXBlPSJ2aWRlby93ZWJtIj4NCjwvdmlkZW8+DQoNCjwvYnI+DQo8L2JyPg0KDQojIyMgQ8OzZGlnbyBJbmljaWFsIGUgVGFiZWxhcw0KDQpgYGB7ciwgZWNobz1ULCByZXN1bHRzPSdhc2lzJywgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9NCwgZmlnLmFsaWduPSdjZW50ZXInLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBzaXplPSd0aW55JywgZmlnLnNob3d0ZXh0PVRSVUV9DQoNCiNjYXJyZWdhIGJpYmxpb3RlY2FzDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoc2lkcmFyKQ0KbGlicmFyeSh6b28pDQoNCiNhcm1hemVuYSBvcyBkYWRvcyBkYSB0YWJlbGEgZXNjb2xoaWRhDQojaG9yYXMgZWZldGl2YW1lbnRlDQojc2V4bw0KaG9yYXNfc2V4byA9IGdldF9zaWRyYShhcGkgPSAiL3QvNjM3MS9uMS9hbGwvbjMvYWxsL3YvODE4OC9wL2FsbC9jMi9hbGwvZC92ODE4OCUyMDEiKQ0KDQojbW9zdHJhIG8gbm9tZSBkYXMgY29sdW5hcw0KY29sbmFtZXMoaG9yYXNfc2V4bykNCg0KI1RBQkVMQSAxDQojIHRyYXRhbWVudG8gZGEgdGFiZWxhIGUgcmVkdcOnw6NvIGFvIHJlY29ydGUgIkJyYXNpbCIgZSB0b2Rvcw0KaG9yYXNfc2V4b19kZiA9IGhvcmFzX3NleG8gJT4lDQogIG11dGF0ZShkYXRhID0gYXMueWVhcnF0cihgVHJpbWVzdHJlIChDw7NkaWdvKWAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0PSclWSVxJykpICU+JSANCiAgcmVuYW1lKFVGID0gIkJyYXNpbCBlIFVuaWRhZGUgZGEgRmVkZXJhw6fDo28iLCBIb3JhID0gVmFsb3IpICU+JQ0KICBzZWxlY3QoZGF0YSwgVUYsIEhvcmEsIFNleG8pICU+JSANCiAgZmlsdGVyKFVGID09ICJCcmFzaWwiKSAlPiUgDQogIGdyb3VwX2J5KGRhdGEpDQoNCiNrYWJsZShoZWFkKGhvcmFzX3NleG9fZGYpKQ0KDQprYmwodGFpbChob3Jhc19zZXhvX2RmKSwgYm9va3RhYnMgPSBULCBsb25ndGFibGUgPSBGKSAlPiUNCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRiwgZm9udF9zaXplID0gMTQsIGxhdGV4X29wdGlvbnMgPSAic2NhbGVfZG93biIsDQogICAgICAgICAgICAgICAgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImJvcmRlcmVkIiwgImhvdmVyIikpDQoNCiNpZGFkZQ0KaG9yYXNfaWRhZGUgPSBnZXRfc2lkcmEoYXBpID0gIi90LzYzNzIvbjEvYWxsL24zL2FsbC92LzgxODgvcC9hbGwvYzU4L2FsbC9kL3Y4MTg4JTIwMSIpDQoNCiNtb3N0cmEgbyBub21lIGRhcyBjb2x1bmFzDQpjb2xuYW1lcyhob3Jhc19pZGFkZSkNCg0KI1RBQkVMQSAyDQojIHRyYXRhbWVudG8gZGEgdGFiZWxhIGUgcmVkdcOnw6NvIGFvIHJlY29ydGUgIkJyYXNpbCIgZSB0b2Rvcw0KaG9yYXNfaWRhZGVfZGYgPSBob3Jhc19pZGFkZSAlPiUNCiAgbXV0YXRlKGRhdGEgPSBhcy55ZWFycXRyKGBUcmltZXN0cmUgKEPDs2RpZ28pYCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ9JyVZJXEnKSkgJT4lIA0KICByZW5hbWUoVUYgPSAiQnJhc2lsIGUgVW5pZGFkZSBkYSBGZWRlcmHDp8OjbyIsIEhvcmEgPSBWYWxvcikgJT4lDQogIHNlbGVjdChkYXRhLCBVRiwgSG9yYSwgYEdydXBvIGRlIGlkYWRlYCkgJT4lIA0KICBmaWx0ZXIoVUYgPT0gIkJyYXNpbCIpICU+JSANCiAgZ3JvdXBfYnkoZGF0YSkNCg0KI2thYmxlKGhlYWQoaG9yYXNfaWRhZGVfZGYpKQ0KDQprYmwodGFpbChob3Jhc19pZGFkZV9kZiksIGJvb2t0YWJzID0gVCwgbG9uZ3RhYmxlID0gRikgJT4lDQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEYsIGZvbnRfc2l6ZSA9IDE0LCBsYXRleF9vcHRpb25zID0gInNjYWxlX2Rvd24iLA0KICAgICAgICAgICAgICAgIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJib3JkZXJlZCIsICJob3ZlciIpKQ0KDQojaW5zdHJ1w6fDo28NCmhvcmFzX2luc3RydWNhbyA9IGdldF9zaWRyYShhcGkgPSAiL3QvNjM3My9uMS9hbGwvbjMvYWxsL3YvODE4Ni9wL2FsbC9jMTU2OC9hbGwvZC92ODE4NiUyMDEiKQ0KDQojbW9zdHJhIG8gbm9tZSBkYXMgY29sdW5hcw0KY29sbmFtZXMoaG9yYXNfaW5zdHJ1Y2FvKQ0KDQojVEFCRUxBIDMNCiMgdHJhdGFtZW50byBkYSB0YWJlbGEgZSByZWR1w6fDo28gYW8gcmVjb3J0ZSAiQnJhc2lsIiBlIHRvZG9zDQpob3Jhc19pbnN0cnVjYW9fZGYgPSBob3Jhc19pbnN0cnVjYW8gJT4lDQogIG11dGF0ZShkYXRhID0gYXMueWVhcnF0cihgVHJpbWVzdHJlIChDw7NkaWdvKWAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0PSclWSVxJykpICU+JSANCiAgcmVuYW1lKFVGID0gIkJyYXNpbCBlIFVuaWRhZGUgZGEgRmVkZXJhw6fDo28iLCBIb3JhID0gVmFsb3IpICU+JQ0KICBzZWxlY3QoZGF0YSwgVUYsIEhvcmEsIGBOw612ZWwgZGUgaW5zdHJ1w6fDo29gKSAlPiUgDQogIGZpbHRlcihVRiA9PSAiQnJhc2lsIikgJT4lIA0KICBncm91cF9ieShkYXRhKQ0KDQoja2FibGUoaGVhZChob3Jhc19pbnN0cnVjYW9fZGYpKQ0KDQprYmwodGFpbChob3Jhc19pbnN0cnVjYW9fZGYpLCBib29rdGFicyA9IFQsIGxvbmd0YWJsZSA9IEYpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGLCBmb250X3NpemUgPSAxNCwgbGF0ZXhfb3B0aW9ucyA9ICJzY2FsZV9kb3duIiwNCiAgICAgICAgICAgICAgICBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiYm9yZGVyZWQiLCAiaG92ZXIiKSkNCg0KI29jdXBhw6fDo28NCmhvcmFzX29jdXBhY2FvID0gZ2V0X3NpZHJhKGFwaSA9ICIvdC82Mzc0L24xL2FsbC9uMy9hbGwvdi84MTg2L3AvYWxsL2MyMzk5L2FsbC9kL3Y4MTg2JTIwMSIpDQoNCiNtb3N0cmEgbyBub21lIGRhcyBjb2x1bmFzDQpjb2xuYW1lcyhob3Jhc19vY3VwYWNhbykNCg0KI1RBQkVMQSA0DQojIHRyYXRhbWVudG8gZGEgdGFiZWxhIGUgcmVkdcOnw6NvIGFvIHJlY29ydGUgIkJyYXNpbCIgZSB0b2Rvcw0KaG9yYXNfb2N1cGFjYW9fZGYgPSBob3Jhc19vY3VwYWNhbyAlPiUNCiAgbXV0YXRlKGRhdGEgPSBhcy55ZWFycXRyKGBUcmltZXN0cmUgKEPDs2RpZ28pYCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ9JyVZJXEnKSkgJT4lIA0KICByZW5hbWUoVUYgPSAiQnJhc2lsIGUgVW5pZGFkZSBkYSBGZWRlcmHDp8OjbyIsIEhvcmEgPSBWYWxvcikgJT4lDQogIHNlbGVjdChkYXRhLCBVRiwgSG9yYSwgYFBvc2nDp8OjbyBuYSBvY3VwYcOnw6NvYCkgJT4lIA0KICBmaWx0ZXIoVUYgPT0gIkJyYXNpbCIpICU+JSANCiAgZ3JvdXBfYnkoZGF0YSkNCg0KI2thYmxlKGhlYWQoaG9yYXNfb2N1cGFjYW9fZGYpKQ0KDQprYmwodGFpbChob3Jhc19vY3VwYWNhb19kZiksIGJvb2t0YWJzID0gVCwgbG9uZ3RhYmxlID0gRikgJT4lDQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEYsIGZvbnRfc2l6ZSA9IDE0LCBsYXRleF9vcHRpb25zID0gInNjYWxlX2Rvd24iLA0KICAgICAgICAgICAgICAgIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJib3JkZXJlZCIsICJob3ZlciIpKQ0KDQpgYGANCg0KIyMjIEdyw6FmaWNvcw0KDQpgYGB7ciwgZWNobz1ULCByZXN1bHRzPSdhc2lzJywgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9NCwgZmlnLmFsaWduPSdjZW50ZXInLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBzaXplPSd0aW55JywgZmlnLnNob3d0ZXh0PVRSVUV9DQoNCiMjIGNhcnJlZ2FyIHBhY290ZXMNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShzaWRyYXIpDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkoZ2dwbG90MikNCg0KI0dSw4FGSUNPIDENCmdncGxvdChob3Jhc19zZXhvX2RmLCBhZXMoeD1kYXRhLCB5ID0gSG9yYSwgY29sb3IgPSBTZXhvKSkrDQogIGdlb21fbGluZShhZXMobGluZXR5cGU9U2V4bykpICsNCiAgZ2VvbV9wb2ludCgpICsNCiAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LCBoanVzdD0xKSwNCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTEyLCBmYWNlPSdib2xkJywgaGp1c3QgPSAwLjUpLA0KICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTAsIGhqdXN0ID0gMC41KSkgKw0KICBzY2FsZV94X3llYXJxdHIoYnJlYWtzID0gcHJldHR5X2JyZWFrcyhuPTgpLA0KICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gIiVZUSVxIikrDQogIGxhYnMoeD0nUGVyw61vZG8nLCB5PSdIb3JhcycsDQogICAgICAgdGl0bGUgPSAnSG9yYXMgSGFiaXR1YWxtZW50ZSBUcmFiYWxoYWRhcycsDQogICAgICAgc3VidGl0bGU9J1RvZG9zIG9zIFRyYWJhbGhvcyAtIEJyYXNpbCcsDQogICAgICAgY2FwdGlvbiA9ICdHcsOhZmljbyAxIC0gRGFkb3MgZXh0cmHDrWRvcyBkYSBQTkFEYyAtIFRyaW1lc3RyYWwgLSBJQkdFJykNCg0KI0dSw4FGSUNPIDINCmdncGxvdChob3Jhc19pZGFkZV9kZiwgYWVzKHg9ZGF0YSwgeSA9IEhvcmEsIGNvbG9yID0gYEdydXBvIGRlIGlkYWRlYCkpKw0KICBnZW9tX2xpbmUoYWVzKGxpbmV0eXBlPWBHcnVwbyBkZSBpZGFkZWApKSArDQogIGdlb21fcG9pbnQoKSArDQogIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT00NSwgaGp1c3Q9MSksDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMiwgZmFjZT0nYm9sZCcsIGhqdXN0ID0gMC41KSwNCiAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTEwLCBoanVzdCA9IDAuNSkpICsNCiAgc2NhbGVfeF95ZWFycXRyKGJyZWFrcyA9IHByZXR0eV9icmVha3Mobj04KSwNCiAgICAgICAgICAgICAgICAgIGZvcm1hdCA9ICIlWVElcSIpKw0KICBsYWJzKHg9J1BlcsOtb2RvJywgeT0nSG9yYXMnLA0KICAgICAgIHRpdGxlID0gJ0hvcmFzIEhhYml0dWFsbWVudGUgVHJhYmFsaGFkYXMnLA0KICAgICAgIHN1YnRpdGxlPSdUb2RvcyBvcyBUcmFiYWxob3MgLSBCcmFzaWwnLA0KICAgICAgIGNhcHRpb24gPSAnR3LDoWZpY28gMSAtIERhZG9zIGV4dHJhw61kb3MgZGEgUE5BRGMgLSBUcmltZXN0cmFsIC0gSUJHRScpDQoNCiNHUsOBRklDTyAzDQpnZ3Bsb3QoaG9yYXNfaW5zdHJ1Y2FvX2RmLCBhZXMoeD1kYXRhLCB5ID0gSG9yYSwgY29sb3IgPSBgTsOtdmVsIGRlIGluc3RydcOnw6NvYCkpKw0KICBnZW9tX2xpbmUoYWVzKGxpbmV0eXBlPWBOw612ZWwgZGUgaW5zdHJ1w6fDo29gKSkgKw0KICBnZW9tX3BvaW50KCkgKw0KICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9NDUsIGhqdXN0PTEpLA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTIsIGZhY2U9J2JvbGQnLCBoanVzdCA9IDAuNSksDQogICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCwgaGp1c3QgPSAwLjUpKSArDQogIHNjYWxlX3hfeWVhcnF0cihicmVha3MgPSBwcmV0dHlfYnJlYWtzKG49OCksDQogICAgICAgICAgICAgICAgICBmb3JtYXQgPSAiJVlRJXEiKSsNCiAgbGFicyh4PSdQZXLDrW9kbycsIHk9J0hvcmFzJywNCiAgICAgICB0aXRsZSA9ICdIb3JhcyBIYWJpdHVhbG1lbnRlIFRyYWJhbGhhZGFzJywNCiAgICAgICBzdWJ0aXRsZT0nVG9kb3Mgb3MgVHJhYmFsaG9zIC0gQnJhc2lsJywNCiAgICAgICBjYXB0aW9uID0gJ0dyw6FmaWNvIDEgLSBEYWRvcyBleHRyYcOtZG9zIGRhIFBOQURjIC0gVHJpbWVzdHJhbCAtIElCR0UnKQ0KDQojR1LDgUZJQ08gNA0KZ2dwbG90KGhvcmFzX29jdXBhY2FvX2RmLCBhZXMoeD1kYXRhLCB5ID0gSG9yYSwgY29sb3IgPSBgUG9zacOnw6NvIG5hIG9jdXBhw6fDo29gKSkrDQogIGdlb21fbGluZShhZXMobGluZXR5cGU9YFBvc2nDp8OjbyBuYSBvY3VwYcOnw6NvYCkpICsNCiAgZ2VvbV9wb2ludCgpICsNCiAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LCBoanVzdD0xKSwNCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTEyLCBmYWNlPSdib2xkJywgaGp1c3QgPSAwLjUpLA0KICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTAsIGhqdXN0ID0gMC41KSkgKw0KICBzY2FsZV94X3llYXJxdHIoYnJlYWtzID0gcHJldHR5X2JyZWFrcyhuPTgpLA0KICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gIiVZUSVxIikrDQogIGxhYnMoeD0nUGVyw61vZG8nLCB5PSdIb3JhcycsDQogICAgICAgdGl0bGUgPSAnSG9yYXMgSGFiaXR1YWxtZW50ZSBUcmFiYWxoYWRhcycsDQogICAgICAgc3VidGl0bGU9J1RvZG9zIG9zIFRyYWJhbGhvcyAtIEJyYXNpbCcsDQogICAgICAgY2FwdGlvbiA9ICdHcsOhZmljbyAxIC0gRGFkb3MgZXh0cmHDrWRvcyBkYSBQTkFEYyAtIFRyaW1lc3RyYWwgLSBJQkdFJykNCg0KYGBgDQoNCg0KIyMgQ29tcGFyYcOnw6NvIGVudHJlIGJhc2VzIGRlIGRhZG9zIC0gUE5BRCAtIENvbnTDrW51YSBlIENBR0VEIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQ0KDQpFeGVtcGxvIGRvIFbDrXRvciBXaWxoZXINCg0KIyMjIEPDs2RpZ28gSW5pY2lhbA0KDQpgYGB7ciwgZWNobz1ULCBldmFsPVQsIHJlc3VsdHM9J2FzaXMnLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD00LCBmaWcuYWxpZ249J2NlbnRlcicsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHNpemU9J3RpbnknfQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIENBR0VEIHZzIFBOQUQgQ09udMOtbnVhICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyMgUGFjb3Rlcw0KbGlicmFyeShlY29zZXJpZXMpDQpsaWJyYXJ5KHNpZHJhcikNCmxpYnJhcnkoeHRzKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShmb3JlY2FzdCkNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShhc3RzYSkNCmxpYnJhcnkoZ3JpZEV4dHJhKQ0KbGlicmFyeShzZWFzb25hbCkNCg0KIyMgQmFpeGFyIGRhZG9zDQpjYWdlZCA9IHRzKHNlcmllc19pcGVhZGF0YSgnMjMxNDEwNDE3JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZGljaXR5ID0gJ00nKSRzZXJpZV8yMzE0MTA0MTckdmFsb3IsDQogICAgICAgICAgIHN0YXJ0PWMoMTk5OSwwNSksIGZyZXE9MTIpDQoNCnBvID0gZ2V0X3NpZHJhKGFwaT0nL3QvNjMyMC9uMS9hbGwvdi80MDkwL3AvYWxsL2MxMTkxMy9hbGx4dCcpDQpjYXJ0ZWlyYSA9IHBvJFZhbG9yW3BvJGBQb3Npw6fDo28gbmEgb2N1cGHDp8OjbyBlIGNhdGVnb3JpYSBkbyBlbXByZWdvIG5vIHRyYWJhbGhvIHByaW5jaXBhbCAoQ8OzZGlnbylgPT0nMzE3MjInXQ0KcG5hZCA9IHRzKGNhcnRlaXJhLCBzdGFydD1jKDIwMTIsMDMpLCBmcmVxPTEyKQ0KDQojIyBEZXNzYXpvbmFsaXphciBDYWdlZA0KY2FnZWRzYSA8LSBmaW5hbChzZWFzKGNhZ2VkKSkNCg0KIyMgV2luZG93DQpjYWdlZHNhID0gd2luZG93KGNhZ2Vkc2EsIHN0YXJ0PWMoMjAxMiwwNikpDQpwbmFkID0gd2luZG93KHBuYWQsIGVuZD1jKDIwMTgsMDkpKQ0KDQojIyBKdW50YXIgZGFkb3MNCmRhdGEgPSB0cy5pbnRlcnNlY3QoY2FnZWRzYSwgcG5hZCkNCg0KZGYgPSBkYXRhLmZyYW1lKGNhZ2VkPWRhdGFbLDFdLCBwbmFkPWRhdGFbLDJdKQ0KDQpgYGANCg0KIyMjIENBR0VEDQoNCmBgYHtyLCBlY2hvPVQsIGV2YWw9VCwgcmVzdWx0cz0nYXNpcycsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTQsIGZpZy5hbGlnbj0nY2VudGVyJywgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgc2l6ZT0ndGlueSd9DQpnMSA9IGF1dG9wbG90KGRhdGFbLDFdLzEwMDApKw0KICBnZW9tX2xpbmUoc2l6ZT0uOCwgY29sb3VyPSdyZWQnKSsNCiAgeGxhYignJykreWxhYignTWlsIFBlc3NvYXMnKSsNCiAgbGFicyh0aXRsZT0nQWRtaXRpZG9zIC0gQ0FHRUQvTVRFJykNCg0KZzENCmBgYA0KDQojIyMgUE5BRA0KDQpgYGB7ciwgZWNobz1ULCBldmFsPVQsIHJlc3VsdHM9J2FzaXMnLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD00LCBmaWcuYWxpZ249J2NlbnRlcicsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHNpemU9J3RpbnknfQ0KZzIgPSBhdXRvcGxvdChkYXRhWywyXS8xMDAwKSsNCiAgZ2VvbV9saW5lKHNpemU9LjgsIGNvbG91cj0nZGFya2JsdWUnKSsNCiAgeGxhYignJykreWxhYignTWlsaMO1ZXMgUGVzc29hcycpKw0KICBsYWJzKHRpdGxlPSdQb3B1bGHDp8OjbyBPY3VwYWRhIGNvbSBDYXJ0ZWlyYSBBc3NpbmFkYSAtIFBOQUQgQ29udMOtbnVhICh0LTMpJykNCg0KZzINCmBgYA0KDQojIyMgQ29tcGFyYcOnw6NvIA0KDQpgYGB7ciwgZWNobz1ULCBldmFsPVQsIHJlc3VsdHM9J2FzaXMnLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD00LCBmaWcuYWxpZ249J2NlbnRlcicsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHNpemU9J3RpbnknfQ0KIyMgR3LDoWZpY28gbGFkbyBhIGxhZG8NCmdyaWQuYXJyYW5nZShnMSwgZzIsDQogICAgICAgICAgICAgdG9wID0gIkNBR0VEIHZzLiBQTkFEIiwNCiAgICAgICAgICAgICBsYXlvdXRfbWF0cml4ID0gbWF0cml4KGMoMiwxKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2w9MSwgYnlyb3c9VFJVRSkpDQpgYGANCg0KIyMjIFJlZ3Jlc3PDo28NCg0KYGBge3IsIGVjaG89VCwgZXZhbD1ULCByZXN1bHRzPSdhc2lzJywgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9NCwgZmlnLmFsaWduPSdjZW50ZXInLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBzaXplPSd0aW55J30NCmdncGxvdChkZiwgYWVzKHBuYWQsIGNhZ2VkLzEwMDApKSsNCiAgZ2VvbV9wb2ludChzaXplPTMsIGNvbG91cj0nZGFya2JsdWUnKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2F1dG8nKSsNCiAgeGxhYignUG9wdWxhw6fDo28gT2N1cGFkYSBjb20gQ2FydGVpcmEgQXNzaW5hZGEgLSBQTkFEIENvbnTDrW51YSAodC0zKSAtIE1pbCBQZXNzb2FzJykrDQogIHlsYWIoJ0ZsdXhvIGRlIEFkbWl0aWRvcyAtIENBR0VEL01URSAtIE1pbCBQZXNzb2FzJykrDQogIGxhYnModGl0bGU9J0NBR0VEIHZzLiBQTkFEIENvbnTDrW51YScpDQpgYGANCg0KPC9icj4NCjwvYnI+DQoNCi0tLQ0KDQojIyBEYWRvcyBkZSB0cmFiYWxoYWRvcmVzIHBvciBhcGxpY2F0aXZvIChjb20gbyB1c28gZG8gcGFjb3RlIENPVklESUJHRSkgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9DQoNCk8gc2lkcmFyIGFwcmVzZW50YSBsaW1pdGHDp8O1ZXMgcXVhbnRvIGFvIHRlbXBvIGRlIGRpc3BvbmliaWxpemHDp8OjbyBkb3MgZGFkb3MuDQoNCkEgcHJpbmNpcGFsICp2YW50YWdlbSogZG8gcGFjb3RlIMOpIGEgZGlzcG9uaWJpbGl6YcOnw6NvIGRvcyBtaWNyb2RhZG9zLg0KDQpBIHNlZ3VuZGEgKnZhbnRhZ2VtKiBkZSBkZXN0YXF1ZSDDqSBhIHV0aWxpemHDp8OjbyBkbyBwYWNvdGUgc3VydmV5IHF1ZSBwZXJtaXRlIG1vc3RyYXIgb3MgZXJyb3MgZXN0YXTDrXN0aWNvcyBhc3NvY2lhZG9zLg0KDQpBICpkZXN2YW50YWdlbSogw6kgYSBkaWZpY3VsZGFkZSBkZSBjb25zdHJ1aXIgc8OpcmllcyBoaXN0w7NyaWNhcyBkZSBmb3JtYSBuYXRpdmEuDQoNCk9icy46IG9zIHBhY290ZXMgKlBOQURjSUJHRSogZSAqQ09WSURJQkdFKiBhcHJlc2VudGFtIGFzIG1lc21hcyBmdW7Dp8O1ZXMuDQoNCj4tIMOJIGltcG9ydGFudGUgY29uaGVjZXIgYXMgYmlibGlvdGVjYXMgZGUgcGVyZ3VudGFzIHF1ZSBmb3JhbSByZWFsaXphZGFzIG5hcyBwZXNxdWlzYXMuDQoNCkJpYmxpb3RlY2EgUE5BRENvbnTDrW51YSAtIGh0dHBzOi8vd3d3LmliZ2UuZ292LmJyL2VzdGF0aXN0aWNhcy9zb2NpYWlzL3BvcHVsYWNhby85MTcxLXBlc3F1aXNhLW5hY2lvbmFsLXBvci1hbW9zdHJhLWRlLWRvbWljaWxpb3MtY29udGludWEtbWVuc2FsLmh0bWw/PSZ0PWRvd25sb2Fkcw0KDQo8L2JyPg0KPC9icj4NCg0KIyMjIEVudHJlZ2Fkb3JlcyBwb3IgQXBsaWNhdGl2byAoVXNhbmRvIGRhdGFmcmFtZSBzaW1wbGVzKQ0KDQpgYGB7ciwgZWNobz1ULCBldmFsPVQsIHJlc3VsdHM9J2FzaXMnLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD00LCBmaWcuYWxpZ249J2NlbnRlcicsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHNpemU9J3RpbnknfQ0KDQpsaWJyYXJ5KENPVklESUJHRSkNCg0KI2RhdGEgZnJhbWUgc2ltcGxlcyBlIGNvbSByw7N0dWxvcyAobGFiZWxzPVRSVUUpDQpwbmFkX2NvdmlkMTlfbm92ZW1icm9fZGZzaW1wbGVzID0gZ2V0X2NvdmlkKHllYXI9MjAyMCwgbW9udGg9MTEsIHZhcnM9YygiQW5vIiwgIlVGIiwgIlJNX1JJREUiLCAiVVBBIiwgIkVzdHJhdG8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9zZXN0IiwgIlYxMDEzIiwgIlYxMDMwIiwgIlYxMDMxIiwgIlYxMDMyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlYxMDIyIiwgIkEwMDMiLCAiQTAwMiIsICJBMDA0IiwgIkEwMDUiLCAiQjAwOCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCMDA5QiIsICJCMDA5RCIsICJCMDA5RiIsICJDMDA3QiIsICJDMDA3QyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQzAwOCIsICJDMDA5IiwgIkMwMTQiLCAiQzAxMDEyIiwgIkMwMDciLCAiRDAwNTEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRTAwMSIpLCBsYWJlbHM9VFJVRSwgZGVmbGF0b3I9VFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpZ249RkFMU0Usc2F2ZWRpcj10ZW1wZGlyKCkpDQojdGVzdGUgcG9wdWxhY2lvbmFsDQpwcm9mID0gYygiTW90b2JveSwiLCAiRW50cmVnYWRvciBkZSBtZXJjYWRvcmlhcyAoZGUgcmVzdGF1cmFudGUsIGRlIGZhcm3DoWNpYSwgZGUgbG9qYSwgVWJlciBFYXRzLCBJRm9vZCwgUmFwcHkgZXRjLikiKQ0KY2FydGVpcmEgPSBjKCJTaW0sIHRlbSBjYXJ0ZWlyYSBkZSB0cmFiYWxobyBhc3NpbmFkYSIsICJTaW0sIMOpIHNlcnZpZG9yIHDDumJsaWNvIGVzdGF0dXTDoXJpbyIpDQoNCnBuYWRfY292aWRfZW50cmVnYWRvcmVzX2Rmc2ltcGxlcyA9IHBuYWRfY292aWQxOV9ub3ZlbWJyb19kZnNpbXBsZXMgJT4lDQogIG11dGF0ZSh0ZXN0ZV9wcm9mID0gQzAwN0MgJWluJSBwcm9mKSAlPiUgDQogIGZpbHRlcih0ZXN0ZV9wcm9mID09ICJUUlVFIikgJT4lDQogIG11dGF0ZSh0ZXN0ZV9jYXJ0ZWlyYSA9IEMwMDdCICVpbiUgY2FydGVpcmEsDQogICAgICAgICByZW5kYV9kZWZsYWNpb25hZGEgPSBDMDEwMTIqRWZldGl2bywNCiAgICAgICAgIHJlbmRhX2RlZmxhY2lvbmFkYSA9IHJvdW5kKHJlbmRhX2RlZmxhY2lvbmFkYSwgMikpICU+JQ0KICBmaWx0ZXIodGVzdGVfY2FydGVpcmEgPT0gIkZBTFNFIikNCg0KcXRkZV9zZXhvID0gcG5hZF9jb3ZpZF9lbnRyZWdhZG9yZXNfZGZzaW1wbGVzICU+JSANCiAgZ3JvdXBfYnkoQTAwMykgJT4lIA0KICBzdW1tYXJpc2UoKG4gPSBzdW0oVjEwMzIsIG5hLnJtID0gVCkpKSAlPiUgDQogIHJlbmFtZShRdGRlID0gJyhuID0gc3VtKFYxMDMyLCBuYS5ybSA9IFQpKScsDQogICAgICAgICBHZW5lcm8gPSBBMDAzKQ0KDQprYmwocXRkZV9zZXhvKQ0KDQojIHJhw6dhDQoNCnJhY2FfZW50cmVnYWRvcmVzX2NvdmlkID0gcG5hZF9jb3ZpZF9lbnRyZWdhZG9yZXNfZGZzaW1wbGVzICU+JSANCiAgc2VsZWN0KFYxMDMyLCBBMDA0KSAlPiUNCiAgZ3JvdXBfYnkoQTAwNCkgJT4lDQogIHN1bW1hcmlzZSgobiA9IHN1bShWMTAzMiwgbmEucm0gPSBUKSkpICU+JQ0KICByZW5hbWUoUXRkZSA9ICcobiA9IHN1bShWMTAzMiwgbmEucm0gPSBUKSknLA0KICAgICAgICAgUmHDp2EgPSBBMDA0KSAlPiUNCiAgc2VsZWN0KFJhw6dhLCBRdGRlKSAlPiUNCiAgbXV0YXRlKFF0ZGUgPSByb3VuZChRdGRlLCAwKSwNCiAgICAgICAgIFF0ZGUgPSBhcy5udW1lcmljKFF0ZGUpKQ0KDQprYmwocmFjYV9lbnRyZWdhZG9yZXNfY292aWQpDQoNCiNlc2NvbGFyaWRhZGUNCmVzY29sYXJpZGFkZV9lbnRyZWdhZG9yZXNfY292aWQgPSBwbmFkX2NvdmlkX2VudHJlZ2Fkb3Jlc19kZnNpbXBsZXMgJT4lIA0KICBzZWxlY3QoVjEwMzIsIEEwMDUpICU+JQ0KICBncm91cF9ieShBMDA1KSAlPiUNCiAgc3VtbWFyaXNlKChuID0gc3VtKFYxMDMyLCBuYS5ybSA9IFQpKSkgJT4lDQogIHJlbmFtZShRdGRlID0gJyhuID0gc3VtKFYxMDMyLCBuYS5ybSA9IFQpKScsDQogICAgICAgICBFc2NvbGFyaWRhZGUgPSBBMDA1KSAlPiUNCiAgc2VsZWN0KEVzY29sYXJpZGFkZSwgUXRkZSkgJT4lDQogIG11dGF0ZShRdGRlID0gcm91bmQoUXRkZSwgMCksDQogICAgICAgICBRdGRlID0gYXMubnVtZXJpYyhRdGRlKSkNCg0Ka2JsKGVzY29sYXJpZGFkZV9lbnRyZWdhZG9yZXNfY292aWQpDQoNCiNVRg0KDQp1Zl9lbnRyZWdhZG9yZXNfY292aWQgPSBwbmFkX2NvdmlkX2VudHJlZ2Fkb3Jlc19kZnNpbXBsZXMgJT4lIA0KICBzZWxlY3QoVUYsIFYxMDMyKSAlPiUNCiAgZ3JvdXBfYnkoVUYpICU+JQ0KICBzdW1tYXJpc2UoKG4gPSBzdW0oVjEwMzIsIG5hLnJtID0gVCkpKSAlPiUNCiAgcmVuYW1lKFF0ZGUgPSAnKG4gPSBzdW0oVjEwMzIsIG5hLnJtID0gVCkpJykgJT4lDQogIG11dGF0ZShRdGRlID0gcm91bmQoUXRkZSwgMCksDQogICAgICAgICBRdGRlID0gYXMubnVtZXJpYyhRdGRlKSkNCg0Ka2JsKHVmX2VudHJlZ2Fkb3Jlc19jb3ZpZCkNCg0KYGBgDQoNCg0KIyMjIEVudHJlZ2Fkb3JlcyBwb3IgQXBsaWNhdGl2byAoVXNhbmRvIHBhY290ZSBzdXJ2ZXkpDQoNCg0KYGBge3IsIGVjaG89VCwgZXZhbD1ULCByZXN1bHRzPSdhc2lzJywgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9NCwgZmlnLmFsaWduPSdjZW50ZXInLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBzaXplPSd0aW55J30NCg0KbGlicmFyeShQTkFEY0lCR0UpDQpsaWJyYXJ5KENPVklESUJHRSkNCmxpYnJhcnkoc3VydmV5KQ0KDQojb2JqZXRvIHN1cnZleQ0KcG5hZF9jb3ZpZDE5X25vdmVtYnJvID0gZ2V0X2NvdmlkKHllYXI9MjAyMCwgbW9udGg9MTEsIHZhcnM9YygiQW5vIiwgIlVGIiwgIlJNX1JJREUiLCAiVVBBIiwgIkVzdHJhdG8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9zZXN0IiwgIlYxMDEzIiwgIlYxMDMwIiwgIlYxMDMxIiwgIlYxMDMyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlYxMDIyIiwgIkEwMDMiLCAiQTAwMiIsICJBMDA0IiwgIkEwMDUiLCAiQjAwOCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCMDA5QiIsICJCMDA5RCIsICJCMDA5RiIsICJDMDA3QiIsICJDMDA3QyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQzAwOCIsICJDMDA5IiwgIkMwMTQiLCAiQzAxMDEyIiwgIkMwMDciLCAiRDAwNTEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRTAwMSIpLCBsYWJlbHM9VFJVRSwgZGVmbGF0b3I9VFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpZ249VFJVRSxzYXZlZGlyPXRlbXBkaXIoKSkNCiN0ZXN0ZSBwb3B1bGFjaW9uYWwNCnRvdGFsc2V4byA9IHN2eXRvdGFsKH5BMDAzLCBwbmFkX2NvdmlkMTlfbm92ZW1icm8sIG5hLnJtID0gVCkNCg0Ka2JsKHRvdGFsc2V4bykNCg0KI1RJUE8gU1VSVkVZIC0gU09NRU5URSBFTlRSRUdBRE9SRVMgU0VNIENBUlRFSVJBIEFTU0lOQURBIC0gTk9WRU1CUk8NCnByb2YgPSBjKCJNb3RvYm95LCIsICJFbnRyZWdhZG9yIGRlIG1lcmNhZG9yaWFzIChkZSByZXN0YXVyYW50ZSwgZGUgZmFybcOhY2lhLCBkZSBsb2phLCBVYmVyIEVhdHMsIElGb29kLCBSYXBweSBldGMuKSIpDQpjYXJ0ZWlyYSA9IGMoIlNpbSwgdGVtIGNhcnRlaXJhIGRlIHRyYWJhbGhvIGFzc2luYWRhIiwgIlNpbSwgw6kgc2Vydmlkb3IgcMO6YmxpY28gZXN0YXR1dMOhcmlvIikNCmVudHJlZ2Fkb3Jlc19zdXJ2ZXkgPSBzdWJzZXQocG5hZF9jb3ZpZDE5X25vdmVtYnJvLCBDMDA3QyAlaW4lIHByb2YgJiAhKEMwMDdCICVpbiUgY2FydGVpcmEpKQ0KDQojZ2VuZXJvDQp0b3RhbF9lbnRyZWdhZG9yZXNfc2V4byA9IHN2eXRvdGFsKH5BMDAzLCBlbnRyZWdhZG9yZXNfc3VydmV5LCBuYS5ybSA9IFQpDQoNCmtibCh0b3RhbF9lbnRyZWdhZG9yZXNfc2V4bykNCg0KI3Jhw6dhDQpyYWNhX2VudHJlZ2Fkb3Jlc19zdXJ2ZXkgPC0gcm91bmQoc3Z5dG90YWwofkEwMDQsIGVudHJlZ2Fkb3Jlc19zdXJ2ZXksIG5hLnJtID0gVCksMCkNCg0Ka2JsKHJhY2FfZW50cmVnYWRvcmVzX3N1cnZleSkNCg0KI2VzY29sYXJpZGFkZQ0KZXNjb2xhcmlkYWRlX2VudHJlZ2Fkb3Jlc19zdXJ2ZXkgPC0gcm91bmQoc3Z5dG90YWwofkEwMDUsIGVudHJlZ2Fkb3Jlc19zdXJ2ZXksIG5hLnJtID0gVCksMCkNCg0Ka2JsKGVzY29sYXJpZGFkZV9lbnRyZWdhZG9yZXNfc3VydmV5KQ0KYGBgDQoNCiMjIyBFeGVtcGxvcyBkZSBSZWxhdMOzcmlvcyBxdWUgcG9kZW0gc2VyIGdlcmFkb3MNCg0KUGVzcXVpc2EgY29tIHJlY29ydGUgYSBwYXJ0aXIgZGEgUE5BRENPVklEMTkgKG1hcsOnbyBhIG5vdmVtYnJvIGRlIDIwMjApDQoNCkVudHJlZ2Fkb3JlcyBwb3IgQXBwIC0gaHR0cHM6Ly93d3cudHJhYmFsaG9lbXBsYXRhZm9ybWEub3JnL3Bvc3QvcmVsYXQlQzMlQjNyaW8tZGUtcGVzcXVpc2EtMS1hbiVDMyVBMWxpc2UtZGEtcG5hZC1jb3ZpZDE5LXNvYnJlLWVudHJlZ2Fkb3Jlcy1wb3ItYXBwDQoNCk1vdG9yaXN0YXMgcG9yIEFwcCAtIGh0dHBzOi8vd3d3LnRyYWJhbGhvZW1wbGF0YWZvcm1hLm9yZy9wb3N0L3JlbGF0JUMzJUIzcmlvLWRlLXBlc3F1aXNhLTItYW4lQzMlQTFsaXNlLWRhLXBuYWQtY292aWQxOS1zb2JyZS1tb3RvcmlzdGFzLXBvci1hcHANCg0KPC9icj4NCjwvYnI+DQoNCg0KIyMgQW7DoWxpc2UgZGUgYW1vc3RyYXMgY29tcGxleGFzIGNvbSBvIHBhY290ZSAic3VydmV5Ig0KDQojIyMgRGVmaW5pbmRvIGEgb3DDp8OjbyBkZSBjb2RpZmljYcOnw6NvIGRvcyBjYXJhY3RlcmVzIGUgbGluZ3VhZ2VtDQpgYGB7ciBlY2hvPVQsIGV2YWw9VCwgcmVzdWx0cz0nYXNpcycsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTQsIGZpZy5hbGlnbj0nY2VudGVyJywgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgc2l6ZT0ndGlueSd9DQphdmlzbyA8LSBnZXRPcHRpb24oIndhcm4iKQ0Kb3B0aW9ucyh3YXJuPS0xKQ0Kb3B0aW9ucyhlbmNvZGluZz0ibGF0aW4xIikNCm9wdGlvbnMod2Fybj1hdmlzbykNCnJtKGF2aXNvKQ0KYGBgDQoNCiMjIyBEZWZpbmluZG8gYSBvcMOnw6NvIGRlIGV4aWJpw6fDo28gZGUgbsO6bWVyb3Mgc2VtIGV4cG9uZW5jaWFsIA0KYGBge3IgZWNobz1ULCBldmFsPVQsIHJlc3VsdHM9J2FzaXMnLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD00LCBmaWcuYWxpZ249J2NlbnRlcicsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHNpemU9J3RpbnknfQ0KYXZpc28gPC0gZ2V0T3B0aW9uKCJ3YXJuIikNCm9wdGlvbnMod2Fybj0tMSkNCm9wdGlvbnMoc2NpcGVuPTk5OSkNCm9wdGlvbnMod2Fybj1hdmlzbykNCnJtKGF2aXNvKQ0KYGBgDQoNCiMjIyBQYWNvdGVzIGV4aWdpZG9zDQpgYGB7ciBlY2hvPVQsIGV2YWw9VCwgcmVzdWx0cz0nYXNpcycsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTQsIGZpZy5hbGlnbj0nY2VudGVyJywgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgc2l6ZT0ndGlueSd9DQpsaWJyYXJ5KHN1cnZleSkNCmxpYnJhcnkodGlkeXZlcnNlKSANCmxpYnJhcnkoc3J2eXIpDQpsaWJyYXJ5KG5uZXQpDQpsaWJyYXJ5KHN0YXJnYXplcikNCmxpYnJhcnkoUE5BRGNJQkdFKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KYGBgDQoNCiMjIyBTZWxlY2lvbmFuZG8gYXMgdmFyacOhdmVpcyBkZSBpbnRlcmVzc2UNCg0KYGBge3IgZWNobz1ULCBldmFsPVQsIHJlc3VsdHM9J2FzaXMnLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD00LCBmaWcuYWxpZ249J2NlbnRlcicsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHNpemU9J3RpbnknfQ0KdmFyaWF2ZWlzX2RlX2ludGVyZXNzZSA8LSBjKCJWMjAwNyIsICMjIyBTZXhvDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlYyMDA5IiwgIyMjIElkYWRlIGRvIG1vcmFkb3IgbmEgZGF0YSBkZSByZWZlcsOqbmNpYQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWMjAxMCIsICMjIyBDb3Igb3UgcmHDp2ENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVjQwMzkiLCAjIyMgUXVhbnRhcyBob3JhcyAuLi4gdHJhYmFsaGF2YSBub3JtYWxtZW50ZSwgcG9yIHNlbWFuYSwgbmVzc2UgdHJhYmFsaG8gcHJpbmNpcGFsPw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWRDMwMDQiLCAjIyMgTsOtdmVsIGRlIGluc3RydcOnw6NvIG1haXMgZWxldmFkbyBhbGNhbsOnYWRvIChwZXNzb2FzIGRlIDUgYW5vcyBvdSBtYWlzIGRlIGlkYWRlKSBwYWRyb25pemFkbyBwYXJhIG8gRW5zaW5vIGZ1bmRhbWVudGFsIGNvbSBkdXJhw6fDo28gZGUgOSBhbm9zDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZENDAwMSIsICMjIyBDb25kacOnw6NvIGVtIHJlbGHDp8OjbyDDoCBmb3LDp2EgZGUgdHJhYmFsaG8gbmEgc2VtYW5hIGRlIHJlZmVyw6puY2lhIHBhcmEgcGVzc29hcyBkZSAxNCBhbm9zIG91IG1haXMgZGUgaWRhZGUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVkQ0MDAyIiwgIyMjIENvbmRpw6fDo28gZGUgb2N1cGHDp8OjbyBuYSBzZW1hbmEgZGUgcmVmZXLDqm5jaWEgcGFyYSBwZXNzb2FzIGRlIDE0IGFub3Mgb3UgbWFpcyBkZSBpZGFkZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWRDQwMDciLCAjIyMgUG9zacOnw6NvIG5hIG9jdXBhw6fDo28gbm8gdHJhYmFsaG8gcHJpbmNpcGFsIGRhIHNlbWFuYSBkZSByZWZlcsOqbmNpYSBwYXJhIHBlc3NvYXMgZGUgMTQgYW5vcyBvdSBtYWlzIGRlIGlkYWRlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZENDAxNiIpICMjIyBSZW5kaW1lbnRvIG1lbnNhbCBoYWJpdHVhbCBkbyB0cmFiYWxobyBwcmluY2lwYWwgcGFyYSBwZXNzb2FzIGRlIDE0IGFub3Mgb3UgbWFpcyBkZSBpZGFkZSAoYXBlbmFzIHBhcmEgcGVzc29hcyBxdWUgcmVjZWJlcmFtIGVtIGRpbmhlaXJvLCBwcm9kdXRvcyBvdSBtZXJjYWRvcmlhcyBubyB0cmFiYWxobyBwcmluY2lwYWwpDQpgYGANCg0KIyMjIEltcG9ydGFuZG8gb3MgbWljcm9kYWRvcyBkYSBQTkFEIENvbnTDrW51YSBjb20gbyBwbGFubyBhbW9zdHJhbCBhcGxpY2Fkbw0KDQpgYGB7ciBlY2hvPVQsIGV2YWw9VCwgcmVzdWx0cz0nYXNpcycsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTQsIGZpZy5hbGlnbj0nY2VudGVyJywgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgc2l6ZT0ndGlueSd9DQpwbmFkY18yMDE5IDwtIGdldF9wbmFkYyAoeWVhciA9IDIwMTksIGludGVydmlldyA9IDEsIHZhcnMgPSBjKHZhcmlhdmVpc19kZV9pbnRlcmVzc2UpLCBkZXNpZ24gPSBUUlVFKQ0KcG5hZGNfMjAxOSA8LSBhc19zdXJ2ZXlfZGVzaWduKHBuYWRjXzIwMTkpDQpgYGANCg0KIyMjIFNlbGVjaW9uYW5kbyBvcyB0cmFiYWxoYWRvcmVzIGFzc2FsYXJpYWRvcyBkZSAxOCBhIDY1IGFub3MgDQoNCmBgYHtyIGVjaG89VCwgZXZhbD1ULCByZXN1bHRzPSdhc2lzJywgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9NCwgZmlnLmFsaWduPSdjZW50ZXInLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBzaXplPSd0aW55J30NCmFzc2FsYXJpYWRvc18yMDE5IDwtIHN1YnNldChwbmFkY18yMDE5LCBWMjAwOSAlaW4lIGMoMTg6NjUpICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZENDAwNyA9PSAiRW1wcmVnYWRvIChpbmNsdXNpdmUgdHJhYmFsaGFkb3IgZG9tw6lzdGljbykiKQ0KDQpgYGANCg0KIyMjIENyaWFuZG8gYSB2YXJpw6F2ZWwgY29yIG91IHJhw6dhIGFncmVnYWRhIA0KDQpgYGB7ciBlY2hvPVQsIGV2YWw9VCwgcmVzdWx0cz0nYXNpcycsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTQsIGZpZy5hbGlnbj0nY2VudGVyJywgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgc2l6ZT0ndGlueSd9DQphc3NhbGFyaWFkb3NfMjAxOSA8LSBhc3NhbGFyaWFkb3NfMjAxOSAlPiUNCiAgbXV0YXRlKA0KICAgIHJhY2EgPSBmYWN0b3IoDQogICAgICBjYXNlX3doZW4oDQogICAgICAgIFYyMDEwID09ICJCcmFuY2EiIH4gIkJyYW5jb3MiLA0KICAgICAgICBWMjAxMCAlaW4lIGMoIlByZXRhIiwgIlBhcmRhIikgfiAiTmVncm9zIg0KICAgICAgKSwNCiAgICAgIGxldmVscyA9IGMoDQogICAgICAgICJCcmFuY29zIiwgIk5lZ3JvcyINCiAgICAgICkNCiAgICApDQogICkNCmBgYA0KDQojIyMgQ3JpYW5kbyBhIHZhcmnDoXZlbCBqb3JuYWRhcyBkZSB0cmFiYWxobyANCg0KYGBge3IgZWNobz1ULCBldmFsPVQsIHJlc3VsdHM9J2FzaXMnLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD00LCBmaWcuYWxpZ249J2NlbnRlcicsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHNpemU9J3RpbnknfSANCmFzc2FsYXJpYWRvc18yMDE5IDwtIGFzc2FsYXJpYWRvc18yMDE5ICU+JQ0KICBtdXRhdGUoDQogICAgam9ybmFkYXMgPSBmYWN0b3IoDQogICAgICBjYXNlX3doZW4oDQogICAgICAgIFY0MDM5IDw9IDM5IH4gIkpvcm5hZGFzIHBhcmNpYWlzIiwNCiAgICAgICAgVjQwMzkgJWluJSBjKDQwOjQ0KSB+ICJKb3JuYWRhcy1wYWRyw6NvIiwNCiAgICAgICAgVjQwMzkgPj0gNDUgfiAiSm9ybmFkYXMgZXhjZXNzaXZhcyINCiAgICAgICksDQogICAgICBsZXZlbHMgPSBjKA0KICAgICAgICAiSm9ybmFkYXMtcGFkcsOjbyIsICJKb3JuYWRhcyBwYXJjaWFpcyIsICJKb3JuYWRhcyBleGNlc3NpdmFzIg0KICAgICAgKQ0KICAgICkNCiAgKQ0KYGBgDQoNCiMjIyBFc3RpbWHDp8OjbyBkYSByZW5kYSBtw6lkaWEgDQoNCmBgYHtyIGVjaG89VCwgZXZhbD1ULCByZXN1bHRzPSdhc2lzJywgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9NCwgZmlnLmFsaWduPSdjZW50ZXInLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBzaXplPSd0aW55J30NCm1lZGlhX3JlbmRhIDwtIHN2eW1lYW4gKH5WRDQwMTYsIGFzc2FsYXJpYWRvc18yMDE5LCBuYS5ybSA9IFRSVUUpDQoNCmthYmxlKGFzLmRhdGEuZnJhbWUobWVkaWFfcmVuZGEpKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEYsIGxhdGV4X29wdGlvbnMgPSAic2NhbGVfZG93biIsIGJvb3RzdHJhcF9vcHRpb25zID0gYygiYm9yZGVyZWQiLCAiaG92ZXIiKSkNCg0KYGBgDQoNCiMjIyBDb2VmaWNpZW50ZSBkZSB2YXJpYcOnw6NvDQoNCmBgYHtyIGVjaG89VCwgZXZhbD1ULCByZXN1bHRzPSdhc2lzJywgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9NCwgZmlnLmFsaWduPSdjZW50ZXInLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBzaXplPSd0aW55J30NCmN2KG1lZGlhX3JlbmRhKQ0KDQprYWJsZShhcy5kYXRhLmZyYW1lKGN2KG1lZGlhX3JlbmRhKSkpICU+JSANCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRiwgbGF0ZXhfb3B0aW9ucyA9ICJzY2FsZV9kb3duIiwgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJib3JkZXJlZCIsICJob3ZlciIpKQ0KYGBgDQoNCiMjIyBJbnRlcnZhbG9zIGRlIGNvbmZpYW7Dp2ENCg0KYGBge3IgZWNobz1ULCBldmFsPVQsIHJlc3VsdHM9J2FzaXMnLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD00LCBmaWcuYWxpZ249J2NlbnRlcicsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHNpemU9J3RpbnknfQ0KY29uZmludChtZWRpYV9yZW5kYSkNCg0Ka2FibGUoYXMuZGF0YS5mcmFtZShjb25maW50KG1lZGlhX3JlbmRhKSkpICU+JSANCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRiwgbGF0ZXhfb3B0aW9ucyA9ICJzY2FsZV9kb3duIiwgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJib3JkZXJlZCIsICJob3ZlciIpKQ0KYGBgDQoNCiMjIyBFc3RpbWHDp8OjbyBkYSByZW5kYSBtw6lkaWEgcG9yIGdydXBvcyBzZWxlY2lvbmFkb3MNCg0KYGBge3IgZWNobz1ULCBldmFsPVQsIHJlc3VsdHM9J2FzaXMnLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD00LCBmaWcuYWxpZ249J2NlbnRlcicsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHNpemU9J3RpbnknfQ0KbWVkaWFfcmVuZGFfbXVsaGVyZXMgPC0gc3Z5bWVhbih+VkQ0MDE2LCBzdWJzZXQoYXNzYWxhcmlhZG9zXzIwMTksIFYyMDA3ID09ICJNdWxoZXIiKSwgbmEucm0gPSBUUlVFKSANCg0Ka2FibGUoYXMuZGF0YS5mcmFtZShtZWRpYV9yZW5kYV9tdWxoZXJlcykpICU+JSANCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRiwgbGF0ZXhfb3B0aW9ucyA9ICJzY2FsZV9kb3duIiwgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJib3JkZXJlZCIsICJob3ZlciIpKQ0KYGBgDQoNCmBgYHtyIGVjaG89VCwgZXZhbD1ULCByZXN1bHRzPSdhc2lzJywgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9NCwgZmlnLmFsaWduPSdjZW50ZXInLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBzaXplPSd0aW55J30NCm1lZGlhcmVuZGFfaG9tZW5zIDwtIHN2eW1lYW4oflZENDAxNiwgc3Vic2V0KGFzc2FsYXJpYWRvc18yMDE5LCBWMjAwNyA9PSAiSG9tZW0iKSwgbmEucm0gPSBUUlVFKSANCg0Ka2FibGUoYXMuZGF0YS5mcmFtZShtZWRpYXJlbmRhX2hvbWVucykpICU+JSANCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRiwgbGF0ZXhfb3B0aW9ucyA9ICJzY2FsZV9kb3duIiwgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJib3JkZXJlZCIsICJob3ZlciIpKQ0KYGBgDQoNCmBgYHtyIGVjaG89VCwgZXZhbD1ULCByZXN1bHRzPSdhc2lzJywgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9NCwgZmlnLmFsaWduPSdjZW50ZXInLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBzaXplPSd0aW55J30NCm1lZGlhX3JlbmRhX211bGhlcmVzX3N1cGVyaW9yIDwtIHN2eW1lYW4oflZENDAxNiwgc3Vic2V0KGFzc2FsYXJpYWRvc18yMDE5LCBWMjAwNyA9PSAiTXVsaGVyIiAmIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRDMwMDQgPT0gIlN1cGVyaW9yIGNvbXBsZXRvIiksIG5hLnJtID0gVFJVRSkgDQoNCmthYmxlKGFzLmRhdGEuZnJhbWUobWVkaWFfcmVuZGFfbXVsaGVyZXNfc3VwZXJpb3IpKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEYsIGxhdGV4X29wdGlvbnMgPSAic2NhbGVfZG93biIsIGJvb3RzdHJhcF9vcHRpb25zID0gYygiYm9yZGVyZWQiLCAiaG92ZXIiKSkNCmBgYA0KDQpgYGB7ciBlY2hvPVQsIGV2YWw9VCwgcmVzdWx0cz0nYXNpcycsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTQsIGZpZy5hbGlnbj0nY2VudGVyJywgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgc2l6ZT0ndGlueSd9DQptZWRpYXJlbmRhX2hvbWVuc19zdXBlcmlvciA8LSBzdnltZWFuKH5WRDQwMTYsIHN1YnNldChhc3NhbGFyaWFkb3NfMjAxOSwgVjIwMDcgPT0gIkhvbWVtIiAmIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRDMwMDQgPT0gIlN1cGVyaW9yIGNvbXBsZXRvIiksIG5hLnJtID0gVFJVRSkgDQoNCmthYmxlKGFzLmRhdGEuZnJhbWUobWVkaWFyZW5kYV9ob21lbnNfc3VwZXJpb3IpKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEYsIGxhdGV4X29wdGlvbnMgPSAic2NhbGVfZG93biIsIGJvb3RzdHJhcF9vcHRpb25zID0gYygiYm9yZGVyZWQiLCAiaG92ZXIiKSkNCmBgYA0KDQojIyMgRXN0aW1hw6fDo28gZGEgbWVkaWFuYSBlIGRvcyBxdWFudGlzIDEsIDUsIDEwLCAyNSwgNTAsIDc1LCA5MCwgOTUsIDk5DQoNCmBgYHtyIGVjaG89VCwgZXZhbD1ULCByZXN1bHRzPSdhc2lzJywgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9NCwgZmlnLmFsaWduPSdjZW50ZXInLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBzaXplPSd0aW55J30NCnF1YW50aXMgPSBzdnlxdWFudGlsZSh+VkQ0MDE2LCBhc3NhbGFyaWFkb3NfMjAxOSwgcXVhbnRpbGVzID0gYygwLjAxLCAwLjA1LCAwLjEwLCAwLjI1LCAwLjUwLCAwLjc1LCAwLjkwLCAwLjk1LCAwLjk5KSwgbmEucm0gPSBUUlVFKQ0KDQpjbGFzcyhxdWFudGlzKSA8LSBsaXN0KCJzdnlxdWFudGlsZSIsICJsaXN0IikNCg0Ka2FibGUoYXMuZGF0YS5mcmFtZShxdWFudGlzKSkgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGLCBsYXRleF9vcHRpb25zID0gInNjYWxlX2Rvd24iLCBib290c3RyYXBfb3B0aW9ucyA9IGMoImJvcmRlcmVkIiwgImhvdmVyIikpDQpgYGANCg0KIyMjIEZyZXF1w6puY2lhcyBhYnNvbHV0YSBlIHJlbGF0aXZhIGRhcyBqb3JuYWRhcyBkZSB0cmFiYWxobyANCg0KYGBge3IgZWNobz1ULCBldmFsPVQsIHJlc3VsdHM9J2FzaXMnLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD00LCBmaWcuYWxpZ249J2NlbnRlcicsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHNpemU9J3RpbnknfQ0KdG90YWxfam9ybmFkYXMgPC0gc3Z5dG90YWwgKH5qb3JuYWRhcywgYXNzYWxhcmlhZG9zXzIwMTksIG5hLnJtID0gVFJVRSkNCg0Ka2FibGUoYXMuZGF0YS5mcmFtZSh0b3RhbF9qb3JuYWRhcykpICU+JSANCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRiwgbGF0ZXhfb3B0aW9ucyA9ICJzY2FsZV9kb3duIiwgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJib3JkZXJlZCIsICJob3ZlciIpKQ0KYGBgDQoNCmBgYHtyIGVjaG89VCwgZXZhbD1ULCByZXN1bHRzPSdhc2lzJywgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9NCwgZmlnLmFsaWduPSdjZW50ZXInLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBzaXplPSd0aW55J30NCmZyZXFfam9ybmFkYXMgPC0gc3Z5bWVhbiAofmpvcm5hZGFzLCBhc3NhbGFyaWFkb3NfMjAxOSwgbmEucm0gPSBUUlVFKQ0KDQprYWJsZShhcy5kYXRhLmZyYW1lKGZyZXFfam9ybmFkYXMpKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEYsIGxhdGV4X29wdGlvbnMgPSAic2NhbGVfZG93biIsIGJvb3RzdHJhcF9vcHRpb25zID0gYygiYm9yZGVyZWQiLCAiaG92ZXIiKSkNCmBgYA0KDQojIyMgRnJlcXXDqm5jaWFzIGFic29sdXRhIGUgcmVsYXRpdmEgZGFzIGpvcm5hZGFzIGRlIHRyYWJhbGhvIHBvciBjb3Igb3UgcmHDp2EgYWdyZWdhZGEgDQoNCmBgYHtyIGVjaG89VCwgZXZhbD1ULCByZXN1bHRzPSdhc2lzJywgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9NCwgZmlnLmFsaWduPSdjZW50ZXInLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBzaXplPSd0aW55J30NCnRvdGFsX2pvcm5hZGFzX3JhY2EgPC0gc3Z5Ynkofmpvcm5hZGFzLCB+cmFjYSwgYXNzYWxhcmlhZG9zXzIwMTksIHN2eXRvdGFsLCBuYS5ybSA9IFRSVUUpDQoNCmthYmxlKGFzLmRhdGEuZnJhbWUodG90YWxfam9ybmFkYXNfcmFjYSkpICU+JSANCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRiwgbGF0ZXhfb3B0aW9ucyA9ICJzY2FsZV9kb3duIiwgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJib3JkZXJlZCIsICJob3ZlciIpKQ0KYGBgDQoNCmBgYHtyIGVjaG89VCwgZXZhbD1ULCByZXN1bHRzPSdhc2lzJywgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9NCwgZmlnLmFsaWduPSdjZW50ZXInLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBzaXplPSd0aW55J30NCmZyZXFfam9ybmFkYXNfcmFjYSA8LSBzdnlieSh+am9ybmFkYXMsIH5yYWNhLCBhc3NhbGFyaWFkb3NfMjAxOSwgc3Z5bWVhbiwgbmEucm0gPSBUUlVFKQ0KDQprYWJsZShhcy5kYXRhLmZyYW1lKGZyZXFfam9ybmFkYXNfcmFjYSkpICU+JSANCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRiwgbGF0ZXhfb3B0aW9ucyA9ICJzY2FsZV9kb3duIiwgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJib3JkZXJlZCIsICJob3ZlciIpKQ0KYGBgDQoNCmBgYHtyIGVjaG89VCwgZXZhbD1ULCByZXN1bHRzPSdhc2lzJywgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9NCwgZmlnLmFsaWduPSdjZW50ZXInLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBzaXplPSd0aW55J30NCnN2eWNoaXNxKH5qb3JuYWRhcyArIHJhY2EsIGFzc2FsYXJpYWRvc18yMDE5LCBzdGF0aXN0aWMgPSAiQ2hpc3EiKQ0KYGBgDQoNCk9icy46IHJlamVpdGEtc2UgYSBoaXDDs3Rlc2UgbnVsYSAoSDApLCB0ZXN0YWRhIGNvbnRyYSBhIGhpcMOzdGVzZSBhbHRlcm5hdGl2YSAoSDEpLCBwb2lzIG8gcC12YWxvciDDqSBlc3RhdGlzdGljYW1lbnRlIHNpZ25pZmljYXRpdm8gYW8gbsOtdmVsIGRlIDUlLiBQb3J0YW50bywgYXMgdmFyacOhdmVpcyBhc3NvY2lhZGFzIHPDo28gZXN0YXRpc3RpY2FtZW50ZSBpbmRlcGVuZGVudGVzLg0KDQojIyMgQ29uc3RydcOnw6NvIGRlIGluZGljYWRvcmVzIHNvY2lvZWNvbsO0bWljb3MNCg0KYGBge3IgZWNobz1ULCBldmFsPVQsIHJlc3VsdHM9J2FzaXMnLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD00LCBmaWcuYWxpZ249J2NlbnRlcicsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHNpemU9J3RpbnknfQ0KdHhkZXNvY3VwIDwtIHN2eXJhdGlvKH5WRDQwMDIgPT0gIlBlc3NvYXMgZGVzb2N1cGFkYXMiLH5WRDQwMDEgPT0gIlBlc3NvYXMgbmEgZm9yw6dhIGRlIHRyYWJhbGhvIiwgcG5hZGNfMjAxOSwgbmEucm0gPSBUKQ0KDQpjbGFzcyh0eGRlc29jdXApIDwtIGxpc3QoInN2eXJhdGlvIiwgImxpc3QiKQ0KDQprYWJsZShhcy5kYXRhLmZyYW1lKHR4ZGVzb2N1cCkpICU+JSANCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRiwgbGF0ZXhfb3B0aW9ucyA9ICJzY2FsZV9kb3duIiwgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJib3JkZXJlZCIsICJob3ZlciIpKQ0KYGBgDQoNCjwvYnI+DQo8L2JyPg0KDQojIyBSZWdyZXNzw6NvIGxpbmVhciBzaW1wbGVzIGUgbcO6bHRpcGxhDQoNCmBgYHtyLCBlY2hvID0gRn0NCnByaW50X291dHB1dCA8LSBmdW5jdGlvbihvdXRwdXQsIGNleCA9IDAuNCkgew0KICB0bXAgPC0gY2FwdHVyZS5vdXRwdXQob3V0cHV0KQ0KICBwbG90Lm5ldygpDQogIHRleHQoMCwgMSwgcGFzdGUodG1wLCBjb2xsYXBzZT0nXG4nKSwgYWRqID0gYygwLDEpLCBmYW1pbHkgPSAnbW9ubycsIGNleCA9IDAuNykNCiAgYm94KCkNCn0NCmBgYA0KDQpgYGB7ciBlY2hvPVQsIGV2YWw9VCwgcmVzdWx0cz0nYXNpcycsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTQsIGZpZy5hbGlnbj0nY2VudGVyJywgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgc2l6ZT0ndGlueSd9DQpsaWJyYXJ5KHNqUGxvdCkNCmxpYnJhcnkoc2ptaXNjKQ0KbGlicmFyeShzamxhYmVsbGVkKQ0KDQoNCmxpbmVhcl9zaW1wbGVzIDwtIGxtKFZENDAxNiB+IFYyMDA3LCBkYXRhID0gYXNzYWxhcmlhZG9zXzIwMTkpIA0KDQojUGFyYSB2aXN1YWxpemFyIG8gc3VtbWFyeSBubyBjb25zb2xlIGJhc3RhIHRpcmFyIG8gIiMiIGRhIGxpbmhhIHNlZ3VpbnRlDQojc3VtbWFyeShsaW5lYXJfc2ltcGxlcykNCg0KdGFiX21vZGVsKGxpbmVhcl9zaW1wbGVzKQ0KDQpgYGANCg0KYGBge3IgZWNobz1ULCBldmFsPVQsIHJlc3VsdHM9J2FzaXMnLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD00LCBmaWcuYWxpZ249J2NlbnRlcicsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHNpemU9J3RpbnknfQ0KbGluZWFyX211bHRpcGxhIDwtIGxtKFZENDAxNiB+IFYyMDA3ICsgVjIwMDkgKyByYWNhICsgVkQzMDA0LCBkYXRhID0gYXNzYWxhcmlhZG9zXzIwMTkpIA0KDQojUGFyYSB2aXN1YWxpemFyIG8gc3VtbWFyeSBubyBjb25zb2xlIGJhc3RhIHRpcmFyIG8gIiMiIGRhIGxpbmhhIHNlZ3VpbnRlDQojc3VtbWFyeShsaW5lYXJfbXVsdGlwbGEpDQoNCnRhYl9tb2RlbChsaW5lYXJfbXVsdGlwbGEpDQpgYGANCg0KYGBge3IgZWNobz1ULCBldmFsPVQsIHJlc3VsdHM9J2FzaXMnLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD00LCBmaWcuYWxpZ249J2NlbnRlcicsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHNpemU9J3RpbnknfQ0KDQojIEJhc3RhIHRpcmFyIG8gIiMiIGRhIGxpbmhhIHNlZ3VpbnRlIHBhcmEgZ2VyYXIgbyBhcnF1aXZvIGVtIC5kb2MNCg0KI3N0YXJnYXplcihsaW5lYXJfc2ltcGxlcywgbGluZWFyX211bHRpcGxhLCB0eXBlPSJodG1sIiwgb3V0PSJNb2RlbG9zX2xpbmVhcmVzLmRvYyIpDQpgYGANCg0KIyMgUmVncmVzc8OjbyBsb2fDrXN0aWNhIGJpbsOhcmlhIGUgbXVsdGlub21pYWwNCg0KYGBge3IgZWNobz1ULCBldmFsPVQsIHJlc3VsdHM9J2FzaXMnLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD00LCBmaWcuYWxpZ249J2NlbnRlcicsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHNpemU9J3RpbnknfQ0KbG9nX2JpbmFyaW8gPC0gZ2xtKFZENDAwMiB+IFYyMDA3ICsgVjIwMDkgKyByYWNhICsgVkQzMDA0LCBkYXRhID0gYXNzYWxhcmlhZG9zXzIwMTksIGZhbWlseSA9ICJiaW5vbWlhbCIpDQoNCiNQYXJhIHZpc3VhbGl6YXIgbyBzdW1tYXJ5IG5vIGNvbnNvbGUgYmFzdGEgdGlyYXIgbyAiIyIgZGEgbGluaGEgc2VndWludGUNCiNzdW1tYXJ5KGxvZ19iaW5hcmlvKQ0KDQp0YWJfbW9kZWwobG9nX2JpbmFyaW8pDQpgYGANCg0KYGBge3IgZWNobz1ULCBldmFsPVQsIHJlc3VsdHM9J2FzaXMnLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD00LCBmaWcuYWxpZ249J2NlbnRlcicsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHNpemU9J3RpbnknfQ0KDQojZXhwKGNvZWYobG9nX2JpbmFyaW8pKQ0KDQprYWJsZShleHAoY29lZihsb2dfYmluYXJpbykpKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEYsIGxhdGV4X29wdGlvbnMgPSAic2NhbGVfZG93biIsIGJvb3RzdHJhcF9vcHRpb25zID0gYygiYm9yZGVyZWQiLCAiaG92ZXIiKSkNCmBgYA0KDQpgYGB7ciBlY2hvPVQsIGV2YWw9VCwgcmVzdWx0cz0nYXNpcycsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTQsIGZpZy5hbGlnbj0nY2VudGVyJywgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgc2l6ZT0ndGlueSd9DQoNCiMgQmFzdGEgdGlyYXIgbyAiIyIgZGEgbGluaGEgc2VndWludGUgcGFyYSBnZXJhciBvIGFycXVpdm8gZW0gLmRvYw0KDQojc3RhcmdhemVyKGxvZ19iaW5hcmlvLCBhcHBseS5jb2VmID0gZXhwLCB0eXBlPSJodG1sIiwgb3V0PSJNb2RlbG9fbG9nX2JpbmFyaW8uZG9jIikNCmBgYA0KDQpgYGB7ciBlY2hvPVQsIGV2YWw9VCwgcmVzdWx0cz0nYXNpcycsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTQsIGZpZy5hbGlnbj0nY2VudGVyJywgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgc2l6ZT0ndGlueSd9DQojbG9nX211bHRpbm9taWFsIDwtIG11bHRpbm9tIChqb3JuYWRhcyB+IFYyMDA3ICsgVjIwMDkgKyByYWNhICsgVkQzMDA0LCBkYXRhID0gYXNzYWxhcmlhZG9zXzIwMTkpDQoNCnByaW50X291dHB1dChsb2dfbXVsdGlub21pYWwgPC0gbXVsdGlub20gKGpvcm5hZGFzIH4gVjIwMDcgKyBWMjAwOSArIHJhY2EgKyBWRDMwMDQsIGRhdGEgPSBhc3NhbGFyaWFkb3NfMjAxOSkpDQoNCiNQYXJhIHZpc3VhbGl6YXIgbyBzdW1tYXJ5IG5vIGNvbnNvbGUgYmFzdGEgdGlyYXIgbyAiIyIgZGEgbGluaGEgc2VndWludGUNCiNzdW1tYXJ5KGxvZ19tdWx0aW5vbWlhbCkNCg0KdGFiX21vZGVsKGxvZ19tdWx0aW5vbWlhbCkNCmBgYA0KDQpgYGB7ciBlY2hvPVQsIGV2YWw9VCwgcmVzdWx0cz0nYXNpcycsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTQsIGZpZy5hbGlnbj0nY2VudGVyJywgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgc2l6ZT0ndGlueSd9DQoNCiNleHAoY29lZihsb2dfbXVsdGlub21pYWwpKQ0KDQprYWJsZShleHAoY29lZihsb2dfbXVsdGlub21pYWwpKSkgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGLCBsYXRleF9vcHRpb25zID0gInNjYWxlX2Rvd24iLCBib290c3RyYXBfb3B0aW9ucyA9IGMoImJvcmRlcmVkIiwgImhvdmVyIikpDQpgYGANCg0KYGBge3IgZWNobz1ULCBldmFsPVQsIHJlc3VsdHM9J2FzaXMnLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD00LCBmaWcuYWxpZ249J2NlbnRlcicsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHNpemU9J3RpbnknfQ0KDQojIEJhc3RhIHRpcmFyIG8gIiMiIGRhIGxpbmhhIHNlZ3VpbnRlIHBhcmEgZ2VyYXIgbyBhcnF1aXZvIGVtIC5kb2MNCg0KI3N0YXJnYXplcihsb2dfbXVsdGlub21pYWwsIGFwcGx5LmNvZWYgPSBleHAsIHR5cGU9Imh0bWwiLCBvdXQ9Ik1vZGVsb19sb2dfbXVsdGlub21pYWwuZG9jIikNCmBgYA0KDQojIE9icmlnYWRvIQ0KDQoqICoqUmFwaGFlbCBTYW50b3MgTGFwYSoqDQogICsgRW1haWw6IHJhcGhhZWxzYW50b3NsYXBhQGdtYWlsLmNvbQ0KICANCiogKipKb8OjbyBQZWRybyBJbsOhY2lvIFBlbGVqYSoqDQogICsgRW1haWw6IHNoYW1ibGVzcHBlZHJvQGdtYWlsLmNvbQ==