library("R2WinBUGS")
library("R2jags")
library("rstan")
library("nimble")
library("boa")
library("coda")
library("xtable")
library("kableExtra")
library("tictoc")
library("LaplacesDemon")
library("HDInterval")
library("INLA")
######################################################################################
# SIMULAÇÃO DOS DADOS #
######################################################################################
set.seed(2019)
beta0=-2
beta1=2
beta2=10
sigma2=5
tau=1/sigma2
yt=list()
for (i in 1:100){
n=100
x=rnorm(n,0,1)
e=rnorm(n,0, sd = sqrt(sigma2))
yt[[i]]=list(beta0+beta1*x+e,x)
}
amostra = list()
final = list()
b0 = list()
b1 = list()
tau = list()
media_b0 = vector()
media_b1 = vector()
media_tau = vector()
mediana_b0 = vector()
mediana_b1 = vector()
mediana_tau = vector()
var_b0 = vector()
var_b1 = vector()
var_tau = vector()
eqm_b0 = vector()
eqm_b1 = vector()
eqm_tau = vector()
hdi = list()
tic()
for (i in 1:100){
y = yt[[i]][[1]]
x = yt[[i]][[2]]
sink("mod1.txt")
cat("
MODEL LR1 {
#Verossimilhança
for(i in 1:N) {
y[i] ~ dnorm(mu[i], tau )
mu[i] <- beta0 + beta1*x[i]
}
#Proris
beta0 ~ dnorm(0,0.1)
beta1 ~ dnorm(0,0.1)
tau ~ dgamma(1,0.1)
} ", fill = TRUE)
sink()
N = 100;data = list("N","y","x");params = c("beta0", "beta1","tau") ;inits <- function () {list(beta0 = 0,
beta1 = 0,
tau = 2)}
amostra[[i]] <- bugs(data = data, inits = inits, parameters.to.save = params,
model.file = "mod1.txt", n.chains = 3, n.iter = 10000,
n.burnin = 1000, n.thin=9, bugs.directory = "C:\\Program Files\\WinBUGS14",
debug = FALSE, save.history = FALSE, DIC = FALSE)
final[[i]] = amostra[[i]]$sims.matrix
b0[[i]] = final[[i]][,1]
b1[[i]] = final[[i]][,2]
tau[[i]] = final[[i]][,3]
media_b0[i] = mean(b0[[i]])
media_b1[i] = mean(b1[[i]])
media_tau[i] = mean(tau[[i]])
mediana_b0[i] = median(b0[[i]])
mediana_b1[i] = median(b1[[i]])
mediana_tau[i] = median(tau[[i]])
var_b0[i] = var(b0[[i]])
var_b1[i] = var(b1[[i]])
var_tau[i] = var(tau[[i]])
eqm_b0[i] = mean((b0[[i]]+2)^2)
eqm_b1[i] = mean((b1[[i]]-2)^2)
eqm_tau[i] = mean((tau[[i]]-.2)^2)
hdi[[i]] = hdi(final[[i]])
}
toc()
media=c(mean(media_b0),mean(media_b1),mean(media_tau))
mediana=c(mean(mediana_b0),mean(mediana_b1),mean(mediana_tau))
var=c(mean(var_b0),mean(var_b1),mean(var_tau))
eqm=c(mean(eqm_b0),mean(eqm_b1),mean(eqm_tau))
medidas=cbind(media,mediana,var,eqm)
rownames(medidas) = c("b0","b1","tau");medidas
int = as.data.frame(cbind(t(as.data.frame((hdi))),rep(c(-2,2,0.2),100)))
write.csv2(int,"C:\\Users\\Rafael\\Desktop\\int.xls")
######################################################################################
# JAGS #
######################################################################################
amostra = list()
final = list()
b0 = list()
b1 = list()
tau = list()
media_b0 = vector()
media_b1 = vector()
media_tau = vector()
mediana_b0 = vector()
mediana_b1 = vector()
mediana_tau = vector()
var_b0 = vector()
var_b1 = vector()
var_tau = vector()
eqm_b0 = vector()
eqm_b1 = vector()
eqm_tau = vector()
hdi = list()
tic()
for (i in 1:100){
y = yt[[i]][[1]]
x = yt[[i]][[2]]
model_code = '
model
{
# Vero
for (i in 1:n) {
y[i] ~ dnorm(beta1 + beta2 * x[i], tau)
}
# Prioris
beta1 ~ dnorm(0, 01)
beta2 ~ dnorm(0,0.1)
tau ~ dgamma(1,0.1)
}
'
model_data = list(n = n, y = y, x = x)
model_parameters = c("beta1", "beta2", "tau")
amostra[[i]] = jags(data = model_data,
parameters.to.save = model_parameters,
model.file=textConnection(model_code),
n.chains=3, # Number of different starting positions
n.iter=10000, # Number of iterations
n.burnin=1000, # Number of iterations to remove at start
n.thin=9,# Amount of thinning
DIC=FALSE)
final[[i]] = amostra[[i]][["BUGSoutput"]][["sims.matrix"]]
b0[[i]] = final[[i]][,1]
b1[[i]] = final[[i]][,2]
tau[[i]] = final[[i]][,3]
media_b0[i] = mean(b0[[i]])
media_b1[i] = mean(b1[[i]])
media_tau[i] = mean(tau[[i]])
mediana_b0[i] = median(b0[[i]])
mediana_b1[i] = median(b1[[i]])
mediana_tau[i] = median(tau[[i]])
var_b0[i] = var(b0[[i]])
var_b1[i] = var(b1[[i]])
var_tau[i] = var(tau[[i]])
eqm_b0[i] = mean((b0[[i]]+2)^2)
eqm_b1[i] = mean((b1[[i]]-2)^2)
eqm_tau[i] = mean((tau[[i]]-.2)^2)
hdi[[i]] = hdi(final[[i]])
}
toc()
media=c(mean(media_b0),mean(media_b1),mean(media_tau))
mediana=c(mean(mediana_b0),mean(mediana_b1),mean(mediana_tau))
var=c(mean(var_b0),mean(var_b1),mean(var_tau))
eqm=c(mean(eqm_b0),mean(eqm_b1),mean(eqm_tau))
medidas=cbind(media,mediana,var,eqm)
rownames(medidas) = c("b0","b1","tau");medidas
int = as.data.frame(cbind(t(as.data.frame((hdi))),rep(c(-2,2,0.2),100)))
write.csv2(int,"C:\\Users\\Rafael\\Desktop\\int.xls")
######################################################################################
# STAN #
######################################################################################
amostra = list()
final = list()
b0 = list()
b1 = list()
tau = list()
media_b0 = vector()
media_b1 = vector()
media_tau = vector()
mediana_b0 = vector()
mediana_b1 = vector()
mediana_tau = vector()
var_b0 = vector()
var_b1 = vector()
var_tau = vector()
eqm_b0 = vector()
eqm_b1 = vector()
eqm_tau = vector()
hdi = list()
tic()
for (i in 1:100){
y = yt[[i]][[1]]
x = yt[[i]][[2]]
model = "data {
int<lower=1> N;
vector[N] y;
vector[N] x;
}
parameters {
real beta1;
real beta2;
real<lower=0> sigma2;
}
model {
beta1 ~ normal(0, 10);
beta2 ~ normal(0, 10);
sigma2 ~ gamma(1,0.1);
y ~ normal(beta1 + beta2 * x, 1/sqrt(sigma2));
}
generated quantities {
vector[N] y_rep;
for(n in 1:N) {
y_rep[n] = normal_rng(beta1 + beta2 * x[n], 1/sqrt(sigma2));
}
}"
data <- list(y = y, x = x, N = 100)
fit <- stan(model_code = model,data = data, iter = 4000, warmup = 1000, chains = 1)
amostra[[i]] = extract(fit)
b0[[i]] = amostra[[i]][["beta1"]]
b1[[i]] = amostra[[i]][["beta2"]]
tau[[i]] = amostra[[i]][["sigma2"]]
final[[i]] = cbind(amostra[[i]][["beta1"]],amostra[[i]][["beta2"]],amostra[[i]][["sigma2"]])
media_b0[i] = mean(b0[[i]])
media_b1[i] = mean(b1[[i]])
media_tau[i] = mean(tau[[i]])
mediana_b0[i] = median(b0[[i]])
mediana_b1[i] = median(b1[[i]])
mediana_tau[i] = median(tau[[i]])
var_b0[i] = var(b0[[i]])
var_b1[i] = var(b1[[i]])
var_tau[i] = var(tau[[i]])
eqm_b0[i] = mean((b0[[i]]+2)^2)
eqm_b1[i] = mean((b1[[i]]-2)^2)
eqm_tau[i] = mean((tau[[i]]-.2)^2)
hdi[[i]] = hdi(final[[i]])
}
toc()
media=c(mean(media_b0),mean(media_b1),mean(media_tau))
mediana=c(mean(mediana_b0),mean(mediana_b1),mean(mediana_tau))
var=c(mean(var_b0),mean(var_b1),mean(var_tau))
eqm=c(mean(eqm_b0),mean(eqm_b1),mean(eqm_tau))
medidas=cbind(media,mediana,var,eqm)
rownames(medidas) = c("b0","b1","tau");medidas
int = as.data.frame(cbind(t(as.data.frame((hdi))),rep(c(-2,2,0.2),100)))
write.csv2(int,"C:\\Users\\Rafael\\Desktop\\int.xls")
######################################################################################
# NIMBLE #
######################################################################################
amostra = list()
final = list()
b0 = list()
b1 = list()
tau = list()
media_b0 = vector()
media_b1 = vector()
media_tau = vector()
mediana_b0 = vector()
mediana_b1 = vector()
mediana_tau = vector()
var_b0 = vector()
var_b1 = vector()
var_tau = vector()
eqm_b0 = vector()
eqm_b1 = vector()
eqm_tau = vector()
hdi = list()
tic()
for (i in 1:100){
y = yt[[i]][[1]]
x = yt[[i]][[2]]
simpleCode1 <- nimbleCode({
beta0 ~ dnorm(0,0.1)
beta1 ~ dnorm(0,0.1)
tau ~ dgamma(1, 0.1)
for(i in 1:N) {
Ypred[i] <- beta0 + beta1 * x[i]
Y[i] ~ dnorm(Ypred[i], tau)
}
})
simpleModel1 <- nimbleModel(simpleCode1,
data = list(Y = y, x = x),
constants = list(N = 100),
inits = list(beta0 = 0, beta1 = 0, tau = 2 ))
amostra[[i]] <- nimbleMCMC(code = simpleModel1,
data = list(Y = y, x1 = x1,x2=x2),
inits = list(beta0 = 0, beta1 = 0, tau = 2),
monitors=c("beta0","beta1","tau"),
nchains = 1,
niter = 10000,
thin = 9,
nburnin = 1000,
summary = TRUE,
progressBar = FALSE)
final[[i]] = amostra[[i]][["samples"]]
b0[[i]] = final[[i]][,1]
b1[[i]] = final[[i]][,2]
tau[[i]] = final[[i]][,3]
media_b0[i] = mean(b0[[i]])
media_b1[i] = mean(b1[[i]])
media_tau[i] = mean(tau[[i]])
mediana_b0[i] = median(b0[[i]])
mediana_b1[i] = median(b1[[i]])
mediana_tau[i] = median(tau[[i]])
var_b0[i] = var(b0[[i]])
var_b1[i] = var(b1[[i]])
var_tau[i] = var(tau[[i]])
eqm_b0[i] = mean((b0[[i]]+2)^2)
eqm_b1[i] = mean((b1[[i]]-2)^2)
eqm_tau[i] = mean((tau[[i]]-.2)^2)
hdi[[i]] = hdi(final[[i]])
}
toc()
media=c(mean(media_b0),mean(media_b1),mean(media_tau))
mediana=c(mean(mediana_b0),mean(mediana_b1),mean(mediana_tau))
var=c(mean(var_b0),mean(var_b1),mean(var_tau))
eqm=c(mean(eqm_b0),mean(eqm_b1),mean(eqm_tau))
medidas=cbind(media,mediana,var,eqm)
rownames(medidas) = c("b0","b1","tau");medidas
int = as.data.frame(cbind(t(as.data.frame((hdi))),rep(c(-2,2,0.2),100)))
write.csv2(int,"C:\\Users\\Rafael\\Desktop\\int.xls")
###########################################################
modelo = list()
amostra = list()
final = list()
b0 = list()
b1 = list()
tau = list()
media_b0 = vector()
media_b1 = vector()
media_tau = vector()
mediana_b0 = vector()
mediana_b1 = vector()
mediana_tau = vector()
var_b0 = vector()
var_b1 = vector()
var_tau = vector()
eqm_b0 = vector()
eqm_b1 = vector()
eqm_tau = vector()
hdi = list()
tic()
for (i in 1:100){
y = yt[[i]][[1]]
x = yt[[i]][[2]]
dado=as.data.frame(cbind(y,x))
modelo[[i]] = inla(y~x,family="gaussian",data=dado)
final[[i]] = modelo[[i]]$marginals.fixed
b0[[i]] = final[[i]][[1]][,1]
b1[[i]] = final[[i]][[2]][,1]
tau[[i]] = modelo[[i]]$marginals.hyperpar[[1]][,1]
media_b0[i] = mean(b0[[i]])
media_b1[i] = mean(b1[[i]])
media_tau[i] = mean(tau[[i]])
mediana_b0[i] = median(b0[[i]])
mediana_b1[i] = median(b1[[i]])
mediana_tau[i] = median(tau[[i]])
var_b0[i] = var(b0[[i]])
var_b1[i] = var(b1[[i]])
var_tau[i] = var(tau[[i]])
eqm_b0[i] = mean((b0[[i]]+2)^2)
eqm_b1[i] = mean((b1[[i]]-2)^2)
eqm_tau[i] = mean((tau[[i]]-.2)^2)
hdi[[i]] = hdi(final[[i]])
}
toc()
media=c(mean(media_b0),mean(media_b1),mean(media_tau))
mediana=c(mean(mediana_b0),mean(mediana_b1),mean(mediana_tau))
var=c(mean(var_b0),mean(var_b1),mean(var_tau))
eqm=c(mean(eqm_b0),mean(eqm_b1),mean(eqm_tau))
medidas=cbind(media,mediana,var,eqm)
rownames(medidas) = c("b0","b1","tau");medidas
int = as.data.frame(t(as.data.frame((hdi))))
write.csv2(int,"C:\\Users\\Rafael\\Desktop\\int.xls")
int2 = as.data.frame(t(as.data.frame((hdi(tau)))))
write.csv2(int2,"C:\\Users\\Rafael\\Desktop\\int2.xls")
LS0tDQp0aXRsZTogIkNvbXBhcmHn428iDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCmBgYHtyfQ0KbGlicmFyeSgiUjJXaW5CVUdTIikNCmxpYnJhcnkoIlIyamFncyIpDQpsaWJyYXJ5KCJyc3RhbiIpDQpsaWJyYXJ5KCJuaW1ibGUiKQ0KbGlicmFyeSgiYm9hIikNCmxpYnJhcnkoImNvZGEiKQ0KbGlicmFyeSgieHRhYmxlIikNCmxpYnJhcnkoImthYmxlRXh0cmEiKQ0KbGlicmFyeSgidGljdG9jIikNCmxpYnJhcnkoIkxhcGxhY2VzRGVtb24iKQ0KbGlicmFyeSgiSERJbnRlcnZhbCIpDQpsaWJyYXJ5KCJJTkxBIikNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lNVUxBx8NPIERPUyBEQURPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQpzZXQuc2VlZCgyMDE5KQ0KYmV0YTA9LTINCmJldGExPTINCmJldGEyPTEwDQpzaWdtYTI9NQ0KdGF1PTEvc2lnbWEyDQoNCnl0PWxpc3QoKQ0KDQpmb3IgKGkgaW4gMToxMDApew0Kbj0xMDANCng9cm5vcm0obiwwLDEpDQplPXJub3JtKG4sMCwgc2QgPSBzcXJ0KHNpZ21hMikpICANCnl0W1tpXV09bGlzdChiZXRhMCtiZXRhMSp4K2UseCkNCn0NCg0KDQphbW9zdHJhID0gbGlzdCgpDQpmaW5hbCA9IGxpc3QoKQ0KYjAgID0gbGlzdCgpDQpiMSAgPSBsaXN0KCkNCnRhdSA9IGxpc3QoKQ0KbWVkaWFfYjAgPSB2ZWN0b3IoKQ0KbWVkaWFfYjEgPSB2ZWN0b3IoKQ0KbWVkaWFfdGF1ID0gdmVjdG9yKCkNCm1lZGlhbmFfYjAgPSB2ZWN0b3IoKQ0KbWVkaWFuYV9iMSA9IHZlY3RvcigpDQptZWRpYW5hX3RhdSA9IHZlY3RvcigpDQp2YXJfYjAgPSB2ZWN0b3IoKQ0KdmFyX2IxID0gdmVjdG9yKCkNCnZhcl90YXUgPSB2ZWN0b3IoKQ0KZXFtX2IwICA9IHZlY3RvcigpDQplcW1fYjEgID0gdmVjdG9yKCkNCmVxbV90YXUgPSB2ZWN0b3IoKQ0KaGRpID0gbGlzdCgpDQoNCnRpYygpDQpmb3IgKGkgaW4gMToxMDApew0KeSA9ICB5dFtbaV1dW1sxXV0NCnggPSAgeXRbW2ldXVtbMl1dDQpzaW5rKCJtb2QxLnR4dCIpICAgICAgICANCmNhdCgiDQogICAgTU9ERUwgTFIxIHsNCiAgICAjVmVyb3NzaW1pbGhhbudhIA0KICAgIGZvcihpIGluIDE6Tikgew0KICAgIHlbaV0gfiBkbm9ybShtdVtpXSwgdGF1ICkNCiAgICBtdVtpXSA8LSBiZXRhMCArIGJldGExKnhbaV0NCiAgICB9DQogICAgI1Byb3Jpcw0KICAgIGJldGEwIH4gZG5vcm0oMCwwLjEpDQogICAgYmV0YTEgfiBkbm9ybSgwLDAuMSkNCiAgICB0YXUgfiBkZ2FtbWEoMSwwLjEpDQogICAgfSAiLCBmaWxsID0gVFJVRSkNCnNpbmsoKQ0KDQpOID0gMTAwO2RhdGEgPSBsaXN0KCJOIiwieSIsIngiKTtwYXJhbXMgPSBjKCJiZXRhMCIsICJiZXRhMSIsInRhdSIpIDtpbml0cyA8LSBmdW5jdGlvbiAoKSB7bGlzdChiZXRhMCA9IDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBiZXRhMSA9IDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICB0YXUgPSAyKX0NCg0KYW1vc3RyYVtbaV1dIDwtIGJ1Z3MoZGF0YSA9IGRhdGEsIGluaXRzID0gaW5pdHMsIHBhcmFtZXRlcnMudG8uc2F2ZSA9IHBhcmFtcywNCiAgICAgICAgICAgICAgICBtb2RlbC5maWxlID0gIm1vZDEudHh0Iiwgbi5jaGFpbnMgPSAzLCBuLml0ZXIgPSAxMDAwMCwNCiAgICAgICAgICAgICAgICBuLmJ1cm5pbiA9IDEwMDAsIG4udGhpbj05LCBidWdzLmRpcmVjdG9yeSA9ICJDOlxcUHJvZ3JhbSBGaWxlc1xcV2luQlVHUzE0IiwNCiAgICAgICAgICAgICAgICBkZWJ1ZyA9IEZBTFNFLCBzYXZlLmhpc3RvcnkgPSBGQUxTRSwgRElDID0gRkFMU0UpDQoNCmZpbmFsW1tpXV0gPSBhbW9zdHJhW1tpXV0kc2ltcy5tYXRyaXgNCg0KYjBbW2ldXSAgPSBmaW5hbFtbaV1dWywxXQ0KYjFbW2ldXSAgPSBmaW5hbFtbaV1dWywyXQ0KdGF1W1tpXV0gPSBmaW5hbFtbaV1dWywzXQ0KDQptZWRpYV9iMFtpXSAgPSBtZWFuKGIwW1tpXV0pIA0KbWVkaWFfYjFbaV0gID0gbWVhbihiMVtbaV1dKSANCm1lZGlhX3RhdVtpXSA9IG1lYW4odGF1W1tpXV0pIA0KDQptZWRpYW5hX2IwW2ldICA9IG1lZGlhbihiMFtbaV1dKSANCm1lZGlhbmFfYjFbaV0gID0gbWVkaWFuKGIxW1tpXV0pIA0KbWVkaWFuYV90YXVbaV0gPSBtZWRpYW4odGF1W1tpXV0pICANCg0KdmFyX2IwW2ldICA9IHZhcihiMFtbaV1dKQ0KdmFyX2IxW2ldICA9IHZhcihiMVtbaV1dKQ0KdmFyX3RhdVtpXSA9IHZhcih0YXVbW2ldXSkNCg0KZXFtX2IwW2ldICA9IG1lYW4oKGIwW1tpXV0rMileMikNCmVxbV9iMVtpXSAgPSBtZWFuKChiMVtbaV1dLTIpXjIpDQplcW1fdGF1W2ldID0gbWVhbigodGF1W1tpXV0tLjIpXjIpDQoNCmhkaVtbaV1dID0gaGRpKGZpbmFsW1tpXV0pDQoNCn0NCnRvYygpDQoNCm1lZGlhPWMobWVhbihtZWRpYV9iMCksbWVhbihtZWRpYV9iMSksbWVhbihtZWRpYV90YXUpKQ0KbWVkaWFuYT1jKG1lYW4obWVkaWFuYV9iMCksbWVhbihtZWRpYW5hX2IxKSxtZWFuKG1lZGlhbmFfdGF1KSkNCnZhcj1jKG1lYW4odmFyX2IwKSxtZWFuKHZhcl9iMSksbWVhbih2YXJfdGF1KSkNCmVxbT1jKG1lYW4oZXFtX2IwKSxtZWFuKGVxbV9iMSksbWVhbihlcW1fdGF1KSkNCm1lZGlkYXM9Y2JpbmQobWVkaWEsbWVkaWFuYSx2YXIsZXFtKQ0Kcm93bmFtZXMobWVkaWRhcykgPSBjKCJiMCIsImIxIiwidGF1Iik7bWVkaWRhcw0KDQppbnQgPSBhcy5kYXRhLmZyYW1lKGNiaW5kKHQoYXMuZGF0YS5mcmFtZSgoaGRpKSkpLHJlcChjKC0yLDIsMC4yKSwxMDApKSkNCg0Kd3JpdGUuY3N2MihpbnQsIkM6XFxVc2Vyc1xcUmFmYWVsXFxEZXNrdG9wXFxpbnQueGxzIikNCg0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBR1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KDQoNCmFtb3N0cmEgPSBsaXN0KCkNCmZpbmFsID0gbGlzdCgpDQpiMCAgPSBsaXN0KCkNCmIxICA9IGxpc3QoKQ0KdGF1ID0gbGlzdCgpDQptZWRpYV9iMCA9IHZlY3RvcigpDQptZWRpYV9iMSA9IHZlY3RvcigpDQptZWRpYV90YXUgPSB2ZWN0b3IoKQ0KbWVkaWFuYV9iMCA9IHZlY3RvcigpDQptZWRpYW5hX2IxID0gdmVjdG9yKCkNCm1lZGlhbmFfdGF1ID0gdmVjdG9yKCkNCnZhcl9iMCA9IHZlY3RvcigpDQp2YXJfYjEgPSB2ZWN0b3IoKQ0KdmFyX3RhdSA9IHZlY3RvcigpDQplcW1fYjAgID0gdmVjdG9yKCkNCmVxbV9iMSAgPSB2ZWN0b3IoKQ0KZXFtX3RhdSA9IHZlY3RvcigpDQpoZGkgPSBsaXN0KCkNCg0KdGljKCkNCmZvciAoaSBpbiAxOjEwMCl7DQogIHkgPSAgeXRbW2ldXVtbMV1dDQogIHggPSAgeXRbW2ldXVtbMl1dDQogIA0KDQogIG1vZGVsX2NvZGUgPSAnDQptb2RlbA0Kew0KICAjIFZlcm8NCiAgZm9yIChpIGluIDE6bikgew0KICB5W2ldIH4gZG5vcm0oYmV0YTEgKyBiZXRhMiAqIHhbaV0sIHRhdSkNCiAgfQ0KICAjIFByaW9yaXMNCiAgYmV0YTEgfiBkbm9ybSgwLCAwMSkNCiAgYmV0YTIgfiBkbm9ybSgwLDAuMSkNCiAgdGF1IH4gZGdhbW1hKDEsMC4xKQ0KfQ0KJw0KICANCm1vZGVsX2RhdGEgPSBsaXN0KG4gPSBuLCB5ID0geSwgeCA9IHgpDQogIA0KbW9kZWxfcGFyYW1ldGVycyA9ICBjKCJiZXRhMSIsICJiZXRhMiIsICJ0YXUiKQ0KICANCmFtb3N0cmFbW2ldXSA9IGphZ3MoZGF0YSA9IG1vZGVsX2RhdGEsDQogICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy50by5zYXZlID0gbW9kZWxfcGFyYW1ldGVycywNCiAgICAgICAgICAgICAgICAgICBtb2RlbC5maWxlPXRleHRDb25uZWN0aW9uKG1vZGVsX2NvZGUpLA0KICAgICAgICAgICAgICAgICAgIG4uY2hhaW5zPTMsICMgTnVtYmVyIG9mIGRpZmZlcmVudCBzdGFydGluZyBwb3NpdGlvbnMNCiAgICAgICAgICAgICAgICAgICBuLml0ZXI9MTAwMDAsICMgTnVtYmVyIG9mIGl0ZXJhdGlvbnMNCiAgICAgICAgICAgICAgICAgICBuLmJ1cm5pbj0xMDAwLCAjIE51bWJlciBvZiBpdGVyYXRpb25zIHRvIHJlbW92ZSBhdCBzdGFydA0KICAgICAgICAgICAgICAgICAgIG4udGhpbj05LCMgQW1vdW50IG9mIHRoaW5uaW5nDQogICAgICAgICAgICAgICAgICAgRElDPUZBTFNFKQ0KDQpmaW5hbFtbaV1dID0gYW1vc3RyYVtbaV1dW1siQlVHU291dHB1dCJdXVtbInNpbXMubWF0cml4Il1dDQoNCmIwW1tpXV0gID0gZmluYWxbW2ldXVssMV0NCmIxW1tpXV0gID0gZmluYWxbW2ldXVssMl0NCnRhdVtbaV1dID0gZmluYWxbW2ldXVssM10NCg0KbWVkaWFfYjBbaV0gID0gbWVhbihiMFtbaV1dKSANCm1lZGlhX2IxW2ldICA9IG1lYW4oYjFbW2ldXSkgDQptZWRpYV90YXVbaV0gPSBtZWFuKHRhdVtbaV1dKSANCg0KbWVkaWFuYV9iMFtpXSAgPSBtZWRpYW4oYjBbW2ldXSkgDQptZWRpYW5hX2IxW2ldICA9IG1lZGlhbihiMVtbaV1dKSANCm1lZGlhbmFfdGF1W2ldID0gbWVkaWFuKHRhdVtbaV1dKSAgDQoNCnZhcl9iMFtpXSAgPSB2YXIoYjBbW2ldXSkNCnZhcl9iMVtpXSAgPSB2YXIoYjFbW2ldXSkNCnZhcl90YXVbaV0gPSB2YXIodGF1W1tpXV0pDQoNCmVxbV9iMFtpXSAgPSBtZWFuKChiMFtbaV1dKzIpXjIpDQplcW1fYjFbaV0gID0gbWVhbigoYjFbW2ldXS0yKV4yKQ0KZXFtX3RhdVtpXSA9IG1lYW4oKHRhdVtbaV1dLS4yKV4yKQ0KDQpoZGlbW2ldXSA9IGhkaShmaW5hbFtbaV1dKQ0KDQp9DQp0b2MoKQ0KDQptZWRpYT1jKG1lYW4obWVkaWFfYjApLG1lYW4obWVkaWFfYjEpLG1lYW4obWVkaWFfdGF1KSkNCm1lZGlhbmE9YyhtZWFuKG1lZGlhbmFfYjApLG1lYW4obWVkaWFuYV9iMSksbWVhbihtZWRpYW5hX3RhdSkpDQp2YXI9YyhtZWFuKHZhcl9iMCksbWVhbih2YXJfYjEpLG1lYW4odmFyX3RhdSkpDQplcW09YyhtZWFuKGVxbV9iMCksbWVhbihlcW1fYjEpLG1lYW4oZXFtX3RhdSkpDQptZWRpZGFzPWNiaW5kKG1lZGlhLG1lZGlhbmEsdmFyLGVxbSkNCnJvd25hbWVzKG1lZGlkYXMpID0gYygiYjAiLCJiMSIsInRhdSIpO21lZGlkYXMNCg0KaW50ID0gYXMuZGF0YS5mcmFtZShjYmluZCh0KGFzLmRhdGEuZnJhbWUoKGhkaSkpKSxyZXAoYygtMiwyLDAuMiksMTAwKSkpDQoNCndyaXRlLmNzdjIoaW50LCJDOlxcVXNlcnNcXFJhZmFlbFxcRGVza3RvcFxcaW50LnhscyIpDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQoNCmFtb3N0cmEgPSBsaXN0KCkNCmZpbmFsID0gbGlzdCgpDQpiMCAgPSBsaXN0KCkNCmIxICA9IGxpc3QoKQ0KdGF1ID0gbGlzdCgpDQptZWRpYV9iMCA9IHZlY3RvcigpDQptZWRpYV9iMSA9IHZlY3RvcigpDQptZWRpYV90YXUgPSB2ZWN0b3IoKQ0KbWVkaWFuYV9iMCA9IHZlY3RvcigpDQptZWRpYW5hX2IxID0gdmVjdG9yKCkNCm1lZGlhbmFfdGF1ID0gdmVjdG9yKCkNCnZhcl9iMCA9IHZlY3RvcigpDQp2YXJfYjEgPSB2ZWN0b3IoKQ0KdmFyX3RhdSA9IHZlY3RvcigpDQplcW1fYjAgID0gdmVjdG9yKCkNCmVxbV9iMSAgPSB2ZWN0b3IoKQ0KZXFtX3RhdSA9IHZlY3RvcigpDQpoZGkgPSBsaXN0KCkNCg0KdGljKCkNCmZvciAoaSBpbiAxOjEwMCl7DQogIHkgPSAgeXRbW2ldXVtbMV1dDQogIHggPSAgeXRbW2ldXVtbMl1dDQogIA0KbW9kZWwgPSAiZGF0YSB7DQppbnQ8bG93ZXI9MT4gTjsNCnZlY3RvcltOXSB5Ow0KdmVjdG9yW05dIHg7DQp9DQpwYXJhbWV0ZXJzIHsNCnJlYWwgYmV0YTE7DQpyZWFsIGJldGEyOw0KcmVhbDxsb3dlcj0wPiBzaWdtYTI7DQp9DQptb2RlbCB7DQpiZXRhMSB+IG5vcm1hbCgwLCAxMCk7ICAgDQpiZXRhMiB+IG5vcm1hbCgwLCAxMCk7IA0Kc2lnbWEyIH4gZ2FtbWEoMSwwLjEpOw0KeSB+IG5vcm1hbChiZXRhMSArIGJldGEyICogeCwgMS9zcXJ0KHNpZ21hMikpOw0KfQ0KDQpnZW5lcmF0ZWQgcXVhbnRpdGllcyB7DQp2ZWN0b3JbTl0geV9yZXA7DQpmb3IobiBpbiAxOk4pIHsNCnlfcmVwW25dID0gbm9ybWFsX3JuZyhiZXRhMSArIGJldGEyICogeFtuXSwgMS9zcXJ0KHNpZ21hMikpOw0KfQ0KfSINCg0KZGF0YSA8LSBsaXN0KHkgPSB5LCB4ID0geCwgTiA9IDEwMCkNCmZpdCA8LSBzdGFuKG1vZGVsX2NvZGUgPSBtb2RlbCxkYXRhID0gZGF0YSwgaXRlciA9IDQwMDAsIHdhcm11cCA9IDEwMDAsIGNoYWlucyA9IDEpDQoNCmFtb3N0cmFbW2ldXSA9IGV4dHJhY3QoZml0KQ0KDQpiMFtbaV1dICA9IGFtb3N0cmFbW2ldXVtbImJldGExIl1dDQpiMVtbaV1dICA9IGFtb3N0cmFbW2ldXVtbImJldGEyIl1dDQp0YXVbW2ldXSA9IGFtb3N0cmFbW2ldXVtbInNpZ21hMiJdXQ0KDQpmaW5hbFtbaV1dID0gY2JpbmQoYW1vc3RyYVtbaV1dW1siYmV0YTEiXV0sYW1vc3RyYVtbaV1dW1siYmV0YTIiXV0sYW1vc3RyYVtbaV1dW1sic2lnbWEyIl1dKQ0KDQptZWRpYV9iMFtpXSAgPSBtZWFuKGIwW1tpXV0pIA0KbWVkaWFfYjFbaV0gID0gbWVhbihiMVtbaV1dKSANCm1lZGlhX3RhdVtpXSA9IG1lYW4odGF1W1tpXV0pIA0KDQptZWRpYW5hX2IwW2ldICA9IG1lZGlhbihiMFtbaV1dKSANCm1lZGlhbmFfYjFbaV0gID0gbWVkaWFuKGIxW1tpXV0pIA0KbWVkaWFuYV90YXVbaV0gPSBtZWRpYW4odGF1W1tpXV0pICANCg0KdmFyX2IwW2ldICA9IHZhcihiMFtbaV1dKQ0KdmFyX2IxW2ldICA9IHZhcihiMVtbaV1dKQ0KdmFyX3RhdVtpXSA9IHZhcih0YXVbW2ldXSkNCg0KZXFtX2IwW2ldICA9IG1lYW4oKGIwW1tpXV0rMileMikNCmVxbV9iMVtpXSAgPSBtZWFuKChiMVtbaV1dLTIpXjIpDQplcW1fdGF1W2ldID0gbWVhbigodGF1W1tpXV0tLjIpXjIpDQoNCmhkaVtbaV1dID0gaGRpKGZpbmFsW1tpXV0pDQoNCn0NCnRvYygpDQoNCm1lZGlhPWMobWVhbihtZWRpYV9iMCksbWVhbihtZWRpYV9iMSksbWVhbihtZWRpYV90YXUpKQ0KbWVkaWFuYT1jKG1lYW4obWVkaWFuYV9iMCksbWVhbihtZWRpYW5hX2IxKSxtZWFuKG1lZGlhbmFfdGF1KSkNCnZhcj1jKG1lYW4odmFyX2IwKSxtZWFuKHZhcl9iMSksbWVhbih2YXJfdGF1KSkNCmVxbT1jKG1lYW4oZXFtX2IwKSxtZWFuKGVxbV9iMSksbWVhbihlcW1fdGF1KSkNCm1lZGlkYXM9Y2JpbmQobWVkaWEsbWVkaWFuYSx2YXIsZXFtKQ0Kcm93bmFtZXMobWVkaWRhcykgPSBjKCJiMCIsImIxIiwidGF1Iik7bWVkaWRhcw0KaW50ID0gYXMuZGF0YS5mcmFtZShjYmluZCh0KGFzLmRhdGEuZnJhbWUoKGhkaSkpKSxyZXAoYygtMiwyLDAuMiksMTAwKSkpDQp3cml0ZS5jc3YyKGludCwiQzpcXFVzZXJzXFxSYWZhZWxcXERlc2t0b3BcXGludC54bHMiKQ0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JTUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KDQphbW9zdHJhID0gbGlzdCgpDQpmaW5hbCA9IGxpc3QoKQ0KYjAgID0gbGlzdCgpDQpiMSAgPSBsaXN0KCkNCnRhdSA9IGxpc3QoKQ0KbWVkaWFfYjAgPSB2ZWN0b3IoKQ0KbWVkaWFfYjEgPSB2ZWN0b3IoKQ0KbWVkaWFfdGF1ID0gdmVjdG9yKCkNCm1lZGlhbmFfYjAgPSB2ZWN0b3IoKQ0KbWVkaWFuYV9iMSA9IHZlY3RvcigpDQptZWRpYW5hX3RhdSA9IHZlY3RvcigpDQp2YXJfYjAgPSB2ZWN0b3IoKQ0KdmFyX2IxID0gdmVjdG9yKCkNCnZhcl90YXUgPSB2ZWN0b3IoKQ0KZXFtX2IwICA9IHZlY3RvcigpDQplcW1fYjEgID0gdmVjdG9yKCkNCmVxbV90YXUgPSB2ZWN0b3IoKQ0KaGRpID0gbGlzdCgpDQoNCg0KDQoNCnRpYygpDQpmb3IgKGkgaW4gMToxMDApew0KICB5ID0gIHl0W1tpXV1bWzFdXQ0KICB4ID0gIHl0W1tpXV1bWzJdXQ0KICANCiAgc2ltcGxlQ29kZTEgPC0gbmltYmxlQ29kZSh7DQogICAgYmV0YTAgfiBkbm9ybSgwLDAuMSkNCiAgICBiZXRhMSB+IGRub3JtKDAsMC4xKQ0KICAgIHRhdSB+IGRnYW1tYSgxLCAwLjEpDQogICAgZm9yKGkgaW4gMTpOKSB7DQogICAgICBZcHJlZFtpXSA8LSBiZXRhMCArIGJldGExICogeFtpXQ0KICAgICAgWVtpXSB+IGRub3JtKFlwcmVkW2ldLCB0YXUpDQogICAgfQ0KICB9KQ0KICANCiAgDQogIA0KDQoNCnNpbXBsZU1vZGVsMSA8LSBuaW1ibGVNb2RlbChzaW1wbGVDb2RlMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbGlzdChZID0geSwgeCA9IHgpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0YW50cyA9IGxpc3QoTiA9IDEwMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdHMgPSBsaXN0KGJldGEwID0gMCwgYmV0YTEgPSAwLCB0YXUgPSAyICkpDQoNCg0KYW1vc3RyYVtbaV1dIDwtIG5pbWJsZU1DTUMoY29kZSA9IHNpbXBsZU1vZGVsMSwgDQogICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBsaXN0KFkgPSB5LCB4MSA9IHgxLHgyPXgyKSwgDQogICAgICAgICAgICAgICAgICAgICAgIGluaXRzID0gbGlzdChiZXRhMCA9IDAsIGJldGExID0gMCwgdGF1ID0gMiksDQogICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3JzPWMoImJldGEwIiwiYmV0YTEiLCJ0YXUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgbmNoYWlucyA9IDEsIA0KICAgICAgICAgICAgICAgICAgICAgICBuaXRlciA9IDEwMDAwLA0KICAgICAgICAgICAgICAgICAgICAgICB0aGluID0gOSwNCiAgICAgICAgICAgICAgICAgICAgICAgbmJ1cm5pbiA9IDEwMDAsDQogICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnkgPSBUUlVFLCANCiAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NCYXIgPSBGQUxTRSkNCg0KZmluYWxbW2ldXSA9IGFtb3N0cmFbW2ldXVtbInNhbXBsZXMiXV0NCg0KYjBbW2ldXSAgPSBmaW5hbFtbaV1dWywxXQ0KYjFbW2ldXSAgPSBmaW5hbFtbaV1dWywyXQ0KdGF1W1tpXV0gPSBmaW5hbFtbaV1dWywzXQ0KDQptZWRpYV9iMFtpXSAgPSBtZWFuKGIwW1tpXV0pIA0KbWVkaWFfYjFbaV0gID0gbWVhbihiMVtbaV1dKSANCm1lZGlhX3RhdVtpXSA9IG1lYW4odGF1W1tpXV0pIA0KDQptZWRpYW5hX2IwW2ldICA9IG1lZGlhbihiMFtbaV1dKSANCm1lZGlhbmFfYjFbaV0gID0gbWVkaWFuKGIxW1tpXV0pIA0KbWVkaWFuYV90YXVbaV0gPSBtZWRpYW4odGF1W1tpXV0pICANCg0KdmFyX2IwW2ldICA9IHZhcihiMFtbaV1dKQ0KdmFyX2IxW2ldICA9IHZhcihiMVtbaV1dKQ0KdmFyX3RhdVtpXSA9IHZhcih0YXVbW2ldXSkNCg0KZXFtX2IwW2ldICA9IG1lYW4oKGIwW1tpXV0rMileMikNCmVxbV9iMVtpXSAgPSBtZWFuKChiMVtbaV1dLTIpXjIpDQplcW1fdGF1W2ldID0gbWVhbigodGF1W1tpXV0tLjIpXjIpDQoNCmhkaVtbaV1dID0gaGRpKGZpbmFsW1tpXV0pDQoNCn0NCnRvYygpDQoNCm1lZGlhPWMobWVhbihtZWRpYV9iMCksbWVhbihtZWRpYV9iMSksbWVhbihtZWRpYV90YXUpKQ0KbWVkaWFuYT1jKG1lYW4obWVkaWFuYV9iMCksbWVhbihtZWRpYW5hX2IxKSxtZWFuKG1lZGlhbmFfdGF1KSkNCnZhcj1jKG1lYW4odmFyX2IwKSxtZWFuKHZhcl9iMSksbWVhbih2YXJfdGF1KSkNCmVxbT1jKG1lYW4oZXFtX2IwKSxtZWFuKGVxbV9iMSksbWVhbihlcW1fdGF1KSkNCm1lZGlkYXM9Y2JpbmQobWVkaWEsbWVkaWFuYSx2YXIsZXFtKQ0Kcm93bmFtZXMobWVkaWRhcykgPSBjKCJiMCIsImIxIiwidGF1Iik7bWVkaWRhcw0KaW50ID0gYXMuZGF0YS5mcmFtZShjYmluZCh0KGFzLmRhdGEuZnJhbWUoKGhkaSkpKSxyZXAoYygtMiwyLDAuMiksMTAwKSkpDQp3cml0ZS5jc3YyKGludCwiQzpcXFVzZXJzXFxSYWZhZWxcXERlc2t0b3BcXGludC54bHMiKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQptb2RlbG8gPSBsaXN0KCkNCmFtb3N0cmEgPSBsaXN0KCkNCmZpbmFsID0gbGlzdCgpDQpiMCAgPSBsaXN0KCkNCmIxICA9IGxpc3QoKQ0KdGF1ID0gbGlzdCgpDQptZWRpYV9iMCA9IHZlY3RvcigpDQptZWRpYV9iMSA9IHZlY3RvcigpDQptZWRpYV90YXUgPSB2ZWN0b3IoKQ0KbWVkaWFuYV9iMCA9IHZlY3RvcigpDQptZWRpYW5hX2IxID0gdmVjdG9yKCkNCm1lZGlhbmFfdGF1ID0gdmVjdG9yKCkNCnZhcl9iMCA9IHZlY3RvcigpDQp2YXJfYjEgPSB2ZWN0b3IoKQ0KdmFyX3RhdSA9IHZlY3RvcigpDQplcW1fYjAgID0gdmVjdG9yKCkNCmVxbV9iMSAgPSB2ZWN0b3IoKQ0KZXFtX3RhdSA9IHZlY3RvcigpDQpoZGkgPSBsaXN0KCkNCg0KdGljKCkNCmZvciAoaSBpbiAxOjEwMCl7DQp5ID0gIHl0W1tpXV1bWzFdXQ0KeCA9ICB5dFtbaV1dW1syXV0NCmRhZG89YXMuZGF0YS5mcmFtZShjYmluZCh5LHgpKQ0KbW9kZWxvW1tpXV0gPSBpbmxhKHl+eCxmYW1pbHk9ImdhdXNzaWFuIixkYXRhPWRhZG8pDQoNCmZpbmFsW1tpXV0gPSBtb2RlbG9bW2ldXSRtYXJnaW5hbHMuZml4ZWQNCg0KYjBbW2ldXSAgPSBmaW5hbFtbaV1dW1sxXV1bLDFdDQpiMVtbaV1dICA9IGZpbmFsW1tpXV1bWzJdXVssMV0NCnRhdVtbaV1dID0gbW9kZWxvW1tpXV0kbWFyZ2luYWxzLmh5cGVycGFyW1sxXV1bLDFdDQoNCm1lZGlhX2IwW2ldICA9IG1lYW4oYjBbW2ldXSkgDQptZWRpYV9iMVtpXSAgPSBtZWFuKGIxW1tpXV0pIA0KbWVkaWFfdGF1W2ldID0gbWVhbih0YXVbW2ldXSkgDQoNCm1lZGlhbmFfYjBbaV0gID0gbWVkaWFuKGIwW1tpXV0pIA0KbWVkaWFuYV9iMVtpXSAgPSBtZWRpYW4oYjFbW2ldXSkgDQptZWRpYW5hX3RhdVtpXSA9IG1lZGlhbih0YXVbW2ldXSkgIA0KDQp2YXJfYjBbaV0gID0gdmFyKGIwW1tpXV0pDQp2YXJfYjFbaV0gID0gdmFyKGIxW1tpXV0pDQp2YXJfdGF1W2ldID0gdmFyKHRhdVtbaV1dKQ0KDQplcW1fYjBbaV0gID0gbWVhbigoYjBbW2ldXSsyKV4yKQ0KZXFtX2IxW2ldICA9IG1lYW4oKGIxW1tpXV0tMileMikNCmVxbV90YXVbaV0gPSBtZWFuKCh0YXVbW2ldXS0uMileMikNCg0KaGRpW1tpXV0gPSBoZGkoZmluYWxbW2ldXSkNCg0KDQp9DQp0b2MoKQ0KDQptZWRpYT1jKG1lYW4obWVkaWFfYjApLG1lYW4obWVkaWFfYjEpLG1lYW4obWVkaWFfdGF1KSkNCm1lZGlhbmE9YyhtZWFuKG1lZGlhbmFfYjApLG1lYW4obWVkaWFuYV9iMSksbWVhbihtZWRpYW5hX3RhdSkpDQp2YXI9YyhtZWFuKHZhcl9iMCksbWVhbih2YXJfYjEpLG1lYW4odmFyX3RhdSkpDQplcW09YyhtZWFuKGVxbV9iMCksbWVhbihlcW1fYjEpLG1lYW4oZXFtX3RhdSkpDQptZWRpZGFzPWNiaW5kKG1lZGlhLG1lZGlhbmEsdmFyLGVxbSkNCnJvd25hbWVzKG1lZGlkYXMpID0gYygiYjAiLCJiMSIsInRhdSIpO21lZGlkYXMNCmludCA9IGFzLmRhdGEuZnJhbWUodChhcy5kYXRhLmZyYW1lKChoZGkpKSkpDQp3cml0ZS5jc3YyKGludCwiQzpcXFVzZXJzXFxSYWZhZWxcXERlc2t0b3BcXGludC54bHMiKQ0KDQoNCmludDIgPSBhcy5kYXRhLmZyYW1lKHQoYXMuZGF0YS5mcmFtZSgoaGRpKHRhdSkpKSkpDQp3cml0ZS5jc3YyKGludDIsIkM6XFxVc2Vyc1xcUmFmYWVsXFxEZXNrdG9wXFxpbnQyLnhscyIpDQpgYGANCg0KDQo=