Ăndice de ProducciĂłn Industrial
Apartado 1
Divide las muestras de la tarea anterior en la muestra de estimaciĂłn y la muestra de predicciĂłn.
Calcula las predicciones con los modelos ARIMA y obtén las medidas de ajuste de la predicción.
Tenemos 116 observaciones para el indice de producciĂłn industrial, por lo que usaremos 92 observaciones de training y 24 de test.
EstimaciĂłn de modelos
Series: Y
ARIMA(0,1,4)
Coefficients:
ma1 ma2 ma3 ma4
0.4826 0.3680 0.1529 -0.3053
s.e. 0.1015 0.1176 0.1122 0.1012
sigma^2 estimated as 0.0001636: log likelihood=269.01
AIC=-528.02 AICc=-527.32 BIC=-515.47
Series: Y
ARIMA(1,1,3)
Coefficients:
ar1 ma1 ma2 ma3
-0.4653 1.0212 0.7218 0.4795
s.e. 0.1915 0.1592 0.1473 0.1224
sigma^2 estimated as 0.0001706: log likelihood=267.23
AIC=-524.46 AICc=-523.76 BIC=-511.91
Testing set


Medidas de ajuste de la predicciĂłn
ME RMSE MAE MPE MAPE
MA(4) 0.06435959 0.06879345 0.06435959 5.950505 5.950505
ARMA(1,3) 0.06208330 0.06655213 0.06208330 5.738906 5.738906
A priori parece que el modelo ARMA(1,3) hace mejores predicciones ya que su MAE, RMASE y MAPE son mĂĄs bajos, en el siguiente apartado se realizan los contrastes.
Apartado 2
Realiza los contrastes de potencia de predicciĂłn.
Morgan-Granger-Newbold Test
t test of coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.0441369 0.0070602 6.2515 2.721e-06 ***
vx 36.1579083 8.1236391 4.4509 0.0002005 ***
---
Signif. codes: 0 â***â 0.001 â**â 0.01 â*â 0.05 â.â 0.1 â â 1
Breusch-Godfrey test for serial correlation of order up to 4
data: mgnreg
LM test = 19.197, df = 4, p-value = 0.0007189
studentized Breusch-Pagan test
data: mgnreg
BP = 2.9431, df = 1, p-value = 0.08625
Vemos como el coeficiente \(\beta\) es igual a 0 y por tanto no rechazamos la hipĂłtesis nula de que ambos modelos tienen la misma potencia de predicciĂłn.
Diebold-Mariano Test
Diebold-Mariano Test
data: e1e2
DM = 11.996, Forecast horizon = 1, Loss function power = 2, p-value = 2.224e-11
alternative hypothesis: two.sided
Diebold-Mariano Test
data: e1e2
DM = 11.996, Forecast horizon = 1, Loss function power = 2, p-value = 1.112e-11
alternative hypothesis: greater
Diebold-Mariano Test
data: e1e2
DM = 11.996, Forecast horizon = 1, Loss function power = 2, p-value = 1
alternative hypothesis: less
No rechazamos la hipĂłtesis nula de que las potencias de predicciĂłn son iguales, y tampoco que ningĂșn modelo es mejor que el otro.
El modelo ARMA(1,3) es igual de preciso que el modelo MA(4).
Apartado 3
Realiza combinaciones de las predicciones.
Pesos iguales
X <- diff(X)
Y <- diff(Y)
m1 <- Arima(Y, c(0,0,4), include.mean=F)
m2 <- Arima(Y, c(1,0,3), include.mean=F)
m1.f <- forecast.Arima(m1, h=24, fan=T)
m2.f <- forecast.Arima(m2, h=24, fan=T)
m1.pred <- xts(m1.f$mean, index(X)[93:116])
m2.pred <- xts(m2.f$mean, index(X)[93:116])
p1 <- as.zoo(m1.pred)
p2 <- as.zoo(m2.pred)
YZ <- as.zoo(X[93:116])
pew <- (1/2)*(p1+p2)
Basados en regresiĂłn
Modelo sin restricciĂłnes
Time series regression with "zoo" data:
Start = 2011-01-01, End = 2016-10-01
Call:
dynlm(formula = YZ ~ p1 + p2)
Residuals:
Min 1Q Median 3Q Max
-0.0100223 -0.0036489 -0.0000221 0.0040239 0.0114820
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.003322 0.001305 2.546 0.0188 *
p1 -2.732024 3.101730 -0.881 0.3884
p2 4.521504 4.748141 0.952 0.3518
---
Signif. codes: 0 â***â 0.001 â**â 0.01 â*â 0.05 â.â 0.1 â â 1
Residual standard error: 0.006178 on 21 degrees of freedom
Multiple R-squared: 0.04169, Adjusted R-squared: -0.04957
F-statistic: 0.4568 on 2 and 21 DF, p-value: 0.6394
Modelo parcialmente restringido
Time series regression with "zoo" data:
Start = 2011-01-01, End = 2016-10-01
Call:
dynlm(formula = YZ ~ 0 + p1 + p2)
Residuals:
Min 1Q Median 3Q Max
-0.0067000 -0.0002943 0.0032270 0.0075054 0.0157646
Coefficients:
Estimate Std. Error t value Pr(>|t|)
p1 -4.754 3.351 -1.419 0.170
p2 7.532 5.140 1.465 0.157
Residual standard error: 0.006905 on 22 degrees of freedom
Multiple R-squared: 0.08924, Adjusted R-squared: 0.00644
F-statistic: 1.078 on 2 and 22 DF, p-value: 0.3577
Modelo restringido
Time series regression with "zoo" data:
Start = 2011-01-01, End = 2016-10-01
Call:
dynlm(formula = YZstar ~ 0 + X1star)
Residuals:
Min 1Q Median 3Q Max
-0.0067000 -0.0003329 0.0033002 0.0072584 0.0152754
Coefficients:
Estimate Std. Error t value Pr(>|t|)
X1star 3.930 2.429 1.618 0.119
Residual standard error: 0.00685 on 23 degrees of freedom
Multiple R-squared: 0.1022, Adjusted R-squared: 0.06318
F-statistic: 2.619 on 1 and 23 DF, p-value: 0.1193
Comparaciones de las combinaciones
MAE:
IPI.ereqw IPI.ercreg1 IPI.ercreg2 IPI.ercreg3
0.005933532 0.004704732 0.005375359 0.005580605
En este caso son mejor las predicciones con el modelo sin restringir y con constante (Reg. 1).
Apartado 4
Realiza predicciones fuera de la muestra.
EstimaciĂłn de los modelos con toda la muestra:
Series: Y
ARIMA(0,0,4) with zero mean
Coefficients:
ma1 ma2 ma3 ma4
0.4861 0.3866 0.1698 -0.2917
s.e. 0.0899 0.1034 0.0979 0.0900
sigma^2 estimated as 0.0001347: log likelihood=350.75
AIC=-691.5 AICc=-690.95 BIC=-677.78
Series: Y
ARIMA(1,0,3) with zero mean
Coefficients:
ar1 ma1 ma2 ma3
-0.4688 1.0181 0.7341 0.4931
s.e. 0.1724 0.1429 0.1233 0.1040
sigma^2 estimated as 0.0001394: log likelihood=348.86
AIC=-687.73 AICc=-687.18 BIC=-674
Predicciones 8 pasos por delante:


Combinaciones
Tipo de interés a largo plazo
Apartado 1
Divide las muestras de la tarea anterior en la muestra de estimaciĂłn y la muestra de predicciĂłn.
Calcula las predicciones con los modelos ARIMA y obtén las medidas de ajuste de la predicción.
Tenemos 183 observaciones para el tipo de interés a largo plazo, por lo que usaremos 147 observaciones de training y 36 de test.
EstimaciĂłn de modelos
Series: Y
ARIMA(3,1,1)
Coefficients:
ar1 ar2 ar3 ma1
-0.418 -0.054 0.232 0.502
s.e. 0.165 0.088 0.089 0.157
sigma^2 estimated as 0.00297: log likelihood=219.49
AIC=-428.99 AICc=-428.56 BIC=-414.07
Series: Y
ARIMA(3,1,0)
Coefficients:
ar1 ar2 ar3
0.039 -0.066 0.244
s.e. 0.080 0.081 0.082
sigma^2 estimated as 0.00304: log likelihood=217.24
AIC=-426.49 AICc=-426.2 BIC=-414.55
Testing set


Medidas de ajuste de la predicciĂłn
ME RMSE MAE MPE MAPE
ARMA(3,1) 0.077158 0.25015 0.17467 3.0924 11.501
AR(3) 0.074749 0.24945 0.17489 2.9126 11.540
Apartado 2
Realiza los contrastes de potencia de predicciĂłn.
Morgan-Granger-Newbold Test
t test of coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.238 0.113 2.11 0.042 *
vx -35.663 1.199 -29.74 <2e-16 ***
---
Signif. codes: 0 â***â 0.001 â**â 0.01 â*â 0.05 â.â 0.1 â â 1
Breusch-Godfrey test for serial correlation of order up to 4
data: mgnreg
LM test = 34.3, df = 4, p-value = 6.6e-07
studentized Breusch-Pagan test
data: mgnreg
BP = 0.0165, df = 1, p-value = 0.9
Vemos como el coeficiente \(\beta\) es claramente distinto de 0 y por tanto rechazamos la hipĂłtesis nula de que ambos modelos tienen la misma potencia de predicciĂłn.
Diebold-Mariano Test
Diebold-Mariano Test
data: e1e2
DM = 1.75, Forecast horizon = 1, Loss function power = 2, p-value = 0.089
alternative hypothesis: two.sided
Diebold-Mariano Test
data: e1e2
DM = 1.75, Forecast horizon = 1, Loss function power = 2, p-value = 0.044
alternative hypothesis: greater
Diebold-Mariano Test
data: e1e2
DM = 1.75, Forecast horizon = 1, Loss function power = 2, p-value = 0.96
alternative hypothesis: less
No rechazamos la hipĂłtesis nula de que las potencias de predicciĂłn son iguales, aunque el p-valor asociado a las dos colas es 0,089 y se queda muy cerca del 0.05 de nivel de significaciĂłn.
Si nos fijamos solamente en una cola tenemos que el modelo ARMA(3,1) es mĂĄs preciso que el AR(3) con un p-valor de 0,044.
Apartado 3
Realiza combinaciones de las predicciones.
Pesos iguales
X <- diff(X)
Y <- diff(Y)
m1 <- Arima(Y, c(3,0,1), include.mean=F)
m2 <- Arima(Y, c(3,0,0), include.mean=F)
m1.f <- forecast.Arima(m1, h=36, fan=T)
m2.f <- forecast.Arima(m2, h=36, fan=T)
m1.pred <- xts(m1.f$mean, index(X)[148:183])
m2.pred <- xts(m2.f$mean, index(X)[148:183])
p1 <- as.zoo(m1.pred)
p2 <- as.zoo(m2.pred)
YZ <- as.zoo(X[148:183])
pew <- (1/2)*(p1+p2)
Basados en regresiĂłn
Modelo sin restricciĂłnes
Time series regression with "zoo" data:
Start = 2014-04-01, End = 2017-03-01
Call:
dynlm(formula = YZ ~ p1 + p2)
Residuals:
Min 1Q Median 3Q Max
-0.1108 -0.0243 -0.0121 0.0224 0.1385
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.01804 0.00912 1.98 0.056 .
p1 9.47844 7.86617 1.20 0.237
p2 -6.47946 10.63232 -0.61 0.546
---
Signif. codes: 0 â***â 0.001 â**â 0.01 â*â 0.05 â.â 0.1 â â 1
Residual standard error: 0.0546 on 33 degrees of freedom
Multiple R-squared: 0.0754, Adjusted R-squared: 0.0194
F-statistic: 1.35 on 2 and 33 DF, p-value: 0.274
Modelo parcialmente restringido
Time series regression with "zoo" data:
Start = 2014-04-01, End = 2017-03-01
Call:
dynlm(formula = YZ ~ 0 + p1 + p2)
Residuals:
Min 1Q Median 3Q Max
-0.09467 -0.00680 0.00584 0.04043 0.15657
Coefficients:
Estimate Std. Error t value Pr(>|t|)
p1 8.45 8.18 1.03 0.31
p2 -5.02 11.05 -0.45 0.65
Residual standard error: 0.0569 on 34 degrees of freedom
Multiple R-squared: 0.0633, Adjusted R-squared: 0.00823
F-statistic: 1.15 on 2 and 34 DF, p-value: 0.329
Modelo restringido
Time series regression with "zoo" data:
Start = 2014-04-01, End = 2017-03-01
Call:
dynlm(formula = YZstar ~ 0 + X1star)
Residuals:
Min 1Q Median 3Q Max
-0.10329 -0.00632 0.00658 0.04044 0.15657
Coefficients:
Estimate Std. Error t value Pr(>|t|)
X1star -8.83 7.57 -1.17 0.25
Residual standard error: 0.0562 on 35 degrees of freedom
Multiple R-squared: 0.0374, Adjusted R-squared: 0.00992
F-statistic: 1.36 on 1 and 35 DF, p-value: 0.251
Comparaciones de las combinaciones
MAE:
IPI.ereqw IPI.ercreg1 IPI.ercreg2 IPI.ercreg3
0.036633 0.038316 0.037691 0.037295
En este caso resultan mucho mejor las predicciones combinando con la misma ponderaciĂłn.
Apartado 4
Realiza predicciones fuera de la muestra.
EstimaciĂłn de los modelos con toda la muestra:
Series: Y
ARIMA(3,0,1) with zero mean
Coefficients:
ar1 ar2 ar3 ma1
-0.327 0.026 0.223 0.388
s.e. 0.208 0.077 0.075 0.207
sigma^2 estimated as 0.00308: log likelihood=269.8
AIC=-529.59 AICc=-529.25 BIC=-513.57
Series: Y
ARIMA(3,0,0) with zero mean
Coefficients:
ar1 ar2 ar3
0.040 0.010 0.214
s.e. 0.072 0.073 0.074
sigma^2 estimated as 0.0031: log likelihood=268.87
AIC=-529.74 AICc=-529.51 BIC=-516.92
Predicciones 12 pasos por delante:


Combinaciones
Tipo de interés a medio plazo
Apartado 1
Divide las muestras de la tarea anterior en la muestra de estimaciĂłn y la muestra de predicciĂłn.
Calcula las predicciones con los modelos ARIMA y obtén las medidas de ajuste de la predicción.
Tenemos 183 observaciones para el tipo de interés a medio plazo, por lo que usaremos 147 observaciones de training y 36 de test.
EstimaciĂłn de modelos
Series: Y
ARIMA(1,1,0)
Coefficients:
ar1
0.278
s.e. 0.080
sigma^2 estimated as 0.00244: log likelihood=232.44
AIC=-460.88 AICc=-460.8 BIC=-454.91
Series: Y
ARIMA(0,1,1)
Coefficients:
ma1
0.279
s.e. 0.079
sigma^2 estimated as 0.00244: log likelihood=232.31
AIC=-460.62 AICc=-460.53 BIC=-454.65
Testing set


Medidas de ajuste de la predicciĂłn
ME RMSE MAE MPE MAPE
AR(1) 0.030628 0.22552 0.17602 -0.0309838 12.037
MA(1) 0.030910 0.22556 0.17596 -0.0099777 12.030
Apartado 2
Realiza los contrastes de potencia de predicciĂłn.
Morgan-Granger-Newbold Test
t test of coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.0450 0.0655 -0.69 0.50
vx -378.8491 919.7852 -0.41 0.68
Breusch-Godfrey test for serial correlation of order up to 24
data: mgnreg
LM test = 35.7, df = 24, p-value = 0.059
studentized Breusch-Pagan test
data: mgnreg
BP = 0.836, df = 1, p-value = 0.36
En este caso el coeficiente \(\beta\) es igual 0, no rechazamos la hipĂłtesis nula y por tanto ambos modelos tienen la misma potencia de predicciĂłn.
Los modelos AR(1) y MA(1) tienen la misma potencia.
Diebold-Mariano Test
Diebold-Mariano Test
data: e1e2
DM = -0.824, Forecast horizon = 1, Loss function power = 2, p-value = 0.42
alternative hypothesis: two.sided
Diebold-Mariano Test
data: e1e2
DM = -0.824, Forecast horizon = 1, Loss function power = 2, p-value = 0.79
alternative hypothesis: greater
Diebold-Mariano Test
data: e1e2
DM = -0.824, Forecast horizon = 1, Loss function power = 2, p-value = 0.21
alternative hypothesis: less
Rechazamos la hipĂłtesis nula de que las potencias de predicciĂłn son iguales.
Confirmamos los resultados obtenidos en el test anterior, el AR(1) es igual de preciso que el MA(1).
Apartado 3
Realiza combinaciones de las predicciones.
Pesos iguales
X <- diff(X)
Y <- diff(Y)
m1 <- Arima(Y, c(1,0,0), include.mean=F)
m2 <- Arima(Y, c(0,0,1), include.mean=F)
m1.f <- forecast.Arima(m1, h=36, fan=T)
m2.f <- forecast.Arima(m2, h=36, fan=T)
m1.pred <- xts(m1.f$mean, index(X)[148:183])
m2.pred <- xts(m2.f$mean, index(X)[148:183])
p1 <- as.zoo(m1.pred)
p2 <- as.zoo(m2.pred)
YZ <- as.zoo(X[148:183])
pew <- (1/2)*(p1+p2)
Basados en regresiĂłn
Modelo sin restricciĂłnes
Time series regression with "zoo" data:
Start = 2014-04-01, End = 2017-03-01
Call:
dynlm(formula = YZ ~ p1 + p2)
Residuals:
Min 1Q Median 3Q Max
-0.1091 -0.0185 -0.0123 0.0182 0.0831
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.85e-02 6.62e-03 2.79 0.0086 **
p1 -2.50e+02 1.85e+02 -1.35 0.1853
p2 2.28e+02 1.93e+02 1.18 0.2460
---
Signif. codes: 0 â***â 0.001 â**â 0.01 â*â 0.05 â.â 0.1 â â 1
Residual standard error: 0.0382 on 33 degrees of freedom
Multiple R-squared: 0.0575, Adjusted R-squared: 0.000333
F-statistic: 1.01 on 2 and 33 DF, p-value: 0.377
Modelo parcialmente restringido
Time series regression with "zoo" data:
Start = 2014-04-01, End = 2017-03-01
Call:
dynlm(formula = YZ ~ 0 + p1 + p2)
Residuals:
Min 1Q Median 3Q Max
-0.09719 0.00000 0.00543 0.03232 0.10155
Coefficients:
Estimate Std. Error t value Pr(>|t|)
p1 -134 197 -0.68 0.50
p2 136 208 0.65 0.52
Residual standard error: 0.0418 on 34 degrees of freedom
Multiple R-squared: 0.0134, Adjusted R-squared: -0.0447
F-statistic: 0.231 on 2 and 34 DF, p-value: 0.795
Modelo restringido
Time series regression with "zoo" data:
Start = 2014-04-01, End = 2017-03-01
Call:
dynlm(formula = YZstar ~ 0 + X1star)
Residuals:
Min 1Q Median 3Q Max
-0.09720 0.00001 0.00543 0.03232 0.10155
Coefficients:
Estimate Std. Error t value Pr(>|t|)
X1star 135 194 0.69 0.49
Residual standard error: 0.0412 on 35 degrees of freedom
Multiple R-squared: 0.0136, Adjusted R-squared: -0.0146
F-statistic: 0.482 on 1 and 35 DF, p-value: 0.492
Comparaciones de las combinaciones
MAE:
IPI.ereqw IPI.ercreg1 IPI.ercreg2 IPI.ercreg3
0.025157 0.027277 0.025640 0.025657
En este caso resultan mejor las predicciones con pesos iguales.
Apartado 4
Realiza predicciones fuera de la muestra.
EstimaciĂłn de los modelos con toda la muestra:
Series: Y
ARIMA(1,0,0) with zero mean
Coefficients:
ar1
0.316
s.e. 0.071
sigma^2 estimated as 0.00221: log likelihood=298.74
AIC=-593.49 AICc=-593.42 BIC=-587.08
Series: Y
ARIMA(0,0,1) with zero mean
Coefficients:
ma1
0.307
s.e. 0.069
sigma^2 estimated as 0.00222: log likelihood=298.18
AIC=-592.36 AICc=-592.29 BIC=-585.95
Predicciones 12 pasos por delante:


Combinaciones
Tipo de interés a corto plazo
Apartado 1
Divide las muestras de la tarea anterior en la muestra de estimaciĂłn y la muestra de predicciĂłn.
Calcula las predicciones con los modelos ARIMA y obtén las medidas de ajuste de la predicción.
Tenemos 183 observaciones para el tipo de interés a corto plazo, por lo que usaremos 147 observaciones de training y 36 de test.
EstimaciĂłn de modelos
Series: Y
ARIMA(3,1,2)
Coefficients:
ar1 ar2 ar3 ma1 ma2
0.781 -1.105 0.506 -0.426 1.000
s.e. 0.072 0.034 0.074 0.020 0.038
sigma^2 estimated as 0.00183: log likelihood=251.75
AIC=-491.5 AICc=-490.89 BIC=-473.59
Series: Y
ARIMA(1,1,0)
Coefficients:
ar1
0.376
s.e. 0.077
sigma^2 estimated as 0.00213: log likelihood=242.19
AIC=-480.38 AICc=-480.3 BIC=-474.41
Testing set


Medidas de ajuste de la predicciĂłn
ME RMSE MAE MPE MAPE
ARMA(3,2) 0.017104 0.16754 0.12742 -0.91091 13.150
AR(1) -0.007070 0.16667 0.13251 -3.64492 14.079
Apartado 2
Realiza los contrastes de potencia de predicciĂłn.
Morgan-Granger-Newbold Test
t test of coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.0284 0.1313 -0.22 0.830
vx 1.5910 0.7608 2.09 0.044 *
---
Signif. codes: 0 â***â 0.001 â**â 0.01 â*â 0.05 â.â 0.1 â â 1
Breusch-Godfrey test for serial correlation of order up to 24
data: mgnreg
LM test = 35.8, df = 24, p-value = 0.058
studentized Breusch-Pagan test
data: mgnreg
BP = 0.000217, df = 1, p-value = 0.99
En este caso el coeficiente \(\beta\) es distinto de 0, con un p-valor de 0.044 rechazamos la hipĂłtesis nula y por tanto los modelos tienen distinta potencia de predicciĂłn.
En este caso los modelos ARMA(3,2) y AR(1) tienen distinta potencia.
Diebold-Mariano Test
Diebold-Mariano Test
data: e1e2
DM = 0.211, Forecast horizon = 1, Loss function power = 2, p-value = 0.83
alternative hypothesis: two.sided
Diebold-Mariano Test
data: e1e2
DM = 0.211, Forecast horizon = 1, Loss function power = 2, p-value = 0.42
alternative hypothesis: greater
Diebold-Mariano Test
data: e1e2
DM = 0.211, Forecast horizon = 1, Loss function power = 2, p-value = 0.58
alternative hypothesis: less
Rechazamos la hipĂłtesis nula de que las potencias de predicciĂłn son iguales.
En este caso los resultados obtenidos son contrarios al test anterior, el ARMA(3,2) es igual de preciso que el AR(1).
El nivel de significaciĂłn del test anterior se encontraba muy al lĂmite de no rechazar la hipĂłtesis nula y por tanto haremos caso al test de Diebold-Mariano.
Apartado 3
Realiza combinaciones de las predicciones.
Pesos iguales
X <- diff(X)
Y <- diff(Y)
m1 <- Arima(Y, c(3,0,2), include.mean=F)
m2 <- Arima(Y, c(1,0,0), include.mean=F)
m1.f <- forecast.Arima(m1, h=36, fan=T)
m2.f <- forecast.Arima(m2, h=36, fan=T)
m1.pred <- xts(m1.f$mean, index(X)[148:183])
m2.pred <- xts(m2.f$mean, index(X)[148:183])
p1 <- as.zoo(m1.pred)
p2 <- as.zoo(m2.pred)
YZ <- as.zoo(X[148:183])
pew <- (1/2)*(p1+p2)
Basados en regresiĂłn
Modelo sin restricciĂłnes
Time series regression with "zoo" data:
Start = 2014-04-01, End = 2017-03-01
Call:
dynlm(formula = YZ ~ p1 + p2)
Residuals:
Min 1Q Median 3Q Max
-0.06672 -0.01875 -0.00078 0.02089 0.08794
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.01285 0.00568 2.26 0.03 *
p1 -0.94283 0.75854 -1.24 0.22
p2 4.14293 3.72113 1.11 0.27
---
Signif. codes: 0 â***â 0.001 â**â 0.01 â*â 0.05 â.â 0.1 â â 1
Residual standard error: 0.033 on 33 degrees of freedom
Multiple R-squared: 0.0518, Adjusted R-squared: -0.00566
F-statistic: 0.902 on 2 and 33 DF, p-value: 0.416
Modelo parcialmente restringido
Time series regression with "zoo" data:
Start = 2014-04-01, End = 2017-03-01
Call:
dynlm(formula = YZ ~ 0 + p1 + p2)
Residuals:
Min 1Q Median 3Q Max
-0.05484 -0.00586 0.01024 0.03374 0.10076
Coefficients:
Estimate Std. Error t value Pr(>|t|)
p1 -0.939 0.803 -1.17 0.25
p2 2.401 3.855 0.62 0.54
Residual standard error: 0.035 on 34 degrees of freedom
Multiple R-squared: 0.0387, Adjusted R-squared: -0.0178
F-statistic: 0.684 on 2 and 34 DF, p-value: 0.511
Modelo restringido
Time series regression with "zoo" data:
Start = 2014-04-01, End = 2017-03-01
Call:
dynlm(formula = YZstar ~ 0 + X1star)
Residuals:
Min 1Q Median 3Q Max
-0.05537 -0.00544 0.01050 0.03366 0.10041
Coefficients:
Estimate Std. Error t value Pr(>|t|)
X1star 1.896 0.726 2.61 0.013 *
---
Signif. codes: 0 â***â 0.001 â**â 0.01 â*â 0.05 â.â 0.1 â â 1
Residual standard error: 0.0345 on 35 degrees of freedom
Multiple R-squared: 0.163, Adjusted R-squared: 0.139
F-statistic: 6.83 on 1 and 35 DF, p-value: 0.0131
Comparaciones de las combinaciones
MAE:
IPI.ereqw IPI.ercreg1 IPI.ercreg2 IPI.ercreg3
0.029439 0.024777 0.026131 0.026159
En este caso resultan mejor las predicciones con la combinacion sin restricciones y constante (Reg. 1).
Apartado 4
Realiza predicciones fuera de la muestra.
EstimaciĂłn de los modelos con toda la muestra:
Series: Y
ARIMA(3,0,2) with zero mean
Coefficients:
ar1 ar2 ar3 ma1 ma2
0.785 -1.097 0.523 -0.383 0.921
s.e. 0.119 0.049 0.067 0.137 0.067
sigma^2 estimated as 0.00169: log likelihood=323.64
AIC=-635.29 AICc=-634.81 BIC=-616.06
Series: Y
ARIMA(1,0,0) with zero mean
Coefficients:
ar1
0.404
s.e. 0.068
sigma^2 estimated as 0.00187: log likelihood=313.86
AIC=-623.73 AICc=-623.66 BIC=-617.32
Predicciones 12 pasos por delante:


Combinaciones
Diferencial de tipo de interes a largo plazo
Apartado 1
Divide las muestras de la tarea anterior en la muestra de estimaciĂłn y la muestra de predicciĂłn.
Calcula las predicciones con los modelos ARIMA y obtén las medidas de ajuste de la predicción.
Tenemos 183 observaciones para el diferencial del tipo de interés a largo plazo, por lo que usaremos 147 observaciones de training y 36 de test.
EstimaciĂłn de modelos
Series: Y
ARIMA(1,1,1)
Coefficients:
ar1 ma1
0.690 -0.890
s.e. 0.092 0.051
sigma^2 estimated as 0.0193: log likelihood=81.94
AIC=-157.88 AICc=-157.71 BIC=-148.93
Series: Y
ARIMA(3,1,0)
Coefficients:
ar1 ar2 ar3
-0.091 -0.198 0.135
s.e. 0.082 0.082 0.083
sigma^2 estimated as 0.0194: log likelihood=81.97
AIC=-155.94 AICc=-155.66 BIC=-144.01
Testing set


Medidas de ajuste de la predicciĂłn
ME RMSE MAE MPE MAPE
ARMA(1,1) 0.27841 0.50926 0.41640 58.921 126.03
AR(3) 0.22587 0.47958 0.39189 41.892 146.00
Apartado 2
Realiza los contrastes de potencia de predicciĂłn.
Morgan-Granger-Newbold Test
t test of coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -2.025 0.426 -4.75 3.6e-05 ***
vx 48.154 11.514 4.18 0.00019 ***
---
Signif. codes: 0 â***â 0.001 â**â 0.01 â*â 0.05 â.â 0.1 â â 1
Breusch-Godfrey test for serial correlation of order up to 4
data: mgnreg
LM test = 25.4, df = 4, p-value = 4.1e-05
studentized Breusch-Pagan test
data: mgnreg
BP = 4.68, df = 1, p-value = 0.031
En este caso el coeficiente \(\beta\) es distinto de 0, con un p-valor de 0.00019 rechazamos la hipĂłtesis nula y por tanto los modelos tienen distinta potencia de predicciĂłn.
En este caso los modelos ARMA(1,1) y AR(3) tienen distinta potencia.
Diebold-Mariano Test
Diebold-Mariano Test
data: e1e2
DM = 3.86, Forecast horizon = 1, Loss function power = 2, p-value = 0.00046
alternative hypothesis: two.sided
Diebold-Mariano Test
data: e1e2
DM = 3.86, Forecast horizon = 1, Loss function power = 2, p-value = 0.00023
alternative hypothesis: greater
Diebold-Mariano Test
data: e1e2
DM = 3.86, Forecast horizon = 1, Loss function power = 2, p-value = 1
alternative hypothesis: less
Rechazamos la hipĂłtesis nula de que las potencias de predicciĂłn son iguales.
En este caso el modelo ARMA(1,1) se ajusta mejor que el modelo AR(3)
Apartado 3
Realiza combinaciones de las predicciones.
Pesos iguales
X <- diff(X)
Y <- diff(Y)
m1 <- Arima(Y, c(1,0,1), include.mean=F)
m2 <- Arima(Y, c(3,0,0), include.mean=F)
m1.f <- forecast.Arima(m1, h=36, fan=T)
m2.f <- forecast.Arima(m2, h=36, fan=T)
m1.pred <- xts(m1.f$mean, index(X)[148:183])
m2.pred <- xts(m2.f$mean, index(X)[148:183])
p1 <- as.zoo(m1.pred)
p2 <- as.zoo(m2.pred)
YZ <- as.zoo(X[148:183])
pew <- (1/2)*(p1+p2)
Basados en regresiĂłn
Modelo sin restricciĂłnes
Time series regression with "zoo" data:
Start = 2014-04-01, End = 2017-03-01
Call:
dynlm(formula = YZ ~ p1 + p2)
Residuals:
Min 1Q Median 3Q Max
-0.4106 -0.0858 -0.0180 0.0939 0.2657
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.0460 0.0257 1.79 0.083 .
p1 16.9268 8.3473 2.03 0.051 .
p2 8.6149 9.4460 0.91 0.368
---
Signif. codes: 0 â***â 0.001 â**â 0.01 â*â 0.05 â.â 0.1 â â 1
Residual standard error: 0.142 on 33 degrees of freedom
Multiple R-squared: 0.112, Adjusted R-squared: 0.0585
F-statistic: 2.09 on 2 and 33 DF, p-value: 0.14
Modelo parcialmente restringido
Time series regression with "zoo" data:
Start = 2014-04-01, End = 2017-03-01
Call:
dynlm(formula = YZ ~ 0 + p1 + p2)
Residuals:
Min 1Q Median 3Q Max
-0.4060 -0.0405 0.0257 0.1339 0.3104
Coefficients:
Estimate Std. Error t value Pr(>|t|)
p1 11.26 7.97 1.41 0.17
p2 7.97 9.74 0.82 0.42
Residual standard error: 0.147 on 34 degrees of freedom
Multiple R-squared: 0.0588, Adjusted R-squared: 0.00342
F-statistic: 1.06 on 2 and 34 DF, p-value: 0.357
Modelo restringido
Time series regression with "zoo" data:
Start = 2014-04-01, End = 2017-03-01
Call:
dynlm(formula = YZstar ~ 0 + X1star)
Residuals:
Min 1Q Median 3Q Max
-0.5092 -0.0373 0.0213 0.1202 0.3091
Coefficients:
Estimate Std. Error t value Pr(>|t|)
X1star -2.50 5.05 -0.49 0.62
Residual standard error: 0.148 on 35 degrees of freedom
Multiple R-squared: 0.00693, Adjusted R-squared: -0.0214
F-statistic: 0.244 on 1 and 35 DF, p-value: 0.624
Comparaciones de las combinaciones
MAE:
IPI.ereqw IPI.ercreg1 IPI.ercreg2 IPI.ercreg3
0.10264 0.10686 0.10669 0.10163
En este caso resultan mejor las predicciones con la regresion restringida (Reg. 3).
Apartado 4
Realiza predicciones fuera de la muestra.
EstimaciĂłn de los modelos con toda la muestra:
Series: Y
ARIMA(1,0,1) with zero mean
Coefficients:
ar1 ma1
0.676 -0.825
s.e. 0.131 0.098
sigma^2 estimated as 0.0201: log likelihood=98.16
AIC=-190.32 AICc=-190.18 BIC=-180.7
Series: Y
ARIMA(3,0,0) with zero mean
Coefficients:
ar1 ar2 ar3
-0.100 -0.142 0.102
s.e. 0.074 0.075 0.075
sigma^2 estimated as 0.0202: log likelihood=98.54
AIC=-189.07 AICc=-188.84 BIC=-176.25
Predicciones 12 pasos por delante:


Combinaciones
LS0tDQp0aXRsZTogIkVqZXJjaWNpb3MgZGUgbW9kZWxvcyBBUklNQSAyIg0KYXV0aG9yOiAiQXJ0aWVsIFBhbG9tYXIgQ29sbCINCmRhdGU6ICIxMi8wNS8yMDE3Ig0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIHRvYzogeWVzDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCi0tLQ0KDQpgYGB7ciBsZWN0dXJhIGRlIHNlcmllcywgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkocXVhbnRtb2QpDQpsaWJyYXJ5KGZvcmVjYXN0KQ0KbGlicmFyeShkeWdyYXBocykNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkodHNvdXRsaWVycykNCmxpYnJhcnkoem9vKQ0KbGlicmFyeShkeW5sbSkNCmxpYnJhcnkobG10ZXN0KQ0KbGlicmFyeShzYW5kd2ljaCkNCmxpYnJhcnkocGxvdGx5KQ0KDQpnZXRTeW1ib2xzKCJQUklOVE8wMk1YUTY2MVMiLCBzcmM9IkZSRUQiKQ0KZ2V0U3ltYm9scygiSVJMVFNUMDFNWE0xNTZOIiwgc3JjPSJGUkVEIikNCmdldFN5bWJvbHMoIklSM1RJQjAxTVhNMTU2TiIsIHNyYz0iRlJFRCIpDQpnZXRTeW1ib2xzKCJJUlNUQ0kwMU1YTTE1Nk4iLCBzcmM9IkZSRUQiKQ0KDQpteCA8LSBQUklOVE8wMk1YUTY2MVNbJzE5ODgtMDEtMDEvJ10gI0luZHVzdHJpYWwgUHJvZHVjdGlvbiBJbmRleCBNZXhpY28NCmx0IDwtIElSTFRTVDAxTVhNMTU2TlsnMjAwMi0wMS0wMS8nXSAjTG9uZyB0ZXJtIA0KbXQgPC0gSVIzVElCMDFNWE0xNTZOWycyMDAyLTAxLTAxLyddICNNZWRpdW0gdGVybQ0Kc3QgPC0gSVJTVENJMDFNWE0xNTZOWycyMDAyLTAxLTAxLyddICNTaG9ydCB0ZXJtDQpkbHQgPC0gbHQtc3QNCmRtdCA8LSBtdC1zdA0KYGBgDQoNCiPDjW5kaWNlIGRlIFByb2R1Y2Npw7NuIEluZHVzdHJpYWwNCg0KIyNBcGFydGFkbyAxDQoNCkRpdmlkZSBsYXMgbXVlc3RyYXMgZGUgbGEgdGFyZWEgYW50ZXJpb3IgZW4gbGEgbXVlc3RyYSBkZSBlc3RpbWFjacOzbiB5IGxhIG11ZXN0cmEgZGUgcHJlZGljY2nDs24uDQoNCkNhbGN1bGEgbGFzIHByZWRpY2Npb25lcyBjb24gbG9zIG1vZGVsb3MgQVJJTUEgeSBvYnTDqW4gbGFzIG1lZGlkYXMgZGUgYWp1c3RlIGRlIGxhIHByZWRpY2Npw7NuLg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NClggPC0gbXgNClkgPC0gbXhbMTo5Ml0NCmBgYA0KDQpUZW5lbW9zIDExNiBvYnNlcnZhY2lvbmVzIHBhcmEgZWwgaW5kaWNlIGRlIHByb2R1Y2Npw7NuIGluZHVzdHJpYWwsIHBvciBsbyBxdWUgdXNhcmVtb3MgOTIgb2JzZXJ2YWNpb25lcyBkZSB0cmFpbmluZyB5IDI0IGRlIHRlc3QuDQoNCioqRXN0aW1hY2nDs24gZGUgbW9kZWxvcyoqDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbTEgPC0gQXJpbWEoWSwgYygwLDEsNCksIGluY2x1ZGUubWVhbj1GKQ0KbTENCm0xLmZpdCA8LSBmaXR0ZWQuQXJpbWEobTEpDQptMS5maXQgPC0geHRzKG0xLmZpdCwgaW5kZXgoWSkpDQptMS5kYXRhIDwtIG1lcmdlKFgsIG0xLmZpdCkNCm5hbWVzKG0xLmRhdGEpIDwtIGMoIkFjdHVhbCIsICJGaXQiKQ0KZHlncmFwaChtMS5kYXRhLCBtYWluPSJNQSg0KSIpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQptMiA8LSBBcmltYShZLCBjKDEsMSwzKSwgaW5jbHVkZS5tZWFuPUYpDQptMg0KbTIuZml0IDwtIGZpdHRlZC5BcmltYShtMikNCm0yLmZpdCA8LSB4dHMobTIuZml0LCBpbmRleChZKSkNCm0yLmRhdGEgPC0gbWVyZ2UoWCwgbTIuZml0KQ0KbmFtZXMobTIuZGF0YSkgPC0gYygiQWN0dWFsIiwgIkZpdCIpDQpkeWdyYXBoKG0yLmRhdGEsIG1haW49IkFSTUEoMSwzKSIpDQpgYGANCg0KKipUZXN0aW5nIHNldCoqDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbTEuZiA8LSBmb3JlY2FzdC5BcmltYShtMSwgaD0yNCwgZmFuPVQpDQphdXRvcGxvdChtMS5mKQ0KDQptMi5mIDwtIGZvcmVjYXN0LkFyaW1hKG0yLCBoPTI0LCBmYW49VCkNCmF1dG9wbG90KG0yLmYpDQpgYGANCg0KKipNZWRpZGFzIGRlIGFqdXN0ZSBkZSBsYSBwcmVkaWNjacOzbioqDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KQSA8LSBtYXRyaXgobnJvdz0yLCBuY29sPTUpDQpjb2xuYW1lcyhBKSA8LSBjb2xuYW1lcyhhY2N1cmFjeShtMS5mJG1lYW4sIFhbOTM6MTE2XSkpDQpBWzEsXSA8LSBhY2N1cmFjeShtMS5mJG1lYW4sIFhbOTM6MTE2XSkNCkFbMixdIDwtIGFjY3VyYWN5KG0yLmYkbWVhbiwgWFs5MzoxMTZdKQ0Kcm93bmFtZXMoQSkgPC0gYygiTUEoNCkiLCAiQVJNQSgxLDMpIikNCkENCmBgYA0KDQpBIHByaW9yaSBwYXJlY2UgcXVlIGVsIG1vZGVsbyBBUk1BKDEsMykgaGFjZSBtZWpvcmVzIHByZWRpY2Npb25lcyB5YSBxdWUgc3UgTUFFLCBSTUFTRSB5IE1BUEUgc29uIG3DoXMgYmFqb3MsIGVuIGVsIHNpZ3VpZW50ZSBhcGFydGFkbyBzZSByZWFsaXphbiBsb3MgY29udHJhc3Rlcy4NCg0KIyNBcGFydGFkbyAyDQoNClJlYWxpemEgbG9zIGNvbnRyYXN0ZXMgZGUgcG90ZW5jaWEgZGUgcHJlZGljY2nDs24uDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbTEucHJlZCA8LSB4dHMobTEuZiRtZWFuLCBpbmRleChYKVs5MzoxMTZdKQ0KZTEgPC0gWFs5MzoxMTZdIC0gbTEucHJlZA0KDQptMi5wcmVkIDwtIHh0cyhtMi5mJG1lYW4sIGluZGV4KFgpWzkzOjExNl0pDQplMiA8LSBYWzkzOjExNl0gLSBtMi5wcmVkDQpgYGANCg0KKipNb3JnYW4tR3Jhbmdlci1OZXdib2xkIFRlc3QqKg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCnZ5IDwtIGUxICsgZTINCnZ4IDwtIGUxIC0gZTINCg0KdnkgPC0gYXMuem9vKHZ5KQ0KdnggPC0gYXMuem9vKHZ4KQ0KbWducmVnIDwtIGR5bmxtKHZ5IH52eCkNCg0KY29lZnRlc3QobWducmVnLCB2Y292PXZjb3ZIQUMpDQoNCmJndGVzdChtZ25yZWcsIG9yZGVyPTQpDQoNCmJwdGVzdChtZ25yZWcpDQpgYGANCg0KVmVtb3MgY29tbyBlbCBjb2VmaWNpZW50ZSAkXGJldGEkIGVzIGlndWFsIGEgMCB5IHBvciB0YW50byBubyByZWNoYXphbW9zIGxhIGhpcMOzdGVzaXMgbnVsYSBkZSBxdWUgYW1ib3MgbW9kZWxvcyB0aWVuZW4gbGEgbWlzbWEgcG90ZW5jaWEgZGUgcHJlZGljY2nDs24uDQoNCioqRGllYm9sZC1NYXJpYW5vIFRlc3QqKg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCmRtLnRlc3QoZTEsIGUyLCBhbHRlcm5hdGl2ZT0idHdvLnNpZGVkIiwgaD0xLCBwb3dlcj0yKQ0KDQpkbS50ZXN0KGUxLCBlMiwgYWx0ZXJuYXRpdmU9ImdyZWF0ZXIiLCBoPTEsIHBvd2VyPTIpDQoNCmRtLnRlc3QoZTEsIGUyLCBhbHRlcm5hdGl2ZT0ibGVzcyIsIGg9MSwgcG93ZXI9MikNCmBgYA0KDQpObyByZWNoYXphbW9zIGxhIGhpcMOzdGVzaXMgbnVsYSBkZSBxdWUgbGFzIHBvdGVuY2lhcyBkZSBwcmVkaWNjacOzbiBzb24gaWd1YWxlcywgeSB0YW1wb2NvIHF1ZSBuaW5nw7puIG1vZGVsbyBlcyBtZWpvciBxdWUgZWwgb3Ryby4NCg0KRWwgbW9kZWxvIEFSTUEoMSwzKSBlcyBpZ3VhbCBkZSBwcmVjaXNvIHF1ZSBlbCBtb2RlbG8gTUEoNCkuDQoNCiMjQXBhcnRhZG8gMw0KDQpSZWFsaXphIGNvbWJpbmFjaW9uZXMgZGUgbGFzIHByZWRpY2Npb25lcy4NCg0KKipQZXNvcyBpZ3VhbGVzKioNCg0KYGBge3J9DQpYIDwtIGRpZmYoWCkNClkgPC0gZGlmZihZKQ0KbTEgPC0gQXJpbWEoWSwgYygwLDAsNCksIGluY2x1ZGUubWVhbj1GKQ0KbTIgPC0gQXJpbWEoWSwgYygxLDAsMyksIGluY2x1ZGUubWVhbj1GKQ0KbTEuZiA8LSBmb3JlY2FzdC5BcmltYShtMSwgaD0yNCwgZmFuPVQpDQptMi5mIDwtIGZvcmVjYXN0LkFyaW1hKG0yLCBoPTI0LCBmYW49VCkNCm0xLnByZWQgPC0geHRzKG0xLmYkbWVhbiwgaW5kZXgoWClbOTM6MTE2XSkNCm0yLnByZWQgPC0geHRzKG0yLmYkbWVhbiwgaW5kZXgoWClbOTM6MTE2XSkNCnAxIDwtIGFzLnpvbyhtMS5wcmVkKQ0KcDIgPC0gYXMuem9vKG0yLnByZWQpDQpZWiA8LSBhcy56b28oWFs5MzoxMTZdKQ0KDQpwZXcgPC0gKDEvMikqKHAxK3AyKQ0KYGBgDQoNCioqQmFzYWRvcyBlbiByZWdyZXNpw7NuKioNCg0KKioqTW9kZWxvIHNpbiByZXN0cmljY2nDs25lcyoqKg0KYGBge3IsIGVjaG89RkFMU0V9DQojTW9kZWxvIHNpbiByZXN0cmljY2nDs25lcw0KY3JlZzEgPC0gZHlubG0oWVogfiBwMSArIHAyKQ0Kc3VtbWFyeShjcmVnMSkNCnloYXQxIDwtIGNyZWcxJGZpdA0KYGBgDQoqKipNb2RlbG8gcGFyY2lhbG1lbnRlIHJlc3RyaW5naWRvKioqDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNNb2RlbG8gcGFyY2lhbG1lbnRlIHJlc3RyaW5naWRvDQpjcmVnMiA8LSBkeW5sbShZWiB+IDAgKyBwMSArIHAyKQ0Kc3VtbWFyeShjcmVnMikNCnloYXQyIDwtIGNyZWcyJGZpdA0KYGBgDQoNCioqKk1vZGVsbyByZXN0cmluZ2lkbyoqKg0KYGBge3IsIGVjaG89RkFMU0V9DQojTW9kZWxvIHJlc3RyaW5naWRvDQpZWnN0YXIgPC0gWVogLSBwMQ0KWDFzdGFyIDwtIHAyIC0gcDENCmNyZWczIDwtIGR5bmxtKFlac3RhciB+IDAgKyBYMXN0YXIpDQpzdW1tYXJ5KGNyZWczKQ0KeWhhdDMgPC0gY3JlZzMkZml0ICsgcDENCmBgYA0KDQoNCioqQ29tcGFyYWNpb25lcyBkZSBsYXMgY29tYmluYWNpb25lcyoqDQoNCk1BRToNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZXJlcXcgPC0gWVogLSBwZXcNCmVyY3JlZzEgPC0gWVogLSB5aGF0MQ0KZXJjcmVnMiA8LSBZWiAtIHloYXQyDQplcmNyZWczIDwtIFlaIC0geWhhdDMNCg0KbXlNQUUgPC0gZnVuY3Rpb24oeCkNCnsNCiAgcmV0dXJuKG1lYW4oYWJzKHgpKSkNCn0NCg0KWE0gPC0gY2JpbmQoZXJlcXcsIGVyY3JlZzEsIGVyY3JlZzIsIGVyY3JlZzMpDQpjb21iTUFFIDwtIGFwcGx5KFhNLCAyLCBteU1BRSkNCm5hbWVzKGNvbWJNQUUpIDwtIGMoIklQSS5lcmVxdyIsIklQSS5lcmNyZWcxIiwiSVBJLmVyY3JlZzIiLCJJUEkuZXJjcmVnMyIpDQpjb21iTUFFDQoNClpNIDwtIG1lcmdlKFlaLCBwZXcsIHloYXQxLCB5aGF0MiwgeWhhdDMpDQpuYW1lcyhaTSkgPC0gYygiQWN0dWFsIiwgIkVxLiBXIiwgIlJlZy4gMSIsICJSZWcuIDIiLCAiUmVnLiAzIikNCnAgPC0gYXV0b3Bsb3QoWk0sIGZhY2V0cyA9IE5VTEwpDQpnZ3Bsb3RseShwKQ0KYGBgDQoNCkVuIGVzdGUgY2FzbyBzb24gbWVqb3IgbGFzIHByZWRpY2Npb25lcyBjb24gZWwgbW9kZWxvIHNpbiByZXN0cmluZ2lyIHkgY29uIGNvbnN0YW50ZSAoUmVnLiAxKS4NCg0KIyNBcGFydGFkbyA0DQoNClJlYWxpemEgcHJlZGljY2lvbmVzIGZ1ZXJhIGRlIGxhIG11ZXN0cmEuDQoNCkVzdGltYWNpw7NuIGRlIGxvcyBtb2RlbG9zIGNvbiB0b2RhIGxhIG11ZXN0cmE6DQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KWCA8LSBkaWZmKG14KQ0KWSA8LSBYWy0xXQ0KDQptMW8gPC0gQXJpbWEoWSwgYygwLDAsNCksIGluY2x1ZGUubWVhbiA9IEYpDQptMW8NCg0KbTJvIDwtIEFyaW1hKFksIGMoMSwwLDMpLCBpbmNsdWRlLm1lYW4gPSBGKQ0KbTJvDQpgYGANCg0KUHJlZGljY2lvbmVzIDggcGFzb3MgcG9yIGRlbGFudGU6DQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbTFvLmYgPC0gZm9yZWNhc3QuQXJpbWEobTFvLCBoPTgsIGxldmVsPTAuOTUpDQphdXRvcGxvdChtMW8uZikNCg0KbTJvLmYgPC0gZm9yZWNhc3QuQXJpbWEobTJvLCBoPTgsIGxldmVsPTAuOTUpDQphdXRvcGxvdChtMm8uZikNCg0KbmRhdGVzIDwtIHNlcS5EYXRlKGZyb209YXMuRGF0ZSgiMjAxNy0wMS0wMSIpLCBsZW5ndGgub3V0ID0gOCwgYnkgPSAicXVhcnRlciIpDQpwMSA8LSB6b28obTFvLmYkbWVhbiwgbmRhdGVzKQ0KcDIgPC0gem9vKG0yby5mJG1lYW4sIG5kYXRlcykNCnBtIDwtIG1lcmdlKHAxLCBwMikNCm5hbWVzKHBtKSA8LSBjKCJNQSg0KSIsICJBUk1BKDEsMykiKQ0KcCA8LSBhdXRvcGxvdChwbSwgZmFjZXRzPU5VTEwpDQpnZ3Bsb3RseShwKQ0KYGBgDQoNCioqQ29tYmluYWNpb25lcyoqDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI1Blc29zIGlndWFsZXMNCm5lcXcgPC0gKDEvMikqKHAxK3AyKQ0KDQojU2luIHJlc3RyaWNjaW9uZXMNCncgPC0gY3JlZzEkY29lZmZpY2llbnRzDQpueWhhdDEgPC0gd1sxXSArIHdbMl0qcDEgKyB3WzNdKnAyDQoNCiNTaW4gY29uc3RhbnRlDQp3IDwtIGNyZWcyJGNvZWZmaWNpZW50cw0KbnloYXQyIDwtIHdbMV0qcDEgKyB3WzJdKnAyDQoNCiNSZXN0cmluZ2lkbw0Kd3N0YXIgPC0gY3JlZzMkY29lZmZpY2llbnRzDQp3IDwtIGFycmF5KGRpbT0yKQ0Kd1syXSA8LSB3c3Rhcg0Kd1sxXSA8LSAxIC0gc3VtKHdzdGFyKQ0KDQpueWhhdDMgPC0gd1sxXSpwMSArIHdbMl0qcDINCg0KDQp4bSA8LSBtZXJnZShuZXF3LCBueWhhdDEsIG55aGF0MiwgbnloYXQzKQ0KcCA8LSBhdXRvcGxvdCh4bSwgZmFjZXRzPU5VTEwpDQpnZ3Bsb3RseShwKQ0KDQpvcHRpb25zKGRpZ2l0cyA9IDUpDQphdXggPC0gYXMuZGF0YS5mcmFtZShtZXJnZShwbSwgeG0pKQ0KYXV4DQpgYGANCg0KI1RpcG8gZGUgaW50ZXLDqXMgYSBsYXJnbyBwbGF6bw0KDQojI0FwYXJ0YWRvIDENCg0KRGl2aWRlIGxhcyBtdWVzdHJhcyBkZSBsYSB0YXJlYSBhbnRlcmlvciBlbiBsYSBtdWVzdHJhIGRlIGVzdGltYWNpw7NuIHkgbGEgbXVlc3RyYSBkZSBwcmVkaWNjacOzbi4NCg0KQ2FsY3VsYSBsYXMgcHJlZGljY2lvbmVzIGNvbiBsb3MgbW9kZWxvcyBBUklNQSB5IG9idMOpbiBsYXMgbWVkaWRhcyBkZSBhanVzdGUgZGUgbGEgcHJlZGljY2nDs24uDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KWCA8LSBsb2cobHQpDQpZIDwtIFhbMToxNDddDQpgYGANCg0KVGVuZW1vcyAxODMgb2JzZXJ2YWNpb25lcyBwYXJhIGVsIHRpcG8gZGUgaW50ZXLDqXMgYSBsYXJnbyBwbGF6bywgcG9yIGxvIHF1ZSB1c2FyZW1vcyAxNDcgb2JzZXJ2YWNpb25lcyBkZSB0cmFpbmluZyB5IDM2IGRlIHRlc3QuDQoNCioqRXN0aW1hY2nDs24gZGUgbW9kZWxvcyoqDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbTEgPC0gQXJpbWEoWSwgYygzLDEsMSksIGluY2x1ZGUubWVhbj1GKQ0KbTENCm0xLmZpdCA8LSBmaXR0ZWQuQXJpbWEobTEpDQptMS5maXQgPC0geHRzKG0xLmZpdCwgaW5kZXgoWSkpDQptMS5kYXRhIDwtIG1lcmdlKFgsIG0xLmZpdCkNCm5hbWVzKG0xLmRhdGEpIDwtIGMoIkFjdHVhbCIsICJGaXQiKQ0KZHlncmFwaChtMS5kYXRhLCBtYWluPSJBUk1BKDMsMSkiKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbTIgPC0gQXJpbWEoWSwgYygzLDEsMCksIGluY2x1ZGUubWVhbj1GKQ0KbTINCm0yLmZpdCA8LSBmaXR0ZWQuQXJpbWEobTIpDQptMi5maXQgPC0geHRzKG0yLmZpdCwgaW5kZXgoWSkpDQptMi5kYXRhIDwtIG1lcmdlKFgsIG0yLmZpdCkNCm5hbWVzKG0yLmRhdGEpIDwtIGMoIkFjdHVhbCIsICJGaXQiKQ0KZHlncmFwaChtMi5kYXRhLCBtYWluPSJBUigzKSIpDQpgYGANCg0KKipUZXN0aW5nIHNldCoqDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbTEuZiA8LSBmb3JlY2FzdC5BcmltYShtMSwgaD0zNiwgZmFuPVQpDQphdXRvcGxvdChtMS5mKQ0KDQptMi5mIDwtIGZvcmVjYXN0LkFyaW1hKG0yLCBoPTM2LCBmYW49VCkNCmF1dG9wbG90KG0yLmYpDQpgYGANCg0KKipNZWRpZGFzIGRlIGFqdXN0ZSBkZSBsYSBwcmVkaWNjacOzbioqDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KQSA8LSBtYXRyaXgobnJvdz0yLCBuY29sPTUpDQpjb2xuYW1lcyhBKSA8LSBjb2xuYW1lcyhhY2N1cmFjeShtMS5mJG1lYW4sIFhbMTQ4OjE4M10pKQ0KQVsxLF0gPC0gYWNjdXJhY3kobTEuZiRtZWFuLCBYWzE0ODoxODNdKQ0KQVsyLF0gPC0gYWNjdXJhY3kobTIuZiRtZWFuLCBYWzE0ODoxODNdKQ0Kcm93bmFtZXMoQSkgPC0gYygiQVJNQSgzLDEpIiwgIkFSKDMpIikNCkENCmBgYA0KDQoNCiMjQXBhcnRhZG8gMg0KDQpSZWFsaXphIGxvcyBjb250cmFzdGVzIGRlIHBvdGVuY2lhIGRlIHByZWRpY2Npw7NuLg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCm0xLnByZWQgPC0geHRzKG0xLmYkbWVhbiwgaW5kZXgoWClbMTQ4OjE4M10pDQplMSA8LSBYWzE0ODoxODNdIC0gbTEucHJlZA0KDQptMi5wcmVkIDwtIHh0cyhtMi5mJG1lYW4sIGluZGV4KFgpWzE0ODoxODNdKQ0KZTIgPC0gWFsxNDg6MTgzXSAtIG0yLnByZWQNCmBgYA0KDQoqKk1vcmdhbi1HcmFuZ2VyLU5ld2JvbGQgVGVzdCoqDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KdnkgPC0gZTEgKyBlMg0KdnggPC0gZTEgLSBlMg0KDQp2eSA8LSBhcy56b28odnkpDQp2eCA8LSBhcy56b28odngpDQptZ25yZWcgPC0gZHlubG0odnkgfnZ4KQ0KDQpjb2VmdGVzdChtZ25yZWcsIHZjb3Y9dmNvdkhBQykNCg0KYmd0ZXN0KG1nbnJlZywgb3JkZXI9NCkNCg0KYnB0ZXN0KG1nbnJlZykNCmBgYA0KDQpWZW1vcyBjb21vIGVsIGNvZWZpY2llbnRlICRcYmV0YSQgZXMgY2xhcmFtZW50ZSBkaXN0aW50byBkZSAwIHkgcG9yIHRhbnRvIHJlY2hhemFtb3MgbGEgaGlww7N0ZXNpcyBudWxhIGRlIHF1ZSBhbWJvcyBtb2RlbG9zIHRpZW5lbiBsYSBtaXNtYSBwb3RlbmNpYSBkZSBwcmVkaWNjacOzbi4NCg0KKipEaWVib2xkLU1hcmlhbm8gVGVzdCoqDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KZG0udGVzdChlMSwgZTIsIGFsdGVybmF0aXZlPSJ0d28uc2lkZWQiLCBoPTEsIHBvd2VyPTIpDQoNCmRtLnRlc3QoZTEsIGUyLCBhbHRlcm5hdGl2ZT0iZ3JlYXRlciIsIGg9MSwgcG93ZXI9MikNCg0KZG0udGVzdChlMSwgZTIsIGFsdGVybmF0aXZlPSJsZXNzIiwgaD0xLCBwb3dlcj0yKQ0KYGBgDQoNCk5vIHJlY2hhemFtb3MgbGEgaGlww7N0ZXNpcyBudWxhIGRlIHF1ZSBsYXMgcG90ZW5jaWFzIGRlIHByZWRpY2Npw7NuIHNvbiBpZ3VhbGVzLCBhdW5xdWUgZWwgcC12YWxvciBhc29jaWFkbyBhIGxhcyBkb3MgY29sYXMgZXMgMCwwODkgeSBzZSBxdWVkYSBtdXkgY2VyY2EgZGVsIDAuMDUgZGUgbml2ZWwgZGUgc2lnbmlmaWNhY2nDs24uDQoNClNpIG5vcyBmaWphbW9zIHNvbGFtZW50ZSBlbiB1bmEgY29sYSB0ZW5lbW9zIHF1ZSBlbCBtb2RlbG8gQVJNQSgzLDEpIGVzIG3DoXMgcHJlY2lzbyBxdWUgZWwgQVIoMykgY29uIHVuIHAtdmFsb3IgZGUgMCwwNDQuDQoNCiMjQXBhcnRhZG8gMw0KDQpSZWFsaXphIGNvbWJpbmFjaW9uZXMgZGUgbGFzIHByZWRpY2Npb25lcy4NCg0KKipQZXNvcyBpZ3VhbGVzKioNCg0KYGBge3J9DQpYIDwtIGRpZmYoWCkNClkgPC0gZGlmZihZKQ0KbTEgPC0gQXJpbWEoWSwgYygzLDAsMSksIGluY2x1ZGUubWVhbj1GKQ0KbTIgPC0gQXJpbWEoWSwgYygzLDAsMCksIGluY2x1ZGUubWVhbj1GKQ0KbTEuZiA8LSBmb3JlY2FzdC5BcmltYShtMSwgaD0zNiwgZmFuPVQpDQptMi5mIDwtIGZvcmVjYXN0LkFyaW1hKG0yLCBoPTM2LCBmYW49VCkNCm0xLnByZWQgPC0geHRzKG0xLmYkbWVhbiwgaW5kZXgoWClbMTQ4OjE4M10pDQptMi5wcmVkIDwtIHh0cyhtMi5mJG1lYW4sIGluZGV4KFgpWzE0ODoxODNdKQ0KcDEgPC0gYXMuem9vKG0xLnByZWQpDQpwMiA8LSBhcy56b28obTIucHJlZCkNCllaIDwtIGFzLnpvbyhYWzE0ODoxODNdKQ0KDQpwZXcgPC0gKDEvMikqKHAxK3AyKQ0KYGBgDQoNCioqQmFzYWRvcyBlbiByZWdyZXNpw7NuKioNCg0KKioqTW9kZWxvIHNpbiByZXN0cmljY2nDs25lcyoqKg0KYGBge3IsIGVjaG89RkFMU0V9DQojTW9kZWxvIHNpbiByZXN0cmljY2nDs25lcw0KY3JlZzEgPC0gZHlubG0oWVogfiBwMSArIHAyKQ0Kc3VtbWFyeShjcmVnMSkNCnloYXQxIDwtIGNyZWcxJGZpdA0KYGBgDQoqKipNb2RlbG8gcGFyY2lhbG1lbnRlIHJlc3RyaW5naWRvKioqDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNNb2RlbG8gcGFyY2lhbG1lbnRlIHJlc3RyaW5naWRvDQpjcmVnMiA8LSBkeW5sbShZWiB+IDAgKyBwMSArIHAyKQ0Kc3VtbWFyeShjcmVnMikNCnloYXQyIDwtIGNyZWcyJGZpdA0KYGBgDQoNCioqKk1vZGVsbyByZXN0cmluZ2lkbyoqKg0KYGBge3IsIGVjaG89RkFMU0V9DQojTW9kZWxvIHJlc3RyaW5naWRvDQpZWnN0YXIgPC0gWVogLSBwMQ0KWDFzdGFyIDwtIHAyIC0gcDENCmNyZWczIDwtIGR5bmxtKFlac3RhciB+IDAgKyBYMXN0YXIpDQpzdW1tYXJ5KGNyZWczKQ0KeWhhdDMgPC0gY3JlZzMkZml0ICsgcDENCmBgYA0KDQoNCioqQ29tcGFyYWNpb25lcyBkZSBsYXMgY29tYmluYWNpb25lcyoqDQoNCk1BRToNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZXJlcXcgPC0gWVogLSBwZXcNCmVyY3JlZzEgPC0gWVogLSB5aGF0MQ0KZXJjcmVnMiA8LSBZWiAtIHloYXQyDQplcmNyZWczIDwtIFlaIC0geWhhdDMNCg0KbXlNQUUgPC0gZnVuY3Rpb24oeCkNCnsNCiAgcmV0dXJuKG1lYW4oYWJzKHgpKSkNCn0NCg0KWE0gPC0gY2JpbmQoZXJlcXcsIGVyY3JlZzEsIGVyY3JlZzIsIGVyY3JlZzMpDQpjb21iTUFFIDwtIGFwcGx5KFhNLCAyLCBteU1BRSkNCm5hbWVzKGNvbWJNQUUpIDwtIGMoIklQSS5lcmVxdyIsIklQSS5lcmNyZWcxIiwiSVBJLmVyY3JlZzIiLCJJUEkuZXJjcmVnMyIpDQpjb21iTUFFDQoNClpNIDwtIG1lcmdlKFlaLCBwZXcsIHloYXQxLCB5aGF0MiwgeWhhdDMpDQpuYW1lcyhaTSkgPC0gYygiQWN0dWFsIiwgIkVxLiBXIiwgIlJlZy4gMSIsICJSZWcuIDIiLCAiUmVnLiAzIikNCnAgPC0gYXV0b3Bsb3QoWk0sIGZhY2V0cyA9IE5VTEwpDQpnZ3Bsb3RseShwKQ0KYGBgDQoNCkVuIGVzdGUgY2FzbyByZXN1bHRhbiBtdWNobyBtZWpvciBsYXMgcHJlZGljY2lvbmVzIGNvbWJpbmFuZG8gY29uIGxhIG1pc21hIHBvbmRlcmFjacOzbi4NCg0KIyNBcGFydGFkbyA0DQoNClJlYWxpemEgcHJlZGljY2lvbmVzIGZ1ZXJhIGRlIGxhIG11ZXN0cmEuDQoNCkVzdGltYWNpw7NuIGRlIGxvcyBtb2RlbG9zIGNvbiB0b2RhIGxhIG11ZXN0cmE6DQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KWCA8LSBkaWZmKGxvZyhsdCkpDQpZIDwtIFhbLTFdDQoNCm0xbyA8LSBBcmltYShZLCBjKDMsMCwxKSwgaW5jbHVkZS5tZWFuID0gRikNCm0xbw0KDQptMm8gPC0gQXJpbWEoWSwgYygzLDAsMCksIGluY2x1ZGUubWVhbiA9IEYpDQptMm8NCmBgYA0KDQpQcmVkaWNjaW9uZXMgMTIgcGFzb3MgcG9yIGRlbGFudGU6DQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbTFvLmYgPC0gZm9yZWNhc3QuQXJpbWEobTFvLCBoPTEyLCBsZXZlbD0wLjk1KQ0KYXV0b3Bsb3QobTFvLmYpDQoNCm0yby5mIDwtIGZvcmVjYXN0LkFyaW1hKG0ybywgaD0xMiwgbGV2ZWw9MC45NSkNCmF1dG9wbG90KG0yby5mKQ0KDQpuZGF0ZXMgPC0gc2VxLkRhdGUoZnJvbT1hcy5EYXRlKCIyMDE3LTA0LTAxIiksIGxlbmd0aC5vdXQgPSAxMiwgYnkgPSAibW9udGgiKQ0KcDEgPC0gem9vKG0xby5mJG1lYW4sIG5kYXRlcykNCnAyIDwtIHpvbyhtMm8uZiRtZWFuLCBuZGF0ZXMpDQpwbSA8LSBtZXJnZShwMSwgcDIpDQpuYW1lcyhwbSkgPC0gYygiQVJNQSgzLDEpIiwgIkFSKDMpIikNCnAgPC0gYXV0b3Bsb3QocG0sIGZhY2V0cz1OVUxMKQ0KZ2dwbG90bHkocCkNCmBgYA0KDQoqKkNvbWJpbmFjaW9uZXMqKg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNQZXNvcyBpZ3VhbGVzDQpuZXF3IDwtICgxLzIpKihwMStwMikNCg0KI1NpbiByZXN0cmljY2lvbmVzDQp3IDwtIGNyZWcxJGNvZWZmaWNpZW50cw0KbnloYXQxIDwtIHdbMV0gKyB3WzJdKnAxICsgd1szXSpwMg0KDQojU2luIGNvbnN0YW50ZQ0KdyA8LSBjcmVnMiRjb2VmZmljaWVudHMNCm55aGF0MiA8LSB3WzFdKnAxICsgd1syXSpwMg0KDQojUmVzdHJpbmdpZG8NCndzdGFyIDwtIGNyZWczJGNvZWZmaWNpZW50cw0KdyA8LSBhcnJheShkaW09MikNCndbMl0gPC0gd3N0YXINCndbMV0gPC0gMSAtIHN1bSh3c3RhcikNCg0KbnloYXQzIDwtIHdbMV0qcDEgKyB3WzJdKnAyDQoNCg0KeG0gPC0gbWVyZ2UobmVxdywgbnloYXQxLCBueWhhdDIsIG55aGF0MykNCnAgPC0gYXV0b3Bsb3QoeG0sIGZhY2V0cz1OVUxMKQ0KZ2dwbG90bHkocCkNCg0Kb3B0aW9ucyhkaWdpdHMgPSA1KQ0KYXV4IDwtIGFzLmRhdGEuZnJhbWUobWVyZ2UocG0sIHhtKSkNCmF1eA0KYGBgDQoNCiNUaXBvIGRlIGludGVyw6lzIGEgbWVkaW8gcGxhem8NCg0KIyNBcGFydGFkbyAxDQoNCkRpdmlkZSBsYXMgbXVlc3RyYXMgZGUgbGEgdGFyZWEgYW50ZXJpb3IgZW4gbGEgbXVlc3RyYSBkZSBlc3RpbWFjacOzbiB5IGxhIG11ZXN0cmEgZGUgcHJlZGljY2nDs24uDQoNCkNhbGN1bGEgbGFzIHByZWRpY2Npb25lcyBjb24gbG9zIG1vZGVsb3MgQVJJTUEgeSBvYnTDqW4gbGFzIG1lZGlkYXMgZGUgYWp1c3RlIGRlIGxhIHByZWRpY2Npw7NuLg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NClggPC0gbG9nKG10KQ0KWSA8LSBYWzE6MTQ3XQ0KYGBgDQoNClRlbmVtb3MgMTgzIG9ic2VydmFjaW9uZXMgcGFyYSBlbCB0aXBvIGRlIGludGVyw6lzIGEgbWVkaW8gcGxhem8sIHBvciBsbyBxdWUgdXNhcmVtb3MgMTQ3IG9ic2VydmFjaW9uZXMgZGUgdHJhaW5pbmcgeSAzNiBkZSB0ZXN0Lg0KDQoqKkVzdGltYWNpw7NuIGRlIG1vZGVsb3MqKg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCm0xIDwtIEFyaW1hKFksIGMoMSwxLDApLCBpbmNsdWRlLm1lYW49RikNCm0xDQptMS5maXQgPC0gZml0dGVkLkFyaW1hKG0xKQ0KbTEuZml0IDwtIHh0cyhtMS5maXQsIGluZGV4KFkpKQ0KbTEuZGF0YSA8LSBtZXJnZShYLCBtMS5maXQpDQpuYW1lcyhtMS5kYXRhKSA8LSBjKCJBY3R1YWwiLCAiRml0IikNCmR5Z3JhcGgobTEuZGF0YSwgbWFpbj0iQVIoMSkiKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbTIgPC0gQXJpbWEoWSwgYygwLDEsMSksIGluY2x1ZGUubWVhbj1GKQ0KbTINCm0yLmZpdCA8LSBmaXR0ZWQuQXJpbWEobTIpDQptMi5maXQgPC0geHRzKG0yLmZpdCwgaW5kZXgoWSkpDQptMi5kYXRhIDwtIG1lcmdlKFgsIG0yLmZpdCkNCm5hbWVzKG0yLmRhdGEpIDwtIGMoIkFjdHVhbCIsICJGaXQiKQ0KZHlncmFwaChtMi5kYXRhLCBtYWluPSJNQSgxKSIpDQpgYGANCg0KKipUZXN0aW5nIHNldCoqDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbTEuZiA8LSBmb3JlY2FzdC5BcmltYShtMSwgaD0zNiwgZmFuPVQpDQphdXRvcGxvdChtMS5mKQ0KDQptMi5mIDwtIGZvcmVjYXN0LkFyaW1hKG0yLCBoPTM2LCBmYW49VCkNCmF1dG9wbG90KG0yLmYpDQpgYGANCg0KKipNZWRpZGFzIGRlIGFqdXN0ZSBkZSBsYSBwcmVkaWNjacOzbioqDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KQSA8LSBtYXRyaXgobnJvdz0yLCBuY29sPTUpDQpjb2xuYW1lcyhBKSA8LSBjb2xuYW1lcyhhY2N1cmFjeShtMS5mJG1lYW4sIFhbMTQ4OjE4M10pKQ0KQVsxLF0gPC0gYWNjdXJhY3kobTEuZiRtZWFuLCBYWzE0ODoxODNdKQ0KQVsyLF0gPC0gYWNjdXJhY3kobTIuZiRtZWFuLCBYWzE0ODoxODNdKQ0Kcm93bmFtZXMoQSkgPC0gYygiQVIoMSkiLCAiTUEoMSkiKQ0KQQ0KYGBgDQoNCg0KIyNBcGFydGFkbyAyDQoNClJlYWxpemEgbG9zIGNvbnRyYXN0ZXMgZGUgcG90ZW5jaWEgZGUgcHJlZGljY2nDs24uDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbTEucHJlZCA8LSB4dHMobTEuZiRtZWFuLCBpbmRleChYKVsxNDg6MTgzXSkNCmUxIDwtIFhbMTQ4OjE4M10gLSBtMS5wcmVkDQoNCm0yLnByZWQgPC0geHRzKG0yLmYkbWVhbiwgaW5kZXgoWClbMTQ4OjE4M10pDQplMiA8LSBYWzE0ODoxODNdIC0gbTIucHJlZA0KYGBgDQoNCioqTW9yZ2FuLUdyYW5nZXItTmV3Ym9sZCBUZXN0KioNCg0KYGBge3IsIGVjaG89RkFMU0V9DQp2eSA8LSBlMSArIGUyDQp2eCA8LSBlMSAtIGUyDQoNCnZ5IDwtIGFzLnpvbyh2eSkNCnZ4IDwtIGFzLnpvbyh2eCkNCm1nbnJlZyA8LSBkeW5sbSh2eSB+dngpDQoNCmNvZWZ0ZXN0KG1nbnJlZywgdmNvdj12Y292SEFDKQ0KDQpiZ3Rlc3QobWducmVnLCBvcmRlcj0yNCkNCg0KYnB0ZXN0KG1nbnJlZykNCmBgYA0KDQpFbiBlc3RlIGNhc28gZWwgY29lZmljaWVudGUgJFxiZXRhJCBlcyBpZ3VhbCAwLCBubyByZWNoYXphbW9zIGxhIGhpcMOzdGVzaXMgbnVsYSB5IHBvciB0YW50byBhbWJvcyBtb2RlbG9zIHRpZW5lbiBsYSBtaXNtYSBwb3RlbmNpYSBkZSBwcmVkaWNjacOzbi4NCg0KTG9zIG1vZGVsb3MgQVIoMSkgeSBNQSgxKSB0aWVuZW4gbGEgbWlzbWEgcG90ZW5jaWEuDQoNCioqRGllYm9sZC1NYXJpYW5vIFRlc3QqKg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCmRtLnRlc3QoZTEsIGUyLCBhbHRlcm5hdGl2ZT0idHdvLnNpZGVkIiwgaD0xLCBwb3dlcj0yKQ0KDQpkbS50ZXN0KGUxLCBlMiwgYWx0ZXJuYXRpdmU9ImdyZWF0ZXIiLCBoPTEsIHBvd2VyPTIpDQoNCmRtLnRlc3QoZTEsIGUyLCBhbHRlcm5hdGl2ZT0ibGVzcyIsIGg9MSwgcG93ZXI9MikNCmBgYA0KDQpSZWNoYXphbW9zIGxhIGhpcMOzdGVzaXMgbnVsYSBkZSBxdWUgbGFzIHBvdGVuY2lhcyBkZSBwcmVkaWNjacOzbiBzb24gaWd1YWxlcy4NCg0KQ29uZmlybWFtb3MgbG9zIHJlc3VsdGFkb3Mgb2J0ZW5pZG9zIGVuIGVsIHRlc3QgYW50ZXJpb3IsIGVsIEFSKDEpIGVzIGlndWFsIGRlIHByZWNpc28gcXVlIGVsIE1BKDEpLg0KDQojI0FwYXJ0YWRvIDMNCg0KUmVhbGl6YSBjb21iaW5hY2lvbmVzIGRlIGxhcyBwcmVkaWNjaW9uZXMuDQoNCioqUGVzb3MgaWd1YWxlcyoqDQoNCmBgYHtyfQ0KWCA8LSBkaWZmKFgpDQpZIDwtIGRpZmYoWSkNCm0xIDwtIEFyaW1hKFksIGMoMSwwLDApLCBpbmNsdWRlLm1lYW49RikNCm0yIDwtIEFyaW1hKFksIGMoMCwwLDEpLCBpbmNsdWRlLm1lYW49RikNCm0xLmYgPC0gZm9yZWNhc3QuQXJpbWEobTEsIGg9MzYsIGZhbj1UKQ0KbTIuZiA8LSBmb3JlY2FzdC5BcmltYShtMiwgaD0zNiwgZmFuPVQpDQptMS5wcmVkIDwtIHh0cyhtMS5mJG1lYW4sIGluZGV4KFgpWzE0ODoxODNdKQ0KbTIucHJlZCA8LSB4dHMobTIuZiRtZWFuLCBpbmRleChYKVsxNDg6MTgzXSkNCnAxIDwtIGFzLnpvbyhtMS5wcmVkKQ0KcDIgPC0gYXMuem9vKG0yLnByZWQpDQpZWiA8LSBhcy56b28oWFsxNDg6MTgzXSkNCg0KcGV3IDwtICgxLzIpKihwMStwMikNCmBgYA0KDQoqKkJhc2Fkb3MgZW4gcmVncmVzacOzbioqDQoNCioqKk1vZGVsbyBzaW4gcmVzdHJpY2Npw7NuZXMqKioNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI01vZGVsbyBzaW4gcmVzdHJpY2Npw7NuZXMNCmNyZWcxIDwtIGR5bmxtKFlaIH4gcDEgKyBwMikNCnN1bW1hcnkoY3JlZzEpDQp5aGF0MSA8LSBjcmVnMSRmaXQNCmBgYA0KKioqTW9kZWxvIHBhcmNpYWxtZW50ZSByZXN0cmluZ2lkbyoqKg0KYGBge3IsIGVjaG89RkFMU0V9DQojTW9kZWxvIHBhcmNpYWxtZW50ZSByZXN0cmluZ2lkbw0KY3JlZzIgPC0gZHlubG0oWVogfiAwICsgcDEgKyBwMikNCnN1bW1hcnkoY3JlZzIpDQp5aGF0MiA8LSBjcmVnMiRmaXQNCmBgYA0KDQoqKipNb2RlbG8gcmVzdHJpbmdpZG8qKioNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI01vZGVsbyByZXN0cmluZ2lkbw0KWVpzdGFyIDwtIFlaIC0gcDENClgxc3RhciA8LSBwMiAtIHAxDQpjcmVnMyA8LSBkeW5sbShZWnN0YXIgfiAwICsgWDFzdGFyKQ0Kc3VtbWFyeShjcmVnMykNCnloYXQzIDwtIGNyZWczJGZpdCArIHAxDQpgYGANCg0KDQoqKkNvbXBhcmFjaW9uZXMgZGUgbGFzIGNvbWJpbmFjaW9uZXMqKg0KDQpNQUU6DQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmVyZXF3IDwtIFlaIC0gcGV3DQplcmNyZWcxIDwtIFlaIC0geWhhdDENCmVyY3JlZzIgPC0gWVogLSB5aGF0Mg0KZXJjcmVnMyA8LSBZWiAtIHloYXQzDQoNCm15TUFFIDwtIGZ1bmN0aW9uKHgpDQp7DQogIHJldHVybihtZWFuKGFicyh4KSkpDQp9DQoNClhNIDwtIGNiaW5kKGVyZXF3LCBlcmNyZWcxLCBlcmNyZWcyLCBlcmNyZWczKQ0KY29tYk1BRSA8LSBhcHBseShYTSwgMiwgbXlNQUUpDQpuYW1lcyhjb21iTUFFKSA8LSBjKCJJUEkuZXJlcXciLCJJUEkuZXJjcmVnMSIsIklQSS5lcmNyZWcyIiwiSVBJLmVyY3JlZzMiKQ0KY29tYk1BRQ0KDQpaTSA8LSBtZXJnZShZWiwgcGV3LCB5aGF0MSwgeWhhdDIsIHloYXQzKQ0KbmFtZXMoWk0pIDwtIGMoIkFjdHVhbCIsICJFcS4gVyIsICJSZWcuIDEiLCAiUmVnLiAyIiwgIlJlZy4gMyIpDQpwIDwtIGF1dG9wbG90KFpNLCBmYWNldHMgPSBOVUxMKQ0KZ2dwbG90bHkocCkNCmBgYA0KDQpFbiBlc3RlIGNhc28gcmVzdWx0YW4gbWVqb3IgbGFzIHByZWRpY2Npb25lcyBjb24gcGVzb3MgaWd1YWxlcy4NCg0KIyNBcGFydGFkbyA0DQoNClJlYWxpemEgcHJlZGljY2lvbmVzIGZ1ZXJhIGRlIGxhIG11ZXN0cmEuDQoNCkVzdGltYWNpw7NuIGRlIGxvcyBtb2RlbG9zIGNvbiB0b2RhIGxhIG11ZXN0cmE6DQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KWCA8LSBkaWZmKGxvZyhtdCkpDQpZIDwtIFhbLTFdDQoNCm0xbyA8LSBBcmltYShZLCBjKDEsMCwwKSwgaW5jbHVkZS5tZWFuID0gRikNCm0xbw0KDQptMm8gPC0gQXJpbWEoWSwgYygwLDAsMSksIGluY2x1ZGUubWVhbiA9IEYpDQptMm8NCmBgYA0KDQpQcmVkaWNjaW9uZXMgMTIgcGFzb3MgcG9yIGRlbGFudGU6DQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbTFvLmYgPC0gZm9yZWNhc3QuQXJpbWEobTFvLCBoPTEyLCBsZXZlbD0wLjk1KQ0KYXV0b3Bsb3QobTFvLmYpDQoNCm0yby5mIDwtIGZvcmVjYXN0LkFyaW1hKG0ybywgaD0xMiwgbGV2ZWw9MC45NSkNCmF1dG9wbG90KG0yby5mKQ0KDQpuZGF0ZXMgPC0gc2VxLkRhdGUoZnJvbT1hcy5EYXRlKCIyMDE3LTA0LTAxIiksIGxlbmd0aC5vdXQgPSAxMiwgYnkgPSAibW9udGgiKQ0KcDEgPC0gem9vKG0xby5mJG1lYW4sIG5kYXRlcykNCnAyIDwtIHpvbyhtMm8uZiRtZWFuLCBuZGF0ZXMpDQpwbSA8LSBtZXJnZShwMSwgcDIpDQpuYW1lcyhwbSkgPC0gYygiQVIoMSkiLCAiTUEoMSkiKQ0KcCA8LSBhdXRvcGxvdChwbSwgZmFjZXRzPU5VTEwpDQpnZ3Bsb3RseShwKQ0KYGBgDQoNCioqQ29tYmluYWNpb25lcyoqDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI1Blc29zIGlndWFsZXMNCm5lcXcgPC0gKDEvMikqKHAxK3AyKQ0KDQojU2luIHJlc3RyaWNjaW9uZXMNCncgPC0gY3JlZzEkY29lZmZpY2llbnRzDQpueWhhdDEgPC0gd1sxXSArIHdbMl0qcDEgKyB3WzNdKnAyDQoNCiNTaW4gY29uc3RhbnRlDQp3IDwtIGNyZWcyJGNvZWZmaWNpZW50cw0KbnloYXQyIDwtIHdbMV0qcDEgKyB3WzJdKnAyDQoNCiNSZXN0cmluZ2lkbw0Kd3N0YXIgPC0gY3JlZzMkY29lZmZpY2llbnRzDQp3IDwtIGFycmF5KGRpbT0yKQ0Kd1syXSA8LSB3c3Rhcg0Kd1sxXSA8LSAxIC0gc3VtKHdzdGFyKQ0KDQpueWhhdDMgPC0gd1sxXSpwMSArIHdbMl0qcDINCg0KDQp4bSA8LSBtZXJnZShuZXF3LCBueWhhdDEsIG55aGF0MiwgbnloYXQzKQ0KcCA8LSBhdXRvcGxvdCh4bSwgZmFjZXRzPU5VTEwpDQpnZ3Bsb3RseShwKQ0KDQpvcHRpb25zKGRpZ2l0cyA9IDUpDQphdXggPC0gYXMuZGF0YS5mcmFtZShtZXJnZShwbSwgeG0pKQ0KYXV4DQpgYGANCg0KI1RpcG8gZGUgaW50ZXLDqXMgYSBjb3J0byBwbGF6bw0KDQojI0FwYXJ0YWRvIDENCg0KRGl2aWRlIGxhcyBtdWVzdHJhcyBkZSBsYSB0YXJlYSBhbnRlcmlvciBlbiBsYSBtdWVzdHJhIGRlIGVzdGltYWNpw7NuIHkgbGEgbXVlc3RyYSBkZSBwcmVkaWNjacOzbi4NCg0KQ2FsY3VsYSBsYXMgcHJlZGljY2lvbmVzIGNvbiBsb3MgbW9kZWxvcyBBUklNQSB5IG9idMOpbiBsYXMgbWVkaWRhcyBkZSBhanVzdGUgZGUgbGEgcHJlZGljY2nDs24uDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KWCA8LSBsb2coc3QpDQpZIDwtIFhbMToxNDddDQpgYGANCg0KVGVuZW1vcyAxODMgb2JzZXJ2YWNpb25lcyBwYXJhIGVsIHRpcG8gZGUgaW50ZXLDqXMgYSBjb3J0byBwbGF6bywgcG9yIGxvIHF1ZSB1c2FyZW1vcyAxNDcgb2JzZXJ2YWNpb25lcyBkZSB0cmFpbmluZyB5IDM2IGRlIHRlc3QuDQoNCioqRXN0aW1hY2nDs24gZGUgbW9kZWxvcyoqDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbTEgPC0gQXJpbWEoWSwgYygzLDEsMiksIGluY2x1ZGUubWVhbj1GKQ0KbTENCm0xLmZpdCA8LSBmaXR0ZWQuQXJpbWEobTEpDQptMS5maXQgPC0geHRzKG0xLmZpdCwgaW5kZXgoWSkpDQptMS5kYXRhIDwtIG1lcmdlKFgsIG0xLmZpdCkNCm5hbWVzKG0xLmRhdGEpIDwtIGMoIkFjdHVhbCIsICJGaXQiKQ0KZHlncmFwaChtMS5kYXRhLCBtYWluPSJBUk1BKDMsMikiKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbTIgPC0gQXJpbWEoWSwgYygxLDEsMCksIGluY2x1ZGUubWVhbj1GKQ0KbTINCm0yLmZpdCA8LSBmaXR0ZWQuQXJpbWEobTIpDQptMi5maXQgPC0geHRzKG0yLmZpdCwgaW5kZXgoWSkpDQptMi5kYXRhIDwtIG1lcmdlKFgsIG0yLmZpdCkNCm5hbWVzKG0yLmRhdGEpIDwtIGMoIkFjdHVhbCIsICJGaXQiKQ0KZHlncmFwaChtMi5kYXRhLCBtYWluPSJBUigxKSIpDQpgYGANCg0KKipUZXN0aW5nIHNldCoqDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbTEuZiA8LSBmb3JlY2FzdC5BcmltYShtMSwgaD0zNiwgZmFuPVQpDQphdXRvcGxvdChtMS5mKQ0KDQptMi5mIDwtIGZvcmVjYXN0LkFyaW1hKG0yLCBoPTM2LCBmYW49VCkNCmF1dG9wbG90KG0yLmYpDQpgYGANCg0KKipNZWRpZGFzIGRlIGFqdXN0ZSBkZSBsYSBwcmVkaWNjacOzbioqDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KQSA8LSBtYXRyaXgobnJvdz0yLCBuY29sPTUpDQpjb2xuYW1lcyhBKSA8LSBjb2xuYW1lcyhhY2N1cmFjeShtMS5mJG1lYW4sIFhbMTQ4OjE4M10pKQ0KQVsxLF0gPC0gYWNjdXJhY3kobTEuZiRtZWFuLCBYWzE0ODoxODNdKQ0KQVsyLF0gPC0gYWNjdXJhY3kobTIuZiRtZWFuLCBYWzE0ODoxODNdKQ0Kcm93bmFtZXMoQSkgPC0gYygiQVJNQSgzLDIpIiwgIkFSKDEpIikNCkENCmBgYA0KDQoNCiMjQXBhcnRhZG8gMg0KDQpSZWFsaXphIGxvcyBjb250cmFzdGVzIGRlIHBvdGVuY2lhIGRlIHByZWRpY2Npw7NuLg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCm0xLnByZWQgPC0geHRzKG0xLmYkbWVhbiwgaW5kZXgoWClbMTQ4OjE4M10pDQplMSA8LSBYWzE0ODoxODNdIC0gbTEucHJlZA0KDQptMi5wcmVkIDwtIHh0cyhtMi5mJG1lYW4sIGluZGV4KFgpWzE0ODoxODNdKQ0KZTIgPC0gWFsxNDg6MTgzXSAtIG0yLnByZWQNCmBgYA0KDQoqKk1vcmdhbi1HcmFuZ2VyLU5ld2JvbGQgVGVzdCoqDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KdnkgPC0gZTEgKyBlMg0KdnggPC0gZTEgLSBlMg0KDQp2eSA8LSBhcy56b28odnkpDQp2eCA8LSBhcy56b28odngpDQptZ25yZWcgPC0gZHlubG0odnkgfnZ4KQ0KDQpjb2VmdGVzdChtZ25yZWcsIHZjb3Y9dmNvdkhBQykNCg0KYmd0ZXN0KG1nbnJlZywgb3JkZXI9MjQpDQoNCmJwdGVzdChtZ25yZWcpDQpgYGANCg0KRW4gZXN0ZSBjYXNvIGVsIGNvZWZpY2llbnRlICRcYmV0YSQgZXMgZGlzdGludG8gZGUgMCwgY29uIHVuIHAtdmFsb3IgZGUgMC4wNDQgcmVjaGF6YW1vcyBsYSBoaXDDs3Rlc2lzIG51bGEgeSBwb3IgdGFudG8gbG9zIG1vZGVsb3MgdGllbmVuIGRpc3RpbnRhIHBvdGVuY2lhIGRlIHByZWRpY2Npw7NuLg0KDQpFbiBlc3RlIGNhc28gbG9zIG1vZGVsb3MgQVJNQSgzLDIpIHkgQVIoMSkgdGllbmVuIGRpc3RpbnRhIHBvdGVuY2lhLg0KDQoqKkRpZWJvbGQtTWFyaWFubyBUZXN0KioNCg0KYGBge3IsIGVjaG89RkFMU0V9DQpkbS50ZXN0KGUxLCBlMiwgYWx0ZXJuYXRpdmU9InR3by5zaWRlZCIsIGg9MSwgcG93ZXI9MikNCg0KZG0udGVzdChlMSwgZTIsIGFsdGVybmF0aXZlPSJncmVhdGVyIiwgaD0xLCBwb3dlcj0yKQ0KDQpkbS50ZXN0KGUxLCBlMiwgYWx0ZXJuYXRpdmU9Imxlc3MiLCBoPTEsIHBvd2VyPTIpDQpgYGANCg0KUmVjaGF6YW1vcyBsYSBoaXDDs3Rlc2lzIG51bGEgZGUgcXVlIGxhcyBwb3RlbmNpYXMgZGUgcHJlZGljY2nDs24gc29uIGlndWFsZXMuDQoNCkVuIGVzdGUgY2FzbyBsb3MgcmVzdWx0YWRvcyBvYnRlbmlkb3Mgc29uIGNvbnRyYXJpb3MgYWwgdGVzdCBhbnRlcmlvciwgZWwgQVJNQSgzLDIpIGVzIGlndWFsIGRlIHByZWNpc28gcXVlIGVsIEFSKDEpLg0KDQpFbCBuaXZlbCBkZSBzaWduaWZpY2FjacOzbiBkZWwgdGVzdCBhbnRlcmlvciBzZSBlbmNvbnRyYWJhIG11eSBhbCBsw61taXRlIGRlIG5vIHJlY2hhemFyIGxhIGhpcMOzdGVzaXMgbnVsYSB5IHBvciB0YW50byBoYXJlbW9zIGNhc28gYWwgdGVzdCBkZSBEaWVib2xkLU1hcmlhbm8uDQoNCiMjQXBhcnRhZG8gMw0KDQpSZWFsaXphIGNvbWJpbmFjaW9uZXMgZGUgbGFzIHByZWRpY2Npb25lcy4NCg0KKipQZXNvcyBpZ3VhbGVzKioNCg0KYGBge3J9DQpYIDwtIGRpZmYoWCkNClkgPC0gZGlmZihZKQ0KbTEgPC0gQXJpbWEoWSwgYygzLDAsMiksIGluY2x1ZGUubWVhbj1GKQ0KbTIgPC0gQXJpbWEoWSwgYygxLDAsMCksIGluY2x1ZGUubWVhbj1GKQ0KbTEuZiA8LSBmb3JlY2FzdC5BcmltYShtMSwgaD0zNiwgZmFuPVQpDQptMi5mIDwtIGZvcmVjYXN0LkFyaW1hKG0yLCBoPTM2LCBmYW49VCkNCm0xLnByZWQgPC0geHRzKG0xLmYkbWVhbiwgaW5kZXgoWClbMTQ4OjE4M10pDQptMi5wcmVkIDwtIHh0cyhtMi5mJG1lYW4sIGluZGV4KFgpWzE0ODoxODNdKQ0KcDEgPC0gYXMuem9vKG0xLnByZWQpDQpwMiA8LSBhcy56b28obTIucHJlZCkNCllaIDwtIGFzLnpvbyhYWzE0ODoxODNdKQ0KDQpwZXcgPC0gKDEvMikqKHAxK3AyKQ0KYGBgDQoNCioqQmFzYWRvcyBlbiByZWdyZXNpw7NuKioNCg0KKioqTW9kZWxvIHNpbiByZXN0cmljY2nDs25lcyoqKg0KYGBge3IsIGVjaG89RkFMU0V9DQojTW9kZWxvIHNpbiByZXN0cmljY2nDs25lcw0KY3JlZzEgPC0gZHlubG0oWVogfiBwMSArIHAyKQ0Kc3VtbWFyeShjcmVnMSkNCnloYXQxIDwtIGNyZWcxJGZpdA0KYGBgDQoqKipNb2RlbG8gcGFyY2lhbG1lbnRlIHJlc3RyaW5naWRvKioqDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNNb2RlbG8gcGFyY2lhbG1lbnRlIHJlc3RyaW5naWRvDQpjcmVnMiA8LSBkeW5sbShZWiB+IDAgKyBwMSArIHAyKQ0Kc3VtbWFyeShjcmVnMikNCnloYXQyIDwtIGNyZWcyJGZpdA0KYGBgDQoNCioqKk1vZGVsbyByZXN0cmluZ2lkbyoqKg0KYGBge3IsIGVjaG89RkFMU0V9DQojTW9kZWxvIHJlc3RyaW5naWRvDQpZWnN0YXIgPC0gWVogLSBwMQ0KWDFzdGFyIDwtIHAyIC0gcDENCmNyZWczIDwtIGR5bmxtKFlac3RhciB+IDAgKyBYMXN0YXIpDQpzdW1tYXJ5KGNyZWczKQ0KeWhhdDMgPC0gY3JlZzMkZml0ICsgcDENCmBgYA0KDQoNCioqQ29tcGFyYWNpb25lcyBkZSBsYXMgY29tYmluYWNpb25lcyoqDQoNCk1BRToNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZXJlcXcgPC0gWVogLSBwZXcNCmVyY3JlZzEgPC0gWVogLSB5aGF0MQ0KZXJjcmVnMiA8LSBZWiAtIHloYXQyDQplcmNyZWczIDwtIFlaIC0geWhhdDMNCg0KbXlNQUUgPC0gZnVuY3Rpb24oeCkNCnsNCiAgcmV0dXJuKG1lYW4oYWJzKHgpKSkNCn0NCg0KWE0gPC0gY2JpbmQoZXJlcXcsIGVyY3JlZzEsIGVyY3JlZzIsIGVyY3JlZzMpDQpjb21iTUFFIDwtIGFwcGx5KFhNLCAyLCBteU1BRSkNCm5hbWVzKGNvbWJNQUUpIDwtIGMoIklQSS5lcmVxdyIsIklQSS5lcmNyZWcxIiwiSVBJLmVyY3JlZzIiLCJJUEkuZXJjcmVnMyIpDQpjb21iTUFFDQoNClpNIDwtIG1lcmdlKFlaLCBwZXcsIHloYXQxLCB5aGF0MiwgeWhhdDMpDQpuYW1lcyhaTSkgPC0gYygiQWN0dWFsIiwgIkVxLiBXIiwgIlJlZy4gMSIsICJSZWcuIDIiLCAiUmVnLiAzIikNCnAgPC0gYXV0b3Bsb3QoWk0sIGZhY2V0cyA9IE5VTEwpDQpnZ3Bsb3RseShwKQ0KYGBgDQoNCkVuIGVzdGUgY2FzbyByZXN1bHRhbiBtZWpvciBsYXMgcHJlZGljY2lvbmVzIGNvbiBsYSBjb21iaW5hY2lvbiBzaW4gcmVzdHJpY2Npb25lcyB5IGNvbnN0YW50ZSAoUmVnLiAxKS4NCg0KIyNBcGFydGFkbyA0DQoNClJlYWxpemEgcHJlZGljY2lvbmVzIGZ1ZXJhIGRlIGxhIG11ZXN0cmEuDQoNCkVzdGltYWNpw7NuIGRlIGxvcyBtb2RlbG9zIGNvbiB0b2RhIGxhIG11ZXN0cmE6DQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KWCA8LSBkaWZmKGxvZyhzdCkpDQpZIDwtIFhbLTFdDQoNCm0xbyA8LSBBcmltYShZLCBjKDMsMCwyKSwgaW5jbHVkZS5tZWFuID0gRikNCm0xbw0KDQptMm8gPC0gQXJpbWEoWSwgYygxLDAsMCksIGluY2x1ZGUubWVhbiA9IEYpDQptMm8NCmBgYA0KDQpQcmVkaWNjaW9uZXMgMTIgcGFzb3MgcG9yIGRlbGFudGU6DQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbTFvLmYgPC0gZm9yZWNhc3QuQXJpbWEobTFvLCBoPTEyLCBsZXZlbD0wLjk1KQ0KYXV0b3Bsb3QobTFvLmYpDQoNCm0yby5mIDwtIGZvcmVjYXN0LkFyaW1hKG0ybywgaD0xMiwgbGV2ZWw9MC45NSkNCmF1dG9wbG90KG0yby5mKQ0KDQpuZGF0ZXMgPC0gc2VxLkRhdGUoZnJvbT1hcy5EYXRlKCIyMDE3LTA0LTAxIiksIGxlbmd0aC5vdXQgPSAxMiwgYnkgPSAibW9udGgiKQ0KcDEgPC0gem9vKG0xby5mJG1lYW4sIG5kYXRlcykNCnAyIDwtIHpvbyhtMm8uZiRtZWFuLCBuZGF0ZXMpDQpwbSA8LSBtZXJnZShwMSwgcDIpDQpuYW1lcyhwbSkgPC0gYygiQVJNQSgzLDIpIiwgIkFSKDEpIikNCnAgPC0gYXV0b3Bsb3QocG0sIGZhY2V0cz1OVUxMKQ0KZ2dwbG90bHkocCkNCmBgYA0KDQoqKkNvbWJpbmFjaW9uZXMqKg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNQZXNvcyBpZ3VhbGVzDQpuZXF3IDwtICgxLzIpKihwMStwMikNCg0KI1NpbiByZXN0cmljY2lvbmVzDQp3IDwtIGNyZWcxJGNvZWZmaWNpZW50cw0KbnloYXQxIDwtIHdbMV0gKyB3WzJdKnAxICsgd1szXSpwMg0KDQojU2luIGNvbnN0YW50ZQ0KdyA8LSBjcmVnMiRjb2VmZmljaWVudHMNCm55aGF0MiA8LSB3WzFdKnAxICsgd1syXSpwMg0KDQojUmVzdHJpbmdpZG8NCndzdGFyIDwtIGNyZWczJGNvZWZmaWNpZW50cw0KdyA8LSBhcnJheShkaW09MikNCndbMl0gPC0gd3N0YXINCndbMV0gPC0gMSAtIHN1bSh3c3RhcikNCg0KbnloYXQzIDwtIHdbMV0qcDEgKyB3WzJdKnAyDQoNCg0KeG0gPC0gbWVyZ2UobmVxdywgbnloYXQxLCBueWhhdDIsIG55aGF0MykNCnAgPC0gYXV0b3Bsb3QoeG0sIGZhY2V0cz1OVUxMKQ0KZ2dwbG90bHkocCkNCg0Kb3B0aW9ucyhkaWdpdHMgPSA1KQ0KYXV4IDwtIGFzLmRhdGEuZnJhbWUobWVyZ2UocG0sIHhtKSkNCmF1eA0KYGBgDQoNCiNEaWZlcmVuY2lhbCBkZSB0aXBvIGRlIGludGVyZXMgYSBsYXJnbyBwbGF6bw0KDQojI0FwYXJ0YWRvIDENCg0KRGl2aWRlIGxhcyBtdWVzdHJhcyBkZSBsYSB0YXJlYSBhbnRlcmlvciBlbiBsYSBtdWVzdHJhIGRlIGVzdGltYWNpw7NuIHkgbGEgbXVlc3RyYSBkZSBwcmVkaWNjacOzbi4NCg0KQ2FsY3VsYSBsYXMgcHJlZGljY2lvbmVzIGNvbiBsb3MgbW9kZWxvcyBBUklNQSB5IG9idMOpbiBsYXMgbWVkaWRhcyBkZSBhanVzdGUgZGUgbGEgcHJlZGljY2nDs24uDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KWCA8LSBsb2coZGx0KQ0KWSA8LSBYWzE6MTQ3XQ0KYGBgDQoNClRlbmVtb3MgMTgzIG9ic2VydmFjaW9uZXMgcGFyYSBlbCBkaWZlcmVuY2lhbCBkZWwgdGlwbyBkZSBpbnRlcsOpcyBhIGxhcmdvIHBsYXpvLCBwb3IgbG8gcXVlIHVzYXJlbW9zIDE0NyBvYnNlcnZhY2lvbmVzIGRlIHRyYWluaW5nIHkgMzYgZGUgdGVzdC4NCg0KKipFc3RpbWFjacOzbiBkZSBtb2RlbG9zKioNCg0KYGBge3IsIGVjaG89RkFMU0V9DQptMSA8LSBBcmltYShZLCBjKDEsMSwxKSwgaW5jbHVkZS5tZWFuPUYpDQptMQ0KbTEuZml0IDwtIGZpdHRlZC5BcmltYShtMSkNCm0xLmZpdCA8LSB4dHMobTEuZml0LCBpbmRleChZKSkNCm0xLmRhdGEgPC0gbWVyZ2UoWCwgbTEuZml0KQ0KbmFtZXMobTEuZGF0YSkgPC0gYygiQWN0dWFsIiwgIkZpdCIpDQpkeWdyYXBoKG0xLmRhdGEsIG1haW49IkFSTUEoMSwxKSIpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQptMiA8LSBBcmltYShZLCBjKDMsMSwwKSwgaW5jbHVkZS5tZWFuPUYpDQptMg0KbTIuZml0IDwtIGZpdHRlZC5BcmltYShtMikNCm0yLmZpdCA8LSB4dHMobTIuZml0LCBpbmRleChZKSkNCm0yLmRhdGEgPC0gbWVyZ2UoWCwgbTIuZml0KQ0KbmFtZXMobTIuZGF0YSkgPC0gYygiQWN0dWFsIiwgIkZpdCIpDQpkeWdyYXBoKG0yLmRhdGEsIG1haW49IkFSKDMpIikNCmBgYA0KDQoqKlRlc3Rpbmcgc2V0KioNCg0KYGBge3IsIGVjaG89RkFMU0V9DQptMS5mIDwtIGZvcmVjYXN0LkFyaW1hKG0xLCBoPTM2LCBmYW49VCkNCmF1dG9wbG90KG0xLmYpDQoNCm0yLmYgPC0gZm9yZWNhc3QuQXJpbWEobTIsIGg9MzYsIGZhbj1UKQ0KYXV0b3Bsb3QobTIuZikNCmBgYA0KDQoqKk1lZGlkYXMgZGUgYWp1c3RlIGRlIGxhIHByZWRpY2Npw7NuKioNCg0KYGBge3IsIGVjaG89RkFMU0V9DQpBIDwtIG1hdHJpeChucm93PTIsIG5jb2w9NSkNCmNvbG5hbWVzKEEpIDwtIGNvbG5hbWVzKGFjY3VyYWN5KG0xLmYkbWVhbiwgWFsxNDg6MTgzXSkpDQpBWzEsXSA8LSBhY2N1cmFjeShtMS5mJG1lYW4sIFhbMTQ4OjE4M10pDQpBWzIsXSA8LSBhY2N1cmFjeShtMi5mJG1lYW4sIFhbMTQ4OjE4M10pDQpyb3duYW1lcyhBKSA8LSBjKCJBUk1BKDEsMSkiLCAiQVIoMykiKQ0KQQ0KYGBgDQoNCg0KIyNBcGFydGFkbyAyDQoNClJlYWxpemEgbG9zIGNvbnRyYXN0ZXMgZGUgcG90ZW5jaWEgZGUgcHJlZGljY2nDs24uDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbTEucHJlZCA8LSB4dHMobTEuZiRtZWFuLCBpbmRleChYKVsxNDg6MTgzXSkNCmUxIDwtIFhbMTQ4OjE4M10gLSBtMS5wcmVkDQoNCm0yLnByZWQgPC0geHRzKG0yLmYkbWVhbiwgaW5kZXgoWClbMTQ4OjE4M10pDQplMiA8LSBYWzE0ODoxODNdIC0gbTIucHJlZA0KYGBgDQoNCioqTW9yZ2FuLUdyYW5nZXItTmV3Ym9sZCBUZXN0KioNCg0KYGBge3IsIGVjaG89RkFMU0V9DQp2eSA8LSBlMSArIGUyDQp2eCA8LSBlMSAtIGUyDQoNCnZ5IDwtIGFzLnpvbyh2eSkNCnZ4IDwtIGFzLnpvbyh2eCkNCm1nbnJlZyA8LSBkeW5sbSh2eSB+dngpDQoNCmNvZWZ0ZXN0KG1nbnJlZywgdmNvdj12Y292SEFDKQ0KDQpiZ3Rlc3QobWducmVnLCBvcmRlcj00KQ0KDQpicHRlc3QobWducmVnKQ0KYGBgDQoNCkVuIGVzdGUgY2FzbyBlbCBjb2VmaWNpZW50ZSAkXGJldGEkIGVzIGRpc3RpbnRvIGRlIDAsIGNvbiB1biBwLXZhbG9yIGRlIDAuMDAwMTkgcmVjaGF6YW1vcyBsYSBoaXDDs3Rlc2lzIG51bGEgeSBwb3IgdGFudG8gbG9zIG1vZGVsb3MgdGllbmVuIGRpc3RpbnRhIHBvdGVuY2lhIGRlIHByZWRpY2Npw7NuLg0KDQpFbiBlc3RlIGNhc28gbG9zIG1vZGVsb3MgQVJNQSgxLDEpIHkgQVIoMykgdGllbmVuIGRpc3RpbnRhIHBvdGVuY2lhLg0KDQoqKkRpZWJvbGQtTWFyaWFubyBUZXN0KioNCg0KYGBge3IsIGVjaG89RkFMU0V9DQpkbS50ZXN0KGUxLCBlMiwgYWx0ZXJuYXRpdmU9InR3by5zaWRlZCIsIGg9MSwgcG93ZXI9MikNCg0KZG0udGVzdChlMSwgZTIsIGFsdGVybmF0aXZlPSJncmVhdGVyIiwgaD0xLCBwb3dlcj0yKQ0KDQpkbS50ZXN0KGUxLCBlMiwgYWx0ZXJuYXRpdmU9Imxlc3MiLCBoPTEsIHBvd2VyPTIpDQpgYGANCg0KUmVjaGF6YW1vcyBsYSBoaXDDs3Rlc2lzIG51bGEgZGUgcXVlIGxhcyBwb3RlbmNpYXMgZGUgcHJlZGljY2nDs24gc29uIGlndWFsZXMuDQoNCkVuIGVzdGUgY2FzbyBlbCBtb2RlbG8gQVJNQSgxLDEpIHNlIGFqdXN0YSBtZWpvciBxdWUgZWwgbW9kZWxvIEFSKDMpDQoNCg0KIyNBcGFydGFkbyAzDQoNClJlYWxpemEgY29tYmluYWNpb25lcyBkZSBsYXMgcHJlZGljY2lvbmVzLg0KDQoqKlBlc29zIGlndWFsZXMqKg0KDQpgYGB7cn0NClggPC0gZGlmZihYKQ0KWSA8LSBkaWZmKFkpDQptMSA8LSBBcmltYShZLCBjKDEsMCwxKSwgaW5jbHVkZS5tZWFuPUYpDQptMiA8LSBBcmltYShZLCBjKDMsMCwwKSwgaW5jbHVkZS5tZWFuPUYpDQptMS5mIDwtIGZvcmVjYXN0LkFyaW1hKG0xLCBoPTM2LCBmYW49VCkNCm0yLmYgPC0gZm9yZWNhc3QuQXJpbWEobTIsIGg9MzYsIGZhbj1UKQ0KbTEucHJlZCA8LSB4dHMobTEuZiRtZWFuLCBpbmRleChYKVsxNDg6MTgzXSkNCm0yLnByZWQgPC0geHRzKG0yLmYkbWVhbiwgaW5kZXgoWClbMTQ4OjE4M10pDQpwMSA8LSBhcy56b28obTEucHJlZCkNCnAyIDwtIGFzLnpvbyhtMi5wcmVkKQ0KWVogPC0gYXMuem9vKFhbMTQ4OjE4M10pDQoNCnBldyA8LSAoMS8yKSoocDErcDIpDQpgYGANCg0KKipCYXNhZG9zIGVuIHJlZ3Jlc2nDs24qKg0KDQoqKipNb2RlbG8gc2luIHJlc3RyaWNjacOzbmVzKioqDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNNb2RlbG8gc2luIHJlc3RyaWNjacOzbmVzDQpjcmVnMSA8LSBkeW5sbShZWiB+IHAxICsgcDIpDQpzdW1tYXJ5KGNyZWcxKQ0KeWhhdDEgPC0gY3JlZzEkZml0DQpgYGANCioqKk1vZGVsbyBwYXJjaWFsbWVudGUgcmVzdHJpbmdpZG8qKioNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI01vZGVsbyBwYXJjaWFsbWVudGUgcmVzdHJpbmdpZG8NCmNyZWcyIDwtIGR5bmxtKFlaIH4gMCArIHAxICsgcDIpDQpzdW1tYXJ5KGNyZWcyKQ0KeWhhdDIgPC0gY3JlZzIkZml0DQpgYGANCg0KKioqTW9kZWxvIHJlc3RyaW5naWRvKioqDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNNb2RlbG8gcmVzdHJpbmdpZG8NCllac3RhciA8LSBZWiAtIHAxDQpYMXN0YXIgPC0gcDIgLSBwMQ0KY3JlZzMgPC0gZHlubG0oWVpzdGFyIH4gMCArIFgxc3RhcikNCnN1bW1hcnkoY3JlZzMpDQp5aGF0MyA8LSBjcmVnMyRmaXQgKyBwMQ0KYGBgDQoNCg0KKipDb21wYXJhY2lvbmVzIGRlIGxhcyBjb21iaW5hY2lvbmVzKioNCg0KTUFFOg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQplcmVxdyA8LSBZWiAtIHBldw0KZXJjcmVnMSA8LSBZWiAtIHloYXQxDQplcmNyZWcyIDwtIFlaIC0geWhhdDINCmVyY3JlZzMgPC0gWVogLSB5aGF0Mw0KDQpteU1BRSA8LSBmdW5jdGlvbih4KQ0Kew0KICByZXR1cm4obWVhbihhYnMoeCkpKQ0KfQ0KDQpYTSA8LSBjYmluZChlcmVxdywgZXJjcmVnMSwgZXJjcmVnMiwgZXJjcmVnMykNCmNvbWJNQUUgPC0gYXBwbHkoWE0sIDIsIG15TUFFKQ0KbmFtZXMoY29tYk1BRSkgPC0gYygiSVBJLmVyZXF3IiwiSVBJLmVyY3JlZzEiLCJJUEkuZXJjcmVnMiIsIklQSS5lcmNyZWczIikNCmNvbWJNQUUNCg0KWk0gPC0gbWVyZ2UoWVosIHBldywgeWhhdDEsIHloYXQyLCB5aGF0MykNCm5hbWVzKFpNKSA8LSBjKCJBY3R1YWwiLCAiRXEuIFciLCAiUmVnLiAxIiwgIlJlZy4gMiIsICJSZWcuIDMiKQ0KcCA8LSBhdXRvcGxvdChaTSwgZmFjZXRzID0gTlVMTCkNCmdncGxvdGx5KHApDQpgYGANCg0KRW4gZXN0ZSBjYXNvIHJlc3VsdGFuIG1lam9yIGxhcyBwcmVkaWNjaW9uZXMgY29uIGxhIHJlZ3Jlc2lvbiByZXN0cmluZ2lkYSAoUmVnLiAzKS4NCg0KIyNBcGFydGFkbyA0DQoNClJlYWxpemEgcHJlZGljY2lvbmVzIGZ1ZXJhIGRlIGxhIG11ZXN0cmEuDQoNCkVzdGltYWNpw7NuIGRlIGxvcyBtb2RlbG9zIGNvbiB0b2RhIGxhIG11ZXN0cmE6DQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KWCA8LSBkaWZmKGxvZyhkbHQpKQ0KWSA8LSBYWy0xXQ0KDQptMW8gPC0gQXJpbWEoWSwgYygxLDAsMSksIGluY2x1ZGUubWVhbiA9IEYpDQptMW8NCg0KbTJvIDwtIEFyaW1hKFksIGMoMywwLDApLCBpbmNsdWRlLm1lYW4gPSBGKQ0KbTJvDQpgYGANCg0KUHJlZGljY2lvbmVzIDEyIHBhc29zIHBvciBkZWxhbnRlOg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCm0xby5mIDwtIGZvcmVjYXN0LkFyaW1hKG0xbywgaD0xMiwgbGV2ZWw9MC45NSkNCmF1dG9wbG90KG0xby5mKQ0KDQptMm8uZiA8LSBmb3JlY2FzdC5BcmltYShtMm8sIGg9MTIsIGxldmVsPTAuOTUpDQphdXRvcGxvdChtMm8uZikNCg0KbmRhdGVzIDwtIHNlcS5EYXRlKGZyb209YXMuRGF0ZSgiMjAxNy0wNC0wMSIpLCBsZW5ndGgub3V0ID0gMTIsIGJ5ID0gIm1vbnRoIikNCnAxIDwtIHpvbyhtMW8uZiRtZWFuLCBuZGF0ZXMpDQpwMiA8LSB6b28obTJvLmYkbWVhbiwgbmRhdGVzKQ0KcG0gPC0gbWVyZ2UocDEsIHAyKQ0KbmFtZXMocG0pIDwtIGMoIkFSTUEoMSwxKSIsICJBUigzKSIpDQpwIDwtIGF1dG9wbG90KHBtLCBmYWNldHM9TlVMTCkNCmdncGxvdGx5KHApDQpgYGANCg0KKipDb21iaW5hY2lvbmVzKioNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojUGVzb3MgaWd1YWxlcw0KbmVxdyA8LSAoMS8yKSoocDErcDIpDQoNCiNTaW4gcmVzdHJpY2Npb25lcw0KdyA8LSBjcmVnMSRjb2VmZmljaWVudHMNCm55aGF0MSA8LSB3WzFdICsgd1syXSpwMSArIHdbM10qcDINCg0KI1NpbiBjb25zdGFudGUNCncgPC0gY3JlZzIkY29lZmZpY2llbnRzDQpueWhhdDIgPC0gd1sxXSpwMSArIHdbMl0qcDINCg0KI1Jlc3RyaW5naWRvDQp3c3RhciA8LSBjcmVnMyRjb2VmZmljaWVudHMNCncgPC0gYXJyYXkoZGltPTIpDQp3WzJdIDwtIHdzdGFyDQp3WzFdIDwtIDEgLSBzdW0od3N0YXIpDQoNCm55aGF0MyA8LSB3WzFdKnAxICsgd1syXSpwMg0KDQoNCnhtIDwtIG1lcmdlKG5lcXcsIG55aGF0MSwgbnloYXQyLCBueWhhdDMpDQpwIDwtIGF1dG9wbG90KHhtLCBmYWNldHM9TlVMTCkNCmdncGxvdGx5KHApDQoNCm9wdGlvbnMoZGlnaXRzID0gNSkNCmF1eCA8LSBhcy5kYXRhLmZyYW1lKG1lcmdlKHBtLCB4bSkpDQphdXgNCmBgYA0KDQojRGlmZXJlbmNpYWwgZGUgdGlwbyBkZSBpbnRlcmVzIGEgbWVkaW8gcGxhem8NCg0KQWwgY2FsY3VsYXIgZXN0YSBzZXJpZSBvYnR1dmltb3MgcnVpZG8gYmxhbmNvIHkgcG9yIHRhbnRvIG5vIGNvbnRhbW9zIGNvbiBuaW5nw7puIG1vZGVsbyBhcmltYS4=