1) (3 pontos) Utilizando a base de dados QUARTERLY, estime o VAR com 3 defasagens de que trata o exercício 9 do livro do Enders na página 339 com o ordenamento ∆lip, ∆unemp e s (spread de juros).

Estimou-se um modelo VAR com 3 defasagens utilizando a base de dados QUARTERLY e o ordenamento das variáveis: - \(∆\)lip (variação no log da produção industrial), - \(∆\)unemp (variação no desemprego), e - \(s\) (spread de juros).

Estimando o modelo VAR

Selecionamos 3 defasagens conforme o enunciado e estimamos o modelo VAR.

var_model <- VAR(data, p = 3, type = "const")
summary(var_model)->modelsm
modelsm

VAR Estimation Results:
========================= 
Endogenous variables: dlip, dunemp, s 
Deterministic variables: const 
Sample size: 208 
Log Likelihood: 554.153 
Roots of the characteristic polynomial:
0.8005 0.7518 0.7518 0.5129 0.5129 0.4941 0.4941 0.3861 0.3861
Call:
VAR(y = data, p = 3, type = "const")


Estimation results for equation dlip: 
===================================== 
dlip = dlip.l1 + dunemp.l1 + s.l1 + dlip.l2 + dunemp.l2 + s.l2 + dlip.l3 + dunemp.l3 + s.l3 + const 

            Estimate Std. Error t value Pr(>|t|)    
dlip.l1    5.610e-01  1.013e-01   5.536 9.74e-08 ***
dunemp.l1 -6.289e-03  5.259e-03  -1.196    0.233    
s.l1      -1.071e-03  1.663e-03  -0.644    0.520    
dlip.l2   -8.249e-02  1.065e-01  -0.775    0.439    
dunemp.l2  7.212e-03  5.398e-03   1.336    0.183    
s.l2      -9.415e-04  2.391e-03  -0.394    0.694    
dlip.l3    1.919e-01  1.011e-01   1.899    0.059 .  
dunemp.l3  4.679e-03  4.790e-03   0.977    0.330    
s.l3       8.134e-05  1.699e-03   0.048    0.962    
const     -5.530e-04  1.897e-03  -0.292    0.771    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


Residual standard error: 0.01242 on 198 degrees of freedom
Multiple R-Squared: 0.4046, Adjusted R-squared: 0.3776 
F-statistic: 14.95 on 9 and 198 DF,  p-value: < 2.2e-16 


Estimation results for equation dunemp: 
======================================= 
dunemp = dlip.l1 + dunemp.l1 + s.l1 + dlip.l2 + dunemp.l2 + s.l2 + dlip.l3 + dunemp.l3 + s.l3 + const 

           Estimate Std. Error t value Pr(>|t|)    
dlip.l1   -7.372118   1.938976  -3.802 0.000191 ***
dunemp.l1  0.329196   0.100643   3.271 0.001264 ** 
s.l1       0.011522   0.031831   0.362 0.717763    
dlip.l2    0.295902   2.037186   0.145 0.884661    
dunemp.l2 -0.073243   0.103304  -0.709 0.479156    
s.l2       0.001648   0.045750   0.036 0.971300    
dlip.l3   -2.737375   1.934281  -1.415 0.158584    
dunemp.l3 -0.038370   0.091671  -0.419 0.675987    
s.l3       0.050335   0.032512   1.548 0.123167    
const      0.168639   0.036292   4.647 6.14e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


Residual standard error: 0.2377 on 198 degrees of freedom
Multiple R-Squared: 0.5219, Adjusted R-squared: 0.5002 
F-statistic: 24.02 on 9 and 198 DF,  p-value: < 2.2e-16 


Estimation results for equation s: 
================================== 
s = dlip.l1 + dunemp.l1 + s.l1 + dlip.l2 + dunemp.l2 + s.l2 + dlip.l3 + dunemp.l3 + s.l3 + const 

          Estimate Std. Error t value Pr(>|t|)    
dlip.l1    3.06994    4.29574   0.715  0.47567    
dunemp.l1 -0.37053    0.22297  -1.662  0.09814 .  
s.l1       1.06119    0.07052  15.048  < 2e-16 ***
dlip.l2    0.45851    4.51333   0.102  0.91918    
dunemp.l2  0.39479    0.22887   1.725  0.08609 .  
s.l2      -0.31763    0.10136  -3.134  0.00199 ** 
dlip.l3    3.28676    4.28534   0.767  0.44401    
dunemp.l3 -0.27995    0.20309  -1.378  0.16963    
s.l3       0.14334    0.07203   1.990  0.04797 *  
const     -0.21507    0.08040  -2.675  0.00810 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


Residual standard error: 0.5267 on 198 degrees of freedom
Multiple R-Squared: 0.8254, Adjusted R-squared: 0.8175 
F-statistic:   104 on 9 and 198 DF,  p-value: < 2.2e-16 



Covariance matrix of residuals:
             dlip    dunemp         s
dlip    0.0001543 -0.002119  0.001198
dunemp -0.0021188  0.056517 -0.022737
s       0.0011976 -0.022737  0.277405

Correlation matrix of residuals:
          dlip  dunemp       s
dlip    1.0000 -0.7174  0.1830
dunemp -0.7174  1.0000 -0.1816
s       0.1830 -0.1816  1.0000
modelsm$roots
[1] 0.8005093 0.7518345 0.7518345 0.5128831 0.5128831 0.4940832 0.4940832 0.3860852 0.3860852
modelsm$covres
                dlip       dunemp            s
dlip    0.0001543404 -0.002118807  0.001197639
dunemp -0.0021188066  0.056517451 -0.022737300
s       0.0011976390 -0.022737300  0.277405171

O modelo VAR estimado inclui as variáveis Δlip (variação no log da produção industrial), Δunemp (variação no desemprego) e s (spread de juros), com três defasagens. A análise dos coeficientes sugere algumas relações significativas. No caso de Δlip, a defasagem da própria variável (Δlip.l1) tem um impacto estatisticamente significativo e positivo, indicando que a produção industrial responde positivamente a seus próprios valores defasados. No entanto, as outras variáveis não apresentam significância estatística para explicar Δlip. Para Δunemp, Δlip.l1 tem um impacto negativo e significativo, indicando que aumentos na produção industrial reduzem o desemprego, conforme esperado. No caso de s, a variável s.l1 é altamente significativa e reflete persistência no spread de juros ao longo do tempo. As interrelações entre as variáveis são capturadas na matriz de covariância dos resíduos, que mostra uma correlação negativa forte entre Δlip e Δunemp (\(-0.7174\)), corroborando a relação esperada entre produção industrial e desemprego. A magnitude dos \(R^2\) ajustados sugere que o modelo explica bem as variações em s (81.75%), Δunemp (50.02%) e moderadamente Δlip (37.76%). Esses resultados indicam que o modelo VAR é adequado para capturar as interações dinâmicas entre as variáveis analisadas.

a)Verifique se s (spread de juros) Granger causa ∆lip.

causality(var_model, cause = "s")$Granger

    Granger causality H0: s do not Granger-cause dlip dunemp

data:  VAR object var_model
F-Test = 3.6948, df1 = 6, df2 = 594, p-value = 0.001295

A análise do teste de causalidade de Granger revelou o spread de juros (𝑠) causa Granger as variáveis Δlip e Δunemp O teste de causalidade de Granger indica que s fornece informações úteis para prever tanto Δlip quanto Δunemp. No caso de Δlip, rejeitamos a hipótese nula de que s não causa Granger a variável, com um valor F=3.6948 e p=0.001295.

b)Verifique se s (spread de juros) Granger causa ∆unemp.

grangertest(dunemp~s,order=3,data) ->test

test_s<-causality(var_model, cause = "s")
test_s$Granger

    Granger causality H0: s do not Granger-cause dlip dunemp

data:  VAR object var_model
F-Test = 3.6948, df1 = 6, df2 = 594, p-value = 0.001295

Da mesma forma, o teste demonstra que s causa Granger Δunemp, implicando que mudanças no spread de juros têm impacto dinâmico sobre o desemprego.

####c)Analise a decomposição da variância desse VAR.

fevd_results <- fevd(var_model, n.ahead = 10)
fevd_results 

A decomposição da variância complementa esses resultados ao mostrar como a variância de cada variável é explicada ao longo do tempo. Inicialmente, Δlip é quase completamente explicada por si mesma (100% no período 1), mas ao longo do tempo, uma pequena parcela da variância é atribuída a s, chegando a 5,8% no período 10. Isso sugere que, embora o spread de juros tenha um impacto limitado sobre a produção industrial no longo prazo, ele não é desprezível. Para Δunemp, o spread de juros desempenha um papel crescente ao longo do tempo, explicando 13,18% da variância no período 10, indicando que a influência de s sobre o desemprego se intensifica no longo prazo. Já para s, sua própria variância é explicada principalmente por si mesma, embora a contribuição de Δlip cresça gradualmente, chegando a 30,13% no período 10.

d)Analise as funções de impulso resposta.

#library(patchwork)

# Analisar funções de impulso-resposta
irf(var_model, impulse = "s", response = c("s"), boot = TRUE) %>% plot()
irf(var_model, impulse = "s", response = c("dlip"), boot = TRUE) %>% plot()
irf(var_model, impulse = "s", response = c("dunemp"), boot = TRUE) %>% plot()
irf(var_model, impulse = "dlip", response = c("s"), boot = TRUE) %>% plot()
irf(var_model, impulse = "dlip", response = c("dlip"), boot = TRUE) %>% plot()
irf(var_model, impulse = "dlip", response = c("dunemp"), boot = TRUE) %>% plot()
irf(var_model, impulse = "dunemp", response = c("s"), boot = TRUE) %>% plot()
irf(var_model, impulse = "dunemp", response = c("dlip"), boot = TRUE) %>% plot()
irf(var_model, impulse = "dunemp", response = c("dunemp"), boot = TRUE) %>% plot()

As funções de impulso-resposta (IRF) oferecem uma visão adicional sobre os efeitos de choques entre as variaveis. Para os impulsos em s, observamos um um efeito significativo até o 7 lag nele mesmo, já a resposta da Δlip começar é significativamente negativa para o 5º a7 lag, enquanto a resposta da Δunemp é positiva entre 3 lag, e tem um feito persistente para além do 10º periodo. Para os impulsos em Δlip, observamos um um efeito positivo significativo e persistente como resposta de S, nele mesmoo o choque perde efito a partir do 3º periodo, e a resposta de Δunemp é negativa para os 4º primeiros periodos e significativamente positiva no longo prazo.

Finalmente, Para os impulsos em Δunemp, observamos um um efeito não significativo como resposta de S e Δlip, e nele mesmo o choque perde efeito a partir do 3º periodo.

2) (2,5 pontos). O arquivo “Importações” possui dados do volume de importações (M), do PIB no Brasil (Y) e da taxa de câmbio real efetiva (q). Estime a função importação (em logs) por meio de técnicas uniequacionais de cointegração. Existe relação de cointegração entre as variáveis? As elasticidades são as esperadas?

library(readxl)
Import <- read_excel("Importações.xlsx")
New names:
Import$log_M <- log(Import$M)   # Log do volume de importações
Import$log_Y <- log(Import$Y)   # Log do PIB
Import$log_q <- log(Import$Q)   # Log da taxa de câmbio real
Import %>% ts(frequency = 4, start = 1996)->ts_imp
ts_imp %>% plot()

Antes de aplicar técnicas de cointegração, precisamos verificar se as séries são não estacionárias

# Teste ADF para as variáveis
adf.test(Import$log_M)
Augmented Dickey-Fuller Test 
alternative: stationary 
 
Type 1: no drift no trend 
     lag  ADF p.value
[1,]   0 1.85   0.983
[2,]   1 1.41   0.959
[3,]   2 1.34   0.954
[4,]   3 1.32   0.952
[5,]   4 1.42   0.959
Type 2: with drift no trend 
     lag    ADF p.value
[1,]   0 -1.199   0.627
[2,]   1 -1.041   0.682
[3,]   2 -0.918   0.725
[4,]   3 -0.701   0.801
[5,]   4 -0.715   0.797
Type 3: with drift and trend 
     lag   ADF p.value
[1,]   0 -1.63   0.729
[2,]   1 -1.91   0.611
[3,]   2 -1.90   0.616
[4,]   3 -1.83   0.644
[5,]   4 -1.69   0.703
---- 
Note: in fact, p.value = 0.01 means p.value <= 0.01 
adf.test(Import$log_Y)
Augmented Dickey-Fuller Test 
alternative: stationary 
 
Type 1: no drift no trend 
     lag  ADF p.value
[1,]   0 3.68    0.99
[2,]   1 3.20    0.99
[3,]   2 3.40    0.99
[4,]   3 3.15    0.99
[5,]   4 3.00    0.99
Type 2: with drift no trend 
     lag   ADF p.value
[1,]   0 -1.38   0.562
[2,]   1 -1.28   0.597
[3,]   2 -1.09   0.666
[4,]   3 -1.22   0.619
[5,]   4 -1.14   0.647
Type 3: with drift and trend 
     lag   ADF p.value
[1,]   0 -1.35   0.847
[2,]   1 -1.40   0.825
[3,]   2 -1.09   0.920
[4,]   3 -1.16   0.909
[5,]   4 -1.10   0.918
---- 
Note: in fact, p.value = 0.01 means p.value <= 0.01 
adf.test(Import$log_q)
Augmented Dickey-Fuller Test 
alternative: stationary 
 
Type 1: no drift no trend 
     lag   ADF p.value
[1,]   0 0.648   0.828
[2,]   1 0.512   0.789
[3,]   2 0.585   0.810
[4,]   3 0.650   0.829
[5,]   4 0.761   0.861
Type 2: with drift no trend 
     lag   ADF p.value
[1,]   0 -1.95   0.348
[2,]   1 -2.40   0.172
[3,]   2 -2.23   0.241
[4,]   3 -2.10   0.291
[5,]   4 -2.10   0.291
Type 3: with drift and trend 
     lag   ADF p.value
[1,]   0 -1.94   0.596
[2,]   1 -2.46   0.383
[3,]   2 -2.24   0.472
[4,]   3 -2.08   0.540
[5,]   4 -2.02   0.564
---- 
Note: in fact, p.value = 0.01 means p.value <= 0.01 

Os resultados do teste Augmented Dickey-Fuller (ADF) indicam que todas as variáveis em nível não são estacionárias. então tem-se que verificar se elas são em 1ª difereça

adf.test(Import$log_M %>% diff)
Augmented Dickey-Fuller Test 
alternative: stationary 
 
Type 1: no drift no trend 
     lag   ADF p.value
[1,]   0 -8.67    0.01
[2,]   1 -6.63    0.01
[3,]   2 -5.94    0.01
[4,]   3 -5.31    0.01
[5,]   4 -4.47    0.01
Type 2: with drift no trend 
     lag   ADF p.value
[1,]   0 -8.85    0.01
[2,]   1 -6.81    0.01
[3,]   2 -6.12    0.01
[4,]   3 -5.54    0.01
[5,]   4 -4.68    0.01
Type 3: with drift and trend 
     lag   ADF p.value
[1,]   0 -8.80    0.01
[2,]   1 -6.76    0.01
[3,]   2 -6.06    0.01
[4,]   3 -5.50    0.01
[5,]   4 -4.62    0.01
---- 
Note: in fact, p.value = 0.01 means p.value <= 0.01 
adf.test(Import$log_Y %>% diff)
Augmented Dickey-Fuller Test 
alternative: stationary 
 
Type 1: no drift no trend 
     lag   ADF p.value
[1,]   0 -8.96    0.01
[2,]   1 -7.25    0.01
[3,]   2 -5.14    0.01
[4,]   3 -4.31    0.01
[5,]   4 -3.35    0.01
Type 2: with drift no trend 
     lag   ADF p.value
[1,]   0 -9.90    0.01
[2,]   1 -8.36    0.01
[3,]   2 -6.24    0.01
[4,]   3 -5.42    0.01
[5,]   4 -4.36    0.01
Type 3: with drift and trend 
     lag   ADF p.value
[1,]   0 -9.92    0.01
[2,]   1 -8.36    0.01
[3,]   2 -6.30    0.01
[4,]   3 -5.46    0.01
[5,]   4 -4.41    0.01
---- 
Note: in fact, p.value = 0.01 means p.value <= 0.01 
adf.test(Import$log_q %>% diff)
Augmented Dickey-Fuller Test 
alternative: stationary 
 
Type 1: no drift no trend 
     lag   ADF p.value
[1,]   0 -8.33    0.01
[2,]   1 -7.29    0.01
[3,]   2 -6.55    0.01
[4,]   3 -5.98    0.01
[5,]   4 -4.57    0.01
Type 2: with drift no trend 
     lag   ADF p.value
[1,]   0 -8.33    0.01
[2,]   1 -7.30    0.01
[3,]   2 -6.57    0.01
[4,]   3 -6.04    0.01
[5,]   4 -4.62    0.01
Type 3: with drift and trend 
     lag   ADF p.value
[1,]   0 -8.30    0.01
[2,]   1 -7.28    0.01
[3,]   2 -6.56    0.01
[4,]   3 -6.04    0.01
[5,]   4 -4.64    0.01
---- 
Note: in fact, p.value = 0.01 means p.value <= 0.01 

Vemos aqui que em 1º diferença todas as variaveis são estacionárias. portanto, há condições para elas serem cointegradas.

teste de Engle-Granger

Pontanto agora vamos estimar a relação de longo prazo das variaveis, e fazer teste de Engle-Granger para verificar se os resíduos do modelo de regressão são estacionários. no teste é estimado a regressão linear entre as variaveis e seu resíduo é testado quanto à estacionariedade. Os teste foi performado em 4 lags dado a escala temporal dos dados.

library(aTSA)
X_imp<-Import[,6:7] %>% as.matrix()
coint.test(y = Import$log_M,X = X_imp,nlag = 4)
Response: Import$log_M 
Input: X_imp 
Number of inputs: 2 
Model: y ~ X + 1 
------------------------------- 
Engle-Granger Cointegration Test 
alternative: cointegrated 

Type 1: no trend 
    lag      EG p.value 
   4.00   -2.66    0.10 
----- 
 Type 2: linear trend 
    lag      EG p.value 
  4.000   0.173   0.100 
----- 
 Type 3: quadratic trend 
    lag      EG p.value 
    4.0    -1.1     0.1 
----------- 
Note: p.value = 0.01 means p.value <= 0.01 
    : p.value = 0.10 means p.value >= 0.10 

Pelo teste de Engle Granger rejeitamos a hipotese nula de não cointegração. Isso indica a existência de uma relação de cointegração entre as variaveis.

Agora vamos estimar um Modelo de Correção de Erro (ECM) para capturar as dinâmicas de curto prazo ajustadas pela relação de longo prazo.

Testando a cointegração pelo metodo de Johansen
vec_model <- ca.jo(Import[,5:7], type = "trace", ecdet = "const",K = 4)
vec_model %>% summary()

###################### 
# Johansen-Procedure # 
###################### 

Test type: trace statistic , without linear trend and constant in cointegration 

Eigenvalues (lambda):
[1] 2.089758e-01 1.032476e-01 5.527395e-02 2.715327e-16

Values of teststatistic and critical values of test:

          test 10pct  5pct  1pct
r <= 2 |  6.25  7.52  9.24 12.97
r <= 1 | 18.24 17.85 19.96 24.60
r = 0  | 44.03 32.00 34.91 41.07

Eigenvectors, normalised to first column:
(These are the cointegration relations)

           log_M.l4  log_Y.l4  log_q.l4   constant
log_M.l4  1.0000000  1.000000  1.000000  1.0000000
log_Y.l4 -2.3349911 -1.964137 -2.310461  0.1289107
log_q.l4  0.3914955  0.296525  1.597002  0.5449159
constant  4.7623184  3.163679 -1.124304 -8.1976233

Weights W:
(This is the loading matrix)

           log_M.l4    log_Y.l4     log_q.l4      constant
log_M.d -0.02534055 -0.19646815 -0.014572363  8.370696e-15
log_Y.d  0.03520288 -0.05693835  0.001588987 -2.935783e-16
log_q.d  0.07446135  0.17817399 -0.046961572 -1.198650e-14

vamos acora criar o modelo de correção de erros pelo metodo de

ecm_model <- cajorls(vec_model, r = 1)  # Assumindo uma relação de cointegração
ecm_model
$rlm

Call:
lm(formula = substitute(form1), data = data.mat)

Coefficients:
           log_M.d    log_Y.d    log_q.d  
ect1      -0.025341  0.035203  0.074461
log_M.dl1 -0.250525  0.054133 -0.150494
log_Y.dl1  2.073846 -0.014690 -0.306959
log_q.dl1 -0.164288 -0.017963  0.201061
log_M.dl2 -0.049048  0.057300  0.187856
log_Y.dl2  0.441862 -0.320574  0.095033
log_q.dl2 -0.121669 -0.010021 -0.110020
log_M.dl3 -0.014868  0.008783 -0.014206
log_Y.dl3 -0.218596 -0.095263 -0.665061
log_q.dl3  0.028887 -0.003810 -0.141237


$beta
               ect1
log_M.l4  1.0000000
log_Y.l4 -2.3349911
log_q.l4  0.3914955
constant  4.7623184
roots(var_model)
[1] 0.8005093 0.7518345 0.7518345 0.5128831 0.5128831 0.4940832 0.4940832 0.3860852 0.3860852

O sistema é estável, pois todas as raízes do modelo estão dentro do círculo unitário (todas as raiz menores que 1), indicando que as dinâmicas entre as variáveis convergem ao longo do tempo para o equilíbrio de longo prazo.

Os resultados do modelo indicam que existe uma relação de cointegração entre as variáveis, conforme evidenciado pela significância do termo de correção de erro (ect1=−0.0253). O coeficiente negativo e significativo sugere que cerca de 2,53% dos desvios em relação ao equilíbrio de longo prazo são corrigidos a cada período, indicando um ajuste lento, mas consistente, em direção à relação de equilíbrio.

estimando var da cointegração2
library(cointReg)
cointReg(y = Import$log_M,x =X_imp,n.lag = 4,demeaning=T) ->ECM
ECM 

### FM-OLS model ###

Model:      y ~ x

Parameters: Kernel = "ba"  //  Bandwidth = 20.7751 ("Andrews")

Coefficients:
      Estimate  Std.Err t value Pr(|t|>0)    
log_Y  1.65778  0.12311 13.4657 < 2.2e-16 ***
log_q -0.63848  0.13245 -4.8206 4.536e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
ECM$varmat
            log_Y       log_q
log_Y  0.01515653 -0.01628028
log_q -0.01628028  0.01754266

Assim, pode-se dizer que existe uma relação de cointegração entre as variáveis, confirmada pela estimação do modelo FM-OLS, que ajusta uma relação de longo prazo robusta entre volume de importações, PIB e taxa de câmbio real. As elasticidades são consistentes com a teoria econômica: a elasticidade-renda (1.66) é positiva e maior que 1, indicando que as importações crescem mais do que proporcionalmente ao PIB, enquanto a elasticidade-câmbio (−0.64) é negativa, refletindo que uma desvalorização cambial reduz o volume de importações ao aumentar os preços dos bens importados.

3)(2 pontos). O arquivo “câmbio” possui duas variáveis: a taxa de câmbio nominal (e) e a taxa de câmbio real (q) para o Brasil. Estime um modelo VAR (em logs) e aplique a identificação de longo prazo assumindo que a taxa nominal não possui efeito permanente sobre a taxa real. A partir daí, analise a função de impulso resposta, a decomposição da variância e o comportamento dos choques estruturais. Como se comportam os choques reais e nominais do câmbio durante a pandemia iniciada em março de 2020?

library(readxl)
cambio <- read_excel("câmbio.xlsx", col_types = c("date", 
    "numeric", "numeric"))
Warning: Expecting numeric in C299 / R299C3: got '-'Warning: Expecting date in A300 / R300C1: got 'Fonte'Warning: Expecting numeric in B300 / R300C2: got 'Sisbacen PTAX800'Warning: Expecting numeric in C300 / R300C3: got 'BCB-DSTAT'
cambio$log_e <- log(cambio$`3695 - Taxa de câmbio - Livre - Dólar americano (compra) - Fim de período - mensal - u.m.c./US$`)  # Log da taxa de câmbio nominal
cambio$log_q <- log(cambio$`11752 - Índice da taxa de câmbio real efetiva (IPCA) - Jun/1994=100 - Índice`)  # Log da taxa de câmbio real
cambio %>% drop_na()->cambio
drop_na: removed 2 rows (1%), 297 rows remaining
cambio%>% ts(start =c(2000,2),freq=12 ) %>% plot

Antes de estimar os vars, é preciso averiguar a estacionáridade das series


 # Verificar a estacionaridade das variáveis
adf.test(cambio$log_e)
Augmented Dickey-Fuller Test 
alternative: stationary 
 
Type 1: no drift no trend 
     lag   ADF p.value
[1,]   0 0.996   0.914
[2,]   1 1.046   0.920
[3,]   2 0.768   0.865
[4,]   3 0.708   0.848
[5,]   4 0.725   0.852
[6,]   5 0.723   0.852
Type 2: with drift no trend 
     lag    ADF p.value
[1,]   0 -0.722   0.795
[2,]   1 -0.719   0.796
[3,]   2 -0.991   0.701
[4,]   3 -0.976   0.706
[5,]   4 -0.932   0.721
[6,]   5 -0.976   0.706
Type 3: with drift and trend 
     lag   ADF p.value
[1,]   0 -1.44   0.812
[2,]   1 -1.40   0.829
[3,]   2 -1.67   0.716
[4,]   3 -1.71   0.700
[5,]   4 -1.67   0.713
[6,]   5 -1.69   0.709
---- 
Note: in fact, p.value = 0.01 means p.value <= 0.01 
adf.test(cambio$log_q)
Augmented Dickey-Fuller Test 
alternative: stationary 
 
Type 1: no drift no trend 
     lag   ADF p.value
[1,]   0 0.419   0.765
[2,]   1 0.314   0.734
[3,]   2 0.336   0.740
[4,]   3 0.308   0.732
[5,]   4 0.287   0.727
[6,]   5 0.268   0.721
Type 2: with drift no trend 
     lag   ADF p.value
[1,]   0 -1.31   0.590
[2,]   1 -1.93   0.354
[3,]   2 -1.95   0.346
[4,]   3 -1.97   0.338
[5,]   4 -1.95   0.348
[6,]   5 -2.03   0.315
Type 3: with drift and trend 
     lag   ADF p.value
[1,]   0 -1.41   0.827
[2,]   1 -2.00   0.576
[3,]   2 -2.01   0.570
[4,]   3 -2.04   0.560
[5,]   4 -2.02   0.568
[6,]   5 -2.11   0.532
---- 
Note: in fact, p.value = 0.01 means p.value <= 0.01 

Ambos os resultados indicam que as séries não são estacionárias, permitindo o uso do modelo VAR. Para o modelo VAR optou-se por incluir tendencia e constante induzidas pela analise gráfica e duas defasagens foram selecionadas para eliminar autocorrelação nos resíduos, sem comprometer a significância das defasagens. A identificação estrutural de longo prazo assumiu que choques na taxa nominal não afetam permanentemente a taxa real.

var_data <- cambio[, c("log_e", "log_q")]
var_model <- VAR(var_data, p = 2, type = "both")
summary(var_model)

VAR Estimation Results:
========================= 
Endogenous variables: log_e, log_q 
Deterministic variables: both 
Sample size: 295 
Log Likelihood: 1239.466 
Roots of the characteristic polynomial:
0.985 0.8985 0.5176 0.3242
Call:
VAR(y = var_data, p = 2, type = "both")


Estimation results for equation log_e: 
====================================== 
log_e = log_e.l1 + log_q.l1 + log_e.l2 + log_q.l2 + const + trend 

           Estimate Std. Error t value Pr(>|t|)    
log_e.l1  0.8175465  0.0752667  10.862  < 2e-16 ***
log_q.l1  0.3252088  0.1079891   3.011  0.00283 ** 
log_e.l2  0.2388857  0.0789511   3.026  0.00270 ** 
log_q.l2 -0.4285234  0.1033389  -4.147 4.44e-05 ***
const     0.4468552  0.2910693   1.535  0.12582    
trend    -0.0001306  0.0001371  -0.952  0.34173    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


Residual standard error: 0.04713 on 289 degrees of freedom
Multiple R-Squared: 0.9855, Adjusted R-squared: 0.9853 
F-statistic:  3939 on 5 and 289 DF,  p-value: < 2.2e-16 


Estimation results for equation log_q: 
====================================== 
log_q = log_e.l1 + log_q.l1 + log_e.l2 + log_q.l2 + const + trend 

           Estimate Std. Error t value Pr(>|t|)    
log_e.l1  4.311e-01  4.743e-02   9.088  < 2e-16 ***
log_q.l1  8.726e-01  6.805e-02  12.822  < 2e-16 ***
log_e.l2 -3.362e-01  4.975e-02  -6.756 7.79e-11 ***
log_q.l2 -1.868e-02  6.512e-02  -0.287 0.774469    
const     6.187e-01  1.834e-01   3.373 0.000846 ***
trend    -2.442e-04  8.641e-05  -2.826 0.005040 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


Residual standard error: 0.0297 on 289 degrees of freedom
Multiple R-Squared: 0.9784, Adjusted R-squared: 0.9781 
F-statistic:  2624 on 5 and 289 DF,  p-value: < 2.2e-16 



Covariance matrix of residuals:
         log_e    log_q
log_e 0.002221 0.001076
log_q 0.001076 0.000882

Correlation matrix of residuals:
       log_e  log_q
log_e 1.0000 0.7689
log_q 0.7689 1.0000
amat <- diag(2) # Matriz de identificação estrutural
amat[2, 1] <- NA # Restrição: taxa nominal não tem efeito permanente na real,
amat
     [,1] [,2]
[1,]    1    0
[2,]   NA    1
svar_model <- SVAR(var_model, Amat = amat)
Warning: Convergence not achieved after 100 iterations. Convergence value: 0.00104177804634711 .
svar_model

SVAR Estimation Results:
======================== 


Estimated A matrix:
        log_e log_q
log_e  1.0000     0
log_q -0.0155     1

As duas equações mostram que ambas as taxas log_e e log_q são interdependentes e influenciadas tanto pelos seus próprios valores defasados quanto pelas interações cruzadas. O modelo captura as dinâmicas de curto prazo entre as variáveis. A identificação estrutural impôs a restrição de que choques na taxa nominal não afetam permanentemente a taxa real.


irf_resultseq <- irf(svar_model, impulse = "log_e", response = "log_q",
                   n.ahead = 12, boot = TRUE)
irf_resultsqe <- irf(svar_model, impulse = "log_q", response = "log_e",
                   n.ahead = 12, boot = TRUE)
#cbind(irf_resultseq$irf$log_e,irf_resultseq$Lower$log_e,irf_resultseq$Upper$log_e) 
irf_resultseq %>% plot

#cbind(irf_resultsqe$irf$log_q,irf_resultsqe$Lower$log_q,irf_resultsqe$Upper$log_q)
irf_resultsqe %>% plot

A função de impulso-resposta (IRF) mostra que choques na taxa nominal têm efeitos temporários na taxa real, enquanto choques na taxa real apresentam efeitos mais duradouros. Isso corrobora a restrição de longo prazo imposta ao modelo.

#structural_shocks <- residuals(svar_model$var) 
structural_shocks %>%  ts(start = c(2000,1),frequency = 12) %>% 
    window(c(2019,8),c(2021,1)) %>%autoplot()

#structural_shocks %>% as.data.frame() %>% select(log_e,log_q) %>%
#  ts(start = c(2000,1),frequency = 12)%>%
#  window(c(2018,1),c(2022,12)) %>%
#  ggplot(aes)
##structural_shocks %>% as.data.frame() %>% select(log_q) %>%
#  ts(start = c(2000,1),frequency = 12) %>% window(c(2018,1),c(2022,12))%>% ts.plot()

Os choques estruturais mostram que, durante a pandemia de 2020, houve uma alta volatilidade nos choques nominais, especialmente entre março e Maio de 2020. Por outro lado, os choques reais apresentaram menor volatilidade, mas ainda assim foram significativamente afetados, recebendo um choque grande em abril, refletindo ajustes estruturais na economia.

# Decomposição da variância
fevd_results <- fevd(svar_model, n.ahead = 10)
fevd_results
$log_e
          log_e      log_q
 [1,] 1.0000000 0.00000000
 [2,] 0.9406641 0.05933589
 [3,] 0.9584455 0.04155445
 [4,] 0.9670308 0.03296919
 [5,] 0.9739441 0.02605592
 [6,] 0.9761323 0.02386771
 [7,] 0.9734024 0.02659759
 [8,] 0.9673517 0.03264827
 [9,] 0.9584906 0.04150936
[10,] 0.9479282 0.05207183

$log_q
             log_e     log_q
 [1,] 0.0002400602 0.9997599
 [2,] 0.1010045120 0.8989955
 [3,] 0.1249425317 0.8750575
 [4,] 0.1734425600 0.8265574
 [5,] 0.2124015232 0.7875985
 [6,] 0.2566652192 0.7433348
 [7,] 0.2990882429 0.7009118
 [8,] 0.3416794500 0.6583206
 [9,] 0.3821972773 0.6178027
[10,] 0.4204140793 0.5795859

A decomposição da variância indica que a taxa nominal (log_e) e a taxa real (log_q) são predominantemente explicada por seus próprios choques no curto prazo, porém a taxa real (log_q) sobre maior influencia no longo prazo pela taxa nominal.

4) (2,5 pontos). Essa questão é baseada no artigo de Stock e Watson (1993). Utilize o arquivo mpyr_cointegração que permite estimar um modelo de cointegração para a demanda por moeda. Faça os seguintes exercícios:

library(readxl)
mpyr_data <- read_excel("MPRY_cointegração.xlsx")
New names:
# Criar a variável m-p (diferença entre log(M1) e log(preços))
plot(mpyr_data %>% ts)

mpyr_data$mp <- mpyr_data$LM1 - mpyr_data$LP

a) Aplique o teste ADF com 2 e 4 lags. Verifique que a hipótese nula não é rejeitada para as variáveis m-p (a ser calculada como a diferença entre o log do M1 e o log dos preços), R e log de y.

adf_mp_2lags <- ur.df(mpyr_data$mp, type = "none", lags = 2)
adf_mp_4lags <- ur.df(mpyr_data$mp, type = "none", lags = 4)

adf_log_y_2lags <- ur.df(mpyr_data$LY, type = "none", lags = 2)
adf_log_y_4lags <- ur.df(mpyr_data$LY, type = "none", lags = 4)

adf_R_2lags <- ur.df(mpyr_data$R, type = "none", lags = 2)
adf_R_4lags <- ur.df(mpyr_data$R, type = "none", lags = 4)

# Exibir os resultados do ADF
summary(adf_mp_2lags)

############################################### 
# Augmented Dickey-Fuller Test Unit Root Test # 
############################################### 

Test regression none 


Call:
lm(formula = z.diff ~ z.lag.1 - 1 + z.diff.lag)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.185285 -0.015641  0.002605  0.028442  0.152228 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)   
z.lag.1      0.006641   0.005146   1.291  0.20038   
z.diff.lag1  0.359840   0.110585   3.254  0.00164 **
z.diff.lag2 -0.009151   0.107012  -0.086  0.93206   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.05376 on 84 degrees of freedom
Multiple R-squared:  0.1747,    Adjusted R-squared:  0.1452 
F-statistic: 5.927 on 3 and 84 DF,  p-value: 0.001021


Value of test-statistic is: 1.2906 

Critical values for test statistics: 
     1pct  5pct 10pct
tau1 -2.6 -1.95 -1.61
summary(adf_mp_4lags)

############################################### 
# Augmented Dickey-Fuller Test Unit Root Test # 
############################################### 

Test regression none 


Call:
lm(formula = z.diff ~ z.lag.1 - 1 + z.diff.lag)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.167341 -0.021045  0.001341  0.021794  0.133672 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)   
z.lag.1      0.003069   0.005033   0.610  0.54369   
z.diff.lag1  0.355614   0.113374   3.137  0.00239 **
z.diff.lag2 -0.154548   0.112089  -1.379  0.17180   
z.diff.lag3  0.379156   0.112533   3.369  0.00116 **
z.diff.lag4  0.027303   0.111358   0.245  0.80694   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.05082 on 80 degrees of freedom
Multiple R-squared:  0.2923,    Adjusted R-squared:  0.2481 
F-statistic: 6.609 on 5 and 80 DF,  p-value: 3.384e-05


Value of test-statistic is: 0.6098 

Critical values for test statistics: 
     1pct  5pct 10pct
tau1 -2.6 -1.95 -1.61
summary(adf_log_y_2lags)

############################################### 
# Augmented Dickey-Fuller Test Unit Root Test # 
############################################### 

Test regression none 


Call:
lm(formula = z.diff ~ z.lag.1 - 1 + z.diff.lag)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.203874 -0.027691  0.002593  0.040023  0.151014 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)   
z.lag.1      0.009616   0.003198   3.007  0.00348 **
z.diff.lag1  0.282793   0.108960   2.595  0.01115 * 
z.diff.lag2 -0.129319   0.107757  -1.200  0.23347   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.06152 on 84 degrees of freedom
Multiple R-squared:  0.2256,    Adjusted R-squared:  0.1979 
F-statistic: 8.156 on 3 and 84 DF,  p-value: 7.907e-05


Value of test-statistic is: 3.0073 

Critical values for test statistics: 
     1pct  5pct 10pct
tau1 -2.6 -1.95 -1.61
summary(adf_log_y_4lags)

############################################### 
# Augmented Dickey-Fuller Test Unit Root Test # 
############################################### 

Test regression none 


Call:
lm(formula = z.diff ~ z.lag.1 - 1 + z.diff.lag)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.209925 -0.029029  0.005306  0.040224  0.160647 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)   
z.lag.1      0.012162   0.003618   3.361  0.00119 **
z.diff.lag1  0.275216   0.110920   2.481  0.01519 * 
z.diff.lag2 -0.159382   0.114471  -1.392  0.16768   
z.diff.lag3  0.005431   0.114135   0.048  0.96216   
z.diff.lag4 -0.178884   0.108884  -1.643  0.10433   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.0615 on 80 degrees of freedom
Multiple R-squared:  0.2584,    Adjusted R-squared:  0.212 
F-statistic: 5.575 on 5 and 80 DF,  p-value: 0.0001861


Value of test-statistic is: 3.3613 

Critical values for test statistics: 
     1pct  5pct 10pct
tau1 -2.6 -1.95 -1.61
summary(adf_R_2lags)

############################################### 
# Augmented Dickey-Fuller Test Unit Root Test # 
############################################### 

Test regression none 


Call:
lm(formula = z.diff ~ z.lag.1 - 1 + z.diff.lag)

Residuals:
     Min       1Q   Median       3Q      Max 
-3.10452 -0.55130  0.07705  0.60051  3.03308 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
z.lag.1     -0.008074   0.023843  -0.339 0.735737    
z.diff.lag1  0.156345   0.102317   1.528 0.130257    
z.diff.lag2 -0.366480   0.102834  -3.564 0.000606 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.165 on 84 degrees of freedom
Multiple R-squared:  0.1492,    Adjusted R-squared:  0.1188 
F-statistic:  4.91 on 3 and 84 DF,  p-value: 0.003422


Value of test-statistic is: -0.3386 

Critical values for test statistics: 
     1pct  5pct 10pct
tau1 -2.6 -1.95 -1.61
summary(adf_R_4lags)

############################################### 
# Augmented Dickey-Fuller Test Unit Root Test # 
############################################### 

Test regression none 


Call:
lm(formula = z.diff ~ z.lag.1 - 1 + z.diff.lag)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.71368 -0.48680  0.06395  0.69372  2.97532 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
z.lag.1     -0.002471   0.024422  -0.101 0.919670    
z.diff.lag1  0.195467   0.110961   1.762 0.081960 .  
z.diff.lag2 -0.447490   0.112593  -3.974 0.000154 ***
z.diff.lag3  0.102078   0.111749   0.913 0.363747    
z.diff.lag4 -0.194967   0.112129  -1.739 0.085923 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.162 on 80 degrees of freedom
Multiple R-squared:  0.1823,    Adjusted R-squared:  0.1312 
F-statistic: 3.568 on 5 and 80 DF,  p-value: 0.005791


Value of test-statistic is: -0.1012 

Critical values for test statistics: 
     1pct  5pct 10pct
tau1 -2.6 -1.95 -1.61

Para todas as variáveis analisadas. o teste ADF não rejeita a hipótese nula de raiz unitária em ambos os casos (com 2 e 4 lags). Isso confirma que as séries não são estacionárias em nível.

b) Conduza um teste de Engle Granger para avaliar a cointegração entre m-p (sempre em log) com logs de y e R (sem log). O que é possível concluir a respeito da relação entre as variáveis?

XX<-mpyr_data[,4:5] %>% as.matrix()
coint.test(y = mpyr_data$mp,X = XX,nlag = 4)
Response: mpyr_data$mp 
Input: XX 
Number of inputs: 2 
Model: y ~ X + 1 
------------------------------- 
Engle-Granger Cointegration Test 
alternative: cointegrated 

Type 1: no trend 
    lag      EG p.value 
 4.0000 -3.3184  0.0638 
----- 
 Type 2: linear trend 
    lag      EG p.value 
 4.0000 -0.0618  0.1000 
----- 
 Type 3: quadratic trend 
    lag      EG p.value 
  4.000   0.632   0.100 
----------- 
Note: p.value = 0.01 means p.value <= 0.01 
    : p.value = 0.10 means p.value >= 0.10 

Pelo teste de Engle Granger rejeitamos a hipotese nula de não cointegração. Isso indica a existência de uma relação de cointegração entre as variaveis.

c)Apresente a estimativa em DOLS desse vetor de cointegração utilizando 4 leads e lags para a estimação.

modelcoint$residuals %>% as.data.frame()%>% drop_na() %>% ts(end = max(mpyr_data$...1)) %>%  acf()
drop_na: removed 9 rows (10%), 81 rows remaining

Os coeficientes estimados do modelo são estatisticamente significativos e mostram uma elasticidade positiva entre mp e logy (coeficiente 0.757643, indicando que um aumento de 1% no PIB leva a um aumento de aproximadamente 0,76% na demanda por moeda ajustada pelos preços. Esse resultado está alinhado com a teoria econômica, que prevê uma relação positiva entre renda e demanda por moeda. Por outro lado, a relação com a taxa de juros R é negativa (coeficiente −0.128801), como esperado, já que taxas de juros mais altas representam um maior custo de oportunidade de manter moeda, reduzindo a demanda por ela.

d) Reestime o vetor de cointegração em duas subamostras. A primeira para 1903-1945 e a segunda para 1946-1987. O que é possível concluir a respeito da elasticidade renda da demanda por moeda?

# Subamostra 1: 1903-1945
subsample1 <- subset(mpyr_data, DUMMY==0)
XX1<-subsample1[,4:5] %>% as.matrix()
cointRegD(x =XX1,y=subsample1$mp, n.lead = 4, n.lag = 4,demeaning=T) ->modelcoint1
modelcoint1

### D-OLS model ###

Model:      subsample1$mp ~ XX1

Parameters: Kernel = "ba"  //  Bandwidth = 5.350522 ("Andrews")

        Leads = 4 / Lags = 4 (set manually) 

Coefficients:
     Estimate    Std.Err t value Pr(|t|>0)    
LY  0.5642111  0.0353332  15.968 < 2.2e-16 ***
R  -0.1362747  0.0081326 -16.756 < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
  modelcoint1$residuals %>% ts(end = max(subsample1$...1)) %>% plot(main="Residuals of Cointegration Regression (D-OLS)")


# Subamostra 2: 1946-1987
subsample2 <- subset(mpyr_data, DUMMY==1)
XX2<-subsample2[,4:5] %>% as.matrix()
cointRegD(x =XX2,y=subsample2$mp, n.lead = 4, n.lag = 4,demeaning=T) ->modelcoint2
modelcoint2

### D-OLS model ###

Model:      subsample2$mp ~ XX2

Parameters: Kernel = "ba"  //  Bandwidth = 7.494225 ("Andrews")

        Leads = 4 / Lags = 4 (set manually) 

Coefficients:
     Estimate    Std.Err t value Pr(|t|>0)    
LY  0.6999462  0.0195363  35.828 < 2.2e-16 ***
R  -0.0769930  0.0049953 -15.413 < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
  modelcoint2$residuals %>% ts(end = max(subsample2$...1)) %>% plot(main="Residuals of Cointegration Regression (D-OLS)")

O novo modelo em periodos separados mostrou residuos melhor comportados. A elasticidade renda da demanda por moeda aumentou de 0.564 para 0.700 entre as duas subamostras, o que pode indicar mudanças estruturais na economia ao longo do tempo. A modernização econômica e o aumento do uso de moeda em transações podem ter contribuído para essa maior sensibilidade ao PIB.Em ambas as subamostras, a elasticidade é menor que 1, o que está de acordo com a teoria econômica, sugerindo que a demanda por moeda aumenta a uma taxa menor que a do crescimento econômico. já a elasticidade em relação à taxa de juros diminuiu de −0.136 no período de 1903-1945 para −0.077 no período de 1946-1987. Isso sugere que, com o avanço econômico e financeiro, a sensibilidade da demanda por moeda às mudanças na taxa de juros foi reduzida, possivelmente devido à maior diversificação dos instrumentos financeiros disponíveis e mudanças nos hábitos de liquidez da economia.

LS0tDQp0aXRsZTogIjLCuiBBdmFsaWHDp8OjbyAtIE1hY3JvZWNvbm9tZXRyaWEiDQphdXRob3I6IHwNCiAgVGhpYWdvIE5vcm9uaGEgR2FyZGluICANCiAgUHJvZjogTWFub2VsIFBpcmVzDQpkYXRlOiAiMTMgZGUgRGV6ZW1icm8gZGUgMjAyNCINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazogDQogICAgICAgIHRvYzogdHJ1ZQ0KICAgICAgICB0b2NfZGVwdGg6IDQNCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0DQotLS0NCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkoem9vKQ0KbGlicmFyeSh2YXJzKQ0KbGlicmFyeSh0c2VyaWVzKQ0KbGlicmFyeSh1cmNhKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHRpZHlsb2cpDQpsaWJyYXJ5KGR5bmxtKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGNvaW50UmVnKQ0KbGlicmFyeShhVFNBKQ0KDQpgYGANCg0KIyMjIDEpICgzIHBvbnRvcykgVXRpbGl6YW5kbyBhIGJhc2UgZGUgZGFkb3MgUVVBUlRFUkxZLCBlc3RpbWUgbyBWQVIgY29tIDMgZGVmYXNhZ2VucyBkZSBxdWUgdHJhdGEgbyBleGVyY8OtY2lvIDkgZG8gbGl2cm8gZG8gRW5kZXJzIG5hIHDDoWdpbmEgMzM5IGNvbSBvIG9yZGVuYW1lbnRvIOKIhmxpcCwg4oiGdW5lbXAgZSBzIChzcHJlYWQgZGUganVyb3MpLg0KDQpFc3RpbW91LXNlIHVtIG1vZGVsbyBWQVIgY29tIDMgZGVmYXNhZ2VucyB1dGlsaXphbmRvIGEgYmFzZSBkZSBkYWRvcyBgUVVBUlRFUkxZYCBlIG8gb3JkZW5hbWVudG8gZGFzIHZhcmnDoXZlaXM6IC0gJOKIhiRsaXAgKHZhcmlhw6fDo28gbm8gbG9nIGRhIHByb2R1w6fDo28gaW5kdXN0cmlhbCksIC0gJOKIhiR1bmVtcCAodmFyaWHDp8OjbyBubyBkZXNlbXByZWdvKSwgZSAtICRzJCAoc3ByZWFkIGRlIGp1cm9zKS4NCg0KYGBge3J9DQojIyBDYXJyZWdhbmRvIGEgYmFzZSBkZSBkYWRvcyBlIHByb2Nlc3NhbmRvIGFzIHZhcmnDoXZlaXMNCg0KUXVhcnRlcmx5MSA8LSByZWFkX2V4Y2VsKCJRdWFydGVybHkxLnhscyIpDQoNCmRsaXAgPC0gZGlmZihsb2coUXVhcnRlcmx5MSRJbmRQcm9kKSkgIyDOlGxpcA0KZHVuZW1wIDwtIGRpZmYoUXVhcnRlcmx5MSRVbmVtcCkgICAgICMgzpR1bmVtcA0KcyA8LSBRdWFydGVybHkxJFRiaWxsLVF1YXJ0ZXJseTEkcjEwICAgICAgICAgICAgICAgIyBTcHJlYWQgZGUganVyb3MNCmRhdGEuZnJhbWUoZGxpcCxkdW5lbXAscz1zWzI6MjEyXSkgJT4lIHRzKHN0YXJ0ID0gMTk2MCxmcmVxdWVuY3kgPSA0KS0+ZGF0YQ0KIyBWaXN1YWxpemFuZG8gYXMgc8Opcmllcw0KZGF0YSAlPiUgcGxvdA0KYGBgDQoNCkVzdGltYW5kbyBvIG1vZGVsbyBWQVINCg0KU2VsZWNpb25hbW9zIDMgZGVmYXNhZ2VucyBjb25mb3JtZSBvIGVudW5jaWFkbyBlIGVzdGltYW1vcyBvIG1vZGVsbyBWQVIuDQoNCmBgYHtyfQ0KdmFyX21vZGVsIDwtIFZBUihkYXRhLCBwID0gMywgdHlwZSA9ICJjb25zdCIpDQpzdW1tYXJ5KHZhcl9tb2RlbCktPm1vZGVsc20NCm1vZGVsc20NCm1vZGVsc20kcm9vdHMNCm1vZGVsc20kY292cmVzDQoNCmBgYA0KDQpPIG1vZGVsbyBWQVIgZXN0aW1hZG8gaW5jbHVpIGFzIHZhcmnDoXZlaXMgzpRsaXAgKHZhcmlhw6fDo28gbm8gbG9nIGRhIHByb2R1w6fDo28gaW5kdXN0cmlhbCksIM6UdW5lbXAgKHZhcmlhw6fDo28gbm8gZGVzZW1wcmVnbykgZSBzIChzcHJlYWQgZGUganVyb3MpLCBjb20gdHLDqnMgZGVmYXNhZ2Vucy4gQSBhbsOhbGlzZSBkb3MgY29lZmljaWVudGVzIHN1Z2VyZSBhbGd1bWFzIHJlbGHDp8O1ZXMgc2lnbmlmaWNhdGl2YXMuIE5vIGNhc28gZGUgzpRsaXAsIGEgZGVmYXNhZ2VtIGRhIHByw7NwcmlhIHZhcmnDoXZlbCAozpRsaXAubDEpIHRlbSB1bSBpbXBhY3RvIGVzdGF0aXN0aWNhbWVudGUgc2lnbmlmaWNhdGl2byBlIHBvc2l0aXZvLCBpbmRpY2FuZG8gcXVlIGEgcHJvZHXDp8OjbyBpbmR1c3RyaWFsIHJlc3BvbmRlIHBvc2l0aXZhbWVudGUgYSBzZXVzIHByw7NwcmlvcyB2YWxvcmVzIGRlZmFzYWRvcy4gTm8gZW50YW50bywgYXMgb3V0cmFzIHZhcmnDoXZlaXMgbsOjbyBhcHJlc2VudGFtIHNpZ25pZmljw6JuY2lhIGVzdGF0w61zdGljYSBwYXJhIGV4cGxpY2FyIM6UbGlwLiBQYXJhIM6UdW5lbXAsIM6UbGlwLmwxIHRlbSB1bSBpbXBhY3RvIG5lZ2F0aXZvIGUgc2lnbmlmaWNhdGl2bywgaW5kaWNhbmRvIHF1ZSBhdW1lbnRvcyBuYSBwcm9kdcOnw6NvIGluZHVzdHJpYWwgcmVkdXplbSBvIGRlc2VtcHJlZ28sIGNvbmZvcm1lIGVzcGVyYWRvLiBObyBjYXNvIGRlIHMsIGEgdmFyacOhdmVsIHMubDEgw6kgYWx0YW1lbnRlIHNpZ25pZmljYXRpdmEgZSByZWZsZXRlIHBlcnNpc3TDqm5jaWEgbm8gc3ByZWFkIGRlIGp1cm9zIGFvIGxvbmdvIGRvIHRlbXBvLiBBcyBpbnRlcnJlbGHDp8O1ZXMgZW50cmUgYXMgdmFyacOhdmVpcyBzw6NvIGNhcHR1cmFkYXMgbmEgbWF0cml6IGRlIGNvdmFyacOibmNpYSBkb3MgcmVzw61kdW9zLCBxdWUgbW9zdHJhIHVtYSBjb3JyZWxhw6fDo28gbmVnYXRpdmEgZm9ydGUgZW50cmUgzpRsaXAgZSDOlHVuZW1wICgkLTAuNzE3NCQpLCBjb3Jyb2JvcmFuZG8gYSByZWxhw6fDo28gZXNwZXJhZGEgZW50cmUgcHJvZHXDp8OjbyBpbmR1c3RyaWFsIGUgZGVzZW1wcmVnby4gQSBtYWduaXR1ZGUgZG9zICRSXjIkIGFqdXN0YWRvcyBzdWdlcmUgcXVlIG8gbW9kZWxvIGV4cGxpY2EgYmVtIGFzIHZhcmlhw6fDtWVzIGVtIHMgKDgxLjc1JSksIM6UdW5lbXAgKDUwLjAyJSkgZSBtb2RlcmFkYW1lbnRlIM6UbGlwICgzNy43NiUpLiBFc3NlcyByZXN1bHRhZG9zIGluZGljYW0gcXVlIG8gbW9kZWxvIFZBUiDDqSBhZGVxdWFkbyBwYXJhIGNhcHR1cmFyIGFzIGludGVyYcOnw7VlcyBkaW7Dom1pY2FzIGVudHJlIGFzIHZhcmnDoXZlaXMgYW5hbGlzYWRhcy4NCg0KIyMjIyBhKVZlcmlmaXF1ZSBzZSBzIChzcHJlYWQgZGUganVyb3MpIEdyYW5nZXIgY2F1c2Eg4oiGbGlwLg0KDQpgYGB7cn0NCmNhdXNhbGl0eSh2YXJfbW9kZWwsIGNhdXNlID0gInMiKSRHcmFuZ2VyDQpgYGANCg0KQSBhbsOhbGlzZSBkbyB0ZXN0ZSBkZSBjYXVzYWxpZGFkZSBkZSBHcmFuZ2VyIHJldmVsb3UgbyBzcHJlYWQgZGUganVyb3MgKPCdkaApIGNhdXNhIEdyYW5nZXIgYXMgdmFyacOhdmVpcyDOlGxpcCBlIM6UdW5lbXAgTyB0ZXN0ZSBkZSBjYXVzYWxpZGFkZSBkZSBHcmFuZ2VyIGluZGljYSBxdWUgcyBmb3JuZWNlIGluZm9ybWHDp8O1ZXMgw7p0ZWlzIHBhcmEgcHJldmVyIHRhbnRvIM6UbGlwIHF1YW50byDOlHVuZW1wLiBObyBjYXNvIGRlIM6UbGlwLCByZWplaXRhbW9zIGEgaGlww7N0ZXNlIG51bGEgZGUgcXVlIHMgbsOjbyBjYXVzYSBHcmFuZ2VyIGEgdmFyacOhdmVsLCBjb20gdW0gdmFsb3IgRj0zLjY5NDggZSBwPTAuMDAxMjk1Lg0KDQojIyMjIGIpVmVyaWZpcXVlIHNlIHMgKHNwcmVhZCBkZSBqdXJvcykgR3JhbmdlciBjYXVzYSDiiIZ1bmVtcC4NCg0KYGBge3J9DQp0ZXN0X3M8LWNhdXNhbGl0eSh2YXJfbW9kZWwsIGNhdXNlID0gInMiKQ0KdGVzdF9zJEdyYW5nZXINCmBgYA0KDQpEYSBtZXNtYSBmb3JtYSwgbyB0ZXN0ZSBkZW1vbnN0cmEgcXVlIHMgY2F1c2EgR3JhbmdlciDOlHVuZW1wLCBpbXBsaWNhbmRvIHF1ZSBtdWRhbsOnYXMgbm8gc3ByZWFkIGRlIGp1cm9zIHTDqm0gaW1wYWN0byBkaW7Dom1pY28gc29icmUgbyBkZXNlbXByZWdvLg0KDQojIyMjYylBbmFsaXNlIGEgZGVjb21wb3Npw6fDo28gZGEgdmFyacOibmNpYSBkZXNzZSBWQVIuDQoNCmBgYHtyfQ0KZmV2ZF9yZXN1bHRzIDwtIGZldmQodmFyX21vZGVsLCBuLmFoZWFkID0gMTApDQpmZXZkX3Jlc3VsdHMgDQoNCmBgYA0KDQpBIGRlY29tcG9zacOnw6NvIGRhIHZhcmnDom5jaWEgY29tcGxlbWVudGEgZXNzZXMgcmVzdWx0YWRvcyBhbyBtb3N0cmFyIGNvbW8gYSB2YXJpw6JuY2lhIGRlIGNhZGEgdmFyacOhdmVsIMOpIGV4cGxpY2FkYSBhbyBsb25nbyBkbyB0ZW1wby4gSW5pY2lhbG1lbnRlLCDOlGxpcCDDqSBxdWFzZSBjb21wbGV0YW1lbnRlIGV4cGxpY2FkYSBwb3Igc2kgbWVzbWEgKDEwMCUgbm8gcGVyw61vZG8gMSksIG1hcyBhbyBsb25nbyBkbyB0ZW1wbywgdW1hIHBlcXVlbmEgcGFyY2VsYSBkYSB2YXJpw6JuY2lhIMOpIGF0cmlidcOtZGEgYSBzLCBjaGVnYW5kbyBhIDUsOCUgbm8gcGVyw61vZG8gMTAuIElzc28gc3VnZXJlIHF1ZSwgZW1ib3JhIG8gc3ByZWFkIGRlIGp1cm9zIHRlbmhhIHVtIGltcGFjdG8gbGltaXRhZG8gc29icmUgYSBwcm9kdcOnw6NvIGluZHVzdHJpYWwgbm8gbG9uZ28gcHJhem8sIGVsZSBuw6NvIMOpIGRlc3ByZXrDrXZlbC4gUGFyYSDOlHVuZW1wLCBvIHNwcmVhZCBkZSBqdXJvcyBkZXNlbXBlbmhhIHVtIHBhcGVsIGNyZXNjZW50ZSBhbyBsb25nbyBkbyB0ZW1wbywgZXhwbGljYW5kbyAxMywxOCUgZGEgdmFyacOibmNpYSBubyBwZXLDrW9kbyAxMCwgaW5kaWNhbmRvIHF1ZSBhIGluZmx1w6puY2lhIGRlIHMgc29icmUgbyBkZXNlbXByZWdvIHNlIGludGVuc2lmaWNhIG5vIGxvbmdvIHByYXpvLiBKw6EgcGFyYSBzLCBzdWEgcHLDs3ByaWEgdmFyacOibmNpYSDDqSBleHBsaWNhZGEgcHJpbmNpcGFsbWVudGUgcG9yIHNpIG1lc21hLCBlbWJvcmEgYSBjb250cmlidWnDp8OjbyBkZSDOlGxpcCBjcmVzw6dhIGdyYWR1YWxtZW50ZSwgY2hlZ2FuZG8gYSAzMCwxMyUgbm8gcGVyw61vZG8gMTAuDQoNCiMjIyMgZClBbmFsaXNlIGFzIGZ1bsOnw7VlcyBkZSBpbXB1bHNvIHJlc3Bvc3RhLg0KDQpgYGB7ciBwYWdlZC5wcmludD1UUlVFfQ0KI2xpYnJhcnkocGF0Y2h3b3JrKQ0KDQojIEFuYWxpc2FyIGZ1bsOnw7VlcyBkZSBpbXB1bHNvLXJlc3Bvc3RhDQppcmYodmFyX21vZGVsLCBpbXB1bHNlID0gInMiLCByZXNwb25zZSA9IGMoInMiKSwgYm9vdCA9IFRSVUUpICU+JSBwbG90KCkNCmlyZih2YXJfbW9kZWwsIGltcHVsc2UgPSAicyIsIHJlc3BvbnNlID0gYygiZGxpcCIpLCBib290ID0gVFJVRSkgJT4lIHBsb3QoKQ0KaXJmKHZhcl9tb2RlbCwgaW1wdWxzZSA9ICJzIiwgcmVzcG9uc2UgPSBjKCJkdW5lbXAiKSwgYm9vdCA9IFRSVUUpICU+JSBwbG90KCkNCmlyZih2YXJfbW9kZWwsIGltcHVsc2UgPSAiZGxpcCIsIHJlc3BvbnNlID0gYygicyIpLCBib290ID0gVFJVRSkgJT4lIHBsb3QoKQ0KaXJmKHZhcl9tb2RlbCwgaW1wdWxzZSA9ICJkbGlwIiwgcmVzcG9uc2UgPSBjKCJkbGlwIiksIGJvb3QgPSBUUlVFKSAlPiUgcGxvdCgpDQppcmYodmFyX21vZGVsLCBpbXB1bHNlID0gImRsaXAiLCByZXNwb25zZSA9IGMoImR1bmVtcCIpLCBib290ID0gVFJVRSkgJT4lIHBsb3QoKQ0KaXJmKHZhcl9tb2RlbCwgaW1wdWxzZSA9ICJkdW5lbXAiLCByZXNwb25zZSA9IGMoInMiKSwgYm9vdCA9IFRSVUUpICU+JSBwbG90KCkNCmlyZih2YXJfbW9kZWwsIGltcHVsc2UgPSAiZHVuZW1wIiwgcmVzcG9uc2UgPSBjKCJkbGlwIiksIGJvb3QgPSBUUlVFKSAlPiUgcGxvdCgpDQppcmYodmFyX21vZGVsLCBpbXB1bHNlID0gImR1bmVtcCIsIHJlc3BvbnNlID0gYygiZHVuZW1wIiksIGJvb3QgPSBUUlVFKSAlPiUgcGxvdCgpDQoNCg0KDQpgYGANCg0KQXMgZnVuw6fDtWVzIGRlIGltcHVsc28tcmVzcG9zdGEgKElSRikgb2ZlcmVjZW0gdW1hIHZpc8OjbyBhZGljaW9uYWwgc29icmUgb3MgZWZlaXRvcyBkZSBjaG9xdWVzIGVudHJlIGFzIHZhcmlhdmVpcy4gUGFyYSBvcyBpbXB1bHNvcyBlbSBzLCBvYnNlcnZhbW9zIHVtIHVtIGVmZWl0byBzaWduaWZpY2F0aXZvIGF0w6kgbyA3IGxhZyBuZWxlIG1lc21vLCBqw6EgYSByZXNwb3N0YSBkYSDOlGxpcCBjb21lw6dhciDDqSBzaWduaWZpY2F0aXZhbWVudGUgbmVnYXRpdmEgcGFyYSBvIDXCuiBhNyBsYWcsIGVucXVhbnRvIGEgcmVzcG9zdGEgZGEgzpR1bmVtcCDDqSBwb3NpdGl2YSBlbnRyZSAzIGxhZywgZSB0ZW0gdW0gZmVpdG8gcGVyc2lzdGVudGUgcGFyYSBhbMOpbSBkbyAxMMK6IHBlcmlvZG8uIFBhcmEgb3MgaW1wdWxzb3MgZW0gzpRsaXAsIG9ic2VydmFtb3MgdW0gdW0gZWZlaXRvIHBvc2l0aXZvIHNpZ25pZmljYXRpdm8gZSBwZXJzaXN0ZW50ZSBjb21vIHJlc3Bvc3RhIGRlIFMsIG5lbGUgbWVzbW9vIG8gY2hvcXVlIHBlcmRlIGVmaXRvIGEgcGFydGlyIGRvIDPCuiBwZXJpb2RvLCBlIGEgcmVzcG9zdGEgZGUgzpR1bmVtcCDDqSBuZWdhdGl2YSBwYXJhIG9zIDTCuiBwcmltZWlyb3MgcGVyaW9kb3MgZSBzaWduaWZpY2F0aXZhbWVudGUgcG9zaXRpdmEgbm8gbG9uZ28gcHJhem8uDQoNCkZpbmFsbWVudGUsIFBhcmEgb3MgaW1wdWxzb3MgZW0gzpR1bmVtcCwgb2JzZXJ2YW1vcyB1bSB1bSBlZmVpdG8gbsOjbyBzaWduaWZpY2F0aXZvIGNvbW8gcmVzcG9zdGEgZGUgUyBlIM6UbGlwLCBlIG5lbGUgbWVzbW8gbyBjaG9xdWUgcGVyZGUgZWZlaXRvIGEgcGFydGlyIGRvIDPCuiBwZXJpb2RvLg0KDQojIyMgMikgKDIsNSBwb250b3MpLiBPIGFycXVpdm8gIkltcG9ydGHDp8O1ZXMiIHBvc3N1aSBkYWRvcyBkbyB2b2x1bWUgZGUgaW1wb3J0YcOnw7VlcyAoTSksIGRvIFBJQiBubyBCcmFzaWwgKFkpIGUgZGEgdGF4YSBkZSBjw6JtYmlvIHJlYWwgZWZldGl2YSAocSkuIEVzdGltZSBhIGZ1bsOnw6NvIGltcG9ydGHDp8OjbyAoZW0gbG9ncykgcG9yIG1laW8gZGUgdMOpY25pY2FzIHVuaWVxdWFjaW9uYWlzIGRlIGNvaW50ZWdyYcOnw6NvLiBFeGlzdGUgcmVsYcOnw6NvIGRlIGNvaW50ZWdyYcOnw6NvIGVudHJlIGFzIHZhcmnDoXZlaXM/IEFzIGVsYXN0aWNpZGFkZXMgc8OjbyBhcyBlc3BlcmFkYXM/DQoNCmBgYHtyfQ0KbGlicmFyeShyZWFkeGwpDQpJbXBvcnQgPC0gcmVhZF9leGNlbCgiSW1wb3J0YcOnw7Vlcy54bHN4IikNCg0KSW1wb3J0JGxvZ19NIDwtIGxvZyhJbXBvcnQkTSkgICAjIExvZyBkbyB2b2x1bWUgZGUgaW1wb3J0YcOnw7Vlcw0KSW1wb3J0JGxvZ19ZIDwtIGxvZyhJbXBvcnQkWSkgICAjIExvZyBkbyBQSUINCkltcG9ydCRsb2dfcSA8LSBsb2coSW1wb3J0JFEpICAgIyBMb2cgZGEgdGF4YSBkZSBjw6JtYmlvIHJlYWwNCkltcG9ydCAlPiUgdHMoZnJlcXVlbmN5ID0gNCwgc3RhcnQgPSAxOTk2KS0+dHNfaW1wDQp0c19pbXAgJT4lIHBsb3QoKQ0KYGBgDQoNCkFudGVzIGRlIGFwbGljYXIgdMOpY25pY2FzIGRlIGNvaW50ZWdyYcOnw6NvLCBwcmVjaXNhbW9zIHZlcmlmaWNhciBzZSBhcyBzw6lyaWVzIHPDo28gbsOjbyBlc3RhY2lvbsOhcmlhcw0KDQpgYGB7cn0NCiMgVGVzdGUgQURGIHBhcmEgYXMgdmFyacOhdmVpcw0KYWRmLnRlc3QoSW1wb3J0JGxvZ19NKQ0KYWRmLnRlc3QoSW1wb3J0JGxvZ19ZKQ0KYWRmLnRlc3QoSW1wb3J0JGxvZ19xKQ0KYGBgDQoNCk9zIHJlc3VsdGFkb3MgZG8gdGVzdGUgQXVnbWVudGVkIERpY2tleS1GdWxsZXIgKEFERikgaW5kaWNhbSBxdWUgdG9kYXMgYXMgdmFyacOhdmVpcyBlbSBuw612ZWwgbsOjbyBzw6NvIGVzdGFjaW9uw6FyaWFzLiBlbnTDo28gdGVtLXNlIHF1ZSB2ZXJpZmljYXIgc2UgZWxhcyBzw6NvIGVtIDHCqiBkaWZlcmXDp2ENCg0KYGBge3J9DQphZGYudGVzdChJbXBvcnQkbG9nX00gJT4lIGRpZmYpDQphZGYudGVzdChJbXBvcnQkbG9nX1kgJT4lIGRpZmYpDQphZGYudGVzdChJbXBvcnQkbG9nX3EgJT4lIGRpZmYpDQpgYGANCg0KVmVtb3MgYXF1aSBxdWUgZW0gMcK6IGRpZmVyZW7Dp2EgdG9kYXMgYXMgdmFyaWF2ZWlzIHPDo28gZXN0YWNpb27DoXJpYXMuIHBvcnRhbnRvLCBow6EgY29uZGnDp8O1ZXMgcGFyYSBlbGFzIHNlcmVtIGNvaW50ZWdyYWRhcy4NCg0KIyMjIyMgdGVzdGUgZGUgRW5nbGUtR3Jhbmdlcg0KDQpQb250YW50byBhZ29yYSB2YW1vcyBlc3RpbWFyIGEgcmVsYcOnw6NvIGRlIGxvbmdvIHByYXpvIGRhcyB2YXJpYXZlaXMsIGUgZmF6ZXIgdGVzdGUgZGUgRW5nbGUtR3JhbmdlciBwYXJhIHZlcmlmaWNhciBzZSBvcyByZXPDrWR1b3MgZG8gbW9kZWxvIGRlIHJlZ3Jlc3PDo28gc8OjbyBlc3RhY2lvbsOhcmlvcy4gbm8gdGVzdGUgw6kgZXN0aW1hZG8gYSByZWdyZXNzw6NvIGxpbmVhciBlbnRyZSBhcyB2YXJpYXZlaXMgZSBzZXUgcmVzw61kdW8gw6kgdGVzdGFkbyBxdWFudG8gw6AgZXN0YWNpb25hcmllZGFkZS4gT3MgdGVzdGUgZm9pIHBlcmZvcm1hZG8gZW0gNCBsYWdzIGRhZG8gYSBlc2NhbGEgdGVtcG9yYWwgZG9zIGRhZG9zLg0KDQpgYGB7cn0NCmxpYnJhcnkoYVRTQSkNClhfaW1wPC1JbXBvcnRbLDY6N10gJT4lIGFzLm1hdHJpeCgpDQpjb2ludC50ZXN0KHkgPSBJbXBvcnQkbG9nX00sWCA9IFhfaW1wLG5sYWcgPSA0KQ0KYGBgDQoNClBlbG8gdGVzdGUgZGUgRW5nbGUgR3JhbmdlciByZWplaXRhbW9zIGEgaGlwb3Rlc2UgbnVsYSBkZSBuw6NvIGNvaW50ZWdyYcOnw6NvLiBJc3NvIGluZGljYSBhIGV4aXN0w6puY2lhIGRlIHVtYSByZWxhw6fDo28gZGUgY29pbnRlZ3Jhw6fDo28gZW50cmUgYXMgdmFyaWF2ZWlzLg0KDQpBZ29yYSB2YW1vcyBlc3RpbWFyIHVtIE1vZGVsbyBkZSBDb3JyZcOnw6NvIGRlIEVycm8gKEVDTSkgcGFyYSBjYXB0dXJhciBhcyBkaW7Dom1pY2FzIGRlIGN1cnRvIHByYXpvIGFqdXN0YWRhcyBwZWxhIHJlbGHDp8OjbyBkZSBsb25nbyBwcmF6by4NCg0KIyMjIyMgVGVzdGFuZG8gYSBjb2ludGVncmHDp8OjbyBwZWxvIG1ldG9kbyBkZSBKb2hhbnNlbg0KDQpgYGB7cn0NCnZlY19tb2RlbCA8LSBjYS5qbyhJbXBvcnRbLDU6N10sIHR5cGUgPSAidHJhY2UiLCBlY2RldCA9ICJjb25zdCIsSyA9IDQpDQp2ZWNfbW9kZWwgJT4lIHN1bW1hcnkoKQ0KYGBgDQoNCnZhbW9zIGFjb3JhIGNyaWFyIG8gbW9kZWxvIGRlIGNvcnJlw6fDo28gZGUgZXJyb3MgcGVsbyBtZXRvZG8gZGUNCg0KYGBge3J9DQplY21fbW9kZWwgPC0gY2Fqb3Jscyh2ZWNfbW9kZWwsIHIgPSAxKSAgIyBBc3N1bWluZG8gdW1hIHJlbGHDp8OjbyBkZSBjb2ludGVncmHDp8Ojbw0KZWNtX21vZGVsDQpyb290cyh2YXJfbW9kZWwpDQoNCmBgYA0KDQpPIHNpc3RlbWEgw6kgZXN0w6F2ZWwsIHBvaXMgdG9kYXMgYXMgcmHDrXplcyBkbyBtb2RlbG8gZXN0w6NvIGRlbnRybyBkbyBjw61yY3VsbyB1bml0w6FyaW8gKHRvZGFzIGFzIHJhaXogbWVub3JlcyBxdWUgMSksIGluZGljYW5kbyBxdWUgYXMgZGluw6JtaWNhcyBlbnRyZSBhcyB2YXJpw6F2ZWlzIGNvbnZlcmdlbSBhbyBsb25nbyBkbyB0ZW1wbyBwYXJhIG8gZXF1aWzDrWJyaW8gZGUgbG9uZ28gcHJhem8uDQoNCk9zIHJlc3VsdGFkb3MgZG8gbW9kZWxvIGluZGljYW0gcXVlIGV4aXN0ZSB1bWEgcmVsYcOnw6NvIGRlIGNvaW50ZWdyYcOnw6NvIGVudHJlIGFzIHZhcmnDoXZlaXMsIGNvbmZvcm1lIGV2aWRlbmNpYWRvIHBlbGEgc2lnbmlmaWPDom5jaWEgZG8gdGVybW8gZGUgY29ycmXDp8OjbyBkZSBlcnJvIChlY3QxPeKIkjAuMDI1MykuIE8gY29lZmljaWVudGUgbmVnYXRpdm8gZSBzaWduaWZpY2F0aXZvIHN1Z2VyZSBxdWUgY2VyY2EgZGUgMiw1MyUgZG9zIGRlc3Zpb3MgZW0gcmVsYcOnw6NvIGFvIGVxdWlsw61icmlvIGRlIGxvbmdvIHByYXpvIHPDo28gY29ycmlnaWRvcyBhIGNhZGEgcGVyw61vZG8sIGluZGljYW5kbyB1bSBhanVzdGUgbGVudG8sIG1hcyBjb25zaXN0ZW50ZSwgZW0gZGlyZcOnw6NvIMOgIHJlbGHDp8OjbyBkZSBlcXVpbMOtYnJpby4NCg0KIyMjIyMgZXN0aW1hbmRvIHZhciBkYSBjb2ludGVncmHDp8OjbzINCg0KYGBge3J9DQpsaWJyYXJ5KGNvaW50UmVnKQ0KY29pbnRSZWcoeSA9IEltcG9ydCRsb2dfTSx4ID1YX2ltcCxuLmxhZyA9IDQsZGVtZWFuaW5nPVQpIC0+RUNNDQpFQ00gDQpFQ00kdmFybWF0DQpgYGANCg0KQXNzaW0sIHBvZGUtc2UgZGl6ZXIgcXVlIGV4aXN0ZSB1bWEgcmVsYcOnw6NvIGRlIGNvaW50ZWdyYcOnw6NvIGVudHJlIGFzIHZhcmnDoXZlaXMsIGNvbmZpcm1hZGEgcGVsYSBlc3RpbWHDp8OjbyBkbyBtb2RlbG8gRk0tT0xTLCBxdWUgYWp1c3RhIHVtYSByZWxhw6fDo28gZGUgbG9uZ28gcHJhem8gcm9idXN0YSBlbnRyZSB2b2x1bWUgZGUgaW1wb3J0YcOnw7VlcywgUElCIGUgdGF4YSBkZSBjw6JtYmlvIHJlYWwuIEFzIGVsYXN0aWNpZGFkZXMgc8OjbyBjb25zaXN0ZW50ZXMgY29tIGEgdGVvcmlhIGVjb27DtG1pY2E6IGEgZWxhc3RpY2lkYWRlLXJlbmRhICgxLjY2KSDDqSBwb3NpdGl2YSBlIG1haW9yIHF1ZSAxLCBpbmRpY2FuZG8gcXVlIGFzIGltcG9ydGHDp8O1ZXMgY3Jlc2NlbSBtYWlzIGRvIHF1ZSBwcm9wb3JjaW9uYWxtZW50ZSBhbyBQSUIsIGVucXVhbnRvIGEgZWxhc3RpY2lkYWRlLWPDom1iaW8gKOKIkjAuNjQpIMOpIG5lZ2F0aXZhLCByZWZsZXRpbmRvIHF1ZSB1bWEgZGVzdmFsb3JpemHDp8OjbyBjYW1iaWFsIHJlZHV6IG8gdm9sdW1lIGRlIGltcG9ydGHDp8O1ZXMgYW8gYXVtZW50YXIgb3MgcHJlw6dvcyBkb3MgYmVucyBpbXBvcnRhZG9zLg0KDQojIyMgMykoMiBwb250b3MpLiBPIGFycXVpdm8gImPDom1iaW8iIHBvc3N1aSBkdWFzIHZhcmnDoXZlaXM6IGEgdGF4YSBkZSBjw6JtYmlvIG5vbWluYWwgKGUpIGUgYSB0YXhhIGRlIGPDom1iaW8gcmVhbCAocSkgcGFyYSBvIEJyYXNpbC4gRXN0aW1lIHVtIG1vZGVsbyBWQVIgKGVtIGxvZ3MpIGUgYXBsaXF1ZSBhIGlkZW50aWZpY2HDp8OjbyBkZSBsb25nbyBwcmF6byBhc3N1bWluZG8gcXVlIGEgdGF4YSBub21pbmFsIG7Do28gcG9zc3VpIGVmZWl0byBwZXJtYW5lbnRlIHNvYnJlIGEgdGF4YSByZWFsLiBBIHBhcnRpciBkYcOtLCBhbmFsaXNlIGEgZnVuw6fDo28gZGUgaW1wdWxzbyByZXNwb3N0YSwgYSBkZWNvbXBvc2nDp8OjbyBkYSB2YXJpw6JuY2lhIGUgbyBjb21wb3J0YW1lbnRvIGRvcyBjaG9xdWVzIGVzdHJ1dHVyYWlzLiBDb21vIHNlIGNvbXBvcnRhbSBvcyBjaG9xdWVzIHJlYWlzIGUgbm9taW5haXMgZG8gY8OibWJpbyBkdXJhbnRlIGEgcGFuZGVtaWEgaW5pY2lhZGEgZW0gbWFyw6dvIGRlIDIwMjA/DQoNCmBgYHtyfQ0KbGlicmFyeShyZWFkeGwpDQpjYW1iaW8gPC0gcmVhZF9leGNlbCgiY8OibWJpby54bHN4IiwgY29sX3R5cGVzID0gYygiZGF0ZSIsIA0KICAgICJudW1lcmljIiwgIm51bWVyaWMiKSkNCmNhbWJpbyRsb2dfZSA8LSBsb2coY2FtYmlvJGAzNjk1IC0gVGF4YSBkZSBjw6JtYmlvIC0gTGl2cmUgLSBEw7NsYXIgYW1lcmljYW5vIChjb21wcmEpIC0gRmltIGRlIHBlcsOtb2RvIC0gbWVuc2FsIC0gdS5tLmMuL1VTJGApICAjIExvZyBkYSB0YXhhIGRlIGPDom1iaW8gbm9taW5hbA0KY2FtYmlvJGxvZ19xIDwtIGxvZyhjYW1iaW8kYDExNzUyIC0gw41uZGljZSBkYSB0YXhhIGRlIGPDom1iaW8gcmVhbCBlZmV0aXZhIChJUENBKSAtIEp1bi8xOTk0PTEwMCAtIMONbmRpY2VgKSAgIyBMb2cgZGEgdGF4YSBkZSBjw6JtYmlvIHJlYWwNCmNhbWJpbyAlPiUgZHJvcF9uYSgpLT5jYW1iaW8NCmNhbWJpbyU+JSB0cyhzdGFydCA9YygyMDAwLDIpLGZyZXE9MTIgKSAlPiUgcGxvdA0KYGBgDQoNCkFudGVzIGRlIGVzdGltYXIgb3MgdmFycywgw6kgcHJlY2lzbyBhdmVyaWd1YXIgYSBlc3RhY2lvbsOhcmlkYWRlIGRhcyBzZXJpZXMNCg0KYGBge3J9DQoNCiAjIFZlcmlmaWNhciBhIGVzdGFjaW9uYXJpZGFkZSBkYXMgdmFyacOhdmVpcw0KYWRmLnRlc3QoY2FtYmlvJGxvZ19lKQ0KYWRmLnRlc3QoY2FtYmlvJGxvZ19xKQ0KYGBgDQoNCkFtYm9zIG9zIHJlc3VsdGFkb3MgaW5kaWNhbSBxdWUgYXMgc8OpcmllcyBuw6NvIHPDo28gZXN0YWNpb27DoXJpYXMsIHBlcm1pdGluZG8gbyB1c28gZG8gbW9kZWxvIFZBUi4gUGFyYSBvIG1vZGVsbyBWQVIgb3B0b3Utc2UgcG9yIGluY2x1aXIgdGVuZGVuY2lhIGUgY29uc3RhbnRlIGluZHV6aWRhcyBwZWxhIGFuYWxpc2UgZ3LDoWZpY2EgZSBkdWFzIGRlZmFzYWdlbnMgZm9yYW0gc2VsZWNpb25hZGFzIHBhcmEgZWxpbWluYXIgYXV0b2NvcnJlbGHDp8OjbyBub3MgcmVzw61kdW9zLCBzZW0gY29tcHJvbWV0ZXIgYSBzaWduaWZpY8OibmNpYSBkYXMgZGVmYXNhZ2Vucy4gQSBpZGVudGlmaWNhw6fDo28gZXN0cnV0dXJhbCBkZSBsb25nbyBwcmF6byBhc3N1bWl1IHF1ZSBjaG9xdWVzIG5hIHRheGEgbm9taW5hbCBuw6NvIGFmZXRhbSBwZXJtYW5lbnRlbWVudGUgYSB0YXhhIHJlYWwuDQoNCmBgYHtyfQ0KdmFyX2RhdGEgPC0gY2FtYmlvWywgYygibG9nX2UiLCAibG9nX3EiKV0NCnZhcl9tb2RlbCA8LSBWQVIodmFyX2RhdGEsIHAgPSAyLCB0eXBlID0gImJvdGgiKQ0Kc3VtbWFyeSh2YXJfbW9kZWwpDQoNCmFtYXQgPC0gZGlhZygyKSAjIE1hdHJpeiBkZSBpZGVudGlmaWNhw6fDo28gZXN0cnV0dXJhbA0KYW1hdFsyLCAxXSA8LSBOQSAjIFJlc3RyacOnw6NvOiB0YXhhIG5vbWluYWwgbsOjbyB0ZW0gZWZlaXRvIHBlcm1hbmVudGUgbmEgcmVhbCwNCmFtYXQNCnN2YXJfbW9kZWwgPC0gU1ZBUih2YXJfbW9kZWwsIEFtYXQgPSBhbWF0KQ0Kc3Zhcl9tb2RlbA0KYGBgDQoNCkFzIGR1YXMgZXF1YcOnw7VlcyBtb3N0cmFtIHF1ZSBhbWJhcyBhcyB0YXhhcyBsb2dfZSBlIGxvZ19xIHPDo28gaW50ZXJkZXBlbmRlbnRlcyBlIGluZmx1ZW5jaWFkYXMgdGFudG8gcGVsb3Mgc2V1cyBwcsOzcHJpb3MgdmFsb3JlcyBkZWZhc2Fkb3MgcXVhbnRvIHBlbGFzIGludGVyYcOnw7VlcyBjcnV6YWRhcy4gTyBtb2RlbG8gY2FwdHVyYSBhcyBkaW7Dom1pY2FzIGRlIGN1cnRvIHByYXpvIGVudHJlIGFzIHZhcmnDoXZlaXMuIEEgaWRlbnRpZmljYcOnw6NvIGVzdHJ1dHVyYWwgaW1ww7RzIGEgcmVzdHJpw6fDo28gZGUgcXVlIGNob3F1ZXMgbmEgdGF4YSBub21pbmFsIG7Do28gYWZldGFtIHBlcm1hbmVudGVtZW50ZSBhIHRheGEgcmVhbC4NCg0KYGBge3Igd2FybmluZz1GQUxTRX0NCg0KaXJmX3Jlc3VsdHNlcSA8LSBpcmYoc3Zhcl9tb2RlbCwgaW1wdWxzZSA9ICJsb2dfZSIsIHJlc3BvbnNlID0gImxvZ19xIiwNCiAgICAgICAgICAgICAgICAgICBuLmFoZWFkID0gMTIsIGJvb3QgPSBUUlVFKQ0KaXJmX3Jlc3VsdHNxZSA8LSBpcmYoc3Zhcl9tb2RlbCwgaW1wdWxzZSA9ICJsb2dfcSIsIHJlc3BvbnNlID0gImxvZ19lIiwNCiAgICAgICAgICAgICAgICAgICBuLmFoZWFkID0gMTIsIGJvb3QgPSBUUlVFKQ0KYGBgDQoNCmBgYHtyfQ0KI2NiaW5kKGlyZl9yZXN1bHRzZXEkaXJmJGxvZ19lLGlyZl9yZXN1bHRzZXEkTG93ZXIkbG9nX2UsaXJmX3Jlc3VsdHNlcSRVcHBlciRsb2dfZSkgDQppcmZfcmVzdWx0c2VxICU+JSBwbG90DQojY2JpbmQoaXJmX3Jlc3VsdHNxZSRpcmYkbG9nX3EsaXJmX3Jlc3VsdHNxZSRMb3dlciRsb2dfcSxpcmZfcmVzdWx0c3FlJFVwcGVyJGxvZ19xKQ0KaXJmX3Jlc3VsdHNxZSAlPiUgcGxvdA0KYGBgDQoNCkEgZnVuw6fDo28gZGUgaW1wdWxzby1yZXNwb3N0YSAoSVJGKSBtb3N0cmEgcXVlIGNob3F1ZXMgbmEgdGF4YSBub21pbmFsIHTDqm0gZWZlaXRvcyB0ZW1wb3LDoXJpb3MgbmEgdGF4YSByZWFsLCBlbnF1YW50byBjaG9xdWVzIG5hIHRheGEgcmVhbCBhcHJlc2VudGFtIGVmZWl0b3MgbWFpcyBkdXJhZG91cm9zLiBJc3NvIGNvcnJvYm9yYSBhIHJlc3RyacOnw6NvIGRlIGxvbmdvIHByYXpvIGltcG9zdGEgYW8gbW9kZWxvLg0KDQpgYGB7cn0NCiNzdHJ1Y3R1cmFsX3Nob2NrcyA8LSByZXNpZHVhbHMoc3Zhcl9tb2RlbCR2YXIpIA0Kc3RydWN0dXJhbF9zaG9ja3MgJT4lICB0cyhzdGFydCA9IGMoMjAwMCwxKSxmcmVxdWVuY3kgPSAxMikgJT4lIA0KICAgIHdpbmRvdyhjKDIwMTksOCksYygyMDIxLDEpKSAlPiVhdXRvcGxvdCgpDQojc3RydWN0dXJhbF9zaG9ja3MgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgc2VsZWN0KGxvZ19lLGxvZ19xKSAlPiUNCiMgIHRzKHN0YXJ0ID0gYygyMDAwLDEpLGZyZXF1ZW5jeSA9IDEyKSU+JQ0KIyAgd2luZG93KGMoMjAxOCwxKSxjKDIwMjIsMTIpKSAlPiUNCiMgIGdncGxvdChhZXMpDQojI3N0cnVjdHVyYWxfc2hvY2tzICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIHNlbGVjdChsb2dfcSkgJT4lDQojICB0cyhzdGFydCA9IGMoMjAwMCwxKSxmcmVxdWVuY3kgPSAxMikgJT4lIHdpbmRvdyhjKDIwMTgsMSksYygyMDIyLDEyKSklPiUgdHMucGxvdCgpDQpgYGANCg0KT3MgY2hvcXVlcyBlc3RydXR1cmFpcyBtb3N0cmFtIHF1ZSwgZHVyYW50ZSBhIHBhbmRlbWlhIGRlIDIwMjAsIGhvdXZlIHVtYSBhbHRhIHZvbGF0aWxpZGFkZSBub3MgY2hvcXVlcyBub21pbmFpcywgZXNwZWNpYWxtZW50ZSBlbnRyZSBtYXLDp28gZSBNYWlvIGRlIDIwMjAuIFBvciBvdXRybyBsYWRvLCBvcyBjaG9xdWVzIHJlYWlzIGFwcmVzZW50YXJhbSBtZW5vciB2b2xhdGlsaWRhZGUsIG1hcyBhaW5kYSBhc3NpbSBmb3JhbSBzaWduaWZpY2F0aXZhbWVudGUgYWZldGFkb3MsIHJlY2ViZW5kbyB1bSBjaG9xdWUgZ3JhbmRlIGVtIGFicmlsLCByZWZsZXRpbmRvIGFqdXN0ZXMgZXN0cnV0dXJhaXMgbmEgZWNvbm9taWEuDQoNCmBgYHtyfQ0KIyBEZWNvbXBvc2nDp8OjbyBkYSB2YXJpw6JuY2lhDQpmZXZkX3Jlc3VsdHMgPC0gZmV2ZChzdmFyX21vZGVsLCBuLmFoZWFkID0gMTApDQpmZXZkX3Jlc3VsdHMNCmBgYA0KDQpBIGRlY29tcG9zacOnw6NvIGRhIHZhcmnDom5jaWEgaW5kaWNhIHF1ZSBhIHRheGEgbm9taW5hbCAobG9nX2UpIGUgYSB0YXhhIHJlYWwgKGxvZ19xKSBzw6NvIHByZWRvbWluYW50ZW1lbnRlIGV4cGxpY2FkYSBwb3Igc2V1cyBwcsOzcHJpb3MgY2hvcXVlcyBubyBjdXJ0byBwcmF6bywgcG9yw6ltIGEgdGF4YSByZWFsIChsb2dfcSkgc29icmUgbWFpb3IgaW5mbHVlbmNpYSBubyBsb25nbyBwcmF6byBwZWxhIHRheGEgbm9taW5hbC4NCg0KIyMjIDQpICgyLDUgcG9udG9zKS4gRXNzYSBxdWVzdMOjbyDDqSBiYXNlYWRhIG5vIGFydGlnbyBkZSBTdG9jayBlIFdhdHNvbiAoMTk5MykuIFV0aWxpemUgbyBhcnF1aXZvIG1weXJfY29pbnRlZ3Jhw6fDo28gcXVlIHBlcm1pdGUgZXN0aW1hciB1bSBtb2RlbG8gZGUgY29pbnRlZ3Jhw6fDo28gcGFyYSBhIGRlbWFuZGEgcG9yIG1vZWRhLiBGYcOnYSBvcyBzZWd1aW50ZXMgZXhlcmPDrWNpb3M6DQoNCmBgYHtyfQ0KbGlicmFyeShyZWFkeGwpDQptcHlyX2RhdGEgPC0gcmVhZF9leGNlbCgiTVBSWV9jb2ludGVncmHDp8Ojby54bHN4IikNCiMgQ3JpYXIgYSB2YXJpw6F2ZWwgbS1wIChkaWZlcmVuw6dhIGVudHJlIGxvZyhNMSkgZSBsb2cocHJlw6dvcykpDQpwbG90KG1weXJfZGF0YSAlPiUgdHMpDQptcHlyX2RhdGEkbXAgPC0gbXB5cl9kYXRhJExNMSAtIG1weXJfZGF0YSRMUA0KDQpgYGANCg0KIyMjIyBhKSBBcGxpcXVlIG8gdGVzdGUgQURGIGNvbSAyIGUgNCBsYWdzLiBWZXJpZmlxdWUgcXVlIGEgaGlww7N0ZXNlIG51bGEgbsOjbyDDqSByZWplaXRhZGEgcGFyYSBhcyB2YXJpw6F2ZWlzIG0tcCAoYSBzZXIgY2FsY3VsYWRhIGNvbW8gYSBkaWZlcmVuw6dhIGVudHJlIG8gbG9nIGRvIE0xIGUgbyBsb2cgZG9zIHByZcOnb3MpLCBSIGUgbG9nIGRlIHkuDQoNCmBgYHtyfQ0KYWRmX21wXzJsYWdzIDwtIHVyLmRmKG1weXJfZGF0YSRtcCwgdHlwZSA9ICJub25lIiwgbGFncyA9IDIpDQphZGZfbXBfNGxhZ3MgPC0gdXIuZGYobXB5cl9kYXRhJG1wLCB0eXBlID0gIm5vbmUiLCBsYWdzID0gNCkNCg0KYWRmX2xvZ195XzJsYWdzIDwtIHVyLmRmKG1weXJfZGF0YSRMWSwgdHlwZSA9ICJub25lIiwgbGFncyA9IDIpDQphZGZfbG9nX3lfNGxhZ3MgPC0gdXIuZGYobXB5cl9kYXRhJExZLCB0eXBlID0gIm5vbmUiLCBsYWdzID0gNCkNCg0KYWRmX1JfMmxhZ3MgPC0gdXIuZGYobXB5cl9kYXRhJFIsIHR5cGUgPSAibm9uZSIsIGxhZ3MgPSAyKQ0KYWRmX1JfNGxhZ3MgPC0gdXIuZGYobXB5cl9kYXRhJFIsIHR5cGUgPSAibm9uZSIsIGxhZ3MgPSA0KQ0KDQojIEV4aWJpciBvcyByZXN1bHRhZG9zIGRvIEFERg0Kc3VtbWFyeShhZGZfbXBfMmxhZ3MpDQpzdW1tYXJ5KGFkZl9tcF80bGFncykNCnN1bW1hcnkoYWRmX2xvZ195XzJsYWdzKQ0Kc3VtbWFyeShhZGZfbG9nX3lfNGxhZ3MpDQpzdW1tYXJ5KGFkZl9SXzJsYWdzKQ0Kc3VtbWFyeShhZGZfUl80bGFncykNCmBgYA0KDQpQYXJhIHRvZGFzIGFzIHZhcmnDoXZlaXMgYW5hbGlzYWRhcy4gbyB0ZXN0ZSBBREYgbsOjbyByZWplaXRhIGEgaGlww7N0ZXNlIG51bGEgZGUgcmFpeiB1bml0w6FyaWEgZW0gYW1ib3Mgb3MgY2Fzb3MgKGNvbSAyIGUgNCBsYWdzKS4gSXNzbyBjb25maXJtYSBxdWUgYXMgc8OpcmllcyBuw6NvIHPDo28gZXN0YWNpb27DoXJpYXMgZW0gbsOtdmVsLg0KDQojIyMjIGIpIENvbmR1emEgdW0gdGVzdGUgZGUgRW5nbGUgR3JhbmdlciBwYXJhIGF2YWxpYXIgYSBjb2ludGVncmHDp8OjbyBlbnRyZSBtLXAgKHNlbXByZSBlbSBsb2cpIGNvbSBsb2dzIGRlIHkgZSBSIChzZW0gbG9nKS4gTyBxdWUgw6kgcG9zc8OtdmVsIGNvbmNsdWlyIGEgcmVzcGVpdG8gZGEgcmVsYcOnw6NvIGVudHJlIGFzIHZhcmnDoXZlaXM/DQoNCmBgYHtyfQ0KWFg8LW1weXJfZGF0YVssNDo1XSAlPiUgYXMubWF0cml4KCkNCmNvaW50LnRlc3QoeSA9IG1weXJfZGF0YSRtcCxYID0gWFgsbmxhZyA9IDQpDQoNCmBgYA0KDQpQZWxvIHRlc3RlIGRlIEVuZ2xlIEdyYW5nZXIgcmVqZWl0YW1vcyBhIGhpcG90ZXNlIG51bGEgZGUgbsOjbyBjb2ludGVncmHDp8Ojby4gSXNzbyBpbmRpY2EgYSBleGlzdMOqbmNpYSBkZSB1bWEgcmVsYcOnw6NvIGRlIGNvaW50ZWdyYcOnw6NvIGVudHJlIGFzIHZhcmlhdmVpcy4NCg0KIyMjIyBjKUFwcmVzZW50ZSBhIGVzdGltYXRpdmEgZW0gRE9MUyBkZXNzZSB2ZXRvciBkZSBjb2ludGVncmHDp8OjbyB1dGlsaXphbmRvIDQgbGVhZHMgZSBsYWdzIHBhcmEgYSBlc3RpbWHDp8Ojby4NCg0KYGBge3J9DQoNCmNvaW50UmVnRCh4ID1YWCx5PW1weXJfZGF0YSRtcCwgbi5sZWFkID0gNCwgbi5sYWcgPSA0LGRlbWVhbmluZz1UKSAtPm1vZGVsY29pbnQNCm1vZGVsY29pbnQgDQojbW9kZWxjb2ludCR2YXJtYXQNCm1vZGVsY29pbnQkcmVzaWR1YWxzICU+JSB0cyhlbmQgPSBtYXgobXB5cl9kYXRhJC4uLjEpKSAlPiUgcGxvdChtYWluPSJSZXNpZHVhbHMgb2YgQ29pbnRlZ3JhdGlvbiBSZWdyZXNzaW9uIChELU9MUykiKQ0KDQpgYGANCg0KT3MgY29lZmljaWVudGVzIGVzdGltYWRvcyBkbyBtb2RlbG8gc8OjbyBlc3RhdGlzdGljYW1lbnRlIHNpZ25pZmljYXRpdm9zIGUgbW9zdHJhbSB1bWEgZWxhc3RpY2lkYWRlIHBvc2l0aXZhIGVudHJlIG1wIGUgbG9neSAoY29lZmljaWVudGUgMC43NTc2NDMsIGluZGljYW5kbyBxdWUgdW0gYXVtZW50byBkZSAxJSBubyBQSUIgbGV2YSBhIHVtIGF1bWVudG8gZGUgYXByb3hpbWFkYW1lbnRlIDAsNzYlIG5hIGRlbWFuZGEgcG9yIG1vZWRhIGFqdXN0YWRhIHBlbG9zIHByZcOnb3MuIEVzc2UgcmVzdWx0YWRvIGVzdMOhIGFsaW5oYWRvIGNvbSBhIHRlb3JpYSBlY29uw7RtaWNhLCBxdWUgcHJldsOqIHVtYSByZWxhw6fDo28gcG9zaXRpdmEgZW50cmUgcmVuZGEgZSBkZW1hbmRhIHBvciBtb2VkYS4gUG9yIG91dHJvIGxhZG8sIGEgcmVsYcOnw6NvIGNvbSBhIHRheGEgZGUganVyb3MgUiDDqSBuZWdhdGl2YSAoY29lZmljaWVudGUg4oiSMC4xMjg4MDEpLCBjb21vIGVzcGVyYWRvLCBqw6EgcXVlIHRheGFzIGRlIGp1cm9zIG1haXMgYWx0YXMgcmVwcmVzZW50YW0gdW0gbWFpb3IgY3VzdG8gZGUgb3BvcnR1bmlkYWRlIGRlIG1hbnRlciBtb2VkYSwgcmVkdXppbmRvIGEgZGVtYW5kYSBwb3IgZWxhLg0KDQojIyMjIGQpIFJlZXN0aW1lIG8gdmV0b3IgZGUgY29pbnRlZ3Jhw6fDo28gZW0gZHVhcyBzdWJhbW9zdHJhcy4gQSBwcmltZWlyYSBwYXJhIDE5MDMtMTk0NSBlIGEgc2VndW5kYSBwYXJhIDE5NDYtMTk4Ny4gTyBxdWUgw6kgcG9zc8OtdmVsIGNvbmNsdWlyIGEgcmVzcGVpdG8gZGEgZWxhc3RpY2lkYWRlIHJlbmRhIGRhIGRlbWFuZGEgcG9yIG1vZWRhPw0KDQpgYGB7cn0NCiMgU3ViYW1vc3RyYSAxOiAxOTAzLTE5NDUNCnN1YnNhbXBsZTEgPC0gc3Vic2V0KG1weXJfZGF0YSwgRFVNTVk9PTApDQpYWDE8LXN1YnNhbXBsZTFbLDQ6NV0gJT4lIGFzLm1hdHJpeCgpDQpjb2ludFJlZ0QoeCA9WFgxLHk9c3Vic2FtcGxlMSRtcCwgbi5sZWFkID0gNCwgbi5sYWcgPSA0LGRlbWVhbmluZz1UKSAtPm1vZGVsY29pbnQxDQptb2RlbGNvaW50MQ0KICBtb2RlbGNvaW50MSRyZXNpZHVhbHMgJT4lIHRzKGVuZCA9IG1heChzdWJzYW1wbGUxJC4uLjEpKSAlPiUgcGxvdChtYWluPSJSZXNpZHVhbHMgb2YgQ29pbnRlZ3JhdGlvbiBSZWdyZXNzaW9uIChELU9MUykiKQ0KDQojIFN1YmFtb3N0cmEgMjogMTk0Ni0xOTg3DQpzdWJzYW1wbGUyIDwtIHN1YnNldChtcHlyX2RhdGEsIERVTU1ZPT0xKQ0KWFgyPC1zdWJzYW1wbGUyWyw0OjVdICU+JSBhcy5tYXRyaXgoKQ0KY29pbnRSZWdEKHggPVhYMix5PXN1YnNhbXBsZTIkbXAsIG4ubGVhZCA9IDQsIG4ubGFnID0gNCxkZW1lYW5pbmc9VCkgLT5tb2RlbGNvaW50Mg0KbW9kZWxjb2ludDINCiAgbW9kZWxjb2ludDIkcmVzaWR1YWxzICU+JSB0cyhlbmQgPSBtYXgoc3Vic2FtcGxlMiQuLi4xKSkgJT4lIHBsb3QobWFpbj0iUmVzaWR1YWxzIG9mIENvaW50ZWdyYXRpb24gUmVncmVzc2lvbiAoRC1PTFMpIikNCg0KYGBgDQoNCk8gbm92byBtb2RlbG8gZW0gcGVyaW9kb3Mgc2VwYXJhZG9zIG1vc3Ryb3UgcmVzaWR1b3MgbWVsaG9yIGNvbXBvcnRhZG9zLiBBIGVsYXN0aWNpZGFkZSByZW5kYSBkYSBkZW1hbmRhIHBvciBtb2VkYSBhdW1lbnRvdSBkZSAwLjU2NCBwYXJhIDAuNzAwIGVudHJlIGFzIGR1YXMgc3ViYW1vc3RyYXMsIG8gcXVlIHBvZGUgaW5kaWNhciBtdWRhbsOnYXMgZXN0cnV0dXJhaXMgbmEgZWNvbm9taWEgYW8gbG9uZ28gZG8gdGVtcG8uIEEgbW9kZXJuaXphw6fDo28gZWNvbsO0bWljYSBlIG8gYXVtZW50byBkbyB1c28gZGUgbW9lZGEgZW0gdHJhbnNhw6fDtWVzIHBvZGVtIHRlciBjb250cmlidcOtZG8gcGFyYSBlc3NhIG1haW9yIHNlbnNpYmlsaWRhZGUgYW8gUElCLkVtIGFtYmFzIGFzIHN1YmFtb3N0cmFzLCBhIGVsYXN0aWNpZGFkZSDDqSBtZW5vciBxdWUgMSwgbyBxdWUgZXN0w6EgZGUgYWNvcmRvIGNvbSBhIHRlb3JpYSBlY29uw7RtaWNhLCBzdWdlcmluZG8gcXVlIGEgZGVtYW5kYSBwb3IgbW9lZGEgYXVtZW50YSBhIHVtYSB0YXhhIG1lbm9yIHF1ZSBhIGRvIGNyZXNjaW1lbnRvIGVjb27DtG1pY28uIGrDoSBhIGVsYXN0aWNpZGFkZSBlbSByZWxhw6fDo28gw6AgdGF4YSBkZSBqdXJvcyBkaW1pbnVpdSBkZSDiiJIwLjEzNiBubyBwZXLDrW9kbyBkZSAxOTAzLTE5NDUgcGFyYSDiiJIwLjA3NyBubyBwZXLDrW9kbyBkZSAxOTQ2LTE5ODcuIElzc28gc3VnZXJlIHF1ZSwgY29tIG8gYXZhbsOnbyBlY29uw7RtaWNvIGUgZmluYW5jZWlybywgYSBzZW5zaWJpbGlkYWRlIGRhIGRlbWFuZGEgcG9yIG1vZWRhIMOgcyBtdWRhbsOnYXMgbmEgdGF4YSBkZSBqdXJvcyBmb2kgcmVkdXppZGEsIHBvc3NpdmVsbWVudGUgZGV2aWRvIMOgIG1haW9yIGRpdmVyc2lmaWNhw6fDo28gZG9zIGluc3RydW1lbnRvcyBmaW5hbmNlaXJvcyBkaXNwb27DrXZlaXMgZSBtdWRhbsOnYXMgbm9zIGjDoWJpdG9zIGRlIGxpcXVpZGV6IGRhIGVjb25vbWlhLg0K