Clearing environment

rm(list = ls())

Loading necessary package

require(deSolve)

System of DEs

SARSCOV2Model <- function (t, y, params) {
  
S.h<-y[1] #create local variable S, first element of y
E.h<-y[2] 
I.h<-y[3]
S.l<-y[4]
E.l<-y[5]
I.l<-y[6]
Q<-y[7]
R<-y[8]
V<-y[9]

with(
  as.list(params, y),
  {
dS.h<--q*beta*(I.h+I.l)*S.h/(S.h+E.h+I.h+S.l+E.l+I.l+Q+R)-c*(1-exp((-1/K)*V))*S.h
dE.h<-q*beta*(I.h+I.l)*S.h/(S.h+E.h+I.h+S.l+E.l+I.l+Q+R)+c*(1-exp((-1/K)*V))*S.h-lambda*E.h
dI.h<-lambda*E.h-b*g*I.h-aH*h*(1-g)*I.h-gammah*(1-h)*(1-g)*I.h
dS.l<--(1-p)*q*beta*(I.h+I.l)*S.l/(S.h+E.h+I.h+S.l+E.l+I.l+Q+R)-(1-p)*c*(1-exp((-1/K)*V))*S.l
dE.l<-(1-p)*q*beta*(I.h+I.l)/(S.h+E.h+I.h+S.l+E.l+I.l+Q+R)+(1-p)*c*(1-exp((-1/K)*V))*S.l-lambda*E.l
dI.l<-lambda*E.l-b*I.l
dQ<-b*I.l+g*b*I.h-aQ*h*Q-gammaQ*(1-h)*Q
dR<-gammah*(1-h)*(1-g)*I.h+gammaQ*(1-h)*Q
dV<-omega*I.h+(1-p)*omega*I.l-delta*V
  dy<-c(dS.h,dE.h,dI.h,dS.l,dE.l,dI.l,dQ,dR,dV) #combine results into one vector dy
list(dy)
  }
)
}

Initial Values

times<-seq(0,180,by=1) 
covid.params<-c(q=0.2,beta=13,p=.2,c=0,lambda=1/4.43,b=1/0.77,g=0,gammaQ=0.1,gammah=1/2.7,aQ=1/1.93,aH=1/2.7,h=0.00082,omega=0,delta=1,K=10000)
ystart<-c(S.h=(.2)*100000,E.h=0,I.h=1,S.l=(1-0.2)*100000,E.l=0,I.l=0,Q=0,R=0,V=0)
covid.out <- as.data.frame(lsoda(ystart,times,SARSCOV2Model,covid.params))

Changing p to 0, 0.1, 0.2, & 0.3

covid.params.p1 <- c(q=0.5,beta=13,p=0,c=0,lambda=1/4.43,b=1/0.77,g=0,gammaQ=0.1,gammah=1/2.7,aQ=1/1.93,aH=1/2.7,h=0.00082,omega=0,delta=0.5,K=1000000)
covid.params.p2 <- c(q=0.5,beta=13,p=0.1,c=0,lambda=1/4.43,b=1/0.77,g=0,gammaQ=0.1,gammah=1/2.7,aQ=1/1.93,aH=1/2.7,h=0.00082,omega=0,delta=1,K=1000000)
covid.params.p3 <- c(q=0.5,beta=13,p=0.2,c=0,lambda=1/4.43,b=1/0.77,g=0,gammaQ=0.1,gammah=1/2.7,aQ=1/1.93,aH=1/2.7,h=0.00082,omega=0,delta=1.5,K=1000000)
covid.params.p4 <- c(q=0.5,beta=13,p=0.3,c=0,lambda=1/4.43,b=1/0.77,g=0,gammaQ=0.1,gammah=1/2.7,aQ=1/1.93,aH=1/2.7,h=0.00082,omega=0,delta=2,K=1000000)

Creating data frame for each value of p

covid.out.p1 <- as.data.frame(lsoda(ystart,times,SARSCOV2Model,covid.params.p1))
covid.out.p2 <- as.data.frame(lsoda(ystart,times,SARSCOV2Model,covid.params.p2))
covid.out.p3 <- as.data.frame(lsoda(ystart,times,SARSCOV2Model,covid.params.p3))
covid.out.p4 <- as.data.frame(lsoda(ystart,times,SARSCOV2Model,covid.params.p4))

Plotting S.h, S.l, I.h, & I.l

## SUSCEPTIBLE ##
op1 <- par(fig=c(0,0.5,0,1), mar=c(4,4,1,1))
plot(covid.out.p1$S.h~covid.out.p1$time,type="l", col="blue", xlab="Days", ylab = "Susceptible (High)")
lines(covid.out.p2$S.h~covid.out.p2$time, type="l", col="red")
lines(covid.out.p3$S.h~covid.out.p3$time, type="l", col="purple")
lines(covid.out.p4$S.h~covid.out.p4$time, type="l", col="green")
legend(100, 17500,legend = c("p=0","p=0.1","p=0.2","p=0.3"), col = c("blue", "red", "purple", "green"), lty=1, cex=0.8)

par(fig=c(0.5,1,0,1), mar=c(4,4,1,1), new=T)
plot(covid.out.p1$S.l~covid.out.p1$time,type="l", col="blue", xlab="Days", ylab = "Susceptible (Low)")
lines(covid.out.p2$S.l~covid.out.p2$time, type="l", col="red")
lines(covid.out.p3$S.l~covid.out.p3$time, type="l", col="purple")
lines(covid.out.p4$S.l~covid.out.p4$time, type="l", col="green")
legend(100, 70000,legend = c("p=0","p=0.1","p=0.2","p=0.3"), col = c("blue", "red", "purple", "green"), lty=1, cex=0.8)
par(op1)

## EXPOSED ##
op2 <- par(fig=c(0,0.5,0,1), mar=c(4,4,1,1))

plot(covid.out.p1$E.h~covid.out.p1$time,type="l", col="blue", xlab="Days", ylab = "Exposed (High)")
lines(covid.out.p2$E.h~covid.out.p2$time, type="l", col="red")
lines(covid.out.p3$E.h~covid.out.p3$time, type="l", col="purple")
lines(covid.out.p4$E.h~covid.out.p4$time, type="l", col="green")
legend(100, 6000,legend = c("p=0","p=0.1","p=0.2","p=0.3"), col = c("blue", "red", "purple", "green"), lty=1, cex=0.8)

par(fig=c(0.5,1,0,1), mar=c(4,4,1,1), new=T)
plot(covid.out.p1$E.l~covid.out.p1$time,type="l", col="blue", xlab="Days", ylab = "Exposed (Low)")
lines(covid.out.p2$E.l~covid.out.p2$time, type="l", col="red")
lines(covid.out.p3$E.l~covid.out.p3$time, type="l", col="purple")
lines(covid.out.p4$E.l~covid.out.p4$time, type="l", col="green")
legend(100, 3,legend = c("p=0","p=0.1","p=0.2","p=0.3"), col = c("blue", "red", "purple", "green"), lty=1, cex=0.8)
par(op2)

## INFECTED ##
op3 <- par(fig=c(0,0.5,0,1), mar=c(4,4,1,1))

plot(covid.out.p1$I.h~covid.out.p1$time,type="l", col="blue", xlab="Days", ylab = "Infected (High)", ylim=c(0,4100))
lines(covid.out.p2$I.h~covid.out.p2$time, type="l", col="red")
lines(covid.out.p3$I.h~covid.out.p3$time, type="l", col="purple")
lines(covid.out.p4$I.h~covid.out.p4$time, type="l", col="green")
legend(100, 3800,legend = c("p=0","p=0.1","p=0.2","p=0.3"), col = c("blue", "red", "purple", "green"), lty=1, cex=0.8)

par(fig=c(0.5,1,0,1), mar=c(4,4,1,1), new=T)
plot(covid.out.p1$I.l~covid.out.p1$time,type="l", col="blue", xlab="Days", ylab = "Infected (Low)", ylim=c(0,0.7))
lines(covid.out.p2$I.l~covid.out.p2$time, type="l", col="red")
lines(covid.out.p3$I.l~covid.out.p3$time, type="l", col="purple")
lines(covid.out.p4$I.l~covid.out.p4$time, type="l", col="green")
legend(100, 0.6,legend = c("p=0","p=0.1","p=0.2","p=0.3"), col = c("blue", "red", "purple", "green"), lty=1, cex=0.8)
par(op3)

## SELF-ISOLATING ##
op4 <- par(mar=c(6,6,2,2))

plot(covid.out.p1$Q~covid.out.p1$time,type="l", col="blue", xlab="Days", ylab = "Self-Isolating")
lines(covid.out.p2$Q~covid.out.p2$time, type="l", col="red")
lines(covid.out.p3$Q~covid.out.p3$time, type="l", col="purple")
lines(covid.out.p4$Q~covid.out.p4$time, type="l", col="green")
legend(125, 4,legend = c("p=0","p=0.1","p=0.2","p=0.3"), col = c("blue", "red", "purple", "green"), lty=1, cex=0.8)
par(op4)

## RECOVERED ##
op5 <- par(mar=c(6,6,2,2))

plot(covid.out.p1$R~covid.out.p1$time,type="l", col="blue", xlab="Days", ylab = "Recovered")
lines(covid.out.p2$R~covid.out.p2$time, type="l", col="red")
lines(covid.out.p3$R~covid.out.p3$time, type="l", col="purple")
lines(covid.out.p4$R~covid.out.p4$time, type="l", col="green")
legend(100, 15000,legend = c("p=0","p=0.1","p=0.2","p=0.3"), col = c("blue", "red", "purple", "green"), lty=1, cex=0.8)
par(op5)

## VIRUS IN ENVIRONMENT ##
op6 <- par(mar=c(6,6,2,2))

plot(covid.out.p1$V~covid.out.p1$time,type="l", col="blue", xlab="Days", ylab = "Virus in Environment")
lines(covid.out.p2$V~covid.out.p2$time, type="l", col="red")
lines(covid.out.p3$V~covid.out.p3$time, type="l", col="purple")
lines(covid.out.p4$V~covid.out.p4$time, type="l", col="green")
legend(125, 3500,legend = c("p=0","p=0.1","p=0.2","p=0.3"), col = c("blue", "red", "purple", "green"), lty=1, cex=0.8)
par(op6)

Results of plots

# first dataframe lists highest values
# second dataframe lists lowest values
# third dataframe lists ending values

results.p1 <- data.frame(
  S.h = c(max(covid.out.p1[ ,2]), max(covid.out.p2[ ,2]), max(covid.out.p3[ ,2]), max(covid.out.p4[ ,2])),
  E.h = c(max(covid.out.p1[ ,3]), max(covid.out.p2[ ,3]), max(covid.out.p3[ ,3]), max(covid.out.p4[ ,3])),
  I.h = c(max(covid.out.p1[ ,4]), max(covid.out.p2[ ,4]), max(covid.out.p3[ ,4]), max(covid.out.p4[ ,4])),
  S.l = c(max(covid.out.p1[ ,5]), max(covid.out.p2[ ,5]), max(covid.out.p3[ ,5]), max(covid.out.p4[ ,5])),
  E.l = c(max(covid.out.p1[ ,6]), max(covid.out.p2[ ,6]), max(covid.out.p3[ ,6]), max(covid.out.p4[ ,6])),
  I.l = c(max(covid.out.p1[ ,7]), max(covid.out.p2[ ,7]), max(covid.out.p3[ ,7]), max(covid.out.p4[ ,7])),
  Q = c(max(covid.out.p1[ ,8]), max(covid.out.p2[ ,8]), max(covid.out.p3[ ,8]), max(covid.out.p4[ ,8])),
  R = c(max(covid.out.p1[ ,9]), max(covid.out.p2[ ,9]), max(covid.out.p3[ ,9]), max(covid.out.p4[ ,9])),
  V = c(max(covid.out.p1[ ,10]), max(covid.out.p2[ ,10]), max(covid.out.p3[ ,10]), max(covid.out.p4[ ,10]))
)

results.p2 <- data.frame(
  S.h = c(min(covid.out.p1[ ,2]), min(covid.out.p2[ ,2]), min(covid.out.p3[ ,2]), min(covid.out.p4[ ,2])),
  E.h = c(min(covid.out.p1[ ,3]), min(covid.out.p2[ ,3]), min(covid.out.p3[ ,3]), min(covid.out.p4[ ,3])),
  I.h = c(min(covid.out.p1[ ,4]), min(covid.out.p2[ ,4]), min(covid.out.p3[ ,4]), min(covid.out.p4[ ,4])),
  S.l = c(min(covid.out.p1[ ,5]), min(covid.out.p2[ ,5]), min(covid.out.p3[ ,5]), min(covid.out.p4[ ,5])),
  E.l = c(min(covid.out.p1[ ,6]), min(covid.out.p2[ ,6]), min(covid.out.p3[ ,6]), min(covid.out.p4[ ,6])),
  I.l = c(min(covid.out.p1[ ,7]), min(covid.out.p2[ ,7]), min(covid.out.p3[ ,7]), min(covid.out.p4[ ,7])),
  Q = c(min(covid.out.p1[ ,8]), min(covid.out.p2[ ,8]), min(covid.out.p3[ ,8]), min(covid.out.p4[ ,8])),
  R = c(min(covid.out.p1[ ,9]), min(covid.out.p2[ ,9]), min(covid.out.p3[ ,9]), min(covid.out.p4[ ,9])),
  V = c(min(covid.out.p1[ ,10]), min(covid.out.p2[ ,10]), min(covid.out.p3[ ,10]), min(covid.out.p4[ ,10]))
)

results.p3 <- data.frame(
  S.h = c(tail(covid.out.p1[ ,2],n=1), tail(covid.out.p2[ ,2],n=1), tail(covid.out.p3[ ,2],n=1), tail(covid.out.p4[ ,2],n=1)), 
  E.h = c(tail(covid.out.p1[ ,3],n=1), tail(covid.out.p2[ ,3],n=1), tail(covid.out.p3[ ,3],n=1), tail(covid.out.p4[ ,3],n=1)),
  I.h = c(tail(covid.out.p1[ ,4],n=1), tail(covid.out.p2[ ,4],n=1), tail(covid.out.p3[ ,4],n=1), tail(covid.out.p4[ ,4],n=1)),
  S.l = c(tail(covid.out.p1[ ,5],n=1), tail(covid.out.p2[ ,5],n=1), tail(covid.out.p3[ ,5],n=1), tail(covid.out.p4[ ,5],n=1)),
  E.l = c(tail(covid.out.p1[ ,6],n=1), tail(covid.out.p2[ ,6],n=1), tail(covid.out.p3[ ,6],n=1), tail(covid.out.p4[ ,6],n=1)), 
  I.l = c(tail(covid.out.p1[ ,7],n=1), tail(covid.out.p2[ ,7],n=1), tail(covid.out.p3[ ,7],n=1), tail(covid.out.p4[ ,7],n=1)),
  Q = c(tail(covid.out.p1[ ,8],n=1), tail(covid.out.p2[ ,8],n=1), tail(covid.out.p3[ ,8],n=1), tail(covid.out.p4[ ,8],n=1)),
  R = c(tail(covid.out.p1[ ,9],n=1), tail(covid.out.p2[ ,9],n=1), tail(covid.out.p3[ ,9],n=1), tail(covid.out.p4[ ,9],n=1)),
  V = c(tail(covid.out.p1[ ,10],n=1), tail(covid.out.p2[ ,10],n=1), tail(covid.out.p3[ ,10],n=1), tail(covid.out.p4[ ,10],n=1))
)

`.rowNamesDF<-`(results.p1,make.names=FALSE,c('p = 0','p = 0.1','p = 0.2','p = 0.3'))
`.rowNamesDF<-`(results.p2,make.names=FALSE,c('p = 0','p = 0.1','p = 0.2','p = 0.3'))
`.rowNamesDF<-`(results.p3,make.names=FALSE,c('p = 0','p = 0.1','p = 0.2','p = 0.3'))

Plotting highest, lowest, and ending values of classes

## HIGHEST ##
op7 <- par(mar=c(6,6,2,2))
plot(results.p1$S.h,type="b", col="blue", xlab="q values", ylab = "Individuals", main="Highest", ylim=c(0,80000))
lines(results.p1$E.h, type = "b", col="red")
lines(results.p1$I.h, type = "b", col="green")
lines(results.p1$S.l, type = "b", col="purple")
lines(results.p1$E.l, type = "b", col="orange")
lines(results.p1$I.l, type = "b", col="forestgreen")
lines(results.p1$Q, type = "b", col="darkturquoise")
lines(results.p1$R, type = "b", col="pink2")
lines(results.p1$V, type = "b", col="yellow")

legend(3, 70000,legend = c("Susceptibles (High)","Exposed (High)","Infected (High)","Susceptibles (Low)","Exposed (Low)","Infected (Low)", "Self-Isolating","Recovered","Virus"), col = c("blue", "red", "green","purple","orange","forestgreen","darkturquoise","pink2","yellow"), lty=1, cex=0.6)

par(op7)

## LOWEST
op8 <- par(mar=c(6,6,2,2))

plot(results.p2$S.h,type="b", col="blue", main="Lowest", xlab="q values", ylab = "Individuals", ylim=c(0,80000))
lines(results.p2$E.h, type = "b", col="red")
lines(results.p2$I.h, type = "b", col="green")
lines(results.p2$S.l, type = "b", col="purple")
lines(results.p2$E.l, type = "b", col="orange")
lines(results.p2$I.l, type = "b", col="forestgreen")
lines(results.p2$Q, type = "b", col="darkturquoise")
lines(results.p2$R, type = "b", col="pink2")
lines(results.p2$V, type = "b", col="yellow")

legend(3, 70000,legend = c("Susceptibles (High)","Exposed (High)","Infected (High)","Susceptibles (Low)","Exposed (Low)","Infected (Low)", "Self-Isolating","Recovered","Virus"), col = c("blue", "red", "green","purple","orange","forestgreen","darkturquoise","pink2","yellow"), lty=1, cex=0.6)

par(op8)

## ENDING ##
op9 <- par(mar=c(6,6,2,2))

plot(results.p3$S.h, type="b", col="blue", main="Ending", xlab="q values", ylab = "Individuals", ylim=c(0,80000))
lines(results.p3$E.h, type = "b", col="red")
lines(results.p3$I.h, type = "b", col="green")
lines(results.p3$S.l, type = "b", col="purple")
lines(results.p3$E.l, type = "b", col="orange")
lines(results.p3$I.l, type = "b", col="forestgreen")
lines(results.p3$Q, type = "b", col="darkturquoise")
lines(results.p3$R, type = "b", col="pink2")
lines(results.p3$V, type = "b", col="yellow")

legend(3, 70000,legend = c("Susceptibles (High)","Exposed (High)","Infected (High)","Susceptibles (Low)","Exposed (Low)","Infected (Low)", "Self-Isolating","Recovered","Virus"), col = c("blue", "red", "green","purple","orange","forestgreen","darkturquoise","pink2","yellow"), lty=1, cex=0.6)

par(op9)

LS0tDQp0aXRsZTogIlNBUlMtQ29WLTIgTW9kZWwgKHApIg0KYXV0aG9yOiBTaGVyaWRhbiBQYXluZQ0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCkNsZWFyaW5nIGVudmlyb25tZW50DQpgYGB7cn0NCnJtKGxpc3QgPSBscygpKQ0KYGBgDQoNCkxvYWRpbmcgbmVjZXNzYXJ5IHBhY2thZ2UNCmBgYHtyfQ0KcmVxdWlyZShkZVNvbHZlKQ0KYGBgDQoNClN5c3RlbSBvZiBERXMNCmBgYHtyfQ0KU0FSU0NPVjJNb2RlbCA8LSBmdW5jdGlvbiAodCwgeSwgcGFyYW1zKSB7DQogIA0KUy5oPC15WzFdICNjcmVhdGUgbG9jYWwgdmFyaWFibGUgUywgZmlyc3QgZWxlbWVudCBvZiB5DQpFLmg8LXlbMl0gDQpJLmg8LXlbM10NClMubDwteVs0XQ0KRS5sPC15WzVdDQpJLmw8LXlbNl0NClE8LXlbN10NClI8LXlbOF0NClY8LXlbOV0NCg0Kd2l0aCgNCiAgYXMubGlzdChwYXJhbXMsIHkpLA0KICB7DQpkUy5oPC0tcSpiZXRhKihJLmgrSS5sKSpTLmgvKFMuaCtFLmgrSS5oK1MubCtFLmwrSS5sK1ErUiktYyooMS1leHAoKC0xL0spKlYpKSpTLmgNCmRFLmg8LXEqYmV0YSooSS5oK0kubCkqUy5oLyhTLmgrRS5oK0kuaCtTLmwrRS5sK0kubCtRK1IpK2MqKDEtZXhwKCgtMS9LKSpWKSkqUy5oLWxhbWJkYSpFLmgNCmRJLmg8LWxhbWJkYSpFLmgtYipnKkkuaC1hSCpoKigxLWcpKkkuaC1nYW1tYWgqKDEtaCkqKDEtZykqSS5oDQpkUy5sPC0tKDEtcCkqcSpiZXRhKihJLmgrSS5sKSpTLmwvKFMuaCtFLmgrSS5oK1MubCtFLmwrSS5sK1ErUiktKDEtcCkqYyooMS1leHAoKC0xL0spKlYpKSpTLmwNCmRFLmw8LSgxLXApKnEqYmV0YSooSS5oK0kubCkvKFMuaCtFLmgrSS5oK1MubCtFLmwrSS5sK1ErUikrKDEtcCkqYyooMS1leHAoKC0xL0spKlYpKSpTLmwtbGFtYmRhKkUubA0KZEkubDwtbGFtYmRhKkUubC1iKkkubA0KZFE8LWIqSS5sK2cqYipJLmgtYVEqaCpRLWdhbW1hUSooMS1oKSpRDQpkUjwtZ2FtbWFoKigxLWgpKigxLWcpKkkuaCtnYW1tYVEqKDEtaCkqUQ0KZFY8LW9tZWdhKkkuaCsoMS1wKSpvbWVnYSpJLmwtZGVsdGEqVg0KICBkeTwtYyhkUy5oLGRFLmgsZEkuaCxkUy5sLGRFLmwsZEkubCxkUSxkUixkVikgI2NvbWJpbmUgcmVzdWx0cyBpbnRvIG9uZSB2ZWN0b3IgZHkNCmxpc3QoZHkpDQogIH0NCikNCn0NCmBgYA0KDQpJbml0aWFsIFZhbHVlcw0KYGBge3J9DQp0aW1lczwtc2VxKDAsMTgwLGJ5PTEpIA0KY292aWQucGFyYW1zPC1jKHE9MC4yLGJldGE9MTMscD0uMixjPTAsbGFtYmRhPTEvNC40MyxiPTEvMC43NyxnPTAsZ2FtbWFRPTAuMSxnYW1tYWg9MS8yLjcsYVE9MS8xLjkzLGFIPTEvMi43LGg9MC4wMDA4MixvbWVnYT0wLGRlbHRhPTEsSz0xMDAwMCkNCnlzdGFydDwtYyhTLmg9KC4yKSoxMDAwMDAsRS5oPTAsSS5oPTEsUy5sPSgxLTAuMikqMTAwMDAwLEUubD0wLEkubD0wLFE9MCxSPTAsVj0wKQ0KY292aWQub3V0IDwtIGFzLmRhdGEuZnJhbWUobHNvZGEoeXN0YXJ0LHRpbWVzLFNBUlNDT1YyTW9kZWwsY292aWQucGFyYW1zKSkNCmBgYA0KDQpDaGFuZ2luZyBwIHRvIDAsIDAuMSwgMC4yLCAmIDAuMw0KYGBge3J9DQpjb3ZpZC5wYXJhbXMucDEgPC0gYyhxPTAuNSxiZXRhPTEzLHA9MCxjPTAsbGFtYmRhPTEvNC40MyxiPTEvMC43NyxnPTAsZ2FtbWFRPTAuMSxnYW1tYWg9MS8yLjcsYVE9MS8xLjkzLGFIPTEvMi43LGg9MC4wMDA4MixvbWVnYT0wLGRlbHRhPTAuNSxLPTEwMDAwMDApDQpjb3ZpZC5wYXJhbXMucDIgPC0gYyhxPTAuNSxiZXRhPTEzLHA9MC4xLGM9MCxsYW1iZGE9MS80LjQzLGI9MS8wLjc3LGc9MCxnYW1tYVE9MC4xLGdhbW1haD0xLzIuNyxhUT0xLzEuOTMsYUg9MS8yLjcsaD0wLjAwMDgyLG9tZWdhPTAsZGVsdGE9MSxLPTEwMDAwMDApDQpjb3ZpZC5wYXJhbXMucDMgPC0gYyhxPTAuNSxiZXRhPTEzLHA9MC4yLGM9MCxsYW1iZGE9MS80LjQzLGI9MS8wLjc3LGc9MCxnYW1tYVE9MC4xLGdhbW1haD0xLzIuNyxhUT0xLzEuOTMsYUg9MS8yLjcsaD0wLjAwMDgyLG9tZWdhPTAsZGVsdGE9MS41LEs9MTAwMDAwMCkNCmNvdmlkLnBhcmFtcy5wNCA8LSBjKHE9MC41LGJldGE9MTMscD0wLjMsYz0wLGxhbWJkYT0xLzQuNDMsYj0xLzAuNzcsZz0wLGdhbW1hUT0wLjEsZ2FtbWFoPTEvMi43LGFRPTEvMS45MyxhSD0xLzIuNyxoPTAuMDAwODIsb21lZ2E9MCxkZWx0YT0yLEs9MTAwMDAwMCkNCmBgYA0KDQpDcmVhdGluZyBkYXRhIGZyYW1lIGZvciBlYWNoIHZhbHVlIG9mIHANCmBgYHtyfQ0KY292aWQub3V0LnAxIDwtIGFzLmRhdGEuZnJhbWUobHNvZGEoeXN0YXJ0LHRpbWVzLFNBUlNDT1YyTW9kZWwsY292aWQucGFyYW1zLnAxKSkNCmNvdmlkLm91dC5wMiA8LSBhcy5kYXRhLmZyYW1lKGxzb2RhKHlzdGFydCx0aW1lcyxTQVJTQ09WMk1vZGVsLGNvdmlkLnBhcmFtcy5wMikpDQpjb3ZpZC5vdXQucDMgPC0gYXMuZGF0YS5mcmFtZShsc29kYSh5c3RhcnQsdGltZXMsU0FSU0NPVjJNb2RlbCxjb3ZpZC5wYXJhbXMucDMpKQ0KY292aWQub3V0LnA0IDwtIGFzLmRhdGEuZnJhbWUobHNvZGEoeXN0YXJ0LHRpbWVzLFNBUlNDT1YyTW9kZWwsY292aWQucGFyYW1zLnA0KSkNCmBgYA0KDQpQbG90dGluZyBTLmgsIFMubCwgSS5oLCAmIEkubA0KYGBge3J9DQojIyBTVVNDRVBUSUJMRSAjIw0Kb3AxIDwtIHBhcihmaWc9YygwLDAuNSwwLDEpLCBtYXI9Yyg0LDQsMSwxKSkNCnBsb3QoY292aWQub3V0LnAxJFMuaH5jb3ZpZC5vdXQucDEkdGltZSx0eXBlPSJsIiwgY29sPSJibHVlIiwgeGxhYj0iRGF5cyIsIHlsYWIgPSAiU3VzY2VwdGlibGUgKEhpZ2gpIikNCmxpbmVzKGNvdmlkLm91dC5wMiRTLmh+Y292aWQub3V0LnAyJHRpbWUsIHR5cGU9ImwiLCBjb2w9InJlZCIpDQpsaW5lcyhjb3ZpZC5vdXQucDMkUy5ofmNvdmlkLm91dC5wMyR0aW1lLCB0eXBlPSJsIiwgY29sPSJwdXJwbGUiKQ0KbGluZXMoY292aWQub3V0LnA0JFMuaH5jb3ZpZC5vdXQucDQkdGltZSwgdHlwZT0ibCIsIGNvbD0iZ3JlZW4iKQ0KbGVnZW5kKDEwMCwgMTc1MDAsbGVnZW5kID0gYygicD0wIiwicD0wLjEiLCJwPTAuMiIsInA9MC4zIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiwgInB1cnBsZSIsICJncmVlbiIpLCBsdHk9MSwgY2V4PTAuOCkNCg0KcGFyKGZpZz1jKDAuNSwxLDAsMSksIG1hcj1jKDQsNCwxLDEpLCBuZXc9VCkNCnBsb3QoY292aWQub3V0LnAxJFMubH5jb3ZpZC5vdXQucDEkdGltZSx0eXBlPSJsIiwgY29sPSJibHVlIiwgeGxhYj0iRGF5cyIsIHlsYWIgPSAiU3VzY2VwdGlibGUgKExvdykiKQ0KbGluZXMoY292aWQub3V0LnAyJFMubH5jb3ZpZC5vdXQucDIkdGltZSwgdHlwZT0ibCIsIGNvbD0icmVkIikNCmxpbmVzKGNvdmlkLm91dC5wMyRTLmx+Y292aWQub3V0LnAzJHRpbWUsIHR5cGU9ImwiLCBjb2w9InB1cnBsZSIpDQpsaW5lcyhjb3ZpZC5vdXQucDQkUy5sfmNvdmlkLm91dC5wNCR0aW1lLCB0eXBlPSJsIiwgY29sPSJncmVlbiIpDQpsZWdlbmQoMTAwLCA3MDAwMCxsZWdlbmQgPSBjKCJwPTAiLCJwPTAuMSIsInA9MC4yIiwicD0wLjMiKSwgY29sID0gYygiYmx1ZSIsICJyZWQiLCAicHVycGxlIiwgImdyZWVuIiksIGx0eT0xLCBjZXg9MC44KQ0KcGFyKG9wMSkNCg0KIyMgRVhQT1NFRCAjIw0Kb3AyIDwtIHBhcihmaWc9YygwLDAuNSwwLDEpLCBtYXI9Yyg0LDQsMSwxKSkNCnBsb3QoY292aWQub3V0LnAxJEUuaH5jb3ZpZC5vdXQucDEkdGltZSx0eXBlPSJsIiwgY29sPSJibHVlIiwgeGxhYj0iRGF5cyIsIHlsYWIgPSAiRXhwb3NlZCAoSGlnaCkiKQ0KbGluZXMoY292aWQub3V0LnAyJEUuaH5jb3ZpZC5vdXQucDIkdGltZSwgdHlwZT0ibCIsIGNvbD0icmVkIikNCmxpbmVzKGNvdmlkLm91dC5wMyRFLmh+Y292aWQub3V0LnAzJHRpbWUsIHR5cGU9ImwiLCBjb2w9InB1cnBsZSIpDQpsaW5lcyhjb3ZpZC5vdXQucDQkRS5ofmNvdmlkLm91dC5wNCR0aW1lLCB0eXBlPSJsIiwgY29sPSJncmVlbiIpDQpsZWdlbmQoMTAwLCA2MDAwLGxlZ2VuZCA9IGMoInA9MCIsInA9MC4xIiwicD0wLjIiLCJwPTAuMyIpLCBjb2wgPSBjKCJibHVlIiwgInJlZCIsICJwdXJwbGUiLCAiZ3JlZW4iKSwgbHR5PTEsIGNleD0wLjgpDQoNCnBhcihmaWc9YygwLjUsMSwwLDEpLCBtYXI9Yyg0LDQsMSwxKSwgbmV3PVQpDQpwbG90KGNvdmlkLm91dC5wMSRFLmx+Y292aWQub3V0LnAxJHRpbWUsdHlwZT0ibCIsIGNvbD0iYmx1ZSIsIHhsYWI9IkRheXMiLCB5bGFiID0gIkV4cG9zZWQgKExvdykiKQ0KbGluZXMoY292aWQub3V0LnAyJEUubH5jb3ZpZC5vdXQucDIkdGltZSwgdHlwZT0ibCIsIGNvbD0icmVkIikNCmxpbmVzKGNvdmlkLm91dC5wMyRFLmx+Y292aWQub3V0LnAzJHRpbWUsIHR5cGU9ImwiLCBjb2w9InB1cnBsZSIpDQpsaW5lcyhjb3ZpZC5vdXQucDQkRS5sfmNvdmlkLm91dC5wNCR0aW1lLCB0eXBlPSJsIiwgY29sPSJncmVlbiIpDQpsZWdlbmQoMTAwLCAzLGxlZ2VuZCA9IGMoInA9MCIsInA9MC4xIiwicD0wLjIiLCJwPTAuMyIpLCBjb2wgPSBjKCJibHVlIiwgInJlZCIsICJwdXJwbGUiLCAiZ3JlZW4iKSwgbHR5PTEsIGNleD0wLjgpDQpwYXIob3AyKQ0KDQojIyBJTkZFQ1RFRCAjIw0Kb3AzIDwtIHBhcihmaWc9YygwLDAuNSwwLDEpLCBtYXI9Yyg0LDQsMSwxKSkNCnBsb3QoY292aWQub3V0LnAxJEkuaH5jb3ZpZC5vdXQucDEkdGltZSx0eXBlPSJsIiwgY29sPSJibHVlIiwgeGxhYj0iRGF5cyIsIHlsYWIgPSAiSW5mZWN0ZWQgKEhpZ2gpIiwgeWxpbT1jKDAsNDEwMCkpDQpsaW5lcyhjb3ZpZC5vdXQucDIkSS5ofmNvdmlkLm91dC5wMiR0aW1lLCB0eXBlPSJsIiwgY29sPSJyZWQiKQ0KbGluZXMoY292aWQub3V0LnAzJEkuaH5jb3ZpZC5vdXQucDMkdGltZSwgdHlwZT0ibCIsIGNvbD0icHVycGxlIikNCmxpbmVzKGNvdmlkLm91dC5wNCRJLmh+Y292aWQub3V0LnA0JHRpbWUsIHR5cGU9ImwiLCBjb2w9ImdyZWVuIikNCmxlZ2VuZCgxMDAsIDM4MDAsbGVnZW5kID0gYygicD0wIiwicD0wLjEiLCJwPTAuMiIsInA9MC4zIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiwgInB1cnBsZSIsICJncmVlbiIpLCBsdHk9MSwgY2V4PTAuOCkNCg0KcGFyKGZpZz1jKDAuNSwxLDAsMSksIG1hcj1jKDQsNCwxLDEpLCBuZXc9VCkNCnBsb3QoY292aWQub3V0LnAxJEkubH5jb3ZpZC5vdXQucDEkdGltZSx0eXBlPSJsIiwgY29sPSJibHVlIiwgeGxhYj0iRGF5cyIsIHlsYWIgPSAiSW5mZWN0ZWQgKExvdykiLCB5bGltPWMoMCwwLjcpKQ0KbGluZXMoY292aWQub3V0LnAyJEkubH5jb3ZpZC5vdXQucDIkdGltZSwgdHlwZT0ibCIsIGNvbD0icmVkIikNCmxpbmVzKGNvdmlkLm91dC5wMyRJLmx+Y292aWQub3V0LnAzJHRpbWUsIHR5cGU9ImwiLCBjb2w9InB1cnBsZSIpDQpsaW5lcyhjb3ZpZC5vdXQucDQkSS5sfmNvdmlkLm91dC5wNCR0aW1lLCB0eXBlPSJsIiwgY29sPSJncmVlbiIpDQpsZWdlbmQoMTAwLCAwLjYsbGVnZW5kID0gYygicD0wIiwicD0wLjEiLCJwPTAuMiIsInA9MC4zIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiwgInB1cnBsZSIsICJncmVlbiIpLCBsdHk9MSwgY2V4PTAuOCkNCnBhcihvcDMpDQoNCiMjIFNFTEYtSVNPTEFUSU5HICMjDQpvcDQgPC0gcGFyKG1hcj1jKDYsNiwyLDIpKQ0KcGxvdChjb3ZpZC5vdXQucDEkUX5jb3ZpZC5vdXQucDEkdGltZSx0eXBlPSJsIiwgY29sPSJibHVlIiwgeGxhYj0iRGF5cyIsIHlsYWIgPSAiU2VsZi1Jc29sYXRpbmciKQ0KbGluZXMoY292aWQub3V0LnAyJFF+Y292aWQub3V0LnAyJHRpbWUsIHR5cGU9ImwiLCBjb2w9InJlZCIpDQpsaW5lcyhjb3ZpZC5vdXQucDMkUX5jb3ZpZC5vdXQucDMkdGltZSwgdHlwZT0ibCIsIGNvbD0icHVycGxlIikNCmxpbmVzKGNvdmlkLm91dC5wNCRRfmNvdmlkLm91dC5wNCR0aW1lLCB0eXBlPSJsIiwgY29sPSJncmVlbiIpDQpsZWdlbmQoMTI1LCA0LGxlZ2VuZCA9IGMoInA9MCIsInA9MC4xIiwicD0wLjIiLCJwPTAuMyIpLCBjb2wgPSBjKCJibHVlIiwgInJlZCIsICJwdXJwbGUiLCAiZ3JlZW4iKSwgbHR5PTEsIGNleD0wLjgpDQpwYXIob3A0KQ0KDQojIyBSRUNPVkVSRUQgIyMNCm9wNSA8LSBwYXIobWFyPWMoNiw2LDIsMikpDQpwbG90KGNvdmlkLm91dC5wMSRSfmNvdmlkLm91dC5wMSR0aW1lLHR5cGU9ImwiLCBjb2w9ImJsdWUiLCB4bGFiPSJEYXlzIiwgeWxhYiA9ICJSZWNvdmVyZWQiKQ0KbGluZXMoY292aWQub3V0LnAyJFJ+Y292aWQub3V0LnAyJHRpbWUsIHR5cGU9ImwiLCBjb2w9InJlZCIpDQpsaW5lcyhjb3ZpZC5vdXQucDMkUn5jb3ZpZC5vdXQucDMkdGltZSwgdHlwZT0ibCIsIGNvbD0icHVycGxlIikNCmxpbmVzKGNvdmlkLm91dC5wNCRSfmNvdmlkLm91dC5wNCR0aW1lLCB0eXBlPSJsIiwgY29sPSJncmVlbiIpDQpsZWdlbmQoMTAwLCAxNTAwMCxsZWdlbmQgPSBjKCJwPTAiLCJwPTAuMSIsInA9MC4yIiwicD0wLjMiKSwgY29sID0gYygiYmx1ZSIsICJyZWQiLCAicHVycGxlIiwgImdyZWVuIiksIGx0eT0xLCBjZXg9MC44KQ0KcGFyKG9wNSkNCg0KIyMgVklSVVMgSU4gRU5WSVJPTk1FTlQgIyMNCm9wNiA8LSBwYXIobWFyPWMoNiw2LDIsMikpDQpwbG90KGNvdmlkLm91dC5wMSRWfmNvdmlkLm91dC5wMSR0aW1lLHR5cGU9ImwiLCBjb2w9ImJsdWUiLCB4bGFiPSJEYXlzIiwgeWxhYiA9ICJWaXJ1cyBpbiBFbnZpcm9ubWVudCIpDQpsaW5lcyhjb3ZpZC5vdXQucDIkVn5jb3ZpZC5vdXQucDIkdGltZSwgdHlwZT0ibCIsIGNvbD0icmVkIikNCmxpbmVzKGNvdmlkLm91dC5wMyRWfmNvdmlkLm91dC5wMyR0aW1lLCB0eXBlPSJsIiwgY29sPSJwdXJwbGUiKQ0KbGluZXMoY292aWQub3V0LnA0JFZ+Y292aWQub3V0LnA0JHRpbWUsIHR5cGU9ImwiLCBjb2w9ImdyZWVuIikNCmxlZ2VuZCgxMjUsIDM1MDAsbGVnZW5kID0gYygicD0wIiwicD0wLjEiLCJwPTAuMiIsInA9MC4zIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiwgInB1cnBsZSIsICJncmVlbiIpLCBsdHk9MSwgY2V4PTAuOCkNCnBhcihvcDYpDQpgYGANCg0KUmVzdWx0cyBvZiBwbG90cw0KYGBge3J9DQojIGZpcnN0IGRhdGFmcmFtZSBsaXN0cyBoaWdoZXN0IHZhbHVlcw0KIyBzZWNvbmQgZGF0YWZyYW1lIGxpc3RzIGxvd2VzdCB2YWx1ZXMNCiMgdGhpcmQgZGF0YWZyYW1lIGxpc3RzIGVuZGluZyB2YWx1ZXMNCg0KcmVzdWx0cy5wMSA8LSBkYXRhLmZyYW1lKA0KICBTLmggPSBjKG1heChjb3ZpZC5vdXQucDFbICwyXSksIG1heChjb3ZpZC5vdXQucDJbICwyXSksIG1heChjb3ZpZC5vdXQucDNbICwyXSksIG1heChjb3ZpZC5vdXQucDRbICwyXSkpLA0KICBFLmggPSBjKG1heChjb3ZpZC5vdXQucDFbICwzXSksIG1heChjb3ZpZC5vdXQucDJbICwzXSksIG1heChjb3ZpZC5vdXQucDNbICwzXSksIG1heChjb3ZpZC5vdXQucDRbICwzXSkpLA0KICBJLmggPSBjKG1heChjb3ZpZC5vdXQucDFbICw0XSksIG1heChjb3ZpZC5vdXQucDJbICw0XSksIG1heChjb3ZpZC5vdXQucDNbICw0XSksIG1heChjb3ZpZC5vdXQucDRbICw0XSkpLA0KICBTLmwgPSBjKG1heChjb3ZpZC5vdXQucDFbICw1XSksIG1heChjb3ZpZC5vdXQucDJbICw1XSksIG1heChjb3ZpZC5vdXQucDNbICw1XSksIG1heChjb3ZpZC5vdXQucDRbICw1XSkpLA0KICBFLmwgPSBjKG1heChjb3ZpZC5vdXQucDFbICw2XSksIG1heChjb3ZpZC5vdXQucDJbICw2XSksIG1heChjb3ZpZC5vdXQucDNbICw2XSksIG1heChjb3ZpZC5vdXQucDRbICw2XSkpLA0KICBJLmwgPSBjKG1heChjb3ZpZC5vdXQucDFbICw3XSksIG1heChjb3ZpZC5vdXQucDJbICw3XSksIG1heChjb3ZpZC5vdXQucDNbICw3XSksIG1heChjb3ZpZC5vdXQucDRbICw3XSkpLA0KICBRID0gYyhtYXgoY292aWQub3V0LnAxWyAsOF0pLCBtYXgoY292aWQub3V0LnAyWyAsOF0pLCBtYXgoY292aWQub3V0LnAzWyAsOF0pLCBtYXgoY292aWQub3V0LnA0WyAsOF0pKSwNCiAgUiA9IGMobWF4KGNvdmlkLm91dC5wMVsgLDldKSwgbWF4KGNvdmlkLm91dC5wMlsgLDldKSwgbWF4KGNvdmlkLm91dC5wM1sgLDldKSwgbWF4KGNvdmlkLm91dC5wNFsgLDldKSksDQogIFYgPSBjKG1heChjb3ZpZC5vdXQucDFbICwxMF0pLCBtYXgoY292aWQub3V0LnAyWyAsMTBdKSwgbWF4KGNvdmlkLm91dC5wM1sgLDEwXSksIG1heChjb3ZpZC5vdXQucDRbICwxMF0pKQ0KKQ0KDQpyZXN1bHRzLnAyIDwtIGRhdGEuZnJhbWUoDQogIFMuaCA9IGMobWluKGNvdmlkLm91dC5wMVsgLDJdKSwgbWluKGNvdmlkLm91dC5wMlsgLDJdKSwgbWluKGNvdmlkLm91dC5wM1sgLDJdKSwgbWluKGNvdmlkLm91dC5wNFsgLDJdKSksDQogIEUuaCA9IGMobWluKGNvdmlkLm91dC5wMVsgLDNdKSwgbWluKGNvdmlkLm91dC5wMlsgLDNdKSwgbWluKGNvdmlkLm91dC5wM1sgLDNdKSwgbWluKGNvdmlkLm91dC5wNFsgLDNdKSksDQogIEkuaCA9IGMobWluKGNvdmlkLm91dC5wMVsgLDRdKSwgbWluKGNvdmlkLm91dC5wMlsgLDRdKSwgbWluKGNvdmlkLm91dC5wM1sgLDRdKSwgbWluKGNvdmlkLm91dC5wNFsgLDRdKSksDQogIFMubCA9IGMobWluKGNvdmlkLm91dC5wMVsgLDVdKSwgbWluKGNvdmlkLm91dC5wMlsgLDVdKSwgbWluKGNvdmlkLm91dC5wM1sgLDVdKSwgbWluKGNvdmlkLm91dC5wNFsgLDVdKSksDQogIEUubCA9IGMobWluKGNvdmlkLm91dC5wMVsgLDZdKSwgbWluKGNvdmlkLm91dC5wMlsgLDZdKSwgbWluKGNvdmlkLm91dC5wM1sgLDZdKSwgbWluKGNvdmlkLm91dC5wNFsgLDZdKSksDQogIEkubCA9IGMobWluKGNvdmlkLm91dC5wMVsgLDddKSwgbWluKGNvdmlkLm91dC5wMlsgLDddKSwgbWluKGNvdmlkLm91dC5wM1sgLDddKSwgbWluKGNvdmlkLm91dC5wNFsgLDddKSksDQogIFEgPSBjKG1pbihjb3ZpZC5vdXQucDFbICw4XSksIG1pbihjb3ZpZC5vdXQucDJbICw4XSksIG1pbihjb3ZpZC5vdXQucDNbICw4XSksIG1pbihjb3ZpZC5vdXQucDRbICw4XSkpLA0KICBSID0gYyhtaW4oY292aWQub3V0LnAxWyAsOV0pLCBtaW4oY292aWQub3V0LnAyWyAsOV0pLCBtaW4oY292aWQub3V0LnAzWyAsOV0pLCBtaW4oY292aWQub3V0LnA0WyAsOV0pKSwNCiAgViA9IGMobWluKGNvdmlkLm91dC5wMVsgLDEwXSksIG1pbihjb3ZpZC5vdXQucDJbICwxMF0pLCBtaW4oY292aWQub3V0LnAzWyAsMTBdKSwgbWluKGNvdmlkLm91dC5wNFsgLDEwXSkpDQopDQoNCnJlc3VsdHMucDMgPC0gZGF0YS5mcmFtZSgNCiAgUy5oID0gYyh0YWlsKGNvdmlkLm91dC5wMVsgLDJdLG49MSksIHRhaWwoY292aWQub3V0LnAyWyAsMl0sbj0xKSwgdGFpbChjb3ZpZC5vdXQucDNbICwyXSxuPTEpLCB0YWlsKGNvdmlkLm91dC5wNFsgLDJdLG49MSkpLCANCiAgRS5oID0gYyh0YWlsKGNvdmlkLm91dC5wMVsgLDNdLG49MSksIHRhaWwoY292aWQub3V0LnAyWyAsM10sbj0xKSwgdGFpbChjb3ZpZC5vdXQucDNbICwzXSxuPTEpLCB0YWlsKGNvdmlkLm91dC5wNFsgLDNdLG49MSkpLA0KICBJLmggPSBjKHRhaWwoY292aWQub3V0LnAxWyAsNF0sbj0xKSwgdGFpbChjb3ZpZC5vdXQucDJbICw0XSxuPTEpLCB0YWlsKGNvdmlkLm91dC5wM1sgLDRdLG49MSksIHRhaWwoY292aWQub3V0LnA0WyAsNF0sbj0xKSksDQogIFMubCA9IGModGFpbChjb3ZpZC5vdXQucDFbICw1XSxuPTEpLCB0YWlsKGNvdmlkLm91dC5wMlsgLDVdLG49MSksIHRhaWwoY292aWQub3V0LnAzWyAsNV0sbj0xKSwgdGFpbChjb3ZpZC5vdXQucDRbICw1XSxuPTEpKSwNCiAgRS5sID0gYyh0YWlsKGNvdmlkLm91dC5wMVsgLDZdLG49MSksIHRhaWwoY292aWQub3V0LnAyWyAsNl0sbj0xKSwgdGFpbChjb3ZpZC5vdXQucDNbICw2XSxuPTEpLCB0YWlsKGNvdmlkLm91dC5wNFsgLDZdLG49MSkpLCANCiAgSS5sID0gYyh0YWlsKGNvdmlkLm91dC5wMVsgLDddLG49MSksIHRhaWwoY292aWQub3V0LnAyWyAsN10sbj0xKSwgdGFpbChjb3ZpZC5vdXQucDNbICw3XSxuPTEpLCB0YWlsKGNvdmlkLm91dC5wNFsgLDddLG49MSkpLA0KICBRID0gYyh0YWlsKGNvdmlkLm91dC5wMVsgLDhdLG49MSksIHRhaWwoY292aWQub3V0LnAyWyAsOF0sbj0xKSwgdGFpbChjb3ZpZC5vdXQucDNbICw4XSxuPTEpLCB0YWlsKGNvdmlkLm91dC5wNFsgLDhdLG49MSkpLA0KICBSID0gYyh0YWlsKGNvdmlkLm91dC5wMVsgLDldLG49MSksIHRhaWwoY292aWQub3V0LnAyWyAsOV0sbj0xKSwgdGFpbChjb3ZpZC5vdXQucDNbICw5XSxuPTEpLCB0YWlsKGNvdmlkLm91dC5wNFsgLDldLG49MSkpLA0KICBWID0gYyh0YWlsKGNvdmlkLm91dC5wMVsgLDEwXSxuPTEpLCB0YWlsKGNvdmlkLm91dC5wMlsgLDEwXSxuPTEpLCB0YWlsKGNvdmlkLm91dC5wM1sgLDEwXSxuPTEpLCB0YWlsKGNvdmlkLm91dC5wNFsgLDEwXSxuPTEpKQ0KKQ0KDQpgLnJvd05hbWVzREY8LWAocmVzdWx0cy5wMSxtYWtlLm5hbWVzPUZBTFNFLGMoJ3AgPSAwJywncCA9IDAuMScsJ3AgPSAwLjInLCdwID0gMC4zJykpDQpgLnJvd05hbWVzREY8LWAocmVzdWx0cy5wMixtYWtlLm5hbWVzPUZBTFNFLGMoJ3AgPSAwJywncCA9IDAuMScsJ3AgPSAwLjInLCdwID0gMC4zJykpDQpgLnJvd05hbWVzREY8LWAocmVzdWx0cy5wMyxtYWtlLm5hbWVzPUZBTFNFLGMoJ3AgPSAwJywncCA9IDAuMScsJ3AgPSAwLjInLCdwID0gMC4zJykpDQpgYGANCg0KUGxvdHRpbmcgaGlnaGVzdCwgbG93ZXN0LCBhbmQgZW5kaW5nIHZhbHVlcyBvZiBjbGFzc2VzDQpgYGB7cn0NCiMjIEhJR0hFU1QgIyMNCm9wNyA8LSBwYXIobWFyPWMoNiw2LDIsMikpDQpwbG90KHJlc3VsdHMucDEkUy5oLHR5cGU9ImIiLCBjb2w9ImJsdWUiLCB4bGFiPSJxIHZhbHVlcyIsIHlsYWIgPSAiSW5kaXZpZHVhbHMiLCBtYWluPSJIaWdoZXN0IiwgeWxpbT1jKDAsODAwMDApKQ0KbGluZXMocmVzdWx0cy5wMSRFLmgsIHR5cGUgPSAiYiIsIGNvbD0icmVkIikNCmxpbmVzKHJlc3VsdHMucDEkSS5oLCB0eXBlID0gImIiLCBjb2w9ImdyZWVuIikNCmxpbmVzKHJlc3VsdHMucDEkUy5sLCB0eXBlID0gImIiLCBjb2w9InB1cnBsZSIpDQpsaW5lcyhyZXN1bHRzLnAxJEUubCwgdHlwZSA9ICJiIiwgY29sPSJvcmFuZ2UiKQ0KbGluZXMocmVzdWx0cy5wMSRJLmwsIHR5cGUgPSAiYiIsIGNvbD0iZm9yZXN0Z3JlZW4iKQ0KbGluZXMocmVzdWx0cy5wMSRRLCB0eXBlID0gImIiLCBjb2w9ImRhcmt0dXJxdW9pc2UiKQ0KbGluZXMocmVzdWx0cy5wMSRSLCB0eXBlID0gImIiLCBjb2w9InBpbmsyIikNCmxpbmVzKHJlc3VsdHMucDEkViwgdHlwZSA9ICJiIiwgY29sPSJ5ZWxsb3ciKQ0KDQpsZWdlbmQoMywgNzAwMDAsbGVnZW5kID0gYygiU3VzY2VwdGlibGVzIChIaWdoKSIsIkV4cG9zZWQgKEhpZ2gpIiwiSW5mZWN0ZWQgKEhpZ2gpIiwiU3VzY2VwdGlibGVzIChMb3cpIiwiRXhwb3NlZCAoTG93KSIsIkluZmVjdGVkIChMb3cpIiwgIlNlbGYtSXNvbGF0aW5nIiwiUmVjb3ZlcmVkIiwiVmlydXMiKSwgY29sID0gYygiYmx1ZSIsICJyZWQiLCAiZ3JlZW4iLCJwdXJwbGUiLCJvcmFuZ2UiLCJmb3Jlc3RncmVlbiIsImRhcmt0dXJxdW9pc2UiLCJwaW5rMiIsInllbGxvdyIpLCBsdHk9MSwgY2V4PTAuNikNCg0KcGFyKG9wNykNCg0KIyMgTE9XRVNUDQpvcDggPC0gcGFyKG1hcj1jKDYsNiwyLDIpKQ0KcGxvdChyZXN1bHRzLnAyJFMuaCx0eXBlPSJiIiwgY29sPSJibHVlIiwgbWFpbj0iTG93ZXN0IiwgeGxhYj0icSB2YWx1ZXMiLCB5bGFiID0gIkluZGl2aWR1YWxzIiwgeWxpbT1jKDAsODAwMDApKQ0KbGluZXMocmVzdWx0cy5wMiRFLmgsIHR5cGUgPSAiYiIsIGNvbD0icmVkIikNCmxpbmVzKHJlc3VsdHMucDIkSS5oLCB0eXBlID0gImIiLCBjb2w9ImdyZWVuIikNCmxpbmVzKHJlc3VsdHMucDIkUy5sLCB0eXBlID0gImIiLCBjb2w9InB1cnBsZSIpDQpsaW5lcyhyZXN1bHRzLnAyJEUubCwgdHlwZSA9ICJiIiwgY29sPSJvcmFuZ2UiKQ0KbGluZXMocmVzdWx0cy5wMiRJLmwsIHR5cGUgPSAiYiIsIGNvbD0iZm9yZXN0Z3JlZW4iKQ0KbGluZXMocmVzdWx0cy5wMiRRLCB0eXBlID0gImIiLCBjb2w9ImRhcmt0dXJxdW9pc2UiKQ0KbGluZXMocmVzdWx0cy5wMiRSLCB0eXBlID0gImIiLCBjb2w9InBpbmsyIikNCmxpbmVzKHJlc3VsdHMucDIkViwgdHlwZSA9ICJiIiwgY29sPSJ5ZWxsb3ciKQ0KDQpsZWdlbmQoMywgNzAwMDAsbGVnZW5kID0gYygiU3VzY2VwdGlibGVzIChIaWdoKSIsIkV4cG9zZWQgKEhpZ2gpIiwiSW5mZWN0ZWQgKEhpZ2gpIiwiU3VzY2VwdGlibGVzIChMb3cpIiwiRXhwb3NlZCAoTG93KSIsIkluZmVjdGVkIChMb3cpIiwgIlNlbGYtSXNvbGF0aW5nIiwiUmVjb3ZlcmVkIiwiVmlydXMiKSwgY29sID0gYygiYmx1ZSIsICJyZWQiLCAiZ3JlZW4iLCJwdXJwbGUiLCJvcmFuZ2UiLCJmb3Jlc3RncmVlbiIsImRhcmt0dXJxdW9pc2UiLCJwaW5rMiIsInllbGxvdyIpLCBsdHk9MSwgY2V4PTAuNikNCg0KcGFyKG9wOCkNCg0KIyMgRU5ESU5HICMjDQpvcDkgPC0gcGFyKG1hcj1jKDYsNiwyLDIpKQ0KcGxvdChyZXN1bHRzLnAzJFMuaCwgdHlwZT0iYiIsIGNvbD0iYmx1ZSIsIG1haW49IkVuZGluZyIsIHhsYWI9InEgdmFsdWVzIiwgeWxhYiA9ICJJbmRpdmlkdWFscyIsIHlsaW09YygwLDgwMDAwKSkNCmxpbmVzKHJlc3VsdHMucDMkRS5oLCB0eXBlID0gImIiLCBjb2w9InJlZCIpDQpsaW5lcyhyZXN1bHRzLnAzJEkuaCwgdHlwZSA9ICJiIiwgY29sPSJncmVlbiIpDQpsaW5lcyhyZXN1bHRzLnAzJFMubCwgdHlwZSA9ICJiIiwgY29sPSJwdXJwbGUiKQ0KbGluZXMocmVzdWx0cy5wMyRFLmwsIHR5cGUgPSAiYiIsIGNvbD0ib3JhbmdlIikNCmxpbmVzKHJlc3VsdHMucDMkSS5sLCB0eXBlID0gImIiLCBjb2w9ImZvcmVzdGdyZWVuIikNCmxpbmVzKHJlc3VsdHMucDMkUSwgdHlwZSA9ICJiIiwgY29sPSJkYXJrdHVycXVvaXNlIikNCmxpbmVzKHJlc3VsdHMucDMkUiwgdHlwZSA9ICJiIiwgY29sPSJwaW5rMiIpDQpsaW5lcyhyZXN1bHRzLnAzJFYsIHR5cGUgPSAiYiIsIGNvbD0ieWVsbG93IikNCg0KbGVnZW5kKDMsIDcwMDAwLGxlZ2VuZCA9IGMoIlN1c2NlcHRpYmxlcyAoSGlnaCkiLCJFeHBvc2VkIChIaWdoKSIsIkluZmVjdGVkIChIaWdoKSIsIlN1c2NlcHRpYmxlcyAoTG93KSIsIkV4cG9zZWQgKExvdykiLCJJbmZlY3RlZCAoTG93KSIsICJTZWxmLUlzb2xhdGluZyIsIlJlY292ZXJlZCIsIlZpcnVzIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiwgImdyZWVuIiwicHVycGxlIiwib3JhbmdlIiwiZm9yZXN0Z3JlZW4iLCJkYXJrdHVycXVvaXNlIiwicGluazIiLCJ5ZWxsb3ciKSwgbHR5PTEsIGNleD0wLjYpDQoNCnBhcihvcDkpDQpgYGA=