Este material tem como objetivo contribuir para o entendimento sobre séries temporais univariadas, focando nas características de dados financeiros e suas propriedades. Para tanto, vamos análisar dois tipos de séries temporais financeiras: preços e retornos. Para cada tipo de série, estudaremos o seguinte:

Após entender os pontos acima, iniciamos a definição formal de serie temporal univariada, processo estocástico e estacionariedade de um série temporal univariada. Assim, entenderemos o motivo pelo qual a série temporal dos retornos é usada nos modelos de séries temporais univariadas ao invés da série temporal dos preços.

  1. PREÇOS DE ATIVOS FINANCEIROS

São dados que representam o valor pago por um ativo financeiro (ação, opção, título, …) em um determinando instante do tempo. Em função de termos várias possibilidades para a períodicidade (minuto, hora, dia, semana, mes, semestre, …) desta transação é preciso entender os diversos tipos de dados e suas propriedades.

São aqueles em que o intervalo de tempo (\(\Delta t\)) entre observações consecutivas é constante. Por exemplo, os dias, semanas e meses. Para facilitar o entendimento, mostramos abaixo uma tabela com dados igualmente espaçados para a ação GOOGL da Alphabet Inc (Holding de empresas do Google).

O preço de abertura é determinado pelo chamado leilão de pré-abertura que acontece 15 minutos antes do início do pregão (9h:45min). Neste leilão, todas as ordens de compra e venda de ações que já foram enviadas para a bolsa (antes da abertura), entram no leilão. O sistema da bolsa identifica as faixas de preços com maiores volumes de negociação. O preço que tiver maior número de compras e vendas de ações, será o preço de abertura do ativo neste dia. Durante o leilão nenhum negócio é fechado, mesmo que os valores de compra e venda coincidam.

Ao final do leilão (10hs que é o início do pregão eletrônico), as negociações seguem até as 16hs:55min. Neste horário, inicia-se outro leilão (chamado de call de fechamento). O processo é parecido com o leilão de pré-abertura, porém o preço mais negociado na compra e na venda de um ativo, determinará o preço de fechamento daquela ação.

Já o preço de fechamento ajustado acontece quando uma ação, dentro de qualquer dia de negociação, tem o seu preço alterado para incluir quaisquer distribuições de proventos que ocorreram em qualquer momento antes da abertura do dia seguinte. Como utilidade prática, o preço de fechamento ajustado é uma ferramenta muito útil para examinar os resultados históricos de uma empresa, pois ele oferece aos analistas uma imagem precisa do valor patrimonial da empresa além do preço de mercado.

Sabemos que dados financeiros podem ser observados em instantes de tempo irregularmente espaçados, como os dados intradiários de ativos negociados em bolsa de valores ou mercadorias, ou taxas de câmbio.

Neste caso, os intervalos entre observações são variáveis aleatórias e podemos ter observações coincidindo num mesmo instante de tempo ou em intervalos distintos. Este tipo de dado é chamado de alta frequência.

Abaixo, exemplo de dado intradiário para a ação GOOG da Alphabet Inc em cada minuto. Neste caso, não conseguimos visualizar a existência de observações coincidindo no mesmo instante de tempo ou em intervalos distintos em função do sistema coletar apenas uma transação por minuto, mas esperamos que durante o dia tal característica seja apresentada para este tipo de ativo.

Para a disciplina em estudo, vamos usar séries temporais originadas por dados regularmente espaçados. Porém, existem outros campos da Econometria de Séries Temporais que concentram-se na análise de séries temporais originadas de dados irregularmente espaçados.

Já é bem documentado na literatura que séries temporais apresentam certas características, como:

De um modo geral, podemos dizer que uma série é não-linear quando responde de maneira diferente a choques grandes ou pequenos, ou ainda, a choques negativos ou positivos. Por exemplo, a queda do IBOVESPA pode ocasionar maior volatilidade no mercado do que a alta.

Abaixo, exemplo de série temporal (dados do total de passageiros aéreos nos EUA entre 1949 e 1960) com tendência e sazonalidade.

O gráfico abaixo decompõe a série temporal do total de passageiros aéreos nos EUA entre 1949 e 1960 facilitando a visualização dos componentes de sazonalidade e tendência.

  1. RETORNOS DE ATIVOS FINANCEIROS

Muitos estudos financeiros fazem uso de retornos de ativos ao invés dos seus preços. Segundo (Campbell, Lo, and MacKinlay 1997), isso acontece porque as séries de retornos são mais fáceis de manusear do que as séries de preços em função de possuírem propriedades estatísticas mais atrantes (como estacionariedade). Porém, existem muitas formas de mensurar o retorno de um ativo.

Abaixo, mostramos exemplos de como obter o retorno de ativos. Para tanto, deixe \(P_{t}\) ser o preço de um ativo em um dado período \(t\).

Assumindo que o ativo não paga dividendos, o retorno simples é o retorno obtido ao se manter o ativo adquirido em \((t-1)\) até \(t\), ou seja:

\[ R_{t}=\frac{P_{t}}{P_{t-1}}-1 = \frac{P_{t}-P_{t-1}}{P_{t-1}} \] Para demonstração, usaremos a tabela abaixo que nos mostra dados da ação da Microsoft Corporation. Temos que o retorno de manter a ação de 13/02/18 até 14/02/2018 é \(R_{t}=90.81/89.83-1\approx 0.0109\) de modo que o retorno simples correspondente é de \(1.09\%\).

Caso o ativo pague dividendos, o retorno simples é:

\[ R_{t} = \frac{P_{t}+D_{t}}{P_{t-1}} -1 \] Além disso, caso o objetivo seja um retorno acima do ativo livre de risco, o retorno simples se torna um retorno em excesso, conforme abaixo:

\[ Z_{t} = R_{t} - R_{0t} \] onde \(R_{0t}\) é o retorno do ativo livre de risco. Outra alternativa é trabalhar com o logaritmo para obter o retorno entre dois períodos subsequentes (para períodos distantes o logaritmo não será uma boa aproximação do real retorno). Usar o logaritmo suavizará a série temporal dos retornos. Para tanto, podemos fazer uso do seguinte:

\[ R_{t} = \ln{\left(\frac{P_{t}}{P_{t-1}}\right)} = \ln(P_{t}) - \ln(P_{t-1}) \]

No gráfico abaixo, comparamos a diferença entre usar o retorno simples (em azul) e o retorno em logaritmo (em vermelho) para gerar a série temporal do retorno da ação IBM (nternational Business Machines) entre 01/01/2000 e 16/02/2018.

Suponha agora que o ativo é mantido por \(k\) períodos entre as datas \(t-k\) e \(t\). Desta forma, o retorno bruto simples nos k períodos será:

\[ 1+R_{t}[k]=\frac{P_{t}}{P_{t-k}}=\frac{P_{t}}{P_{t-1}}\times \frac{P_{t-1}}{P_{t-2}}\times ...\times \frac{P_{t-k+1}}{P_{t-k}} \]

Assim, o retorno simples em k períodos é apenas o produto dos retornos simples para os k períodos envolvidos. Além disso, o retorno líquido nos k períodos será \(R_{t}[k]=\frac{P_{t}}{P_{t-k}}-1=\frac{P_{t}-P_{t-k}}{P_{t-k}}\).

Para ilustrar, considere novamente os dados da ação da Microsoft Corporation da tabela anterior. Se avaliarmos de 12/02/2018 até 14/02/2018 temos que o retorno no período foi de \(1+R_{t}[3] = 90.81/89.13 \approx 1,01884\) de modo que o retorno simples no período foi de \(1.884\%\).

Os retornos financeiros apresentam características peculiares diferentemente de muitas séries temporais. Retornos raramente apresentam tendências ou sazonalidades, com exceção eventualmente de retornos intradiários. Além disso, séries de taxas de câmbio e séries de taxas de juros podem apresentar tendências que variam no tempo. Por outro lado, é comumente encontrado em séries de retornos as seguintes características:

O comportamento heterocedástico reúne características como aglomerados de volatilidade e efeitos alavanca, que aponta para o efeito de choque. Choques negativos normalmente afetam a volatilidade condicional em maior magnitude do que choques positivos, ou seja, uma queda no retorno implica uma volatilidade condicional alta.

Vamos analisar a série temporal do Standard & Poor’s 500. Temos dois gráficos sendo o primeiro o fechamento do preço da índice para todos os dias com negociação entre 01/01/2000 e 16/02/2018 enquanto no segundo apresentamos o retorno simples obtido conforme metodololgia exposta anteriormente.

Notamos que os fatos estilizados apontados anteriormente estão presentes na série de retornos do S&P 500 dado que há aparente estacionariedade, média ao redor de zero e agrupamentos de volatilidade. Períodos de alta volatilidade coincidem com épocas nas quais ocorreram crises em diversos países que influenciaram o mercado financeiro.

  1. DEFINIÇÃO DE SÉRIE TEMPORAL E SUA RELAÇÃO COM PROCESSO ESTOCÁSTICO

Uma série temporal é uma sequência de observações \({\{{y}_{t}\}}\) indexadas pela data de cada observação (minuto, hora, dia, semana, mês, trimestre, semestre, ano, …).

\[ {\{{y}_{t}\}}_{t=-\infty}^{\infty}=\{...,{y}_{t-1},{y}_{0},{y}_{1},{y}_{2},...,{y}_{t},...\} \]

  1. DEFINIÇÃO DE ESTACIONARIEDADE

Uma série temporal é dita estacionária se ela se desenvolve no tempo aleatoriamente ao redor de uma média constante, refletindo alguma forma de equilíbrio estável. Formalmente, temos que uma série temporal de retornos de um ativo financeiro será fracamente estacionária se:

onde \(\mu\) e \(\gamma_{0}\) são constantes e \(\gamma_{l}\) é função de uma defasagem \(l\) qualquer, mas não do tempo \(t\). Abaixo, para cada condição apresentada um gráfico com séries que atendem e que violam tais condições.

REFERÊNCIAS

Bueno, Rodrigo De Losso da Silveira. 2011. Econometria de Séries Temporais. Cengage Learning.

Campbell, John Y, Andrew Wen-Chuan Lo, and Archie Craig MacKinlay. 1997. The Econometrics of Financial Markets. Princeton (NJ) Princeton University Press.

Enders, Walter. 2015. Applied Econometric Time Series. John Wiley & Sons.

Morettin, Pedro Alberto. 2008. Econometria Financeira Um Curso Em Séries Temporais Financeiras. Edgard Blucher.

Tsay, Ruey S. 2014. An Introduction to Analysis of Financial Data with R. John Wiley & Sons.

LS0tCnRpdGxlOiA8Y2VudGVyPiA8aDI+IDxiPlPDqXJpZXMgVGVtcG9yYWlzIFVuaXZhcmlhZGFzIDwvYj4gPC9oMj4gPC9jZW50ZXI+IAphdXRob3I6IDxjZW50ZXI+IEh1ZHNvbiBDaGF2ZXMgQ29zdGEgPC9jZW50ZXI+CmdyYXBoaWNzOiB5ZXMKbGlua2NvbG9yOiBibHVlCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICAgIHRoZW1lOiBjZXJ1bGVhbgogICAgZmlnX2NhcHRpb246IHllcwpyZWZlcmVuY2VzOgotIGlkOiBlbmRlcnMyMDE1YXBwbGllZAogIHRpdGxlOiBBcHBsaWVkIGVjb25vbWV0cmljIHRpbWUgc2VyaWVzCiAgYXV0aG9yOgogIC0gZmFtaWx5OiBFbmRlcnMKICAgIGdpdmVuOiBXYWx0ZXIKICBwdWJsaXNoZXI6IEpvaG4gV2lsZXkgXCYgU29ucwogIHR5cGU6IGJvb2sKICBpc3N1ZWQ6CiAgICB5ZWFyOiAyMDE1Ci0gaWQ6IGRhMjAxMWVjb25vbWV0cmlhCiAgdGl0bGU6IEVjb25vbWV0cmlhIGRlIHPDqXJpZXMgdGVtcG9yYWlzCiAgYXV0aG9yOiAKICAtIGZhbWlseTogQnVlbm8KICAgIGdpdmVuOiBSb2RyaWdvIERlIExvc3NvIGRhIFNpbHZlaXJhCiAgcHVibGlzaGVyOiBDZW5nYWdlIExlYXJuaW5nCiAgdHlwZTogYm9vawogIGlzc3VlZDoKICAgIHllYXI6IDIwMTEKLSBpZDogdHNheTIwMTRpbnRyb2R1Y3Rpb24KICB0aXRsZTogQW4gaW50cm9kdWN0aW9uIHRvIGFuYWx5c2lzIG9mIGZpbmFuY2lhbCBkYXRhIHdpdGggUgogIGF1dGhvcjoKICAtIGZhbWlseTogVHNheQogICAgZ2l2ZW46IFJ1ZXkgUwogIHB1Ymxpc2hlcjogSm9obiBXaWxleSBcJiBTb25zCiAgdHlwZTogYm9vawogIGlzc3VlZDoKICAgIHllYXI6IDIwMTQKLSBpZDogY2FtcGJlbGwxOTk3ZWNvbm9tZXRyaWNzCiAgdGl0bGU6IFRoZSBlY29ub21ldHJpY3Mgb2YgZmluYW5jaWFsIG1hcmtldHMKICBhdXRob3I6CiAgLSBmYW1pbHk6IENhbXBiZWxsCiAgICBnaXZlbjogSm9obiBZCiAgLSBmYW1pbHk6IExvCiAgICBnaXZlbjogQW5kcmV3IFdlbi1DaHVhbgogIC0gZmFtaWx5OiBNYWNLaW5sYXkKICAgIGdpdmVuOiBBcmNoaWUgQ3JhaWcKICBwdWJsaXNoZXI6IFByaW5jZXRvbiAoTkopIFByaW5jZXRvbiBVbml2ZXJzaXR5IFByZXNzCiAgdHlwZTogYm9vawogIGlzc3VlZDoKICAgIHllYXI6IDE5OTcKLSBpZDogbW9yZXR0aW4yMDA4ZWNvbm9tZXRyaWEKICB0aXRsZTogRWNvbm9tZXRyaWEgZmluYW5jZWlyYSB1bSBjdXJzbyBlbSBzw6lyaWVzIHRlbXBvcmFpcyBmaW5hbmNlaXJhcwogIGF1dGhvcjoKICAtIGZhbWlseTogTW9yZXR0aW4KICAgIGdpdmVuOiBQZWRybyBBbGJlcnRvCiAgcHVibGlzaGVyOiBFZGdhcmQgQmx1Y2hlcgogIHR5cGU6IGJvb2sKICBpc3N1ZWQ6CiAgICB5ZWFyOiAyMDA4Cm5vY2l0ZTogfCAKICBAZW5kZXJzMjAxNWFwcGxpZWQsIEBkYTIwMTFlY29ub21ldHJpYSwgQHRzYXkyMDE0aW50cm9kdWN0aW9uLCBAY2FtcGJlbGwxOTk3ZWNvbm9tZXRyaWNzLCBAbW9yZXR0aW4yMDA4ZWNvbm9tZXRyaWEKLS0tCgpFc3RlIG1hdGVyaWFsIHRlbSBjb21vIG9iamV0aXZvIGNvbnRyaWJ1aXIgcGFyYSBvIGVudGVuZGltZW50byBzb2JyZSBzw6lyaWVzIHRlbXBvcmFpcyB1bml2YXJpYWRhcywgZm9jYW5kbyBuYXMgKipjYXJhY3RlcsOtc3RpY2FzIGRlIGRhZG9zIGZpbmFuY2Vpcm9zIGUgc3VhcyBwcm9wcmllZGFkZXMqKi4gIFBhcmEgdGFudG8sIHZhbW9zIGFuw6FsaXNhciBkb2lzIHRpcG9zIGRlIHPDqXJpZXMgdGVtcG9yYWlzIGZpbmFuY2VpcmFzOiBwcmXDp29zIGUgcmV0b3Jub3MuIFBhcmEgY2FkYSB0aXBvIGRlIHPDqXJpZSwgZXN0dWRhcmVtb3MgbyBzZWd1aW50ZToKCiogUHJlw6dvcyBkZSBhdGl2b3MgZmluYW5jZWlyb3MKICAgICogVGlwb3MgZGUgZGFkb3M6IGlndWFsbWVudGUgZXNwYcOnYWRvcyBlIGlycmVndWxhcm1lbnRlIGVzcGHDp2Fkb3MgCiAgICAqIFByb3ByaWVkYWRlcyBkYSBzw6lyaWUgdGVtcG9yYWwgZG9zIHByZcOnb3MKKiBSZXRvcm5vcyBkZSBhdGl2b3MgZmluYW5jZWlyb3MKICAgICogRm9ybWFzIGRlIGNhbGN1bGFyIG8gcmV0b3JubyBlbnRyZSBkb2lzIHBlcsOtb2RvcyBjb25zZWN1dGl2b3MgKCR0JCBlICR0LTEkKSBiZW0gY29tbyBwYXJhIHVtIGludGVydmFsbyBkZSAkayQgcGVyw61vZG9zICgkdCQgZSAkdC1rJCkuCiAgICAqIFByb3ByaWVkYWRlcyBkYSBzw6lyaWUgdGVtcG9yYWwgZG9zIHJldG9ybm9zIChmYXRvcyBlc3RpbGl6YWRvcykKICAgIApBcMOzcyBlbnRlbmRlciBvcyBwb250b3MgYWNpbWEsIGluaWNpYW1vcyBhIGRlZmluacOnw6NvIGZvcm1hbCBkZSAqKnNlcmllIHRlbXBvcmFsIHVuaXZhcmlhZGEqKiwgKipwcm9jZXNzbyBlc3RvY8Ohc3RpY28qKiBlICoqZXN0YWNpb25hcmllZGFkZSBkZSB1bSBzw6lyaWUgdGVtcG9yYWwgdW5pdmFyaWFkYSoqLiBBc3NpbSwgZW50ZW5kZXJlbW9zIG8gbW90aXZvIHBlbG8gcXVhbCBhICoqc8OpcmllIHRlbXBvcmFsIGRvcyByZXRvcm5vcyoqIMOpIHVzYWRhIG5vcyBtb2RlbG9zIGRlIHPDqXJpZXMgdGVtcG9yYWlzIHVuaXZhcmlhZGFzIGFvICoqaW52w6lzIGRhIHPDqXJpZSB0ZW1wb3JhbCBkb3MgcHJlw6dvcyoqLgoKYGBge3IsIGVjaG89RkFMU0V9CnN1cHByZXNzTWVzc2FnZXMocmVxdWlyZShxdWFudG1vZCkpCnN1cHByZXNzTWVzc2FnZXMocmVxdWlyZShEVCkpCnN1cHByZXNzTWVzc2FnZXMocmVxdWlyZShkcGx5cikpCnN1cHByZXNzTWVzc2FnZXMocmVxdWlyZShtYWdyaXR0cikpCnN1cHByZXNzTWVzc2FnZXMocmVxdWlyZShoaWdoY2hhcnRlcikpCnN1cHByZXNzTWVzc2FnZXMocmVxdWlyZShQZXJmb3JtYW5jZUFuYWx5dGljcykpCmBgYAoKPG9sPgo8bGk+IDxoND4gPGI+IFBSRcOHT1MgREUgQVRJVk9TIEZJTkFOQ0VJUk9TIDwvYj4gPC9oMj4gPC9saT4KPC9vbD4KClPDo28gZGFkb3MgcXVlIHJlcHJlc2VudGFtIG8gdmFsb3IgcGFnbyBwb3IgdW0gYXRpdm8gZmluYW5jZWlybyAoYcOnw6NvLCBvcMOnw6NvLCB0w610dWxvLCAuLi4pIGVtIHVtIGRldGVybWluYW5kbyBpbnN0YW50ZSBkbyB0ZW1wby4gRW0gZnVuw6fDo28gZGUgdGVybW9zIHbDoXJpYXMgcG9zc2liaWxpZGFkZXMgcGFyYSBhIHBlcsOtb2RpY2lkYWRlIChtaW51dG8sIGhvcmEsIGRpYSwgc2VtYW5hLCBtZXMsIHNlbWVzdHJlLCAuLi4pIGRlc3RhIHRyYW5zYcOnw6NvIMOpIHByZWNpc28gZW50ZW5kZXIgb3MgZGl2ZXJzb3MgdGlwb3MgZGUgZGFkb3MgZSBzdWFzIHByb3ByaWVkYWRlcy4KCiogKipEQURPUyBJR1VBTE1FTlRFIEVTUEHDh0FET1MqKgoKU8OjbyBhcXVlbGVzIGVtIHF1ZSBvIGludGVydmFsbyBkZSB0ZW1wbyAoJFxEZWx0YSB0JCkgZW50cmUgb2JzZXJ2YcOnw7VlcyBjb25zZWN1dGl2YXMgw6kgY29uc3RhbnRlLiBQb3IgZXhlbXBsbywgb3MgZGlhcywgc2VtYW5hcyBlIG1lc2VzLiBQYXJhIGZhY2lsaXRhciBvIGVudGVuZGltZW50bywgbW9zdHJhbW9zIGFiYWl4byB1bWEgdGFiZWxhIGNvbSBkYWRvcyBpZ3VhbG1lbnRlIGVzcGHDp2Fkb3MgcGFyYSBhIGHDp8OjbyAqKkdPT0dMKiogZGEgQWxwaGFiZXQgSW5jIChIb2xkaW5nIGRlIGVtcHJlc2FzIGRvIEdvb2dsZSkuCgpgYGB7ciwgZWNobz1GQUxTRSwgdGlkeT1UUlVFLCByZXN1bHRzPSdhc2lzJywgd2FybmluZz1GQUxTRX0KIyBFeGVtcGxvIGRlIGRhZG9zIGlndWFsbWVudGUgZXNwYcOnYWRvcwpnb29nbGVfZGF5IDwtIHF1YW50bW9kOjpnZXRTeW1ib2xzKCJHT09HTCIsIHNyYyA9ICJ5YWhvbyIsIGF1dG8uYXNzaWduPUZBTFNFLCBmcm9tID0gIjIwMTgtMDctMDIiKQpnb29nbGVfZGF5IDwtIGRhdGEudGFibGU6OmFzLmRhdGEudGFibGUocm91bmQoZ29vZ2xlX2RheSwyKSkKY29sbmFtZXMoZ29vZ2xlX2RheSkgPC0gYygiZGF0YSIsICJhYmVydHVyYSIsICJhbHRhIiwgImJhaXhhIiwgImZlY2hhbWVudG8iLCAidm9sdW1lIiwgImFqdXN0YWRvIikKRFQ6OmRhdGF0YWJsZShnb29nbGVfZGF5LCByb3duYW1lcyA9IEZBTFNFKQpgYGAKCk8gKipwcmXDp28gZGUgYWJlcnR1cmEqKiDDqSBkZXRlcm1pbmFkbyBwZWxvIGNoYW1hZG8gKipsZWlsw6NvIGRlIHByw6ktYWJlcnR1cmEqKiBxdWUgYWNvbnRlY2UgMTUgbWludXRvcyBhbnRlcyBkbyBpbsOtY2lvIGRvIHByZWfDo28gKDloOjQ1bWluKS4gTmVzdGUgbGVpbMOjbywgdG9kYXMgYXMgb3JkZW5zIGRlIGNvbXByYSBlIHZlbmRhIGRlIGHDp8O1ZXMgcXVlIGrDoSBmb3JhbSBlbnZpYWRhcyBwYXJhIGEgYm9sc2EgKGFudGVzIGRhIGFiZXJ0dXJhKSwgZW50cmFtIG5vIGxlaWzDo28uIE8gc2lzdGVtYSBkYSBib2xzYSBpZGVudGlmaWNhIGFzIGZhaXhhcyBkZSBwcmXDp29zIGNvbSBtYWlvcmVzIHZvbHVtZXMgZGUgbmVnb2NpYcOnw6NvLiBPIHByZcOnbyBxdWUgdGl2ZXIgbWFpb3IgbsO6bWVybyBkZSBjb21wcmFzIGUgdmVuZGFzIGRlIGHDp8O1ZXMsIHNlcsOhIG8gcHJlw6dvIGRlIGFiZXJ0dXJhIGRvIGF0aXZvIG5lc3RlIGRpYS4gRHVyYW50ZSBvIGxlaWzDo28gbmVuaHVtIG5lZ8OzY2lvIMOpIGZlY2hhZG8sIG1lc21vIHF1ZSBvcyB2YWxvcmVzIGRlIGNvbXByYSBlIHZlbmRhIGNvaW5jaWRhbS4gCgpBbyBmaW5hbCBkbyBsZWlsw6NvICgxMGhzIHF1ZSDDqSBvIGluw61jaW8gZG8gcHJlZ8OjbyBlbGV0csO0bmljbyksIGFzIG5lZ29jaWHDp8O1ZXMgc2VndWVtIGF0w6kgYXMgMTZoczo1NW1pbi4gTmVzdGUgaG9yw6FyaW8sIGluaWNpYS1zZSBvdXRybyBsZWlsw6NvIChjaGFtYWRvIGRlICoqY2FsbCBkZSBmZWNoYW1lbnRvKiopLiBPIHByb2Nlc3NvIMOpIHBhcmVjaWRvIGNvbSBvIGxlaWzDo28gZGUgcHLDqS1hYmVydHVyYSwgcG9yw6ltIG8gcHJlw6dvIG1haXMgbmVnb2NpYWRvIG5hIGNvbXByYSBlIG5hIHZlbmRhIGRlIHVtIGF0aXZvLCBkZXRlcm1pbmFyw6EgbyAqKnByZcOnbyBkZSBmZWNoYW1lbnRvKiogZGFxdWVsYSBhw6fDo28uCgpKw6EgbyAqKnByZcOnbyBkZSBmZWNoYW1lbnRvIGFqdXN0YWRvKiogYWNvbnRlY2UgcXVhbmRvIHVtYSBhw6fDo28sIGRlbnRybyBkZSBxdWFscXVlciBkaWEgZGUgbmVnb2NpYcOnw6NvLCB0ZW0gbyBzZXUgcHJlw6dvIGFsdGVyYWRvIHBhcmEgaW5jbHVpciBxdWFpc3F1ZXIgKipkaXN0cmlidWnDp8O1ZXMgZGUgcHJvdmVudG9zKiogcXVlIG9jb3JyZXJhbSBlbSBxdWFscXVlciBtb21lbnRvIGFudGVzIGRhIGFiZXJ0dXJhIGRvIGRpYSBzZWd1aW50ZS4gQ29tbyB1dGlsaWRhZGUgcHLDoXRpY2EsIG8gcHJlw6dvIGRlIGZlY2hhbWVudG8gYWp1c3RhZG8gw6kgdW1hIGZlcnJhbWVudGEgbXVpdG8gw7p0aWwgcGFyYSBleGFtaW5hciBvcyByZXN1bHRhZG9zIGhpc3TDs3JpY29zIGRlIHVtYSBlbXByZXNhLCBwb2lzIGVsZSBvZmVyZWNlIGFvcyBhbmFsaXN0YXMgdW1hIGltYWdlbSBwcmVjaXNhIGRvIHZhbG9yIHBhdHJpbW9uaWFsIGRhIGVtcHJlc2EgYWzDqW0gZG8gcHJlw6dvIGRlIG1lcmNhZG8uCgoqICoqREFET1MgSVJSRUdVTEFSTUVOVEUgRVNQQcOHQURPUyoqCgpTYWJlbW9zIHF1ZSBkYWRvcyBmaW5hbmNlaXJvcyBwb2RlbSBzZXIgb2JzZXJ2YWRvcyBlbSBpbnN0YW50ZXMgZGUgdGVtcG8gaXJyZWd1bGFybWVudGUgZXNwYcOnYWRvcywgY29tbyBvcyBkYWRvcyBpbnRyYWRpw6FyaW9zIGRlIGF0aXZvcyBuZWdvY2lhZG9zIGVtIGJvbHNhIGRlIHZhbG9yZXMgb3UgbWVyY2Fkb3JpYXMsIG91IHRheGFzIGRlIGPDom1iaW8uIAoKTmVzdGUgY2Fzbywgb3MgaW50ZXJ2YWxvcyBlbnRyZSBvYnNlcnZhw6fDtWVzIHPDo28gKip2YXJpw6F2ZWlzIGFsZWF0w7NyaWFzKiogZSBwb2RlbW9zIHRlciBvYnNlcnZhw6fDtWVzIGNvaW5jaWRpbmRvIG51bSBtZXNtbyBpbnN0YW50ZSBkZSB0ZW1wbyBvdSBlbSBpbnRlcnZhbG9zIGRpc3RpbnRvcy4gRXN0ZSB0aXBvIGRlIGRhZG8gw6kgY2hhbWFkbyBkZSAqKmFsdGEgZnJlcXXDqm5jaWEqKi4gCgpBYmFpeG8sIGV4ZW1wbG8gZGUgZGFkbyBpbnRyYWRpw6FyaW8gcGFyYSBhIGHDp8OjbyAqKkdPT0cqKiBkYSBbQWxwaGFiZXQgSW5jXShodHRwczovL2FiYy54eXovKSBlbSBjYWRhIG1pbnV0by4gTmVzdGUgY2FzbywgbsOjbyBjb25zZWd1aW1vcyB2aXN1YWxpemFyIGEgZXhpc3TDqm5jaWEgZGUgb2JzZXJ2YcOnw7VlcyBjb2luY2lkaW5kbyBubyBtZXNtbyBpbnN0YW50ZSBkZSB0ZW1wbyBvdSBlbSBpbnRlcnZhbG9zIGRpc3RpbnRvcyBlbSBmdW7Dp8OjbyBkbyBzaXN0ZW1hIGNvbGV0YXIgYXBlbmFzIHVtYSB0cmFuc2HDp8OjbyBwb3IgbWludXRvLCBtYXMgZXNwZXJhbW9zIHF1ZSBkdXJhbnRlIG8gZGlhIHRhbCBjYXJhY3RlcsOtc3RpY2Egc2VqYSBhcHJlc2VudGFkYSBwYXJhIGVzdGUgdGlwbyBkZSBhdGl2by4KCmBgYHtyLCBlY2hvPUZBTFNFLCByZXN1bHRzPSdhc2lzJywgd2FybmluZz1GQUxTRX0KZ29vZ2xlIDwtIHF1YW50bW9kOjpnZXRTeW1ib2xzKCJHT09HIiwgc3JjPSJhdiIsIGFwaS5rZXkgPSAiNTFVWE5IWkJITjI4MEg5UiIsIGF1dG8uYXNzaWduID0gRkFMU0UsIHdhcm5pbmdzID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICBwZXJpb2RpY2l0eSA9ICJpbnRyYWRheSIsIGludGVydmFsID0gIjFtaW4iLCBmcm9tID0gIjIwMTgtMDgtMTAiKQpnb29nbGUgPC0gZGF0YS50YWJsZTo6YXMuZGF0YS50YWJsZShyb3VuZChnb29nbGUsMikpCmNvbG5hbWVzKGdvb2dsZSkgPC0gYygiZGF0YSIsICJhYmVydHVyYSIsICJhbHRhIiwgImJhaXhhIiwgImZlY2hhbWVudG8iLCAidm9sdW1lIikKRFQ6OmRhdGF0YWJsZShnb29nbGUsIHJvd25hbWVzID0gRkFMU0UpCmBgYAoKUGFyYSBhIGRpc2NpcGxpbmEgZW0gZXN0dWRvLCB2YW1vcyB1c2FyICoqc8OpcmllcyB0ZW1wb3JhaXMgb3JpZ2luYWRhcyBwb3IgZGFkb3MgcmVndWxhcm1lbnRlIGVzcGHDp2Fkb3MqKi4gUG9yw6ltLCBleGlzdGVtIG91dHJvcyBjYW1wb3MgZGEgRWNvbm9tZXRyaWEgZGUgU8OpcmllcyBUZW1wb3JhaXMgcXVlIGNvbmNlbnRyYW0tc2UgbmEgYW7DoWxpc2UgZGUgc8OpcmllcyB0ZW1wb3JhaXMgb3JpZ2luYWRhcyBkZSBkYWRvcyBpcnJlZ3VsYXJtZW50ZSBlc3Bhw6dhZG9zLgoKCiogKipDQVJBQ1RFUsONU1RJQ0FTIERFIFPDiVJJRVMgVEVNUE9SQUlTKioKCkrDoSDDqSBiZW0gZG9jdW1lbnRhZG8gbmEgbGl0ZXJhdHVyYSBxdWUgKipzw6lyaWVzIHRlbXBvcmFpcyoqIGFwcmVzZW50YW0gY2VydGFzICoqY2FyYWN0ZXLDrXN0aWNhcyoqLCBjb21vOgoKKiB0ZW5kw6puY2lhOwoqIHNhem9uYWxpZGFkZTsKKiBwb250b3MgaW5mbHVlbnRlcyAoYXTDrXBpY29zLCB0YW1iw6ltIGNoYW1hZG9zIGRlICpvdXRsaWVycyopOwoqIGhldGVyb2NlZGFzdGljaWRhZGUgY29uZGljaW9uYWwgKHZhcmnDom5jaWEgY29uZGljaW9uYWwgbsOjbyDDqSBjb25zdGFudGUpOwoqIG7Do28tbGluZWFyaWRhZGUKCkRlIHVtIG1vZG8gZ2VyYWwsIHBvZGVtb3MgZGl6ZXIgcXVlIHVtYSBzw6lyaWUgw6kgKipuw6NvLWxpbmVhciBxdWFuZG8gcmVzcG9uZGUgZGUgbWFuZWlyYSBkaWZlcmVudGUgYSBjaG9xdWVzIGdyYW5kZXMgb3UgcGVxdWVub3MsIG91IGFpbmRhLCBhIGNob3F1ZXMgbmVnYXRpdm9zIG91IHBvc2l0aXZvcyoqLiBQb3IgZXhlbXBsbywgYSBxdWVkYSBkbyBJQk9WRVNQQSBwb2RlIG9jYXNpb25hciBtYWlvciB2b2xhdGlsaWRhZGUgbm8gbWVyY2FkbyBkbyBxdWUgYSBhbHRhLiAKCkFiYWl4bywgZXhlbXBsbyBkZSBzw6lyaWUgdGVtcG9yYWwgKGRhZG9zIGRvIHRvdGFsIGRlIHBhc3NhZ2Vpcm9zIGHDqXJlb3Mgbm9zIEVVQSBlbnRyZSAxOTQ5IGUgMTk2MCkgY29tICoqdGVuZMOqbmNpYSoqIGUgKipzYXpvbmFsaWRhZGUqKi4gCgpgYGB7ciwgZWNobz1GQUxTRSwgdGlkeT1UUlVFLCByZXN1bHRzPSdhc2lzJywgd2FybmluZyA9IEZBTFNFfQpkYXRhKEFpclBhc3NlbmdlcnMpCmhjIDwtIGhpZ2hjaGFydCh0eXBlID0gInN0b2NrIikgJT4lIAogIGhjX3RpdGxlKHRleHQgPSAiUGFzc2FnZWlyb3MgQcOpcmVvcyAvIE3DqnMiKSAlPiUgCiAgaGNfc3VidGl0bGUodGV4dCA9ICJQYXNzYWdlaXJvcyBhw6lyZW9zIG5vcyBFVUEgZW50cmUgMTk0OSBlIDE5NjAiKSAlPiUgCiAgaGNfYWRkX3NlcmllcyhBaXJQYXNzZW5nZXJzLCBpZCA9ICJ0cyIsIGNvbG9yID0gJyMwZDIzM2EnKSAlPiUKICBoY19leHBvcnRpbmcoZW5hYmxlZCA9IFRSVUUpIAogIApoYwpgYGAKCk8gZ3LDoWZpY28gYWJhaXhvIGRlY29tcMO1ZSBhIHPDqXJpZSB0ZW1wb3JhbCBkbyB0b3RhbCBkZSBwYXNzYWdlaXJvcyBhw6lyZW9zIG5vcyBFVUEgZW50cmUgMTk0OSBlIDE5NjAgZmFjaWxpdGFuZG8gYSB2aXN1YWxpemHDp8OjbyBkb3MgY29tcG9uZW50ZXMgZGUgKipzYXpvbmFsaWRhZGUqKiBlICoqdGVuZMOqbmNpYSoqLgoKYGBge3IsIGVjaG89RkFMU0UsIHRpZHk9VFJVRSwgcmVzdWx0cz0nYXNpcycsIHdhcm5pbmcgPSBGQUxTRX0KZGVjb21wIDwtIHN0bChBaXJQYXNzZW5nZXJzLCAicGVyIikKaGNoYXJ0KGRlY29tcCkgCmBgYAoKCjxvbCBzdGFydD0iMiI+CjxsaT4gPGg0PiA8Yj4gUkVUT1JOT1MgREUgQVRJVk9TIEZJTkFOQ0VJUk9TIDwvYj4gPC9oMj4gPC9saT4KPC9vbD4KCk11aXRvcyBlc3R1ZG9zIGZpbmFuY2Vpcm9zIGZhemVtIHVzbyBkZSAqKnJldG9ybm9zIGRlIGF0aXZvcyBhbyBpbnbDqXMgZG9zIHNldXMgcHJlw6dvcyoqLiBTZWd1bmRvIFtAY2FtcGJlbGwxOTk3ZWNvbm9tZXRyaWNzXSwgaXNzbyBhY29udGVjZSBwb3JxdWUgYXMgc8OpcmllcyBkZSByZXRvcm5vcyBzw6NvIG1haXMgZsOhY2VpcyBkZSBtYW51c2VhciBkbyBxdWUgYXMgc8OpcmllcyBkZSBwcmXDp29zIGVtIGZ1bsOnw6NvIGRlIHBvc3N1w61yZW0gcHJvcHJpZWRhZGVzIGVzdGF0w61zdGljYXMgbWFpcyBhdHJhbnRlcyAoY29tbyBlc3RhY2lvbmFyaWVkYWRlKS4gUG9yw6ltLCBleGlzdGVtIG11aXRhcyBmb3JtYXMgZGUgbWVuc3VyYXIgbyByZXRvcm5vIGRlIHVtIGF0aXZvLiAKCkFiYWl4bywgbW9zdHJhbW9zIGV4ZW1wbG9zIGRlIGNvbW8gb2J0ZXIgbyByZXRvcm5vIGRlIGF0aXZvcy4gUGFyYSB0YW50bywgZGVpeGUgJFBfe3R9JCBzZXIgbyBwcmXDp28gZGUgdW0gYXRpdm8gZW0gdW0gZGFkbyBwZXLDrW9kbyAkdCQuCgoqICoqUkVUT1JOTyBTSU1QTEVTKioKCkFzc3VtaW5kbyBxdWUgbyBhdGl2byBuw6NvIHBhZ2EgZGl2aWRlbmRvcywgbyByZXRvcm5vIHNpbXBsZXMgw6kgbyByZXRvcm5vIG9idGlkbyBhbyBzZSBtYW50ZXIgbyBhdGl2byBhZHF1aXJpZG8gZW0gJCh0LTEpJCBhdMOpICR0JCwgb3Ugc2VqYToKCiQkClJfe3R9PVxmcmFje1Bfe3R9fXtQX3t0LTF9fS0xID0gXGZyYWN7UF97dH0tUF97dC0xfX17UF97dC0xfX0KJCQKUGFyYSBkZW1vbnN0cmHDp8OjbywgdXNhcmVtb3MgYSB0YWJlbGEgYWJhaXhvIHF1ZSBub3MgbW9zdHJhIGRhZG9zIGRhIGHDp8OjbyBkYSAqKk1pY3Jvc29mdCBDb3Jwb3JhdGlvbioqLiBUZW1vcyBxdWUgbyByZXRvcm5vIGRlIG1hbnRlciBhIGHDp8OjbyBkZSAxMy8wMi8xOCBhdMOpIDE0LzAyLzIwMTggw6kgJFJfe3R9PTkwLjgxLzg5LjgzLTFcYXBwcm94IDAuMDEwOSQgZGUgbW9kbyBxdWUgbyByZXRvcm5vIHNpbXBsZXMgY29ycmVzcG9uZGVudGUgw6kgZGUgJDEuMDlcJSQuCgpgYGB7ciwgZWNobz1GQUxTRSwgdGlkeT1UUlVFLCByZXN1bHRzPSdhc2lzJywgd2FybmluZz1GQUxTRX0KIyBFeGVtcGxvIGRlIGRhZG9zIHBhcmEgY8OhbGN1bG8gZGUgcmV0b3JubwptaWNyb3NvZnQgPC0gcXVhbnRtb2Q6OmdldFN5bWJvbHMoIk1TRlQiLCBzcmMgPSAieWFob28iLCB3YXJuaW5ncyA9IEZBTFNFLCBhdXRvLmFzc2lnbj1GQUxTRSwgZnJvbSA9ICIyMDE4LTAyLTA3IiwgdG8gPSAiMjAxOC0wMi0xNSIpCm1pY3Jvc29mdCA8LSBkYXRhLnRhYmxlOjphcy5kYXRhLnRhYmxlKHJvdW5kKG1pY3Jvc29mdCwyKSkKY29sbmFtZXMobWljcm9zb2Z0KSA8LSBjKCJkYXRhIiwgImFiZXJ0dXJhIiwgImFsdGEiLCAiYmFpeGEiLCAiZmVjaGFtZW50byIsICJ2b2x1bWUiLCAiYWp1c3RhZG8iKQpEVDo6ZGF0YXRhYmxlKGhlYWQobWljcm9zb2Z0KSwgcm93bmFtZXMgPSBGQUxTRSkKYGBgCgpDYXNvIG8gYXRpdm8gcGFndWUgZGl2aWRlbmRvcywgbyByZXRvcm5vIHNpbXBsZXMgw6k6CgokJApSX3t0fSA9IFxmcmFje1Bfe3R9K0Rfe3R9fXtQX3t0LTF9fSAtMSAKJCQKQWzDqW0gZGlzc28sIGNhc28gbyBvYmpldGl2byBzZWphIHVtIHJldG9ybm8gYWNpbWEgZG8gYXRpdm8gbGl2cmUgZGUgcmlzY28sIG8gcmV0b3JubyBzaW1wbGVzIHNlIHRvcm5hIHVtIHJldG9ybm8gZW0gZXhjZXNzbywgY29uZm9ybWUgYWJhaXhvOgoKJCQKWl97dH0gPSBSX3t0fSAtIFJfezB0fQokJApvbmRlICRSX3swdH0kIMOpIG8gcmV0b3JubyBkbyBhdGl2byBsaXZyZSBkZSByaXNjby4gT3V0cmEgYWx0ZXJuYXRpdmEgw6kgdHJhYmFsaGFyIGNvbSBvIGxvZ2FyaXRtbyBwYXJhIG9idGVyIG8gcmV0b3JubyBlbnRyZSBkb2lzIHBlcsOtb2RvcyBzdWJzZXF1ZW50ZXMgKHBhcmEgcGVyw61vZG9zIGRpc3RhbnRlcyBvIGxvZ2FyaXRtbyBuw6NvIHNlcsOhIHVtYSBib2EgYXByb3hpbWHDp8OjbyBkbyByZWFsIHJldG9ybm8pLiBVc2FyIG8gbG9nYXJpdG1vIHN1YXZpemFyw6EgYSBzw6lyaWUgdGVtcG9yYWwgZG9zIHJldG9ybm9zLiBQYXJhIHRhbnRvLCBwb2RlbW9zIGZhemVyIHVzbyBkbyBzZWd1aW50ZToKCiQkClJfe3R9ID0gXGxue1xsZWZ0KFxmcmFje1Bfe3R9fXtQX3t0LTF9fVxyaWdodCl9ID0gXGxuKFBfe3R9KSAtIFxsbihQX3t0LTF9KQokJAoKTm8gZ3LDoWZpY28gYWJhaXhvLCBjb21wYXJhbW9zIGEgZGlmZXJlbsOnYSBlbnRyZSB1c2FyIG8gcmV0b3JubyBzaW1wbGVzIChlbSBhenVsKSBlIG8gcmV0b3JubyBlbSBsb2dhcml0bW8gKGVtIHZlcm1lbGhvKSBwYXJhIGdlcmFyIGEgc8OpcmllIHRlbXBvcmFsIGRvIHJldG9ybm8gZGEgYcOnw6NvIElCTSAobnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzKSBlbnRyZSAwMS8wMS8yMDAwIGUgMTYvMDIvMjAxOC4KCmBgYHtyLCBlY2hvPUZBTFNFLCB0aWR5PVRSVUUsIHJlc3VsdHM9J2FzaXMnLCB3YXJuaW5nID0gRkFMU0V9CmlibSA8LSBnZXRTeW1ib2xzKCJJQk0iLCBzcmMgPSAieWFob28iLCB3YXJuaW5ncyA9IEZBTFNFLCBmcm9tPSIyMDAwLTAxLTAxIiwgdG89IjIwMTgtMDItMTYiKQpsb2cgPC0gUGVyZm9ybWFuY2VBbmFseXRpY3M6OlJldHVybi5jYWxjdWxhdGUoSUJNWyw0XSwgbWV0aG9kID0gImxvZyIpCmRpc2NyZXRvIDwtIFBlcmZvcm1hbmNlQW5hbHl0aWNzOjpSZXR1cm4uY2FsY3VsYXRlKElCTVssNF0sIG1ldGhvZCA9ICJkaXNjcmV0ZSIpCgpoYzAgPC0gaGlnaGNoYXJ0KHR5cGUgPSAic3RvY2siKSAlPiUgCiAgaGNfdGl0bGUodGV4dCA9ICJDb21wYXJhw6fDo28gZW50cmUgcmV0b3JubyBkaXNjcmV0byBlIGVtIGxvZyBkYSBJQk0iKSAlPiUgCiAgaGNfc3VidGl0bGUodGV4dCA9ICJEYWRvcyBleHRyYcOtZG9zIHVzYW5kbyBvIHBhY290ZSBxdWFudG1vZCBkbyBSIikgJT4lIAogIGhjX2FkZF9zZXJpZXMobmFtZSA9ICJsb2dhcml0bW8iLCBsb2csIGlkID0gInRzIiwgY29sb3IgPSAicmVkIikgJT4lCiAgaGNfYWRkX3NlcmllcyhuYW1lID0gImRpc2NyZXRvIiwgZGlzY3JldG8sIGlkID0gInRzIiwgY29sb3IgPSAiYmx1ZSIpICU+JQogIGhjX2V4cG9ydGluZyhlbmFibGVkID0gVFJVRSkKCgpoYzAKCmBgYAoKCiogKipSRVRPUk5PIFNJTVBMRVMgRU5UUkUgTVVMVElQRVLDjU9ET1MqKgoKU3Vwb25oYSBhZ29yYSBxdWUgbyBhdGl2byDDqSBtYW50aWRvIHBvciAkayQgcGVyw61vZG9zIGVudHJlIGFzIGRhdGFzICR0LWskIGUgJHQkLiBEZXN0YSBmb3JtYSwgbyByZXRvcm5vIGJydXRvIHNpbXBsZXMgbm9zICoqayoqIHBlcsOtb2RvcyBzZXLDoToKCiQkCjErUl97dH1ba109XGZyYWN7UF97dH19e1Bfe3Qta319PVxmcmFje1Bfe3R9fXtQX3t0LTF9fVx0aW1lcyBcZnJhY3tQX3t0LTF9fXtQX3t0LTJ9fVx0aW1lcyAuLi5cdGltZXMgXGZyYWN7UF97dC1rKzF9fXtQX3t0LWt9fQokJAoKQXNzaW0sIG8gcmV0b3JubyBzaW1wbGVzIGVtICoqayoqIHBlcsOtb2RvcyDDqSBhcGVuYXMgbyBwcm9kdXRvIGRvcyByZXRvcm5vcyBzaW1wbGVzIHBhcmEgb3MgKiprKiogcGVyw61vZG9zIGVudm9sdmlkb3MuIEFsw6ltIGRpc3NvLCBvIHJldG9ybm8gbMOtcXVpZG8gbm9zICoqayoqIHBlcsOtb2RvcyBzZXLDoSAkUl97dH1ba109XGZyYWN7UF97dH19e1Bfe3Qta319LTE9XGZyYWN7UF97dH0tUF97dC1rfX17UF97dC1rfX0kLgoKUGFyYSBpbHVzdHJhciwgY29uc2lkZXJlIG5vdmFtZW50ZSBvcyBkYWRvcyBkYSBhw6fDo28gZGEgKipNaWNyb3NvZnQgQ29ycG9yYXRpb24qKiBkYSB0YWJlbGEgYW50ZXJpb3IuIFNlIGF2YWxpYXJtb3MgZGUgMTIvMDIvMjAxOCBhdMOpIDE0LzAyLzIwMTggdGVtb3MgcXVlIG8gcmV0b3JubyBubyBwZXLDrW9kbyBmb2kgZGUgJDErUl97dH1bM10gPSA5MC44MS84OS4xMyBcYXBwcm94IDEsMDE4ODQkIGRlIG1vZG8gcXVlIG8gcmV0b3JubyBzaW1wbGVzIG5vIHBlcsOtb2RvIGZvaSBkZSAkMS44ODRcJSQuCgoqICoqQ0FSQUNURVLDjVNUSUNBUyBEQSBTw4lSSUUgVEVNUE9SQUwgRE9TIFJFVE9STk9TIChGQVRPUyBFU1RJTElaQURPUykqKgoKT3MgKipyZXRvcm5vcyBmaW5hbmNlaXJvcyoqIGFwcmVzZW50YW0gKipjYXJhY3RlcsOtc3RpY2FzIHBlY3VsaWFyZXMqKiBkaWZlcmVudGVtZW50ZSBkZSBtdWl0YXMgc8OpcmllcyB0ZW1wb3JhaXMuIFJldG9ybm9zICoqcmFyYW1lbnRlIGFwcmVzZW50YW0gdGVuZMOqbmNpYXMgb3Ugc2F6b25hbGlkYWRlcyoqLCBjb20gZXhjZcOnw6NvIGV2ZW50dWFsbWVudGUgZGUgcmV0b3Jub3MgaW50cmFkacOhcmlvcy4gQWzDqW0gZGlzc28sIHPDqXJpZXMgZGUgdGF4YXMgZGUgY8OibWJpbyBlIHPDqXJpZXMgZGUgdGF4YXMgZGUganVyb3MgcG9kZW0gYXByZXNlbnRhciB0ZW5kw6puY2lhcyBxdWUgdmFyaWFtIG5vIHRlbXBvLiBQb3Igb3V0cm8gbGFkbywgw6kgY29tdW1lbnRlIGVuY29udHJhZG8gZW0gc8OpcmllcyBkZSByZXRvcm5vcyBhcyBzZWd1aW50ZXMgY2FyYWN0ZXLDrXN0aWNhczoKCiogZXN0YWNpb25hcmllZGFkZTogYXMgcHJvcHJpZWRhZGVzIGVzdGF0w61zdGljYXMgZGFzIHPDqXJpZXMgc8OjbyBpbnZhcmlhbnRlcyBhbyBsb25nbyBkbyB0ZW1wbzsKKiBmcmFjYSBkZXBlbmTDqm5jaWEgbGluZWFyIGUgbsOjbyBsaW5lYXI6IGEgc8OpcmllIG5vcm1hbG1lbnRlIMOpIHBvdWNvIG91IG7Do28gYXV0b2NvcnJlbGFjaW9uYWRhLCBtYXMgYSBzw6lyaWUgZG8gcXVhZHJhZG8gZG9zIHJldG9ybm9zIMOpIGF1dG9jb3JyZWxhY2lvbmFkYSAoaXN0byBpbXBsaWNhIHF1ZSBpbmRlcGVuZGVudGUgZGUgcXVhbmRvIG9jb3JyZXIgdW0gZ3JhbmRlIHJldG9ybm8gZW0gdmFsb3IgYWJzb2x1dG8sIGV4aXN0ZSB1bWEgYm9hIGNoYW5jZSBkbyBwcsOzeGltbyByZXRvcm5vIHRhbWLDqW0gc2VyIGdyYW5kZSBlbSB2YWxvciBhYnNvbHV0byk7CiogY2F1ZGFzIHBlc2FkYXMgbmEgZGlzdHJpYnVpw6fDo28gZSBleGNlc3NvIGRlIGN1cnRvc2U6IGEgc8OpcmllIGRvcyByZXRvcm5vcyBnZXJhbG1lbnRlIG7Do28gw6kgR2F1c3NpYW5hIChkaXN0cmlidWnDp8OjbyBOb3JtYWwpLCBvIHF1ZSBlc3TDoSBpbnRlcmxpZ2FkbyBhbyBmYXRvIGRvcyByZXRvcm5vcyBhbyBxdWFkcmFkYWRvIHNlcmVtIGF1dG9jb3JyZWxhY2lvbmFkb3MgCiogY29tcG9ydGFtZW50byBoZXRlcm9jZWTDoXN0aWNvIGNvbmRpY2lvbmFsLgoKTyBjb21wb3J0YW1lbnRvIGhldGVyb2NlZMOhc3RpY28gcmXDum5lIGNhcmFjdGVyw61zdGljYXMgY29tbyAqKmFnbG9tZXJhZG9zIGRlIHZvbGF0aWxpZGFkZSoqIGUgZWZlaXRvcyBhbGF2YW5jYSwgcXVlIGFwb250YSBwYXJhIG8gZWZlaXRvIGRlIGNob3F1ZS4gKipDaG9xdWVzIG5lZ2F0aXZvcyBub3JtYWxtZW50ZSBhZmV0YW0gYSB2b2xhdGlsaWRhZGUgY29uZGljaW9uYWwgZW0gbWFpb3IgbWFnbml0dWRlIGRvIHF1ZSBjaG9xdWVzIHBvc2l0aXZvcyoqLCBvdSBzZWphLCB1bWEgcXVlZGEgbm8gcmV0b3JubyBpbXBsaWNhIHVtYSB2b2xhdGlsaWRhZGUgY29uZGljaW9uYWwgYWx0YS4KClZhbW9zIGFuYWxpc2FyIGEgc8OpcmllIHRlbXBvcmFsIGRvICBTdGFuZGFyZCAmIFBvb3IncyA1MDAuIFRlbW9zIGRvaXMgZ3LDoWZpY29zIHNlbmRvIG8gcHJpbWVpcm8gbyBmZWNoYW1lbnRvIGRvIHByZcOnbyBkYSDDrW5kaWNlIHBhcmEgdG9kb3Mgb3MgZGlhcyBjb20gbmVnb2NpYcOnw6NvIGVudHJlIDAxLzAxLzIwMDAgZSAxNi8wMi8yMDE4IGVucXVhbnRvIG5vIHNlZ3VuZG8gYXByZXNlbnRhbW9zIG8gcmV0b3JubyBzaW1wbGVzIG9idGlkbyBjb25mb3JtZSBtZXRvZG9sb2xnaWEgZXhwb3N0YSBhbnRlcmlvcm1lbnRlLiAKCgpgYGB7ciwgZWNobz1GQUxTRSwgdGlkeT1UUlVFLCByZXN1bHRzPSdhc2lzJywgd2FybmluZyA9IEZBTFNFfQpzcCA8LSBnZXRTeW1ib2xzKCJeR1NQQyIsIHNyYyA9ICJ5YWhvbyIsIHdhcm5pbmdzID0gRkFMU0UsIGZyb209IjIwMDAtMDEtMDEiLCB0bz0iMjAxOC0wMi0xNiIpCmhjMSA8LSBoaWdoY2hhcnQodHlwZSA9ICJzdG9jayIpICU+JSAKICBoY190aXRsZSh0ZXh0ID0gIkZlY2hhbWVudG8gUyZQIDUwMCIpICU+JSAKICBoY19zdWJ0aXRsZSh0ZXh0ID0gIkRhZG9zIGV4dHJhw61kb3MgdXNhbmRvIG8gcGFjb3RlIHF1YW50bW9kIGRvIFIiKSAlPiUgCiAgaGNfYWRkX3NlcmllcyhHU1BDWyw0XSwgaWQgPSAidHMiKSAlPiUKICBoY19leHBvcnRpbmcoZW5hYmxlZCA9IFRSVUUpCiAgCmhjMQoKYGBgCgpOb3RhbW9zIHF1ZSBvcyBmYXRvcyBlc3RpbGl6YWRvcyBhcG9udGFkb3MgYW50ZXJpb3JtZW50ZSBlc3TDo28gcHJlc2VudGVzIG5hIHPDqXJpZSBkZSByZXRvcm5vcyBkbyAqKlMmUCA1MDAqKiBkYWRvIHF1ZSBow6EgYXBhcmVudGUgZXN0YWNpb25hcmllZGFkZSwgbcOpZGlhIGFvIHJlZG9yIGRlIHplcm8gZSBhZ3J1cGFtZW50b3MgZGUgdm9sYXRpbGlkYWRlLiBQZXLDrW9kb3MgZGUgYWx0YSB2b2xhdGlsaWRhZGUgY29pbmNpZGVtIGNvbSDDqXBvY2FzIG5hcyBxdWFpcyBvY29ycmVyYW0gY3Jpc2VzIGVtIGRpdmVyc29zIHBhw61zZXMgcXVlIGluZmx1ZW5jaWFyYW0gbyBtZXJjYWRvIGZpbmFuY2Vpcm8uIAoKYGBge3IsIGVjaG89RkFMU0UsIHRpZHk9VFJVRSwgcmVzdWx0cz0nYXNpcycsIHdhcm5pbmcgPSBGQUxTRX0KcmV0b3JubyA8LSBQZXJmb3JtYW5jZUFuYWx5dGljczo6UmV0dXJuLmNhbGN1bGF0ZShHU1BDWyw0XSkKaGMyIDwtIGhpZ2hjaGFydCh0eXBlID0gInN0b2NrIikgJT4lIAogIGhjX3RpdGxlKHRleHQgPSAiUmV0b3JubyBTJlAgNTAwIikgJT4lIAogIGhjX3N1YnRpdGxlKHRleHQgPSAiRGFkb3MgZXh0cmHDrWRvcyB1c2FuZG8gbyBwYWNvdGUgcXVhbnRtb2QgZG8gUiIpICU+JSAKICBoY19hZGRfc2VyaWVzKHJldG9ybm8sIGlkID0gInRzIiwgY29sb3IgPSAnIzBkMjMzYScpICU+JQogIGhjX2V4cG9ydGluZyhlbmFibGVkID0gVFJVRSkKCmhjMgoKYGBgCgo8b2wgc3RhcnQ9IjMiPgo8bGk+IDxoND4gPGI+IERFRklOScOHw4NPIERFIFPDiVJJRSBURU1QT1JBTCBFIFNVQSBSRUxBw4fDg08gQ09NIFBST0NFU1NPIEVTVE9Dw4FTVElDTyA8L2I+IDwvaDI+IDwvbGk+Cjwvb2w+CgpVbWEgc8OpcmllIHRlbXBvcmFsIMOpIHVtYSBzZXF1w6puY2lhIGRlIG9ic2VydmHDp8O1ZXMgJHtce3t5fV97dH1cfX0kIGluZGV4YWRhcyBwZWxhIGRhdGEgZGUgY2FkYSBvYnNlcnZhw6fDo28gKG1pbnV0bywgaG9yYSwgZGlhLCBzZW1hbmEsIG3DqnMsIHRyaW1lc3RyZSwgc2VtZXN0cmUsIGFubywgLi4uKS4KCgokJAp7XHt7eX1fe3R9XH19X3t0PS1caW5mdHl9XntcaW5mdHl9PVx7Li4uLHt5fV97dC0xfSx7eX1fezB9LHt5fV97MX0se3l9X3syfSwuLi4se3l9X3t0fSwuLi5cfSAKJCQKCiAgICogQ2FkYSBvYnNlcnZhw6fDo28gw6kgdHJhdGFkYSBjb21vIHVtYSB2YXJpw6F2ZWwgYWxlYXTDs3JpYSBjb20gdW1hIGRpc3RyaWJ1acOnw6NvIGRlIHByb2JhYmlsaWRhZGU7CiAgICogVW1hIGNvbGXDp8OjbyBkZSB2YXJpw6F2ZWlzIGFsZWF0w7NyaWFzIG9yZGVuYWRhcyBubyB0ZW1wbyDDqSBjaGFtYWRhIGRlICoqcHJvY2Vzc28gZXN0b2PDoXN0aWNvKio7CiAgICogKipIaXDDs3Rlc2U6KiogU2UgYSBkaXN0cmlidWnDp8OjbyBkZSAkeV97dH0kIMOpIGEgbWVzbWEgcGFyYSB0b2RvcyBvcyB2YWxvcmVzIGRlICR0JCwgZW50w6NvIGRpemVtb3MgcXVlIGEgc8OpcmllIMOpIGVzdGFjaW9uw6FyaWEuIEVzdGEgw6kgYSBkZWZpbmnDp8OjbyBkZSAqKmVzdGFjaW9uYXJpZWRhZGUgZm9ydGUqKi4gCgoKPG9sIHN0YXJ0PSI0Ij4KPGxpPiA8aDQ+IDxiPiBERUZJTknDh8ODTyBERSBFU1RBQ0lPTkFSSUVEQURFIDwvYj4gPC9oMj4gPC9saT4KPC9vbD4KClVtYSBzw6lyaWUgdGVtcG9yYWwgw6kgZGl0YSBlc3RhY2lvbsOhcmlhIHNlIGVsYSBzZSBkZXNlbnZvbHZlIG5vIHRlbXBvIGFsZWF0b3JpYW1lbnRlIGFvIHJlZG9yIGRlIHVtYSBtw6lkaWEgY29uc3RhbnRlLCByZWZsZXRpbmRvIGFsZ3VtYSBmb3JtYSBkZSBlcXVpbMOtYnJpbyBlc3TDoXZlbC4gRm9ybWFsbWVudGUsIHRlbW9zIHF1ZSB1bWEgc8OpcmllIHRlbXBvcmFsIGRlIHJldG9ybm9zIGRlIHVtIGF0aXZvIGZpbmFuY2Vpcm8gc2Vyw6EgZnJhY2FtZW50ZSBlc3RhY2lvbsOhcmlhIHNlOgoKICAgKiAkRVtyX3t0fV09XG11JCwgCiAgICogJFZhcihyX3t0fSkgPSBcZ2FtbWFfezB9JCAKICAgKiAkQ292KHJfe3R9LHJfe3QtbH0pPVxnYW1tYV97bH0kIAoKb25kZSAkXG11JCBlICRcZ2FtbWFfezB9JCBzw6NvIGNvbnN0YW50ZXMgZSAkXGdhbW1hX3tsfSQgw6kgZnVuw6fDo28gZGUgdW1hIGRlZmFzYWdlbSAkbCQgcXVhbHF1ZXIsIG1hcyBuw6NvIGRvIHRlbXBvICR0JC4gQWJhaXhvLCBwYXJhIGNhZGEgY29uZGnDp8OjbyBhcHJlc2VudGFkYSB1bSBncsOhZmljbyBjb20gc8OpcmllcyBxdWUgYXRlbmRlbSBlIHF1ZSB2aW9sYW0gdGFpcyBjb25kacOnw7Vlcy4KCiAgICogTcOpZGlhOgo8cCBhbGlnbj0iY2VudGVyIj4KIVtBbHQgdGV4dF0oLi4vLi4vLi4vZmlndXJlcy9NZWFuX25vbnN0YXRpb25hcnkucG5nKQo8L3A+CgogICAqIFZhcmnDom5jaWE6CjxwIGFsaWduPSJjZW50ZXIiPgohW0FsdCB0ZXh0XSguLi8uLi8uLi9maWd1cmVzL1Zhcl9ub25zdGF0aW9uYXJ5LnBuZykKPC9wPgoKICAgKiBDb3ZhcmnDom5jaWE6CjxwIGFsaWduPSJjZW50ZXIiPgohW0FsdCB0ZXh0XSguLi8uLi8uLi9maWd1cmVzL0Nvdl9ub25zdGF0aW9uYXJ5LnBuZykKPC9wPgoKIyMjIyAqKlJFRkVSw4pOQ0lBUyoq