
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.
- Ejemplos de series de tiempo.
- Precio de acciones
- Niveles de inventario
- Rotación de personal
- Ventas
- 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=