Introdução
Contexto
O documento a seguir detalha o passo a passo da apuração da
Variação da Despesa Assistencial (VDA) do ano de 2021
sobre o ano de 2020. Espera-se que esse documento possa auxiliar o
público a replicar o cálculo da VDA 2021 e acompanhar a evolução da
mesma ao longo do ano.
A VDA é um dos principais componentes do cálculo do Índice de
Reajuste de Planos Individuais (IRPI), que estabelece o teto
máximo para o reajuste anual por variação de custos das mensalidades dos
planos de saúde de contratação individual ou familiar. A metodologia de
cálculo do IRPI e da própria VDA foi estabelecida pela RN
nº 441/2018 e está detalhada no Espaço
do Consumidor no site da ANS.
A VDA expressa a variação da despesa assistencial média por
beneficiário dos contratos dos planos individuais de cobertura
médico-hospitalar regulamentados pela Lei nº 9.656, de 1998. A VDA, para
fins do cálculo do IRPI, tem como base as despesas assistenciais
incorridas de janeiro a dezembro e a média de beneficiários ao longo dos
12 meses de janeiro a dezembro nos dois anos imediatamente anteriores ao
ano de divulgação do índice de reajuste.
A medida de tendência central do setor de saúde suplementar é a média
da VDA das operadoras ponderada pelo número de beneficiários do período
mais recente, conforme consignada no Anexo II da Resolução
Normativa - RN nº 441, de 19 de dezembro de 2018. A fórmula para o
cálculo da média ponderada da VDA das operadoras do setor em determinado
ano é:
\[VDA_{p} = \sum_{i=1}^{n}
\left[\left(\displaystyle\frac{\frac{DA_{p}}{Ben_{p}}}{\frac{DA_{p-1}}{Ben_{p-1}}}
- 1\right) \times Ben_{p}\right]\div\sum_{i=1}^{n} Ben_{p}\]
Onde:
i = Operadora na base de cálculo
n = Todas as operadoras na base de cálculo
p = Período de janeiro a dezembro do ano calendário anterior ao início
da aplicação do IRPI
DA = Despesa assistencial em carteira própria acumulada ao fim do
período
Ben = Média mensal de beneficiários em carteira própria ao longo do
período
Três conjuntos de dados do setor de saúde suplementar foram
utilizados para extrair informações de despesa
assistencial, quantidade de beneficiários com vínculos
ativos e características das operadoras de planos de
saúde. Esses conjuntos de dados podem ser acessadas pelo portal
de dados abertos da Agência Nacional de Saúde Suplementar (ANS). Os
links específicos para cada base utilizada neste cálculo estão
disponíveis na respectiva seção de “Limpeza e Tratamento de
Dados”.
Setup
Desenvolvido em R versão 4.1.3 e RStudio 2022.02.0 Build 443 for
Windows
# Setup (bibliotecas, funções e variáveis globais) =============================
library(data.table)
library(tidyverse)
library(dtplyr)
library(lubridate)
# "Desliga" notação científica.
options(scipen=999)
# função para exclusão de valores extremos por boxplot 1.5xIQR
trim.df <- function(df, metrica){
df |> filter((metrica > quantile(metrica, 0.25) - 1.5 * IQR(metrica))
& (metrica < quantile(metrica, 0.75) + 1.5 * IQR(metrica)))
}
# função para gerar resumo de estatísticas descritivas
statsVDA <- function(df){
df |>
summarise(n_ops = n_distinct(cd_ops),
benef = sum(benefm),
mediaP = weighted.mean(vda, w = benefm),
min = min(vda),
q1 = quantile(vda, p = .25, names = F),
median = median(vda),
q3 = quantile(vda, p = .75, names = F),
max = max(vda),
dp = sd(vda),
media = mean(vda),
.groups = 'drop') |>
mutate(across( c(mediaP:media), ~ round(.x, 2) ))
}
# período de análise
(periodo <- c(make_date(2020,01,01), make_date(2021,12,01)))
Limpeza e tratamento dos dados
Operadoras
As características das operadoras são obtidas do Sistema de Cadastro
de Operadoras (CADOP).
Dois conjuntos de dados estão disponíveis no Portal de Dados Abertos
da ANS (https://dados.gov.br/organization/agencia-nacional-de-saude-suplementar-ans):
Esses conjuntos de dados incluem características como o razão social,
modalidade da operadora, assim como as datas de início (data do registro
da operadora junto à ANS) e fim de operação (data do cancelamento do
registro).
O código a seguir faz a leitura dos arquivos *.csv:
cadop <- fread(paste0("http://ftp.dadosabertos.ans.gov.br/FTP/PDA/",
"operadoras_de_plano_de_saude_ativas/",
"Relatorio_cadop.csv")) |>
lazy_dt() |>
mutate(Data_Descredenciamento = "", Motivo_do_Descredenciamento = "") |>
mutate(across(everything(), ~as.character(.))) |>
as_tibble() |>
rbind(
fread(paste0("http://ftp.dadosabertos.ans.gov.br/FTP/PDA/",
"operadoras_de_plano_de_saude_canceladas/",
"Relatorio_cadop_canceladas.csv")) |>
lazy_dt() |>
mutate(across(everything(), ~as.character(.))) |>
as_tibble()
) |>
rename_with(tolower) |>
mutate(
dt_registro = dmy(data_registro_ans),
dt_cancelamento = dmy(data_descredenciamento),
modalidade = if_else(modalidade == 'Seguradora Especializada em Saúde', 'Seguradora',
modalidade),
cd_ops = as.integer(registro_ans),
# remove tab e quebra de linha:
razao_social = str_replace_all(str_trim(razao_social), "[\r\n]", " ")
) |>
select(cd_ops, razao_social, modalidade, dt_registro, dt_cancelamento) |>
as_tibble()
Para o cálculo da VDA no IRPI selecionam-se as operadoras
médico-hospitalares e são desconsideradas
- Operadoras que iniciaram operação entre janeiro de 2020 e dezembro
de 2021.
- Operadoras que tiveram registro cancelado até dezembro de 2021.
- Operadoras com ressalvas nas demonstrações financeiras protocoladas
junto à ANS referentes a 2020 ou 2021.
O código a seguir filtra operadoras médico-hospitalares e identifica
operadoras a serem desconsideradas na base de cálculo da VDA:
ressalvas <- fread("_datasets/ressalvas.csv", encoding = 'UTF-8') |>
distinct(cd_ops) |>
mutate(lg_ressalva = 1L) |>
as_tibble()
cadop <- cadop |>
# apenas operadoras médico-hospitalares
filter(modalidade %in% c('Autogestão', 'Cooperativa Médica', 'Filantropia',
'Medicina de Grupo', 'Seguradora')) |>
# marca operadoras em fim de operação e/ou início de operação
mutate(lg_cancelada = if_else(year(dt_cancelamento) <= year(periodo[2]) & !is.na(dt_cancelamento),1L,
0L),
lg_nova_ops = if_else(year(dt_registro) >= year(periodo[1]),1L,
0L)) |>
select(cd_ops, razao_social, modalidade, lg_cancelada, lg_nova_ops) |>
left_join(ressalvas, by = 'cd_ops') |>
mutate(lg_ressalva = if_else(is.na(lg_ressalva), 0L, lg_ressalva))
remove(ressalvas)
Despesa Assistencial
As informações das despesas incorridas na prestação de assistência
médico-hospitalar são extraídas das Demonstrações Contábeis informadas
pelas operadoras no Documento de Informações Periódicas das Operadoras
de Planos de Assistência à Saúde (DIOPS). O prazo de envio das
informações ao DIOPS se encerra em 31 de março.
As demonstrações financeiras publicadas seguem os critérios do Plano
de Contas Padrão da ANS para as operadoras de planos de saúde, conforme
estabelecido pelas Resoluções Normativas RN
nº 528, de 29 de abril de 2022 e RN
nº 435, de 23 de novembro de 2018.
A base de dados do DIOPS referente ao ano de 2021 pode ser acessada
no Portal de Dados Abertos da ANS (https://dados.gov.br/organization/agencia-nacional-de-saude-suplementar-ans),
conjunto de dados Demonstrações
Contábeis. Esse conjunto de dados detalha o saldo acumulado em
reais ao final de cada trimestre nas contas contábeis de cada
operadora.
A base de dados do DIOPS referente ao ano de 2020 foi atualizada para
contemplar as retificações feitas ao longo do ano por operadoras com
ressalvas. Essa base atualizada está disponível no Anexo da Nota Técnica
nº 1/2022/COREF/GEFAP/DIRAD-DIPRO/DIPRO (doc SEI nº 23583642) e no sítio
oficial da agência (https://www.gov.br/ans/pt-br) em Portal
ANS > Espaço do Consumidor > Reajuste > Individual ou Familiar
> Metodologia de Cálculo > Reajuste 2022
O código a seguir faz a leitura dos arquivos *.csv:
files <- list.files(path = "_datasets/diops", full.names = T)
diops <- rbindlist(
lapply(files, fread,
dec=",", drop='DESCRICAO', colClasses = c(CD_CONTA_CONTABIL="character"))) |>
lazy_dt() |>
rename_with(tolower) |>
filter(nchar(cd_conta_contabil) == 9, # filtra contas contábeis de 9 dígitos
vl_saldo_final != 0) |> # exclui linhas sem saldo
mutate(id_calendar = ymd(data) + months(2)) |> # altera para último mês do trimestre
rename(cd_ops = reg_ans) |>
select(cd_ops, cd_conta_contabil, id_calendar, vl_saldo_final) |>
as_tibble()
remove(files)
O alvo da análise é a despesa assistencial incorrida pela operadora
em carteira própria. Os valores de Despesa Assistencial em Carteira
Própria correspondem à totalização dos saldos dos seguintes grupos de
contas contábeis do Plano de Contas Padrão da ANS:
411X1 |
Eventos/ Sinistros Conhecidos ou Avisados de
Assistência a Saúde Medico Hospitalar |
(+) |
411X1XX8 |
Corresponsabilidade Assumida |
(-) |
31171 |
(-) Contraprestações de Corresponsabilidade Cedida de
Assistência Médico-Hospitalar |
(-) |
Dessa forma, o valor da despesa assistencial em carteira própria
inclui valores de Eventos/ Sinistros conhecidos ou avisados e valores de
gastos de corresponsabilidade de carteira própria cedida a
terceiros (contas contábeis redutoras de receita 31171). Valores de
corresponsabilidade assumida são desconsiderados, pois
referem-se a despesas assistenciais incorridas em atendimento a carteira
de terceiros (outras operadoras).
O código a seguir totaliza a despesa assistencial por trimestre,
operadora e tipo de carteira:
diops <- diops |>
filter( # filtra contas contábeis relevantes para a análise
# despesa / corresponsabilidade assumida médico-hospitalar
(substr(cd_conta_contabil, 1, 3) == '411' & substr(cd_conta_contabil, 5, 5) == '1')
# receita / corresponsabilidade cedida médico-hospitalar
| (substr(cd_conta_contabil, 1, 5) == '31111' | substr(cd_conta_contabil, 1, 5) == '31171')
) |>
mutate(
gr_cc = case_when(
substr(cd_conta_contabil, 1, 1) == '4' ~ 'eventos',
substr(cd_conta_contabil, 1, 5) == '31111' ~ 'receita',
substr(cd_conta_contabil, 1, 5) == '31171' ~ 'corr_cedida', # redutora de receita
TRUE ~ 'EXCLUIR'),
) |>
group_by(cd_ops, cd_conta_contabil, id_calendar, gr_cc) |>
summarise(vl_saldo_final = sum(vl_saldo_final),
.groups = 'drop') |>
pivot_wider(names_from = gr_cc, values_from = vl_saldo_final, values_fill = 0) |>
# identifica tipos de plano pela conta contábil
mutate(
vigencia = case_when(
substr(cd_conta_contabil, 8, 8) == '8' ~ 'corr_assumida',
substr(cd_conta_contabil, 8, 8) %in% c('1','3','5') ~ 'A',
substr(cd_conta_contabil, 8, 8) %in% c('2','4','6') ~ 'P',
TRUE ~ 'EXCLUIR'),
contratacao = case_when(
substr(cd_conta_contabil, 8, 8) == '8' ~ 'corr_assumida',
substr(cd_conta_contabil, 8, 8) %in% c('1','2') ~ 'Individual',
substr(cd_conta_contabil, 8, 8) %in% c('3','4') ~ 'Adesão',
substr(cd_conta_contabil, 8, 8) %in% c('5','6') ~ 'Empresarial',
TRUE ~ 'EXCLUIR'),
financiamento = case_when(
substr(cd_conta_contabil, 8, 8) == '8' ~ 'corr_assumida',
substr(cd_conta_contabil, 6, 6) == '1' ~ 'Pre-estabelecido',
substr(cd_conta_contabil, 6, 6) == '2' ~ 'Pós-estabelecido',
TRUE ~ 'EXCLUIR'),
) |>
filter(vigencia != 'corr_assumida') |> # exclui corr assumida
mutate(despesa = eventos - corr_cedida,
contratacao = as.factor(contratacao)) |> # inclui corr cedida na despesa
group_by(cd_ops, vigencia, contratacao, financiamento, id_calendar) |>
summarise(receita = sum(receita),
despesa = sum(despesa),
.groups = 'drop')
Filtra segmentos alvo da análise e totaliza por trimestre, operadora
e tipo de plano:
diops <- diops |>
# filtra planos novos (posteriores à Lei) com formação de preço pré-estabelecida
filter(
vigencia == 'P',
financiamento == 'Pre-estabelecido',
) |>
select(-vigencia, -financiamento) |>
# filtra operadoras médico-hospitalares
inner_join(select(cadop,cd_ops), by="cd_ops")
Beneficiários (semi-aditivo)
As informações de vínculos ativos de beneficiários são obtidas
através do Sistema de Informação de Beneficiários (SIB), que é
atualizado mensalmente.
A base de dados do SIB referente aos anos de 2020 e 2021 pode ser
acessada no Portal de Dados Abertos da ANS (https://dados.gov.br/organization/agencia-nacional-de-saude-suplementar-ans),
conjunto de dados Beneficiários
por operadora e tipo de carteira para cálculo da VDA no site da
ANS. Esse conjunto de dados informa a quantidade de vínculos ativos de
beneficiários em planos de saúde médico-hospitalar mês a mês por
operadora e tipo de plano.
O código a seguir faz a leitura dos arquivos publicados no portal de
dados abertos:
sib <- fread(paste0("http://ftp.dadosabertos.ans.gov.br/FTP/PDA/",
"beneficiarios_vinculos_tipo_contratacao_vda/",
"Beneficiarios_operadora_e_carteira.csv"),
encoding = "UTF-8") |>
lazy_dt() |>
rename_with(tolower) |>
mutate(id_calendar = make_date(as.integer(mes/100), mes - (as.integer(mes/100)) * 100, 1)) |>
filter(id_calendar >= periodo[1], id_calendar <= periodo[2], # período de análise
nr_benef != 0, !is.na(nr_benef)) |> # exclui zeros e nulos
rename(
cd_ops = cd_operadora,
vigencia = vigencia_plano, contratacao = gr_contratacao, financiamento = tipo_financiamento,
benef = nr_benef
) |>
mutate(contratacao = case_when(
contratacao == 'Coletivo empresarial' ~ 'Empresarial',
contratacao == 'Coletivo por adesão' ~ 'Adesão',
contratacao == 'Individual ou familiar' ~ 'Individual',
TRUE ~ 'Não identificado')) |>
select(cd_ops, cobertura,
vigencia, contratacao, financiamento,
id_calendar, benef) |>
as_tibble()
Filtra segmentos alvo da análise e totaliza por mês, operadora e tipo
de plano.
sib <- sib |>
filter(
cobertura == "Médico-hospitalar",
vigencia == 'P', # planos novos (posteriores à Lei)
financiamento != 'Pós-estabelecido', # formação de preço pré-estabelecida
contratacao %in% c('Empresarial', 'Individual', 'Adesão')) |>
# Filtra operadoras médico-hospitalares
inner_join(select(cadop,cd_ops), by="cd_ops") |>
group_by(cd_ops, contratacao, id_calendar) |>
summarise(benef = sum(benef), .groups = 'drop')
Calcula média de beneficiários acumulada no ano por operadora e tipo
de contratação:
sib <- sib |>
arrange(cd_ops, contratacao, id_calendar) |>
# cria coluna do ano
mutate(id_calendar = ymd(id_calendar),
ano = as.integer(year(id_calendar))) |>
# calcula a média por operadora, contratacao e ano
group_by(cd_ops, contratacao, ano) |>
mutate(
# NOTA: a função só calcula para períodos com uma sequência ininterrupta de 12 meses
benefm = RcppRoll::roll_meanr(benef, n = 12, fill = NA_real_, na.rm = FALSE),
mes = as.integer(month(id_calendar)),
contratacao = as.factor(contratacao),
) |>
ungroup() |>
filter(mes == 12, !is.na(benefm)) |> # seleciona o(s) período(s) alvo da análise
select(-benef, -ano, -mes)
Cálculo da VDA
Despesa por Beneficiário
Essa seção gera a base de despesa assistencial e beneficiários e
calcula a despesa por beneficiário.
A despesa por beneficiário é a despesa assistencial da
carteira própria de uma operadora incorrida em certo período, dividida
pela média de vínculos ativos de beneficiários ao longo do
mesmo período. Essa métrica representa o principal componente de custo
de um plano de saúde e está expressa de forma a permitir compará-la
entre operadoras por tipo de carteira e acompanhar sua evolução ao longo
do tempo.
Nota:
Para facilitar a comparabilidade e acompanhamento da despesa por
beneficiário ao longo do tempo, é possível normalizar a métrica
dividindo-a pelo número de meses do período sem impacto sobre a VDA.
A base de cálculo da VDA considera apenas:
O código a seguir consolida os dados de operadoras, beneficiários e
despesas, filtra as observações relevantes e calcula a Despesa por
Beneficiário (média mensal):
df.vda <- diops |>
select(-receita) |>
inner_join(sib, by=c('cd_ops', 'contratacao', 'id_calendar')) |>
inner_join(cadop, by='cd_ops') |>
filter(
lg_cancelada == 0,
lg_nova_ops == 0,
lg_ressalva == 0,
despesa > 0
) |>
select(-c(lg_cancelada, lg_nova_ops, lg_ressalva)) |>
relocate(c(razao_social, modalidade), .after = cd_ops) |>
arrange(cd_ops, contratacao, id_calendar) |>
mutate(dpb = if_else(benefm > 0, despesa/ benefm / month(id_calendar), NA_real_))
Visualização gráfica da distribuição da despesa por beneficiário das
operadoras.
Nota: Excluíram-se os valores atípicos pelo método de boxplot
1,5xIQR para que fosse possível visualizar a distribuição da grande
maioria dos dados.
VDA por operadora
A VDA de uma operadora é a variação da despesa por beneficiário desta
operadora sobre o mesmo período do ano anterior, conforme a seguinte
fórmula:
\[VDA_{ip} =
\displaystyle\frac{\frac{DA_{ip}}{Ben_{ip}}}{\frac{DA_{i\
\left(p-1\right)}}{Ben_{i\ \left(p-1\right)}}} - 1\]
Onde:
i = Operadora na base de cálculo
p = Ano calendário anterior ao início da aplicação do IRPI
DA = Despesa assistencial em carteira própria acumulada ao fim do
período
Ben = Média mensal de beneficiários em carteira própria ao longo do
período
O código a seguir calcula a VDA por operadora:
df.vda <- df.vda |>
arrange(cd_ops, contratacao, id_calendar) |>
mutate(vda = if_else(lag(cd_ops) == cd_ops & lag(contratacao) == contratacao
& year(lag(id_calendar)) == year(id_calendar) - 1, (dpb/lag(dpb) - 1) * 100,
NA_real_)) |>
filter(!is.na(vda)) |>
select(-id_calendar)
VDA do setor
Estatísticas descritivas da base de cálculo da VDA.
Visualização gráfica da distribuição da VDA das operadoras através de
um gráfico boxplot.
O código a seguir identifica valores atípicos pela metodologia
BoxPlot 1,5xIQR e calcula a proporção de valores atípicos por
carteira:
# === IDENTIFICA OUTLIERS === CRITÉRIO: BOX-PLOT 1.5x ===
df.vda <- df.vda |>
group_by(contratacao) |>
mutate(lg_outlier = if_else(vda >= (quantile(vda, 0.75, names = F) + 1.5 * IQR(vda))
| vda <= (quantile(vda, 0.25, names = F) - 1.5 * IQR(vda)), 1L,
0L)) |>
ungroup()
`summarise()` has grouped output by 'contratacao'. You can override using the `.groups` argument.
Boxplot da distribuição da VDA após a exclusão dos valores
atípicos.
Histograma da distribuição da VDA sem os valores atípicos.
A metodologia de cálculo da VDA do setor para aplicação como
componente do IRPI adota a VDA média ponderada pela quantidade de
beneficiários no ano mais recente, após a exclusão dos valores atípicos.
A seguir, apresenta-se a média ponderada da VDA (mediaP) e demais
estatísticas descritivas da sua distribuição em cada carteira.
Base de cálculo
Gera a base completa que reúne todas as observações de receita,
despesa e beneficiários informadas pelas operadoras para os dois anos e
o cálculo da VDA por operadora.
sib2 <- sib |>
mutate(ano = if_else(year(id_calendar)==year(periodo[1]),"ano1","ano2")) |>
select(-id_calendar) |>
rename(ben = benefm) |>
pivot_wider(names_from = ano, values_from = ben, values_fill = 0, names_prefix = "ben_") |>
mutate(
# marca obs sem sequencia ininterrupta de beneficiarios
lg_excl_benef = if_else(ben_ano1 < 1 | ben_ano2 < 1, 1L, 0L)
)
diops2 <- diops |>
mutate(ano = if_else(year(id_calendar)==year(periodo[1]),"ano1","ano2")) |>
select(-id_calendar) |>
pivot_wider(names_from = ano, values_from = c(despesa, receita), values_fill = 0) |>
# marca obs que não têm despesa nos dois anos
mutate(lg_excl_despesa = if_else(despesa_ano1 <= 0 | despesa_ano2 <= 0, 1L,
0L))
df.vda2 <- df.vda |>
select(cd_ops, contratacao, vda, lg_outlier)
df.reunida <- sib2 |>
full_join(diops2, by=c('cd_ops', 'contratacao')) |>
mutate(dpb_ano1 = if_else(despesa_ano1 > 0 & ben_ano1 > 0, round(despesa_ano1 / ben_ano1 / 12, 2),
NA_real_),
dpb_ano2 = if_else(despesa_ano2 > 0 & ben_ano2 > 0, round(despesa_ano2 / ben_ano2 / 12, 2),
NA_real_)) |>
full_join(df.vda2, by=c('cd_ops', 'contratacao')) |>
inner_join(cadop, by = 'cd_ops') |>
relocate(razao_social:lg_ressalva, .after = cd_ops) |>
select(cd_ops,razao_social,modalidade,contratacao,
starts_with('lg_'),
starts_with('receita'),
starts_with('despesa'),
starts_with('ben'),
everything()) |>
mutate(across(receita_ano1:ben_ano2, ~if_else(.x==0,NA_real_,.x))) |>
mutate(across(starts_with("lg_excl"), ~if_else(is.na(.x),1L,.x)))
remove(diops2, sib2, df.vda2)
Glossário
Beneficiário: Indivíduo (pessoa física) beneficiário
de cobertura de plano privado de assistência à saúde e consumidor de
serviços de assistência à saúde.
Contratante: Pessoa física ou jurídica responsável
pela contratação do plano privado de assistência à saúde.
Operadora: Pessoa jurídica constituída sob a
modalidade de sociedade civil ou comercial, cooperativa ou entidade de
autogestão, que opere produto, serviço ou contrato de plano privado de
assistência à saúde.
Plano Privado de Assistência à Saúde: Prestação
continuada de serviços ou cobertura de custos assistenciais a preço pré
ou pós estabelecido, por prazo indeterminado, com a finalidade de
garantir, sem limite financeiro, a assistência à saúde, pela faculdade
de acesso e atendimento por profissionais ou serviços de saúde,
livremente escolhidos, integrantes ou não de rede credenciada,
contratada ou referenciada, visando a assistência médica, hospitalar e
odontológica, a ser paga integral ou parcialmente às expensas da
operadora contratada, mediante reembolso ou pagamento direto ao
prestador, por conta e ordem do consumidor.
Tipo de contratação:
Individual ou Familiar, oferece cobertura da atenção
prestada para a livre adesão de beneficiários, pessoas naturais, com ou
sem grupo familiar
Coletivo empresarial, quando a contratação é feita por
meio de pessoa jurídica para a cobertura de pessoas a ela vinculadas por
relação empregatícia ou estatutária
Coletivo por adesão, quando a contratação é feita por
meio de pessoa jurídica de caráter profissional, classista ou setorial
(e.g. conselhos profissionais, entidades de classe, sindicatos,
cooperativas, etc.)
Tipo de financiamento:
Pré-estabelecido, quando o valor da contraprestação
pecuniária é pré-fixado mediante negociação anual, caracterizando
contrato de risco.
Pós-estabelecido, quando o valor da contraprestação
pecuniária é estabelecido após a ocorrência dos procedimentos de
assistência à saúde.
LS0tDQp0aXRsZTogIlZhcmlhw6fDo28gZGEgRGVzcGVzYSBBc3Npc3RlbmNpYWwgKFZEQSkiDQphdXRob3I6ICJBZ8OqbmNpYSBOYWNpb25hbCBkZSBTYcO6ZGUgU3VwbGVtZW50YXIiDQpkYXRlOiAiQXR1YWxpemFkbyBlbSBgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkLyVtLyVZJylgIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgd29yZF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogJzMnDQotLS0NCg0KKioqDQoNCiMjIEludHJvZHXDp8Ojbw0KDQo8YnI+DQoNCiMjIyBDb250ZXh0bw0KDQpPIGRvY3VtZW50byBhIHNlZ3VpciBkZXRhbGhhIG8gcGFzc28gYSBwYXNzbyBkYSBhcHVyYcOnw6NvIGRhICoqVmFyaWHDp8OjbyBkYSBEZXNwZXNhIEFzc2lzdGVuY2lhbCAoVkRBKSoqIGRvIGFubyBkZSBgciB5ZWFyKHBlcmlvZG9bMl0pYCBzb2JyZSBvIGFubyBkZSBgciB5ZWFyKHBlcmlvZG9bMV0pYC4gRXNwZXJhLXNlIHF1ZSBlc3NlIGRvY3VtZW50byBwb3NzYSBhdXhpbGlhciBvIHDDumJsaWNvIGEgcmVwbGljYXIgbyBjw6FsY3VsbyBkYSBWREEgYHIgeWVhcihwZXJpb2RvWzJdKWAgZSBhY29tcGFuaGFyIGEgZXZvbHXDp8OjbyBkYSBtZXNtYSBhbyBsb25nbyBkbyBhbm8uICAgIA0KDQpBIFZEQSDDqSB1bSBkb3MgcHJpbmNpcGFpcyBjb21wb25lbnRlcyBkbyBjw6FsY3VsbyBkbyAqKsONbmRpY2UgZGUgUmVhanVzdGUgZGUgUGxhbm9zIEluZGl2aWR1YWlzIChJUlBJKSoqLCBxdWUgZXN0YWJlbGVjZSBvIHRldG8gbcOheGltbyBwYXJhIG8gcmVhanVzdGUgYW51YWwgcG9yIHZhcmlhw6fDo28gZGUgY3VzdG9zIGRhcyBtZW5zYWxpZGFkZXMgZG9zIHBsYW5vcyBkZSBzYcO6ZGUgZGUgY29udHJhdGHDp8OjbyBpbmRpdmlkdWFsIG91IGZhbWlsaWFyLiAgQSBtZXRvZG9sb2dpYSBkZSBjw6FsY3VsbyBkbyBJUlBJIGUgZGEgcHLDs3ByaWEgVkRBIGZvaSBlc3RhYmVsZWNpZGEgcGVsYSBbUk4gbsK6IDQ0MS8yMDE4XShodHRwczovL3d3dy5hbnMuZ292LmJyL2NvbXBvbmVudC9sZWdpc2xhY2FvLz92aWV3PWxlZ2lzbGFjYW8mdGFzaz1UZXh0b0xlaSZmb3JtYXQ9cmF3JmlkPU16WTJNZz09KSBlIGVzdMOhIGRldGFsaGFkYSBubyBbRXNwYcOnbyBkbyBDb25zdW1pZG9yXShodHRwczovL3d3dy5nb3YuYnIvYW5zL3B0LWJyL2Fzc3VudG9zL2NvbnN1bWlkb3IvcmVhanVzdGUtdmFyaWFjYW8tZGUtbWVuc2FsaWRhZGUvcmVhanVzdGUtYW51YWwtZGUtcGxhbm9zLWluZGl2aWR1YWlzLWZhbWlsaWFyZXMtMS9tZXRvZG9sb2dpYS1kZS1jYWxjdWxvKSBubyBzaXRlIGRhIEFOUy4gICAgICAgICAgICAgIA0KDQpBIFZEQSBleHByZXNzYSBhIHZhcmlhw6fDo28gZGEgZGVzcGVzYSBhc3Npc3RlbmNpYWwgbcOpZGlhIHBvciBiZW5lZmljacOhcmlvIGRvcyBjb250cmF0b3MgZG9zIHBsYW5vcyBpbmRpdmlkdWFpcyBkZSBjb2JlcnR1cmEgbcOpZGljby1ob3NwaXRhbGFyIHJlZ3VsYW1lbnRhZG9zIHBlbGEgTGVpIG7CuiA5LjY1NiwgZGUgMTk5OC4gQSBWREEsIHBhcmEgZmlucyBkbyBjw6FsY3VsbyBkbyBJUlBJLCB0ZW0gY29tbyBiYXNlIGFzIGRlc3Blc2FzIGFzc2lzdGVuY2lhaXMgaW5jb3JyaWRhcyBkZSBqYW5laXJvIGEgZGV6ZW1icm8gZSBhIG3DqWRpYSBkZSBiZW5lZmljacOhcmlvcyBhbyBsb25nbyBkb3MgMTIgbWVzZXMgZGUgamFuZWlybyBhIGRlemVtYnJvIG5vcyBkb2lzIGFub3MgaW1lZGlhdGFtZW50ZSBhbnRlcmlvcmVzIGFvIGFubyBkZSBkaXZ1bGdhw6fDo28gZG8gw61uZGljZSBkZSByZWFqdXN0ZS4gICAgDQoNCkEgbWVkaWRhIGRlIHRlbmTDqm5jaWEgY2VudHJhbCBkbyBzZXRvciBkZSBzYcO6ZGUgc3VwbGVtZW50YXIgw6kgYSBtw6lkaWEgZGEgVkRBIGRhcyBvcGVyYWRvcmFzIHBvbmRlcmFkYSBwZWxvIG7Dum1lcm8gZGUgYmVuZWZpY2nDoXJpb3MgZG8gcGVyw61vZG8gbWFpcyByZWNlbnRlLCBjb25mb3JtZSBjb25zaWduYWRhIG5vIEFuZXhvIElJIGRhIFtSZXNvbHXDp8OjbyBOb3JtYXRpdmEgLSBSTiBuwrogNDQxLCBkZSAxOSBkZSBkZXplbWJybyBkZSAyMDE4XShodHRwOi8vd3d3LmFucy5nb3YuYnIvY29tcG9uZW50L2xlZ2lzbGFjYW8vP3ZpZXc9bGVnaXNsYWNhbyZ0YXNrPVRleHRvTGVpJmZvcm1hdD1yYXcmaWQ9TXpZMk1nPT0pLiBBIGbDs3JtdWxhIHBhcmEgbyBjw6FsY3VsbyBkYSBtw6lkaWEgcG9uZGVyYWRhIGRhIFZEQSBkYXMgb3BlcmFkb3JhcyBkbyBzZXRvciBlbSBkZXRlcm1pbmFkbyBhbm8gw6k6ICAgICANCjxicj4NCiAgICANCg0KJCRWREFfe3B9ID0gXHN1bV97aT0xfV57bn0gXGxlZnRbXGxlZnQoXGRpc3BsYXlzdHlsZVxmcmFje1xmcmFje0RBX3twfX17QmVuX3twfX19e1xmcmFje0RBX3twLTF9fXtCZW5fe3AtMX19fSAtIDFccmlnaHQpIFx0aW1lcyBCZW5fe3B9XHJpZ2h0XVxkaXZcc3VtX3tpPTF9XntufSBCZW5fe3B9JCQNCjxicj4NCjxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LWJsb2NrIGFsZXJ0LWluZm8iPg0KPGI+T25kZTo8L2I+ICAgICANCiAgICBpID0gT3BlcmFkb3JhIG5hIGJhc2UgZGUgY8OhbGN1bG8gICAgICAgIA0KICAgIG4gPSBUb2RhcyBhcyBvcGVyYWRvcmFzIG5hIGJhc2UgZGUgY8OhbGN1bG8gICAgICAgICANCiAgICBwID0gUGVyw61vZG8gZGUgamFuZWlybyBhIGRlemVtYnJvIGRvIGFubyBjYWxlbmTDoXJpbyBhbnRlcmlvciBhbyBpbsOtY2lvIGRhIGFwbGljYcOnw6NvIGRvIElSUEkgICAgDQogICAgREEgPSBEZXNwZXNhIGFzc2lzdGVuY2lhbCBlbSBjYXJ0ZWlyYSBwcsOzcHJpYSBhY3VtdWxhZGEgYW8gZmltIGRvIHBlcsOtb2RvICAgICANCiAgICBCZW4gPSBNw6lkaWEgbWVuc2FsIGRlIGJlbmVmaWNpw6FyaW9zIGVtIGNhcnRlaXJhIHByw7NwcmlhIGFvIGxvbmdvIGRvIHBlcsOtb2RvICAgICANCjwvZGl2Pg0KDQo8YnI+DQpUcsOqcyBjb25qdW50b3MgZGUgZGFkb3MgZG8gc2V0b3IgZGUgc2HDumRlIHN1cGxlbWVudGFyIGZvcmFtIHV0aWxpemFkb3MgcGFyYSBleHRyYWlyIGluZm9ybWHDp8O1ZXMgZGUgKipkZXNwZXNhIGFzc2lzdGVuY2lhbCoqLCAqKnF1YW50aWRhZGUgZGUgYmVuZWZpY2nDoXJpb3MgY29tIHbDrW5jdWxvcyBhdGl2b3MqKiBlICoqY2FyYWN0ZXLDrXN0aWNhcyBkYXMgb3BlcmFkb3JhcyBkZSBwbGFub3MgZGUgc2HDumRlKiouIEVzc2VzIGNvbmp1bnRvcyBkZSBkYWRvcyBwb2RlbSBzZXIgYWNlc3NhZGFzIHBlbG8gW3BvcnRhbCBkZSBkYWRvcyBhYmVydG9zIGRhIEFnw6puY2lhIE5hY2lvbmFsIGRlIFNhw7pkZSBTdXBsZW1lbnRhciAoQU5TKV0oaHR0cHM6Ly9kYWRvcy5nb3YuYnIvb3JnYW5pemF0aW9uL2FnZW5jaWEtbmFjaW9uYWwtZGUtc2F1ZGUtc3VwbGVtZW50YXItYW5zP3BhZ2U9MSkuIE9zIGxpbmtzIGVzcGVjw61maWNvcyBwYXJhIGNhZGEgYmFzZSB1dGlsaXphZGEgbmVzdGUgY8OhbGN1bG8gZXN0w6NvIGRpc3BvbsOtdmVpcyBuYSByZXNwZWN0aXZhIHNlw6fDo28gZGUgKiJMaW1wZXphIGUgVHJhdGFtZW50byBkZSBEYWRvcyIqLiAgICAgICANCiAgICANCjxicj4NCg0KIyMjIFNldHVwICAgDQoNCipEZXNlbnZvbHZpZG8gZW0gUiB2ZXJzw6NvIDQuMS4zIGUgUlN0dWRpbyAyMDIyLjAyLjAgQnVpbGQgNDQzIGZvciBXaW5kb3dzKg0KDQpgYGB7ciBzZXR1cCwgZWNobz1GQUxTRX0NCiMgTGltcGEgbyBnbG9iYWwgZW52aXJvbm1lbnQNCnJtKGxpc3Q9bHMoKSkNCmxpYnJhcnkoUkNvbG9yQnJld2VyKQ0KYGBgDQoNCmBgYHtyfQ0KIyBTZXR1cCAoYmlibGlvdGVjYXMsIGZ1bsOnw7VlcyBlIHZhcmnDoXZlaXMgZ2xvYmFpcykgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCmxpYnJhcnkoZGF0YS50YWJsZSkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShkdHBseXIpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCg0KIyAiRGVzbGlnYSIgbm90YcOnw6NvIGNpZW50w61maWNhLiANCm9wdGlvbnMoc2NpcGVuPTk5OSkNCg0KIyBmdW7Dp8OjbyBwYXJhIGV4Y2x1c8OjbyBkZSB2YWxvcmVzIGV4dHJlbW9zIHBvciBib3hwbG90IDEuNXhJUVINCnRyaW0uZGYgPC0gZnVuY3Rpb24oZGYsIG1ldHJpY2Epew0KICBkZiB8PiBmaWx0ZXIoKG1ldHJpY2EgPiBxdWFudGlsZShtZXRyaWNhLCAwLjI1KSAtIDEuNSAqIElRUihtZXRyaWNhKSkgDQogICAgICAgICAgICAgICAgJiAobWV0cmljYSA8IHF1YW50aWxlKG1ldHJpY2EsIDAuNzUpICsgMS41ICogSVFSKG1ldHJpY2EpKSkNCn0NCg0KIyBmdW7Dp8OjbyBwYXJhIGdlcmFyIHJlc3VtbyBkZSBlc3RhdMOtc3RpY2FzIGRlc2NyaXRpdmFzDQpzdGF0c1ZEQSA8LSBmdW5jdGlvbihkZil7DQogIGRmIHw+IA0KICAgIHN1bW1hcmlzZShuX29wcyA9IG5fZGlzdGluY3QoY2Rfb3BzKSwNCiAgICAgICAgICAgICAgYmVuZWYgPSBzdW0oYmVuZWZtKSwNCiAgICAgICAgICAgICAgbWVkaWFQID0gd2VpZ2h0ZWQubWVhbih2ZGEsIHcgPSBiZW5lZm0pLA0KICAgICAgICAgICAgICBtaW4gPSBtaW4odmRhKSwNCiAgICAgICAgICAgICAgcTEgPSBxdWFudGlsZSh2ZGEsIHAgPSAuMjUsIG5hbWVzID0gRiksDQogICAgICAgICAgICAgIG1lZGlhbiA9IG1lZGlhbih2ZGEpLA0KICAgICAgICAgICAgICBxMyA9IHF1YW50aWxlKHZkYSwgcCA9IC43NSwgbmFtZXMgPSBGKSwNCiAgICAgICAgICAgICAgbWF4ID0gbWF4KHZkYSksDQogICAgICAgICAgICAgIGRwID0gc2QodmRhKSwNCiAgICAgICAgICAgICAgbWVkaWEgPSBtZWFuKHZkYSksDQogICAgICAgICAgICAgIC5ncm91cHMgPSAnZHJvcCcpIHw+DQogICAgbXV0YXRlKGFjcm9zcyggYyhtZWRpYVA6bWVkaWEpLCB+IHJvdW5kKC54LCAyKSApKQ0KfQ0KDQojIHBlcsOtb2RvIGRlIGFuw6FsaXNlDQoocGVyaW9kbyA8LSBjKG1ha2VfZGF0ZSgyMDIwLDAxLDAxKSwgbWFrZV9kYXRlKDIwMjEsMTIsMDEpKSkNCmBgYA0KDQoNCioqKg0KDQojIyBMaW1wZXphIGUgdHJhdGFtZW50byBkb3MgZGFkb3MNCg0KPGJyPg0KDQojIyMgT3BlcmFkb3Jhcw0KDQpBcyBjYXJhY3RlcsOtc3RpY2FzIGRhcyBvcGVyYWRvcmFzIHPDo28gb2J0aWRhcyBkbyBTaXN0ZW1hIGRlIENhZGFzdHJvIGRlIE9wZXJhZG9yYXMgKENBRE9QKS4gICAgICAgDQoNCkRvaXMgY29uanVudG9zIGRlIGRhZG9zIGVzdMOjbyBkaXNwb27DrXZlaXMgbm8gUG9ydGFsIGRlIERhZG9zIEFiZXJ0b3MgZGEgQU5TIChodHRwczovL2RhZG9zLmdvdi5ici9vcmdhbml6YXRpb24vYWdlbmNpYS1uYWNpb25hbC1kZS1zYXVkZS1zdXBsZW1lbnRhci1hbnMpOiANCg0KKiBbT3BlcmFkb3JhcyBkZSBwbGFub3MgZGUgc2HDumRlIEF0aXZhc10oaHR0cHM6Ly9kYWRvcy5nb3YuYnIvZGF0YXNldC9vcGVyYWRvcmFzLWRlLXBsYW5vcy1wcml2YWRvcy1kZS1zYXVkZSkgZSANCiogW09wZXJhZG9yYXMgZGUgcGxhbm9zIGRlIHNhw7pkZSBDYW5jZWxhZGFzXShodHRwczovL2RhZG9zLmdvdi5ici9kYXRhc2V0L29wZXJhZG9yYXMtZGUtcGxhbm9zLWRlLXNhdWRlLWNvbS1yZWdpc3Ryby1jYW5jZWxhZG8pLiANCg0KRXNzZXMgY29uanVudG9zIGRlIGRhZG9zIGluY2x1ZW0gY2FyYWN0ZXLDrXN0aWNhcyBjb21vIG8gcmF6w6NvIHNvY2lhbCwgbW9kYWxpZGFkZSBkYSBvcGVyYWRvcmEsIGFzc2ltIGNvbW8gYXMgZGF0YXMgZGUgaW7DrWNpbyAoZGF0YSBkbyByZWdpc3RybyBkYSBvcGVyYWRvcmEganVudG8gw6AgQU5TKSBlIGZpbSBkZSBvcGVyYcOnw6NvIChkYXRhIGRvIGNhbmNlbGFtZW50byBkbyByZWdpc3RybykuICAgICANCg0KTyBjw7NkaWdvIGEgc2VndWlyIGZheiBhIGxlaXR1cmEgZG9zIGFycXVpdm9zICouY3N2Og0KDQpgYGB7cn0NCmNhZG9wIDwtIGZyZWFkKHBhc3RlMCgiaHR0cDovL2Z0cC5kYWRvc2FiZXJ0b3MuYW5zLmdvdi5ici9GVFAvUERBLyIsDQogICAgICAgICAgICAgICAgICAgICAgIm9wZXJhZG9yYXNfZGVfcGxhbm9fZGVfc2F1ZGVfYXRpdmFzLyIsDQogICAgICAgICAgICAgICAgICAgICAgIlJlbGF0b3Jpb19jYWRvcC5jc3YiKSkgfD4NCiAgbGF6eV9kdCgpIHw+DQogIG11dGF0ZShEYXRhX0Rlc2NyZWRlbmNpYW1lbnRvID0gIiIsIE1vdGl2b19kb19EZXNjcmVkZW5jaWFtZW50byA9ICIiKSB8Pg0KICBtdXRhdGUoYWNyb3NzKGV2ZXJ5dGhpbmcoKSwgfmFzLmNoYXJhY3RlciguKSkpIHw+DQogIGFzX3RpYmJsZSgpIHw+DQogIHJiaW5kKA0KICAgIGZyZWFkKHBhc3RlMCgiaHR0cDovL2Z0cC5kYWRvc2FiZXJ0b3MuYW5zLmdvdi5ici9GVFAvUERBLyIsDQogICAgICAgICAgICAgICAgICJvcGVyYWRvcmFzX2RlX3BsYW5vX2RlX3NhdWRlX2NhbmNlbGFkYXMvIiwNCiAgICAgICAgICAgICAgICAgIlJlbGF0b3Jpb19jYWRvcF9jYW5jZWxhZGFzLmNzdiIpKSB8Pg0KICAgICAgbGF6eV9kdCgpIHw+DQogICAgICBtdXRhdGUoYWNyb3NzKGV2ZXJ5dGhpbmcoKSwgfmFzLmNoYXJhY3RlciguKSkpIHw+DQogICAgICBhc190aWJibGUoKQ0KICApIHw+ICANCiAgcmVuYW1lX3dpdGgodG9sb3dlcikgfD4gDQogIG11dGF0ZSgNCiAgICBkdF9yZWdpc3RybyA9IGRteShkYXRhX3JlZ2lzdHJvX2FucyksIA0KICAgIGR0X2NhbmNlbGFtZW50byA9IGRteShkYXRhX2Rlc2NyZWRlbmNpYW1lbnRvKSwNCiAgICBtb2RhbGlkYWRlID0gaWZfZWxzZShtb2RhbGlkYWRlID09ICdTZWd1cmFkb3JhIEVzcGVjaWFsaXphZGEgZW0gU2HDumRlJywgJ1NlZ3VyYWRvcmEnLA0KICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGFsaWRhZGUpLA0KICAgIGNkX29wcyA9IGFzLmludGVnZXIocmVnaXN0cm9fYW5zKSwNCiAgICAjIHJlbW92ZSB0YWIgZSBxdWVicmEgZGUgbGluaGE6DQogICAgcmF6YW9fc29jaWFsID0gc3RyX3JlcGxhY2VfYWxsKHN0cl90cmltKHJhemFvX3NvY2lhbCksICJbXHJcbl0iLCAiICIpIA0KICApIHw+IA0KICBzZWxlY3QoY2Rfb3BzLCByYXphb19zb2NpYWwsIG1vZGFsaWRhZGUsIGR0X3JlZ2lzdHJvLCBkdF9jYW5jZWxhbWVudG8pIHw+DQogIGFzX3RpYmJsZSgpIA0KYGBgDQoNCg0KPGJyPg0KDQpQYXJhIG8gY8OhbGN1bG8gZGEgVkRBIG5vIElSUEkgc2VsZWNpb25hbS1zZSBhcyBvcGVyYWRvcmFzICptw6lkaWNvLWhvc3BpdGFsYXJlcyogZSBzw6NvIGRlc2NvbnNpZGVyYWRhcyAgICAgIA0KDQoxLiBPcGVyYWRvcmFzIHF1ZSBpbmljaWFyYW0gb3BlcmHDp8OjbyBlbnRyZSBqYW5laXJvIGRlIGByIHllYXIocGVyaW9kb1sxXSlgIGUgZGV6ZW1icm8gZGUgYHIgeWVhcihwZXJpb2RvWzJdKWAuDQoyLiBPcGVyYWRvcmFzIHF1ZSB0aXZlcmFtIHJlZ2lzdHJvIGNhbmNlbGFkbyBhdMOpIGRlemVtYnJvIGRlIGByIHllYXIocGVyaW9kb1syXSlgLg0KMy4gT3BlcmFkb3JhcyBjb20gcmVzc2FsdmFzIG5hcyBkZW1vbnN0cmHDp8O1ZXMgZmluYW5jZWlyYXMgcHJvdG9jb2xhZGFzIGp1bnRvIMOgIEFOUyByZWZlcmVudGVzIGEgYHIgeWVhcihwZXJpb2RvWzFdKWAgb3UgYHIgeWVhcihwZXJpb2RvWzJdKWAuDQoNCk8gY8OzZGlnbyBhIHNlZ3VpciBmaWx0cmEgb3BlcmFkb3JhcyBtw6lkaWNvLWhvc3BpdGFsYXJlcyBlIGlkZW50aWZpY2Egb3BlcmFkb3JhcyBhIHNlcmVtIGRlc2NvbnNpZGVyYWRhcyBuYSBiYXNlIGRlIGPDoWxjdWxvIGRhIFZEQToNCg0KYGBge3J9DQpyZXNzYWx2YXMgPC0gZnJlYWQoIl9kYXRhc2V0cy9yZXNzYWx2YXMuY3N2IiwgZW5jb2RpbmcgPSAnVVRGLTgnKSB8PiANCiAgZGlzdGluY3QoY2Rfb3BzKSB8PiANCiAgbXV0YXRlKGxnX3Jlc3NhbHZhID0gMUwpIHw+IA0KICBhc190aWJibGUoKQ0KDQpjYWRvcCA8LSBjYWRvcCB8PiANCiAgIyBhcGVuYXMgb3BlcmFkb3JhcyBtw6lkaWNvLWhvc3BpdGFsYXJlcw0KICBmaWx0ZXIobW9kYWxpZGFkZSAlaW4lIGMoJ0F1dG9nZXN0w6NvJywgJ0Nvb3BlcmF0aXZhIE3DqWRpY2EnLCAnRmlsYW50cm9waWEnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgJ01lZGljaW5hIGRlIEdydXBvJywgJ1NlZ3VyYWRvcmEnKSkgfD4gIA0KICAjIG1hcmNhIG9wZXJhZG9yYXMgZW0gZmltIGRlIG9wZXJhw6fDo28gZS9vdSBpbsOtY2lvIGRlIG9wZXJhw6fDo28NCiAgbXV0YXRlKGxnX2NhbmNlbGFkYSA9IGlmX2Vsc2UoeWVhcihkdF9jYW5jZWxhbWVudG8pIDw9IHllYXIocGVyaW9kb1syXSkgJiAhaXMubmEoZHRfY2FuY2VsYW1lbnRvKSwxTCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMEwpLCANCiAgICAgICAgIGxnX25vdmFfb3BzICA9IGlmX2Vsc2UoeWVhcihkdF9yZWdpc3RybykgPj0geWVhcihwZXJpb2RvWzFdKSwxTCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDBMKSkgfD4gDQogIHNlbGVjdChjZF9vcHMsIHJhemFvX3NvY2lhbCwgbW9kYWxpZGFkZSwgbGdfY2FuY2VsYWRhLCBsZ19ub3ZhX29wcykgfD4NCiAgbGVmdF9qb2luKHJlc3NhbHZhcywgYnkgPSAnY2Rfb3BzJykgfD4gDQogIG11dGF0ZShsZ19yZXNzYWx2YSA9IGlmX2Vsc2UoaXMubmEobGdfcmVzc2FsdmEpLCAwTCwgbGdfcmVzc2FsdmEpKQ0KDQpyZW1vdmUocmVzc2FsdmFzKQ0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRX0NCmNhZG9wIHw+IHN1bW1hcmlzZSgNCiAgbl9vcHMgPSBuX2Rpc3RpbmN0KGNkX29wcyksDQogIG5fY2FuY2VsYWRhcyA9IHN1bShsZ19jYW5jZWxhZGEpLA0KICBuX25vdmFfb3BzID0gc3VtKGxnX25vdmFfb3BzKSwNCiAgbl9yZXNzYWx2YXMgPSBzdW0obGdfcmVzc2FsdmEpDQopIHw+IHBpdm90X2xvbmdlcihldmVyeXRoaW5nKCkpDQpgYGANCg0KDQo8YnI+DQoNCiMjIyBEZXNwZXNhIEFzc2lzdGVuY2lhbA0KDQpBcyBpbmZvcm1hw6fDtWVzIGRhcyBkZXNwZXNhcyBpbmNvcnJpZGFzIG5hIHByZXN0YcOnw6NvIGRlIGFzc2lzdMOqbmNpYSBtw6lkaWNvLWhvc3BpdGFsYXIgc8OjbyBleHRyYcOtZGFzIGRhcyBEZW1vbnN0cmHDp8O1ZXMgQ29udMOhYmVpcyBpbmZvcm1hZGFzIHBlbGFzIG9wZXJhZG9yYXMgbm8gRG9jdW1lbnRvIGRlIEluZm9ybWHDp8O1ZXMgUGVyacOzZGljYXMgZGFzIE9wZXJhZG9yYXMgZGUgUGxhbm9zIGRlIEFzc2lzdMOqbmNpYSDDoCBTYcO6ZGUgKERJT1BTKS4gIE8gcHJhem8gZGUgZW52aW8gZGFzIGluZm9ybWHDp8O1ZXMgYW8gRElPUFMgc2UgZW5jZXJyYSBlbSAzMSBkZSBtYXLDp28uIA0KDQpBcyBkZW1vbnN0cmHDp8O1ZXMgZmluYW5jZWlyYXMgcHVibGljYWRhcyBzZWd1ZW0gb3MgY3JpdMOpcmlvcyBkbyBQbGFubyBkZSBDb250YXMgUGFkcsOjbyBkYSBBTlMgcGFyYSBhcyBvcGVyYWRvcmFzIGRlIHBsYW5vcyBkZSBzYcO6ZGUsIGNvbmZvcm1lIGVzdGFiZWxlY2lkbyBwZWxhcyBSZXNvbHXDp8O1ZXMgTm9ybWF0aXZhcyBbUk4gbsK6IDUyOCwgZGUgMjkgZGUgYWJyaWwgZGUgMjAyMl0oaHR0cHM6Ly9wZXNxdWlzYS5pbi5nb3YuYnIvaW1wcmVuc2EvanNwL3Zpc3VhbGl6YS9pbmRleC5qc3A/ZGF0YT0wNi8wNS8yMDIyJmpvcm5hbD01MTUmcGFnaW5hPTEwMykgZSBbUk4gbsK6IDQzNSwgZGUgMjMgZGUgbm92ZW1icm8gZGUgMjAxOF0oaHR0cDovL3d3dy5hbnMuZ292LmJyL2NvbXBvbmVudC9sZWdpc2xhY2FvLz92aWV3PWxlZ2lzbGFjYW8mdGFzaz1UZXh0b0xlaSZmb3JtYXQ9cmF3JmlkPU16WTBNZz09KS4gDQoNCkEgYmFzZSBkZSBkYWRvcyBkbyBESU9QUyByZWZlcmVudGUgYW8gYW5vIGRlIGByIHllYXIocGVyaW9kb1syXSlgIHBvZGUgc2VyIGFjZXNzYWRhIG5vIFBvcnRhbCBkZSBEYWRvcyBBYmVydG9zIGRhIEFOUyAoaHR0cHM6Ly9kYWRvcy5nb3YuYnIvb3JnYW5pemF0aW9uL2FnZW5jaWEtbmFjaW9uYWwtZGUtc2F1ZGUtc3VwbGVtZW50YXItYW5zKSwgY29uanVudG8gZGUgZGFkb3MgWypEZW1vbnN0cmHDp8O1ZXMgQ29udMOhYmVpcypdKGh0dHBzOi8vZGFkb3MuZ292LmJyL2RhdGFzZXQvaHR0cC13d3ctYW5zLWdvdi1ici1wZXJmaWwtZG8tc2V0b3ItZGFkb3MtYWJlcnRvcy1kYWRvcy1hYmVydG9zLWRpc3Bvbml2ZWlzLW4zKS4gRXNzZSBjb25qdW50byBkZSBkYWRvcyBkZXRhbGhhIG8gc2FsZG8gYWN1bXVsYWRvIGVtIHJlYWlzIGFvIGZpbmFsIGRlIGNhZGEgdHJpbWVzdHJlIG5hcyBjb250YXMgY29udMOhYmVpcyBkZSBjYWRhIG9wZXJhZG9yYS4gICAgDQoNCkEgYmFzZSBkZSBkYWRvcyBkbyBESU9QUyByZWZlcmVudGUgYW8gYW5vIGRlIGByIHllYXIocGVyaW9kb1sxXSlgIGZvaSBhdHVhbGl6YWRhIHBhcmEgY29udGVtcGxhciBhcyByZXRpZmljYcOnw7VlcyBmZWl0YXMgYW8gbG9uZ28gZG8gYW5vIHBvciBvcGVyYWRvcmFzIGNvbSByZXNzYWx2YXMuIEVzc2EgYmFzZSBhdHVhbGl6YWRhIGVzdMOhIGRpc3BvbsOtdmVsIG5vIEFuZXhvIGRhIE5vdGEgVMOpY25pY2EgbsK6IDEvMjAyMi9DT1JFRi9HRUZBUC9ESVJBRC1ESVBSTy9ESVBSTyAoZG9jIFNFSSBuwrogMjM1ODM2NDIpIGUgbm8gc8OtdGlvIG9maWNpYWwgZGEgYWfDqm5jaWEgKGh0dHBzOi8vd3d3Lmdvdi5ici9hbnMvcHQtYnIpIGVtIFtQb3J0YWwgQU5TID4gRXNwYcOnbyBkbyBDb25zdW1pZG9yID4gUmVhanVzdGUgPiBJbmRpdmlkdWFsIG91IEZhbWlsaWFyID4gTWV0b2RvbG9naWEgZGUgQ8OhbGN1bG8gPiBSZWFqdXN0ZSAyMDIyXShodHRwczovL3d3dy5nb3YuYnIvYW5zL3B0LWJyL2Fzc3VudG9zL2NvbnN1bWlkb3IvcmVhanVzdGUtdmFyaWFjYW8tZGUtbWVuc2FsaWRhZGUvcmVhanVzdGUtYW51YWwtZGUtcGxhbm9zLWluZGl2aWR1YWlzLWZhbWlsaWFyZXMtMS9tZXRvZG9sb2dpYS1kZS1jYWxjdWxvKQ0KDQpPIGPDs2RpZ28gYSBzZWd1aXIgZmF6IGEgbGVpdHVyYSBkb3MgYXJxdWl2b3MgKi5jc3Y6DQoNCmBgYHtyfQ0KZmlsZXMgPC0gbGlzdC5maWxlcyhwYXRoID0gIl9kYXRhc2V0cy9kaW9wcyIsIGZ1bGwubmFtZXMgPSBUKQ0KZGlvcHMgPC0gcmJpbmRsaXN0KA0KICBsYXBwbHkoZmlsZXMsIGZyZWFkLCANCiAgICAgICAgIGRlYz0iLCIsIGRyb3A9J0RFU0NSSUNBTycsIGNvbENsYXNzZXMgPSBjKENEX0NPTlRBX0NPTlRBQklMPSJjaGFyYWN0ZXIiKSkpIHw+IA0KICBsYXp5X2R0KCkgfD4gDQogIHJlbmFtZV93aXRoKHRvbG93ZXIpIHw+IA0KICBmaWx0ZXIobmNoYXIoY2RfY29udGFfY29udGFiaWwpID09IDksICMgZmlsdHJhIGNvbnRhcyBjb250w6FiZWlzIGRlIDkgZMOtZ2l0b3MNCiAgICAgICAgIHZsX3NhbGRvX2ZpbmFsICE9IDApIHw+ICMgZXhjbHVpIGxpbmhhcyBzZW0gc2FsZG8NCiAgbXV0YXRlKGlkX2NhbGVuZGFyID0geW1kKGRhdGEpICsgbW9udGhzKDIpKSB8PiAjIGFsdGVyYSBwYXJhIMO6bHRpbW8gbcOqcyBkbyB0cmltZXN0cmUNCiAgcmVuYW1lKGNkX29wcyA9IHJlZ19hbnMpIHw+IA0KICBzZWxlY3QoY2Rfb3BzLCBjZF9jb250YV9jb250YWJpbCwgaWRfY2FsZW5kYXIsIHZsX3NhbGRvX2ZpbmFsKSB8PiANCiAgYXNfdGliYmxlKCkNCg0KcmVtb3ZlKGZpbGVzKQ0KYGBgDQoNCjxicj4NCg0KTyBhbHZvIGRhIGFuw6FsaXNlIMOpIGEgZGVzcGVzYSBhc3Npc3RlbmNpYWwgaW5jb3JyaWRhIHBlbGEgb3BlcmFkb3JhIGVtIGNhcnRlaXJhIHByw7NwcmlhLiBPcyB2YWxvcmVzIGRlIERlc3Blc2EgQXNzaXN0ZW5jaWFsIGVtIENhcnRlaXJhIFByw7NwcmlhIGNvcnJlc3BvbmRlbSDDoCB0b3RhbGl6YcOnw6NvIGRvcyBzYWxkb3MgZG9zIHNlZ3VpbnRlcyBncnVwb3MgZGUgY29udGFzIGNvbnTDoWJlaXMgZG8gUGxhbm8gZGUgQ29udGFzIFBhZHLDo28gZGEgQU5TOg0KDQoNCnwgQ29udGEgY29udMOhYmlsIHwgRGVzY3Jpw6fDo28gfCBUb3RhbGl6YcOnw6NvIHwNCnw6LS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tOnwNCnwgNDExWDEgfCBFdmVudG9zLyBTaW5pc3Ryb3MgQ29uaGVjaWRvcyBvdSBBdmlzYWRvcyBkZSBBc3Npc3TDqm5jaWEgYSBTYcO6ZGUgTWVkaWNvIEhvc3BpdGFsYXIgfCAoKykgfA0KfCA0MTFYMVhYOCB8IENvcnJlc3BvbnNhYmlsaWRhZGUgQXNzdW1pZGEgfCAoLSkgfA0KfCAzMTE3MSB8ICgtKSBDb250cmFwcmVzdGHDp8O1ZXMgZGUgQ29ycmVzcG9uc2FiaWxpZGFkZSBDZWRpZGEgZGUgQXNzaXN0w6puY2lhIE3DqWRpY28tSG9zcGl0YWxhciB8ICgtKSB8DQoNCg0KRGVzc2EgZm9ybWEsIG8gdmFsb3IgZGEgZGVzcGVzYSBhc3Npc3RlbmNpYWwgZW0gY2FydGVpcmEgcHLDs3ByaWEgaW5jbHVpIHZhbG9yZXMgZGUgRXZlbnRvcy8gU2luaXN0cm9zIGNvbmhlY2lkb3Mgb3UgYXZpc2Fkb3MgZSB2YWxvcmVzIGRlIGdhc3RvcyBkZSBjb3JyZXNwb25zYWJpbGlkYWRlIGRlIGNhcnRlaXJhIHByw7NwcmlhICpjZWRpZGEqIGEgdGVyY2Vpcm9zIChjb250YXMgY29udMOhYmVpcyByZWR1dG9yYXMgZGUgcmVjZWl0YSAzMTE3MSkuIFZhbG9yZXMgZGUgY29ycmVzcG9uc2FiaWxpZGFkZSAqYXNzdW1pZGEqIHPDo28gZGVzY29uc2lkZXJhZG9zLCBwb2lzIHJlZmVyZW0tc2UgYSBkZXNwZXNhcyBhc3Npc3RlbmNpYWlzIGluY29ycmlkYXMgZW0gYXRlbmRpbWVudG8gYSBjYXJ0ZWlyYSBkZSB0ZXJjZWlyb3MgKG91dHJhcyBvcGVyYWRvcmFzKS4gICAgICAgICAgDQoNCg0KTyBjw7NkaWdvIGEgc2VndWlyIHRvdGFsaXphIGEgZGVzcGVzYSBhc3Npc3RlbmNpYWwgcG9yIHRyaW1lc3RyZSwgb3BlcmFkb3JhIGUgdGlwbyBkZSBjYXJ0ZWlyYTogDQoNCmBgYHtyfQ0KZGlvcHMgPC0gZGlvcHMgfD4gIA0KICBmaWx0ZXIoICMgZmlsdHJhIGNvbnRhcyBjb250w6FiZWlzIHJlbGV2YW50ZXMgcGFyYSBhIGFuw6FsaXNlDQogICAgIyBkZXNwZXNhIC8gY29ycmVzcG9uc2FiaWxpZGFkZSBhc3N1bWlkYSBtw6lkaWNvLWhvc3BpdGFsYXINCiAgICAoc3Vic3RyKGNkX2NvbnRhX2NvbnRhYmlsLCAxLCAzKSA9PSAnNDExJyAmIHN1YnN0cihjZF9jb250YV9jb250YWJpbCwgNSwgNSkgPT0gJzEnKQ0KICAgICMgcmVjZWl0YSAvIGNvcnJlc3BvbnNhYmlsaWRhZGUgY2VkaWRhIG3DqWRpY28taG9zcGl0YWxhcg0KICAgIHwgKHN1YnN0cihjZF9jb250YV9jb250YWJpbCwgMSwgNSkgPT0gJzMxMTExJyB8IHN1YnN0cihjZF9jb250YV9jb250YWJpbCwgMSwgNSkgPT0gJzMxMTcxJykNCiAgKSB8PiANCiAgbXV0YXRlKA0KICAgIGdyX2NjID0gY2FzZV93aGVuKA0KICAgICAgc3Vic3RyKGNkX2NvbnRhX2NvbnRhYmlsLCAxLCAxKSA9PSAnNCcgfiAnZXZlbnRvcycsDQogICAgICBzdWJzdHIoY2RfY29udGFfY29udGFiaWwsIDEsIDUpID09ICczMTExMScgfiAncmVjZWl0YScsIA0KICAgICAgc3Vic3RyKGNkX2NvbnRhX2NvbnRhYmlsLCAxLCA1KSA9PSAnMzExNzEnIH4gJ2NvcnJfY2VkaWRhJywgIyByZWR1dG9yYSBkZSByZWNlaXRhDQogICAgICBUUlVFIH4gJ0VYQ0xVSVInKSwgDQogICkgfD4NCiAgZ3JvdXBfYnkoY2Rfb3BzLCBjZF9jb250YV9jb250YWJpbCwgaWRfY2FsZW5kYXIsIGdyX2NjKSB8PiANCiAgc3VtbWFyaXNlKHZsX3NhbGRvX2ZpbmFsID0gc3VtKHZsX3NhbGRvX2ZpbmFsKSwgDQogICAgICAgICAgICAuZ3JvdXBzID0gJ2Ryb3AnKSB8PiAgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBncl9jYywgdmFsdWVzX2Zyb20gPSB2bF9zYWxkb19maW5hbCwgdmFsdWVzX2ZpbGwgPSAwKSB8PiANCiAgIyBpZGVudGlmaWNhIHRpcG9zIGRlIHBsYW5vIHBlbGEgY29udGEgY29udMOhYmlsDQogIG11dGF0ZSgNCiAgICB2aWdlbmNpYSA9IGNhc2Vfd2hlbigNCiAgICAgIHN1YnN0cihjZF9jb250YV9jb250YWJpbCwgOCwgOCkgPT0gJzgnIH4gJ2NvcnJfYXNzdW1pZGEnLCANCiAgICAgIHN1YnN0cihjZF9jb250YV9jb250YWJpbCwgOCwgOCkgJWluJSBjKCcxJywnMycsJzUnKSB+ICdBJywNCiAgICAgIHN1YnN0cihjZF9jb250YV9jb250YWJpbCwgOCwgOCkgJWluJSBjKCcyJywnNCcsJzYnKSB+ICdQJywNCiAgICAgIFRSVUUgfiAnRVhDTFVJUicpLCANCiAgICBjb250cmF0YWNhbyA9IGNhc2Vfd2hlbigNCiAgICAgIHN1YnN0cihjZF9jb250YV9jb250YWJpbCwgOCwgOCkgPT0gJzgnIH4gJ2NvcnJfYXNzdW1pZGEnLCANCiAgICAgIHN1YnN0cihjZF9jb250YV9jb250YWJpbCwgOCwgOCkgJWluJSBjKCcxJywnMicpIH4gJ0luZGl2aWR1YWwnLA0KICAgICAgc3Vic3RyKGNkX2NvbnRhX2NvbnRhYmlsLCA4LCA4KSAlaW4lIGMoJzMnLCc0JykgfiAnQWRlc8OjbycsDQogICAgICBzdWJzdHIoY2RfY29udGFfY29udGFiaWwsIDgsIDgpICVpbiUgYygnNScsJzYnKSB+ICdFbXByZXNhcmlhbCcsDQogICAgICBUUlVFIH4gJ0VYQ0xVSVInKSwgDQogICAgZmluYW5jaWFtZW50byA9IGNhc2Vfd2hlbigNCiAgICAgIHN1YnN0cihjZF9jb250YV9jb250YWJpbCwgOCwgOCkgPT0gJzgnIH4gJ2NvcnJfYXNzdW1pZGEnLCANCiAgICAgIHN1YnN0cihjZF9jb250YV9jb250YWJpbCwgNiwgNikgPT0gJzEnIH4gJ1ByZS1lc3RhYmVsZWNpZG8nLA0KICAgICAgc3Vic3RyKGNkX2NvbnRhX2NvbnRhYmlsLCA2LCA2KSA9PSAnMicgfiAnUMOzcy1lc3RhYmVsZWNpZG8nLA0KICAgICAgVFJVRSB+ICdFWENMVUlSJyksIA0KICApIHw+IA0KICBmaWx0ZXIodmlnZW5jaWEgIT0gJ2NvcnJfYXNzdW1pZGEnKSB8PiAgICAgIyBleGNsdWkgY29yciBhc3N1bWlkYQ0KICBtdXRhdGUoZGVzcGVzYSA9IGV2ZW50b3MgLSBjb3JyX2NlZGlkYSwNCiAgICAgICAgIGNvbnRyYXRhY2FvID0gYXMuZmFjdG9yKGNvbnRyYXRhY2FvKSkgfD4gIyBpbmNsdWkgY29yciBjZWRpZGEgbmEgZGVzcGVzYQ0KICBncm91cF9ieShjZF9vcHMsIHZpZ2VuY2lhLCBjb250cmF0YWNhbywgZmluYW5jaWFtZW50bywgaWRfY2FsZW5kYXIpIHw+IA0KICBzdW1tYXJpc2UocmVjZWl0YSA9IHN1bShyZWNlaXRhKSwgDQogICAgICAgICAgICBkZXNwZXNhID0gc3VtKGRlc3Blc2EpLCANCiAgICAgICAgICAgIC5ncm91cHMgPSAnZHJvcCcpDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRX0NCmRpb3BzIHw+IGdyb3VwX2J5KGFubz0geWVhcihpZF9jYWxlbmRhcikpIHw+IA0KICBzdW1tYXJpc2UocmVjZWl0YSA9IHJvdW5kKHN1bShyZWNlaXRhLCBuYS5ybSA9IFQpLzFlOSwgMSksICMgZW0gUiQgYmlsaMO1ZXMNCiAgICAgICAgICAgIGRlc3Blc2EgPSByb3VuZChzdW0oZGVzcGVzYSwgbmEucm0gPSBUKS8xZTksIDEpLCAjIGVtIFIkIGJpbGjDtWVzDQogICAgICAgICAgICBuX29wcyA9IG5fZGlzdGluY3QoY2Rfb3BzKSwgDQogICAgICAgICAgICAuZ3JvdXBzID0gJ2Ryb3AnKSB8PiANCiAgbXV0YXRlKHBjdF9kZXNwZXNhID0gcm91bmQoZGVzcGVzYS9yZWNlaXRhKjEwMCwxKSkNCmBgYA0KDQoNCg0KPGJyPg0KDQpGaWx0cmEgc2VnbWVudG9zIGFsdm8gZGEgYW7DoWxpc2UgZSB0b3RhbGl6YSBwb3IgdHJpbWVzdHJlLCBvcGVyYWRvcmEgZSB0aXBvIGRlIHBsYW5vOg0KDQpgYGB7cn0NCmRpb3BzIDwtIGRpb3BzIHw+IA0KICAjIGZpbHRyYSBwbGFub3Mgbm92b3MgKHBvc3RlcmlvcmVzIMOgIExlaSkgY29tIGZvcm1hw6fDo28gZGUgcHJlw6dvIHByw6ktZXN0YWJlbGVjaWRhDQogIGZpbHRlciggDQogICAgdmlnZW5jaWEgPT0gJ1AnLCANCiAgICBmaW5hbmNpYW1lbnRvID09ICdQcmUtZXN0YWJlbGVjaWRvJywgDQogICkgfD4gDQogIHNlbGVjdCgtdmlnZW5jaWEsIC1maW5hbmNpYW1lbnRvKSB8PiANCiAgIyBmaWx0cmEgb3BlcmFkb3JhcyBtw6lkaWNvLWhvc3BpdGFsYXJlcw0KICBpbm5lcl9qb2luKHNlbGVjdChjYWRvcCxjZF9vcHMpLCAgYnk9ImNkX29wcyIpDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRX0NCmRpb3BzIHw+IA0KICBncm91cF9ieShhbm89IHllYXIoaWRfY2FsZW5kYXIpKSB8Pg0KICBzdW1tYXJpc2UocmVjZWl0YSA9IHJvdW5kKHN1bShyZWNlaXRhLCBuYS5ybSA9IFQpLzFlKzksIDEpLCAjIGVtIFIkIGJpbGjDtWVzDQogICAgICAgICAgICBkZXNwZXNhID0gcm91bmQoc3VtKGRlc3Blc2EsIG5hLnJtID0gVCkvMWUrOSwgMSksICMgZW0gUiQgYmlsaMO1ZXMNCiAgICAgICAgICAgIG5fb3BzID0gbl9kaXN0aW5jdChjZF9vcHMpLA0KICAgICAgICAgICAgLmdyb3VwcyA9ICdkcm9wJykgfD4gDQogIG11dGF0ZShwY3RfZGVzcGVzYSA9IHJvdW5kKGRlc3Blc2EvcmVjZWl0YSoxMDAsMikpDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KZGlvcHMgfD4gDQogIGdyb3VwX2J5KGNvbnRyYXRhY2FvLCBhbm89IHllYXIoaWRfY2FsZW5kYXIpKSB8Pg0KICBzdW1tYXJpc2UocmVjZWl0YSA9IHJvdW5kKHN1bShyZWNlaXRhLCBuYS5ybSA9IFQpLzFlKzksIDEpLCAjIGVtIFIkIGJpbGjDtWVzDQogICAgICAgICAgICBkZXNwZXNhID0gcm91bmQoc3VtKGRlc3Blc2EsIG5hLnJtID0gVCkvMWUrOSwgMSksICMgZW0gUiQgYmlsaMO1ZXMNCiAgICAgICAgICAgIG5fb3BzID0gbl9kaXN0aW5jdChjZF9vcHMpLA0KICAgICAgICAgICAgLmdyb3VwcyA9ICdkcm9wJykgfD4gDQogIG11dGF0ZShwY3RfZGVzcGVzYSA9IHJvdW5kKGRlc3Blc2EvcmVjZWl0YSoxMDAsMikpDQpgYGANCg0KPGJyPg0KDQojIyMgQmVuZWZpY2nDoXJpb3MgKHNlbWktYWRpdGl2bykNCg0KQXMgaW5mb3JtYcOnw7VlcyBkZSB2w61uY3Vsb3MgYXRpdm9zIGRlIGJlbmVmaWNpw6FyaW9zIHPDo28gb2J0aWRhcyBhdHJhdsOpcyBkbyBTaXN0ZW1hIGRlIEluZm9ybWHDp8OjbyBkZSBCZW5lZmljacOhcmlvcyAoU0lCKSwgcXVlIMOpIGF0dWFsaXphZG8gbWVuc2FsbWVudGUuICAgICAgICAgICAgDQoNCkEgYmFzZSBkZSBkYWRvcyBkbyBTSUIgcmVmZXJlbnRlIGFvcyBhbm9zIGRlIGByIHllYXIocGVyaW9kb1sxXSlgIGUgYHIgeWVhcihwZXJpb2RvWzJdKWAgcG9kZSBzZXIgYWNlc3NhZGEgbm8gUG9ydGFsIGRlIERhZG9zIEFiZXJ0b3MgZGEgQU5TIChodHRwczovL2RhZG9zLmdvdi5ici9vcmdhbml6YXRpb24vYWdlbmNpYS1uYWNpb25hbC1kZS1zYXVkZS1zdXBsZW1lbnRhci1hbnMpLCBjb25qdW50byBkZSBkYWRvcyBbKkJlbmVmaWNpw6FyaW9zIHBvciBvcGVyYWRvcmEgZSB0aXBvIGRlIGNhcnRlaXJhIHBhcmEgY8OhbGN1bG8gZGEgVkRBKl0oaHR0cHM6Ly9kYWRvcy5nb3YuYnIvZGF0YXNldC9iZW5lZmljaWFyaW9zLWNvbS12aW5jdWxvcy1hdGl2b3MtcG9yLXRpcG8tZGUtY29udHJhdGFjYW8tcGFyYS1jYWxjdWxvLWRhLXZkYSkgbm8gc2l0ZSBkYSBBTlMuIEVzc2UgY29uanVudG8gZGUgZGFkb3MgaW5mb3JtYSBhIHF1YW50aWRhZGUgZGUgdsOtbmN1bG9zIGF0aXZvcyBkZSBiZW5lZmljacOhcmlvcyBlbSBwbGFub3MgZGUgc2HDumRlIG3DqWRpY28taG9zcGl0YWxhciBtw6pzIGEgbcOqcyBwb3Igb3BlcmFkb3JhIGUgdGlwbyBkZSBwbGFuby4gICAgICAgDQoNCk8gY8OzZGlnbyBhIHNlZ3VpciBmYXogYSBsZWl0dXJhIGRvcyBhcnF1aXZvcyBwdWJsaWNhZG9zIG5vIHBvcnRhbCBkZSBkYWRvcyBhYmVydG9zOg0KDQpgYGB7cn0NCnNpYiA8LSBmcmVhZChwYXN0ZTAoImh0dHA6Ly9mdHAuZGFkb3NhYmVydG9zLmFucy5nb3YuYnIvRlRQL1BEQS8iLA0KICAgICAgICAgICAgICAgICAgICAiYmVuZWZpY2lhcmlvc192aW5jdWxvc190aXBvX2NvbnRyYXRhY2FvX3ZkYS8iLA0KICAgICAgICAgICAgICAgICAgICAiQmVuZWZpY2lhcmlvc19vcGVyYWRvcmFfZV9jYXJ0ZWlyYS5jc3YiKSwgDQogICAgICAgICAgICAgZW5jb2RpbmcgPSAiVVRGLTgiKSB8Pg0KICBsYXp5X2R0KCkgfD4NCiAgcmVuYW1lX3dpdGgodG9sb3dlcikgfD4gDQogIG11dGF0ZShpZF9jYWxlbmRhciA9IG1ha2VfZGF0ZShhcy5pbnRlZ2VyKG1lcy8xMDApLCBtZXMgLSAoYXMuaW50ZWdlcihtZXMvMTAwKSkgKiAxMDAsIDEpKSB8Pg0KICBmaWx0ZXIoaWRfY2FsZW5kYXIgPj0gcGVyaW9kb1sxXSwgaWRfY2FsZW5kYXIgPD0gcGVyaW9kb1syXSwgICMgcGVyw61vZG8gZGUgYW7DoWxpc2UNCiAgICAgICAgIG5yX2JlbmVmICE9IDAsICFpcy5uYShucl9iZW5lZikpIHw+ICMgZXhjbHVpIHplcm9zIGUgbnVsb3MNCiAgcmVuYW1lKA0KICAgIGNkX29wcyA9IGNkX29wZXJhZG9yYSwgDQogICAgdmlnZW5jaWEgPSB2aWdlbmNpYV9wbGFubywgY29udHJhdGFjYW8gPSBncl9jb250cmF0YWNhbywgZmluYW5jaWFtZW50byA9IHRpcG9fZmluYW5jaWFtZW50bywNCiAgICBiZW5lZiA9IG5yX2JlbmVmDQogICkgfD4gDQogIG11dGF0ZShjb250cmF0YWNhbyA9IGNhc2Vfd2hlbigNCiAgICBjb250cmF0YWNhbyA9PSAnQ29sZXRpdm8gZW1wcmVzYXJpYWwnIH4gJ0VtcHJlc2FyaWFsJywNCiAgICBjb250cmF0YWNhbyA9PSAnQ29sZXRpdm8gcG9yIGFkZXPDo28nIH4gJ0FkZXPDo28nLA0KICAgIGNvbnRyYXRhY2FvID09ICdJbmRpdmlkdWFsIG91IGZhbWlsaWFyJyB+ICdJbmRpdmlkdWFsJywNCiAgICBUUlVFIH4gJ07Do28gaWRlbnRpZmljYWRvJykpIHw+IA0KICBzZWxlY3QoY2Rfb3BzLCBjb2JlcnR1cmEsICANCiAgICAgICAgIHZpZ2VuY2lhLCBjb250cmF0YWNhbywgZmluYW5jaWFtZW50bywgDQogICAgICAgICBpZF9jYWxlbmRhciwgYmVuZWYpIHw+IA0KICBhc190aWJibGUoKQ0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpzaWIgfD4gZ3JvdXBfYnkoYW5vID0geWVhcihpZF9jYWxlbmRhcikpIHw+IA0KICBzdW1tYXJpc2Uobl9vcHMgPSBuX2Rpc3RpbmN0KGNkX29wcyksDQogICAgICAgICAgICAiYmVuZWYgKG1lZGlhIGFncmVnYWRhKSIgPSBmb3JtYXQocm91bmQoc3VtKGJlbmVmKS8xMiwwKSwgZGVjaW1hbC5tYXJrPSIsIiwgYmlnLm1hcms9Ii4iKSwNCiAgICAgICAgICAgIC5ncm91cHMgPSAnZHJvcCcpIA0KYGBgDQoNCg0KPGJyPg0KDQpGaWx0cmEgc2VnbWVudG9zIGFsdm8gZGEgYW7DoWxpc2UgZSB0b3RhbGl6YSBwb3IgbcOqcywgb3BlcmFkb3JhIGUgdGlwbyBkZSBwbGFuby4NCg0KYGBge3J9DQpzaWIgPC0gc2liIHw+IA0KICBmaWx0ZXIoDQogICAgY29iZXJ0dXJhID09ICJNw6lkaWNvLWhvc3BpdGFsYXIiLA0KICAgIHZpZ2VuY2lhID09ICdQJywgIyBwbGFub3Mgbm92b3MgKHBvc3RlcmlvcmVzIMOgIExlaSkNCiAgICBmaW5hbmNpYW1lbnRvICE9ICdQw7NzLWVzdGFiZWxlY2lkbycsICMgZm9ybWHDp8OjbyBkZSBwcmXDp28gcHLDqS1lc3RhYmVsZWNpZGENCiAgICBjb250cmF0YWNhbyAlaW4lIGMoJ0VtcHJlc2FyaWFsJywgJ0luZGl2aWR1YWwnLCAnQWRlc8OjbycpKSB8PiANCiAgIyBGaWx0cmEgb3BlcmFkb3JhcyBtw6lkaWNvLWhvc3BpdGFsYXJlcw0KICBpbm5lcl9qb2luKHNlbGVjdChjYWRvcCxjZF9vcHMpLCBieT0iY2Rfb3BzIikgfD4gDQogIGdyb3VwX2J5KGNkX29wcywgY29udHJhdGFjYW8sIGlkX2NhbGVuZGFyKSB8PiANCiAgc3VtbWFyaXNlKGJlbmVmID0gc3VtKGJlbmVmKSwgLmdyb3VwcyA9ICdkcm9wJykgDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRX0NCnNpYiB8PiANCiAgZ3JvdXBfYnkoYW5vID0geWVhcihpZF9jYWxlbmRhcikpIHw+IA0KICBzdW1tYXJpc2Uobl9vcHMgPSBuX2Rpc3RpbmN0KGNkX29wcyksDQogICAgICAgICAgICAiYmVuZWYgKG1lZGlhIGFncmVnYWRhKSIgPSBmb3JtYXQocm91bmQoc3VtKGJlbmVmKS8xMiwwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsLm1hcms9IiwiLCBiaWcubWFyaz0iLiIpLA0KICAgICAgICAgICAgLmdyb3VwcyA9ICdkcm9wJykgDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRX0NCnNpYiB8PiANCiAgZ3JvdXBfYnkoY29udHJhdGFjYW8sYW5vID0geWVhcihpZF9jYWxlbmRhcikpIHw+IA0KICBzdW1tYXJpc2Uobl9vcHMgPSBuX2Rpc3RpbmN0KGNkX29wcyksDQogICAgICAgICAgICAiYmVuZWYgKG1lZGlhIGFncmVnYWRhKSIgPSByb3VuZChzdW0oYmVuZWYpLzEyLDApLA0KICAgICAgICAgICAgLmdyb3VwcyA9ICdkcm9wJykgDQpgYGANCg0KPGJyPg0KDQpDYWxjdWxhIG3DqWRpYSBkZSBiZW5lZmljacOhcmlvcyBhY3VtdWxhZGEgbm8gYW5vIHBvciBvcGVyYWRvcmEgZSB0aXBvIGRlIGNvbnRyYXRhw6fDo286DQoNCmBgYHtyfQ0Kc2liIDwtIHNpYiB8PiANCiAgYXJyYW5nZShjZF9vcHMsIGNvbnRyYXRhY2FvLCBpZF9jYWxlbmRhcikgfD4gDQogICMgY3JpYSBjb2x1bmEgZG8gYW5vDQogIG11dGF0ZShpZF9jYWxlbmRhciA9IHltZChpZF9jYWxlbmRhciksIA0KICAgICAgICAgYW5vID0gYXMuaW50ZWdlcih5ZWFyKGlkX2NhbGVuZGFyKSkpIHw+IA0KICAjIGNhbGN1bGEgYSBtw6lkaWEgcG9yIG9wZXJhZG9yYSwgY29udHJhdGFjYW8gZSBhbm8NCiAgZ3JvdXBfYnkoY2Rfb3BzLCBjb250cmF0YWNhbywgYW5vKSB8PiANCiAgbXV0YXRlKA0KICAgICMgTk9UQTogYSBmdW7Dp8OjbyBzw7MgY2FsY3VsYSBwYXJhIHBlcsOtb2RvcyBjb20gdW1hIHNlcXXDqm5jaWEgaW5pbnRlcnJ1cHRhIGRlIDEyIG1lc2VzDQogICAgYmVuZWZtID0gUmNwcFJvbGw6OnJvbGxfbWVhbnIoYmVuZWYsIG4gPSAxMiwgZmlsbCA9IE5BX3JlYWxfLCBuYS5ybSA9IEZBTFNFKSwNCiAgICBtZXMgPSBhcy5pbnRlZ2VyKG1vbnRoKGlkX2NhbGVuZGFyKSksDQogICAgY29udHJhdGFjYW8gPSBhcy5mYWN0b3IoY29udHJhdGFjYW8pLA0KICApIHw+IA0KICB1bmdyb3VwKCkgfD4gDQogIGZpbHRlcihtZXMgPT0gMTIsICFpcy5uYShiZW5lZm0pKSB8PiAjIHNlbGVjaW9uYSBvKHMpIHBlcsOtb2RvKHMpIGFsdm8gZGEgYW7DoWxpc2UNCiAgc2VsZWN0KC1iZW5lZiwgLWFubywgLW1lcykgDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRX0NCnNpYiB8PiBncm91cF9ieShjb250cmF0YWNhbywgYW5vID0geWVhcihpZF9jYWxlbmRhcikpIHw+IA0KICBzdW1tYXJpc2Uobl9vcHMgPSBuX2Rpc3RpbmN0KGNkX29wcyksDQogICAgICAgICAgICBiZW5lZm0gPSByb3VuZChzdW0oYmVuZWZtLCBuYS5ybSA9IFQpLDApLCAjIHNvbWEgZGFzIG3DqWRpYXMNCiAgICAgICAgICAgIC5ncm91cHMgPSAnZHJvcCcpDQpgYGANCg0KDQoNCg0KKioqDQoNCiMjIEPDoWxjdWxvIGRhIFZEQQ0KDQo8YnI+DQoNCiMjIyBEZXNwZXNhIHBvciBCZW5lZmljacOhcmlvDQoNCkVzc2Egc2XDp8OjbyBnZXJhIGEgYmFzZSBkZSBkZXNwZXNhIGFzc2lzdGVuY2lhbCBlIGJlbmVmaWNpw6FyaW9zIGUgY2FsY3VsYSBhICpkZXNwZXNhIHBvciBiZW5lZmljacOhcmlvKi4gICAgICAgICAgIA0KDQpBIGRlc3Blc2EgcG9yIGJlbmVmaWNpw6FyaW8gw6kgYSAqZGVzcGVzYSBhc3Npc3RlbmNpYWwqIGRhIGNhcnRlaXJhIHByw7NwcmlhIGRlIHVtYSBvcGVyYWRvcmEgaW5jb3JyaWRhIGVtIGNlcnRvIHBlcsOtb2RvLCBkaXZpZGlkYSBwZWxhICptw6lkaWEgZGUgdsOtbmN1bG9zIGF0aXZvcyBkZSBiZW5lZmljacOhcmlvcyogYW8gbG9uZ28gZG8gbWVzbW8gcGVyw61vZG8uIEVzc2EgbcOpdHJpY2EgcmVwcmVzZW50YSBvIHByaW5jaXBhbCBjb21wb25lbnRlIGRlIGN1c3RvIGRlIHVtIHBsYW5vIGRlIHNhw7pkZSBlIGVzdMOhIGV4cHJlc3NhIGRlIGZvcm1hIGEgcGVybWl0aXIgY29tcGFyw6EtbGEgZW50cmUgb3BlcmFkb3JhcyBwb3IgdGlwbyBkZSBjYXJ0ZWlyYSBlIGFjb21wYW5oYXIgc3VhIGV2b2x1w6fDo28gYW8gbG9uZ28gZG8gdGVtcG8uICAgICAgICAgICANCiAgICAgICAgICAgIA0KDQo+IE5vdGE6ICAgICANCiAgUGFyYSBmYWNpbGl0YXIgYSBjb21wYXJhYmlsaWRhZGUgZSBhY29tcGFuaGFtZW50byBkYSBkZXNwZXNhIHBvciBiZW5lZmljacOhcmlvIGFvIGxvbmdvIGRvIHRlbXBvLCDDqSBwb3Nzw612ZWwgbm9ybWFsaXphciBhIG3DqXRyaWNhIGRpdmlkaW5kby1hIHBlbG8gbsO6bWVybyBkZSBtZXNlcyBkbyBwZXLDrW9kbyBzZW0gaW1wYWN0byBzb2JyZSBhIFZEQS4NCg0KICAgICAgICAgICAgICANCkEgYmFzZSBkZSBjw6FsY3VsbyBkYSBWREEgY29uc2lkZXJhIGFwZW5hczogICAgICANCg0KKiBPcGVyYWRvcmFzIHbDoWxpZGFzICAgICANCg0KKiBPYnNlcnZhw6fDtWVzIHF1ZSBhcHJlc2VudGFtIHZhbG9yIHBvc2l0aXZvIGRlIGRlc3Blc2EgICAgICAgIA0KDQoqIE9ic2VydmHDp8O1ZXMgcXVlIGFwcmVzZW50YW0gdW1hIHNlcXXDqm5jaWEgaW5pbnRlcnJ1cHRhIGRlIDEyIG1lc2VzIGRlIGJlbmVmaWNpw6FyaW9zIG5vIGFubyAgICAgICAgDQoNCk8gY8OzZGlnbyBhIHNlZ3VpciBjb25zb2xpZGEgb3MgZGFkb3MgZGUgb3BlcmFkb3JhcywgYmVuZWZpY2nDoXJpb3MgZSBkZXNwZXNhcywgZmlsdHJhIGFzIG9ic2VydmHDp8O1ZXMgcmVsZXZhbnRlcyBlIGNhbGN1bGEgYSBEZXNwZXNhIHBvciBCZW5lZmljacOhcmlvIChtw6lkaWEgbWVuc2FsKToNCg0KDQpgYGB7cn0NCmRmLnZkYSA8LSBkaW9wcyB8PiANCiAgc2VsZWN0KC1yZWNlaXRhKSB8PiANCiAgaW5uZXJfam9pbihzaWIsIGJ5PWMoJ2NkX29wcycsICdjb250cmF0YWNhbycsICdpZF9jYWxlbmRhcicpKSB8PiANCiAgaW5uZXJfam9pbihjYWRvcCwgYnk9J2NkX29wcycpIHw+IA0KICBmaWx0ZXIoDQogICAgbGdfY2FuY2VsYWRhID09IDAsIA0KICAgIGxnX25vdmFfb3BzICA9PSAwLCANCiAgICBsZ19yZXNzYWx2YSAgPT0gMCwNCiAgICBkZXNwZXNhID4gMA0KICApIHw+IA0KICBzZWxlY3QoLWMobGdfY2FuY2VsYWRhLCBsZ19ub3ZhX29wcywgbGdfcmVzc2FsdmEpKSB8PiANCiAgcmVsb2NhdGUoYyhyYXphb19zb2NpYWwsIG1vZGFsaWRhZGUpLCAuYWZ0ZXIgPSBjZF9vcHMpIHw+IA0KICBhcnJhbmdlKGNkX29wcywgY29udHJhdGFjYW8sIGlkX2NhbGVuZGFyKSB8PiANCiAgbXV0YXRlKGRwYiA9IGlmX2Vsc2UoYmVuZWZtID4gMCwgZGVzcGVzYS8gYmVuZWZtIC8gbW9udGgoaWRfY2FsZW5kYXIpLCBOQV9yZWFsXykpDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KZGYudmRhIHw+IGdyb3VwX2J5KGNvbnRyYXRhY2FvLCBhbm89IHllYXIoaWRfY2FsZW5kYXIpKSB8PiANCiAgc3VtbWFyaXNlKCdEZXNwZXNhIChSJGJuKScgPSByb3VuZChzdW0oZGVzcGVzYSkvMWUrOSwxKSwNCiAgICAgICAgICAgICdCZW5lZmljacOhcmlvcyAobcOpZGlhKScgPSByb3VuZChzdW0oYmVuZWZtKSwwKSwNCiAgICAgICAgICAgICdRdGQgb3BlcmFkb3JhcycgPSBuX2Rpc3RpbmN0KGNkX29wcyksDQogICAgICAgICAgICAuZ3JvdXBzID0gJ2Ryb3AnKQ0KYGBgDQoNCg0KPGJyPg0KDQpWaXN1YWxpemHDp8OjbyBncsOhZmljYSBkYSBkaXN0cmlidWnDp8OjbyBkYSBkZXNwZXNhIHBvciBiZW5lZmljacOhcmlvIGRhcyBvcGVyYWRvcmFzLiAgICAgDQoNCipOb3RhOiBFeGNsdcOtcmFtLXNlIG9zIHZhbG9yZXMgYXTDrXBpY29zIHBlbG8gbcOpdG9kbyBkZSBib3hwbG90IDEsNXhJUVIgcGFyYSBxdWUgZm9zc2UgcG9zc8OtdmVsIHZpc3VhbGl6YXIgYSBkaXN0cmlidWnDp8OjbyBkYSBncmFuZGUgbWFpb3JpYSBkb3MgZGFkb3MuKg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KdHJpbS5kZihkZi52ZGEsIGRmLnZkYSRkcGIpIHw+IGdncGxvdChhZXMoeD1kcGIpKSArDQogIGdlb21faGlzdG9ncmFtKGJpbnMgPSA1MCwgZmlsbCA9ICd3aGl0ZScsIGNvbG9yID0gInNsYXRlZ3JheSIpICsNCiAgdGhlbWUoYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG9yID0gJ2dyYXknKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpKSArDQogIGxhYnMoeCA9ICJEZXNwZXNhIG1lbnNhbCBwb3IgYmVuZWZpY2nDoXJpbyAoUiQpIiwNCiAgICAgICB5ID0gIkZyZXF1w6puY2lhIikgKyANCiAgZmFjZXRfZ3JpZChjb250cmF0YWNhbyB+IHllYXIoaWRfY2FsZW5kYXIpKQ0KYGBgDQoNCg0KPGJyPg0KDQojIyMgVkRBIHBvciBvcGVyYWRvcmENCg0KQSBWREEgZGUgdW1hIG9wZXJhZG9yYSDDqSBhIHZhcmlhw6fDo28gZGEgZGVzcGVzYSBwb3IgYmVuZWZpY2nDoXJpbyBkZXN0YSBvcGVyYWRvcmEgc29icmUgbyBtZXNtbyBwZXLDrW9kbyBkbyBhbm8gYW50ZXJpb3IsIGNvbmZvcm1lIGEgc2VndWludGUgZsOzcm11bGE6DQo8YnI+DQoNCiQkVkRBX3tpcH0gPSBcZGlzcGxheXN0eWxlXGZyYWN7XGZyYWN7REFfe2lwfX17QmVuX3tpcH19fXtcZnJhY3tEQV97aVwgXGxlZnQocC0xXHJpZ2h0KX19e0Jlbl97aVwgXGxlZnQocC0xXHJpZ2h0KX19fSAtIDEkJA0KPGJyPg0KICAgIA0KDQo8ZGl2IGNsYXNzPSJhbGVydCBhbGVydC1ibG9jayBhbGVydC1pbmZvIj4NCjxiPk9uZGU6PC9iPiAgICAgDQogICAgaSA9IE9wZXJhZG9yYSBuYSBiYXNlIGRlIGPDoWxjdWxvICAgICAgICAgDQogICAgcCA9IEFubyBjYWxlbmTDoXJpbyBhbnRlcmlvciBhbyBpbsOtY2lvIGRhIGFwbGljYcOnw6NvIGRvIElSUEkgICAgDQogICAgREEgPSBEZXNwZXNhIGFzc2lzdGVuY2lhbCBlbSBjYXJ0ZWlyYSBwcsOzcHJpYSBhY3VtdWxhZGEgYW8gZmltIGRvIHBlcsOtb2RvICAgIA0KICAgIEJlbiA9IE3DqWRpYSBtZW5zYWwgZGUgYmVuZWZpY2nDoXJpb3MgZW0gY2FydGVpcmEgcHLDs3ByaWEgYW8gbG9uZ28gZG8gcGVyw61vZG8gICAgDQo8L2Rpdj4NCg0KTyBjw7NkaWdvIGEgc2VndWlyIGNhbGN1bGEgYSBWREEgcG9yIG9wZXJhZG9yYToNCg0KYGBge3J9DQpkZi52ZGEgPC0gZGYudmRhIHw+DQogIGFycmFuZ2UoY2Rfb3BzLCBjb250cmF0YWNhbywgaWRfY2FsZW5kYXIpIHw+IA0KICBtdXRhdGUodmRhID0gaWZfZWxzZShsYWcoY2Rfb3BzKSA9PSBjZF9vcHMgJiBsYWcoY29udHJhdGFjYW8pID09IGNvbnRyYXRhY2FvDQogICAgICAgICAgICAgICAgICAgICAgICYgeWVhcihsYWcoaWRfY2FsZW5kYXIpKSA9PSB5ZWFyKGlkX2NhbGVuZGFyKSAtIDEsIChkcGIvbGFnKGRwYikgLSAxKSAqIDEwMCwNCiAgICAgICAgICAgICAgICAgICAgICAgTkFfcmVhbF8pKSB8PiANCiAgZmlsdGVyKCFpcy5uYSh2ZGEpKSB8PiANCiAgc2VsZWN0KC1pZF9jYWxlbmRhcikNCmBgYA0KDQoNCjxicj4NCg0KIyMjIFZEQSBkbyBzZXRvcg0KDQpFc3RhdMOtc3RpY2FzIGRlc2NyaXRpdmFzIGRhIGJhc2UgZGUgY8OhbGN1bG8gZGEgVkRBLg0KDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpkZi52ZGEgfD4gZ3JvdXBfYnkoY29udHJhdGFjYW8pIHw+IA0KICBzdGF0c1ZEQSgpIA0KYGBgDQoNCjxicj4NCg0KVmlzdWFsaXphw6fDo28gZ3LDoWZpY2EgZGEgZGlzdHJpYnVpw6fDo28gZGEgVkRBIGRhcyBvcGVyYWRvcmFzIGF0cmF2w6lzIGRlIHVtIGdyw6FmaWNvIGJveHBsb3QuDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpkZi52ZGEgfD4gDQogIGdncGxvdChhZXMoeD12ZGEsIHk9Y29udHJhdGFjYW8pKSArDQogIGdlb21fYm94cGxvdChhZXMoZmlsbD1jb250cmF0YWNhbyksIHNob3cubGVnZW5kID0gRkFMU0UpICsgDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArDQogIGxhYnMoeT0iIikgKw0KICB0aGVtZShheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAnZ3JheScpLA0KICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCkpDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KZGYudmRhIHw+IGZpbHRlcihjb250cmF0YWNhbyA9PSAiSW5kaXZpZHVhbCIpIHw+IA0KICBnZ3Bsb3QoYWVzKHg9dmRhLCB5PWNvbnRyYXRhY2FvKSkgKw0KICBnZW9tX2JveHBsb3QoZmlsbD0nIzc1NzBCMycsIHNob3cubGVnZW5kID0gRkFMU0UpICsNCiAgbGFicyh5PSIiKSArDQogIHRoZW1lKGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICdncmF5JyksDQogICAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXNwZWN0LnJhdGlvID0gMC40LzIpIA0KYGBgDQoNCjxicj4NCg0KTyBjw7NkaWdvIGEgc2VndWlyIGlkZW50aWZpY2EgdmFsb3JlcyBhdMOtcGljb3MgcGVsYSBtZXRvZG9sb2dpYSBCb3hQbG90IDEsNXhJUVIgZSBjYWxjdWxhIGEgcHJvcG9yw6fDo28gZGUgdmFsb3JlcyBhdMOtcGljb3MgcG9yIGNhcnRlaXJhOiANCg0KYGBge3J9DQojID09PSBJREVOVElGSUNBIE9VVExJRVJTID09PSBDUklUw4lSSU86IEJPWC1QTE9UIDEuNXggPT09DQpkZi52ZGEgPC0gZGYudmRhIHw+DQogIGdyb3VwX2J5KGNvbnRyYXRhY2FvKSB8PiANCiAgbXV0YXRlKGxnX291dGxpZXIgPSBpZl9lbHNlKHZkYSA+PSAocXVhbnRpbGUodmRhLCAwLjc1LCBuYW1lcyA9IEYpICsgMS41ICogSVFSKHZkYSkpIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB2ZGEgPD0gKHF1YW50aWxlKHZkYSwgMC4yNSwgbmFtZXMgPSBGKSAtIDEuNSAqIElRUih2ZGEpKSwgMUwsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMEwpKSB8PiANCiAgdW5ncm91cCgpDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBQcm9wb3LDp8OjbyBkZSBvdXRsaWVycw0KZGYudmRhIHw+DQogIGdyb3VwX2J5KGNvbnRyYXRhY2FvLCBsZ19vdXRsaWVyKSB8Pg0KICBzdW1tYXJpc2Uobl9vYnMgPSBuKCkpIHw+DQogIGFkZF90YWxseSh3dCA9IG5fb2JzKSB8Pg0KICBtdXRhdGUocGN0X29icyA9IHJvdW5kKG5fb2JzIC8gbiAqIDEwMCwgMSkpDQpgYGANCg0KDQo8YnI+DQoNCkJveHBsb3QgZGEgZGlzdHJpYnVpw6fDo28gZGEgVkRBIGFww7NzIGEgZXhjbHVzw6NvIGRvcyB2YWxvcmVzIGF0w61waWNvcy4NCg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KZGYudmRhIHw+IGZpbHRlcihsZ19vdXRsaWVyID09IDApIHw+IA0KICBnZ3Bsb3QoYWVzKHg9dmRhLCB5PWNvbnRyYXRhY2FvKSkgKw0KICBnZW9tX2JveHBsb3QoYWVzKGZpbGw9Y29udHJhdGFjYW8pLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIA0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKw0KICBsYWJzKHk9IiIpICsNCiAgdGhlbWUoYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG9yID0gJ2dyYXknKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpKQ0KYGBgDQo8YnI+DQoNCkhpc3RvZ3JhbWEgZGEgZGlzdHJpYnVpw6fDo28gZGEgVkRBIHNlbSBvcyB2YWxvcmVzIGF0w61waWNvcy4NCg0KYGBge3IgZWNobz1GQUxTRX0NCmRmLnZkYSB8PiBmaWx0ZXIobGdfb3V0bGllciA9PSAwKSB8PiANCiAgZ2dwbG90KGFlcyh4PXZkYSkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDUwLCBmaWxsID0gJ3doaXRlJywgY29sb3IgPSAic2xhdGVncmF5IikgKw0KICB0aGVtZShheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAnZ3JheScpLA0KICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgbGFicyh4ID0gIkRlc3Blc2EgbWVuc2FsIHBvciBiZW5lZmljacOhcmlvIChSJCkiLA0KICAgICAgIHkgPSAiRnJlcXXDqm5jaWEiKSArIA0KICBmYWNldF9ncmlkKGNvbnRyYXRhY2FvIH4gLikNCmBgYA0KDQoNCg0KPGJyPg0KDQpBIG1ldG9kb2xvZ2lhIGRlIGPDoWxjdWxvIGRhIFZEQSBkbyBzZXRvciBwYXJhIGFwbGljYcOnw6NvIGNvbW8gY29tcG9uZW50ZSBkbyBJUlBJIGFkb3RhIGEgVkRBIG3DqWRpYSBwb25kZXJhZGEgcGVsYSBxdWFudGlkYWRlIGRlIGJlbmVmaWNpw6FyaW9zIG5vIGFubyBtYWlzIHJlY2VudGUsIGFww7NzIGEgZXhjbHVzw6NvIGRvcyB2YWxvcmVzIGF0w61waWNvcy4gQSBzZWd1aXIsIGFwcmVzZW50YS1zZSBhIG3DqWRpYSBwb25kZXJhZGEgZGEgVkRBIChtZWRpYVApIGUgZGVtYWlzIGVzdGF0w61zdGljYXMgZGVzY3JpdGl2YXMgZGEgc3VhIGRpc3RyaWJ1acOnw6NvIGVtIGNhZGEgY2FydGVpcmEuDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpkZi52ZGEgfD4gZmlsdGVyKGxnX291dGxpZXIgPT0gMCkgfD4gDQogIGdyb3VwX2J5KGNvbnRyYXRhY2FvKSB8PiANCiAgc3RhdHNWREEoKQ0KYGBgDQoNCjxicj4NCg0KIyMjIEJhc2UgZGUgY8OhbGN1bG8NCg0KPGJyPg0KDQpHZXJhIGEgYmFzZSBjb21wbGV0YSBxdWUgcmXDum5lIHRvZGFzIGFzIG9ic2VydmHDp8O1ZXMgZGUgcmVjZWl0YSwgZGVzcGVzYSBlIGJlbmVmaWNpw6FyaW9zIGluZm9ybWFkYXMgcGVsYXMgb3BlcmFkb3JhcyBwYXJhIG9zIGRvaXMgYW5vcyBlIG8gY8OhbGN1bG8gZGEgVkRBIHBvciBvcGVyYWRvcmEuDQoNCg0KYGBge3J9DQpzaWIyIDwtIHNpYiB8PiANCiAgbXV0YXRlKGFubyA9IGlmX2Vsc2UoeWVhcihpZF9jYWxlbmRhcik9PXllYXIocGVyaW9kb1sxXSksImFubzEiLCJhbm8yIikpIHw+IA0KICBzZWxlY3QoLWlkX2NhbGVuZGFyKSB8PiANCiAgcmVuYW1lKGJlbiA9IGJlbmVmbSkgfD4gDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBhbm8sIHZhbHVlc19mcm9tID0gYmVuLCB2YWx1ZXNfZmlsbCA9IDAsIG5hbWVzX3ByZWZpeCA9ICJiZW5fIikgfD4gDQogIG11dGF0ZSgNCiAgICAjIG1hcmNhIG9icyBzZW0gc2VxdWVuY2lhIGluaW50ZXJydXB0YSBkZSBiZW5lZmljaWFyaW9zDQogICAgbGdfZXhjbF9iZW5lZiA9IGlmX2Vsc2UoYmVuX2FubzEgPCAxIHwgYmVuX2FubzIgPCAxLCAxTCwgMEwpDQogICkgDQoNCmRpb3BzMiA8LSBkaW9wcyB8PiANCiAgbXV0YXRlKGFubyA9IGlmX2Vsc2UoeWVhcihpZF9jYWxlbmRhcik9PXllYXIocGVyaW9kb1sxXSksImFubzEiLCJhbm8yIikpIHw+IA0KICBzZWxlY3QoLWlkX2NhbGVuZGFyKSB8PiANCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGFubywgdmFsdWVzX2Zyb20gPSBjKGRlc3Blc2EsIHJlY2VpdGEpLCB2YWx1ZXNfZmlsbCA9IDApIHw+IA0KICAjIG1hcmNhIG9icyBxdWUgbsOjbyB0w6ptIGRlc3Blc2Egbm9zIGRvaXMgYW5vcw0KICBtdXRhdGUobGdfZXhjbF9kZXNwZXNhID0gaWZfZWxzZShkZXNwZXNhX2FubzEgPD0gMCB8IGRlc3Blc2FfYW5vMiA8PSAwLCAxTCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwTCkpIA0KDQpkZi52ZGEyIDwtIGRmLnZkYSB8PiANCiAgc2VsZWN0KGNkX29wcywgY29udHJhdGFjYW8sIHZkYSwgbGdfb3V0bGllcikNCg0KZGYucmV1bmlkYSA8LSAgc2liMiB8PiANCiAgZnVsbF9qb2luKGRpb3BzMiwgYnk9YygnY2Rfb3BzJywgJ2NvbnRyYXRhY2FvJykpIHw+IA0KICBtdXRhdGUoZHBiX2FubzEgPSBpZl9lbHNlKGRlc3Blc2FfYW5vMSA+IDAgJiBiZW5fYW5vMSA+IDAsIHJvdW5kKGRlc3Blc2FfYW5vMSAvIGJlbl9hbm8xIC8gMTIsIDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BX3JlYWxfKSwNCiAgICAgICAgIGRwYl9hbm8yID0gaWZfZWxzZShkZXNwZXNhX2FubzIgPiAwICYgYmVuX2FubzIgPiAwLCByb3VuZChkZXNwZXNhX2FubzIgLyBiZW5fYW5vMiAvIDEyLCAyKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgTkFfcmVhbF8pKSB8PiANCiAgZnVsbF9qb2luKGRmLnZkYTIsIGJ5PWMoJ2NkX29wcycsICdjb250cmF0YWNhbycpKSB8PiANCiAgaW5uZXJfam9pbihjYWRvcCwgYnkgPSAnY2Rfb3BzJykgfD4gDQogIHJlbG9jYXRlKHJhemFvX3NvY2lhbDpsZ19yZXNzYWx2YSwgLmFmdGVyID0gY2Rfb3BzKSB8PiANCiAgc2VsZWN0KGNkX29wcyxyYXphb19zb2NpYWwsbW9kYWxpZGFkZSxjb250cmF0YWNhbywgDQogICAgICAgICBzdGFydHNfd2l0aCgnbGdfJyksDQogICAgICAgICBzdGFydHNfd2l0aCgncmVjZWl0YScpLCANCiAgICAgICAgIHN0YXJ0c193aXRoKCdkZXNwZXNhJyksIA0KICAgICAgICAgc3RhcnRzX3dpdGgoJ2JlbicpLCANCiAgICAgICAgIGV2ZXJ5dGhpbmcoKSkgfD4gDQogIG11dGF0ZShhY3Jvc3MocmVjZWl0YV9hbm8xOmJlbl9hbm8yLCB+aWZfZWxzZSgueD09MCxOQV9yZWFsXywueCkpKSB8PiANCiAgbXV0YXRlKGFjcm9zcyhzdGFydHNfd2l0aCgibGdfZXhjbCIpLCB+aWZfZWxzZShpcy5uYSgueCksMUwsLngpKSkNCg0KcmVtb3ZlKGRpb3BzMiwgc2liMiwgZGYudmRhMikNCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpkZi5yZXVuaWRhIHw+IGZpbHRlcihsZ19vdXRsaWVyID09IDApIHw+IA0KICBncm91cF9ieShjb250cmF0YWNhbykgfD4gDQogIHJlbmFtZShiZW5lZm0gPSBiZW5fYW5vMikgfD4gDQogIHN0YXRzVkRBKCkNCmBgYA0KDQoNCjxicj4NCg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KZGYxIDwtIGRmLnJldW5pZGEgfD4gZmlsdGVyKCFpcy5uYShsZ19vdXRsaWVyKSkgfD4gDQogIGdyb3VwX2J5KGNvbnRyYXRhY2FvKSB8PiANCiAgc3VtbWFyaXNlKGJlbmVmLlZEQSA9IHN1bShiZW5fYW5vMiksDQogICAgICAgICAgICBkZXNwZXNhLlZEQSA9IHN1bShkZXNwZXNhX2FubzIpLCANCiAgICAgICAgICAgIG5fb3BzLlZEQSA9IG5fZGlzdGluY3QoY2Rfb3BzKSkNCg0KZGYyIDwtIGRmLnJldW5pZGEgfD4gDQogIGdyb3VwX2J5KGNvbnRyYXRhY2FvKSB8PiANCiAgc3VtbWFyaXNlKGJlbmVmLm9yaWcgICA9IHN1bShiZW5fYW5vMiwgbmEucm0gPSBUKSwNCiAgICAgICAgICAgIGRlc3Blc2Eub3JpZyA9IHN1bShkZXNwZXNhX2FubzIsIG5hLnJtID0gVCksDQogICAgICAgICAgICBuX29wcy5vcmlnLmJlbiAgID0gbl9kaXN0aW5jdChjZF9vcHMsIGJlbl9hbm8yLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgbl9vcHMub3JpZ19kZXNwID0gbl9kaXN0aW5jdChjZF9vcHMsIGRlc3Blc2FfYW5vMiwgbmEucm0gPSBUUlVFKSkgfD4gDQogIGlubmVyX2pvaW4oZGYxLCBieT0nY29udHJhdGFjYW8nKSB8PiANCiAgbXV0YXRlKGJlbmVmLnBjdCAgICA9IGJlbmVmLlZEQSAvIGJlbmVmLm9yaWcgKiAxMDAsIA0KICAgICAgICAgZGVzcGVzYS5wY3QgID0gZGVzcGVzYS5WREEgLyBkZXNwZXNhLm9yaWcgKiAxMDAsDQogICAgICAgICBuX29wcy5iZW5lZi5wY3QgICA9IG5fb3BzLlZEQSAvIG5fb3BzLm9yaWcuYmVuICogMTAwLA0KICAgICAgICAgbl9vcHMuZGVzcGVzYS5wY3QgPSBuX29wcy5WREEgLyBuX29wcy5vcmlnX2Rlc3AgKiAxMDApIHw+IA0KICBzZWxlY3QoY29udHJhdGFjYW8sIHN0YXJ0c193aXRoKCJiZW5lZiIpLCBzdGFydHNfd2l0aCgiZGVzcGVzYSIpLCBzdGFydHNfd2l0aCgibl9vcHMiKSkNCg0KDQpkZjIgfD4gc2VsZWN0KGMoY29udHJhdGFjYW8sIGVuZHNfd2l0aCgnLnBjdCcpKSkgfD4gDQogIHBpdm90X2xvbmdlcihjb2xzID0gZW5kc193aXRoKCIucGN0IiksIA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInBlcmNlbnR1YWwiLCBuYW1lc190byA9ICdNZXRyaWNhJykgfD4gDQogIG11dGF0ZShNZXRyaWNhID0gc3ViKCcucGN0JywgJycsIE1ldHJpY2EpLA0KICAgICAgICAgTWV0cmljYSA9IGNhc2Vfd2hlbigNCiAgICAgICAgICAgTWV0cmljYSA9PSAnYmVuZWYnIH4gJ0JlbmVmaWNpw6FyaW9zJywNCiAgICAgICAgICAgTWV0cmljYSA9PSAnZGVzcGVzYScgfiAnRGVzcGVzYScsDQogICAgICAgICAgIE1ldHJpY2EgPT0gJ25fb3BzLmJlbmVmJyB+ICdPcHMgKFNJQiknLA0KICAgICAgICAgICBNZXRyaWNhID09ICduX29wcy5kZXNwZXNhJyB+ICdPcHMgKERJT1BTKScsIA0KICAgICAgICAgICBUUlVFIH4gJ0VSUk8nKSwNCiAgICAgICAgIHBlcmNlbnR1YWwgPSByb3VuZChwZXJjZW50dWFsLCAxKQ0KICAgICAgICAgKSB8PiANCiAgZ2dwbG90KGFlcyh5ID0gY29udHJhdGFjYW8sIHg9cGVyY2VudHVhbCkpICsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAnZG9kZ2UnLCBmaWxsID0gInNsYXRlZ3JheTQiKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBwZXJjZW50dWFsLCBoanVzdCA9IDEuMiksIGNvbG9yID0gIndoaXRlIiwgDQogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDEpKSArDQogIGxhYnMoeD1OVUxMLCB5PU5VTEwsIA0KICAgICAgIHRpdGxlID0gIlJlcHJlc2VudGF0aXZpZGFkZSBkYSBiYXNlIGRlIGPDoWxjdWxvIGRhIFZEQSBzb2JyZSBhcyBiYXNlcyBvcmlnaW5haXNcbiIpICsNCiAgdGhlbWUoYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG9yID0gJ2dyYXknKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpKSArIA0KICBmYWNldF9ncmlkKE1ldHJpY2EgfiAuKQ0KcmVtb3ZlKGRmMSxkZjIpDQpgYGANCg0KDQoNCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojIG11bHRpcGxlIGRhdGFmcmFtZXMgdG8gYSBmb2xkZXINCmRmcyA8LSBscygpW3NhcHBseShtZ2V0KGxzKCksIC5HbG9iYWxFbnYpLCBpcy5kYXRhLmZyYW1lKV0NCmZvciAoZGYgaW4gZGZzKSB7DQogIGdldChkZikgfD4NCiAgICBtdXRhdGUoYWNyb3NzKHdoZXJlKGlzLmZhY3RvciksIH4gZW5jMnV0ZjgoYXMuY2hhcmFjdGVyKC54KSkpKSB8PiANCiAgICBtdXRhdGUoYWNyb3NzKHdoZXJlKGlzLmNoYXJhY3RlciksIH4gZW5jMnV0ZjgoYXMuY2hhcmFjdGVyKC54KSkpKSB8PiANCiAgICBmd3JpdGUoc3RyX2MoYygiX2Jhc2VzUi8iLCBkZiwgIi5jc3YiKSwgc2VwID0gIiIsIGNvbGxhcHNlID0gIiIpKQ0KfQ0KcmVtb3ZlKGRmLCBkZnMpDQpgYGANCg0KKioqDQoNCiMjIEdsb3Nzw6FyaW8gICAgDQoNCioqQmVuZWZpY2nDoXJpbyoqOiBJbmRpdsOtZHVvIChwZXNzb2EgZsOtc2ljYSkgYmVuZWZpY2nDoXJpbyBkZSBjb2JlcnR1cmEgZGUgcGxhbm8gcHJpdmFkbyBkZSBhc3Npc3TDqm5jaWEgw6Agc2HDumRlIGUgY29uc3VtaWRvciBkZSBzZXJ2acOnb3MgZGUgYXNzaXN0w6puY2lhIMOgIHNhw7pkZS4gICAgICAgICAgICAgIA0KDQoqKkNvbnRyYXRhbnRlKio6IFBlc3NvYSBmw61zaWNhIG91IGp1csOtZGljYSByZXNwb25zw6F2ZWwgcGVsYSBjb250cmF0YcOnw6NvIGRvIHBsYW5vIHByaXZhZG8gZGUgYXNzaXN0w6puY2lhIMOgIHNhw7pkZS4gICAgICAgICAgDQoNCioqT3BlcmFkb3JhKio6IFBlc3NvYSBqdXLDrWRpY2EgY29uc3RpdHXDrWRhIHNvYiBhIG1vZGFsaWRhZGUgZGUgc29jaWVkYWRlIGNpdmlsIG91IGNvbWVyY2lhbCwgY29vcGVyYXRpdmEgb3UgZW50aWRhZGUgZGUgYXV0b2dlc3TDo28sIHF1ZSBvcGVyZSBwcm9kdXRvLCBzZXJ2acOnbyBvdSBjb250cmF0byBkZSBwbGFubyBwcml2YWRvIGRlIGFzc2lzdMOqbmNpYSDDoCBzYcO6ZGUuICAgICAgICAgICAgIA0KDQoqKlBsYW5vIFByaXZhZG8gZGUgQXNzaXN0w6puY2lhIMOgIFNhw7pkZSoqOiBQcmVzdGHDp8OjbyBjb250aW51YWRhIGRlIHNlcnZpw6dvcyBvdSBjb2JlcnR1cmEgZGUgY3VzdG9zIGFzc2lzdGVuY2lhaXMgYSBwcmXDp28gcHLDqSBvdSBww7NzIGVzdGFiZWxlY2lkbywgcG9yIHByYXpvIGluZGV0ZXJtaW5hZG8sIGNvbSBhIGZpbmFsaWRhZGUgZGUgZ2FyYW50aXIsIHNlbSBsaW1pdGUgZmluYW5jZWlybywgYSBhc3Npc3TDqm5jaWEgw6Agc2HDumRlLCBwZWxhIGZhY3VsZGFkZSBkZSBhY2Vzc28gZSBhdGVuZGltZW50byBwb3IgcHJvZmlzc2lvbmFpcyBvdSBzZXJ2acOnb3MgZGUgc2HDumRlLCBsaXZyZW1lbnRlIGVzY29saGlkb3MsIGludGVncmFudGVzIG91IG7Do28gZGUgcmVkZSBjcmVkZW5jaWFkYSwgY29udHJhdGFkYSBvdSByZWZlcmVuY2lhZGEsIHZpc2FuZG8gYSBhc3Npc3TDqm5jaWEgbcOpZGljYSwgaG9zcGl0YWxhciBlIG9kb250b2zDs2dpY2EsIGEgc2VyIHBhZ2EgaW50ZWdyYWwgb3UgcGFyY2lhbG1lbnRlIMOgcyBleHBlbnNhcyBkYSBvcGVyYWRvcmEgY29udHJhdGFkYSwgbWVkaWFudGUgcmVlbWJvbHNvIG91IHBhZ2FtZW50byBkaXJldG8gYW8gcHJlc3RhZG9yLCBwb3IgY29udGEgZSBvcmRlbSBkbyBjb25zdW1pZG9yLiAgICAgICAgICAgICANCg0KKipUaXBvIGRlIGNvbnRyYXRhw6fDo28qKjogICAgICAgICAgIA0KDQogICsgKkluZGl2aWR1YWwgb3UgRmFtaWxpYXIqLCBvZmVyZWNlIGNvYmVydHVyYSBkYSBhdGVuw6fDo28gcHJlc3RhZGEgcGFyYSBhIGxpdnJlIGFkZXPDo28gZGUgYmVuZWZpY2nDoXJpb3MsIHBlc3NvYXMgbmF0dXJhaXMsIGNvbSBvdSBzZW0gZ3J1cG8gZmFtaWxpYXIgICAgICAgICAgICANCiAgDQogICsgKkNvbGV0aXZvIGVtcHJlc2FyaWFsKiwgcXVhbmRvIGEgY29udHJhdGHDp8OjbyDDqSBmZWl0YSBwb3IgbWVpbyBkZSBwZXNzb2EganVyw61kaWNhIHBhcmEgYSBjb2JlcnR1cmEgZGUgcGVzc29hcyBhIGVsYSB2aW5jdWxhZGFzIHBvciByZWxhw6fDo28gZW1wcmVnYXTDrWNpYSBvdSBlc3RhdHV0w6FyaWEgICAgICAgICAgIA0KICANCiAgKyAqQ29sZXRpdm8gcG9yIGFkZXPDo28qLCBxdWFuZG8gYSBjb250cmF0YcOnw6NvIMOpIGZlaXRhIHBvciBtZWlvIGRlIHBlc3NvYSBqdXLDrWRpY2EgZGUgY2Fyw6F0ZXIgcHJvZmlzc2lvbmFsLCBjbGFzc2lzdGEgb3Ugc2V0b3JpYWwgKGUuZy4gY29uc2VsaG9zIHByb2Zpc3Npb25haXMsIGVudGlkYWRlcyBkZSBjbGFzc2UsIHNpbmRpY2F0b3MsIGNvb3BlcmF0aXZhcywgZXRjLikgICAgICAgICAgICANCiAgDQogICAgICAgICAgICAgIA0KICAgICAgICAgICAgICANCioqVGlwbyBkZSBmaW5hbmNpYW1lbnRvKio6ICAgICAgICAgICAgICAgDQoNCiAgKyAqUHLDqS1lc3RhYmVsZWNpZG8qLCBxdWFuZG8gbyB2YWxvciBkYSBjb250cmFwcmVzdGHDp8OjbyBwZWN1bmnDoXJpYSDDqSBwcsOpLWZpeGFkbyBtZWRpYW50ZSBuZWdvY2lhw6fDo28gYW51YWwsIGNhcmFjdGVyaXphbmRvIGNvbnRyYXRvIGRlIHJpc2NvLiAgICAgICAgICAgIA0KICANCiAgKyAqUMOzcy1lc3RhYmVsZWNpZG8qLCBxdWFuZG8gbyB2YWxvciBkYSBjb250cmFwcmVzdGHDp8OjbyBwZWN1bmnDoXJpYSDDqSBlc3RhYmVsZWNpZG8gYXDDs3MgYSBvY29ycsOqbmNpYSBkb3MgcHJvY2VkaW1lbnRvcyBkZSBhc3Npc3TDqm5jaWEgw6Agc2HDumRlLiAgICAgICAgICAgICAgIA0K