1. Descripción de la base de datos

La siguiente base de datos se obtuvo de https://www.investing.com/commodities/us-soybeans-historical-data en ella, se tiene el historial mensual desde febrero de 1990 hasta noviembre del 2022 sobre el precio futuro de la soya. Estos datos se obtienen por medio de La Asociación Estadounidense de la Soya (ASA) la cual representa a los productores de soya de EE.UU en cuestiones de política nacional e internacional importantes para la industria de la soya. Esta base de datos llamada los futuros de soja (Soybeans Futures) están disponibles para negociar en la Bolsa de Comercio de Chicago (CBOT®)

library(readxl)
soya <- read_excel("C:/Users/Lenovo/Downloads/SEPTIMOSEMESTRE/MMF/Parcial3MMF/USSoyBeans.xlsx")
View(soya)

2. Definir la serie de tiempo

Teniendo en cuenta que los datos utilizados estan distribuidos regularmente, es decir que tenemos un dato cada año desde febrero de 1990 hasta el mes de noviembre del 2022 entonces, en el siguiente fragmento de código definimos el objeto de la serie de tiempo ts, teniendo en cuenta que los datos son mensuales e inician en el año 1990 es decir que su frecuencia es de 12.

soya.ts <- ts(soya$Price , start = c(1990,02), frequency=12)
head(soya.ts)
        Feb    Mar    Apr    May    Jun    Jul
1990 566.50 595.00 632.50 607.25 623.50 594.50
frequency(soya.ts)
[1] 12
plot(soya.ts)

plot(decompose(soya.ts))

El análisis nos revela que tenemos que eliminar la estacionalidad de la serie.

3. Si es necesario, utilizar transformación Box-Cox / logaritmos para estabilizar la varianza.

No me permite realizar el BoxCox.

4. Modelar la serie de tiempo elegida como función de una tendencia, tendencia cuadrática y/o medias estacionales. Presente el diagnóstico del modelo elegido.

modelo1<-lm(soya.ts~time(soya.ts))
summary(modelo1)

Call:
lm(formula = soya.ts ~ time(soya.ts))

Residuals:
   Min     1Q Median     3Q    Max 
-360.0 -202.2  -11.9  134.6  743.9 

Coefficients:
                Estimate Std. Error t value Pr(>|t|)    
(Intercept)   -48329.421   2435.558  -19.84   <2e-16 ***
time(soya.ts)     24.516      1.214   20.20   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 228.4 on 392 degrees of freedom
Multiple R-squared:  0.5099,    Adjusted R-squared:  0.5087 
F-statistic: 407.9 on 1 and 392 DF,  p-value: < 2.2e-16

En esta primer regresión podemos ver que nuestro intercepto es de -48329.421 y nuestra variable independiente es de 24.516 lo que significa que cada año que pasa aumenta en 24.516 el precio de venta de la soya. Aunque las variables son significativas, note que el valor R-cuadrado es de 0.50 por lo tanto, la estimación no es muy eficiente se puede tener una mejor.

A continuación se hizo un modelo con un ajuste cuadrático para mejorar el ajuste.

modelo2<-lm(soya.ts~time(soya.ts)+ I(time(soya.ts)^2))
summary(modelo2)

Call:
lm(formula = soya.ts ~ time(soya.ts) + I(time(soya.ts)^2))

Residuals:
    Min      1Q  Median      3Q     Max 
-385.70 -189.11   -6.68  124.09  757.00 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)  
(Intercept)         9.602e+05  5.749e+05   1.670   0.0957 .
time(soya.ts)      -9.808e+02  5.731e+02  -1.711   0.0878 .
I(time(soya.ts)^2)  2.505e-01  1.428e-01   1.754   0.0802 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 227.8 on 391 degrees of freedom
Multiple R-squared:  0.5138,    Adjusted R-squared:  0.5113 
F-statistic: 206.6 on 2 and 391 DF,  p-value: < 2.2e-16

Con este ajuste vemos que el tiempo, y el tiempo al cuadrado no son significativos, ademas las variables no son significativas.

5. En caso de estacionalidad de la serie de tiempo, aplicar diferencias estacionales.

Para ello, verificamos cuantas diferencias estacionales se deben realizar.

ndiffs(soya.ts)
[1] 1

Como se puede ver, es necesario aplicar diferenciación una vez con el fin de lograr que la serie sea estacionaria.

dif.soya.ts <- diff(soya.ts)
plot(dif.soya.ts)

6. Usar prueba Dickey-Fuller para evaluar el orden de integración de la serie.

Anteriormente, realizamos una vez el proceso de diferenciación tal como se pedia por ende, verificaremos si finalmente la serie es ESTACIONARIA por medio de la pruebaDicker-Fuller ‘adf.test’

\(H_0\) = La serie es no estacionaria.

\(H_1\) = La serie es estacionaria

adf.test(dif.soya.ts, alternative = c("stationary", "explosive"))
Warning in adf.test(dif.soya.ts, alternative = c("stationary", "explosive")) :
  p-value smaller than printed p-value

    Augmented Dickey-Fuller Test

data:  dif.soya.ts
Dickey-Fuller = -8.5377, Lag order = 7, p-value = 0.01
alternative hypothesis: stationary

Con la prueba Dickey-Fuller comparamos el p-value, el cual es de 0.01 con \(\alpha = 0.05\), por lo tanto se rechaza la hipótesis nula de que no es estacionaria, por lo que ya podemos empezar a crear modelos.

7. Usar herramientas ACF, PACF y/o criterios de Akaike/ Bayes para construir propuestas de modelos.

par(mfrow=c(1,2))
acf(dif.soya.ts)
pacf(dif.soya.ts)

Note que algunos rezagos se salen de los limites que tienen las ACF y PACF.

8. Ajuste del ARIMA

A continuación, por medio de la función auto.arima() se realizara un ajuste automático de un modelo ARIMA a la serie de tiempo que estamos trabajando, en este caso se obtiene ARIMA(0,0,0) es decir, que solo depende del ruido blanco.

modelo<-auto.arima(dif.soya.ts)
modelo
Series: dif.soya.ts 
ARIMA(0,0,0) with zero mean 

sigma^2 = 4846:  log likelihood = -2225.13
AIC=4452.26   AICc=4452.27   BIC=4456.24
residuo <- residuals(modelo)
acf(residuo)

Se puede concluir que los residuos no tienen solo un comportamiento de ruido blanco, por lo que el modelo arima podria no estar siendo el adecuado para realizar predicciones.

9. Realizar el pronóstico ARIMA para dos años.

A continuación, se realizan las predicciones del precio futuro de la soya para los proximos 12 meses y se visualizan graficamente teniendo de teniendo en cuenta el modelo generado anteriormente.

pred<-forecast(modelo,h=12)
plot(forecast(modelo))

Note que la predicción graficamente se ve como un valor constante y esto puede estar sucediendo porque los valores estan siendo muy cercanos unos a los otros.

10. Utilizando metodos de pronósticos simples y/o suavizamiento exponencial generar un pronóstico para dos años. Elegir el método que presente la raíz del error medio al cuadrado más pequeño.

Para poder realizar el pronostico de nuestra serie, se realizo un recorte de los ultimos dos años para pronosticar nuestra serie mediante los metodos mean(media), naive y naive estacional.

DIVPRO<-window(dif.soya.ts,start=2020,end=c(2022,11))

autoplot(DIVPRO) 

plot(SOYA2)

plot(SOYA3)

plot(SOYA4)

Una vez comparado con los dos años siguientes de la serie, concluimos que el metodo de naive estacional presenta un comportamiento mas logico y razonable para los siguientes años.

11. Modelo GARCH

Dado que se tiene una serie de tiempo financiera considero que se podria hacer uso de otro modelo que permita tener un mejor pronóstico teniendo en cuenta que la información adicional de pasado podria estar afectando la variación del pronostico y no se estaria ajustando bien a los datos.

Por medio de las grafica de ACF y PACF, algunos rezagos se salen, esto implica que la varianza es heterocedastica sin embargo, esto lo identificaremos por medio de la prube ARCHTEST.

\(H_0\) = No hay efectos ARCH.

\(H_1\) = Hay efectos ARCH

require(rugarch)
require(FinTS)
ipcArchTest <- ArchTest(dif.soya.ts, lags=1, demean = TRUE)
ipcArchTest

    ARCH LM-test; Null hypothesis: no ARCH effects

data:  dif.soya.ts
Chi-squared = 24.536, df = 1, p-value = 7.294e-07

Dado que el p-value es menor a 0.05 rechazamos \(H0\) y por ende, la varianza es heterocedastica. A continuación, se intenta ajustar un modelo GARCH al conjunto de datos con el ARIMA que se viene trabajando. De aquí se tiene que el modelo GARCH adecuado es GARCH(1,1)

ug.spec = ugarchspec(mean.model = list(armaOrder=c(0,0)))
ugfit = ugarchfit(spec = ug.spec, data = dif.soya.ts )

Predicciones modelo GARCH

pred<-ugarchforecast(ugfit,n.ahead=10)
plot(pred, which=1)

ugfit

*---------------------------------*
*          GARCH Model Fit        *
*---------------------------------*

Conditional Variance Dynamics   
-----------------------------------
GARCH Model : sGARCH(1,1)
Mean Model  : ARFIMA(0,0,0)
Distribution    : norm 

Optimal Parameters
------------------------------------
        Estimate  Std. Error  t value Pr(>|t|)
mu       1.15857    2.011382  0.57601 0.564611
omega  170.83594   62.509117  2.73298 0.006276
alpha1   0.34009    0.070140  4.84880 0.000001
beta1    0.65891    0.057927 11.37477 0.000000

Robust Standard Errors:
        Estimate  Std. Error  t value Pr(>|t|)
mu       1.15857    2.088479  0.55474 0.579071
omega  170.83594   68.287771  2.50171 0.012360
alpha1   0.34009    0.068275  4.98126 0.000001
beta1    0.65891    0.055666 11.83679 0.000000

LogLikelihood : -2132.85 

Information Criteria
------------------------------------
                   
Akaike       10.875
Bayes        10.915
Shibata      10.874
Hannan-Quinn 10.891

Weighted Ljung-Box Test on Standardized Residuals
------------------------------------
                        statistic p-value
Lag[1]                      1.258  0.2620
Lag[2*(p+q)+(p+q)-1][2]     1.521  0.3561
Lag[4*(p+q)+(p+q)-1][5]     2.119  0.5906
d.o.f=0
H0 : No serial correlation

Weighted Ljung-Box Test on Standardized Squared Residuals
------------------------------------
                        statistic p-value
Lag[1]                  0.0007906  0.9776
Lag[2*(p+q)+(p+q)-1][5] 0.4403817  0.9665
Lag[4*(p+q)+(p+q)-1][9] 1.7360791  0.9341
d.o.f=2

Weighted ARCH LM Tests
------------------------------------
            Statistic Shape Scale P-Value
ARCH Lag[3]   0.02256 0.500 2.000  0.8806
ARCH Lag[5]   0.69225 1.440 1.667  0.8258
ARCH Lag[7]   1.67778 2.315 1.543  0.7851

Nyblom stability test
------------------------------------
Joint Statistic:  0.9519
Individual Statistics:              
mu     0.03124
omega  0.71250
alpha1 0.24520
beta1  0.42925

Asymptotic Critical Values (10% 5% 1%)
Joint Statistic:         1.07 1.24 1.6
Individual Statistic:    0.35 0.47 0.75

Sign Bias Test
------------------------------------


Adjusted Pearson Goodness-of-Fit Test:
------------------------------------
  group statistic p-value(g-1)
1    20     32.80      0.02534
2    30     43.87      0.03775
3    40     42.52      0.32191
4    50     54.71      0.26678


Elapsed time : 0.181515 

Los coeficientes están siendo significativos por ende, el modelo GARCH(1,1) se puede utilizar y este tendrá en cuenta información del pasado que podría estar afectando la variación del pronóstico. En este caso del modelo GARCH, se tiene en cuenta que la varianza es heterocedastica y que depende de los residuales al cuadrado rezagados como también de la varianza rezagada.

Conclusion

Aunque la predicción del modelo ARIMA(0,0,0) gráficamente se ve como un valor constante, esto puede estar sucediendo porque los valores están siendo muy cercanos unos a los otros considero que el modelo no será muy eficiente puesto que la serie inicial no era estacionaria, se le realizo una diferenciación y además, no logre utilizar transformación Box-Cox / logaritmos para estabilizar la varianza lo cual puede influir en el resultado del pronóstico de un modelo ARIMA. Sin embargo, los residuales se están saliendo de los límites establecidos, hay rezagos. Por ende, recurrir a otro tipo de modelos que permitan capturar este tipo de comportamientos de la serie, es lo más adecuado con el fin de obtener un mejor pronostico.

LS0tDQp0aXRsZTogIlBhcmNpYWwgMyAtIE1NRiAiDQphdXRob3I6ICJJc2FiZWxsYSBIZXJuYW5kZXogTyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpyZXF1aXJlKHN0YXRzKQ0KcmVxdWlyZSh0c2VyaWVzKQ0KcmVxdWlyZShmR2FyY2gpDQpyZXF1aXJlKHpvbykNCnJlcXVpcmUoZm9yZWNhc3QpDQpyZXF1aXJlKHRpbXNhYykNCnJlcXVpcmUoVFNBKQ0KcmVxdWlyZShNQVNTKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShmb3JlY2FzdCkNCmBgYA0KIyMjIDEuIERlc2NyaXBjacOzbiBkZSBsYSBiYXNlIGRlIGRhdG9zDQoNCkxhIHNpZ3VpZW50ZSBiYXNlIGRlIGRhdG9zIHNlIG9idHV2byBkZSBodHRwczovL3d3dy5pbnZlc3RpbmcuY29tL2NvbW1vZGl0aWVzL3VzLXNveWJlYW5zLWhpc3RvcmljYWwtZGF0YSBlbiBlbGxhLCBzZSB0aWVuZSBlbCBoaXN0b3JpYWwgbWVuc3VhbCBkZXNkZSBmZWJyZXJvIGRlIDE5OTAgaGFzdGEgbm92aWVtYnJlIGRlbCAyMDIyIHNvYnJlIGVsIHByZWNpbyBmdXR1cm8gZGUgbGEgc295YS4gRXN0b3MgZGF0b3Mgc2Ugb2J0aWVuZW4gcG9yIG1lZGlvIGRlIExhIEFzb2NpYWNpw7NuIEVzdGFkb3VuaWRlbnNlIGRlIGxhIFNveWEgKEFTQSkgbGEgY3VhbCByZXByZXNlbnRhIGEgbG9zIHByb2R1Y3RvcmVzIGRlIHNveWEgZGUgRUUuVVUgZW4gY3Vlc3Rpb25lcyBkZSBwb2zDrXRpY2EgbmFjaW9uYWwgZSBpbnRlcm5hY2lvbmFsIGltcG9ydGFudGVzIHBhcmEgbGEgaW5kdXN0cmlhIGRlIGxhIHNveWEuIEVzdGEgYmFzZSBkZSBkYXRvcyBsbGFtYWRhIGxvcyBmdXR1cm9zIGRlIHNvamEgKFNveWJlYW5zIEZ1dHVyZXMpIGVzdMOhbiBkaXNwb25pYmxlcyBwYXJhIG5lZ29jaWFyIGVuIGxhIEJvbHNhIGRlIENvbWVyY2lvIGRlIENoaWNhZ28gKENCT1TCrikNCg0KDQpgYGB7cn0NCmxpYnJhcnkocmVhZHhsKQ0Kc295YSA8LSByZWFkX2V4Y2VsKCJDOi9Vc2Vycy9MZW5vdm8vRG93bmxvYWRzL1NFUFRJTU9TRU1FU1RSRS9NTUYvUGFyY2lhbDNNTUYvVVNTb3lCZWFucy54bHN4IikNClZpZXcoc295YSkNCmBgYA0KDQojIyAyLiBEZWZpbmlyIGxhIHNlcmllIGRlIHRpZW1wbw0KDQpUZW5pZW5kbyBlbiBjdWVudGEgcXVlIGxvcyBkYXRvcyB1dGlsaXphZG9zIGVzdGFuIGRpc3RyaWJ1aWRvcyByZWd1bGFybWVudGUsIGVzIGRlY2lyIHF1ZSB0ZW5lbW9zIHVuIGRhdG8gY2FkYSBhw7FvIGRlc2RlIGZlYnJlcm8gZGUgMTk5MCBoYXN0YSBlbCBtZXMgZGUgbm92aWVtYnJlIGRlbCAyMDIyIGVudG9uY2VzLCBlbiBlbCBzaWd1aWVudGUgZnJhZ21lbnRvIGRlIGPDs2RpZ28gZGVmaW5pbW9zIGVsIG9iamV0byBkZSBsYSBzZXJpZSBkZSB0aWVtcG8gKip0cyoqLCB0ZW5pZW5kbyBlbiBjdWVudGEgcXVlIGxvcyBkYXRvcyBzb24gbWVuc3VhbGVzIGUgaW5pY2lhbiBlbiBlbCBhw7FvIDE5OTAgZXMgZGVjaXIgcXVlIHN1IGZyZWN1ZW5jaWEgZXMgZGUgMTIuDQoNCmBgYHtyfQ0Kc295YS50cyA8LSB0cyhzb3lhJFByaWNlICwgc3RhcnQgPSBjKDE5OTAsMDIpLCBmcmVxdWVuY3k9MTIpDQpoZWFkKHNveWEudHMpDQpmcmVxdWVuY3koc295YS50cykNCnBsb3Qoc295YS50cykNCmBgYA0KDQpgYGB7cn0NCnBsb3QoZGVjb21wb3NlKHNveWEudHMpKQ0KYGBgDQpFbCBhbsOhbGlzaXMgbm9zIHJldmVsYSBxdWUgdGVuZW1vcyBxdWUgZWxpbWluYXIgbGEgZXN0YWNpb25hbGlkYWQgZGUgbGEgc2VyaWUuDQoNCiMjIyAzLiBTaSBlcyBuZWNlc2FyaW8sIHV0aWxpemFyIHRyYW5zZm9ybWFjacOzbiBCb3gtQ294IC8gbG9nYXJpdG1vcyBwYXJhIGVzdGFiaWxpemFyIGxhIHZhcmlhbnphLg0KDQpObyBtZSBwZXJtaXRlIHJlYWxpemFyIGVsIEJveENveC4NCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpsaWJyYXJ5KFRTQSkNCkJveENveC5hcihzb3lhLnRzKQ0KDQpgYGANCiMjIyA0LiBNb2RlbGFyIGxhIHNlcmllIGRlIHRpZW1wbyBlbGVnaWRhIGNvbW8gZnVuY2nDs24gZGUgdW5hIHRlbmRlbmNpYSwgdGVuZGVuY2lhIGN1YWRyw6F0aWNhIHkvbyBtZWRpYXMgZXN0YWNpb25hbGVzLiBQcmVzZW50ZSBlbCBkaWFnbsOzc3RpY28gZGVsIG1vZGVsbyBlbGVnaWRvLg0KDQpgYGB7cn0NCm1vZGVsbzE8LWxtKHNveWEudHN+dGltZShzb3lhLnRzKSkNCnN1bW1hcnkobW9kZWxvMSkNCmBgYA0KDQpFbiBlc3RhIHByaW1lciByZWdyZXNpw7NuIHBvZGVtb3MgdmVyIHF1ZSBudWVzdHJvIGludGVyY2VwdG8gZXMgZGUgLTQ4MzI5LjQyMSB5IG51ZXN0cmEgdmFyaWFibGUgaW5kZXBlbmRpZW50ZSBlcyBkZSAyNC41MTYgbG8gcXVlIHNpZ25pZmljYSBxdWUgY2FkYSBhw7FvIHF1ZSBwYXNhIGF1bWVudGEgZW4gMjQuNTE2IGVsIHByZWNpbyBkZSB2ZW50YSBkZSBsYSBzb3lhLiBBdW5xdWUgbGFzIHZhcmlhYmxlcyBzb24gc2lnbmlmaWNhdGl2YXMsIG5vdGUgcXVlIGVsIHZhbG9yIFItY3VhZHJhZG8gZXMgZGUgMC41MCBwb3IgbG8gdGFudG8sIGxhIGVzdGltYWNpw7NuIG5vIGVzIG11eSBlZmljaWVudGUgc2UgcHVlZGUgdGVuZXIgdW5hIG1lam9yLg0KDQpBIGNvbnRpbnVhY2nDs24gc2UgaGl6byB1biBtb2RlbG8gY29uIHVuIGFqdXN0ZSBjdWFkcsOhdGljbyBwYXJhIG1lam9yYXIgZWwgYWp1c3RlLg0KDQpgYGB7cn0NCm1vZGVsbzI8LWxtKHNveWEudHN+dGltZShzb3lhLnRzKSsgSSh0aW1lKHNveWEudHMpXjIpKQ0Kc3VtbWFyeShtb2RlbG8yKQ0KYGBgDQoNCkNvbiBlc3RlIGFqdXN0ZSB2ZW1vcyBxdWUgZWwgdGllbXBvLCB5IGVsIHRpZW1wbyBhbCBjdWFkcmFkbyBubyBzb24gc2lnbmlmaWNhdGl2b3MsIGFkZW1hcyBsYXMgdmFyaWFibGVzIG5vIHNvbiBzaWduaWZpY2F0aXZhcy4gDQoNCg0KIyMjIDUuIEVuIGNhc28gZGUgZXN0YWNpb25hbGlkYWQgZGUgbGEgc2VyaWUgZGUgdGllbXBvLCBhcGxpY2FyIGRpZmVyZW5jaWFzIGVzdGFjaW9uYWxlcy4gDQoNClBhcmEgZWxsbywgdmVyaWZpY2Ftb3MgY3VhbnRhcyBkaWZlcmVuY2lhcyBlc3RhY2lvbmFsZXMgc2UgZGViZW4gcmVhbGl6YXIuIA0KDQpgYGB7ciBlY2hvPVRSVUV9DQpuZGlmZnMoc295YS50cykNCmBgYA0KQ29tbyBzZSBwdWVkZSB2ZXIsIGVzIG5lY2VzYXJpbyBhcGxpY2FyIGRpZmVyZW5jaWFjacOzbiB1bmEgdmV6IGNvbiBlbCBmaW4gZGUgbG9ncmFyIHF1ZSBsYSBzZXJpZSBzZWEgZXN0YWNpb25hcmlhLg0KDQpgYGB7ciBlY2hvPVRSVUV9DQpkaWYuc295YS50cyA8LSBkaWZmKHNveWEudHMpDQpwbG90KGRpZi5zb3lhLnRzKQ0KYGBgDQoNCiMjIyA2LiBVc2FyIHBydWViYSBEaWNrZXktRnVsbGVyIHBhcmEgZXZhbHVhciBlbCBvcmRlbiBkZSBpbnRlZ3JhY2nDs24gZGUgbGEgc2VyaWUuDQoNCkFudGVyaW9ybWVudGUsIHJlYWxpemFtb3MgdW5hIHZleiBlbCBwcm9jZXNvIGRlIGRpZmVyZW5jaWFjacOzbiB0YWwgY29tbyBzZSBwZWRpYSBwb3IgZW5kZSwgdmVyaWZpY2FyZW1vcyBzaSBmaW5hbG1lbnRlIGxhIHNlcmllIGVzIEVTVEFDSU9OQVJJQSBwb3IgbWVkaW8gZGUgbGEgcHJ1ZWJhRGlja2VyLUZ1bGxlciDigJhhZGYudGVzdOKAmQ0KDQokSF8wJCA9IExhIHNlcmllIGVzIG5vIGVzdGFjaW9uYXJpYS4NCg0KJEhfMSQgPSBMYSBzZXJpZSBlcyBlc3RhY2lvbmFyaWENCg0KYGBge3IgZWNobz1UUlVFfQ0KYWRmLnRlc3QoZGlmLnNveWEudHMsIGFsdGVybmF0aXZlID0gYygic3RhdGlvbmFyeSIsICJleHBsb3NpdmUiKSkNCmBgYA0KDQogQ29uIGxhIHBydWViYSBEaWNrZXktRnVsbGVyIGNvbXBhcmFtb3MgZWwgcC12YWx1ZSwgZWwgY3VhbCBlcyBkZSAwLjAxIGNvbiAkXGFscGhhID0gMC4wNSQsIHBvciBsbyB0YW50byBzZSByZWNoYXphIGxhIGhpcMOzdGVzaXMgbnVsYSBkZSBxdWUgbm8gZXMgZXN0YWNpb25hcmlhLCBwb3IgbG8gcXVlIHlhIHBvZGVtb3MgZW1wZXphciBhIGNyZWFyIG1vZGVsb3MuDQoNCiMjIyA3LiBVc2FyIGhlcnJhbWllbnRhcyBBQ0YsIFBBQ0YgeS9vIGNyaXRlcmlvcyBkZSBBa2Fpa2UvIEJheWVzIHBhcmEgY29uc3RydWlyIHByb3B1ZXN0YXMgZGUgbW9kZWxvcy4NCg0KYGBge3IgZWNobz1UUlVFfQ0KcGFyKG1mcm93PWMoMSwyKSkNCmFjZihkaWYuc295YS50cykNCnBhY2YoZGlmLnNveWEudHMpDQpgYGANCg0KTm90ZSBxdWUgYWxndW5vcyByZXphZ29zIHNlIHNhbGVuIGRlIGxvcyBsaW1pdGVzIHF1ZSB0aWVuZW4gbGFzIEFDRiB5IFBBQ0YuIA0KDQoNCiMjIDguIEFqdXN0ZSBkZWwgQVJJTUENCg0KQSBjb250aW51YWNpw7NuLCBwb3IgbWVkaW8gZGUgbGEgZnVuY2nDs24gYXV0by5hcmltYSgpIHNlIHJlYWxpemFyYSB1biBhanVzdGUgYXV0b23DoXRpY28gZGUgdW4gbW9kZWxvIEFSSU1BIGEgbGEgc2VyaWUgZGUgdGllbXBvIHF1ZSBlc3RhbW9zIHRyYWJhamFuZG8sIGVuIGVzdGUgY2FzbyBzZSBvYnRpZW5lIEFSSU1BKDAsMCwwKSBlcyBkZWNpciwgcXVlIHNvbG8gZGVwZW5kZSBkZWwgcnVpZG8gYmxhbmNvLg0KDQpgYGB7ciBlY2hvPVRSVUV9DQptb2RlbG88LWF1dG8uYXJpbWEoZGlmLnNveWEudHMpDQptb2RlbG8NCg0KcmVzaWR1byA8LSByZXNpZHVhbHMobW9kZWxvKQ0KYWNmKHJlc2lkdW8pDQpgYGANClNlIHB1ZWRlIGNvbmNsdWlyIHF1ZSBsb3MgcmVzaWR1b3Mgbm8gdGllbmVuIHNvbG8gdW4gY29tcG9ydGFtaWVudG8gZGUgcnVpZG8gYmxhbmNvLCBwb3IgbG8gcXVlIGVsIG1vZGVsbyBhcmltYSBwb2RyaWEgbm8gZXN0YXIgc2llbmRvIGVsIGFkZWN1YWRvIHBhcmEgcmVhbGl6YXIgcHJlZGljY2lvbmVzLg0KDQojIyMgOS4gUmVhbGl6YXIgZWwgcHJvbsOzc3RpY28gQVJJTUEgcGFyYSBkb3MgYcOxb3MuDQoNCg0KQSBjb250aW51YWNpw7NuLCBzZSByZWFsaXphbiBsYXMgcHJlZGljY2lvbmVzIGRlbCBwcmVjaW8gZnV0dXJvIGRlIGxhIHNveWEgcGFyYSBsb3MgcHJveGltb3MgMTIgbWVzZXMgeSBzZSB2aXN1YWxpemFuIGdyYWZpY2FtZW50ZSB0ZW5pZW5kbyBkZSB0ZW5pZW5kbyBlbiBjdWVudGEgZWwgbW9kZWxvIGdlbmVyYWRvIGFudGVyaW9ybWVudGUuIA0KDQpgYGB7ciBlY2hvPVRSVUV9DQpwcmVkPC1mb3JlY2FzdChtb2RlbG8saD0xMikNCnBsb3QoZm9yZWNhc3QobW9kZWxvKSkNCmBgYA0KTm90ZSBxdWUgbGEgcHJlZGljY2nDs24gZ3JhZmljYW1lbnRlIHNlIHZlIGNvbW8gdW4gdmFsb3IgY29uc3RhbnRlIHkgZXN0byBwdWVkZSBlc3RhciBzdWNlZGllbmRvIHBvcnF1ZSBsb3MgdmFsb3JlcyBlc3RhbiBzaWVuZG8gbXV5IGNlcmNhbm9zIHVub3MgYSBsb3Mgb3Ryb3MuDQoNCiMjIDEwLiBVdGlsaXphbmRvIG1ldG9kb3MgZGUgcHJvbsOzc3RpY29zIHNpbXBsZXMgeS9vIHN1YXZpemFtaWVudG8gZXhwb25lbmNpYWwgZ2VuZXJhciB1biBwcm9uw7NzdGljbyBwYXJhIGRvcyBhw7Fvcy4gRWxlZ2lyIGVsIG3DqXRvZG8gcXVlIHByZXNlbnRlIGxhIHJhw616IGRlbCBlcnJvciBtZWRpbyBhbCBjdWFkcmFkbyBtw6FzIHBlcXVlw7FvLg0KDQpQYXJhIHBvZGVyIHJlYWxpemFyIGVsIHByb25vc3RpY28gZGUgbnVlc3RyYSBzZXJpZSwgc2UgcmVhbGl6byB1biByZWNvcnRlIGRlIGxvcyB1bHRpbW9zIGRvcyBhw7FvcyBwYXJhIHByb25vc3RpY2FyIG51ZXN0cmEgc2VyaWUgbWVkaWFudGUgbG9zIG1ldG9kb3MgbWVhbihtZWRpYSksIG5haXZlIHkgbmFpdmUgZXN0YWNpb25hbC4NCg0KYGBge3IgZWNobz1UUlVFfQ0KRElWUFJPPC13aW5kb3coZGlmLnNveWEudHMsc3RhcnQ9MjAyMCxlbmQ9YygyMDIyLDExKSkNCg0KYXV0b3Bsb3QoRElWUFJPKSANCmBgYA0KDQpgYGB7ciBlY2hvPVRSVUV9DQpwbG90KFNPWUEyKQ0KYGBgDQoNCmBgYHtyIGVjaG89VFJVRX0NCnBsb3QoU09ZQTMpDQpgYGANCg0KYGBge3IgZWNobz1UUlVFfQ0KcGxvdChTT1lBNCkNCmBgYA0KDQpVbmEgdmV6IGNvbXBhcmFkbyBjb24gbG9zIGRvcyBhw7FvcyBzaWd1aWVudGVzIGRlIGxhIHNlcmllLCBjb25jbHVpbW9zIHF1ZSBlbCBtZXRvZG8gZGUgbmFpdmUgZXN0YWNpb25hbCBwcmVzZW50YSB1biBjb21wb3J0YW1pZW50byBtYXMgbG9naWNvIHkgcmF6b25hYmxlIHBhcmEgbG9zIHNpZ3VpZW50ZXMgYcOxb3MuDQoNCiMjIDExLiBNb2RlbG8gR0FSQ0gNCg0KRGFkbyBxdWUgc2UgdGllbmUgdW5hIHNlcmllIGRlIHRpZW1wbyBmaW5hbmNpZXJhIGNvbnNpZGVybyBxdWUgc2UgcG9kcmlhIGhhY2VyIHVzbyBkZSBvdHJvIG1vZGVsbyBxdWUgcGVybWl0YSB0ZW5lciB1biBtZWpvciBwcm9uw7NzdGljbyB0ZW5pZW5kbyBlbiBjdWVudGEgcXVlIGxhIGluZm9ybWFjacOzbiBhZGljaW9uYWwgZGUgcGFzYWRvIHBvZHJpYSBlc3RhciBhZmVjdGFuZG8gbGEgdmFyaWFjacOzbiBkZWwgcHJvbm9zdGljbyB5IG5vIHNlIGVzdGFyaWEgYWp1c3RhbmRvIGJpZW4gYSBsb3MgZGF0b3MuIA0KDQpQb3IgbWVkaW8gZGUgbGFzIGdyYWZpY2EgZGUgQUNGIHkgUEFDRiwgYWxndW5vcyByZXphZ29zIHNlIHNhbGVuLCBlc3RvIGltcGxpY2EgcXVlIGxhIHZhcmlhbnphIGVzIGhldGVyb2NlZGFzdGljYSBzaW4gZW1iYXJnbywgZXN0byBsbyBpZGVudGlmaWNhcmVtb3MgcG9yIG1lZGlvIGRlIGxhIHBydWJlIEFSQ0hURVNULg0KDQokSF8wJCA9IE5vIGhheSBlZmVjdG9zIEFSQ0guDQoNCiRIXzEkID0gSGF5IGVmZWN0b3MgQVJDSA0KDQpgYGB7ciBlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpyZXF1aXJlKHJ1Z2FyY2gpDQpyZXF1aXJlKEZpblRTKQ0KaXBjQXJjaFRlc3QgPC0gQXJjaFRlc3QoZGlmLnNveWEudHMsIGxhZ3M9MSwgZGVtZWFuID0gVFJVRSkNCmlwY0FyY2hUZXN0DQpgYGANCg0KRGFkbyBxdWUgZWwgcC12YWx1ZSBlcyBtZW5vciBhIDAuMDUgcmVjaGF6YW1vcyAkSDAkIHkgcG9yIGVuZGUsIGxhIHZhcmlhbnphIGVzIGhldGVyb2NlZGFzdGljYS4gQSBjb250aW51YWNpw7NuLCBzZSBpbnRlbnRhIGFqdXN0YXIgdW4gbW9kZWxvIEdBUkNIIGFsIGNvbmp1bnRvIGRlIGRhdG9zIGNvbiBlbCBBUklNQSBxdWUgc2UgdmllbmUgdHJhYmFqYW5kby4gRGUgYXF1w60gc2UgdGllbmUgcXVlIGVsIG1vZGVsbyBHQVJDSCBhZGVjdWFkbyBlcyBHQVJDSCgxLDEpIA0KDQoNCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnVnLnNwZWMgPSB1Z2FyY2hzcGVjKG1lYW4ubW9kZWwgPSBsaXN0KGFybWFPcmRlcj1jKDAsMCkpKQ0KdWdmaXQgPSB1Z2FyY2hmaXQoc3BlYyA9IHVnLnNwZWMsIGRhdGEgPSBkaWYuc295YS50cyApDQpgYGANCg0KIyMjIFByZWRpY2Npb25lcyBtb2RlbG8gR0FSQ0gNCg0KYGBge3IgZWNobz1UUlVFfQ0KcHJlZDwtdWdhcmNoZm9yZWNhc3QodWdmaXQsbi5haGVhZD0xMCkNCnBsb3QocHJlZCwgd2hpY2g9MSkNCmBgYA0KYGBge3IgZWNobz1UUlVFfQ0KdWdmaXQNCmBgYA0KDQpMb3MgY29lZmljaWVudGVzIGVzdMOhbiBzaWVuZG8gc2lnbmlmaWNhdGl2b3MgcG9yIGVuZGUsIGVsIG1vZGVsbyBHQVJDSCgxLDEpIHNlIHB1ZWRlIHV0aWxpemFyIHkgZXN0ZSB0ZW5kcsOhIGVuIGN1ZW50YSBpbmZvcm1hY2nDs24gZGVsIHBhc2FkbyBxdWUgcG9kcsOtYSBlc3RhciBhZmVjdGFuZG8gbGEgdmFyaWFjacOzbiBkZWwgcHJvbsOzc3RpY28uIEVuIGVzdGUgY2FzbyBkZWwgbW9kZWxvIEdBUkNILCBzZSB0aWVuZSBlbiBjdWVudGEgcXVlIGxhIHZhcmlhbnphIGVzIGhldGVyb2NlZGFzdGljYSB5IHF1ZSBkZXBlbmRlIGRlIGxvcyByZXNpZHVhbGVzIGFsIGN1YWRyYWRvIHJlemFnYWRvcyBjb21vIHRhbWJpw6luIGRlIGxhIHZhcmlhbnphIHJlemFnYWRhLg0KDQoNCiMjIENvbmNsdXNpb24NCg0KQXVucXVlIGxhIHByZWRpY2Npw7NuIGRlbCBtb2RlbG8gQVJJTUEoMCwwLDApIGdyw6FmaWNhbWVudGUgc2UgdmUgY29tbyB1biB2YWxvciBjb25zdGFudGUsIGVzdG8gcHVlZGUgZXN0YXIgc3VjZWRpZW5kbyBwb3JxdWUgbG9zIHZhbG9yZXMgZXN0w6FuIHNpZW5kbyBtdXkgY2VyY2Fub3MgdW5vcyBhIGxvcyBvdHJvcyBjb25zaWRlcm8gcXVlIGVsIG1vZGVsbyBubyBzZXLDoSBtdXkgZWZpY2llbnRlIHB1ZXN0byBxdWUgbGEgc2VyaWUgaW5pY2lhbCBubyBlcmEgZXN0YWNpb25hcmlhLCBzZSBsZSByZWFsaXpvIHVuYSBkaWZlcmVuY2lhY2nDs24geSBhZGVtw6FzLCBubyBsb2dyZSB1dGlsaXphciB0cmFuc2Zvcm1hY2nDs24gQm94LUNveCAvIGxvZ2FyaXRtb3MgcGFyYSBlc3RhYmlsaXphciBsYSB2YXJpYW56YSBsbyBjdWFsIHB1ZWRlIGluZmx1aXIgZW4gZWwgcmVzdWx0YWRvIGRlbCBwcm9uw7NzdGljbyBkZSB1biBtb2RlbG8gQVJJTUEuICBTaW4gZW1iYXJnbywgbG9zIHJlc2lkdWFsZXMgc2UgZXN0w6FuIHNhbGllbmRvIGRlIGxvcyBsw61taXRlcyBlc3RhYmxlY2lkb3MsIGhheSByZXphZ29zLiBQb3IgZW5kZSwgcmVjdXJyaXIgYSBvdHJvIHRpcG8gZGUgbW9kZWxvcyBxdWUgcGVybWl0YW4gY2FwdHVyYXIgZXN0ZSB0aXBvIGRlIGNvbXBvcnRhbWllbnRvcyBkZSBsYSBzZXJpZSwgZXMgbG8gbcOhcyBhZGVjdWFkbyBjb24gZWwgZmluIGRlIG9idGVuZXIgdW4gbWVqb3IgcHJvbm9zdGljby4NCg==