Question 3.3, ARIMA Model of Heating

mod_heating <- arima(dat.f$heating[1: num_obs], order = c(0, 1, 2), seasonal = list(order = c(0, 0, 2), period = 48), 
                     fixed = c(0, NA, NA, NA), include.mean = T)
mod_heating

Call:
arima(x = dat.f$heating[1:num_obs], order = c(0, 1, 2), seasonal = list(order = c(0, 
    0, 2), period = 48), include.mean = T, fixed = c(0, NA, NA, NA))

Coefficients:
      ma1      ma2    sma1    sma2
        0  -0.1261  0.0696  0.1217
s.e.    0   0.0490  0.0479  0.0474

sigma^2 estimated as 56.66:  log likelihood = -1654.23,  aic = 3316.47
plotTimeSeriesResidual(mod_heating, num_lag = 100, "ARIMA Model 3.1.4 of Heating")

setEPS()
postscript("7.eps", width = 11, height = 12)
plotTimeSeriesResidual(mod_heating, num_lag = 100, "ARIMA Model 3.1.4 of Heating")
dev.off()
pred_heating <- predict(mod_heating, n.ahead = 4)
intervalPred <- calIntervalPred(482, 13, pred_heating$pred, pred_heating$se)
mat_intervalPred <- matrix(nrow = 2, ncol = 4)
mat_intervalPred[1,] <- intervalPred$boundUp
mat_intervalPred[2,] <- intervalPred$boundLow
plotPredHeating(pred_heating$pred, mat_intervalPred, str = "ARIMA(0,1,2)(0,0,1)48 Model")

rm(mat_intervalPred)
setEPS()
postscript("12.eps", width = 11, height = 6)
plotPredHeating(pred_heating$pred, mat_intervalPred, str = "ARIMA(0,1,2)(0,0,1)48 Model")
dev.off()
rm(mat_intervalPred)

Question 3.4, ARIMAX Model of Heating

ts_tempExternal <- ts(dat.f$tempExternal[1: num_obs], frequency = 48)
ts_iSolar <- ts(dat.f$iSolar[1: num_obs], frequency = 48)
ts_heating <- ts(dat.f$heating[1: num_obs], frequency = 48)
auto.arima(ts_tempExternal, d = 1, seasonal = TRUE)
auto.arima(ts_iSolar, d = 0, seasonal = TRUE)
auto.arima(ts_heating, xreg = ts_tempExternal, d = 1, seasonal = TRUE)
auto.arima(ts_heating, xreg = ts_iSolar, d = 0, seasonal = TRUE)

Pre-Whitening of Heating using ARIMA Model of External Temperature

mod_tempExternal <- arima(dat.f$tempExternal[1: num_obs], order = c(0, 1, 1), seasonal = list(order = c(0, 0, 1), 
    period = 48), include.mean = TRUE)
x_1 <- dat.f$tempExternal[1: num_obs] - fitted(Arima(dat.f$tempExternal[1: num_obs], model = mod_tempExternal))
y_1 <- dat.f$heating[1: num_obs] - fitted(Arima(dat.f$heating[1: num_obs], model = mod_tempExternal))
sum(x_1 - mod_tempExternal$residuals) < 10^6
[1] TRUE
par(mar=c(3.5,3.5,3,1), mgp=c(2,0.7,0))
plotCCFunc(x_1, y_1, "Filtered External Temp", "Filtered Heating")

setEPS()
postscript("8.eps", width = 11, height = 12)
plotTimeSeriesResidual(mod_tempExternal, num_lag = 100, "ARIMA Model 1.1.1 of External Temperature")
dev.off()
setEPS()
postscript("10.eps", width = 11, height = 6)
plotCCFunc(x_1, y_1, "Filtered External Temp", "Filtered Heating")
dev.off()

Pre-Whitening of Heating using ARIMA Model of Solar Irradiation

mod_iSolar <- arima(dat.f$iSolar[1: num_obs], order = c(4, 0, 0), seasonal = list(order = c(0, 0, 2), period = 48), 
                    include.mean = T)
x_2 <- dat.f$iSolar[1: num_obs] - fitted(Arima(dat.f$iSolar[1: num_obs], model = mod_iSolar))
y_2 <- residuals(Arima(dat.f$heating[1: num_obs], model = mod_iSolar))
sum(x_2 - mod_tempExternal$residuals) < 10^6
[1] TRUE
par(mar=c(3.5,3.5,3,1), mgp=c(2,0.7,0))
plotCCFunc(x_2, y_2, "Filtered Solar Irradiation", "Filtered Heating")

setEPS()
postscript("11.eps", width = 11, height = 6)
plotCCFunc(x_2, y_2, "Filtered Solar Irradiation", "Filtered Heating")
dev.off()

Prediction of Heating using ARIMAX Model

ts_heating <- ts(dat.f$heating[1: num_obs], frequency = 48)
ts_iSolar <- ts(dat.f$iSolar[1: num_obs], frequency = 48)
mat_obs <- cbind(y = ts_heating, x_1 = ts_iSolar, x_2 = lag(ts_iSolar, k = - 1))
mod_heating_x <- lm(y ~ x_1 + x_2, data = mat_obs, na.action = na.omit)

mod_residualHeating <- auto.arima(residualHeating[1: 481])
pred_residualHeating <- predict(mod_residualHeating, n.ahead = 4)$pred
mat_x <- cbind(rep(1, 4), dat.f$iSolar[(num_obs+1): (num_obs+4)], dat.f$iSolar[(num_obs): (num_obs+3)])
pred_heating_x <- mat_x %*% mod_heating_x$coefficients
pred_heating_x_residual <- pred_heating_x + pred_residualHeating
# plotPredHeating(pred_heating_x, "ARIMAX Model with Known Solar Irradiation as Input")
plotPredHeating(pred_heating_x_residual, "ARIMAX Model with Known Solar Irradiation as Input")
setEPS()
postscript("13.eps", width = 11, height = 6)
plotPredHeating(pred_heating_x_residual, "ARIMAX Model with Known Solar Irradiation as Input")
dev.off()
mod_heating_3

Call:
arima(x = dat.f$heating[2:num_obs], order = c(3, 0, 4), seasonal = list(order = c(0, 
    0, 1), period = 48), xreg = cbind(tempExternal = dat.f$tempExternal[2:num_obs], 
    iSolar = dat.f$iSolar[2:num_obs], iSolar_1 = dat.f$iSolar[1:num_obs - 1]))

Coefficients:
          ar1     ar2     ar3     ma1     ma2      ma3     ma4    sma1  intercept  tempExternal  iSolar  iSolar_1
      -0.3056  0.2911  0.8903  0.6817  0.3588  -0.2915  0.2071  0.1442    87.3190       -1.6666  -0.067   -0.0368
s.e.   0.0989  0.0668  0.0776  0.1064  0.0780   0.0720  0.0500  0.0410     3.3126        0.4677   0.002    0.0019

sigma^2 estimated as 10.73:  log likelihood = -1254.8,  aic = 2535.6
pred_heating_3 <- predict(mod_heating_3, newxreg = cbind(tempExternal = 
    dat.f$tempExternal[(num_obs + 1): (num_obs + 4)], iSolar = dat.f$iSolar[(num_obs + 1): (num_obs + 4)], 
    iSolar_1 = dat.f$iSolar[num_obs: (num_obs + 3)]), n.ahead = 4)$pred
plotPredHeating(pred_heating_3, "ARIMAX Model with Known Solar Irradiation as Input")

ARIMAX Model using External Temperature and Solar Irradiation as Input

mod_heating_4

Call:
arima(x = dat.f$heating[2:num_obs], order = c(3, 0, 4), seasonal = list(order = c(0, 
    0, 2), period = 48), xreg = cbind(tempExternal = dat.f$tempExternal[2:num_obs], 
    iSolar = dat.f$iSolar[2:num_obs], iSolar_1 = dat.f$iSolar[1:num_obs - 1]))

Coefficients:
          ar1     ar2     ar3     ma1     ma2      ma3     ma4    sma1    sma2  intercept  tempExternal   iSolar
      -0.3030  0.2717  0.9089  0.6855  0.3925  -0.2983  0.1985  0.1568  0.2190    86.8396       -1.5537  -0.0677
s.e.   0.1117  0.1127  0.0751  0.1198  0.0998   0.0728  0.0500  0.0477  0.0511     3.5250        0.4309   0.0019
      iSolar_1
       -0.0373
s.e.    0.0018

sigma^2 estimated as 10.23:  log likelihood = -1245.55,  aic = 2519.1
setEPS()
postscript("15.eps", width = 11, height = 12)
plotTimeSeriesResidual(mod_heating_4$residuals, num_lag = 100)
dev.off()
plotPredHeating(pred_heating_4$pred, mat_intervalPred, str = "ARIMAX Model with Known Ex-Temp and Solar-Irra as Input")
There were 25 warnings (use warnings() to see them)

setEPS()
postscript("14.eps", width = 11, height = 6)
plotPredHeating(pred_heating_4$pred, mat_intervalPred, str = "ARIMAX Model with Known Ex-Temp and Solar-Irra as Input")
dev.off()
mod_heating_5

Call:
arima(x = dat.f$heating[3:num_obs], order = c(3, 0, 4), seasonal = list(order = c(0, 
    0, 1), period = 48), xreg = cbind(tempExternal = dat.f$tempExternal[3:num_obs], 
    iSolar = dat.f$iSolar[3:num_obs], iSolar_1 = dat.f$iSolar[2:(num_obs - 1)], 
    iSolar_2 = dat.f$iSolar[1:(num_obs - 2)]))

Coefficients:
          ar1     ar2     ar3     ma1     ma2      ma3     ma4    sma1  intercept  tempExternal   iSolar  iSolar_1
      -0.3681  0.2881  0.9419  0.7496  0.4042  -0.3146  0.2103  0.1534    87.5979       -1.7410  -0.0664   -0.0375
s.e.   0.0247  0.0322  0.0237  0.0702  0.0785   0.0623  0.0529  0.0405     3.2543        0.4851   0.0021    0.0020
      iSolar_2
        0.0021
s.e.    0.0019

sigma^2 estimated as 10.65:  log likelihood = -1251.88,  aic = 2531.76

pred_heating_6 <- predict(mod_heating_6, newxreg = cbind(tempExternal = 
    dat.f$tempExternal[(num_obs + 1): (num_obs + 4)], iSolar = dat.f$iSolar[(num_obs + 1): (num_obs + 4)], 
    iSolar_1 = dat.f$iSolar[num_obs: (num_obs + 3)]), n.ahead = 4)$pred
plotPredHeating(pred_heating_6, "ARIMAX Model with Known Solar Irradiation as Input")

LS0tCnRpdGxlOiAiZHR1MDI0MTdhMzogQVJJTUEgTW9kZWwgZm9yIEJ1aWxkaW5nIERhdGEiCm91dHB1dDogaHRtbF9ub3RlYm9vawphdXRob3I6IEVkd2FyZCBKLiBYdSAoSmllIFh1KSwgczE4MTIzOApkYXRlOiAxN3RoIEFwcmlsLCAyMDE5Ci0tLQoKYGBge3IsIGluY2x1ZGU9RkFMU0V9CiMgQ2xlYXIgdmFyaWFibGVzCnJtKGxpc3Q9bHMoKSkKbGlicmFyeShrbml0cikKbGlicmFyeShmb3JlY2FzdCkKc291cmNlKCdMaW5lYXJTdG9jU3lzdGVtX0VEWFUuUicpCnNvdXJjZSgiRGF0YS5SIikKYGBgCgojIFF1ZXN0aW9uIDMuMywgQVJJTUEgTW9kZWwgb2YgSGVhdGluZwoKYGBge3IsIHdhcm5pbmc9RkFMU0UsIGZpZy5oZWlnaHQgPSAxMiwgZmlnLndpZHRoID0gMTF9Cm1vZF9oZWF0aW5nIDwtIGFyaW1hKGRhdC5mJGhlYXRpbmdbMTogbnVtX29ic10sIG9yZGVyID0gYygwLCAxLCAyKSwgc2Vhc29uYWwgPSBsaXN0KG9yZGVyID0gYygwLCAwLCAyKSwgcGVyaW9kID0gNDgpLCAKICAgICAgICAgICAgICAgICAgICAgZml4ZWQgPSBjKDAsIE5BLCBOQSwgTkEpLCBpbmNsdWRlLm1lYW4gPSBUKQptb2RfaGVhdGluZwpwbG90VGltZVNlcmllc1Jlc2lkdWFsKG1vZF9oZWF0aW5nLCBudW1fbGFnID0gMTAwLCAiQVJJTUEgTW9kZWwgMy4xLjQgb2YgSGVhdGluZyIpCmBgYAoKYGBge3IsIGV2YWw9RkFMU0V9CnNldEVQUygpCnBvc3RzY3JpcHQoIjcuZXBzIiwgd2lkdGggPSAxMSwgaGVpZ2h0ID0gMTIpCnBsb3RUaW1lU2VyaWVzUmVzaWR1YWwobW9kX2hlYXRpbmcsIG51bV9sYWcgPSAxMDAsICJBUklNQSBNb2RlbCAzLjEuNCBvZiBIZWF0aW5nIikKZGV2Lm9mZigpCmBgYAoKYGBge3IsIHdhcm5pbmc9RkFMU0UsIGZpZy5oZWlnaHQgPSA2LCBmaWcud2lkdGggPSAxMX0KcHJlZF9oZWF0aW5nIDwtIHByZWRpY3QobW9kX2hlYXRpbmcsIG4uYWhlYWQgPSA0KQppbnRlcnZhbFByZWQgPC0gY2FsSW50ZXJ2YWxQcmVkKDQ4MiwgMTMsIHByZWRfaGVhdGluZyRwcmVkLCBwcmVkX2hlYXRpbmckc2UpCm1hdF9pbnRlcnZhbFByZWQgPC0gbWF0cml4KG5yb3cgPSAyLCBuY29sID0gNCkKbWF0X2ludGVydmFsUHJlZFsxLF0gPC0gaW50ZXJ2YWxQcmVkJGJvdW5kVXAKbWF0X2ludGVydmFsUHJlZFsyLF0gPC0gaW50ZXJ2YWxQcmVkJGJvdW5kTG93CnBsb3RQcmVkSGVhdGluZyhwcmVkX2hlYXRpbmckcHJlZCwgbWF0X2ludGVydmFsUHJlZCwgc3RyID0gIkFSSU1BKDAsMSwyKSgwLDAsMSk0OCBNb2RlbCIpCmBgYAoKYGBge3IsIGV2YWw9RkFMU0V9CnNldEVQUygpCnBvc3RzY3JpcHQoIjEyLmVwcyIsIHdpZHRoID0gMTEsIGhlaWdodCA9IDYpCnBsb3RQcmVkSGVhdGluZyhwcmVkX2hlYXRpbmckcHJlZCwgbWF0X2ludGVydmFsUHJlZCwgc3RyID0gIkFSSU1BKDAsMSwyKSgwLDAsMSk0OCBNb2RlbCIpCmRldi5vZmYoKQpybShtYXRfaW50ZXJ2YWxQcmVkKQpgYGAKCiMgUXVlc3Rpb24gMy40LCBBUklNQVggTW9kZWwgb2YgSGVhdGluZwoKYGBge3IsIGV2YWw9RkFMU0V9CnRzX3RlbXBFeHRlcm5hbCA8LSB0cyhkYXQuZiR0ZW1wRXh0ZXJuYWxbMTogbnVtX29ic10sIGZyZXF1ZW5jeSA9IDQ4KQp0c19pU29sYXIgPC0gdHMoZGF0LmYkaVNvbGFyWzE6IG51bV9vYnNdLCBmcmVxdWVuY3kgPSA0OCkKdHNfaGVhdGluZyA8LSB0cyhkYXQuZiRoZWF0aW5nWzE6IG51bV9vYnNdLCBmcmVxdWVuY3kgPSA0OCkKYXV0by5hcmltYSh0c190ZW1wRXh0ZXJuYWwsIGQgPSAxLCBzZWFzb25hbCA9IFRSVUUpCmF1dG8uYXJpbWEodHNfaVNvbGFyLCBkID0gMCwgc2Vhc29uYWwgPSBUUlVFKQphdXRvLmFyaW1hKHRzX2hlYXRpbmcsIHhyZWcgPSB0c190ZW1wRXh0ZXJuYWwsIGQgPSAxLCBzZWFzb25hbCA9IFRSVUUpCmF1dG8uYXJpbWEodHNfaGVhdGluZywgeHJlZyA9IHRzX2lTb2xhciwgZCA9IDAsIHNlYXNvbmFsID0gVFJVRSkKYGBgCgojIyBQcmUtV2hpdGVuaW5nIG9mIEhlYXRpbmcgdXNpbmcgQVJJTUEgTW9kZWwgb2YgRXh0ZXJuYWwgVGVtcGVyYXR1cmUKCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBmaWcuaGVpZ2h0ID0gNiwgZmlnLndpZHRoID0gMTF9Cm1vZF90ZW1wRXh0ZXJuYWwgPC0gYXJpbWEoZGF0LmYkdGVtcEV4dGVybmFsWzE6IG51bV9vYnNdLCBvcmRlciA9IGMoMCwgMSwgMSksIHNlYXNvbmFsID0gbGlzdChvcmRlciA9IGMoMCwgMCwgMSksIAogICAgcGVyaW9kID0gNDgpLCBpbmNsdWRlLm1lYW4gPSBUUlVFKQp4XzEgPC0gZGF0LmYkdGVtcEV4dGVybmFsWzE6IG51bV9vYnNdIC0gZml0dGVkKEFyaW1hKGRhdC5mJHRlbXBFeHRlcm5hbFsxOiBudW1fb2JzXSwgbW9kZWwgPSBtb2RfdGVtcEV4dGVybmFsKSkKeV8xIDwtIGRhdC5mJGhlYXRpbmdbMTogbnVtX29ic10gLSBmaXR0ZWQoQXJpbWEoZGF0LmYkaGVhdGluZ1sxOiBudW1fb2JzXSwgbW9kZWwgPSBtb2RfdGVtcEV4dGVybmFsKSkKc3VtKHhfMSAtIG1vZF90ZW1wRXh0ZXJuYWwkcmVzaWR1YWxzKSA8IDEwXjYKcGxvdENDRnVuYyh4XzEsIHlfMSwgIkZpbHRlcmVkIEV4dGVybmFsIFRlbXAiLCAiRmlsdGVyZWQgSGVhdGluZyIpCmBgYAoKYGBge3IsIGV2YWw9RkFMU0V9CnNldEVQUygpCnBvc3RzY3JpcHQoIjguZXBzIiwgd2lkdGggPSAxMSwgaGVpZ2h0ID0gMTIpCnBsb3RUaW1lU2VyaWVzUmVzaWR1YWwobW9kX3RlbXBFeHRlcm5hbCwgbnVtX2xhZyA9IDEwMCwgIkFSSU1BIE1vZGVsIDEuMS4xIG9mIEV4dGVybmFsIFRlbXBlcmF0dXJlIikKZGV2Lm9mZigpCmBgYAoKYGBge3IsIGV2YWw9RkFMU0V9CnNldEVQUygpCnBvc3RzY3JpcHQoIjEwLmVwcyIsIHdpZHRoID0gMTEsIGhlaWdodCA9IDYpCnBsb3RDQ0Z1bmMoeF8xLCB5XzEsICJGaWx0ZXJlZCBFeHRlcm5hbCBUZW1wIiwgIkZpbHRlcmVkIEhlYXRpbmciKQpkZXYub2ZmKCkKYGBgCgojIyBQcmUtV2hpdGVuaW5nIG9mIEhlYXRpbmcgdXNpbmcgQVJJTUEgTW9kZWwgb2YgU29sYXIgSXJyYWRpYXRpb24KCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBmaWcuaGVpZ2h0ID0gNiwgZmlnLndpZHRoID0gMTF9Cm1vZF9pU29sYXIgPC0gYXJpbWEoZGF0LmYkaVNvbGFyWzE6IG51bV9vYnNdLCBvcmRlciA9IGMoNCwgMCwgMCksIHNlYXNvbmFsID0gbGlzdChvcmRlciA9IGMoMCwgMCwgMiksIHBlcmlvZCA9IDQ4KSwgCiAgICAgICAgICAgICAgICAgICAgaW5jbHVkZS5tZWFuID0gVCkKeF8yIDwtIGRhdC5mJGlTb2xhclsxOiBudW1fb2JzXSAtIGZpdHRlZChBcmltYShkYXQuZiRpU29sYXJbMTogbnVtX29ic10sIG1vZGVsID0gbW9kX2lTb2xhcikpCnlfMiA8LSByZXNpZHVhbHMoQXJpbWEoZGF0LmYkaGVhdGluZ1sxOiBudW1fb2JzXSwgbW9kZWwgPSBtb2RfaVNvbGFyKSkKc3VtKHhfMiAtIG1vZF90ZW1wRXh0ZXJuYWwkcmVzaWR1YWxzKSA8IDEwXjYKcGFyKG1hcj1jKDMuNSwzLjUsMywxKSwgbWdwPWMoMiwwLjcsMCkpCnBsb3RDQ0Z1bmMoeF8yLCB5XzIsICJGaWx0ZXJlZCBTb2xhciBJcnJhZGlhdGlvbiIsICJGaWx0ZXJlZCBIZWF0aW5nIikKYGBgCgpgYGB7ciwgZXZhbD1GQUxTRX0Kc2V0RVBTKCkKcG9zdHNjcmlwdCgiMTEuZXBzIiwgd2lkdGggPSAxMSwgaGVpZ2h0ID0gNikKcGxvdENDRnVuYyh4XzIsIHlfMiwgIkZpbHRlcmVkIFNvbGFyIElycmFkaWF0aW9uIiwgIkZpbHRlcmVkIEhlYXRpbmciKQpkZXYub2ZmKCkKYGBgCgojIyBQcmVkaWN0aW9uIG9mIEhlYXRpbmcgdXNpbmcgQVJJTUFYIE1vZGVsCgpgYGB7cn0KdHNfaGVhdGluZyA8LSB0cyhkYXQuZiRoZWF0aW5nWzE6IG51bV9vYnNdLCBmcmVxdWVuY3kgPSA0OCkKdHNfaVNvbGFyIDwtIHRzKGRhdC5mJGlTb2xhclsxOiBudW1fb2JzXSwgZnJlcXVlbmN5ID0gNDgpCm1hdF9vYnMgPC0gY2JpbmQoeSA9IHRzX2hlYXRpbmcsIHhfMSA9IHRzX2lTb2xhciwgeF8yID0gbGFnKHRzX2lTb2xhciwgayA9IC0gMSkpCm1vZF9oZWF0aW5nX3ggPC0gbG0oeSB+IHhfMSArIHhfMiwgZGF0YSA9IG1hdF9vYnMsIG5hLmFjdGlvbiA9IG5hLm9taXQpCmBgYAoKYGBge3IsIGZpZy5oZWlnaHQgPSAxMiwgZmlnLndpZHRoID0gMTF9Cm1hdF9vYnMgPC0gY2JpbmQocmVwKDEsIDQ4MiksIGRhdC5mJGlTb2xhclsxOiA0ODJdLCBjKGRhdC5mJGlTb2xhclsyOiA0ODJdLCBOYU4pKQpyZXNpZHVhbEhlYXRpbmcgPC0gZGF0LmYkaGVhdGluZ1sxOiA0ODJdIC0gbWF0X29icyAlKiUgbW9kX2hlYXRpbmdfeCRjb2VmZmljaWVudHMKcGxvdFRpbWVTZXJpZXNSZXNpZHVhbChyZXNpZHVhbEhlYXRpbmdbMTogNDgxXSwgbnVtX2xhZyA9IDEwMCkKYGBgCgpgYGB7cn0KbW9kX3Jlc2lkdWFsSGVhdGluZyA8LSBhdXRvLmFyaW1hKHJlc2lkdWFsSGVhdGluZ1sxOiA0ODFdKQpwcmVkX3Jlc2lkdWFsSGVhdGluZyA8LSBwcmVkaWN0KG1vZF9yZXNpZHVhbEhlYXRpbmcsIG4uYWhlYWQgPSA0KSRwcmVkCmBgYAoKYGBge3IsIHdhcm5pbmc9RkFMU0UsIGZpZy5oZWlnaHQgPSA2LCBmaWcud2lkdGggPSAxMX0KbWF0X3ggPC0gY2JpbmQocmVwKDEsIDQpLCBkYXQuZiRpU29sYXJbKG51bV9vYnMrMSk6IChudW1fb2JzKzQpXSwgZGF0LmYkaVNvbGFyWyhudW1fb2JzKTogKG51bV9vYnMrMyldKQpwcmVkX2hlYXRpbmdfeCA8LSBtYXRfeCAlKiUgbW9kX2hlYXRpbmdfeCRjb2VmZmljaWVudHMKcHJlZF9oZWF0aW5nX3hfcmVzaWR1YWwgPC0gcHJlZF9oZWF0aW5nX3ggKyBwcmVkX3Jlc2lkdWFsSGVhdGluZwojIHBsb3RQcmVkSGVhdGluZyhwcmVkX2hlYXRpbmdfeCwgIkFSSU1BWCBNb2RlbCB3aXRoIEtub3duIFNvbGFyIElycmFkaWF0aW9uIGFzIElucHV0IikKcGxvdFByZWRIZWF0aW5nKHByZWRfaGVhdGluZ194X3Jlc2lkdWFsLCAiQVJJTUFYIE1vZGVsIHdpdGggS25vd24gU29sYXIgSXJyYWRpYXRpb24gYXMgSW5wdXQiKQpgYGAKCmBgYHtyLCBldmFsPUZBTFNFfQpzZXRFUFMoKQpwb3N0c2NyaXB0KCIxMy5lcHMiLCB3aWR0aCA9IDExLCBoZWlnaHQgPSA2KQpwbG90UHJlZEhlYXRpbmcocHJlZF9oZWF0aW5nX3hfcmVzaWR1YWwsICJBUklNQVggTW9kZWwgd2l0aCBLbm93biBTb2xhciBJcnJhZGlhdGlvbiBhcyBJbnB1dCIpCmRldi5vZmYoKQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0ID0gMTIsIGZpZy53aWR0aCA9IDExfQptb2RfaGVhdGluZ18zIDwtIGFyaW1hKGRhdC5mJGhlYXRpbmdbMjogbnVtX29ic10sIG9yZGVyID0gYygzLCAwLCA0KSwgc2Vhc29uYWwgPSBsaXN0KG9yZGVyID0gYygwLCAwLCAxKSwgcGVyaW9kID0gNDgpLCAKICAgIHhyZWcgPSBjYmluZCh0ZW1wRXh0ZXJuYWwgPSBkYXQuZiR0ZW1wRXh0ZXJuYWxbMjogbnVtX29ic10sIGlTb2xhciA9IGRhdC5mJGlTb2xhclsyOiBudW1fb2JzXSwKICAgIGlTb2xhcl8xID0gZGF0LmYkaVNvbGFyWzE6IG51bV9vYnMtMV0pKQptb2RfaGVhdGluZ18zCnBsb3RUaW1lU2VyaWVzUmVzaWR1YWwobW9kX2hlYXRpbmdfMyRyZXNpZHVhbHMsIG51bV9sYWcgPSAxMDApCmBgYAoKYGBge3IsIGZpZy5oZWlnaHQgPSA2LCBmaWcud2lkdGggPSAxMX0KcHJlZF9oZWF0aW5nXzMgPC0gcHJlZGljdChtb2RfaGVhdGluZ18zLCBuZXd4cmVnID0gY2JpbmQodGVtcEV4dGVybmFsID0gCiAgICBkYXQuZiR0ZW1wRXh0ZXJuYWxbKG51bV9vYnMgKyAxKTogKG51bV9vYnMgKyA0KV0sIGlTb2xhciA9IGRhdC5mJGlTb2xhclsobnVtX29icyArIDEpOiAobnVtX29icyArIDQpXSwgCiAgICBpU29sYXJfMSA9IGRhdC5mJGlTb2xhcltudW1fb2JzOiAobnVtX29icyArIDMpXSksIG4uYWhlYWQgPSA0KSRwcmVkCnBsb3RQcmVkSGVhdGluZyhwcmVkX2hlYXRpbmdfMywgIkFSSU1BWCBNb2RlbCB3aXRoIEtub3duIEV4LVRlbXAgYW5kIFNvbGFyLUlycmEgYXMgSW5wdXQiKQpgYGAKCiMjIEFSSU1BWCBNb2RlbCB1c2luZyBFeHRlcm5hbCBUZW1wZXJhdHVyZSBhbmQgU29sYXIgSXJyYWRpYXRpb24gYXMgSW5wdXQKCmBgYHtyLCBmaWcuaGVpZ2h0ID0gMTIsIGZpZy53aWR0aCA9IDExfQptb2RfaGVhdGluZ180IDwtIGFyaW1hKGRhdC5mJGhlYXRpbmdbMjogbnVtX29ic10sIG9yZGVyID0gYygzLCAwLCA0KSwgc2Vhc29uYWwgPSBsaXN0KG9yZGVyID0gYygwLCAwLCAyKSwgcGVyaW9kID0gNDgpLCAKICAgIHhyZWcgPSBjYmluZCh0ZW1wRXh0ZXJuYWwgPSBkYXQuZiR0ZW1wRXh0ZXJuYWxbMjogbnVtX29ic10sIGlTb2xhciA9IGRhdC5mJGlTb2xhclsyOiBudW1fb2JzXSwKICAgIGlTb2xhcl8xID0gZGF0LmYkaVNvbGFyWzE6IG51bV9vYnMtMV0pKQptb2RfaGVhdGluZ180CnBsb3RUaW1lU2VyaWVzUmVzaWR1YWwobW9kX2hlYXRpbmdfNCRyZXNpZHVhbHMsIG51bV9sYWcgPSAxMDAsICJNb2RlbCA0IikKYGBgCgpgYGB7ciwgZXZhbD1GQUxTRX0Kc2V0RVBTKCkKcG9zdHNjcmlwdCgiMTUuZXBzIiwgd2lkdGggPSAxMSwgaGVpZ2h0ID0gMTIpCnBsb3RUaW1lU2VyaWVzUmVzaWR1YWwobW9kX2hlYXRpbmdfNCRyZXNpZHVhbHMsIG51bV9sYWcgPSAxMDApCmRldi5vZmYoKQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0ID0gNiwgZmlnLndpZHRoID0gMTF9CnByZWRfaGVhdGluZ180IDwtIHByZWRpY3QobW9kX2hlYXRpbmdfNCwgbmV3eHJlZyA9IGNiaW5kKHRlbXBFeHRlcm5hbCA9IAogICAgZGF0LmYkdGVtcEV4dGVybmFsWyhudW1fb2JzICsgMSk6IChudW1fb2JzICsgNCldLCBpU29sYXIgPSBkYXQuZiRpU29sYXJbKG51bV9vYnMgKyAxKTogKG51bV9vYnMgKyA0KV0sIAogICAgaVNvbGFyXzEgPSBkYXQuZiRpU29sYXJbbnVtX29iczogKG51bV9vYnMgKyAzKV0pLCBuLmFoZWFkID0gNCkKaW50ZXJ2YWxQcmVkIDwtIGNhbEludGVydmFsUHJlZCg0ODIsIDEzLCBwcmVkX2hlYXRpbmdfNCRwcmVkLCBwcmVkX2hlYXRpbmdfNCRzZSkKbWF0X2ludGVydmFsUHJlZCA8LSBtYXRyaXgobnJvdyA9IDIsIG5jb2wgPSA0KQptYXRfaW50ZXJ2YWxQcmVkWzEsXSA8LSBpbnRlcnZhbFByZWQkYm91bmRVcAptYXRfaW50ZXJ2YWxQcmVkWzIsXSA8LSBpbnRlcnZhbFByZWQkYm91bmRMb3cKcGxvdFByZWRIZWF0aW5nKHByZWRfaGVhdGluZ180JHByZWQsIG1hdF9pbnRlcnZhbFByZWQsIHN0ciA9ICJBUklNQVggTW9kZWwgd2l0aCBLbm93biBFeC1UZW1wIGFuZCBTb2xhci1JcnJhIGFzIElucHV0IikKYGBgCgpgYGB7ciwgZXZhbD1GQUxTRX0Kc2V0RVBTKCkKcG9zdHNjcmlwdCgiMTQuZXBzIiwgd2lkdGggPSAxMSwgaGVpZ2h0ID0gNikKcGxvdFByZWRIZWF0aW5nKHByZWRfaGVhdGluZ180JHByZWQsIG1hdF9pbnRlcnZhbFByZWQsIHN0ciA9ICJBUklNQVggTW9kZWwgd2l0aCBLbm93biBFeC1UZW1wIGFuZCBTb2xhci1JcnJhIGFzIElucHV0IikKZGV2Lm9mZigpCmBgYAoKYGBge3IsIGZpZy5oZWlnaHQgPSAxMiwgZmlnLndpZHRoID0gMTF9Cm1vZF9oZWF0aW5nXzUgPC0gYXJpbWEoZGF0LmYkaGVhdGluZ1szOiBudW1fb2JzXSwgb3JkZXIgPSBjKDMsIDAsIDQpLCBzZWFzb25hbCA9IGxpc3Qob3JkZXIgPSBjKDAsIDAsIDEpLCBwZXJpb2QgPSA0OCksIAogICAgeHJlZyA9IGNiaW5kKHRlbXBFeHRlcm5hbCA9IGRhdC5mJHRlbXBFeHRlcm5hbFszOiBudW1fb2JzXSwgaVNvbGFyID0gZGF0LmYkaVNvbGFyWzM6IG51bV9vYnNdLAogICAgaVNvbGFyXzEgPSBkYXQuZiRpU29sYXJbMjogKG51bV9vYnMtMSldLCBpU29sYXJfMiA9IGRhdC5mJGlTb2xhclsxOiAobnVtX29icy0yKV0pKQptb2RfaGVhdGluZ181CnBsb3RUaW1lU2VyaWVzUmVzaWR1YWwobW9kX2hlYXRpbmdfNSRyZXNpZHVhbHMsIG51bV9sYWcgPSAxMDApCmBgYAoKYGBge3IsIGZpZy5oZWlnaHQgPSAxMiwgZmlnLndpZHRoID0gMTF9Cm1vZF9oZWF0aW5nXzYgPC0gYXJpbWEoZGF0LmYkaGVhdGluZ1syOiBudW1fb2JzXSwgb3JkZXIgPSBjKDMsIDEsIDQpLCBzZWFzb25hbCA9IGxpc3Qob3JkZXIgPSBjKDAsIDAsIDIpLCBwZXJpb2QgPSA0OCksIAogICAgeHJlZyA9IGNiaW5kKHRlbXBFeHRlcm5hbCA9IGRhdC5mJHRlbXBFeHRlcm5hbFsyOiBudW1fb2JzXSwgaVNvbGFyID0gZGF0LmYkaVNvbGFyWzI6IG51bV9vYnNdLAogICAgaVNvbGFyXzEgPSBkYXQuZiRpU29sYXJbMTogbnVtX29icy0xXSkpCm1vZF9oZWF0aW5nXzYKcGxvdFRpbWVTZXJpZXNSZXNpZHVhbChtb2RfaGVhdGluZ182JHJlc2lkdWFscywgbnVtX2xhZyA9IDEwMCkKYGBgCgpgYGB7ciwgZmlnLmhlaWdodCA9IDYsIGZpZy53aWR0aCA9IDExfQpwcmVkX2hlYXRpbmdfNiA8LSBwcmVkaWN0KG1vZF9oZWF0aW5nXzYsIG5ld3hyZWcgPSBjYmluZCh0ZW1wRXh0ZXJuYWwgPSAKICAgIGRhdC5mJHRlbXBFeHRlcm5hbFsobnVtX29icyArIDEpOiAobnVtX29icyArIDQpXSwgaVNvbGFyID0gZGF0LmYkaVNvbGFyWyhudW1fb2JzICsgMSk6IChudW1fb2JzICsgNCldLCAKICAgIGlTb2xhcl8xID0gZGF0LmYkaVNvbGFyW251bV9vYnM6IChudW1fb2JzICsgMyldKSwgbi5haGVhZCA9IDQpJHByZWQKcGxvdFByZWRIZWF0aW5nKHByZWRfaGVhdGluZ182LCAiQVJJTUFYIE1vZGVsIHdpdGggS25vd24gU29sYXIgSXJyYWRpYXRpb24gYXMgSW5wdXQiKQpgYGA=