Instalar paquetes y llamar librerias

#install.packages("forecast")
library(forecast)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(readxl)

Ejemplo. Producción

Contexto

Una Serie de tiempo es una coleccion de observaciones, sobre un determinado fenómeno efectuadas en momentos de tiempo sucesivos, usualmente equiespaciados.

  1. Ejemplos de series de tiempo.
  2. Precio de acciones
  3. Niveles de inventario
  4. Rotación de personal
  5. Ventas
  6. PIB (GDP)

Crear la serie de tiempo

Ejemplo: los siguientes datos de producción trimestral inician en el primer trimestre de 2020. Se busca pronosticar la producción de los siguientes 5 trimestres.

produccion <- c(50,53,55,57,55,60)
st_produccion <- ts(data=produccion, start= c(2020,1), frequency=4) #En este casi la serie de tiempo inicia en el 2020 en el primer trimestre.

Crear el modelo ARIMA

ARIMA is AutoRegresive Integrated Moving Average.

modelo_produccion <- auto.arima(st_produccion, D=1) #D: Diferenciación Estacional
modelo_produccion
## Series: st_produccion 
## ARIMA(0,0,0)(0,1,0)[4] with drift 
## 
## Coefficients:
##        drift
##       1.5000
## s.e.  0.1768
## 
## sigma^2 = 2.01:  log likelihood = -2.84
## AIC=9.68   AICc=-2.32   BIC=7.06
summary(modelo_produccion) #Al seleccionar los modelos, seleccionamos el que tenga menor MAPE (Porcentaje de error promedio absoluto)
## Series: st_produccion 
## ARIMA(0,0,0)(0,1,0)[4] with drift 
## 
## Coefficients:
##        drift
##       1.5000
## s.e.  0.1768
## 
## sigma^2 = 2.01:  log likelihood = -2.84
## AIC=9.68   AICc=-2.32   BIC=7.06
## 
## Training set error measures:
##                      ME      RMSE       MAE        MPE      MAPE       MASE
## Training set 0.03333332 0.5787923 0.3666667 0.03685269 0.6429133 0.06111111
##                    ACF1
## Training set -0.5073047

Generar el pronóstico

pronostico_produccion <- forecast(modelo_produccion, level=c(95), h=5)
#Si no nos dicen otra cosa, el nievel de confiabilidad es 95%. Los periodos a pronosticar.
pronostico_produccion
##         Point Forecast    Lo 95    Hi 95
## 2021 Q3             61 58.22127 63.77873
## 2021 Q4             63 60.22127 65.77873
## 2022 Q1             61 58.22127 63.77873
## 2022 Q2             66 63.22127 68.77873
## 2022 Q3             67 63.07028 70.92972
plot((pronostico_produccion))

Ejercicio 1. México rumbo al 2050

En equipos de 2-3 personas, seleccionar un estado de México, obtener los datos historicos de su población para generar un pronostico hasta 2050. Como equipo de 3 escogimos El estado de Baja California Norte.

Crear la serie de tiempo

poblacion_baja<- c(1660855, 2112140, 2487367, 2844690, 3155070, 3315766, 3769020, 4131619)
st_baja <-ts(data=poblacion_baja, start= c(1990,1), frequency = .2) 

Crear el modelo ARIMA

modelo_poblacion_baja <- auto.arima(st_baja, D=1) # Diferenciador Estacional
modelo_poblacion_baja
## Series: st_baja 
## ARIMA(0,1,0) with drift 
## 
## Coefficients:
##           drift
##       352966.29
## s.e.   34733.47
## 
## sigma^2 = 9.852e+09:  log likelihood = -89.93
## AIC=183.86   AICc=186.86   BIC=183.75
summary(modelo_poblacion_baja)
## Series: st_baja 
## ARIMA(0,1,0) with drift 
## 
## Coefficients:
##           drift
##       352966.29
## s.e.   34733.47
## 
## sigma^2 = 9.852e+09:  log likelihood = -89.93
## AIC=183.86   AICc=186.86   BIC=183.75
## 
## Training set error measures:
##                   ME     RMSE      MAE       MPE     MAPE       MASE       ACF1
## Training set 163.486 85961.23 58877.63 0.1909166 1.978027 0.02006349 -0.1336052

Generar el pronóstico

pronostico_poblacion <- forecast(modelo_poblacion_baja, level=c(95), h=5)
# si no nos dice otra cosa, el nivel de confiabilidad es de 95%. los periodos a pronosticar es H. 
pronostico_poblacion
##      Point Forecast   Lo 95   Hi 95
## 2030        4484585 4290040 4679130
## 2035        4837552 4562423 5112680
## 2040        5190518 4853556 5527480
## 2045        5543484 5154394 5932574
## 2050        5896450 5461435 6331466
plot(pronostico_poblacion)

Ejercicio 2. Aplicación de Shiny

Agregar una pestaña en la aplicación de Shiny con el ejercicio México rumbo al 2050. En el menú se debe de seleccionar la cantidad de años a pronósticar.

Puedes ver la aplicación aquí: Shiny App

Ejercicio 3. Reflexión de mis materias

1. El rol de los negocios en la sociedad: Aprendí acerca de la gestión empresarial, medición y mapeo de fortalezas y debilidades empresariales.

2. Decisiones Financieras: Aprendí acerca de como se gestiona el credito en una empresa, el valor futuro del dinero y las tasas de interes.

3.Pensamiento Estadistico: Aprendí el uso de pronosticos en excel y variables.

4.Comunicación que inspira: Aprendí a como comunicar correctamente lo que quiero dar a entender, lograr y comunicarme.

5.Estrategias de mercado y diferenciación: Aprendí acerca de lo valiosas que llegan a ser la encuestas de opinion, la interpretación de los datos y como hacer una propuesta basada en datos para marketing.

6.Evaluación de proyectosd e inversión:Aprendí acerca de algunas medidas para la valuación de proyectos, como WACC, ROI, ROE y tomar deciciones el retorno de inversión.

7.Manipulación de datos: Aprendí acerca de bases de datos en SQL, el como relacionar tablas, llaves primarias, etc.

8.Minería de Datos: Aprendí acerca de modelos predictivos, redes neuronales, random forest, evaluacion del uso de modelos, etc.

9.Semana TEC. Fortalece relaciones con tus clientes atraves de salesforce: Aprendí acerca de la importancia de contar con CRM para relacionarte con tus clientes y apoyarte en herramientas como salesforce para gerar valor, ect.

10. Semestre TEC. Negocios Conscientes: Aprendí acerca del capitalismo consciente, el como fortalecer tu cadena de valor y asegurarte que tus stakeholder contribuyan junto contigo a generar un mundo mejor.

Actividad 2. Hershey’s

## Cargar serie de tiempo

ventas <- read_excel('/Users/luisangeldiazcontreras/Library/CloudStorage/OneDrive-InstitutoTecnologicoydeEstudiosSuperioresdeMonterrey/9th season/M1/Ventas_Históricas_Lechitas.xlsx')
str(ventas)
## tibble [36 × 1] (S3: tbl_df/tbl/data.frame)
##  $ Ventas: num [1:36] 25521 23740 26254 25868 27073 ...
st_ventas <- ts(data=ventas, start=c(2017,1), frequency = 12)

Crear modelo ARIMA

modelo_ventas <- auto.arima(st_ventas)
modelo_ventas
## Series: st_ventas 
## ARIMA(1,0,0)(1,1,0)[12] with drift 
## 
## Coefficients:
##          ar1     sar1     drift
##       0.6383  -0.5517  288.8979
## s.e.  0.1551   0.2047   14.5026
## 
## sigma^2 = 202701:  log likelihood = -181.5
## AIC=371   AICc=373.11   BIC=375.72
summary(modelo_ventas)
## Series: st_ventas 
## ARIMA(1,0,0)(1,1,0)[12] with drift 
## 
## Coefficients:
##          ar1     sar1     drift
##       0.6383  -0.5517  288.8979
## s.e.  0.1551   0.2047   14.5026
## 
## sigma^2 = 202701:  log likelihood = -181.5
## AIC=371   AICc=373.11   BIC=375.72
## 
## Training set error measures:
##                    ME    RMSE    MAE        MPE      MAPE       MASE      ACF1
## Training set 25.22158 343.864 227.17 0.08059932 0.7069542 0.06491044 0.2081026

Generar pronostico

pronostico_ventas <- forecast(modelo_ventas, level=c(95), h=5)
# si no nos dice otra cosa, el nivel de confiabilidad es de 95%. los periodos a pronosticar es H. 
pronostico_ventas
##          Point Forecast    Lo 95    Hi 95
## Jan 2020       35498.90 34616.48 36381.32
## Feb 2020       34202.17 33155.28 35249.05
## Mar 2020       36703.01 35596.10 37809.92
## Apr 2020       36271.90 35141.44 37402.36
## May 2020       37121.98 35982.07 38261.90
plot(pronostico_ventas)

Conclusión

El modelo ARIMA nos permite hacer un pronostico realista de con un intervalo de confianza del 95% para la ventas de lechitas Hershy´s en los próximos 5 años.

LS0tCnRpdGxlOiAiQWN0aXZpZGFkIDIiCmF1dGhvcjogIkx1aXMgQW5nZSBEw61heiBBMDE2NjIwMzQiCmRhdGU6ICIyMDI1LTA4LTE0IgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICB0aGVtZTogY2VydWxlYW4KLS0tCiFbXShodHRwczovL3d3dy5hcHRlY2guY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE5LzA5L3RzLXBwLXNlYXNvbmFsaXR5LmpwZykKCiMgPHNwYW4gc3R5bGU9ImNvbG9yOmNpYW47Ij4gSW5zdGFsYXIgcGFxdWV0ZXMgeSBsbGFtYXIgbGlicmVyaWFzIDwvc3Bhbj4KYGBge3J9CiNpbnN0YWxsLnBhY2thZ2VzKCJmb3JlY2FzdCIpCmxpYnJhcnkoZm9yZWNhc3QpCmxpYnJhcnkocmVhZHhsKQpgYGAKCiMgPHNwYW4gc3R5bGU9ImNvbG9yOmNpYW47Ij4gRWplbXBsby4gUHJvZHVjY2nDs24gPC9zcGFuPgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IzQzQ0Q4MDsiPiBDb250ZXh0byA8L3NwYW4+CgpVbmEgKipTZXJpZSBkZSB0aWVtcG8qKiBlcyB1bmEgY29sZWNjaW9uIGRlIG9ic2VydmFjaW9uZXMsIHNvYnJlIHVuIGRldGVybWluYWRvIGZlbsOzbWVubyBlZmVjdHVhZGFzIGVuIG1vbWVudG9zIGRlIHRpZW1wbyBzdWNlc2l2b3MsIHVzdWFsbWVudGUgZXF1aWVzcGFjaWFkb3MuCgoxLiBFamVtcGxvcyBkZSBzZXJpZXMgZGUgdGllbXBvLgoyLiBQcmVjaW8gZGUgYWNjaW9uZXMKMy4gTml2ZWxlcyBkZSBpbnZlbnRhcmlvCjQuIFJvdGFjacOzbiBkZSBwZXJzb25hbAo1LiBWZW50YXMKNi4gUElCIChHRFApCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IzQzQ0Q4MDsiPiBDcmVhciBsYSBzZXJpZSBkZSB0aWVtcG8gPC9zcGFuPgpFamVtcGxvOiBsb3Mgc2lndWllbnRlcyBkYXRvcyBkZSBwcm9kdWNjacOzbiB0cmltZXN0cmFsIGluaWNpYW4gZW4gZWwgcHJpbWVyIHRyaW1lc3RyZSBkZSAyMDIwLiBTZSBidXNjYSBwcm9ub3N0aWNhciBsYSBwcm9kdWNjacOzbiBkZSBsb3Mgc2lndWllbnRlcyA1IHRyaW1lc3RyZXMuCmBgYHtyfQpwcm9kdWNjaW9uIDwtIGMoNTAsNTMsNTUsNTcsNTUsNjApCnN0X3Byb2R1Y2Npb24gPC0gdHMoZGF0YT1wcm9kdWNjaW9uLCBzdGFydD0gYygyMDIwLDEpLCBmcmVxdWVuY3k9NCkgI0VuIGVzdGUgY2FzaSBsYSBzZXJpZSBkZSB0aWVtcG8gaW5pY2lhIGVuIGVsIDIwMjAgZW4gZWwgcHJpbWVyIHRyaW1lc3RyZS4KYGBgCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IzQzQ0Q4MDsiPiBDcmVhciBlbCBtb2RlbG8gQVJJTUEgPC9zcGFuPgoqKkFSSU1BKiogaXMgQXV0b1JlZ3Jlc2l2ZSBJbnRlZ3JhdGVkIE1vdmluZyBBdmVyYWdlLgpgYGB7cn0KbW9kZWxvX3Byb2R1Y2Npb24gPC0gYXV0by5hcmltYShzdF9wcm9kdWNjaW9uLCBEPTEpICNEOiBEaWZlcmVuY2lhY2nDs24gRXN0YWNpb25hbAptb2RlbG9fcHJvZHVjY2lvbgpzdW1tYXJ5KG1vZGVsb19wcm9kdWNjaW9uKSAjQWwgc2VsZWNjaW9uYXIgbG9zIG1vZGVsb3MsIHNlbGVjY2lvbmFtb3MgZWwgcXVlIHRlbmdhIG1lbm9yIE1BUEUgKFBvcmNlbnRhamUgZGUgZXJyb3IgcHJvbWVkaW8gYWJzb2x1dG8pCmBgYAoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiM0M0NEODA7Ij4gR2VuZXJhciBlbCBwcm9uw7NzdGljbyA8L3NwYW4+CmBgYHtyfQpwcm9ub3N0aWNvX3Byb2R1Y2Npb24gPC0gZm9yZWNhc3QobW9kZWxvX3Byb2R1Y2Npb24sIGxldmVsPWMoOTUpLCBoPTUpCiNTaSBubyBub3MgZGljZW4gb3RyYSBjb3NhLCBlbCBuaWV2ZWwgZGUgY29uZmlhYmlsaWRhZCBlcyA5NSUuIExvcyBwZXJpb2RvcyBhIHByb25vc3RpY2FyLgpwcm9ub3N0aWNvX3Byb2R1Y2Npb24KcGxvdCgocHJvbm9zdGljb19wcm9kdWNjaW9uKSkKYGBgCgojIDxzcGFuIHN0eWxlPSJjb2xvcjpjaWFuOyI+IEVqZXJjaWNpbyAxLiBNw6l4aWNvIHJ1bWJvIGFsIDIwNTAgPC9zcGFuPgpFbiBlcXVpcG9zIGRlIDItMyBwZXJzb25hcywgc2VsZWNjaW9uYXIgdW4gZXN0YWRvIGRlIE3DqXhpY28sIG9idGVuZXIgbG9zIGRhdG9zIGhpc3Rvcmljb3MgZGUgc3UgcG9ibGFjacOzbiBwYXJhIGdlbmVyYXIgdW4gcHJvbm9zdGljbyBoYXN0YSAyMDUwLiBDb21vIGVxdWlwbyBkZSAzIGVzY29naW1vcyBFbCBlc3RhZG8gZGUgQmFqYSBDYWxpZm9ybmlhIE5vcnRlLgoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiM0M0NEODA7Ij4gQ3JlYXIgbGEgc2VyaWUgZGUgdGllbXBvIDwvc3Bhbj4KYGBge3J9CnBvYmxhY2lvbl9iYWphPC0gYygxNjYwODU1LCAyMTEyMTQwLCAyNDg3MzY3LCAyODQ0NjkwLCAzMTU1MDcwLCAzMzE1NzY2LCAzNzY5MDIwLCA0MTMxNjE5KQpzdF9iYWphIDwtdHMoZGF0YT1wb2JsYWNpb25fYmFqYSwgc3RhcnQ9IGMoMTk5MCwxKSwgZnJlcXVlbmN5ID0gLjIpIApgYGAKCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjojNDNDRDgwOyI+IENyZWFyIGVsIG1vZGVsbyBBUklNQSA8L3NwYW4+CmBgYHtyfQptb2RlbG9fcG9ibGFjaW9uX2JhamEgPC0gYXV0by5hcmltYShzdF9iYWphLCBEPTEpICMgRGlmZXJlbmNpYWRvciBFc3RhY2lvbmFsCm1vZGVsb19wb2JsYWNpb25fYmFqYQpzdW1tYXJ5KG1vZGVsb19wb2JsYWNpb25fYmFqYSkKYGBgCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IzQzQ0Q4MDsiPiBHZW5lcmFyIGVsIHByb27Ds3N0aWNvIDwvc3Bhbj4KYGBge3J9CnByb25vc3RpY29fcG9ibGFjaW9uIDwtIGZvcmVjYXN0KG1vZGVsb19wb2JsYWNpb25fYmFqYSwgbGV2ZWw9Yyg5NSksIGg9NSkKIyBzaSBubyBub3MgZGljZSBvdHJhIGNvc2EsIGVsIG5pdmVsIGRlIGNvbmZpYWJpbGlkYWQgZXMgZGUgOTUlLiBsb3MgcGVyaW9kb3MgYSBwcm9ub3N0aWNhciBlcyBILiAKcHJvbm9zdGljb19wb2JsYWNpb24KcGxvdChwcm9ub3N0aWNvX3BvYmxhY2lvbikKYGBgCgojIDxzcGFuIHN0eWxlPSJjb2xvcjpjaWFuOyI+IEVqZXJjaWNpbyAyLiBBcGxpY2FjacOzbiBkZSBTaGlueSA8L3NwYW4+CkFncmVnYXIgdW5hIHBlc3Rhw7FhIGVuIGxhIGFwbGljYWNpw7NuIGRlIFNoaW55IGNvbiBlbCBlamVyY2ljaW8gTcOpeGljbyBydW1ibyBhbCAyMDUwLiBFbiBlbCBtZW7DuiBzZSBkZWJlIGRlIHNlbGVjY2lvbmFyIGxhIGNhbnRpZGFkIGRlIGHDsW9zIGEgcHJvbsOzc3RpY2FyLgoKUHVlZGVzIHZlciBsYSBhcGxpY2FjacOzbiBhcXXDrTogW1NoaW55IEFwcF0oaHR0cHM6Ly9vbHltY3MtbHVpczBuZ2VsLWQwYXowY29udHJlcmFzLnNoaW55YXBwcy5pby9BY3RpdmlkYWQxLykKCgojIDxzcGFuIHN0eWxlPSJjb2xvcjpjaWFuOyI+IEVqZXJjaWNpbyAzLiBSZWZsZXhpw7NuIGRlIG1pcyBtYXRlcmlhcyA8L3NwYW4+CioqMS4gRWwgcm9sIGRlIGxvcyBuZWdvY2lvcyBlbiBsYSBzb2NpZWRhZDoqKiBBcHJlbmTDrSBhY2VyY2EgZGUgbGEgZ2VzdGnDs24gZW1wcmVzYXJpYWwsIG1lZGljacOzbiB5IG1hcGVvIGRlIGZvcnRhbGV6YXMgeSBkZWJpbGlkYWRlcyBlbXByZXNhcmlhbGVzLgoKKioyLiBEZWNpc2lvbmVzIEZpbmFuY2llcmFzOioqIEFwcmVuZMOtIGFjZXJjYSBkZSBjb21vIHNlIGdlc3Rpb25hIGVsIGNyZWRpdG8gZW4gdW5hIGVtcHJlc2EsIGVsIHZhbG9yIGZ1dHVybyBkZWwgZGluZXJvIHkgbGFzIHRhc2FzIGRlIGludGVyZXMuCgoqKjMuUGVuc2FtaWVudG8gRXN0YWRpc3RpY286KiogQXByZW5kw60gZWwgdXNvIGRlIHByb25vc3RpY29zIGVuIGV4Y2VsIHkgdmFyaWFibGVzLgoKKio0LkNvbXVuaWNhY2nDs24gcXVlIGluc3BpcmE6KiogQXByZW5kw60gYSBjb21vIGNvbXVuaWNhciBjb3JyZWN0YW1lbnRlIGxvIHF1ZSBxdWllcm8gZGFyIGEgZW50ZW5kZXIsIGxvZ3JhciB5IGNvbXVuaWNhcm1lLgoKKio1LkVzdHJhdGVnaWFzIGRlIG1lcmNhZG8geSBkaWZlcmVuY2lhY2nDs246KiogQXByZW5kw60gYWNlcmNhIGRlIGxvIHZhbGlvc2FzIHF1ZSBsbGVnYW4gYSBzZXIgbGEgZW5jdWVzdGFzIGRlIG9waW5pb24sIGxhIGludGVycHJldGFjacOzbiBkZSBsb3MgZGF0b3MgeSBjb21vIGhhY2VyIHVuYSBwcm9wdWVzdGEgYmFzYWRhIGVuIGRhdG9zIHBhcmEgbWFya2V0aW5nLgoKKio2LkV2YWx1YWNpw7NuIGRlIHByb3llY3Rvc2QgZSBpbnZlcnNpw7NuOioqQXByZW5kw60gYWNlcmNhIGRlIGFsZ3VuYXMgbWVkaWRhcyBwYXJhIGxhIHZhbHVhY2nDs24gZGUgcHJveWVjdG9zLCBjb21vIFdBQ0MsIFJPSSwgUk9FIHkgdG9tYXIgZGVjaWNpb25lcyBlbCByZXRvcm5vIGRlIGludmVyc2nDs24uCgoqKjcuTWFuaXB1bGFjacOzbiBkZSBkYXRvczoqKiBBcHJlbmTDrSBhY2VyY2EgZGUgYmFzZXMgZGUgZGF0b3MgZW4gU1FMLCBlbCBjb21vIHJlbGFjaW9uYXIgdGFibGFzLCBsbGF2ZXMgcHJpbWFyaWFzLCBldGMuCgoqKjguTWluZXLDrWEgZGUgRGF0b3M6KiogQXByZW5kw60gYWNlcmNhIGRlIG1vZGVsb3MgcHJlZGljdGl2b3MsIHJlZGVzIG5ldXJvbmFsZXMsIHJhbmRvbSBmb3Jlc3QsIGV2YWx1YWNpb24gZGVsIHVzbyBkZSBtb2RlbG9zLCBldGMuCgoqKjkuU2VtYW5hIFRFQy4gRm9ydGFsZWNlIHJlbGFjaW9uZXMgY29uIHR1cyBjbGllbnRlcyBhdHJhdmVzIGRlIHNhbGVzZm9yY2U6KiogQXByZW5kw60gYWNlcmNhIGRlIGxhIGltcG9ydGFuY2lhIGRlIGNvbnRhciBjb24gQ1JNIHBhcmEgcmVsYWNpb25hcnRlIGNvbiB0dXMgY2xpZW50ZXMgeSBhcG95YXJ0ZSBlbiBoZXJyYW1pZW50YXMgY29tbyBzYWxlc2ZvcmNlIHBhcmEgZ2VyYXIgdmFsb3IsIGVjdC4KCioqMTAuIFNlbWVzdHJlIFRFQy4gTmVnb2Npb3MgQ29uc2NpZW50ZXM6KiogQXByZW5kw60gYWNlcmNhIGRlbCBjYXBpdGFsaXNtbyBjb25zY2llbnRlLCBlbCBjb21vIGZvcnRhbGVjZXIgdHUgY2FkZW5hIGRlIHZhbG9yIHkgYXNlZ3VyYXJ0ZSBxdWUgdHVzIHN0YWtlaG9sZGVyIGNvbnRyaWJ1eWFuIGp1bnRvIGNvbnRpZ28gYSBnZW5lcmFyIHVuIG11bmRvIG1lam9yLgoKIyA8c3BhbiBzdHlsZT0iY29sb3I6Y2lhbjsiPiBBY3RpdmlkYWQgMi4gSGVyc2hleSdzIDwvc3Bhbj4KIVtdKGh0dHBzOi8vaHR0cDIubWxzdGF0aWMuY29tL0RfTlFfTlBfOTg4ODIyLU1MVTc2NzE1MzM2NDIwXzA2MjAyNC1PLndlYnApCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjo0M0NEODA7Ij4gQ2FyZ2FyIHNlcmllIGRlIHRpZW1wbyA8L3NwYW4+CmBgYHtyfQp2ZW50YXMgPC0gcmVhZF9leGNlbCgnL1VzZXJzL2x1aXNhbmdlbGRpYXpjb250cmVyYXMvTGlicmFyeS9DbG91ZFN0b3JhZ2UvT25lRHJpdmUtSW5zdGl0dXRvVGVjbm9sb2dpY295ZGVFc3R1ZGlvc1N1cGVyaW9yZXNkZU1vbnRlcnJleS85dGggc2Vhc29uL00xL1ZlbnRhc19IaXN0w7NyaWNhc19MZWNoaXRhcy54bHN4JykKc3RyKHZlbnRhcykKc3RfdmVudGFzIDwtIHRzKGRhdGE9dmVudGFzLCBzdGFydD1jKDIwMTcsMSksIGZyZXF1ZW5jeSA9IDEyKQpgYGAKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiM0M0NEODA7Ij4gQ3JlYXIgbW9kZWxvIEFSSU1BIDwvc3Bhbj4KYGBge3J9Cm1vZGVsb192ZW50YXMgPC0gYXV0by5hcmltYShzdF92ZW50YXMpCm1vZGVsb192ZW50YXMKc3VtbWFyeShtb2RlbG9fdmVudGFzKQpgYGAKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiM0M0NEODA7Ij4gR2VuZXJhciBwcm9ub3N0aWNvPC9zcGFuPgpgYGB7cn0KcHJvbm9zdGljb192ZW50YXMgPC0gZm9yZWNhc3QobW9kZWxvX3ZlbnRhcywgbGV2ZWw9Yyg5NSksIGg9NSkKIyBzaSBubyBub3MgZGljZSBvdHJhIGNvc2EsIGVsIG5pdmVsIGRlIGNvbmZpYWJpbGlkYWQgZXMgZGUgOTUlLiBsb3MgcGVyaW9kb3MgYSBwcm9ub3N0aWNhciBlcyBILiAKcHJvbm9zdGljb192ZW50YXMKcGxvdChwcm9ub3N0aWNvX3ZlbnRhcykKYGBgCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IzQzQ0Q4MDsiPiBDb25jbHVzacOzbjwvc3Bhbj4KCkVsIG1vZGVsbyBBUklNQSBub3MgcGVybWl0ZSBoYWNlciB1biBwcm9ub3N0aWNvIHJlYWxpc3RhIGRlIGNvbiB1biBpbnRlcnZhbG8gZGUgY29uZmlhbnphIGRlbCA5NSUgcGFyYSBsYSB2ZW50YXMgZGUgbGVjaGl0YXMgSGVyc2h5wrRzIGVuIGxvcyBwcsOzeGltb3MgNSBhw7Fvcy4=