Tarea 4: Análisis Financiero

Integrantes: Regina Enríquez, Maximiliano Carvajal, Guillermo Cazares

gif
gif
library(forecast)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(finreportr)
library(tidyverse)
## -- Attaching core tidyverse packages ------------------------ tidyverse 2.0.0 --
## v dplyr     1.1.0     v readr     2.1.2
## v forcats   1.0.0     v stringr   1.5.0
## v ggplot2   3.4.1     v tibble    3.1.8
## v lubridate 1.9.3     v tidyr     1.3.0
## v purrr     1.0.1
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
## i Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
options(HTTPUserAgent = "a a@gmail.com")
AnnualReports("AAPL")
##    filing.name filing.date         accession.no
## 1         10-K  2023-11-03 0000320193-23-000106
## 2         10-K  2022-10-28 0000320193-22-000108
## 3         10-K  2021-10-29 0000320193-21-000105
## 4         10-K  2020-10-30 0000320193-20-000096
## 5         10-K  2019-10-31 0000320193-19-000119
## 6         10-K  2018-11-05 0000320193-18-000145
## 7         10-K  2017-11-03 0000320193-17-000070
## 8         10-K  2016-10-26 0001628280-16-020309
## 9         10-K  2015-10-28 0001193125-15-356351
## 10        10-K  2014-10-27 0001193125-14-383437
## 11        10-K  2013-10-30 0001193125-13-416534
## 12        10-K  2012-10-31 0001193125-12-444068
## 13        10-K  2011-10-26 0001193125-11-282113
## 14        10-K  2010-10-27 0001193125-10-238044
## 15      10-K/A  2010-01-25 0001193125-10-012091
## 16        10-K  2009-10-27 0001193125-09-214859
## 17        10-K  2008-11-05 0001193125-08-224958
## 18        10-K  2007-11-15 0001047469-07-009340
## 19        10-K  2006-12-29 0001104659-06-084288
## 20        10-K  2005-12-01 0001104659-05-058421
## 21        10-K  2004-12-03 0001047469-04-035975
## 22        10-K  2003-12-19 0001047469-03-041604
## 23        10-K  2002-12-19 0001047469-02-007674
## 24     10-K405  2001-12-21 0000912057-01-544436
## 25        10-K  2000-12-14 0000912057-00-053623
## 26        10-K  1999-12-22 0000912057-99-010244
## 27     10-K405  1998-12-23 0001047469-98-044981
## 28      10-K/A  1998-01-23 0001047469-98-001822
## 29        10-K  1997-12-05 0001047469-97-006960
## 30        10-K  1996-12-19 0000320193-96-000023
## 31        10-K  1995-12-19 0000320193-95-000016
## 32        10-K  1994-12-13 0000320193-94-000016

Pronóstico 1: Operating expenses (Income)

apple_income_2011 <- GetIncome("AAPL", 2011)
apple_income_2014 <- GetIncome("AAPL", 2014)
apple_income_2017 <- GetIncome("AAPL", 2017)
Apple_OpExp_11 <- select(apple_income_2011,Metric,Amount,endDate)
Apple_OpExp_11 <- subset(Apple_OpExp_11, Metric == "Total operating expenses")

Apple_OpExp_14 <- select(apple_income_2014,Metric,Amount,endDate)
Apple_OpExp_14 <- subset(Apple_OpExp_14, Metric == "Operating Expenses")

Apple_OpExp_17 <- select(apple_income_2017,Metric,Amount,endDate)
Apple_OpExp_17 <- subset(Apple_OpExp_17, Metric == "Operating Expenses")
Apple_OpExp_complete <- rbind(Apple_OpExp_11,Apple_OpExp_14,Apple_OpExp_17)
Apple_OpExp_complete <- Apple_OpExp_complete[order(Apple_OpExp_complete$endDate),]
Apple_OpExp_complete$Amount <- as.numeric(Apple_OpExp_complete$Amount)

Crear la serie de tiempo

ts_OpExp <- ts(data=Apple_OpExp_complete$Amount, start = c(2009,1), frequency = 1)
ts_OpExp
## Time Series:
## Start = 2009 
## End = 2017 
## Frequency = 1 
## [1] 5.4820e+09 7.2990e+09 1.0028e+10 1.3421e+10 1.5305e+10 1.8034e+10 2.2396e+10
## [8] 2.4239e+10 2.6842e+10
arima_OpExp <- auto.arima(ts_OpExp)
arima_OpExp
## Series: ts_OpExp 
## ARIMA(0,1,0) with drift 
## 
## Coefficients:
##            drift
##       2670000000
## s.e.   296005922
## 
## sigma^2 = 7.752e+17:  log likelihood = -175.58
## AIC=355.17   AICc=357.57   BIC=355.33
summary(arima_OpExp)
## Series: ts_OpExp 
## ARIMA(0,1,0) with drift 
## 
## Coefficients:
##            drift
##       2670000000
## s.e.   296005922
## 
## sigma^2 = 7.752e+17:  log likelihood = -175.58
## AIC=355.17   AICc=357.57   BIC=355.33
## 
## Training set error measures:
##                    ME      RMSE       MAE        MPE     MAPE      MASE
## Training set 312444.3 776486811 563201333 -0.7305296 3.821376 0.2109368
##                    ACF1
## Training set -0.3443892
pronostico_1 <- forecast(arima_OpExp, level=c(95), h=6)
pronostico_1
##      Point Forecast       Lo 95       Hi 95
## 2018     2.9512e+10 27786343272 31237656728
## 2019     3.2182e+10 29741552851 34622447149
## 2020     3.4852e+10 31863074870 37840925130
## 2021     3.7522e+10 34070686543 40973313457
## 2022     4.0192e+10 36333314250 44050685750
## 2023     4.2862e+10 38635021544 47088978456
plot(pronostico_1)

Pronóstico 2: Reasearch and Development (Income)

Apple_Net_11 <- select(apple_income_2011,Metric,Amount,endDate)
Apple_Net_11 <- subset(Apple_Net_11, Metric == "Research and Development Expense")

Apple_Net_14 <- select(apple_income_2014,Metric,Amount,endDate)
Apple_Net_14 <- subset(Apple_Net_14, Metric == "Research and Development Expense")

Apple_Net_17 <- select(apple_income_2017,Metric,Amount,endDate)
Apple_Net_17 <- subset(Apple_Net_17, Metric == "Research and Development Expense")
Apple_Net_complete <- rbind(Apple_Net_11,Apple_Net_14,Apple_Net_17)
Apple_Net_complete <- Apple_Net_complete[order(Apple_Net_complete$endDate),]
Apple_Net_complete$Amount <- as.numeric(Apple_Net_complete$Amount)
Apple_Net_complete
##                               Metric     Amount    endDate
## 23  Research and Development Expense 1.3330e+09 2009-09-26
## 24  Research and Development Expense 1.7820e+09 2010-09-25
## 25  Research and Development Expense 2.4290e+09 2011-09-24
## 251 Research and Development Expense 3.3810e+09 2012-09-29
## 231 Research and Development Expense 4.4750e+09 2013-09-28
## 241 Research and Development Expense 6.0410e+09 2014-09-27
## 26  Research and Development Expense 8.0670e+09 2015-09-26
## 27  Research and Development Expense 1.0045e+10 2016-09-24
## 28  Research and Development Expense 1.1581e+10 2017-09-30

Crear la serie de tiempo

ts_Net <- ts(data=Apple_Net_complete$Amount, start = c(2012,1), frequency = 1)
ts_Net
## Time Series:
## Start = 2012 
## End = 2020 
## Frequency = 1 
## [1] 1.3330e+09 1.7820e+09 2.4290e+09 3.3810e+09 4.4750e+09 6.0410e+09 8.0670e+09
## [8] 1.0045e+10 1.1581e+10
arima_Net <- auto.arima(ts_Net)
arima_Net
## Series: ts_Net 
## ARIMA(0,2,0) 
## 
## sigma^2 = 1.121e+17:  log likelihood = -147.34
## AIC=296.67   AICc=297.47   BIC=296.62
summary(arima_Net)
## Series: ts_Net 
## ARIMA(0,2,0) 
## 
## sigma^2 = 1.121e+17:  log likelihood = -147.34
## AIC=296.67   AICc=297.47   BIC=296.62
## 
## Training set error measures:
##                     ME      RMSE       MAE      MPE     MAPE      MASE
## Training set 120756858 295229848 229820061 3.285274 4.249377 0.1794068
##                   ACF1
## Training set 0.2873511
pronostico_2 <- forecast(arima_Net, level=c(95), h=6)
pronostico_2
##      Point Forecast       Lo 95       Hi 95
## 2021     1.3117e+10 12460884059 13773115941
## 2022     1.4653e+10 13185880155 16120119845
## 2023     1.6189e+10 13734038944 18643961056
## 2024     1.7725e+10 14131304989 21318695011
## 2025     1.9261e+10 14395113953 24126886047
## 2026     2.0797e+10 14538052835 27055947165
plot(pronostico_2)

Pronóstico 3: Assets (Balance Sheet)

apple_balance_2011 <- GetBalanceSheet("AAPL",2011)
apple_balance_2014 <- GetBalanceSheet("AAPL",2014)
apple_balance_2017 <- GetBalanceSheet("AAPL",2017)
Bingus_bal <- apple_balance_2011[,-2]
Bingus_bal <- subset(Bingus_bal, Metric == "Total assets")
Bingus_bal <- Bingus_bal[order(Bingus_bal$endDate),]
Bingus_bal2 <- apple_balance_2014[,-2]
Bingus_bal2 <- subset(Bingus_bal2, Metric == "Assets")
Bingus_bal2 <- Bingus_bal2[order(Bingus_bal2$endDate),]
Bingus_bal3 <- apple_balance_2017[,-2]
Bingus_bal3 <- subset(Bingus_bal3, Metric == "Assets")
Bingus_bal3 <- Bingus_bal3[order(Bingus_bal3$endDate),]
apple_balance_2015 <- GetBalanceSheet("AAPL",2015)
Bingus_bal4 <- apple_balance_2015[,-2]
Bingus_bal4 <- subset(Bingus_bal4, Metric == "Assets")
Bingus_bal4 <- Bingus_bal4[order(Bingus_bal4$endDate),]
Bingus_bal4 <- Bingus_bal4[-1,]
apple_balance_2012 <- GetBalanceSheet("AAPL",2012)
Bingus_bal5 <- apple_balance_2012[,-2]
Bingus_bal5 <- subset(Bingus_bal5, Metric == "Assets")
Bingus_bal5 <- Bingus_bal5[order(Bingus_bal5$endDate),]
Bingus_bal5 <- Bingus_bal5[-1,]
bingus_balance <- rbind(Bingus_bal,Bingus_bal2,Bingus_bal3, Bingus_bal4, Bingus_bal5)
str(bingus_balance)
## 'data.frame':    9 obs. of  4 variables:
##  $ Metric   : chr  "Total assets" "Total assets" "Total assets" "Assets" ...
##  $ Amount   : chr  "47501000000" "75183000000" "116371000000" "207000000000" ...
##  $ startDate: chr  NA NA NA NA ...
##  $ endDate  : chr  "2009-09-26" "2010-09-25" "2011-09-24" "2013-09-28" ...
bingus_balance$year <- year(as.Date(bingus_balance$endDate))
bingus_balance$Amount <- as.numeric(bingus_balance$Amount)
bingus_balance
##           Metric      Amount startDate    endDate year
## 11  Total assets 4.75010e+10      <NA> 2009-09-26 2009
## 12  Total assets 7.51830e+10      <NA> 2010-09-25 2010
## 13  Total assets 1.16371e+11      <NA> 2011-09-24 2011
## 111       Assets 2.07000e+11      <NA> 2013-09-28 2013
## 121       Assets 2.31839e+11      <NA> 2014-09-27 2014
## 27        Assets 3.21686e+11      <NA> 2016-09-24 2016
## 28        Assets 3.75319e+11      <NA> 2017-09-30 2017
## 122       Assets 2.90479e+11      <NA> 2015-09-26 2015
## 123       Assets 1.76064e+11      <NA> 2012-09-29 2012
bingus_balance$Amount <- log(as.numeric(bingus_balance$Amount))
bingus_balance <- bingus_balance%>% arrange(year)
bingus_balance
##           Metric   Amount startDate    endDate year
## 11  Total assets 24.58402      <NA> 2009-09-26 2009
## 12  Total assets 25.04319      <NA> 2010-09-25 2010
## 13  Total assets 25.48005      <NA> 2011-09-24 2011
## 123       Assets 25.89411      <NA> 2012-09-29 2012
## 111       Assets 26.05598      <NA> 2013-09-28 2013
## 121       Assets 26.16931      <NA> 2014-09-27 2014
## 122       Assets 26.39480      <NA> 2015-09-26 2015
## 27        Assets 26.49684      <NA> 2016-09-24 2016
## 28        Assets 26.65104      <NA> 2017-09-30 2017
bingus_balance <- bingus_balance[,c(2,5)]
bingus_balance
##       Amount year
## 11  24.58402 2009
## 12  25.04319 2010
## 13  25.48005 2011
## 123 25.89411 2012
## 111 26.05598 2013
## 121 26.16931 2014
## 122 26.39480 2015
## 27  26.49684 2016
## 28  26.65104 2017

Crear la serie de tiempo

ts_Assets <- ts(data=bingus_balance$Amount, frequency = 1, start = c(2009), end = c(2017))
plot(ts_Assets)

ts_Assets
## Time Series:
## Start = 2009 
## End = 2017 
## Frequency = 1 
## [1] 24.58402 25.04319 25.48005 25.89411 26.05598 26.16931 26.39480 26.49684
## [9] 26.65104
arima_Assets <- auto.arima(ts_Assets)
summary(arima_Assets)
## Series: ts_Assets 
## ARIMA(0,2,0) 
## 
## sigma^2 = 0.01409:  log likelihood = 5.03
## AIC=-8.05   AICc=-7.25   BIC=-8.1
## 
## Training set error measures:
##                       ME     RMSE        MAE        MPE      MAPE      MASE
## Training set -0.03621508 0.104699 0.07517371 -0.1396808 0.2875401 0.2909445
##                    ACF1
## Training set -0.2564044
arima_Assets
## Series: ts_Assets 
## ARIMA(0,2,0) 
## 
## sigma^2 = 0.01409:  log likelihood = 5.03
## AIC=-8.05   AICc=-7.25   BIC=-8.1
pronostico_3 <- forecast(arima_Assets, h=5)
pronostico_3
##      Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
## 2018       26.80524 26.65310 26.95739 26.57256 27.03792
## 2019       26.95944 26.61924 27.29964 26.43915 27.47974
## 2020       27.11364 26.54438 27.68291 26.24303 27.98426
## 2021       27.26784 26.43452 28.10116 25.99339 28.54230
## 2022       27.42204 26.29372 28.55036 25.69643 29.14766
plot(pronostico_3)

Conclusión

Dentro de los 3 pronósticos se puede observar que la empresa de Apple mantiene una tendencia positiva con un crecimiento general durante los años, lo cual hace sentido ya que la empresa está creciendo e innovando constantemente. En este caso creemos que es mejor manejar los datos de manera trimestral, debido a que si se maneja por año el pronóstico comienza a ser un poco más pesado y los pronósticos terminan siendo obsoletos ya que el paquete de ‘forecast’ simplemente no cambia. De igual forma identificamos que en ocasiones puede haber repeticiones de los años, por lo que es importante hacer nota de estos y seleccionar los necesarios a través de manipulación de bases de datos para crear un buen pronóstico.

LS0tDQp0aXRsZTogJ1RhcmVhIDQ6IEFuw6FsaXNpcyBGaW5hbmNpZXJvJw0KYXV0aG9yOiAiUmVnaW5hIEVucsOtcXVleiAtIEEwMTcyMTQzNSINCmRhdGU6ICIyMDI0LTAyLTIxIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IFRSVUUNCiAgICB0b2NfZmxvYXQ6IFRSVUUNCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KIyBUYXJlYSA0OiBBbsOhbGlzaXMgRmluYW5jaWVybw0KSW50ZWdyYW50ZXM6IFJlZ2luYSBFbnLDrXF1ZXosIE1heGltaWxpYW5vIENhcnZhamFsLCBHdWlsbGVybW8gQ2F6YXJlcw0KDQohW2dpZl0oc2VyaWVzLmdpZikNCg0KYGBge3J9DQpsaWJyYXJ5KGZvcmVjYXN0KQ0KbGlicmFyeShmaW5yZXBvcnRyKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpgYGANCg0KYGBge3J9DQpvcHRpb25zKEhUVFBVc2VyQWdlbnQgPSAiYSBhQGdtYWlsLmNvbSIpDQpBbm51YWxSZXBvcnRzKCJBQVBMIikNCmBgYA0KDQojIyBQcm9uw7NzdGljbyAxOiBPcGVyYXRpbmcgZXhwZW5zZXMgKEluY29tZSkNCg0KYGBge3J9DQphcHBsZV9pbmNvbWVfMjAxMSA8LSBHZXRJbmNvbWUoIkFBUEwiLCAyMDExKQ0KYXBwbGVfaW5jb21lXzIwMTQgPC0gR2V0SW5jb21lKCJBQVBMIiwgMjAxNCkNCmFwcGxlX2luY29tZV8yMDE3IDwtIEdldEluY29tZSgiQUFQTCIsIDIwMTcpDQpgYGANCg0KYGBge3J9DQpBcHBsZV9PcEV4cF8xMSA8LSBzZWxlY3QoYXBwbGVfaW5jb21lXzIwMTEsTWV0cmljLEFtb3VudCxlbmREYXRlKQ0KQXBwbGVfT3BFeHBfMTEgPC0gc3Vic2V0KEFwcGxlX09wRXhwXzExLCBNZXRyaWMgPT0gIlRvdGFsIG9wZXJhdGluZyBleHBlbnNlcyIpDQoNCkFwcGxlX09wRXhwXzE0IDwtIHNlbGVjdChhcHBsZV9pbmNvbWVfMjAxNCxNZXRyaWMsQW1vdW50LGVuZERhdGUpDQpBcHBsZV9PcEV4cF8xNCA8LSBzdWJzZXQoQXBwbGVfT3BFeHBfMTQsIE1ldHJpYyA9PSAiT3BlcmF0aW5nIEV4cGVuc2VzIikNCg0KQXBwbGVfT3BFeHBfMTcgPC0gc2VsZWN0KGFwcGxlX2luY29tZV8yMDE3LE1ldHJpYyxBbW91bnQsZW5kRGF0ZSkNCkFwcGxlX09wRXhwXzE3IDwtIHN1YnNldChBcHBsZV9PcEV4cF8xNywgTWV0cmljID09ICJPcGVyYXRpbmcgRXhwZW5zZXMiKQ0KYGBgDQoNCmBgYHtyfQ0KQXBwbGVfT3BFeHBfY29tcGxldGUgPC0gcmJpbmQoQXBwbGVfT3BFeHBfMTEsQXBwbGVfT3BFeHBfMTQsQXBwbGVfT3BFeHBfMTcpDQpBcHBsZV9PcEV4cF9jb21wbGV0ZSA8LSBBcHBsZV9PcEV4cF9jb21wbGV0ZVtvcmRlcihBcHBsZV9PcEV4cF9jb21wbGV0ZSRlbmREYXRlKSxdDQpgYGANCg0KYGBge3J9DQpBcHBsZV9PcEV4cF9jb21wbGV0ZSRBbW91bnQgPC0gYXMubnVtZXJpYyhBcHBsZV9PcEV4cF9jb21wbGV0ZSRBbW91bnQpDQpgYGANCg0KIyMgQ3JlYXIgbGEgc2VyaWUgZGUgdGllbXBvDQoNCmBgYHtyfQ0KdHNfT3BFeHAgPC0gdHMoZGF0YT1BcHBsZV9PcEV4cF9jb21wbGV0ZSRBbW91bnQsIHN0YXJ0ID0gYygyMDA5LDEpLCBmcmVxdWVuY3kgPSAxKQ0KdHNfT3BFeHANCmBgYA0KDQpgYGB7cn0NCmFyaW1hX09wRXhwIDwtIGF1dG8uYXJpbWEodHNfT3BFeHApDQphcmltYV9PcEV4cA0Kc3VtbWFyeShhcmltYV9PcEV4cCkNCmBgYA0KDQpgYGB7cn0NCnByb25vc3RpY29fMSA8LSBmb3JlY2FzdChhcmltYV9PcEV4cCwgbGV2ZWw9Yyg5NSksIGg9NikNCnByb25vc3RpY29fMQ0KcGxvdChwcm9ub3N0aWNvXzEpDQpgYGANCg0KIyMgUHJvbsOzc3RpY28gMjogUmVhc2VhcmNoIGFuZCBEZXZlbG9wbWVudCAoSW5jb21lKQ0KDQpgYGB7cn0NCkFwcGxlX05ldF8xMSA8LSBzZWxlY3QoYXBwbGVfaW5jb21lXzIwMTEsTWV0cmljLEFtb3VudCxlbmREYXRlKQ0KQXBwbGVfTmV0XzExIDwtIHN1YnNldChBcHBsZV9OZXRfMTEsIE1ldHJpYyA9PSAiUmVzZWFyY2ggYW5kIERldmVsb3BtZW50IEV4cGVuc2UiKQ0KDQpBcHBsZV9OZXRfMTQgPC0gc2VsZWN0KGFwcGxlX2luY29tZV8yMDE0LE1ldHJpYyxBbW91bnQsZW5kRGF0ZSkNCkFwcGxlX05ldF8xNCA8LSBzdWJzZXQoQXBwbGVfTmV0XzE0LCBNZXRyaWMgPT0gIlJlc2VhcmNoIGFuZCBEZXZlbG9wbWVudCBFeHBlbnNlIikNCg0KQXBwbGVfTmV0XzE3IDwtIHNlbGVjdChhcHBsZV9pbmNvbWVfMjAxNyxNZXRyaWMsQW1vdW50LGVuZERhdGUpDQpBcHBsZV9OZXRfMTcgPC0gc3Vic2V0KEFwcGxlX05ldF8xNywgTWV0cmljID09ICJSZXNlYXJjaCBhbmQgRGV2ZWxvcG1lbnQgRXhwZW5zZSIpDQpgYGANCg0KYGBge3J9DQpBcHBsZV9OZXRfY29tcGxldGUgPC0gcmJpbmQoQXBwbGVfTmV0XzExLEFwcGxlX05ldF8xNCxBcHBsZV9OZXRfMTcpDQpBcHBsZV9OZXRfY29tcGxldGUgPC0gQXBwbGVfTmV0X2NvbXBsZXRlW29yZGVyKEFwcGxlX05ldF9jb21wbGV0ZSRlbmREYXRlKSxdDQpgYGANCg0KYGBge3J9DQpBcHBsZV9OZXRfY29tcGxldGUkQW1vdW50IDwtIGFzLm51bWVyaWMoQXBwbGVfTmV0X2NvbXBsZXRlJEFtb3VudCkNCkFwcGxlX05ldF9jb21wbGV0ZQ0KYGBgDQoNCiMjIENyZWFyIGxhIHNlcmllIGRlIHRpZW1wbw0KDQpgYGB7cn0NCnRzX05ldCA8LSB0cyhkYXRhPUFwcGxlX05ldF9jb21wbGV0ZSRBbW91bnQsIHN0YXJ0ID0gYygyMDEyLDEpLCBmcmVxdWVuY3kgPSAxKQ0KdHNfTmV0DQpgYGANCg0KYGBge3J9DQphcmltYV9OZXQgPC0gYXV0by5hcmltYSh0c19OZXQpDQphcmltYV9OZXQNCnN1bW1hcnkoYXJpbWFfTmV0KQ0KYGBgDQoNCmBgYHtyfQ0KcHJvbm9zdGljb18yIDwtIGZvcmVjYXN0KGFyaW1hX05ldCwgbGV2ZWw9Yyg5NSksIGg9NikNCnByb25vc3RpY29fMg0KcGxvdChwcm9ub3N0aWNvXzIpDQpgYGANCg0KIyMgUHJvbsOzc3RpY28gMzogQXNzZXRzIChCYWxhbmNlIFNoZWV0KQ0KDQpgYGB7cn0NCmFwcGxlX2JhbGFuY2VfMjAxMSA8LSBHZXRCYWxhbmNlU2hlZXQoIkFBUEwiLDIwMTEpDQphcHBsZV9iYWxhbmNlXzIwMTQgPC0gR2V0QmFsYW5jZVNoZWV0KCJBQVBMIiwyMDE0KQ0KYXBwbGVfYmFsYW5jZV8yMDE3IDwtIEdldEJhbGFuY2VTaGVldCgiQUFQTCIsMjAxNykNCmBgYA0KDQpgYGB7cn0NCkJpbmd1c19iYWwgPC0gYXBwbGVfYmFsYW5jZV8yMDExWywtMl0NCkJpbmd1c19iYWwgPC0gc3Vic2V0KEJpbmd1c19iYWwsIE1ldHJpYyA9PSAiVG90YWwgYXNzZXRzIikNCkJpbmd1c19iYWwgPC0gQmluZ3VzX2JhbFtvcmRlcihCaW5ndXNfYmFsJGVuZERhdGUpLF0NCmBgYA0KDQpgYGB7cn0NCkJpbmd1c19iYWwyIDwtIGFwcGxlX2JhbGFuY2VfMjAxNFssLTJdDQpCaW5ndXNfYmFsMiA8LSBzdWJzZXQoQmluZ3VzX2JhbDIsIE1ldHJpYyA9PSAiQXNzZXRzIikNCkJpbmd1c19iYWwyIDwtIEJpbmd1c19iYWwyW29yZGVyKEJpbmd1c19iYWwyJGVuZERhdGUpLF0NCmBgYA0KDQpgYGB7cn0NCkJpbmd1c19iYWwzIDwtIGFwcGxlX2JhbGFuY2VfMjAxN1ssLTJdDQpCaW5ndXNfYmFsMyA8LSBzdWJzZXQoQmluZ3VzX2JhbDMsIE1ldHJpYyA9PSAiQXNzZXRzIikNCkJpbmd1c19iYWwzIDwtIEJpbmd1c19iYWwzW29yZGVyKEJpbmd1c19iYWwzJGVuZERhdGUpLF0NCmBgYA0KDQpgYGB7cn0NCmFwcGxlX2JhbGFuY2VfMjAxNSA8LSBHZXRCYWxhbmNlU2hlZXQoIkFBUEwiLDIwMTUpDQpCaW5ndXNfYmFsNCA8LSBhcHBsZV9iYWxhbmNlXzIwMTVbLC0yXQ0KQmluZ3VzX2JhbDQgPC0gc3Vic2V0KEJpbmd1c19iYWw0LCBNZXRyaWMgPT0gIkFzc2V0cyIpDQpCaW5ndXNfYmFsNCA8LSBCaW5ndXNfYmFsNFtvcmRlcihCaW5ndXNfYmFsNCRlbmREYXRlKSxdDQpCaW5ndXNfYmFsNCA8LSBCaW5ndXNfYmFsNFstMSxdDQpgYGANCg0KYGBge3J9DQphcHBsZV9iYWxhbmNlXzIwMTIgPC0gR2V0QmFsYW5jZVNoZWV0KCJBQVBMIiwyMDEyKQ0KQmluZ3VzX2JhbDUgPC0gYXBwbGVfYmFsYW5jZV8yMDEyWywtMl0NCkJpbmd1c19iYWw1IDwtIHN1YnNldChCaW5ndXNfYmFsNSwgTWV0cmljID09ICJBc3NldHMiKQ0KQmluZ3VzX2JhbDUgPC0gQmluZ3VzX2JhbDVbb3JkZXIoQmluZ3VzX2JhbDUkZW5kRGF0ZSksXQ0KQmluZ3VzX2JhbDUgPC0gQmluZ3VzX2JhbDVbLTEsXQ0KYGBgDQoNCmBgYHtyfQ0KYmluZ3VzX2JhbGFuY2UgPC0gcmJpbmQoQmluZ3VzX2JhbCxCaW5ndXNfYmFsMixCaW5ndXNfYmFsMywgQmluZ3VzX2JhbDQsIEJpbmd1c19iYWw1KQ0KYGBgDQoNCmBgYHtyfQ0Kc3RyKGJpbmd1c19iYWxhbmNlKQ0KYmluZ3VzX2JhbGFuY2UkeWVhciA8LSB5ZWFyKGFzLkRhdGUoYmluZ3VzX2JhbGFuY2UkZW5kRGF0ZSkpDQpiaW5ndXNfYmFsYW5jZSRBbW91bnQgPC0gYXMubnVtZXJpYyhiaW5ndXNfYmFsYW5jZSRBbW91bnQpDQpiaW5ndXNfYmFsYW5jZQ0KYGBgDQoNCmBgYHtyfQ0KYmluZ3VzX2JhbGFuY2UkQW1vdW50IDwtIGxvZyhhcy5udW1lcmljKGJpbmd1c19iYWxhbmNlJEFtb3VudCkpDQpiaW5ndXNfYmFsYW5jZSA8LSBiaW5ndXNfYmFsYW5jZSU+JSBhcnJhbmdlKHllYXIpDQpiaW5ndXNfYmFsYW5jZQ0KYGBgDQoNCmBgYHtyfQ0KYmluZ3VzX2JhbGFuY2UgPC0gYmluZ3VzX2JhbGFuY2VbLGMoMiw1KV0NCmJpbmd1c19iYWxhbmNlDQpgYGANCg0KIyMgQ3JlYXIgbGEgc2VyaWUgZGUgdGllbXBvDQoNCmBgYHtyfQ0KdHNfQXNzZXRzIDwtIHRzKGRhdGE9YmluZ3VzX2JhbGFuY2UkQW1vdW50LCBmcmVxdWVuY3kgPSAxLCBzdGFydCA9IGMoMjAwOSksIGVuZCA9IGMoMjAxNykpDQpwbG90KHRzX0Fzc2V0cykNCnRzX0Fzc2V0cw0KYGBgDQoNCmBgYHtyfQ0KYXJpbWFfQXNzZXRzIDwtIGF1dG8uYXJpbWEodHNfQXNzZXRzKQ0Kc3VtbWFyeShhcmltYV9Bc3NldHMpDQphcmltYV9Bc3NldHMNCmBgYA0KDQpgYGB7cn0NCnByb25vc3RpY29fMyA8LSBmb3JlY2FzdChhcmltYV9Bc3NldHMsIGg9NSkNCnByb25vc3RpY29fMw0KcGxvdChwcm9ub3N0aWNvXzMpDQpgYGANCg0KIyMgQ29uY2x1c2nDs24NCg0KRGVudHJvIGRlIGxvcyAzIHByb27Ds3N0aWNvcyBzZSBwdWVkZSBvYnNlcnZhciBxdWUgbGEgZW1wcmVzYSBkZSBBcHBsZSBtYW50aWVuZSB1bmEgdGVuZGVuY2lhIHBvc2l0aXZhIGNvbiB1biBjcmVjaW1pZW50byBnZW5lcmFsIGR1cmFudGUgbG9zIGHDsW9zLCBsbyBjdWFsIGhhY2Ugc2VudGlkbyB5YSBxdWUgbGEgZW1wcmVzYSBlc3TDoSBjcmVjaWVuZG8gZSBpbm5vdmFuZG8gY29uc3RhbnRlbWVudGUuIEVuIGVzdGUgY2FzbyBjcmVlbW9zIHF1ZSBlcyBtZWpvciBtYW5lamFyIGxvcyBkYXRvcyBkZSBtYW5lcmEgdHJpbWVzdHJhbCwgZGViaWRvIGEgcXVlIHNpIHNlIG1hbmVqYSBwb3IgYcOxbyBlbCBwcm9uw7NzdGljbyBjb21pZW56YSBhIHNlciB1biBwb2NvIG3DoXMgcGVzYWRvIHkgbG9zIHByb27Ds3N0aWNvcyB0ZXJtaW5hbiBzaWVuZG8gb2Jzb2xldG9zIHlhIHF1ZSBlbCBwYXF1ZXRlIGRlICdmb3JlY2FzdCcgc2ltcGxlbWVudGUgbm8gY2FtYmlhLiBEZSBpZ3VhbCBmb3JtYSBpZGVudGlmaWNhbW9zIHF1ZSBlbiBvY2FzaW9uZXMgcHVlZGUgaGFiZXIgcmVwZXRpY2lvbmVzIGRlIGxvcyBhw7FvcywgcG9yIGxvIHF1ZSBlcyBpbXBvcnRhbnRlIGhhY2VyIG5vdGEgZGUgZXN0b3MgeSBzZWxlY2Npb25hciBsb3MgbmVjZXNhcmlvcyBhIHRyYXbDqXMgZGUgbWFuaXB1bGFjacOzbiBkZSBiYXNlcyBkZSBkYXRvcyBwYXJhIGNyZWFyIHVuIGJ1ZW4gcHJvbsOzc3RpY28uDQo=