Introdução

Este trabalho tem como objetivo explorar e analisar o conjunto de dados “Abortion” do pacote ltm, contendo itens de um instrumento de medida associado a um traço latente. A análise será conduzida com base na Teoria de Resposta ao Item (TRI), uma abordagem estatística amplamente utilizada para modelar a relação entre as respostas dos participantes e o traço latente subjacente. Posteriormente, procederemos com a calibração dos itens, utilizando o modelo TRI mais adequado. A escolha deste modelo será fundamentada em evidências estatísticas, considerando critérios como ajuste do modelo aos dados e robustez estatística e partir do modelo escolhido, será estimado o traço latente de cada indivíduo.

No ínicio, os dados consistiam nas respostas em 1986 a 7 questões relacionadas à atitude em relação ao aborto por membros de um painel pesquisado em cada um dos anos de 1983 a 1986, como parte de uma investigação das atitudes sociais britânicas (ver McGrath & Waterton, 1986). Para cada questão, os entrevistados foram questionados se a lei deveria permitir o aborto. Porém, no banco de dados “Abortion” do pacote ltm, 3 questões foram retiradas resultando em um banco com 4 variáveis.
Além disso, o banco continha no total 410 observações entretanto um pequeno número de indivíduos (31) não respondeu algumas das 4 questões e portanto essas observações foram deletadas resultando num banco com 379 observações.


VARIÁVEL LATENTE:

Percepção em relação a aprovação do aborto pela lei.


QUESTÕES

(1) The woman decides on her own she does not wish to have the child.

(2) The couple agree they do not wish to have the child.

(3) The woman is not married and does not wish to marry thp man.

(4) The couple cannot afford any more children.


Ao todo, temos 379 observações,


str(banco_abortion)
## 'data.frame':    379 obs. of  4 variables:
##  $ Item 1: Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ...
##  $ Item 2: Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ...
##  $ Item 3: Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ...
##  $ Item 4: Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ...


Matriz de Correlação

Foi utilizada neste caso a correlação tetracórica já que tem presença de variáveis categóricas binárias (dummies).

As correlações mais fortes (0.90) foram entre Item1 e Item 2 de um lado e entre Item 3 e Item 4 do outro .


Cálculo dos autovalores:

round(eigen(correlacao$rho)$values,2)
## [1] 3.57 0.26 0.10 0.07


Cálculo da proporção explicada por cada fator:

proporcao_explicacao<-eigen(correlacao$rho)$values/
sum(eigen(correlacao$rho)$values)
proporcao_explicacao
## [1] 0.89310395 0.06476400 0.02417373 0.01795831

Olhando as saídas que obtivemos dos códigos acima podemos dizer que temos um único fator para esses 4 itens.


desc <- descript(Abortion)
desc
## 
## Descriptive statistics for the 'Abortion' data-set
## 
## Sample:
##  4 items and 379 sample units; 0 missing values
## 
## Proportions for each level of response:
##             0      1   logit
## Item 1 0.5620 0.4380 -0.2493
## Item 2 0.4063 0.5937  0.3791
## Item 3 0.3641 0.6359  0.5575
## Item 4 0.3826 0.6174  0.4786
## 
## 
## Frequencies of total scores:
##        0  1  2  3   4
## Freq 103 33 37 65 141
## 
## 
## Point Biserial correlation with Total Score:
##        Included Excluded
## Item 1   0.8164   0.6673
## Item 2   0.8674   0.7541
## Item 3   0.8769   0.7737
## Item 4   0.8355   0.7025
## 
## 
## Cronbach's alpha:
##                   value
## All Items        0.8707
## Excluding Item 1 0.8573
## Excluding Item 2 0.8223
## Excluding Item 3 0.8148
## Excluding Item 4 0.8430
## 
## 
## Pairwise Associations:
##   Item i Item j p.value
## 1      1      4  <2e-16
## 2      1      3  <2e-16
## 3      2      4  <2e-16
## 4      1      2  <2e-16
## 5      2      3  <2e-16
## 6      3      4  <2e-16

Com essa função se tem o alpha de cronbach que vai informar sobre o fato de um item prejudicar a consistencia interna do modelo

Resultado 1: Podemos observar que teve mais indivíduos que aprovaram o aborto diante da circunstância do item 3 (0 = 0,3641 vs 1 = 0,6359) do que diante da circunstância dos outros itens.

Resultado 2: Podemos observar que teve mais indivíduos que aprovaram o aborto diante de todas as circunstâncias dos 4 itens (um total de 141 pessoas).

Resultado 3: Podemos observar que a correlação ponto bisserial de cada item com o Escore Total quando o item em evidência não está incluído no cálculo do Escore Total ficou menor do que a correlação ponto bisserial de cada item com o Escore Total quando o item em evidência está incluído no cáclulo do Escore Total.

Resultado 4: Podemos observar pelos alphas de Cronbach (todos menores que 0,8707) que nenhum item parece prejudicar a consistência interna do modelo.

Resultado 5: Podemos concluir pelos p-valores que há dependência entre os pares de itens.


Modelo de Rasch

Aqui foi utilizado como discriminante o valor 1,702 para ter resultados semelhantes ao da função ogiva normal com qual trabalhavam os pioneiros da TRI

fit.Abortion<-rasch(banco_abortion,constraint=cbind(ncol(banco_abortion)+1,1.702))
summary(fit.Abortion)
## 
## Call:
## rasch(data = banco_abortion, constraint = cbind(ncol(banco_abortion) + 
##     1, 1.702))
## 
## Model Summary:
##    log.Lik      AIC      BIC
##  -771.3321 1550.664 1566.414
## 
## Coefficients:
##                 value std.err  z.vals
## Dffclt.Item 1  0.2702  0.0952  2.8380
## Dffclt.Item 2 -0.3586  0.0965 -3.7162
## Dffclt.Item 3 -0.5372  0.0979 -5.4898
## Dffclt.Item 4 -0.4584  0.0972 -4.7153
## Dscrmn         1.7020      NA      NA
## 
## Integration:
## method: Gauss-Hermite
## quadrature points: 21 
## 
## Optimization:
## Convergence: 0 
## max(|grad|): 9.7e-05 
## quasi-Newton: BFGS


Ordenando os resultados do parâmetro de ‘dificuldade’

coef(fit.Abortion, prob = TRUE, order = TRUE)
##            Dffclt Dscrmn P(x=1|z=0)
## Item 3 -0.5372455  1.702  0.7138980
## Item 4 -0.4583559  1.702  0.6857064
## Item 2 -0.3586260  1.702  0.6480278
## Item 1  0.2701994  1.702  0.3870144


Olhando os resultados encontrados após implementação desse modelo de Rasch, o item mais grave (mais difícil) é o item 1.

Desse modo, também podemos interpretar que vai ser maior a aptidão exigida para que o indivíduo tenha 50% de chance de aprovar o aborto diante da situação do item 1.

Outra interpretação seria: os indivíduos que apresentam um traço latente de ‘0,27’ acima da média terão probabilidade de aprovar o aborto diante da situação do item 1 igual a 0,5.

Informação do teste

information(fit.Abortion, c(-4,4))
## 
## Call:
## rasch(data = banco_abortion, constraint = cbind(ncol(banco_abortion) + 
##     1, 1.702))
## 
## Total Information = 6.81
## Information in (-4, 4) = 6.79 (99.72%)
## Based on all the items

Information in (-4, 4) = 6,79 (99,72%). Isso quer dizer que quase 100% dos traços latentes ficaram no intervalo (-4, 4).


Curva Característica do item

plot(fit.Abortion,legend = TRUE, pch = rep(1:2, each = 4),ylab="Probabilidade de aprovação do aborto", xlab = "Percepção em relação ao Aborto", main="Curva Característica do item",col = rep(1:4, 2), lwd = 2, cex = 1.2)
abline(h=0.5, lty="dashed",lwd=2)

O gráfico acima mostra como a probabilidade de resposta correta varia em função da habilidade do respondente.


Curva de Informação do Item

plot(fit.Abortion, type = "IIC", legend = TRUE, pch = rep(1:2, each = 4), main="Curva de Informação do Item", xlab = "Percepção em relação ao Aborto", col = rep(1:4, 2), lwd = 2, cex = 1.2)

Olhando o gráfico acima parece que todos os 4 itens são importantes para medir a percepção em relação ao aborto.


Curva de Informação do Teste


Modelo Logístico de 2 Parâmetros

fit.Abortion_2param <- ltm(banco_abortion ~ z1)
summary(fit.Abortion_2param)
## 
## Call:
## ltm(formula = banco_abortion ~ z1)
## 
## Model Summary:
##    log.Lik      AIC      BIC
##  -706.3369 1428.674 1460.174
## 
## Coefficients:
##                 value std.err  z.vals
## Dffclt.Item 1  0.1697  0.0659  2.5749
## Dffclt.Item 2 -0.2362  0.0618 -3.8198
## Dffclt.Item 3 -0.3428  0.0671 -5.1062
## Dffclt.Item 4 -0.3165  0.0654 -4.8411
## Dscrmn.Item 1  4.4532  1.0245  4.3468
## Dscrmn.Item 2  4.3226  0.6824  6.3340
## Dscrmn.Item 3  5.6639  0.9957  5.6883
## Dscrmn.Item 4  3.6254  0.5570  6.5087
## 
## Integration:
## method: Gauss-Hermite
## quadrature points: 21 
## 
## Optimization:
## Convergence: 0 
## max(|grad|): 0.0039 
## quasi-Newton: BFGS
coef(fit.Abortion_2param, prob = TRUE, order = TRUE)
##            Dffclt   Dscrmn P(x=1|z=0)
## Item 3 -0.3428040 5.663928  0.8745297
## Item 4 -0.3164814 3.625383  0.7590295
## Item 2 -0.2362298 4.322628  0.7351934
## Item 1  0.1696615 4.453179  0.3196169

Podemos ver que assim como no modelo de Rasch, o item 3 foi o que apresentou a menor dificuldade além de ter a maior capacidade de discriminação, enquanto que o item 1 foi considerado o mais difícil.

information(fit.Abortion_2param, c(-4,4))
## 
## Call:
## ltm(formula = banco_abortion ~ z1)
## 
## Total Information = 18.07
## Information in (-4, 4) = 18.07 (100%)
## Based on all the items

O modelo apresentou uma Informação Total de 18.07, muito maior se comparada ao modelo de Rasch (6.81). Além disso, Information in (-4, 4) indica que este valor (18.07) representa a informação contida na faixa de habilidade entre -4 e 4. O fato de a informação dentro da faixa de habilidade específica ser 100% do total indica que a maior parte da informação relevante está contida nessa faixa. Isso sugere que o modelo é bastante preciso em estimar habilidades dentro desse intervalo específico.


Curva Característica do Item

plot(fit.Abortion_2param, legend = TRUE, pch = rep(1:2, each = 4),ylab="Probabilidade de aprovação do aborto", xlab = "Percepção em relação ao Aborto", col = rep(1:4, 2), lwd = 2, cex = 1.2, main="Curva Característica do Item")
abline(h=0.5, lty="dashed",lwd=2)

O gráfico acima mostra como a probabilidade de aprovação do aborto varia em função da habilidade do respondente.


Curva de Informação do Item

plot(fit.Abortion_2param, type = "IIC", legend = TRUE, pch = rep(1:2, each = 4), xlab = "Percepção em relação ao Aborto", main="Curva de Informação do Item", col = rep(1:4, 2), lwd = 2, cex = 1.2, sub = paste("Call: ", deparse(fit.Abortion_2param$call)))

Olhando o gráfico acima parece que o item mais importante é o item 3 e o item menos importante é o item 4.

Curva de Informação do Teste

info2= plot(fit.Abortion_2param, type = "IIC", items = 0, lwd = 2, xlab = "Percepção em relação ao Aborto")


# Configurar o layout para adicionar um novo gráfico sobre o anterior
par(new = TRUE)

# Calcular o erro padrão e plotar o gráfico de erro padrão
plot(info2[, "z"], 1 / sqrt(info2[, "info"]), type = "l", lwd = 2, xlab = "", ylab = "", main = "", col='red')

# Adicionar rótulos aos eixos do segundo gráfico
axis(4)  # Eixo do lado direito para o erro padrão
mtext("Erro padrão", side = 4, line = 3)

# Adicionar uma legenda para distinguir os dois conjuntos de dados
legend("topright", legend = c("Informação", "Erro padrão"), lty = c(1, 1), lwd = c(2, 2), col = c("black", "red"))


Modelo Logístico de 3 Parâmetros

fit.Abortion_3param <- tpm(banco_abortion)
summary(fit.Abortion_3param)
## 
## Call:
## tpm(data = banco_abortion)
## 
## Model Summary:
##   log.Lik      AIC      BIC
##  -706.292 1436.584 1483.835
## 
## Coefficients:
##                 value std.err  z.vals
## Gussng.Item 1  0.0000  0.0006  0.0154
## Gussng.Item 2  0.0390  0.1132  0.3447
## Gussng.Item 3  0.0000  0.0001  0.0009
## Gussng.Item 4  0.0000  0.0000  0.0002
## Dffclt.Item 1  0.1719  0.0659  2.6078
## Dffclt.Item 2 -0.1713  0.2172 -0.7884
## Dffclt.Item 3 -0.3361  0.0690 -4.8718
## Dffclt.Item 4 -0.3112  0.0661 -4.7086
## Dscrmn.Item 1  4.4876  1.0337  4.3411
## Dscrmn.Item 2  5.3638  4.8697  1.1015
## Dscrmn.Item 3  5.6622  0.9939  5.6969
## Dscrmn.Item 4  3.6449  0.5644  6.4585
## 
## Integration:
## method: Gauss-Hermite
## quadrature points: 21 
## 
## Optimization:
## Optimizer: optim (BFGS)
## Convergence: 0 
## max(|grad|): 0.0033
coef(fit.Abortion_3param, prob = TRUE, order = TRUE)
##              Gussng     Dffclt   Dscrmn P(x=1|z=0)
## Item 3 1.224925e-07 -0.3361170 5.662157  0.8702473
## Item 4 2.586972e-09 -0.3111613 3.644916  0.7566052
## Item 2 3.901043e-02 -0.1712674 5.363785  0.7258924
## Item 1 8.973992e-06  0.1718710 4.487565  0.3162079

Por um lado, podemos ver que assim como no modelo de Rasch e no modelo de 2 parâmetros, o item3 foi o que apresentou a menor dificuldade além de ter a maior capacidade de discriminação, enquanto que o item1 foi considerado o mais difícil. Por outro lado o modelo Logístico de 3 Parâmetros adiciona um terceiro parâmetro que representa o efeito de adivinhação (acerto casual). No nosso caso este parâmetro reflete a probabilidade de um respondente com percepção em relação ao aborto muito baixa ainda aprovar o aborto ao acaso. Podemos ver que nesse caso de estudo não há a presença de “chute”, visto que não estamos medindo uma habilidade específica. Os resultados corroboram essa conclusão, já que o único coeficiente de “advinhação” acima de 0 foi o item 2 com um valor de 0,039.


Curva Característica do Item

plot(fit.Abortion_3param, legend = TRUE, pch = rep(1:2, each = 4),ylab="Probabilidade de aprovação do aborto", xlab = "Percepção em relação ao Aborto", main="Curva Característica do Item", col = rep(1:4, 2), lwd = 2, cex = 1.2)
abline(h=0.5, lty="dashed",lwd=2)

O gráfico acima mostra como a probabilidade de aprovação do aborto varia em função da habilidade do respondente.

Curva de Informação do Item

plot(fit.Abortion_3param, type = "IIC", legend = TRUE, pch = rep(1:2, each = 5), xlab = "Percepção em relação ao Aborto", main="Curva de Informação do Item", col = rep(1:5, 2), lwd = 2, cex = 1.2)

Olhando o gráfico acima parece que o item mais importante é o item 3 e o item menos importante continua sendo o item 4. Porém neste caso aqui o item 2 parece informar mais do que o item 1.


Escolhendo o melhor modelo


Modelo de Rasch vs Modelo de 2 parâmetros
anova(fit.Abortion,fit.Abortion_2param)
## 
##  Likelihood Ratio Table
##                         AIC     BIC log.Lik    LRT df p.value
## fit.Abortion        1550.66 1566.41 -771.33                  
## fit.Abortion_2param 1428.67 1460.17 -706.34 129.99  4  <0.001


Modelo de 2 parâmetros vs Modelo de 3 parâmetros
anova(fit.Abortion_2param,fit.Abortion_3param)
## 
##  Likelihood Ratio Table
##                         AIC     BIC log.Lik  LRT df p.value
## fit.Abortion_2param 1428.67 1460.17 -706.34                
## fit.Abortion_3param 1436.58 1483.83 -706.29 0.09  4   0.999

Pelo resultado do teste da razão de verossimilhança para modelos encaixados, podemos ver que o modelo logístico de 2 parâmetros apresentou o menor AIC, logo, concluímos que este modelo é o que melhor se ajusta aos dados em comparação ao Modelo de Rasch. Posteriormente iremos compará-lo com o modelo logístico de 3 parâmetros.

Pelos resultados dos testes da razão de verossimilhança para modelos encaixados, podemos ver que o modelo logístico de 2 parâmetros apresentou o menor AIC e BIC, logo, concluímos que este modelo é o que melhor se ajusta aos dados. Também olhando os valores-p, chegamos na mesma conclusão.


Estimação do Traço Latente

O traço latente foi estimado a partir do modelo de 2 parâmetros.

teta2param_abortion = ltm::factor.scores(fit.Abortion_2param, resp.patterns=banco_abortion)
banco_DT =  round(teta2param_abortion$score.dat, 4)
datatable(banco_DT, rownames = T)


Descrição completa do traço latente estimado

hist(banco_DT$z1, main= "Histograma do traço latente estimado", xlab="Percepção em relação ao aborto estimada")

Olhando o gráfico acima, fica óbvio que o traço latente não tem uma distribuição normal.

Retornando as linhas com traço latente mínimo e máximo

summary(banco_DT$z1)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## -0.89810 -0.89810  0.09360 -0.03842  0.66010  0.66010
Query = sqldf::sqldf('select*
                  from banco_DT
                        where z1 in(-0.89810,0.66010)')


DT::datatable(Query)


Referências:

Bartholomew, D., Steel, F., Moustaki, I. and Galbraith, J. (2002) The Analysis and Interpretation of Multivariate Data for Social Scientists. London: Chapman and Hall. Knott, M., Albanese, M. and Galbraith, J. (1990) Scoring attitudes to abortion. The Statistician, 40, 217–223. McGrath, K. and Waterton, J. (1986) British social attitudes, 1983-86 panel survey. London: SCPR.

NB: O artigo está no site:https://www.jstor.org/stable/2348494?origin=crossref&seq=1

LS0tDQp0aXRsZTogIlRyYWJhbGhvMiAtIEludHJ1bWVudG9zIGRlIG1lZGlkYXMiDQphdXRob3I6ICJKb8OjbyBMLiBTaW1vbiBlIEtww6hkw6kgRGppZGpvaG8gUm9kbmVsIEplYW4tUGF0ZXJuZSBEb3NzYSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgdGhlbWU6IGZsYXRseQ0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogMw0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogdHJ1ZQ0KICAgICAgc21vb3RoX3Njcm9sbDogdHJ1ZQ0KLS0tDQoNCg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgZmlnLmFsaWduID0gJ2NlbnRlcicpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KGx0bSkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShwc3ljaCkNCmxpYnJhcnkoY29ycnBsb3QpDQpsaWJyYXJ5KERUKQ0KbGlicmFyeShzcWxkZikNCmBgYA0KDQoNCjxicj4NCjxicj4NCg0KYGBgez1odG1sfQ0KPHN0eWxlPg0KYm9keSB7DQp0ZXh0LWFsaWduOiBqdXN0aWZ5fQ0KPC9zdHlsZT4NCmBgYA0KDQoNCiMgSW50cm9kdcOnw6NvDQoNCkVzdGUgdHJhYmFsaG8gdGVtIGNvbW8gb2JqZXRpdm8gZXhwbG9yYXIgZSBhbmFsaXNhciBvIGNvbmp1bnRvIGRlIGRhZG9zICoqIkFib3J0aW9uIioqIGRvIHBhY290ZSAqbHRtKiwgY29udGVuZG8gaXRlbnMgZGUgdW0gaW5zdHJ1bWVudG8gZGUgbWVkaWRhIGFzc29jaWFkbyBhIHVtIHRyYcOnbyBsYXRlbnRlLiBBIGFuw6FsaXNlIHNlcsOhIGNvbmR1emlkYSBjb20gYmFzZSBuYSBUZW9yaWEgZGUgUmVzcG9zdGEgYW8gSXRlbSAoVFJJKSwgdW1hIGFib3JkYWdlbSBlc3RhdMOtc3RpY2EgYW1wbGFtZW50ZSB1dGlsaXphZGEgcGFyYSBtb2RlbGFyIGEgcmVsYcOnw6NvIGVudHJlIGFzIHJlc3Bvc3RhcyBkb3MgcGFydGljaXBhbnRlcyBlIG8gdHJhw6dvIGxhdGVudGUgc3ViamFjZW50ZS4gUG9zdGVyaW9ybWVudGUsIHByb2NlZGVyZW1vcyBjb20gYSBjYWxpYnJhw6fDo28gZG9zIGl0ZW5zLCB1dGlsaXphbmRvIG8gbW9kZWxvIFRSSSBtYWlzIGFkZXF1YWRvLiBBIGVzY29saGEgZGVzdGUgbW9kZWxvIHNlcsOhIGZ1bmRhbWVudGFkYSBlbSBldmlkw6puY2lhcyBlc3RhdMOtc3RpY2FzLCBjb25zaWRlcmFuZG8gY3JpdMOpcmlvcyBjb21vIGFqdXN0ZSBkbyBtb2RlbG8gYW9zIGRhZG9zIGUgcm9idXN0ZXogZXN0YXTDrXN0aWNhIGUgcGFydGlyIGRvIG1vZGVsbyBlc2NvbGhpZG8sIHNlcsOhIGVzdGltYWRvIG8gdHJhw6dvIGxhdGVudGUgZGUgY2FkYSBpbmRpdsOtZHVvLiAgDQoNCk5vIMOtbmljaW8sIG9zIGRhZG9zIGNvbnNpc3RpYW0gbmFzIHJlc3Bvc3RhcyBlbSAqKjE5ODYqKiBhIDcgcXVlc3TDtWVzIHJlbGFjaW9uYWRhcyDDoCBhdGl0dWRlIGVtIHJlbGHDp8OjbyBhbyBhYm9ydG8gcG9yIG1lbWJyb3MgZGUgdW0gcGFpbmVsIHBlc3F1aXNhZG8gZW0gY2FkYSB1bSBkb3MgYW5vcyBkZSAxOTgzIGEgMTk4NiwgY29tbyBwYXJ0ZSBkZSB1bWEgaW52ZXN0aWdhw6fDo28gZGFzIGF0aXR1ZGVzIHNvY2lhaXMgYnJpdMOibmljYXMgKHZlciBNY0dyYXRoICYgV2F0ZXJ0b24sIDE5ODYpLiBQYXJhIGNhZGEgcXVlc3TDo28sIG9zIGVudHJldmlzdGFkb3MgZm9yYW0gcXVlc3Rpb25hZG9zIHNlICoqYSBsZWkgZGV2ZXJpYSBwZXJtaXRpciBvIGFib3J0byoqLiBQb3LDqW0sIG5vIGJhbmNvIGRlIGRhZG9zICoqIkFib3J0aW9uIioqIGRvIHBhY290ZSAqbHRtKiwgMyBxdWVzdMO1ZXMgZm9yYW0gcmV0aXJhZGFzIHJlc3VsdGFuZG8gZW0gdW0gYmFuY28gY29tIDQgdmFyacOhdmVpcy4gICANCkFsw6ltIGRpc3NvLCBvIGJhbmNvIGNvbnRpbmhhIG5vIHRvdGFsIDQxMCBvYnNlcnZhw6fDtWVzIGVudHJldGFudG8gdW0gcGVxdWVubyBuw7ptZXJvIGRlIGluZGl2w61kdW9zICgzMSkgbsOjbyByZXNwb25kZXUgYWxndW1hcyBkYXMgNCBxdWVzdMO1ZXMgZSBwb3J0YW50byBlc3NhcyBvYnNlcnZhw6fDtWVzIGZvcmFtIGRlbGV0YWRhcyByZXN1bHRhbmRvIG51bSBiYW5jbyBjb20gMzc5IG9ic2VydmHDp8O1ZXMuDQoNCjxicj4NCg0KKipWQVJJw4FWRUwgTEFURU5URToqKg0KDQo+IDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlO2ZvbnQtc2l6ZToyMnB4OyI+IFBlcmNlcMOnw6NvIGVtIHJlbGHDp8OjbyBhIGFwcm92YcOnw6NvIGRvIGFib3J0byBwZWxhIGxlaS4gPC9zcGFuPg0KDQo8YnI+DQoNCjxjZW50ZXI+DQoqKlFVRVNUw5VFUyoqDQo8L2NlbnRlcj4NCg0KPiAqKigxKSoqIFRoZSB3b21hbiBkZWNpZGVzIG9uIGhlciBvd24gc2hlIGRvZXMgbm90IHdpc2ggdG8gaGF2ZSB0aGUgY2hpbGQuDQoNCj4gKiooMikqKiBUaGUgY291cGxlIGFncmVlIHRoZXkgZG8gbm90IHdpc2ggdG8gaGF2ZSB0aGUgY2hpbGQuDQoNCj4gKiooMykqKiBUaGUgd29tYW4gaXMgbm90IG1hcnJpZWQgYW5kIGRvZXMgbm90IHdpc2ggdG8gbWFycnkgdGhwIG1hbi4NCg0KPiAqKig0KSoqIFRoZSBjb3VwbGUgY2Fubm90IGFmZm9yZCBhbnkgbW9yZSBjaGlsZHJlbi4NCg0KPGJyPg0KDQpBbyB0b2RvLCB0ZW1vcyAzNzkgb2JzZXJ2YcOnw7VlcywNCg0KYGBge3IgZWNobz1GQUxTRSxmaWcuYWxpZ249J2NlbnRlcicsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTR9DQpiYW5jb19hYm9ydGlvbiA8LSBBYm9ydGlvbg0KDQpiYW5jb19hYm9ydGlvbiRgSXRlbSAxYCA8LSBhcy5mYWN0b3IoYmFuY29fYWJvcnRpb24kYEl0ZW0gMWApDQpiYW5jb19hYm9ydGlvbiRgSXRlbSAyYCA8LSBhcy5mYWN0b3IoYmFuY29fYWJvcnRpb24kYEl0ZW0gMmApDQpiYW5jb19hYm9ydGlvbiRgSXRlbSAzYCA8LSBhcy5mYWN0b3IoYmFuY29fYWJvcnRpb24kYEl0ZW0gM2ApDQpiYW5jb19hYm9ydGlvbiRgSXRlbSA0YCA8LSBhcy5mYWN0b3IoYmFuY29fYWJvcnRpb24kYEl0ZW0gNGApDQoNCiMgQ3JpYW5kbyBvIGdyw6FmaWNvIGRlIGJhcnJhcyBjb20gbyB0b3RhbCBkZSAiMCIgZSAiMSIgcGFyYSBjYWRhIEl0ZW0NCmdhdGhlcihiYW5jb19hYm9ydGlvbikgJT4lIA0KICBncm91cF9ieShrZXksIHZhbHVlKSAlPiUgDQogIHN1bW1hcmlzZShUb3RhbF9TdW0gPSBuKCkpICU+JSANCiAgZ3JvdXBfYnkoa2V5KSAlPiUgDQogIG11dGF0ZShQZXJjZW50YWdlID0gKFRvdGFsX1N1bSAvIHN1bShUb3RhbF9TdW0pKSAqIDEwMCkgJT4lDQogIGdncGxvdChhZXMoeCA9IGtleSwgeSA9IFRvdGFsX1N1bSwgZmlsbCA9IHZhbHVlKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGFzdGUwKFRvdGFsX1N1bSwgIiAoIiwgcm91bmQoUGVyY2VudGFnZSksICIlKSIpKSwgDQogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSwgY29sb3IgPSAiYmxhY2siKSArDQogIGxhYnMoeD0iSXRlbSIsIHk9IkZyZXF1w6puY2lhIiwgZmlsbD0iVmFsb3IiKSArDQogIGdndGl0bGUoIkRlc2NyacOnw6NvIGRvcyBEYWRvcyIpICsNCiAgdGhlbWVfbWluaW1hbCgpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpDQpgYGANCg0KDQo8YnI+DQoNCg0KYGBge3J9DQpzdHIoYmFuY29fYWJvcnRpb24pDQpgYGANCg0KPGJyPg0KDQojIE1hdHJpeiBkZSBDb3JyZWxhw6fDo28NCg0KDQo+IDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlO2ZvbnQtc2l6ZToyMnB4OyI+IA0KRm9pIHV0aWxpemFkYSBuZXN0ZSBjYXNvIGEgY29ycmVsYcOnw6NvIHRldHJhY8OzcmljYSBqw6EgcXVlIHRlbSBwcmVzZW7Dp2EgZGUgdmFyacOhdmVpcyBjYXRlZ8OzcmljYXMgYmluw6FyaWFzIChkdW1taWVzKS4NCjwvc3Bhbj4NCg0KDQpgYGB7ciBmaWcud2lkdGg9NCwgZmlnLmhlaWdodD00LCBmaWcuYWxpZ249J2NlbnRlcicsIGVjaG89RkFMU0V9DQpjb3JyZWxhY2FvIDwtIHRldHJhY2hvcmljKEFib3J0aW9uKQ0KDQpjb3JycGxvdChjb3JyZWxhY2FvJHJobywgbWV0aG9kID0gJ251bWJlcicpDQpgYGANCg0KDQoNCg0KQXMgY29ycmVsYcOnw7VlcyBtYWlzIGZvcnRlcyAoKiowLjkwKiopIGZvcmFtIGVudHJlICoqSXRlbTEqKiBlICoqSXRlbSAyKiogZGUgdW0gbGFkbyBlIGVudHJlICoqSXRlbSAzKiogZSAqKkl0ZW0gNCoqIGRvIG91dHJvIC4NCg0KPGJyPg0KDQoqKkPDoWxjdWxvIGRvcyBhdXRvdmFsb3JlczoqKg0KDQpgYGB7cn0NCnJvdW5kKGVpZ2VuKGNvcnJlbGFjYW8kcmhvKSR2YWx1ZXMsMikNCmBgYA0KPGJyPg0KDQoqKkPDoWxjdWxvIGRhIHByb3BvcsOnw6NvIGV4cGxpY2FkYSBwb3IgY2FkYSBmYXRvcjoqKg0KDQpgYGB7cn0NCnByb3BvcmNhb19leHBsaWNhY2FvPC1laWdlbihjb3JyZWxhY2FvJHJobykkdmFsdWVzLw0Kc3VtKGVpZ2VuKGNvcnJlbGFjYW8kcmhvKSR2YWx1ZXMpDQpwcm9wb3JjYW9fZXhwbGljYWNhbw0KYGBgDQoNCg0KT2xoYW5kbyBhcyBzYcOtZGFzIHF1ZSBvYnRpdmVtb3MgZG9zIGPDs2RpZ29zICBhY2ltYSBwb2RlbW9zICBkaXplciBxdWUgdGVtb3MgdW0gw7puaWNvIGZhdG9yIHBhcmEgZXNzZXMgIDQgaXRlbnMuDQoNCjxicj4NCg0KYGBge3J9DQoNCmRlc2MgPC0gZGVzY3JpcHQoQWJvcnRpb24pDQpkZXNjDQpgYGANCg0KDQoNCiBDb20gZXNzYSBmdW7Dp8OjbyBzZSB0ZW0gbyBhbHBoYSBkZSBjcm9uYmFjaCBxdWUgdmFpIGluZm9ybWFyIHNvYnJlIG8gZmF0byBkZSB1bSBpdGVtIHByZWp1ZGljYXIgYSBjb25zaXN0ZW5jaWEgaW50ZXJuYSBkbyAgbW9kZWxvDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjpibHVlO2ZvbnQtc2l6ZToxNXB4OyI+IA0KKipSZXN1bHRhZG8gMToqKjwvc3Bhbj4gUG9kZW1vcyBvYnNlcnZhciBxdWUgdGV2ZSBtYWlzIGluZGl2w61kdW9zIHF1ZSBhcHJvdmFyYW0gbyBhYm9ydG8gZGlhbnRlIGRhIGNpcmN1bnN0w6JuY2lhIGRvICoqaXRlbSAzKiogKDAgPSAwLDM2NDEgdnMgMSA9IDAsNjM1OSkgZG8gcXVlIGRpYW50ZSBkYSBjaXJjdW5zdMOibmNpYSBkb3Mgb3V0cm9zIGl0ZW5zLiANCg0KPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWU7Zm9udC1zaXplOjE1cHg7Ij4gDQoqKlJlc3VsdGFkbyAyOioqPC9zcGFuPiBQb2RlbW9zIG9ic2VydmFyIHF1ZSB0ZXZlIG1haXMgaW5kaXbDrWR1b3MgcXVlIGFwcm92YXJhbSBvIGFib3J0byBkaWFudGUgZGUgdG9kYXMgYXMgY2lyY3Vuc3TDom5jaWFzIGRvcyA0IGl0ZW5zICh1bSB0b3RhbCBkZSAxNDEgcGVzc29hcykuIA0KDQo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZTtmb250LXNpemU6MTVweDsiPiANCioqUmVzdWx0YWRvIDM6Kio8L3NwYW4+IFBvZGVtb3Mgb2JzZXJ2YXIgcXVlIGEgY29ycmVsYcOnw6NvIHBvbnRvIGJpc3NlcmlhbCBkZSBjYWRhIGl0ZW0gY29tIG8gRXNjb3JlIFRvdGFsIHF1YW5kbyBvIGl0ZW0gZW0gZXZpZMOqbmNpYSBuw6NvIGVzdMOhIGluY2x1w61kbyBubyBjw6FsY3VsbyBkbyBFc2NvcmUgVG90YWwgZmljb3UgbWVub3IgZG8gcXVlIGEgY29ycmVsYcOnw6NvIHBvbnRvIGJpc3NlcmlhbCBkZSBjYWRhIGl0ZW0gY29tIG8gRXNjb3JlIFRvdGFsIHF1YW5kbyBvIGl0ZW0gZW0gZXZpZMOqbmNpYSBlc3TDoSBpbmNsdcOtZG8gbm8gY8OhY2x1bG8gZG8gRXNjb3JlIFRvdGFsLiANCg0KPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWU7Zm9udC1zaXplOjE1cHg7Ij4gDQoqKlJlc3VsdGFkbyA0OioqPC9zcGFuPiBQb2RlbW9zIG9ic2VydmFyIHBlbG9zIGFscGhhcyBkZSBDcm9uYmFjaCAodG9kb3MgbWVub3JlcyBxdWUgMCw4NzA3KSBxdWUgbmVuaHVtIGl0ZW0gcGFyZWNlIHByZWp1ZGljYXIgYSBjb25zaXN0w6puY2lhIGludGVybmEgZG8gbW9kZWxvLg0KDQo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZTtmb250LXNpemU6MTVweDsiPiANCioqUmVzdWx0YWRvIDU6Kio8L3NwYW4+IFBvZGVtb3MgY29uY2x1aXIgcGVsb3MgKipwLXZhbG9yZXMqKiBxdWUgaMOhIGRlcGVuZMOqbmNpYSBlbnRyZSBvcyBwYXJlcyBkZSBpdGVucy4NCg0KPGJyPg0KDQojIE1vZGVsbyBkZSBSYXNjaA0KDQpBcXVpIGZvaSB1dGlsaXphZG8gY29tbyBkaXNjcmltaW5hbnRlIG8gdmFsb3IgICoqYDEsNzAyYCoqIHBhcmEgdGVyIHJlc3VsdGFkb3Mgc2VtZWxoYW50ZXMgYW8gZGEgZnVuw6fDo28gKipgb2dpdmEgbm9ybWFsYCoqIGNvbSBxdWFsIHRyYWJhbGhhdmFtIG9zIHBpb25laXJvcyBkYSBUUkkgDQoNCmBgYHtyfQ0KZml0LkFib3J0aW9uPC1yYXNjaChiYW5jb19hYm9ydGlvbixjb25zdHJhaW50PWNiaW5kKG5jb2woYmFuY29fYWJvcnRpb24pKzEsMS43MDIpKQ0Kc3VtbWFyeShmaXQuQWJvcnRpb24pDQpgYGANCg0KPGJyPg0KDQpPcmRlbmFuZG8gb3MgcmVzdWx0YWRvcyBkbyBwYXLDom1ldHJvIGRlICdkaWZpY3VsZGFkZScNCg0KYGBge3J9DQpjb2VmKGZpdC5BYm9ydGlvbiwgcHJvYiA9IFRSVUUsIG9yZGVyID0gVFJVRSkNCmBgYA0KDQoNCjxicj4NCg0KT2xoYW5kbyBvcyByZXN1bHRhZG9zIGVuY29udHJhZG9zIGFww7NzIGltcGxlbWVudGHDp8OjbyBkZXNzZSBtb2RlbG8gZGUgUmFzY2gsIG8gaXRlbSBtYWlzIGdyYXZlICgqKm1haXMgZGlmw61jaWwqKikgw6kgbyAqKippdGVtIDEqKiouDQoNCkRlc3NlIG1vZG8sIHRhbWLDqW0gcG9kZW1vcyBpbnRlcnByZXRhciBxdWUgdmFpIHNlciBtYWlvciBhIGFwdGlkw6NvIGV4aWdpZGEgcGFyYSBxdWUgbyBpbmRpdsOtZHVvIHRlbmhhICoqNTAlKiogZGUgY2hhbmNlIGRlIGFwcm92YXIgbyBhYm9ydG8gZGlhbnRlIGRhIHNpdHVhw6fDo28gZG8gKml0ZW0gMSouDQogDQogT3V0cmEgaW50ZXJwcmV0YcOnw6NvIHNlcmlhOiBvcyBpbmRpdsOtZHVvcyBxdWUgYXByZXNlbnRhbSB1bSB0cmHDp28gbGF0ZW50ZSBkZSAnMCwyNycgYWNpbWEgZGEgbcOpZGlhIHRlcsOjbyBwcm9iYWJpbGlkYWRlIGRlIGFwcm92YXIgbyBhYm9ydG8gZGlhbnRlIGRhIHNpdHVhw6fDo28gZG8gKml0ZW0gMSogaWd1YWwgYSAqKjAsNSoqLg0KDQoNCkluZm9ybWHDp8OjbyBkbyB0ZXN0ZQ0KDQpgYGB7cn0NCmluZm9ybWF0aW9uKGZpdC5BYm9ydGlvbiwgYygtNCw0KSkNCmBgYA0KDQoNCkluZm9ybWF0aW9uIGluICgtNCwgNCkgPSA2LDc5ICg5OSw3MiUpLg0KSXNzbyBxdWVyIGRpemVyIHF1ZSBxdWFzZSAxMDAlIGRvcyB0cmHDp29zIGxhdGVudGVzIGZpY2FyYW0gbm8gaW50ZXJ2YWxvICgtNCwgNCkuIA0KDQo8YnI+DQoNCiMjIEN1cnZhIENhcmFjdGVyw61zdGljYSBkbyBpdGVtIA0KDQpgYGB7ciBmaWcuYWxpZ249J2NlbnRlcid9DQpwbG90KGZpdC5BYm9ydGlvbixsZWdlbmQgPSBUUlVFLCBwY2ggPSByZXAoMToyLCBlYWNoID0gNCkseWxhYj0iUHJvYmFiaWxpZGFkZSBkZSBhcHJvdmHDp8OjbyBkbyBhYm9ydG8iLCB4bGFiID0gIlBlcmNlcMOnw6NvIGVtIHJlbGHDp8OjbyBhbyBBYm9ydG8iLCBtYWluPSJDdXJ2YSBDYXJhY3RlcsOtc3RpY2EgZG8gaXRlbSIsY29sID0gcmVwKDE6NCwgMiksIGx3ZCA9IDIsIGNleCA9IDEuMikNCmFibGluZShoPTAuNSwgbHR5PSJkYXNoZWQiLGx3ZD0yKQ0KYGBgDQoNCg0KTyBncsOhZmljbyBhY2ltYSBtb3N0cmEgY29tbyBhIHByb2JhYmlsaWRhZGUgZGUgcmVzcG9zdGEgY29ycmV0YSB2YXJpYSBlbSBmdW7Dp8OjbyBkYSBoYWJpbGlkYWRlIGRvIHJlc3BvbmRlbnRlLg0KDQo8YnI+DQoNCiMjIEN1cnZhIGRlIEluZm9ybWHDp8OjbyBkbyBJdGVtDQoNCmBgYHtyfQ0KcGxvdChmaXQuQWJvcnRpb24sIHR5cGUgPSAiSUlDIiwgbGVnZW5kID0gVFJVRSwgcGNoID0gcmVwKDE6MiwgZWFjaCA9IDQpLCBtYWluPSJDdXJ2YSBkZSBJbmZvcm1hw6fDo28gZG8gSXRlbSIsIHhsYWIgPSAiUGVyY2Vww6fDo28gZW0gcmVsYcOnw6NvIGFvIEFib3J0byIsIGNvbCA9IHJlcCgxOjQsIDIpLCBsd2QgPSAyLCBjZXggPSAxLjIpDQpgYGANCg0KT2xoYW5kbyBvIGdyw6FmaWNvIGFjaW1hIHBhcmVjZSBxdWUgdG9kb3Mgb3MgNCBpdGVucyBzw6NvIGltcG9ydGFudGVzIHBhcmEgbWVkaXIgYSBwZXJjZXDDp8OjbyBlbSByZWxhw6fDo28gYW8gYWJvcnRvLg0KDQoNCg0KPGJyPg0KDQojIyBDdXJ2YSBkZSBJbmZvcm1hw6fDo28gZG8gVGVzdGUNCg0KYGBge3IgZWNobz1GQUxTRX0NCiMgQ2FsY3VsYXIgYSBpbmZvcm1hw6fDo28gZSBwbG90YXIgbyBncsOhZmljbyBkZSBpbmZvcm1hw6fDo28NCmluZm8xIDwtIHBsb3QoZml0LkFib3J0aW9uLCB0eXBlID0gIklJQyIsIGl0ZW1zID0gMCwgbHdkID0gMiwgeGxhYiA9ICJQZXJjZXDDp8OjbyBlbSByZWxhw6fDo28gYW8gYWJvcnRvIikNCg0KIyBDb25maWd1cmFyIG8gbGF5b3V0IHBhcmEgYWRpY2lvbmFyIHVtIG5vdm8gZ3LDoWZpY28gc29icmUgbyBhbnRlcmlvcg0KcGFyKG5ldyA9IFRSVUUpDQoNCiMgQ2FsY3VsYXIgbyBlcnJvIHBhZHLDo28gZSBwbG90YXIgbyBncsOhZmljbyBkZSBlcnJvIHBhZHLDo28NCnBsb3QoaW5mbzFbLCAieiJdLCAxIC8gc3FydChpbmZvMVssICJpbmZvIl0pLCB0eXBlID0gImwiLCBsd2QgPSAyLCB4bGFiID0gIiIsIHlsYWIgPSAiIiwgbWFpbiA9ICIiLCBjb2w9J3JlZCcpDQoNCiMgQWRpY2lvbmFyIHLDs3R1bG9zIGFvcyBlaXhvcyBkbyBzZWd1bmRvIGdyw6FmaWNvDQpheGlzKDQpICAjIEVpeG8gZG8gbGFkbyBkaXJlaXRvIHBhcmEgbyBlcnJvIHBhZHLDo28NCm10ZXh0KCJFcnJvIHBhZHLDo28iLCBzaWRlID0gNCwgbGluZSA9IDMpDQoNCiMgQWRpY2lvbmFyIHVtYSBsZWdlbmRhIHBhcmEgZGlzdGluZ3VpciBvcyBkb2lzIGNvbmp1bnRvcyBkZSBkYWRvcw0KbGVnZW5kKCJ0b3ByaWdodCIsIGxlZ2VuZCA9IGMoIkluZm9ybWHDp8OjbyIsICJFcnJvIHBhZHLDo28iKSwgbHR5ID0gYygxLCAxKSwgbHdkID0gYygyLCAyKSwgY29sID0gYygiYmxhY2siLCAicmVkIikpDQoNCmBgYA0KDQo8YnI+DQoNCiMgTW9kZWxvIExvZ8Otc3RpY28gZGUgMiBQYXLDom1ldHJvcw0KDQpgYGB7cn0NCmZpdC5BYm9ydGlvbl8ycGFyYW0gPC0gbHRtKGJhbmNvX2Fib3J0aW9uIH4gejEpDQpzdW1tYXJ5KGZpdC5BYm9ydGlvbl8ycGFyYW0pDQpgYGANCg0KDQpgYGB7cn0NCmNvZWYoZml0LkFib3J0aW9uXzJwYXJhbSwgcHJvYiA9IFRSVUUsIG9yZGVyID0gVFJVRSkNCmBgYA0KDQpQb2RlbW9zIHZlciBxdWUgYXNzaW0gY29tbyBubyBtb2RlbG8gZGUgUmFzY2gsIG8gKioqaXRlbSAzKioqIGZvaSBvIHF1ZSBhcHJlc2VudG91IGEgbWVub3IgZGlmaWN1bGRhZGUgYWzDqW0gZGUgdGVyIGEgbWFpb3IgY2FwYWNpZGFkZSBkZSBkaXNjcmltaW5hw6fDo28sIGVucXVhbnRvIHF1ZSBvICoqKml0ZW0gMSoqKiBmb2kgY29uc2lkZXJhZG8gbyAqKm1haXMgZGlmw61jaWwqKi4NCg0KDQoNCmBgYHtyfQ0KaW5mb3JtYXRpb24oZml0LkFib3J0aW9uXzJwYXJhbSwgYygtNCw0KSkNCmBgYA0KDQpPIG1vZGVsbyBhcHJlc2VudG91IHVtYSBJbmZvcm1hw6fDo28gVG90YWwgZGUgMTguMDcsIG11aXRvIG1haW9yIHNlIGNvbXBhcmFkYSBhbyBtb2RlbG8gZGUgUmFzY2ggKDYuODEpLiBBbMOpbSBkaXNzbywgSW5mb3JtYXRpb24gaW4gKC00LCA0KSBpbmRpY2EgcXVlIGVzdGUgdmFsb3IgKDE4LjA3KSByZXByZXNlbnRhIGEgaW5mb3JtYcOnw6NvIGNvbnRpZGEgbmEgZmFpeGEgZGUgaGFiaWxpZGFkZSBlbnRyZSAtNCBlIDQuIE8gZmF0byBkZSBhIGluZm9ybWHDp8OjbyBkZW50cm8gZGEgZmFpeGEgZGUgaGFiaWxpZGFkZSBlc3BlY8OtZmljYSBzZXIgMTAwJSBkbyB0b3RhbCBpbmRpY2EgcXVlIGEgbWFpb3IgcGFydGUgZGEgaW5mb3JtYcOnw6NvIHJlbGV2YW50ZSBlc3TDoSBjb250aWRhIG5lc3NhIGZhaXhhLiBJc3NvIHN1Z2VyZSBxdWUgbyBtb2RlbG8gw6kgYmFzdGFudGUgcHJlY2lzbyBlbSBlc3RpbWFyIGhhYmlsaWRhZGVzIGRlbnRybyBkZXNzZSBpbnRlcnZhbG8gZXNwZWPDrWZpY28uDQoNCg0KDQo8YnI+DQoNCiMjIEN1cnZhIENhcmFjdGVyw61zdGljYSBkbyBJdGVtDQoNCmBgYHtyfQ0KcGxvdChmaXQuQWJvcnRpb25fMnBhcmFtLCBsZWdlbmQgPSBUUlVFLCBwY2ggPSByZXAoMToyLCBlYWNoID0gNCkseWxhYj0iUHJvYmFiaWxpZGFkZSBkZSBhcHJvdmHDp8OjbyBkbyBhYm9ydG8iLCB4bGFiID0gIlBlcmNlcMOnw6NvIGVtIHJlbGHDp8OjbyBhbyBBYm9ydG8iLCBjb2wgPSByZXAoMTo0LCAyKSwgbHdkID0gMiwgY2V4ID0gMS4yLCBtYWluPSJDdXJ2YSBDYXJhY3RlcsOtc3RpY2EgZG8gSXRlbSIpDQphYmxpbmUoaD0wLjUsIGx0eT0iZGFzaGVkIixsd2Q9MikNCmBgYA0KTyBncsOhZmljbyBhY2ltYSBtb3N0cmEgY29tbyBhIHByb2JhYmlsaWRhZGUgZGUgYXByb3Zhw6fDo28gZG8gYWJvcnRvIHZhcmlhIGVtIGZ1bsOnw6NvIGRhIGhhYmlsaWRhZGUgZG8gcmVzcG9uZGVudGUuDQoNCjxicj4NCg0KIyMgQ3VydmEgZGUgSW5mb3JtYcOnw6NvIGRvIEl0ZW0NCg0KYGBge3J9DQpwbG90KGZpdC5BYm9ydGlvbl8ycGFyYW0sIHR5cGUgPSAiSUlDIiwgbGVnZW5kID0gVFJVRSwgcGNoID0gcmVwKDE6MiwgZWFjaCA9IDQpLCB4bGFiID0gIlBlcmNlcMOnw6NvIGVtIHJlbGHDp8OjbyBhbyBBYm9ydG8iLCBtYWluPSJDdXJ2YSBkZSBJbmZvcm1hw6fDo28gZG8gSXRlbSIsIGNvbCA9IHJlcCgxOjQsIDIpLCBsd2QgPSAyLCBjZXggPSAxLjIsIHN1YiA9IHBhc3RlKCJDYWxsOiAiLCBkZXBhcnNlKGZpdC5BYm9ydGlvbl8ycGFyYW0kY2FsbCkpKQ0KDQpgYGANCg0KT2xoYW5kbyBvIGdyw6FmaWNvIGFjaW1hIHBhcmVjZSBxdWUgbyBpdGVtIG1haXMgaW1wb3J0YW50ZSDDqSBvICoqYGl0ZW0gM2AqKiBlIG8gaXRlbSBtZW5vcyBpbXBvcnRhbnRlIMOpIG8gKipgaXRlbSA0YCoqLiANCg0KDQojIyBDdXJ2YSBkZSBJbmZvcm1hw6fDo28gZG8gVGVzdGUNCg0KYGBge3J9DQoNCmluZm8yPSBwbG90KGZpdC5BYm9ydGlvbl8ycGFyYW0sIHR5cGUgPSAiSUlDIiwgaXRlbXMgPSAwLCBsd2QgPSAyLCB4bGFiID0gIlBlcmNlcMOnw6NvIGVtIHJlbGHDp8OjbyBhbyBBYm9ydG8iKQ0KDQoNCiMgQ29uZmlndXJhciBvIGxheW91dCBwYXJhIGFkaWNpb25hciB1bSBub3ZvIGdyw6FmaWNvIHNvYnJlIG8gYW50ZXJpb3INCnBhcihuZXcgPSBUUlVFKQ0KDQojIENhbGN1bGFyIG8gZXJybyBwYWRyw6NvIGUgcGxvdGFyIG8gZ3LDoWZpY28gZGUgZXJybyBwYWRyw6NvDQpwbG90KGluZm8yWywgInoiXSwgMSAvIHNxcnQoaW5mbzJbLCAiaW5mbyJdKSwgdHlwZSA9ICJsIiwgbHdkID0gMiwgeGxhYiA9ICIiLCB5bGFiID0gIiIsIG1haW4gPSAiIiwgY29sPSdyZWQnKQ0KDQojIEFkaWNpb25hciByw7N0dWxvcyBhb3MgZWl4b3MgZG8gc2VndW5kbyBncsOhZmljbw0KYXhpcyg0KSAgIyBFaXhvIGRvIGxhZG8gZGlyZWl0byBwYXJhIG8gZXJybyBwYWRyw6NvDQptdGV4dCgiRXJybyBwYWRyw6NvIiwgc2lkZSA9IDQsIGxpbmUgPSAzKQ0KDQojIEFkaWNpb25hciB1bWEgbGVnZW5kYSBwYXJhIGRpc3Rpbmd1aXIgb3MgZG9pcyBjb25qdW50b3MgZGUgZGFkb3MNCmxlZ2VuZCgidG9wcmlnaHQiLCBsZWdlbmQgPSBjKCJJbmZvcm1hw6fDo28iLCAiRXJybyBwYWRyw6NvIiksIGx0eSA9IGMoMSwgMSksIGx3ZCA9IGMoMiwgMiksIGNvbCA9IGMoImJsYWNrIiwgInJlZCIpKQ0KDQpgYGANCg0KPGJyPg0KDQojIE1vZGVsbyBMb2fDrXN0aWNvIGRlIDMgUGFyw6JtZXRyb3MNCg0KYGBge3J9DQpmaXQuQWJvcnRpb25fM3BhcmFtIDwtIHRwbShiYW5jb19hYm9ydGlvbikNCnN1bW1hcnkoZml0LkFib3J0aW9uXzNwYXJhbSkNCg0KYGBgDQoNCmBgYHtyfQ0KY29lZihmaXQuQWJvcnRpb25fM3BhcmFtLCBwcm9iID0gVFJVRSwgb3JkZXIgPSBUUlVFKQ0KYGBgDQoNClBvciB1bSBsYWRvLCBwb2RlbW9zIHZlciBxdWUgYXNzaW0gY29tbyBubyBtb2RlbG8gZGUgUmFzY2ggZSBubyBtb2RlbG8gZGUgMiBwYXLDom1ldHJvcywgbyAqKippdGVtMyoqKiBmb2kgbyBxdWUgYXByZXNlbnRvdSBhIG1lbm9yIGRpZmljdWxkYWRlIGFsw6ltIGRlIHRlciBhIG1haW9yIGNhcGFjaWRhZGUgZGUgZGlzY3JpbWluYcOnw6NvLCBlbnF1YW50byBxdWUgbyAqKippdGVtMSoqKiBmb2kgY29uc2lkZXJhZG8gbyBtYWlzIGRpZsOtY2lsLg0KUG9yIG91dHJvIGxhZG8gbyBtb2RlbG8gTG9nw61zdGljbyBkZSAzIFBhcsOibWV0cm9zIGFkaWNpb25hIHVtIHRlcmNlaXJvIHBhcsOibWV0cm8gcXVlIHJlcHJlc2VudGEgbyBlZmVpdG8gZGUgYWRpdmluaGHDp8OjbyAoYWNlcnRvIGNhc3VhbCkuIE5vIG5vc3NvIGNhc28gZXN0ZSBwYXLDom1ldHJvIHJlZmxldGUgYSBwcm9iYWJpbGlkYWRlIGRlIHVtIHJlc3BvbmRlbnRlIGNvbSBwZXJjZXDDp8OjbyBlbSByZWxhw6fDo28gYW8gYWJvcnRvIG11aXRvIGJhaXhhIGFpbmRhIGFwcm92YXIgbyBhYm9ydG8gYW8gYWNhc28uIFBvZGVtb3MgdmVyIHF1ZSBuZXNzZSBjYXNvIGRlIGVzdHVkbyBuw6NvIGjDoSBhIHByZXNlbsOnYSBkZSAiY2h1dGUiLCB2aXN0byBxdWUgbsOjbyBlc3RhbW9zIG1lZGluZG8gdW1hIGhhYmlsaWRhZGUgZXNwZWPDrWZpY2EuIE9zIHJlc3VsdGFkb3MgY29ycm9ib3JhbSBlc3NhIGNvbmNsdXPDo28sIGrDoSBxdWUgbyDDum5pY28gY29lZmljaWVudGUgZGUgImFkdmluaGHDp8OjbyIgYWNpbWEgZGUgMCBmb2kgbyAqaXRlbSAyKiBjb20gdW0gdmFsb3IgZGUgMCwwMzkuDQoNCg0KPGJyPg0KDQojIyBDdXJ2YSBDYXJhY3RlcsOtc3RpY2EgZG8gSXRlbQ0KDQpgYGB7cn0NCnBsb3QoZml0LkFib3J0aW9uXzNwYXJhbSwgbGVnZW5kID0gVFJVRSwgcGNoID0gcmVwKDE6MiwgZWFjaCA9IDQpLHlsYWI9IlByb2JhYmlsaWRhZGUgZGUgYXByb3Zhw6fDo28gZG8gYWJvcnRvIiwgeGxhYiA9ICJQZXJjZXDDp8OjbyBlbSByZWxhw6fDo28gYW8gQWJvcnRvIiwgbWFpbj0iQ3VydmEgQ2FyYWN0ZXLDrXN0aWNhIGRvIEl0ZW0iLCBjb2wgPSByZXAoMTo0LCAyKSwgbHdkID0gMiwgY2V4ID0gMS4yKQ0KYWJsaW5lKGg9MC41LCBsdHk9ImRhc2hlZCIsbHdkPTIpDQpgYGANCg0KTyBncsOhZmljbyBhY2ltYSBtb3N0cmEgY29tbyBhIHByb2JhYmlsaWRhZGUgZGUgYXByb3Zhw6fDo28gZG8gYWJvcnRvIHZhcmlhIGVtIGZ1bsOnw6NvIGRhIGhhYmlsaWRhZGUgZG8gcmVzcG9uZGVudGUuDQoNCg0KIyMgQ3VydmEgZGUgSW5mb3JtYcOnw6NvIGRvIEl0ZW0NCmBgYHtyfQ0KDQpwbG90KGZpdC5BYm9ydGlvbl8zcGFyYW0sIHR5cGUgPSAiSUlDIiwgbGVnZW5kID0gVFJVRSwgcGNoID0gcmVwKDE6MiwgZWFjaCA9IDUpLCB4bGFiID0gIlBlcmNlcMOnw6NvIGVtIHJlbGHDp8OjbyBhbyBBYm9ydG8iLCBtYWluPSJDdXJ2YSBkZSBJbmZvcm1hw6fDo28gZG8gSXRlbSIsIGNvbCA9IHJlcCgxOjUsIDIpLCBsd2QgPSAyLCBjZXggPSAxLjIpDQoNCmBgYA0KDQoNCk9saGFuZG8gbyBncsOhZmljbyBhY2ltYSBwYXJlY2UgcXVlIG8gaXRlbSBtYWlzIGltcG9ydGFudGUgw6kgbyAqKmBpdGVtIDNgKiogZSBvIGl0ZW0gbWVub3MgaW1wb3J0YW50ZSBjb250aW51YSBzZW5kbyBvICoqYGl0ZW0gNGAqKi4gUG9yw6ltIG5lc3RlIGNhc28gYXF1aSBvIGl0ZW0gMiBwYXJlY2UgaW5mb3JtYXIgbWFpcyBkbyBxdWUgbyBpdGVtIDEuDQoNCg0KPGJyPiANCg0KIyBFc2NvbGhlbmRvIG8gbWVsaG9yIG1vZGVsbw0KDQo8YnI+DQoNCjxjZW50ZXI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsdWU7Zm9udC1zaXplOjIycHgiPiBNb2RlbG8gZGUgUmFzY2ggdnMgTW9kZWxvIGRlIDIgcGFyw6JtZXRyb3MgPC9zcGFuPiA8L2NlbnRlcj4NCg0KYGBge3J9DQphbm92YShmaXQuQWJvcnRpb24sZml0LkFib3J0aW9uXzJwYXJhbSkNCg0KYGBgDQoNCg0KPGJyPg0KDQo8Y2VudGVyPjxzcGFuIHN0eWxlPSJjb2xvcjpibHVlO2ZvbnQtc2l6ZToyMnB4Ij4gTW9kZWxvIGRlIDIgcGFyw6JtZXRyb3MgdnMgTW9kZWxvIGRlIDMgcGFyw6JtZXRyb3MgPC9zcGFuPiA8L2NlbnRlcj4NCg0KDQpgYGB7cn0NCmFub3ZhKGZpdC5BYm9ydGlvbl8ycGFyYW0sZml0LkFib3J0aW9uXzNwYXJhbSkNCmBgYA0KDQoNClBlbG8gcmVzdWx0YWRvIGRvIHRlc3RlIGRhIHJhesOjbyBkZSB2ZXJvc3NpbWlsaGFuw6dhIHBhcmEgbW9kZWxvcyBlbmNhaXhhZG9zLCBwb2RlbW9zIHZlciBxdWUgbyBtb2RlbG8gbG9nw61zdGljbyBkZSAyIHBhcsOibWV0cm9zIGFwcmVzZW50b3UgbyBtZW5vciBBSUMsIGxvZ28sIGNvbmNsdcOtbW9zIHF1ZSBlc3RlIG1vZGVsbyDDqSBvIHF1ZSBtZWxob3Igc2UgYWp1c3RhIGFvcyBkYWRvcyBlbSBjb21wYXJhw6fDo28gYW8gTW9kZWxvIGRlIFJhc2NoLiBQb3N0ZXJpb3JtZW50ZSBpcmVtb3MgY29tcGFyw6EtbG8gY29tIG8gbW9kZWxvIGxvZ8Otc3RpY28gZGUgMyBwYXLDom1ldHJvcy4NCg0KDQpQZWxvcyByZXN1bHRhZG9zIGRvcyB0ZXN0ZXMgZGEgcmF6w6NvIGRlIHZlcm9zc2ltaWxoYW7Dp2EgcGFyYSBtb2RlbG9zIGVuY2FpeGFkb3MsIHBvZGVtb3MgdmVyIHF1ZSBvIG1vZGVsbyBsb2fDrXN0aWNvIGRlIDIgcGFyw6JtZXRyb3MgYXByZXNlbnRvdSBvIG1lbm9yIEFJQyBlIEJJQywgbG9nbywgY29uY2x1w61tb3MgcXVlIGVzdGUgbW9kZWxvIMOpIG8gcXVlIG1lbGhvciBzZSBhanVzdGEgYW9zIGRhZG9zLiBUYW1iw6ltIG9saGFuZG8gb3MgdmFsb3Jlcy1wLCBjaGVnYW1vcyBuYSBtZXNtYSBjb25jbHVzw6NvLiANCg0KPGJyPg0KDQojIEVzdGltYcOnw6NvIGRvIFRyYcOnbyBMYXRlbnRlDQoNCg0KDQo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZTsgZm9udC1zaXplOjE2cHgiPg0KTyB0cmHDp28gbGF0ZW50ZSBmb2kgZXN0aW1hZG8gYSBwYXJ0aXIgZG8gbW9kZWxvIGRlIDIgcGFyw6JtZXRyb3MuIDwvc3Bhbj4NCg0KYGBge3J9DQoNCnRldGEycGFyYW1fYWJvcnRpb24gPSBsdG06OmZhY3Rvci5zY29yZXMoZml0LkFib3J0aW9uXzJwYXJhbSwgcmVzcC5wYXR0ZXJucz1iYW5jb19hYm9ydGlvbikNCg0KYGBgDQoNCg0KYGBge3J9DQpiYW5jb19EVCA9ICByb3VuZCh0ZXRhMnBhcmFtX2Fib3J0aW9uJHNjb3JlLmRhdCwgNCkNCmRhdGF0YWJsZShiYW5jb19EVCwgcm93bmFtZXMgPSBUKQ0KDQpgYGANCg0KPGJyPg0KDQojIERlc2NyacOnw6NvIGNvbXBsZXRhIGRvIHRyYcOnbyBsYXRlbnRlIGVzdGltYWRvDQoNCg0KDQpgYGB7cn0NCmhpc3QoYmFuY29fRFQkejEsIG1haW49ICJIaXN0b2dyYW1hIGRvIHRyYcOnbyBsYXRlbnRlIGVzdGltYWRvIiwgeGxhYj0iUGVyY2Vww6fDo28gZW0gcmVsYcOnw6NvIGFvIGFib3J0byBlc3RpbWFkYSIpDQpgYGANCg0KT2xoYW5kbyBvIGdyw6FmaWNvIGFjaW1hLCBmaWNhIMOzYnZpbyBxdWUgbyB0cmHDp28gbGF0ZW50ZSBuw6NvIHRlbSB1bWEgZGlzdHJpYnVpw6fDo28gbm9ybWFsLg0KDQojIyBSZXRvcm5hbmRvIGFzIGxpbmhhcyBjb20gdHJhw6dvIGxhdGVudGUgbcOtbmltbyBlIG3DoXhpbW8NCg0KDQpgYGB7cn0NCnN1bW1hcnkoYmFuY29fRFQkejEpDQpgYGANCg0KYGBge3J9DQpRdWVyeSA9IHNxbGRmOjpzcWxkZignc2VsZWN0Kg0KICAgICAgICAgICAgICAgICAgZnJvbSBiYW5jb19EVA0KICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgejEgaW4oLTAuODk4MTAsMC42NjAxMCknKQ0KDQoNCkRUOjpkYXRhdGFibGUoUXVlcnkpDQoNCmBgYA0KDQo8YnI+DQoNCg0KIyBSZWZlcsOqbmNpYXM6DQoNCkJhcnRob2xvbWV3LCBELiwgU3RlZWwsIEYuLCBNb3VzdGFraSwgSS4gYW5kIEdhbGJyYWl0aCwgSi4gKDIwMDIpICpUaGUgQW5hbHlzaXMgYW5kIEludGVycHJldGF0aW9uIG9mDQpNdWx0aXZhcmlhdGUgRGF0YSBmb3IgU29jaWFsIFNjaWVudGlzdHMqLiBMb25kb246IENoYXBtYW4gYW5kIEhhbGwuDQpLbm90dCwgTS4sIEFsYmFuZXNlLCBNLiBhbmQgR2FsYnJhaXRoLCBKLiAoMTk5MCkgU2NvcmluZyBhdHRpdHVkZXMgdG8gYWJvcnRpb24uICpUaGUgU3RhdGlzdGljaWFuKiwgNDAsDQoyMTfigJMyMjMuDQpNY0dyYXRoLCBLLiBhbmQgV2F0ZXJ0b24sIEouICgxOTg2KSAqQnJpdGlzaCBzb2NpYWwgYXR0aXR1ZGVzKiwgMTk4My04NiBwYW5lbCBzdXJ2ZXkuIExvbmRvbjogU0NQUi4NCg0KDQo8c3BhbiBzdHlsZT0gImNvbG9yOnJlZDsgZm9udC1zaXplOjE4cHgiPioqTkI6KiogTyBhcnRpZ28gZXN0w6Egbm8gc2l0ZTpodHRwczovL3d3dy5qc3Rvci5vcmcvc3RhYmxlLzIzNDg0OTQ/b3JpZ2luPWNyb3NzcmVmJnNlcT0xDQo=