Este material tem como objetivo contribuir para o entendimento sobre modelos autorregressivos de médias móveis (ARMA), principalmente sobre como avaliar a estacionariedade destes modelos e como fazer uso de critérios de informação AIC e/ou BIC para identificar na prática a ordem de um modelo ARMA.
INTRODUÇÃO
Nos modelos de séries temporais univariadas a modelagem econométrica tem como objetivo capturar a relação entre \(r_{t}\) e informações disponíveis antes de \(t\). Assim, a expressão geral da série temporal dos retornos, \({\left\{{r}_{t}\right\}}_{t=1}^{T}\), pode ser definida como:
\[
{r}_{t}=f\left({r}_{t-1},{r}_{t-2},...,{a}_{t} \right)
\]
A função acima nos diz que valores passados dos retornos (\({r}_{t-1},{r}_{t-2},...,\)) juntamente com um termo de erro (\(a_{t}\)) são úteis para modelar o retorno em \(t\). Para que a equação seja operacional precisamos definir:
- A forma funcional de \(f\left(\right)\)
- O número de defasagens do retorno
- Uma estrutura para o termo de erro \({a}_{t}\)
Diferentemente dos modelos de regressão linear múltipla, onde fazemos uso da teoria econômica para definir a forma funcional de \(f\left(\right)\), em séries temporais univariadas as funções de autocorrelação e autocorrelação parcial definirão os três pontos listados acima.
A classe de modelos autorregressivos de médias móveis (ARMA) é caracterizada por uma formulação para \(f\left(\right)\) que combina as ideias dos modelos autorregressivos (AR) com modelos de médias móveis (MA) em uma forma compacta de modo que o número de parâmetros usados seja pequeno, alcançando parcimônia na parametrização.
De forma geral, podemos escrever um modelo autorregressivo de médias móveis da seguinte forma:
\[
r_{t} = \mu + \phi_{1}r_{t-1} + \phi_{2}r_{t-2} + ... + \phi_{p}r_{t-p} + a_{t} + {\theta}_{1}a_{t-1} + {\theta}_{2}a_{t-2} + ... + {\theta}_{q}a_{t-q}
\]
Esta formulação é conhecida como ARMA(p,q) dado que \(p\) defasagens do retorno são usadas bem como \(q\) defasagens do termo de erro para especificar a forma funcional linear a ser estimada.
ARMA(1,1)
Suponha que temos o seguinte modelo autorregressivo de médias móveis de primeira ordem, ARMA(1,1).
\[
r_{t} = \phi_{0} + \phi_{1}r_{t-1} + a_{t} + {\theta}_{1}a_{t-1}
\]
onde \(a_{t}\) é um ruído branco com média \(0\), variância \(\sigma_{a}^{2}\), \(E\left[ \left(a_t-\bar{a}\right)\left(a_{t-l}-\bar{a}\right)\right]=E[a_{t}a_{t-l}]=0\) e independente e identicamente distribuído (iid).
Anteriormente, assumimos a hipótese de estacionariedade fraca para modelar uma série temporal. Assim, para estimar um modelo \(ARMA(1,1)\) temos que garantir que as hipóteses são mantidas. Elas são: \(E[r_{t}]=\mu\), \(Var(r_{t}) = \gamma_{0}\) e \(Cov(r_{t},r_{t-l})=\gamma_{l}\) onde \(\mu\) e \(\gamma_{0}\) são constantes e \(\gamma_{l}\) é função de uma defasagem \(l\) qualquer, mas não do tempo \(t\).
- MÉDIA INCONDICIONAL CONSTANTE
Fazendo uso da hipóteses \(E[r_{t}]=E[r_{t-1}]=\mu\) e \(E[a_{t}]=E[a_{t-1}]=0\), temos:
\[
\begin{split}
E[r_{t}] & = \phi_{0} + \phi_{1}E[r_{t-1}] + E[a_{t}] + {\theta}_{1}E[a_{t-1}] \\
& \\
\mu &= \phi_{0} + \phi_{1}\mu \\
& \\
\mu & = \frac{{\phi}_{0}}{1 - {\phi}_{1}}
\end{split}
\]
O resultado mostra que o valor esperado do modelo autorregressivo de médias móveis de primeira ordem, ARMA(1,1), é exatamente o mesmo do modelo AR(1). Além disso, o resultado confirma que o valor esperado sempre será constante e independente do tempo assim como proposto pela hipótese de estacionariedade fraca. Porém, precisamos que \({\phi}_{1} \neq 1\) para que o valor esperado exista.
- VARIÂNCIA INCONDICIONAL CONSTANTE
Assumindo por simplicidade que \(\phi_{0}=0\), temos uma nova especificação para o modelo como :
\[
r_{t} = \phi_{1}r_{t-1} + a_{t} + {\theta}_{1}a_{t-1}
\] Multiplicando tal especificação por \(a_{t}\) e calculando o valor esperado (fazendo uso da hipótese de que \(Var(a_{t})=\sigma_{a}^{2}=E[a_{t}^{2}]\)), obtemos:
\[
\begin{split}
E[r_{t}a_{t}] &= \phi_{1}E[r_{t-1}a_{t}] + E[{a_{t}^2}] + \theta_{1}E[a_{t-1}a_{t}] \\
& \\
& = E[{a_{t}^2}] \\
& \\
& = \sigma_{a}^{2}
\end{split}
\]
Agora, calculando a variância da nova especificação do modelo e fazendo uso da definição anterior, temos:
\[
\begin{split}
Var(r_{t}) &= \phi_{1}^{2}Var(r_{t-1})+Var(a_{t})+\theta_{1}^{2}Var(a_{t-1})+2\phi_{1}\theta_{1}Var(r_{t-1}a_{t-1}) \\
& \\
& = \phi_{1}^{2}Var(r_{t})+\sigma_{a}^{2}+\theta_{1}^{2}\sigma_{a}^{2}+2\phi_{1}\theta_{1}\sigma_{a}^{2} \\
& \\
& = \frac{(1+2\phi_{1}\theta_{1}+\theta_{1}^{2})\sigma_{a}^{2}}{1-\phi_{1}^{2}} \\
\end{split}
\]
Em função da necessidade da variância ser positiva, precisamos que \(\phi_{1}^{2}<1\), ou seja, \(\left| \phi_{1} \right|<1\) assim como tínhamos para o modelo autorregressivo de primeira ordem, AR(1).
- AUTOCOVARIÂNCIA E AUTOCORRELAÇÃO DEPENDENTES APENAS DE \(l\)
Para obter a função de autocovariância, vamos continuar assumindo que \(\phi_{0}=0\), mas agora multiplicaremos o modelo por \(r_{t-l}\) para obter:
\[
r_{t}r_{t-l} - \phi_{1}r_{t-1}r_{t-l} = a_{t}r_{t-l}+\theta_{1}a_{t-1}r_{t-l}
\] Para \(l=1\), calculando o valor esperando e usando \(E[r_{t}a_{t}] = E[{a_{t}^2}] = \sigma_{a}^{2}\), temos:
\[
\begin{split}
r_{t}r_{t-1} - \phi_{1}r_{t-1}r_{t-1} &= a_{t}r_{t-1}+\theta_{1}a_{t-1}r_{t-1} \\
\\
E\left[r_{t}r_{t-1}\right] - \phi_{1}E\left[r_{t-1}r_{t-1}\right] &= E\left[a_{t}r_{t-1}\right]+\theta_{1}E\left[a_{t-1}r_{t-1}\right] \\
\\
E\left[(r_{t}-\mu)(r_{t-1}-\mu)\right] - \phi_{1}E\left[(r_{t-1}-\mu)(r_{t-1}-\mu)\right] &= E\left[a_{t}(r_{t-1}-\mu)\right]+\theta_{1}E\left[a_{t-1}(r_{t-1}-\mu)\right] \\
\\
\gamma_{1}-\phi_{1}\gamma_{0} &= \theta_{1}\sigma_{a}^{2} \\
\\
\gamma_{1} &= \phi_{1}\gamma_{0}+\theta_{1}\sigma_{a}^{2} \\
\end{split}
\] Este resultado é diferente do obtido para o AR(1) onde \(\gamma_{1}=\phi_{1}\gamma_{0}\). Contudo, para \(l=2\) e tomando o valor esperado, temos:
\[
\begin{split}
r_{t}r_{t-2} - \phi_{1}r_{t-1}r_{t-2} &= a_{t}r_{t-2}+\theta_{1}a_{t-1}r_{t-2} \\
& \\
E\left[r_{t}r_{t-2}\right] - \phi_{1}E\left[r_{t-1}r_{t-2}\right] &= E\left[a_{t}r_{t-2}\right]+\theta_{1}E\left[a_{t-1}r_{t-2}\right] \\
& \\
E\left[(r_{t}-\mu)(r_{t-2}-\mu)\right] - \phi_{1}E\left[(r_{t-1}-\mu)(r_{t-2}-\mu)\right] &= E\left[a_{t}r_{t-2}\right]+\theta_{1}E\left[a_{t-1}r_{t-2}\right] \\
& \\
\gamma_{2}-\phi_{1}\gamma_{1} &= 0 \\
& \\
\gamma_{2} &= \phi_{1}\gamma_{1} \\
\end{split}
\]
que é o mesmo resultado obtido para autocovariância do AR(2). Sabemos que a divisão da autocovariância pela variância proporcionará a autocorrelação. Assumindo que dividimos a equação acima pela variância do processo e em função de \(VAR(r_t)=VAR(r_{t-1})=VAR(r_{t-2})=VAR(r_{t-l})\) teremos a função de autocorrelação do modelo ARMA(1,1):
- para \(l=1\), \(\rho_{1} = \phi_{1} + \frac{\theta_{1}\sigma_{a}^{2}}{\gamma_{0}}\)
- para \(l>1\), \(\rho_{l}=\phi_{1}\rho_{l-1}\)
Assim, a função de autocorrelação de um modelo ARMA(1,1) se comporta muito semelhante à FAC do AR(1) exceto pelo fato que o seu decaimento inicia na defasagem 2.
- FUNÇÕES DE AUTOCORRELAÇÃO E AUTOCORRELAÇÃO PARCIAL
Podemos visualizar as propriedades estudadas para este modelo a partir de suas funções de autocorrelação e autocorrelação parcial. Para tanto, vamos simular um modelo no seguinte formato:
\[
r_{t} = 10 + 0.5r_{t-1} + a_{t} + 0.3a_{t-1}
\] A imagem abaixo mostra o gráfico da série temporal resultante do modelo. É possível observar que realmente há estacionariedade fraca dado que a série oscila em torno de uma média (\(10\)) e com uma variância constante.
A análise das funções de autocorrelação (FAC) e autocorrelação parcial (FACP) da série, mostradas abaixo, confirmam que para a FAC há decaimento a partir da segunda defasagem, mas há mais de uma defasagem estatísticamente significante. Assim, se utilizarmos a FAC para definir a ordem do MA e a FACP para a ordem do AR, conforme estudado até aqui, teríamos um modelo ARMA(2,4) o que não está correto dado que sabemos que os dados foram gerados por um modelo ARMA(1,1).


Assim, temos que apesar dos modelos ARMA(p,q) serem combinações lineares de modelos AR(p) e MA(q), o comportamento das funções de autocorrelação e autocorrelação parcial não necessáriamente estarão em conformidade com o que estudamos para os modelos AR e MA. Desta forma, faz-se necessário testes estatísticos que nos ajude na definição correta das ordens do modelo ARMA(p,q).
IDENTIFICANDO MODELOS ARMA NA PRÁTICA
Como vimos nas simulações para modelos ARMA mostradas anteriormente, as funções de autocorrelação e autocorrelação parcial não são informativas para definir a ordem dos modelos. Uma alternativa é fazer o uso de algum critério de informação. Neste caso, temos o Akaike’s Information Criterion (AIC) e o Bayesian Information Criterion (BIC) como opção.
O critério de informação é uma forma de encontrar o número ideal de parâmetros de um modelo. Para entendê-lo, tenha em mente que, a cada regressor adicional, a soma dos resíduos não vai aumentar; frequentemente, diminuirá. A redução se dá à custa de mais regressores. Para balancear a redução dos erros e o aumento do número de regressores, o critério de informação associa uma penalidade a esse aumento.
Tipicamente, para algum \(P\) e \(Q\), computa-se o AIC ou BIC para diversos modelos ARMA(p,q), onde \(0\le p \le P\) e \(0\le q \le Q\). Selecionamos o modelo que retorna o menor valor de AIC e/ou BIC. Esta abordagem requer estimação usando o princípio da máxima verossimilhança.
- Akaike’s Information Criterion (AIC)
\[
AIC =\frac{-2}{T}\ln(verossimilhança) + \frac{2N}{T}
\] onde a funçaõ de verossimilhança é avaliada na estimativa de máximo, \(T\) é o tamanho da amostra e \(N\) é o número de parâmetros estimados pelo modelo (neste caso, \(p+q+1\) onde \(1\) representa o intercepto e \(p\) e \(q\) os parâmetros da parte autorregressiva e de médias móveis, respectivamente).
O primeiro termo da equação mede a qualidade do ajuste do modelo aos dados, enquanto o segundo termo é chamado de função de penalização dado que penaliza modelos com muitos parâmetros. Queremos entre todas as combinações de modelos a que apresenta menor AIC.
Para um mesmo tamanho de amostra (\(T\)) e verossimilhança e diversos valores para a quantidade de parâmetros estimados (\(N\)), podemos observar no gráfico abaixo que na medida que os parâmetros aumentam o AIC aumenta. Isto torna menor a probabilidade de escolher dentre modelos com mesma verossimilhança aqueles que tem maior quantidade de parâmetros.

Agora, observe o papel da verossimilhança no AIC. Para modelos com a mesma quantidade de parâmetros e tamanho de amostra, na medida que a verossimilhança aumenta, menor o valor do AIC. Isto aumenta a probabildiade de escolher dentre modelos com mesma quantidade de parâmetros e tamanho de amostra, o modelo com maior verossimilhança.

- Bayesian Information Criterion (BIC)
Akaike (1977), Rissanem (1978) e Schwarz (1978) sugerem minimizar o critério de informação bayesiano, dado por:
\[
BIC =-2\ln(verossimilhança) + \frac{N\ln T}{T}
\] onde a função de verossimilhança é avalia na estimativa de máximo, \(T\) é o tamanho da amostra e \(N\) é o número de parâmetros estimados pelo modelo (neste caso, \(p+q+1\) onde \(1\) representa o intercepto e \(p\) e \(q\) os parâmetros da parte autorregressiva e de médias móveis, respectivamente). A mesma análise sobre o papel de cada termo na equação do critério bem como a penalização realizada para o AIC permance para o BIC, mudando apenas a forma como cada termo na equação é obtido.
Um ponto de atenção é que conforme Emiliano et al. (2010) o BIC possui melhor performance em amostras maiores e segundo Zou, Hastie, and Tibshirani (2012) tem maior capacidade de escolher modelos mais simples.
Não vamos exemplificar aqui como definir a defasagem de um modelo ARMA(p,q) na prática, em função de ser prioritário aprender como estimar tais modelos (os critérios de informação necessitam do valor da verossimilhança que é obtida a partir da estimação)
REFERÊNCIAS
Campbell, John Y, Andrew Wen-Chuan Lo, and Archie Craig MacKinlay. 1997. The Econometrics of Financial Markets. Princeton (NJ) Princeton University Press.
Emiliano, Paulo C, Elayne P Veiga, Vivanco, and Fortunato S Menezes. 2010. “Critérios de Informação de Akaike Versus Bayesiano Análise Comparativa.”
Morettin, Pedro Alberto. 2008. Econometria Financeira Um Curso Em Séries Temporais Financeiras. Edgard Blucher.
Tsay, Ruey S. 2010. Analysis of Financial Time Series. John Wiley & Sons.
———. 2014. An Introduction to Analysis of Financial Data with R. John Wiley & Sons.
Zou, Hui, Trevor Hastie, and Tibshirani. 2012. “On the ‘Degrees of Freedom’ of the Lasso” 35 (5): 2173–92.
LS0tCnRpdGxlOiA8Y2VudGVyPiA8aDI+IDxiPiBNb2RlbG9zIEF1dG9ycmVncmVzc2l2b3MgZGUgTcOpZGlhcyBNw7N2ZWlzIChBUk1BKSA8L2I+IDwvaDI+IDwvY2VudGVyPiAKYXV0aG9yOiA8Y2VudGVyPiBGcmFuayBNYWdhbGjDo2VzIGRlIFBpbmhvIC0gSUJNRUMvTUcgPC9jZW50ZXI+CmdyYXBoaWNzOiB5ZXMKbGlua2NvbG9yOiBibHVlCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICAgIHRoZW1lOiBjZXJ1bGVhbgogICAgZmlnX2NhcHRpb246IHllcwpyZWZlcmVuY2VzOgotIGlkOiB0c2F5MjAxNGludHJvZHVjdGlvbgogIHRpdGxlOiBBbiBpbnRyb2R1Y3Rpb24gdG8gYW5hbHlzaXMgb2YgZmluYW5jaWFsIGRhdGEgd2l0aCBSCiAgYXV0aG9yOgogIC0gZmFtaWx5OiBUc2F5CiAgICBnaXZlbjogUnVleSBTCiAgcHVibGlzaGVyOiBKb2huIFdpbGV5IFwmIFNvbnMKICB0eXBlOiBib29rCiAgaXNzdWVkOgogICAgeWVhcjogMjAxNAotIGlkOiBjYW1wYmVsbDE5OTdlY29ub21ldHJpY3MKICB0aXRsZTogVGhlIGVjb25vbWV0cmljcyBvZiBmaW5hbmNpYWwgbWFya2V0cwogIGF1dGhvcjoKICAtIGZhbWlseTogQ2FtcGJlbGwKICAgIGdpdmVuOiBKb2huIFkKICAtIGZhbWlseTogTG8KICAgIGdpdmVuOiBBbmRyZXcgV2VuLUNodWFuCiAgLSBmYW1pbHk6IE1hY0tpbmxheQogICAgZ2l2ZW46IEFyY2hpZSBDcmFpZwogIHB1Ymxpc2hlcjogUHJpbmNldG9uIChOSikgUHJpbmNldG9uIFVuaXZlcnNpdHkgUHJlc3MKICB0eXBlOiBib29rCiAgaXNzdWVkOgogICAgeWVhcjogMTk5NwotIGlkOiBtb3JldHRpbjIwMDhlY29ub21ldHJpYQogIHRpdGxlOiBFY29ub21ldHJpYSBmaW5hbmNlaXJhIHVtIGN1cnNvIGVtIHPDqXJpZXMgdGVtcG9yYWlzIGZpbmFuY2VpcmFzCiAgYXV0aG9yOgogIC0gZmFtaWx5OiBNb3JldHRpbgogICAgZ2l2ZW46IFBlZHJvIEFsYmVydG8KICBwdWJsaXNoZXI6IEVkZ2FyZCBCbHVjaGVyCiAgdHlwZTogYm9vawogIGlzc3VlZDoKICAgIHllYXI6IDIwMDgKLSBpZDogdHNheTIwMTBhbmFseXNpcwogIHRpdGxlOiBBbmFseXNpcyBvZiBmaW5hbmNpYWwgdGltZSBzZXJpZXMKICBhdXRob3I6CiAgLSBmYW1pbHk6IFRzYXkKICAgIGdpdmVuOiBSdWV5IFMKICBwdWJsaXNoZXI6IEpvaG4gV2lsZXkgXCYgU29ucwogIHR5cGU6IGJvb2sKICBpc3N1ZWQ6CiAgICB5ZWFyOiAyMDEwCi0gaWQ6IHpvdTIwMDdkZWdyZWVzCiAgdGl0bGU6IE9uIHRoZSDigJxkZWdyZWVzIG9mIGZyZWVkb23igJ0gb2YgdGhlIGxhc3NvCiAgYXV0aG9yOgogIC0gZmFtaWx5OiBab3UKICAgIGdpdmVuOiBIdWkKICAtIGZhbWlseTogSGFzdGllCiAgICBnaXZlbjogVHJldm9yCiAgLSBmYW1pbHk6IFRpYnNoaXJhbmkKICAgIGdpdmU6IFJvYmVydAogIHB1Ymxpc2hlcjogVGhlIEFubmFscyBvZiBTdGF0aXN0aWNzCiAgdHlwZTogYXJ0aWNsZS1qb3VybmFsCiAgaXNzdWVkOgogICAgeWVhcjogMjAxMgogIGlzc3VlOiA1CiAgdm9sdW1lOiAzNQogIHBhZ2U6IDIxNzMtMjE5MgotIGlkOiBlbWlsaWFubzIwMTBjcml0ZXJpb3MKICB0aXRsZTogQ3JpdMOpcmlvcyBkZSBpbmZvcm1hw6fDo28gZGUgYWthaWtlIHZlcnN1cyBiYXllc2lhbm8gYW7DoWxpc2UgY29tcGFyYXRpdmEKICBhdXRob3I6CiAgLSBmYW1pbHk6IEVtaWxpYW5vCiAgICBnaXZlbjogUGF1bG8gQwogIC0gZmFtaWx5OiBWZWlnYQogICAgZ2l2ZW46IEVsYXluZSBQCiAgLSBmYW1pbHk6IFZpdmFuY28KICAgIGdpdmU6IE3DoXJpbyBKRgogIC0gZmFtaWx5OiBNZW5lemVzCiAgICBnaXZlbjogRm9ydHVuYXRvIFMKICBwdWJsaXNoZXI6IDE5IFNpbXDDs3NpbyBOYWNpb25hbCBkZSBQcm9iYWJpbGRpYWRlIGUgRXN0YXTDrXN0aWNhCiAgdHlwZTogYXJ0aWNsZS1qb3VybmFsCiAgaXNzdWVkOgogICAgeWVhcjogMjAxMApub2NpdGU6IHwgCiAgQHRzYXkyMDE0aW50cm9kdWN0aW9uLCBAY2FtcGJlbGwxOTk3ZWNvbm9tZXRyaWNzLCBAbW9yZXR0aW4yMDA4ZWNvbm9tZXRyaWEsIEB0c2F5MjAxMGFuYWx5c2lzCi0tLQoKRXN0ZSBtYXRlcmlhbCB0ZW0gY29tbyBvYmpldGl2byBjb250cmlidWlyIHBhcmEgbyBlbnRlbmRpbWVudG8gc29icmUgKiptb2RlbG9zIGF1dG9ycmVncmVzc2l2b3MgZGUgbcOpZGlhcyBtw7N2ZWlzIChBUk1BKSoqLCBwcmluY2lwYWxtZW50ZSBzb2JyZSBjb21vIGF2YWxpYXIgYSBlc3RhY2lvbmFyaWVkYWRlIGRlc3RlcyBtb2RlbG9zIGUgY29tbyBmYXplciB1c28gZGUgY3JpdMOpcmlvcyBkZSBpbmZvcm1hw6fDo28gKipBSUMgZS9vdSBCSUMqKiBwYXJhIGlkZW50aWZpY2FyIG5hIHByw6F0aWNhIGEgb3JkZW0gZGUgdW0gbW9kZWxvIEFSTUEuCgpgYGB7ciwgZWNobz1GQUxTRX0KIyBQYWNvdGVzIG5lY2Vzc2FyaW9zCnN1cHByZXNzTWVzc2FnZXMocmVxdWlyZSh6b28pKQpzdXBwcmVzc01lc3NhZ2VzKHJlcXVpcmUocXVhbnRtb2QpKQpzdXBwcmVzc01lc3NhZ2VzKHJlcXVpcmUoRFQpKQpzdXBwcmVzc01lc3NhZ2VzKHJlcXVpcmUoZHBseXIpKQpzdXBwcmVzc01lc3NhZ2VzKHJlcXVpcmUobWFncml0dHIpKQpzdXBwcmVzc01lc3NhZ2VzKHJlcXVpcmUoaGlnaGNoYXJ0ZXIpKQpzdXBwcmVzc01lc3NhZ2VzKHJlcXVpcmUoUGVyZm9ybWFuY2VBbmFseXRpY3MpKSAKc3VwcHJlc3NNZXNzYWdlcyhyZXF1aXJlKGh0bWx0b29scykpCmBgYAoKIyMjIyMgKipJTlRST0RVw4fDg08qKgoKTm9zIG1vZGVsb3MgZGUgc8OpcmllcyB0ZW1wb3JhaXMgdW5pdmFyaWFkYXMgYSBtb2RlbGFnZW0gZWNvbm9tw6l0cmljYSB0ZW0gY29tbyBvYmpldGl2byAqKmNhcHR1cmFyIGEgcmVsYcOnw6NvIGVudHJlICRyX3t0fSQgZSBpbmZvcm1hw6fDtWVzIGRpc3BvbsOtdmVpcyBhbnRlcyBkZSAkdCQuKiogQXNzaW0sIGEgZXhwcmVzc8OjbyBnZXJhbCBkYSBzw6lyaWUgdGVtcG9yYWwgZG9zIHJldG9ybm9zLCAke1xsZWZ0XHt7cn1fe3R9XHJpZ2h0XH19X3t0PTF9XntUfSQsIHBvZGUgc2VyIGRlZmluaWRhIGNvbW86CgokJAp7cn1fe3R9PWZcbGVmdCh7cn1fe3QtMX0se3J9X3t0LTJ9LC4uLix7YX1fe3R9IFxyaWdodCkKJCQKCkEgZnVuw6fDo28gYWNpbWEgbm9zIGRpeiBxdWUgdmFsb3JlcyBwYXNzYWRvcyBkb3MgcmV0b3Jub3MgKCR7cn1fe3QtMX0se3J9X3t0LTJ9LC4uLiwkKSBqdW50YW1lbnRlIGNvbSB1bSB0ZXJtbyBkZSBlcnJvICgkYV97dH0kKSBzw6NvIMO6dGVpcyBwYXJhIG1vZGVsYXIgbyByZXRvcm5vIGVtICR0JC4gUGFyYSBxdWUgYSBlcXVhw6fDo28gc2VqYSBvcGVyYWNpb25hbCBwcmVjaXNhbW9zIGRlZmluaXI6CgoqIEEgZm9ybWEgZnVuY2lvbmFsIGRlICRmXGxlZnQoXHJpZ2h0KSQKKiBPIG7Dum1lcm8gZGUgZGVmYXNhZ2VucyBkbyByZXRvcm5vCiogVW1hIGVzdHJ1dHVyYSBwYXJhIG8gdGVybW8gZGUgZXJybyAke2F9X3t0fSQKCkRpZmVyZW50ZW1lbnRlIGRvcyBtb2RlbG9zIGRlIHJlZ3Jlc3PDo28gbGluZWFyIG3Dumx0aXBsYSwgb25kZSBmYXplbW9zIHVzbyBkYSB0ZW9yaWEgZWNvbsO0bWljYSBwYXJhIGRlZmluaXIgYSBmb3JtYSBmdW5jaW9uYWwgZGUgJGZcbGVmdChccmlnaHQpJCwgZW0gc8OpcmllcyB0ZW1wb3JhaXMgdW5pdmFyaWFkYXMgYXMgZnVuw6fDtWVzIGRlIGF1dG9jb3JyZWxhw6fDo28gZSBhdXRvY29ycmVsYcOnw6NvIHBhcmNpYWwgZGVmaW5pcsOjbyBvcyB0csOqcyBwb250b3MgbGlzdGFkb3MgYWNpbWEuIAoKQSBjbGFzc2UgZGUgKiptb2RlbG9zIGF1dG9ycmVncmVzc2l2b3MgZGUgbcOpZGlhcyBtw7N2ZWlzIChBUk1BKSoqIMOpIGNhcmFjdGVyaXphZGEgcG9yIHVtYSBmb3JtdWxhw6fDo28gcGFyYSAkZlxsZWZ0KFxyaWdodCkkIHF1ZSBjb21iaW5hIGFzIGlkZWlhcyBkb3MgbW9kZWxvcyBhdXRvcnJlZ3Jlc3Npdm9zIChBUikgY29tIG1vZGVsb3MgZGUgbcOpZGlhcyBtw7N2ZWlzIChNQSkgZW0gdW1hIGZvcm1hIGNvbXBhY3RhIGRlIG1vZG8gcXVlIG8gbsO6bWVybyBkZSBwYXLDom1ldHJvcyB1c2Fkb3Mgc2VqYSBwZXF1ZW5vLCBhbGNhbsOnYW5kbyBwYXJjaW3DtG5pYSBuYSBwYXJhbWV0cml6YcOnw6NvLgoKRGUgZm9ybWEgZ2VyYWwsIHBvZGVtb3MgZXNjcmV2ZXIgdW0gKiptb2RlbG8gYXV0b3JyZWdyZXNzaXZvIGRlIG3DqWRpYXMgbcOzdmVpcyoqIGRhIHNlZ3VpbnRlIGZvcm1hOgoKJCQKcl97dH0gPSBcbXUgKyBccGhpX3sxfXJfe3QtMX0gKyBccGhpX3syfXJfe3QtMn0gKyAuLi4gKyBccGhpX3twfXJfe3QtcH0gKyBhX3t0fSArIHtcdGhldGF9X3sxfWFfe3QtMX0gKyB7XHRoZXRhfV97Mn1hX3t0LTJ9ICsgLi4uICsge1x0aGV0YX1fe3F9YV97dC1xfQokJAoKRXN0YSBmb3JtdWxhw6fDo28gw6kgY29uaGVjaWRhIGNvbW8gKipBUk1BKHAscSkqKiBkYWRvIHF1ZSAkcCQgZGVmYXNhZ2VucyBkbyByZXRvcm5vIHPDo28gdXNhZGFzIGJlbSBjb21vICRxJCBkZWZhc2FnZW5zIGRvIHRlcm1vIGRlIGVycm8gcGFyYSBlc3BlY2lmaWNhciBhIGZvcm1hIGZ1bmNpb25hbCAqKmxpbmVhcioqIGEgc2VyIGVzdGltYWRhLiAKCiMjIyMjICoqQVJNQSgxLDEpKioKClN1cG9uaGEgcXVlIHRlbW9zIG8gc2VndWludGUgbW9kZWxvIGF1dG9ycmVncmVzc2l2byBkZSBtw6lkaWFzIG3Ds3ZlaXMgZGUgcHJpbWVpcmEgb3JkZW0sIEFSTUEoMSwxKS4KCiQkCnJfe3R9ID0gXHBoaV97MH0gKyBccGhpX3sxfXJfe3QtMX0gKyBhX3t0fSArIHtcdGhldGF9X3sxfWFfe3QtMX0KJCQKCm9uZGUgJGFfe3R9JCDDqSB1bSBydcOtZG8gYnJhbmNvIGNvbSBtw6lkaWEgJDAkLCB2YXJpw6JuY2lhICRcc2lnbWFfe2F9XnsyfSQsICRFXGxlZnRbIFxsZWZ0KGFfdC1cYmFye2F9XHJpZ2h0KVxsZWZ0KGFfe3QtbH0tXGJhcnthfVxyaWdodClccmlnaHRdPUVbYV97dH1hX3t0LWx9XT0wJCBlIGluZGVwZW5kZW50ZSBlIGlkZW50aWNhbWVudGUgZGlzdHJpYnXDrWRvIChpaWQpLiAKCkFudGVyaW9ybWVudGUsIGFzc3VtaW1vcyBhIGhpcMOzdGVzZSBkZSBlc3RhY2lvbmFyaWVkYWRlIGZyYWNhIHBhcmEgbW9kZWxhciB1bWEgc8OpcmllIHRlbXBvcmFsLiBBc3NpbSwgcGFyYSBlc3RpbWFyIHVtIG1vZGVsbyAkQVJNQSgxLDEpJCB0ZW1vcyBxdWUgZ2FyYW50aXIgcXVlIGFzIGhpcMOzdGVzZXMgc8OjbyBtYW50aWRhcy4gRWxhcyBzw6NvOiAkRVtyX3t0fV09XG11JCwgJFZhcihyX3t0fSkgPSBcZ2FtbWFfezB9JCBlICRDb3Yocl97dH0scl97dC1sfSk9XGdhbW1hX3tsfSQgb25kZSAkXG11JCBlICRcZ2FtbWFfezB9JCBzw6NvIGNvbnN0YW50ZXMgZSAkXGdhbW1hX3tsfSQgw6kgZnVuw6fDo28gZGUgdW1hIGRlZmFzYWdlbSAkbCQgcXVhbHF1ZXIsIG1hcyBuw6NvIGRvIHRlbXBvICR0JC4KCiogKipNw4lESUEgSU5DT05ESUNJT05BTCBDT05TVEFOVEUqKgoKRmF6ZW5kbyB1c28gZGEgaGlww7N0ZXNlcyAkRVtyX3t0fV09RVtyX3t0LTF9XT1cbXUkIGUgJEVbYV97dH1dPUVbYV97dC0xfV09MCQsIHRlbW9zOgoKJCQKXGJlZ2lue3NwbGl0fQpFW3Jfe3R9XSAmID0gXHBoaV97MH0gKyBccGhpX3sxfUVbcl97dC0xfV0gKyBFW2Ffe3R9XSArIHtcdGhldGF9X3sxfUVbYV97dC0xfV0gXFwKJiBcXApcbXUgJj0gXHBoaV97MH0gKyBccGhpX3sxfVxtdSBcXAomIFxcClxtdSAmID0gXGZyYWN7e1xwaGl9X3swfX17MSAtIHtccGhpfV97MX19ClxlbmR7c3BsaXR9CiQkCgpPIHJlc3VsdGFkbyBtb3N0cmEgcXVlIG8gdmFsb3IgZXNwZXJhZG8gZG8gbW9kZWxvIGF1dG9ycmVncmVzc2l2byBkZSBtw6lkaWFzIG3Ds3ZlaXMgZGUgcHJpbWVpcmEgb3JkZW0sICoqQVJNQSgxLDEpKiosIMOpIGV4YXRhbWVudGUgbyBtZXNtbyBkbyBtb2RlbG8gKipBUigxKSoqLiBBbMOpbSBkaXNzbywgbyByZXN1bHRhZG8gY29uZmlybWEgcXVlIG8gdmFsb3IgZXNwZXJhZG8gc2VtcHJlIHNlcsOhIGNvbnN0YW50ZSBlIGluZGVwZW5kZW50ZSBkbyB0ZW1wbyBhc3NpbSBjb21vIHByb3Bvc3RvIHBlbGEgaGlww7N0ZXNlIGRlIGVzdGFjaW9uYXJpZWRhZGUgZnJhY2EuIFBvcsOpbSwgcHJlY2lzYW1vcyBxdWUgJHtccGhpfV97MX0gXG5lcSAxJCBwYXJhIHF1ZSBvIHZhbG9yIGVzcGVyYWRvIGV4aXN0YS4KCiogKipWQVJJw4JOQ0lBIElOQ09ORElDSU9OQUwgQ09OU1RBTlRFKioKCkFzc3VtaW5kbyBwb3Igc2ltcGxpY2lkYWRlIHF1ZSAkXHBoaV97MH09MCQsIHRlbW9zIHVtYSBub3ZhIGVzcGVjaWZpY2HDp8OjbyBwYXJhIG8gbW9kZWxvIGNvbW8gOgoKJCQKcl97dH0gPSBccGhpX3sxfXJfe3QtMX0gKyBhX3t0fSArIHtcdGhldGF9X3sxfWFfe3QtMX0KJCQKTXVsdGlwbGljYW5kbyB0YWwgZXNwZWNpZmljYcOnw6NvIHBvciAkYV97dH0kIGUgY2FsY3VsYW5kbyBvIHZhbG9yIGVzcGVyYWRvIChmYXplbmRvIHVzbyBkYSBoaXDDs3Rlc2UgZGUgcXVlICRWYXIoYV97dH0pPVxzaWdtYV97YX1eezJ9PUVbYV97dH1eezJ9XSQpLCBvYnRlbW9zOgoKJCQKXGJlZ2lue3NwbGl0fQpFW3Jfe3R9YV97dH1dICY9IFxwaGlfezF9RVtyX3t0LTF9YV97dH1dICsgRVt7YV97dH1eMn1dICsgXHRoZXRhX3sxfUVbYV97dC0xfWFfe3R9XSBcXAomIFxcCiYgPSBFW3thX3t0fV4yfV0gXFwKJiBcXAomID0gXHNpZ21hX3thfV57Mn0KXGVuZHtzcGxpdH0KJCQKCkFnb3JhLCBjYWxjdWxhbmRvIGEgdmFyacOibmNpYSBkYSBub3ZhIGVzcGVjaWZpY2HDp8OjbyBkbyBtb2RlbG8gZSBmYXplbmRvIHVzbyBkYSBkZWZpbmnDp8OjbyBhbnRlcmlvciwgdGVtb3M6CgokJApcYmVnaW57c3BsaXR9ClZhcihyX3t0fSkgJj0gXHBoaV97MX1eezJ9VmFyKHJfe3QtMX0pK1ZhcihhX3t0fSkrXHRoZXRhX3sxfV57Mn1WYXIoYV97dC0xfSkrMlxwaGlfezF9XHRoZXRhX3sxfVZhcihyX3t0LTF9YV97dC0xfSkgXFwKJiBcXAomID0gXHBoaV97MX1eezJ9VmFyKHJfe3R9KStcc2lnbWFfe2F9XnsyfStcdGhldGFfezF9XnsyfVxzaWdtYV97YX1eezJ9KzJccGhpX3sxfVx0aGV0YV97MX1cc2lnbWFfe2F9XnsyfSBcXAomIFxcCiYgPSBcZnJhY3soMSsyXHBoaV97MX1cdGhldGFfezF9K1x0aGV0YV97MX1eezJ9KVxzaWdtYV97YX1eezJ9fXsxLVxwaGlfezF9XnsyfX0gXFwKXGVuZHtzcGxpdH0KJCQKCkVtIGZ1bsOnw6NvIGRhIG5lY2Vzc2lkYWRlIGRhIHZhcmnDom5jaWEgc2VyIHBvc2l0aXZhLCBwcmVjaXNhbW9zIHF1ZSAkXHBoaV97MX1eezJ9PDEkLCBvdSBzZWphLCAkXGxlZnR8IFxwaGlfezF9IFxyaWdodHw8MSQgYXNzaW0gY29tbyB0w61uaGFtb3MgcGFyYSBvIG1vZGVsbyBhdXRvcnJlZ3Jlc3Npdm8gZGUgcHJpbWVpcmEgb3JkZW0sICoqQVIoMSkqKi4KCiogKipBVVRPQ09WQVJJw4JOQ0lBIEUgQVVUT0NPUlJFTEHDh8ODTyBERVBFTkRFTlRFUyBBUEVOQVMgREUgJGwkKioKClBhcmEgb2J0ZXIgYSBmdW7Dp8OjbyBkZSBhdXRvY292YXJpw6JuY2lhLCB2YW1vcyBjb250aW51YXIgYXNzdW1pbmRvIHF1ZSAkXHBoaV97MH09MCQsIG1hcyBhZ29yYSBtdWx0aXBsaWNhcmVtb3MgbyBtb2RlbG8gcG9yICRyX3t0LWx9JCBwYXJhIG9idGVyOgoKJCQKcl97dH1yX3t0LWx9IC0gXHBoaV97MX1yX3t0LTF9cl97dC1sfSA9IGFfe3R9cl97dC1sfStcdGhldGFfezF9YV97dC0xfXJfe3QtbH0KJCQKUGFyYSAkbD0xJCwgY2FsY3VsYW5kbyBvIHZhbG9yIGVzcGVyYW5kbyBlIHVzYW5kbyAkRVtyX3t0fWFfe3R9XSA9IEVbe2Ffe3R9XjJ9XSA9IFxzaWdtYV97YX1eezJ9JCwgdGVtb3M6CgokJApcYmVnaW57c3BsaXR9CnJfe3R9cl97dC0xfSAtIFxwaGlfezF9cl97dC0xfXJfe3QtMX0gJj0gYV97dH1yX3t0LTF9K1x0aGV0YV97MX1hX3t0LTF9cl97dC0xfSBcXAogXFwKRVxsZWZ0W3Jfe3R9cl97dC0xfVxyaWdodF0gLSBccGhpX3sxfUVcbGVmdFtyX3t0LTF9cl97dC0xfVxyaWdodF0gJj0gRVxsZWZ0W2Ffe3R9cl97dC0xfVxyaWdodF0rXHRoZXRhX3sxfUVcbGVmdFthX3t0LTF9cl97dC0xfVxyaWdodF0gXFwKIFxcCiBFXGxlZnRbKHJfe3R9LVxtdSkocl97dC0xfS1cbXUpXHJpZ2h0XSAtIFxwaGlfezF9RVxsZWZ0WyhyX3t0LTF9LVxtdSkocl97dC0xfS1cbXUpXHJpZ2h0XSAmPSBFXGxlZnRbYV97dH0ocl97dC0xfS1cbXUpXHJpZ2h0XStcdGhldGFfezF9RVxsZWZ0W2Ffe3QtMX0ocl97dC0xfS1cbXUpXHJpZ2h0XSBcXAogXFwKXGdhbW1hX3sxfS1ccGhpX3sxfVxnYW1tYV97MH0gJj0gXHRoZXRhX3sxfVxzaWdtYV97YX1eezJ9IFxcCiBcXApcZ2FtbWFfezF9ICY9IFxwaGlfezF9XGdhbW1hX3swfStcdGhldGFfezF9XHNpZ21hX3thfV57Mn0gXFwKXGVuZHtzcGxpdH0KJCQKRXN0ZSByZXN1bHRhZG8gw6kgZGlmZXJlbnRlIGRvIG9idGlkbyBwYXJhIG8gKipBUigxKSoqIG9uZGUgJFxnYW1tYV97MX09XHBoaV97MX1cZ2FtbWFfezB9JC4gQ29udHVkbywgcGFyYSAkbD0yJCBlIHRvbWFuZG8gbyB2YWxvciBlc3BlcmFkbywgdGVtb3M6IAoKJCQKXGJlZ2lue3NwbGl0fQpyX3t0fXJfe3QtMn0gLSBccGhpX3sxfXJfe3QtMX1yX3t0LTJ9ICY9IGFfe3R9cl97dC0yfStcdGhldGFfezF9YV97dC0xfXJfe3QtMn0gXFwKJiBcXApFXGxlZnRbcl97dH1yX3t0LTJ9XHJpZ2h0XSAtIFxwaGlfezF9RVxsZWZ0W3Jfe3QtMX1yX3t0LTJ9XHJpZ2h0XSAmPSBFXGxlZnRbYV97dH1yX3t0LTJ9XHJpZ2h0XStcdGhldGFfezF9RVxsZWZ0W2Ffe3QtMX1yX3t0LTJ9XHJpZ2h0XSBcXAomIFxcCkVcbGVmdFsocl97dH0tXG11KShyX3t0LTJ9LVxtdSlccmlnaHRdIC0gXHBoaV97MX1FXGxlZnRbKHJfe3QtMX0tXG11KShyX3t0LTJ9LVxtdSlccmlnaHRdICY9IEVcbGVmdFthX3t0fXJfe3QtMn1ccmlnaHRdK1x0aGV0YV97MX1FXGxlZnRbYV97dC0xfXJfe3QtMn1ccmlnaHRdIFxcCiYgXFwKXGdhbW1hX3syfS1ccGhpX3sxfVxnYW1tYV97MX0gJj0gMCBcXAomIFxcClxnYW1tYV97Mn0gJj0gXHBoaV97MX1cZ2FtbWFfezF9IFxcClxlbmR7c3BsaXR9CiQkCgpxdWUgw6kgbyBtZXNtbyByZXN1bHRhZG8gb2J0aWRvIHBhcmEgYXV0b2NvdmFyacOibmNpYSBkbyAqKkFSKDIpKiouIFNhYmVtb3MgcXVlIGEgZGl2aXPDo28gZGEgYXV0b2NvdmFyacOibmNpYSBwZWxhIHZhcmnDom5jaWEgcHJvcG9yY2lvbmFyw6EgYSAqKmF1dG9jb3JyZWxhw6fDo28qKi4gQXNzdW1pbmRvIHF1ZSBkaXZpZGltb3MgYSBlcXVhw6fDo28gYWNpbWEgcGVsYSB2YXJpw6JuY2lhIGRvIHByb2Nlc3NvIGUgZW0gZnVuw6fDo28gZGUgJFZBUihyX3QpPVZBUihyX3t0LTF9KT1WQVIocl97dC0yfSk9VkFSKHJfe3QtbH0pJCB0ZXJlbW9zIGEgKipmdW7Dp8OjbyBkZSBhdXRvY29ycmVsYcOnw6NvKiogZG8gbW9kZWxvICoqQVJNQSgxLDEpKio6CgoqIHBhcmEgJGw9MSQsICRccmhvX3sxfSA9IFxwaGlfezF9ICsgXGZyYWN7XHRoZXRhX3sxfVxzaWdtYV97YX1eezJ9fXtcZ2FtbWFfezB9fSQKKiBwYXJhICRsPjEkLCAkXHJob197bH09XHBoaV97MX1ccmhvX3tsLTF9JAoKQXNzaW0sIGEgZnVuw6fDo28gZGUgYXV0b2NvcnJlbGHDp8OjbyBkZSB1bSBtb2RlbG8gKipBUk1BKDEsMSkqKiBzZSBjb21wb3J0YSBtdWl0byBzZW1lbGhhbnRlIMOgIEZBQyBkbyAqKkFSKDEpKiogZXhjZXRvIHBlbG8gZmF0byBxdWUgbyBzZXUgZGVjYWltZW50byBpbmljaWEgbmEgZGVmYXNhZ2VtIDIuIAoKKiAqKkZVTsOHw5VFUyBERSBBVVRPQ09SUkVMQcOHw4NPIEUgQVVUT0NPUlJFTEHDh8ODTyBQQVJDSUFMKioKClBvZGVtb3MgdmlzdWFsaXphciBhcyBwcm9wcmllZGFkZXMgZXN0dWRhZGFzIHBhcmEgZXN0ZSBtb2RlbG8gYSBwYXJ0aXIgZGUgc3VhcyBmdW7Dp8O1ZXMgZGUgYXV0b2NvcnJlbGHDp8OjbyBlIGF1dG9jb3JyZWxhw6fDo28gcGFyY2lhbC4gUGFyYSB0YW50bywgdmFtb3Mgc2ltdWxhciB1bSBtb2RlbG8gbm8gc2VndWludGUgZm9ybWF0bzogCgokJApyX3t0fSA9IDEwICsgMC41cl97dC0xfSArIGFfe3R9ICsgMC4zYV97dC0xfQokJApBIGltYWdlbSBhYmFpeG8gbW9zdHJhIG8gZ3LDoWZpY28gZGEgc8OpcmllIHRlbXBvcmFsIHJlc3VsdGFudGUgZG8gbW9kZWxvLiDDiSBwb3Nzw612ZWwgb2JzZXJ2YXIgcXVlIHJlYWxtZW50ZSBow6EgZXN0YWNpb25hcmllZGFkZSBmcmFjYSBkYWRvIHF1ZSBhIHPDqXJpZSBvc2NpbGEgZW0gdG9ybm8gZGUgdW1hIG3DqWRpYSAoJDEwJCkgZSBjb20gdW1hIHZhcmnDom5jaWEgY29uc3RhbnRlLgoKYGBge3IsIGVjaG89RkFMU0UsIHRpZHk9VFJVRSwgcmVzdWx0cz0nYXNpcycsIHdhcm5pbmcgPSBGQUxTRX0KYXJtYTEgPC0gYXMueHRzKGFyaW1hLnNpbShsaXN0KG9yZGVyID0gYygxLDAsMSksIGFyPWMoMC40KSwgbWE9YygwLjMpKSwgbj0xMDAwKSsxMCkKaGMxIDwtIGhpZ2hjaGFydCh0eXBlID0gInN0b2NrIikgJT4lIAogIGhjX3RpdGxlKHRleHQgPSAiQVJNQSgxLDEpIFNpbXVsYWRvIikgJT4lIAogIGhjX2FkZF9zZXJpZXMoYXJtYTFbMTAwOmxlbmd0aChhcm1hMSldLCBpZCA9ICJhcm1hMSIsIGNvbG9yID0gJyMwZDIzM2EnKSAlPiUKICBoY19leHBvcnRpbmcoZW5hYmxlZCA9IFRSVUUpCgpoYzEKYGBgCgpBIGFuw6FsaXNlIGRhcyAqKmZ1bsOnw7VlcyBkZSBhdXRvY29ycmVsYcOnw6NvIChGQUMpIGUgYXV0b2NvcnJlbGHDp8OjbyBwYXJjaWFsIChGQUNQKSoqIGRhIHPDqXJpZSwgbW9zdHJhZGFzIGFiYWl4bywgY29uZmlybWFtIHF1ZSBwYXJhIGEgRkFDIGjDoSBkZWNhaW1lbnRvIGEgcGFydGlyIGRhIHNlZ3VuZGEgZGVmYXNhZ2VtLCBtYXMgaMOhIG1haXMgZGUgdW1hIGRlZmFzYWdlbSBlc3RhdMOtc3RpY2FtZW50ZSBzaWduaWZpY2FudGUuIEFzc2ltLCBzZSB1dGlsaXphcm1vcyBhIEZBQyBwYXJhIGRlZmluaXIgYSBvcmRlbSBkbyBNQSBlIGEgRkFDUCBwYXJhIGEgb3JkZW0gZG8gQVIsIGNvbmZvcm1lIGVzdHVkYWRvIGF0w6kgYXF1aSwgdGVyw61hbW9zIHVtIG1vZGVsbyBBUk1BKDIsNCkgbyBxdWUgbsOjbyBlc3TDoSBjb3JyZXRvIGRhZG8gcXVlIHNhYmVtb3MgcXVlIG9zIGRhZG9zIGZvcmFtIGdlcmFkb3MgcG9yIHVtIG1vZGVsbyBBUk1BKDEsMSkuCgpgYGB7ciwgZWNobz1GQUxTRSwgdGlkeT1UUlVFLCByZXN1bHRzPSdhc2lzJywgd2FybmluZyA9IEZBTFNFLCBmaWcuaGVpZ2h0PTd9CiMgRnVuw6fDo28gZGUgYXV0b2NvcnJlbGHDp8OjbwphY2ZfYXJtYTEgPC0gYWNmKGFybWExLCBuYS5hY3Rpb24gPSBuYS5wYXNzLCBwbG90ID0gRkFMU0UsIGxhZy5tYXggPSAxNSkKCiMgR3LDoWZpY28gZGEgZnVuw6fDo28gZGUgYXV0b2NvcnJlbGHDp8Ojby4gCnBsb3QoYWNmX2FybWExLCBtYWluID0gIiIsIHlsYWIgPSAiIiwgeGxhYiA9ICJEZWZhc2FnZW0iKQp0aXRsZSgiRnVuw6fDo28gZGUgQXV0b2NvcnJlbGHDp8OjbyAoRkFDKSIsIGFkaiA9IDAuNSwgbGluZSA9IDEpCgpgYGAKCmBgYHtyLCBlY2hvPUZBTFNFLCB0aWR5PVRSVUUsIHJlc3VsdHM9J2FzaXMnLCB3YXJuaW5nID0gRkFMU0UsIGZpZy5oZWlnaHQ9N30KIyBGdW7Dp8OjbyBkZSBhdXRvY29ycmVsYcOnw6NvIHBhcmNpYWwKcGFjZl9hcm1hMSA8LSBwYWNmKGFybWExLCBuYS5hY3Rpb24gPSBuYS5wYXNzLCBwbG90ID0gRkFMU0UsIGxhZy5tYXggPSAxNSkKCiMgR3LDoWZpY28gZGEgZnVuw6fDo28gZGUgYXV0b2NvcnJlbGHDp8OjbyBwYXJjaWFsLiAKcGxvdChwYWNmX2FybWExLCBtYWluID0gIiIsIHlsYWIgPSAiIiwgeGxhYiA9ICJEZWZhc2FnZW0iKQp0aXRsZSgiRnVuw6fDo28gZGUgQXV0b2NvcnJlbGHDp8OjbyBQYXJjaWFsIChGQUNQKSIsIGFkaiA9IDAuNSwgbGluZSA9IDEpCmBgYAoKQXNzaW0sIHRlbW9zIHF1ZSBhcGVzYXIgZG9zIG1vZGVsb3MgQVJNQShwLHEpIHNlcmVtIGNvbWJpbmHDp8O1ZXMgbGluZWFyZXMgZGUgbW9kZWxvcyBBUihwKSBlIE1BKHEpLCBvIGNvbXBvcnRhbWVudG8gZGFzIGZ1bsOnw7VlcyBkZSBhdXRvY29ycmVsYcOnw6NvIGUgYXV0b2NvcnJlbGHDp8OjbyBwYXJjaWFsIG7Do28gbmVjZXNzw6FyaWFtZW50ZSBlc3RhcsOjbyBlbSBjb25mb3JtaWRhZGUgY29tIG8gcXVlIGVzdHVkYW1vcyBwYXJhIG9zIG1vZGVsb3MgQVIgZSBNQS4gRGVzdGEgZm9ybWEsIGZhei1zZSBuZWNlc3PDoXJpbyB0ZXN0ZXMgZXN0YXTDrXN0aWNvcyBxdWUgbm9zIGFqdWRlIG5hIGRlZmluacOnw6NvIGNvcnJldGEgZGFzIG9yZGVucyBkbyBtb2RlbG8gQVJNQShwLHEpLgoKCiMjIyMjICoqSURFTlRJRklDQU5ETyBNT0RFTE9TIEFSTUEgTkEgUFLDgVRJQ0EqKgoKQ29tbyB2aW1vcyBuYXMgc2ltdWxhw6fDtWVzIHBhcmEgbW9kZWxvcyBBUk1BIG1vc3RyYWRhcyBhbnRlcmlvcm1lbnRlLCBhcyBmdW7Dp8O1ZXMgZGUgYXV0b2NvcnJlbGHDp8OjbyBlIGF1dG9jb3JyZWxhw6fDo28gcGFyY2lhbCBuw6NvIHPDo28gaW5mb3JtYXRpdmFzIHBhcmEgZGVmaW5pciBhIG9yZGVtIGRvcyBtb2RlbG9zLiBVbWEgYWx0ZXJuYXRpdmEgw6kgZmF6ZXIgbyB1c28gZGUgYWxndW0gY3JpdMOpcmlvIGRlIGluZm9ybWHDp8Ojby4gTmVzdGUgY2FzbywgdGVtb3MgbyAqQWthaWtl4oCZcyBJbmZvcm1hdGlvbiBDcml0ZXJpb24qIChBSUMpIGUgbyAqQmF5ZXNpYW4gSW5mb3JtYXRpb24gQ3JpdGVyaW9uKiAoQklDKSBjb21vIG9ww6fDo28uCgpPIGNyaXTDqXJpbyBkZSBpbmZvcm1hw6fDo28gw6kgdW1hIGZvcm1hIGRlIGVuY29udHJhciBvIG7Dum1lcm8gaWRlYWwgZGUgcGFyw6JtZXRyb3MgZGUgdW0gbW9kZWxvLiBQYXJhIGVudGVuZMOqLWxvLCB0ZW5oYSBlbSBtZW50ZSBxdWUsIGEgY2FkYSByZWdyZXNzb3IgYWRpY2lvbmFsLCBhIHNvbWEgZG9zIHJlc8OtZHVvcyBuw6NvIHZhaSBhdW1lbnRhcjsgZnJlcXVlbnRlbWVudGUsIGRpbWludWlyw6EuIEEgcmVkdcOnw6NvIHNlIGTDoSDDoCBjdXN0YSBkZSBtYWlzIHJlZ3Jlc3NvcmVzLiBQYXJhIGJhbGFuY2VhciBhIHJlZHXDp8OjbyBkb3MgZXJyb3MgZSBvIGF1bWVudG8gZG8gbsO6bWVybyBkZSByZWdyZXNzb3JlcywgbyBjcml0w6lyaW8gZGUgaW5mb3JtYcOnw6NvIGFzc29jaWEgdW1hIHBlbmFsaWRhZGUgYSBlc3NlIGF1bWVudG8uIAoKVGlwaWNhbWVudGUsIHBhcmEgYWxndW0gJFAkIGUgJFEkLCBjb21wdXRhLXNlIG8gKipBSUMqKiBvdSAqKkJJQyoqIHBhcmEgZGl2ZXJzb3MgbW9kZWxvcyBBUk1BKHAscSksIG9uZGUgJDBcbGUgcCBcbGUgUCQgZSAkMFxsZSBxIFxsZSBRJC4gU2VsZWNpb25hbW9zIG8gbW9kZWxvIHF1ZSByZXRvcm5hIG8gbWVub3IgdmFsb3IgZGUgKipBSUMqKiBlL291ICoqQklDKiouIEVzdGEgYWJvcmRhZ2VtIHJlcXVlciBlc3RpbWHDp8OjbyB1c2FuZG8gbyBwcmluY8OtcGlvIGRhIG3DoXhpbWEgdmVyb3NzaW1pbGhhbsOnYS4KCiogKipBa2Fpa2XigJlzIEluZm9ybWF0aW9uIENyaXRlcmlvbiAoQUlDKSoqCgokJApBSUMgPVxmcmFjey0yfXtUfVxsbih2ZXJvc3NpbWlsaGFuw6dhKSArIFxmcmFjezJOfXtUfQokJApvbmRlIGEgZnVuw6dhw7UgZGUgdmVyb3NzaW1pbGhhbsOnYSDDqSBhdmFsaWFkYSBuYSBlc3RpbWF0aXZhIGRlIG3DoXhpbW8sICRUJCDDqSBvIHRhbWFuaG8gZGEgYW1vc3RyYSBlICROJCDDqSBvIG7Dum1lcm8gZGUgcGFyw6JtZXRyb3MgZXN0aW1hZG9zIHBlbG8gbW9kZWxvIChuZXN0ZSBjYXNvLCAkcCtxKzEkIG9uZGUgJDEkIHJlcHJlc2VudGEgbyBpbnRlcmNlcHRvIGUgJHAkIGUgJHEkIG9zIHBhcsOibWV0cm9zIGRhIHBhcnRlIGF1dG9ycmVncmVzc2l2YSBlIGRlIG3DqWRpYXMgbcOzdmVpcywgcmVzcGVjdGl2YW1lbnRlKS4KCk8gcHJpbWVpcm8gdGVybW8gZGEgZXF1YcOnw6NvIG1lZGUgYSBxdWFsaWRhZGUgZG8gYWp1c3RlIGRvIG1vZGVsbyBhb3MgZGFkb3MsIGVucXVhbnRvIG8gc2VndW5kbyB0ZXJtbyDDqSBjaGFtYWRvIGRlICoqZnVuw6fDo28gZGUgcGVuYWxpemHDp8OjbyoqIGRhZG8gcXVlIHBlbmFsaXphIG1vZGVsb3MgY29tIG11aXRvcyBwYXLDom1ldHJvcy4gUXVlcmVtb3MgZW50cmUgdG9kYXMgYXMgY29tYmluYcOnw7VlcyBkZSBtb2RlbG9zIGEgcXVlIGFwcmVzZW50YSBtZW5vciBBSUMuCgpQYXJhIHVtIG1lc21vIHRhbWFuaG8gZGUgYW1vc3RyYSAoJFQkKSBlIHZlcm9zc2ltaWxoYW7Dp2EgZSBkaXZlcnNvcyB2YWxvcmVzIHBhcmEgYSBxdWFudGlkYWRlIGRlIHBhcsOibWV0cm9zIGVzdGltYWRvcyAoJE4kKSwgcG9kZW1vcyBvYnNlcnZhciBubyBncsOhZmljbyBhYmFpeG8gcXVlIG5hIG1lZGlkYSBxdWUgb3MgcGFyw6JtZXRyb3MgYXVtZW50YW0gbyBBSUMgYXVtZW50YS4gSXN0byB0b3JuYSBtZW5vciBhIHByb2JhYmlsaWRhZGUgZGUgZXNjb2xoZXIgZGVudHJlIG1vZGVsb3MgY29tIG1lc21hIHZlcm9zc2ltaWxoYW7Dp2EgYXF1ZWxlcyBxdWUgdGVtIG1haW9yIHF1YW50aWRhZGUgZGUgcGFyw6JtZXRyb3MuIAoKYGBge3IsIGVjaG89RkFMU0UsIHRpZHk9VFJVRSwgcmVzdWx0cz0nYXNpcycsIHdhcm5pbmcgPSBGQUxTRSwgZmlnLmhlaWdodD03fQp2ZXJvc3NpbWlsaGFuY2EgPC0gMTQwMAp0IDwtIDEwMDAKbiA8LSBzZXEoZnJvbSA9IDEsIHRvID0gMjAsIGJ5ID0gMSkKYWljIDwtIHJlcCgwLGxlbmd0aChuKSkKZm9yIChpIGluIDE6bGVuZ3RoKGFpYykpIHsKICBhaWNbaV0gPC0gKC0yL3QgKSpsb2codmVyb3NzaW1pbGhhbmNhKSsoMipuW2ldKS90ICAKfQpwbG90KHggPSBuLCB5ID0gYWljLCB0eXBlID0gImwiLCBtYWluID0gIlZlcm9zc2ltaWxoYW5jYT0xNDAwIGUgVD0xMDAwIikKYGBgCgpBZ29yYSwgb2JzZXJ2ZSBvIHBhcGVsIGRhIHZlcm9zc2ltaWxoYW7Dp2Egbm8gQUlDLiBQYXJhIG1vZGVsb3MgY29tIGEgbWVzbWEgcXVhbnRpZGFkZSBkZSBwYXLDom1ldHJvcyBlIHRhbWFuaG8gZGUgYW1vc3RyYSwgbmEgbWVkaWRhIHF1ZSBhIHZlcm9zc2ltaWxoYW7Dp2EgYXVtZW50YSwgbWVub3IgbyB2YWxvciBkbyBBSUMuIElzdG8gYXVtZW50YSBhIHByb2JhYmlsZGlhZGUgZGUgZXNjb2xoZXIgZGVudHJlIG1vZGVsb3MgY29tIG1lc21hIHF1YW50aWRhZGUgZGUgcGFyw6JtZXRyb3MgZSB0YW1hbmhvIGRlIGFtb3N0cmEsIG8gbW9kZWxvIGNvbSBtYWlvciB2ZXJvc3NpbWlsaGFuw6dhLiAKCmBgYHtyLCBlY2hvPUZBTFNFLCB0aWR5PVRSVUUsIHJlc3VsdHM9J2FzaXMnLCB3YXJuaW5nID0gRkFMU0UsIGZpZy5oZWlnaHQ9N30KdmVyb3NzaW1pbGhhbmNhIDwtIHNlcShmcm9tID0gMTAwLCB0byA9IDE1MDAsIGJ5ID0gMTAwKQp0IDwtIDEwMDAKbiA8LSAzCmFpYyA8LSByZXAoMCxsZW5ndGgodmVyb3NzaW1pbGhhbmNhKSkKZm9yIChpIGluIDE6bGVuZ3RoKGFpYykpIHsKICBhaWNbaV0gPC0gKC0yL3QgKSpsb2codmVyb3NzaW1pbGhhbmNhW2ldKSsoMipuKS90ICAKfQpwbG90KHggPSB2ZXJvc3NpbWlsaGFuY2EsIHkgPSBhaWMsIHR5cGUgPSAibCIsIG1haW4gPSAiTj0yIGUgVD0xMDAwIikKYGBgCgoqICoqQmF5ZXNpYW4gSW5mb3JtYXRpb24gQ3JpdGVyaW9uIChCSUMpKioKCkFrYWlrZSAoMTk3NyksIFJpc3NhbmVtICgxOTc4KSBlIFNjaHdhcnogKDE5NzgpIHN1Z2VyZW0gbWluaW1pemFyIG8gY3JpdMOpcmlvIGRlIGluZm9ybWHDp8OjbyBiYXllc2lhbm8sIGRhZG8gcG9yOgoKJCQKQklDID0tMlxsbih2ZXJvc3NpbWlsaGFuw6dhKSArIFxmcmFje05cbG4gVH17VH0gCiQkCm9uZGUgYSBmdW7Dp8OjbyBkZSB2ZXJvc3NpbWlsaGFuw6dhIMOpIGF2YWxpYSBuYSBlc3RpbWF0aXZhIGRlIG3DoXhpbW8sICRUJCDDqSBvIHRhbWFuaG8gZGEgYW1vc3RyYSBlICROJCDDqSBvIG7Dum1lcm8gZGUgcGFyw6JtZXRyb3MgZXN0aW1hZG9zIHBlbG8gbW9kZWxvIChuZXN0ZSBjYXNvLCAkcCtxKzEkIG9uZGUgJDEkIHJlcHJlc2VudGEgbyBpbnRlcmNlcHRvIGUgJHAkIGUgJHEkIG9zIHBhcsOibWV0cm9zIGRhIHBhcnRlIGF1dG9ycmVncmVzc2l2YSBlIGRlIG3DqWRpYXMgbcOzdmVpcywgcmVzcGVjdGl2YW1lbnRlKS4gQSBtZXNtYSBhbsOhbGlzZSBzb2JyZSBvIHBhcGVsIGRlIGNhZGEgdGVybW8gbmEgZXF1YcOnw6NvIGRvIGNyaXTDqXJpbyBiZW0gY29tbyBhIHBlbmFsaXphw6fDo28gcmVhbGl6YWRhIHBhcmEgbyBBSUMgcGVybWFuY2UgcGFyYSBvIEJJQywgbXVkYW5kbyBhcGVuYXMgYSBmb3JtYSBjb21vIGNhZGEgdGVybW8gbmEgZXF1YcOnw6NvIMOpIG9idGlkby4KClVtIHBvbnRvIGRlIGF0ZW7Dp8OjbyDDqSBxdWUgY29uZm9ybWUgQGVtaWxpYW5vMjAxMGNyaXRlcmlvcyBvIEJJQyBwb3NzdWkgbWVsaG9yIHBlcmZvcm1hbmNlIGVtIGFtb3N0cmFzIG1haW9yZXMgZSBzZWd1bmRvIEB6b3UyMDA3ZGVncmVlcyB0ZW0gbWFpb3IgY2FwYWNpZGFkZSBkZSBlc2NvbGhlciBtb2RlbG9zIG1haXMgc2ltcGxlcy4gICAKCioqTsOjbyB2YW1vcyBleGVtcGxpZmljYXIgYXF1aSBjb21vIGRlZmluaXIgYSBkZWZhc2FnZW0gZGUgdW0gbW9kZWxvIEFSTUEocCxxKSBuYSBwcsOhdGljYSwgZW0gZnVuw6fDo28gZGUgc2VyIHByaW9yaXTDoXJpbyAgYXByZW5kZXIgY29tbyBlc3RpbWFyIHRhaXMgbW9kZWxvcyAob3MgY3JpdMOpcmlvcyBkZSBpbmZvcm1hw6fDo28gbmVjZXNzaXRhbSBkbyB2YWxvciBkYSB2ZXJvc3NpbWlsaGFuw6dhIHF1ZSDDqSBvYnRpZGEgYSBwYXJ0aXIgZGEgZXN0aW1hw6fDo28pKioKCiMjIyMjICoqUkVGRVLDik5DSUFTKio=