This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.
Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter.
#PLot 1
library(ggplot2)
setwd("C:/Users/vhtran/Google Drive/these/diver_selection")
#png(file = "7.png", width = 800, height = 800)
library(readr)
mydata <- read.csv("C:/Users/vhtran/Google Drive/these/diver_selection/dataplot3.csv", sep=";")
ggplot(mydata, aes(x=generations, y=value, colour=group, group=group)) +
geom_line(aes(linetype=as.factor(group1),color=as.factor(unit)),size=2) +
geom_point(aes(fill = group,shape = group))+
labs(list(y="value", x="generation"),size=20) +
theme_bw() +
theme(panel.border = element_blank(), panel.grid.major = element_blank(),
panel.grid.minor = element_blank(), axis.line = element_line(colour = "black"))+
theme(axis.text.x=element_text(angle=0, hjust=1,size=16),axis.text.y=element_text(angle=0, hjust=1,size=16)) +
scale_fill_brewer(type="qual", palette=2) +
scale_color_brewer(type="qual", palette=2) +
theme(axis.title.x = element_text( size=18))+
theme(axis.title.y = element_text(size=18))+
#ggtitle("Heritability over time")+
theme(legend.title=element_blank())+
guides(color = guide_legend(nrow=3))+
theme(legend.text = element_text(colour="blue", size = 16))+
theme(legend.key.size = unit(2, 'lines'))+
theme(plot.title = element_text(lineheight=5, face="bold", color="black", size=20))

#dev.off()
#Plot with EBV per week for each line-generation
library(reshape2)
library(plyr)
mydata_1 <- read.table("C:/Users/vhtran/Google Drive/these/diver_selection/FULL4.dat",quote="\"")
names(mydata_1)[1]<-"animal"
names(mydata_1)[2]<-"identif"
names(mydata_1)[3]<-"bande"
names(mydata_1)[4]<-"sexe"
names(mydata_1)[5]<-"lignee"
names(mydata_1)[6]<-"gener"
names(mydata_1)[7]<-"loge"
names(mydata_1)[8]<-"eleve"
names(mydata_1)[9]<- "pds_dc"
names(mydata_1)[10]<-"pds_fc"
names(mydata_1)[11]<-"age"
names(mydata_1)[12]<-"poidsheb"
names(mydata_1)[13]<-"poidpre2"
names(mydata_1)[14]<-"age_dc"
names(mydata_1)[15]<-"temps"
names(mydata_1)[16]<-"consoheb"
names(mydata_1)[17]<-"ADGv"
names(mydata_1)[18]<-"FCRv"
names(mydata_1)[19]<-"ADGg"
names(mydata_1)[20]<-"FCRg"
names(mydata_1)[21]<-"semaine"
names(mydata_1)[22]<-"period"
#mydata$temps=as.numeric(levels(mydata$temps))[mydata$temps]
#number animal
my1=mydata_1[,1:8]
my2=aggregate(my1, list(my1$animal), FUN=head, 1)
my2=arrange(my2,animal)
########################################################################################
# EBV for one records (mean of record)/ 3986 animals
EBV_all <- read.table("EBV_all1309.txt", quote="\"")
test<-melt(EBV_all,id.vars = 'animal')
test1=arrange(test,animal)
test1$EBV=test1$value
EBV_all1=test1[,c("animal","EBV")]
N_animal=length(unique(EBV_all1$animal))
EBV_all1$temps=c(rep(4:13,N_animal))
critere = c("animal")
mydata_EBV=merge(EBV_all1,my2,by=c(critere))
#class the animal
mydata_EBV1=arrange(mydata_EBV,animal,temps)
#results from k-mean trajectory classification
#group A (generation G0-G2)
#group B (generation G3-G7 line HRFI)
#group C (generation G3-G7 line HRFI)
mydata_EBV1$gr=paste(mydata_EBV1$gener,mydata_EBV1$lignee,collapse =NULL)
mydata_EBV1$group =ifelse(mydata_EBV1$gener=="G0"|mydata_EBV1$gener=="G1"|mydata_EBV1$gener=="G2","C",
ifelse(mydata_EBV1$gr=="G3 +"|mydata_EBV1$gr=="G4 +"|mydata_EBV1$gr=="G5 +"|mydata_EBV1$gr=="G6 +"|
mydata_EBV1$gr=="G7 +","B","A"))
#
# library(dplyr)
#
# gd <- mydata_EBV1 %>%
# group_by(group,temps) %>%
# summarise(
# EBV.mean = mean(EBV),
#
# )
#
# fix(gd)
#
#
#
# gd$group1=ifelse(gd$group=="A","G0-G2",ifelse(gd$group=="B","G3-G7/HRFI","G3 to G7/LRFI"))
gd <- read.csv("C:/Users/vhtran/Google Drive/these/diver_selection/gd1.csv", sep=";")
gd$temps=gd$temps-3
library(ggplot2)
setwd("C:/Users/vhtran/Google Drive/these/diver_selection")
#png(file = "7.png", width = 800, height = 800)
diver_selec <- read.table("C:/Users/vhtran/Google Drive/these/Sujet2/out.txt", quote="\"")
mydata=diver_selec
mydata$min=(mydata$EBV.mean-mydata$EBV.sd)
mydata$max=(mydata$EBV.mean+mydata$EBV.sd)
mydata$group1=paste(mydata$gener,mydata$lignee,collapse =NULL)
group=c(rep("C",50),rep("A",10),rep("B",10),rep("A",10),rep("B",10),rep("A",10),rep("B",10),
rep("A",10),rep("B",10),rep("A",10),rep("B",10))
mydata=cbind(mydata,group)
mydata$temps=mydata$temps-3
mydata_plot=mydata[,c("group","temps","EBV.mean","group1")]
mydata_plot1 = rbind(mydata_plot,gd)
library(ggplot2)
#???pp=ggplot(mydata, aes(x=generations, y=value, colour=group, group=group)) +
pp1= ggplot(mydata_plot1, aes(x=temps, y=EBV.mean, colour=group, group=group1)) +
geom_line(aes(linetype=group1, size = group1)) +
scale_linetype_manual(values=c("solid","solid","solid","solid",rep(c("solid","solid"),2),
rep(c("dotted","twodash"),5))) +
scale_size_manual(values=c(3,3,3,rep(0.5,15)))+
# geom_line(data = gd) +
geom_point(aes(fill = group1,shape = group1), # Shape depends on cond
size = 4) + # Large points
scale_shape_manual(values=c(1,1,1,1,5,6,7,8,rep(c(9,9,10,10,11,11,12,12,13,13),1))) +
scale_x_continuous(breaks=1:10) +
labs(list(y="EBV (kg feed/kg gain)", x="Week"),size=24) +
theme_bw() +
theme(panel.border = element_blank(), panel.grid.major = element_blank(),
panel.grid.minor = element_blank(), axis.line = element_line(colour = "black"))+
theme(axis.text.x=element_text(angle=0, hjust=1,size=24),axis.text.y=element_text(angle=0, hjust=1,size=24)) +
scale_fill_brewer(type="qual", palette=2) +
scale_color_brewer(type="qual", palette=2) +
theme(axis.title.x = element_text( size=24))+
theme(axis.title.y = element_text(size=24))+
#ggtitle("Heritability over time")+
theme(legend.title=element_blank())+
guides(color = guide_legend(nrow=3))+
theme(legend.text = element_text(colour="blue", size = 20))+
theme(legend.key.size = unit(2, 'lines'))+
theme(plot.title = element_text(lineheight=5, face="bold", color="black", size=20))
library(RColorBrewer)
myColors <- c("blue","red","green")
names(myColors) <- levels(mydata$group)
# myline=c("dotdash","solid", "dotted","dotdash","solid", "dotted")
# names(myline) <- levels(mydata$group)
#
colScale <- scale_colour_manual(name = "group",values = myColors)
# lineScale <- scale_colour_manual(name = "group",values = myline)
#png(file="EBV_gene_week1.png",width=1800,height=1200,res=100)
pp1+colScale
Scale for 'colour' is already present. Adding another scale for 'colour', which will replace the existing
scale.

#dev.off()
# CUREVES SBV FOR GENERATIONS
library(ggplot2)
mydata<- read.csv("C:/Users/vhtran/Google Drive/these/diver_selection/dataplot3.csv", sep=";")
mydata=mydata[1:32,]
pp1= ggplot(mydata, aes(x=generations, y=value, colour=group, group=group)) +
geom_line(aes(linetype=group), # Line type depends on cond
size = 1) +
#geom_point(aes(fill = group,shape = group1),
geom_point(aes(fill = group,shape = group),size = 3) +
# Shape depends on cond
# Large points
scale_linetype_manual(values=c("dotted","dotted","solid", "solid")) +
scale_shape_manual(values=c(8,8,1,1)) +
#geom_line(data=dataplot, aes(x=generations, y=value, group=group,col=as.factor(group1),linetype=as.factor(group), scale_fill_manual(values=c("blue","red"))))
#geom_line(aes(linetype=as.factor(group),color=as.factor(group)),size=2) +
#geom_errorbar(aes(ymin=min, ymax=max, colour=group,linetype=group), width=.4,
# position=position_dodge(0.05))+
# scale_colour_manual(name="Error Bars",values=cols, guide = guide_legend(fill = NULL,colour = NULL)) +
# scale_fill_manual(values=cols, guide="none") +
#scale_x_continuous(breaks=1:10) +
labs(list(y=" kg feed/kg gain ", x="Week"),size=18) +
theme_bw() +
theme(panel.border = element_blank(), panel.grid.major = element_blank(),
panel.grid.minor = element_blank(), axis.line = element_line(colour = "black"))+
theme(axis.text.x=element_text(angle=0, hjust=1,size=18),axis.text.y=element_text(angle=0, hjust=1,size=18)) +
scale_fill_brewer(type="qual", palette=2) +
scale_color_brewer(type="qual", palette=2) +
theme(axis.title.x = element_text( size=18))+
theme(axis.title.y = element_text(size=18))+
#ggtitle("Heritability over time")+
theme(legend.title=element_blank())+
guides(color = guide_legend(nrow=3))+
theme(legend.text = element_text(colour="blue", size = 16))+
theme(legend.key.size = unit(2,'lines'))+
theme(plot.title = element_text(lineheight=5, face="bold", color="black", size=16))
library(RColorBrewer)
myColors <- c("red","blue","red","blue","red","blue")
names(myColors) <- levels(mydata$group)
myline=c("dotdash","solid", "dotted","dotdash","solid", "dotted")
names(myline) <- levels(mydata$group)
colScale <- scale_colour_manual(name = "group",values = myColors)
lineScale <- scale_colour_manual(name = "group",values = myline)
#png(file="EBV_genkk.png",width=1000,height=800,res=100)
pp1+colScale
Scale for 'colour' is already present. Adding another scale for 'colour', which will replace the existing
scale.

#dev.off()
#+lineScale
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpUaGlzIGlzIGFuIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vay4gV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgbm90ZWJvb2ssIHRoZSByZXN1bHRzIGFwcGVhciBiZW5lYXRoIHRoZSBjb2RlLiANCg0KVHJ5IGV4ZWN1dGluZyB0aGlzIGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqUnVuKiBidXR0b24gd2l0aGluIHRoZSBjaHVuayBvciBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluc2lkZSBpdCBhbmQgcHJlc3NpbmcgKkN0cmwrU2hpZnQrRW50ZXIqLiANCg0KDQpgYGB7ciwgZWNobz1UUlVFfQ0KDQoNCg0KDQojUExvdCAxDQoNCmxpYnJhcnkoZ2dwbG90MikNCg0Kc2V0d2QoIkM6L1VzZXJzL3ZodHJhbi9Hb29nbGUgRHJpdmUvdGhlc2UvZGl2ZXJfc2VsZWN0aW9uIikNCiNwbmcoZmlsZSA9ICI3LnBuZyIsIHdpZHRoID0gODAwLCBoZWlnaHQgPSA4MDApDQoNCmxpYnJhcnkocmVhZHIpDQpteWRhdGEgPC0gcmVhZC5jc3YoIkM6L1VzZXJzL3ZodHJhbi9Hb29nbGUgRHJpdmUvdGhlc2UvZGl2ZXJfc2VsZWN0aW9uL2RhdGFwbG90My5jc3YiLCBzZXA9IjsiKQ0KDQpnZ3Bsb3QobXlkYXRhLCBhZXMoeD1nZW5lcmF0aW9ucywgeT12YWx1ZSwgY29sb3VyPWdyb3VwLCBncm91cD1ncm91cCkpICsNCiAgDQogDQogIGdlb21fbGluZShhZXMobGluZXR5cGU9YXMuZmFjdG9yKGdyb3VwMSksY29sb3I9YXMuZmFjdG9yKHVuaXQpKSxzaXplPTIpICsNCiAgDQogDQogIA0KICBnZW9tX3BvaW50KGFlcyhmaWxsID0gZ3JvdXAsc2hhcGUgPSBncm91cCkpKw0KICANCiAgDQogIGxhYnMobGlzdCh5PSJ2YWx1ZSIsIHg9ImdlbmVyYXRpb24iKSxzaXplPTIwKSArDQogIHRoZW1lX2J3KCkgKyANCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLCBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIikpKw0KICANCiAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTAsIGhqdXN0PTEsc2l6ZT0xNiksYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KGFuZ2xlPTAsIGhqdXN0PTEsc2l6ZT0xNikpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIodHlwZT0icXVhbCIsIHBhbGV0dGU9MikgKw0KICBzY2FsZV9jb2xvcl9icmV3ZXIodHlwZT0icXVhbCIsIHBhbGV0dGU9MikgKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoIHNpemU9MTgpKSsNCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemU9MTgpKSsNCiAgDQogICNnZ3RpdGxlKCJIZXJpdGFiaWxpdHkgb3ZlciB0aW1lIikrDQogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCkpKw0KICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQobnJvdz0zKSkrDQogIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG91cj0iYmx1ZSIsIHNpemUgPSAxNikpKyAgDQogIHRoZW1lKGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMiwgJ2xpbmVzJykpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGxpbmVoZWlnaHQ9NSwgZmFjZT0iYm9sZCIsIGNvbG9yPSJibGFjayIsIHNpemU9MjApKQ0KDQojZGV2Lm9mZigpDQoNCg0KYGBgDQoNCg0KDQoNCg0KDQpgYGB7cn0NCiNQbG90IHdpdGggRUJWIHBlciB3ZWVrIGZvciBlYWNoIGxpbmUtZ2VuZXJhdGlvbg0KDQoNCg0KDQogbGlicmFyeShyZXNoYXBlMikNCmxpYnJhcnkocGx5cikNCg0KDQoNCg0KDQpteWRhdGFfMSA8LSByZWFkLnRhYmxlKCJDOi9Vc2Vycy92aHRyYW4vR29vZ2xlIERyaXZlL3RoZXNlL2RpdmVyX3NlbGVjdGlvbi9GVUxMNC5kYXQiLHF1b3RlPSJcIiIpIA0KbmFtZXMobXlkYXRhXzEpWzFdPC0iYW5pbWFsIiAgDQpuYW1lcyhteWRhdGFfMSlbMl08LSJpZGVudGlmIiANCm5hbWVzKG15ZGF0YV8xKVszXTwtImJhbmRlIiAgDQpuYW1lcyhteWRhdGFfMSlbNF08LSJzZXhlIiAgDQpuYW1lcyhteWRhdGFfMSlbNV08LSJsaWduZWUiICANCm5hbWVzKG15ZGF0YV8xKVs2XTwtImdlbmVyIiAgDQpuYW1lcyhteWRhdGFfMSlbN108LSJsb2dlIiAgDQpuYW1lcyhteWRhdGFfMSlbOF08LSJlbGV2ZSIgIA0KbmFtZXMobXlkYXRhXzEpWzldPC0gInBkc19kYyIgIA0KbmFtZXMobXlkYXRhXzEpWzEwXTwtInBkc19mYyIgIA0KbmFtZXMobXlkYXRhXzEpWzExXTwtImFnZSIgIA0KbmFtZXMobXlkYXRhXzEpWzEyXTwtInBvaWRzaGViIiAgDQpuYW1lcyhteWRhdGFfMSlbMTNdPC0icG9pZHByZTIiICANCm5hbWVzKG15ZGF0YV8xKVsxNF08LSJhZ2VfZGMiICANCm5hbWVzKG15ZGF0YV8xKVsxNV08LSJ0ZW1wcyIgIA0KbmFtZXMobXlkYXRhXzEpWzE2XTwtImNvbnNvaGViIiAgICAgDQpuYW1lcyhteWRhdGFfMSlbMTddPC0iQURHdiIgIA0KbmFtZXMobXlkYXRhXzEpWzE4XTwtIkZDUnYiICANCm5hbWVzKG15ZGF0YV8xKVsxOV08LSJBREdnIiAgDQpuYW1lcyhteWRhdGFfMSlbMjBdPC0iRkNSZyIgIA0KbmFtZXMobXlkYXRhXzEpWzIxXTwtInNlbWFpbmUiICANCm5hbWVzKG15ZGF0YV8xKVsyMl08LSJwZXJpb2QiICANCg0KDQoNCg0KI215ZGF0YSR0ZW1wcz1hcy5udW1lcmljKGxldmVscyhteWRhdGEkdGVtcHMpKVtteWRhdGEkdGVtcHNdDQojbnVtYmVyIGFuaW1hbA0KDQpteTE9bXlkYXRhXzFbLDE6OF0NCm15Mj1hZ2dyZWdhdGUobXkxLCBsaXN0KG15MSRhbmltYWwpLCBGVU49aGVhZCwgMSkNCm15Mj1hcnJhbmdlKG15MixhbmltYWwpDQoNCg0KDQoNCg0KDQoNCg0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgRUJWIGZvciBvbmUgcmVjb3JkcyAobWVhbiBvZiByZWNvcmQpLyAzOTg2IGFuaW1hbHMNCg0KRUJWX2FsbCA8LSByZWFkLnRhYmxlKCJFQlZfYWxsMTMwOS50eHQiLCBxdW90ZT0iXCIiKQ0KDQoNCg0KdGVzdDwtbWVsdChFQlZfYWxsLGlkLnZhcnMgPSAnYW5pbWFsJykNCg0KdGVzdDE9YXJyYW5nZSh0ZXN0LGFuaW1hbCkNCnRlc3QxJEVCVj10ZXN0MSR2YWx1ZQ0KDQpFQlZfYWxsMT10ZXN0MVssYygiYW5pbWFsIiwiRUJWIildDQoNCk5fYW5pbWFsPWxlbmd0aCh1bmlxdWUoRUJWX2FsbDEkYW5pbWFsKSkNCg0KRUJWX2FsbDEkdGVtcHM9YyhyZXAoNDoxMyxOX2FuaW1hbCkpDQoNCg0KY3JpdGVyZSA9IGMoImFuaW1hbCIpICANCg0KDQpteWRhdGFfRUJWPW1lcmdlKEVCVl9hbGwxLG15MixieT1jKGNyaXRlcmUpKSAgDQojY2xhc3MgdGhlIGFuaW1hbA0KbXlkYXRhX0VCVjE9YXJyYW5nZShteWRhdGFfRUJWLGFuaW1hbCx0ZW1wcykgIA0KDQoNCg0KDQojcmVzdWx0cyBmcm9tIGstbWVhbiB0cmFqZWN0b3J5IGNsYXNzaWZpY2F0aW9uDQoNCg0KI2dyb3VwIEEgKGdlbmVyYXRpb24gRzAtRzIpDQojZ3JvdXAgQiAoZ2VuZXJhdGlvbiBHMy1HNyBsaW5lIEhSRkkpDQojZ3JvdXAgQyAoZ2VuZXJhdGlvbiBHMy1HNyBsaW5lIEhSRkkpDQoNCm15ZGF0YV9FQlYxJGdyPXBhc3RlKG15ZGF0YV9FQlYxJGdlbmVyLG15ZGF0YV9FQlYxJGxpZ25lZSxjb2xsYXBzZSA9TlVMTCkNCg0KDQpteWRhdGFfRUJWMSRncm91cCA9aWZlbHNlKG15ZGF0YV9FQlYxJGdlbmVyPT0iRzAifG15ZGF0YV9FQlYxJGdlbmVyPT0iRzEifG15ZGF0YV9FQlYxJGdlbmVyPT0iRzIiLCJDIiwNCmlmZWxzZShteWRhdGFfRUJWMSRncj09IkczICsifG15ZGF0YV9FQlYxJGdyPT0iRzQgKyJ8bXlkYXRhX0VCVjEkZ3I9PSJHNSArInxteWRhdGFfRUJWMSRncj09Ikc2ICsifA0KICAgICAgICAgbXlkYXRhX0VCVjEkZ3I9PSJHNyArIiwiQiIsIkEiKSkNCg0KIyANCiMgbGlicmFyeShkcGx5cikNCiMgDQojIGdkIDwtIG15ZGF0YV9FQlYxICU+JSANCiMgICAgICAgICBncm91cF9ieShncm91cCx0ZW1wcykgJT4lIA0KIyAgICAgICAgIHN1bW1hcmlzZSgNCiMgICAgICAgICAgIEVCVi5tZWFuID0gbWVhbihFQlYpLA0KIyAgICAgICAgIA0KIyAgICAgICAgICkNCiMgDQojIGZpeChnZCkNCiMgDQojIA0KIyANCiMgZ2QkZ3JvdXAxPWlmZWxzZShnZCRncm91cD09IkEiLCJHMC1HMiIsaWZlbHNlKGdkJGdyb3VwPT0iQiIsIkczLUc3L0hSRkkiLCJHMyB0byBHNy9MUkZJIikpDQoNCg0KZ2QgPC0gcmVhZC5jc3YoIkM6L1VzZXJzL3ZodHJhbi9Hb29nbGUgRHJpdmUvdGhlc2UvZGl2ZXJfc2VsZWN0aW9uL2dkMS5jc3YiLCBzZXA9IjsiKQ0KDQpnZCR0ZW1wcz1nZCR0ZW1wcy0zDQoNCg0KbGlicmFyeShnZ3Bsb3QyKQ0KDQpzZXR3ZCgiQzovVXNlcnMvdmh0cmFuL0dvb2dsZSBEcml2ZS90aGVzZS9kaXZlcl9zZWxlY3Rpb24iKQ0KI3BuZyhmaWxlID0gIjcucG5nIiwgd2lkdGggPSA4MDAsIGhlaWdodCA9IDgwMCkNCg0KDQpkaXZlcl9zZWxlYyA8LSByZWFkLnRhYmxlKCJDOi9Vc2Vycy92aHRyYW4vR29vZ2xlIERyaXZlL3RoZXNlL1N1amV0Mi9vdXQudHh0IiwgcXVvdGU9IlwiIikNCg0KbXlkYXRhPWRpdmVyX3NlbGVjIA0KbXlkYXRhJG1pbj0obXlkYXRhJEVCVi5tZWFuLW15ZGF0YSRFQlYuc2QpDQpteWRhdGEkbWF4PShteWRhdGEkRUJWLm1lYW4rbXlkYXRhJEVCVi5zZCkNCg0KbXlkYXRhJGdyb3VwMT1wYXN0ZShteWRhdGEkZ2VuZXIsbXlkYXRhJGxpZ25lZSxjb2xsYXBzZSA9TlVMTCkNCg0KZ3JvdXA9YyhyZXAoIkMiLDUwKSxyZXAoIkEiLDEwKSxyZXAoIkIiLDEwKSxyZXAoIkEiLDEwKSxyZXAoIkIiLDEwKSxyZXAoIkEiLDEwKSxyZXAoIkIiLDEwKSwNCiAgICAgICAgcmVwKCJBIiwxMCkscmVwKCJCIiwxMCkscmVwKCJBIiwxMCkscmVwKCJCIiwxMCkpDQpteWRhdGE9Y2JpbmQobXlkYXRhLGdyb3VwKQ0KDQoNCm15ZGF0YSR0ZW1wcz1teWRhdGEkdGVtcHMtMw0KDQoNCm15ZGF0YV9wbG90PW15ZGF0YVssYygiZ3JvdXAiLCJ0ZW1wcyIsIkVCVi5tZWFuIiwiZ3JvdXAxIildDQoNCm15ZGF0YV9wbG90MSA9IHJiaW5kKG15ZGF0YV9wbG90LGdkKQ0KDQpsaWJyYXJ5KGdncGxvdDIpDQoNCg0KIz8/P3BwPWdncGxvdChteWRhdGEsIGFlcyh4PWdlbmVyYXRpb25zLCB5PXZhbHVlLCBjb2xvdXI9Z3JvdXAsIGdyb3VwPWdyb3VwKSkgKw0KICANCnBwMT0gIGdncGxvdChteWRhdGFfcGxvdDEsIGFlcyh4PXRlbXBzLCB5PUVCVi5tZWFuLCBjb2xvdXI9Z3JvdXAsIGdyb3VwPWdyb3VwMSkpICsNCiAgDQogIA0KIA0KZ2VvbV9saW5lKGFlcyhsaW5ldHlwZT1ncm91cDEsIHNpemUgPSBncm91cDEpKSArICANCiAgDQogICBzY2FsZV9saW5ldHlwZV9tYW51YWwodmFsdWVzPWMoInNvbGlkIiwic29saWQiLCJzb2xpZCIsInNvbGlkIixyZXAoYygic29saWQiLCJzb2xpZCIpLDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcChjKCJkb3R0ZWQiLCJ0d29kYXNoIiksNSkpKSArDQogICBzY2FsZV9zaXplX21hbnVhbCh2YWx1ZXM9YygzLDMsMyxyZXAoMC41LDE1KSkpKw0KICANCiAgDQogIyBnZW9tX2xpbmUoZGF0YSA9IGdkKSArDQogIA0KICBnZW9tX3BvaW50KGFlcyhmaWxsID0gZ3JvdXAxLHNoYXBlID0gZ3JvdXAxKSwgICAjIFNoYXBlIGRlcGVuZHMgb24gY29uZA0KICAgICAgICAgICAgIHNpemUgPSA0KSArICAgICAgICAjIExhcmdlIHBvaW50cw0KICANCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcz1jKDEsMSwxLDEsNSw2LDcsOCxyZXAoYyg5LDksMTAsMTAsMTEsMTEsMTIsMTIsMTMsMTMpLDEpKSkgKw0KIA0KICANCiANCiBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPTE6MTApICsNCg0KbGFicyhsaXN0KHk9IkVCViAoa2cgZmVlZC9rZyBnYWluKSIsIHg9IldlZWsiKSxzaXplPTI0KSArDQogIHRoZW1lX2J3KCkgKyANCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLCBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIikpKw0KICANCiAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTAsIGhqdXN0PTEsc2l6ZT0yNCksYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KGFuZ2xlPTAsIGhqdXN0PTEsc2l6ZT0yNCkpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIodHlwZT0icXVhbCIsIHBhbGV0dGU9MikgKw0KICBzY2FsZV9jb2xvcl9icmV3ZXIodHlwZT0icXVhbCIsIHBhbGV0dGU9MikgKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoIHNpemU9MjQpKSsNCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemU9MjQpKSsNCiAgDQogICNnZ3RpdGxlKCJIZXJpdGFiaWxpdHkgb3ZlciB0aW1lIikrDQogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCkpKw0KICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQobnJvdz0zKSkrDQogIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG91cj0iYmx1ZSIsIHNpemUgPSAyMCkpKyAgDQogIHRoZW1lKGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMiwgJ2xpbmVzJykpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGxpbmVoZWlnaHQ9NSwgZmFjZT0iYm9sZCIsIGNvbG9yPSJibGFjayIsIHNpemU9MjApKQ0KDQoNCmxpYnJhcnkoUkNvbG9yQnJld2VyKQ0KDQpteUNvbG9ycyA8LSBjKCJibHVlIiwicmVkIiwiZ3JlZW4iKQ0KbmFtZXMobXlDb2xvcnMpIDwtIGxldmVscyhteWRhdGEkZ3JvdXApDQoNCiMgbXlsaW5lPWMoImRvdGRhc2giLCJzb2xpZCIsICJkb3R0ZWQiLCJkb3RkYXNoIiwic29saWQiLCAiZG90dGVkIikNCiMgbmFtZXMobXlsaW5lKSA8LSBsZXZlbHMobXlkYXRhJGdyb3VwKQ0KIyANCg0KY29sU2NhbGUgPC0gc2NhbGVfY29sb3VyX21hbnVhbChuYW1lID0gImdyb3VwIix2YWx1ZXMgPSBteUNvbG9ycykNCiMgbGluZVNjYWxlIDwtIHNjYWxlX2NvbG91cl9tYW51YWwobmFtZSA9ICJncm91cCIsdmFsdWVzID0gbXlsaW5lKQ0KDQoNCg0KI3BuZyhmaWxlPSJFQlZfZ2VuZV93ZWVrMS5wbmciLHdpZHRoPTE4MDAsaGVpZ2h0PTEyMDAscmVzPTEwMCkNCg0KcHAxK2NvbFNjYWxlIA0KDQoNCiNkZXYub2ZmKCkNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQpgYGANCg0KYGBge3J9DQojIENVUkVWRVMgU0JWIEZPUiBHRU5FUkFUSU9OUw0KDQpsaWJyYXJ5KGdncGxvdDIpDQoNCm15ZGF0YTwtIHJlYWQuY3N2KCJDOi9Vc2Vycy92aHRyYW4vR29vZ2xlIERyaXZlL3RoZXNlL2RpdmVyX3NlbGVjdGlvbi9kYXRhcGxvdDMuY3N2Iiwgc2VwPSI7IikNCm15ZGF0YT1teWRhdGFbMTozMixdDQoNCnBwMT0gIGdncGxvdChteWRhdGEsIGFlcyh4PWdlbmVyYXRpb25zLCB5PXZhbHVlLCBjb2xvdXI9Z3JvdXAsIGdyb3VwPWdyb3VwKSkgKyANCiAgDQogIA0KICANCg0KZ2VvbV9saW5lKGFlcyhsaW5ldHlwZT1ncm91cCksICMgTGluZSB0eXBlIGRlcGVuZHMgb24gY29uZA0KICAgICAgICAgIHNpemUgPSAxKSArDQogIA0KICAjZ2VvbV9wb2ludChhZXMoZmlsbCA9IGdyb3VwLHNoYXBlID0gZ3JvdXAxKSwgIA0KICAgICAgICAgICAgIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBncm91cCxzaGFwZSA9IGdyb3VwKSxzaXplID0gMykgKw0KICAgICAgICAgICAgIA0KICAgICAgICAgICAgICMgU2hhcGUgZGVwZW5kcyBvbiBjb25kDQogICAgICAgICAgICAgICAgICAgICAjIExhcmdlIHBvaW50cw0KICANCiAgDQogIA0KICBzY2FsZV9saW5ldHlwZV9tYW51YWwodmFsdWVzPWMoImRvdHRlZCIsImRvdHRlZCIsInNvbGlkIiwgInNvbGlkIikpICsNCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcz1jKDgsOCwxLDEpKSArDQogIA0KICAjZ2VvbV9saW5lKGRhdGE9ZGF0YXBsb3QsIGFlcyh4PWdlbmVyYXRpb25zLCB5PXZhbHVlLCBncm91cD1ncm91cCxjb2w9YXMuZmFjdG9yKGdyb3VwMSksbGluZXR5cGU9YXMuZmFjdG9yKGdyb3VwKSwgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImJsdWUiLCJyZWQiKSkpKQ0KICANCiAgI2dlb21fbGluZShhZXMobGluZXR5cGU9YXMuZmFjdG9yKGdyb3VwKSxjb2xvcj1hcy5mYWN0b3IoZ3JvdXApKSxzaXplPTIpICsNCiAgDQogICNnZW9tX2Vycm9yYmFyKGFlcyh5bWluPW1pbiwgeW1heD1tYXgsIGNvbG91cj1ncm91cCxsaW5ldHlwZT1ncm91cCksIHdpZHRoPS40LA0KICAjICBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjA1KSkrDQogIA0KICANCiAgDQogIA0KDQoNCg0KIyBzY2FsZV9jb2xvdXJfbWFudWFsKG5hbWU9IkVycm9yIEJhcnMiLHZhbHVlcz1jb2xzLCBndWlkZSA9IGd1aWRlX2xlZ2VuZChmaWxsID0gTlVMTCxjb2xvdXIgPSBOVUxMKSkgKyANCiMgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWNvbHMsIGd1aWRlPSJub25lIikgKw0KDQoNCiAjc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz0xOjEwKSArDQogIA0KICBsYWJzKGxpc3QoeT0iIGtnIGZlZWQva2cgZ2FpbiAiLCB4PSJXZWVrIiksc2l6ZT0xOCkgKw0KICB0aGVtZV9idygpICsgDQogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIpKSsNCiAgDQogIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT0wLCBoanVzdD0xLHNpemU9MTgpLGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChhbmdsZT0wLCBoanVzdD0xLHNpemU9MTgpKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHR5cGU9InF1YWwiLCBwYWxldHRlPTIpICsNCiAgc2NhbGVfY29sb3JfYnJld2VyKHR5cGU9InF1YWwiLCBwYWxldHRlPTIpICsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KCBzaXplPTE4KSkrDQogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplPTE4KSkrDQogIA0KICAjZ2d0aXRsZSgiSGVyaXRhYmlsaXR5IG92ZXIgdGltZSIpKw0KICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSsNCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG5yb3c9MykpKw0KICB0aGVtZShsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvdXI9ImJsdWUiLCBzaXplID0gMTYpKSsgIA0KICB0aGVtZShsZWdlbmQua2V5LnNpemUgPSB1bml0KDIsJ2xpbmVzJykpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGxpbmVoZWlnaHQ9NSwgZmFjZT0iYm9sZCIsIGNvbG9yPSJibGFjayIsIHNpemU9MTYpKQ0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQoNCm15Q29sb3JzIDwtIGMoInJlZCIsImJsdWUiLCJyZWQiLCJibHVlIiwicmVkIiwiYmx1ZSIpDQpuYW1lcyhteUNvbG9ycykgPC0gbGV2ZWxzKG15ZGF0YSRncm91cCkNCg0KbXlsaW5lPWMoImRvdGRhc2giLCJzb2xpZCIsICJkb3R0ZWQiLCJkb3RkYXNoIiwic29saWQiLCAiZG90dGVkIikNCm5hbWVzKG15bGluZSkgPC0gbGV2ZWxzKG15ZGF0YSRncm91cCkNCg0KDQpjb2xTY2FsZSA8LSBzY2FsZV9jb2xvdXJfbWFudWFsKG5hbWUgPSAiZ3JvdXAiLHZhbHVlcyA9IG15Q29sb3JzKQ0KDQpsaW5lU2NhbGUgPC0gc2NhbGVfY29sb3VyX21hbnVhbChuYW1lID0gImdyb3VwIix2YWx1ZXMgPSBteWxpbmUpDQoNCg0KDQojcG5nKGZpbGU9IkVCVl9nZW5ray5wbmciLHdpZHRoPTEwMDAsaGVpZ2h0PTgwMCxyZXM9MTAwKQ0KDQpwcDErY29sU2NhbGUgDQoNCiNkZXYub2ZmKCkNCiMrbGluZVNjYWxlDQoNCg0KYGBgDQoNCmBgYHtyLCBldmFsPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KDQojVFJBSkVDVE9SWSBDTEFTU0lGSUNBVElPTg0KDQoNCiNzZXQgd2QNCnNldHdkKCJDOi9Vc2Vycy92aHRyYW4vR29vZ2xlIERyaXZlL3RoZXNlL2RpdmVyX3NlbGVjdGlvbiIpDQojc2F2ZSBkYXRhDQojc2F2ZS5pbWFnZShmaWxlPSIxODAxMjAxNy5SRGF0YSIpDQojcmVtb3ZlIG9iamVjdA0KI3JtKGxpc3Q9bHMoKSkNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojcmVxdWlyZWQgcGFja2FnZXMNCmxpYnJhcnkoY29ycnBsb3QpDQpsaWJyYXJ5KHBzeWNoKQ0KbGlicmFyeShwbHlyKQ0KbGlicmFyeShzdHJpbmdyKQ0KbGlicmFyeShrbWwpDQpsaWJyYXJ5KGttbDNkKQ0KbGlicmFyeShyZXNoYXBlKQ0KbGlicmFyeShTRE1Ub29scykNCmxpYnJhcnkoZm1zYikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGxzYSkNCmxpYnJhcnkocmVhZHIpDQoNCiMgcmVwZXQyIDwtIHJlYWQudGFibGUoIkM6L1VzZXJzL3ZodHJhbi9Hb29nbGUgRHJpdmUvdGhlc2UvZGF0YS9yZXBldDIuZGF0IikNCiMgICAgICAgICAgICAgICAgICAgICANCiMgDQojIA0KIyANCiMgDQojIHJlcGV0Mz1yZXBldDJbLGMoMSw2KV0NCiMgcmVwZXQzPWFycmFuZ2UocmVwZXQzLFgxKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KbXlkYXRhIDwtIHJlYWQudGFibGUoIkM6L1VzZXJzL3ZodHJhbi9Hb29nbGUgRHJpdmUvdGhlc2UvZGl2ZXJfc2VsZWN0aW9uL0ZVTEw0LmRhdCIscXVvdGU9IlwiIikgDQpuYW1lcyhteWRhdGEpWzFdPC0iYW5pbWFsIiAgDQpuYW1lcyhteWRhdGEpWzJdPC0iaWRlbnRpZiIgDQpuYW1lcyhteWRhdGEpWzNdPC0iYmFuZGUiICANCm5hbWVzKG15ZGF0YSlbNF08LSJzZXhlIiAgDQpuYW1lcyhteWRhdGEpWzVdPC0ibGlnbmVlIiAgDQpuYW1lcyhteWRhdGEpWzZdPC0iZ2VuZXIiICANCm5hbWVzKG15ZGF0YSlbN108LSJsb2dlIiAgDQpuYW1lcyhteWRhdGEpWzhdPC0iZWxldmUiICANCm5hbWVzKG15ZGF0YSlbOV08LSAicGRzX2RjIiAgDQpuYW1lcyhteWRhdGEpWzEwXTwtInBkc19mYyIgIA0KbmFtZXMobXlkYXRhKVsxMV08LSJhZ2UiICANCm5hbWVzKG15ZGF0YSlbMTJdPC0icG9pZHNoZWIiICANCm5hbWVzKG15ZGF0YSlbMTNdPC0icG9pZHByZTIiICANCm5hbWVzKG15ZGF0YSlbMTRdPC0iYWdlX2RjIiAgDQpuYW1lcyhteWRhdGEpWzE1XTwtInRlbXBzIiAgDQpuYW1lcyhteWRhdGEpWzE2XTwtImNvbnNvaGViIiAgICAgDQpuYW1lcyhteWRhdGEpWzE3XTwtIkFER3YiICANCm5hbWVzKG15ZGF0YSlbMThdPC0iRkNSdiIgIA0KbmFtZXMobXlkYXRhKVsxOV08LSJBREdnIiAgDQpuYW1lcyhteWRhdGEpWzIwXTwtIkZDUmciICANCm5hbWVzKG15ZGF0YSlbMjFdPC0ic2VtYWluZSIgIA0KbmFtZXMobXlkYXRhKVsyMl08LSJwZXJpb2QiICANCg0KDQoNCg0KI215ZGF0YSR0ZW1wcz1hcy5udW1lcmljKGxldmVscyhteWRhdGEkdGVtcHMpKVtteWRhdGEkdGVtcHNdDQojbnVtYmVyIGFuaW1hbA0KDQpteTE9bXlkYXRhWywxOjhdDQpteTI9YWdncmVnYXRlKG15MSwgbGlzdChteTEkYW5pbWFsKSwgRlVOPWhlYWQsIDEpDQpteTI9YXJyYW5nZShteTIsYW5pbWFsKQ0KDQoNCg0KbXkyPWFycmFuZ2UobXkyLGFuaW1hbCkNCg0KDQoNCg0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgRUJWIGZvciBvbmUgcmVjb3JkcyAobWVhbiBvZiByZWNvcmQpLyAzOTg2IGFuaW1hbHMNCg0KRUJWX2FsbCA8LSByZWFkLnRhYmxlKCJFQlZfYWxsMTMwOS50eHQiLCBxdW90ZT0iXCIiKQ0KDQoNCg0KdGVzdDwtbWVsdChFQlZfYWxsLGlkLnZhcnMgPSAnYW5pbWFsJykNCg0KdGVzdDE9YXJyYW5nZSh0ZXN0LGFuaW1hbCkNCnRlc3QxJEVCVj10ZXN0MSR2YWx1ZQ0KDQpFQlZfYWxsMT10ZXN0MVssYygiYW5pbWFsIiwiRUJWIildDQoNCk5fYW5pbWFsPWxlbmd0aCh1bmlxdWUoRUJWX2FsbDEkYW5pbWFsKSkNCg0KRUJWX2FsbDEkdGVtcHM9YyhyZXAoNDoxMyxOX2FuaW1hbCkpDQoNCg0KDQoNCg0KDQpFQlZfdG8gPC0gcmVhZC50YWJsZSgiQzovVXNlcnMvdmh0cmFuL0dvb2dsZSBEcml2ZS90aGVzZS9zdWpldDIvdG90YWwiLCBxdW90ZT0iXCIiKQ0KDQoNCg0KRUJWX3RvMT1FQlZfdG9bMjo0XSAjIGRlbGV0ZSB0aGUgZmlyc3QgY29sDQoNCg0KbmFtZXMoRUJWX3RvMSlbMV08LSJhbmltYWwiICANCm5hbWVzKEVCVl90bzEpWzJdPC0iRUJWdG8iIA0KbmFtZXMoRUJWX3RvMSlbM108LSJTRV9FQlZ0byIgDQoNCkVCVl90bzI9YXJyYW5nZShFQlZfdG8xLGFuaW1hbCkNCg0KDQoNCg0KDQoNCg0KDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KI0cgPC0gcmVhZC50YWJsZSgiQzovVXNlcnMvdmh0cmFuL0Rlc2t0b3AvRy50eHQiLHF1b3RlPSJcIiIpDQojbWF0cml4IEcgb2YgUlJPUA0KRyA8LSByZWFkLnRhYmxlKCJHX1JST1AxMzA5IixxdW90ZT0iXCIiKSAjIG9sZCBpcyBHMQ0KRz1hcy5tYXRyaXgoRykNCiNHPWNvdjJjb3IoRykgIyB0cmFuc2Zvcm0gQ292IG1hdHJpeCB0byBjb3JyZWxhdGlvbiBtYXRyaXgNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiNtYXRyaXggRyBvZiBTQUQNCkcxIDwtIHJlYWQudGFibGUoIkdfc2FkMTMwOS50eHQiLHF1b3RlPSJcIiIpICNvbGQgaXMgRw0KRzE9YXMubWF0cml4KEcxKQ0KI0cxPWNvdjJjb3IoRzEpICMgdHJhbnNmb3JtIENvdiBtYXRyaXggdG8gY29ycmVsYXRpb24gbWF0cml4DQpSPWVpZ2VuKEcsIG9ubHkudmFsdWVzID0gRkFMU0UsIEVJU1BBQ0sgPSBGQUxTRSkNClIxPWVpZ2VuKEcxLCBvbmx5LnZhbHVlcyA9IEZBTFNFLCBFSVNQQUNLID0gRkFMU0UpDQpSJHZhbHVlcw0KDQoNCg0KQT1hcy5tYXRyaXgoUjEkdmFsdWVzKQ0KQj1hcy5tYXRyaXgoUjEkdmVjdG9ycykNCg0KDQoNClY9KFIkdmVjdG9ycykNClYxPShSMSR2ZWN0b3JzKQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojIEthPW1hdHJpeChjKDAuMTYyN0UtMDEsICAwLjI0NDVFLTAyICwgIDAuMjQ4OUUtMDMsDQojICAgICAgICAgICAgIDAuMjQ0NUUtMDIsICAwLjIzMDNFLTAxLCAtMC4xNzQ4RS0wMywNCiMgICAgICAgICAgICAgMC4yNDg5RS0wMywgLTAuMTc0OEUtMDMgLCAgMC4zMzE4RS0wMiksMywzKQ0KDQpLYT1tYXRyaXgoYygwLjE2NTJFLTAxLCAwLjE5MDVFLTAyLCAtMC42MTg1RS0wMywNCjAuMTkwNUUtMDIsICAwLjIxOTdFLTAxLCAtMC4yMjA5RS0wMiAgLA0KLTAuNjE4NUUtMDMgLC0wLjIyMDlFLTAyICwgMC4zMTE5RS0wMiksMywzKQ0KDQpLYT10KEthKQ0KI0thPWNvdjJjb3IoS2EpDQpLYWVpPWVpZ2VuKEthLCBvbmx5LnZhbHVlcyA9IEYsIEVJU1BBQ0sgPSBGQUxTRSkNCkthZWkNCg0KI2VpZ2VuY2UgdmVjdG9yIGV4cGxhaW4gNTQsMzggJSBvZiB0aGUgdmFyaWF0aW9uDQoNCg0KR19SUk9QIDwtIHJlYWQudGFibGUoIlJST1Bfc2xuMTMwOSIsIHF1b3RlPSJcIiIpICMgb2xkIEdfUlJPUA0KYT1hcy5jaGFyYWN0ZXIoR19SUk9QJFYyKQ0KR19SUk9QJHRQaGkgPSBzdWJzdHJpbmcoYSwxLDEpIA0KR19SUk9QJGFuaW1hbD1zdWJzdHJpbmcoYSwzKQ0KR09QPUdfUlJPUFssYygiYW5pbWFsIiwiVjMiLCJ0UGhpIildDQpHT1A9YXJyYW5nZShHT1AsYW5pbWFsLHRQaGkpDQpHT1AkZWkxPXJlcChLYWVpJHZlY3RvcnNbLDFdLDM5ODYpDQpHT1AkZWkyPXJlcChLYWVpJHZlY3RvcnNbLDJdLDM5ODYpICMgYWRkIC0NCkdPUCRlaTM9cmVwKEthZWkkdmVjdG9yc1ssM10sMzk4NikNCm15ZGF0YTU9R09QDQpteWRhdGE2PWFycmFuZ2UobXlkYXRhNSxhbmltYWwsdFBoaSkgIA0KbXlkYXRhNz1kZHBseShteWRhdGE2LCAiYW5pbWFsIiwgaGVhZCwgMykNCm15ZGF0YTc9YXJyYW5nZShteWRhdGE3LGFuaW1hbCx0UGhpKSAgDQoNCg0KbXlkYXRhNyRFMT1teWRhdGE3JFYzKm15ZGF0YTckZWkxDQpteWRhdGE3JEUyPW15ZGF0YTckVjMqbXlkYXRhNyRlaTINCm15ZGF0YTckRTM9bXlkYXRhNyRWMypteWRhdGE3JGVpMw0KDQoNCg0KDQoNCg0KDQojd3JpdGUudGFibGUobXlkYXRhNywgImVpZ2VuSy54bHMiLCBjb2w9TkEsIHNlcD0iXHQiLGRlYz0iLiIpICAjd3JpdGUgZGF0YSB0byBhIGZpbGUNCm15ZGF0YTg9ZGRwbHkobXlkYXRhNyx+YW5pbWFsLHN1bW1hcmlzZSxzdW09c3VtKEUxKSxtZWFuPW1lYW4oRTEpLHNkPXNkKEUxKSkNCm15ZGF0YTk9ZGRwbHkobXlkYXRhNyx+YW5pbWFsLHN1bW1hcmlzZSxzdW09c3VtKEUyKSxtZWFuPW1lYW4oRTIpLHNkPXNkKEUyKSkNCm15ZGF0YTEwPWRkcGx5KG15ZGF0YTcsfmFuaW1hbCxzdW1tYXJpc2Usc3VtPXN1bShFMyksbWVhbj1tZWFuKEUzKSxzZD1zZChFMykpDQoNCmNvcihteWRhdGE4JHN1bSxteWRhdGExMCRzdW0pDQoNCg0KDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojZmlsZSBzbG4gU0FEDQojcmVhZCBkYXRhIFNBRC5zbG4gLCAhISFhdHRlbnRpb24gZHJpdmUNCkdfc2FkIDwtIHJlYWQudGFibGUoInNsbl9zYWQxMzA5IiwgcXVvdGU9IlwiIikgI29sZCBpcyBHX3NhZA0KVmlldyhHX3NhZCkNCm5hbWVzKEdfc2FkKTwtYygiVjEiLCJjb2RlIiwidmFsdWUiLCJTRSIpDQphID0gR19zYWQkY29kZQ0KZWxlbXMgPC0gdW5saXN0KCBzdHJzcGxpdChhcy5jaGFyYWN0ZXIoYSkgICwgIlxcLiIgKSApDQptIDwtIGFzLmRhdGEuZnJhbWUobWF0cml4KCBlbGVtcyAsIG5jb2wgPSAyICwgYnlyb3cgPSBUUlVFICkpDQpHc2FkPWNiaW5kKEdfc2FkLG0pDQpuYW1lcyhHc2FkKTwtYygiVjEiLCJjb2RlIiwidmFsdWUiLCJTRSIsInRlbXBzIiwiYW5pbWFsIikNCkdzYWQkdGVtcHM9YXMubnVtZXJpYyhsZXZlbHMoR3NhZCR0ZW1wcykpW0dzYWQkdGVtcHNdDQpHc2FkPWFycmFuZ2UoR3NhZCxhbmltYWwsdGVtcHMpDQpOX2FuaW1hbD1sZW5ndGgodW5pcXVlKEdzYWQkYW5pbWFsKSkgICNudW1iZXIgYW5pbWFsIGZyb20gU0FELnNsbg0KDQoNCmNvcihHc2FkJHZhbHVlLEVCVl9hbGwxJEVCVixtZXRob2Q9InNwZWFybWFuIikNCg0KDQpHc2FkJGUxPS1yZXAoVjFbLDFdLE5fYW5pbWFsKSAjIGFkZGVkIC0NCkdzYWQkZTI9LXJlcChWMVssMl0sTl9hbmltYWwpICAgI2VpZ2VuIEcgUlJPUC9icmVlZGluZyB2YWx1ZXMgIyBhZGRlZCAtDQpHc2FkJGUzPXJlcChWMVssM10sTl9hbmltYWwpDQpHc2FkJGU0PXJlcChWMVssNF0sTl9hbmltYWwpDQoNCkdzYWQkRTE9KEdzYWQkZTEpKihHc2FkJHZhbHVlKSANCkdzYWQkRTI9KEdzYWQkZTIpKihHc2FkJHZhbHVlKSANCkdzYWQkRTM9KEdzYWQkZTMpKihHc2FkJHZhbHVlKQ0KR3NhZCRFND0oR3NhZCRlNCkqKEdzYWQkdmFsdWUpDQoNCg0KRUJWX0dzYWQ9ZGRwbHkoR3NhZCx+YW5pbWFsLHN1bW1hcmlzZSxzdW09c3VtKHZhbHVlKSxtZWFuPW1lYW4odmFsdWUpLHNkPXNkKHZhbHVlKSkNCkVCVl9Hc2FkMT1kZHBseShHc2FkLH5hbmltYWwsc3VtbWFyaXNlLHN1bT1zdW0oRTEpLG1lYW49bWVhbihFMSksc2Q9c2QoRTEpKQ0KRUJWX0dzYWQyPWRkcGx5KEdzYWQsfmFuaW1hbCxzdW1tYXJpc2Usc3VtPXN1bShFMiksbWVhbj1tZWFuKEUyKSxzZD1zZChFMikpDQpFQlZfR3NhZDM9ZGRwbHkoR3NhZCx+YW5pbWFsLHN1bW1hcmlzZSxzdW09c3VtKEUzKSxtZWFuPW1lYW4oRTMpLHNkPXNkKEUzKSkNCkVCVl9Hc2FkND1kZHBseShHc2FkLH5hbmltYWwsc3VtbWFyaXNlLHN1bT1zdW0oRTQpLG1lYW49bWVhbihFNCksc2Q9c2QoRTQpKQ0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCg0KDQoNCkVCVl9hbGwxJGUxPS1yZXAoVlssMV0sTl9hbmltYWwpIA0KRUJWX2FsbDEkZTI9LXJlcChWWywyXSxOX2FuaW1hbCkgICAjZWlnZW4gRyBSUk9QL2JyZWVkaW5nIHZhbHVlcw0KRUJWX2FsbDEkZTM9cmVwKFZbLDNdLE5fYW5pbWFsKQ0KRUJWX2FsbDEkZTk9cmVwKFZbLDldLE5fYW5pbWFsKQ0KRUJWX2FsbDEkZTEwPXJlcChWWywxMF0sTl9hbmltYWwpDQoNCg0KRUJWX2FsbDEkaW4xX2FsbD0oRUJWX2FsbDEkZTEpKihFQlZfYWxsMSRFQlYpDQpFQlZfYWxsMSRpbjJfYWxsPShFQlZfYWxsMSRlMikqKEVCVl9hbGwxJEVCVikNCkVCVl9hbGwxJGluM19hbGw9KEVCVl9hbGwxJGUzKSooRUJWX2FsbDEkRUJWKQ0KRUJWX2FsbDEkaW45X2FsbD0oRUJWX2FsbDEkZTkpKihFQlZfYWxsMSRFQlYpDQpFQlZfYWxsMSRpbjEwX2FsbD0oRUJWX2FsbDEkZTEwKSooRUJWX2FsbDEkRUJWKQ0KDQoNCg0KR3NhZF90YWtlPUdzYWRbLGMoInZhbHVlIiwiRTEiLCJFMiIsIkUzIiwiRTQiKV0NCg0KDQpERj1kYXRhLmZyYW1lKEVCVl9hbGwxLEdzYWRfdGFrZSkNCg0KDQpFQlZfYWxsX3NpbmdsZTE9ZGRwbHkoRUJWX2FsbDEsfmFuaW1hbCxzdW1tYXJpc2Usc3VtPXN1bShFQlYpLG1lYW49bWVhbihFQlYpLHNkPXNkKEVCVikpDQpFQlZfYWxsX3NpbmdsZTI9ZGRwbHkoRUJWX2FsbDEsfmFuaW1hbCxzdW1tYXJpc2Usc3VtPXN1bShpbjFfYWxsKSxtZWFuPW1lYW4oaW4xX2FsbCksc2Q9c2QoaW4xX2FsbCkpDQpFQlZfYWxsX3NpbmdsZTM9ZGRwbHkoRUJWX2FsbDEsfmFuaW1hbCxzdW1tYXJpc2Usc3VtPXN1bShpbjJfYWxsKSxtZWFuPW1lYW4oaW4yX2FsbCksc2Q9c2QoaW4yX2FsbCkpDQpFQlZfYWxsX3NpbmdsZTQ9ZGRwbHkoRUJWX2FsbDEsfmFuaW1hbCxzdW1tYXJpc2Usc3VtPXN1bShpbjNfYWxsKSxtZWFuPW1lYW4oaW4zX2FsbCksc2Q9c2QoaW4zX2FsbCkpDQojRUJWX2FsbF9zaW5nbGU1PWRkcGx5KEVCVl9hbGwxLH5hbmltYWwsc3VtbWFyaXNlLHN1bT1zdW0oaW40X2FsbCksbWVhbj1tZWFuKGluNF9hbGwpLHNkPXNkKGluNF9hbGwpKQ0KRUJWX2FsbF9zaW5nbGU1PWRkcGx5KEVCVl9hbGwxLH5hbmltYWwsc3VtbWFyaXNlLHN1bT1zdW0oaW45X2FsbCksbWVhbj1tZWFuKGluOV9hbGwpLHNkPXNkKGluOV9hbGwpKQ0KRUJWX2FsbF9zaW5nbGU2PWRkcGx5KEVCVl9hbGwxLH5hbmltYWwsc3VtbWFyaXNlLHN1bT1zdW0oaW4xMF9hbGwpLG1lYW49bWVhbihpbjEwX2FsbCksc2Q9c2QoaW4xMF9hbGwpKQ0KDQoNCg0KRUJWX3RvMiRFQlZfT1A9RUJWX2FsbF9zaW5nbGUxJHN1bQ0KRUJWX3RvMiRpbjFfYWxsPUVCVl9hbGxfc2luZ2xlMiRzdW0NCkVCVl90bzIkaW4yX2FsbD1FQlZfYWxsX3NpbmdsZTMkc3VtDQpFQlZfdG8yJGluM19hbGw9RUJWX2FsbF9zaW5nbGU0JHN1bQ0KRUJWX3RvMiRpbjlfYWxsPUVCVl9hbGxfc2luZ2xlNSRzdW0NCkVCVl90bzIkaW4xMF9hbGw9RUJWX2FsbF9zaW5nbGU2JHN1bQ0KDQoNCkVCVl90bzIkRUJWX1NBRD1FQlZfR3NhZCRzdW0NCkVCVl90bzIkRTE9RUJWX0dzYWQxJHN1bQ0KRUJWX3RvMiRFMj1FQlZfR3NhZDIkc3VtDQpFQlZfdG8yJEUzPUVCVl9Hc2FkMyRzdW0NCkVCVl90bzIkRTQ9RUJWX0dzYWQ0JHN1bQ0KRUJWX3RvMiRlMV9hbGw9bXlkYXRhOCRzdW0NCkVCVl90bzIkZTJfYWxsPW15ZGF0YTkkc3VtDQpFQlZfdG8yJGUzX2FsbD1teWRhdGExMCRzdW0NCg0KbmFtZXMoRUJWX3RvMikNCg0KDQoNCiN3cml0ZS50YWJsZShFQlZfdG8yLCAiRUJWcGVyaW9kLnR4dCIsIGNvbD1OQSwgc2VwPSJcdCIsZGVjPSIuIikgICN3cml0ZSBkYXRhIHRvIGEgZmlsZQ0KDQpjcml0ZXJlID0gYyhuYW1lcyhteTIpLG5hbWVzKEVCVl90bzIpKSAgDQpjcml0ZXJlPWNyaXRlcmVbZHVwbGljYXRlZChjcml0ZXJlKV0gICAgICNjcml0ZXJlIHBvdXIgbWVyZ2UgMiB0YWJsZWF1eCMgIA0KbXlkYXRhMD1hcnJhbmdlKG15MixhbmltYWwsaWRlbnRpZikgIA0KI21lcmdlIGRhdGEgdG8gb2J0YWluIDEgbGluZS9hbmltYWwgZm9yIFNBRA0KbXlkYXRhMT1tZXJnZShteWRhdGEwLEVCVl90bzIsYnk9Yyhjcml0ZXJlKSkgIA0KI2NsYXNzIHRoZSBhbmltYWwNCm15ZGF0YTE9YXJyYW5nZShteWRhdGExLGFuaW1hbCkgIA0KDQoNCmFuaW1hbD0ocmVwKG15ZGF0YTEkYW5pbWFsLDEwKSkNCmlkZW50aWY9KHJlcChteWRhdGExJGFuaW1hbCwxMCkpDQpERl8xPWRhdGEuZnJhbWUoYW5pbWFsLGlkZW50aWYpDQpERl8yPWFycmFuZ2UoREZfMSxhbmltYWwpDQoNCg0KREZfMiR0ZW1wcz1jKHJlcCg0OjEzLDExODYpKQ0KREZfMj1hcnJhbmdlKERGXzIsYW5pbWFsLHRlbXBzKQ0KDQoNCg0KREZfMz1tZXJnZShERl8yLERGLGJ5PWMoImFuaW1hbCIsInRlbXBzIikpICANCg0KREYwPWFycmFuZ2UoREZfMyxhbmltYWwsdGVtcHMpDQoNCg0KDQoNCkVCVl90bzM9bXlkYXRhMVssYygiYW5pbWFsIiwgIkUxIiwgICAgICAiRTIiICAsICJFQlZfU0FEIiwiZTFfYWxsIiwiZTJfYWxsIiwiRUJWX09QIiwNCiAgICAgICAgICAgICAgICAgICAiaW4xX2FsbCIsICAiaW4yX2FsbCIsIkVCVnRvIildICAgICAgICANCg0KbmFtZXMoRUJWX3RvMykgPC0gYygiYW5pbWFsIiwgIlNCVl9TQUQxIiwgIlNCVl9TQUQyIiwgInNFQlZfU0FEIiwiU0JWX1JSSzEiLCJTQlZfUlJLMiIsInNFQlZfUlIiLCJTQlZfUlIxIiwiU0JWX1JSMiIsImNFQlYiKQ0KIyANCg0KDQoNCmNvcnIudGVzdChFQlZfdG8zWywyOjEwXSkNCg0KDQoNCg0KDQoNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojY2xhc3NpZmljYXRpb24gREYNCg0KREYxPURGMFssYygiYW5pbWFsIiwidGVtcHMiLCJFQlYiKV0NCkRGMj1yZXNoYXBlKERGMSwgdmFyeWluZyA9IE5VTEwsIHRpbWV2YXIgPSAidGVtcHMiLCBpZHZhciA9ICJhbmltYWwiLCBkaXJlY3Rpb249IndpZGUiLCBzZXAgPSAiIikNCg0KDQoNCiNwcmVkaWN0IHRoZSBtaXNzaW5nIGRhdGEgdXNpbmcgTGluZWFyIGludGVycG9sYXRpb24vbWF0cml4DQpERjM9aW1wdXRhdGlvbihhcy5tYXRyaXgoREYyWywgMjoxMV0pLCBtZXRob2QgPSAibGluZWFySW50ZXJwb2wiKQ0KDQojcHJlcGFyZWQgZGF0YSBmb3Iga21sDQoNCmNsZERGMyA8LSBjbGQoREYzLCB0aW1lSW5EYXRhID0gMToxMCkNCiNjbGQxDQoNCiNrbWwgd2l0aCAzIGdyb3Vwcywgc2hvdyBvbmx5IHRyYWplY3Rvcmllcw0KDQprbWwoY2xkREYzLCBuYlJlZHJhdyA9IDIwLG5iQ2x1c3RlcnM9MywgdG9QbG90ID0gImJvdGgiKQ0KDQprbWwoY2xkREYzKQ0KDQprbWwoY2xkREYzLCAzLCBwYXJBbGdvID0gcGFyQUxHTyhkaXN0YW5jZSA9IGZ1bmN0aW9uKHgsIHkpDQogIGNvcih4LCB5KSwgc2F2ZUZyZXEgPSAxMCkpDQoNCmNob2ljZShjbGRERjMpDQoNCkRGMiRnckVCViA8LSBnZXRDbHVzdGVycyhjbGRERjMsIDMpDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpERjQ9REYwWyxjKCJhbmltYWwiLCJ0ZW1wcyIsInZhbHVlIildDQpERjU9cmVzaGFwZShERjQsIHZhcnlpbmcgPSBOVUxMLCB0aW1ldmFyID0gInRlbXBzIiwgaWR2YXIgPSAiYW5pbWFsIiwgZGlyZWN0aW9uPSJ3aWRlIiwgc2VwID0gIiIpDQoNCg0KDQojcHJlZGljdCB0aGUgbWlzc2luZyBkYXRhIHVzaW5nIExpbmVhciBpbnRlcnBvbGF0aW9uL21hdHJpeA0KREY2PWltcHV0YXRpb24oYXMubWF0cml4KERGNVssIDI6MTFdKSwgbWV0aG9kID0gImxpbmVhckludGVycG9sIikNCg0KI3ByZXBhcmVkIGRhdGEgZm9yIGttbA0KDQpjbGRERjYgPC0gY2xkKERGNiwgdGltZUluRGF0YSA9IDE6MTApDQojY2xkMQ0KDQoja21sIHdpdGggMyBncm91cHMsIHNob3cgb25seSB0cmFqZWN0b3JpZXMNCg0Ka21sKGNsZERGNiwgbmJSZWRyYXcgPSAyMCxuYkNsdXN0ZXJzPTMsIHRvUGxvdCA9ICJ0cmFqIikNCg0KDQoNCg0KDQoNCmttbChjbGRERjYpDQoNCmttbChjbGRERjYsIDMsIHBhckFsZ28gPSBwYXJBTEdPKGRpc3RhbmNlID0gZnVuY3Rpb24oeCwgeSkNCiAgY29yKHgsIHkpLCBzYXZlRnJlcSA9IDEwKSkNCg0KY2hvaWNlKGNsZERGNikNCg0KREYyJGdyRUJWX1NBRCA8LSBnZXRDbHVzdGVycyhjbGRERjYsIDMpDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQoNCmRhdGFfY2xhc3M9Y2JpbmQoREYyLEVCVl90bzMpDQpkYXRhX2NsYXNzJEVCVj13aXRoKGRhdGFfY2xhc3MsRUJWNCtFQlY1K0VCVjYrRUJWNytFQlY4K0VCVjkrRUJWMTArRUJWMTErRUJWMTIrRUJWMTMpDQoNCg0KDQpkYXRhX2NsYXNzMSA9Y2JpbmQobXkyLGRhdGFfY2xhc3MpDQoNCg0KDQpgYGANCg0KDQoNCg0KDQoNCg0KDQoNCg0K