Este material tem como objetivo contribuir para o entendimento sobre modelos SARIMA. Para tanto, vamos apresentar o impacto da sazonalidade em séries temporais, como a função de autocorrelação (FAC) se comporta na presença de sazonalidade e como fazer uso dos modelos SARIMA para modelar uma série temporal com sazonalidade multiplicativa.

INTRODUÇÃO

Até o momento, focamos sobre a série dos retornos que em função de quase sempre oscilar entre em um intervalo fixo tende a ser estacionária e séries que são não estacionárias (com ou sem tendência), mas sem sazonalidade. Neste caso, os modelos ARMA e ARIMA podem ser usados para modelar tais séries, respectivamente.

Porém, algumas séries temporais financeiras tal como os ganhos trimestrais com uma ação, exibem comportamentos cíclicos e periódicos. Isso acontece em função da divulgação de resultados trimestrais comumente adotada pelas empresas com capital aberto. Dependendo do tipo de negócio da empresa, períodos específicos do ano tendem a apresentar resultados melhores (safras agrícolas, férias, clima ou data especiais como, por exemplo, Natal) que por conseguinte impactam os ganhos com a ação.

Essa tal componente sazonal pode aparecer quando são feitas observações intra-anuais para a série de interesse, isto é, os dados são registrados mensalmente, trimestralmente ou semanalmente, por exemplo.

Este tipo de série é chamada de série temporal sazonal. Como exemplo, a figura abaixo mostra a série temporal dos ganhos trimestrais da ação da Coca-Cola Company do primeiro trimestre de 1983 até o terceiro trimestre de 2009.

Em algumas aplicações a sazonalidade tem segunda importância e é removida dos dados, resultando em uma série temporal ajustada sazonalmente (extraída a sazonalidade) que é então usada para fazer inferência.

O procecimento de remover a sazonalidade de uma série temporal é conhecido como ajustamento sazonal. Em outras aplicações tal como previsão, a sazonalidade é tão importante quanto outra característica dos dados e deve ser tratada. Em função da previsão ser o maior objetivo em séries temporais financeiras, focamos em analisar séries temporais sazonais. Aqui, vamos discutir o modelo SARIMA e métodos que são úteis para modelar tais séries.

ANÁLISE VISUAL DA SÉRIE COM SAZONALIDADE

Por meio do gráfico anterior, é possível observar o padrão de sazonalidade. Além da sazonalidade temos uma tendência crescente nos ganhos trimestrais durante o período amostral com alguma perturbação no final dos anos 90. As oscilações de picos (Abril e Julho) e vales (Janeiro e Outubro) acontecem anualmente, o que nos faz acreditar que há presença de sazonalidade.

Nesse sentido, para a série temporal de ganhos trimestrais da ação da Coca-Cola temos o seguinte:

As observações apresentadas acima podem ser visualizadas no gráfico abaixo.

Essa análise é interessante, pois mostra que, basicamente, precisamos modelar as componentes de tendência e sazonalidade (em torno de 95% da série temporal).

Uma análise mais detalhada da sazonalidade pode ser obtida pelo gráfico abaixo que nos permite detectar visualmente a presença de sazonalidade na série temporal. Como se pode verificar, os ganhos trimestrais apresentam média e variância não constante, indícios de não estacionariedade na parte sazonal da série temporal.

DIFERENCIAÇÃO SAZONAL

No primeiro gráfico do texto temos o logaritmo dos ganhos trimestrais da ação da Coca-Cola. Aplicamos o logaritmo por duas razões. Primeiro, ele é usado para lidar com o crescimento exponencial da série. Segundo, tal tipo de transformação estabiliza a variância da série.

Suponha que denotamos os ganhos trimestrais por \(r_{t}\). O gráfico abaixo sugere que a série do logaritmo dos ganhos trimestrais tem forte autocorrelação.

Um método convencional para lidar com isso é obter a primeira diferença da série temporal. Para isso, podemos fazer uso da notação conhecida como backshift notation e do operador backward shift representado por \(B\). Tal notação pode ser utilizada, como segue:

Aplicando tal notação podemos obter a série da primeira diferença do logaritmo dos ganhos trimestrais da ação da Coca-Cola fazendo \(\left(1-B\right)r_t=r_t-r_{t-1}\). O gráfico da FAC da série resultante da primeira diferença (gráfico abaixo), confirma que a diferenciação contribuiu para eliminar a tendência crescente da série do logaritmo dos ganhos.

Por outro lado, a FAC da série da primeira diferença mostra que a série apresenta um forte padrão de sazonalidade, pois nos lags sazonais (múltiplo da periodicidade 4) a função de autocorrelação tem um decaimento lento, indicando que a série temporal é não estacionária na parte sazonal.

Seguindo a abordagem proposta por Box, Jenkins, and Reinsel (1994) obtemos a série temporal da diferença sazonal da série da primeira diferença fazendo da backshift notation:

\[ \Delta_4(\Delta x_{t}) = (1-B^{4})\Delta x_{t} = \Delta x_{t} - \Delta x_{t-4} = x_{t}-x_{t-1}-x_{t-4}+x_{t-5} \]

O objetivo é lidar com o forte padrão de sazonalidade mostrado no gráfico anterior. Como resultado, temos abaixo o gráfico da FAC desta série (diferenciação sazonal na série da primeira diferença do logaritmo dos ganhos da Coca-Cola):

É possível observar no gráfico acima que o forte padrão de sazonalidade de \(\Delta x_{t}\) foi eliminado. A partir desse gráfico, temos as seguintes observações:

Abaixo, gráficos das diferenciações realizadas na série do logaritmo dos ganhos trimestrais. Observa-se que a diferença da diferenciação sazonal realmente contribui para uma aparente estacionariedade tanto no componente regular (que independe da sazonalidade) quanto o componente sazonal.

MODELO DE SAZONALIDADE MULTIPLICATIVA

Uma vez conhecido o operador de backward shift e seus diversos usos, podemos aplicá-los nos modelos já estudados para reescrevê-los. Um modelo \(ARMA(p,q)\) pode ser expressado como:

\[ \begin{split} r_t & = \mu + \phi_{1}r_{t-1} + ... + \phi_{p}r_{t-p} + a_{t} + \theta_{1}a_{t-1} + ... + \theta_{q}a_{t-q} \\ & = \mu+\phi_{1}Br_{t} + ... + \phi_{p}B^pr_t + a_{t} + \theta_{1}Ba_{t} + ... + \theta_{q}B^qa_{t} \\ \phi\left(B\right)r_t& = \mu + \theta\left(B\right)a_t \end{split} \]

onde \(\phi\left(B\right)=1-\phi_{1}B- ... -\phi_{p}B^p\) e \(\theta\left(B\right)=1+\theta_{1}B+ ... + \theta_{q}B^q\). Já um modelo \(ARIMA(1,1,1)\) pode ser reescrito como:

\[ \begin{split} \left(1-\phi_{1}B\right)\left(1-B\right)r_{t} = \left(1+\theta_{1}B\right)a_{t} \\ \\ \left(1-\phi_{1}B\right)\left(r_t-r_{t-1}\right) = a_t + \theta_{1}a_t \\ \\ r_t - r_{t-1} - \phi_{1}r_{t-1} + \phi_{1}r_{t-2} = a_t + \theta_{1}a_t \\ \\ r_t - r_{t-1} = \phi_{1}r_{t-1} - \phi_{1}r_{t-2} + a_t + \theta_{1}a_t \\ \\ \Delta r_t = \phi_{1}\left(r_{t-1}-r_{t-2}\right) + a_t + \theta_{1}a_t \\ \\ \Delta r_t = \phi_{1}\Delta r_{t-1} + a_t + \theta_{1}a_t \\ \end{split} \]

Um modelo cujas autocorrelações se comportam como mostrado para a série temporal dos logaritmo dos ganhos da Coca-Cola é o modelo de sazonalidade multiplicativa. Este modelo assume a seguinte forma:

\[ (1-B)(1-B^{s})x_{t}=(1-\theta B)(1-\Theta B^{s})a_{t} \]

onde \(s\) é a periodicidade da série, \(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-1}-\bar{a}\right)\right]=E[a_{t}a_{t-1}]=0\) e independente e identicamente distribuído (iid). Além disso, \(\left|\theta\right|< 1\) e \(\left|\Theta\right|< 1\). Este modelo é conhecido na literatura como airline model conforme proposto por Box, Jenkins, and Reinsel (1994) ou \(SARIMA(p,d,q)(P,D,Q)_s\). Basicamente, o modelo é formado pela inclusão de termos sazonais nos modelos ARIMA(p,d,q) que já estudamos anteriormente. Usamos como notação, letras maiúsculas para a parte sazonal do modelo enquanto letras minúsculas representam a parte não sazonal do modelo.

A parte AR do modelo simplismente consiste das diferenças regulares e sazonais, enquanto a parte MA envolve dois parâmetros. Focando sobre a parte MA, temos:

\[ w_{t}=(1-\theta B)(1-\Theta B^{s})a_{t}=(1-\Theta B^{s}-\theta B+ \theta \Theta B^{s+1})a_t = a_{t}-\theta a_{t-1}- \Theta a_{t-s}+\theta \Theta a_{t-s-1} \] onde \(w_{t}=(1-B)(1-B^{s})x_{t}\) e \(s>1\). Resolvendo para esta equação temos que:

Consequentemente a FAC de \(w_{t}\) será dada por:

\[ \rho_{1} = \frac{Cov(w_{t},w_{t-1})}{Var(w_{t})} = \frac{- \theta (1+\Theta^{2})\sigma_{a}^{2}}{(1+\theta^{2})(1+\Theta^{2})\sigma_{a}^{2}} = \frac{- \theta}{1+ \theta^{2}} \]

\[ \rho_{s} = \frac{Cov(w_{t},w_{t-s})}{Var(w_{t})} = \frac{- \Theta (1+\theta^{2})\sigma_{a}^{2}}{(1+\theta^{2})(1+\Theta^{2})\sigma_{a}^{2}} = \frac{- \Theta}{1+ \Theta^{2}} \]

\[ \rho_{s-1} = \rho_{s+1} = \frac{Cov(w_{t},w_{t-s+1})}{Var(w_{t})} = \frac{Cov(w_{t},w_{t-s-1})}{Var(w_{t})} = \frac{\theta \Theta \sigma_{a}^{2}}{(1+\theta^{2})(1+\Theta^{2})\sigma_{a}^{2}} = \frac{\theta \Theta}{(1+\theta^{2})(1+\Theta^{2})} \] e \(\rho=0\) para \(l\) diferente de qualquer uma das defasagens anteriores (\(0, 1, s-1,s,s+1\)).

Por exemplo, se \(w_{t}\) é uma série temporal trimestral, então \(s=4\) e para \(l>0\) a FAC será diferente de zero para as defasagens \(1,3,4\) e \(5\) apenas. Este é o caso para o logaritmo dos ganhos da Coca-Cola (observe o gráfico da FAC da primeira diferença da diferenciação sazonal).

Generalizando, temos que para modelos \(SARIMA(p,d,q)(P,D,Q)_s\), a parte sazonal do AR ou MA será vista nas defasagens sazonais da FACP e FAC, respectivamente. Por exemplo, para um modelo \(SARIMA(0,0,0)(0,0,1)_{12}\) teremos:

Similarmente, um \(SARIMA(0,0,0)(1,0,0)_{12}\) terá:

Assim, para avaliar as ordens dos componentes AR e MA, tanto da parte regular quanto da parte sazonal, deve-se adotar o mesmo procedimento estudado, considerando apenas que para a parte sazonal deve-se avaliar as defasagens sazonais nas funções de aucotorrelação (FAC) e aucotorrelação parcial (FACP).

PROCESSO DE ESTIMAÇÃO DE MODELOS SARIMA
  1. Visualizar os dados para identificar observações fora do padrão (outliers ou dados faltantes), examinar se existe tendência e/ou sazonalidade por meio de gráficos específicos
  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.
    • Se existe apenas sazonalidade, faça a diferenciação sazonal (por exemplo, para dados mensais faça a diferenciação de ordem 12)
    • Se existe apenas tendência, faça apenas a primeira diferença.
    • Se existe tendência e sazonalidade, aplique a primeira diferença nos dados para tratar a tendência e após isso a diferenciação sazonal (o caso dos ganhos trimestrais da Coca-Cola)
    • Se não existe tendência ou sazonalidade não faça qualquer diferenciação
  4. Examinar as funções de autocorrelação parcial (FAC) e autocorrelação parcial (FACP) para determinar as ordens máximas \(P\) e \(Q\) para os componentes AR e MA tanto da parte regular quanto da parte sazonal da série estacionária:
    • termos não sazonais: examine as primeiras defasagens (1,2,3,..) da FAC e FACP. Mantemos o mesmo padrão já estudado, ou seja, a FAC define termos MA e a FACP termos AR
    • termos sazonais: examine padrões em defasagens que são múltiplas da periodicidade da série. Por exemplo, para dados mensais, verifique nas defasagens 12, 24, 36 (provavelmente será preciso verificar as primeiras duas ou três defasagens múltiplas da periodicidade). Avalie a FAC e FACP nas defasagens sazonais da mesma forma que você fez nas defasagens não sazonais
  5. Estimar todas as combinações para \(p\), \(d\) e \(q\) na parte regular e \(P\), \(D\) e \(Q\) na parte sazonal. Aqui, tanto \(d\) quanto \(D\) serão fixos e igual ao número de vezes necessárias para tornar a série original estacionária na parte regular e na parte sazonal, respectivamente.
  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.

Vamos continuar com os dados dos ganhos trimestrais da Coca-Cola. Agora, com tais dados vamos seguir o processo proposto:

  1. Já realizado anteriormente (gráfico que divide a série em sazonalidade, tendência e restante)
  2. Já realizado anteriormente (aplicação do logaritmo nos ganhos trimestrais)
  3. Claramente, os dados são não estacionários, pois a série apresenta sazonalidade e tendência. Para confirmar, executamos o teste de raiz unitária ADF com \(4\) defasagens.

Title: Augmented Dickey-Fuller Test

Test Results: PARAMETER: Lag Order: 4 STATISTIC: Dickey-Fuller: -2.2031 P VALUE: 0.2395

Description: Mon Oct 7 17:42:48 2019 by user:

Como resultado temos que a estatística do teste é \(-2.2031\) com um p-valor de \(0.2395\). Assim, a hipótese nula de raiz unitária não pode ser rejeitada em qualquer nível de significância razoável e a série temporal dos ganhos trimestrais com a ação da Coca-Cola tem raiz unitária, ou seja, não é estacionária. Obs.: existem testes específicos para séries temporais com sazonalidade e quebra estrutural, pois na presença destes componentes os testes tradicionais de raiz unitária perdem poder. Maiores detalhes sobre os testes de raiz unitária que permitem sazonalidade e/ou quebra estrutural neste link

A partir disso, percebemos que é preciso aplicar a primeira diferença para eliminar a tendência e após isso diferenciar na periodicidade dos dados (para retirar a sazonalidade).

  1. A FACP sugere um modelo \(AR(2)\) enquanto a FAC sugere um modelo \(MA(1)\) para a parte regular. Já para a parte sazonal temos um \(AR(1)\) e \(MA(1)\). Assim, vamos estimar todas as combinações para \(SARIMA(2,1,1)(1,1,1)_{4}\)

  1. Usando todas as combinações das ordens encontradas anteriormente, estimamos os modelos SARIMA.
especificacao ln_verossimilhanca quant_paramentros tamanho_amostra aic bic
SARIMA011011 104.25 3 107 -202.50 -195
SARIMA111011 104.25 4 107 -200.51 -190
SARIMA211011 104.33 5 107 -198.67 -186
SARIMA011111 104.64 4 107 -201.28 -191
SARIMA111111 104.68 5 107 -199.37 -186
SARIMA211111 104.71 6 107 -197.43 -182
  1. Os resultados mostram que o modelo \(SARIMA(0,1,1)(0,1,1)_{4}\) é o modelo escolhido, pois tem o menor AIC e BIC.
  2. A FAC dos resíduos do modelo mostra que quase todas as autocorrelações estão dentro dos limites, indicando que os resíduos se comportam como um ruído branco.

Outro teste importante é a verificação da presença ou não de heterocedasticidade condicional. O gráfico abaixo mostra a FAC do quadrado dos resíduos e é possível observar que há heterocedasticidade condicional e ela deveria ser tratada.

Por fim, avaliamos se os resíduos são normalmente distribuídos. Como é possível observar pelos resultados dos testes abaixo, não é possível afirmar que os resíduos são normalmente distribuídos.

Shapiro-Wilk normality test

data: na.remove(modelo[[1]]$residuals) W = 0.90178, p-value = 8.491e-07

Jarque Bera Test

data: na.remove(modelo[[1]]$residuals) X-squared = 120.8, df = 2, p-value < 2.2e-16

  1. Finalmente, fazemos as previsões (lembrando que deveríamos tratar a heterocedasticidade condicional):

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+IDxiPiBNb2RlbG9zIFNBUklNQSA8L2I+IDwvaDI+IDwvY2VudGVyPiAKYXV0aG9yOiA8Y2VudGVyPiBGcmFuayBNYWdhbGjDo2VzIGRlIFBpbmhvIC0gSUJNRUMvTUcgPC9jZW50ZXI+CmdyYXBoaWNzOiB5ZXMKbGlua2NvbG9yOiBibHVlCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICAgIHRoZW1lOiBjZXJ1bGVhbgogICAgZmlnX2NhcHRpb246IHllcwpyZWZlcmVuY2VzOgotIGlkOiB0c2F5MjAxNGludHJvZHVjdGlvbgogIHRpdGxlOiBBbiBpbnRyb2R1Y3Rpb24gdG8gYW5hbHlzaXMgb2YgZmluYW5jaWFsIGRhdGEgd2l0aCBSCiAgYXV0aG9yOgogIC0gZmFtaWx5OiBUc2F5CiAgICBnaXZlbjogUnVleSBTCiAgcHVibGlzaGVyOiBKb2huIFdpbGV5IFwmIFNvbnMKICB0eXBlOiBib29rCiAgaXNzdWVkOgogICAgeWVhcjogMjAxNAotIGlkOiBjYW1wYmVsbDE5OTdlY29ub21ldHJpY3MKICB0aXRsZTogVGhlIGVjb25vbWV0cmljcyBvZiBmaW5hbmNpYWwgbWFya2V0cwogIGF1dGhvcjoKICAtIGZhbWlseTogQ2FtcGJlbGwKICAgIGdpdmVuOiBKb2huIFkKICAtIGZhbWlseTogTG8KICAgIGdpdmVuOiBBbmRyZXcgV2VuLUNodWFuCiAgLSBmYW1pbHk6IE1hY0tpbmxheQogICAgZ2l2ZW46IEFyY2hpZSBDcmFpZwogIHB1Ymxpc2hlcjogUHJpbmNldG9uIChOSikgUHJpbmNldG9uIFVuaXZlcnNpdHkgUHJlc3MKICB0eXBlOiBib29rCiAgaXNzdWVkOgogICAgeWVhcjogMTk5NwotIGlkOiBtb3JldHRpbjIwMDhlY29ub21ldHJpYQogIHRpdGxlOiBFY29ub21ldHJpYSBmaW5hbmNlaXJhIHVtIGN1cnNvIGVtIHPDqXJpZXMgdGVtcG9yYWlzIGZpbmFuY2VpcmFzCiAgYXV0aG9yOgogIC0gZmFtaWx5OiBNb3JldHRpbgogICAgZ2l2ZW46IFBlZHJvIEFsYmVydG8KICBwdWJsaXNoZXI6IEVkZ2FyZCBCbHVjaGVyCiAgdHlwZTogYm9vawogIGlzc3VlZDoKICAgIHllYXI6IDIwMDgKLSBpZDogdHNheTIwMTBhbmFseXNpcwogIHRpdGxlOiBBbmFseXNpcyBvZiBmaW5hbmNpYWwgdGltZSBzZXJpZXMKICBhdXRob3I6CiAgLSBmYW1pbHk6IFRzYXkKICAgIGdpdmVuOiBSdWV5IFMKICBwdWJsaXNoZXI6IEpvaG4gV2lsZXkgXCYgU29ucwogIHR5cGU6IGJvb2sKICBpc3N1ZWQ6CiAgICB5ZWFyOiAyMDEwCi0gaWQ6IGJveDE5OTR0aW1lCiAgdGl0bGU6IFRpbWUgc2VyaWVzIGFuYWx5c2lzIGZvcmVjYXN0aW5nIGFuZCBjb250cm9sCiAgYXV0aG9yOgogIC0gZmFtaWx5OiBCb3gKICAgIGdpdmVuOiBHZW9yZ2UgRVAKICAtIGZhbWlseTogSmVua2lucwogICAgZ2l2ZW46IEd3aWx5bSBNCiAgLSBmYW1pbHk6IFJlaW5zZWwKICAgIGdpdmVuOiBHcmVnb3J5IEMKICBwdWJsaXNoZXI6IEVuZ2xld29vZCBDbGlmZnMgUHJlbnRpY2UgSGFsbAogIHR5cGU6IGJvb2sKICBpc3N1ZWQ6CiAgICB5ZWFyOiAxOTk0Ci0gaWQ6IGRpY2tleTE5NzlkaXN0cmlidXRpb24KICB0aXRsZTogRGlzdHJpYnV0aW9uIG9mIHRoZSBlc3RpbWF0b3JzIGZvciBhdXRvcmVncmVzc2l2ZSB0aW1lIHNlcmllcyB3aXRoIGEgdW5pdCByb290CiAgYXV0aG9yOgogIC0gZmFtaWx5OiBEaWNrZXkKICAgIGdpdmVuOiBEYXZpZCBBCiAgLSBmYW1pbHk6IEZ1bGxlcgogICAgZ2l2ZW46IFdheW5lIEEKICB2b2x1bWU6IDc0CiAgaXNzdWU6IDM2NmEKICBwdWJsaXNoZXI6IEpvdXJuYWwgb2YgdGhlIEFtZXJpY2FuIHN0YXRpc3RpY2FsIGFzc29jaWF0aW9uCiAgcGFnZTogNDI3LTQzMQogIHR5cGU6IGFydGljbGUtam91cm5hbAogIGlzc3VlZDoKICAgIHllYXI6IDE5NzkKbm9jaXRlOiB8IAogIEB0c2F5MjAxNGludHJvZHVjdGlvbiwgQGNhbXBiZWxsMTk5N2Vjb25vbWV0cmljcywgQG1vcmV0dGluMjAwOGVjb25vbWV0cmlhLCBAdHNheTIwMTBhbmFseXNpcywgQGJveDE5OTR0aW1lLCBAZGlja2V5MTk3OWRpc3RyaWJ1dGlvbgotLS0KCkVzdGUgbWF0ZXJpYWwgdGVtIGNvbW8gb2JqZXRpdm8gY29udHJpYnVpciBwYXJhIG8gZW50ZW5kaW1lbnRvIHNvYnJlICoqbW9kZWxvcyBTQVJJTUEqKi4gUGFyYSB0YW50bywgdmFtb3MgYXByZXNlbnRhciBvIGltcGFjdG8gZGEgc2F6b25hbGlkYWRlIGVtIHPDqXJpZXMgdGVtcG9yYWlzLCBjb21vIGEgZnVuw6fDo28gZGUgYXV0b2NvcnJlbGHDp8OjbyAoRkFDKSBzZSBjb21wb3J0YSBuYSBwcmVzZW7Dp2EgZGUgc2F6b25hbGlkYWRlIGUgY29tbyBmYXplciB1c28gZG9zIG1vZGVsb3MgU0FSSU1BIHBhcmEgbW9kZWxhciB1bWEgc8OpcmllIHRlbXBvcmFsIGNvbSAqKnNhem9uYWxpZGFkZSBtdWx0aXBsaWNhdGl2YSoqLgoKCmBgYHtyLCBlY2hvPUZBTFNFfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjICAgICBQQUNPVEVTICAgICAjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBDYXJyZWdhciBubyBhbWJpZW50ZSBvcyBwYWNvdGVzIG5lY2Vzc8OhcmlvcyBwYXJhIHJlcGxpY2FyIG9zIGPDs2RpZ29zIGFiYWl4bwpzdXBwcmVzc01lc3NhZ2VzKHJlcXVpcmUoem9vKSkKc3VwcHJlc3NNZXNzYWdlcyhyZXF1aXJlKHF1YW50bW9kKSkKc3VwcHJlc3NNZXNzYWdlcyhyZXF1aXJlKGZvcmVjYXN0KSkKc3VwcHJlc3NNZXNzYWdlcyhyZXF1aXJlKERUKSkKc3VwcHJlc3NNZXNzYWdlcyhyZXF1aXJlKGRwbHlyKSkKc3VwcHJlc3NNZXNzYWdlcyhyZXF1aXJlKG1hZ3JpdHRyKSkKc3VwcHJlc3NNZXNzYWdlcyhyZXF1aXJlKGhpZ2hjaGFydGVyKSkKc3VwcHJlc3NNZXNzYWdlcyhyZXF1aXJlKGdncGxvdDIpKQpzdXBwcmVzc01lc3NhZ2VzKHJlcXVpcmUoUGVyZm9ybWFuY2VBbmFseXRpY3MpKSAKc3VwcHJlc3NNZXNzYWdlcyhyZXF1aXJlKGh0bWx0b29scykpCnN1cHByZXNzTWVzc2FnZXMocmVxdWlyZShyZWFkcikpCm9wdGlvbnMoImdldFN5bWJvbHMueWFob28ud2FybmluZyI9RkFMU0UpCmBgYAoKIyMjIyMgKipJTlRST0RVw4fDg08qKgoKQXTDqSBvIG1vbWVudG8sIGZvY2Ftb3Mgc29icmUgYSBzw6lyaWUgZG9zIHJldG9ybm9zIHF1ZSBlbSBmdW7Dp8OjbyBkZSBxdWFzZSBzZW1wcmUgb3NjaWxhciBlbnRyZSBlbSB1bSBpbnRlcnZhbG8gZml4byB0ZW5kZSBhIHNlciBlc3RhY2lvbsOhcmlhIGUgc8OpcmllcyBxdWUgc8OjbyBuw6NvIGVzdGFjaW9uw6FyaWFzIChjb20gb3Ugc2VtIHRlbmTDqm5jaWEpLCBtYXMgc2VtIHNhem9uYWxpZGFkZS4gTmVzdGUgY2FzbywgKipvcyBtb2RlbG9zIEFSTUEgZSBBUklNQSoqIHBvZGVtIHNlciB1c2Fkb3MgcGFyYSBtb2RlbGFyIHRhaXMgc8OpcmllcywgcmVzcGVjdGl2YW1lbnRlLiAKClBvcsOpbSwgYWxndW1hcyBzw6lyaWVzIHRlbXBvcmFpcyBmaW5hbmNlaXJhcyB0YWwgY29tbyBvcyBnYW5ob3MgdHJpbWVzdHJhaXMgY29tIHVtYSBhw6fDo28sIGV4aWJlbSBjb21wb3J0YW1lbnRvcyBjw61jbGljb3MgZSBwZXJpw7NkaWNvcy4gSXNzbyBhY29udGVjZSBlbSBmdW7Dp8OjbyBkYSBkaXZ1bGdhw6fDo28gZGUgcmVzdWx0YWRvcyB0cmltZXN0cmFpcyBjb211bWVudGUgYWRvdGFkYSBwZWxhcyBlbXByZXNhcyBjb20gY2FwaXRhbCBhYmVydG8uIERlcGVuZGVuZG8gZG8gdGlwbyBkZSBuZWfDs2NpbyBkYSBlbXByZXNhLCBwZXLDrW9kb3MgZXNwZWPDrWZpY29zIGRvIGFubyB0ZW5kZW0gYSBhcHJlc2VudGFyIHJlc3VsdGFkb3MgbWVsaG9yZXMgKHNhZnJhcyBhZ3LDrWNvbGFzLCBmw6lyaWFzLCBjbGltYSBvdSBkYXRhIGVzcGVjaWFpcyBjb21vLCBwb3IgZXhlbXBsbywgTmF0YWwpIHF1ZSBwb3IgY29uc2VndWludGUgaW1wYWN0YW0gb3MgZ2FuaG9zIGNvbSBhIGHDp8Ojby4gCgpFc3NhIHRhbCBjb21wb25lbnRlIHNhem9uYWwgcG9kZSBhcGFyZWNlciBxdWFuZG8gc8OjbyBmZWl0YXMgb2JzZXJ2YcOnw7VlcyBpbnRyYS1hbnVhaXMgcGFyYSBhIHPDqXJpZSBkZSBpbnRlcmVzc2UsIGlzdG8gw6ksIG9zICoqZGFkb3Mgc8OjbyByZWdpc3RyYWRvcyBtZW5zYWxtZW50ZSwgdHJpbWVzdHJhbG1lbnRlIG91IHNlbWFuYWxtZW50ZSwgcG9yIGV4ZW1wbG8uKioKCkVzdGUgdGlwbyBkZSBzw6lyaWUgw6kgY2hhbWFkYSBkZSAqKnPDqXJpZSB0ZW1wb3JhbCBzYXpvbmFsKiouIENvbW8gZXhlbXBsbywgYSBmaWd1cmEgYWJhaXhvIG1vc3RyYSBhIHPDqXJpZSB0ZW1wb3JhbCBkb3MgZ2FuaG9zIHRyaW1lc3RyYWlzIGRhIGHDp8OjbyBkYSAqKkNvY2EtQ29sYSBDb21wYW55KiogZG8gcHJpbWVpcm8gdHJpbWVzdHJlIGRlIDE5ODMgYXTDqSBvIHRlcmNlaXJvIHRyaW1lc3RyZSBkZSAyMDA5LgoKYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgTGVpdHVyYSBkb3MgZGFkb3MKY29jYWNvbGEgPC0gcmVhZHI6OnJlYWRfdGFibGUyKCJxLWtvLWVhcm5zODMwOS50eHQiLCBjb2xfdHlwZXMgPSBjb2xzKFg0ID0gY29sX3NraXAoKSkpICU+JSBtdXRhdGUodmFsdWU9bG9nKHZhbHVlKSkKCnF1YXJ0ZXJseXRzIDwtIHN0YXRzOjp0cyhjb2NhY29sYSR2YWx1ZSwgc3RhcnQgPSBjKDE5ODMsIDEpLCBmcmVxdWVuY3kgPSA0KQoKaGMxIDwtIGhpZ2hjaGFydCh0eXBlID0gInN0b2NrIikgJT4lIAogIGhjX3RpdGxlKHRleHQgPSAiTG9nIGRvcyBnYW5ob3MgdHJpbWVzdHJhaXMgZGEgYcOnw6NvIGRhIENvY2EtQ29sYSIpICU+JSAKICBoY19hZGRfc2VyaWVzKHF1YXJ0ZXJseXRzLCBpZCA9ICJ0cyIpICU+JQogIGhjX2V4cG9ydGluZyhlbmFibGVkID0gVFJVRSkKICAKaGMxCmBgYAoKRW0gYWxndW1hcyBhcGxpY2HDp8O1ZXMgYSBzYXpvbmFsaWRhZGUgdGVtIHNlZ3VuZGEgaW1wb3J0w6JuY2lhIGUgw6kgcmVtb3ZpZGEgZG9zIGRhZG9zLCByZXN1bHRhbmRvIGVtIHVtYSBzw6lyaWUgdGVtcG9yYWwgYWp1c3RhZGEgc2F6b25hbG1lbnRlIChleHRyYcOtZGEgYSBzYXpvbmFsaWRhZGUpIHF1ZSDDqSBlbnTDo28gdXNhZGEgcGFyYSBmYXplciBpbmZlcsOqbmNpYS4gCgpPIHByb2NlY2ltZW50byBkZSByZW1vdmVyIGEgc2F6b25hbGlkYWRlIGRlIHVtYSBzw6lyaWUgdGVtcG9yYWwgw6kgY29uaGVjaWRvIGNvbW8gKiphanVzdGFtZW50byBzYXpvbmFsKiouIEVtIG91dHJhcyBhcGxpY2HDp8O1ZXMgdGFsIGNvbW8gcHJldmlzw6NvLCBhIHNhem9uYWxpZGFkZSDDqSB0w6NvIGltcG9ydGFudGUgcXVhbnRvIG91dHJhIGNhcmFjdGVyw61zdGljYSBkb3MgZGFkb3MgZSBkZXZlIHNlciB0cmF0YWRhLiBFbSBmdW7Dp8OjbyBkYSBwcmV2aXPDo28gc2VyIG8gbWFpb3Igb2JqZXRpdm8gZW0gc8OpcmllcyB0ZW1wb3JhaXMgZmluYW5jZWlyYXMsIGZvY2Ftb3MgZW0gYW5hbGlzYXIgc8OpcmllcyB0ZW1wb3JhaXMgc2F6b25haXMuIEFxdWksIHZhbW9zIGRpc2N1dGlyIG8gbW9kZWxvICoqU0FSSU1BKiogZSBtw6l0b2RvcyBxdWUgc8OjbyDDunRlaXMgcGFyYSBtb2RlbGFyIHRhaXMgc8Opcmllcy4KCiMjIyMjICoqQU7DgUxJU0UgVklTVUFMIERBIFPDiVJJRSBDT00gU0FaT05BTElEQURFKioKClBvciBtZWlvIGRvIGdyw6FmaWNvIGFudGVyaW9yLCDDqSBwb3Nzw612ZWwgb2JzZXJ2YXIgbyBwYWRyw6NvIGRlIHNhem9uYWxpZGFkZS4gQWzDqW0gZGEgc2F6b25hbGlkYWRlIHRlbW9zIHVtYSB0ZW5kw6puY2lhIGNyZXNjZW50ZSBub3MgZ2FuaG9zIHRyaW1lc3RyYWlzIGR1cmFudGUgbyBwZXLDrW9kbyBhbW9zdHJhbCBjb20gKiphbGd1bWEgcGVydHVyYmHDp8OjbyBubyBmaW5hbCBkb3MgYW5vcyA5MC4qKiBBcyBvc2NpbGHDp8O1ZXMgZGUgcGljb3MgKEFicmlsIGUgSnVsaG8pIGUgdmFsZXMgKEphbmVpcm8gZSBPdXR1YnJvKSBhY29udGVjZW0gYW51YWxtZW50ZSwgbyBxdWUgbm9zIGZheiBhY3JlZGl0YXIgcXVlIGjDoSBwcmVzZW7Dp2EgZGUgc2F6b25hbGlkYWRlLiAKCk5lc3NlIHNlbnRpZG8sIHBhcmEgYSBzw6lyaWUgdGVtcG9yYWwgZGUgZ2FuaG9zIHRyaW1lc3RyYWlzIGRhIGHDp8OjbyBkYSBDb2NhLUNvbGEgdGVtb3MgbyBzZWd1aW50ZTogCgoqICoqVGVuZMOqbmNpYToqKiBjcmVzY2VudGUgZHVyYW50ZSBvIHBlcsOtb2RvIGFtb3N0cmFsLgoqICoqVmFyacOibmNpYToqKiBvYnNlcnZhLXNlIHF1ZSwgYWzDqW0gZG8gYXVtZW50byBub3MgZ2FuaG9zLCBhIGRpc3TDom5jaWEgZW50cmUgb3MgdHJpbWVzdHJlcyBjb20gbWFpb3JlcyBlIG1lbm9yZXMgZ2FuaG9zIHRhbWLDqW0gZXN0w6EgYXVtZW50YW5kbywgaW5kaWNhbmRvIHZhcmnDom5jaWEgY3Jlc2NlbnRlLgoqICoqU2F6b25hbGlkYWRlOioqIHZlcmlmaWNhLXNlIHVtIGNvbXBvcnRhbWVudG8gc2F6b25hbCBub3MgZ2FuaG9zIHRyaW1lc3RyYWlzLiBJc3RvIMOpLCBub3MgZG9pcyBwcmltZWlyb3MgdHJpbWVzdHJlcyAoQWJyaWwgZSBKdWxobykgaMOhIHVtIGF1bWVudG8gbm9zIGdhbmhvcyBxdWFuZG8gY29tcGFyYWRvIGNvbSBvcyDDumx0aW1vcyB0cmltZXN0cmVzIGRvIGFubyAoT3V0dWJybyBlIEphbmVpcm8pLiBBbMOpbSBkaXNzbywgcGFyZWNlIHF1ZSBhIHNhem9uYWxpZGFkZSDDqSBjcmVzY2VudGUgYW8gbG9uZ28gZG8gdGVtcG8uCgpBcyBvYnNlcnZhw6fDtWVzIGFwcmVzZW50YWRhcyBhY2ltYSBwb2RlbSBzZXIgdmlzdWFsaXphZGFzIG5vIGdyw6FmaWNvIGFiYWl4by4gCgpgYGB7ciwgZWNobz1GQUxTRSwgcmVzdWx0cz0nYXNpcycsIHdhcm5pbmc9RkFMU0V9CiMgVXNhbW9zIGEgZnVuw6fDo28gc3RsIGRvIHBhY290ZSBzdGF0cyBwYXJhIGRlY29tcG9yIGEgc8OpcmllIGVtIHRyw6pzIGNvbXBvbmVudGVzOgojIHNhem9uYWxpZGFkZSwgdGVuZMOqbmNpYSBlIHJlc3RhbnRlLiBBc3NpbSwgcG9kZW1vcyB2aXN1YWxpemFyIHNlIGjDoSBjYWRhIHVtCiMgZGVzdGVzIG5hIHPDqXJpZSBlc3R1ZGFkYS4KZGVjb21wIDwtIHN0YXRzOjpzdGwocXVhcnRlcmx5dHMsICJwZXJpb2RpYyIpCmNvbG5hbWVzKGRlY29tcCR0aW1lLnNlcmllcykgPSBjKCJzYXpvbmFsaWRhZGUiLCJ0ZW5kw6puY2lhIiwicmVzdGFudGUiKQoKIyBVc2Ftb3MgYSBmdW7Dp8OjbyBoY2hhcnQgZG8gcGFjb3RlIGhpZ2hjaGFydGVyIHBhcmEgdmlzdWFsaXphciBhIGRlY29tcG9zacOnw6NvCmhpZ2hjaGFydGVyOjpoY2hhcnQoZGVjb21wKSAlPiUgaGNfdGl0bGUodGV4dCA9ICJMb2cgZG8gZ2FuaG8gdHJpbWVzdHJhbCBkYSBhw6fDo28gZGEgQ29jYS1Db2xhIikgJT4lIAogICBoY19zdWJ0aXRsZSh0ZXh0ID0gIkVudHJlIG8gcHJpbWVpcm8gdHJpbWVzdHJlIGRlIDE5ODMgZSBvIHRlcmNlaXJvIHRyaW1lc3RyZSBkZSAyMDA5IikgJT4lIAogICBoY19leHBvcnRpbmcoZW5hYmxlZCA9IFRSVUUpIApgYGAKCkVzc2EgYW7DoWxpc2Ugw6kgaW50ZXJlc3NhbnRlLCBwb2lzIG1vc3RyYSBxdWUsIGJhc2ljYW1lbnRlLCBwcmVjaXNhbW9zIG1vZGVsYXIgYXMgY29tcG9uZW50ZXMgZGUgdGVuZMOqbmNpYSBlIHNhem9uYWxpZGFkZSAoZW0gdG9ybm8gZGUgOTUlIGRhIHPDqXJpZSB0ZW1wb3JhbCkuIAoKVW1hIGFuw6FsaXNlIG1haXMgZGV0YWxoYWRhIGRhIHNhem9uYWxpZGFkZSBwb2RlIHNlciBvYnRpZGEgcGVsbyBncsOhZmljbyBhYmFpeG8gcXVlIG5vcyBwZXJtaXRlIGRldGVjdGFyIHZpc3VhbG1lbnRlIGEgcHJlc2Vuw6dhIGRlIHNhem9uYWxpZGFkZSBuYSBzw6lyaWUgdGVtcG9yYWwuIENvbW8gc2UgcG9kZSB2ZXJpZmljYXIsIG9zIGdhbmhvcyB0cmltZXN0cmFpcyBhcHJlc2VudGFtIG3DqWRpYSBlIHZhcmnDom5jaWEgbsOjbyBjb25zdGFudGUsIGluZMOtY2lvcyBkZSBuw6NvIGVzdGFjaW9uYXJpZWRhZGUgbmEgcGFydGUgc2F6b25hbCBkYSBzw6lyaWUgdGVtcG9yYWwuCgpgYGB7ciwgZWNobz1GQUxTRSwgcmVzdWx0cz0nYXNpcycsIGZpZy53aWR0aD05fQojIGdyw6FmaWNvIHRyaW1lc3RyYWwgZGEgbcOpZGlhIG5vcyBhbm9zIGFuYWxpc2Fkb3MKc3RhdHM6Om1vbnRocGxvdCh4ID0gcXVhcnRlcmx5dHMsIHlsYWIgPSAiTG9nIGRvIGdhbmhvIHRyaW1lc3RyYWwgZGEgYcOnw6NvIGRhIENvY2EtQ29sYSIsIHhsYWIgPSAiVHJpbWVzdHJlcyIpCmBgYAoKIyMjIyMgKipESUZFUkVOQ0lBw4fDg08gU0FaT05BTCoqCgpObyBwcmltZWlybyBncsOhZmljbyBkbyB0ZXh0byB0ZW1vcyBvIGxvZ2FyaXRtbyBkb3MgZ2FuaG9zIHRyaW1lc3RyYWlzIGRhIGHDp8OjbyBkYSBDb2NhLUNvbGEuIEFwbGljYW1vcyBvIGxvZ2FyaXRtbyBwb3IgZHVhcyByYXrDtWVzLiBQcmltZWlybywgZWxlIMOpICoqdXNhZG8gcGFyYSBsaWRhciBjb20gbyBjcmVzY2ltZW50byBleHBvbmVuY2lhbCBkYSBzw6lyaWUqKi4gU2VndW5kbywgdGFsIHRpcG8gZGUgdHJhbnNmb3JtYcOnw6NvICoqZXN0YWJpbGl6YSBhIHZhcmnDom5jaWEgZGEgc8OpcmllLioqIAoKU3Vwb25oYSBxdWUgZGVub3RhbW9zIG9zIGdhbmhvcyB0cmltZXN0cmFpcyBwb3IgJHJfe3R9JC4gTyBncsOhZmljbyBhYmFpeG8gc3VnZXJlIHF1ZSBhIHPDqXJpZSBkbyBsb2dhcml0bW8gZG9zIGdhbmhvcyB0cmltZXN0cmFpcyB0ZW0gZm9ydGUgYXV0b2NvcnJlbGHDp8Ojby4gCgpgYGB7ciwgZWNobz1GQUxTRSwgcmVzdWx0cz0nYXNpcycsIGZpZy53aWR0aD05fQojIEFDRiBkYSBzw6lyaWUgZG8gbG9nYXJpdG1vCmFjZmxvZyA8LSBzdGF0czo6YWNmKHF1YXJ0ZXJseXRzLCBwbG90ID0gRkFMU0UsIG5hLmFjdGlvbiA9IG5hLnBhc3MsIG1heC5sYWcgPSAyNSkKCiMgR3LDoWZpY28gZGEgRkFDIGRhIHPDqXJpZSBkbyBsb2dhcml0bW8gZG9zIGdhbmhvcwpwbG90KGFjZmxvZywgbWFpbiA9ICIiLCB5bGFiID0gIiIsIHhsYWIgPSAiRGVmYXNhZ2VtIikKdGl0bGUoIkZ1bsOnw6NvIGRlIEF1dG9jb3JyZWxhw6fDo28gKEZBQykgZG8gTG9nIGRvcyBHYW5ob3MiLCBhZGogPSAwLjUsIGxpbmUgPSAxKQpgYGAKClVtIG3DqXRvZG8gY29udmVuY2lvbmFsIHBhcmEgbGlkYXIgY29tIGlzc28gw6kgb2J0ZXIgYSBwcmltZWlyYSBkaWZlcmVuw6dhIGRhIHPDqXJpZSB0ZW1wb3JhbC4gUGFyYSBpc3NvLCBwb2RlbW9zIGZhemVyIHVzbyBkYSBub3Rhw6fDo28gY29uaGVjaWRhIGNvbW8gKmJhY2tzaGlmdCBub3RhdGlvbiogZSBkbyBvcGVyYWRvciAqYmFja3dhcmQgc2hpZnQqIHJlcHJlc2VudGFkbyBwb3IgJEIkLiBUYWwgbm90YcOnw6NvIHBvZGUgc2VyIHV0aWxpemFkYSwgY29tbyBzZWd1ZTogCgoqICRCcl90ID0gcl97dC0xfSQKKiAkQlxsZWZ0KEJyX3RccmlnaHQpPUJeMnJfdD1yX3t0LTJ9JAoqICRCXnsxMn1yX3Q9cl97dC0xMn0kIHNlIHRlbW9zIGRhZG9zIG1lbnNhaXMgZSBxdWVyZW1vcyBkYWRvcyBkbyBtZXNtbyBtw6pzIGRvIGFubyBhbnRlcmlvCiogUHJpbWVpcmEgZGlmZXJlbsOnYTogJFxsZWZ0KDEtQlxyaWdodClyX3Q9cl90LXJfe3QtMX0kCiogU2VndW5kYSBkaWZlcmVuw6dhOiAkXGxlZnQoMS1CXHJpZ2h0KV4ycl90PVxsZWZ0KDEtQlxyaWdodClcbGVmdCgxLUJccmlnaHQpcl90JAoqIG4tw6lzaW1hIGRpZmVyZW7Dp2E6ICRcbGVmdCgxLUJccmlnaHQpXm4gcl90JAoqIERpZmVyZW7Dp2Egc2F6b25hbDogJDEtQl5zJCwgb25kZSAkcyQgw6kgYSBxdWFudGlkYWRlIGRlIG9ic2VydmHDp8O1ZXMgYXTDqSBxdWUgYSBzYXpvbmFsaWRhZGUgb2NvcnJhIChwb3IgZXhlbXBsbywgJHM9NCQgcGFyYSBkYWRvcyB0cmltZXN0cmFpcyBlICRzPTEyJCBwYXJhIGRhZG9zIG1lbnNhaXMpCiogRGlmZXJlbsOnYSBzYXpvbmFsIHNlZ3VpZGEgcGVsYSBwcmltZWlyYSBkaWZlcmVuw6dhOiAkXGxlZnQoMS1CXHJpZ2h0KVxsZWZ0KDEtQl5zXHJpZ2h0KXJfdD1cbGVmdCgxLUItQl5zK0Jee3MrMX1ccmlnaHQpcl90PXJfdC1yX3t0LTF9LXJfe3Qtc30rcl97dC1zKzF9JAoKQXBsaWNhbmRvIHRhbCBub3Rhw6fDo28gcG9kZW1vcyBvYnRlciBhIHPDqXJpZSBkYSBwcmltZWlyYSBkaWZlcmVuw6dhIGRvIGxvZ2FyaXRtbyBkb3MgZ2FuaG9zIHRyaW1lc3RyYWlzIGRhIGHDp8OjbyBkYSBDb2NhLUNvbGEgZmF6ZW5kbyAkXGxlZnQoMS1CXHJpZ2h0KXJfdD1yX3Qtcl97dC0xfSQuIE8gZ3LDoWZpY28gZGEgRkFDIGRhIHPDqXJpZSByZXN1bHRhbnRlIGRhIHByaW1laXJhIGRpZmVyZW7Dp2EgKGdyw6FmaWNvIGFiYWl4byksIGNvbmZpcm1hIHF1ZSBhIGRpZmVyZW5jaWHDp8OjbyBjb250cmlidWl1IHBhcmEgZWxpbWluYXIgYSB0ZW5kw6puY2lhIGNyZXNjZW50ZSBkYSBzw6lyaWUgZG8gbG9nYXJpdG1vIGRvcyBnYW5ob3MuCgoKYGBge3IsIGVjaG89RkFMU0UsIHJlc3VsdHM9J2FzaXMnLCBmaWcud2lkdGg9OX0KIyBTw6lyaWUgZGEgcHJpbWVpcmEgZGlmZXJlbsOnYQpxdWFydGVybHlkaWYgPC0gdGltZVNlcmllczo6ZGlmZihxdWFydGVybHl0cywxKQoKIyBBQ0YgZGEgc8OpcmllIGRhIHByaW1laXJhIGRpZmVyZW7Dp2EgZG8gbG9nYXJpdG1vCmFjZmRpZiA8LSBzdGF0czo6YWNmKHF1YXJ0ZXJseWRpZiwgcGxvdCA9IEZBTFNFLCBuYS5hY3Rpb24gPSBuYS5wYXNzLCBtYXgubGFnID0gMjUpCgojIEdyw6FmaWNvIGRhIEZBQyBkYSBzw6lyaWUgZG8gbG9nYXJpdG1vIGRvcyBnYW5ob3MKcGxvdChhY2ZkaWYsIG1haW4gPSAiIiwgeWxhYiA9ICIiLCB4bGFiID0gIkRlZmFzYWdlbSIpCnRpdGxlKCJGQUMgZGEgUHJpbWVpcmEgRGlmZXJlbsOnYSBkbyBMb2cgZG9zIEdhbmhvcyIsIGFkaiA9IDAuNSwgbGluZSA9IDEpCmBgYAoKUG9yIG91dHJvIGxhZG8sIGEgRkFDIGRhIHPDqXJpZSBkYSBwcmltZWlyYSBkaWZlcmVuw6dhIG1vc3RyYSBxdWUgKiphIHPDqXJpZSBhcHJlc2VudGEgdW0gZm9ydGUgcGFkcsOjbyBkZSBzYXpvbmFsaWRhZGUqKiwgcG9pcyBub3MgbGFncyBzYXpvbmFpcyAobcO6bHRpcGxvIGRhIHBlcmlvZGljaWRhZGUgNCkgYSBmdW7Dp8OjbyBkZSBhdXRvY29ycmVsYcOnw6NvIHRlbSB1bSAqKmRlY2FpbWVudG8gbGVudG8qKiwgaW5kaWNhbmRvIHF1ZSBhIHPDqXJpZSB0ZW1wb3JhbCDDqSBuw6NvIGVzdGFjaW9uw6FyaWEgbmEgcGFydGUgc2F6b25hbC4KClNlZ3VpbmRvIGEgYWJvcmRhZ2VtIHByb3Bvc3RhIHBvciBAYm94MTk5NHRpbWUgb2J0ZW1vcyBhIHPDqXJpZSB0ZW1wb3JhbCBkYSBkaWZlcmVuw6dhIHNhem9uYWwgZGEgc8OpcmllIGRhIHByaW1laXJhIGRpZmVyZW7Dp2EgZmF6ZW5kbyBkYSAqYmFja3NoaWZ0IG5vdGF0aW9uKjoKCiQkClxEZWx0YV80KFxEZWx0YSB4X3t0fSkgPSAoMS1CXns0fSlcRGVsdGEgeF97dH0gPSBcRGVsdGEgeF97dH0gLSBcRGVsdGEgeF97dC00fSA9ICB4X3t0fS14X3t0LTF9LXhfe3QtNH0reF97dC01fQokJAoKTyBvYmpldGl2byDDqSBsaWRhciBjb20gbyBmb3J0ZSBwYWRyw6NvIGRlIHNhem9uYWxpZGFkZSBtb3N0cmFkbyBubyBncsOhZmljbyBhbnRlcmlvci4gQ29tbyByZXN1bHRhZG8sIHRlbW9zIGFiYWl4byBvIGdyw6FmaWNvIGRhIEZBQyBkZXN0YSBzw6lyaWUgKGRpZmVyZW5jaWHDp8OjbyBzYXpvbmFsIG5hIHPDqXJpZSBkYSBwcmltZWlyYSBkaWZlcmVuw6dhIGRvIGxvZ2FyaXRtbyBkb3MgZ2FuaG9zIGRhIENvY2EtQ29sYSk6CgpgYGB7ciwgZWNobz1GQUxTRSwgcmVzdWx0cz0nYXNpcycsIGZpZy53aWR0aD05fQojIFPDqXJpZSBjb20gZGlmZXJlbsOnYSBzYXpvbmFsIGRhIHByaW1laXJhIGRpZmVyZW7Dp2EgZG8gbG9nYXJpdG1vIGRvcyBnYW5ob3MKcXVhcnRlcmx5c2F6ZGlmYW5kZGlmIDwtIHRpbWVTZXJpZXM6OmRpZmYocXVhcnRlcmx5ZGlmLDQpCgojIEFDRiBkYSBzw6lyaWUgZGEgcHJpbWVpcmEgZGlmZXJlbsOnYSBkYSBkaWZlcmVuw6dhIHNhem9uYWwgCmFjZnNhemRpZmFuZGRpZiA8LSBzdGF0czo6YWNmKHF1YXJ0ZXJseXNhemRpZmFuZGRpZiwgcGxvdCA9IEZBTFNFLCBuYS5hY3Rpb24gPSBuYS5wYXNzLCBtYXgubGFnID0gMjUpCgojIEdyw6FmaWNvIGRhIEZBQyBkYSBwcmltZWlyYSBkaWZlcmVuw6dhIGRhIGRpZmVyZW7Dp2Egc2F6b25hbApwbG90KGFjZnNhemRpZmFuZGRpZiwgbWFpbiA9ICIiLCB5bGFiID0gIiIsIHhsYWIgPSAiRGVmYXNhZ2VtIikKdGl0bGUoIkZBQyBkYSBEaWZlcmVuY2lhw6fDo28gU2F6b25hbCBkYSBQcmltZWlyYSBEaWZlcmVuw6dhIGRvIExvZyBkb3MgR2FuaG9zIiwgYWRqID0gMC41LCBsaW5lID0gMSkKYGBgCgrDiSBwb3Nzw612ZWwgb2JzZXJ2YXIgbm8gZ3LDoWZpY28gYWNpbWEgcXVlIG8gKipmb3J0ZSBwYWRyw6NvIGRlIHNhem9uYWxpZGFkZSoqIGRlICRcRGVsdGEgeF97dH0kIGZvaSBlbGltaW5hZG8uIEEgcGFydGlyIGRlc3NlIGdyw6FmaWNvLCB0ZW1vcyBhcyBzZWd1aW50ZXMgb2JzZXJ2YcOnw7VlczoKCiogQXMgYXV0b2NvcnJlbGHDp8O1ZXMgc8OjbyBuZWdhdGl2YXMgZSBlc3RhdGlzdGljYW1lbnRlIHNpZ25pZmljYW50ZXMgbmFzIGRlZmFzYWdlbnMgJDEkIGUgJDQkLiBPdSBzZWphLCBhcyBhdXRvY29ycmVsYcOnw7VlcyBzw6NvIGRpZmVyZW50ZXMgZGUgJDAkIG5hIGRlZmFzYWdlbSByZWd1bGFyIGUgc2F6b25hbC4gIAoqIEEgYXV0b2NvcnJlbGHDp8OjbyDDqSBwb3NpdGl2YSBlIGVzdGF0aXN0aWNhbWVudGUgc2lnbmlmaWNhbnRlIG5hIGRlZmFzYWdlbSAkNSQKKiBBIGF1dG9jb3JyZWxhw6fDo28gw6kgcG9zaXRpdmEgZSBtYXJnaW5hbG1lbnRlIHNpZ25pZmljYW50ZSBuYSBkZWZhc2FnZW0gJDMkCgpBYmFpeG8sIGdyw6FmaWNvcyBkYXMgZGlmZXJlbmNpYcOnw7VlcyByZWFsaXphZGFzIG5hIHPDqXJpZSBkbyBsb2dhcml0bW8gZG9zIGdhbmhvcyB0cmltZXN0cmFpcy4gT2JzZXJ2YS1zZSBxdWUgYSBkaWZlcmVuw6dhIGRhIGRpZmVyZW5jaWHDp8OjbyBzYXpvbmFsIHJlYWxtZW50ZSBjb250cmlidWkgcGFyYSB1bWEgYXBhcmVudGUgZXN0YWNpb25hcmllZGFkZSB0YW50byBubyBjb21wb25lbnRlIHJlZ3VsYXIgKHF1ZSBpbmRlcGVuZGUgZGEgc2F6b25hbGlkYWRlKSBxdWFudG8gbyBjb21wb25lbnRlIHNhem9uYWwuIAoKYGBge3IsIGVjaG89RkFMU0UsIGZpZy53aWR0aD05fQojIFPDqXJpZSBjb20gZGlmZXJlbsOnYSBzYXpvbmFsIGRvIGxvZ2FyaXRtbyBkb3MgZ2FuaG9zCnF1YXJ0ZXJseXNhemRpZiA8LSBkaWZmKHF1YXJ0ZXJseXRzLDQpCgpjMSA8LSBjKCIyIiwiMyIsIjQiLCIxIikKYzIgPC0gYygiMSIsIjIiLCIzIiwiNCIpCnBhcihtZmNvbD1jKDMsMSkpCnBsb3QocXVhcnRlcmx5ZGlmLCB4bGFiID0gIkFub3MiLCB5bGFiID0gIjFhIERpZmVyZW7Dp2EiLCB0eXBlID0gImwiKQpwb2ludHMocXVhcnRlcmx5ZGlmLCBwY2ggPSBjMSwgY2V4ID0gMC43KQpwbG90KHF1YXJ0ZXJseXNhemRpZiwgeGxhYiA9ICJBbm9zIiwgeWxhYiA9ICJEaWZlcmVuw6dhIFNhem9uYWwiLCB0eXBlID0gImwiKQpwb2ludHMocXVhcnRlcmx5c2F6ZGlmLCBwY2ggPSBjMiwgY2V4ID0gMC43KQpwbG90KHF1YXJ0ZXJseXNhemRpZmFuZGRpZiwgeGxhYiA9ICJBbm9zIiwgeWxhYiA9ICJEaWYuIGRhIERpZi4gU2F6b25hbCIsIHR5cGUgPSAibCIpCnBvaW50cyhxdWFydGVybHlzYXpkaWZhbmRkaWYsIHBjaCA9IGMxLCBjZXggPSAwLjcpCmBgYAoKIyMjIyMgKipNT0RFTE8gREUgU0FaT05BTElEQURFIE1VTFRJUExJQ0FUSVZBKioKClVtYSB2ZXogY29uaGVjaWRvIG8gb3BlcmFkb3IgZGUgKmJhY2t3YXJkIHNoaWZ0KiBlIHNldXMgZGl2ZXJzb3MgdXNvcywgcG9kZW1vcyBhcGxpY8OhLWxvcyBub3MgbW9kZWxvcyBqw6EgZXN0dWRhZG9zIHBhcmEgcmVlc2NyZXbDqi1sb3MuIFVtIG1vZGVsbyAkQVJNQShwLHEpJCBwb2RlIHNlciBleHByZXNzYWRvIGNvbW86CgokJApcYmVnaW57c3BsaXR9CnJfdCAmID0gXG11ICsgXHBoaV97MX1yX3t0LTF9ICsgLi4uICsgXHBoaV97cH1yX3t0LXB9ICsgYV97dH0gKyBcdGhldGFfezF9YV97dC0xfSArIC4uLiArIFx0aGV0YV97cX1hX3t0LXF9IFxcCiYgPSBcbXUrXHBoaV97MX1Ccl97dH0gKyAuLi4gKyBccGhpX3twfUJecHJfdCArIGFfe3R9ICsgXHRoZXRhX3sxfUJhX3t0fSArIC4uLiArIFx0aGV0YV97cX1CXnFhX3t0fSBcXApccGhpXGxlZnQoQlxyaWdodClyX3QmID0gXG11ICsgXHRoZXRhXGxlZnQoQlxyaWdodClhX3QKXGVuZHtzcGxpdH0KJCQKCm9uZGUgJFxwaGlcbGVmdChCXHJpZ2h0KT0xLVxwaGlfezF9Qi0gLi4uIC1ccGhpX3twfUJecCQgZSAkXHRoZXRhXGxlZnQoQlxyaWdodCk9MStcdGhldGFfezF9QisgLi4uICsgXHRoZXRhX3txfUJecSQuIErDoSB1bSBtb2RlbG8gJEFSSU1BKDEsMSwxKSQgcG9kZSBzZXIgcmVlc2NyaXRvIGNvbW86CgokJApcYmVnaW57c3BsaXR9ClxsZWZ0KDEtXHBoaV97MX1CXHJpZ2h0KVxsZWZ0KDEtQlxyaWdodClyX3t0fSA9IFxsZWZ0KDErXHRoZXRhX3sxfUJccmlnaHQpYV97dH0gXFwKXFwKXGxlZnQoMS1ccGhpX3sxfUJccmlnaHQpXGxlZnQocl90LXJfe3QtMX1ccmlnaHQpID0gYV90ICsgXHRoZXRhX3sxfWFfdCBcXApcXApyX3QgLSByX3t0LTF9IC0gXHBoaV97MX1yX3t0LTF9ICsgXHBoaV97MX1yX3t0LTJ9ID0gYV90ICsgXHRoZXRhX3sxfWFfdCBcXApcXApyX3QgLSByX3t0LTF9ID0gXHBoaV97MX1yX3t0LTF9IC0gXHBoaV97MX1yX3t0LTJ9ICsgYV90ICsgXHRoZXRhX3sxfWFfdCBcXApcXApcRGVsdGEgcl90ID0gXHBoaV97MX1cbGVmdChyX3t0LTF9LXJfe3QtMn1ccmlnaHQpICsgYV90ICsgXHRoZXRhX3sxfWFfdCBcXApcXApcRGVsdGEgcl90ID0gXHBoaV97MX1cRGVsdGEgcl97dC0xfSArIGFfdCArIFx0aGV0YV97MX1hX3QgXFwKXGVuZHtzcGxpdH0KJCQKClVtIG1vZGVsbyBjdWphcyBhdXRvY29ycmVsYcOnw7VlcyBzZSBjb21wb3J0YW0gY29tbyBtb3N0cmFkbyBwYXJhIGEgc8OpcmllIHRlbXBvcmFsIGRvcyBsb2dhcml0bW8gZG9zIGdhbmhvcyBkYSBDb2NhLUNvbGEgw6kgbyBtb2RlbG8gZGUgc2F6b25hbGlkYWRlIG11bHRpcGxpY2F0aXZhLiBFc3RlIG1vZGVsbyBhc3N1bWUgYSBzZWd1aW50ZSBmb3JtYToKCiQkCigxLUIpKDEtQl57c30peF97dH09KDEtXHRoZXRhIEIpKDEtXFRoZXRhIEJee3N9KWFfe3R9CiQkCgpvbmRlICRzJCDDqSBhIHBlcmlvZGljaWRhZGUgZGEgc8OpcmllLCAkYV97dH0kIMOpIHVtIHJ1w61kbyBicmFuY28gY29tIG3DqWRpYSAwLCB2YXJpw6JuY2lhICRcc2lnbWFfe2F9XnsyfSQsICRFXGxlZnRbIFxsZWZ0KGFfdC1cYmFye2F9XHJpZ2h0KVxsZWZ0KGFfe3QtMX0tXGJhcnthfVxyaWdodClccmlnaHRdPUVbYV97dH1hX3t0LTF9XT0wJCBlIGluZGVwZW5kZW50ZSBlIGlkZW50aWNhbWVudGUgZGlzdHJpYnXDrWRvIChpaWQpLiBBbMOpbSBkaXNzbywgJFxsZWZ0fFx0aGV0YVxyaWdodHw8IDEkIGUgJFxsZWZ0fFxUaGV0YVxyaWdodHw8IDEkLiBFc3RlIG1vZGVsbyDDqSBjb25oZWNpZG8gbmEgbGl0ZXJhdHVyYSBjb21vICphaXJsaW5lIG1vZGVsKiBjb25mb3JtZSBwcm9wb3N0byBwb3IgQGJveDE5OTR0aW1lIG91ICRTQVJJTUEocCxkLHEpKFAsRCxRKV9zJC4gQmFzaWNhbWVudGUsIG8gbW9kZWxvIMOpIGZvcm1hZG8gcGVsYSBpbmNsdXPDo28gZGUgdGVybW9zIHNhem9uYWlzIG5vcyBtb2RlbG9zICoqQVJJTUEocCxkLHEpKiogcXVlIGrDoSBlc3R1ZGFtb3MgYW50ZXJpb3JtZW50ZS4gVXNhbW9zIGNvbW8gbm90YcOnw6NvLCBsZXRyYXMgbWFpw7pzY3VsYXMgcGFyYSBhIHBhcnRlIHNhem9uYWwgZG8gbW9kZWxvIGVucXVhbnRvIGxldHJhcyBtaW7DunNjdWxhcyByZXByZXNlbnRhbSBhIHBhcnRlIG7Do28gc2F6b25hbCBkbyBtb2RlbG8uIAoKQSBwYXJ0ZSBBUiBkbyBtb2RlbG8gc2ltcGxpc21lbnRlIGNvbnNpc3RlIGRhcyBkaWZlcmVuw6dhcyByZWd1bGFyZXMgZSBzYXpvbmFpcywgZW5xdWFudG8gYSBwYXJ0ZSBNQSBlbnZvbHZlIGRvaXMgcGFyw6JtZXRyb3MuIEZvY2FuZG8gc29icmUgYSBwYXJ0ZSBNQSwgdGVtb3M6CgokJAp3X3t0fT0oMS1cdGhldGEgQikoMS1cVGhldGEgQl57c30pYV97dH09KDEtXFRoZXRhIEJee3N9LVx0aGV0YSBCKyBcdGhldGEgXFRoZXRhIEJee3MrMX0pYV90ID0gCmFfe3R9LVx0aGV0YSBhX3t0LTF9LSBcVGhldGEgYV97dC1zfStcdGhldGEgXFRoZXRhIGFfe3Qtcy0xfQokJApvbmRlICR3X3t0fT0oMS1CKSgxLUJee3N9KXhfe3R9JCBlICRzPjEkLiBSZXNvbHZlbmRvIHBhcmEgZXN0YSBlcXVhw6fDo28gdGVtb3MgcXVlOiAKCiogJEVbd197dH1dPTAkOwoqICRWYXIod197dH0pID0gRVt3X3R3X3t0fV0gPSBFW2FfdGFfdCtcdGhldGFeMmFfe3QtMX1hX3t0LTF9K1xUaGV0YV4yIGFfe3Qtc31hX3t0LXN9KyBcdGhldGFeMiBcVGhldGFeMiBhX3t0LXMtMX1hX3t0LXMtMX1dID0gKDErXHRoZXRhXnsyfSkoMStcVGhldGFeezJ9KVxzaWdtYV97YX1eezJ9JAoqICRDb3Yod197dH0sd197dC0xfSkgPSBFWyh3X3t0fS1cYmFye3dfdH0pKHdfe3QtMX0tXGJhcnt3X3t0LTF9fSldID0gRVt3X3R3X3t0LTF9XSA9IEVbLVx0aGV0YSBhX3t0LTF9YV97dC0xfS1cdGhldGEgXFRoZXRhXjJhX3t0LXMtMX1hX3t0LXMtMX1dID0gLSBcdGhldGEgKDErXFRoZXRhXnsyfSlcc2lnbWFfe2F9XnsyfSQKKiAkQ292KHdfe3R9LHdfe3QtcysxfSkgPSBFWyh3X3t0fS1cYmFye3dfdH0pKHdfe3QtcysxfS1cYmFye3dfe3QtcysxfX0pXSA9IEVbd190d197dC1zKzF9XSA9IEVbLVxUaGV0YSBhX3t0LXN9LVx0aGV0YSBhX3t0LXN9XSA9IFx0aGV0YSBcVGhldGEgXHNpZ21hX3thfV57Mn0kCiogJENvdih3X3t0fSx3X3t0LXN9KSA9IEVbKHdfe3R9LVxiYXJ7d190fSkod197dC1zfS1cYmFye3dfe3Qtc319KV0gPSBFW3dfdHdfe3Qtc31dID0gRVstXFRoZXRhIGFfe3Qtc31hX3t0LXN9LVx0aGV0YV4yIFxUaGV0YSBhX3t0LXMtMX1dID0gLSBcVGhldGEgKDErXHRoZXRhXnsyfSlcc2lnbWFfe2F9XnsyfSQKKiAkQ292KHdfe3R9LHdfe3Qtcy0xfSkgPSBFWyh3X3t0fS1cYmFye3dfdH0pKHdfe3Qtcy0xfS1cYmFye3dfe3Qtcy0xfX0pXSA9IEVbd190d197dC1zLTF9XSA9IEVbXHRoZXRhIFxUaGV0YSBhX3t0LXMtMX1hX3t0LXMtMX1dICA9IFx0aGV0YSBcVGhldGEgXHNpZ21hX3thfV57Mn0kCiogJENvdih3X3t0fSx3X3t0LWx9KT0wJCBwYXJhICRsJCBkaWZlcmVudGUgZGUgcXVhbHF1ZXIgdW1hIGRhcyBkZWZhc2FnZW5zIGFudGVyaW9yZXMgKCQwLCAxLCBzLTEscyxzKzEkKQoKQ29uc2VxdWVudGVtZW50ZSBhIEZBQyBkZSAkd197dH0kIHNlcsOhIGRhZGEgcG9yOgoKJCQKXHJob197MX0gPSBcZnJhY3tDb3Yod197dH0sd197dC0xfSl9e1Zhcih3X3t0fSl9ID0gXGZyYWN7LSBcdGhldGEgKDErXFRoZXRhXnsyfSlcc2lnbWFfe2F9XnsyfX17KDErXHRoZXRhXnsyfSkoMStcVGhldGFeezJ9KVxzaWdtYV97YX1eezJ9fSA9IFxmcmFjey0gXHRoZXRhfXsxKyBcdGhldGFeezJ9fQokJAoKJCQKXHJob197c30gPSBcZnJhY3tDb3Yod197dH0sd197dC1zfSl9e1Zhcih3X3t0fSl9ID0gXGZyYWN7LSBcVGhldGEgKDErXHRoZXRhXnsyfSlcc2lnbWFfe2F9XnsyfX17KDErXHRoZXRhXnsyfSkoMStcVGhldGFeezJ9KVxzaWdtYV97YX1eezJ9fSA9IFxmcmFjey0gXFRoZXRhfXsxKyBcVGhldGFeezJ9fQokJAoKJCQKXHJob197cy0xfSA9IFxyaG9fe3MrMX0gPSBcZnJhY3tDb3Yod197dH0sd197dC1zKzF9KX17VmFyKHdfe3R9KX0gPSBcZnJhY3tDb3Yod197dH0sd197dC1zLTF9KX17VmFyKHdfe3R9KX0gPSBcZnJhY3tcdGhldGEgXFRoZXRhIFxzaWdtYV97YX1eezJ9fXsoMStcdGhldGFeezJ9KSgxK1xUaGV0YV57Mn0pXHNpZ21hX3thfV57Mn19ID0gXGZyYWN7XHRoZXRhIFxUaGV0YX17KDErXHRoZXRhXnsyfSkoMStcVGhldGFeezJ9KX0KJCQKZSAkXHJobz0wJCBwYXJhICRsJCBkaWZlcmVudGUgZGUgcXVhbHF1ZXIgdW1hIGRhcyBkZWZhc2FnZW5zIGFudGVyaW9yZXMgKCQwLCAxLCBzLTEscyxzKzEkKS4KClBvciBleGVtcGxvLCBzZSAkd197dH0kIMOpIHVtYSBzw6lyaWUgdGVtcG9yYWwgdHJpbWVzdHJhbCwgZW50w6NvICRzPTQkIGUgcGFyYSAkbD4wJCBhIEZBQyBzZXLDoSBkaWZlcmVudGUgZGUgemVybyBwYXJhIGFzIGRlZmFzYWdlbnMgJDEsMyw0JCBlICQ1JCBhcGVuYXMuIEVzdGUgw6kgbyBjYXNvIHBhcmEgbyBsb2dhcml0bW8gZG9zIGdhbmhvcyBkYSBDb2NhLUNvbGEgKG9ic2VydmUgbyBncsOhZmljbyBkYSBGQUMgZGEgcHJpbWVpcmEgZGlmZXJlbsOnYSBkYSBkaWZlcmVuY2lhw6fDo28gc2F6b25hbCkuCgpHZW5lcmFsaXphbmRvLCB0ZW1vcyBxdWUgcGFyYSBtb2RlbG9zICRTQVJJTUEocCxkLHEpKFAsRCxRKV9zJCwgYSBwYXJ0ZSBzYXpvbmFsIGRvIEFSIG91IE1BIHNlcsOhIHZpc3RhIG5hcyBkZWZhc2FnZW5zIHNhem9uYWlzIGRhIEZBQ1AgZSBGQUMsIHJlc3BlY3RpdmFtZW50ZS4gUG9yIGV4ZW1wbG8sIHBhcmEgdW0gbW9kZWxvICRTQVJJTUEoMCwwLDApKDAsMCwxKV97MTJ9JCB0ZXJlbW9zOgoKKiBVbSBwaWNvIG5hIGRlZmFzYWdlbSAkMTIkIChwcmltZWlyYSBkZWZhc2FnZW0gc2F6b25hbCkgbmEgRkFDLCBtYXMgbmVuaHVtIG91dHJvIHBpY28gZXN0YXRpc3RpY2FtZW50ZSBzaWduaWZpY2FudGUgbmFzIGRlbWFpcyBkZWZhc2FnZW5zIHNhem9uYWlzCiogRGVjYWltZW50byBleHBvbmVuY2lhbCBuYXMgZGVmYXNhZ2VucyBzYXpvbmFpcyBuYSBGQUNQIChpc3RvIMOpLCBkZWZhc2FnZW5zICQxMiQsICQyNCQsICQzNiQsIC4uLikKClNpbWlsYXJtZW50ZSwgdW0gJFNBUklNQSgwLDAsMCkoMSwwLDApX3sxMn0kIHRlcsOhOgoKKiBEZXhhaW1lbnRvIGV4cG9uZW5jaWFsIG5hcyBkZWZhc2FnZW5zIHNhem9uYWlzIGRhIEZBQwoqIFVtIMO6bmljbyBwaWNvIHNpZ25pZmljYW50ZSBuYSBkZWZhc2FnZW0gMTIgZGEgRkFDUAoKQXNzaW0sIHBhcmEgYXZhbGlhciBhcyBvcmRlbnMgZG9zIGNvbXBvbmVudGVzIEFSIGUgTUEsIHRhbnRvIGRhIHBhcnRlIHJlZ3VsYXIgcXVhbnRvIGRhIHBhcnRlIHNhem9uYWwsIGRldmUtc2UgYWRvdGFyIG8gbWVzbW8gcHJvY2VkaW1lbnRvIGVzdHVkYWRvLCBjb25zaWRlcmFuZG8gYXBlbmFzIHF1ZSBwYXJhIGEgcGFydGUgc2F6b25hbCBkZXZlLXNlIGF2YWxpYXIgYXMgZGVmYXNhZ2VucyBzYXpvbmFpcyBuYXMgZnVuw6fDtWVzIGRlIGF1Y290b3JyZWxhw6fDo28gKEZBQykgZSBhdWNvdG9ycmVsYcOnw6NvIHBhcmNpYWwgKEZBQ1ApLgoKIyMjIyMgKipQUk9DRVNTTyBERSBFU1RJTUHDh8ODTyBERSBNT0RFTE9TIFNBUklNQSoqCgoxLiBWaXN1YWxpemFyIG9zIGRhZG9zIHBhcmEgaWRlbnRpZmljYXIgb2JzZXJ2YcOnw7VlcyBmb3JhIGRvIHBhZHLDo28gKCpvdXRsaWVycyogb3UgZGFkb3MgZmFsdGFudGVzKSwgZXhhbWluYXIgc2UgZXhpc3RlICoqdGVuZMOqbmNpYSBlL291IHNhem9uYWxpZGFkZSoqIHBvciBtZWlvIGRlIGdyw6FmaWNvcyBlc3BlY8OtZmljb3MKMi4gU2UgbmVjZXNzw6FyaW8sIHRyYW5zZm9ybWFyIG9zIGRhZG9zIHBhcmEgZXN0YWJpbGl6YXIgYSB2YXJpw6JuY2lhIChsb2dhcml0bW8gZG9zIGRhZG9zLCB2YXJpYcOnw6NvIG91IHJldG9ybm8sIHBvciBleGVtcGxvKQozLiBUZXN0YXIgc2Ugb3MgZGFkb3Mgc8OjbyBlc3RhY2lvbsOhcmlvcy4gQ2FzbyB0ZW5oYSByYWl6IHVuaXTDoXJpYSDDqSBwcmVjaXNvIGRpZmVyZW5jaWFyIG9zIGRhZG9zIGF0w6kgc2UgdG9ybmFyZW0gZXN0YWNpb27DoXJpb3MuIFBhcmEgaXNzbywgdGVzdGEtc2Ugbm92YW1lbnRlIHNlIGEgc8OpcmllIGRpZmVyZW5jaWFkYSBzZSB0b3Jub3UgZXN0YWNpb27DoXJpYS4KICAgICogU2UgZXhpc3RlIGFwZW5hcyBzYXpvbmFsaWRhZGUsIGZhw6dhIGEgZGlmZXJlbmNpYcOnw6NvIHNhem9uYWwgKHBvciBleGVtcGxvLCBwYXJhIGRhZG9zIG1lbnNhaXMgZmHDp2EgYSBkaWZlcmVuY2lhw6fDo28gZGUgb3JkZW0gMTIpCiAgICAqIFNlIGV4aXN0ZSBhcGVuYXMgdGVuZMOqbmNpYSwgZmHDp2EgYXBlbmFzIGEgcHJpbWVpcmEgZGlmZXJlbsOnYS4gCiAgICAqIFNlIGV4aXN0ZSB0ZW5kw6puY2lhIGUgc2F6b25hbGlkYWRlLCBhcGxpcXVlIGEgcHJpbWVpcmEgZGlmZXJlbsOnYSBub3MgZGFkb3MgcGFyYSB0cmF0YXIgYSB0ZW5kw6puY2lhIGUgYXDDs3MgaXNzbyBhIGRpZmVyZW5jaWHDp8OjbyBzYXpvbmFsIChvIGNhc28gZG9zIGdhbmhvcyB0cmltZXN0cmFpcyBkYSBDb2NhLUNvbGEpCiAgICAqIFNlIG7Do28gZXhpc3RlIHRlbmTDqm5jaWEgb3Ugc2F6b25hbGlkYWRlIG7Do28gZmHDp2EgcXVhbHF1ZXIgZGlmZXJlbmNpYcOnw6NvCjQuIEV4YW1pbmFyIGFzIGZ1bsOnw7VlcyBkZSBhdXRvY29ycmVsYcOnw6NvIHBhcmNpYWwgKEZBQykgZSBhdXRvY29ycmVsYcOnw6NvIHBhcmNpYWwgKEZBQ1ApIHBhcmEgZGV0ZXJtaW5hciBhcyBvcmRlbnMgbcOheGltYXMgJFAkIGUgJFEkIHBhcmEgb3MgY29tcG9uZW50ZXMgQVIgZSBNQSB0YW50byBkYSBwYXJ0ZSByZWd1bGFyIHF1YW50byBkYSBwYXJ0ZSBzYXpvbmFsIGRhIHPDqXJpZSBlc3RhY2lvbsOhcmlhOgogICAgKiB0ZXJtb3MgbsOjbyBzYXpvbmFpczogZXhhbWluZSBhcyBwcmltZWlyYXMgZGVmYXNhZ2VucyAoMSwyLDMsLi4pIGRhIEZBQyBlIEZBQ1AuIE1hbnRlbW9zIG8gbWVzbW8gcGFkcsOjbyBqw6EgZXN0dWRhZG8sIG91IHNlamEsIGEgRkFDIGRlZmluZSB0ZXJtb3MgTUEgZSBhIEZBQ1AgdGVybW9zIEFSCiAgICAqIHRlcm1vcyBzYXpvbmFpczogZXhhbWluZSBwYWRyw7VlcyBlbSBkZWZhc2FnZW5zIHF1ZSBzw6NvIG3Dumx0aXBsYXMgZGEgcGVyaW9kaWNpZGFkZSBkYSBzw6lyaWUuIFBvciBleGVtcGxvLCBwYXJhIGRhZG9zIG1lbnNhaXMsIHZlcmlmaXF1ZSBuYXMgZGVmYXNhZ2VucyAxMiwgMjQsIDM2IChwcm92YXZlbG1lbnRlIHNlcsOhIHByZWNpc28gdmVyaWZpY2FyIGFzIHByaW1laXJhcyBkdWFzIG91IHRyw6pzIGRlZmFzYWdlbnMgbcO6bHRpcGxhcyBkYSBwZXJpb2RpY2lkYWRlKS4gQXZhbGllIGEgRkFDIGUgRkFDUCBuYXMgZGVmYXNhZ2VucyBzYXpvbmFpcyBkYSBtZXNtYSBmb3JtYSBxdWUgdm9jw6ogZmV6IG5hcyBkZWZhc2FnZW5zIG7Do28gc2F6b25haXMKNS4gRXN0aW1hciB0b2RhcyBhcyBjb21iaW5hw6fDtWVzIHBhcmEgJHAkLCAkZCQgZSAkcSQgbmEgcGFydGUgcmVndWxhciBlICRQJCwgJEQkIGUgJFEkIG5hIHBhcnRlIHNhem9uYWwuIEFxdWksIHRhbnRvICRkJCBxdWFudG8gJEQkIHNlcsOjbyBmaXhvcyBlIGlndWFsIGFvIG7Dum1lcm8gZGUgdmV6ZXMgbmVjZXNzw6FyaWFzIHBhcmEgdG9ybmFyIGEgc8OpcmllIG9yaWdpbmFsIGVzdGFjaW9uw6FyaWEgbmEgcGFydGUgcmVndWxhciBlIG5hIHBhcnRlIHNhem9uYWwsIHJlc3BlY3RpdmFtZW50ZS4gCjYuIEVzY29saGVyIGRlbnRyZSB0b2RvcyBvcyBtb2RlbG9zIGVzdGltYWRvcyBubyBwYXNzbyBhbnRlcmlvciwgbyBtb2RlbG8gY29tIG1lbm9yIEFJQyBlL291IEJJQy4KNy4gRXhhbWluYXIgc2Ugb3MgcmVzw61kdW9zIHNlIGNvbXBvcnRhbSBjb21vIHJ1w61kbyBicmFuY28uIENhc28gY29udHLDoXJpbywgcmV0b3JuYXIgYW8gcGFzc28gMyBvdSA0LgogICAgKiBUZXN0YXIgYXV0b2NvcnJlbGHDp8OjbyBub3MgcmVzw61kdW9zCiAgICAqIFRlc3RhciBzZSB0ZW0gaGV0ZXJvY2VkYXN0aWNpZGFkZSBjb25kaWNpb25hbAogICAgKiBWZXJpZmljYXIgYSBkaXN0cmlidWnDp8OjbyBkZSBwcm9iYWJpbGlkYWRlCjguIFVtYSB2ZXogcXVlIG9zIHJlc8OtZHVvcyBzw6NvIHJ1w61kbyBicmFuY28sIG9idGVyIGFzIHByZXZpc8O1ZXMuCgoqICoqRVhFTVBMTyoqCgpWYW1vcyBjb250aW51YXIgY29tIG9zIGRhZG9zIGRvcyBnYW5ob3MgdHJpbWVzdHJhaXMgZGEgQ29jYS1Db2xhLiBBZ29yYSwgY29tIHRhaXMgZGFkb3MgdmFtb3Mgc2VndWlyIG8gcHJvY2Vzc28gcHJvcG9zdG86IAoKMS4gSsOhIHJlYWxpemFkbyBhbnRlcmlvcm1lbnRlIChncsOhZmljbyBxdWUgZGl2aWRlIGEgc8OpcmllIGVtIHNhem9uYWxpZGFkZSwgdGVuZMOqbmNpYSBlIHJlc3RhbnRlKQoyLiBKw6EgcmVhbGl6YWRvIGFudGVyaW9ybWVudGUgKGFwbGljYcOnw6NvIGRvIGxvZ2FyaXRtbyBub3MgZ2FuaG9zIHRyaW1lc3RyYWlzKQozLiBDbGFyYW1lbnRlLCBvcyBkYWRvcyBzw6NvIG7Do28gZXN0YWNpb27DoXJpb3MsIHBvaXMgYSBzw6lyaWUgYXByZXNlbnRhIHNhem9uYWxpZGFkZSBlIHRlbmTDqm5jaWEuIFBhcmEgY29uZmlybWFyLCBleGVjdXRhbW9zIG8gdGVzdGUgZGUgcmFpeiB1bml0w6FyaWEgQURGIGNvbSAkNCQgZGVmYXNhZ2Vucy4KCmBgYHtyLCBlY2hvPUZBTFNFLCByZXN1bHRzPSdhc2lzJ30KIyBBcXVpLCB1c2Ftb3MgYSBmdW7Dp8OjbyBhZGZUZXN0IGRvIHBhY290ZSBmVW5pdFJvb3RzIHBhcmEgdGVzdGFyIHNlIGjDoSByYWl6IHVuaXTDoXJpYQojIG5hIHPDqXJpZSB0ZW1wb3JhbCBhdmFsaWFkYS4gQ29tbyBvYnNlcnZhbW9zIG5vIGdyw6FmaWNvIGRhIHPDqXJpZSwgaMOhIHRlbmTDqm5jaWEgZXN0b2PDoXN0aWNhCiMgbm9zIGRhZG9zIGUgYXNzaW0gbyB0ZXN0ZSB2ZXJpZmljYXLDoSBzZSBhIHPDqXJpZSBzZSBjb21wb3J0YSBjb21vIHVtIHBhc3NlaW8gYWxlYXTDs3JpbwojIGNvbSBkcmlmdC4gSXN0byDDqSBldmlkw6puY2lhZG8gcG9yIG1laW8gZGEgb3DDp8OjbyB0eXBlIHF1ZSB0ZW0gYXMgc2VndWludGVzIG9ww6fDtWVzOgojIC0gbmM6IGZvciBhIHJlZ3Jlc3Npb24gd2l0aCBubyBpbnRlcmNlcHQgKGNvbnN0YW50KSBub3IgdGltZSB0cmVuZCAocGFzc2VpbyBhbGVhdMOzcmlvKQojIC0gYzogZm9yIGEgcmVncmVzc2lvbiB3aXRoIGFuIGludGVyY2VwdCAoY29uc3RhbnQpIGJ1dCBubyB0aW1lIHRyZW5kIChwYXNzZWlvIGFsZWF0w7NyaW8gY29tIGRyaWZ0KQojIC0gY3Q6IGZvciBhIHJlZ3Jlc3Npb24gd2l0aCBhbiBpbnRlcmNlcHQgKGNvbnN0YW50KSBhbmQgYSB0aW1lIHRyZW5kIChwYXNzZWlvIGFsZWF0w7NyaW8gY29tIGNvbnN0YW50ZSBlIHRlbmTDqm5jaWEpCiMgQWzDqW0gZGlzc28sIGRlZmluaW1vcyBxdWUgbm8gbcOheGltbyA0IGRlZmFzYWdlbnMgZGEgc8OpcmllIGRldmVtIHNlciB1c2FkYXMgY29tbwojIHZhcmnDoXZlaXMgZXhwbGljYXRpdmFzIGRhIHJlZ3Jlc3PDo28gZG8gdGVzdGUuCnVuaXRSb290IDwtIGZVbml0Um9vdHM6OmFkZlRlc3QocXVhcnRlcmx5dHMsIGxhZ3M9NCwgdHlwZT1jKCJjIikpCnByaW50KHVuaXRSb290KQpgYGAKCkNvbW8gcmVzdWx0YWRvIHRlbW9zIHF1ZSBhIGVzdGF0w61zdGljYSBkbyB0ZXN0ZSDDqSAkLTIuMjAzMSQgY29tIHVtIHAtdmFsb3IgZGUgJDAuMjM5NSQuIEFzc2ltLCBhIGhpcMOzdGVzZSBudWxhIGRlIHJhaXogdW5pdMOhcmlhIG7Do28gcG9kZSBzZXIgcmVqZWl0YWRhIGVtIHF1YWxxdWVyIG7DrXZlbCBkZSBzaWduaWZpY8OibmNpYSByYXpvw6F2ZWwgZSBhIHPDqXJpZSB0ZW1wb3JhbCBkb3MgZ2FuaG9zIHRyaW1lc3RyYWlzIGNvbSBhIGHDp8OjbyBkYSBDb2NhLUNvbGEgdGVtIHJhaXogdW5pdMOhcmlhLCBvdSBzZWphLCBuw6NvIMOpIGVzdGFjaW9uw6FyaWEuICoqT2JzLjogZXhpc3RlbSB0ZXN0ZXMgZXNwZWPDrWZpY29zIHBhcmEgc8OpcmllcyB0ZW1wb3JhaXMgY29tIHNhem9uYWxpZGFkZSBlIHF1ZWJyYSBlc3RydXR1cmFsLCBwb2lzIG5hIHByZXNlbsOnYSBkZXN0ZXMgY29tcG9uZW50ZXMgb3MgdGVzdGVzIHRyYWRpY2lvbmFpcyBkZSByYWl6IHVuaXTDoXJpYSBwZXJkZW0gcG9kZXIuIE1haW9yZXMgZGV0YWxoZXMgc29icmUgb3MgdGVzdGVzIGRlIHJhaXogdW5pdMOhcmlhIHF1ZSBwZXJtaXRlbSBzYXpvbmFsaWRhZGUgZS9vdSBxdWVicmEgZXN0cnV0dXJhbCBuZXN0ZSBbbGlua10oaHR0cDovL3d3dy50ZXNlcy51c3AuYnIvdGVzZXMvZGlzcG9uaXZlaXMvNDUvNDUxMzMvdGRlLTIyMDYyMDA5LTEzMjkxNC9wdWJsaWNvL0Rpc3NlcnRhY2FvX01FU1RSQURPX0thcmVuX05vZ3VlaXJhX0p1bmhvXzIwMDkucGRmKSoqCgpBIHBhcnRpciBkaXNzbywgcGVyY2ViZW1vcyBxdWUgw6kgcHJlY2lzbyBhcGxpY2FyIGEgcHJpbWVpcmEgZGlmZXJlbsOnYSBwYXJhIGVsaW1pbmFyIGEgdGVuZMOqbmNpYSBlIGFww7NzIGlzc28gZGlmZXJlbmNpYXIgbmEgcGVyaW9kaWNpZGFkZSBkb3MgZGFkb3MgKHBhcmEgcmV0aXJhciBhIHNhem9uYWxpZGFkZSkuCgo0LiBBIEZBQ1Agc3VnZXJlIHVtIG1vZGVsbyAkQVIoMikkIGVucXVhbnRvIGEgRkFDIHN1Z2VyZSB1bSBtb2RlbG8gJE1BKDEpJCBwYXJhIGEgcGFydGUgcmVndWxhci4gSsOhIHBhcmEgYSBwYXJ0ZSBzYXpvbmFsIHRlbW9zIHVtICRBUigxKSQgZSAkTUEoMSkkLiBBc3NpbSwgdmFtb3MgZXN0aW1hciB0b2RhcyBhcyBjb21iaW5hw6fDtWVzIHBhcmEgJFNBUklNQSgyLDEsMSkoMSwxLDEpX3s0fSQKCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcud2lkdGg9OS41LCBmaWcuaGVpZ2h0PTR9CiMgVXNhbW9zIGEgZnVuw6fDo28gZ2d0c2Rpc3BsYXkgZG8gcGFjb3RlIGZvcmVjYXN0IHBhcmEgdmlzdWFsaXphciBhIHPDqXJpZQojIGRlIGludGVyZXNzZSAoZGlmZXJlbsOnYSBkYSBkaWZlcmVuw6dhIHNhem9uYWwpIGUgb3MgZ3LDoWZpY29zIGRhIAojIEZBQyBlIEZBQ1AKIyBGQUNQIGRhIHPDqXJpZSBkYSBwcmltZWlyYSBkaWZlcmVuw6dhIGRhIGRpZmVyZW7Dp2Egc2F6b25hbCAKcGFjZnNhemRpZmFuZGRpZiA8LSBzdGF0czo6cGFjZihxdWFydGVybHlzYXpkaWZhbmRkaWYsIHBsb3QgPSBGQUxTRSwgbmEuYWN0aW9uID0gbmEucGFzcywgbWF4LmxhZyA9IDI1KQoKIyBHcsOhZmljbyBkYSBGQUMgZGEgRGlmZXJlbsOnYSBTYXpvbmFsIGRhIHByaW1laXJhIGRpZmVyZW7Dp2EgZG8gbG9nCnBsb3QoYWNmc2F6ZGlmYW5kZGlmLCBtYWluID0gIiIsIHlsYWIgPSAiIiwgeGxhYiA9ICJEZWZhc2FnZW0iKQp0aXRsZSgiRkFDIGRhIERpZmVyZW5jaWHDp8OjbyBTYXpvbmFsIGRhIFByaW1laXJhIERpZmVyZW7Dp2EgZG8gTG9nIGRvcyBHYW5ob3MiLCBhZGogPSAwLjUsIGxpbmUgPSAxKQoKIyBHcsOhZmljbyBkYSBGQUNQIGRhIERpZmVyZW7Dp2EgU2F6b25hbCBkYSBwcmltZWlyYSBkaWZlcmVuw6dhIGRvIGxvZwpwbG90KHBhY2ZzYXpkaWZhbmRkaWYsIG1haW4gPSAiIiwgeWxhYiA9ICIiLCB4bGFiID0gIkRlZmFzYWdlbSIpCnRpdGxlKCJGQUNQIGRhIERpZmVyZW5jaWHDp8OjbyBTYXpvbmFsIGRhIFByaW1laXJhIERpZmVyZW7Dp2EgZG8gTG9nIGRvcyBHYW5ob3MiLCBhZGogPSAwLjUsIGxpbmUgPSAxKQpgYGAKCgo1LiBVc2FuZG8gdG9kYXMgYXMgY29tYmluYcOnw7VlcyBkYXMgb3JkZW5zIGVuY29udHJhZGFzIGFudGVyaW9ybWVudGUsIGVzdGltYW1vcyBvcyBtb2RlbG9zIFNBUklNQS4gCgpgYGB7ciwgZWNobz1GQUxTRSwgcmVzdWx0cz0nYXNpcyd9CiMgVG9kYXMgYXMgY29tYmluYcOnw7VlcyBwb3Nzw612ZWlzIGRlIHA9MCBhdMOpIHA9bWF4LCBxPTAgYXTDqSBxPW1heCwgUD0wIGF0w6kgUD1tYXggZSBRPTAgYXTDqSBRPW1heApwYXJzIDwtIGV4cGFuZC5ncmlkKGFyID0gMDoyLCBkaWZmID0gMSwgbWEgPSAxLCBhcnMgPSAwOjEsIGRpZmZzID0gMSwgbWFzID0gMSkKCiMgTG9jYWwgb25kZSBvcyByZXN1bHRhZG9zIGRlIGNhZGEgbW9kZWxvIHNlcsOhIGFybWF6ZW5hZG8KbW9kZWxvIDwtIGxpc3QoKQoKIyBFc3RpbWHDp8OjbyBkZSBjYWRhIG1vZGVsbyB1c2FuZG8gYSBzw6lyaWUgdGVtcG9yYWwgZW0gZXN0dWRvCmZvciAoaSBpbiAxOm5yb3cocGFycykpIHsKICAgIG1vZGVsb1tbaV1dIDwtIGFyaW1hKHF1YXJ0ZXJseXRzLCBvcmRlciA9IHVubGlzdChwYXJzW2ksIDE6M10pLCAKICAgICAgICAgICAgICAgICAgICAgICAgc2Vhc29uYWwgPSBsaXN0KG9yZGVyPXVubGlzdChwYXJzW2ksNDo2XSksIHBlcmlvZCA9IDQpLCBtZXRob2QgPSAiTUwiKQp9CgojIFZlcm9zc2ltaWxoYW7Dp2EKbG9nX3Zlcm9zc2ltaWxoYW5jYSA8LSBsaXN0KCkKZm9yIChpIGluIDE6bGVuZ3RoKG1vZGVsbykpIHsKICBsb2dfdmVyb3NzaW1pbGhhbmNhW1tpXV0gPC0gbW9kZWxvW1tpXV0kbG9nbGlrCn0KCiMgQUlDCmFpY3NhcmltYSA8LSBsaXN0KCkKZm9yIChpIGluIDE6bGVuZ3RoKG1vZGVsbykpIHsKICBhaWNzYXJpbWFbW2ldXSA8LSBzdGF0czo6QUlDKG1vZGVsb1tbaV1dKQp9CgojIENhbGN1bGFyIG8gQklDCmJpY3NhcmltYSA8LSBsaXN0KCkKZm9yIChpIGluIDE6bGVuZ3RoKG1vZGVsbykpIHsKICBiaWNzYXJpbWFbW2ldXSA8LSBzdGF0czo6QklDKG1vZGVsb1tbaV1dKQp9CgojIFF1YW50aWRhZGUgZGUgcGFyw6JtZXRyb3MgZXN0aW1hZG9zIHBvciBtb2RlbG8KcXVhbnRfcGFyYW1lbnRyb3MgPC0gbGlzdCgpCmZvciAoaSBpbiAxOmxlbmd0aChtb2RlbG8pKSB7CiAgcXVhbnRfcGFyYW1lbnRyb3NbW2ldXSA8LSBsZW5ndGgobW9kZWxvW1tpXV0kY29lZikrMSAjICsxIHBvcnF1ZSB0ZW1vcyBhIHZhcmnDom5jaWEgZG8gdGVybW8gZGUgZXJybyAKfQoKIyBNb250YXIgYSB0YWJlbGEgY29tIG9zIHJlc3VsdGFkb3MKZXNwZWNpZmljYWNhbyA8LSBwYXN0ZTAoIlNBUklNQSIscGFycyRhciwgcGFycyRkaWZmLCBwYXJzJG1hLCBwYXJzJGFycywgcGFycyRkaWZmcywgcGFycyRtYXMpCnRhbWFuaG9fYW1vc3RyYSA8LSByZXAobGVuZ3RoKHF1YXJ0ZXJseXRzKSwgbGVuZ3RoKG1vZGVsbykpCnJlc3VsdGFkbyA8LSBkYXRhLmZyYW1lKGVzcGVjaWZpY2FjYW8sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbl92ZXJvc3NpbWlsaGFuY2EgPSB1bmxpc3QobG9nX3Zlcm9zc2ltaWxoYW5jYSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50X3BhcmFtZW50cm9zID0gdW5saXN0KHF1YW50X3BhcmFtZW50cm9zKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhbWFuaG9fYW1vc3RyYSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpYyA9IHVubGlzdChhaWNzYXJpbWEpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmljID0gdW5saXN0KGJpY3NhcmltYSkpCiMgR2VyYXIgdW1hIHRhYmVsYSBxdWUgc2Vyw6EgdmlzdWFsaXphZGEgbm8gZG9jdW1lbnRvLiBNYWlzIGRldGFsaGVzIGVtIGh0dHA6Ly9oYW96aHUyMzMuZ2l0aHViLmlvL2thYmxlRXh0cmEvCmtuaXRyOjprYWJsZShyZXN1bHRhZG8sIGZvcm1hdCA9ICJwYW5kb2MiLCBkaWdpdHMgPSBjKDAsMiwwLDAsMiksIGFsaWduID0gJ2MnKQpgYGAKCjYuIE9zIHJlc3VsdGFkb3MgbW9zdHJhbSBxdWUgbyBtb2RlbG8gJFNBUklNQSgwLDEsMSkoMCwxLDEpX3s0fSQgw6kgbyBtb2RlbG8gZXNjb2xoaWRvLCBwb2lzIHRlbSBvIG1lbm9yIEFJQyBlIEJJQy4KNy4gQSBGQUMgZG9zIHJlc8OtZHVvcyBkbyBtb2RlbG8gbW9zdHJhIHF1ZSBxdWFzZSB0b2RhcyBhcyBhdXRvY29ycmVsYcOnw7VlcyBlc3TDo28gZGVudHJvIGRvcyBsaW1pdGVzLCBpbmRpY2FuZG8gcXVlIG9zIHJlc8OtZHVvcyBzZSBjb21wb3J0YW0gY29tbyB1bSBydcOtZG8gYnJhbmNvLiAKCmBgYHtyLCBlY2hvPUZBTFNFLCByZXN1bHRzPSdhc2lzJywgZmlnLndpZHRoPTl9CiMgRnVuw6fDo28gZGUgYXV0b2NvcnJlbGHDp8OjbyBkb3MgcmVzw61kdW9zCmFjZl9zYXJpbWFfZXN0IDwtIHN0YXRzOjphY2YobW9kZWxvW1sxXV0kcmVzaWR1YWxzLCBuYS5hY3Rpb24gPSBuYS5wYXNzLCBwbG90ID0gRkFMU0UsIGxhZy5tYXggPSAxNSkKCiMgR3LDoWZpY28gZGEgZnVuw6fDo28gZGUgYXV0b2NvcnJlbGHDp8Ojby4gCnBsb3QoYWNmX3NhcmltYV9lc3QsIG1haW4gPSAiIiwgeWxhYiA9ICIiLCB4bGFiID0gIkRlZmFzYWdlbSIpCnRpdGxlKCJGdW7Dp8OjbyBkZSBBdXRvY29ycmVsYcOnw6NvIChGQUMpIGRvcyBSZXPDrWR1b3MgZG8gU0FSSU1BKDAsMSwxKSgwLDEsMSk0IiwgYWRqID0gMC41LCBsaW5lID0gMSkKYGBgCgpPdXRybyB0ZXN0ZSBpbXBvcnRhbnRlIMOpIGEgdmVyaWZpY2HDp8OjbyBkYSBwcmVzZW7Dp2Egb3UgbsOjbyBkZSBoZXRlcm9jZWRhc3RpY2lkYWRlIGNvbmRpY2lvbmFsLiBPIGdyw6FmaWNvIGFiYWl4byBtb3N0cmEgYSBGQUMgZG8gcXVhZHJhZG8gZG9zIHJlc8OtZHVvcyBlIMOpIHBvc3PDrXZlbCBvYnNlcnZhciBxdWUgaMOhIGhldGVyb2NlZGFzdGljaWRhZGUgY29uZGljaW9uYWwgZSBlbGEgZGV2ZXJpYSBzZXIgdHJhdGFkYS4gCgpgYGB7ciwgZWNobz1GQUxTRSwgcmVzdWx0cz0nYXNpcycsIGZpZy53aWR0aD05fQojIFRlc3RlIGRlIGhldGVyb2NlZGFzdGljaWRhZGUgY29uZGljaW9uYWwKYWNmX3NhcmltYV9zcXVhcmUgPC0gYWNmKG1vZGVsb1tbMV1dJHJlc2lkdWFsc14yLCBuYS5hY3Rpb24gPSBuYS5wYXNzLCBwbG90ID0gRkFMU0UsIGxhZy5tYXggPSAyMCkKcGxvdChhY2Zfc2FyaW1hX3NxdWFyZSwgbWFpbiA9ICIiLCB5bGFiID0gIiIsIHhsYWIgPSAiRGVmYXNhZ2VtIikKdGl0bGUoIkZBQyBkbyBxdWFkcmFkbyBkb3MgcmVzw61kdW9zIGRvIFNBUklNQSgwLDEsMSkoMCwxLDEpNCIsIGFkaiA9IDAuNSwgbGluZSA9IDEpCmBgYAoKUG9yIGZpbSwgYXZhbGlhbW9zIHNlIG9zIHJlc8OtZHVvcyBzw6NvIG5vcm1hbG1lbnRlIGRpc3RyaWJ1w61kb3MuIENvbW8gw6kgcG9zc8OtdmVsIG9ic2VydmFyIHBlbG9zIHJlc3VsdGFkb3MgZG9zIHRlc3RlcyBhYmFpeG8sIG7Do28gw6kgcG9zc8OtdmVsIGFmaXJtYXIgcXVlIG9zIHJlc8OtZHVvcyBzw6NvIG5vcm1hbG1lbnRlIGRpc3RyaWJ1w61kb3MuICAKCmBgYHtyLCBlY2hvPUZBTFNFLCByZXN1bHRzPSdhc2lzJ30KIyBUZXN0ZSBkZSBOb3JtYWxpZGFkZSBkb3MgcmVzw61kdW9zLiBBcyBoaXDDs3Rlc2VzIHBhcmEgb3MgZG9pcyB0ZXN0ZXMgc8OjbzoKIyAgLSBIMDogcmVzw61kdW9zIG5vcm1hbG1lbnRlIGRpc3RyaWJ1w61kb3MKIyAgLSBIMTogcmVzw61kdW9zIG7Do28gc8OjbyBub3JtYWxtZW50ZSBkaXN0cmlidcOtZG9zCnNoYXBpcm8udGVzdChuYS5yZW1vdmUobW9kZWxvW1sxXV0kcmVzaWR1YWxzKSkKamFycXVlLmJlcmEudGVzdChuYS5yZW1vdmUobW9kZWxvW1sxXV0kcmVzaWR1YWxzKSkKYGBgCgo4LiBGaW5hbG1lbnRlLCBmYXplbW9zIGFzIHByZXZpc8O1ZXMgKGxlbWJyYW5kbyBxdWUgZGV2ZXLDrWFtb3MgdHJhdGFyIGEgaGV0ZXJvY2VkYXN0aWNpZGFkZSBjb25kaWNpb25hbCk6CgpgYGB7ciwgZWNobz1GQUxTRSwgcmVzdWx0cz0nYXNpcycsIGZpZy53aWR0aD05fQojIFByZXZpc8OjbyBkbyB2YWxvciBtw6lkaW8gY29uZGljaW9uYWwgZXNwZXJhZG8gZSByZXNwZWN0aXZvIGRlc3ZpbwojIC0gb2JqZWN0OiBvIG1vZGVsbyBlc2NvbGhpZG8gYW50ZXJpb3JtZW50ZQojIC0gbGV2ZWw6IG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgKGFiYWl4bywgODAlKQojIC0gaDogbyBob3Jpem9udGUgZGUgcHJldmlzw6NvCiMgZm9yZWNhc3Q6OmZvcmVjYXN0KG9iamVjdCA9IG1vZGVsb1tbMV1dLCBoID0gNCwgbGV2ZWwgPSAwLjgwKQoKIyBncsOhZmljbyBkYSBwcmV2aXPDo28KcGxvdChmb3JlY2FzdDo6Zm9yZWNhc3Qob2JqZWN0ID0gbW9kZWxvW1sxXV0sIGggPSA0LCBsZXZlbCA9IDAuODApKQpgYGAKCiMjIyMjICoqUkVGRVLDik5DSUFTKio=