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 constante1 \(\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).

PASSEIO ALEATÓRIO COM DRIFT E TENDÊNCIA DETERMINÍSTICA

Outro exemplo de passeio aleatório é o que além de um drift tem uma tendência determinística, como segue:

\[ p_{t} = \mu + \gamma t + p_{t-1} + a_{t} \] Agora, temos o parâmetro \(\gamma\) que está determinísticamente relacionado com o tempo (\(t\)). Assim, em cada instante do tempo a série será adicionada por tal parâmetro. O código abaixo mostra como simular um passeio aleatório com drift e tendência determinística no R. Observe que a série temporal apresenta uma tendência mais robusta que a série originada pelo passeio aleatório apenas com drift.

##################################################
####  SIMULAÇÃO PASSEIO ALEATÓRIO  COM DRIFT #####
##################################################

# Simulação de um passeio aleatório com drift e tendência 
n <- 1000
p0 <- 10
mi <- 0.2
gama <- 2
phi1 <- 1
trend <- 1:n
pt_drift_trend <- rep(p0,n)
for (i in 1:(n-1)) {
  pt_drift_trend[i+1] <- mi + gama * trend[i] + phi1*pt_drift_trend[i] + rnorm(1)
}

# Visualização do passeio aleatório com drift
plot(pt_drift_trend, type = "l", xlab = "observações", ylab = "preço", main = "Simulação Passeio Aleatório com Drift e Tendência Determinística")

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 convencional2 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}}} \]

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.

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:

  1. Visualizar os dados e identificar observações fora do padrão (outliers ou dados faltantes) e eliminá-las.
  2. Se necessário, transformar os dados para estabilizar a variância (logaritmo dos dados, variação ou retorno, por exemplo)
  3. 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.
  4. 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).
  5. 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\).
  6. Escolher dentre todos os modelos estimados no passo anterior, o modelo com menor AIC e/ou BIC.
  7. 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
  8. Uma vez que os resíduos são ruído branco, obter as previsões.

  9. Visualizar os dados e identificar observações fora do padrão (outliers ou dados faltantes) e eliminá-las.
  10. Se necessário, transformar os dados para estabilizar a variância (logaritmo dos dados, variação ou retorno, por exemplo)
  11. 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.
  12. 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).
  13. 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\).
  14. Escolher dentre todos os modelos estimados no passo anterior, o modelo com menor AIC e/ou BIC.
  15. 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.
  16. 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:

  1. 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.
  1. 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.

  2. 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

  1. A FACP sugere um modelo \(AR(2)\) enquanto a FAC sugere um modelo \(MA(5)\).

  2. Usando todas as combinações das ordens encontradas anteriormente, estimamos os modelos ARIMA.

especificacao_microsoft ln_verossimilhanca quant_paramentros_microsoft tamanho_amostra_microsoft aic bic
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
  1. Os resultados mostram que o modelo \(ARIMA(1,0,1)\) é o modelo escolhido, pois tem o menor BIC.

  2. 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
  1. 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.


  1. A partir do que foi discutido anteriormente, é importante entender o significado do termo da constante em um modelo de séries temporais. Primeiro, para um MA(q) tal termo é simplesmente a média da série. Segundo, para um modelo AR(p) ou ARMA(p,q) o termo da constante é relacionado à média por meio de \(\mu = {{\phi}_{0}}/{(1-{\phi}_{1}-...-{\phi}_{p})}\). Terceiro, para um passeio aleatório com drift, o termo da constante se torna a inclinação da série temporal.

  2. Porém, sob a hipótese nula, a distribuição do teste não é convencional, ou seja, não é igual à distribuição \(t\), pois \(p_t\) não é estacionário. Dickey and Fuller (1979) recalcularam o valor da estatística \(t\). O valor dessa estatística se altera conforme se define a equação de regressão e segundo o tamanho da amostra. Além disso, a distribuição de probabilidade do teste não é simétrica (maiores detalhes neste link).

LS0tCnRpdGxlOiA8Y2VudGVyPiA8aDI+IDxiPiBSYcOteiBVbml0w6FyaWEgZSBNb2RlbG9zIEFSSU1BIDwvYj4gPC9oMj4gPC9jZW50ZXI+IAphdXRob3I6IDxjZW50ZXI+IEZyYW5rIE1hZ2FsaMOjZXMgZGUgUGluaG8gLSBJQk1FQy9NRyA8L2NlbnRlcj4KZ3JhcGhpY3M6IHllcwpsaW5rY29sb3I6IGJsdWUKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgdGhlbWU6IGNlcnVsZWFuCiAgICBmaWdfY2FwdGlvbjogeWVzCnJlZmVyZW5jZXM6Ci0gaWQ6IHRzYXkyMDE0aW50cm9kdWN0aW9uCiAgdGl0bGU6IEFuIGludHJvZHVjdGlvbiB0byBhbmFseXNpcyBvZiBmaW5hbmNpYWwgZGF0YSB3aXRoIFIKICBhdXRob3I6CiAgLSBmYW1pbHk6IFRzYXkKICAgIGdpdmVuOiBSdWV5IFMKICBwdWJsaXNoZXI6IEpvaG4gV2lsZXkgXCYgU29ucwogIHR5cGU6IGJvb2sKICBpc3N1ZWQ6CiAgICB5ZWFyOiAyMDE0Ci0gaWQ6IGNhbXBiZWxsMTk5N2Vjb25vbWV0cmljcwogIHRpdGxlOiBUaGUgZWNvbm9tZXRyaWNzIG9mIGZpbmFuY2lhbCBtYXJrZXRzCiAgYXV0aG9yOgogIC0gZmFtaWx5OiBDYW1wYmVsbAogICAgZ2l2ZW46IEpvaG4gWQogIC0gZmFtaWx5OiBMbwogICAgZ2l2ZW46IEFuZHJldyBXZW4tQ2h1YW4KICAtIGZhbWlseTogTWFjS2lubGF5CiAgICBnaXZlbjogQXJjaGllIENyYWlnCiAgcHVibGlzaGVyOiBQcmluY2V0b24gKE5KKSBQcmluY2V0b24gVW5pdmVyc2l0eSBQcmVzcwogIHR5cGU6IGJvb2sKICBpc3N1ZWQ6CiAgICB5ZWFyOiAxOTk3Ci0gaWQ6IG1vcmV0dGluMjAwOGVjb25vbWV0cmlhCiAgdGl0bGU6IEVjb25vbWV0cmlhIGZpbmFuY2VpcmEgdW0gY3Vyc28gZW0gc8OpcmllcyB0ZW1wb3JhaXMgZmluYW5jZWlyYXMKICBhdXRob3I6CiAgLSBmYW1pbHk6IE1vcmV0dGluCiAgICBnaXZlbjogUGVkcm8gQWxiZXJ0bwogIHB1Ymxpc2hlcjogRWRnYXJkIEJsdWNoZXIKICB0eXBlOiBib29rCiAgaXNzdWVkOgogICAgeWVhcjogMjAwOAotIGlkOiB0c2F5MjAxMGFuYWx5c2lzCiAgdGl0bGU6IEFuYWx5c2lzIG9mIGZpbmFuY2lhbCB0aW1lIHNlcmllcwogIGF1dGhvcjoKICAtIGZhbWlseTogVHNheQogICAgZ2l2ZW46IFJ1ZXkgUwogIHB1Ymxpc2hlcjogSm9obiBXaWxleSBcJiBTb25zCiAgdHlwZTogYm9vawogIGlzc3VlZDoKICAgIHllYXI6IDIwMTAKLSBpZDogYm94MTk5NHRpbWUKICB0aXRsZTogVGltZSBzZXJpZXMgYW5hbHlzaXMgZm9yZWNhc3RpbmcgYW5kIGNvbnRyb2wKICBhdXRob3I6CiAgLSBmYW1pbHk6IEJveAogICAgZ2l2ZW46IEdlb3JnZSBFUAogIC0gZmFtaWx5OiBKZW5raW5zCiAgICBnaXZlbjogR3dpbHltIE0KICAtIGZhbWlseTogUmVpbnNlbAogICAgZ2l2ZW46IEdyZWdvcnkgQwogIHB1Ymxpc2hlcjogRW5nbGV3b29kIENsaWZmcyBQcmVudGljZSBIYWxsCiAgdHlwZTogYm9vawogIGlzc3VlZDoKICAgIHllYXI6IDE5OTQKLSBpZDogZGlja2V5MTk3OWRpc3RyaWJ1dGlvbgogIHRpdGxlOiBEaXN0cmlidXRpb24gb2YgdGhlIGVzdGltYXRvcnMgZm9yIGF1dG9yZWdyZXNzaXZlIHRpbWUgc2VyaWVzIHdpdGggYSB1bml0IHJvb3QKICBhdXRob3I6CiAgLSBmYW1pbHk6IERpY2tleQogICAgZ2l2ZW46IERhdmlkIEEKICAtIGZhbWlseTogRnVsbGVyCiAgICBnaXZlbjogV2F5bmUgQQogIHZvbHVtZTogNzQKICBpc3N1ZTogMzY2YQogIHB1Ymxpc2hlcjogSm91cm5hbCBvZiB0aGUgQW1lcmljYW4gc3RhdGlzdGljYWwgYXNzb2NpYXRpb24KICBwYWdlOiA0MjctNDMxCiAgdHlwZTogYXJ0aWNsZS1qb3VybmFsCiAgaXNzdWVkOgogICAgeWVhcjogMTk3OQpub2NpdGU6IHwgCiAgQHRzYXkyMDE0aW50cm9kdWN0aW9uLCBAY2FtcGJlbGwxOTk3ZWNvbm9tZXRyaWNzLCBAbW9yZXR0aW4yMDA4ZWNvbm9tZXRyaWEsIEB0c2F5MjAxMGFuYWx5c2lzLCBAYm94MTk5NHRpbWUsIEBkaWNrZXkxOTc5ZGlzdHJpYnV0aW9uCi0tLQoKRXN0ZSBtYXRlcmlhbCB0ZW0gY29tbyBvYmpldGl2byBjb250cmlidWlyIHBhcmEgbyBlbnRlbmRpbWVudG8gc29icmUgKipwcm9jZXNzb3MgbsOjbyBlc3RhY2lvbsOhcmlvcyBlIHNlbSBzYXpvbmFsaWRhZGUqKi4gUGFyYSB0YW50bywgdmFtb3MgbW9zdHJhciBjb21vIHJlYWxpemFyIHRlc3RlcyBlc3RhdMOtc3RpY29zIHBhcmEgdmVyaWZpY2FyIGEgZXN0YWNpb25hcmllZGFkZSBkZSB1bWEgc8OpcmllIHRlbXBvcmFsIGUgbyBpbXBhY3RvIGRlIG7Do28gZXN0YWNpb25hcmllZGFkZSBub3MgbW9kZWxvcyBBUk1BIGVzdHVkYWRvcyBhbnRlcmlvcm1lbnRlLiAKCiMjIyMjICoqSU5UUk9EVcOHw4NPKioKCkF0w6kgbyBtb21lbnRvLCBmb2NhbW9zIHNvYnJlIGEgc8OpcmllIGRvcyByZXRvcm5vcyBxdWUgZW0gZnVuw6fDo28gZGUgb3NjaWxhciBlbSB1bSBpbnRlcnZhbG8gcXVhc2Ugc2VtcHJlIGNvbnRyb2xhZG8gKC0xIGEgMSkgdGVuZGUgYSBzZXIgZXN0YWNpb27DoXJpYS4gUG9yw6ltLCBlbSBhbGd1bnMgZXN0dWRvcyB0ZW1vcyBpbnRlcmVzc2UgbmEgYXZhbGlhw6fDo28gZGUgb3V0cmFzIHPDqXJpZXMgdGVtcG9yYWlzICoqKHRheGEgZGUganVyb3MsIGPDom1iaW8sIGluZmxhw6fDo28sIGNyZXNjaW1lbnRvIGVjb27DtG1pY28pKiouCgpFc3RhcyBzw6lyaWVzIHRlbmRlbSBhIHNlciBuw6NvIGVzdGFjaW9uw6FyaWFzLCBwb2lzIG7Do28gb3NjaWxhbSBlbSB0b3JubyBkZSB1bWEgbcOpZGlhIGUgY29tIHZhcmnDom5jaWEgY29uc3RhbnRlLiBOYSBsaXRlcmF0dXJhIGRlIHPDqXJpZXMgdGVtcG9yYWlzLCBjaGFtYW1vcyB0YWlzIHPDqXJpZXMgZGUgKipzw6lyaWVzIGNvbSByYWl6IHVuaXTDoXJpYSoqLiBVbSBib20gZXhlbXBsbyBkZSBzw6lyaWUgY29tIHJhaXogdW5pdMOhcmlhIMOpIG8gKipwYXNzZWlvIGFsZWF0w7NyaW8qKiBlIGFiYWl4bywgbW9zdHJhbW9zIGFsZ3VtYXMgcHJvcHJpZWRhZGVzIGRlc3RhIHPDqXJpZSB0ZW1wb3JhbC4KCiMjIyMjICoqUEFTU0VJTyBBTEVBVMOTUklPKioKClVtYSBzw6lyaWUgdGVtcG9yYWwgJHtcbGVmdFx7e3B9X3t0fVxyaWdodFx9fV97dD0xfV57VH0kIMOpIHVtIHBhc3NlaW8gYWxlYXTDs3JpbyBzZSBlbGEgc2F0aXNmYXo6CgokJApwX3t0fT1wX3t0LTF9K2Ffe3R9CiQkCm9uZGUgcG9kZW1vcyBmYXplciAkcF8wJCB1bSBuw7ptZXJvIHJlYWwgZGVub3RhbmRvIG8gdmFsb3IgaW5pY2lhbCBkbyBwcm9jZXNzbyBlICRhX3QkIMOpIHVtIHJ1w61kbyBicmFuY28gY29tIG3DqWRpYSAkMCQsIHZhcmnDom5jaWEgJFxzaWdtYV97YX1eezJ9JCwgJEVcbGVmdFsgXGxlZnQoYV90LVxiYXJ7YX1ccmlnaHQpXGxlZnQoYV97dC1sfS1cYmFye2F9XHJpZ2h0KVxyaWdodF09RVthX3t0fWFfe3QtbH1dPTAkIGUgaW5kZXBlbmRlbnRlIGUgaWRlbnRpY2FtZW50ZSBkaXN0cmlidcOtZG8gKGlpZCkuCgpTZSBhc3N1bWltb3MgcXVlICRwX3t0fSQgw6kgbyBsb2dhcml0bW8gZG8gcHJlw6dvIGRlIHVtYSBhw6fDo28gZW0gJHQkLCBlbnTDo28gJHBfezB9JCBzZXJpYSBvIGxvZ2FyaXRtbyBkbyBwcmXDp28gaW5pY2lhbCBkYSBhw6fDo28gZW0gdW0gSVBPICgqaW5pdGlhbCBwdWJsaWMgb2ZmZXJpbmcqKS4gU2UgJGFfe3R9JCB0ZW0gdW1hIGRpc3RyaWJ1acOnw6NvIHNpbcOpdHJpY2EgZW0gdG9ybm8gZGUgJDAkIGNvbW8gYSBOb3JtYWwsIGVudMOjbyBjb25kaWNpb25hZG8gYSAkcF97dC0xfSQsICRwX3t0fSQgdGVtIDUwXCUgZGUgY2hhbmNlcyBkZSBzdWJpciBvdSBkZXNjZXIsIGltcGxpY2FuZG8gcXVlICRwX3QkIGRldmVyaWEgc3ViaXIgb3UgZGVzY2VyIGFsZWF0w7NyaWFtZW50ZS4gCgpTZSB0cmF0YXJtb3MgdW0gcGFzc2VpbyBhbGVhdMOzcmlvIGNvbW8gdW0gY2FzbyBlc3BlY2lhbCBkZSAqKkFSKDEpKiogcXVhbmRvIG7Do28gdGVtb3MgaW50ZXJjZXB0bywgZW50w6NvIG8gY29lZmljaWVudGUgZGUgJHBfe3QtMX0kIMOpIGlndWFsIGEgJDEkLCBxdWUgbsOjbyBzYXRpc2ZheiBhIGNvbmRpw6fDo28gZGUgZXN0YWNpb25hcmllZGFkZSBmcmFjYSAoJFxsZWZ0fCB7XHBoaX1fezF9IFxyaWdodHwgPCAxJCkgbW9zdHJhZGEgYW50ZXJpb3JtZW50ZSBwYXJhIG8gbW9kZWxvICoqQVIoMSkqKi4gQXNzaW0sIG8gcGFzc2VpbyBhbGVhdMOzcmlvIMOpIG7Do28gZXN0YWNpb27DoXJpbyBlIMOpIGNoYW1hZG8gZGUgc8OpcmllIHRlbXBvcmFsIGNvbSAqKnJhaXogdW5pdMOhcmlhKiouIEFiYWl4bywgZXhlbXBsbyBkZSBjb21vIHNpbXVsYXIgdW0gcGFzc2VpbyBhbGVhdMOzcmlvIG5vIFIuCgpgYGB7ciwgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD05fQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyAgU0lNVUxBw4fDg08gUEFTU0VJTyBBTEVBVMOTUklPICMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBGaXhhciBhIHJhw616IHBhcmEgcXVlIGEgc2ltdWxhw6fDo28gZ2VyZSBvcyBtZXNtb3MgZGFkb3MgZW0gcXVhbHF1ZXIgY29tcHV0YWRvciAKc2V0LnNlZWQoMTIzKSAKCiMgU2ltdWxhw6fDo28gZGUgdW0gcGFzc2VpbyBhbGVhdMOzcmlvCm4gPC0gMTAwMApwMCA8LSAxMApwaGkxIDwtIDEKcHQgPC0gcmVwKHAwLG4pCmZvciAoaSBpbiAxOihuLTEpKSB7CiAgcHRbaSsxXSA8LSBwaGkxKnB0W2ldICsgcm5vcm0oMSkKfQoKIyBWaXN1YWxpemHDp8OjbyBkbyBwYXNzZWlvIGFsZWF0w7NyaW8uCnBsb3QocHQsIHR5cGUgPSAibCIsIHhsYWIgPSAib2JzZXJ2YcOnw7VlcyIsIHlsYWIgPSAicHJlw6dvIiwgbWFpbiA9ICJTaW11bGHDp8OjbyBQYXNzZWlvIEFsZWF0w7NyaW8iKQpgYGAKCk9ic2VydmUgbm8gZ3LDoWZpY28gcXVlIG8gcGFzc2VpbyBhbGVhdMOzcmlvIGluaWNpb3UgZW0gMTAgKHZhbG9yIGRlZmluaWRvIGNvbW8gYHBoaTBgIG5hIHNpbXVsYcOnw6NvKSBlIGFww7NzIGlzc28gb3NjaWxvdSwgY29uZGljaW9uYWRvIGFvIHZhbG9yIGFudGVyaW9yLCBlbSBmdW7Dp8OjbyBkZSB1bSBuw7ptZXJvIGFsZWF0w7NyaW8gb2J0aWRvIGEgcGFydGlyIGRlIHVtYSBkaXN0cmlidWnDp8OjbyBOb3JtYWwgY29tIG3DqWRpYSB6ZXJvIGUgdmFyacOibmNpYSAxIChkZWZpbmlkbyBjb21vIGBybm9ybSgxKWAgbmEgc2ltdWxhw6fDo28pLgoKQ2FzbyB1bWEgc8OpcmllIHRlbXBvcmFsIGRlIHByZcOnb3MgZGUgdW0gYXRpdm8gZmluYW5jZWlybyAobG9nYXJpdG1vIGRvcyBwcmXDp29zKSBzZSBjb21wb3J0ZSBjb21vIHVtIHBhc3NlaW8gYWxlYXTDs3JpbywgdGVyZW1vcyBxdWUgbyBwcmXDp28gZGUgdW1hIGHDp8OjbyBuw6NvIMOpIHByZWRpesOtdmVsLiBQYXJhIHZlciBpc3RvLCB2YW1vcyBmYXplciBhIHByZXZpc8OjbyB1bSBwYXNzbyDDoCBmcmVudGUgZG8gbW9kZWxvOgoKJCQKXGJlZ2lue3NwbGl0fQpwX3t0KzF9ICY9IHBfe3QrMS0xfSthX3t0KzF9IFxcCiYgXFwKJiA9IHBfe3R9K2Ffe3QrMX0gXFwKJiBcXApFXGxlZnRbcF97dCsxfXxwX3t0fSxwX3t0LTF9LC4uLlxyaWdodF0gJj0gRVxsZWZ0W3Bfe3R9XHJpZ2h0XSArIEVcbGVmdFthX3t0KzF9XHJpZ2h0XSBcXAomIFxcCiY9IHBfe3R9ICsgMCAgXFwKJiBcXAomPSBwX3t0fQpcZW5ke3NwbGl0fQokJAoKcXVlIMOpIG8gbG9nYXJpdG1vIGRvIHByZcOnbyBkYSBhw6fDo28gbmEgb3JpZ2VtLiBFc3RhIHByZXZpc8OjbyBuw6NvIHRlbSB2YWxvciBwcsOhdGljby4gQSBwcmV2aXPDo28gZG9pcyBwYXNzb3Mgw6AgZnJlbnRlIHNlcmlhOgoKJCQKXGJlZ2lue3NwbGl0fQpwX3t0KzJ9ICY9IHBfe3QrMi0xfSthX3t0KzJ9IFxcCiYgXFwKJiA9IHBfe3QrMX0rYV97dCsyfSBcXAomIFxcCkVcbGVmdFtwX3t0KzJ9fHBfe3QrMX0scF97dH0scF97dC0xfSwuLi5ccmlnaHRdICY9IEVcbGVmdFtwX3t0KzF9fHBfe3R9LHBfe3QtMX0sLi4uXHJpZ2h0XSArIEVcbGVmdFthX3t0KzJ9XHJpZ2h0XSBcXAomIFxcCiY9IHBfe3R9ICsgMCAgXFwKJiBcXAomPSBwX3t0fQpcZW5ke3NwbGl0fQokJAoKcXVlIG5vdmFtZW50ZSDDqSBvIGxvZ2FyaXRtbyBkbyBwcmXDp28gbmEgb3JpZ2VtIGRhIHByZXZpc8Ojby4gRGUgZmF0bywgcGFyYSBxdWFscXVlciBob3Jpem9udGUgZGUgcHJldmlzw6NvICRsPjAkLCB0ZW1vczoKCiQkCkVcbGVmdFtwX3t0K2x9fHBfe3QrbC0xfSwuLi5ccmlnaHRdID0ge3B9X3t0fQokJApBc3NpbSwgcGFyYSB0b2RvcyBvcyBob3Jpem9udGVzIGRlIHByZXZpc8OjbywgbyB2YWxvciBwcmV2aXN0byBkZSB1bSBwYXNzZWlvIGFsZWF0w7NyaW8gw6kgc2ltcGxlc21lbnRlIG8gdmFsb3IgZGEgc8OpcmllIG5hIG9yaWdlbSBkYSBwcmV2aXPDo28gKHRlbW9zIGNvbW8gb3JpZ2VtIGEgw7psdGltYSBvYnNlcnZhw6fDo28gYW50ZXMgZGUgc2UgaW5pY2lhciBhIHByZXZpc8Ojbywgb3Ugc2VqYSwgbyDDumx0aW1vIHByZcOnbyBzZW1wcmUgc2VyaWEgYSBtZWxob3IgcHJldmlzw6NvIHBhcmEgcXVhbHF1ZXIgaG9yaXpvbnRlIGRlIHByZXZpc8OjbykuIAoKIyMjIyMgKipQQVNTRUlPIEFMRUFUw5NSSU8gQ09NIERSSUZUKioKCkNvbW8gdmltb3MgZW0gYWxndW5zIGV4ZW1wbG9zLCDDqSBwb3Nzw612ZWwgcXVlIHVtYSBzw6lyaWUgdGVtcG9yYWwgdGVuaGEgdW0gdmFsb3IgbcOpZGlvIGRpZmVyZW50ZSBkZSB6ZXJvLiBJc3RvIGltcGxpY2EgcXVlIG8gbW9kZWxvIHBhcmEgbyBsb2dhcml0bW8gZG9zIHByZcOnb3MgKGhpcG90ZXRpY2FtZW50ZSwgcG9pcyBuw6NvIGVzcGVyYW1vcyByZXRvcm5vcyBkaWZlcmVudGUgZGUgemVybyBlbSBtw6lkaWEpIMOpOgoKJCQKcF97dH0gPSBcbXUgKyBwX3t0LTF9ICsgYV97dH0KJCQKb25kZSAkXG11PUVbcF97dH0tcF97dC0xfV0kIGUgJGFfe3R9JCDDqSB1bSBydcOtZG8gYnJhbmNvIGNvbSBtw6lkaWEgJDAkLCB2YXJpw6JuY2lhICRcc2lnbWFfe2F9XnsyfSQsICRFXGxlZnRbIFxsZWZ0KGFfdC1cYmFye2F9XHJpZ2h0KVxsZWZ0KGFfe3QtbH0tXGJhcnthfVxyaWdodClccmlnaHRdPUVbYV97dH1hX3t0LWx9XT0wJCBlIGluZGVwZW5kZW50ZSBlIGlkZW50aWNhbWVudGUgZGlzdHJpYnXDrWRvIChpaWQpLgoKTyB0ZXJtbyBkZSBjb25zdGFudGVbXjFdICRcbXUkIGRvIG1vZGVsbyDDqSBtdWl0byBpbXBvcnRhbnRlIGVtIGZpbmFuw6dhcy4gRWxlIHJlcHJlc2VudGEgYSB0ZW5kw6puY2lhIHRlbXBvcmFsIGRvIGxvZ2FyaXRtbyBkb3MgcHJlw6dvcyAoJHBfe3R9JCkgZSDDqSBmcmVxdWVudGVtZW50ZSBjaGFtYWRvIGRlICpkcmlmdCogZG8gbW9kZWxvLiBQYXJhIHZlciBpc3RvLCBhc3N1bWEgcXVlIHRlbW9zIG8gdmFsb3IgZG8gbG9nYXJpdG1vIGluaWNpYWwgZG8gcHJlw6dvIHF1ZSDDqSByZXByZXNlbnRhZG8gcG9yICRwXzAkLiBFbnTDo28sIAoKW14xXTogQSBwYXJ0aXIgZG8gcXVlIGZvaSBkaXNjdXRpZG8gYW50ZXJpb3JtZW50ZSwgw6kgaW1wb3J0YW50ZSBlbnRlbmRlciBvIHNpZ25pZmljYWRvIGRvIHRlcm1vIGRhIGNvbnN0YW50ZSBlbSB1bSBtb2RlbG8gZGUgc8OpcmllcyB0ZW1wb3JhaXMuIFByaW1laXJvLCBwYXJhIHVtICoqTUEocSkqKiB0YWwgdGVybW8gw6kgc2ltcGxlc21lbnRlIGEgbcOpZGlhIGRhIHPDqXJpZS4gU2VndW5kbywgcGFyYSB1bSBtb2RlbG8gKipBUihwKSoqIG91ICoqQVJNQShwLHEpKiogbyB0ZXJtbyBkYSBjb25zdGFudGUgw6kgcmVsYWNpb25hZG8gw6AgbcOpZGlhIHBvciBtZWlvIGRlICRcbXUgPSB7e1xwaGl9X3swfX0veygxLXtccGhpfV97MX0tLi4uLXtccGhpfV97cH0pfSQuIFRlcmNlaXJvLCBwYXJhIHVtIHBhc3NlaW8gYWxlYXTDs3JpbyBjb20gKmRyaWZ0KiwgbyB0ZXJtbyBkYSBjb25zdGFudGUgc2UgdG9ybmEgYSBpbmNsaW5hw6fDo28gZGEgc8OpcmllIHRlbXBvcmFsLgoKCiQkCnBfMT1cbXUgKyBwX3swfSArIGFfe3R9CiQkCgokJApwXzI9XG11ICsgcF97MX0gKyBhX3syfSA9IDJcbXUgKyBwX3swfSArIGFfezJ9ICsgYV97MX0KJCQKJCQKLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgokJAokJApwX3Q9dFxtdSArIHBfezB9ICsgYV97dH0gKyBhX3t0LTF9ICsgLi4uKyBhX3sxfQokJAoKQSDDumx0aW1hIGVxdWHDp8OjbyBtb3N0cmEgcXVlIG8gbG9nYXJpdG1vIGRvIHByZcOnbyBjb25zaXRlIGRlIHVtYSB0ZW5kw6puY2lhIHRlbXBvcmFsICgkdFxtdSQpIGUgdW0gcGFzc2VpbyBhbGVhdMOzcmlvICgkXHN1bV97aT0xfV57dH17e2F9X3tpfX0kKS4gRW0gZnVuw6fDo28gZGUgJFZBUihcc3VtX3tpPTF9Xnt0fXt7YX1fe2l9fSk9dFxzaWdtYV97YX1eezJ9JCwgb25kZSAkXHNpZ21hX3thfV57Mn0kIMOpIGEgdmFyacOibmNpYSBkZSAkYV97dH0kLCBvIGRlc3ZpbyBwYWRyw6NvIGNvbmRpY2lvbmFsIGRlICRwX3t0fSQgw6kgJFxzcXJ0e3Rcc2lnbWFfe2F9fSQsIHF1ZSBjcmVzY2UgYSB1bWEgdGF4YSBtYWlzIGxlbnRhIGRvIHF1ZSBvIHZhbG9yIGVzcGVyYWRvICRFW3BfdF09IHBfMCtcbXUgdCQuIFBvcnRhbnRvLCBzZSBkZXNlbmhhcm1vcyB1bSBncsOhZmljbyBkZSAkcF97dH0kIGNvbnRyYSAkdCQsIHRlcmVtb3MgdW1hIHRlbmTDqm5jaWEgdGVtcG9yYWwgY29tIGluY2xpbmHDp8OjbyAkXG11JC4gVW1hIGluY2xpbmHDp8OjbyBwb3NpdGl2YSwgb3Ugc2VqYSwgJFxtdT4wJCwgaW5kaWNhIHF1ZSBvIGxvZ2FyaXRtbyBkb3MgcHJlw6dvcyBldmVudHVhbG1lbnRlIHRlbmRlcsOhIGFvIGluZmluaXRvLiBFbSBjb250cmFwYXJ0aWRhLCBzZSAkXG11PDAkIG8gbG9nYXJpdG1vIGRvcyBwcmXDp29zIHRlbmRlcsOhIGEgJC1caW5mdHkkIG5hIG1lZGlkYSBxdWUgJHQkIGF1bWVudGFyLgoKQWJhaXhvLCBjw7NkaWdvIGVtIFIgcXVlIG1vc3RyYSBjb21vIHNpbXVsYXIgdW0gcGFzc2VpbyBhbGVhdMOzcmlvIGNvbSAqZHJpZnQqOgoKYGBge3IsIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9OX0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyAgU0lNVUxBw4fDg08gUEFTU0VJTyBBTEVBVMOTUklPICBDT00gRFJJRlQgIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgU2ltdWxhw6fDo28gZGUgdW0gcGFzc2VpbyBhbGVhdMOzcmlvIGNvbSBkcmlmdCAocHQgPSBtaSArIHBoaTEqcHQtMSArIGF0KQpuIDwtIDEwMDAKcDAgPC0gMTAKbWkgPC0gMC4yCnBoaTEgPC0gMQpwdF9kcmlmdCA8LSByZXAocDAsbikKZm9yIChpIGluIDE6KG4tMSkpIHsKICBwdF9kcmlmdFtpKzFdIDwtIG1pICsgcGhpMSpwdF9kcmlmdFtpXSArIHJub3JtKDEpCn0KCiMgVmlzdWFsaXphw6fDo28gZG8gcGFzc2VpbyBhbGVhdMOzcmlvIGNvbSBkcmlmdApwbG90KHB0X2RyaWZ0LCB0eXBlID0gImwiLCB4bGFiID0gIm9ic2VydmHDp8O1ZXMiLCB5bGFiID0gInByZcOnbyIsIG1haW4gPSAiU2ltdWxhw6fDo28gUGFzc2VpbyBBbGVhdMOzcmlvIGNvbSBEcmlmdCIpCmBgYAoKT2JzZXJ2ZSBxdWUgc2Ugdm9jw6ogYWx0ZXJhciBvIHZhbG9yIGRlIGBtaWAgcGFyYSB1bSBuw7ptZXJvIHBvc2l0aXZvIG91IG5lZ2F0aXZvIGUgdmlzdWFsaXphciBhIHPDqXJpZSwgcGVyY2ViZXLDoSBxdWUgdGFsIHBhcsOibWV0cm8gbXVkYXLDoSBhIGRpcmXDp8OjbyBkYSBjdXJ2YSAocGFyYSBiYWl4bywgc2UgbmVnYXRpdm8gZSBwYXJhIGNpbWEsIHNlIHBvc2l0aXZvKS4gQWzDqW0gZGlzc28sIHNlIHZvY8OqIGFsdGVyYXIgbyB2YWxvciBkZSBgcGhpMWAgcGFyYSB1bSB2YWxvciBtZW5vciBxdWUgMSBlIHZpc3VhbGl6YXIgb3MgZGFkb3MgdGVyw6EgdW1hIHPDqXJpZSBlc3RhY2lvbsOhcmlhLCBjb21vIGVzcGVyYWRvIChsZW1icmUgZGEgcmVzdHJpw6fDo28gc29icmUgdGFsIHBhcsOibWV0cm8gbmEgZGVyaXZhw6fDo28gZG8gbW9kZWxvIEFSKS4KCiMjIyMjICoqUEFTU0VJTyBBTEVBVMOTUklPIENPTSBEUklGVCBFIFRFTkTDik5DSUEgREVURVJNSU7DjVNUSUNBKioKCk91dHJvIGV4ZW1wbG8gZGUgcGFzc2VpbyBhbGVhdMOzcmlvIMOpIG8gcXVlIGFsw6ltIGRlIHVtIGRyaWZ0IHRlbSB1bWEgdGVuZMOqbmNpYSBkZXRlcm1pbsOtc3RpY2EsIGNvbW8gc2VndWU6CgokJApwX3t0fSA9IFxtdSArIFxnYW1tYSB0ICsgcF97dC0xfSArIGFfe3R9CiQkCkFnb3JhLCB0ZW1vcyBvIHBhcsOibWV0cm8gJFxnYW1tYSQgcXVlIGVzdMOhIGRldGVybWluw61zdGljYW1lbnRlIHJlbGFjaW9uYWRvIGNvbSBvIHRlbXBvICgkdCQpLiBBc3NpbSwgZW0gY2FkYSBpbnN0YW50ZSBkbyB0ZW1wbyBhIHPDqXJpZSBzZXLDoSBhZGljaW9uYWRhIHBvciB0YWwgcGFyw6JtZXRyby4gTyBjw7NkaWdvIGFiYWl4byBtb3N0cmEgY29tbyBzaW11bGFyIHVtIHBhc3NlaW8gYWxlYXTDs3JpbyBjb20gZHJpZnQgZSB0ZW5kw6puY2lhIGRldGVybWluw61zdGljYSBubyBSLiBPYnNlcnZlIHF1ZSBhIHPDqXJpZSB0ZW1wb3JhbCBhcHJlc2VudGEgdW1hIHRlbmTDqm5jaWEgbWFpcyByb2J1c3RhIHF1ZSBhIHPDqXJpZSBvcmlnaW5hZGEgcGVsbyBwYXNzZWlvIGFsZWF0w7NyaW8gYXBlbmFzIGNvbSBkcmlmdC4KCmBgYHtyIGVjaG89VFJVRSwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyAgU0lNVUxBw4fDg08gUEFTU0VJTyBBTEVBVMOTUklPICBDT00gRFJJRlQgIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgU2ltdWxhw6fDo28gZGUgdW0gcGFzc2VpbyBhbGVhdMOzcmlvIGNvbSBkcmlmdCBlIHRlbmTDqm5jaWEgCm4gPC0gMTAwMApwMCA8LSAxMAptaSA8LSAwLjIKZ2FtYSA8LSAyCnBoaTEgPC0gMQp0cmVuZCA8LSAxOm4KcHRfZHJpZnRfdHJlbmQgPC0gcmVwKHAwLG4pCmZvciAoaSBpbiAxOihuLTEpKSB7CiAgcHRfZHJpZnRfdHJlbmRbaSsxXSA8LSBtaSArIGdhbWEgKiB0cmVuZFtpXSArIHBoaTEqcHRfZHJpZnRfdHJlbmRbaV0gKyBybm9ybSgxKQp9CgojIFZpc3VhbGl6YcOnw6NvIGRvIHBhc3NlaW8gYWxlYXTDs3JpbyBjb20gZHJpZnQKcGxvdChwdF9kcmlmdF90cmVuZCwgdHlwZSA9ICJsIiwgeGxhYiA9ICJvYnNlcnZhw6fDtWVzIiwgeWxhYiA9ICJwcmXDp28iLCBtYWluID0gIlNpbXVsYcOnw6NvIFBhc3NlaW8gQWxlYXTDs3JpbyBjb20gRHJpZnQgZSBUZW5kw6puY2lhIERldGVybWluw61zdGljYSIpCgpgYGAKCiMjIyMjICoqVEVTVEUgREUgUkFJWiBVTklUw4FSSUEqKgoKKiAqKlRFU1RFIERFIERJQ0tFWS1GVUxMRVIqKgoKUGFyYSB0ZXN0YXIgc2UgbyBsb2dhcml0bW8gZG9zIHByZcOnb3MgKCRwX3QkKSBkZSB1bSBhdGl2byBmaW5hbmNlaXJvIHNlZ3VlIHVtIHBhc3NlaW8gYWxlYXTDs3JpbywgdW0gcGFzc2VpbyBhbGVhdMOzcmlvIGNvbSAqZHJpZnQqIG91IHBhc3NlaW8gYWxlYXTDs3JpbyBjb20gZHJpZnQgZSB0ZW5kw6puY2lhIGRldGVybWluw61zdGljYSwgdXNhbW9zIG9zIG1vZGVsb3MgYWJhaXhvOgoKJCQKcF97dH09XHBoaV97MX1wX3t0LTF9ICsgXGVwc2lsb25fe3R9CiQkCgokJApwX3t0fT0gXG11ICsgXHBoaV97MX1wX3t0LTF9ICsgXGVwc2lsb25fe3R9CiQkCgokJApwX3t0fT1cbXUgKyBcZ2FtbWEgdCArIFxwaGlfezF9cF97dC0xfSArIFxlcHNpbG9uX3t0fQokJAoKCm9uZGUgJFxlcHNpbG9uX3t0fSQgZGVub3RhIG8gdGVybW8gZGUgZXJyby4gT2JzZXJ2ZSBxdWUgc2UgJHtccGhpfV97MX09MSQgZW0gYW1iYXMgYXMgZXF1YcOnw7VlcywgdGVyZW1vcyB1bSBwYXNzZWlvIGFsZWF0w7NyaW8gbm8gcHJpbWVpcm8gY2FzbywgdW0gcGFzc2VpbyBhbGVhdMOzcmlvIGNvbSBkcmlmdCBubyBzZWd1bmRvIGNhc28gZSB1bSBwYXNzZWlvIGFsZWF0w7NyaW8gY29tIGRyaWZ0IGUgdGVuZMOqbmNpYSBkZXRlcm1pbsOtc3RpY2Egbm8gdGVyY2Vpcm8gY2Fzby4gT2JzZXJ2ZSBhIHNlbWVsaGFuw6dhIGRlc3NhcyBlcXVhw6fDtWVzIGRvIHRlc3RlIGNvbSBhcyBlcXVhw6fDtWVzIGRvcyBwYXNzZWlvcyBhbGVhdMOzcmlvcyBtb3N0cmFkYXMgYW50ZXJpb3JtZW50ZS4gCgpBc3NpbSwgdGVzdGFyIHNlIGEgc8OpcmllIHRlbXBvcmFsIHRlbSByYWl6IHVuaXTDoXJpbyAoc2UgZWxhIG7Do28gw6kgZXN0YWNpb27DoXJpYSkgY29uc2lzdGUgZW0gdGVzdGFyIGEgaGlww7N0ZXNlIG51bGEgKG7Do28gZXN0YWNpb25hcmllZGFkZSkgJHtIfV97MH06e1xwaGl9X3sxfT0xJCBjb250cmEgYSBoaXDDs3Rlc2UgYWx0ZXJuYXRpdmEgKGVzdGFjaW9uYXJpZWRhZGUpICR7SH1fezF9OntccGhpfV97MX08MSQuIEVzdGUgdGVzdGUgZm9pIHByb3Bvc3RvIHBvciBAZGlja2V5MTk3OWRpc3RyaWJ1dGlvbiBlIMOpIGNvbmhlY2lkbyBjb21vIERpY2tleS1GdWxsZXIuIEEgcGFydGlyIGRhIGVzdGltYcOnw6NvIGRhcyBlcXVhw6fDtWVzIGFjaW1hIHBvciBtZWlvIGRlIE1RTywgdXNhLXNlIHVtIHRlc3RlIGNvbnZlbmNpb25hbFteMl0gZGUgJHQkIHNvYnJlICRccGhpX3sxfSQuIAoKW14yXTogUG9yw6ltLCBzb2IgYSBoaXDDs3Rlc2UgbnVsYSwgYSBkaXN0cmlidWnDp8OjbyBkbyB0ZXN0ZSBuw6NvIMOpIGNvbnZlbmNpb25hbCwgb3Ugc2VqYSwgbsOjbyDDqSBpZ3VhbCDDoCBkaXN0cmlidWnDp8OjbyAkdCQsIHBvaXMgJHBfdCQgbsOjbyDDqSBlc3RhY2lvbsOhcmlvLiBAZGlja2V5MTk3OWRpc3RyaWJ1dGlvbiByZWNhbGN1bGFyYW0gbyB2YWxvciBkYSBlc3RhdMOtc3RpY2EgJHQkLiBPIHZhbG9yIGRlc3NhIGVzdGF0w61zdGljYSBzZSBhbHRlcmEgY29uZm9ybWUgc2UgZGVmaW5lIGEgZXF1YcOnw6NvIGRlIHJlZ3Jlc3PDo28gZSBzZWd1bmRvIG8gdGFtYW5obyBkYSBhbW9zdHJhLiBBbMOpbSBkaXNzbywgYSBkaXN0cmlidWnDp8OjbyBkZSBwcm9iYWJpbGlkYWRlIGRvIHRlc3RlIG7Do28gw6kgc2ltw6l0cmljYSAobWFpb3JlcyBkZXRhbGhlcyBuZXN0ZSBbbGlua10oaHR0cHM6Ly9zdGF0cy5zdGFja2V4Y2hhbmdlLmNvbS9xdWVzdGlvbnMvMjEzNTUxL2hvdy1pcy10aGUtYXVnbWVudGVkLWRpY2tleS1mdWxsZXItdGVzdC1hZGYtdGFibGUtb2YtY3JpdGljYWwtdmFsdWVzLWNhbGN1bGF0ZS8yMTM1ODkpKS4KClBhcmEgYSBwcmltZWlyYSBlcXVhw6fDo28gKCRwX3t0fT1ccGhpX3sxfXBfe3QtMX0gKyBcZXBzaWxvbl97dH0kKSBNUU8gZ2VyYSBvcyBzZWd1aW50ZXMgZXN0aW1hZG9yZXM6CgokJAp7XGhhdHtccGhpfX1fezF9PVxmcmFje1xzdW1fe3Q9MX1ee1R9e3twfV97dC0xfXtwfV97dH19fXtcc3VtX3t0PTF9XntUfXt7cH1fe3QtMX1eezJ9fX0gCiQkCgokJAp7XGhhdHtcc2lnbWF9fV97XGVwc2lsb259XnsyfT1cZnJhY3tcc3VtX3t0PTF9XntUfXt7XGxlZnQoe3B9X3t0fS17XGhhdHtccGhpfX1fezF9e3B9X3t0LTF9IFxyaWdodCl9XnsyfX19e1QtMX0gCiQkCgpvbmRlICRwX3swfT0wJCBlICRUJCDDqSBvIHRhbWFuaG8gZGEgYW1vc3RyYS4gQSBlc3RhdMOtc3RpY2EgZG8gdGVzdGUgc2Vyw6E6CgokJApERiA9IFxmcmFje1xoYXR7XHBoaX1fezF9fXtzdGQoXGhhdHtccGhpfV97MX0pfSA9IFxmcmFje1xzdW1fe3Q9MX1ee1R9e3twfV97dC0xfXtcZXBzaWxvbn1fe3R9fX17XGhhdHtcc2lnbWF9X3tcZXBzaWxvbn1cc3VtX3t0PTF9XntUfXt7cH1fe3QtMX1eezJ9fX0KJCQKCiogKipURVNURSBERSBESUNLRVktRlVMTEVSOiBPVVRSQSBGT1JNVUxBw4fDg08qKgoKU3VidHJhaW5kbyAkcF97dC0xfSQgbmFzIGVxdWHDp8O1ZXMgZG8gdGVzdGUsIHRlbW9zOiAKCiQkCnBfe3R9PVxwaGlfezF9cF97dC0xfSArIFxlcHNpbG9uX3t0fSBcUmlnaHRhcnJvdyBwX3QgLSBwX3t0LTF9ID0gXHBoaV97MX1wX3t0LTF9IC0gcF97dC0xfSArIFxlcHNpbG9uX3t0fSBcUmlnaHRhcnJvdyBcRGVsdGEgcF97dH0gPSBcYmV0YSBwX3t0LTF9ICsgXGVwc2lsb25fe3R9CiQkCgokJApwX3t0fT0gXG11ICsgXHBoaV97MX1wX3t0LTF9ICsgXGVwc2lsb25fe3R9IFxSaWdodGFycm93IHBfe3R9IC0gcF97dC0xfSA9IFxtdSArIFxwaGlfezF9cF97dC0xfSAtIHBfe3QtMX0gKyBcZXBzaWxvbl97dH0gIFxSaWdodGFycm93IFxEZWx0YSBwX3t0fSA9IFxtdSArIFxiZXRhIHBfe3QtMX0gKyBcZXBzaWxvbl97dH0KJCQKCiQkCnBfe3R9PVxtdSArIFxnYW1tYSB0ICsgXHBoaV97MX1wX3t0LTF9ICsgXGVwc2lsb25fe3R9IFxSaWdodGFycm93IHBfe3R9LXBfe3QtMX09XG11ICsgXGdhbW1hIHQgKyBccGhpX3sxfXBfe3QtMX0gLSBwX3t0LTF9ICsgXGVwc2lsb25fe3R9IFxSaWdodGFycm93IFxEZWx0YSBwX3t0fSA9IFxtdSArIFxnYW1tYSB0ICsgIFxiZXRhIHBfe3QtMX0gKyBcZXBzaWxvbl97dH0KJCQKCkFzc2ltLCB0ZXN0YXIgJFxwaGlfezF9PTEkIGNvbW8gYXByZXNlbnRhZG8gYW50ZXJpb3JtZW50ZSDDqSBvIG1lc21vIHF1ZSB0ZXN0YXIgJFxiZXRhPTAkIHBhcmEgYSBmb3JtdWxhw6fDo28gbm92YSBkbyB0ZXN0ZS4gCgoqICoqVEVTVEUgREUgRElDS0VZLUZVTExFUiBBVU1FTlRBRE8qKgoKTyBwcm9ibGVtYSBkbyB0ZXN0ZSBhbnRlcmlvciDDqSBxdWUgQGRpY2tleTE5NzlkaXN0cmlidXRpb24gY29uc2lkZXJhcmFtIG8gZXJybyB1bSBydcOtZG8gYnJhbmNvLiBQb3LDqW0sIGZyZXF1ZW50ZW1lbnRlLCBvIGVycm8gw6kgdW0gcHJvY2Vzc28gZXN0YWNpb27DoXJpbyBxdWFscXVlci4gRXNzZSBwcm9ibGVtYSBwb2RlIGNhdXNhciBkaXN0b3LDp8O1ZXMgbm8gcG9kZXIgZG8gdGVzdGUuIEFsw6ltIGRpc3NvLCBtdWl0YXMgc8OpcmllcyB0ZW1wb3JhaXMgZWNvbsO0bWljYXMgcG9kZW0gc2VndWlyIHByb2Nlc3NvcyAkQVJJTUEocCxkLHEpJC4KClN1cG9uaGEgcXVlICRwX3t0fSQgc2VqYSB1bSBwcm9jZXNzbyBhdXRvcnJlZ3Jlc3Npdm8gZGUgb3JkZW0gJHAkLCBBUihwKS4gCgokJApwX3t0fT1cbXUgKyBccGhpX3sxfXBfe3QtMX0gKyAuLi4gK1xwaGlfe3AtMX1wX3t0LXArMX0rIFxwaGlfe3B9cF97dC1wfSArIFxlcHNpbG9uX3t0fQokJAoKUGFyYSB2ZXJpZmljYXIgYSBleGlzdMOqbmNpYSBkZSByYWl6IHVuaXTDoXJpYSBuZXNzZSBwcm9jZXNzbywgcG9kZS1zZSBwZXJmb3JtYXIgbyB0ZXN0ZSAkSF97MH06IFxiZXRhPTAkIChuw6NvIGVzdGFjaW9uYXJpZWRhZGUpIGNvbnRyYSAkSF97YX06IFxiZXRhIDwgMCQgKGVzdGFjaW9uYXJpZWRhZGUpLCB1c2FuZG8gYSByZWdyZXNzw6NvOgoKJCQKXERlbHRhIHBfe3R9PVxtdSArIFxiZXRhIHBfe3QtMX0gKyBcc3VtX3tpPTF9XntwLTF9e1xwaGlfe2l9XERlbHRhIHBfe3QtaX0rIFxlcHNpbG9uX3t0fX0gCiQkCm9uZGUgJFxtdSQgw6kgdW1hIGZ1bsOnw6NvIGRldGVybWluw61zdGljYSBkbyB0ZW1wbyAkdCQgZSAkXERlbHRhIHBfe3QtaX09cF97an0tcF97ai0xfSQgw6kgYSBzw6lyaWUgZGlmZXJlbmNpYWRhLiBOYSBwcsOhdGljYSwgJFxtdSQgcG9kZSBzZXIgJDAkLCB1bWEgY29uc3RhbnRlIG91ICRcbXUrXGdhbW1hIHQkLiBBIGVzdGF0w61zdGljYSBkbyB0ZXN0ZSBzZXLDoToKCiQkCkFERi10ZXN0PVxmcmFje1xoYXR7XGJldGF9fXtzdGQoXGhhdHtcYmV0YX0pfQokJApvbmRlICRcaGF0e1xiZXRhfSQgZGVub3RhbmRvIGEgZXN0aW1hdGl2YSBkZSBtw61uaW1vcyBxdWFkcmFkb3MgZGUgJFxiZXRhJCDDqSBvIGNvbmhlY2lkbyB0ZXN0ZSBkZSByYcOteiB1bml0w6FyaWEgZGUgRGlja2VyLUZ1bGxoZXIgYXVtZW50YWRvLiAKCiMjIyMjICoqTU9ERUxPUyBBUklNQSoqCgpDb25zaWRlcmUgdW0gbW9kZWxvIEFSTUEuIFNlIHBlcm1pdGlybW9zIHF1ZSBvIGNvbXBvbmVudGUgQVIgdGVuaGEgdW1hIHJhaXogdW5pdMOhcmlhLCBlbnTDo28gbyBtb2RlbG8gc2UgdG9ybmEgdW0gKiptb2RlbG8gYXV0b3JyZWdyZXNzaXZvIGludGVncmFkbyBkZSBtw6lkaWEgbcOzdmVsIChBUklNQSkqKi4gTGVtYnJlLXNlIHF1ZSBhbnRlcmlvcm1lbnRlIG1vc3RyYW1vcyBxdWUgYSBjb21wb25lbnRlIE1BIMOpIHNlbXByZSBlc3RhY2lvbsOhcmlhIGUgcG9yIGlzc28gYXBlbmFzIG8gY29tcG9uZW50ZSBBUiBwb2RlIHRlciB1bWEgcmFpeiB1bml0w6FyaWEuIAoKKiAqKkRJRkVSRU5DSUHDh8ODTyoqOgoKVW1hIHPDqXJpZSB0ZW1wb3JhbCAkeV97dH0kIMOpIHVtIHByb2Nlc3NvICoqQVJJTUEocCwxLHEpKiogc2UgYSBzw6lyaWUgZGFzIGRpZmVyZW7Dp2FzICgkY197dH09eV97dH0teV97dC0xfSQpIHNlZ3VlIHVtIG1vZGVsbyBBUk1BKHAscSkgZXN0YWNpb27DoXJpby4gIAoKQSBpZGVpYSBkZSB0cmFuc2Zvcm1hciB1bWEgc8OpcmllIG7Do28gZXN0YWNpb27DoXJpYSBlbSBlc3RhY2lvbsOhcmlhIHBvciBjb25zaWRlcmFyIHN1YXMgZGlmZXJlbsOnYXMgw6kgY2hhbWFkbyBkZSAqKmRpZmVyZW5jaWHDp8OjbyoqIG5hIGxpdGVyYXR1cmEgZGUgc8OpcmllcyB0ZW1wb3JhaXMuIE1haXMgZm9ybWFsbWVudGUsICRjX3t0fT15X3t0fS15X3t0LTF9JCDDqSBjaGFtYWRvIGRlICoqcHJpbWVpcmEgZGlmZXJlbsOnYSoqIGRhIHPDqXJpZSAkeV97dH0kLiBFbSBhbGd1bnMgY2Fzb3MgcG9kZSBzZXIgcHJlY2lzbyBkaWZlcmVuY2lhciBhIHPDqXJpZXMgdsOhcmlhcyB2ZXplcyBwYXJhIHRvcm7DoS1sYSBlc3RhY2lvbsOhcmlhLiBQb3IgZXhlbXBsbywgc2UgdGFudG8gJHlfe3R9JCBxdWFudG8gc3VhIHByaW1laXJhIGRpZmVyZW7Dp2Egc8OjbyBuw6NvIGVzdGFjaW9uw6FyaWFzLCBtYXMgJHNfe3R9PWNfe3R9LWNfe3QtMX09eV97dH0tMnlfe3QtMX0reV97dC0yfSQgYXByZXNlbnRhIGVzdGFjaW9uYXJpZWRhZGUgZnJhY2EsIGVudMOjbyAkeV97dH0kIHRlbSBkdWFzIHJhw616ZXMgdW5pdMOhcmlhcyBlICRzX3t0fSQgw6kgYSBzw6lyaWUgZGEgc2VndW5kYSBkaWZlcmVuw6dhIGRlICR5X3t0fSQuIEFzc2ltLCBzZSAkc197dH0kIHNlZ3VlIHVtIG1vZGVsbyBBUk1BKHAscSkgZW50w6NvICR5X3t0fSQgw6kgdW0gbW9kZWxvIEFSTUEocCwyLHEpLgoKQ29tbyBleGVtcGxvLCBwYXJhIG9zIHBhc3NlaW9zIGFsZWF0w7NyaW9zIHNpbXVsYWRvcyBhbnRlcmlvcm1lbnRlLCBvYnNlcnZlIHF1ZSB1bWEgc2ltcGxlcyBkaWZlcmVuY2lhw6fDo28gZGUgcHJpbWVpcmEgb3JkZW0gbm9zIGRhZG9zIHRvcm5hIGEgc8OpcmllIGFwYXJhbnRlbWVudGUgZXN0YWNpb27DoXJpYS4gCgpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9OX0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyAgU0lNVUxBw4fDg08gUEFTU0VJTyBBTEVBVMOTUklPICBDT00gRFJJRlQgIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCnBhcihtZnJvdz1jKDMsMSkpIAoKIyBWaXN1YWxpemHDp8OjbyBkYSBwcmltZWlyYSBkaWZlcmVuw6dhIGRvIHBhc3NlaW8gYWxlYXTDs3JpbyBxdWUgw6kgZXN0YWNpb27DoXJpbwpwbG90KGRpZmYocHQpLCB0eXBlID0gImwiLCB4bGFiID0gIiIsIHlsYWIgPSAiIiwgbWFpbiA9ICJQcmltZWlyYSBkaWZlcmVuw6dhIC0gcGFzc2VpbyBhbGVhdMOzcmlvIikKCiMgVmlzdWFsaXphw6fDo28gZGEgcHJpbWVpcmEgZGlmZXJlbsOnYSBkbyBwYXNzZWlvIGFsZWF0w7NyaW8gcXVlIMOpIGVzdGFjaW9uw6FyaW8KcGxvdChkaWZmKHB0X2RyaWZ0KSwgdHlwZSA9ICJsIiwgeGxhYiA9ICIiLCB5bGFiID0gIiIsIG1haW4gPSAiUHJpbWVpcmEgZGlmZXJlbsOnYSAtIHBhc3NlaW8gYWxlYXTDs3JpbyBjb20gZHJpZnQiKQoKIyAgVmlzdWFsaXphw6fDo28gZGEgcHJpbWVpcmEgZGlmZXJlbsOnYSBkbyBwYXNzZWlvIGFsZWF0w7NyaW8gcXVlIMOpIGVzdGFjaW9uw6FyaW8KcGxvdChkaWZmKHB0X2RyaWZ0X3RyZW5kKSwgdHlwZSA9ICJsIiwgeGxhYiA9ICIiLCB5bGFiID0gIiIsIG1haW4gPSAiUHJpbWVpcmEgZGlmZXJlbsOnYSAtIHBhc3NlaW8gYWxlYXTDs3JpbyBjb20gZHJpZnQgZSB0ZW5kw6puY2lhIGRldGVybWluw61zdGljYSIpCmBgYAoKCkVtIGZpbmFuw6dhcyBlIGNvbmZvcm1lIG1vc3RyYW1vcyBhbnRlcmlvcm1lbnRlLCBvcyBwcmXDp29zIGRlIGF0aXZvcyBmaW5hbmNlaXJvcyBjb211bWVudGUgc8OjbyBuw6NvIGVzdGFjaW9uw6FyaW9zLCBtYXMgbyBsb2dhcml0bW8gZG9zIHJldG9ybm9zIG91IG8gcmV0b3JubyBzaW1wbGVzIMOpIGVzdGFjaW9uw6FyaW8uCgpgYGB7ciwgZWNobz1GQUxTRSwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9OSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMgIERBRE9TIERBIEHDh8ODTyBNU0ZUICMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKc3VwcHJlc3NNZXNzYWdlcyhyZXF1aXJlKGhpZ2hjaGFydGVyKSkKc3VwcHJlc3NNZXNzYWdlcyhyZXF1aXJlKHRpZHlxdWFudCkpCnN1cHByZXNzTWVzc2FnZXMocmVxdWlyZShxdWFudG1vZCkpCnN1cHByZXNzTWVzc2FnZXMocmVxdWlyZShQZXJmb3JtYW5jZUFuYWx5dGljcykpCnN1cHByZXNzTWVzc2FnZXMocmVxdWlyZSh0c2VyaWVzKSkKCiMgQ29sZXRhbmRvIGRhZG9zIGRvIFlhaG9vIEZpbmFuY2UgKGh0dHBzOi8vZmluYW5jZS55YWhvby5jb20vKSB1c2FuZG8gbyBwYWNvdGUKIyBxdWFudG1vZCAoaHR0cHM6Ly93d3cucXVhbnRtb2QuY29tLykuIFVtYSBicmV2ZSBkb2N1bWVudGHDp8OjbyBkbyBwYWNvdGUgcG9kZSBzZXIKIyBlbmNvbnRyYWRhIG5lc3RlIGxpbmsgKGh0dHA6Ly9zdGF0bWF0aC53dS5hYy5hdC9+aG9ybmlrL1FGUzEvcXVhbnRtb2QtdmlnbmV0dGUucGRmKS4KbWljcm9zb2Z0IDwtIHF1YW50bW9kOjpnZXRTeW1ib2xzKCJNU0ZUIiwgc3JjID0gInlhaG9vIiwgd2FybmluZ3MgPSBGQUxTRSwgYXV0by5hc3NpZ249RkFMU0UpCgojIENhbGN1bGFyIG8gcmV0b3JubyBkbyBmZWNoYW1lbnRvIGRvcyBwcmXDp29zIGRhIGHDp8OjbyBkbyBHb29nbGUgdXNhbmRvIG8gbG9nYXJpdG1vIFtsblB0LWxuKFB0LTEpXQojIFVzYW1vcyBhIGZ1bsOnw6NvIFJldHVybi5jYWxjdWxhdGUgZG8gcGFjb3RlIFBlcmZvcm1hbmNlQW5hbHl0aWNzLiBVbWEgYnJldmUgZG9jdW1lbnRhw6fDo28gZG8gcGFjb3RlCiMgcG9kZSBzZXIgZW5jb250cmFkYSBuZXN0ZSBsaW5rIChodHRwOi8vYnJhdmVyb2NrLmNvbS9icmlhbi9SL1BlcmZvcm1hbmNlQW5hbHl0aWNzL2h0bWwvUGVyZm9ybWFuY2VBbmFseXRpY3MtcGFja2FnZS5odG1sKQpsb2dtaWNyb3NvZnQgPC0gUGVyZm9ybWFuY2VBbmFseXRpY3M6OlJldHVybi5jYWxjdWxhdGUobWljcm9zb2Z0JE1TRlQuQ2xvc2UsIG1ldGhvZCA9ICJsb2ciKQoKIyBHcsOhZmljbyBkYSBzw6lyaWUgdGVtcG9yYWwgZG9zIHJldG9ybm9zIApoYzAgPC0gaGlnaGNoYXJ0KHR5cGUgPSAic3RvY2siKSAlPiUgCiAgaGNfdGl0bGUodGV4dCA9ICJDb21wYXJhw6fDo28gZW50cmUgcHJlw6dvIGRlIGZlY2hhbWVudG8gZSByZXRvcm5vIGRhIGHDp8OjbyBkYSBNaWNyb3NvZnQiKSAlPiUgCiAgaGNfc3VidGl0bGUodGV4dCA9ICJEYWRvcyBleHRyYcOtZG9zIHVzYW5kbyBvIHBhY290ZSBxdWFudG1vZCBkbyBSIikgJT4lIAogIGhjX2FkZF9zZXJpZXMobG9nbWljcm9zb2Z0LCBpZCA9ICJ0cyIsIGNvbG9yID0gInJlZCIsIG5hbWUgPSAiUmV0b3JubyIpICU+JQogIGhjX2FkZF9zZXJpZXMobWljcm9zb2Z0JE1TRlQuQ2xvc2UsIGlkID0gInRzIiwgY29sb3IgPSAiYmx1ZSIsIG5hbWUgPSAiUHJlw6dvIikKCgpoYzAKCmBgYAoKTyBncsOhZmljbyBkYSBmdW7Dp8OjbyBkZSBhdXRvY29ycmVsYcOnw6NvIChGQUMpIHBvZGUgc2VyIMO6dGlsIHBhcmEgaWRlbnRpZmljYXIgc8OpcmllcyB0ZW1wb3JhaXMgbsOjbyBlc3RhY2lvbsOhcmlhcy4gUGFyYSB1bWEgc8OpcmllIHRlbXBvcmFsIGVzdGFjaW9uw6FyaWEsIG8gZ3LDoWZpY28gZGEgRkFDIG1vc3RyYXLDoSB1bSAqKmRlY2FpbWVudG8gcGFyYSAkMCQgcmVsYXRpdmFtZW50ZSByw6FwaWRvKiogZW5xdWFudG8gcGFyYSB1bWEgc8OpcmllIG7Do28gZXN0YWNpb27DoXJpYSBvICoqZGVjYWltZW50byBzZXLDoSBsZW50by4qKiBBbMOpbSBkaXNzbywgKiphIHByaW1laXJhIGRlZmFzYWdlbSBkYSBGQUMqKiDDqSBncmFuZGUgZSBlc3RhdMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZvIHBhcmEgc8OpcmllcyBuw6NvIGVzdGFjaW9uw6FyaWFzLiBBYmFpeG8sIG9zIGRvaXMgZ3LDoWZpY29zIGRhIEZBQyBwYXJhIGFzIHPDqXJpZXMgZGUgcHJlw6dvIGUgcmV0b3JubyBkYSBhw6fDo28gZGEgTWljcm9zb2Z0LiAKCmBgYHtyLCBlY2hvPUZBTFNFLCByZXN1bHRzPSdhc2lzJywgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9OSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KIyBVc2Ftb3MgYSBmdW7Dp8OjbyBhY2YgZG8gcGFjb3RlIHN0YXRzIHBhcmEgY2FsY3VsYXIgYSBmdW7Dp8OjbyBkZSBhdXRvY29ycmVsYcOnw6NvIAojIGRhIHPDqXJpZSB0ZW1wb3JhbCBkb3MgcHJlw6dvcyAocGVyY2ViYSBxdWUgZGVudHJvIGRvIG9iamV0byBtaWNyb3NvZnQgaMOhIHbDoXJpb3MKIyBkYWRvcywgbWFzIGVzY29saGVtb3MgbyBmZWNoYW1lbnRvLiBQYXJhIHNhYmVyIHF1YWlzIGRhZG9zIGV4aXN0ZW0gZW0gdW0gb2JqZXRvCiMgcmV0b3JuYXJkbyBwb3IgbWVpbyBkbyBwYWNvdGUgcXVhbnRtb2QgdXNlIGhlYWQobm9tZW9iamV0byksIGFxdWkgaGVhZChtaWNyb3NvZnQpKQojIENvbSByZWxhw6fDo28gw6AgZnVuw6fDo28gYWNmLCBvcHRhbW9zIHBvciBuw6NvIHZpc3VhbGl6YXIgbyByZXN1bHRhZG8gZW0gdW0gZ3LDoWZpY28sIHBvaXMKIyBmYXplbW9zIG8gbm9zc28gcHLDs3ByaW8gZ3LDoWZpY28gZSBjb20gbm8gbcOheGltbyAzMCBkZWZhc2FnZW5zCmFjZnByaWNlIDwtIHN0YXRzOjphY2YobWljcm9zb2Z0JE1TRlQuQ2xvc2UsIHBsb3QgPSBGQUxTRSwgbmEuYWN0aW9uID0gbmEucGFzcywgbGFnLm1heCA9IDMwKQoKIyBHcsOhZmljbyBkYSBmdW7Dp8OjbyBkZSBhdXRvY29ycmVsYcOnw6NvIGNvbSBhZGnDp8OjbyBkbyB0w610dWxvCnBsb3QoYWNmcHJpY2UsIG1haW4gPSAiIiwgeWxhYiA9ICIiLCB4bGFiID0gIkRlZmFzYWdlbSIpCnRpdGxlKCJGdW7Dp8OjbyBkZSBBdXRvY29ycmVsYcOnw6NvIChGQUMpIGRvcyBQcmXDp29zIiwgYWRqID0gMC41LCBsaW5lID0gMSkKYGBgCgpgYGB7ciwgZWNobz1GQUxTRSwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9OSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KIyBPIG1lc21vIHF1ZSBhbnRlcywgbWFzIGFnb3JhIHBhcmEgYSBzw6lyaWUgdGVtcG9yYWwgZG9zIHJldG9ybm9zCmFjZnJldHVybiA8LSBzdGF0czo6YWNmKGxvZ21pY3Jvc29mdCwgcGxvdCA9IEZBTFNFLCBuYS5hY3Rpb24gPSBuYS5wYXNzLCBsYWcubWF4ID0gMzApCnBsb3QoYWNmcmV0dXJuLCBtYWluID0gIiIsIHlsYWIgPSAiIiwgeGxhYiA9ICJEZWZhc2FnZW0iKQp0aXRsZSgiRnVuw6fDo28gZGUgQXV0b2NvcnJlbGHDp8OjbyAoRkFDKSBkb3MgUmV0b3Jub3MiLCBhZGogPSAwLjUsIGxpbmUgPSAxKQpgYGAKCkFzc2ltLCB0ZW1vcyBxdWUgYSBzw6lyaWUgZG9zIHByZcOnb3MgZGEgYcOnw6NvICoqTVNGVCoqIChNaWNyb3NvZnQpIHNlIGNvbXBvcnRhIGNvbW8gdW0gcHJvY2Vzc28gbsOjbyBlc3RhY2lvbsOhcmlvIGVucXVhbnRvIG9zIHJldG9ybm9zIGRlc3RhIGHDp8OjbyBhcHJlc2VudGFtIHVtYSBGQUMgY29tIG1haW9yIHByb2JhYmlsaWRhZGUgZGUgc2VyIHByb3ZlbmllbnRlIGRlIHVtIHByb2Nlc3NvIGVzdGFjaW9uw6FyaW8uCgojIyMjIyAqKlBST0NFU1NPIERFIEVTVElNQcOHw4NPIERFIE1PREVMT1MgQVJJTUEqKgoKUXVhbmRvIGVzdGFtb3MgYWp1c3RhbmRvIHVtIG1vZGVsbyBBUklNQSB1c2FuZG8gZGFkb3MgZGUgdW1hIHPDqXJpZSB0ZW1wb3JhbCAobsOjbyBzYXpvbmFsKSwgbyBzZWd1aW50ZSBwcm9jZWRpbWVudG8gcG9kZSBzZXIgc2VndWlkbzoKCjEuIFZpc3VhbGl6YXIgb3MgZGFkb3MgZSBpZGVudGlmaWNhciBvYnNlcnZhw6fDtWVzIGZvcmEgZG8gcGFkcsOjbyAoKm91dGxpZXJzKiBvdSBkYWRvcyBmYWx0YW50ZXMpIGUgZWxpbWluw6EtbGFzLgoyLiBTZSBuZWNlc3PDoXJpbywgdHJhbnNmb3JtYXIgb3MgZGFkb3MgcGFyYSBlc3RhYmlsaXphciBhIHZhcmnDom5jaWEgKGxvZ2FyaXRtbyBkb3MgZGFkb3MsIHZhcmlhw6fDo28gb3UgcmV0b3JubywgcG9yIGV4ZW1wbG8pCjMuIFRlc3RhciBzZSBvcyBkYWRvcyBzw6NvIGVzdGFjaW9uw6FyaW9zLiBDYXNvIHRlbmhhIHJhaXogdW5pdMOhcmlhIMOpIHByZWNpc28gZGlmZXJlbmNpYXIgb3MgZGFkb3MgYXTDqSBzZSB0b3JuYXJlbSBlc3RhY2lvbsOhcmlvcy4gUGFyYSBpc3NvLCB0ZXN0YS1zZSBub3ZhbWVudGUgc2UgYSBzw6lyaWUgZGlmZXJlbmNpYWRhIHNlIHRvcm5vdSBlc3RhY2lvbsOhcmlhLgo0LiBFeGFtaW5hciBhcyBmdW7Dp8O1ZXMgZGUgYXV0b2NvcnJlbGHDp8OjbyAoRkFDKSBlIGF1dG9jb3JyZWxhw6fDo28gcGFyY2lhbCAoRkFDUCkgcGFyYSBkZXRlcm1pbmFyIGFzIG9yZGVucyBtw6F4aW1hcyAkUCQgZSAkUSQgcGFyYSBvcyBjb21wb25lbnRlcyBBUiBlIE1BIGRhIHPDqXJpZSBlc3RhY2lvbsOhcmlhIChkaWZlcmVuY2lhZGEsIHNlIG5lY2Vzc8OhcmlvKS4KNS4gRXN0aW1hciB0b2RhcyBhcyBjb21iaW5hw6fDtWVzIHBhcmEgJHAkLCAkZCQgZSAkcSQuIEFxdWksICRkJCBzZXLDoSBmaXhvIGUgaWd1YWwgYW8gbsO6bWVybyBkZSB2ZXplcyBuZWNlc3PDoXJpYXMgcGFyYSB0b3JuYXIgYSBzw6lyaWUgb3JpZ2luYWwgZXN0YWNpb27DoWlyYS4gU2UgbsOjbyBmb2kgcHJlY2lzbyBkaWZlcmVuY2lhciBhIHPDqXJpZSwgJGQ9MCQuCjYuIEVzY29saGVyIGRlbnRyZSB0b2RvcyBvcyBtb2RlbG9zIGVzdGltYWRvcyBubyBwYXNzbyBhbnRlcmlvciwgbyBtb2RlbG8gY29tIG1lbm9yIEFJQyBlL291IEJJQy4KNy4gRXhhbWluYXIgc2Ugb3MgcmVzw61kdW9zIHNlIGNvbXBvcnRhbSBjb21vIHJ1w61kbyBicmFuY28uIENhc28gY29udHLDoXJpbywgcmV0b3JuYXIgYW8gcGFzc28gMyBvdSA0LgogICAgKiBUZXN0YXIgYXV0b2NvcnJlbGHDp8OjbyBub3MgcmVzw61kdW9zCiAgICAqIFRlc3RhciBzZSB0ZW0gaGV0ZXJvY2VkYXN0aWNpZGFkZSBjb25kaWNpb25hbAogICAgKiBWZXJpZmljYXIgYSBkaXN0cmlidWnDp8OjbyBkZSBwcm9iYWJpbGlkYWRlIAo4LiBVbWEgdmV6IHF1ZSBvcyByZXPDrWR1b3Mgc8OjbyBydcOtZG8gYnJhbmNvLCBvYnRlciBhcyBwcmV2aXPDtWVzLgoKMS4gVmlzdWFsaXphciBvcyBkYWRvcyBlIGlkZW50aWZpY2FyIG9ic2VydmHDp8O1ZXMgZm9yYSBkbyBwYWRyw6NvICgqb3V0bGllcnMqIG91IGRhZG9zIGZhbHRhbnRlcykgZSBlbGltaW7DoS1sYXMuCjIuIFNlIG5lY2Vzc8OhcmlvLCB0cmFuc2Zvcm1hciBvcyBkYWRvcyBwYXJhIGVzdGFiaWxpemFyIGEgdmFyacOibmNpYSAobG9nYXJpdG1vIGRvcyBkYWRvcywgdmFyaWHDp8OjbyBvdSByZXRvcm5vLCBwb3IgZXhlbXBsbykKMy4gVGVzdGFyIHNlIG9zIGRhZG9zIHPDo28gZXN0YWNpb27DoXJpb3MuIENhc28gdGVuaGEgcmFpeiB1bml0w6FyaWEgw6kgcHJlY2lzbyBkaWZlcmVuY2lhciBvcyBkYWRvcyBhdMOpIHNlIHRvcm5hcmVtIGVzdGFjaW9uw6FyaW9zLiBQYXJhIGlzc28sIHRlc3RhLXNlIG5vdmFtZW50ZSBzZSBhIHPDqXJpZSBkaWZlcmVuY2lhZGEgc2UgdG9ybm91IGVzdGFjaW9uw6FyaWEuCjQuIEV4YW1pbmFyIGFzIGZ1bsOnw7VlcyBkZSBhdXRvY29ycmVsYcOnw6NvIChGQUMpIGUgYXV0b2NvcnJlbGHDp8OjbyBwYXJjaWFsIChGQUNQKSBwYXJhIGRldGVybWluYXIgYXMgb3JkZW5zIG3DoXhpbWFzICRQJCBlICRRJCBwYXJhIG9zIGNvbXBvbmVudGVzIEFSIGUgTUEgZGEgc8OpcmllIGVzdGFjaW9uw6FyaWEgKGRpZmVyZW5jaWFkYSwgc2UgbmVjZXNzw6FyaW8pLgo1LiBFc3RpbWFyIHRvZGFzIGFzIGNvbWJpbmHDp8O1ZXMgcGFyYSAkcCQsICRkJCBlICRxJC4gQXF1aSwgJGQkIHNlcsOhIGZpeG8gZSBpZ3VhbCBhbyBuw7ptZXJvIGRlIHZlemVzIG5lY2Vzc8OhcmlhcyBwYXJhIHRvcm5hciBhIHPDqXJpZSBvcmlnaW5hbCBlc3RhY2lvbsOhaXJhLiBTZSBuw6NvIGZvaSBwcmVjaXNvIGRpZmVyZW5jaWFyIGEgc8OpcmllLCAkZD0wJC4KNi4gRXNjb2xoZXIgZGVudHJlIHRvZG9zIG9zIG1vZGVsb3MgZXN0aW1hZG9zIG5vIHBhc3NvIGFudGVyaW9yLCBvIG1vZGVsbyBjb20gbWVub3IgQUlDIGUvb3UgQklDLgo3LiBFeGFtaW5hciBzZSBvcyByZXPDrWR1b3Mgc2UgY29tcG9ydGFtIGNvbW8gdW0gcnXDrWRvIGJyYW5jbzoKICAgICogVGVzdGFyIGF1dG9jb3JyZWxhw6fDo28gbm9zIHJlc8OtZHVvczogdmlzdWFsaXphciBhIGZ1bsOnw6NvIGRlIGF1dG9jb3JyZWxhw6fDo28gKEZBQykgZG9zIHJlc8OtZHVvcy4gU2UgZXhpc3RlbSBkZWZhc2FnZW5zIGVzdGF0aXN0aWNhbWVudGUgc2lnbmlmaWNhbnRlIChhY2ltYSBkYSBsaW5oYSBwb250aWxoYWRhKSwgaMOhIGF1dG9jb3JyZWxhw6fDo28gc2VyaWFsLgogICAgKiBUZXN0YXIgaGV0ZXJvY2VkYXN0aWNpZGFkZSBjb25kaWNpb25hbDogdmlzdWFsaXphciBhIGZ1bsOnw6NvIGRlIGF1dG9jb3JyZWxhw6fDo28gKEZBQykgZG9zIHJlc8OtZHVvcyBhbyBxdWFkcmFkby4gU2UgZXhpc3RlbSBkZWZhc2FnZW5zIGVzdGF0aXN0aWNhbWVudGUgc2lnbmlmaWNhbnRlIChhY2ltYSBkYSBsaW5oYSBwb250aWxoYWRhKSwgaMOhIGhldGVyb2NlZGFzdGljaWRhZGUgY29uZGljaW9uYWwuCiAgICAqIFZlcmlmaWNhciBhIGRpc3RyaWJ1acOnw6NvIGRlIHByb2JhYmlsaWRhZGUgYXNzdW1pZGEgbm8gcHJvY2Vzc28gZGUgZXN0aW1hw6fDo286IHJlYWxpemFyIHRlc3RlIHF1ZSB2ZXJpZmlxdWUgc2Ugb3MgcmVzw61kdW9zIHNlIGNvbXBvcnRhbSBkZSBhY29yZG8gY29tIGEgZGlzdHJpYnVpw6fDo28gZGUgcHJvYmFiaWxpZGFkZSBhZG90YWRhLgo4LiBTZSBvcyByZXPDrWR1b3Mgc8OjbyBiZW0gY29tcG9ydGFkb3MgKHJ1w61kbyBicmFuY28pLCAqKm9idGVyIGFzIHByZXZpc8O1ZXMgYXBlbmFzIGNvbSBhIGVzdGltYcOnw6NvIGRhIG3DqWRpYSBjb25kaWNpb25hbCoqLiBDYXNvIGNvbnRyw6FyaW8sIHJldmlzYXIgb3MgcGFzc29zIGFudGVyaW9yZXMgcGFyYSBjZXJ0aWZpY2FyIHF1ZSBmb3JhbSByZWFsaXphZG9zIGNvcnJldGFtZW50ZS4gU2UgbWVzbW8gYXNzaW0gZXhpc3RpciBoZXRlcm9jZWRhc3RpY2lkYWRlIGNvbmRpY2lvbmFsIGUgYSBkaXN0cmlidWnDp8OjbyBkZSBwcm9iYWJpbGlkYWRlIG7Do28gY29uZGl6IGNvbSBhIGhpcMOzdGVzZSBhc3N1bWlkYSAoZ2VyYWxtZW50ZSB1bWEgZGlzdHJpYnVpw6fDo28gTm9ybWFsKSwgKiphdmFsaWFyIGEgcG9zc2liaWxpZGFkZSBkZSBlc3RpbWFyIGEgdmFyacOibmNpYSBjb25kaWNpb25hbCoqIChlc3R1ZGFyZW1vcyBkZXBvaXMgY29tbyBmYXplciBlc3NhIGVzdGltYcOnw6NvKS4gCiAgICAKCiogKipFWEVNUExPIDE6KioKClZhbW9zIHVzYXIgY29tbyBleGVtcGxvIHBhcmEgbyBwcm9jZXNzbyBhcHJlc2VudGFkbyBhbnRlcmlvcm1lbnRlIGRhZG9zIGRhIGHDp8OjbyAqKk1TRlQqKiAoTWljcm9zb2Z0KS4gQXNzaW0sIHRlbW9zOgoKCmBgYHtyLCBlY2hvPUZBTFNFLCByZXN1bHRzPSdhc2lzJywgZmlnLndpZHRoPTksIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CiMgR3LDoWZpY28gZGEgc8OpcmllIHRlbXBvcmFsIGRvcyBwcmXDp29zIApoYzAgPC0gaGlnaGNoYXJ0KHR5cGUgPSAic3RvY2siKSAlPiUgCiAgaGNfdGl0bGUodGV4dCA9ICJQcmXDp28gZGUgZmVjaGFtZW50byBkYSBhw6fDo28gZGEgTWljcm9zb2Z0IikgJT4lIAogIGhjX3N1YnRpdGxlKHRleHQgPSAiRGFkb3MgZXh0cmHDrWRvcyB1c2FuZG8gbyBwYWNvdGUgcXVhbnRtb2QgZG8gUiIpICU+JSAKICBoY19hZGRfc2VyaWVzKG1pY3Jvc29mdCRNU0ZULkNsb3NlLCBpZCA9ICJ0cyIsIGNvbG9yID0gImJsdWUiLCBuYW1lID0gIlByZcOnbyIpCgoKaGMwCmBgYAoKMS4gTyBncsOhZmljbyBkYSBzw6lyaWUgdGVtcG9yYWwgZG9zIHByZcOnb3MgbW9zdHJhIGNvbXBvcnRhbWVudG8gZGUgdGVuZMOqbmNpYSBuw6NvIGRldGVybWluw61zdGljYSBwYXJhIG8gcGVyw61vZG8gZW0gYW7DoWxpc2UuIFBvcsOpbSwgbsOjbyBlbmNvbnRyYW1vcyBvdXRsaWVycyBvdSBkYWRvcyBmYWx0YW50ZXMgcXVlIGp1c3RpZmlxdWVtIHNldSB0cmF0YW1lbnRvLgoKYGBge3IsIGVjaG89RkFMU0UsIHJlc3VsdHM9J2FzaXMnLCBmaWcud2lkdGg9OSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KIyBHcsOhZmljbyBkYSBzw6lyaWUgdGVtcG9yYWwgZG9zIHJldG9ybm9zLiBKw6EgbW9zdHJhbW9zIGFudGVyaW9ybWVudGUgY29tbyAKIyBleHRyYWlyIG9zIGRhZG9zIGUgY2FsY3VsYXIgbyByZXRvcm5vLiBBcXVpLCB0ZW1vcyBvIGdyw6FmaWNvIGRvcyByZXRvcm5vcwpoYzEgPC0gaGlnaGNoYXJ0KHR5cGUgPSAic3RvY2siKSAlPiUgCiAgaGNfdGl0bGUodGV4dCA9ICJSZXRvcm5vcyBkYSBhw6fDo28gZGEgTWljcm9zb2Z0IikgJT4lIAogIGhjX3N1YnRpdGxlKHRleHQgPSAiRGFkb3MgZXh0cmHDrWRvcyB1c2FuZG8gbyBwYWNvdGUgcXVhbnRtb2QgZG8gUiIpICU+JSAKICBoY19hZGRfc2VyaWVzKGxvZ21pY3Jvc29mdCwgaWQgPSAidHMiLCBjb2xvciA9ICJyZWQiLCBuYW1lID0gIlJldG9ybm8iKQoKCmhjMQpgYGAKCjIuIFBvcsOpbSwgc2FiZW1vcyBxdWUgw6kgbWVsaG9yIHRyYWJhbGhhciBjb20gb3MgcmV0b3Jub3MgZG8gcXVlIG9zIHByZcOnb3MgZGUgdW0gYXRpdm8gZmluYW5jZWlyby4gVW0gZG9zIGJlbmVmw61jaW9zIGRlIGZhemVyIGlzc28gw6kgcXVlIHRhbCB0cmFuc2Zvcm1hw6fDo28gZXN0YWJpbGl6YSBhIHZhcmnDom5jaWEgZG9zIGRhZG9zLiBOZXN0ZSBzZW50aWRvLCBvYnRlbW9zIG9zIHJldG9ybm9zIHBhcmEgYSBhw6fDo28gZGEgTWljcm9zb2Z0IGUgY29tbyBtb3N0cmEgbyBncsOhZmljbyBhY2ltYSwgYSB2YXJpw6JuY2lhIG1lbGhvcm91IGVtIGZ1bsOnw6NvIGRlIG7Do28gdGVybW9zIG1haXMgdW1hIHRlbmTDqm5jaWEgbsOjbyBkZXRlcm1pbsOtc3RpY2EuCgozLiBDbGFyYW1lbnRlLCBvcyBkYWRvcyBzw6NvIGVzdGFjaW9uw6FyaW9zLCBlbSBmdW7Dp8OjbyBkZSBzZXJlbSByZXRvcm5vcy4gTWVzbW8gYXNzaW0sIGV4ZWN1dGFtb3MgbyB0ZXN0ZSBkZSByYWl6IHVuaXTDoXJpYSBBREYgY29tICQyJCBkZWZhc2FnZW5zLgoKYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CiMgQXF1aSwgdXNhbW9zIGEgZnVuw6fDo28gYWRmVGVzdCBkbyBwYWNvdGUgZlVuaXRSb290cyBwYXJhIHRlc3RhciBzZSBow6EgcmFpeiB1bml0w6FyaWEgbmEgc8OpcmllIHRlbXBvcmFsIGF2YWxpYWRhLiAKIyBDb21vIG9ic2VydmFtb3Mgbm8gZ3LDoWZpY28gZGEgc8OpcmllLCBuw6NvIGjDoSB0ZW5kw6puY2lhIG5vcyBkYWRvcyBlIGFzc2ltIG8gdGVzdGUgdmVyaWZpY2Fyw6Egc2UgYSBzw6lyaWUgc2UgY29tcG9ydGEKIyBjb21vIHVtIHBhc3NlaW8gYWxlYXTDs3JpbyBzZW0gZHJpZnQuIElzdG8gw6kgZXZpZMOqbmNpYWRvIHBvciBtZWlvIGRhIG9ww6fDo28gdHlwZSBxdWUgdGVtIGFzIHNlZ3VpbnRlcyBvcMOnw7VlczoKIyAtIG5jOiBmb3IgYSByZWdyZXNzaW9uIHdpdGggbm8gaW50ZXJjZXB0IChjb25zdGFudCkgbm9yIHRpbWUgdHJlbmQgKHBhc3NlaW8gYWxlYXTDs3JpbykKIyAtIGM6IGZvciBhIHJlZ3Jlc3Npb24gd2l0aCBhbiBpbnRlcmNlcHQgKGNvbnN0YW50KSBidXQgbm8gdGltZSB0cmVuZCAocGFzc2VpbyBhbGVhdMOzcmlvIGNvbSBkcmlmdCkKIyAtIGN0OiBmb3IgYSByZWdyZXNzaW9uIHdpdGggYW4gaW50ZXJjZXB0IChjb25zdGFudCkgYW5kIGEgdGltZSB0cmVuZCAocGFzc2VpbyBhbGVhdMOzcmlvIGNvbSBjb25zdGFudGUgZSB0ZW5kw6puY2lhKQojIEFsw6ltIGRpc3NvLCBkZWZpbmltb3MgcXVlIG5vIG3DoXhpbW8gZHVhcyBkZWZhc2FnZW5zIGRhIHPDqXJpZSBkZXZlbSBzZXIgdXNhZGFzIGNvbW8gdmFyacOhdmVpcyBleHBsaWNhdGl2YXMgZGEgcmVncmVzc8OjbyBkbyB0ZXN0ZS4KdW5pdFJvb3QgPC0gc3VwcHJlc3NXYXJuaW5ncyhmVW5pdFJvb3RzOjphZGZUZXN0KGxvZ21pY3Jvc29mdCxsYWdzPTIsIHR5cGU9YygibmMiKSkpCnByaW50KHVuaXRSb290KQpgYGAKCkNvbW8gcmVzdWx0YWRvIHRlbW9zIHF1ZSBhIGVzdGF0w61zdGljYSBkbyB0ZXN0ZSDDqSBgciByb3VuZCh1bml0Um9vdEB0ZXN0JHN0YXRpc3RpYyw0KWAgY29tIHVtIHAtdmFsb3IgZGUgYHIgcm91bmQodW5pdFJvb3RAdGVzdCRwLnZhbHVlLDQpYC4gQXNzaW0sIGEgaGlww7N0ZXNlIG51bGEgZGUgcmFpeiB1bml0w6FyaWEgcG9kZSBzZXIgcmVqZWl0YWRhIGVtIHF1YWxxdWVyIG7DrXZlbCBkZSBzaWduaWZpY8OibmNpYSByYXpvw6F2ZWwgKDVcJSwgcG9yIGV4ZW1wbG8pIGUgYSBzw6lyaWUgdGVtcG9yYWwgZG8gcmV0b3JubyBkYSBhw6fDo28gKipNU0ZUKiogKE1pY3Jvc29mdCkgbsOjbyB0ZW0gcmFpeiB1bml0w6FyaWEsIG91IHNlamEsIMOpIGVzdGFjaW9uw6FyaWEuIEVtIGZ1bsOnw6NvIGRpc3NvLCB2YW1vcyB0cmFiYWxoYXIgY29tIG9zIHJldG9ybm9zIGVtIG7DrXZlbCBlIGF2YWxpYXIgbyBjb21wb3J0YW1lbnRvIGRhcyBmdW7Dp8O1ZXMgZGUgYXV0b2NvcnJlbGHDp8OjbyBlIGF1dG9jb3JyZWxhw6fDo28gcGFyY2lhbC4gKipPYnMuOiBjYXNvIGEgc8OpcmllIHRlbmhhIHJhaXogdW5pdMOhcmlhIMOpIHByZWNpc28gYXBsaWNhciBhIGRpZmVyZW7Dp2EgbmEgbWVzbWEgZSByZWZhemVyIG8gdGVzdGUgcGFyYSB2ZXJpZmljYXIgc2UgcmVqZWl0YW1vcyBhIGhpcMOzdGVzZSBudWxhIGRlIG7Do28gZXN0YWNpb25hcmllZGFkZSBwYXJhIGEgc8OpcmllIGRhIHByaW1laXJhIGRpZmVyZW7Dp2EgZG9zIHJldG9ybm9zKioKCmBgYHtyLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9OX0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyAgIEZBQyBlIEZBQ1AgICAgIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgQ2FsY3VsYXIgYSBGQUMgdXNhbmRvIG8gb2JqZXRvIGxvZ21pY3Jvc29mdCAocmV0b3Jub3MpCmFjZl9taWNyb3NvZnQgPC0gc3RhdHM6OmFjZihsb2dtaWNyb3NvZnQsIHBsb3QgPSBGQUxTRSwgbmEuYWN0aW9uID0gbmEucGFzcywgbWF4LmxhZyA9IDI1KQojIENhbGN1bGFyIGEgRkFDUCB1c2FuZG8gbyBvYmpldG8gbG9nbWljcm9zb2Z0IChyZXRvcm5vcykKcGFjZl9taWNyb3NvZnQgPC0gc3RhdHM6OnBhY2YobG9nbWljcm9zb2Z0LCBwbG90ID0gRkFMU0UsIG5hLmFjdGlvbiA9IG5hLnBhc3MsIG1heC5sYWcgPSAyNSkKCiMgR3LDoWZpY28gZGEgRkFDIGUgRkFDUCBqdW50b3MuIEFxdWkgdXNhbW9zIGEgb3DDp8OjbyBwYXIobWZyb3c9YygyLDEpKSBxdWUgCiMgZGl2aWRlIGEgdGVsYSBkZSBncsOhZmljb3MgZW0gdW1hIG1hdHJpeCBjb20gMiBsaW5oYXMgZSAxIGNvbHVuYXMuCnBhcihtZnJvdz1jKDIsMSkpCnBsb3QoYWNmX21pY3Jvc29mdCwgbWFpbiA9ICIiLCB5bGFiID0gIiIsIHhsYWIgPSAiRGVmYXNhZ2VtIikKdGl0bGUoIkZ1bsOnw6NvIGRlIEF1dG9jb3JyZWxhw6fDo28gKEZBQykgZG9zIFJldG9ybm9zIGRhIE1pY3Jvc29mdCIsIGFkaiA9IDAuNSwgbGluZSA9IDEpCnBsb3QocGFjZl9taWNyb3NvZnQsIG1haW4gPSAiIiwgeWxhYiA9ICIiLCB4bGFiID0gIkRlZmFzYWdlbSIpCnRpdGxlKCJGdW7Dp8OjbyBkZSBBdXRvY29ycmVsYcOnw6NvIFBhcmNpYWwgKEZBQ1ApIGRvcyBSZXRvcm5vcyBkYSBNaWNyb3NvZnQiLCBhZGogPSAwLjUsIGxpbmUgPSAxKQpgYGAKCjQuIEEgRkFDUCBzdWdlcmUgdW0gbW9kZWxvICRBUigyKSQgZW5xdWFudG8gYSBGQUMgc3VnZXJlIHVtIG1vZGVsbyAkTUEoNSkkLiAKCjUuIFVzYW5kbyB0b2RhcyBhcyBjb21iaW5hw6fDtWVzIGRhcyBvcmRlbnMgZW5jb250cmFkYXMgYW50ZXJpb3JtZW50ZSwgZXN0aW1hbW9zIG9zIG1vZGVsb3MgQVJJTUEuIAoKYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CiMgVG9kYXMgYXMgY29tYmluYcOnw7VlcyBwb3Nzw612ZWlzIGRlIHA9MCBhdMOpIHA9bWF4IGUgcT0wIGF0w6kgcT1tYXgKcGFyc19taWNyb3NvZnQgPC0gZXhwYW5kLmdyaWQoYXIgPSAwOjIsIGRpZmYgPSAwLCBtYSA9IDA6NSkKCiMgTG9jYWwgb25kZSBvcyByZXN1bHRhZG9zIGRlIGNhZGEgbW9kZWxvIHNlcsOhIGFybWF6ZW5hZG8KbW9kZWxvX21pY3Jvc29mdCA8LSBsaXN0KCkKCiMgRXN0aW1hciBvcyBwYXLDom1ldHJvcyBkb3MgbW9kZWxvcyB1c2FuZG8gTcOheGltYSBWZXJvc3NpbWlsaGFuw6dhIChNTCkuIFBvciBkZWZhdWx0LCBhIGZ1bsOnw6NvIGFyaW1hCiMgdXNhIGEgaGlww7N0ZXNlIGRlIHF1ZSBvIHRlcm1vIGRlIGVycm8gZG9zIG1vZGVsb3MgYXJpbWEgc2VndWUgdW1hIGRpc3RyaWJ1acOnw6NvIE5vcm1hbApmb3IgKGkgaW4gMTpucm93KHBhcnNfbWljcm9zb2Z0KSkgewogIG1vZGVsb19taWNyb3NvZnRbW2ldXSA8LSBhcmltYSh4ID0gbG9nbWljcm9zb2Z0LCBvcmRlciA9IHVubGlzdChwYXJzX21pY3Jvc29mdFtpLCAxOjNdKSwgbWV0aG9kID0gIk1MIikKfQoKIyBPYnRlciBvIGxvZ2FyaXRtbyBkYSB2ZXJvc3NpbWlsaGFuw6dhICh2YWxvciBtw6F4aW1vIGRhIGZ1bsOnw6NvKQpsb2dfdmVyb3NzaW1pbGhhbmNhX21pY3Jvc29mdCA8LSBsaXN0KCkKZm9yIChpIGluIDE6bGVuZ3RoKG1vZGVsb19taWNyb3NvZnQpKSB7CiAgbG9nX3Zlcm9zc2ltaWxoYW5jYV9taWNyb3NvZnRbW2ldXSA8LSBtb2RlbG9fbWljcm9zb2Z0W1tpXV0kbG9nbGlrCn0KCiMgQ2FsY3VsYXIgbyBBSUMKYWljYXJpbWFfbWljcm9zb2Z0IDwtIGxpc3QoKQpmb3IgKGkgaW4gMTpsZW5ndGgobW9kZWxvX21pY3Jvc29mdCkpIHsKICBhaWNhcmltYV9taWNyb3NvZnRbW2ldXSA8LSBzdGF0czo6QUlDKG1vZGVsb19taWNyb3NvZnRbW2ldXSkKfQoKIyBDYWxjdWxhciBvIEJJQwpiaWNhcmltYV9taWNyb3NvZnQgPC0gbGlzdCgpCmZvciAoaSBpbiAxOmxlbmd0aChtb2RlbG9fbWljcm9zb2Z0KSkgewogIGJpY2FyaW1hX21pY3Jvc29mdFtbaV1dIDwtIHN0YXRzOjpCSUMobW9kZWxvX21pY3Jvc29mdFtbaV1dKQp9CgojIFF1YW50aWRhZGUgZGUgcGFyw6JtZXRyb3MgZXN0aW1hZG9zIHBvciBtb2RlbG8KcXVhbnRfcGFyYW1lbnRyb3NfbWljcm9zb2Z0IDwtIGxpc3QoKQpmb3IgKGkgaW4gMTpsZW5ndGgobW9kZWxvX21pY3Jvc29mdCkpIHsKICBxdWFudF9wYXJhbWVudHJvc19taWNyb3NvZnRbW2ldXSA8LSBsZW5ndGgobW9kZWxvX21pY3Jvc29mdFtbaV1dJGNvZWYpKzEgIyArMSBwb3JxdWUgdGVtb3MgYSB2YXJpw6JuY2lhIGRvIHRlcm1vIGRlIGVycm8gCn0KCiMgTW9udGFyIGEgdGFiZWxhIGNvbSBvcyByZXN1bHRhZG9zCmVzcGVjaWZpY2FjYW9fbWljcm9zb2Z0IDwtIHBhc3RlMCgiQVJJTUEiLHBhcnNfbWljcm9zb2Z0JGFyLCBwYXJzX21pY3Jvc29mdCRkaWZmLCBwYXJzX21pY3Jvc29mdCRtYSkKdGFtYW5ob19hbW9zdHJhX21pY3Jvc29mdCA8LSByZXAobGVuZ3RoKGxvZ21pY3Jvc29mdCksIGxlbmd0aChtb2RlbG9fbWljcm9zb2Z0KSkKcmVzdWx0YWRvX21pY3Jvc29mdCA8LSBkYXRhLmZyYW1lKGVzcGVjaWZpY2FjYW9fbWljcm9zb2Z0LCBsbl92ZXJvc3NpbWlsaGFuY2EgPSB1bmxpc3QobG9nX3Zlcm9zc2ltaWxoYW5jYV9taWNyb3NvZnQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRfcGFyYW1lbnRyb3NfbWljcm9zb2Z0ID0gIHVubGlzdChxdWFudF9wYXJhbWVudHJvc19taWNyb3NvZnQpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhbWFuaG9fYW1vc3RyYV9taWNyb3NvZnQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWljID0gdW5saXN0KGFpY2FyaW1hX21pY3Jvc29mdCksIGJpYyA9IHVubGlzdChiaWNhcmltYV9taWNyb3NvZnQpKQoKIyBHZXJhciB1bWEgdGFiZWxhIHF1ZSBzZXLDoSB2aXN1YWxpemFkYSBubyBkb2N1bWVudG8uIE1haXMgZGV0YWxoZXMgZW0gaHR0cDovL2hhb3podTIzMy5naXRodWIuaW8va2FibGVFeHRyYS8Ka25pdHI6OmthYmxlKHJlc3VsdGFkb19taWNyb3NvZnQsIGZvcm1hdCA9ICJwYW5kb2MiLCBkaWdpdHMgPSBjKDAsMiwwLDAsMiksIGFsaWduID0gJ2MnKQpgYGAKNi4gT3MgcmVzdWx0YWRvcyBtb3N0cmFtIHF1ZSBvIG1vZGVsbyAkQVJJTUEoMSwwLDEpJCDDqSBvIG1vZGVsbyBlc2NvbGhpZG8sIHBvaXMgdGVtIG8gbWVub3IgQklDLgoKNy4gQSBGQUMgZG9zIHJlc8OtZHVvcyBkbyBtb2RlbG8gbW9zdHJhIHF1ZSBhIG1haW9yIHBhcnRlIGRhcyBhdXRvY29ycmVsYcOnw7VlcyBlc3TDo28gZGVudHJvIGRvcyBsaW1pdGVzLCBpbmRpY2FuZG8gcXVlIG9zIHJlc8OtZHVvcyBuw6NvIGFwcmVzZW50YW0gYXV0b2NvcnJlbGHDp8OjbyBzZXJpYWwuCgpgYGB7ciwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTksIGZpZy5oZWlnaHQ9NSx3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQojIEZ1bsOnw6NvIGRlIGF1dG9jb3JyZWxhw6fDo28gZG9zIHJlc8OtZHVvcwphY2ZfYXJpbWExMDFfZXN0IDwtIHN0YXRzOjphY2YobW9kZWxvX21pY3Jvc29mdFtbNV1dJHJlc2lkdWFscywgbmEuYWN0aW9uID0gbmEucGFzcywgcGxvdCA9IEZBTFNFLCBsYWcubWF4ID0gMTUpCgojIEdyw6FmaWNvIGRhIGZ1bsOnw6NvIGRlIGF1dG9jb3JyZWxhw6fDo28uIApwbG90KGFjZl9hcmltYTEwMV9lc3QsIG1haW4gPSAiIiwgeWxhYiA9ICIiLCB4bGFiID0gIkRlZmFzYWdlbSIpCnRpdGxlKCJGdW7Dp8OjbyBkZSBBdXRvY29ycmVsYcOnw6NvIChGQUMpIGRvcyBSZXPDrWR1b3MgZG8gQVJJTUEoMSwwLDEpIiwgYWRqID0gMC41LCBsaW5lID0gMSkKYGBgCgpQb3LDqW0sIGFvIGFuYWxpc2FyIGEgcHJlc2Vuw6dhIGRlIGhldGVyb2NlZGFzdGljaWRhZGUgY29uZGljaW9uYWwgcG9yIG1laW8gZGEgRkFDIGRvcyByZXPDrWR1b3MgYW8gcXVhZHJhZG8sIGVuY29udHJhbW9zIGRpdmVyc2FzIGRlZmFzYWdlbnMgZXN0YXRpc3RpY2FtZW50ZSBzaWduaWZpY2FudGVzIGluZGljYW5kbyBhIHByZXNlbsOnYSBkZSBoZXRlcm9jZWRhc3RpY2lkYWRlIGNvbmRpY2lvbmFsIG5vcyByZXPDrWR1b3Mgb2J0aWRvcyBkbyBtb2RlbG8uIElzc28gw6kgZXNwZXJhZG8gZGFkbyBxdWUgZXN0YW1vcyB0cmFiYWxoYW5kbyBjb20gcmV0b3Jub3MgZSBjb21vIGFwcmVuZGVtb3MgYW50ZXJpb3JtZW50ZSBwb3IgbWVpbyBkb3MgZmF0b3MgZXN0aWxpemFkb3MsIGV4aXN0ZW0gY2x1c3RlcnMgZGUgdm9sYXRpbGlkYWRlIG5hIHPDqXJpZSB0ZW1wb3JhbCBkZSByZXRvcm5vcyBkZSB1bSBhdGl2byBmaW5hbmNlaXJvLiBOZXN0ZSBzZW50aWRvLCDDqSBuZWNlc3PDoXJpbyBtb2RlbGFyIG8gc2VndW5kbyBtb21lbnRvIGNvbmRpY2lvbmFsIGRlc3RhIHPDqXJpZSAodmFyacOibmNpYSBjb25kaWNpb25hbCkgZSBpc3NvIHNlcsOhIGZlaXRvIHBlbGEgZmFtw61saWEgZGUgbW9kZWxvcyBkZSBoZXRlcm9jZWRhc3RpY2lkYWRlIGNvbmRpY2lvbmFsIChlc3R1ZGFkb3MgcG9zdGVyaW9ybWVudGUpLgoKYGBge3IsIGVjaG89RkFMU0UsIGZpZy53aWR0aD05LCBmaWcuaGVpZ2h0PTUsd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KIyBUZXN0ZSBkZSBoZXRlcm9jZWRhc3RpY2lkYWRlIGNvbmRpY2lvbmFsCmFjZl9hcmltYTEwMV9zcXVhcmUgPC0gYWNmKG1vZGVsb19taWNyb3NvZnRbWzVdXSRyZXNpZHVhbHNeMiwgbmEuYWN0aW9uID0gbmEucGFzcywgcGxvdCA9IEZBTFNFLCBsYWcubWF4ID0gMjApCnBsb3QoYWNmX2FyaW1hMTAxX3NxdWFyZSwgbWFpbiA9ICIiLCB5bGFiID0gIiIsIHhsYWIgPSAiRGVmYXNhZ2VtIikKdGl0bGUoIkZBQyBkbyBxdWFkcmFkbyBkb3MgcmVzw61kdW9zIGRvIEFSSU1BKDEsMCwxKSIsIGFkaiA9IDAuNSwgbGluZSA9IDEpCmBgYAoKUG9yIGZpbSwgYXZhbGlhbW9zIHNlIG9zIHJlc8OtZHVvcyBzw6NvIG5vcm1hbG1lbnRlIGRpc3RyaWJ1w61kb3MgcG9yIG1laW8gZG9zIHRlc3RlcyBkZSBTaGFwaXJvIGUgSmFycXVlIEJlcmEuIEEgaGlww7N0ZXNlIG51bGEgZG9zIHRlc3RlcyDDqSBxdWUgb3MgZGFkb3Mgc8OjbyBub3JtYWxtZW50ZSBkaXN0cmlidcOtZG9zIGNvbnRyYSBhIGhpcMOzdGVzZSBhbHRlcm5hdGl2YSBxdWUgb3MgZGFkb3MgbsOjbyBzw6NvIG5vcm1hbG1lbnRlIGRpc3RyaWJ1w61kb3MuIFNhYmVtb3MgcXVlIG8gcC12YWxvciDDqSBvIG7DrXZlbCBkZSBzaWduaWZpY8OibmNpYSBtw61uaW1vIHBhcmEgc2UgcmVqZWl0YXIgYSBoaXDDs3Rlc2UgbnVsYS4gQXNzaW0sIHF1ZXJlbW9zIHVtIHAtdmFsb3IgYWx0byAoPjAsMDUpIG8gcXVlIG7Do28gbm9zIHBlcm1pdGUgcmVqZWl0w6EtbGEuCgpDb21vIHJlc3VsdGFkbywgZW5jb250cmFtb3MgcXVlIMOpIHBvc3PDrXZlbCByZWplaXRhciBhIGhpcMOzdGVzZSBudWxhIGRlIHF1ZSBvcyByZXPDrWR1b3Mgc8OjbyBub3JtYWxtZW50ZSBkaXN0cmlidcOtZG9zIGVtIGZ1bsOnw6NvIGRvIHAtdmFsb3IgZG9zIHRlc3RlcyBzZXIgbWVub3IgcXVlIDAsMDUuCgoKYGBge3IsIGVjaG89RkFMU0V9CiMgVGVzdGUgZGUgTm9ybWFsaWRhZGUgZG9zIHJlc8OtZHVvcy4gQXMgaGlww7N0ZXNlcyBwYXJhIG9zIGRvaXMgdGVzdGVzIHPDo286CiMgIC0gSDA6IHJlc8OtZHVvcyBub3JtYWxtZW50ZSBkaXN0cmlidcOtZG9zCiMgIC0gSDE6IHJlc8OtZHVvcyBuw6NvIHPDo28gbm9ybWFsbWVudGUgZGlzdHJpYnXDrWRvcwpzaGFwaXJvLnRlc3QobmEucmVtb3ZlKG1vZGVsb19taWNyb3NvZnRbWzVdXSRyZXNpZHVhbHMpKQpqYXJxdWUuYmVyYS50ZXN0KG5hLnJlbW92ZShtb2RlbG9fbWljcm9zb2Z0W1s1XV0kcmVzaWR1YWxzKSkKYGBgCgo4LiBFbSBmdW7Dp8OjbyBkZSBub3NzbyBtb2RlbG8gbsOjbyBzZSBjb21wb3J0YXIgZGEgZm9ybWEgZXNwZXJhZGEsIG7Do28gcG9kZW1vcyBmYXplciBwcmV2aXPDtWVzIHVzYW5kbyBvIG1lc21vCgojIyMjIyAqKlJFRkVSw4pOQ0lBUyoq