Este material tem como objetivo contribuir para o entendimento sobre modelos de médias móveis (MA), principalmente sobre como avaliar a estacionariedade destes modelos e como fazer uso da função de autocorrelação (FAC) para identificar na prática a ordem de um modelo MA.
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 de médias móveis (MA) é caracterizada por uma formulação para \(f\left(\right)\) onde apenas o termo de erro, \(a_{t}\), e suas defasagens são capazes de modelar o retorno em \(t\). Tais modelos por natureza sempre apresentam estacionariedade fraca, pois eles são uma combinação linear de ruídos brancos (\(a_{t}\) tem média zero, variância constante e não-autocorrelacionado).
De forma geral, podemos escrever um modelo de médias móveis da seguinte forma:
\[
r_{t} = \mu + a_{t} + {\theta}_{1}a_{t-1} + {\theta}_{2}a_{t-2} + ... + {\theta}_{q}a_{t-q}
\]
Esta formulação é conhecida como MA(q) dado que \(q\) defasagens do termo de erro foram usadas para especificar a forma funcional linear a ser estimada. Uma vez que \(r_{t}\) depende do erro contemporâneo e suas defasagens, então o processo é chamado de médias móveis. No decorrer deste documento, vamos entender as propriedades destes modelos e como fazer uso das funções de autocorrelação e autocorrelação parcial para identificar sua ordem.
MA(1)
Suponha que temos o seguinte modelo de médias móveis de primeira ordem, MA(1).
\[
r_{t} = \mu+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 \(MA(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:
\[
E[r_{t}] = \mu + E[a_{t}] + {\theta}_{1}E[a_{t-1}] = \mu
\]
O resultado mostra que o valor esperado do modelo de médias móveis de primeira ordem, MA(1), sempre será constante e independente do tempo assim como proposto pela hipótese de estacionariedade fraca.
- VARIÂNCIA INCONDICIONAL CONSTANTE
Reescrevendo o modelo como \(r_{t}-\mu = a_{t} + {\theta}_{1}a_{t-1}\) e fazendo uso da hipótese de que \(Var(a_{t})=\sigma_{a}^{2}=E[a_{t}^{2}]\), temos:
\[
\begin{split}
Var(r_{t}) &= E[\left(r_{t}-\mu\right)\left(r_{t}-\mu\right)] \\
& \\
& = E[\left(r_{t}-\mu\right)^2] \\
& \\
& = E[\left(a_{t} + \theta_{1}a_{t-1}\right)^2] \\
& \\
& = E[a_{t}^2 +2\theta_1 a_{t}a_{t-1} + \theta_{1}^{2}a_{t-1}^{2}] \\
& \\
& = \sigma_{a}^{2} + 0 + \theta_{1}^{2}\sigma_{a}^{2} \\
& \\
\gamma_{0} & = (1+\theta_{1}^{2})\sigma_{a}^{2}
\end{split}
\]
Assim, temos que a variância incondicional do processo de médias móveis de primeira ordem, MA(1), é finita.
- AUTOCOVARIÂNCIA E AUTOCORRELAÇÃO DEPENDENTES APENAS DE \(l\)
Fazendo \(E[(r_{t}-\mu)(r_{t-1}-\mu)]\), ou seja, a autocovariância de primeira ordem para o MA(1), usando a forma funcional do modelo e \(E[a_{t}a_{t-l}]=0\) para \(l \neq 0\), temos:
\[
\begin{split}
E[(r_{t}-\mu)(r_{t-1}-\mu)] & = E[(a_{t}+\theta_{1}a_{t-1})(a_{t-1}+\theta_{1}a_{t-2})] \\
& \\
& = E[a_{t}a_{t-1}+\theta_{1}a_{t}a_{t-2}+\theta_{1}a_{t-1}^2+\theta_{1}^{2}a_{t-1}a_{t-2}] \\
& \\
& = 0+0+\theta_{1}E[a_{t-1}^2]+0 \\
& \\
\gamma_{1} & = \theta_{1}E[a_{t-1}^{2}] \\
& \\
\gamma_{1} & = \theta_{1}\sigma_{a}^2 \\
\end{split}
\]
onde \(\gamma_{1}\) representa a autocovariância de primeira ordem. Generalizando para uma defasagem \(l>1\), a autocovariância se torna:
\[
\begin{split}
E[(r_{t}-\mu)(r_{t-l}-\mu)] &= E[(a_{t}+\theta_{1}a_{t-1})(a_{t-l}+\theta_{1}a_{t-l-1})] \\
& \\
& = E[a_{t}a_{t-l}+\theta_{1}a_{t}a_{t-l-1}+\theta_{1}a_{t-1}a_{t-l}+\theta_{1}^{2}a_{t-1}a_{t-l-1}] \\
& \\
& = 0
\end{split}
\] o que nos mostra que para qualquer \(l>1\) o processo MA(1) não terá autocovariância, pois como dito anteriormente \(E[a_{t}a_{t-l}]=0\) para \(l \neq 0\).
Sabemos que a divisão da autocovariância pela variância proporcionará a autocorrelação. Como só existe autocorrelação se existir autocovariância em determinada defasagem, não teremos autocorrelação para \(l>1\). Logo, só temos autocorrelação para o MA(1) para \(l=0\) e \(l=1\) que serão:
- para \(l=0\), \({\gamma_{0}}/{\gamma_{0}}=1\)
- para \(l=1\), \({\gamma_{1}}/{\gamma_{0}}=\frac{\theta_{1}\sigma_{a}^{2}}{(1+\theta_{1}^{2})\sigma_{a}^{2}}=\frac{\theta_{1}}{(1+\theta_{1}^{2})}\)
- para \(l>1\), \(\gamma_{l}=0\)
Assim, já temos que para definirmos um modelo MA(1) uma boa alternativa é verificar sua função de autocorrelação e a última defasagem estatísticamente significante será a defasagem do modelo dado que a partir dela a autocorrelação será nula.
- 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 + 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á significância estatística apenas em uma desafagem como mostramos anteriormente ao derivar o modelo.


MA(q)
Suponha agora que temos o seguinte modelo de médias móveis de ordem \(q\), MA(q).
\[
r_{t} = \mu + a_{t} + {\theta}_{1}a_{t-1} + {\theta}_{2}a_{t-2} + ... + {\theta}_{q}a_{t-q}
\]
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 indepente e identicamente distribuído (iid).
Anteriormente, assumimos a hipótese de estacionariedade fraca para modelar uma série temporal. Assim, para estimar um modelo \(MA(q)\) 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}]=...=E[r_{t-q}]=\mu\) e \(E[a_{t}]=E[a_{t-1}]=...=E[a_{t-q}]=0\), temos:
\[
E[r_{t}] = \mu + E[a_{t}] + {\theta}_{1}E[a_{t-1}] + ... + {\theta}_{q}E[a_{t-q}] = \mu
\]
O resultado mostra que o valor esperado do modelo de médias móveis de ordem \(q\), MA(q), sempre será constante e independente do tempo assim como proposto pela hipótese de estacionariedade fraca.
- VARIÂNCIA INCONDICIONAL CONSTANTE
Reescrevendo o modelo como \(r_{t}-\mu = a_{t} + {\theta}_{1}a_{t-1} + ...+ {\theta}_{q}a_{t-q}\), fazendo uso da hipótese de que \(Var(a_{t})=\sigma_{a}^{2}=E[a_{t}^{2}]\) e que \(a_{t}\) é independentemente e identicamente distribuído, temos:
\[
\begin{split}
Var(r_{t}) &= E[\left(r_{t}-\mu\right)\left(r_{t}-\mu\right)] \\
& \\
& = E[\left(r_{t}-\mu\right)^2] \\
& \\
& = E\left[\left(a_{t} + \theta_{1}a_{t-1}+ ...+ {\theta}_{q}a_{t-q}\right)^2\right] \\
& \\
& = Var(a_{t})+\theta_{1}^2Var(a_{t-1}) + ... + \theta_{q}^{2}Var(a_{t-q}) \\
& \\
& = \sigma_{a}^{2} + \theta_{1}^{2}\sigma_{a}^{2} + ... +\theta_{q}^{2}\sigma_{a}^{2} \\
& \\
\gamma_{0} & = (1+\theta_{1}^{2}+...+\theta_{q}^{2})\sigma_{a}^{2}
\end{split}
\]
Assim, temos que a variância incondicional do processo de médias móveis de ordem \(q\), MA(q), é finita.
- AUTOCOVARIÂNCIA E AUTOCORRELAÇÃO DEPENDENTES APENAS DE \(l\)
Fazendo \(E[(r_{t}-\mu)(r_{t-1}-\mu)]\), ou seja, a autocovariância de primeira ordem para o MA(q), usando a forma funcional do modelo e \(E[a_{t}a_{t-l}]=0\) para \(l \neq 0\), temos:
\[
\begin{split}
E[(r_{t}-\mu)(r_{t-1}-\mu)] & = E[(a_{t}+\theta_{1}a_{t-1}+...+\theta_{q}a_{t-q})(a_{t-1}+\theta_{1}a_{t-2}+...+\theta_{q}a_{t-q-1})] \\
& \\
& = E[(a_{t}+\theta_{1}a_{t-1}+\theta_{2}a_{t-2}+\theta_{3}a_{t-3}+...)(a_{t-1}+\theta_{1}a_{t-2}+\theta_{2}a_{t-3}+...)] \\
& \\
& = E[a_{t}a_{t-1}+\theta_{1}a_{t}a_{t-2}+\theta_{2}a_{t}a_{t-3}+\theta_{1}a_{t-1}^{2}+\theta_{1}^{2}a_{t-1}a_{t-2}+\theta_{1}\theta_{2}a_{t-3}+\theta_{2}a_{t-2}a_{t-1}+\theta_{2}\theta_{1}a_{t-2}^{2}+\theta_{2}^{2}a_{t-2}a_{t-3}+ \\
& + \theta_{3}a_{t-3}a_{t-1}+\theta_{3}\theta_{1}a_{t-3}a_{t-2}+\theta_{3}\theta_{2}a_{t-3}^2] \\
& \\
\gamma_{1} & = E[\theta_{1}a_{t-1}^{2}+\theta_{2}\theta_{1}a_{t-2}^{2}+\theta_{3}\theta_{2}a_{t-3}^2+...] \\
& \\
& = \theta_{1}\sigma_{a}^{2}+\theta_{2}\theta_{1}\sigma_{a}^{2}+\theta_{3}\theta_{2}\sigma_{a}^{2}+... \\
& \\
\end{split}
\]
que pode ser escrita usando \(\gamma\) para definir a função de autocovariância do modelo MA(q) da seguinte forma:
\[
\gamma_{l} = [\theta_{l}+\theta_{l+1}\theta_{1}+\theta_{l+2}\theta_{2}+...+\theta_{q}\theta_{q-j}]\sigma_{a}^{2}
\] para \(l=1,2,3...,q\) e é igual a zero para \(l>q\).
EXEMPLO: Vamos avaliar a generalização da autocovariância proposta para um MA(2), ou seja, \(l=2\). Assim, temos:
- para \(l=0\), \(\gamma_{0}=(1+\theta_{1}^{2}+\theta_{2}^{2})\sigma_{a}^{2}\)
- para \(l=1\), \(\gamma_{1}=(\theta_{1}+\theta_{1}\theta_{2})\sigma_{a}^{2}\)
- para \(l=2\), \(\gamma_{2}=\theta_{2}\sigma_{a}^{2}\)
- para \(l>2\), \(\gamma_{l}=0\)
Consequentemente, teremos autocorrelação apenas até \(l=2\) para um MA(2). Desta forma, podemos concluir que avaliar a função de autocorrelação é uma boa alternativa para definir a defasagem de um processo de médias móveis. Essa conclusão é diferente do que encontramos para os modelos autorregressivos (AR) onde a função de autocorrelação parcial assume o papel de definir a defasagem do processo.
EXEMPLOS DE PROCESSOS DE MÉDIAS MÓVEIS (MA)
Suponha que temos o seguinte modelo de médias móveis de segunda ordem, MA(2).
\[
r_{t} = \mu + a_{t} + {\theta}_{1}a_{t-1} + {\theta}_{2}a_{t-2}
\]
onde \(a_{t}\) é um ruído branco com média \(0\), variância \(\sigma_{a}^{2}\), \(E\left[a_t-E(a)\right]\left[a_{t-l}-E(a)\right]=E[a_{t}a_{t-l}]=0\) e indepente e identicamente distribuído (iid). 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 + a_{t} + 0.3a_{t-1} + 0.5a_{t-2}
\] A imagem abaixo mostra o gráfico da série temporal resultante do modelo. É possível observar que há aparente 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á significância estatística apenas em duas desafagem como derivamos anteriormente. Isso confirma que a função de autocorrelação é uma boa alternativa para definir a defasagem de um processo MA(q).


Suponha agora que temos o seguinte modelo de médias móveis de terceira ordem, MA(3).
\[
r_{t} = \mu + a_{t} + {\theta}_{1}a_{t-1} + {\theta}_{2}a_{t-2} + {\theta}_{3}a_{t-3}
\]
onde \(a_{t}\) é um ruído branco com média \(0\), variância \(\sigma_{a}^{2}\), \(E\left[a_t-E(a)\right]\left[a_{t-l}-E(a)\right]=E[a_{t}a_{t-l}]=0\) e indepente e identicamente distribuído (iid). 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 + a_{t} + 0.3a_{t-1} + 0.5a_{t-2} - 0.4a_{t-3}
\]
A imagem abaixo mostra o gráfico da série temporal resultante do modelo. É possível observar que há aparente 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á significância estatística apenas em três desafagem como derivamos anteriormente. Isso confirma que a função de autocorrelação é uma boa alternativa para definir a defasagem de um processo MA(q).


IDENTIFICANDO MODELOS MA NA PRÁTICA
Como mostramos nos modelos MA simulados anteriormente, a função de autocorrelação (FAC) é útil para identificar a ordem do modelo de médias móveis (MA) puro. Para uma série temporal \(r_{t}\) com função de autocorrelação \(\rho_{l}\), se \(\rho_{q} \neq 0\), mas \(\rho_{l}=0\) para \(l>q\), então \(r_{t}\) segue um modelo de médias móveis de ordem q, MA(q).
REFERÊNCIAS
Campbell, John Y, Andrew Wen-Chuan Lo, and Archie Craig MacKinlay. 1997. The Econometrics of Financial Markets. Princeton (NJ) Princeton University Press.
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.
LS0tCnRpdGxlOiA8Y2VudGVyPiA8aDI+IDxiPiBNb2RlbG9zIGRlIE3DqWRpYXMgTcOzdmVpcyAoTUEpIDwvYj4gPC9oMj4gPC9jZW50ZXI+IAphdXRob3I6IDxjZW50ZXI+IEZyYW5rIE1hZ2FsaMOjZXMgZGUgUGluaG8gLSBJQk1FQy9NRyA8L2NlbnRlcj4KZ3JhcGhpY3M6IHllcwpsaW5rY29sb3I6IGJsdWUKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgdGhlbWU6IGNlcnVsZWFuCiAgICBmaWdfY2FwdGlvbjogeWVzCnJlZmVyZW5jZXM6Ci0gaWQ6IHRzYXkyMDE0aW50cm9kdWN0aW9uCiAgdGl0bGU6IEFuIGludHJvZHVjdGlvbiB0byBhbmFseXNpcyBvZiBmaW5hbmNpYWwgZGF0YSB3aXRoIFIKICBhdXRob3I6CiAgLSBmYW1pbHk6IFRzYXkKICAgIGdpdmVuOiBSdWV5IFMKICBwdWJsaXNoZXI6IEpvaG4gV2lsZXkgXCYgU29ucwogIHR5cGU6IGJvb2sKICBpc3N1ZWQ6CiAgICB5ZWFyOiAyMDE0Ci0gaWQ6IGNhbXBiZWxsMTk5N2Vjb25vbWV0cmljcwogIHRpdGxlOiBUaGUgZWNvbm9tZXRyaWNzIG9mIGZpbmFuY2lhbCBtYXJrZXRzCiAgYXV0aG9yOgogIC0gZmFtaWx5OiBDYW1wYmVsbAogICAgZ2l2ZW46IEpvaG4gWQogIC0gZmFtaWx5OiBMbwogICAgZ2l2ZW46IEFuZHJldyBXZW4tQ2h1YW4KICAtIGZhbWlseTogTWFjS2lubGF5CiAgICBnaXZlbjogQXJjaGllIENyYWlnCiAgcHVibGlzaGVyOiBQcmluY2V0b24gKE5KKSBQcmluY2V0b24gVW5pdmVyc2l0eSBQcmVzcwogIHR5cGU6IGJvb2sKICBpc3N1ZWQ6CiAgICB5ZWFyOiAxOTk3Ci0gaWQ6IG1vcmV0dGluMjAwOGVjb25vbWV0cmlhCiAgdGl0bGU6IEVjb25vbWV0cmlhIGZpbmFuY2VpcmEgdW0gY3Vyc28gZW0gc8OpcmllcyB0ZW1wb3JhaXMgZmluYW5jZWlyYXMKICBhdXRob3I6CiAgLSBmYW1pbHk6IE1vcmV0dGluCiAgICBnaXZlbjogUGVkcm8gQWxiZXJ0bwogIHB1Ymxpc2hlcjogRWRnYXJkIEJsdWNoZXIKICB0eXBlOiBib29rCiAgaXNzdWVkOgogICAgeWVhcjogMjAwOAotIGlkOiB0c2F5MjAxMGFuYWx5c2lzCiAgdGl0bGU6IEFuYWx5c2lzIG9mIGZpbmFuY2lhbCB0aW1lIHNlcmllcwogIGF1dGhvcjoKICAtIGZhbWlseTogVHNheQogICAgZ2l2ZW46IFJ1ZXkgUwogIHB1Ymxpc2hlcjogSm9obiBXaWxleSBcJiBTb25zCiAgdHlwZTogYm9vawogIGlzc3VlZDoKICAgIHllYXI6IDIwMTAKbm9jaXRlOiB8IAogIEB0c2F5MjAxNGludHJvZHVjdGlvbiwgQGNhbXBiZWxsMTk5N2Vjb25vbWV0cmljcywgQG1vcmV0dGluMjAwOGVjb25vbWV0cmlhLCBAdHNheTIwMTBhbmFseXNpcwotLS0KCkVzdGUgbWF0ZXJpYWwgdGVtIGNvbW8gb2JqZXRpdm8gY29udHJpYnVpciBwYXJhIG8gZW50ZW5kaW1lbnRvIHNvYnJlICoqbW9kZWxvcyBkZSBtw6lkaWFzIG3Ds3ZlaXMgKE1BKSoqLCBwcmluY2lwYWxtZW50ZSBzb2JyZSBjb21vIGF2YWxpYXIgYSBlc3RhY2lvbmFyaWVkYWRlIGRlc3RlcyBtb2RlbG9zIGUgY29tbyBmYXplciB1c28gZGEgKipmdW7Dp8OjbyBkZSBhdXRvY29ycmVsYcOnw6NvIChGQUMpKiogcGFyYSBpZGVudGlmaWNhciBuYSBwcsOhdGljYSBhIG9yZGVtIGRlIHVtIG1vZGVsbyBNQS4KCmBgYHtyLCBlY2hvPUZBTFNFfQojIFBhY290ZXMgbmVjZXNzYXJpb3MKc3VwcHJlc3NNZXNzYWdlcyhyZXF1aXJlKHpvbykpCnN1cHByZXNzTWVzc2FnZXMocmVxdWlyZShxdWFudG1vZCkpCnN1cHByZXNzTWVzc2FnZXMocmVxdWlyZShEVCkpCnN1cHByZXNzTWVzc2FnZXMocmVxdWlyZShkcGx5cikpCnN1cHByZXNzTWVzc2FnZXMocmVxdWlyZShtYWdyaXR0cikpCnN1cHByZXNzTWVzc2FnZXMocmVxdWlyZShoaWdoY2hhcnRlcikpCnN1cHByZXNzTWVzc2FnZXMocmVxdWlyZShQZXJmb3JtYW5jZUFuYWx5dGljcykpIApzdXBwcmVzc01lc3NhZ2VzKHJlcXVpcmUoaHRtbHRvb2xzKSkKYGBgCgojIyMjIyAqKklOVFJPRFXDh8ODTyoqCgpOb3MgbW9kZWxvcyBkZSBzw6lyaWVzIHRlbXBvcmFpcyB1bml2YXJpYWRhcyBhIG1vZGVsYWdlbSBlY29ub23DqXRyaWNhIHRlbSBjb21vIG9iamV0aXZvICoqY2FwdHVyYXIgYSByZWxhw6fDo28gZW50cmUgJHJfe3R9JCBlIGluZm9ybWHDp8O1ZXMgZGlzcG9uw612ZWlzIGFudGVzIGRlICR0JC4qKiBBc3NpbSwgYSBleHByZXNzw6NvIGdlcmFsIGRhIHPDqXJpZSB0ZW1wb3JhbCBkb3MgcmV0b3Jub3MsICR7XGxlZnRce3tyfV97dH1ccmlnaHRcfX1fe3Q9MX1ee1R9JCwgcG9kZSBzZXIgZGVmaW5pZGEgY29tbzoKCiQkCntyfV97dH09ZlxsZWZ0KHtyfV97dC0xfSx7cn1fe3QtMn0sLi4uLHthfV97dH0gXHJpZ2h0KQokJAoKQSBmdW7Dp8OjbyBhY2ltYSBub3MgZGl6IHF1ZSB2YWxvcmVzIHBhc3NhZG9zIGRvcyByZXRvcm5vcyAoJHtyfV97dC0xfSx7cn1fe3QtMn0sLi4uLCQpIGp1bnRhbWVudGUgY29tIHVtIHRlcm1vIGRlIGVycm8gKCRhX3t0fSQpIHPDo28gw7p0ZWlzIHBhcmEgbW9kZWxhciBvIHJldG9ybm8gZW0gJHQkLiBQYXJhIHF1ZSBhIGVxdWHDp8OjbyBzZWphIG9wZXJhY2lvbmFsIHByZWNpc2Ftb3MgZGVmaW5pcjoKCiogQSBmb3JtYSBmdW5jaW9uYWwgZGUgJGZcbGVmdChccmlnaHQpJAoqIE8gbsO6bWVybyBkZSBkZWZhc2FnZW5zIGRvIHJldG9ybm8KKiBVbWEgZXN0cnV0dXJhIHBhcmEgbyB0ZXJtbyBkZSBlcnJvICR7YX1fe3R9JAoKRGlmZXJlbnRlbWVudGUgZG9zIG1vZGVsb3MgZGUgcmVncmVzc8OjbyBsaW5lYXIgbcO6bHRpcGxhLCBvbmRlIGZhemVtb3MgdXNvIGRhIHRlb3JpYSBlY29uw7RtaWNhIHBhcmEgZGVmaW5pciBhIGZvcm1hIGZ1bmNpb25hbCBkZSAkZlxsZWZ0KFxyaWdodCkkLCBlbSBzw6lyaWVzIHRlbXBvcmFpcyB1bml2YXJpYWRhcyBhcyBmdW7Dp8O1ZXMgZGUgYXV0b2NvcnJlbGHDp8OjbyBlIGF1dG9jb3JyZWxhw6fDo28gcGFyY2lhbCBkZWZpbmlyw6NvIG9zIHRyw6pzIHBvbnRvcyBsaXN0YWRvcyBhY2ltYS4gCgpBIGNsYXNzZSBkZSAqKm1vZGVsb3MgZGUgbcOpZGlhcyBtw7N2ZWlzIChNQSkqKiDDqSBjYXJhY3Rlcml6YWRhIHBvciB1bWEgZm9ybXVsYcOnw6NvIHBhcmEgJGZcbGVmdChccmlnaHQpJCBvbmRlIGFwZW5hcyBvIHRlcm1vIGRlIGVycm8sICRhX3t0fSQsIGUgc3VhcyBkZWZhc2FnZW5zIHPDo28gY2FwYXplcyBkZSBtb2RlbGFyIG8gcmV0b3JubyBlbSAkdCQuIFRhaXMgbW9kZWxvcyBwb3IgbmF0dXJlemEgc2VtcHJlIGFwcmVzZW50YW0gZXN0YWNpb25hcmllZGFkZSBmcmFjYSwgcG9pcyBlbGVzIHPDo28gdW1hIGNvbWJpbmHDp8OjbyBsaW5lYXIgZGUgcnXDrWRvcyBicmFuY29zICgkYV97dH0kIHRlbSBtw6lkaWEgemVybywgdmFyacOibmNpYSBjb25zdGFudGUgZSBuw6NvLWF1dG9jb3JyZWxhY2lvbmFkbykuCgpEZSBmb3JtYSBnZXJhbCwgcG9kZW1vcyBlc2NyZXZlciB1bSAqKm1vZGVsbyBkZSBtw6lkaWFzIG3Ds3ZlaXMqKiBkYSBzZWd1aW50ZSBmb3JtYToKCiQkCnJfe3R9ID0gXG11ICsgYV97dH0gKyB7XHRoZXRhfV97MX1hX3t0LTF9ICsge1x0aGV0YX1fezJ9YV97dC0yfSArIC4uLiArIHtcdGhldGF9X3txfWFfe3QtcX0KJCQKCkVzdGEgZm9ybXVsYcOnw6NvIMOpIGNvbmhlY2lkYSBjb21vICoqTUEocSkqKiBkYWRvIHF1ZSAkcSQgZGVmYXNhZ2VucyBkbyB0ZXJtbyBkZSBlcnJvIGZvcmFtIHVzYWRhcyBwYXJhIGVzcGVjaWZpY2FyIGEgZm9ybWEgZnVuY2lvbmFsICoqbGluZWFyKiogYSBzZXIgZXN0aW1hZGEuIFVtYSB2ZXogcXVlICRyX3t0fSQgZGVwZW5kZSBkbyBlcnJvIGNvbnRlbXBvcsOibmVvIGUgc3VhcyBkZWZhc2FnZW5zLCBlbnTDo28gbyBwcm9jZXNzbyDDqSBjaGFtYWRvIGRlIG3DqWRpYXMgbcOzdmVpcy4gTm8gZGVjb3JyZXIgZGVzdGUgZG9jdW1lbnRvLCB2YW1vcyBlbnRlbmRlciBhcyBwcm9wcmllZGFkZXMgZGVzdGVzIG1vZGVsb3MgZSBjb21vIGZhemVyIHVzbyBkYXMgZnVuw6fDtWVzIGRlIGF1dG9jb3JyZWxhw6fDo28gZSBhdXRvY29ycmVsYcOnw6NvIHBhcmNpYWwgcGFyYSBpZGVudGlmaWNhciBzdWEgb3JkZW0uCgojIyMjIyAqKk1BKDEpKioKClN1cG9uaGEgcXVlIHRlbW9zIG8gc2VndWludGUgbW9kZWxvIGRlIG3DqWRpYXMgbcOzdmVpcyBkZSBwcmltZWlyYSBvcmRlbSwgTUEoMSkuCgokJApyX3t0fSA9IFxtdSthX3t0fSt7XHRoZXRhfV97MX1hX3t0LTF9CiQkCgpvbmRlICRhX3t0fSQgw6kgdW0gcnXDrWRvIGJyYW5jbyBjb20gbcOpZGlhICQwJCwgdmFyacOibmNpYSAkXHNpZ21hX3thfV57Mn0kLCAkRVxsZWZ0WyBcbGVmdChhX3QtXGJhcnthfVxyaWdodClcbGVmdChhX3t0LWx9LVxiYXJ7YX1ccmlnaHQpXHJpZ2h0XT1FW2Ffe3R9YV97dC1sfV09MCQgZSBpbmRlcGVuZGVudGUgZSBpZGVudGljYW1lbnRlIGRpc3RyaWJ1w61kbyAoaWlkKS4gCgpBbnRlcmlvcm1lbnRlLCBhc3N1bWltb3MgYSBoaXDDs3Rlc2UgZGUgZXN0YWNpb25hcmllZGFkZSBmcmFjYSBwYXJhIG1vZGVsYXIgdW1hIHPDqXJpZSB0ZW1wb3JhbC4gQXNzaW0sIHBhcmEgZXN0aW1hciB1bSBtb2RlbG8gJE1BKDEpJCB0ZW1vcyBxdWUgZ2FyYW50aXIgcXVlIGFzIGhpcMOzdGVzZXMgc8OjbyBtYW50aWRhcy4gRWxhcyBzw6NvOiAkRVtyX3t0fV09XG11JCwgJFZhcihyX3t0fSkgPSBcZ2FtbWFfezB9JCBlICRDb3Yocl97dH0scl97dC1sfSk9XGdhbW1hX3tsfSQgb25kZSAkXG11JCBlICRcZ2FtbWFfezB9JCBzw6NvIGNvbnN0YW50ZXMgZSAkXGdhbW1hX3tsfSQgw6kgZnVuw6fDo28gZGUgdW1hIGRlZmFzYWdlbSAkbCQgcXVhbHF1ZXIsIG1hcyBuw6NvIGRvIHRlbXBvICR0JC4KCiogKipNw4lESUEgSU5DT05ESUNJT05BTCBDT05TVEFOVEUqKgoKRmF6ZW5kbyB1c28gZGEgaGlww7N0ZXNlcyAkRVtyX3t0fV09RVtyX3t0LTF9XT1cbXUkIGUgJEVbYV97dH1dPUVbYV97dC0xfV09MCQsIHRlbW9zOgoKJCQKRVtyX3t0fV0gPSBcbXUgKyBFW2Ffe3R9XSArIHtcdGhldGF9X3sxfUVbYV97dC0xfV0gPSBcbXUKJCQKCk8gcmVzdWx0YWRvIG1vc3RyYSBxdWUgbyB2YWxvciBlc3BlcmFkbyBkbyBtb2RlbG8gZGUgbcOpZGlhcyBtw7N2ZWlzIGRlIHByaW1laXJhIG9yZGVtLCAqKk1BKDEpKiosIHNlbXByZSBzZXLDoSBjb25zdGFudGUgZSBpbmRlcGVuZGVudGUgZG8gdGVtcG8gYXNzaW0gY29tbyBwcm9wb3N0byBwZWxhIGhpcMOzdGVzZSBkZSBlc3RhY2lvbmFyaWVkYWRlIGZyYWNhLiAKCiogKipWQVJJw4JOQ0lBIElOQ09ORElDSU9OQUwgQ09OU1RBTlRFKioKClJlZXNjcmV2ZW5kbyBvIG1vZGVsbyBjb21vICRyX3t0fS1cbXUgPSBhX3t0fSArIHtcdGhldGF9X3sxfWFfe3QtMX0kIGUgZmF6ZW5kbyB1c28gZGEgaGlww7N0ZXNlIGRlIHF1ZSAkVmFyKGFfe3R9KT1cc2lnbWFfe2F9XnsyfT1FW2Ffe3R9XnsyfV0kLCB0ZW1vczoKCiQkClxiZWdpbntzcGxpdH0KVmFyKHJfe3R9KSAmPSBFW1xsZWZ0KHJfe3R9LVxtdVxyaWdodClcbGVmdChyX3t0fS1cbXVccmlnaHQpXSBcXAomIFxcCiYgPSBFW1xsZWZ0KHJfe3R9LVxtdVxyaWdodCleMl0gXFwKJiBcXAomID0gRVtcbGVmdChhX3t0fSArIFx0aGV0YV97MX1hX3t0LTF9XHJpZ2h0KV4yXSBcXAomIFxcCiYgPSBFW2Ffe3R9XjIgKzJcdGhldGFfMSBhX3t0fWFfe3QtMX0gKyBcdGhldGFfezF9XnsyfWFfe3QtMX1eezJ9XSBcXAomIFxcCiYgPSBcc2lnbWFfe2F9XnsyfSArIDAgKyBcdGhldGFfezF9XnsyfVxzaWdtYV97YX1eezJ9IFxcCiYgXFwKXGdhbW1hX3swfSAmID0gKDErXHRoZXRhX3sxfV57Mn0pXHNpZ21hX3thfV57Mn0KXGVuZHtzcGxpdH0KJCQKCkFzc2ltLCB0ZW1vcyBxdWUgYSB2YXJpw6JuY2lhIGluY29uZGljaW9uYWwgZG8gcHJvY2Vzc28gZGUgbcOpZGlhcyBtw7N2ZWlzIGRlIHByaW1laXJhIG9yZGVtLCAqKk1BKDEpKiosIMOpIGZpbml0YS4KCiogKipBVVRPQ09WQVJJw4JOQ0lBIEUgQVVUT0NPUlJFTEHDh8ODTyBERVBFTkRFTlRFUyBBUEVOQVMgREUgJGwkKioKCkZhemVuZG8gJEVbKHJfe3R9LVxtdSkocl97dC0xfS1cbXUpXSQsIG91IHNlamEsIGEgYXV0b2NvdmFyacOibmNpYSBkZSBwcmltZWlyYSBvcmRlbSBwYXJhIG8gKipNQSgxKSoqLCB1c2FuZG8gYSBmb3JtYSBmdW5jaW9uYWwgZG8gbW9kZWxvIGUgJEVbYV97dH1hX3t0LWx9XT0wJCBwYXJhICRsIFxuZXEgMCQsIHRlbW9zOgoKJCQKXGJlZ2lue3NwbGl0fQpFWyhyX3t0fS1cbXUpKHJfe3QtMX0tXG11KV0gJiA9IEVbKGFfe3R9K1x0aGV0YV97MX1hX3t0LTF9KShhX3t0LTF9K1x0aGV0YV97MX1hX3t0LTJ9KV0gXFwKJiBcXAomID0gRVthX3t0fWFfe3QtMX0rXHRoZXRhX3sxfWFfe3R9YV97dC0yfStcdGhldGFfezF9YV97dC0xfV4yK1x0aGV0YV97MX1eezJ9YV97dC0xfWFfe3QtMn1dIFxcCiYgXFwKJiA9IDArMCtcdGhldGFfezF9RVthX3t0LTF9XjJdKzAgXFwKJiBcXApcZ2FtbWFfezF9ICYgPSBcdGhldGFfezF9RVthX3t0LTF9XnsyfV0gXFwKJiBcXApcZ2FtbWFfezF9ICYgPSBcdGhldGFfezF9XHNpZ21hX3thfV4yIFxcClxlbmR7c3BsaXR9CiQkCgpvbmRlICRcZ2FtbWFfezF9JCByZXByZXNlbnRhIGEgYXV0b2NvdmFyacOibmNpYSBkZSBwcmltZWlyYSBvcmRlbS4gR2VuZXJhbGl6YW5kbyBwYXJhIHVtYSBkZWZhc2FnZW0gJGw+MSQsIGEgYXV0b2NvdmFyacOibmNpYSBzZSB0b3JuYToKCiQkClxiZWdpbntzcGxpdH0KRVsocl97dH0tXG11KShyX3t0LWx9LVxtdSldICY9IEVbKGFfe3R9K1x0aGV0YV97MX1hX3t0LTF9KShhX3t0LWx9K1x0aGV0YV97MX1hX3t0LWwtMX0pXSBcXAomIFxcCiYgPSBFW2Ffe3R9YV97dC1sfStcdGhldGFfezF9YV97dH1hX3t0LWwtMX0rXHRoZXRhX3sxfWFfe3QtMX1hX3t0LWx9K1x0aGV0YV97MX1eezJ9YV97dC0xfWFfe3QtbC0xfV0gXFwKJiBcXAomID0gMApcZW5ke3NwbGl0fQokJApvIHF1ZSBub3MgbW9zdHJhIHF1ZSBwYXJhIHF1YWxxdWVyICRsPjEkIG8gcHJvY2Vzc28gKipNQSgxKSoqIG7Do28gdGVyw6EgKiphdXRvY292YXJpw6JuY2lhKiosIHBvaXMgY29tbyBkaXRvIGFudGVyaW9ybWVudGUgJEVbYV97dH1hX3t0LWx9XT0wJCBwYXJhICRsIFxuZXEgMCQuCgpTYWJlbW9zIHF1ZSBhIGRpdmlzw6NvIGRhIGF1dG9jb3ZhcmnDom5jaWEgcGVsYSB2YXJpw6JuY2lhIHByb3BvcmNpb25hcsOhIGEgKiphdXRvY29ycmVsYcOnw6NvKiouIENvbW8gc8OzIGV4aXN0ZSBhdXRvY29ycmVsYcOnw6NvIHNlIGV4aXN0aXIgYXV0b2NvdmFyacOibmNpYSBlbSBkZXRlcm1pbmFkYSBkZWZhc2FnZW0sIG7Do28gdGVyZW1vcyBhdXRvY29ycmVsYcOnw6NvIHBhcmEgJGw+MSQuIExvZ28sIHPDsyB0ZW1vcyBhdXRvY29ycmVsYcOnw6NvIHBhcmEgbyAqKk1BKDEpKiogcGFyYSAkbD0wJCBlICRsPTEkIHF1ZSBzZXLDo286CgoqIHBhcmEgJGw9MCQsICR7XGdhbW1hX3swfX0ve1xnYW1tYV97MH19PTEkCiogcGFyYSAkbD0xJCwgJHtcZ2FtbWFfezF9fS97XGdhbW1hX3swfX09XGZyYWN7XHRoZXRhX3sxfVxzaWdtYV97YX1eezJ9fXsoMStcdGhldGFfezF9XnsyfSlcc2lnbWFfe2F9XnsyfX09XGZyYWN7XHRoZXRhX3sxfX17KDErXHRoZXRhX3sxfV57Mn0pfSQKKiBwYXJhICRsPjEkLCAkXGdhbW1hX3tsfT0wJAoKQXNzaW0sIGrDoSB0ZW1vcyBxdWUgcGFyYSBkZWZpbmlybW9zIHVtIG1vZGVsbyAqKk1BKDEpKiogdW1hIGJvYSBhbHRlcm5hdGl2YSDDqSB2ZXJpZmljYXIgc3VhICoqZnVuw6fDo28gZGUgYXV0b2NvcnJlbGHDp8OjbyoqIGUgYSDDumx0aW1hIGRlZmFzYWdlbSBlc3RhdMOtc3RpY2FtZW50ZSBzaWduaWZpY2FudGUgc2Vyw6EgYSBkZWZhc2FnZW0gZG8gbW9kZWxvIGRhZG8gcXVlIGEgcGFydGlyIGRlbGEgYSBhdXRvY29ycmVsYcOnw6NvIHNlcsOhIG51bGEuCgoqICoqRlVOw4fDlUVTIERFIEFVVE9DT1JSRUxBw4fDg08gRSBBVVRPQ09SUkVMQcOHw4NPIFBBUkNJQUwqKgoKUG9kZW1vcyB2aXN1YWxpemFyIGFzIHByb3ByaWVkYWRlcyBlc3R1ZGFkYXMgcGFyYSBlc3RlIG1vZGVsbyBhIHBhcnRpciBkZSBzdWFzIGZ1bsOnw7VlcyBkZSBhdXRvY29ycmVsYcOnw6NvIGUgYXV0b2NvcnJlbGHDp8OjbyBwYXJjaWFsLiBQYXJhIHRhbnRvLCB2YW1vcyBzaW11bGFyIHVtIG1vZGVsbyBubyBzZWd1aW50ZSBmb3JtYXRvOiAKCiQkCnJfe3R9ID0gMTAgKyBhX3t0fSArIDAuM2Ffe3QtMX0KJCQKQSBpbWFnZW0gYWJhaXhvIG1vc3RyYSBvIGdyw6FmaWNvIGRhIHPDqXJpZSB0ZW1wb3JhbCByZXN1bHRhbnRlIGRvIG1vZGVsby4gw4kgcG9zc8OtdmVsIG9ic2VydmFyIHF1ZSByZWFsbWVudGUgaMOhIGVzdGFjaW9uYXJpZWRhZGUgZnJhY2EgZGFkbyBxdWUgYSBzw6lyaWUgb3NjaWxhIGVtIHRvcm5vIGRlIHVtYSBtw6lkaWEgKCQxMCQpIGUgY29tIHVtYSB2YXJpw6JuY2lhIGNvbnN0YW50ZS4KCmBgYHtyLCBlY2hvPUZBTFNFLCB0aWR5PVRSVUUsIHJlc3VsdHM9J2FzaXMnLCB3YXJuaW5nID0gRkFMU0V9Cm1hMSA8LSBhcy54dHMoYXJpbWEuc2ltKGxpc3Qob3JkZXIgPSBjKDAsMCwxKSwgbWE9YygwLjMpKSwgbj0xMDAwMCkrMTApCmhjMSA8LSBoaWdoY2hhcnQodHlwZSA9ICJzdG9jayIpICU+JSAKICBoY190aXRsZSh0ZXh0ID0gIk1BKDEpIFNpbXVsYWRvIikgJT4lIAogIGhjX2FkZF9zZXJpZXMobWExLCBpZCA9ICJ0cyIsIGNvbG9yID0gJyMwZDIzM2EnKSAlPiUKICBoY19leHBvcnRpbmcoZW5hYmxlZCA9IFRSVUUpCgpoYzEKYGBgCgpBIGFuw6FsaXNlIGRhcyAqKmZ1bsOnw7VlcyBkZSBhdXRvY29ycmVsYcOnw6NvIChGQUMpIGUgYXV0b2NvcnJlbGHDp8OjbyBwYXJjaWFsIChGQUNQKSoqIGRhIHPDqXJpZSwgbW9zdHJhZGFzIGFiYWl4bywgY29uZmlybWFtIHF1ZSBwYXJhIGEgRkFDIGjDoSBzaWduaWZpY8OibmNpYSBlc3RhdMOtc3RpY2EgYXBlbmFzIGVtIHVtYSBkZXNhZmFnZW0gY29tbyBtb3N0cmFtb3MgYW50ZXJpb3JtZW50ZSBhbyBkZXJpdmFyIG8gbW9kZWxvLiAKCmBgYHtyLCBlY2hvPUZBTFNFLCB0aWR5PVRSVUUsIHJlc3VsdHM9J2FzaXMnLCB3YXJuaW5nID0gRkFMU0UsIGZpZy5oZWlnaHQ9N30KIyBGdW7Dp8OjbyBkZSBhdXRvY29ycmVsYcOnw6NvCmFjZl9tYTEgPC0gYWNmKG1hMSwgbmEuYWN0aW9uID0gbmEucGFzcywgcGxvdCA9IEZBTFNFLCBsYWcubWF4ID0gMTUpCgojIEdyw6FmaWNvIGRhIGZ1bsOnw6NvIGRlIGF1dG9jb3JyZWxhw6fDo28uIApwbG90KGFjZl9tYTEsIG1haW4gPSAiIiwgeWxhYiA9ICIiLCB4bGFiID0gIkRlZmFzYWdlbSIpCnRpdGxlKCJGdW7Dp8OjbyBkZSBBdXRvY29ycmVsYcOnw6NvIChGQUMpIiwgYWRqID0gMC41LCBsaW5lID0gMSkKYGBgCgpgYGB7ciwgZWNobz1GQUxTRSwgdGlkeT1UUlVFLCByZXN1bHRzPSdhc2lzJywgd2FybmluZyA9IEZBTFNFLCBmaWcuaGVpZ2h0PTd9CiMgRnVuw6fDo28gZGUgYXV0b2NvcnJlbGHDp8OjbyBwYXJjaWFsCnBhY2ZfbWExIDwtIHBhY2YobWExLCBuYS5hY3Rpb24gPSBuYS5wYXNzLCBwbG90ID0gRkFMU0UsIGxhZy5tYXggPSAxNSkKCiMgR3LDoWZpY28gZGEgZnVuw6fDo28gZGUgYXV0b2NvcnJlbGHDp8OjbyBwYXJjaWFsLiAKcGxvdChwYWNmX21hMSwgbWFpbiA9ICIiLCB5bGFiID0gIiIsIHhsYWIgPSAiRGVmYXNhZ2VtIikKdGl0bGUoIkZ1bsOnw6NvIGRlIEF1dG9jb3JyZWxhw6fDo28gUGFyY2lhbCAoRkFDUCkiLCBhZGogPSAwLjUsIGxpbmUgPSAxKQpgYGAKCiMjIyMjICoqTUEocSkqKgoKU3Vwb25oYSBhZ29yYSBxdWUgdGVtb3MgbyBzZWd1aW50ZSBtb2RlbG8gZGUgbcOpZGlhcyBtw7N2ZWlzIGRlIG9yZGVtICRxJCwgTUEocSkuCgokJApyX3t0fSA9IFxtdSArIGFfe3R9ICsge1x0aGV0YX1fezF9YV97dC0xfSArIHtcdGhldGF9X3syfWFfe3QtMn0gKyAuLi4gKyB7XHRoZXRhfV97cX1hX3t0LXF9CiQkCgpvbmRlICRhX3t0fSQgw6kgdW0gcnXDrWRvIGJyYW5jbyBjb20gbcOpZGlhICQwJCwgdmFyacOibmNpYSAkXHNpZ21hX3thfV57Mn0kLCAkRVxsZWZ0WyBcbGVmdChhX3QtXGJhcnthfVxyaWdodClcbGVmdChhX3t0LWx9LVxiYXJ7YX1ccmlnaHQpXHJpZ2h0XT1FW2Ffe3R9YV97dC1sfV09MCQgZSBpbmRlcGVudGUgZSBpZGVudGljYW1lbnRlIGRpc3RyaWJ1w61kbyAoaWlkKS4gCgpBbnRlcmlvcm1lbnRlLCBhc3N1bWltb3MgYSBoaXDDs3Rlc2UgZGUgZXN0YWNpb25hcmllZGFkZSBmcmFjYSBwYXJhIG1vZGVsYXIgdW1hIHPDqXJpZSB0ZW1wb3JhbC4gQXNzaW0sIHBhcmEgZXN0aW1hciB1bSBtb2RlbG8gJE1BKHEpJCB0ZW1vcyBxdWUgZ2FyYW50aXIgcXVlIGFzIGhpcMOzdGVzZXMgc8OjbyBtYW50aWRhcy4gRWxhcyBzw6NvOiAkRVtyX3t0fV09XG11JCwgJFZhcihyX3t0fSkgPSBcZ2FtbWFfezB9JCBlICRDb3Yocl97dH0scl97dC1sfSk9XGdhbW1hX3tsfSQgb25kZSAkXG11JCBlICRcZ2FtbWFfezB9JCBzw6NvIGNvbnN0YW50ZXMgZSAkXGdhbW1hX3tsfSQgw6kgZnVuw6fDo28gZGUgdW1hIGRlZmFzYWdlbSAkbCQgcXVhbHF1ZXIsIG1hcyBuw6NvIGRvIHRlbXBvICR0JC4KCgoqICoqTcOJRElBIElOQ09ORElDSU9OQUwgQ09OU1RBTlRFKioKCkZhemVuZG8gdXNvIGRhIGhpcMOzdGVzZXMgJEVbcl97dH1dPUVbcl97dC0xfV09Li4uPUVbcl97dC1xfV09XG11JCBlICRFW2Ffe3R9XT1FW2Ffe3QtMX1dPS4uLj1FW2Ffe3QtcX1dPTAkLCB0ZW1vczoKCiQkCkVbcl97dH1dID0gXG11ICsgRVthX3t0fV0gKyB7XHRoZXRhfV97MX1FW2Ffe3QtMX1dICsgLi4uICsge1x0aGV0YX1fe3F9RVthX3t0LXF9XSA9IFxtdQokJAoKTyByZXN1bHRhZG8gbW9zdHJhIHF1ZSBvIHZhbG9yIGVzcGVyYWRvIGRvIG1vZGVsbyBkZSBtw6lkaWFzIG3Ds3ZlaXMgZGUgb3JkZW0gJHEkLCAqKk1BKHEpKiosIHNlbXByZSBzZXLDoSBjb25zdGFudGUgZSBpbmRlcGVuZGVudGUgZG8gdGVtcG8gYXNzaW0gY29tbyBwcm9wb3N0byBwZWxhIGhpcMOzdGVzZSBkZSBlc3RhY2lvbmFyaWVkYWRlIGZyYWNhLiAKCiogKipWQVJJw4JOQ0lBIElOQ09ORElDSU9OQUwgQ09OU1RBTlRFKioKClJlZXNjcmV2ZW5kbyBvIG1vZGVsbyBjb21vICRyX3t0fS1cbXUgPSBhX3t0fSArIHtcdGhldGF9X3sxfWFfe3QtMX0gKyAuLi4rIHtcdGhldGF9X3txfWFfe3QtcX0kLCBmYXplbmRvIHVzbyBkYSBoaXDDs3Rlc2UgZGUgcXVlICRWYXIoYV97dH0pPVxzaWdtYV97YX1eezJ9PUVbYV97dH1eezJ9XSQgZSBxdWUgJGFfe3R9JCDDqSBpbmRlcGVuZGVudGVtZW50ZSBlIGlkZW50aWNhbWVudGUgZGlzdHJpYnXDrWRvLCB0ZW1vczoKCiQkClxiZWdpbntzcGxpdH0KVmFyKHJfe3R9KSAmPSAgRVtcbGVmdChyX3t0fS1cbXVccmlnaHQpXGxlZnQocl97dH0tXG11XHJpZ2h0KV0gXFwgCiYgXFwKJiA9IEVbXGxlZnQocl97dH0tXG11XHJpZ2h0KV4yXSBcXAomIFxcCiYgPSBFXGxlZnRbXGxlZnQoYV97dH0gKyBcdGhldGFfezF9YV97dC0xfSsgLi4uKyB7XHRoZXRhfV97cX1hX3t0LXF9XHJpZ2h0KV4yXHJpZ2h0XSBcXAomIFxcCiYgPSBWYXIoYV97dH0pK1x0aGV0YV97MX1eMlZhcihhX3t0LTF9KSArIC4uLiArIFx0aGV0YV97cX1eezJ9VmFyKGFfe3QtcX0pIFxcCiYgXFwKJiA9IFxzaWdtYV97YX1eezJ9ICsgXHRoZXRhX3sxfV57Mn1cc2lnbWFfe2F9XnsyfSArIC4uLiArXHRoZXRhX3txfV57Mn1cc2lnbWFfe2F9XnsyfSBcXAomIFxcClxnYW1tYV97MH0gJiA9ICgxK1x0aGV0YV97MX1eezJ9Ky4uLitcdGhldGFfe3F9XnsyfSlcc2lnbWFfe2F9XnsyfQpcZW5ke3NwbGl0fQokJAoKQXNzaW0sIHRlbW9zIHF1ZSBhIHZhcmnDom5jaWEgaW5jb25kaWNpb25hbCBkbyBwcm9jZXNzbyBkZSBtw6lkaWFzIG3Ds3ZlaXMgZGUgb3JkZW0gJHEkLCAqKk1BKHEpKiosIMOpIGZpbml0YS4KCiogKipBVVRPQ09WQVJJw4JOQ0lBIEUgQVVUT0NPUlJFTEHDh8ODTyBERVBFTkRFTlRFUyBBUEVOQVMgREUgJGwkKioKCkZhemVuZG8gJEVbKHJfe3R9LVxtdSkocl97dC0xfS1cbXUpXSQsIG91IHNlamEsIGEgYXV0b2NvdmFyacOibmNpYSBkZSBwcmltZWlyYSBvcmRlbSBwYXJhIG8gKipNQShxKSoqLCB1c2FuZG8gYSBmb3JtYSBmdW5jaW9uYWwgZG8gbW9kZWxvIGUgJEVbYV97dH1hX3t0LWx9XT0wJCBwYXJhICRsIFxuZXEgMCQsIHRlbW9zOgoKJCQKXGJlZ2lue3NwbGl0fQpFWyhyX3t0fS1cbXUpKHJfe3QtMX0tXG11KV0gJiA9IEVbKGFfe3R9K1x0aGV0YV97MX1hX3t0LTF9Ky4uLitcdGhldGFfe3F9YV97dC1xfSkoYV97dC0xfStcdGhldGFfezF9YV97dC0yfSsuLi4rXHRoZXRhX3txfWFfe3QtcS0xfSldIFxcCiYgXFwKJiA9IEVbKGFfe3R9K1x0aGV0YV97MX1hX3t0LTF9K1x0aGV0YV97Mn1hX3t0LTJ9K1x0aGV0YV97M31hX3t0LTN9Ky4uLikoYV97dC0xfStcdGhldGFfezF9YV97dC0yfStcdGhldGFfezJ9YV97dC0zfSsuLi4pXSBcXAomIFxcCiYgPSBFW2Ffe3R9YV97dC0xfStcdGhldGFfezF9YV97dH1hX3t0LTJ9K1x0aGV0YV97Mn1hX3t0fWFfe3QtM30rXHRoZXRhX3sxfWFfe3QtMX1eezJ9K1x0aGV0YV97MX1eezJ9YV97dC0xfWFfe3QtMn0rXHRoZXRhX3sxfVx0aGV0YV97Mn1hX3t0LTN9K1x0aGV0YV97Mn1hX3t0LTJ9YV97dC0xfStcdGhldGFfezJ9XHRoZXRhX3sxfWFfe3QtMn1eezJ9K1x0aGV0YV97Mn1eezJ9YV97dC0yfWFfe3QtM30rIFxcCiYgKyBcdGhldGFfezN9YV97dC0zfWFfe3QtMX0rXHRoZXRhX3szfVx0aGV0YV97MX1hX3t0LTN9YV97dC0yfStcdGhldGFfezN9XHRoZXRhX3syfWFfe3QtM31eMl0gXFwKJiBcXApcZ2FtbWFfezF9ICYgPSBFW1x0aGV0YV97MX1hX3t0LTF9XnsyfStcdGhldGFfezJ9XHRoZXRhX3sxfWFfe3QtMn1eezJ9K1x0aGV0YV97M31cdGhldGFfezJ9YV97dC0zfV4yKy4uLl0gXFwKJiBcXAomID0gXHRoZXRhX3sxfVxzaWdtYV97YX1eezJ9K1x0aGV0YV97Mn1cdGhldGFfezF9XHNpZ21hX3thfV57Mn0rXHRoZXRhX3szfVx0aGV0YV97Mn1cc2lnbWFfe2F9XnsyfSsuLi4gXFwKJiBcXApcZW5ke3NwbGl0fQokJAoKcXVlIHBvZGUgc2VyIGVzY3JpdGEgdXNhbmRvICRcZ2FtbWEkIHBhcmEgZGVmaW5pciBhIGZ1bsOnw6NvIGRlIGF1dG9jb3ZhcmnDom5jaWEgZG8gKiptb2RlbG8gTUEocSkqKiBkYSBzZWd1aW50ZSBmb3JtYTogCgokJApcZ2FtbWFfe2x9ID0gW1x0aGV0YV97bH0rXHRoZXRhX3tsKzF9XHRoZXRhX3sxfStcdGhldGFfe2wrMn1cdGhldGFfezJ9Ky4uLitcdGhldGFfe3F9XHRoZXRhX3txLWp9XVxzaWdtYV97YX1eezJ9CiQkCnBhcmEgJGw9MSwyLDMuLi4scSQgZSDDqSBpZ3VhbCBhICoqemVybyoqIHBhcmEgJGw+cSQuCgoqKkVYRU1QTE86KiogVmFtb3MgYXZhbGlhciBhIGdlbmVyYWxpemHDp8OjbyBkYSBhdXRvY292YXJpw6JuY2lhIHByb3Bvc3RhIHBhcmEgdW0gKipNQSgyKSoqLCBvdSBzZWphLCAkbD0yJC4gQXNzaW0sIHRlbW9zOgoKKiBwYXJhICRsPTAkLCAkXGdhbW1hX3swfT0oMStcdGhldGFfezF9XnsyfStcdGhldGFfezJ9XnsyfSlcc2lnbWFfe2F9XnsyfSQKKiBwYXJhICRsPTEkLCAkXGdhbW1hX3sxfT0oXHRoZXRhX3sxfStcdGhldGFfezF9XHRoZXRhX3syfSlcc2lnbWFfe2F9XnsyfSQKKiBwYXJhICRsPTIkLCAkXGdhbW1hX3syfT1cdGhldGFfezJ9XHNpZ21hX3thfV57Mn0kCiogcGFyYSAkbD4yJCwgJFxnYW1tYV97bH09MCQKCkNvbnNlcXVlbnRlbWVudGUsIHRlcmVtb3MgKiphdXRvY29ycmVsYcOnw6NvKiogYXBlbmFzIGF0w6kgJGw9MiQgcGFyYSB1bSAqKk1BKDIpKiouIERlc3RhIGZvcm1hLCBwb2RlbW9zIGNvbmNsdWlyIHF1ZSBhdmFsaWFyIGEgKipmdW7Dp8OjbyBkZSBhdXRvY29ycmVsYcOnw6NvKiogw6kgdW1hIGJvYSBhbHRlcm5hdGl2YSBwYXJhIGRlZmluaXIgYSBkZWZhc2FnZW0gZGUgdW0gcHJvY2Vzc28gZGUgbcOpZGlhcyBtw7N2ZWlzLiBFc3NhIGNvbmNsdXPDo28gw6kgZGlmZXJlbnRlIGRvIHF1ZSBlbmNvbnRyYW1vcyBwYXJhIG9zIG1vZGVsb3MgYXV0b3JyZWdyZXNzaXZvcyAoQVIpIG9uZGUgYSAqKmZ1bsOnw6NvIGRlIGF1dG9jb3JyZWxhw6fDo28gcGFyY2lhbCoqIGFzc3VtZSBvIHBhcGVsIGRlIGRlZmluaXIgYSBkZWZhc2FnZW0gZG8gcHJvY2Vzc28uCgojIyMjIyAqKkVYRU1QTE9TIERFIFBST0NFU1NPUyBERSBNw4lESUFTIE3Dk1ZFSVMgKE1BKSoqCgoqICoqTUEoMikqKgoKU3Vwb25oYSBxdWUgdGVtb3MgbyBzZWd1aW50ZSBtb2RlbG8gZGUgbcOpZGlhcyBtw7N2ZWlzIGRlIHNlZ3VuZGEgb3JkZW0sIE1BKDIpLgoKJCQKcl97dH0gPSBcbXUgKyBhX3t0fSArIHtcdGhldGF9X3sxfWFfe3QtMX0gKyB7XHRoZXRhfV97Mn1hX3t0LTJ9CiQkCgpvbmRlICRhX3t0fSQgw6kgdW0gcnXDrWRvIGJyYW5jbyBjb20gbcOpZGlhICQwJCwgdmFyacOibmNpYSAkXHNpZ21hX3thfV57Mn0kLCAkRVxsZWZ0W2FfdC1FKGEpXHJpZ2h0XVxsZWZ0W2Ffe3QtbH0tRShhKVxyaWdodF09RVthX3t0fWFfe3QtbH1dPTAkIGUgaW5kZXBlbnRlIGUgaWRlbnRpY2FtZW50ZSBkaXN0cmlidcOtZG8gKGlpZCkuIFBvZGVtb3MgdmlzdWFsaXphciBhcyBwcm9wcmllZGFkZXMgZXN0dWRhZGFzIHBhcmEgZXN0ZSBtb2RlbG8gYSBwYXJ0aXIgZGUgc3VhcyBmdW7Dp8O1ZXMgZGUgYXV0b2NvcnJlbGHDp8OjbyBlIGF1dG9jb3JyZWxhw6fDo28gcGFyY2lhbC4gUGFyYSB0YW50bywgdmFtb3Mgc2ltdWxhciB1bSBtb2RlbG8gbm8gc2VndWludGUgZm9ybWF0bzogCgokJApyX3t0fSA9IDEwICsgYV97dH0gKyAwLjNhX3t0LTF9ICsgMC41YV97dC0yfQokJApBIGltYWdlbSBhYmFpeG8gbW9zdHJhIG8gZ3LDoWZpY28gZGEgc8OpcmllIHRlbXBvcmFsIHJlc3VsdGFudGUgZG8gbW9kZWxvLiDDiSBwb3Nzw612ZWwgb2JzZXJ2YXIgcXVlIGjDoSBhcGFyZW50ZSBlc3RhY2lvbmFyaWVkYWRlIGZyYWNhIGRhZG8gcXVlIGEgc8OpcmllIG9zY2lsYSBlbSB0b3JubyBkZSB1bWEgbcOpZGlhICgkMTAkKSBlIGNvbSB1bWEgdmFyacOibmNpYSBjb25zdGFudGUuCgpgYGB7ciwgZWNobz1GQUxTRSwgdGlkeT1UUlVFLCByZXN1bHRzPSdhc2lzJywgd2FybmluZyA9IEZBTFNFfQptYTIgPC0gYXMueHRzKGFyaW1hLnNpbShsaXN0KG9yZGVyID0gYygwLDAsMiksIG1hPWMoMC4zLDAuNSkpLCBuPTEwMDAwKSsxMCkKaGMyIDwtIGhpZ2hjaGFydCh0eXBlID0gInN0b2NrIikgJT4lIAogIGhjX3RpdGxlKHRleHQgPSAiTUEoMikgU2ltdWxhZG8iKSAlPiUgCiAgaGNfYWRkX3NlcmllcyhtYTIsIGlkID0gInRzIiwgY29sb3IgPSAnYmxhY2snKSAlPiUKICBoY19leHBvcnRpbmcoZW5hYmxlZCA9IFRSVUUpCgpoYzIKYGBgCgpBIGFuw6FsaXNlIGRhcyAqKmZ1bsOnw7VlcyBkZSBhdXRvY29ycmVsYcOnw6NvIChGQUMpIGUgYXV0b2NvcnJlbGHDp8OjbyBwYXJjaWFsIChGQUNQKSoqIGRhIHPDqXJpZSwgbW9zdHJhZGFzIGFiYWl4bywgY29uZmlybWFtIHF1ZSBwYXJhIGEgRkFDIGjDoSBzaWduaWZpY8OibmNpYSBlc3RhdMOtc3RpY2EgYXBlbmFzIGVtICoqZHVhcyoqIGRlc2FmYWdlbSBjb21vIGRlcml2YW1vcyBhbnRlcmlvcm1lbnRlLiBJc3NvIGNvbmZpcm1hIHF1ZSBhIGZ1bsOnw6NvIGRlIGF1dG9jb3JyZWxhw6fDo28gw6kgdW1hIGJvYSBhbHRlcm5hdGl2YSBwYXJhIGRlZmluaXIgYSBkZWZhc2FnZW0gZGUgdW0gcHJvY2Vzc28gKipNQShxKSoqLgoKYGBge3IsIGVjaG89RkFMU0UsIHRpZHk9VFJVRSwgcmVzdWx0cz0nYXNpcycsIHdhcm5pbmcgPSBGQUxTRSwgZmlnLmhlaWdodD03fQojIEZ1bsOnw6NvIGRlIGF1dG9jb3JyZWxhw6fDo28KYWNmX21hMiA8LSBhY2YobWEyLCBuYS5hY3Rpb24gPSBuYS5wYXNzLCBwbG90ID0gRkFMU0UsIGxhZy5tYXggPSAxNSkKCiMgR3LDoWZpY28gZGEgZnVuw6fDo28gZGUgYXV0b2NvcnJlbGHDp8Ojby4gCnBsb3QoYWNmX21hMiwgbWFpbiA9ICIiLCB5bGFiID0gIiIsIHhsYWIgPSAiRGVmYXNhZ2VtIikKdGl0bGUoIkZ1bsOnw6NvIGRlIEF1dG9jb3JyZWxhw6fDo28gKEZBQykiLCBhZGogPSAwLjUsIGxpbmUgPSAxKQoKYGBgCgpgYGB7ciwgZWNobz1GQUxTRSwgdGlkeT1UUlVFLCByZXN1bHRzPSdhc2lzJywgd2FybmluZyA9IEZBTFNFLCBmaWcuaGVpZ2h0PTd9CiMgRnVuw6fDo28gZGUgYXV0b2NvcnJlbGHDp8OjbyBwYXJjaWFsCnBhY2ZfbWEyIDwtIHBhY2YobWEyLCBuYS5hY3Rpb24gPSBuYS5wYXNzLCBwbG90ID0gRkFMU0UsIGxhZy5tYXggPSAxNSkKCiMgR3LDoWZpY28gZGEgZnVuw6fDo28gZGUgYXV0b2NvcnJlbGHDp8OjbyBwYXJjaWFsLiAKcGxvdChwYWNmX21hMiwgbWFpbiA9ICIiLCB5bGFiID0gIiIsIHhsYWIgPSAiRGVmYXNhZ2VtIikKdGl0bGUoIkZ1bsOnw6NvIGRlIEF1dG9jb3JyZWxhw6fDo28gUGFyY2lhbCAoRkFDUCkiLCBhZGogPSAwLjUsIGxpbmUgPSAxKQoKYGBgCgoKKiAqKk1BKDMpKioKClN1cG9uaGEgYWdvcmEgcXVlIHRlbW9zIG8gc2VndWludGUgbW9kZWxvIGRlIG3DqWRpYXMgbcOzdmVpcyBkZSB0ZXJjZWlyYSBvcmRlbSwgTUEoMykuCgokJApyX3t0fSA9IFxtdSArIGFfe3R9ICsge1x0aGV0YX1fezF9YV97dC0xfSArIHtcdGhldGF9X3syfWFfe3QtMn0gKyB7XHRoZXRhfV97M31hX3t0LTN9CiQkCgpvbmRlICRhX3t0fSQgw6kgdW0gcnXDrWRvIGJyYW5jbyBjb20gbcOpZGlhICQwJCwgdmFyacOibmNpYSAkXHNpZ21hX3thfV57Mn0kLCAkRVxsZWZ0W2FfdC1FKGEpXHJpZ2h0XVxsZWZ0W2Ffe3QtbH0tRShhKVxyaWdodF09RVthX3t0fWFfe3QtbH1dPTAkIGUgaW5kZXBlbnRlIGUgaWRlbnRpY2FtZW50ZSBkaXN0cmlidcOtZG8gKGlpZCkuIFBvZGVtb3MgdmlzdWFsaXphciBhcyBwcm9wcmllZGFkZXMgZXN0dWRhZGFzIHBhcmEgZXN0ZSBtb2RlbG8gYSBwYXJ0aXIgZGUgc3VhcyBmdW7Dp8O1ZXMgZGUgYXV0b2NvcnJlbGHDp8OjbyBlIGF1dG9jb3JyZWxhw6fDo28gcGFyY2lhbC4gUGFyYSB0YW50bywgdmFtb3Mgc2ltdWxhciB1bSBtb2RlbG8gbm8gc2VndWludGUgZm9ybWF0bzogCgokJApyX3t0fSA9IDEwICsgYV97dH0gKyAwLjNhX3t0LTF9ICsgMC41YV97dC0yfSAtIDAuNGFfe3QtM30KJCQKCkEgaW1hZ2VtIGFiYWl4byBtb3N0cmEgbyBncsOhZmljbyBkYSBzw6lyaWUgdGVtcG9yYWwgcmVzdWx0YW50ZSBkbyBtb2RlbG8uIMOJIHBvc3PDrXZlbCBvYnNlcnZhciBxdWUgaMOhIGFwYXJlbnRlIGVzdGFjaW9uYXJpZWRhZGUgZnJhY2EgZGFkbyBxdWUgYSBzw6lyaWUgb3NjaWxhIGVtIHRvcm5vIGRlIHVtYSBtw6lkaWEgKCQxMCQpIGUgY29tIHVtYSB2YXJpw6JuY2lhIGNvbnN0YW50ZS4KCmBgYHtyLCBlY2hvPUZBTFNFLCB0aWR5PVRSVUUsIHJlc3VsdHM9J2FzaXMnLCB3YXJuaW5nID0gRkFMU0V9Cm1hMyA8LSBhcy54dHMoYXJpbWEuc2ltKGxpc3Qob3JkZXIgPSBjKDAsMCwzKSwgbWE9YygwLjMsMC41LC0wLjQpKSwgbj0xMDAwMCkrMTApCmhjMyA8LSBoaWdoY2hhcnQodHlwZSA9ICJzdG9jayIpICU+JSAKICBoY190aXRsZSh0ZXh0ID0gIk1BKDMpIFNpbXVsYWRvIikgJT4lIAogIGhjX2FkZF9zZXJpZXMobWEzLCBpZCA9ICJ0cyIsIGNvbG9yID0gJ2JsYWNrJykgJT4lCiAgaGNfZXhwb3J0aW5nKGVuYWJsZWQgPSBUUlVFKQoKaGMzCmBgYAoKQSBhbsOhbGlzZSBkYXMgKipmdW7Dp8O1ZXMgZGUgYXV0b2NvcnJlbGHDp8OjbyAoRkFDKSBlIGF1dG9jb3JyZWxhw6fDo28gcGFyY2lhbCAoRkFDUCkqKiBkYSBzw6lyaWUsIG1vc3RyYWRhcyBhYmFpeG8sIGNvbmZpcm1hbSBxdWUgcGFyYSBhIEZBQyBow6Egc2lnbmlmaWPDom5jaWEgZXN0YXTDrXN0aWNhIGFwZW5hcyBlbSAqKnRyw6pzKiogZGVzYWZhZ2VtIGNvbW8gZGVyaXZhbW9zIGFudGVyaW9ybWVudGUuIElzc28gY29uZmlybWEgcXVlIGEgZnVuw6fDo28gZGUgYXV0b2NvcnJlbGHDp8OjbyDDqSB1bWEgYm9hIGFsdGVybmF0aXZhIHBhcmEgZGVmaW5pciBhIGRlZmFzYWdlbSBkZSB1bSBwcm9jZXNzbyAqKk1BKHEpKiouCgpgYGB7ciwgZWNobz1GQUxTRSwgdGlkeT1UUlVFLCByZXN1bHRzPSdhc2lzJywgd2FybmluZyA9IEZBTFNFLCBmaWcuaGVpZ2h0PTd9CiMgRnVuw6fDo28gZGUgYXV0b2NvcnJlbGHDp8OjbwphY2ZfbWEzIDwtIGFjZihtYTMsIG5hLmFjdGlvbiA9IG5hLnBhc3MsIHBsb3QgPSBGQUxTRSwgbGFnLm1heCA9IDE1KQoKCiMgR3LDoWZpY28gZGEgZnVuw6fDo28gZGUgYXV0b2NvcnJlbGHDp8Ojby4gCnBsb3QoYWNmX21hMywgbWFpbiA9ICIiLCB5bGFiID0gIiIsIHhsYWIgPSAiRGVmYXNhZ2VtIikKdGl0bGUoIkZ1bsOnw6NvIGRlIEF1dG9jb3JyZWxhw6fDo28gKEZBQykiLCBhZGogPSAwLjUsIGxpbmUgPSAxKQoKYGBgCgpgYGB7ciwgZWNobz1GQUxTRSwgdGlkeT1UUlVFLCByZXN1bHRzPSdhc2lzJywgd2FybmluZyA9IEZBTFNFLCBmaWcuaGVpZ2h0PTd9CiMgRnVuw6fDo28gZGUgYXV0b2NvcnJlbGHDp8OjbyBwYXJjaWFsCnBhY2ZfbWEzIDwtIHBhY2YobWEzLCBuYS5hY3Rpb24gPSBuYS5wYXNzLCBwbG90ID0gRkFMU0UsIGxhZy5tYXggPSAxNSkKCiMgR3LDoWZpY28gZGEgZnVuw6fDo28gZGUgYXV0b2NvcnJlbGHDp8OjbyBwYXJjaWFsLiAKcGxvdChwYWNmX21hMywgbWFpbiA9ICIiLCB5bGFiID0gIiIsIHhsYWIgPSAiRGVmYXNhZ2VtIikKdGl0bGUoIkZ1bsOnw6NvIGRlIEF1dG9jb3JyZWxhw6fDo28gUGFyY2lhbCAoRkFDUCkiLCBhZGogPSAwLjUsIGxpbmUgPSAxKQoKYGBgCgojIyMjIyAqKklERU5USUZJQ0FORE8gTU9ERUxPUyBNQSBOQSBQUsOBVElDQSoqCgpDb21vIG1vc3RyYW1vcyBub3MgbW9kZWxvcyBNQSBzaW11bGFkb3MgYW50ZXJpb3JtZW50ZSwgYSAqKmZ1bsOnw6NvIGRlIGF1dG9jb3JyZWxhw6fDo28gKEZBQykqKiDDqSDDunRpbCBwYXJhIGlkZW50aWZpY2FyIGEgb3JkZW0gZG8gbW9kZWxvIGRlIG3DqWRpYXMgbcOzdmVpcyAoTUEpIHB1cm8uIFBhcmEgdW1hIHPDqXJpZSB0ZW1wb3JhbCAkcl97dH0kIGNvbSBmdW7Dp8OjbyBkZSBhdXRvY29ycmVsYcOnw6NvICRccmhvX3tsfSQsIHNlICRccmhvX3txfSBcbmVxIDAkLCBtYXMgJFxyaG9fe2x9PTAkIHBhcmEgJGw+cSQsIGVudMOjbyAkcl97dH0kIHNlZ3VlIHVtIG1vZGVsbyBkZSBtw6lkaWFzIG3Ds3ZlaXMgZGUgb3JkZW0gcSwgKipNQShxKSoqLgoKIyMjIyMgKipSRUZFUsOKTkNJQVMqKg==