3. REPORTING BY PROGRAM AREA

 

datab<-read.csv("DATAB.csv")
library(tidyverse)
library(RColorBrewer)

#b<-names(datab)
#b<-gsub("\\.+","\\.",b)
#d<-'something'
#for (i in 1:5){d[i]<-b[i]}
#for (i in 6:length(b)){
 #f<-strsplit(b[i],"\\.")
  #f<-unlist(f)
  #d[i]<-paste(f[4],f[5],f[length(f)],sep=".")}
 #d[4:5]<-gsub("[A\\.2\\.1\\.]",'',d[4:5])
 
names(datab)[6:8]<-paste0("SP",1:3)
names(datab)[25:26]<-paste0("palu",c("s","g"),sep="_")
names(datab)[20:21]<-paste0("Diarr_sev",1:2)

#datag$periodname<-as.character(datag$periodname)
#datag$periodname[datag$periodname=="Janvier"]<-"1.Janv"
datab$periodname<-paste0(match(datab$periodname,c("Octobre","Novembre","Décembre","Janvier","Février","Mars")),".",datab$periodname)
datag<-datab[datab$periodname %in% c("4.Janvier","5.Février","6.Mars"),]
#datag$periodname[datag$periodname=="Février"]<-"2.Fev"
#datag$periodname[datag$periodname=="Mars"]<-"3.Mars"
names(datab)[31:35]<-paste0("MildCps",1:5)
sink("Namesb.txt")
names(datab)
sink()

datag<-aggregate(datag[,4:ncol(datag)],list(datag$zs,datag$periodname),sum,na.rm=T)
names(datag)[1:2]<-c("zs","periodname")

sink("Namesg.txt")
names(datag)
sink()

tot2 <- function(xd){
  p<-c(as.character(xd[,1]),'Total')
  a<-apply(xd[,2:ncol(xd)],2,sum,na.rm=T)
  a<-rbind(xd[,2:ncol(xd)],a)
  u<-data.frame(p,a)
  names(u)[1]<-"Mois"
  assign("total",u,envir=.GlobalEnv)
}

cibles<-read.csv("C:/Users/MuyungaP/Documents/PROSANI USAID/QUARTER REPORT/Y2 REPORT/CIBLES2.csv")
ciblea<-read.csv2("C:/Users/MuyungaP/Documents/PROSANI USAID/ANALYSIS/Y2/cibles.csv")
#cibleg<-aggregate(cibles[,3:ncol(cibles)],list(cibles$Group.2),sum,na.rm=T)
#names(cibleg)[1]<-'zs'
datac<-read.csv("DATAC.csv")
#names(datac)<-names(datab)
clus<-data.frame(zs=unique(datab$zs))
clus$pop<-ifelse(clus$zs%in%c("Baka","Kayamba","Kinda","Lwamba"),"1Low",ifelse(clus$zs%in%c("Butumba","KabondoD","Kamina","Kinkondja","Mukanga","Songa"),"2Middle","3High"))
clus<-clus[order(clus$zs),]

MALARIA

 

  - Number of children under 5 years of age with confirmed malaria who received treatment for malaria from an appropriate provider in USG-supported areas [15 fee proxy]

 

a <- data.frame(c("Katanga"),c("Haut Lomami"),c("9407"),c("74430"),c("126.4"))

#knitr::kable(a,"pandoc",align='lcccr',col.names=c("Region","Province","Achievement","Target","Achievment Rate"))

  .
 

a<-datag
a$palu<-rowSums(a[,24:25])
a<-aggregate(a[,c(20,66)],list(a$periodname),sum)
a$cible<-round(cibles$Paludisme[3]/12)
tot2(a)
total[,2]<-NULL
#total$percent<-round(total$palu*100/total$cible,0)
#knitr::kable(total,"pandoc",align='lccr')
b<-datab
b$palu<-rowSums(b[,25:26],na.rm=T)
#datag$Palu<-rowSums(datag[,20:21],na.rm=T)
datag%>%group_by(zs)%>%summarise(Palu=sum(palus_+palug_))->p
p$pop<-clus$pop
ggplot(p,aes(x=zs,y=Palu,fill=pop))+geom_bar(stat='identity',col="grey",alpha=.7)+theme_classic()+labs(x="")+theme(axis.text.x=element_text(angle=90))+geom_text(aes(label=Palu),cex=3,vjust=2)+scale_fill_brewer(palette="YlOrBr")


b%>%group_by(periodname)%>%summarise(Palu=sum(palu))->p

ggplot(p,aes(x=periodname,y=Palu))+geom_line(aes(group=1),size=2,color="lightblue")+geom_point(color="red")+theme_classic()+theme(axis.text.x=element_text(angle=0,size=8))+geom_text(aes(label=round(Palu,0)),size=3,vjust=-.5)+labs(x="")+theme(axis.text.x=element_text(angle=90))+coord_cartesian(y=c(20000,40000))

  
  #geom_bar(stat='identity',fill="lightblue",col="tomato",alpha=.7)+theme_classic()+labs(x="")+theme(axis.text.x=element_text(angle=90))+geom_text(aes(label=Palu),cex=3,vjust=2)
  • Percent of pregnant women who received doses of sulfadoxine/ pyrimethamine (S/P) for Intermittent Preventive Treatment (IPT) during ANC visits [2.4]

   

a<-datag
a$SP<-rowSums(a[,5:7])
a<-aggregate(a[,c(3,50)],list(a$periodname),sum)
a$cible<-a[,2]*3
tot2(a)
total[,2]<-NULL
#total$percent<-round(total$SP*100/total$cible,0)
#knitr::kable(total,"pandoc",align='lccr')

b<-datab
b$SP<-rowSums(b[,6:8],na.rm=T)
datag%>%group_by(zs)%>%summarise(spa=sum(SP1+SP2+SP3,na.rm=T),cpna=sum(CPN,na.rm=T))%>% mutate(SP=round(spa*100/(cpna*3)))->p
p$pop<-clus$pop
ggplot(p,aes(x=zs,y=SP,fill=pop))+geom_bar(stat='identity',col="grey",alpha=.7)+theme_classic()+labs(x="")+theme(axis.text.x=element_text(angle=90))+geom_text(aes(label=SP),cex=3,vjust=2)+scale_fill_brewer(palette="YlOrBr")


b%>%group_by(periodname)%>%summarise(spa=sum(SP1+SP2+SP3,na.rm=T),cpna=sum(CPN,na.rm=T))%>% mutate(SP=round(spa*100/(cpna*3)))->p

ggplot(p,aes(x=periodname,y=SP))+geom_line(aes(group=1),size=2,color="lightblue")+geom_point(color="red")+theme_classic()+theme(axis.text.x=element_text(angle=0,size=8))+geom_text(aes(label=round(SP,0)),size=3,vjust=-.5)+labs(x="",y="% SP")+theme(axis.text.x=element_text(angle=90))+coord_cartesian(y=c(50,90))

a <- data.frame(c("Katanga"),c("Haut Lomami"),c("91.0"),c("37518"),c("41245"),c("100"),c('91.0'))

#knitr::kable(a,"pandoc",align='lcccccr',col.names=c("Region","Province","Achievement",'Numerator','Denominator',"Target","Achievment Rate"))

 
 

   

MATERNAL, NEONATAL, AND CHILD HEALTH

    - Number of children under five years of age that received treatment for an acute respiratory infection from an appropriate provider [5 fee proxy]

a<-datag
a$Pneumonie<-rowSums(a[,22:23])
a<-aggregate(a[,c(18,66)],list(a$periodname),sum)
a$cible<-round(cibles$Pneumonie[3]/12)
tot2(a)
total[,2]<-NULL
#total$percent<-round(total$Pneumonie*100/total$cible,0)
#knitr::kable(total,"pandoc",align='lccr')

b<-datab
b$pneum<-rowSums(b[,23:24],na.rm=T)

names(datag)[22:23]<-c("Pneumonis","Pneumonig")
datag%>%group_by(zs)%>%summarise(pneum=sum(Pneumonis+Pneumonig,na.rm=T))->p
p$pop<-clus$pop
ggplot(p,aes(x=zs,y=pneum,fill=pop))+geom_bar(stat='identity',col="grey",alpha=.7)+theme_classic()+labs(x="")+theme(axis.text.x=element_text(angle=90))+geom_text(aes(label=pneum),cex=3,vjust=2)+scale_fill_brewer(palette="YlOrBr")


names(b)[23:24]<-c("Pneumonis","Pneumonig")
b%>%group_by(periodname)%>%summarise(pneum=sum(pneum,na.rm=T))->p

ggplot(p,aes(x=periodname,y=pneum))+geom_line(aes(group=1),size=2,color="lightblue")+geom_point(color="red")+theme_classic()+theme(axis.text.x=element_text(angle=0,size=8))+geom_text(aes(label=round(pneum,0)),size=3,vjust=-.5)+labs(x="",y="Pneumonie < 5")+theme(axis.text.x=element_text(angle=90))+coord_cartesian(y=c(5000,8500))

  
  #geom_bar(stat='identity',fill="lightblue",col="tomato",alpha=.7)+theme_classic()+labs(x="")+theme(axis.text.x=element_text(angle=90))+geom_text(aes(label=pneum),cex=3,vjust=2)
a <- data.frame(c("Katanga"),c("Haut Lomami"),c("19872"),c("21581"),c("92.1"))

#knitr::kable(a,"pandoc",align='lcccr',col.names=c("Region","Province","Achievement","Target","Achievment Rate(%)"))

 
 

   

a <- data.frame(c("Katanga"),c("Haut Lomami"),c("22958"),c("26045"),c("88.1"))

#knitr::kable(a,"pandoc",align='lcccr',col.names=c("Region","Province","Achievement","Target","Achievment Rate(%)"))

b<-datab
b$Mild<-rowSums(b[,30:36],na.rm=T)
names(datag)[29:35]<-paste0("mild",1:7)
datag%>%group_by(zs)%>%summarise(Mild=sum(mild1+mild2+mild3+mild4+mild5+mild6+mild7))->p
p$pop<-clus$pop
ggplot(p,aes(x=zs,y=Mild,fill=pop))+geom_bar(stat='identity',col="grey",alpha=.7)+theme_classic()+labs(x="")+theme(axis.text.x=element_text(angle=90))+geom_text(aes(label=Mild),cex=3,vjust=2)+scale_fill_brewer(palette="YlOrBr")


b%>%group_by(periodname)%>%summarise(Mild=sum(Mild))->p

ggplot(p,aes(x=periodname,y=Mild))+geom_line(aes(group=1),size=2,color="lightblue")+geom_point(color="red")+theme_classic()+theme(axis.text.x=element_text(angle=0,size=8))+geom_text(aes(label=round(Mild,0)),size=3,vjust=-.5)+labs(x="",title="MIILD", y="")+theme(axis.text.x=element_text(angle=90))+coord_cartesian(y=c(0,18000))

   

 

a<-datag
a$Diarrhee<-rowSums(a[,21:23])
a<-aggregate(a[,c(15,66)],list(a$periodname),sum)
a$cible<-round(cibles$Diarrhee[3]/12)
tot2(a)
total[,2]<-NULL
#total$percent<-round(total$Diarrhee*100/total$cible,0)
#knitr::kable(total,"pandoc",align='lccr')

b<-datab
b$Diarrh<-rowSums(b[,20:22],na.rm=T)
names(b)[22]<-"dias"
names(datag)[21]<-"dias"
datag%>%group_by(zs)%>%summarise(Diarrh=sum(Diarr_sev1+Diarr_sev2+dias,na.rm=T))->p
p$pop<-clus$pop
ggplot(p,aes(x=zs,y=Diarrh,fill=pop))+geom_bar(stat='identity',col="grey",alpha=.7)+theme_classic()+labs(x="")+theme(axis.text.x=element_text(angle=90))+geom_text(aes(label=Diarrh),cex=3,vjust=2)+scale_fill_brewer(palette="YlOrBr")


b%>%group_by(periodname)%>%summarise(Diarrh=sum(Diarrh))->p

ggplot(p,aes(x=periodname,y=Diarrh))+geom_line(aes(group=1),size=2,color="lightblue")+geom_point(color="red")+theme_classic()+theme(axis.text.x=element_text(angle=0,size=8))+geom_text(aes(label=round(Diarrh,0)),size=3,vjust=-.5)+labs(x="",y="",title="Diarrhee < 5 ans")+theme(axis.text.x=element_text(angle=90))+coord_cartesian(y=c(6000,12000))

NA
NA
a <- data.frame(c("Katanga"),c("Haut Lomami"),c("25543"),c("25486"),c("100.2"))

#knitr::kable(a,"pandoc",align='lcccr',col.names=c("Region","Province","Achievement","Target","Achievment Rate"))

 

   

a<-datag
a$Penta<-rowSums(a[,41:43])
a<-aggregate(a[,c(41,66)],list(a$periodname),sum,na.rm=T)
a$cible<-round(cibles$Penta[3]/12)
tot2(a)
total[,2]<-NULL
#total$percent<-round(total$Penta*100/total$cible,0)
#knitr::kable(total,"pandoc",align='lccr')

b<-datab
b$Penta<-rowSums(b[,27:29],na.rm=T)
names(datag)[26:28]<-paste0("Penta",1:3)
datag%>%group_by(zs)%>%summarise(Penta=sum(Penta1+Penta2+Penta3))->p
p$pop<-clus$pop
ggplot(p,aes(x=zs,y=Penta,fill=pop))+geom_bar(stat='identity',col="grey",alpha=.7)+theme_classic()+labs(x="")+theme(axis.text.x=element_text(angle=90))+geom_text(aes(label=Penta),cex=3,vjust=2)+scale_fill_brewer(palette="YlOrBr")


b%>%group_by(periodname)%>%summarise(Penta=sum(Penta))->p

ggplot(p,aes(x=periodname,y=Penta))+geom_line(aes(group=1),size=2,color="lightblue")+geom_point(color="red")+theme_classic()+theme(axis.text.x=element_text(angle=0,size=8))+geom_text(aes(label=round(Penta,0)),size=3,vjust=-.5)+labs(x="",y="",title="VACCIN PENTAVALENT")+theme(axis.text.x=element_text(angle=90))+coord_cartesian(y=c(6000,8000))

NA
a <- data.frame(c("Katanga"),c("Haut Lomami"),c("30652"),c("31353"),c("97.8"))

#knitr::kable(a,"pandoc",align='lcccr',col.names=c("Region","Province","Achievement","Target","Achievment Rate"))

 
 

a<-datag
a$VAR<-rowSums(a[,31:33])
a<-aggregate(a[,c(31,50)],list(a$periodname),sum)
a$cible<-round(cibles$VAR[3]/12)
tot2(a)
total[,2]<-NULL
#total$percent<-round(total$VAR*100/total$cible,0)
#knitr::kable(total,"pandoc",align='lccr')

b<-datab
b$Var<-rowSums(b[,42:44],na.rm=T)
names(datag)[41:43]<-paste0("Var",1:3)
names(datag)[47]<-"pop"
datag%>%group_by(zs)%>%summarise(Vara=sum(Var1+Var2+Var3,na.rm=T),popa=sum(pop,na.rm=T))%>% mutate(Var=round(Vara*120000/(popa*4)))->p
p$pop<-clus$pop
ggplot(p,aes(x=zs,y=Var,fill=pop))+geom_bar(stat='identity',col="grey",alpha=.7)+theme_classic()+labs(x="")+theme(axis.text.x=element_text(angle=90))+geom_text(aes(label=Var),cex=3,vjust=2)+scale_fill_brewer(palette="YlOrBr")


names(b)[42:44]<-paste0("Var",1:3)
names(b)[48]<-"pop"
b%>%group_by(periodname)%>%summarise(Vara=sum(Var,na.rm=T),popa=sum(pop,na.rm=T))%>% mutate(Var=round(Vara*120000/(popa*4)))->p

ggplot(p,aes(x=periodname,y=Var))+geom_line(aes(group=1),size=2,color="lightblue")+geom_point(color="red")+theme_classic()+theme(axis.text.x=element_text(angle=0,size=8))+geom_text(aes(label=round(Var,0)),size=3,vjust=-.5)+labs(x="",y="",title="% VAR")+theme(axis.text.x=element_text(angle=90))+coord_cartesian(y=c(40,90))

a <- data.frame(c("Katanga"),c("Haut Lomami"),c("31408"),c("30168"),c("96.1"))

#knitr::kable(a,"pandoc",align='lcccr',col.names=c("Region","Province","Achievement","Target","Achievment Rate"))

 

   

a <- data.frame(c("Katanga"),c("Haut Lomami"),c("91"),c("37518"),c("41245"),c("100"),c("91"))

#knitr::kable(a,"pandoc",align='lcccccr',col.names=c("Region","Province","Achievement","Numerator","Denominator","Target","Achievment Rate(%)"))

b<-datab
#b$Var<-rowSums(b[,42:44],na.rm=T)
#names(datag)[41:43]<-paste0("Var",1:3)
#names(datag)[47]<-"pop"
datag%>%group_by(zs)%>%summarise(cpna=sum(CPN,na.rm=T),popa=sum(pop,na.rm=T))%>% mutate(CPN=round(cpna*120000/(popa*4)))->p
p$pop<-clus$pop
ggplot(p,aes(x=zs,y=CPN,fill=pop))+geom_bar(stat='identity',col="grey",alpha=.7)+theme_classic()+labs(x="")+theme(axis.text.x=element_text(angle=90))+geom_text(aes(label=CPN),cex=3,vjust=2)+scale_fill_brewer(palette="YlOrBr")


#names(b)[42:44]<-paste0("Var",1:3)
names(b)[48]<-"pop"
b%>%group_by(periodname)%>%summarise(cpna=sum(CPN,na.rm=T),popa=sum(pop,na.rm=T))%>% mutate(CPN=round(cpna*120000/(popa*4)))->p

ggplot(p,aes(x=periodname,y=CPN))+geom_line(aes(group=1),size=2,color="lightblue")+geom_point(color="red")+theme_classic()+theme(axis.text.x=element_text(angle=0,size=8))+geom_text(aes(label=round(CPN,0)),size=3,vjust=-.5)+labs(x="",y="",title="% CPN1")+theme(axis.text.x=element_text(angle=90))+coord_cartesian(y=c(80,140))

 
 

 

a<-datag
a$CPN_4<-a[,4]
a<-aggregate(a[,c(4,50)],list(a$periodname),sum)
a$cible<-round(cibles$CPN4[3]/12)
tot2(a)
total[,2]<-NULL
#total$percent<-round(total$CPN_4*100/total$cible,0)
#knitr::kable(total,"pandoc",align='lccr')

b<-datab
#b$Var<-rowSums(b[,42:44],na.rm=T)
#names(datag)[41:43]<-paste0("Var",1:3)
#names(datag)[47]<-"pop"
datag%>%group_by(zs)%>%summarise(cpna=sum(CPN.4,na.rm=T),popa=sum(pop,na.rm=T))%>% mutate(CPN4=round(cpna*120000/(popa*4)))->p
p$pop<-clus$pop
ggplot(p,aes(x=zs,y=CPN4,fill=pop))+geom_bar(stat='identity',col="grey",alpha=.7)+theme_classic()+labs(x="")+theme(axis.text.x=element_text(angle=90))+geom_text(aes(label=CPN4),cex=3,vjust=2)+scale_fill_brewer(palette="YlOrBr")


#names(b)[42:44]<-paste0("Var",1:3)
names(b)[48]<-"pop"
b%>%group_by(periodname)%>%summarise(cpna=sum(CPN.4,na.rm=T),popa=sum(pop,na.rm=T))%>% mutate(CPN4=round(cpna*120000/(popa*4)))->p

ggplot(p,aes(x=periodname,y=CPN4))+geom_line(aes(group=1),size=2,color="lightblue")+geom_point(color="red")+theme_classic()+theme(axis.text.x=element_text(angle=0,size=8))+geom_text(aes(label=round(CPN4,0)),size=3,vjust=-.5)+labs(x="",y="",title="")+theme(axis.text.x=element_text(angle=90))+coord_cartesian(y=c(40,60))

a <- data.frame(c("Katanga"),c("Haut Lomami"),c("19860"),c("17897"),c("111"))

#knitr::kable(a,"pandoc",align='lcccr',col.names=c("Region","Province","Achievement","Target","Achievment Rate"))

 

a<-datag
a$Acc<-a[,8]
a<-aggregate(a[,c(8,37,50)],list(a$periodname),sum)
tot2(a)
total$Acc_P<-round(total$Acc*1200/(total[,3]*.04),0)
total$cible4<-round(total[,3]*.04/12)
total[,2:3]<-NULL
total$cible=90
total<-total[,c(1,2,4,5,3)]
#knitr::kable(total,"pandoc",align='lcccr',col.names=c("Mois","AccAssist","Cible4","Cible90","%"))

b<-datab
#b$Var<-rowSums(b[,42:44],na.rm=T)
names(datag)[8]<-"Accouch_ass"
names(datag)[62]<-"Accouch"
datag%>%group_by(zs)%>%summarise(Accoucha=sum(Accouch_ass,na.rm=T),acca=sum(Accouch,na.rm=T))%>% mutate(Accouch_ass=round(Accoucha*100/acca))->p
p$pop<-clus$pop
ggplot(p,aes(x=zs,y=Accouch_ass,fill=pop))+geom_bar(stat='identity',col="grey",alpha=.7)+theme_classic()+labs(x="")+theme(axis.text.x=element_text(angle=90))+geom_text(aes(label=Accouch_ass),cex=3,vjust=2)+scale_fill_brewer(palette="YlOrBr")


names(b)[9]<-"Accouch_ass"
names(b)[63]<-"Accouch"
b%>%group_by(periodname)%>%summarise(Accoucha=sum(Accouch_ass,na.rm=T),acca=sum(Accouch,na.rm=T))%>% mutate(Accouch_ass=round(Accoucha*100/acca))->p

ggplot(p,aes(x=periodname,y=Accouch_ass))+geom_line(aes(group=1),size=2,color="lightblue")+geom_point(color="red")+theme_classic()+theme(axis.text.x=element_text(angle=0,size=8))+geom_text(aes(label=round(Accouch_ass,0)),size=3,vjust=-.5)+labs(x="",y="",title="% Accouchements assistés")+theme(axis.text.x=element_text(angle=90))+coord_cartesian(y=c(40,140))

a <- data.frame(c("Katanga"),c("Haut Lomami"),c("76"),c("31364"),c("41245"),c("90"),c("84.5"))

#knitr::kable(a,"pandoc",align='lcccccr',col.names=c("Region","Province","Q1 Achievement","Numerator","Denominator","Target","Achievment Rate"))

 

 

a <- data.frame(c("Katanga"),c("Haut Lomami"),c("1584"),c("2178"),c("72.7"))

#knitr::kable(a,"pandoc",align='lcccr',col.names=c("Region","Province","Achievement","Target","Achievment Rate"))

b<-datab
datag%>%group_by(zs)%>%summarise(GATPA=sum(GATPA))->p
p$pop<-clus$pop
ggplot(p,aes(x=zs,y=GATPA,fill=pop))+geom_bar(stat='identity',col="grey",alpha=.7)+theme_classic()+labs(x="")+theme(axis.text.x=element_text(angle=90))+geom_text(aes(label=GATPA),cex=3,vjust=2)+scale_fill_brewer(palette="YlOrBr")


b%>%group_by(periodname)%>%summarise(GATPA=sum(GATPA,na.rm=T))->p

ggplot(p,aes(x=periodname,y=GATPA))+geom_line(aes(group=1),size=2,color="lightblue")+geom_point(color="red")+theme_classic()+theme(axis.text.x=element_text(angle=0,size=8))+geom_text(aes(label=round(GATPA,0)),size=3,vjust=-.5)+labs(x="", y="")+theme(axis.text.x=element_text(angle=90))+coord_cartesian(y=c(100,900))

   

a<-datag
a$Soins_ess<-a[,29]
a<-aggregate(a[,c(9,29,50)],list(a$periodname),sum)
tot2(a)
total$cible<-100
#total$Soess_P<-round(total$Soins_ess*100/total[,2])
total[,3]<-NULL
total$cible=100
#knitr::kable(total,"pandoc",align='lcccr',col.names=c("Mois","NaissViv","SoinsEss","Cible","%"))

b<-datab
#b$Var<-rowSums(b[,42:44],na.rm=T)
names(datag)[38]<-"Soess"
names(datag)[11]<-"Naissv"
datag%>%group_by(zs)%>%summarise(Soessa=sum(Soess,na.rm=T),naissva=sum(Naissv,na.rm=T))%>% mutate(Soess=round(Soessa*100/naissva))->p
p$pop<-clus$pop
ggplot(p,aes(x=zs,y=Soess,fill=pop))+geom_bar(stat='identity',col="grey",alpha=.7)+theme_classic()+labs(x="")+theme(axis.text.x=element_text(angle=90))+geom_text(aes(label=Soess),cex=3,vjust=2)+scale_fill_brewer(palette="YlOrBr")


names(b)[39]<-"Soess"
names(b)[12]<-"Naissv"
b%>%group_by(periodname)%>%summarise(Soessa=sum(Soess,na.rm=T),naissva=sum(Naissv,na.rm=T))%>% mutate(Soess=round(Soessa*100/naissva))->p

ggplot(p,aes(x=periodname,y=Soess))+geom_line(aes(group=1),size=2,color="lightblue")+geom_point(color="red")+theme_classic()+theme(axis.text.x=element_text(angle=0,size=8))+geom_text(aes(label=round(Soess,0)),size=3,vjust=-.5)+labs(x="",y="")+theme(axis.text.x=element_text(angle=90))+coord_cartesian(y=c(40,100))

a <- data.frame(c("Katanga"),c("Haut Lomami"),c("90"),c("100"),c("89.9"))

#knitr::kable(a,"pandoc",align='lcccr',col.names=c("Region","Province","Achievement","Target","Achievment Rate"))

 

   

a<-datag
a$CPON_1<-a[,28]
a<-aggregate(a[,c(28,50)],list(a$periodname),sum)
a$cible<-round(as.numeric(as.character(cibles$CPoN1[3]))/12)
tot2(a)
total[,2]<-NULL
#total$percent<-round(total$CPON_1*100/total$cible,0)
#knitr::kable(total,"pandoc",align='lccr')

b<-datab
names(datag)[37]<-"Cpon1"
datag%>%group_by(zs)%>%summarise(Cpon1=sum(Cpon1))->p
p$pop<-clus$pop
ggplot(p,aes(x=zs,y=Cpon1,fill=pop))+geom_bar(stat='identity',col="grey",alpha=.7)+theme_classic()+labs(x="")+theme(axis.text.x=element_text(angle=90))+geom_text(aes(label=Cpon1),cex=3,vjust=2)+scale_fill_brewer(palette="YlOrBr")


names(b)[38]<-"Cpon1"
b%>%group_by(periodname)%>%summarise(Cpon1=sum(Cpon1,na.rm=T))->p

ggplot(p,aes(x=periodname,y=Cpon1))+geom_line(aes(group=1),size=2,color="lightblue")+geom_point(color="red")+theme_classic()+theme(axis.text.x=element_text(angle=0,size=8))+geom_text(aes(label=round(Cpon1,0)),size=3,vjust=-.5)+labs(x="", y="")+theme(axis.text.x=element_text(angle=90))+coord_cartesian(y=c(8000,13000))

 

a <- data.frame(c("Katanga"),c("Haut Lomami"),c("28028"),c("23559"),c("119"))

#knitr::kable(a,"pandoc",align='lcccr',col.names=c("Region","Province","Achievement","Target","Achievment Rate(%)"))

 

 

 

a <- data.frame(c("Katanga"),c("Haut Lomami"),c("2.3"),c("4"),c("142.8"))

#knitr::kable(a,"pandoc",align='lcccr',col.names=c("Region","Province","Achievement","Target","Achievment Rate(%)"))

b<-datab
#b$Var<-rowSums(b[,42:44],na.rm=T)
names(datag)[75:77]<-paste0("Penta_1",1:3)
names(datag)[26:28]<-paste0("Penta_3",1:3)
datag%>%group_by(zs)%>%summarise(Penta1=sum(Penta_11+Penta_12+Penta_13,na.rm=T),Penta3=sum(Penta_31+Penta_32+Penta_33,na.rm=T))%>% mutate(Drop=round((Penta1-Penta3)/Penta1,2))->p
p$pop<-clus$pop
ggplot(p,aes(x=zs,y=Drop,fill=pop))+geom_bar(stat='identity',col="grey",alpha=.7)+theme_classic()+labs(x="")+theme(axis.text.x=element_text(angle=90))+geom_text(aes(label=Drop),cex=3,vjust=2)+scale_fill_brewer(palette="YlOrBr")


names(b)[76:78]<-paste0("Penta_1",1:3)
names(b)[27:29]<-paste0("Penta_3",1:3)
b%>%group_by(periodname)%>%summarise(Penta1=sum(Penta_11+Penta_12+Penta_13,na.rm=T),Penta3=sum(Penta_31+Penta_32+Penta_33,na.rm=T))%>% mutate(Drop=round((Penta1-Penta3)/Penta1,2))->p

ggplot(p,aes(x=periodname,y=Drop))+geom_line(aes(group=1),size=2,color="lightblue")+geom_point(color="red")+theme_classic()+theme(axis.text.x=element_text(angle=0,size=8))+geom_text(aes(label=round(Drop,2)),size=3,vjust=-.5)+labs(x="",y="")+theme(axis.text.x=element_text(angle=90))+coord_cartesian(y=c(0,1.5))

 

     

NUTRITION

 

a <- data.frame(c("Katanga"),c("Haut Lomami"),c("353091"),c("158456"),c("44.9"))

#knitr::kable(a,"pandoc",align='lcccr',col.names=c("Region","Province","Achievement","Target","Achievment Rate(%)"))

b<-datab
names(datag)[40]<-"CPS"
datag%>%group_by(zs)%>%summarise(CPS=sum(CPS))->p
p$pop<-clus$pop
ggplot(p,aes(x=zs,y=CPS,fill=pop))+geom_bar(stat='identity',col="grey",alpha=.7)+theme_classic()+labs(x="")+theme(axis.text.x=element_text(angle=90))+geom_text(aes(label=CPS),cex=3,vjust=2)+scale_fill_brewer(palette="YlOrBr")


names(b)[41]<-"CPS"
b%>%group_by(periodname)%>%summarise(CPS=sum(CPS,na.rm=T))->p

ggplot(p,aes(x=periodname,y=CPS))+geom_line(aes(group=1),size=2,color="lightblue")+geom_point(color="red")+theme_classic()+theme(axis.text.x=element_text(angle=0,size=8))+geom_text(aes(label=round(CPS,0)),size=3,vjust=-.5)+labs(x="", y="")+theme(axis.text.x=element_text(angle=90))+coord_cartesian(y=c(50000,70000))

 

     

REPRODUCTIVE HEALTH/FAMILY PLANNING

  - Number of new acceptors using modern contraceptive methods in USG-supported facilities [3 fee proxy]

a<-datag
a$Accept<-(a[,10])
a<-aggregate(a[,c(10,50)],list(a$periodname),sum)
a$cible<-round(cibles$Nouvelle.acceptante[3]/12)
tot2(a)
total[,2]<-NULL
#total$percent<-round(total$Accept*100/total$cible,0)
#knitr::kable(total,"pandoc",align='lccr')

b<-datab
names(datag)[12]<-"Accept"
datag%>%group_by(zs)%>%summarise(Accept=sum(Accept))->p
p$pop<-clus$pop
ggplot(p,aes(x=zs,y=Accept,fill=pop))+geom_bar(stat='identity',col="grey",alpha=.7)+theme_classic()+labs(x="")+theme(axis.text.x=element_text(angle=90))+geom_text(aes(label=Accept),cex=3,vjust=2)+scale_fill_brewer(palette="YlOrBr")


names(b)[13]<-"Accept"
b%>%group_by(periodname)%>%summarise(Accept=sum(Accept,na.rm=T))->p

ggplot(p,aes(x=periodname,y=Accept))+geom_line(aes(group=1),size=2,color="lightblue")+geom_point(color="red")+theme_classic()+theme(axis.text.x=element_text(angle=0,size=8))+geom_text(aes(label=round(Accept,0)),size=3,vjust=-.5)+labs(x="", y="")+theme(axis.text.x=element_text(angle=90))+coord_cartesian(y=c(10000,23000))

a <- data.frame(c("Katanga"),c("Haut Lomami"),c("33372"),c("20405"),c("163.5"))

#knitr::kable(a,"pandoc",align='lcccr',col.names=c("Region","Province","Achievement","Target","Achievment Rate(%)"))

 

 

TUBERCULOSIS

WATER, SANITATION, AND HYGIENE

4.REPORTING BY PROGRAM ACTIVITIES

cfr rapport programmatique

LS0tDQp0aXRsZTogIlJBUFBPUlRfUUlfSEwiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UpDQpgYGANCg0KJm5ic3A7DQoNCg0KIyMgMy4gUkVQT1JUSU5HIEJZIFBST0dSQU0gQVJFQQ0KJm5ic3A7DQoNCmBgYHtyLG1lc3NhZ2U9Rn0NCmRhdGFiPC1yZWFkLmNzdigiREFUQUIuY3N2IikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQoNCiNiPC1uYW1lcyhkYXRhYikNCiNiPC1nc3ViKCJcXC4rIiwiXFwuIixiKQ0KI2Q8LSdzb21ldGhpbmcnDQojZm9yIChpIGluIDE6NSl7ZFtpXTwtYltpXX0NCiNmb3IgKGkgaW4gNjpsZW5ndGgoYikpew0KICNmPC1zdHJzcGxpdChiW2ldLCJcXC4iKQ0KICAjZjwtdW5saXN0KGYpDQogICNkW2ldPC1wYXN0ZShmWzRdLGZbNV0sZltsZW5ndGgoZildLHNlcD0iLiIpfQ0KICNkWzQ6NV08LWdzdWIoIltBXFwuMlxcLjFcXC5dIiwnJyxkWzQ6NV0pDQogDQpuYW1lcyhkYXRhYilbNjo4XTwtcGFzdGUwKCJTUCIsMTozKQ0KbmFtZXMoZGF0YWIpWzI1OjI2XTwtcGFzdGUwKCJwYWx1IixjKCJzIiwiZyIpLHNlcD0iXyIpDQpuYW1lcyhkYXRhYilbMjA6MjFdPC1wYXN0ZTAoIkRpYXJyX3NldiIsMToyKQ0KDQojZGF0YWckcGVyaW9kbmFtZTwtYXMuY2hhcmFjdGVyKGRhdGFnJHBlcmlvZG5hbWUpDQojZGF0YWckcGVyaW9kbmFtZVtkYXRhZyRwZXJpb2RuYW1lPT0iSmFudmllciJdPC0iMS5KYW52Ig0KZGF0YWIkcGVyaW9kbmFtZTwtcGFzdGUwKG1hdGNoKGRhdGFiJHBlcmlvZG5hbWUsYygiT2N0b2JyZSIsIk5vdmVtYnJlIiwiRMOpY2VtYnJlIiwiSmFudmllciIsIkbDqXZyaWVyIiwiTWFycyIpKSwiLiIsZGF0YWIkcGVyaW9kbmFtZSkNCmRhdGFnPC1kYXRhYltkYXRhYiRwZXJpb2RuYW1lICVpbiUgYygiNC5KYW52aWVyIiwiNS5Gw6l2cmllciIsIjYuTWFycyIpLF0NCiNkYXRhZyRwZXJpb2RuYW1lW2RhdGFnJHBlcmlvZG5hbWU9PSJGw6l2cmllciJdPC0iMi5GZXYiDQojZGF0YWckcGVyaW9kbmFtZVtkYXRhZyRwZXJpb2RuYW1lPT0iTWFycyJdPC0iMy5NYXJzIg0KbmFtZXMoZGF0YWIpWzMxOjM1XTwtcGFzdGUwKCJNaWxkQ3BzIiwxOjUpDQojc2luaygiTmFtZXNiLnR4dCIpDQojbmFtZXMoZGF0YWIpDQojc2luaygpDQoNCmRhdGFnPC1hZ2dyZWdhdGUoZGF0YWdbLDQ6bmNvbChkYXRhZyldLGxpc3QoZGF0YWckenMsZGF0YWckcGVyaW9kbmFtZSksc3VtLG5hLnJtPVQpDQpuYW1lcyhkYXRhZylbMToyXTwtYygienMiLCJwZXJpb2RuYW1lIikNCg0KI3NpbmsoIk5hbWVzZy50eHQiKQ0KI25hbWVzKGRhdGFnKQ0KI3NpbmsoKQ0KDQp0b3QyIDwtIGZ1bmN0aW9uKHhkKXsNCiAgcDwtYyhhcy5jaGFyYWN0ZXIoeGRbLDFdKSwnVG90YWwnKQ0KICBhPC1hcHBseSh4ZFssMjpuY29sKHhkKV0sMixzdW0sbmEucm09VCkNCiAgYTwtcmJpbmQoeGRbLDI6bmNvbCh4ZCldLGEpDQogIHU8LWRhdGEuZnJhbWUocCxhKQ0KICBuYW1lcyh1KVsxXTwtIk1vaXMiDQogIGFzc2lnbigidG90YWwiLHUsZW52aXI9Lkdsb2JhbEVudikNCn0NCg0KY2libGVzPC1yZWFkLmNzdigiQzovVXNlcnMvTXV5dW5nYVAvRG9jdW1lbnRzL1BST1NBTkkgVVNBSUQvUVVBUlRFUiBSRVBPUlQvWTIgUkVQT1JUL0NJQkxFUzIuY3N2IikNCmNpYmxlYTwtcmVhZC5jc3YyKCJDOi9Vc2Vycy9NdXl1bmdhUC9Eb2N1bWVudHMvUFJPU0FOSSBVU0FJRC9BTkFMWVNJUy9ZMi9jaWJsZXMuY3N2IikNCiNjaWJsZWc8LWFnZ3JlZ2F0ZShjaWJsZXNbLDM6bmNvbChjaWJsZXMpXSxsaXN0KGNpYmxlcyRHcm91cC4yKSxzdW0sbmEucm09VCkNCiNuYW1lcyhjaWJsZWcpWzFdPC0nenMnDQpkYXRhYzwtcmVhZC5jc3YoIkRBVEFDLmNzdiIpDQojbmFtZXMoZGF0YWMpPC1uYW1lcyhkYXRhYikNCmNsdXM8LWRhdGEuZnJhbWUoenM9dW5pcXVlKGRhdGFiJHpzKSkNCmNsdXMkcG9wPC1pZmVsc2UoY2x1cyR6cyVpbiVjKCJCYWthIiwiS2F5YW1iYSIsIktpbmRhIiwiTHdhbWJhIiksIjFMb3ciLGlmZWxzZShjbHVzJHpzJWluJWMoIkJ1dHVtYmEiLCJLYWJvbmRvRCIsIkthbWluYSIsIktpbmtvbmRqYSIsIk11a2FuZ2EiLCJTb25nYSIpLCIyTWlkZGxlIiwiM0hpZ2giKSkNCmNsdXM8LWNsdXNbb3JkZXIoY2x1cyR6cyksXQ0KDQpgYGANCiAgICANCg0KIyMjIE1BTEFSSUENCg0KJm5ic3A7DQoNCg0KJm5ic3A7DQotICoqTnVtYmVyIG9mIGNoaWxkcmVuIHVuZGVyIDUgeWVhcnMgb2YgYWdlIHdpdGggY29uZmlybWVkIG1hbGFyaWEgd2hvIHJlY2VpdmVkIHRyZWF0bWVudCBmb3IgbWFsYXJpYSBmcm9tIGFuIGFwcHJvcHJpYXRlIHByb3ZpZGVyIGluIFVTRy1zdXBwb3J0ZWQgYXJlYXMgWzE1IGZlZSBwcm94eV0qKiAgDQoNCiZuYnNwOw0KDQpgYGB7cn0NCmEgPC0gZGF0YS5mcmFtZShjKCJLYXRhbmdhIiksYygiSGF1dCBMb21hbWkiKSxjKCI5NDA3IiksYygiNzQ0MzAiKSxjKCIxMjYuNCIpKQ0KDQoja25pdHI6OmthYmxlKGEsInBhbmRvYyIsYWxpZ249J2xjY2NyJyxjb2wubmFtZXM9YygiUmVnaW9uIiwiUHJvdmluY2UiLCJBY2hpZXZlbWVudCIsIlRhcmdldCIsIkFjaGlldm1lbnQgUmF0ZSIpKQ0KDQpgYGANCg0KJm5ic3A7DQouICANCiZuYnNwOw0KDQpgYGB7cixyZXN1bHRzPSJoaWRlIn0NCmE8LWRhdGFnDQphJHBhbHU8LXJvd1N1bXMoYVssMjQ6MjVdKQ0KYTwtYWdncmVnYXRlKGFbLGMoMjAsNjYpXSxsaXN0KGEkcGVyaW9kbmFtZSksc3VtKQ0KYSRjaWJsZTwtcm91bmQoY2libGVzJFBhbHVkaXNtZVszXS8xMikNCnRvdDIoYSkNCnRvdGFsWywyXTwtTlVMTA0KI3RvdGFsJHBlcmNlbnQ8LXJvdW5kKHRvdGFsJHBhbHUqMTAwL3RvdGFsJGNpYmxlLDApDQoja25pdHI6OmthYmxlKHRvdGFsLCJwYW5kb2MiLGFsaWduPSdsY2NyJykNCmI8LWRhdGFiDQpiJHBhbHU8LXJvd1N1bXMoYlssMjU6MjZdLG5hLnJtPVQpDQojZGF0YWckUGFsdTwtcm93U3VtcyhkYXRhZ1ssMjA6MjFdLG5hLnJtPVQpDQpkYXRhZyU+JWdyb3VwX2J5KHpzKSU+JXN1bW1hcmlzZShQYWx1PXN1bShwYWx1c18rcGFsdWdfKSktPnANCnAkcG9wPC1jbHVzJHBvcA0KZ2dwbG90KHAsYWVzKHg9enMseT1QYWx1LGZpbGw9cG9wKSkrZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknLGNvbD0iZ3JleSIsYWxwaGE9LjcpK3RoZW1lX2NsYXNzaWMoKStsYWJzKHg9IiIpK3RoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCkpK2dlb21fdGV4dChhZXMobGFiZWw9UGFsdSksY2V4PTMsdmp1c3Q9Mikrc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iWWxPckJyIikNCg0KYiU+JWdyb3VwX2J5KHBlcmlvZG5hbWUpJT4lc3VtbWFyaXNlKFBhbHU9c3VtKHBhbHUpKS0+cA0KDQpnZ3Bsb3QocCxhZXMoeD1wZXJpb2RuYW1lLHk9UGFsdSkpK2dlb21fbGluZShhZXMoZ3JvdXA9MSksc2l6ZT0yLGNvbG9yPSJsaWdodGJsdWUiKStnZW9tX3BvaW50KGNvbG9yPSJyZWQiKSt0aGVtZV9jbGFzc2ljKCkrdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTAsc2l6ZT04KSkrZ2VvbV90ZXh0KGFlcyhsYWJlbD1yb3VuZChQYWx1LDApKSxzaXplPTMsdmp1c3Q9LS41KStsYWJzKHg9IiIpK3RoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCkpK2Nvb3JkX2NhcnRlc2lhbih5PWMoMjAwMDAsNDAwMDApKQ0KICANCiAgI2dlb21fYmFyKHN0YXQ9J2lkZW50aXR5JyxmaWxsPSJsaWdodGJsdWUiLGNvbD0idG9tYXRvIixhbHBoYT0uNykrdGhlbWVfY2xhc3NpYygpK2xhYnMoeD0iIikrdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkrZ2VvbV90ZXh0KGFlcyhsYWJlbD1QYWx1KSxjZXg9Myx2anVzdD0yKQ0KDQpgYGANCg0KLQkqKlBlcmNlbnQgb2YgcHJlZ25hbnQgd29tZW4gd2hvIHJlY2VpdmVkIGRvc2VzIG9mIHN1bGZhZG94aW5lLyBweXJpbWV0aGFtaW5lIChTL1ApIGZvciBJbnRlcm1pdHRlbnQgUHJldmVudGl2ZSBUcmVhdG1lbnQgKElQVCkgZHVyaW5nIEFOQyB2aXNpdHMgWzIuNF0qKg0KDQombmJzcDsNCiZuYnNwOw0KDQpgYGB7cixyZXN1bHRzPSJoaWRlIn0NCmE8LWRhdGFnDQphJFNQPC1yb3dTdW1zKGFbLDU6N10pDQphPC1hZ2dyZWdhdGUoYVssYygzLDUwKV0sbGlzdChhJHBlcmlvZG5hbWUpLHN1bSkNCmEkY2libGU8LWFbLDJdKjMNCnRvdDIoYSkNCnRvdGFsWywyXTwtTlVMTA0KI3RvdGFsJHBlcmNlbnQ8LXJvdW5kKHRvdGFsJFNQKjEwMC90b3RhbCRjaWJsZSwwKQ0KI2tuaXRyOjprYWJsZSh0b3RhbCwicGFuZG9jIixhbGlnbj0nbGNjcicpDQoNCmI8LWRhdGFiDQpiJFNQPC1yb3dTdW1zKGJbLDY6OF0sbmEucm09VCkNCmRhdGFnJT4lZ3JvdXBfYnkoenMpJT4lc3VtbWFyaXNlKHNwYT1zdW0oU1AxK1NQMitTUDMsbmEucm09VCksY3BuYT1zdW0oQ1BOLG5hLnJtPVQpKSU+JSBtdXRhdGUoU1A9cm91bmQoc3BhKjEwMC8oY3BuYSozKSkpLT5wDQpwJHBvcDwtY2x1cyRwb3ANCmdncGxvdChwLGFlcyh4PXpzLHk9U1AsZmlsbD1wb3ApKStnZW9tX2JhcihzdGF0PSdpZGVudGl0eScsY29sPSJncmV5IixhbHBoYT0uNykrdGhlbWVfY2xhc3NpYygpK2xhYnMoeD0iIikrdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkrZ2VvbV90ZXh0KGFlcyhsYWJlbD1TUCksY2V4PTMsdmp1c3Q9Mikrc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iWWxPckJyIikNCg0KYiU+JWdyb3VwX2J5KHBlcmlvZG5hbWUpJT4lc3VtbWFyaXNlKHNwYT1zdW0oU1AxK1NQMitTUDMsbmEucm09VCksY3BuYT1zdW0oQ1BOLG5hLnJtPVQpKSU+JSBtdXRhdGUoU1A9cm91bmQoc3BhKjEwMC8oY3BuYSozKSkpLT5wDQoNCmdncGxvdChwLGFlcyh4PXBlcmlvZG5hbWUseT1TUCkpK2dlb21fbGluZShhZXMoZ3JvdXA9MSksc2l6ZT0yLGNvbG9yPSJsaWdodGJsdWUiKStnZW9tX3BvaW50KGNvbG9yPSJyZWQiKSt0aGVtZV9jbGFzc2ljKCkrdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTAsc2l6ZT04KSkrZ2VvbV90ZXh0KGFlcyhsYWJlbD1yb3VuZChTUCwwKSksc2l6ZT0zLHZqdXN0PS0uNSkrbGFicyh4PSIiLHk9IiUgU1AiKSt0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9OTApKStjb29yZF9jYXJ0ZXNpYW4oeT1jKDUwLDkwKSkNCg0KYGBgDQoNCg0KYGBge3J9DQphIDwtIGRhdGEuZnJhbWUoYygiS2F0YW5nYSIpLGMoIkhhdXQgTG9tYW1pIiksYygiOTEuMCIpLGMoIjM3NTE4IiksYygiNDEyNDUiKSxjKCIxMDAiKSxjKCc5MS4wJykpDQoNCiNrbml0cjo6a2FibGUoYSwicGFuZG9jIixhbGlnbj0nbGNjY2NjcicsY29sLm5hbWVzPWMoIlJlZ2lvbiIsIlByb3ZpbmNlIiwiQWNoaWV2ZW1lbnQiLCdOdW1lcmF0b3InLCdEZW5vbWluYXRvcicsIlRhcmdldCIsIkFjaGlldm1lbnQgUmF0ZSIpKQ0KDQpgYGANCg0KJm5ic3A7ICANCiZuYnNwOyAgDQoNCg0KDQombmJzcDsNCiZuYnNwOw0KDQojIyBNQVRFUk5BTCwgTkVPTkFUQUwsIEFORCBDSElMRCBIRUFMVEgNCiZuYnNwOw0KJm5ic3A7DQotCSoqTnVtYmVyIG9mIGNoaWxkcmVuIHVuZGVyIGZpdmUgeWVhcnMgb2YgYWdlIHRoYXQgcmVjZWl2ZWQgdHJlYXRtZW50IGZvciBhbiBhY3V0ZSByZXNwaXJhdG9yeSBpbmZlY3Rpb24gZnJvbSBhbiBhcHByb3ByaWF0ZSBwcm92aWRlciBbNSBmZWUgcHJveHldKiogDQpgYGB7cn0NCmE8LWRhdGFnDQphJFBuZXVtb25pZTwtcm93U3VtcyhhWywyMjoyM10pDQphPC1hZ2dyZWdhdGUoYVssYygxOCw2NildLGxpc3QoYSRwZXJpb2RuYW1lKSxzdW0pDQphJGNpYmxlPC1yb3VuZChjaWJsZXMkUG5ldW1vbmllWzNdLzEyKQ0KdG90MihhKQ0KdG90YWxbLDJdPC1OVUxMDQojdG90YWwkcGVyY2VudDwtcm91bmQodG90YWwkUG5ldW1vbmllKjEwMC90b3RhbCRjaWJsZSwwKQ0KI2tuaXRyOjprYWJsZSh0b3RhbCwicGFuZG9jIixhbGlnbj0nbGNjcicpDQoNCmI8LWRhdGFiDQpiJHBuZXVtPC1yb3dTdW1zKGJbLDIzOjI0XSxuYS5ybT1UKQ0KDQpuYW1lcyhkYXRhZylbMjI6MjNdPC1jKCJQbmV1bW9uaXMiLCJQbmV1bW9uaWciKQ0KZGF0YWclPiVncm91cF9ieSh6cyklPiVzdW1tYXJpc2UocG5ldW09c3VtKFBuZXVtb25pcytQbmV1bW9uaWcsbmEucm09VCkpLT5wDQpwJHBvcDwtY2x1cyRwb3ANCmdncGxvdChwLGFlcyh4PXpzLHk9cG5ldW0sZmlsbD1wb3ApKStnZW9tX2JhcihzdGF0PSdpZGVudGl0eScsY29sPSJncmV5IixhbHBoYT0uNykrdGhlbWVfY2xhc3NpYygpK2xhYnMoeD0iIikrdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkrZ2VvbV90ZXh0KGFlcyhsYWJlbD1wbmV1bSksY2V4PTMsdmp1c3Q9Mikrc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iWWxPckJyIikNCg0KbmFtZXMoYilbMjM6MjRdPC1jKCJQbmV1bW9uaXMiLCJQbmV1bW9uaWciKQ0KYiU+JWdyb3VwX2J5KHBlcmlvZG5hbWUpJT4lc3VtbWFyaXNlKHBuZXVtPXN1bShwbmV1bSxuYS5ybT1UKSktPnANCg0KZ2dwbG90KHAsYWVzKHg9cGVyaW9kbmFtZSx5PXBuZXVtKSkrZ2VvbV9saW5lKGFlcyhncm91cD0xKSxzaXplPTIsY29sb3I9ImxpZ2h0Ymx1ZSIpK2dlb21fcG9pbnQoY29sb3I9InJlZCIpK3RoZW1lX2NsYXNzaWMoKSt0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9MCxzaXplPTgpKStnZW9tX3RleHQoYWVzKGxhYmVsPXJvdW5kKHBuZXVtLDApKSxzaXplPTMsdmp1c3Q9LS41KStsYWJzKHg9IiIseT0iUG5ldW1vbmllIDwgNSIpK3RoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCkpK2Nvb3JkX2NhcnRlc2lhbih5PWMoNTAwMCw4NTAwKSkNCiAgDQogICNnZW9tX2JhcihzdGF0PSdpZGVudGl0eScsZmlsbD0ibGlnaHRibHVlIixjb2w9InRvbWF0byIsYWxwaGE9LjcpK3RoZW1lX2NsYXNzaWMoKStsYWJzKHg9IiIpK3RoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCkpK2dlb21fdGV4dChhZXMobGFiZWw9cG5ldW0pLGNleD0zLHZqdXN0PTIpDQpgYGANCg0KDQpgYGB7cn0NCmEgPC0gZGF0YS5mcmFtZShjKCJLYXRhbmdhIiksYygiSGF1dCBMb21hbWkiKSxjKCIxOTg3MiIpLGMoIjIxNTgxIiksYygiOTIuMSIpKQ0KDQoja25pdHI6OmthYmxlKGEsInBhbmRvYyIsYWxpZ249J2xjY2NyJyxjb2wubmFtZXM9YygiUmVnaW9uIiwiUHJvdmluY2UiLCJBY2hpZXZlbWVudCIsIlRhcmdldCIsIkFjaGlldm1lbnQgUmF0ZSglKSIpKQ0KDQpgYGANCg0KJm5ic3A7ICANCiZuYnNwOyAgDQoNCg0KDQoNCiZuYnNwOw0KJm5ic3A7DQoNCi0gKipOdW1iZXIgb2YgaW5zZWN0aWNpZGUtdHJlYXRlZCBuZXRzIChJVE4pIGRpc3RyaWJ1dGVkIGR1cmluZyBhbnRlbmF0YWwgYW5kL29yIGNoaWxkIGltbXVuaXphdGlvbiB2aXNpdHMqKg0KDQoNCmBgYHtyfQ0KYSA8LSBkYXRhLmZyYW1lKGMoIkthdGFuZ2EiKSxjKCJIYXV0IExvbWFtaSIpLGMoIjIyOTU4IiksYygiMjYwNDUiKSxjKCI4OC4xIikpDQoNCiNrbml0cjo6a2FibGUoYSwicGFuZG9jIixhbGlnbj0nbGNjY3InLGNvbC5uYW1lcz1jKCJSZWdpb24iLCJQcm92aW5jZSIsIkFjaGlldmVtZW50IiwiVGFyZ2V0IiwiQWNoaWV2bWVudCBSYXRlKCUpIikpDQoNCmI8LWRhdGFiDQpiJE1pbGQ8LXJvd1N1bXMoYlssMzA6MzZdLG5hLnJtPVQpDQpuYW1lcyhkYXRhZylbMjk6MzVdPC1wYXN0ZTAoIm1pbGQiLDE6NykNCmRhdGFnJT4lZ3JvdXBfYnkoenMpJT4lc3VtbWFyaXNlKE1pbGQ9c3VtKG1pbGQxK21pbGQyK21pbGQzK21pbGQ0K21pbGQ1K21pbGQ2K21pbGQ3KSktPnANCnAkcG9wPC1jbHVzJHBvcA0KZ2dwbG90KHAsYWVzKHg9enMseT1NaWxkLGZpbGw9cG9wKSkrZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknLGNvbD0iZ3JleSIsYWxwaGE9LjcpK3RoZW1lX2NsYXNzaWMoKStsYWJzKHg9IiIpK3RoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCkpK2dlb21fdGV4dChhZXMobGFiZWw9TWlsZCksY2V4PTMsdmp1c3Q9Mikrc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iWWxPckJyIikNCg0KYiU+JWdyb3VwX2J5KHBlcmlvZG5hbWUpJT4lc3VtbWFyaXNlKE1pbGQ9c3VtKE1pbGQpKS0+cA0KDQpnZ3Bsb3QocCxhZXMoeD1wZXJpb2RuYW1lLHk9TWlsZCkpK2dlb21fbGluZShhZXMoZ3JvdXA9MSksc2l6ZT0yLGNvbG9yPSJsaWdodGJsdWUiKStnZW9tX3BvaW50KGNvbG9yPSJyZWQiKSt0aGVtZV9jbGFzc2ljKCkrdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTAsc2l6ZT04KSkrZ2VvbV90ZXh0KGFlcyhsYWJlbD1yb3VuZChNaWxkLDApKSxzaXplPTMsdmp1c3Q9LS41KStsYWJzKHg9IiIsdGl0bGU9Ik1JSUxEIiwgeT0iIikrdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkrY29vcmRfY2FydGVzaWFuKHk9YygwLDE4MDAwKSkNCg0KYGBgDQoNCiZuYnNwOw0KJm5ic3A7DQoNCg0KJm5ic3A7DQoNCi0JKipOdW1iZXIgb2YgY2FzZXMgb2YgY2hpbGQgZGlhcnJoZWEgdHJlYXRlZCBpbiBVU0ctc3VwcG9ydGVkIHByb2dyYW1zIFs3IGZlZSBwcm94eV0qKg0KJm5ic3A7DQpgYGB7cn0NCmE8LWRhdGFnDQphJERpYXJyaGVlPC1yb3dTdW1zKGFbLDIxOjIzXSkNCmE8LWFnZ3JlZ2F0ZShhWyxjKDE1LDY2KV0sbGlzdChhJHBlcmlvZG5hbWUpLHN1bSkNCmEkY2libGU8LXJvdW5kKGNpYmxlcyREaWFycmhlZVszXS8xMikNCnRvdDIoYSkNCnRvdGFsWywyXTwtTlVMTA0KI3RvdGFsJHBlcmNlbnQ8LXJvdW5kKHRvdGFsJERpYXJyaGVlKjEwMC90b3RhbCRjaWJsZSwwKQ0KI2tuaXRyOjprYWJsZSh0b3RhbCwicGFuZG9jIixhbGlnbj0nbGNjcicpDQoNCmI8LWRhdGFiDQpiJERpYXJyaDwtcm93U3VtcyhiWywyMDoyMl0sbmEucm09VCkNCm5hbWVzKGIpWzIyXTwtImRpYXMiDQpuYW1lcyhkYXRhZylbMjFdPC0iZGlhcyINCmRhdGFnJT4lZ3JvdXBfYnkoenMpJT4lc3VtbWFyaXNlKERpYXJyaD1zdW0oRGlhcnJfc2V2MStEaWFycl9zZXYyK2RpYXMsbmEucm09VCkpLT5wDQpwJHBvcDwtY2x1cyRwb3ANCmdncGxvdChwLGFlcyh4PXpzLHk9RGlhcnJoLGZpbGw9cG9wKSkrZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknLGNvbD0iZ3JleSIsYWxwaGE9LjcpK3RoZW1lX2NsYXNzaWMoKStsYWJzKHg9IiIpK3RoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCkpK2dlb21fdGV4dChhZXMobGFiZWw9RGlhcnJoKSxjZXg9Myx2anVzdD0yKStzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJZbE9yQnIiKQ0KDQpiJT4lZ3JvdXBfYnkocGVyaW9kbmFtZSklPiVzdW1tYXJpc2UoRGlhcnJoPXN1bShEaWFycmgpKS0+cA0KDQpnZ3Bsb3QocCxhZXMoeD1wZXJpb2RuYW1lLHk9RGlhcnJoKSkrZ2VvbV9saW5lKGFlcyhncm91cD0xKSxzaXplPTIsY29sb3I9ImxpZ2h0Ymx1ZSIpK2dlb21fcG9pbnQoY29sb3I9InJlZCIpK3RoZW1lX2NsYXNzaWMoKSt0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9MCxzaXplPTgpKStnZW9tX3RleHQoYWVzKGxhYmVsPXJvdW5kKERpYXJyaCwwKSksc2l6ZT0zLHZqdXN0PS0uNSkrbGFicyh4PSIiLHk9IiIsdGl0bGU9IkRpYXJyaGVlIDwgNSBhbnMiKSt0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9OTApKStjb29yZF9jYXJ0ZXNpYW4oeT1jKDYwMDAsMTIwMDApKQ0KDQoNCmBgYA0KDQoNCg0KYGBge3J9DQphIDwtIGRhdGEuZnJhbWUoYygiS2F0YW5nYSIpLGMoIkhhdXQgTG9tYW1pIiksYygiMjU1NDMiKSxjKCIyNTQ4NiIpLGMoIjEwMC4yIikpDQoNCiNrbml0cjo6a2FibGUoYSwicGFuZG9jIixhbGlnbj0nbGNjY3InLGNvbC5uYW1lcz1jKCJSZWdpb24iLCJQcm92aW5jZSIsIkFjaGlldmVtZW50IiwiVGFyZ2V0IiwiQWNoaWV2bWVudCBSYXRlIikpDQoNCmBgYA0KDQoNCiZuYnNwOw0KDQoNCiZuYnNwOw0KJm5ic3A7DQoNCg0KLQkqKk51bWJlciBvZiBjaGlsZHJlbiBsZXNzIHRoYW4gMTIgbW9udGhzIG9mIGFnZSB3aG8gcmVjZWl2ZWQgdGhyZWUgZG9zZXMgb2YgcGVudGF2YWxlbnQgdmFjY2luZSBbOSBmZWUgcHJveHldKioNCiZuYnNwOw0KYGBge3J9DQphPC1kYXRhZw0KYSRQZW50YTwtcm93U3VtcyhhWyw0MTo0M10pDQphPC1hZ2dyZWdhdGUoYVssYyg0MSw2NildLGxpc3QoYSRwZXJpb2RuYW1lKSxzdW0sbmEucm09VCkNCmEkY2libGU8LXJvdW5kKGNpYmxlcyRQZW50YVszXS8xMikNCnRvdDIoYSkNCnRvdGFsWywyXTwtTlVMTA0KI3RvdGFsJHBlcmNlbnQ8LXJvdW5kKHRvdGFsJFBlbnRhKjEwMC90b3RhbCRjaWJsZSwwKQ0KI2tuaXRyOjprYWJsZSh0b3RhbCwicGFuZG9jIixhbGlnbj0nbGNjcicpDQoNCmI8LWRhdGFiDQpiJFBlbnRhPC1yb3dTdW1zKGJbLDI3OjI5XSxuYS5ybT1UKQ0KbmFtZXMoZGF0YWcpWzI2OjI4XTwtcGFzdGUwKCJQZW50YSIsMTozKQ0KZGF0YWclPiVncm91cF9ieSh6cyklPiVzdW1tYXJpc2UoUGVudGE9c3VtKFBlbnRhMStQZW50YTIrUGVudGEzKSktPnANCnAkcG9wPC1jbHVzJHBvcA0KZ2dwbG90KHAsYWVzKHg9enMseT1QZW50YSxmaWxsPXBvcCkpK2dlb21fYmFyKHN0YXQ9J2lkZW50aXR5Jyxjb2w9ImdyZXkiLGFscGhhPS43KSt0aGVtZV9jbGFzc2ljKCkrbGFicyh4PSIiKSt0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9OTApKStnZW9tX3RleHQoYWVzKGxhYmVsPVBlbnRhKSxjZXg9Myx2anVzdD0yKStzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJZbE9yQnIiKQ0KDQpiJT4lZ3JvdXBfYnkocGVyaW9kbmFtZSklPiVzdW1tYXJpc2UoUGVudGE9c3VtKFBlbnRhKSktPnANCg0KZ2dwbG90KHAsYWVzKHg9cGVyaW9kbmFtZSx5PVBlbnRhKSkrZ2VvbV9saW5lKGFlcyhncm91cD0xKSxzaXplPTIsY29sb3I9ImxpZ2h0Ymx1ZSIpK2dlb21fcG9pbnQoY29sb3I9InJlZCIpK3RoZW1lX2NsYXNzaWMoKSt0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9MCxzaXplPTgpKStnZW9tX3RleHQoYWVzKGxhYmVsPXJvdW5kKFBlbnRhLDApKSxzaXplPTMsdmp1c3Q9LS41KStsYWJzKHg9IiIseT0iIix0aXRsZT0iVkFDQ0lOIFBFTlRBVkFMRU5UIikrdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkrY29vcmRfY2FydGVzaWFuKHk9Yyg2MDAwLDgwMDApKQ0KICANCmBgYA0KDQpgYGB7cn0NCmEgPC0gZGF0YS5mcmFtZShjKCJLYXRhbmdhIiksYygiSGF1dCBMb21hbWkiKSxjKCIzMDY1MiIpLGMoIjMxMzUzIiksYygiOTcuOCIpKQ0KDQoja25pdHI6OmthYmxlKGEsInBhbmRvYyIsYWxpZ249J2xjY2NyJyxjb2wubmFtZXM9YygiUmVnaW9uIiwiUHJvdmluY2UiLCJBY2hpZXZlbWVudCIsIlRhcmdldCIsIkFjaGlldm1lbnQgUmF0ZSIpKQ0KDQpgYGANCg0KJm5ic3A7ICANCiZuYnNwOyAgDQoNCg0KLQkqKlBlcmNlbnQgb2YgY2hpbGRyZW4gbGVzcyB0aGFuIDEyIG1vbnRocyBvZiBhZ2Ugd2hvIHJlY2VpdmVkIG1lYXNsZXMgdmFjY2luZSBmcm9tIFVTRy1zdXBwb3J0ZWQgcHJvZ3JhbXMgWzEwXSoqDQombmJzcDsNCmBgYHtyfQ0KYTwtZGF0YWcNCmEkVkFSPC1yb3dTdW1zKGFbLDMxOjMzXSkNCmE8LWFnZ3JlZ2F0ZShhWyxjKDMxLDUwKV0sbGlzdChhJHBlcmlvZG5hbWUpLHN1bSkNCmEkY2libGU8LXJvdW5kKGNpYmxlcyRWQVJbM10vMTIpDQp0b3QyKGEpDQp0b3RhbFssMl08LU5VTEwNCiN0b3RhbCRwZXJjZW50PC1yb3VuZCh0b3RhbCRWQVIqMTAwL3RvdGFsJGNpYmxlLDApDQoja25pdHI6OmthYmxlKHRvdGFsLCJwYW5kb2MiLGFsaWduPSdsY2NyJykNCg0KYjwtZGF0YWINCmIkVmFyPC1yb3dTdW1zKGJbLDQyOjQ0XSxuYS5ybT1UKQ0KbmFtZXMoZGF0YWcpWzQxOjQzXTwtcGFzdGUwKCJWYXIiLDE6MykNCm5hbWVzKGRhdGFnKVs0N108LSJwb3AiDQpkYXRhZyU+JWdyb3VwX2J5KHpzKSU+JXN1bW1hcmlzZShWYXJhPXN1bShWYXIxK1ZhcjIrVmFyMyxuYS5ybT1UKSxwb3BhPXN1bShwb3AsbmEucm09VCkpJT4lIG11dGF0ZShWYXI9cm91bmQoVmFyYSoxMjAwMDAvKHBvcGEqNCkpKS0+cA0KcCRwb3A8LWNsdXMkcG9wDQpnZ3Bsb3QocCxhZXMoeD16cyx5PVZhcixmaWxsPXBvcCkpK2dlb21fYmFyKHN0YXQ9J2lkZW50aXR5Jyxjb2w9ImdyZXkiLGFscGhhPS43KSt0aGVtZV9jbGFzc2ljKCkrbGFicyh4PSIiKSt0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9OTApKStnZW9tX3RleHQoYWVzKGxhYmVsPVZhciksY2V4PTMsdmp1c3Q9Mikrc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iWWxPckJyIikNCg0KbmFtZXMoYilbNDI6NDRdPC1wYXN0ZTAoIlZhciIsMTozKQ0KbmFtZXMoYilbNDhdPC0icG9wIg0KYiU+JWdyb3VwX2J5KHBlcmlvZG5hbWUpJT4lc3VtbWFyaXNlKFZhcmE9c3VtKFZhcixuYS5ybT1UKSxwb3BhPXN1bShwb3AsbmEucm09VCkpJT4lIG11dGF0ZShWYXI9cm91bmQoVmFyYSoxMjAwMDAvKHBvcGEqNCkpKS0+cA0KDQpnZ3Bsb3QocCxhZXMoeD1wZXJpb2RuYW1lLHk9VmFyKSkrZ2VvbV9saW5lKGFlcyhncm91cD0xKSxzaXplPTIsY29sb3I9ImxpZ2h0Ymx1ZSIpK2dlb21fcG9pbnQoY29sb3I9InJlZCIpK3RoZW1lX2NsYXNzaWMoKSt0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9MCxzaXplPTgpKStnZW9tX3RleHQoYWVzKGxhYmVsPXJvdW5kKFZhciwwKSksc2l6ZT0zLHZqdXN0PS0uNSkrbGFicyh4PSIiLHk9IiIsdGl0bGU9IiUgVkFSIikrdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkrY29vcmRfY2FydGVzaWFuKHk9Yyg0MCw5MCkpDQoNCmBgYA0KDQpgYGB7cn0NCmEgPC0gZGF0YS5mcmFtZShjKCJLYXRhbmdhIiksYygiSGF1dCBMb21hbWkiKSxjKCIzMTQwOCIpLGMoIjMwMTY4IiksYygiOTYuMSIpKQ0KDQoja25pdHI6OmthYmxlKGEsInBhbmRvYyIsYWxpZ249J2xjY2NyJyxjb2wubmFtZXM9YygiUmVnaW9uIiwiUHJvdmluY2UiLCJBY2hpZXZlbWVudCIsIlRhcmdldCIsIkFjaGlldm1lbnQgUmF0ZSIpKQ0KDQpgYGANCg0KJm5ic3A7ICANCiANCiZuYnNwOw0KJm5ic3A7DQoNCi0gKipQZXJjZW50YWdlIG9mIHByZWduYW50IHdvbWVuIGF0dGVuZGluZyBhdCBsZWFzdCBvbmUgYW50ZW5hdGFsIGNhcmUgKEFOQykgdmlzaXQgd2l0aCBhIHNraWxsZWQgIHByb3ZpZGVyIGZyb20gVVNHLSBzdXBwb3J0ZWQgaGVhbHRoIGZhY2lsaXRpZXMqKg0KJm5ic3A7DQpgYGB7cn0NCmEgPC0gZGF0YS5mcmFtZShjKCJLYXRhbmdhIiksYygiSGF1dCBMb21hbWkiKSxjKCI5MSIpLGMoIjM3NTE4IiksYygiNDEyNDUiKSxjKCIxMDAiKSxjKCI5MSIpKQ0KDQoja25pdHI6OmthYmxlKGEsInBhbmRvYyIsYWxpZ249J2xjY2NjY3InLGNvbC5uYW1lcz1jKCJSZWdpb24iLCJQcm92aW5jZSIsIkFjaGlldmVtZW50IiwiTnVtZXJhdG9yIiwiRGVub21pbmF0b3IiLCJUYXJnZXQiLCJBY2hpZXZtZW50IFJhdGUoJSkiKSkNCg0KYjwtZGF0YWINCiNiJFZhcjwtcm93U3VtcyhiWyw0Mjo0NF0sbmEucm09VCkNCiNuYW1lcyhkYXRhZylbNDE6NDNdPC1wYXN0ZTAoIlZhciIsMTozKQ0KI25hbWVzKGRhdGFnKVs0N108LSJwb3AiDQpkYXRhZyU+JWdyb3VwX2J5KHpzKSU+JXN1bW1hcmlzZShjcG5hPXN1bShDUE4sbmEucm09VCkscG9wYT1zdW0ocG9wLG5hLnJtPVQpKSU+JSBtdXRhdGUoQ1BOPXJvdW5kKGNwbmEqMTIwMDAwLyhwb3BhKjQpKSktPnANCnAkcG9wPC1jbHVzJHBvcA0KZ2dwbG90KHAsYWVzKHg9enMseT1DUE4sZmlsbD1wb3ApKStnZW9tX2JhcihzdGF0PSdpZGVudGl0eScsY29sPSJncmV5IixhbHBoYT0uNykrdGhlbWVfY2xhc3NpYygpK2xhYnMoeD0iIikrdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkrZ2VvbV90ZXh0KGFlcyhsYWJlbD1DUE4pLGNleD0zLHZqdXN0PTIpK3NjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9IllsT3JCciIpDQoNCiNuYW1lcyhiKVs0Mjo0NF08LXBhc3RlMCgiVmFyIiwxOjMpDQpuYW1lcyhiKVs0OF08LSJwb3AiDQpiJT4lZ3JvdXBfYnkocGVyaW9kbmFtZSklPiVzdW1tYXJpc2UoY3BuYT1zdW0oQ1BOLG5hLnJtPVQpLHBvcGE9c3VtKHBvcCxuYS5ybT1UKSklPiUgbXV0YXRlKENQTj1yb3VuZChjcG5hKjEyMDAwMC8ocG9wYSo0KSkpLT5wDQoNCmdncGxvdChwLGFlcyh4PXBlcmlvZG5hbWUseT1DUE4pKStnZW9tX2xpbmUoYWVzKGdyb3VwPTEpLHNpemU9Mixjb2xvcj0ibGlnaHRibHVlIikrZ2VvbV9wb2ludChjb2xvcj0icmVkIikrdGhlbWVfY2xhc3NpYygpK3RoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT0wLHNpemU9OCkpK2dlb21fdGV4dChhZXMobGFiZWw9cm91bmQoQ1BOLDApKSxzaXplPTMsdmp1c3Q9LS41KStsYWJzKHg9IiIseT0iIix0aXRsZT0iJSBDUE4xIikrdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkrY29vcmRfY2FydGVzaWFuKHk9Yyg4MCwxNDApKQ0KDQpgYGANCg0KJm5ic3A7ICANCiZuYnNwOyAgDQoNCiZuYnNwOw0KDQotCSoqUGVyY2VudGFnZSBvZiBwcmVnbmFudCB3b21lbiBhdHRlbmRpbmcgYXQgbGVhc3Qgb25lIGFuZCBhdCBsZWFzdCA0IGFudGVuYXRhbCBjYXJlIChBTkMpIHdpdGggYSBza2lsbGVkIHByb3ZpZGVyIGZyb20gVVNHLXN1cHBvcnRlZCBoZWFsdGggZmFjaWxpdGllcyBbMTIgZmVlXSoqDQombmJzcDsNCmBgYHtyfQ0KYTwtZGF0YWcNCmEkQ1BOXzQ8LWFbLDRdDQphPC1hZ2dyZWdhdGUoYVssYyg0LDUwKV0sbGlzdChhJHBlcmlvZG5hbWUpLHN1bSkNCmEkY2libGU8LXJvdW5kKGNpYmxlcyRDUE40WzNdLzEyKQ0KdG90MihhKQ0KdG90YWxbLDJdPC1OVUxMDQojdG90YWwkcGVyY2VudDwtcm91bmQodG90YWwkQ1BOXzQqMTAwL3RvdGFsJGNpYmxlLDApDQoja25pdHI6OmthYmxlKHRvdGFsLCJwYW5kb2MiLGFsaWduPSdsY2NyJykNCg0KYjwtZGF0YWINCiNiJFZhcjwtcm93U3VtcyhiWyw0Mjo0NF0sbmEucm09VCkNCiNuYW1lcyhkYXRhZylbNDE6NDNdPC1wYXN0ZTAoIlZhciIsMTozKQ0KI25hbWVzKGRhdGFnKVs0N108LSJwb3AiDQpkYXRhZyU+JWdyb3VwX2J5KHpzKSU+JXN1bW1hcmlzZShjcG5hPXN1bShDUE4uNCxuYS5ybT1UKSxwb3BhPXN1bShwb3AsbmEucm09VCkpJT4lIG11dGF0ZShDUE40PXJvdW5kKGNwbmEqMTIwMDAwLyhwb3BhKjQpKSktPnANCnAkcG9wPC1jbHVzJHBvcA0KZ2dwbG90KHAsYWVzKHg9enMseT1DUE40LGZpbGw9cG9wKSkrZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknLGNvbD0iZ3JleSIsYWxwaGE9LjcpK3RoZW1lX2NsYXNzaWMoKStsYWJzKHg9IiIpK3RoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCkpK2dlb21fdGV4dChhZXMobGFiZWw9Q1BONCksY2V4PTMsdmp1c3Q9Mikrc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iWWxPckJyIikNCg0KI25hbWVzKGIpWzQyOjQ0XTwtcGFzdGUwKCJWYXIiLDE6MykNCm5hbWVzKGIpWzQ4XTwtInBvcCINCmIlPiVncm91cF9ieShwZXJpb2RuYW1lKSU+JXN1bW1hcmlzZShjcG5hPXN1bShDUE4uNCxuYS5ybT1UKSxwb3BhPXN1bShwb3AsbmEucm09VCkpJT4lIG11dGF0ZShDUE40PXJvdW5kKGNwbmEqMTIwMDAwLyhwb3BhKjQpKSktPnANCg0KZ2dwbG90KHAsYWVzKHg9cGVyaW9kbmFtZSx5PUNQTjQpKStnZW9tX2xpbmUoYWVzKGdyb3VwPTEpLHNpemU9Mixjb2xvcj0ibGlnaHRibHVlIikrZ2VvbV9wb2ludChjb2xvcj0icmVkIikrdGhlbWVfY2xhc3NpYygpK3RoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT0wLHNpemU9OCkpK2dlb21fdGV4dChhZXMobGFiZWw9cm91bmQoQ1BONCwwKSksc2l6ZT0zLHZqdXN0PS0uNSkrbGFicyh4PSIiLHk9IiIsdGl0bGU9IiIpK3RoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCkpK2Nvb3JkX2NhcnRlc2lhbih5PWMoNDAsNjApKQ0KDQpgYGANCg0KDQpgYGB7cn0NCmEgPC0gZGF0YS5mcmFtZShjKCJLYXRhbmdhIiksYygiSGF1dCBMb21hbWkiKSxjKCIxOTg2MCIpLGMoIjE3ODk3IiksYygiMTExIikpDQoNCiNrbml0cjo6a2FibGUoYSwicGFuZG9jIixhbGlnbj0nbGNjY3InLGNvbC5uYW1lcz1jKCJSZWdpb24iLCJQcm92aW5jZSIsIkFjaGlldmVtZW50IiwiVGFyZ2V0IiwiQWNoaWV2bWVudCBSYXRlIikpDQoNCmBgYA0KDQombmJzcDsNCg0KLQkqKlBlcmNlbnRhZ2Ugb2YgZGVsaXZlcmllcyB3aXRoIGFuIFNCQSBpbiBVU0ctc3VwcG9ydGVkIGZhY2lsaXRpZXMqKiAgDQoNCmBgYHtyfQ0KYTwtZGF0YWcNCmEkQWNjPC1hWyw4XQ0KYTwtYWdncmVnYXRlKGFbLGMoOCwzNyw1MCldLGxpc3QoYSRwZXJpb2RuYW1lKSxzdW0pDQp0b3QyKGEpDQp0b3RhbCRBY2NfUDwtcm91bmQodG90YWwkQWNjKjEyMDAvKHRvdGFsWywzXSouMDQpLDApDQp0b3RhbCRjaWJsZTQ8LXJvdW5kKHRvdGFsWywzXSouMDQvMTIpDQp0b3RhbFssMjozXTwtTlVMTA0KdG90YWwkY2libGU9OTANCnRvdGFsPC10b3RhbFssYygxLDIsNCw1LDMpXQ0KI2tuaXRyOjprYWJsZSh0b3RhbCwicGFuZG9jIixhbGlnbj0nbGNjY3InLGNvbC5uYW1lcz1jKCJNb2lzIiwiQWNjQXNzaXN0IiwiQ2libGU0IiwiQ2libGU5MCIsIiUiKSkNCg0KYjwtZGF0YWINCiNiJFZhcjwtcm93U3VtcyhiWyw0Mjo0NF0sbmEucm09VCkNCm5hbWVzKGRhdGFnKVs4XTwtIkFjY291Y2hfYXNzIg0KbmFtZXMoZGF0YWcpWzYyXTwtIkFjY291Y2giDQpkYXRhZyU+JWdyb3VwX2J5KHpzKSU+JXN1bW1hcmlzZShBY2NvdWNoYT1zdW0oQWNjb3VjaF9hc3MsbmEucm09VCksYWNjYT1zdW0oQWNjb3VjaCxuYS5ybT1UKSklPiUgbXV0YXRlKEFjY291Y2hfYXNzPXJvdW5kKEFjY291Y2hhKjEwMC9hY2NhKSktPnANCnAkcG9wPC1jbHVzJHBvcA0KZ2dwbG90KHAsYWVzKHg9enMseT1BY2NvdWNoX2FzcyxmaWxsPXBvcCkpK2dlb21fYmFyKHN0YXQ9J2lkZW50aXR5Jyxjb2w9ImdyZXkiLGFscGhhPS43KSt0aGVtZV9jbGFzc2ljKCkrbGFicyh4PSIiKSt0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9OTApKStnZW9tX3RleHQoYWVzKGxhYmVsPUFjY291Y2hfYXNzKSxjZXg9Myx2anVzdD0yKStzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJZbE9yQnIiKQ0KDQpuYW1lcyhiKVs5XTwtIkFjY291Y2hfYXNzIg0KbmFtZXMoYilbNjNdPC0iQWNjb3VjaCINCmIlPiVncm91cF9ieShwZXJpb2RuYW1lKSU+JXN1bW1hcmlzZShBY2NvdWNoYT1zdW0oQWNjb3VjaF9hc3MsbmEucm09VCksYWNjYT1zdW0oQWNjb3VjaCxuYS5ybT1UKSklPiUgbXV0YXRlKEFjY291Y2hfYXNzPXJvdW5kKEFjY291Y2hhKjEwMC9hY2NhKSktPnANCg0KZ2dwbG90KHAsYWVzKHg9cGVyaW9kbmFtZSx5PUFjY291Y2hfYXNzKSkrZ2VvbV9saW5lKGFlcyhncm91cD0xKSxzaXplPTIsY29sb3I9ImxpZ2h0Ymx1ZSIpK2dlb21fcG9pbnQoY29sb3I9InJlZCIpK3RoZW1lX2NsYXNzaWMoKSt0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9MCxzaXplPTgpKStnZW9tX3RleHQoYWVzKGxhYmVsPXJvdW5kKEFjY291Y2hfYXNzLDApKSxzaXplPTMsdmp1c3Q9LS41KStsYWJzKHg9IiIseT0iIix0aXRsZT0iJSBBY2NvdWNoZW1lbnRzIGFzc2lzdMOpcyIpK3RoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCkpK2Nvb3JkX2NhcnRlc2lhbih5PWMoNDAsMTQwKSkNCg0KYGBgDQoNCg0KDQpgYGB7cn0NCmEgPC0gZGF0YS5mcmFtZShjKCJLYXRhbmdhIiksYygiSGF1dCBMb21hbWkiKSxjKCI3NiIpLGMoIjMxMzY0IiksYygiNDEyNDUiKSxjKCI5MCIpLGMoIjg0LjUiKSkNCg0KI2tuaXRyOjprYWJsZShhLCJwYW5kb2MiLGFsaWduPSdsY2NjY2NyJyxjb2wubmFtZXM9YygiUmVnaW9uIiwiUHJvdmluY2UiLCJRMSBBY2hpZXZlbWVudCIsIk51bWVyYXRvciIsIkRlbm9taW5hdG9yIiwiVGFyZ2V0IiwiQWNoaWV2bWVudCBSYXRlIikpDQoNCmBgYA0KDQombmJzcDsNCg0KJm5ic3A7DQoNCi0JKipOdW1iZXIgb2Ygd29tZW4gZ2l2aW5nIGJpcnRoIHdobyByZWNlaXZlZCB1dGVyb3RvbmljcyBpbiB0aGUgdGhpcmQgc3RhZ2Ugb2YgbGFib3IgKE9SIGltbWVkaWF0ZWx5IGFmdGVyIGJpcnRoKSB0aHJvdWdoIFVTRy1zdXBwb3J0ZWQgcHJvZ3JhbXMgWzIuMS40XSoqDQombmJzcDsNCg0KYGBge3J9DQphIDwtIGRhdGEuZnJhbWUoYygiS2F0YW5nYSIpLGMoIkhhdXQgTG9tYW1pIiksYygiMTU4NCIpLGMoIjIxNzgiKSxjKCI3Mi43IikpDQoNCiNrbml0cjo6a2FibGUoYSwicGFuZG9jIixhbGlnbj0nbGNjY3InLGNvbC5uYW1lcz1jKCJSZWdpb24iLCJQcm92aW5jZSIsIkFjaGlldmVtZW50IiwiVGFyZ2V0IiwiQWNoaWV2bWVudCBSYXRlIikpDQoNCmI8LWRhdGFiDQpkYXRhZyU+JWdyb3VwX2J5KHpzKSU+JXN1bW1hcmlzZShHQVRQQT1zdW0oR0FUUEEpKS0+cA0KcCRwb3A8LWNsdXMkcG9wDQpnZ3Bsb3QocCxhZXMoeD16cyx5PUdBVFBBLGZpbGw9cG9wKSkrZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknLGNvbD0iZ3JleSIsYWxwaGE9LjcpK3RoZW1lX2NsYXNzaWMoKStsYWJzKHg9IiIpK3RoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCkpK2dlb21fdGV4dChhZXMobGFiZWw9R0FUUEEpLGNleD0zLHZqdXN0PTIpK3NjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9IllsT3JCciIpDQoNCmIlPiVncm91cF9ieShwZXJpb2RuYW1lKSU+JXN1bW1hcmlzZShHQVRQQT1zdW0oR0FUUEEsbmEucm09VCkpLT5wDQoNCmdncGxvdChwLGFlcyh4PXBlcmlvZG5hbWUseT1HQVRQQSkpK2dlb21fbGluZShhZXMoZ3JvdXA9MSksc2l6ZT0yLGNvbG9yPSJsaWdodGJsdWUiKStnZW9tX3BvaW50KGNvbG9yPSJyZWQiKSt0aGVtZV9jbGFzc2ljKCkrdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTAsc2l6ZT04KSkrZ2VvbV90ZXh0KGFlcyhsYWJlbD1yb3VuZChHQVRQQSwwKSksc2l6ZT0zLHZqdXN0PS0uNSkrbGFicyh4PSIiLCB5PSIiKSt0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9OTApKStjb29yZF9jYXJ0ZXNpYW4oeT1jKDEwMCw5MDApKQ0KYGBgDQoNCiZuYnNwOw0KJm5ic3A7DQoNCg0KLQkqKk51bWJlciBhbmQgcGVyY2VudGFnZSBvZiBuZXdib3JucyByZWNlaXZpbmcgZXNzZW50aWFsIG5ld2Jvcm4gY2FyZSB0aHJvdWdoIFVTRy1zdXBwb3J0ZWQgcHJvZ3JhbXMqKg0KDQpgYGB7cn0NCmE8LWRhdGFnDQphJFNvaW5zX2VzczwtYVssMjldDQphPC1hZ2dyZWdhdGUoYVssYyg5LDI5LDUwKV0sbGlzdChhJHBlcmlvZG5hbWUpLHN1bSkNCnRvdDIoYSkNCnRvdGFsJGNpYmxlPC0xMDANCiN0b3RhbCRTb2Vzc19QPC1yb3VuZCh0b3RhbCRTb2luc19lc3MqMTAwL3RvdGFsWywyXSkNCnRvdGFsWywzXTwtTlVMTA0KdG90YWwkY2libGU9MTAwDQoja25pdHI6OmthYmxlKHRvdGFsLCJwYW5kb2MiLGFsaWduPSdsY2NjcicsY29sLm5hbWVzPWMoIk1vaXMiLCJOYWlzc1ZpdiIsIlNvaW5zRXNzIiwiQ2libGUiLCIlIikpDQoNCmI8LWRhdGFiDQojYiRWYXI8LXJvd1N1bXMoYlssNDI6NDRdLG5hLnJtPVQpDQpuYW1lcyhkYXRhZylbMzhdPC0iU29lc3MiDQpuYW1lcyhkYXRhZylbMTFdPC0iTmFpc3N2Ig0KZGF0YWclPiVncm91cF9ieSh6cyklPiVzdW1tYXJpc2UoU29lc3NhPXN1bShTb2VzcyxuYS5ybT1UKSxuYWlzc3ZhPXN1bShOYWlzc3YsbmEucm09VCkpJT4lIG11dGF0ZShTb2Vzcz1yb3VuZChTb2Vzc2EqMTAwL25haXNzdmEpKS0+cA0KcCRwb3A8LWNsdXMkcG9wDQpnZ3Bsb3QocCxhZXMoeD16cyx5PVNvZXNzLGZpbGw9cG9wKSkrZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknLGNvbD0iZ3JleSIsYWxwaGE9LjcpK3RoZW1lX2NsYXNzaWMoKStsYWJzKHg9IiIpK3RoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCkpK2dlb21fdGV4dChhZXMobGFiZWw9U29lc3MpLGNleD0zLHZqdXN0PTIpK3NjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9IllsT3JCciIpDQoNCm5hbWVzKGIpWzM5XTwtIlNvZXNzIg0KbmFtZXMoYilbMTJdPC0iTmFpc3N2Ig0KYiU+JWdyb3VwX2J5KHBlcmlvZG5hbWUpJT4lc3VtbWFyaXNlKFNvZXNzYT1zdW0oU29lc3MsbmEucm09VCksbmFpc3N2YT1zdW0oTmFpc3N2LG5hLnJtPVQpKSU+JSBtdXRhdGUoU29lc3M9cm91bmQoU29lc3NhKjEwMC9uYWlzc3ZhKSktPnANCg0KZ2dwbG90KHAsYWVzKHg9cGVyaW9kbmFtZSx5PVNvZXNzKSkrZ2VvbV9saW5lKGFlcyhncm91cD0xKSxzaXplPTIsY29sb3I9ImxpZ2h0Ymx1ZSIpK2dlb21fcG9pbnQoY29sb3I9InJlZCIpK3RoZW1lX2NsYXNzaWMoKSt0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9MCxzaXplPTgpKStnZW9tX3RleHQoYWVzKGxhYmVsPXJvdW5kKFNvZXNzLDApKSxzaXplPTMsdmp1c3Q9LS41KStsYWJzKHg9IiIseT0iIikrdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkrY29vcmRfY2FydGVzaWFuKHk9Yyg0MCwxMDApKQ0KDQpgYGANCg0KDQoNCmBgYHtyfQ0KYSA8LSBkYXRhLmZyYW1lKGMoIkthdGFuZ2EiKSxjKCJIYXV0IExvbWFtaSIpLGMoIjkwIiksYygiMTAwIiksYygiODkuOSIpKQ0KDQoja25pdHI6OmthYmxlKGEsInBhbmRvYyIsYWxpZ249J2xjY2NyJyxjb2wubmFtZXM9YygiUmVnaW9uIiwiUHJvdmluY2UiLCJBY2hpZXZlbWVudCIsIlRhcmdldCIsIkFjaGlldm1lbnQgUmF0ZSIpKQ0KDQpgYGANCg0KJm5ic3A7DQoNCg0KJm5ic3A7DQombmJzcDsNCg0KDQotCSoqTnVtYmVyIG9mIHBvc3RwYXJ0dW0vbmV3Ym9ybiB2aXNpdHMgd2l0aGluIHRocmVlIGRheXMgb2YgYmlydGggaW4gVVNHLXN1cHBvcnRlZCBwcm9ncmFtcyBbMi4xLjZdKioNCg0KYGBge3J9DQphPC1kYXRhZw0KYSRDUE9OXzE8LWFbLDI4XQ0KYTwtYWdncmVnYXRlKGFbLGMoMjgsNTApXSxsaXN0KGEkcGVyaW9kbmFtZSksc3VtKQ0KYSRjaWJsZTwtcm91bmQoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoY2libGVzJENQb04xWzNdKSkvMTIpDQp0b3QyKGEpDQp0b3RhbFssMl08LU5VTEwNCiN0b3RhbCRwZXJjZW50PC1yb3VuZCh0b3RhbCRDUE9OXzEqMTAwL3RvdGFsJGNpYmxlLDApDQoja25pdHI6OmthYmxlKHRvdGFsLCJwYW5kb2MiLGFsaWduPSdsY2NyJykNCg0KYjwtZGF0YWINCm5hbWVzKGRhdGFnKVszN108LSJDcG9uMSINCmRhdGFnJT4lZ3JvdXBfYnkoenMpJT4lc3VtbWFyaXNlKENwb24xPXN1bShDcG9uMSkpLT5wDQpwJHBvcDwtY2x1cyRwb3ANCmdncGxvdChwLGFlcyh4PXpzLHk9Q3BvbjEsZmlsbD1wb3ApKStnZW9tX2JhcihzdGF0PSdpZGVudGl0eScsY29sPSJncmV5IixhbHBoYT0uNykrdGhlbWVfY2xhc3NpYygpK2xhYnMoeD0iIikrdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkrZ2VvbV90ZXh0KGFlcyhsYWJlbD1DcG9uMSksY2V4PTMsdmp1c3Q9Mikrc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iWWxPckJyIikNCg0KbmFtZXMoYilbMzhdPC0iQ3BvbjEiDQpiJT4lZ3JvdXBfYnkocGVyaW9kbmFtZSklPiVzdW1tYXJpc2UoQ3BvbjE9c3VtKENwb24xLG5hLnJtPVQpKS0+cA0KDQpnZ3Bsb3QocCxhZXMoeD1wZXJpb2RuYW1lLHk9Q3BvbjEpKStnZW9tX2xpbmUoYWVzKGdyb3VwPTEpLHNpemU9Mixjb2xvcj0ibGlnaHRibHVlIikrZ2VvbV9wb2ludChjb2xvcj0icmVkIikrdGhlbWVfY2xhc3NpYygpK3RoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT0wLHNpemU9OCkpK2dlb21fdGV4dChhZXMobGFiZWw9cm91bmQoQ3BvbjEsMCkpLHNpemU9Myx2anVzdD0tLjUpK2xhYnMoeD0iIiwgeT0iIikrdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkrY29vcmRfY2FydGVzaWFuKHk9Yyg4MDAwLDEzMDAwKSkNCg0KYGBgDQoNCiZuYnNwOw0KYGBge3J9DQphIDwtIGRhdGEuZnJhbWUoYygiS2F0YW5nYSIpLGMoIkhhdXQgTG9tYW1pIiksYygiMjgwMjgiKSxjKCIyMzU1OSIpLGMoIjExOSIpKQ0KDQoja25pdHI6OmthYmxlKGEsInBhbmRvYyIsYWxpZ249J2xjY2NyJyxjb2wubmFtZXM9YygiUmVnaW9uIiwiUHJvdmluY2UiLCJBY2hpZXZlbWVudCIsIlRhcmdldCIsIkFjaGlldm1lbnQgUmF0ZSglKSIpKQ0KDQpgYGANCg0KJm5ic3A7DQogICANCiZuYnNwOw0KDQotCSoqRHJvcC1vdXQgcmF0ZSBpbiBEVFAtSGVwQi1IaWIzIGFtb25nIGNoaWxkcmVuIGxlc3MgdGhhbiAxMiBtb250aHMgb2YgYWdlIFsyLjEuOV0qKg0KDQombmJzcDsNCg0KYGBge3J9DQphIDwtIGRhdGEuZnJhbWUoYygiS2F0YW5nYSIpLGMoIkhhdXQgTG9tYW1pIiksYygiMi4zIiksYygiNCIpLGMoIjE0Mi44IikpDQoNCiNrbml0cjo6a2FibGUoYSwicGFuZG9jIixhbGlnbj0nbGNjY3InLGNvbC5uYW1lcz1jKCJSZWdpb24iLCJQcm92aW5jZSIsIkFjaGlldmVtZW50IiwiVGFyZ2V0IiwiQWNoaWV2bWVudCBSYXRlKCUpIikpDQoNCmI8LWRhdGFiDQojYiRWYXI8LXJvd1N1bXMoYlssNDI6NDRdLG5hLnJtPVQpDQpuYW1lcyhkYXRhZylbNzU6NzddPC1wYXN0ZTAoIlBlbnRhXzEiLDE6MykNCm5hbWVzKGRhdGFnKVsyNjoyOF08LXBhc3RlMCgiUGVudGFfMyIsMTozKQ0KZGF0YWclPiVncm91cF9ieSh6cyklPiVzdW1tYXJpc2UoUGVudGExPXN1bShQZW50YV8xMStQZW50YV8xMitQZW50YV8xMyxuYS5ybT1UKSxQZW50YTM9c3VtKFBlbnRhXzMxK1BlbnRhXzMyK1BlbnRhXzMzLG5hLnJtPVQpKSU+JSBtdXRhdGUoRHJvcD1yb3VuZCgoUGVudGExLVBlbnRhMykvUGVudGExLDIpKS0+cA0KcCRwb3A8LWNsdXMkcG9wDQpnZ3Bsb3QocCxhZXMoeD16cyx5PURyb3AsZmlsbD1wb3ApKStnZW9tX2JhcihzdGF0PSdpZGVudGl0eScsY29sPSJncmV5IixhbHBoYT0uNykrdGhlbWVfY2xhc3NpYygpK2xhYnMoeD0iIikrdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkrZ2VvbV90ZXh0KGFlcyhsYWJlbD1Ecm9wKSxjZXg9Myx2anVzdD0yKStzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJZbE9yQnIiKQ0KDQpuYW1lcyhiKVs3Njo3OF08LXBhc3RlMCgiUGVudGFfMSIsMTozKQ0KbmFtZXMoYilbMjc6MjldPC1wYXN0ZTAoIlBlbnRhXzMiLDE6MykNCmIlPiVncm91cF9ieShwZXJpb2RuYW1lKSU+JXN1bW1hcmlzZShQZW50YTE9c3VtKFBlbnRhXzExK1BlbnRhXzEyK1BlbnRhXzEzLG5hLnJtPVQpLFBlbnRhMz1zdW0oUGVudGFfMzErUGVudGFfMzIrUGVudGFfMzMsbmEucm09VCkpJT4lIG11dGF0ZShEcm9wPXJvdW5kKChQZW50YTEtUGVudGEzKS9QZW50YTEsMikpLT5wDQoNCmdncGxvdChwLGFlcyh4PXBlcmlvZG5hbWUseT1Ecm9wKSkrZ2VvbV9saW5lKGFlcyhncm91cD0xKSxzaXplPTIsY29sb3I9ImxpZ2h0Ymx1ZSIpK2dlb21fcG9pbnQoY29sb3I9InJlZCIpK3RoZW1lX2NsYXNzaWMoKSt0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9MCxzaXplPTgpKStnZW9tX3RleHQoYWVzKGxhYmVsPXJvdW5kKERyb3AsMikpLHNpemU9Myx2anVzdD0tLjUpK2xhYnMoeD0iIix5PSIiKSt0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9OTApKStjb29yZF9jYXJ0ZXNpYW4oeT1jKDAsMS41KSkNCg0KYGBgDQoNCiZuYnNwOyAgDQoNCg0KJm5ic3A7DQombmJzcDsNCiZuYnNwOw0KDQojIyBOVVRSSVRJT04NCg0KLQlOdW1iZXIgb2YgaW5kaXZpZHVhbHMgcmVjZWl2aW5nIG51dHJpdGlvbi1yZWxhdGVkIHByb2Zlc3Npb25hbCB0cmFpbmluZyB0aHJvdWdoIFVTRyBzdXBwb3J0ZWQgbnV0cmlvbiBwcm9ncmFtcyBbMi4xLjEwXQ0KDQotCU51bWJlciBvZiBjaGlsZHJlbiB1bmRlci1maXZlICgwLTU5IG1vbnRocykgcmVhY2hlZCBieSBVU0ctc3VwcG9ydGVkIG51dHJpdGlvbiBwcm9ncmFtcyBbMi4xLjExXQ0KDQombmJzcDsNCmBgYHtyfQ0KYSA8LSBkYXRhLmZyYW1lKGMoIkthdGFuZ2EiKSxjKCJIYXV0IExvbWFtaSIpLGMoIjM1MzA5MSIpLGMoIjE1ODQ1NiIpLGMoIjQ0LjkiKSkNCg0KI2tuaXRyOjprYWJsZShhLCJwYW5kb2MiLGFsaWduPSdsY2NjcicsY29sLm5hbWVzPWMoIlJlZ2lvbiIsIlByb3ZpbmNlIiwiQWNoaWV2ZW1lbnQiLCJUYXJnZXQiLCJBY2hpZXZtZW50IFJhdGUoJSkiKSkNCg0KYjwtZGF0YWINCm5hbWVzKGRhdGFnKVs0MF08LSJDUFMiDQpkYXRhZyU+JWdyb3VwX2J5KHpzKSU+JXN1bW1hcmlzZShDUFM9c3VtKENQUykpLT5wDQpwJHBvcDwtY2x1cyRwb3ANCmdncGxvdChwLGFlcyh4PXpzLHk9Q1BTLGZpbGw9cG9wKSkrZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknLGNvbD0iZ3JleSIsYWxwaGE9LjcpK3RoZW1lX2NsYXNzaWMoKStsYWJzKHg9IiIpK3RoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCkpK2dlb21fdGV4dChhZXMobGFiZWw9Q1BTKSxjZXg9Myx2anVzdD0yKStzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJZbE9yQnIiKQ0KDQpuYW1lcyhiKVs0MV08LSJDUFMiDQpiJT4lZ3JvdXBfYnkocGVyaW9kbmFtZSklPiVzdW1tYXJpc2UoQ1BTPXN1bShDUFMsbmEucm09VCkpLT5wDQoNCmdncGxvdChwLGFlcyh4PXBlcmlvZG5hbWUseT1DUFMpKStnZW9tX2xpbmUoYWVzKGdyb3VwPTEpLHNpemU9Mixjb2xvcj0ibGlnaHRibHVlIikrZ2VvbV9wb2ludChjb2xvcj0icmVkIikrdGhlbWVfY2xhc3NpYygpK3RoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT0wLHNpemU9OCkpK2dlb21fdGV4dChhZXMobGFiZWw9cm91bmQoQ1BTLDApKSxzaXplPTMsdmp1c3Q9LS41KStsYWJzKHg9IiIsIHk9IiIpK3RoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCkpK2Nvb3JkX2NhcnRlc2lhbih5PWMoNTAwMDAsNzAwMDApKQ0KDQpgYGANCg0KJm5ic3A7DQoNCiZuYnNwOw0KJm5ic3A7DQombmJzcDsNCg0KIyMgUkVQUk9EVUNUSVZFIEhFQUxUSC9GQU1JTFkgUExBTk5JTkcNCiZuYnNwOw0KLQkqKk51bWJlciBvZiBuZXcgYWNjZXB0b3JzIHVzaW5nIG1vZGVybiBjb250cmFjZXB0aXZlIG1ldGhvZHMgaW4gVVNHLXN1cHBvcnRlZCBmYWNpbGl0aWVzIFszIGZlZSBwcm94eV0qKg0KDQpgYGB7cn0NCmE8LWRhdGFnDQphJEFjY2VwdDwtKGFbLDEwXSkNCmE8LWFnZ3JlZ2F0ZShhWyxjKDEwLDUwKV0sbGlzdChhJHBlcmlvZG5hbWUpLHN1bSkNCmEkY2libGU8LXJvdW5kKGNpYmxlcyROb3V2ZWxsZS5hY2NlcHRhbnRlWzNdLzEyKQ0KdG90MihhKQ0KdG90YWxbLDJdPC1OVUxMDQojdG90YWwkcGVyY2VudDwtcm91bmQodG90YWwkQWNjZXB0KjEwMC90b3RhbCRjaWJsZSwwKQ0KI2tuaXRyOjprYWJsZSh0b3RhbCwicGFuZG9jIixhbGlnbj0nbGNjcicpDQoNCmI8LWRhdGFiDQpuYW1lcyhkYXRhZylbMTJdPC0iQWNjZXB0Ig0KZGF0YWclPiVncm91cF9ieSh6cyklPiVzdW1tYXJpc2UoQWNjZXB0PXN1bShBY2NlcHQpKS0+cA0KcCRwb3A8LWNsdXMkcG9wDQpnZ3Bsb3QocCxhZXMoeD16cyx5PUFjY2VwdCxmaWxsPXBvcCkpK2dlb21fYmFyKHN0YXQ9J2lkZW50aXR5Jyxjb2w9ImdyZXkiLGFscGhhPS43KSt0aGVtZV9jbGFzc2ljKCkrbGFicyh4PSIiKSt0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9OTApKStnZW9tX3RleHQoYWVzKGxhYmVsPUFjY2VwdCksY2V4PTMsdmp1c3Q9Mikrc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iWWxPckJyIikNCg0KbmFtZXMoYilbMTNdPC0iQWNjZXB0Ig0KYiU+JWdyb3VwX2J5KHBlcmlvZG5hbWUpJT4lc3VtbWFyaXNlKEFjY2VwdD1zdW0oQWNjZXB0LG5hLnJtPVQpKS0+cA0KDQpnZ3Bsb3QocCxhZXMoeD1wZXJpb2RuYW1lLHk9QWNjZXB0KSkrZ2VvbV9saW5lKGFlcyhncm91cD0xKSxzaXplPTIsY29sb3I9ImxpZ2h0Ymx1ZSIpK2dlb21fcG9pbnQoY29sb3I9InJlZCIpK3RoZW1lX2NsYXNzaWMoKSt0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9MCxzaXplPTgpKStnZW9tX3RleHQoYWVzKGxhYmVsPXJvdW5kKEFjY2VwdCwwKSksc2l6ZT0zLHZqdXN0PS0uNSkrbGFicyh4PSIiLCB5PSIiKSt0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9OTApKStjb29yZF9jYXJ0ZXNpYW4oeT1jKDEwMDAwLDIzMDAwKSkNCg0KYGBgDQoNCmBgYHtyfQ0KYSA8LSBkYXRhLmZyYW1lKGMoIkthdGFuZ2EiKSxjKCJIYXV0IExvbWFtaSIpLGMoIjMzMzcyIiksYygiMjA0MDUiKSxjKCIxNjMuNSIpKQ0KDQoja25pdHI6OmthYmxlKGEsInBhbmRvYyIsYWxpZ249J2xjY2NyJyxjb2wubmFtZXM9YygiUmVnaW9uIiwiUHJvdmluY2UiLCJBY2hpZXZlbWVudCIsIlRhcmdldCIsIkFjaGlldm1lbnQgUmF0ZSglKSIpKQ0KDQpgYGANCg0KJm5ic3A7DQoNCiZuYnNwOw0KDQotCSoqTnVtYmVyIG9mIGNvdW5zZWxpbmcgdmlzaXRzIGZvciBGUC8gUkggYXMgcmVzdWx0IG9mIFVTRyBzdXBwb3J0IFsyLjNdKioNCg0KDQoNCg0KIyMgVFVCRVJDVUxPU0lTDQoNCi0JVEIgbm90aWZpY2F0aW9uIHJhdGUgdGhyb3VnaCBVU0ctIHN1cHBvcnRlZCBwcm9ncmFtcyBbMi4xLjE3XQ0KDQotCU51bWJlciBvZiBtdWx0aS1kcnVnIHJlc2lzdGFudCBUQiAoTURSLVRCKSBjYXNlcyBkZXRlY3RlZCBbMi4xLjIwXQ0KDQojIyBXQVRFUiwgU0FOSVRBVElPTiwgQU5EIEhZR0lFTkUNCg0KLQlOdW1iZXIgb2YgcGVvcGxlIGdhaW5pbmcgYWNjZXNzIHRvIGJhc2ljIGRyaW5raW5nIHdhdGVyIHNlcnZpY2VzIGFzIGEgcmVzdWx0IG9mIFVTRyBhc3Npc3RhbmNlIFsyLjYuMl0NCg0KLQlOdW1iZXIgb2YgcGVvcGxlIGdhaW5pbmcgYWNjZXNzIHRvIGEgYmFzaWMgc2FuaXRhdGlvbiBzZXJ2aWNlIGFzIGEgcmVzdWx0IG9mIFVTRyBhc3Npc3RhbmNlIFsyLjYuM10NCg0KIyA0LlJFUE9SVElORyBCWSBQUk9HUkFNIEFDVElWSVRJRVMNCg0KIyMgY2ZyIHJhcHBvcnQgcHJvZ3JhbW1hdGlxdWUNCg0K