Este material tem como objetivo contribuir para o entendimento sobre processos não estacionários e sem sazonalidade. Para tanto, vamos mostrar como realizar testes estatísticos para verificar a estacionariedade de uma série temporal e o impacto de não estacionariedade nos modelos ARMA estudados anteriormente.
INTRODUÇÃO
Até o momento, focamos sobre a série dos retornos que em função de oscilar em um intervalo quase sempre controlado (-1 a 1) tende a ser estacionária. Porém, em alguns estudos temos interesse na avaliação de outras séries temporais (taxa de juros, câmbio, inflação, crescimento econômico).
Estas séries tendem a ser não estacionárias, pois não oscilam em torno de uma média e com variância constante. Na literatura de séries temporais, chamamos tais séries de séries com raiz unitária. Um bom exemplo de série com raiz unitária é o passeio aleatório e abaixo, mostramos algumas propriedades desta série temporal.
PASSEIO ALEATÓRIO
Uma série temporal \({\left\{{p}_{t}\right\}}_{t=1}^{T}\) é um passeio aleatório se ela satisfaz:
\[
p_{t}=p_{t-1}+a_{t}
\] onde podemos fazer \(p_0\) um número real denotando o valor inicial do processo e \(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).
Se assumimos que \(p_{t}\) é o logaritmo do preço de uma ação em \(t\), então \(p_{0}\) seria o logaritmo do preço inicial da ação em um IPO (initial public offering). Se \(a_{t}\) tem uma distribuição simétrica em torno de \(0\) como a Normal, então condicionado a \(p_{t-1}\), \(p_{t}\) tem 50% de chances de subir ou descer, implicando que \(p_t\) deveria subir ou descer aleatóriamente.
Se tratarmos um passeio aleatório como um caso especial de AR(1) quando não temos intercepto, então o coeficiente de \(p_{t-1}\) é igual a \(1\), que não satisfaz a condição de estacionariedade fraca (\(\left| {\phi}_{1} \right| < 1\)) mostrada anteriormente para o modelo AR(1). Assim, o passeio aleatório é não estacionário e é chamado de série temporal com raiz unitária. Abaixo, exemplo de como simular um passeio aleatório no R.
#######################################
#### SIMULAÇÃO PASSEIO ALEATÓRIO #####
#######################################
# Fixar a raíz para que a simulação gere os mesmos dados em qualquer computador
set.seed(123)
# Simulação de um passeio aleatório
n <- 1000
p0 <- 10
phi1 <- 1
pt <- rep(p0,n)
for (i in 1:(n-1)) {
pt[i+1] <- phi1*pt[i] + rnorm(1)
}
# Visualização do passeio aleatório.
plot(pt, type = "l", xlab = "observações", ylab = "preço", main = "Simulação Passeio Aleatório")

Observe no gráfico que o passeio aleatório iniciou em 10 (valor definido como phi0
na simulação) e após isso oscilou, condicionado ao valor anterior, em função de um número aleatório obtido a partir de uma distribuição Normal com média zero e variância 1 (definido como rnorm(1)
na simulação).
Caso uma série temporal de preços de um ativo financeiro (logaritmo dos preços) se comporte como um passeio aleatório, teremos que o preço de uma ação não é predizível. Para ver isto, vamos fazer a previsão um passo à frente do modelo:
\[
\begin{split}
p_{t+1} &= p_{t+1-1}+a_{t+1} \\
& \\
& = p_{t}+a_{t+1} \\
& \\
E\left[p_{t+1}|p_{t},p_{t-1},...\right] &= E\left[p_{t}\right] + E\left[a_{t+1}\right] \\
& \\
&= p_{t} + 0 \\
& \\
&= p_{t}
\end{split}
\]
que é o logaritmo do preço da ação na origem. Esta previsão não tem valor prático. A previsão dois passos à frente seria:
\[
\begin{split}
p_{t+2} &= p_{t+2-1}+a_{t+2} \\
& \\
& = p_{t+1}+a_{t+2} \\
& \\
E\left[p_{t+2}|p_{t+1},p_{t},p_{t-1},...\right] &= E\left[p_{t+1}|p_{t},p_{t-1},...\right] + E\left[a_{t+2}\right] \\
& \\
&= p_{t} + 0 \\
& \\
&= p_{t}
\end{split}
\]
que novamente é o logaritmo do preço na origem da previsão. De fato, para qualquer horizonte de previsão \(l>0\), temos:
\[
E\left[p_{t+l}|p_{t+l-1},...\right] = {p}_{t}
\] Assim, para todos os horizontes de previsão, o valor previsto de um passeio aleatório é simplesmente o valor da série na origem da previsão (temos como origem a última observação antes de se iniciar a previsão, ou seja, o último preço sempre seria a melhor previsão para qualquer horizonte de previsão).
PASSEIO ALEATÓRIO COM DRIFT
Como vimos em alguns exemplos, é possível que uma série temporal tenha um valor médio diferente de zero. Isto implica que o modelo para o logaritmo dos preços (hipoteticamente, pois não esperamos retornos diferente de zero em média) é:
\[
p_{t} = \mu + p_{t-1} + a_{t}
\] onde \(\mu=E[p_{t}-p_{t-1}]\) e \(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).
O termo de constante \(\mu\) do modelo é muito importante em finanças. Ele representa a tendência temporal do logaritmo dos preços (\(p_{t}\)) e é frequentemente chamado de drift do modelo. Para ver isto, assuma que temos o valor do logaritmo inicial do preço que é representado por \(p_0\). Então,
\[
p_1=\mu + p_{0} + a_{t}
\]
\[
p_2=\mu + p_{1} + a_{2} = 2\mu + p_{0} + a_{2} + a_{1}
\] \[
...........................................
\] \[
p_t=t\mu + p_{0} + a_{t} + a_{t-1} + ...+ a_{1}
\]
A última equação mostra que o logaritmo do preço consite de uma tendência temporal (\(t\mu\)) e um passeio aleatório (\(\sum_{i=1}^{t}{{a}_{i}}\)). Em função de \(VAR(\sum_{i=1}^{t}{{a}_{i}})=t\sigma_{a}^{2}\), onde \(\sigma_{a}^{2}\) é a variância de \(a_{t}\), o desvio padrão condicional de \(p_{t}\) é \(\sqrt{t\sigma_{a}}\), que cresce a uma taxa mais lenta do que o valor esperado \(E[p_t]= p_0+\mu t\). Portanto, se desenharmos um gráfico de \(p_{t}\) contra \(t\), teremos uma tendência temporal com inclinação \(\mu\). Uma inclinação positiva, ou seja, \(\mu>0\), indica que o logaritmo dos preços eventualmente tenderá ao infinito. Em contrapartida, se \(\mu<0\) o logaritmo dos preços tenderá a \(-\infty\) na medida que \(t\) aumentar.
Abaixo, código em R que mostra como simular um passeio aleatório com drift:
##################################################
#### SIMULAÇÃO PASSEIO ALEATÓRIO COM DRIFT #####
##################################################
# Simulação de um passeio aleatório com drift (pt = mi + phi1*pt-1 + at)
n <- 1000
p0 <- 10
mi <- 0.2
phi1 <- 1
pt_drift <- rep(p0,n)
for (i in 1:(n-1)) {
pt_drift[i+1] <- mi + phi1*pt_drift[i] + rnorm(1)
}
# Visualização do passeio aleatório com drift
plot(pt_drift, type = "l", xlab = "observações", ylab = "preço", main = "Simulação Passeio Aleatório com Drift")

Observe que se você alterar o valor de mi
para um número positivo ou negativo e visualizar a série, perceberá que tal parâmetro mudará a direção da curva (para baixo, se negativo e para cima, se positivo). Além disso, se você alterar o valor de phi1
para um valor menor que 1 e visualizar os dados terá uma série estacionária, como esperado (lembre da restrição sobre tal parâmetro na derivação do modelo AR).
TESTE DE RAIZ UNITÁRIA
Para testar se o logaritmo dos preços (\(p_t\)) de um ativo financeiro segue um passeio aleatório, um passeio aleatório com drift ou passeio aleatório com drift e tendência determinística, usamos os modelos abaixo:
\[
p_{t}=\phi_{1}p_{t-1} + \epsilon_{t}
\]
\[
p_{t}= \mu + \phi_{1}p_{t-1} + \epsilon_{t}
\]
\[
p_{t}=\mu + \gamma t + \phi_{1}p_{t-1} + \epsilon_{t}
\]
onde \(\epsilon_{t}\) denota o termo de erro. Observe que se \({\phi}_{1}=1\) em ambas as equações, teremos um passeio aleatório no primeiro caso, um passeio aleatório com drift no segundo caso e um passeio aleatório com drift e tendência determinística no terceiro caso. Observe a semelhança dessas equações do teste com as equações dos passeios aleatórios mostradas anteriormente.
Assim, testar se a série temporal tem raiz unitário (se ela não é estacionária) consiste em testar a hipótese nula (não estacionariedade) \({H}_{0}:{\phi}_{1}=1\) contra a hipótese alternativa (estacionariedade) \({H}_{1}:{\phi}_{1}<1\). Este teste foi proposto por Dickey and Fuller (1979) e é conhecido como Dickey-Fuller. A partir da estimação das equações acima por meio de MQO, usa-se um teste convencional de \(t\) sobre \(\phi_{1}\).
Para a primeira equação (\(p_{t}=\phi_{1}p_{t-1} + \epsilon_{t}\)) MQO gera os seguintes estimadores:
\[
{\hat{\phi}}_{1}=\frac{\sum_{t=1}^{T}{{p}_{t-1}{p}_{t}}}{\sum_{t=1}^{T}{{p}_{t-1}^{2}}}
\]
\[
{\hat{\sigma}}_{\epsilon}^{2}=\frac{\sum_{t=1}^{T}{{\left({p}_{t}-{\hat{\phi}}_{1}{p}_{t-1} \right)}^{2}}}{T-1}
\]
onde \(p_{0}=0\) e \(T\) é o tamanho da amostra. A estatística do teste será:
\[
DF = \frac{\hat{\phi}_{1}}{std(\hat{\phi}_{1})} = \frac{\sum_{t=1}^{T}{{p}_{t-1}{\epsilon}_{t}}}{\hat{\sigma}_{\epsilon}\sum_{t=1}^{T}{{p}_{t-1}^{2}}}
\]
- TESTE DE DICKEY-FULLER: OUTRA FORMULAÇÃO
Subtraindo \(p_{t-1}\) nas equações do teste, temos:
\[
p_{t}=\phi_{1}p_{t-1} + \epsilon_{t} \Rightarrow p_t - p_{t-1} = \phi_{1}p_{t-1} - p_{t-1} + \epsilon_{t} \Rightarrow \Delta p_{t} = \beta p_{t-1} + \epsilon_{t}
\]
\[
p_{t}= \mu + \phi_{1}p_{t-1} + \epsilon_{t} \Rightarrow p_{t} - p_{t-1} = \mu + \phi_{1}p_{t-1} - p_{t-1} + \epsilon_{t} \Rightarrow \Delta p_{t} = \mu + \beta p_{t-1} + \epsilon_{t}
\]
\[
p_{t}=\mu + \gamma t + \phi_{1}p_{t-1} + \epsilon_{t} \Rightarrow p_{t}-p_{t-1}=\mu + \gamma t + \phi_{1}p_{t-1} - p_{t-1} + \epsilon_{t} \Rightarrow \Delta p_{t} = \mu + \gamma t + \beta p_{t-1} + \epsilon_{t}
\]
Assim, testar \(\phi_{1}=1\) como apresentado anteriormente é o mesmo que testar \(\beta=0\) para a formulação nova do teste.
- TESTE DE DICKEY-FULLER AUMENTADO
O problema do teste anterior é que Dickey and Fuller (1979) consideraram o erro um ruído branco. Porém, frequentemente, o erro é um processo estacionário qualquer. Esse problema pode causar distorções no poder do teste. Além disso, muitas séries temporais econômicas podem seguir processos \(ARIMA(p,d,q)\).
Suponha que \(p_{t}\) seja um processo autorregressivo de ordem \(p\), AR(p).
\[
p_{t}=\mu + \phi_{1}p_{t-1} + ... +\phi_{p-1}p_{t-p+1}+ \phi_{p}p_{t-p} + \epsilon_{t}
\]
Para verificar a existência de raiz unitária nesse processo, pode-se performar o teste \(H_{0}: \beta=0\) (não estacionariedade) contra \(H_{a}: \beta < 0\) (estacionariedade), usando a regressão:
\[
\Delta p_{t}=\mu + \beta p_{t-1} + \sum_{i=1}^{p-1}{\phi_{i}\Delta p_{t-i}+ \epsilon_{t}}
\] onde \(\mu\) é uma função determinística do tempo \(t\) e \(\Delta p_{t-i}=p_{j}-p_{j-1}\) é a série diferenciada. Na prática, \(\mu\) pode ser \(0\), uma constante ou \(\mu+\gamma t\). A estatística do teste será:
\[
ADF-test=\frac{\hat{\beta}}{std(\hat{\beta})}
\] onde \(\hat{\beta}\) denotando a estimativa de mínimos quadrados de \(\beta\) é o conhecido teste de raíz unitária de Dicker-Fullher aumentado.
MODELOS ARIMA
Considere um modelo ARMA. Se permitirmos que o componente AR tenha uma raiz unitária, então o modelo se torna um modelo autorregressivo integrado de média móvel (ARIMA). Lembre-se que anteriormente mostramos que a componente MA é sempre estacionária e por isso apenas o componente AR pode ter uma raiz unitária.
Uma série temporal \(y_{t}\) é um processo ARIMA(p,1,q) se a série das diferenças (\(c_{t}=y_{t}-y_{t-1}\)) segue um modelo ARMA(p,q) estacionário.
A ideia de transformar uma série não estacionária em estacionária por considerar suas diferenças é chamado de diferenciação na literatura de séries temporais. Mais formalmente, \(c_{t}=y_{t}-y_{t-1}\) é chamado de primeira diferença da série \(y_{t}\). Em alguns casos pode ser preciso diferenciar a séries várias vezes para torná-la estacionária. Por exemplo, se tanto \(y_{t}\) quanto sua primeira diferença são não estacionárias, mas \(s_{t}=c_{t}-c_{t-1}=y_{t}-2y_{t-1}+y_{t-2}\) apresenta estacionariedade fraca, então \(y_{t}\) tem duas raízes unitárias e \(s_{t}\) é a série da segunda diferença de \(y_{t}\). Assim, se \(s_{t}\) segue um modelo ARMA(p,q) então \(y_{t}\) é um modelo ARMA(p,2,q).
Como exemplo, para os passeios aleatórios simulados anteriormente, observe que uma simples diferenciação de primeira ordem nos dados torna a série aparantemente estacionária.

Em finanças e conforme mostramos anteriormente, os preços de ativos financeiros comumente são não estacionários, mas o logaritmo dos retornos ou o retorno simples é estacionário.
O gráfico da função de autocorrelação (FAC) pode ser útil para identificar séries temporais não estacionárias. Para uma série temporal estacionária, o gráfico da FAC mostrará um decaimento para \(0\) relativamente rápido enquanto para uma série não estacionária o decaimento será lento. Além disso, a primeira defasagem da FAC é grande e estatísticamente significativo para séries não estacionárias. Abaixo, os dois gráficos da FAC para as séries de preço e retorno da ação da Microsoft.


Assim, temos que a série dos preços da ação MSFT (Microsoft) se comporta como um processo não estacionário enquanto os retornos desta ação apresentam uma FAC com maior probabilidade de ser proveniente de um processo estacionário.
PROCESSO DE ESTIMAÇÃO DE MODELOS ARIMA
Quando estamos ajustando um modelo ARIMA usando dados de uma série temporal (não sazonal), o seguinte procedimento pode ser seguido:
- Visualizar os dados e identificar observações fora do padrão (outliers ou dados faltantes) e eliminá-las.
- Se necessário, transformar os dados para estabilizar a variância (logaritmo dos dados, variação ou retorno, por exemplo)
- Testar se os dados são estacionários. Caso tenha raiz unitária é preciso diferenciar os dados até se tornarem estacionários. Para isso, testa-se novamente se a série diferenciada se tornou estacionária.
- Examinar as funções de autocorrelação (FAC) e autocorrelação parcial (FACP) para determinar as ordens máximas \(P\) e \(Q\) para os componentes AR e MA da série estacionária (diferenciada, se necessário).
- Estimar todas as combinações para \(p\), \(d\) e \(q\). Aqui, \(d\) será fixo e igual ao número de vezes necessárias para tornar a série original estacionáira. Se não foi preciso diferenciar a série, \(d=0\).
- Escolher dentre todos os modelos estimados no passo anterior, o modelo com menor AIC e/ou BIC.
- Examinar se os resíduos se comportam como ruído branco. Caso contrário, retornar ao passo 3 ou 4.
- Testar autocorrelação nos resíduos
- Testar se tem heterocedasticidade condicional
- Verificar a distribuição de probabilidade
Uma vez que os resíduos são ruído branco, obter as previsões.
- Visualizar os dados e identificar observações fora do padrão (outliers ou dados faltantes) e eliminá-las.
- Se necessário, transformar os dados para estabilizar a variância (logaritmo dos dados, variação ou retorno, por exemplo)
- Testar se os dados são estacionários. Caso tenha raiz unitária é preciso diferenciar os dados até se tornarem estacionários. Para isso, testa-se novamente se a série diferenciada se tornou estacionária.
- Examinar as funções de autocorrelação (FAC) e autocorrelação parcial (FACP) para determinar as ordens máximas \(P\) e \(Q\) para os componentes AR e MA da série estacionária (diferenciada, se necessário).
- Estimar todas as combinações para \(p\), \(d\) e \(q\). Aqui, \(d\) será fixo e igual ao número de vezes necessárias para tornar a série original estacionáira. Se não foi preciso diferenciar a série, \(d=0\).
- Escolher dentre todos os modelos estimados no passo anterior, o modelo com menor AIC e/ou BIC.
- Examinar se os resíduos se comportam como um ruído branco:
- Testar autocorrelação nos resíduos: visualizar a função de autocorrelação (FAC) dos resíduos. Se existem defasagens estatisticamente significante (acima da linha pontilhada), há autocorrelação serial.
- Testar heterocedasticidade condicional: visualizar a função de autocorrelação (FAC) dos resíduos ao quadrado. Se existem defasagens estatisticamente significante (acima da linha pontilhada), há heterocedasticidade condicional.
- Verificar a distribuição de probabilidade assumida no processo de estimação: realizar teste que verifique se os resíduos se comportam de acordo com a distribuição de probabilidade adotada.
Se os resíduos são bem comportados (ruído branco), obter as previsões apenas com a estimação da média condicional. Caso contrário, revisar os passos anteriores para certificar que foram realizados corretamente. Se mesmo assim existir heterocedasticidade condicional e a distribuição de probabilidade não condiz com a hipótese assumida (geralmente uma distribuição Normal), avaliar a possibilidade de estimar a variância condicional (estudaremos depois como fazer essa estimação).
Vamos usar como exemplo para o processo apresentado anteriormente dados da ação MSFT (Microsoft). Assim, temos:
- O gráfico da série temporal dos preços mostra comportamento de tendência não determinística para o período em análise. Porém, não encontramos outliers ou dados faltantes que justifiquem seu tratamento.
Porém, sabemos que é melhor trabalhar com os retornos do que os preços de um ativo financeiro. Um dos benefícios de fazer isso é que tal transformação estabiliza a variância dos dados. Neste sentido, obtemos os retornos para a ação da Microsoft e como mostra o gráfico acima, a variância melhorou em função de não termos mais uma tendência não determinística.
Claramente, os dados são estacionários, em função de serem retornos. Mesmo assim, executamos o teste de raiz unitária ADF com \(2\) defasagens.
Title:
Augmented Dickey-Fuller Test
Test Results:
PARAMETER:
Lag Order: 2
STATISTIC:
Dickey-Fuller: -33.6333
P VALUE:
0.01
Description:
Mon Sep 30 20:09:16 2019 by user:
Como resultado temos que a estatística do teste é -33.6333 com um p-valor de 0.01. Assim, a hipótese nula de raiz unitária pode ser rejeitada em qualquer nível de significância razoável (5%, por exemplo) e a série temporal do retorno da ação MSFT (Microsoft) não tem raiz unitária, ou seja, é estacionária. Em função disso, vamos trabalhar com os retornos em nível e avaliar o comportamento das funções de autocorrelação e autocorrelação parcial. Obs.: caso a série tenha raiz unitária é preciso aplicar a diferença na mesma e refazer o teste para verificar se rejeitamos a hipótese nula de não estacionariedade para a série da primeira diferença dos retornos

A FACP sugere um modelo \(AR(2)\) enquanto a FAC sugere um modelo \(MA(5)\).
Usando todas as combinações das ordens encontradas anteriormente, estimamos os modelos ARIMA.
ARIMA000 |
8501.44 |
2 |
3207 |
-16998.87 |
-16987 |
ARIMA100 |
8509.47 |
3 |
3207 |
-17012.93 |
-16995 |
ARIMA200 |
8516.38 |
4 |
3207 |
-17024.77 |
-17000 |
ARIMA001 |
8510.57 |
3 |
3207 |
-17015.14 |
-16997 |
ARIMA101 |
8517.21 |
4 |
3207 |
-17026.42 |
-17002 |
ARIMA201 |
8519.25 |
5 |
3207 |
-17028.50 |
-16998 |
ARIMA002 |
8516.25 |
4 |
3207 |
-17024.51 |
-17000 |
ARIMA102 |
8518.76 |
5 |
3207 |
-17027.52 |
-16997 |
ARIMA202 |
8518.29 |
6 |
3207 |
-17024.59 |
-16988 |
ARIMA003 |
8517.50 |
5 |
3207 |
-17025.00 |
-16995 |
ARIMA103 |
8518.90 |
6 |
3207 |
-17025.80 |
-16989 |
ARIMA203 |
8521.80 |
7 |
3207 |
-17029.60 |
-16987 |
ARIMA004 |
8523.91 |
6 |
3207 |
-17035.82 |
-16999 |
ARIMA104 |
8526.91 |
7 |
3207 |
-17039.83 |
-16997 |
ARIMA204 |
8526.93 |
8 |
3207 |
-17037.86 |
-16989 |
ARIMA005 |
8526.79 |
7 |
3207 |
-17039.58 |
-16997 |
ARIMA105 |
8527.14 |
8 |
3207 |
-17038.29 |
-16990 |
ARIMA205 |
8527.58 |
9 |
3207 |
-17037.16 |
-16983 |
Os resultados mostram que o modelo \(ARIMA(1,0,1)\) é o modelo escolhido, pois tem o menor BIC.
A FAC dos resíduos do modelo mostra que a maior parte das autocorrelações estão dentro dos limites, indicando que os resíduos não apresentam autocorrelação serial.

Porém, ao analisar a presença de heterocedasticidade condicional por meio da FAC dos resíduos ao quadrado, encontramos diversas defasagens estatisticamente significantes indicando a presença de heterocedasticidade condicional nos resíduos obtidos do modelo. Isso é esperado dado que estamos trabalhando com retornos e como aprendemos anteriormente por meio dos fatos estilizados, existem clusters de volatilidade na série temporal de retornos de um ativo financeiro. Neste sentido, é necessário modelar o segundo momento condicional desta série (variância condicional) e isso será feito pela família de modelos de heterocedasticidade condicional (estudados posteriormente).

Por fim, avaliamos se os resíduos são normalmente distribuídos por meio dos testes de Shapiro e Jarque Bera. A hipótese nula dos testes é que os dados são normalmente distribuídos contra a hipótese alternativa que os dados não são normalmente distribuídos. Sabemos que o p-valor é o nível de significância mínimo para se rejeitar a hipótese nula. Assim, queremos um p-valor alto (>0,05) o que não nos permite rejeitá-la.
Como resultado, encontramos que é possível rejeitar a hipótese nula de que os resíduos são normalmente distribuídos em função do p-valor dos testes ser menor que 0,05.
Shapiro-Wilk normality test
data: na.remove(modelo_microsoft[[5]]$residuals)
W = 0.91679, p-value < 2.2e-16
Jarque Bera Test
data: na.remove(modelo_microsoft[[5]]$residuals)
X-squared = 9594.9, df = 2, p-value < 2.2e-16
- Em função de nosso modelo não se comportar da forma esperada, não podemos fazer previsões usando o mesmo
REFERÊNCIAS
Box, George EP, Gwilym M Jenkins, and Gregory C Reinsel. 1994. Time Series Analysis Forecasting and Control. Englewood Cliffs Prentice Hall.
Campbell, John Y, Andrew Wen-Chuan Lo, and Archie Craig MacKinlay. 1997. The Econometrics of Financial Markets. Princeton (NJ) Princeton University Press.
Dickey, David A, and Wayne A Fuller. 1979. “Distribution of the Estimators for Autoregressive Time Series with a Unit Root” 74 (366a). Journal of the American statistical association: 427–31.
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+IDxiPiBSYcOteiBVbml0w6FyaWEgZSBNb2RlbG9zIEFSSU1BIDwvYj4gPC9oMj4gPC9jZW50ZXI+IAphdXRob3I6IDxjZW50ZXI+IEZyYW5rIE1hZ2FsaMOjZXMgZGUgUGluaG8gLSBJQk1FQy9NRyA8L2NlbnRlcj4KZ3JhcGhpY3M6IHllcwpsaW5rY29sb3I6IGJsdWUKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgdGhlbWU6IGNlcnVsZWFuCiAgICBmaWdfY2FwdGlvbjogeWVzCnJlZmVyZW5jZXM6Ci0gaWQ6IHRzYXkyMDE0aW50cm9kdWN0aW9uCiAgdGl0bGU6IEFuIGludHJvZHVjdGlvbiB0byBhbmFseXNpcyBvZiBmaW5hbmNpYWwgZGF0YSB3aXRoIFIKICBhdXRob3I6CiAgLSBmYW1pbHk6IFRzYXkKICAgIGdpdmVuOiBSdWV5IFMKICBwdWJsaXNoZXI6IEpvaG4gV2lsZXkgXCYgU29ucwogIHR5cGU6IGJvb2sKICBpc3N1ZWQ6CiAgICB5ZWFyOiAyMDE0Ci0gaWQ6IGNhbXBiZWxsMTk5N2Vjb25vbWV0cmljcwogIHRpdGxlOiBUaGUgZWNvbm9tZXRyaWNzIG9mIGZpbmFuY2lhbCBtYXJrZXRzCiAgYXV0aG9yOgogIC0gZmFtaWx5OiBDYW1wYmVsbAogICAgZ2l2ZW46IEpvaG4gWQogIC0gZmFtaWx5OiBMbwogICAgZ2l2ZW46IEFuZHJldyBXZW4tQ2h1YW4KICAtIGZhbWlseTogTWFjS2lubGF5CiAgICBnaXZlbjogQXJjaGllIENyYWlnCiAgcHVibGlzaGVyOiBQcmluY2V0b24gKE5KKSBQcmluY2V0b24gVW5pdmVyc2l0eSBQcmVzcwogIHR5cGU6IGJvb2sKICBpc3N1ZWQ6CiAgICB5ZWFyOiAxOTk3Ci0gaWQ6IG1vcmV0dGluMjAwOGVjb25vbWV0cmlhCiAgdGl0bGU6IEVjb25vbWV0cmlhIGZpbmFuY2VpcmEgdW0gY3Vyc28gZW0gc8OpcmllcyB0ZW1wb3JhaXMgZmluYW5jZWlyYXMKICBhdXRob3I6CiAgLSBmYW1pbHk6IE1vcmV0dGluCiAgICBnaXZlbjogUGVkcm8gQWxiZXJ0bwogIHB1Ymxpc2hlcjogRWRnYXJkIEJsdWNoZXIKICB0eXBlOiBib29rCiAgaXNzdWVkOgogICAgeWVhcjogMjAwOAotIGlkOiB0c2F5MjAxMGFuYWx5c2lzCiAgdGl0bGU6IEFuYWx5c2lzIG9mIGZpbmFuY2lhbCB0aW1lIHNlcmllcwogIGF1dGhvcjoKICAtIGZhbWlseTogVHNheQogICAgZ2l2ZW46IFJ1ZXkgUwogIHB1Ymxpc2hlcjogSm9obiBXaWxleSBcJiBTb25zCiAgdHlwZTogYm9vawogIGlzc3VlZDoKICAgIHllYXI6IDIwMTAKLSBpZDogYm94MTk5NHRpbWUKICB0aXRsZTogVGltZSBzZXJpZXMgYW5hbHlzaXMgZm9yZWNhc3RpbmcgYW5kIGNvbnRyb2wKICBhdXRob3I6CiAgLSBmYW1pbHk6IEJveAogICAgZ2l2ZW46IEdlb3JnZSBFUAogIC0gZmFtaWx5OiBKZW5raW5zCiAgICBnaXZlbjogR3dpbHltIE0KICAtIGZhbWlseTogUmVpbnNlbAogICAgZ2l2ZW46IEdyZWdvcnkgQwogIHB1Ymxpc2hlcjogRW5nbGV3b29kIENsaWZmcyBQcmVudGljZSBIYWxsCiAgdHlwZTogYm9vawogIGlzc3VlZDoKICAgIHllYXI6IDE5OTQKLSBpZDogZGlja2V5MTk3OWRpc3RyaWJ1dGlvbgogIHRpdGxlOiBEaXN0cmlidXRpb24gb2YgdGhlIGVzdGltYXRvcnMgZm9yIGF1dG9yZWdyZXNzaXZlIHRpbWUgc2VyaWVzIHdpdGggYSB1bml0IHJvb3QKICBhdXRob3I6CiAgLSBmYW1pbHk6IERpY2tleQogICAgZ2l2ZW46IERhdmlkIEEKICAtIGZhbWlseTogRnVsbGVyCiAgICBnaXZlbjogV2F5bmUgQQogIHZvbHVtZTogNzQKICBpc3N1ZTogMzY2YQogIHB1Ymxpc2hlcjogSm91cm5hbCBvZiB0aGUgQW1lcmljYW4gc3RhdGlzdGljYWwgYXNzb2NpYXRpb24KICBwYWdlOiA0MjctNDMxCiAgdHlwZTogYXJ0aWNsZS1qb3VybmFsCiAgaXNzdWVkOgogICAgeWVhcjogMTk3OQpub2NpdGU6IHwgCiAgQHRzYXkyMDE0aW50cm9kdWN0aW9uLCBAY2FtcGJlbGwxOTk3ZWNvbm9tZXRyaWNzLCBAbW9yZXR0aW4yMDA4ZWNvbm9tZXRyaWEsIEB0c2F5MjAxMGFuYWx5c2lzLCBAYm94MTk5NHRpbWUsIEBkaWNrZXkxOTc5ZGlzdHJpYnV0aW9uCi0tLQoKRXN0ZSBtYXRlcmlhbCB0ZW0gY29tbyBvYmpldGl2byBjb250cmlidWlyIHBhcmEgbyBlbnRlbmRpbWVudG8gc29icmUgKipwcm9jZXNzb3MgbsOjbyBlc3RhY2lvbsOhcmlvcyBlIHNlbSBzYXpvbmFsaWRhZGUqKi4gUGFyYSB0YW50bywgdmFtb3MgbW9zdHJhciBjb21vIHJlYWxpemFyIHRlc3RlcyBlc3RhdMOtc3RpY29zIHBhcmEgdmVyaWZpY2FyIGEgZXN0YWNpb25hcmllZGFkZSBkZSB1bWEgc8OpcmllIHRlbXBvcmFsIGUgbyBpbXBhY3RvIGRlIG7Do28gZXN0YWNpb25hcmllZGFkZSBub3MgbW9kZWxvcyBBUk1BIGVzdHVkYWRvcyBhbnRlcmlvcm1lbnRlLiAKCiMjIyMjICoqSU5UUk9EVcOHw4NPKioKCkF0w6kgbyBtb21lbnRvLCBmb2NhbW9zIHNvYnJlIGEgc8OpcmllIGRvcyByZXRvcm5vcyBxdWUgZW0gZnVuw6fDo28gZGUgb3NjaWxhciBlbSB1bSBpbnRlcnZhbG8gcXVhc2Ugc2VtcHJlIGNvbnRyb2xhZG8gKC0xIGEgMSkgdGVuZGUgYSBzZXIgZXN0YWNpb27DoXJpYS4gUG9yw6ltLCBlbSBhbGd1bnMgZXN0dWRvcyB0ZW1vcyBpbnRlcmVzc2UgbmEgYXZhbGlhw6fDo28gZGUgb3V0cmFzIHPDqXJpZXMgdGVtcG9yYWlzICoqKHRheGEgZGUganVyb3MsIGPDom1iaW8sIGluZmxhw6fDo28sIGNyZXNjaW1lbnRvIGVjb27DtG1pY28pKiouCgpFc3RhcyBzw6lyaWVzIHRlbmRlbSBhIHNlciBuw6NvIGVzdGFjaW9uw6FyaWFzLCBwb2lzIG7Do28gb3NjaWxhbSBlbSB0b3JubyBkZSB1bWEgbcOpZGlhIGUgY29tIHZhcmnDom5jaWEgY29uc3RhbnRlLiBOYSBsaXRlcmF0dXJhIGRlIHPDqXJpZXMgdGVtcG9yYWlzLCBjaGFtYW1vcyB0YWlzIHPDqXJpZXMgZGUgKipzw6lyaWVzIGNvbSByYWl6IHVuaXTDoXJpYSoqLiBVbSBib20gZXhlbXBsbyBkZSBzw6lyaWUgY29tIHJhaXogdW5pdMOhcmlhIMOpIG8gKipwYXNzZWlvIGFsZWF0w7NyaW8qKiBlIGFiYWl4bywgbW9zdHJhbW9zIGFsZ3VtYXMgcHJvcHJpZWRhZGVzIGRlc3RhIHPDqXJpZSB0ZW1wb3JhbC4KCiMjIyMjICoqUEFTU0VJTyBBTEVBVMOTUklPKioKClVtYSBzw6lyaWUgdGVtcG9yYWwgJHtcbGVmdFx7e3B9X3t0fVxyaWdodFx9fV97dD0xfV57VH0kIMOpIHVtIHBhc3NlaW8gYWxlYXTDs3JpbyBzZSBlbGEgc2F0aXNmYXo6CgokJApwX3t0fT1wX3t0LTF9K2Ffe3R9CiQkCm9uZGUgcG9kZW1vcyBmYXplciAkcF8wJCB1bSBuw7ptZXJvIHJlYWwgZGVub3RhbmRvIG8gdmFsb3IgaW5pY2lhbCBkbyBwcm9jZXNzbyBlICRhX3QkIMOpIHVtIHJ1w61kbyBicmFuY28gY29tIG3DqWRpYSAkMCQsIHZhcmnDom5jaWEgJFxzaWdtYV97YX1eezJ9JCwgJEVcbGVmdFsgXGxlZnQoYV90LVxiYXJ7YX1ccmlnaHQpXGxlZnQoYV97dC1sfS1cYmFye2F9XHJpZ2h0KVxyaWdodF09RVthX3t0fWFfe3QtbH1dPTAkIGUgaW5kZXBlbmRlbnRlIGUgaWRlbnRpY2FtZW50ZSBkaXN0cmlidcOtZG8gKGlpZCkuCgpTZSBhc3N1bWltb3MgcXVlICRwX3t0fSQgw6kgbyBsb2dhcml0bW8gZG8gcHJlw6dvIGRlIHVtYSBhw6fDo28gZW0gJHQkLCBlbnTDo28gJHBfezB9JCBzZXJpYSBvIGxvZ2FyaXRtbyBkbyBwcmXDp28gaW5pY2lhbCBkYSBhw6fDo28gZW0gdW0gSVBPICgqaW5pdGlhbCBwdWJsaWMgb2ZmZXJpbmcqKS4gU2UgJGFfe3R9JCB0ZW0gdW1hIGRpc3RyaWJ1acOnw6NvIHNpbcOpdHJpY2EgZW0gdG9ybm8gZGUgJDAkIGNvbW8gYSBOb3JtYWwsIGVudMOjbyBjb25kaWNpb25hZG8gYSAkcF97dC0xfSQsICRwX3t0fSQgdGVtIDUwXCUgZGUgY2hhbmNlcyBkZSBzdWJpciBvdSBkZXNjZXIsIGltcGxpY2FuZG8gcXVlICRwX3QkIGRldmVyaWEgc3ViaXIgb3UgZGVzY2VyIGFsZWF0w7NyaWFtZW50ZS4gCgpTZSB0cmF0YXJtb3MgdW0gcGFzc2VpbyBhbGVhdMOzcmlvIGNvbW8gdW0gY2FzbyBlc3BlY2lhbCBkZSAqKkFSKDEpKiogcXVhbmRvIG7Do28gdGVtb3MgaW50ZXJjZXB0bywgZW50w6NvIG8gY29lZmljaWVudGUgZGUgJHBfe3QtMX0kIMOpIGlndWFsIGEgJDEkLCBxdWUgbsOjbyBzYXRpc2ZheiBhIGNvbmRpw6fDo28gZGUgZXN0YWNpb25hcmllZGFkZSBmcmFjYSAoJFxsZWZ0fCB7XHBoaX1fezF9IFxyaWdodHwgPCAxJCkgbW9zdHJhZGEgYW50ZXJpb3JtZW50ZSBwYXJhIG8gbW9kZWxvICoqQVIoMSkqKi4gQXNzaW0sIG8gcGFzc2VpbyBhbGVhdMOzcmlvIMOpIG7Do28gZXN0YWNpb27DoXJpbyBlIMOpIGNoYW1hZG8gZGUgc8OpcmllIHRlbXBvcmFsIGNvbSAqKnJhaXogdW5pdMOhcmlhKiouIEFiYWl4bywgZXhlbXBsbyBkZSBjb21vIHNpbXVsYXIgdW0gcGFzc2VpbyBhbGVhdMOzcmlvIG5vIFIuCgpgYGB7ciwgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD05fQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyAgU0lNVUxBw4fDg08gUEFTU0VJTyBBTEVBVMOTUklPICMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBGaXhhciBhIHJhw616IHBhcmEgcXVlIGEgc2ltdWxhw6fDo28gZ2VyZSBvcyBtZXNtb3MgZGFkb3MgZW0gcXVhbHF1ZXIgY29tcHV0YWRvciAKc2V0LnNlZWQoMTIzKSAKCiMgU2ltdWxhw6fDo28gZGUgdW0gcGFzc2VpbyBhbGVhdMOzcmlvCm4gPC0gMTAwMApwMCA8LSAxMApwaGkxIDwtIDEKcHQgPC0gcmVwKHAwLG4pCmZvciAoaSBpbiAxOihuLTEpKSB7CiAgcHRbaSsxXSA8LSBwaGkxKnB0W2ldICsgcm5vcm0oMSkKfQoKIyBWaXN1YWxpemHDp8OjbyBkbyBwYXNzZWlvIGFsZWF0w7NyaW8uCnBsb3QocHQsIHR5cGUgPSAibCIsIHhsYWIgPSAib2JzZXJ2YcOnw7VlcyIsIHlsYWIgPSAicHJlw6dvIiwgbWFpbiA9ICJTaW11bGHDp8OjbyBQYXNzZWlvIEFsZWF0w7NyaW8iKQpgYGAKCk9ic2VydmUgbm8gZ3LDoWZpY28gcXVlIG8gcGFzc2VpbyBhbGVhdMOzcmlvIGluaWNpb3UgZW0gMTAgKHZhbG9yIGRlZmluaWRvIGNvbW8gYHBoaTBgIG5hIHNpbXVsYcOnw6NvKSBlIGFww7NzIGlzc28gb3NjaWxvdSwgY29uZGljaW9uYWRvIGFvIHZhbG9yIGFudGVyaW9yLCBlbSBmdW7Dp8OjbyBkZSB1bSBuw7ptZXJvIGFsZWF0w7NyaW8gb2J0aWRvIGEgcGFydGlyIGRlIHVtYSBkaXN0cmlidWnDp8OjbyBOb3JtYWwgY29tIG3DqWRpYSB6ZXJvIGUgdmFyacOibmNpYSAxIChkZWZpbmlkbyBjb21vIGBybm9ybSgxKWAgbmEgc2ltdWxhw6fDo28pLgoKQ2FzbyB1bWEgc8OpcmllIHRlbXBvcmFsIGRlIHByZcOnb3MgZGUgdW0gYXRpdm8gZmluYW5jZWlybyAobG9nYXJpdG1vIGRvcyBwcmXDp29zKSBzZSBjb21wb3J0ZSBjb21vIHVtIHBhc3NlaW8gYWxlYXTDs3JpbywgdGVyZW1vcyBxdWUgbyBwcmXDp28gZGUgdW1hIGHDp8OjbyBuw6NvIMOpIHByZWRpesOtdmVsLiBQYXJhIHZlciBpc3RvLCB2YW1vcyBmYXplciBhIHByZXZpc8OjbyB1bSBwYXNzbyDDoCBmcmVudGUgZG8gbW9kZWxvOgoKJCQKXGJlZ2lue3NwbGl0fQpwX3t0KzF9ICY9IHBfe3QrMS0xfSthX3t0KzF9IFxcCiYgXFwKJiA9IHBfe3R9K2Ffe3QrMX0gXFwKJiBcXApFXGxlZnRbcF97dCsxfXxwX3t0fSxwX3t0LTF9LC4uLlxyaWdodF0gJj0gRVxsZWZ0W3Bfe3R9XHJpZ2h0XSArIEVcbGVmdFthX3t0KzF9XHJpZ2h0XSBcXAomIFxcCiY9IHBfe3R9ICsgMCAgXFwKJiBcXAomPSBwX3t0fQpcZW5ke3NwbGl0fQokJAoKcXVlIMOpIG8gbG9nYXJpdG1vIGRvIHByZcOnbyBkYSBhw6fDo28gbmEgb3JpZ2VtLiBFc3RhIHByZXZpc8OjbyBuw6NvIHRlbSB2YWxvciBwcsOhdGljby4gQSBwcmV2aXPDo28gZG9pcyBwYXNzb3Mgw6AgZnJlbnRlIHNlcmlhOgoKJCQKXGJlZ2lue3NwbGl0fQpwX3t0KzJ9ICY9IHBfe3QrMi0xfSthX3t0KzJ9IFxcCiYgXFwKJiA9IHBfe3QrMX0rYV97dCsyfSBcXAomIFxcCkVcbGVmdFtwX3t0KzJ9fHBfe3QrMX0scF97dH0scF97dC0xfSwuLi5ccmlnaHRdICY9IEVcbGVmdFtwX3t0KzF9fHBfe3R9LHBfe3QtMX0sLi4uXHJpZ2h0XSArIEVcbGVmdFthX3t0KzJ9XHJpZ2h0XSBcXAomIFxcCiY9IHBfe3R9ICsgMCAgXFwKJiBcXAomPSBwX3t0fQpcZW5ke3NwbGl0fQokJAoKcXVlIG5vdmFtZW50ZSDDqSBvIGxvZ2FyaXRtbyBkbyBwcmXDp28gbmEgb3JpZ2VtIGRhIHByZXZpc8Ojby4gRGUgZmF0bywgcGFyYSBxdWFscXVlciBob3Jpem9udGUgZGUgcHJldmlzw6NvICRsPjAkLCB0ZW1vczoKCiQkCkVcbGVmdFtwX3t0K2x9fHBfe3QrbC0xfSwuLi5ccmlnaHRdID0ge3B9X3t0fQokJApBc3NpbSwgcGFyYSB0b2RvcyBvcyBob3Jpem9udGVzIGRlIHByZXZpc8OjbywgbyB2YWxvciBwcmV2aXN0byBkZSB1bSBwYXNzZWlvIGFsZWF0w7NyaW8gw6kgc2ltcGxlc21lbnRlIG8gdmFsb3IgZGEgc8OpcmllIG5hIG9yaWdlbSBkYSBwcmV2aXPDo28gKHRlbW9zIGNvbW8gb3JpZ2VtIGEgw7psdGltYSBvYnNlcnZhw6fDo28gYW50ZXMgZGUgc2UgaW5pY2lhciBhIHByZXZpc8Ojbywgb3Ugc2VqYSwgbyDDumx0aW1vIHByZcOnbyBzZW1wcmUgc2VyaWEgYSBtZWxob3IgcHJldmlzw6NvIHBhcmEgcXVhbHF1ZXIgaG9yaXpvbnRlIGRlIHByZXZpc8OjbykuIAoKIyMjIyMgKipQQVNTRUlPIEFMRUFUw5NSSU8gQ09NIERSSUZUKioKCkNvbW8gdmltb3MgZW0gYWxndW5zIGV4ZW1wbG9zLCDDqSBwb3Nzw612ZWwgcXVlIHVtYSBzw6lyaWUgdGVtcG9yYWwgdGVuaGEgdW0gdmFsb3IgbcOpZGlvIGRpZmVyZW50ZSBkZSB6ZXJvLiBJc3RvIGltcGxpY2EgcXVlIG8gbW9kZWxvIHBhcmEgbyBsb2dhcml0bW8gZG9zIHByZcOnb3MgKGhpcG90ZXRpY2FtZW50ZSwgcG9pcyBuw6NvIGVzcGVyYW1vcyByZXRvcm5vcyBkaWZlcmVudGUgZGUgemVybyBlbSBtw6lkaWEpIMOpOgoKJCQKcF97dH0gPSBcbXUgKyBwX3t0LTF9ICsgYV97dH0KJCQKb25kZSAkXG11PUVbcF97dH0tcF97dC0xfV0kIGUgJGFfe3R9JCDDqSB1bSBydcOtZG8gYnJhbmNvIGNvbSBtw6lkaWEgJDAkLCB2YXJpw6JuY2lhICRcc2lnbWFfe2F9XnsyfSQsICRFXGxlZnRbIFxsZWZ0KGFfdC1cYmFye2F9XHJpZ2h0KVxsZWZ0KGFfe3QtbH0tXGJhcnthfVxyaWdodClccmlnaHRdPUVbYV97dH1hX3t0LWx9XT0wJCBlIGluZGVwZW5kZW50ZSBlIGlkZW50aWNhbWVudGUgZGlzdHJpYnXDrWRvIChpaWQpLgoKTyB0ZXJtbyBkZSBjb25zdGFudGVbXjFdICRcbXUkIGRvIG1vZGVsbyDDqSBtdWl0byBpbXBvcnRhbnRlIGVtIGZpbmFuw6dhcy4gRWxlIHJlcHJlc2VudGEgYSB0ZW5kw6puY2lhIHRlbXBvcmFsIGRvIGxvZ2FyaXRtbyBkb3MgcHJlw6dvcyAoJHBfe3R9JCkgZSDDqSBmcmVxdWVudGVtZW50ZSBjaGFtYWRvIGRlICpkcmlmdCogZG8gbW9kZWxvLiBQYXJhIHZlciBpc3RvLCBhc3N1bWEgcXVlIHRlbW9zIG8gdmFsb3IgZG8gbG9nYXJpdG1vIGluaWNpYWwgZG8gcHJlw6dvIHF1ZSDDqSByZXByZXNlbnRhZG8gcG9yICRwXzAkLiBFbnTDo28sIAoKW14xXTogQSBwYXJ0aXIgZG8gcXVlIGZvaSBkaXNjdXRpZG8gYW50ZXJpb3JtZW50ZSwgw6kgaW1wb3J0YW50ZSBlbnRlbmRlciBvIHNpZ25pZmljYWRvIGRvIHRlcm1vIGRhIGNvbnN0YW50ZSBlbSB1bSBtb2RlbG8gZGUgc8OpcmllcyB0ZW1wb3JhaXMuIFByaW1laXJvLCBwYXJhIHVtICoqTUEocSkqKiB0YWwgdGVybW8gw6kgc2ltcGxlc21lbnRlIGEgbcOpZGlhIGRhIHPDqXJpZS4gU2VndW5kbywgcGFyYSB1bSBtb2RlbG8gKipBUihwKSoqIG91ICoqQVJNQShwLHEpKiogbyB0ZXJtbyBkYSBjb25zdGFudGUgw6kgcmVsYWNpb25hZG8gw6AgbcOpZGlhIHBvciBtZWlvIGRlICRcbXUgPSB7e1xwaGl9X3swfX0veygxLXtccGhpfV97MX0tLi4uLXtccGhpfV97cH0pfSQuIFRlcmNlaXJvLCBwYXJhIHVtIHBhc3NlaW8gYWxlYXTDs3JpbyBjb20gKmRyaWZ0KiwgbyB0ZXJtbyBkYSBjb25zdGFudGUgc2UgdG9ybmEgYSBpbmNsaW5hw6fDo28gZGEgc8OpcmllIHRlbXBvcmFsLgoKCiQkCnBfMT1cbXUgKyBwX3swfSArIGFfe3R9CiQkCgokJApwXzI9XG11ICsgcF97MX0gKyBhX3syfSA9IDJcbXUgKyBwX3swfSArIGFfezJ9ICsgYV97MX0KJCQKJCQKLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgokJAokJApwX3Q9dFxtdSArIHBfezB9ICsgYV97dH0gKyBhX3t0LTF9ICsgLi4uKyBhX3sxfQokJAoKQSDDumx0aW1hIGVxdWHDp8OjbyBtb3N0cmEgcXVlIG8gbG9nYXJpdG1vIGRvIHByZcOnbyBjb25zaXRlIGRlIHVtYSB0ZW5kw6puY2lhIHRlbXBvcmFsICgkdFxtdSQpIGUgdW0gcGFzc2VpbyBhbGVhdMOzcmlvICgkXHN1bV97aT0xfV57dH17e2F9X3tpfX0kKS4gRW0gZnVuw6fDo28gZGUgJFZBUihcc3VtX3tpPTF9Xnt0fXt7YX1fe2l9fSk9dFxzaWdtYV97YX1eezJ9JCwgb25kZSAkXHNpZ21hX3thfV57Mn0kIMOpIGEgdmFyacOibmNpYSBkZSAkYV97dH0kLCBvIGRlc3ZpbyBwYWRyw6NvIGNvbmRpY2lvbmFsIGRlICRwX3t0fSQgw6kgJFxzcXJ0e3Rcc2lnbWFfe2F9fSQsIHF1ZSBjcmVzY2UgYSB1bWEgdGF4YSBtYWlzIGxlbnRhIGRvIHF1ZSBvIHZhbG9yIGVzcGVyYWRvICRFW3BfdF09IHBfMCtcbXUgdCQuIFBvcnRhbnRvLCBzZSBkZXNlbmhhcm1vcyB1bSBncsOhZmljbyBkZSAkcF97dH0kIGNvbnRyYSAkdCQsIHRlcmVtb3MgdW1hIHRlbmTDqm5jaWEgdGVtcG9yYWwgY29tIGluY2xpbmHDp8OjbyAkXG11JC4gVW1hIGluY2xpbmHDp8OjbyBwb3NpdGl2YSwgb3Ugc2VqYSwgJFxtdT4wJCwgaW5kaWNhIHF1ZSBvIGxvZ2FyaXRtbyBkb3MgcHJlw6dvcyBldmVudHVhbG1lbnRlIHRlbmRlcsOhIGFvIGluZmluaXRvLiBFbSBjb250cmFwYXJ0aWRhLCBzZSAkXG11PDAkIG8gbG9nYXJpdG1vIGRvcyBwcmXDp29zIHRlbmRlcsOhIGEgJC1caW5mdHkkIG5hIG1lZGlkYSBxdWUgJHQkIGF1bWVudGFyLgoKQWJhaXhvLCBjw7NkaWdvIGVtIFIgcXVlIG1vc3RyYSBjb21vIHNpbXVsYXIgdW0gcGFzc2VpbyBhbGVhdMOzcmlvIGNvbSAqZHJpZnQqOgoKYGBge3IsIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9OX0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyAgU0lNVUxBw4fDg08gUEFTU0VJTyBBTEVBVMOTUklPICBDT00gRFJJRlQgIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgU2ltdWxhw6fDo28gZGUgdW0gcGFzc2VpbyBhbGVhdMOzcmlvIGNvbSBkcmlmdCAocHQgPSBtaSArIHBoaTEqcHQtMSArIGF0KQpuIDwtIDEwMDAKcDAgPC0gMTAKbWkgPC0gMC4yCnBoaTEgPC0gMQpwdF9kcmlmdCA8LSByZXAocDAsbikKZm9yIChpIGluIDE6KG4tMSkpIHsKICBwdF9kcmlmdFtpKzFdIDwtIG1pICsgcGhpMSpwdF9kcmlmdFtpXSArIHJub3JtKDEpCn0KCiMgVmlzdWFsaXphw6fDo28gZG8gcGFzc2VpbyBhbGVhdMOzcmlvIGNvbSBkcmlmdApwbG90KHB0X2RyaWZ0LCB0eXBlID0gImwiLCB4bGFiID0gIm9ic2VydmHDp8O1ZXMiLCB5bGFiID0gInByZcOnbyIsIG1haW4gPSAiU2ltdWxhw6fDo28gUGFzc2VpbyBBbGVhdMOzcmlvIGNvbSBEcmlmdCIpCmBgYAoKT2JzZXJ2ZSBxdWUgc2Ugdm9jw6ogYWx0ZXJhciBvIHZhbG9yIGRlIGBtaWAgcGFyYSB1bSBuw7ptZXJvIHBvc2l0aXZvIG91IG5lZ2F0aXZvIGUgdmlzdWFsaXphciBhIHPDqXJpZSwgcGVyY2ViZXLDoSBxdWUgdGFsIHBhcsOibWV0cm8gbXVkYXLDoSBhIGRpcmXDp8OjbyBkYSBjdXJ2YSAocGFyYSBiYWl4bywgc2UgbmVnYXRpdm8gZSBwYXJhIGNpbWEsIHNlIHBvc2l0aXZvKS4gQWzDqW0gZGlzc28sIHNlIHZvY8OqIGFsdGVyYXIgbyB2YWxvciBkZSBgcGhpMWAgcGFyYSB1bSB2YWxvciBtZW5vciBxdWUgMSBlIHZpc3VhbGl6YXIgb3MgZGFkb3MgdGVyw6EgdW1hIHPDqXJpZSBlc3RhY2lvbsOhcmlhLCBjb21vIGVzcGVyYWRvIChsZW1icmUgZGEgcmVzdHJpw6fDo28gc29icmUgdGFsIHBhcsOibWV0cm8gbmEgZGVyaXZhw6fDo28gZG8gbW9kZWxvIEFSKS4KCiMjIyMjICoqUEFTU0VJTyBBTEVBVMOTUklPIENPTSBEUklGVCBFIFRFTkTDik5DSUEgREVURVJNSU7DjVNUSUNBKioKCk91dHJvIGV4ZW1wbG8gZGUgcGFzc2VpbyBhbGVhdMOzcmlvIMOpIG8gcXVlIGFsw6ltIGRlIHVtIGRyaWZ0IHRlbSB1bWEgdGVuZMOqbmNpYSBkZXRlcm1pbsOtc3RpY2EsIGNvbW8gc2VndWU6CgokJApwX3t0fSA9IFxtdSArIFxnYW1tYSB0ICsgcF97dC0xfSArIGFfe3R9CiQkCkFnb3JhLCB0ZW1vcyBvIHBhcsOibWV0cm8gJFxnYW1tYSQgcXVlIGVzdMOhIGRldGVybWluw61zdGljYW1lbnRlIHJlbGFjaW9uYWRvIGNvbSBvIHRlbXBvICgkdCQpLiBBc3NpbSwgZW0gY2FkYSBpbnN0YW50ZSBkbyB0ZW1wbyBhIHPDqXJpZSBzZXLDoSBhZGljaW9uYWRhIHBvciB0YWwgcGFyw6JtZXRyby4gTyBjw7NkaWdvIGFiYWl4byBtb3N0cmEgY29tbyBzaW11bGFyIHVtIHBhc3NlaW8gYWxlYXTDs3JpbyBjb20gZHJpZnQgZSB0ZW5kw6puY2lhIGRldGVybWluw61zdGljYSBubyBSLiBPYnNlcnZlIHF1ZSBhIHPDqXJpZSB0ZW1wb3JhbCBhcHJlc2VudGEgdW1hIHRlbmTDqm5jaWEgbWFpcyByb2J1c3RhIHF1ZSBhIHPDqXJpZSBvcmlnaW5hZGEgcGVsbyBwYXNzZWlvIGFsZWF0w7NyaW8gYXBlbmFzIGNvbSBkcmlmdC4KCmBgYHtyIGVjaG89VFJVRSwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyAgU0lNVUxBw4fDg08gUEFTU0VJTyBBTEVBVMOTUklPICBDT00gRFJJRlQgIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgU2ltdWxhw6fDo28gZGUgdW0gcGFzc2VpbyBhbGVhdMOzcmlvIGNvbSBkcmlmdCBlIHRlbmTDqm5jaWEgCm4gPC0gMTAwMApwMCA8LSAxMAptaSA8LSAwLjIKZ2FtYSA8LSAyCnBoaTEgPC0gMQp0cmVuZCA8LSAxOm4KcHRfZHJpZnRfdHJlbmQgPC0gcmVwKHAwLG4pCmZvciAoaSBpbiAxOihuLTEpKSB7CiAgcHRfZHJpZnRfdHJlbmRbaSsxXSA8LSBtaSArIGdhbWEgKiB0cmVuZFtpXSArIHBoaTEqcHRfZHJpZnRfdHJlbmRbaV0gKyBybm9ybSgxKQp9CgojIFZpc3VhbGl6YcOnw6NvIGRvIHBhc3NlaW8gYWxlYXTDs3JpbyBjb20gZHJpZnQKcGxvdChwdF9kcmlmdF90cmVuZCwgdHlwZSA9ICJsIiwgeGxhYiA9ICJvYnNlcnZhw6fDtWVzIiwgeWxhYiA9ICJwcmXDp28iLCBtYWluID0gIlNpbXVsYcOnw6NvIFBhc3NlaW8gQWxlYXTDs3JpbyBjb20gRHJpZnQgZSBUZW5kw6puY2lhIERldGVybWluw61zdGljYSIpCgpgYGAKCiMjIyMjICoqVEVTVEUgREUgUkFJWiBVTklUw4FSSUEqKgoKKiAqKlRFU1RFIERFIERJQ0tFWS1GVUxMRVIqKgoKUGFyYSB0ZXN0YXIgc2UgbyBsb2dhcml0bW8gZG9zIHByZcOnb3MgKCRwX3QkKSBkZSB1bSBhdGl2byBmaW5hbmNlaXJvIHNlZ3VlIHVtIHBhc3NlaW8gYWxlYXTDs3JpbywgdW0gcGFzc2VpbyBhbGVhdMOzcmlvIGNvbSAqZHJpZnQqIG91IHBhc3NlaW8gYWxlYXTDs3JpbyBjb20gZHJpZnQgZSB0ZW5kw6puY2lhIGRldGVybWluw61zdGljYSwgdXNhbW9zIG9zIG1vZGVsb3MgYWJhaXhvOgoKJCQKcF97dH09XHBoaV97MX1wX3t0LTF9ICsgXGVwc2lsb25fe3R9CiQkCgokJApwX3t0fT0gXG11ICsgXHBoaV97MX1wX3t0LTF9ICsgXGVwc2lsb25fe3R9CiQkCgokJApwX3t0fT1cbXUgKyBcZ2FtbWEgdCArIFxwaGlfezF9cF97dC0xfSArIFxlcHNpbG9uX3t0fQokJAoKCm9uZGUgJFxlcHNpbG9uX3t0fSQgZGVub3RhIG8gdGVybW8gZGUgZXJyby4gT2JzZXJ2ZSBxdWUgc2UgJHtccGhpfV97MX09MSQgZW0gYW1iYXMgYXMgZXF1YcOnw7VlcywgdGVyZW1vcyB1bSBwYXNzZWlvIGFsZWF0w7NyaW8gbm8gcHJpbWVpcm8gY2FzbywgdW0gcGFzc2VpbyBhbGVhdMOzcmlvIGNvbSBkcmlmdCBubyBzZWd1bmRvIGNhc28gZSB1bSBwYXNzZWlvIGFsZWF0w7NyaW8gY29tIGRyaWZ0IGUgdGVuZMOqbmNpYSBkZXRlcm1pbsOtc3RpY2Egbm8gdGVyY2Vpcm8gY2Fzby4gT2JzZXJ2ZSBhIHNlbWVsaGFuw6dhIGRlc3NhcyBlcXVhw6fDtWVzIGRvIHRlc3RlIGNvbSBhcyBlcXVhw6fDtWVzIGRvcyBwYXNzZWlvcyBhbGVhdMOzcmlvcyBtb3N0cmFkYXMgYW50ZXJpb3JtZW50ZS4gCgpBc3NpbSwgdGVzdGFyIHNlIGEgc8OpcmllIHRlbXBvcmFsIHRlbSByYWl6IHVuaXTDoXJpbyAoc2UgZWxhIG7Do28gw6kgZXN0YWNpb27DoXJpYSkgY29uc2lzdGUgZW0gdGVzdGFyIGEgaGlww7N0ZXNlIG51bGEgKG7Do28gZXN0YWNpb25hcmllZGFkZSkgJHtIfV97MH06e1xwaGl9X3sxfT0xJCBjb250cmEgYSBoaXDDs3Rlc2UgYWx0ZXJuYXRpdmEgKGVzdGFjaW9uYXJpZWRhZGUpICR7SH1fezF9OntccGhpfV97MX08MSQuIEVzdGUgdGVzdGUgZm9pIHByb3Bvc3RvIHBvciBAZGlja2V5MTk3OWRpc3RyaWJ1dGlvbiBlIMOpIGNvbmhlY2lkbyBjb21vIERpY2tleS1GdWxsZXIuIEEgcGFydGlyIGRhIGVzdGltYcOnw6NvIGRhcyBlcXVhw6fDtWVzIGFjaW1hIHBvciBtZWlvIGRlIE1RTywgdXNhLXNlIHVtIHRlc3RlIGNvbnZlbmNpb25hbFteMl0gZGUgJHQkIHNvYnJlICRccGhpX3sxfSQuIAoKW14yXTogUG9yw6ltLCBzb2IgYSBoaXDDs3Rlc2UgbnVsYSwgYSBkaXN0cmlidWnDp8OjbyBkbyB0ZXN0ZSBuw6NvIMOpIGNvbnZlbmNpb25hbCwgb3Ugc2VqYSwgbsOjbyDDqSBpZ3VhbCDDoCBkaXN0cmlidWnDp8OjbyAkdCQsIHBvaXMgJHBfdCQgbsOjbyDDqSBlc3RhY2lvbsOhcmlvLiBAZGlja2V5MTk3OWRpc3RyaWJ1dGlvbiByZWNhbGN1bGFyYW0gbyB2YWxvciBkYSBlc3RhdMOtc3RpY2EgJHQkLiBPIHZhbG9yIGRlc3NhIGVzdGF0w61zdGljYSBzZSBhbHRlcmEgY29uZm9ybWUgc2UgZGVmaW5lIGEgZXF1YcOnw6NvIGRlIHJlZ3Jlc3PDo28gZSBzZWd1bmRvIG8gdGFtYW5obyBkYSBhbW9zdHJhLiBBbMOpbSBkaXNzbywgYSBkaXN0cmlidWnDp8OjbyBkZSBwcm9iYWJpbGlkYWRlIGRvIHRlc3RlIG7Do28gw6kgc2ltw6l0cmljYSAobWFpb3JlcyBkZXRhbGhlcyBuZXN0ZSBbbGlua10oaHR0cHM6Ly9zdGF0cy5zdGFja2V4Y2hhbmdlLmNvbS9xdWVzdGlvbnMvMjEzNTUxL2hvdy1pcy10aGUtYXVnbWVudGVkLWRpY2tleS1mdWxsZXItdGVzdC1hZGYtdGFibGUtb2YtY3JpdGljYWwtdmFsdWVzLWNhbGN1bGF0ZS8yMTM1ODkpKS4KClBhcmEgYSBwcmltZWlyYSBlcXVhw6fDo28gKCRwX3t0fT1ccGhpX3sxfXBfe3QtMX0gKyBcZXBzaWxvbl97dH0kKSBNUU8gZ2VyYSBvcyBzZWd1aW50ZXMgZXN0aW1hZG9yZXM6CgokJAp7XGhhdHtccGhpfX1fezF9PVxmcmFje1xzdW1fe3Q9MX1ee1R9e3twfV97dC0xfXtwfV97dH19fXtcc3VtX3t0PTF9XntUfXt7cH1fe3QtMX1eezJ9fX0gCiQkCgokJAp7XGhhdHtcc2lnbWF9fV97XGVwc2lsb259XnsyfT1cZnJhY3tcc3VtX3t0PTF9XntUfXt7XGxlZnQoe3B9X3t0fS17XGhhdHtccGhpfX1fezF9e3B9X3t0LTF9IFxyaWdodCl9XnsyfX19e1QtMX0gCiQkCgpvbmRlICRwX3swfT0wJCBlICRUJCDDqSBvIHRhbWFuaG8gZGEgYW1vc3RyYS4gQSBlc3RhdMOtc3RpY2EgZG8gdGVzdGUgc2Vyw6E6CgokJApERiA9IFxmcmFje1xoYXR7XHBoaX1fezF9fXtzdGQoXGhhdHtccGhpfV97MX0pfSA9IFxmcmFje1xzdW1fe3Q9MX1ee1R9e3twfV97dC0xfXtcZXBzaWxvbn1fe3R9fX17XGhhdHtcc2lnbWF9X3tcZXBzaWxvbn1cc3VtX3t0PTF9XntUfXt7cH1fe3QtMX1eezJ9fX0KJCQKCiogKipURVNURSBERSBESUNLRVktRlVMTEVSOiBPVVRSQSBGT1JNVUxBw4fDg08qKgoKU3VidHJhaW5kbyAkcF97dC0xfSQgbmFzIGVxdWHDp8O1ZXMgZG8gdGVzdGUsIHRlbW9zOiAKCiQkCnBfe3R9PVxwaGlfezF9cF97dC0xfSArIFxlcHNpbG9uX3t0fSBcUmlnaHRhcnJvdyBwX3QgLSBwX3t0LTF9ID0gXHBoaV97MX1wX3t0LTF9IC0gcF97dC0xfSArIFxlcHNpbG9uX3t0fSBcUmlnaHRhcnJvdyBcRGVsdGEgcF97dH0gPSBcYmV0YSBwX3t0LTF9ICsgXGVwc2lsb25fe3R9CiQkCgokJApwX3t0fT0gXG11ICsgXHBoaV97MX1wX3t0LTF9ICsgXGVwc2lsb25fe3R9IFxSaWdodGFycm93IHBfe3R9IC0gcF97dC0xfSA9IFxtdSArIFxwaGlfezF9cF97dC0xfSAtIHBfe3QtMX0gKyBcZXBzaWxvbl97dH0gIFxSaWdodGFycm93IFxEZWx0YSBwX3t0fSA9IFxtdSArIFxiZXRhIHBfe3QtMX0gKyBcZXBzaWxvbl97dH0KJCQKCiQkCnBfe3R9PVxtdSArIFxnYW1tYSB0ICsgXHBoaV97MX1wX3t0LTF9ICsgXGVwc2lsb25fe3R9IFxSaWdodGFycm93IHBfe3R9LXBfe3QtMX09XG11ICsgXGdhbW1hIHQgKyBccGhpX3sxfXBfe3QtMX0gLSBwX3t0LTF9ICsgXGVwc2lsb25fe3R9IFxSaWdodGFycm93IFxEZWx0YSBwX3t0fSA9IFxtdSArIFxnYW1tYSB0ICsgIFxiZXRhIHBfe3QtMX0gKyBcZXBzaWxvbl97dH0KJCQKCkFzc2ltLCB0ZXN0YXIgJFxwaGlfezF9PTEkIGNvbW8gYXByZXNlbnRhZG8gYW50ZXJpb3JtZW50ZSDDqSBvIG1lc21vIHF1ZSB0ZXN0YXIgJFxiZXRhPTAkIHBhcmEgYSBmb3JtdWxhw6fDo28gbm92YSBkbyB0ZXN0ZS4gCgoqICoqVEVTVEUgREUgRElDS0VZLUZVTExFUiBBVU1FTlRBRE8qKgoKTyBwcm9ibGVtYSBkbyB0ZXN0ZSBhbnRlcmlvciDDqSBxdWUgQGRpY2tleTE5NzlkaXN0cmlidXRpb24gY29uc2lkZXJhcmFtIG8gZXJybyB1bSBydcOtZG8gYnJhbmNvLiBQb3LDqW0sIGZyZXF1ZW50ZW1lbnRlLCBvIGVycm8gw6kgdW0gcHJvY2Vzc28gZXN0YWNpb27DoXJpbyBxdWFscXVlci4gRXNzZSBwcm9ibGVtYSBwb2RlIGNhdXNhciBkaXN0b3LDp8O1ZXMgbm8gcG9kZXIgZG8gdGVzdGUuIEFsw6ltIGRpc3NvLCBtdWl0YXMgc8OpcmllcyB0ZW1wb3JhaXMgZWNvbsO0bWljYXMgcG9kZW0gc2VndWlyIHByb2Nlc3NvcyAkQVJJTUEocCxkLHEpJC4KClN1cG9uaGEgcXVlICRwX3t0fSQgc2VqYSB1bSBwcm9jZXNzbyBhdXRvcnJlZ3Jlc3Npdm8gZGUgb3JkZW0gJHAkLCBBUihwKS4gCgokJApwX3t0fT1cbXUgKyBccGhpX3sxfXBfe3QtMX0gKyAuLi4gK1xwaGlfe3AtMX1wX3t0LXArMX0rIFxwaGlfe3B9cF97dC1wfSArIFxlcHNpbG9uX3t0fQokJAoKUGFyYSB2ZXJpZmljYXIgYSBleGlzdMOqbmNpYSBkZSByYWl6IHVuaXTDoXJpYSBuZXNzZSBwcm9jZXNzbywgcG9kZS1zZSBwZXJmb3JtYXIgbyB0ZXN0ZSAkSF97MH06IFxiZXRhPTAkIChuw6NvIGVzdGFjaW9uYXJpZWRhZGUpIGNvbnRyYSAkSF97YX06IFxiZXRhIDwgMCQgKGVzdGFjaW9uYXJpZWRhZGUpLCB1c2FuZG8gYSByZWdyZXNzw6NvOgoKJCQKXERlbHRhIHBfe3R9PVxtdSArIFxiZXRhIHBfe3QtMX0gKyBcc3VtX3tpPTF9XntwLTF9e1xwaGlfe2l9XERlbHRhIHBfe3QtaX0rIFxlcHNpbG9uX3t0fX0gCiQkCm9uZGUgJFxtdSQgw6kgdW1hIGZ1bsOnw6NvIGRldGVybWluw61zdGljYSBkbyB0ZW1wbyAkdCQgZSAkXERlbHRhIHBfe3QtaX09cF97an0tcF97ai0xfSQgw6kgYSBzw6lyaWUgZGlmZXJlbmNpYWRhLiBOYSBwcsOhdGljYSwgJFxtdSQgcG9kZSBzZXIgJDAkLCB1bWEgY29uc3RhbnRlIG91ICRcbXUrXGdhbW1hIHQkLiBBIGVzdGF0w61zdGljYSBkbyB0ZXN0ZSBzZXLDoToKCiQkCkFERi10ZXN0PVxmcmFje1xoYXR7XGJldGF9fXtzdGQoXGhhdHtcYmV0YX0pfQokJApvbmRlICRcaGF0e1xiZXRhfSQgZGVub3RhbmRvIGEgZXN0aW1hdGl2YSBkZSBtw61uaW1vcyBxdWFkcmFkb3MgZGUgJFxiZXRhJCDDqSBvIGNvbmhlY2lkbyB0ZXN0ZSBkZSByYcOteiB1bml0w6FyaWEgZGUgRGlja2VyLUZ1bGxoZXIgYXVtZW50YWRvLiAKCiMjIyMjICoqTU9ERUxPUyBBUklNQSoqCgpDb25zaWRlcmUgdW0gbW9kZWxvIEFSTUEuIFNlIHBlcm1pdGlybW9zIHF1ZSBvIGNvbXBvbmVudGUgQVIgdGVuaGEgdW1hIHJhaXogdW5pdMOhcmlhLCBlbnTDo28gbyBtb2RlbG8gc2UgdG9ybmEgdW0gKiptb2RlbG8gYXV0b3JyZWdyZXNzaXZvIGludGVncmFkbyBkZSBtw6lkaWEgbcOzdmVsIChBUklNQSkqKi4gTGVtYnJlLXNlIHF1ZSBhbnRlcmlvcm1lbnRlIG1vc3RyYW1vcyBxdWUgYSBjb21wb25lbnRlIE1BIMOpIHNlbXByZSBlc3RhY2lvbsOhcmlhIGUgcG9yIGlzc28gYXBlbmFzIG8gY29tcG9uZW50ZSBBUiBwb2RlIHRlciB1bWEgcmFpeiB1bml0w6FyaWEuIAoKKiAqKkRJRkVSRU5DSUHDh8ODTyoqOgoKVW1hIHPDqXJpZSB0ZW1wb3JhbCAkeV97dH0kIMOpIHVtIHByb2Nlc3NvICoqQVJJTUEocCwxLHEpKiogc2UgYSBzw6lyaWUgZGFzIGRpZmVyZW7Dp2FzICgkY197dH09eV97dH0teV97dC0xfSQpIHNlZ3VlIHVtIG1vZGVsbyBBUk1BKHAscSkgZXN0YWNpb27DoXJpby4gIAoKQSBpZGVpYSBkZSB0cmFuc2Zvcm1hciB1bWEgc8OpcmllIG7Do28gZXN0YWNpb27DoXJpYSBlbSBlc3RhY2lvbsOhcmlhIHBvciBjb25zaWRlcmFyIHN1YXMgZGlmZXJlbsOnYXMgw6kgY2hhbWFkbyBkZSAqKmRpZmVyZW5jaWHDp8OjbyoqIG5hIGxpdGVyYXR1cmEgZGUgc8OpcmllcyB0ZW1wb3JhaXMuIE1haXMgZm9ybWFsbWVudGUsICRjX3t0fT15X3t0fS15X3t0LTF9JCDDqSBjaGFtYWRvIGRlICoqcHJpbWVpcmEgZGlmZXJlbsOnYSoqIGRhIHPDqXJpZSAkeV97dH0kLiBFbSBhbGd1bnMgY2Fzb3MgcG9kZSBzZXIgcHJlY2lzbyBkaWZlcmVuY2lhciBhIHPDqXJpZXMgdsOhcmlhcyB2ZXplcyBwYXJhIHRvcm7DoS1sYSBlc3RhY2lvbsOhcmlhLiBQb3IgZXhlbXBsbywgc2UgdGFudG8gJHlfe3R9JCBxdWFudG8gc3VhIHByaW1laXJhIGRpZmVyZW7Dp2Egc8OjbyBuw6NvIGVzdGFjaW9uw6FyaWFzLCBtYXMgJHNfe3R9PWNfe3R9LWNfe3QtMX09eV97dH0tMnlfe3QtMX0reV97dC0yfSQgYXByZXNlbnRhIGVzdGFjaW9uYXJpZWRhZGUgZnJhY2EsIGVudMOjbyAkeV97dH0kIHRlbSBkdWFzIHJhw616ZXMgdW5pdMOhcmlhcyBlICRzX3t0fSQgw6kgYSBzw6lyaWUgZGEgc2VndW5kYSBkaWZlcmVuw6dhIGRlICR5X3t0fSQuIEFzc2ltLCBzZSAkc197dH0kIHNlZ3VlIHVtIG1vZGVsbyBBUk1BKHAscSkgZW50w6NvICR5X3t0fSQgw6kgdW0gbW9kZWxvIEFSTUEocCwyLHEpLgoKQ29tbyBleGVtcGxvLCBwYXJhIG9zIHBhc3NlaW9zIGFsZWF0w7NyaW9zIHNpbXVsYWRvcyBhbnRlcmlvcm1lbnRlLCBvYnNlcnZlIHF1ZSB1bWEgc2ltcGxlcyBkaWZlcmVuY2lhw6fDo28gZGUgcHJpbWVpcmEgb3JkZW0gbm9zIGRhZG9zIHRvcm5hIGEgc8OpcmllIGFwYXJhbnRlbWVudGUgZXN0YWNpb27DoXJpYS4gCgpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9OX0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyAgU0lNVUxBw4fDg08gUEFTU0VJTyBBTEVBVMOTUklPICBDT00gRFJJRlQgIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCnBhcihtZnJvdz1jKDMsMSkpIAoKIyBWaXN1YWxpemHDp8OjbyBkYSBwcmltZWlyYSBkaWZlcmVuw6dhIGRvIHBhc3NlaW8gYWxlYXTDs3JpbyBxdWUgw6kgZXN0YWNpb27DoXJpbwpwbG90KGRpZmYocHQpLCB0eXBlID0gImwiLCB4bGFiID0gIiIsIHlsYWIgPSAiIiwgbWFpbiA9ICJQcmltZWlyYSBkaWZlcmVuw6dhIC0gcGFzc2VpbyBhbGVhdMOzcmlvIikKCiMgVmlzdWFsaXphw6fDo28gZGEgcHJpbWVpcmEgZGlmZXJlbsOnYSBkbyBwYXNzZWlvIGFsZWF0w7NyaW8gcXVlIMOpIGVzdGFjaW9uw6FyaW8KcGxvdChkaWZmKHB0X2RyaWZ0KSwgdHlwZSA9ICJsIiwgeGxhYiA9ICIiLCB5bGFiID0gIiIsIG1haW4gPSAiUHJpbWVpcmEgZGlmZXJlbsOnYSAtIHBhc3NlaW8gYWxlYXTDs3JpbyBjb20gZHJpZnQiKQoKIyAgVmlzdWFsaXphw6fDo28gZGEgcHJpbWVpcmEgZGlmZXJlbsOnYSBkbyBwYXNzZWlvIGFsZWF0w7NyaW8gcXVlIMOpIGVzdGFjaW9uw6FyaW8KcGxvdChkaWZmKHB0X2RyaWZ0X3RyZW5kKSwgdHlwZSA9ICJsIiwgeGxhYiA9ICIiLCB5bGFiID0gIiIsIG1haW4gPSAiUHJpbWVpcmEgZGlmZXJlbsOnYSAtIHBhc3NlaW8gYWxlYXTDs3JpbyBjb20gZHJpZnQgZSB0ZW5kw6puY2lhIGRldGVybWluw61zdGljYSIpCmBgYAoKCkVtIGZpbmFuw6dhcyBlIGNvbmZvcm1lIG1vc3RyYW1vcyBhbnRlcmlvcm1lbnRlLCBvcyBwcmXDp29zIGRlIGF0aXZvcyBmaW5hbmNlaXJvcyBjb211bWVudGUgc8OjbyBuw6NvIGVzdGFjaW9uw6FyaW9zLCBtYXMgbyBsb2dhcml0bW8gZG9zIHJldG9ybm9zIG91IG8gcmV0b3JubyBzaW1wbGVzIMOpIGVzdGFjaW9uw6FyaW8uCgpgYGB7ciwgZWNobz1GQUxTRSwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9OSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMgIERBRE9TIERBIEHDh8ODTyBNU0ZUICMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKc3VwcHJlc3NNZXNzYWdlcyhyZXF1aXJlKGhpZ2hjaGFydGVyKSkKc3VwcHJlc3NNZXNzYWdlcyhyZXF1aXJlKHRpZHlxdWFudCkpCnN1cHByZXNzTWVzc2FnZXMocmVxdWlyZShxdWFudG1vZCkpCnN1cHByZXNzTWVzc2FnZXMocmVxdWlyZShQZXJmb3JtYW5jZUFuYWx5dGljcykpCnN1cHByZXNzTWVzc2FnZXMocmVxdWlyZSh0c2VyaWVzKSkKCiMgQ29sZXRhbmRvIGRhZG9zIGRvIFlhaG9vIEZpbmFuY2UgKGh0dHBzOi8vZmluYW5jZS55YWhvby5jb20vKSB1c2FuZG8gbyBwYWNvdGUKIyBxdWFudG1vZCAoaHR0cHM6Ly93d3cucXVhbnRtb2QuY29tLykuIFVtYSBicmV2ZSBkb2N1bWVudGHDp8OjbyBkbyBwYWNvdGUgcG9kZSBzZXIKIyBlbmNvbnRyYWRhIG5lc3RlIGxpbmsgKGh0dHA6Ly9zdGF0bWF0aC53dS5hYy5hdC9+aG9ybmlrL1FGUzEvcXVhbnRtb2QtdmlnbmV0dGUucGRmKS4KbWljcm9zb2Z0IDwtIHF1YW50bW9kOjpnZXRTeW1ib2xzKCJNU0ZUIiwgc3JjID0gInlhaG9vIiwgd2FybmluZ3MgPSBGQUxTRSwgYXV0by5hc3NpZ249RkFMU0UpCgojIENhbGN1bGFyIG8gcmV0b3JubyBkbyBmZWNoYW1lbnRvIGRvcyBwcmXDp29zIGRhIGHDp8OjbyBkbyBHb29nbGUgdXNhbmRvIG8gbG9nYXJpdG1vIFtsblB0LWxuKFB0LTEpXQojIFVzYW1vcyBhIGZ1bsOnw6NvIFJldHVybi5jYWxjdWxhdGUgZG8gcGFjb3RlIFBlcmZvcm1hbmNlQW5hbHl0aWNzLiBVbWEgYnJldmUgZG9jdW1lbnRhw6fDo28gZG8gcGFjb3RlCiMgcG9kZSBzZXIgZW5jb250cmFkYSBuZXN0ZSBsaW5rIChodHRwOi8vYnJhdmVyb2NrLmNvbS9icmlhbi9SL1BlcmZvcm1hbmNlQW5hbHl0aWNzL2h0bWwvUGVyZm9ybWFuY2VBbmFseXRpY3MtcGFja2FnZS5odG1sKQpsb2dtaWNyb3NvZnQgPC0gUGVyZm9ybWFuY2VBbmFseXRpY3M6OlJldHVybi5jYWxjdWxhdGUobWljcm9zb2Z0JE1TRlQuQ2xvc2UsIG1ldGhvZCA9ICJsb2ciKQoKIyBHcsOhZmljbyBkYSBzw6lyaWUgdGVtcG9yYWwgZG9zIHJldG9ybm9zIApoYzAgPC0gaGlnaGNoYXJ0KHR5cGUgPSAic3RvY2siKSAlPiUgCiAgaGNfdGl0bGUodGV4dCA9ICJDb21wYXJhw6fDo28gZW50cmUgcHJlw6dvIGRlIGZlY2hhbWVudG8gZSByZXRvcm5vIGRhIGHDp8OjbyBkYSBNaWNyb3NvZnQiKSAlPiUgCiAgaGNfc3VidGl0bGUodGV4dCA9ICJEYWRvcyBleHRyYcOtZG9zIHVzYW5kbyBvIHBhY290ZSBxdWFudG1vZCBkbyBSIikgJT4lIAogIGhjX2FkZF9zZXJpZXMobG9nbWljcm9zb2Z0LCBpZCA9ICJ0cyIsIGNvbG9yID0gInJlZCIsIG5hbWUgPSAiUmV0b3JubyIpICU+JQogIGhjX2FkZF9zZXJpZXMobWljcm9zb2Z0JE1TRlQuQ2xvc2UsIGlkID0gInRzIiwgY29sb3IgPSAiYmx1ZSIsIG5hbWUgPSAiUHJlw6dvIikKCgpoYzAKCmBgYAoKTyBncsOhZmljbyBkYSBmdW7Dp8OjbyBkZSBhdXRvY29ycmVsYcOnw6NvIChGQUMpIHBvZGUgc2VyIMO6dGlsIHBhcmEgaWRlbnRpZmljYXIgc8OpcmllcyB0ZW1wb3JhaXMgbsOjbyBlc3RhY2lvbsOhcmlhcy4gUGFyYSB1bWEgc8OpcmllIHRlbXBvcmFsIGVzdGFjaW9uw6FyaWEsIG8gZ3LDoWZpY28gZGEgRkFDIG1vc3RyYXLDoSB1bSAqKmRlY2FpbWVudG8gcGFyYSAkMCQgcmVsYXRpdmFtZW50ZSByw6FwaWRvKiogZW5xdWFudG8gcGFyYSB1bWEgc8OpcmllIG7Do28gZXN0YWNpb27DoXJpYSBvICoqZGVjYWltZW50byBzZXLDoSBsZW50by4qKiBBbMOpbSBkaXNzbywgKiphIHByaW1laXJhIGRlZmFzYWdlbSBkYSBGQUMqKiDDqSBncmFuZGUgZSBlc3RhdMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZvIHBhcmEgc8OpcmllcyBuw6NvIGVzdGFjaW9uw6FyaWFzLiBBYmFpeG8sIG9zIGRvaXMgZ3LDoWZpY29zIGRhIEZBQyBwYXJhIGFzIHPDqXJpZXMgZGUgcHJlw6dvIGUgcmV0b3JubyBkYSBhw6fDo28gZGEgTWljcm9zb2Z0LiAKCmBgYHtyLCBlY2hvPUZBTFNFLCByZXN1bHRzPSdhc2lzJywgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9OSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KIyBVc2Ftb3MgYSBmdW7Dp8OjbyBhY2YgZG8gcGFjb3RlIHN0YXRzIHBhcmEgY2FsY3VsYXIgYSBmdW7Dp8OjbyBkZSBhdXRvY29ycmVsYcOnw6NvIAojIGRhIHPDqXJpZSB0ZW1wb3JhbCBkb3MgcHJlw6dvcyAocGVyY2ViYSBxdWUgZGVudHJvIGRvIG9iamV0byBtaWNyb3NvZnQgaMOhIHbDoXJpb3MKIyBkYWRvcywgbWFzIGVzY29saGVtb3MgbyBmZWNoYW1lbnRvLiBQYXJhIHNhYmVyIHF1YWlzIGRhZG9zIGV4aXN0ZW0gZW0gdW0gb2JqZXRvCiMgcmV0b3JuYXJkbyBwb3IgbWVpbyBkbyBwYWNvdGUgcXVhbnRtb2QgdXNlIGhlYWQobm9tZW9iamV0byksIGFxdWkgaGVhZChtaWNyb3NvZnQpKQojIENvbSByZWxhw6fDo28gw6AgZnVuw6fDo28gYWNmLCBvcHRhbW9zIHBvciBuw6NvIHZpc3VhbGl6YXIgbyByZXN1bHRhZG8gZW0gdW0gZ3LDoWZpY28sIHBvaXMKIyBmYXplbW9zIG8gbm9zc28gcHLDs3ByaW8gZ3LDoWZpY28gZSBjb20gbm8gbcOheGltbyAzMCBkZWZhc2FnZW5zCmFjZnByaWNlIDwtIHN0YXRzOjphY2YobWljcm9zb2Z0JE1TRlQuQ2xvc2UsIHBsb3QgPSBGQUxTRSwgbmEuYWN0aW9uID0gbmEucGFzcywgbGFnLm1heCA9IDMwKQoKIyBHcsOhZmljbyBkYSBmdW7Dp8OjbyBkZSBhdXRvY29ycmVsYcOnw6NvIGNvbSBhZGnDp8OjbyBkbyB0w610dWxvCnBsb3QoYWNmcHJpY2UsIG1haW4gPSAiIiwgeWxhYiA9ICIiLCB4bGFiID0gIkRlZmFzYWdlbSIpCnRpdGxlKCJGdW7Dp8OjbyBkZSBBdXRvY29ycmVsYcOnw6NvIChGQUMpIGRvcyBQcmXDp29zIiwgYWRqID0gMC41LCBsaW5lID0gMSkKYGBgCgpgYGB7ciwgZWNobz1GQUxTRSwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9OSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KIyBPIG1lc21vIHF1ZSBhbnRlcywgbWFzIGFnb3JhIHBhcmEgYSBzw6lyaWUgdGVtcG9yYWwgZG9zIHJldG9ybm9zCmFjZnJldHVybiA8LSBzdGF0czo6YWNmKGxvZ21pY3Jvc29mdCwgcGxvdCA9IEZBTFNFLCBuYS5hY3Rpb24gPSBuYS5wYXNzLCBsYWcubWF4ID0gMzApCnBsb3QoYWNmcmV0dXJuLCBtYWluID0gIiIsIHlsYWIgPSAiIiwgeGxhYiA9ICJEZWZhc2FnZW0iKQp0aXRsZSgiRnVuw6fDo28gZGUgQXV0b2NvcnJlbGHDp8OjbyAoRkFDKSBkb3MgUmV0b3Jub3MiLCBhZGogPSAwLjUsIGxpbmUgPSAxKQpgYGAKCkFzc2ltLCB0ZW1vcyBxdWUgYSBzw6lyaWUgZG9zIHByZcOnb3MgZGEgYcOnw6NvICoqTVNGVCoqIChNaWNyb3NvZnQpIHNlIGNvbXBvcnRhIGNvbW8gdW0gcHJvY2Vzc28gbsOjbyBlc3RhY2lvbsOhcmlvIGVucXVhbnRvIG9zIHJldG9ybm9zIGRlc3RhIGHDp8OjbyBhcHJlc2VudGFtIHVtYSBGQUMgY29tIG1haW9yIHByb2JhYmlsaWRhZGUgZGUgc2VyIHByb3ZlbmllbnRlIGRlIHVtIHByb2Nlc3NvIGVzdGFjaW9uw6FyaW8uCgojIyMjIyAqKlBST0NFU1NPIERFIEVTVElNQcOHw4NPIERFIE1PREVMT1MgQVJJTUEqKgoKUXVhbmRvIGVzdGFtb3MgYWp1c3RhbmRvIHVtIG1vZGVsbyBBUklNQSB1c2FuZG8gZGFkb3MgZGUgdW1hIHPDqXJpZSB0ZW1wb3JhbCAobsOjbyBzYXpvbmFsKSwgbyBzZWd1aW50ZSBwcm9jZWRpbWVudG8gcG9kZSBzZXIgc2VndWlkbzoKCjEuIFZpc3VhbGl6YXIgb3MgZGFkb3MgZSBpZGVudGlmaWNhciBvYnNlcnZhw6fDtWVzIGZvcmEgZG8gcGFkcsOjbyAoKm91dGxpZXJzKiBvdSBkYWRvcyBmYWx0YW50ZXMpIGUgZWxpbWluw6EtbGFzLgoyLiBTZSBuZWNlc3PDoXJpbywgdHJhbnNmb3JtYXIgb3MgZGFkb3MgcGFyYSBlc3RhYmlsaXphciBhIHZhcmnDom5jaWEgKGxvZ2FyaXRtbyBkb3MgZGFkb3MsIHZhcmlhw6fDo28gb3UgcmV0b3JubywgcG9yIGV4ZW1wbG8pCjMuIFRlc3RhciBzZSBvcyBkYWRvcyBzw6NvIGVzdGFjaW9uw6FyaW9zLiBDYXNvIHRlbmhhIHJhaXogdW5pdMOhcmlhIMOpIHByZWNpc28gZGlmZXJlbmNpYXIgb3MgZGFkb3MgYXTDqSBzZSB0b3JuYXJlbSBlc3RhY2lvbsOhcmlvcy4gUGFyYSBpc3NvLCB0ZXN0YS1zZSBub3ZhbWVudGUgc2UgYSBzw6lyaWUgZGlmZXJlbmNpYWRhIHNlIHRvcm5vdSBlc3RhY2lvbsOhcmlhLgo0LiBFeGFtaW5hciBhcyBmdW7Dp8O1ZXMgZGUgYXV0b2NvcnJlbGHDp8OjbyAoRkFDKSBlIGF1dG9jb3JyZWxhw6fDo28gcGFyY2lhbCAoRkFDUCkgcGFyYSBkZXRlcm1pbmFyIGFzIG9yZGVucyBtw6F4aW1hcyAkUCQgZSAkUSQgcGFyYSBvcyBjb21wb25lbnRlcyBBUiBlIE1BIGRhIHPDqXJpZSBlc3RhY2lvbsOhcmlhIChkaWZlcmVuY2lhZGEsIHNlIG5lY2Vzc8OhcmlvKS4KNS4gRXN0aW1hciB0b2RhcyBhcyBjb21iaW5hw6fDtWVzIHBhcmEgJHAkLCAkZCQgZSAkcSQuIEFxdWksICRkJCBzZXLDoSBmaXhvIGUgaWd1YWwgYW8gbsO6bWVybyBkZSB2ZXplcyBuZWNlc3PDoXJpYXMgcGFyYSB0b3JuYXIgYSBzw6lyaWUgb3JpZ2luYWwgZXN0YWNpb27DoWlyYS4gU2UgbsOjbyBmb2kgcHJlY2lzbyBkaWZlcmVuY2lhciBhIHPDqXJpZSwgJGQ9MCQuCjYuIEVzY29saGVyIGRlbnRyZSB0b2RvcyBvcyBtb2RlbG9zIGVzdGltYWRvcyBubyBwYXNzbyBhbnRlcmlvciwgbyBtb2RlbG8gY29tIG1lbm9yIEFJQyBlL291IEJJQy4KNy4gRXhhbWluYXIgc2Ugb3MgcmVzw61kdW9zIHNlIGNvbXBvcnRhbSBjb21vIHJ1w61kbyBicmFuY28uIENhc28gY29udHLDoXJpbywgcmV0b3JuYXIgYW8gcGFzc28gMyBvdSA0LgogICAgKiBUZXN0YXIgYXV0b2NvcnJlbGHDp8OjbyBub3MgcmVzw61kdW9zCiAgICAqIFRlc3RhciBzZSB0ZW0gaGV0ZXJvY2VkYXN0aWNpZGFkZSBjb25kaWNpb25hbAogICAgKiBWZXJpZmljYXIgYSBkaXN0cmlidWnDp8OjbyBkZSBwcm9iYWJpbGlkYWRlIAo4LiBVbWEgdmV6IHF1ZSBvcyByZXPDrWR1b3Mgc8OjbyBydcOtZG8gYnJhbmNvLCBvYnRlciBhcyBwcmV2aXPDtWVzLgoKMS4gVmlzdWFsaXphciBvcyBkYWRvcyBlIGlkZW50aWZpY2FyIG9ic2VydmHDp8O1ZXMgZm9yYSBkbyBwYWRyw6NvICgqb3V0bGllcnMqIG91IGRhZG9zIGZhbHRhbnRlcykgZSBlbGltaW7DoS1sYXMuCjIuIFNlIG5lY2Vzc8OhcmlvLCB0cmFuc2Zvcm1hciBvcyBkYWRvcyBwYXJhIGVzdGFiaWxpemFyIGEgdmFyacOibmNpYSAobG9nYXJpdG1vIGRvcyBkYWRvcywgdmFyaWHDp8OjbyBvdSByZXRvcm5vLCBwb3IgZXhlbXBsbykKMy4gVGVzdGFyIHNlIG9zIGRhZG9zIHPDo28gZXN0YWNpb27DoXJpb3MuIENhc28gdGVuaGEgcmFpeiB1bml0w6FyaWEgw6kgcHJlY2lzbyBkaWZlcmVuY2lhciBvcyBkYWRvcyBhdMOpIHNlIHRvcm5hcmVtIGVzdGFjaW9uw6FyaW9zLiBQYXJhIGlzc28sIHRlc3RhLXNlIG5vdmFtZW50ZSBzZSBhIHPDqXJpZSBkaWZlcmVuY2lhZGEgc2UgdG9ybm91IGVzdGFjaW9uw6FyaWEuCjQuIEV4YW1pbmFyIGFzIGZ1bsOnw7VlcyBkZSBhdXRvY29ycmVsYcOnw6NvIChGQUMpIGUgYXV0b2NvcnJlbGHDp8OjbyBwYXJjaWFsIChGQUNQKSBwYXJhIGRldGVybWluYXIgYXMgb3JkZW5zIG3DoXhpbWFzICRQJCBlICRRJCBwYXJhIG9zIGNvbXBvbmVudGVzIEFSIGUgTUEgZGEgc8OpcmllIGVzdGFjaW9uw6FyaWEgKGRpZmVyZW5jaWFkYSwgc2UgbmVjZXNzw6FyaW8pLgo1LiBFc3RpbWFyIHRvZGFzIGFzIGNvbWJpbmHDp8O1ZXMgcGFyYSAkcCQsICRkJCBlICRxJC4gQXF1aSwgJGQkIHNlcsOhIGZpeG8gZSBpZ3VhbCBhbyBuw7ptZXJvIGRlIHZlemVzIG5lY2Vzc8OhcmlhcyBwYXJhIHRvcm5hciBhIHPDqXJpZSBvcmlnaW5hbCBlc3RhY2lvbsOhaXJhLiBTZSBuw6NvIGZvaSBwcmVjaXNvIGRpZmVyZW5jaWFyIGEgc8OpcmllLCAkZD0wJC4KNi4gRXNjb2xoZXIgZGVudHJlIHRvZG9zIG9zIG1vZGVsb3MgZXN0aW1hZG9zIG5vIHBhc3NvIGFudGVyaW9yLCBvIG1vZGVsbyBjb20gbWVub3IgQUlDIGUvb3UgQklDLgo3LiBFeGFtaW5hciBzZSBvcyByZXPDrWR1b3Mgc2UgY29tcG9ydGFtIGNvbW8gdW0gcnXDrWRvIGJyYW5jbzoKICAgICogVGVzdGFyIGF1dG9jb3JyZWxhw6fDo28gbm9zIHJlc8OtZHVvczogdmlzdWFsaXphciBhIGZ1bsOnw6NvIGRlIGF1dG9jb3JyZWxhw6fDo28gKEZBQykgZG9zIHJlc8OtZHVvcy4gU2UgZXhpc3RlbSBkZWZhc2FnZW5zIGVzdGF0aXN0aWNhbWVudGUgc2lnbmlmaWNhbnRlIChhY2ltYSBkYSBsaW5oYSBwb250aWxoYWRhKSwgaMOhIGF1dG9jb3JyZWxhw6fDo28gc2VyaWFsLgogICAgKiBUZXN0YXIgaGV0ZXJvY2VkYXN0aWNpZGFkZSBjb25kaWNpb25hbDogdmlzdWFsaXphciBhIGZ1bsOnw6NvIGRlIGF1dG9jb3JyZWxhw6fDo28gKEZBQykgZG9zIHJlc8OtZHVvcyBhbyBxdWFkcmFkby4gU2UgZXhpc3RlbSBkZWZhc2FnZW5zIGVzdGF0aXN0aWNhbWVudGUgc2lnbmlmaWNhbnRlIChhY2ltYSBkYSBsaW5oYSBwb250aWxoYWRhKSwgaMOhIGhldGVyb2NlZGFzdGljaWRhZGUgY29uZGljaW9uYWwuCiAgICAqIFZlcmlmaWNhciBhIGRpc3RyaWJ1acOnw6NvIGRlIHByb2JhYmlsaWRhZGUgYXNzdW1pZGEgbm8gcHJvY2Vzc28gZGUgZXN0aW1hw6fDo286IHJlYWxpemFyIHRlc3RlIHF1ZSB2ZXJpZmlxdWUgc2Ugb3MgcmVzw61kdW9zIHNlIGNvbXBvcnRhbSBkZSBhY29yZG8gY29tIGEgZGlzdHJpYnVpw6fDo28gZGUgcHJvYmFiaWxpZGFkZSBhZG90YWRhLgo4LiBTZSBvcyByZXPDrWR1b3Mgc8OjbyBiZW0gY29tcG9ydGFkb3MgKHJ1w61kbyBicmFuY28pLCAqKm9idGVyIGFzIHByZXZpc8O1ZXMgYXBlbmFzIGNvbSBhIGVzdGltYcOnw6NvIGRhIG3DqWRpYSBjb25kaWNpb25hbCoqLiBDYXNvIGNvbnRyw6FyaW8sIHJldmlzYXIgb3MgcGFzc29zIGFudGVyaW9yZXMgcGFyYSBjZXJ0aWZpY2FyIHF1ZSBmb3JhbSByZWFsaXphZG9zIGNvcnJldGFtZW50ZS4gU2UgbWVzbW8gYXNzaW0gZXhpc3RpciBoZXRlcm9jZWRhc3RpY2lkYWRlIGNvbmRpY2lvbmFsIGUgYSBkaXN0cmlidWnDp8OjbyBkZSBwcm9iYWJpbGlkYWRlIG7Do28gY29uZGl6IGNvbSBhIGhpcMOzdGVzZSBhc3N1bWlkYSAoZ2VyYWxtZW50ZSB1bWEgZGlzdHJpYnVpw6fDo28gTm9ybWFsKSwgKiphdmFsaWFyIGEgcG9zc2liaWxpZGFkZSBkZSBlc3RpbWFyIGEgdmFyacOibmNpYSBjb25kaWNpb25hbCoqIChlc3R1ZGFyZW1vcyBkZXBvaXMgY29tbyBmYXplciBlc3NhIGVzdGltYcOnw6NvKS4gCiAgICAKCiogKipFWEVNUExPIDE6KioKClZhbW9zIHVzYXIgY29tbyBleGVtcGxvIHBhcmEgbyBwcm9jZXNzbyBhcHJlc2VudGFkbyBhbnRlcmlvcm1lbnRlIGRhZG9zIGRhIGHDp8OjbyAqKk1TRlQqKiAoTWljcm9zb2Z0KS4gQXNzaW0sIHRlbW9zOgoKCmBgYHtyLCBlY2hvPUZBTFNFLCByZXN1bHRzPSdhc2lzJywgZmlnLndpZHRoPTksIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CiMgR3LDoWZpY28gZGEgc8OpcmllIHRlbXBvcmFsIGRvcyBwcmXDp29zIApoYzAgPC0gaGlnaGNoYXJ0KHR5cGUgPSAic3RvY2siKSAlPiUgCiAgaGNfdGl0bGUodGV4dCA9ICJQcmXDp28gZGUgZmVjaGFtZW50byBkYSBhw6fDo28gZGEgTWljcm9zb2Z0IikgJT4lIAogIGhjX3N1YnRpdGxlKHRleHQgPSAiRGFkb3MgZXh0cmHDrWRvcyB1c2FuZG8gbyBwYWNvdGUgcXVhbnRtb2QgZG8gUiIpICU+JSAKICBoY19hZGRfc2VyaWVzKG1pY3Jvc29mdCRNU0ZULkNsb3NlLCBpZCA9ICJ0cyIsIGNvbG9yID0gImJsdWUiLCBuYW1lID0gIlByZcOnbyIpCgoKaGMwCmBgYAoKMS4gTyBncsOhZmljbyBkYSBzw6lyaWUgdGVtcG9yYWwgZG9zIHByZcOnb3MgbW9zdHJhIGNvbXBvcnRhbWVudG8gZGUgdGVuZMOqbmNpYSBuw6NvIGRldGVybWluw61zdGljYSBwYXJhIG8gcGVyw61vZG8gZW0gYW7DoWxpc2UuIFBvcsOpbSwgbsOjbyBlbmNvbnRyYW1vcyBvdXRsaWVycyBvdSBkYWRvcyBmYWx0YW50ZXMgcXVlIGp1c3RpZmlxdWVtIHNldSB0cmF0YW1lbnRvLgoKYGBge3IsIGVjaG89RkFMU0UsIHJlc3VsdHM9J2FzaXMnLCBmaWcud2lkdGg9OSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KIyBHcsOhZmljbyBkYSBzw6lyaWUgdGVtcG9yYWwgZG9zIHJldG9ybm9zLiBKw6EgbW9zdHJhbW9zIGFudGVyaW9ybWVudGUgY29tbyAKIyBleHRyYWlyIG9zIGRhZG9zIGUgY2FsY3VsYXIgbyByZXRvcm5vLiBBcXVpLCB0ZW1vcyBvIGdyw6FmaWNvIGRvcyByZXRvcm5vcwpoYzEgPC0gaGlnaGNoYXJ0KHR5cGUgPSAic3RvY2siKSAlPiUgCiAgaGNfdGl0bGUodGV4dCA9ICJSZXRvcm5vcyBkYSBhw6fDo28gZGEgTWljcm9zb2Z0IikgJT4lIAogIGhjX3N1YnRpdGxlKHRleHQgPSAiRGFkb3MgZXh0cmHDrWRvcyB1c2FuZG8gbyBwYWNvdGUgcXVhbnRtb2QgZG8gUiIpICU+JSAKICBoY19hZGRfc2VyaWVzKGxvZ21pY3Jvc29mdCwgaWQgPSAidHMiLCBjb2xvciA9ICJyZWQiLCBuYW1lID0gIlJldG9ybm8iKQoKCmhjMQpgYGAKCjIuIFBvcsOpbSwgc2FiZW1vcyBxdWUgw6kgbWVsaG9yIHRyYWJhbGhhciBjb20gb3MgcmV0b3Jub3MgZG8gcXVlIG9zIHByZcOnb3MgZGUgdW0gYXRpdm8gZmluYW5jZWlyby4gVW0gZG9zIGJlbmVmw61jaW9zIGRlIGZhemVyIGlzc28gw6kgcXVlIHRhbCB0cmFuc2Zvcm1hw6fDo28gZXN0YWJpbGl6YSBhIHZhcmnDom5jaWEgZG9zIGRhZG9zLiBOZXN0ZSBzZW50aWRvLCBvYnRlbW9zIG9zIHJldG9ybm9zIHBhcmEgYSBhw6fDo28gZGEgTWljcm9zb2Z0IGUgY29tbyBtb3N0cmEgbyBncsOhZmljbyBhY2ltYSwgYSB2YXJpw6JuY2lhIG1lbGhvcm91IGVtIGZ1bsOnw6NvIGRlIG7Do28gdGVybW9zIG1haXMgdW1hIHRlbmTDqm5jaWEgbsOjbyBkZXRlcm1pbsOtc3RpY2EuCgozLiBDbGFyYW1lbnRlLCBvcyBkYWRvcyBzw6NvIGVzdGFjaW9uw6FyaW9zLCBlbSBmdW7Dp8OjbyBkZSBzZXJlbSByZXRvcm5vcy4gTWVzbW8gYXNzaW0sIGV4ZWN1dGFtb3MgbyB0ZXN0ZSBkZSByYWl6IHVuaXTDoXJpYSBBREYgY29tICQyJCBkZWZhc2FnZW5zLgoKYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CiMgQXF1aSwgdXNhbW9zIGEgZnVuw6fDo28gYWRmVGVzdCBkbyBwYWNvdGUgZlVuaXRSb290cyBwYXJhIHRlc3RhciBzZSBow6EgcmFpeiB1bml0w6FyaWEgbmEgc8OpcmllIHRlbXBvcmFsIGF2YWxpYWRhLiAKIyBDb21vIG9ic2VydmFtb3Mgbm8gZ3LDoWZpY28gZGEgc8OpcmllLCBuw6NvIGjDoSB0ZW5kw6puY2lhIG5vcyBkYWRvcyBlIGFzc2ltIG8gdGVzdGUgdmVyaWZpY2Fyw6Egc2UgYSBzw6lyaWUgc2UgY29tcG9ydGEKIyBjb21vIHVtIHBhc3NlaW8gYWxlYXTDs3JpbyBzZW0gZHJpZnQuIElzdG8gw6kgZXZpZMOqbmNpYWRvIHBvciBtZWlvIGRhIG9ww6fDo28gdHlwZSBxdWUgdGVtIGFzIHNlZ3VpbnRlcyBvcMOnw7VlczoKIyAtIG5jOiBmb3IgYSByZWdyZXNzaW9uIHdpdGggbm8gaW50ZXJjZXB0IChjb25zdGFudCkgbm9yIHRpbWUgdHJlbmQgKHBhc3NlaW8gYWxlYXTDs3JpbykKIyAtIGM6IGZvciBhIHJlZ3Jlc3Npb24gd2l0aCBhbiBpbnRlcmNlcHQgKGNvbnN0YW50KSBidXQgbm8gdGltZSB0cmVuZCAocGFzc2VpbyBhbGVhdMOzcmlvIGNvbSBkcmlmdCkKIyAtIGN0OiBmb3IgYSByZWdyZXNzaW9uIHdpdGggYW4gaW50ZXJjZXB0IChjb25zdGFudCkgYW5kIGEgdGltZSB0cmVuZCAocGFzc2VpbyBhbGVhdMOzcmlvIGNvbSBjb25zdGFudGUgZSB0ZW5kw6puY2lhKQojIEFsw6ltIGRpc3NvLCBkZWZpbmltb3MgcXVlIG5vIG3DoXhpbW8gZHVhcyBkZWZhc2FnZW5zIGRhIHPDqXJpZSBkZXZlbSBzZXIgdXNhZGFzIGNvbW8gdmFyacOhdmVpcyBleHBsaWNhdGl2YXMgZGEgcmVncmVzc8OjbyBkbyB0ZXN0ZS4KdW5pdFJvb3QgPC0gc3VwcHJlc3NXYXJuaW5ncyhmVW5pdFJvb3RzOjphZGZUZXN0KGxvZ21pY3Jvc29mdCxsYWdzPTIsIHR5cGU9YygibmMiKSkpCnByaW50KHVuaXRSb290KQpgYGAKCkNvbW8gcmVzdWx0YWRvIHRlbW9zIHF1ZSBhIGVzdGF0w61zdGljYSBkbyB0ZXN0ZSDDqSBgciByb3VuZCh1bml0Um9vdEB0ZXN0JHN0YXRpc3RpYyw0KWAgY29tIHVtIHAtdmFsb3IgZGUgYHIgcm91bmQodW5pdFJvb3RAdGVzdCRwLnZhbHVlLDQpYC4gQXNzaW0sIGEgaGlww7N0ZXNlIG51bGEgZGUgcmFpeiB1bml0w6FyaWEgcG9kZSBzZXIgcmVqZWl0YWRhIGVtIHF1YWxxdWVyIG7DrXZlbCBkZSBzaWduaWZpY8OibmNpYSByYXpvw6F2ZWwgKDVcJSwgcG9yIGV4ZW1wbG8pIGUgYSBzw6lyaWUgdGVtcG9yYWwgZG8gcmV0b3JubyBkYSBhw6fDo28gKipNU0ZUKiogKE1pY3Jvc29mdCkgbsOjbyB0ZW0gcmFpeiB1bml0w6FyaWEsIG91IHNlamEsIMOpIGVzdGFjaW9uw6FyaWEuIEVtIGZ1bsOnw6NvIGRpc3NvLCB2YW1vcyB0cmFiYWxoYXIgY29tIG9zIHJldG9ybm9zIGVtIG7DrXZlbCBlIGF2YWxpYXIgbyBjb21wb3J0YW1lbnRvIGRhcyBmdW7Dp8O1ZXMgZGUgYXV0b2NvcnJlbGHDp8OjbyBlIGF1dG9jb3JyZWxhw6fDo28gcGFyY2lhbC4gKipPYnMuOiBjYXNvIGEgc8OpcmllIHRlbmhhIHJhaXogdW5pdMOhcmlhIMOpIHByZWNpc28gYXBsaWNhciBhIGRpZmVyZW7Dp2EgbmEgbWVzbWEgZSByZWZhemVyIG8gdGVzdGUgcGFyYSB2ZXJpZmljYXIgc2UgcmVqZWl0YW1vcyBhIGhpcMOzdGVzZSBudWxhIGRlIG7Do28gZXN0YWNpb25hcmllZGFkZSBwYXJhIGEgc8OpcmllIGRhIHByaW1laXJhIGRpZmVyZW7Dp2EgZG9zIHJldG9ybm9zKioKCmBgYHtyLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9OX0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyAgIEZBQyBlIEZBQ1AgICAgIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgQ2FsY3VsYXIgYSBGQUMgdXNhbmRvIG8gb2JqZXRvIGxvZ21pY3Jvc29mdCAocmV0b3Jub3MpCmFjZl9taWNyb3NvZnQgPC0gc3RhdHM6OmFjZihsb2dtaWNyb3NvZnQsIHBsb3QgPSBGQUxTRSwgbmEuYWN0aW9uID0gbmEucGFzcywgbWF4LmxhZyA9IDI1KQojIENhbGN1bGFyIGEgRkFDUCB1c2FuZG8gbyBvYmpldG8gbG9nbWljcm9zb2Z0IChyZXRvcm5vcykKcGFjZl9taWNyb3NvZnQgPC0gc3RhdHM6OnBhY2YobG9nbWljcm9zb2Z0LCBwbG90ID0gRkFMU0UsIG5hLmFjdGlvbiA9IG5hLnBhc3MsIG1heC5sYWcgPSAyNSkKCiMgR3LDoWZpY28gZGEgRkFDIGUgRkFDUCBqdW50b3MuIEFxdWkgdXNhbW9zIGEgb3DDp8OjbyBwYXIobWZyb3c9YygyLDEpKSBxdWUgCiMgZGl2aWRlIGEgdGVsYSBkZSBncsOhZmljb3MgZW0gdW1hIG1hdHJpeCBjb20gMiBsaW5oYXMgZSAxIGNvbHVuYXMuCnBhcihtZnJvdz1jKDIsMSkpCnBsb3QoYWNmX21pY3Jvc29mdCwgbWFpbiA9ICIiLCB5bGFiID0gIiIsIHhsYWIgPSAiRGVmYXNhZ2VtIikKdGl0bGUoIkZ1bsOnw6NvIGRlIEF1dG9jb3JyZWxhw6fDo28gKEZBQykgZG9zIFJldG9ybm9zIGRhIE1pY3Jvc29mdCIsIGFkaiA9IDAuNSwgbGluZSA9IDEpCnBsb3QocGFjZl9taWNyb3NvZnQsIG1haW4gPSAiIiwgeWxhYiA9ICIiLCB4bGFiID0gIkRlZmFzYWdlbSIpCnRpdGxlKCJGdW7Dp8OjbyBkZSBBdXRvY29ycmVsYcOnw6NvIFBhcmNpYWwgKEZBQ1ApIGRvcyBSZXRvcm5vcyBkYSBNaWNyb3NvZnQiLCBhZGogPSAwLjUsIGxpbmUgPSAxKQpgYGAKCjQuIEEgRkFDUCBzdWdlcmUgdW0gbW9kZWxvICRBUigyKSQgZW5xdWFudG8gYSBGQUMgc3VnZXJlIHVtIG1vZGVsbyAkTUEoNSkkLiAKCjUuIFVzYW5kbyB0b2RhcyBhcyBjb21iaW5hw6fDtWVzIGRhcyBvcmRlbnMgZW5jb250cmFkYXMgYW50ZXJpb3JtZW50ZSwgZXN0aW1hbW9zIG9zIG1vZGVsb3MgQVJJTUEuIAoKYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CiMgVG9kYXMgYXMgY29tYmluYcOnw7VlcyBwb3Nzw612ZWlzIGRlIHA9MCBhdMOpIHA9bWF4IGUgcT0wIGF0w6kgcT1tYXgKcGFyc19taWNyb3NvZnQgPC0gZXhwYW5kLmdyaWQoYXIgPSAwOjIsIGRpZmYgPSAwLCBtYSA9IDA6NSkKCiMgTG9jYWwgb25kZSBvcyByZXN1bHRhZG9zIGRlIGNhZGEgbW9kZWxvIHNlcsOhIGFybWF6ZW5hZG8KbW9kZWxvX21pY3Jvc29mdCA8LSBsaXN0KCkKCiMgRXN0aW1hciBvcyBwYXLDom1ldHJvcyBkb3MgbW9kZWxvcyB1c2FuZG8gTcOheGltYSBWZXJvc3NpbWlsaGFuw6dhIChNTCkuIFBvciBkZWZhdWx0LCBhIGZ1bsOnw6NvIGFyaW1hCiMgdXNhIGEgaGlww7N0ZXNlIGRlIHF1ZSBvIHRlcm1vIGRlIGVycm8gZG9zIG1vZGVsb3MgYXJpbWEgc2VndWUgdW1hIGRpc3RyaWJ1acOnw6NvIE5vcm1hbApmb3IgKGkgaW4gMTpucm93KHBhcnNfbWljcm9zb2Z0KSkgewogIG1vZGVsb19taWNyb3NvZnRbW2ldXSA8LSBhcmltYSh4ID0gbG9nbWljcm9zb2Z0LCBvcmRlciA9IHVubGlzdChwYXJzX21pY3Jvc29mdFtpLCAxOjNdKSwgbWV0aG9kID0gIk1MIikKfQoKIyBPYnRlciBvIGxvZ2FyaXRtbyBkYSB2ZXJvc3NpbWlsaGFuw6dhICh2YWxvciBtw6F4aW1vIGRhIGZ1bsOnw6NvKQpsb2dfdmVyb3NzaW1pbGhhbmNhX21pY3Jvc29mdCA8LSBsaXN0KCkKZm9yIChpIGluIDE6bGVuZ3RoKG1vZGVsb19taWNyb3NvZnQpKSB7CiAgbG9nX3Zlcm9zc2ltaWxoYW5jYV9taWNyb3NvZnRbW2ldXSA8LSBtb2RlbG9fbWljcm9zb2Z0W1tpXV0kbG9nbGlrCn0KCiMgQ2FsY3VsYXIgbyBBSUMKYWljYXJpbWFfbWljcm9zb2Z0IDwtIGxpc3QoKQpmb3IgKGkgaW4gMTpsZW5ndGgobW9kZWxvX21pY3Jvc29mdCkpIHsKICBhaWNhcmltYV9taWNyb3NvZnRbW2ldXSA8LSBzdGF0czo6QUlDKG1vZGVsb19taWNyb3NvZnRbW2ldXSkKfQoKIyBDYWxjdWxhciBvIEJJQwpiaWNhcmltYV9taWNyb3NvZnQgPC0gbGlzdCgpCmZvciAoaSBpbiAxOmxlbmd0aChtb2RlbG9fbWljcm9zb2Z0KSkgewogIGJpY2FyaW1hX21pY3Jvc29mdFtbaV1dIDwtIHN0YXRzOjpCSUMobW9kZWxvX21pY3Jvc29mdFtbaV1dKQp9CgojIFF1YW50aWRhZGUgZGUgcGFyw6JtZXRyb3MgZXN0aW1hZG9zIHBvciBtb2RlbG8KcXVhbnRfcGFyYW1lbnRyb3NfbWljcm9zb2Z0IDwtIGxpc3QoKQpmb3IgKGkgaW4gMTpsZW5ndGgobW9kZWxvX21pY3Jvc29mdCkpIHsKICBxdWFudF9wYXJhbWVudHJvc19taWNyb3NvZnRbW2ldXSA8LSBsZW5ndGgobW9kZWxvX21pY3Jvc29mdFtbaV1dJGNvZWYpKzEgIyArMSBwb3JxdWUgdGVtb3MgYSB2YXJpw6JuY2lhIGRvIHRlcm1vIGRlIGVycm8gCn0KCiMgTW9udGFyIGEgdGFiZWxhIGNvbSBvcyByZXN1bHRhZG9zCmVzcGVjaWZpY2FjYW9fbWljcm9zb2Z0IDwtIHBhc3RlMCgiQVJJTUEiLHBhcnNfbWljcm9zb2Z0JGFyLCBwYXJzX21pY3Jvc29mdCRkaWZmLCBwYXJzX21pY3Jvc29mdCRtYSkKdGFtYW5ob19hbW9zdHJhX21pY3Jvc29mdCA8LSByZXAobGVuZ3RoKGxvZ21pY3Jvc29mdCksIGxlbmd0aChtb2RlbG9fbWljcm9zb2Z0KSkKcmVzdWx0YWRvX21pY3Jvc29mdCA8LSBkYXRhLmZyYW1lKGVzcGVjaWZpY2FjYW9fbWljcm9zb2Z0LCBsbl92ZXJvc3NpbWlsaGFuY2EgPSB1bmxpc3QobG9nX3Zlcm9zc2ltaWxoYW5jYV9taWNyb3NvZnQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRfcGFyYW1lbnRyb3NfbWljcm9zb2Z0ID0gIHVubGlzdChxdWFudF9wYXJhbWVudHJvc19taWNyb3NvZnQpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhbWFuaG9fYW1vc3RyYV9taWNyb3NvZnQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWljID0gdW5saXN0KGFpY2FyaW1hX21pY3Jvc29mdCksIGJpYyA9IHVubGlzdChiaWNhcmltYV9taWNyb3NvZnQpKQoKIyBHZXJhciB1bWEgdGFiZWxhIHF1ZSBzZXLDoSB2aXN1YWxpemFkYSBubyBkb2N1bWVudG8uIE1haXMgZGV0YWxoZXMgZW0gaHR0cDovL2hhb3podTIzMy5naXRodWIuaW8va2FibGVFeHRyYS8Ka25pdHI6OmthYmxlKHJlc3VsdGFkb19taWNyb3NvZnQsIGZvcm1hdCA9ICJwYW5kb2MiLCBkaWdpdHMgPSBjKDAsMiwwLDAsMiksIGFsaWduID0gJ2MnKQpgYGAKNi4gT3MgcmVzdWx0YWRvcyBtb3N0cmFtIHF1ZSBvIG1vZGVsbyAkQVJJTUEoMSwwLDEpJCDDqSBvIG1vZGVsbyBlc2NvbGhpZG8sIHBvaXMgdGVtIG8gbWVub3IgQklDLgoKNy4gQSBGQUMgZG9zIHJlc8OtZHVvcyBkbyBtb2RlbG8gbW9zdHJhIHF1ZSBhIG1haW9yIHBhcnRlIGRhcyBhdXRvY29ycmVsYcOnw7VlcyBlc3TDo28gZGVudHJvIGRvcyBsaW1pdGVzLCBpbmRpY2FuZG8gcXVlIG9zIHJlc8OtZHVvcyBuw6NvIGFwcmVzZW50YW0gYXV0b2NvcnJlbGHDp8OjbyBzZXJpYWwuCgpgYGB7ciwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTksIGZpZy5oZWlnaHQ9NSx3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQojIEZ1bsOnw6NvIGRlIGF1dG9jb3JyZWxhw6fDo28gZG9zIHJlc8OtZHVvcwphY2ZfYXJpbWExMDFfZXN0IDwtIHN0YXRzOjphY2YobW9kZWxvX21pY3Jvc29mdFtbNV1dJHJlc2lkdWFscywgbmEuYWN0aW9uID0gbmEucGFzcywgcGxvdCA9IEZBTFNFLCBsYWcubWF4ID0gMTUpCgojIEdyw6FmaWNvIGRhIGZ1bsOnw6NvIGRlIGF1dG9jb3JyZWxhw6fDo28uIApwbG90KGFjZl9hcmltYTEwMV9lc3QsIG1haW4gPSAiIiwgeWxhYiA9ICIiLCB4bGFiID0gIkRlZmFzYWdlbSIpCnRpdGxlKCJGdW7Dp8OjbyBkZSBBdXRvY29ycmVsYcOnw6NvIChGQUMpIGRvcyBSZXPDrWR1b3MgZG8gQVJJTUEoMSwwLDEpIiwgYWRqID0gMC41LCBsaW5lID0gMSkKYGBgCgpQb3LDqW0sIGFvIGFuYWxpc2FyIGEgcHJlc2Vuw6dhIGRlIGhldGVyb2NlZGFzdGljaWRhZGUgY29uZGljaW9uYWwgcG9yIG1laW8gZGEgRkFDIGRvcyByZXPDrWR1b3MgYW8gcXVhZHJhZG8sIGVuY29udHJhbW9zIGRpdmVyc2FzIGRlZmFzYWdlbnMgZXN0YXRpc3RpY2FtZW50ZSBzaWduaWZpY2FudGVzIGluZGljYW5kbyBhIHByZXNlbsOnYSBkZSBoZXRlcm9jZWRhc3RpY2lkYWRlIGNvbmRpY2lvbmFsIG5vcyByZXPDrWR1b3Mgb2J0aWRvcyBkbyBtb2RlbG8uIElzc28gw6kgZXNwZXJhZG8gZGFkbyBxdWUgZXN0YW1vcyB0cmFiYWxoYW5kbyBjb20gcmV0b3Jub3MgZSBjb21vIGFwcmVuZGVtb3MgYW50ZXJpb3JtZW50ZSBwb3IgbWVpbyBkb3MgZmF0b3MgZXN0aWxpemFkb3MsIGV4aXN0ZW0gY2x1c3RlcnMgZGUgdm9sYXRpbGlkYWRlIG5hIHPDqXJpZSB0ZW1wb3JhbCBkZSByZXRvcm5vcyBkZSB1bSBhdGl2byBmaW5hbmNlaXJvLiBOZXN0ZSBzZW50aWRvLCDDqSBuZWNlc3PDoXJpbyBtb2RlbGFyIG8gc2VndW5kbyBtb21lbnRvIGNvbmRpY2lvbmFsIGRlc3RhIHPDqXJpZSAodmFyacOibmNpYSBjb25kaWNpb25hbCkgZSBpc3NvIHNlcsOhIGZlaXRvIHBlbGEgZmFtw61saWEgZGUgbW9kZWxvcyBkZSBoZXRlcm9jZWRhc3RpY2lkYWRlIGNvbmRpY2lvbmFsIChlc3R1ZGFkb3MgcG9zdGVyaW9ybWVudGUpLgoKYGBge3IsIGVjaG89RkFMU0UsIGZpZy53aWR0aD05LCBmaWcuaGVpZ2h0PTUsd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KIyBUZXN0ZSBkZSBoZXRlcm9jZWRhc3RpY2lkYWRlIGNvbmRpY2lvbmFsCmFjZl9hcmltYTEwMV9zcXVhcmUgPC0gYWNmKG1vZGVsb19taWNyb3NvZnRbWzVdXSRyZXNpZHVhbHNeMiwgbmEuYWN0aW9uID0gbmEucGFzcywgcGxvdCA9IEZBTFNFLCBsYWcubWF4ID0gMjApCnBsb3QoYWNmX2FyaW1hMTAxX3NxdWFyZSwgbWFpbiA9ICIiLCB5bGFiID0gIiIsIHhsYWIgPSAiRGVmYXNhZ2VtIikKdGl0bGUoIkZBQyBkbyBxdWFkcmFkbyBkb3MgcmVzw61kdW9zIGRvIEFSSU1BKDEsMCwxKSIsIGFkaiA9IDAuNSwgbGluZSA9IDEpCmBgYAoKUG9yIGZpbSwgYXZhbGlhbW9zIHNlIG9zIHJlc8OtZHVvcyBzw6NvIG5vcm1hbG1lbnRlIGRpc3RyaWJ1w61kb3MgcG9yIG1laW8gZG9zIHRlc3RlcyBkZSBTaGFwaXJvIGUgSmFycXVlIEJlcmEuIEEgaGlww7N0ZXNlIG51bGEgZG9zIHRlc3RlcyDDqSBxdWUgb3MgZGFkb3Mgc8OjbyBub3JtYWxtZW50ZSBkaXN0cmlidcOtZG9zIGNvbnRyYSBhIGhpcMOzdGVzZSBhbHRlcm5hdGl2YSBxdWUgb3MgZGFkb3MgbsOjbyBzw6NvIG5vcm1hbG1lbnRlIGRpc3RyaWJ1w61kb3MuIFNhYmVtb3MgcXVlIG8gcC12YWxvciDDqSBvIG7DrXZlbCBkZSBzaWduaWZpY8OibmNpYSBtw61uaW1vIHBhcmEgc2UgcmVqZWl0YXIgYSBoaXDDs3Rlc2UgbnVsYS4gQXNzaW0sIHF1ZXJlbW9zIHVtIHAtdmFsb3IgYWx0byAoPjAsMDUpIG8gcXVlIG7Do28gbm9zIHBlcm1pdGUgcmVqZWl0w6EtbGEuCgpDb21vIHJlc3VsdGFkbywgZW5jb250cmFtb3MgcXVlIMOpIHBvc3PDrXZlbCByZWplaXRhciBhIGhpcMOzdGVzZSBudWxhIGRlIHF1ZSBvcyByZXPDrWR1b3Mgc8OjbyBub3JtYWxtZW50ZSBkaXN0cmlidcOtZG9zIGVtIGZ1bsOnw6NvIGRvIHAtdmFsb3IgZG9zIHRlc3RlcyBzZXIgbWVub3IgcXVlIDAsMDUuCgoKYGBge3IsIGVjaG89RkFMU0V9CiMgVGVzdGUgZGUgTm9ybWFsaWRhZGUgZG9zIHJlc8OtZHVvcy4gQXMgaGlww7N0ZXNlcyBwYXJhIG9zIGRvaXMgdGVzdGVzIHPDo286CiMgIC0gSDA6IHJlc8OtZHVvcyBub3JtYWxtZW50ZSBkaXN0cmlidcOtZG9zCiMgIC0gSDE6IHJlc8OtZHVvcyBuw6NvIHPDo28gbm9ybWFsbWVudGUgZGlzdHJpYnXDrWRvcwpzaGFwaXJvLnRlc3QobmEucmVtb3ZlKG1vZGVsb19taWNyb3NvZnRbWzVdXSRyZXNpZHVhbHMpKQpqYXJxdWUuYmVyYS50ZXN0KG5hLnJlbW92ZShtb2RlbG9fbWljcm9zb2Z0W1s1XV0kcmVzaWR1YWxzKSkKYGBgCgo4LiBFbSBmdW7Dp8OjbyBkZSBub3NzbyBtb2RlbG8gbsOjbyBzZSBjb21wb3J0YXIgZGEgZm9ybWEgZXNwZXJhZGEsIG7Do28gcG9kZW1vcyBmYXplciBwcmV2aXPDtWVzIHVzYW5kbyBvIG1lc21vCgojIyMjIyAqKlJFRkVSw4pOQ0lBUyoq