Licença

This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0/ or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.

License: CC BY-SA 4.0

Citação

Sugestão de citação: FIGUEIREDO, Adriano Marcos Rodrigues. Microdados com R: Despesa com alimentação conforme a POF 2017/2018. Campo Grande-MS,Brasil: RStudio/Rpubs, 2021. Disponível em http://rpubs.com/amrofi/microdados_pof.

1 Introdução

Este é um script para estimar as despesas de alimentação para o Brasil, feito conforme o script da <Tabela de Alimentacao.R> disponibilizado pelo IBGE (2020). É preciso executar antes o arquivo “Leitura dos Microdados - R.R” que se encontra no arquivo compactado “Programas_de_Leitura.zip” (IBGE, 2020). Este passo é necessário para gerar os arquivos com a extensao .rds correspondentes aos arquivos dos microdados da POF 2017/2018. Esta rotina está disponibilizada diretamente pelo IBGE em microdados da POF.

2 Dados de despesas com alimentação

# Leitura do REGISTRO - CADERNETA COLETIVA (Questionario POF 3)
caderneta_coletiva <- readRDS("CADERNETA_COLETIVA.rds")

[1] Transformação do código do item (variável V9001) em 5 numeros, para ficar no mesmo padrão dos códigos que constam nos arquivos de tradutores das tabelas. Esses códigos são simplificados em 5 números, pois os 2 últimos números caracterizam sinônimos ou termos regionais do produto. Todos os resultados da pesquisa são trabalhados com os códigos considerando os 5 primeiros números. Por exemplo, tangerina e mexirica têm códigos diferentes quando se consideram 7 números, porém o mesmo código quando se consideram os 5 primeiros números.

[2] Exclusão dos itens do REGISTRO - CADERNETA COLETIVA (POF 3) que não se referem aos alimentos (grupos 86 a 89, ver cadastro de produtos).

[3] Anualização e expansão dos valores utilizados para a obtenção dos resultados (variável V8000_defla).

  1. Para anualizar, utilizamos o quesito "fator_anualizacao". Os valores são anualizados para depois se obter uma média mensal.     
  2. Para expandir, utilizamos o quesito "peso_final".       
  3. Posteriormente, o resultado é dividido por 12 para obter a estimativa mensal.
cad_coletiva <- transform(subset(transform(caderneta_coletiva, codigo = round(V9001/100)  # [1]
), codigo < 86001 | codigo > 89999), valor_mensal = (V8000_DEFLA * FATOR_ANUALIZACAO *
    PESO_FINAL)/12  # [3] 
)
rm(caderneta_coletiva)  # para reduzir o uso da memoria


# Leitura do REGISTRO - DESPESA INDIVIDUAL (Questionario POF 4)

despesa_individual <- readRDS("DESPESA_INDIVIDUAL.rds")

[1] Transformação do código do item (variável V9001) em 5 numeros, para ficar no mesmo padrão dos códigos que constam nos arquivos de tradutores das tabelas. Esses códigos são simplificados em 5 números, pois os 2 últimos números caracterizam sinônimos ou termos regionais do produto. Todos os resultados da pesquisa são trabalhados com os códigos considerando os 5 primeiros números.

[2] Selecao dos itens do REGISTRO - DESPESA INDIVIDUAL (POF 4) que entram na tabela de alimentacao (todos do quadro 24 e codigos 41001,48018,49075,49089).

[3] Anualizacao e expansao dos valores utilizados para a obtenção dos resultados (variável V8000_defla).

  1. Para anualizar, utilizamos o quesito "fator_anualizacao". No caso específico dos quadros 48 e 49,cujas informações se referem a valores mensais, utilizamos também o quesito V9011 (numero de meses). Os valores são anualizados para depois se obter uma média mensal.
  2. Para expandir, utilizamos o quesito "peso_final".     
  3. Posteriormente, o resultado é dividido por 12 para obter a estimativa mensal. 
desp_individual <- subset(transform(despesa_individual, codigo = round(V9001/100)  # [1]
), QUADRO == 24 | codigo == 41001 | codigo == 48018 | codigo == 49075 |
    codigo == 49089)  # [2]

desp_individual <- transform(desp_individual, valor_mensal = ifelse(QUADRO == 24 |
    QUADRO == 41, (V8000_DEFLA * FATOR_ANUALIZACAO * PESO_FINAL)/12, (V8000_DEFLA *
    V9011 * FATOR_ANUALIZACAO * PESO_FINAL)/12)  # [3] 
)
rm(despesa_individual)

[1] Junção dos registros CADERNETA COLETIVA e DESPESA INDIVIDUAL, quem englobam os itens de alimentação.

# As duas tabelas precisam ter o mesmo conjunto de variaveis Identificacao dos
# nomes das variaveis das tabelas a serem juntadas:
nomes_cad <- names(cad_coletiva)
nomes_desp <- names(desp_individual)

# Identificacao das variaveis exclusivas a serem incluidas na outra tabela:
incl_cad <- nomes_desp[!nomes_desp %in% nomes_cad]
incl_desp <- nomes_cad[!nomes_cad %in% nomes_desp]

# Criando uma tabela com NAs das variaveis ausentes em cada tabela
col_ad_cad <- data.frame(matrix(NA, nrow(cad_coletiva), length(incl_cad)))
names(col_ad_cad) <- incl_cad
col_ad_desp <- data.frame(matrix(NA, nrow(desp_individual), length(incl_desp)))
names(col_ad_desp) <- incl_desp

# Acrescentando as colunas ausentes em cada tabela:
cad_coletiva <- cbind(cad_coletiva, col_ad_cad)
desp_individual <- cbind(desp_individual, col_ad_desp)

# Juntando (empilhando) as tabelas com conjuntos de variaveis iguais
junta_ali <- rbind(cad_coletiva, desp_individual)  # [1]

Leitura do REGISTRO - MORADOR, necessário para o cálculo do número de UC’s expandido. Vale ressaltar que este e o único registro dos microdados que engloba todas as UC’s.

Extraindo todas as UC’s do arquivo de morador.

morador_uc <- unique(readRDS("MORADOR.rds")[, c("UF", "ESTRATO_POF", "TIPO_SITUACAO_REG",
    "COD_UPA", "NUM_DOM", "NUM_UC", "PESO_FINAL")  # Apenas variaveis com informacoes das UC's no arquivo 'MORADOR.rds'
])  # Apenas um registro por UC

Calculando o número de UC’s expandido. A cada domicílio é associado um peso_final e este é também associado a cada uma de suas unidades de consumo . Portanto, o total de unidades de consumo (familias) expandido, é o resultado da soma dos pesos_finais a elas associados.

soma_familia <- sum(morador_uc$PESO_FINAL)

[1] Leitura do arquivo de tradutor da tabela de alimentação.

Este tradutor organiza os codigos de produtos pelos diferentes grupos da tabela de alimentação. Os arquivos necessários foram colocados na pasta do projeto.

#
tradutor_alimentacao <- readxl::read_excel("Tradutor_Alimentação.xls")  # [1]

[1] Juntando a base de dados com o tradutor da tabela de alimentação por código.

[2] Deletando as linhas referentes aos códigos que nao tiveram frequência.

merge1 <- merge(junta_ali, tradutor_alimentacao, by.x = "codigo", by.y = "Codigo")  # [1]

merge1 <- merge1[!is.na(merge1$valor_mensal), ]  # [2]

Somando os valores mensais de cada grupo de códigos, segundo cada nivel, conforme consta no tradutor.

soma_final_0 <- aggregate(valor_mensal ~ Nivel_0, data = merge1, sum)
names(soma_final_0) <- c("nivel", "soma")

soma_final_1 <- aggregate(valor_mensal ~ Nivel_1, data = merge1, sum)
names(soma_final_1) <- c("nivel", "soma")

soma_final_2 <- aggregate(valor_mensal ~ Nivel_2, data = merge1, sum)
names(soma_final_2) <- c("nivel", "soma")

soma_final_3 <- aggregate(valor_mensal ~ Nivel_3, data = merge1, sum)
names(soma_final_3) <- c("nivel", "soma")

Empilhando as somas obtidas no passo anterior.

soma_final <- rbind(soma_final_0, soma_final_1, soma_final_2, soma_final_3)  # [1]

Calculando a despesa média mensal de cada grupo de códigos, segundo cada nível, conforme consta no tradutor.

merge2 <- data.frame(soma_final, soma_familia = soma_familia)
merge2 <- transform(merge2, media_mensal = round(soma/soma_familia, 2))

Leitura do arquivo de índice que determina a posição que cada linha deve ficar na tabela final. O arquivo de índice é apenas um arquivo auxiliar, criado para associar os resultados gerados com a ordem de apresentação da tabela de resultados.

indice_alimentacao <- readxl::read_excel("indice_Alimentacao.xls")

# Juntando o arquivo das despesas medias mensais de cada grupo de codigos com o
# arquivo de indice, para organizar os itens da tabela

merge3 <- merge(merge2, indice_alimentacao)
merge3 <- merge3[order(merge3$Indice), c(5, 1, 6, 4)]  # [2]
knitr::kable(merge3)
Indice nivel descricao media_mensal
1 1 0 Alimentacao total 658.23
2 2 1 Alimentação no domicílio 442.27
4 3 101 Cereais, leguminosas e oleaginosas 22.22
28 4 1011 Arroz 12.79
29 5 1012 Feijão 5.92
30 6 1013 Orgânicos 0.03
31 7 1014 Outros 3.48
5 8 102 Farinhas, féculas e massas 15.91
32 9 1021 Macarrão 4.45
33 10 1022 Farinha de trigo 1.29
34 11 1023 Farinha de mandioca 2.41
35 12 1024 Outras 7.75
6 13 103 Tubérculos e raízes 7.17
36 14 1031 Batata inglesa 2.77
37 15 1032 Cenoura 1.17
38 16 1033 Mandioca 0.98
39 17 1034 Outros 2.25
7 18 104 Açúcares e derivados 19.93
40 19 1041 Açúcar refinado 2.11
41 20 1042 Açúcar cristal 2.84
42 21 1043 Light e Diet 0.19
43 22 1044 Outros 14.79
8 23 105 Legumes e verduras 16.05
44 24 1051 Tomate 4.97
45 25 1052 Cebola 2.10
46 26 1053 Alface 1.78
47 27 1054 Outros 7.20
9 28 106 Frutas 23.08
48 29 1061 Banana 5.94
49 30 1062 Laranja 2.37
50 31 1063 Maca 2.35
51 32 1064 Outros 12.42
10 33 107 Carnes, vísceras e pescados 89.42
52 34 1071 Carne de boi de primeira 24.46
53 35 1072 Carne de boi de segunda 16.38
54 36 1073 Carne de suíno 7.61
55 37 1074 Carnes e peixes industrializados 19.35
56 38 1075 Pescados frescos 7.12
57 39 1076 Outros 14.50
11 40 108 Aves e ovos 33.58
58 41 1081 Frango 24.76
59 42 1082 Ovo de galinha 7.18
60 43 1083 Orgânicos 0.11
61 44 1084 Outros 1.53
12 45 109 Leites e derivados 46.93
62 46 1091 Leite de vaca 14.46
63 47 1092 Leite em pó 5.57
64 48 1093 Queijos 12.82
65 49 1094 Light e Diet 0.76
66 50 1095 Orgânicos 0.13
67 51 1096 Outros 13.18
13 52 110 Panificados 45.34
68 53 1101 Pão francês 18.54
69 54 1102 Biscoito 11.89
70 55 1103 Light e diet 0.21
71 56 1104 Outros panificados 14.70
14 57 111 Óleos e gorduras 7.40
72 58 1111 Óleo de soja 4.38
73 59 1112 Azeite de oliva 1.91
74 60 1113 Outros 1.11
15 61 112 Bebidas e infusões 47.02
75 62 1121 Café moído 9.92
76 63 1122 Refrigerantes 12.04
77 64 1123 Bebidas não alcoólicas light e diet 0.37
78 65 1124 Cervejas e chopes 10.04
79 66 1125 Outras bebidas alcoólicas 3.74
80 67 1126 Outras 10.91
16 68 113 Enlatados e conservas 3.89
17 69 114 Sal e condimentos 10.19
81 70 1141 Massa de tomate 0.76
82 71 1142 Maionese 1.02
83 72 1143 Sal refinado 0.50
84 73 1144 Outros 7.91
18 74 115 Alimentos preparados 14.90
19 75 116 Outros 39.24
3 76 2 Alimentação fora do domicílio 215.96
20 77 201 Almoço e jantar 145.97
21 78 202 Café, leite, café/leite e chocolate 2.50
22 79 203 Sanduíches e salgados 18.28
23 80 204 Refrigerantes e outras bebidas não alcoólicas 7.25
24 81 205 Lanches 15.82
25 82 206 Cervejas, chopes e outras bebidas alcoólicas 10.03
26 83 207 Alimentação light e diet 0.12
27 84 208 Outras 16.01
# pronto, o objeto merge 3 tem as despesas de alimentacao por grupos!

O resultado pode ser comparado com a tabela do post de IBGE(2019), reproduzida abaixo, no que diz respeito à Despesa com alimentação total e no domicílio.

Despesa com alimentação, Brasil, POF 2017/2018, de IBGE (2019)

Referências

IBGE, POF 2017-2018: Famílias com até R$ 1,9 mil destinam 61,2% de seus gastos à alimentação e habitação. Rio de Janeiro, 2019. Disponível em: https://agenciadenoticias.ibge.gov.br/agencia-sala-de-imprensa/2013-agencia-de-noticias/releases/25598-pof-2017-2018-familias-com-ate-r-1-9-mil-destinam-61-2-de-seus-gastos-a-alimentacao-e-habitacao.

IBGE. Pesquisa de Orçamentos Familiares - POF - Microdados. Rio de Janeiro, 2020. Disponível em: https://www.ibge.gov.br/estatisticas/sociais/habitacao/9050-pesquisa-de-orcamentos-familiares.html?=&t=microdados.

JACOB, Guilherme; PESSOA, Djalma; DAMICO, Anthony. Poverty and Inequality with Complex Survey Data. 2021.

LUMLEY, T. Survey: analysis of complex survey samples. R package version 3.35-1. 2019.

LUMLEY, T. Analysis of complex survey samples. Journal of Statistical Software, 9(1): 1-19. 2004.

PESSOA, Djalma; DAMICO, Anthony; JACOB, Guilherme. convey: Income Concentration Analysis with Complex Survey Samples. R package version 0.2.3. 2021.

end.time <- Sys.time()
time.taken <- end.time - start.time
time.taken
Time difference of 35.99792 secs
LS0tDQp0aXRsZTogJ01pY3JvZGFkb3MgY29tIFI6IERlc3Blc2EgY29tIGFsaW1lbnRhw6fDo28gY29uZm9ybWUgYSBQT0YgMjAxNy8yMDE4Jw0KYXV0aG9yOiAnQWRyaWFubyBNYXJjb3MgUm9kcmlndWVzIEZpZ3VlaXJlZG8sICplLW1haWw6IGFkcmlhbm8uZmlndWVpcmVkb0B1Zm1zLmJyKicNCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVkICVCICVZJylgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHRoZW1lOiBkZWZhdWx0DQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogbm8NCiAgICBkZl9wcmludDogcGFnZWQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogIHBkZl9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQpsaW5rY29sb3I6IGJsdWUNCmFic3RyYWN0OiBUaGlzIGlzIGFuIHVuZGVyZ3JhZCBzdHVkZW50IGxldmVsIGluc3RydWN0aW9uIGZvciBjbGFzcyB1c2UuDQpncmFwaGljczogeWVzDQotLS0NCg0KYGBge3Iga25pdHJfaW5pdCwgZWNobz1GQUxTRSwgY2FjaGU9RkFMU0V9DQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShybWFya2Rvd24pDQpsaWJyYXJ5KHJtZGZvcm1hdHMpDQpzdGFydC50aW1lIDwtIFN5cy50aW1lKCkNCiMjIEdsb2JhbCBvcHRpb25zDQpvcHRpb25zKG1heC5wcmludD0iMTAwIikNCm9wdHNfY2h1bmskc2V0KGVjaG89VFJVRSwNCgkgICAgICAgICAgICAgY2FjaGU9VFJVRSwNCiAgICAgICAgICAgICAgIHByb21wdD1GQUxTRSwNCiAgICAgICAgICAgICAgIHRpZHk9VFJVRSwNCiAgICAgICAgICAgICAgIGNvbW1lbnQ9TkEsDQogICAgICAgICAgICAgICBtZXNzYWdlPUZBTFNFLA0KICAgICAgICAgICAgICAgd2FybmluZz1GQUxTRSkNCm9wdHNfa25pdCRzZXQod2lkdGg9MTAwKQ0KYGBgDQoNCg0KTGljZW7Dp2Egey0jTGljZW7Dp2F9DQo9PT09PT09PT09PT09PT09PT09DQoNClRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1TaGFyZUFsaWtlIDQuMCBJbnRlcm5hdGlvbmFsIExpY2Vuc2UuIFRvIHZpZXcgYSBjb3B5IG9mIHRoaXMgbGljZW5zZSwgdmlzaXQgPGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzQuMC8+IG9yIHNlbmQgYSBsZXR0ZXIgdG8gQ3JlYXRpdmUgQ29tbW9ucywgUE8gQm94IDE4NjYsIE1vdW50YWluIFZpZXcsIENBIDk0MDQyLCBVU0EuDQoNCiFbTGljZW5zZTogQ0MgQlktU0EgNC4wXShodHRwczovL21pcnJvcnMuY3JlYXRpdmVjb21tb25zLm9yZy9wcmVzc2tpdC9idXR0b25zLzg4eDMxL3BuZy9ieS1zYS5wbmcpeyB3aWR0aD0yNSUgfQ0KDQpDaXRhw6fDo28gey0jQ2l0YcOnw6NvfQ0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KU3VnZXN0w6NvIGRlIGNpdGHDp8OjbzoNCkZJR1VFSVJFRE8sIEFkcmlhbm8gTWFyY29zIFJvZHJpZ3Vlcy4gTWljcm9kYWRvcyBjb20gUjogRGVzcGVzYSBjb20gYWxpbWVudGHDp8OjbyBjb25mb3JtZSBhIFBPRiAyMDE3LzIwMTguIENhbXBvIEdyYW5kZS1NUyxCcmFzaWw6IFJTdHVkaW8vUnB1YnMsIDIwMjEuIERpc3BvbsOtdmVsIGVtIDxodHRwOi8vcnB1YnMuY29tL2Ftcm9maS9taWNyb2RhZG9zX3BvZj4uIA0KDQpJbnRyb2R1w6fDo28NCj09PT09PT09PT09PT09PT09PT0NCg0KRXN0ZSDDqSB1bSBzY3JpcHQgcGFyYSBlc3RpbWFyIGFzIGRlc3Blc2FzIGRlIGFsaW1lbnRhw6fDo28gIHBhcmEgbyBCcmFzaWwsIGZlaXRvIGNvbmZvcm1lIG8gc2NyaXB0IGRhIDxUYWJlbGEgZGUgQWxpbWVudGFjYW8uUj4gZGlzcG9uaWJpbGl6YWRvIHBlbG8gSUJHRSAoMjAyMCkuIMOJIHByZWNpc28gZXhlY3V0YXIgYW50ZXMgbyBhcnF1aXZvICJMZWl0dXJhIGRvcyBNaWNyb2RhZG9zIC0gUi5SIiBxdWUgc2UgZW5jb250cmEgbm8gYXJxdWl2byBjb21wYWN0YWRvICJQcm9ncmFtYXNfZGVfTGVpdHVyYS56aXAiIChJQkdFLCAyMDIwKS4gRXN0ZSBwYXNzbyDDqSBuZWNlc3PDoXJpbyBwYXJhIGdlcmFyIG9zIGFycXVpdm9zIGNvbSBhIGV4dGVuc2FvIC5yZHMgY29ycmVzcG9uZGVudGVzIGFvcyBhcnF1aXZvcyBkb3MgbWljcm9kYWRvcyBkYSBQT0YgMjAxNy8yMDE4LiBFc3RhIHJvdGluYSBlc3TDoSBkaXNwb25pYmlsaXphZGEgZGlyZXRhbWVudGUgcGVsbyBJQkdFIGVtIG1pY3JvZGFkb3MgZGEgUE9GLg0KDQpEYWRvcyBkZSBkZXNwZXNhcyBjb20gYWxpbWVudGHDp8Ojbw0KPT09PT09PT09PT09PT09PT09PQ0KDQpgYGB7cn0NCiMgIExlaXR1cmEgZG8gUkVHSVNUUk8gLSBDQURFUk5FVEEgQ09MRVRJVkEgKFF1ZXN0aW9uYXJpbyBQT0YgMykNCmNhZGVybmV0YV9jb2xldGl2YSA8LSByZWFkUkRTKCJDQURFUk5FVEFfQ09MRVRJVkEucmRzIikNCmBgYA0KDQpbMV0gVHJhbnNmb3JtYcOnw6NvIGRvIGPDs2RpZ28gZG8gaXRlbSAodmFyacOhdmVsIFY5MDAxKSBlbSA1IG51bWVyb3MsIHBhcmEgZmljYXIgbm8gbWVzbW8gcGFkcsOjbyBkb3MgY8OzZGlnb3MgcXVlIGNvbnN0YW0gbm9zIGFycXVpdm9zIGRlIHRyYWR1dG9yZXMgZGFzIHRhYmVsYXMuIEVzc2VzIGPDs2RpZ29zIHPDo28gc2ltcGxpZmljYWRvcyBlbSA1IG7Dum1lcm9zLCBwb2lzIG9zIDIgw7psdGltb3MgbsO6bWVyb3MgY2FyYWN0ZXJpemFtIHNpbsO0bmltb3Mgb3UgdGVybW9zIHJlZ2lvbmFpcyBkbyBwcm9kdXRvLiBUb2RvcyBvcyByZXN1bHRhZG9zIGRhIHBlc3F1aXNhIHPDo28gdHJhYmFsaGFkb3MgY29tIG9zIGPDs2RpZ29zIGNvbnNpZGVyYW5kbyBvcyA1IHByaW1laXJvcyBuw7ptZXJvcy4gUG9yIGV4ZW1wbG8sIHRhbmdlcmluYSBlIG1leGlyaWNhIHTDqm0gY8OzZGlnb3MgZGlmZXJlbnRlcyBxdWFuZG8gc2UgY29uc2lkZXJhbSA3IG7Dum1lcm9zLCBwb3LDqW0gbyBtZXNtbyBjw7NkaWdvIHF1YW5kbyBzZSBjb25zaWRlcmFtIG9zIDUgcHJpbWVpcm9zIG7Dum1lcm9zLiANCiAgICANClsyXSBFeGNsdXPDo28gZG9zIGl0ZW5zIGRvIFJFR0lTVFJPIC0gQ0FERVJORVRBIENPTEVUSVZBIChQT0YgMykgcXVlIG7Do28gc2UgcmVmZXJlbSBhb3MgYWxpbWVudG9zIChncnVwb3MgODYgYSA4OSwgdmVyIGNhZGFzdHJvIGRlIHByb2R1dG9zKS4gDQogICAgIA0KWzNdIEFudWFsaXphw6fDo28gZSBleHBhbnPDo28gZG9zIHZhbG9yZXMgdXRpbGl6YWRvcyBwYXJhIGEgb2J0ZW7Dp8OjbyBkb3MgcmVzdWx0YWRvcyAodmFyacOhdmVsIFY4MDAwX2RlZmxhKS4gICAgIA0KDQphKSAgICAgUGFyYSBhbnVhbGl6YXIsIHV0aWxpemFtb3MgbyBxdWVzaXRvICJmYXRvcl9hbnVhbGl6YWNhbyIuIE9zIHZhbG9yZXMgc8OjbyBhbnVhbGl6YWRvcyBwYXJhIGRlcG9pcyBzZSBvYnRlciB1bWEgbcOpZGlhIG1lbnNhbC4gICAgIA0KDQpiKSAgICAgUGFyYSBleHBhbmRpciwgdXRpbGl6YW1vcyBvIHF1ZXNpdG8gInBlc29fZmluYWwiLiAgICAgICANCg0KYykgICAgIFBvc3Rlcmlvcm1lbnRlLCBvIHJlc3VsdGFkbyDDqSBkaXZpZGlkbyBwb3IgMTIgcGFyYSBvYnRlciBhIGVzdGltYXRpdmEgbWVuc2FsLg0KDQpgYGB7ciBjYWRlcm5ldGFzLGNhY2hlPVRSVUV9IA0KY2FkX2NvbGV0aXZhIDwtIA0KICB0cmFuc2Zvcm0oIHN1YnNldCggdHJhbnNmb3JtKCBjYWRlcm5ldGFfY29sZXRpdmEgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RpZ28gPSByb3VuZChWOTAwMS8xMDApICMgWzFdDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICAgICAgICAgICBjb2RpZ28gPCA4NjAwMSB8IGNvZGlnbyA+IDg5OTk5DQogICAgICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgIHZhbG9yX21lbnNhbD0oVjgwMDBfREVGTEEqRkFUT1JfQU5VQUxJWkFDQU8qUEVTT19GSU5BTCkvMTIgIyBbM10gDQogICAgICAgICAgICAgKQ0Kcm0oY2FkZXJuZXRhX2NvbGV0aXZhKSAgIyBwYXJhIHJlZHV6aXIgbyB1c28gZGEgbWVtb3JpYQ0KDQoNCiMgTGVpdHVyYSBkbyBSRUdJU1RSTyAtIERFU1BFU0EgSU5ESVZJRFVBTCAoUXVlc3Rpb25hcmlvIFBPRiA0KQ0KDQpkZXNwZXNhX2luZGl2aWR1YWwgPC0gcmVhZFJEUygiREVTUEVTQV9JTkRJVklEVUFMLnJkcyIpDQpgYGANCg0KWzFdIFRyYW5zZm9ybWHDp8OjbyBkbyBjw7NkaWdvIGRvIGl0ZW0gKHZhcmnDoXZlbCBWOTAwMSkgZW0gNSBudW1lcm9zLCBwYXJhIGZpY2FyIG5vIG1lc21vIHBhZHLDo28gZG9zIGPDs2RpZ29zIHF1ZSBjb25zdGFtIG5vcyBhcnF1aXZvcyBkZSB0cmFkdXRvcmVzIGRhcyB0YWJlbGFzLiBFc3NlcyBjw7NkaWdvcyBzw6NvIHNpbXBsaWZpY2Fkb3MgZW0gNSBuw7ptZXJvcywgcG9pcyBvcyAyIMO6bHRpbW9zIG7Dum1lcm9zIGNhcmFjdGVyaXphbSBzaW7DtG5pbW9zIG91IHRlcm1vcyByZWdpb25haXMgZG8gcHJvZHV0by4gVG9kb3Mgb3MgcmVzdWx0YWRvcyBkYSBwZXNxdWlzYSBzw6NvIHRyYWJhbGhhZG9zIGNvbSBvcyBjw7NkaWdvcyBjb25zaWRlcmFuZG8gb3MgNSBwcmltZWlyb3MgbsO6bWVyb3MuIA0KICAgICANClsyXSBTZWxlY2FvIGRvcyBpdGVucyBkbyBSRUdJU1RSTyAtIERFU1BFU0EgSU5ESVZJRFVBTCAoUE9GIDQpIHF1ZSBlbnRyYW0gbmEgdGFiZWxhIGRlIGFsaW1lbnRhY2FvICh0b2RvcyBkbyBxdWFkcm8gMjQgZSBjb2RpZ29zIDQxMDAxLDQ4MDE4LDQ5MDc1LDQ5MDg5KS4gICANCiAgICAgDQpbM10gQW51YWxpemFjYW8gZSBleHBhbnNhbyBkb3MgdmFsb3JlcyB1dGlsaXphZG9zIHBhcmEgYSBvYnRlbsOnw6NvIGRvcyByZXN1bHRhZG9zICh2YXJpw6F2ZWwgVjgwMDBfZGVmbGEpLiAgICAgDQoNCmEpICAgICBQYXJhIGFudWFsaXphciwgdXRpbGl6YW1vcyBvIHF1ZXNpdG8gImZhdG9yX2FudWFsaXphY2FvIi4gTm8gY2FzbyBlc3BlY8OtZmljbyBkb3MgcXVhZHJvcyA0OCBlIDQ5LGN1amFzIGluZm9ybWHDp8O1ZXMgc2UgcmVmZXJlbSBhIHZhbG9yZXMgbWVuc2FpcywgdXRpbGl6YW1vcyB0YW1iw6ltIG8gcXVlc2l0byBWOTAxMSAobnVtZXJvIGRlIG1lc2VzKS4gT3MgdmFsb3JlcyBzw6NvIGFudWFsaXphZG9zIHBhcmEgZGVwb2lzIHNlIG9idGVyIHVtYSBtw6lkaWEgbWVuc2FsLg0KICAgICAgIA0KYikgICAgIFBhcmEgZXhwYW5kaXIsIHV0aWxpemFtb3MgbyBxdWVzaXRvICJwZXNvX2ZpbmFsIi4gICAgIA0KICAgICANCmMpICAgICBQb3N0ZXJpb3JtZW50ZSwgbyByZXN1bHRhZG8gw6kgZGl2aWRpZG8gcG9yIDEyIHBhcmEgb2J0ZXIgYSBlc3RpbWF0aXZhIG1lbnNhbC4gDQoNCmBgYHtyIGRlc3Blc2EsY2FjaGU9VFJVRX0gIA0KZGVzcF9pbmRpdmlkdWFsIDwtIA0KICBzdWJzZXQoIHRyYW5zZm9ybSggZGVzcGVzYV9pbmRpdmlkdWFsLA0KICAgICAgICAgICAgICAgICAgICAgY29kaWdvID0gcm91bmQoVjkwMDEvMTAwKSAjIFsxXQ0KICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICBRVUFEUk89PTI0fGNvZGlnbz09NDEwMDF8Y29kaWdvPT00ODAxOHxjb2RpZ289PTQ5MDc1fGNvZGlnbz09NDkwODkNCiAgICAgICAgICApICMgWzJdDQoNCmRlc3BfaW5kaXZpZHVhbCA8LQ0KICB0cmFuc2Zvcm0oIGRlc3BfaW5kaXZpZHVhbCwNCiAgICAgICAgICAgICB2YWxvcl9tZW5zYWwgPSBpZmVsc2UoIFFVQURSTz09MjR8UVVBRFJPPT00MSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChWODAwMF9ERUZMQSpGQVRPUl9BTlVBTElaQUNBTypQRVNPX0ZJTkFMKS8xMiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVjgwMDBfREVGTEEqVjkwMTEqRkFUT1JfQU5VQUxJWkFDQU8qUEVTT19GSU5BTCkvMTINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgIyBbM10gDQogICAgICAgICAgICAgKQ0Kcm0oZGVzcGVzYV9pbmRpdmlkdWFsKQ0KYGBgDQoNClsxXSBKdW7Dp8OjbyBkb3MgcmVnaXN0cm9zIENBREVSTkVUQSBDT0xFVElWQSBlIERFU1BFU0EgSU5ESVZJRFVBTCwgcXVlbSBlbmdsb2JhbSBvcyBpdGVucyBkZSBhbGltZW50YcOnw6NvLiANCg0KYGBge3IganVuY2FvLGNhY2hlPVRSVUV9DQojIEFzIGR1YXMgdGFiZWxhcyBwcmVjaXNhbSB0ZXIgbyBtZXNtbyBjb25qdW50byBkZSB2YXJpYXZlaXMNCiMgSWRlbnRpZmljYWNhbyBkb3Mgbm9tZXMgZGFzIHZhcmlhdmVpcyBkYXMgdGFiZWxhcyBhIHNlcmVtIGp1bnRhZGFzOg0Kbm9tZXNfY2FkIDwtIG5hbWVzKGNhZF9jb2xldGl2YSkNCm5vbWVzX2Rlc3AgPC0gbmFtZXMoZGVzcF9pbmRpdmlkdWFsKQ0KDQojIElkZW50aWZpY2FjYW8gZGFzIHZhcmlhdmVpcyBleGNsdXNpdmFzIGEgc2VyZW0gaW5jbHVpZGFzIG5hIG91dHJhIHRhYmVsYToNCmluY2xfY2FkIDwtIG5vbWVzX2Rlc3BbIW5vbWVzX2Rlc3AgJWluJSBub21lc19jYWRdDQppbmNsX2Rlc3AgPC0gbm9tZXNfY2FkWyFub21lc19jYWQgJWluJSBub21lc19kZXNwXQ0KDQojIENyaWFuZG8gdW1hIHRhYmVsYSBjb20gTkFzIGRhcyB2YXJpYXZlaXMgYXVzZW50ZXMgZW0gY2FkYSB0YWJlbGENCmNvbF9hZF9jYWQgPC0gZGF0YS5mcmFtZShtYXRyaXgoTkEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yb3coY2FkX2NvbGV0aXZhKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKGluY2xfY2FkKSkpDQpuYW1lcyhjb2xfYWRfY2FkKSA8LSBpbmNsX2NhZA0KY29sX2FkX2Rlc3AgPC0gZGF0YS5mcmFtZShtYXRyaXgoTkEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yb3coZGVzcF9pbmRpdmlkdWFsKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKGluY2xfZGVzcCkpKQ0KbmFtZXMoY29sX2FkX2Rlc3ApIDwtIGluY2xfZGVzcA0KDQojIEFjcmVzY2VudGFuZG8gYXMgY29sdW5hcyBhdXNlbnRlcyBlbSBjYWRhIHRhYmVsYToNCmNhZF9jb2xldGl2YSA8LSBjYmluZChjYWRfY29sZXRpdmEgLA0KICAgICAgICAgICAgICAgICAgICAgIGNvbF9hZF9jYWQpDQpkZXNwX2luZGl2aWR1YWwgPC0gY2JpbmQoIGRlc3BfaW5kaXZpZHVhbCAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xfYWRfZGVzcCkNCg0KIyBKdW50YW5kbyAoZW1waWxoYW5kbykgYXMgdGFiZWxhcyBjb20gY29uanVudG9zIGRlIHZhcmlhdmVpcyBpZ3VhaXMNCmp1bnRhX2FsaSA8LSANCiAgcmJpbmQoIGNhZF9jb2xldGl2YSAsIGRlc3BfaW5kaXZpZHVhbCApICMgWzFdDQpgYGANCg0KTGVpdHVyYSBkbyBSRUdJU1RSTyAtIE1PUkFET1IsIG5lY2Vzc8OhcmlvIHBhcmEgbyBjw6FsY3VsbyBkbyBuw7ptZXJvIGRlIFVDJ3MgZXhwYW5kaWRvLiBWYWxlIHJlc3NhbHRhciBxdWUgZXN0ZSBlIG8gw7puaWNvIHJlZ2lzdHJvIGRvcyBtaWNyb2RhZG9zIHF1ZSBlbmdsb2JhIHRvZGFzIGFzIFVDJ3MuDQogICAgDQpFeHRyYWluZG8gdG9kYXMgYXMgVUMncyBkbyBhcnF1aXZvIGRlIG1vcmFkb3IuDQoNCmBgYHtyIHVjX21vcmFkb3IsY2FjaGU9VFJVRX0NCm1vcmFkb3JfdWMgPC0gDQogIHVuaXF1ZSggDQogICAgcmVhZFJEUyggDQogICAgICAiTU9SQURPUi5yZHMiIA0KICAgICkgWyAsDQogICAgICAgIGMoICJVRiIsIkVTVFJBVE9fUE9GIiwiVElQT19TSVRVQUNBT19SRUciLCJDT0RfVVBBIiwiTlVNX0RPTSIsIk5VTV9VQyIsDQogICAgICAgICAgICJQRVNPX0ZJTkFMIg0KICAgICAgICApICMgQXBlbmFzIHZhcmlhdmVpcyBjb20gaW5mb3JtYWNvZXMgZGFzIFVDJ3Mgbm8gYXJxdWl2byAiTU9SQURPUi5yZHMiDQogICAgICAgIF0gKSAjIEFwZW5hcyB1bSByZWdpc3RybyBwb3IgVUMNCmBgYA0KDQoNCkNhbGN1bGFuZG8gbyBuw7ptZXJvIGRlIFVDJ3MgZXhwYW5kaWRvLiBBIGNhZGEgZG9taWPDrWxpbyDDqSBhc3NvY2lhZG8gdW0gcGVzb19maW5hbCBlIGVzdGUgw6kgdGFtYsOpbSBhc3NvY2lhZG8gYSBjYWRhIHVtYSBkZSBzdWFzIHVuaWRhZGVzIGRlIGNvbnN1bW8gLiBQb3J0YW50bywgbyB0b3RhbCBkZSB1bmlkYWRlcyBkZSBjb25zdW1vIChmYW1pbGlhcykgZXhwYW5kaWRvLCDDqSBvIHJlc3VsdGFkbyBkYSBzb21hIGRvcyBwZXNvc19maW5haXMgYSBlbGFzIGFzc29jaWFkb3MuDQoNCmBgYHtyIHNvbWFfZmFtaWxpYSwgY2FjaGU9VFJVRX0NCnNvbWFfZmFtaWxpYSA8LSBzdW0oIG1vcmFkb3JfdWMkUEVTT19GSU5BTCApDQpgYGANCg0KWzFdIExlaXR1cmEgZG8gYXJxdWl2byBkZSB0cmFkdXRvciBkYSB0YWJlbGEgZGUgYWxpbWVudGHDp8Ojby4gDQoNCkVzdGUgdHJhZHV0b3Igb3JnYW5pemEgb3MgY29kaWdvcyBkZSBwcm9kdXRvcyBwZWxvcyBkaWZlcmVudGVzIGdydXBvcyBkYSB0YWJlbGEgZGUgYWxpbWVudGHDp8Ojby4gT3MgYXJxdWl2b3MgbmVjZXNzw6FyaW9zIGZvcmFtIGNvbG9jYWRvcyBuYSBwYXN0YSBkbyBwcm9qZXRvLg0KDQpgYGB7ciB0cmFkdXRvcixjYWNoZT1UUlVFfQ0KIyANCnRyYWR1dG9yX2FsaW1lbnRhY2FvIDwtDQogIHJlYWR4bDo6cmVhZF9leGNlbCgiVHJhZHV0b3JfQWxpbWVudGHDp8Ojby54bHMiKSAjIFsxXQ0KYGBgDQoNClsxXSBKdW50YW5kbyBhIGJhc2UgZGUgZGFkb3MgY29tIG8gdHJhZHV0b3IgZGEgdGFiZWxhIGRlIGFsaW1lbnRhw6fDo28gcG9yIGPDs2RpZ28uICAgIA0KDQpbMl0gRGVsZXRhbmRvIGFzIGxpbmhhcyByZWZlcmVudGVzIGFvcyBjw7NkaWdvcyBxdWUgbmFvIHRpdmVyYW0gZnJlcXXDqm5jaWEuDQoNCmBgYHtyIG1lcmdlMSxjYWNoZT1UUlVFfQ0KbWVyZ2UxIDwtIA0KICBtZXJnZSgganVudGFfYWxpICwNCiAgICAgICAgIHRyYWR1dG9yX2FsaW1lbnRhY2FvICwNCiAgICAgICAgIGJ5LnggPSAiY29kaWdvIiAsDQogICAgICAgICBieS55ID0gIkNvZGlnbyINCiAgICAgICAgICkgIyBbMV0NCg0KbWVyZ2UxIDwtIA0KICBtZXJnZTFbIWlzLm5hKG1lcmdlMSR2YWxvcl9tZW5zYWwpLCBdICMgWzJdDQpgYGANCg0KU29tYW5kbyBvcyB2YWxvcmVzIG1lbnNhaXMgZGUgY2FkYSBncnVwbyBkZSBjw7NkaWdvcywgc2VndW5kbyBjYWRhIG5pdmVsLCBjb25mb3JtZSBjb25zdGEgbm8gdHJhZHV0b3IuDQoNCmBgYHtyIHNvbWFtZXMsY2FjaGU9VFJVRX0NCnNvbWFfZmluYWxfMCA8LSBhZ2dyZWdhdGUodmFsb3JfbWVuc2Fsfk5pdmVsXzAsZGF0YT1tZXJnZTEsc3VtKQ0KbmFtZXMoc29tYV9maW5hbF8wKSA8LSBjKCJuaXZlbCIsICJzb21hIikNCg0Kc29tYV9maW5hbF8xIDwtIGFnZ3JlZ2F0ZSh2YWxvcl9tZW5zYWx+Tml2ZWxfMSxkYXRhPW1lcmdlMSxzdW0pDQpuYW1lcyhzb21hX2ZpbmFsXzEpIDwtIGMoIm5pdmVsIiwgInNvbWEiKQ0KDQpzb21hX2ZpbmFsXzIgPC0gYWdncmVnYXRlKHZhbG9yX21lbnNhbH5OaXZlbF8yLGRhdGE9bWVyZ2UxLHN1bSkNCm5hbWVzKHNvbWFfZmluYWxfMikgPC0gYygibml2ZWwiLCAic29tYSIpDQoNCnNvbWFfZmluYWxfMyA8LSBhZ2dyZWdhdGUodmFsb3JfbWVuc2Fsfk5pdmVsXzMsZGF0YT1tZXJnZTEsc3VtKQ0KbmFtZXMoc29tYV9maW5hbF8zKSA8LSBjKCJuaXZlbCIsICJzb21hIikNCmBgYA0KDQpFbXBpbGhhbmRvIGFzIHNvbWFzIG9idGlkYXMgbm8gcGFzc28gYW50ZXJpb3IuIA0KDQpgYGB7ciBlbXBpbGhhLCBjYWNoZT1UUlVFfQ0Kc29tYV9maW5hbCA8LSByYmluZCggc29tYV9maW5hbF8wICwNCiAgICAgICAgICAgICAgICAgICAgIHNvbWFfZmluYWxfMSAsDQogICAgICAgICAgICAgICAgICAgICBzb21hX2ZpbmFsXzIgLA0KICAgICAgICAgICAgICAgICAgICAgc29tYV9maW5hbF8zDQogICAgICAgICAgICAgICAgICAgICApICMgWzFdDQpgYGANCg0KQ2FsY3VsYW5kbyBhIGRlc3Blc2EgbcOpZGlhIG1lbnNhbCBkZSBjYWRhIGdydXBvIGRlIGPDs2RpZ29zLCBzZWd1bmRvIGNhZGEgbsOtdmVsLCBjb25mb3JtZSBjb25zdGEgbm8gdHJhZHV0b3IuDQoNCmBgYHtyIG1lcmdlMiwgY2FjaGU9VFJVRX0NCm1lcmdlMiA8LSBkYXRhLmZyYW1lKCBzb21hX2ZpbmFsICwgc29tYV9mYW1pbGlhPXNvbWFfZmFtaWxpYSApDQptZXJnZTIgPC0gDQogIHRyYW5zZm9ybSggbWVyZ2UyICwNCiAgICAgICAgICAgICBtZWRpYV9tZW5zYWwgPSByb3VuZCggc29tYSAvIHNvbWFfZmFtaWxpYSAsIDIgKSApDQpgYGANCg0KTGVpdHVyYSBkbyBhcnF1aXZvIGRlIMOtbmRpY2UgcXVlIGRldGVybWluYSBhIHBvc2nDp8OjbyBxdWUgY2FkYSBsaW5oYSBkZXZlIGZpY2FyIG5hIHRhYmVsYSBmaW5hbC4gTyBhcnF1aXZvIGRlIMOtbmRpY2Ugw6kgYXBlbmFzIHVtIGFycXVpdm8gYXV4aWxpYXIsIGNyaWFkbyBwYXJhIGFzc29jaWFyIG9zIHJlc3VsdGFkb3MgZ2VyYWRvcyBjb20gYSBvcmRlbSBkZSBhcHJlc2VudGHDp8OjbyBkYSB0YWJlbGEgZGUgcmVzdWx0YWRvcy4NCg0KYGBge3IgbWVyZ2UzLCBjYWNoZT1UUlVFfQ0KaW5kaWNlX2FsaW1lbnRhY2FvIDwtDQogIHJlYWR4bDo6cmVhZF9leGNlbCgiaW5kaWNlX0FsaW1lbnRhY2FvLnhscyIpDQoNCiMgSnVudGFuZG8gbyBhcnF1aXZvIGRhcyBkZXNwZXNhcyBtZWRpYXMgbWVuc2FpcyBkZSBjYWRhIGdydXBvDQojIGRlIGNvZGlnb3MgY29tIG8gYXJxdWl2byBkZSBpbmRpY2UsIHBhcmEgb3JnYW5pemFyIG9zIGl0ZW5zIGRhIHRhYmVsYQ0KDQptZXJnZTMgPC0gbWVyZ2UobWVyZ2UyLGluZGljZV9hbGltZW50YWNhbykNCm1lcmdlMyA8LSANCiAgbWVyZ2UzWyBvcmRlciggbWVyZ2UzJEluZGljZSApICwgYyg1LDEsNiw0KSBdICMgWzJdDQprbml0cjo6a2FibGUobWVyZ2UzKQ0KIyBwcm9udG8sIG8gb2JqZXRvIG1lcmdlIDMgdGVtIGFzIGRlc3Blc2FzIGRlIGFsaW1lbnRhY2FvIHBvciBncnVwb3MhDQoNCmBgYA0KDQpPIHJlc3VsdGFkbyBwb2RlIHNlciBjb21wYXJhZG8gY29tIGEgdGFiZWxhIGRvIHBvc3QgZGUgSUJHRSgyMDE5KSwgcmVwcm9kdXppZGEgYWJhaXhvLCBubyBxdWUgZGl6IHJlc3BlaXRvIMOgIERlc3Blc2EgY29tIGFsaW1lbnRhw6fDo28gdG90YWwgZSBubyBkb21pY8OtbGlvLg0KDQoNCiFbRGVzcGVzYSBjb20gYWxpbWVudGHDp8OjbywgQnJhc2lsLCBQT0YgMjAxNy8yMDE4LCBkZSBJQkdFICgyMDE5KV0odGFiZWxhX3Bvc3QuanBnKXsgd2lkdGg9MTAwJSB9DQoNClJlZmVyw6puY2lhcyB7LSNSZWZlcsOqbmNpYXN9DQo9PT09PT09PT09PT09PT09PT09PT09PT0NCg0KSUJHRSwgUE9GIDIwMTctMjAxODogRmFtw61saWFzIGNvbSBhdMOpIFIkIDEsOSBtaWwgZGVzdGluYW0gNjEsMiUgZGUgc2V1cyBnYXN0b3Mgw6AgYWxpbWVudGHDp8OjbyBlIGhhYml0YcOnw6NvLiBSaW8gZGUgSmFuZWlybywgMjAxOS4gRGlzcG9uw612ZWwgZW06IDxodHRwczovL2FnZW5jaWFkZW5vdGljaWFzLmliZ2UuZ292LmJyL2FnZW5jaWEtc2FsYS1kZS1pbXByZW5zYS8yMDEzLWFnZW5jaWEtZGUtbm90aWNpYXMvcmVsZWFzZXMvMjU1OTgtcG9mLTIwMTctMjAxOC1mYW1pbGlhcy1jb20tYXRlLXItMS05LW1pbC1kZXN0aW5hbS02MS0yLWRlLXNldXMtZ2FzdG9zLWEtYWxpbWVudGFjYW8tZS1oYWJpdGFjYW8+Lg0KICAgICANCklCR0UuIFBlc3F1aXNhIGRlIE9yw6dhbWVudG9zIEZhbWlsaWFyZXMgLSBQT0YgLSBNaWNyb2RhZG9zLiBSaW8gZGUgSmFuZWlybywgMjAyMC4gRGlzcG9uw612ZWwgZW06IDxodHRwczovL3d3dy5pYmdlLmdvdi5ici9lc3RhdGlzdGljYXMvc29jaWFpcy9oYWJpdGFjYW8vOTA1MC1wZXNxdWlzYS1kZS1vcmNhbWVudG9zLWZhbWlsaWFyZXMuaHRtbD89JnQ9bWljcm9kYWRvcz4uICAgIA0KICAgIA0KSkFDT0IsIEd1aWxoZXJtZTsgIFBFU1NPQSwgIERqYWxtYTsgREFNSUNPLCBBbnRob255LiBQb3ZlcnR5IGFuZCBJbmVxdWFsaXR5IHdpdGggQ29tcGxleCBTdXJ2ZXkgRGF0YS4gMjAyMS4gICAgDQogICAgDQpMVU1MRVksICBULiBTdXJ2ZXk6IGFuYWx5c2lzIG9mIGNvbXBsZXggc3VydmV5IHNhbXBsZXMuIFIgcGFja2FnZSB2ZXJzaW9uIDMuMzUtMS4gMjAxOS4gICAgDQogICAgDQpMVU1MRVksICBULiBBbmFseXNpcyBvZiBjb21wbGV4IHN1cnZleSBzYW1wbGVzLiBKb3VybmFsIG9mIFN0YXRpc3RpY2FsIFNvZnR3YXJlLCA5KDEpOiAxLTE5LiAyMDA0LiAgICAgDQogICAgDQpQRVNTT0EsICBEamFsbWE7IERBTUlDTywgQW50aG9ueTsgSkFDT0IsIEd1aWxoZXJtZS4gY29udmV5OiBJbmNvbWUgQ29uY2VudHJhdGlvbiBBbmFseXNpcyB3aXRoIENvbXBsZXggU3VydmV5IFNhbXBsZXMuIFIgcGFja2FnZSB2ZXJzaW9uIDAuMi4zLiAyMDIxLiAgICANCg0KDQpgYGB7cn0NCmVuZC50aW1lIDwtIFN5cy50aW1lKCkNCnRpbWUudGFrZW4gPC0gZW5kLnRpbWUgLSBzdGFydC50aW1lDQp0aW1lLnRha2VuDQpgYGANCiAgIA==