library(gridExtra)
library(ggplot2)
a3$type<-"glmnet200"
a4$type<-"glmnet250"
a5$type<-"glmnet350"
a6$type<-"glmnet500"
x1$type<-"svr200"
x2$type<-"svr250"
x3$type<-"svr300"
x4$type<-"svr500"
z4$type<-"pls500"
z3$type<-"pls350"
z2$type<-"pls250"
z1$type<-"pls200"
heatmap <-rbind(a3,a4,a5,a6,
x1,x2,x3,x4,
z1,z2,z3,z4)
Heatmap per cell (Pearson)
#library(ggplotify)
#par(mfrow=c(2,1))
pattern="DS"
heatmap %>% group_by(type,cells) %>% summarise(pearson=mean(pearson)) %>% reshape2::acast(type ~cells) %>% as.matrix() %>% d3heatmap::d3heatmap(colors = "Blues")
Heatmap per cell rnaseq (Pearson)
heatmap %>% filter(datasets %in% c("DS446395","DS500","CIAS4","CIVA3")) %>% group_by(type,cells) %>% summarise(pearson=mean(pearson)) %>% reshape2::acast(type ~cells) %>% as.matrix() %>% d3heatmap::d3heatmap(colors = "Blues")
Heatmap per cell (Spearman)
heatmap %>% group_by(type,cells) %>% summarise(spearman=mean(spearman)) %>% reshape2::acast(type ~cells) %>% as.matrix() %>% d3heatmap::d3heatmap(colors = "Reds")
Heatmap per cell rnaseq (Spearman)
heatmap %>% filter(datasets %in% c("DS446395","DS500","CIAS4","CIVA3")) %>% group_by(type,cells) %>% summarise(spearman=mean(spearman)) %>% reshape2::acast(type ~cells) %>% as.matrix() %>% d3heatmap::d3heatmap(colors = "Reds")
Heatmap per dataset (Pearson)
#library(ggplotify)
#par(mfrow=c(2,1))
pattern="DS"
heatmap %>% group_by(type,datasets) %>% summarise(pearson=mean(pearson)) %>% reshape2::acast(type ~datasets) %>% as.matrix() %>% d3heatmap::d3heatmap(colors = "Blues")
Heatmap per dataset rnaseq (Pearson)
heatmap %>% filter(datasets %in% c("DS446395","DS500","CIAS4","CIVA3")) %>% group_by(type,datasets) %>% summarise(pearson=mean(pearson)) %>% reshape2::acast(type ~datasets) %>% as.matrix() %>% d3heatmap::d3heatmap(colors = "Blues")
Heatmap per dataset (Spearman)
heatmap %>% group_by(type,datasets) %>% summarise(spearman=mean(spearman)) %>% reshape2::acast(type ~datasets) %>% as.matrix() %>% d3heatmap::d3heatmap(colors = "Reds")
Heatmap per dataset rnaseq (Spearman)
heatmap %>% filter(datasets %in% c("DS446395","DS500","CIAS4","CIVA3")) %>% group_by(type,datasets) %>% summarise(spearman=mean(spearman)) %>% reshape2::acast(type ~datasets) %>% as.matrix() %>% d3heatmap::d3heatmap(colors = "Reds")
a3 [glmnet200] Results for glmnet 200 features over 20000 (RF2)
filename<-"./devcon_challenge.glmnet_results_noscale_rf_selected_features_200_20000_newmix.csv"
readr::write_csv(RESULTS,path = filename)
a3<-readr::read_csv(filename) %>% filter(!is.na(pearson))
a3
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>% summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>% filter( datasets %in% c("DS446395","DS500","CIAS4","CIVA3")) %>% summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
a4 [glmnet250] Results for glmnet 250 features over 20000 (RF2)
filename<-"./devcon_challenge.glmnet_results_noscale_rf_selected_features_250_20000_newmix.csv"
readr::write_csv(RESULTS,path = filename)
a4<-readr::read_csv(filename) %>% filter(!is.na(pearson))
a4
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>% summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>% filter( datasets %in% c("DS446395","DS500","CIAS4","CIVA3")) %>% summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
a5 [glmnet350] Results for glmnet 350 features over 20000 (RF2)
filename<-"./devcon_challenge.glmnet_results_noscale_rf_selected_features_350_20000_all_newmix.csv"
readr::write_csv(RESULTS,path = filename)
a5<-readr::read_csv(filename) %>% filter(!is.na(pearson))
a5
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>% summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>% filter( datasets %in% c("DS446395","DS500","CIAS4","CIVA3")) %>% summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
a6 [glmnet500] Results for glmnet 500 features over 20000 (RF2)
filename<-"./devcon_challenge.glmnet_results_noscale_rf_selected_features_500_20000_newmix.csv"
readr::write_csv(RESULTS,path = filename)
a6<-readr::read_csv(filename) %>% filter(!is.na(pearson))
a6
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>% summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>% filter( datasets %in% c("DS446395","DS500","CIAS4","CIVA3")) %>% summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
NA
x1 [svr200] Results for svr radial noscale 200 features over 20000 (RF2)
filename<-"./devcon_challenge.svr_results_rf_selected_features_200_20000_noscale_newmix.csv"
readr::write_csv(RESULTS,path = filename)
x1<-readr::read_csv(filename) %>% filter(!is.na(pearson))
x1
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>% summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>% filter( datasets %in% c("DS446395","DS500","CIAS4","CIVA3")) %>% summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
x2 [svr250] Results for svr radial noscale 250 features over 20000 (RF2)
filename<-"./devcon_challenge.svr_results_rf_selected_features_250_20000_noscale_newmix.csv"
readr::write_csv(RESULTS,path = filename)
x2<-readr::read_csv(filename) %>% filter(!is.na(pearson))
x2
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>% summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>% filter( datasets %in% c("DS446395","DS500","CIAS4","CIVA3")) %>% summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
x3 [svr350] Results for svr radial noscale 350 features over 20000 (RF2)
filename<-"./devcon_challenge.svr_results_rf_selected_features_350_20000_noscale_newmix.csv"
readr::write_csv(RESULTS,path = filename)
x3<-readr::read_csv(filename) %>% filter(!is.na(pearson))
x3
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>% summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>% filter( datasets %in% c("DS446395","DS500","CIAS4","CIVA3")) %>% summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
x4 [svr500] Results for svr radial noscale 500 features over 20000 (RF2)
filename<-"./devcon_challenge.svr_results_rf_selected_features_500_20000_noscale_newmix.csv"
#readr::write_csv(RESULTS,path = filename)
x4<-readr::read_csv(filename) %>% filter(!is.na(pearson))
x4
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>% summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>% filter( datasets %in% c("DS446395","DS500","CIAS4","CIVA3")) %>% summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
z4 [pls500] Results for pls 500 features (RF)
filename<-"./devcon_challenge.pls_results_rf_selected_features_500_20000_noscale_newmix.csv"
readr::write_csv(RESULTS,path = filename)
z4<-readr::read_csv(filename) %>% filter(!is.na(pearson))
z4
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>% summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>% filter( datasets %in% c("DS446395","DS500","CIAS4","CIVA3")) %>% summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
z3 [pls350] Results for pls 350 features (RF)
filename<-"./devcon_challenge.pls_results_rf_selected_features_350_20000_noscale_newmix.csv"
readr::write_csv(RESULTS,path = filename)
z3<-readr::read_csv(filename) %>% filter(!is.na(pearson))
z3
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>% summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>% filter( datasets %in% c("DS446395","DS500","CIAS4","CIVA3")) %>% summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
z2 [pls250] Results for pls 250 features (RF)
filename<-"./devcon_challenge.pls_results_rf_selected_features_250_20000_noscale_newmix.csv"
readr::write_csv(RESULTS,path = filename)
z2<-readr::read_csv(filename) %>% filter(!is.na(pearson))
z2
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>% summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>% filter( datasets %in% c("DS446395","DS500","CIAS4","CIVA3")) %>% summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
z1 [pls200] Results for pls 200 features (RF)
filename<-"./devcon_challenge.pls_results_rf_selected_features_200_20000_noscale_newmix"
readr::write_csv(RESULTS,path = filename)
z1<-readr::read_csv(filename) %>% filter(!is.na(pearson))
z1
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>% summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>% filter( datasets %in% c("DS446395","DS500","CIAS4","CIVA3")) %>% summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
load("results_glmnet_devcon_bestmodels_fgdata_cps_20000_2_selected_features_250_test_added.rdata")
glmnet250<-results_final_models
load("results_svr_radial_devcon_bestmodels_fgdata_cps_20000_2_noscale_selected_features_200_newgama_test_added.rdata")
svr200<-results_final_models
glmnet250[['cancer']]$nzero
svr200[['cancer']]$
LS0tCnRpdGxlOiAiREVDT05WIERSRUFNIENoYWxsZW5lZ2UgMjAyMCAoNCkiCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazogCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIHRvYzogeWVzCi0tLQoKCgpgYGB7ciBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD04fQpsaWJyYXJ5KGdyaWRFeHRyYSkKbGlicmFyeShnZ3Bsb3QyKQphMyR0eXBlPC0iZ2xtbmV0MjAwIgphNCR0eXBlPC0iZ2xtbmV0MjUwIgphNSR0eXBlPC0iZ2xtbmV0MzUwIgphNiR0eXBlPC0iZ2xtbmV0NTAwIgp4MSR0eXBlPC0ic3ZyMjAwIgp4MiR0eXBlPC0ic3ZyMjUwIgp4MyR0eXBlPC0ic3ZyMzAwIgp4NCR0eXBlPC0ic3ZyNTAwIgoKejQkdHlwZTwtInBsczUwMCIKejMkdHlwZTwtInBsczM1MCIKejIkdHlwZTwtInBsczI1MCIKejEkdHlwZTwtInBsczIwMCIKCmhlYXRtYXAgPC1yYmluZChhMyxhNCxhNSxhNiwKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgeDEseDIseDMseDQsCiAgICAgICAgICAgICAgICB6MSx6Mix6Myx6NCkKCiAKYGBgCgoKIyMgSGVhdG1hcCBwZXIgY2VsbCAoUGVhcnNvbikKYGBge3IgZmlnLndpZHRoPTcsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiNsaWJyYXJ5KGdncGxvdGlmeSkKI3BhcihtZnJvdz1jKDIsMSkpCnBhdHRlcm49IkRTIgoKaGVhdG1hcCAlPiUgZ3JvdXBfYnkodHlwZSxjZWxscykgJT4lICBzdW1tYXJpc2UocGVhcnNvbj1tZWFuKHBlYXJzb24pKSAlPiUgcmVzaGFwZTI6OmFjYXN0KHR5cGUgfmNlbGxzKSAlPiUgYXMubWF0cml4KCkgJT4lIGQzaGVhdG1hcDo6ZDNoZWF0bWFwKGNvbG9ycyA9ICJCbHVlcyIpCmBgYAojIyBIZWF0bWFwIHBlciBjZWxsIHJuYXNlcSAoUGVhcnNvbikKYGBge3IgZmlnLndpZHRoPTcsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgpoZWF0bWFwICU+JSBmaWx0ZXIoZGF0YXNldHMgJWluJSBjKCJEUzQ0NjM5NSIsIkRTNTAwIiwiQ0lBUzQiLCJDSVZBMyIpKSAlPiUgZ3JvdXBfYnkodHlwZSxjZWxscykgJT4lICBzdW1tYXJpc2UocGVhcnNvbj1tZWFuKHBlYXJzb24pKSAlPiUgcmVzaGFwZTI6OmFjYXN0KHR5cGUgfmNlbGxzKSAlPiUgYXMubWF0cml4KCkgJT4lIGQzaGVhdG1hcDo6ZDNoZWF0bWFwKGNvbG9ycyA9ICJCbHVlcyIpCmBgYAoKIyMgSGVhdG1hcCBwZXIgY2VsbCAoU3BlYXJtYW4pCmBgYHtyIGZpZy53aWR0aD03LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpoZWF0bWFwICU+JSBncm91cF9ieSh0eXBlLGNlbGxzKSAlPiUgc3VtbWFyaXNlKHNwZWFybWFuPW1lYW4oc3BlYXJtYW4pKSAlPiUgcmVzaGFwZTI6OmFjYXN0KHR5cGUgfmNlbGxzKSAlPiUgYXMubWF0cml4KCkgJT4lIGQzaGVhdG1hcDo6ZDNoZWF0bWFwKGNvbG9ycyA9ICJSZWRzIikKYGBgCgojIyBIZWF0bWFwIHBlciBjZWxsIHJuYXNlcSAoU3BlYXJtYW4pCmBgYHtyIGZpZy53aWR0aD03LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpoZWF0bWFwICAlPiUgZmlsdGVyKGRhdGFzZXRzICVpbiUgYygiRFM0NDYzOTUiLCJEUzUwMCIsIkNJQVM0IiwiQ0lWQTMiKSkgJT4lIGdyb3VwX2J5KHR5cGUsY2VsbHMpICU+JSBzdW1tYXJpc2Uoc3BlYXJtYW49bWVhbihzcGVhcm1hbikpICU+JSByZXNoYXBlMjo6YWNhc3QodHlwZSB+Y2VsbHMpICU+JSBhcy5tYXRyaXgoKSAlPiUgZDNoZWF0bWFwOjpkM2hlYXRtYXAoY29sb3JzID0gIlJlZHMiKQpgYGAKCgoKCiMjIEhlYXRtYXAgcGVyIGRhdGFzZXQgKFBlYXJzb24pCmBgYHtyIGZpZy53aWR0aD03LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojbGlicmFyeShnZ3Bsb3RpZnkpCiNwYXIobWZyb3c9YygyLDEpKQpwYXR0ZXJuPSJEUyIKCmhlYXRtYXAgJT4lIGdyb3VwX2J5KHR5cGUsZGF0YXNldHMpICU+JSAgc3VtbWFyaXNlKHBlYXJzb249bWVhbihwZWFyc29uKSkgJT4lIHJlc2hhcGUyOjphY2FzdCh0eXBlIH5kYXRhc2V0cykgJT4lIGFzLm1hdHJpeCgpICU+JSBkM2hlYXRtYXA6OmQzaGVhdG1hcChjb2xvcnMgPSAiQmx1ZXMiKQpgYGAKIyMgSGVhdG1hcCBwZXIgZGF0YXNldCBybmFzZXEgKFBlYXJzb24pCmBgYHtyIGZpZy53aWR0aD03LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKaGVhdG1hcCAlPiUgZmlsdGVyKGRhdGFzZXRzICVpbiUgYygiRFM0NDYzOTUiLCJEUzUwMCIsIkNJQVM0IiwiQ0lWQTMiKSkgJT4lIGdyb3VwX2J5KHR5cGUsZGF0YXNldHMpICU+JSAgc3VtbWFyaXNlKHBlYXJzb249bWVhbihwZWFyc29uKSkgJT4lIHJlc2hhcGUyOjphY2FzdCh0eXBlIH5kYXRhc2V0cykgJT4lIGFzLm1hdHJpeCgpICU+JSBkM2hlYXRtYXA6OmQzaGVhdG1hcChjb2xvcnMgPSAiQmx1ZXMiKQpgYGAKCiMjIEhlYXRtYXAgcGVyIGRhdGFzZXQgKFNwZWFybWFuKQpgYGB7ciBmaWcud2lkdGg9NywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KaGVhdG1hcCAlPiUgZ3JvdXBfYnkodHlwZSxkYXRhc2V0cykgJT4lIHN1bW1hcmlzZShzcGVhcm1hbj1tZWFuKHNwZWFybWFuKSkgJT4lIHJlc2hhcGUyOjphY2FzdCh0eXBlIH5kYXRhc2V0cykgJT4lIGFzLm1hdHJpeCgpICU+JSBkM2hlYXRtYXA6OmQzaGVhdG1hcChjb2xvcnMgPSAiUmVkcyIpCmBgYAoKIyMgSGVhdG1hcCBwZXIgZGF0YXNldCBybmFzZXEgKFNwZWFybWFuKQpgYGB7ciBmaWcud2lkdGg9NywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KaGVhdG1hcCAgJT4lIGZpbHRlcihkYXRhc2V0cyAlaW4lIGMoIkRTNDQ2Mzk1IiwiRFM1MDAiLCJDSUFTNCIsIkNJVkEzIikpICU+JSBncm91cF9ieSh0eXBlLGRhdGFzZXRzKSAlPiUgc3VtbWFyaXNlKHNwZWFybWFuPW1lYW4oc3BlYXJtYW4pKSAlPiUgcmVzaGFwZTI6OmFjYXN0KHR5cGUgfmRhdGFzZXRzKSAlPiUgYXMubWF0cml4KCkgJT4lIGQzaGVhdG1hcDo6ZDNoZWF0bWFwKGNvbG9ycyA9ICJSZWRzIikKYGBgCgoKCgoKIyMgYTMgW2dsbW5ldDIwMF0gUmVzdWx0cyBmb3IgZ2xtbmV0IDIwMCBmZWF0dXJlcyBvdmVyIDIwMDAwIChSRjIpCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmZpbGVuYW1lPC0iLi9kZXZjb25fY2hhbGxlbmdlLmdsbW5ldF9yZXN1bHRzX25vc2NhbGVfcmZfc2VsZWN0ZWRfZmVhdHVyZXNfMjAwXzIwMDAwX25ld21peC5jc3YiCiNyZWFkcjo6d3JpdGVfY3N2KFJFU1VMVFMscGF0aCA9IGZpbGVuYW1lKQphMzwtcmVhZHI6OnJlYWRfY3N2KGZpbGVuYW1lKSAlPiUgZmlsdGVyKCFpcy5uYShwZWFyc29uKSkgCmEzCnJlYWRyOjpyZWFkX2NzdihmaWxlbmFtZSkgJT4lIGZpbHRlcighaXMubmEocGVhcnNvbikpICU+JSAgc3VtbWFyaXNlKHBlYXJzb25fbWVhbj1tZWFuKHBlYXJzb24pLHNwZWFybWFuX21lYW49bWVhbihzcGVhcm1hbikpCnJlYWRyOjpyZWFkX2NzdihmaWxlbmFtZSkgJT4lIGZpbHRlcighaXMubmEocGVhcnNvbikpICAlPiUgZmlsdGVyKCBkYXRhc2V0cyAlaW4lIGMoIkRTNDQ2Mzk1IiwiRFM1MDAiLCJDSUFTNCIsIkNJVkEzIikpICU+JSAgc3VtbWFyaXNlKHBlYXJzb25fbWVhbj1tZWFuKHBlYXJzb24pLHNwZWFybWFuX21lYW49bWVhbihzcGVhcm1hbikpCmBgYAoKCiMjIGE0IFtnbG1uZXQyNTBdIFJlc3VsdHMgZm9yIGdsbW5ldCAyNTAgZmVhdHVyZXMgb3ZlciAyMDAwMCAoUkYyKQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpmaWxlbmFtZTwtIi4vZGV2Y29uX2NoYWxsZW5nZS5nbG1uZXRfcmVzdWx0c19ub3NjYWxlX3JmX3NlbGVjdGVkX2ZlYXR1cmVzXzI1MF8yMDAwMF9uZXdtaXguY3N2IgojcmVhZHI6OndyaXRlX2NzdihSRVNVTFRTLHBhdGggPSBmaWxlbmFtZSkKYTQ8LXJlYWRyOjpyZWFkX2NzdihmaWxlbmFtZSkgJT4lIGZpbHRlcighaXMubmEocGVhcnNvbikpIAphNApyZWFkcjo6cmVhZF9jc3YoZmlsZW5hbWUpICU+JSBmaWx0ZXIoIWlzLm5hKHBlYXJzb24pKSAlPiUgIHN1bW1hcmlzZShwZWFyc29uX21lYW49bWVhbihwZWFyc29uKSxzcGVhcm1hbl9tZWFuPW1lYW4oc3BlYXJtYW4pKQpyZWFkcjo6cmVhZF9jc3YoZmlsZW5hbWUpICU+JSBmaWx0ZXIoIWlzLm5hKHBlYXJzb24pKSAgJT4lIGZpbHRlciggZGF0YXNldHMgJWluJSBjKCJEUzQ0NjM5NSIsIkRTNTAwIiwiQ0lBUzQiLCJDSVZBMyIpKSAlPiUgIHN1bW1hcmlzZShwZWFyc29uX21lYW49bWVhbihwZWFyc29uKSxzcGVhcm1hbl9tZWFuPW1lYW4oc3BlYXJtYW4pKQpgYGAKCiMjIGE1IFtnbG1uZXQzNTBdIFJlc3VsdHMgZm9yIGdsbW5ldCAzNTAgZmVhdHVyZXMgb3ZlciAyMDAwMCAoUkYyKQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpmaWxlbmFtZTwtIi4vZGV2Y29uX2NoYWxsZW5nZS5nbG1uZXRfcmVzdWx0c19ub3NjYWxlX3JmX3NlbGVjdGVkX2ZlYXR1cmVzXzM1MF8yMDAwMF9hbGxfbmV3bWl4LmNzdiIKI3JlYWRyOjp3cml0ZV9jc3YoUkVTVUxUUyxwYXRoID0gZmlsZW5hbWUpCmE1PC1yZWFkcjo6cmVhZF9jc3YoZmlsZW5hbWUpICU+JSBmaWx0ZXIoIWlzLm5hKHBlYXJzb24pKSAKYTUKcmVhZHI6OnJlYWRfY3N2KGZpbGVuYW1lKSAlPiUgZmlsdGVyKCFpcy5uYShwZWFyc29uKSkgJT4lICBzdW1tYXJpc2UocGVhcnNvbl9tZWFuPW1lYW4ocGVhcnNvbiksc3BlYXJtYW5fbWVhbj1tZWFuKHNwZWFybWFuKSkKcmVhZHI6OnJlYWRfY3N2KGZpbGVuYW1lKSAlPiUgZmlsdGVyKCFpcy5uYShwZWFyc29uKSkgICU+JSBmaWx0ZXIoIGRhdGFzZXRzICVpbiUgYygiRFM0NDYzOTUiLCJEUzUwMCIsIkNJQVM0IiwiQ0lWQTMiKSkgJT4lICBzdW1tYXJpc2UocGVhcnNvbl9tZWFuPW1lYW4ocGVhcnNvbiksc3BlYXJtYW5fbWVhbj1tZWFuKHNwZWFybWFuKSkKYGBgCgojIyBhNiBbZ2xtbmV0NTAwXSBSZXN1bHRzIGZvciBnbG1uZXQgNTAwIGZlYXR1cmVzIG92ZXIgMjAwMDAgKFJGMikKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZmlsZW5hbWU8LSIuL2RldmNvbl9jaGFsbGVuZ2UuZ2xtbmV0X3Jlc3VsdHNfbm9zY2FsZV9yZl9zZWxlY3RlZF9mZWF0dXJlc181MDBfMjAwMDBfbmV3bWl4LmNzdiIKI3JlYWRyOjp3cml0ZV9jc3YoUkVTVUxUUyxwYXRoID0gZmlsZW5hbWUpCmE2PC1yZWFkcjo6cmVhZF9jc3YoZmlsZW5hbWUpICU+JSBmaWx0ZXIoIWlzLm5hKHBlYXJzb24pKSAKYTYKcmVhZHI6OnJlYWRfY3N2KGZpbGVuYW1lKSAlPiUgZmlsdGVyKCFpcy5uYShwZWFyc29uKSkgJT4lICBzdW1tYXJpc2UocGVhcnNvbl9tZWFuPW1lYW4ocGVhcnNvbiksc3BlYXJtYW5fbWVhbj1tZWFuKHNwZWFybWFuKSkKcmVhZHI6OnJlYWRfY3N2KGZpbGVuYW1lKSAlPiUgZmlsdGVyKCFpcy5uYShwZWFyc29uKSkgICU+JSBmaWx0ZXIoIGRhdGFzZXRzICVpbiUgYygiRFM0NDYzOTUiLCJEUzUwMCIsIkNJQVM0IiwiQ0lWQTMiKSkgJT4lICBzdW1tYXJpc2UocGVhcnNvbl9tZWFuPW1lYW4ocGVhcnNvbiksc3BlYXJtYW5fbWVhbj1tZWFuKHNwZWFybWFuKSkKCmBgYAojIyB4MSBbc3ZyMjAwXSBSZXN1bHRzIGZvciBzdnIgcmFkaWFsIG5vc2NhbGUgMjAwIGZlYXR1cmVzIG92ZXIgMjAwMDAgKFJGMikgCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmZpbGVuYW1lPC0iLi9kZXZjb25fY2hhbGxlbmdlLnN2cl9yZXN1bHRzX3JmX3NlbGVjdGVkX2ZlYXR1cmVzXzIwMF8yMDAwMF9ub3NjYWxlX25ld21peC5jc3YiCiNyZWFkcjo6d3JpdGVfY3N2KFJFU1VMVFMscGF0aCA9IGZpbGVuYW1lKQp4MTwtcmVhZHI6OnJlYWRfY3N2KGZpbGVuYW1lKSAlPiUgZmlsdGVyKCFpcy5uYShwZWFyc29uKSkgCngxCnJlYWRyOjpyZWFkX2NzdihmaWxlbmFtZSkgJT4lIGZpbHRlcighaXMubmEocGVhcnNvbikpICU+JSAgc3VtbWFyaXNlKHBlYXJzb25fbWVhbj1tZWFuKHBlYXJzb24pLHNwZWFybWFuX21lYW49bWVhbihzcGVhcm1hbikpCnJlYWRyOjpyZWFkX2NzdihmaWxlbmFtZSkgJT4lIGZpbHRlcighaXMubmEocGVhcnNvbikpICAlPiUgZmlsdGVyKCBkYXRhc2V0cyAlaW4lIGMoIkRTNDQ2Mzk1IiwiRFM1MDAiLCJDSUFTNCIsIkNJVkEzIikpICU+JSAgc3VtbWFyaXNlKHBlYXJzb25fbWVhbj1tZWFuKHBlYXJzb24pLHNwZWFybWFuX21lYW49bWVhbihzcGVhcm1hbikpCmBgYAoKCgojIyB4MiBbc3ZyMjUwXSBSZXN1bHRzIGZvciBzdnIgcmFkaWFsIG5vc2NhbGUgMjUwIGZlYXR1cmVzIG92ZXIgMjAwMDAgKFJGMikgCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmZpbGVuYW1lPC0iLi9kZXZjb25fY2hhbGxlbmdlLnN2cl9yZXN1bHRzX3JmX3NlbGVjdGVkX2ZlYXR1cmVzXzI1MF8yMDAwMF9ub3NjYWxlX25ld21peC5jc3YiCiNyZWFkcjo6d3JpdGVfY3N2KFJFU1VMVFMscGF0aCA9IGZpbGVuYW1lKQp4MjwtcmVhZHI6OnJlYWRfY3N2KGZpbGVuYW1lKSAlPiUgZmlsdGVyKCFpcy5uYShwZWFyc29uKSkgCngyCnJlYWRyOjpyZWFkX2NzdihmaWxlbmFtZSkgJT4lIGZpbHRlcighaXMubmEocGVhcnNvbikpICU+JSAgc3VtbWFyaXNlKHBlYXJzb25fbWVhbj1tZWFuKHBlYXJzb24pLHNwZWFybWFuX21lYW49bWVhbihzcGVhcm1hbikpCnJlYWRyOjpyZWFkX2NzdihmaWxlbmFtZSkgJT4lIGZpbHRlcighaXMubmEocGVhcnNvbikpICAlPiUgZmlsdGVyKCBkYXRhc2V0cyAlaW4lIGMoIkRTNDQ2Mzk1IiwiRFM1MDAiLCJDSUFTNCIsIkNJVkEzIikpICU+JSAgc3VtbWFyaXNlKHBlYXJzb25fbWVhbj1tZWFuKHBlYXJzb24pLHNwZWFybWFuX21lYW49bWVhbihzcGVhcm1hbikpCmBgYAoKCiMjIHgzIFtzdnIzNTBdIFJlc3VsdHMgZm9yIHN2ciByYWRpYWwgbm9zY2FsZSAzNTAgZmVhdHVyZXMgb3ZlciAyMDAwMCAoUkYyKSAKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZmlsZW5hbWU8LSIuL2RldmNvbl9jaGFsbGVuZ2Uuc3ZyX3Jlc3VsdHNfcmZfc2VsZWN0ZWRfZmVhdHVyZXNfMzUwXzIwMDAwX25vc2NhbGVfbmV3bWl4LmNzdiIKI3JlYWRyOjp3cml0ZV9jc3YoUkVTVUxUUyxwYXRoID0gZmlsZW5hbWUpCngzPC1yZWFkcjo6cmVhZF9jc3YoZmlsZW5hbWUpICU+JSBmaWx0ZXIoIWlzLm5hKHBlYXJzb24pKSAKeDMKcmVhZHI6OnJlYWRfY3N2KGZpbGVuYW1lKSAlPiUgZmlsdGVyKCFpcy5uYShwZWFyc29uKSkgJT4lICBzdW1tYXJpc2UocGVhcnNvbl9tZWFuPW1lYW4ocGVhcnNvbiksc3BlYXJtYW5fbWVhbj1tZWFuKHNwZWFybWFuKSkKcmVhZHI6OnJlYWRfY3N2KGZpbGVuYW1lKSAlPiUgZmlsdGVyKCFpcy5uYShwZWFyc29uKSkgICU+JSBmaWx0ZXIoIGRhdGFzZXRzICVpbiUgYygiRFM0NDYzOTUiLCJEUzUwMCIsIkNJQVM0IiwiQ0lWQTMiKSkgJT4lICBzdW1tYXJpc2UocGVhcnNvbl9tZWFuPW1lYW4ocGVhcnNvbiksc3BlYXJtYW5fbWVhbj1tZWFuKHNwZWFybWFuKSkKYGBgCgoKIyMgeDQgW3N2cjUwMF0gUmVzdWx0cyBmb3Igc3ZyIHJhZGlhbCBub3NjYWxlIDUwMCBmZWF0dXJlcyBvdmVyIDIwMDAwIChSRjIpIApgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpmaWxlbmFtZTwtIi4vZGV2Y29uX2NoYWxsZW5nZS5zdnJfcmVzdWx0c19yZl9zZWxlY3RlZF9mZWF0dXJlc181MDBfMjAwMDBfbm9zY2FsZV9uZXdtaXguY3N2IgojcmVhZHI6OndyaXRlX2NzdihSRVNVTFRTLHBhdGggPSBmaWxlbmFtZSkKeDQ8LXJlYWRyOjpyZWFkX2NzdihmaWxlbmFtZSkgJT4lIGZpbHRlcighaXMubmEocGVhcnNvbikpIAp4NApyZWFkcjo6cmVhZF9jc3YoZmlsZW5hbWUpICU+JSBmaWx0ZXIoIWlzLm5hKHBlYXJzb24pKSAlPiUgIHN1bW1hcmlzZShwZWFyc29uX21lYW49bWVhbihwZWFyc29uKSxzcGVhcm1hbl9tZWFuPW1lYW4oc3BlYXJtYW4pKQpyZWFkcjo6cmVhZF9jc3YoZmlsZW5hbWUpICU+JSBmaWx0ZXIoIWlzLm5hKHBlYXJzb24pKSAgJT4lIGZpbHRlciggZGF0YXNldHMgJWluJSBjKCJEUzQ0NjM5NSIsIkRTNTAwIiwiQ0lBUzQiLCJDSVZBMyIpKSAlPiUgIHN1bW1hcmlzZShwZWFyc29uX21lYW49bWVhbihwZWFyc29uKSxzcGVhcm1hbl9tZWFuPW1lYW4oc3BlYXJtYW4pKQpgYGAKCiMjIHo0IFtwbHM1MDBdIFJlc3VsdHMgZm9yIHBscyA1MDAgZmVhdHVyZXMgKFJGKQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpmaWxlbmFtZTwtIi4vZGV2Y29uX2NoYWxsZW5nZS5wbHNfcmVzdWx0c19yZl9zZWxlY3RlZF9mZWF0dXJlc181MDBfMjAwMDBfbm9zY2FsZV9uZXdtaXguY3N2IgojcmVhZHI6OndyaXRlX2NzdihSRVNVTFRTLHBhdGggPSBmaWxlbmFtZSkKejQ8LXJlYWRyOjpyZWFkX2NzdihmaWxlbmFtZSkgJT4lIGZpbHRlcighaXMubmEocGVhcnNvbikpIAp6NApyZWFkcjo6cmVhZF9jc3YoZmlsZW5hbWUpICU+JSBmaWx0ZXIoIWlzLm5hKHBlYXJzb24pKSAlPiUgIHN1bW1hcmlzZShwZWFyc29uX21lYW49bWVhbihwZWFyc29uKSxzcGVhcm1hbl9tZWFuPW1lYW4oc3BlYXJtYW4pKQpyZWFkcjo6cmVhZF9jc3YoZmlsZW5hbWUpICU+JSBmaWx0ZXIoIWlzLm5hKHBlYXJzb24pKSAgJT4lIGZpbHRlciggZGF0YXNldHMgJWluJSBjKCJEUzQ0NjM5NSIsIkRTNTAwIiwiQ0lBUzQiLCJDSVZBMyIpKSAlPiUgIHN1bW1hcmlzZShwZWFyc29uX21lYW49bWVhbihwZWFyc29uKSxzcGVhcm1hbl9tZWFuPW1lYW4oc3BlYXJtYW4pKQpgYGAKIyMgejMgW3BsczM1MF0gUmVzdWx0cyBmb3IgcGxzIDM1MCBmZWF0dXJlcyAoUkYpCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmZpbGVuYW1lPC0iLi9kZXZjb25fY2hhbGxlbmdlLnBsc19yZXN1bHRzX3JmX3NlbGVjdGVkX2ZlYXR1cmVzXzM1MF8yMDAwMF9ub3NjYWxlX25ld21peC5jc3YiCiNyZWFkcjo6d3JpdGVfY3N2KFJFU1VMVFMscGF0aCA9IGZpbGVuYW1lKQp6MzwtcmVhZHI6OnJlYWRfY3N2KGZpbGVuYW1lKSAlPiUgZmlsdGVyKCFpcy5uYShwZWFyc29uKSkgCnozCnJlYWRyOjpyZWFkX2NzdihmaWxlbmFtZSkgJT4lIGZpbHRlcighaXMubmEocGVhcnNvbikpICU+JSAgc3VtbWFyaXNlKHBlYXJzb25fbWVhbj1tZWFuKHBlYXJzb24pLHNwZWFybWFuX21lYW49bWVhbihzcGVhcm1hbikpCnJlYWRyOjpyZWFkX2NzdihmaWxlbmFtZSkgJT4lIGZpbHRlcighaXMubmEocGVhcnNvbikpICAlPiUgZmlsdGVyKCBkYXRhc2V0cyAlaW4lIGMoIkRTNDQ2Mzk1IiwiRFM1MDAiLCJDSUFTNCIsIkNJVkEzIikpICU+JSAgc3VtbWFyaXNlKHBlYXJzb25fbWVhbj1tZWFuKHBlYXJzb24pLHNwZWFybWFuX21lYW49bWVhbihzcGVhcm1hbikpCmBgYAojIyB6MiBbcGxzMjUwXSBSZXN1bHRzIGZvciBwbHMgMjUwIGZlYXR1cmVzIChSRikKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZmlsZW5hbWU8LSIuL2RldmNvbl9jaGFsbGVuZ2UucGxzX3Jlc3VsdHNfcmZfc2VsZWN0ZWRfZmVhdHVyZXNfMjUwXzIwMDAwX25vc2NhbGVfbmV3bWl4LmNzdiIKI3JlYWRyOjp3cml0ZV9jc3YoUkVTVUxUUyxwYXRoID0gZmlsZW5hbWUpCnoyPC1yZWFkcjo6cmVhZF9jc3YoZmlsZW5hbWUpICU+JSBmaWx0ZXIoIWlzLm5hKHBlYXJzb24pKSAKejIKcmVhZHI6OnJlYWRfY3N2KGZpbGVuYW1lKSAlPiUgZmlsdGVyKCFpcy5uYShwZWFyc29uKSkgJT4lICBzdW1tYXJpc2UocGVhcnNvbl9tZWFuPW1lYW4ocGVhcnNvbiksc3BlYXJtYW5fbWVhbj1tZWFuKHNwZWFybWFuKSkKcmVhZHI6OnJlYWRfY3N2KGZpbGVuYW1lKSAlPiUgZmlsdGVyKCFpcy5uYShwZWFyc29uKSkgICU+JSBmaWx0ZXIoIGRhdGFzZXRzICVpbiUgYygiRFM0NDYzOTUiLCJEUzUwMCIsIkNJQVM0IiwiQ0lWQTMiKSkgJT4lICBzdW1tYXJpc2UocGVhcnNvbl9tZWFuPW1lYW4ocGVhcnNvbiksc3BlYXJtYW5fbWVhbj1tZWFuKHNwZWFybWFuKSkKYGBgCgojIyB6MSBbcGxzMjAwXSBSZXN1bHRzIGZvciBwbHMgMjAwIGZlYXR1cmVzIChSRikKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZmlsZW5hbWU8LSIuL2RldmNvbl9jaGFsbGVuZ2UucGxzX3Jlc3VsdHNfcmZfc2VsZWN0ZWRfZmVhdHVyZXNfMjAwXzIwMDAwX25vc2NhbGVfbmV3bWl4IgojcmVhZHI6OndyaXRlX2NzdihSRVNVTFRTLHBhdGggPSBmaWxlbmFtZSkKejE8LXJlYWRyOjpyZWFkX2NzdihmaWxlbmFtZSkgJT4lIGZpbHRlcighaXMubmEocGVhcnNvbikpIAp6MQpyZWFkcjo6cmVhZF9jc3YoZmlsZW5hbWUpICU+JSBmaWx0ZXIoIWlzLm5hKHBlYXJzb24pKSAlPiUgIHN1bW1hcmlzZShwZWFyc29uX21lYW49bWVhbihwZWFyc29uKSxzcGVhcm1hbl9tZWFuPW1lYW4oc3BlYXJtYW4pKQpyZWFkcjo6cmVhZF9jc3YoZmlsZW5hbWUpICU+JSBmaWx0ZXIoIWlzLm5hKHBlYXJzb24pKSAgJT4lIGZpbHRlciggZGF0YXNldHMgJWluJSBjKCJEUzQ0NjM5NSIsIkRTNTAwIiwiQ0lBUzQiLCJDSVZBMyIpKSAlPiUgIHN1bW1hcmlzZShwZWFyc29uX21lYW49bWVhbihwZWFyc29uKSxzcGVhcm1hbl9tZWFuPW1lYW4oc3BlYXJtYW4pKQpgYGAKYGBge3J9CmxvYWQoInJlc3VsdHNfZ2xtbmV0X2RldmNvbl9iZXN0bW9kZWxzX2ZnZGF0YV9jcHNfMjAwMDBfMl9zZWxlY3RlZF9mZWF0dXJlc18yNTBfdGVzdF9hZGRlZC5yZGF0YSIpCmdsbW5ldDI1MDwtcmVzdWx0c19maW5hbF9tb2RlbHMKCmxvYWQoInJlc3VsdHNfc3ZyX3JhZGlhbF9kZXZjb25fYmVzdG1vZGVsc19mZ2RhdGFfY3BzXzIwMDAwXzJfbm9zY2FsZV9zZWxlY3RlZF9mZWF0dXJlc18yMDBfbmV3Z2FtYV90ZXN0X2FkZGVkLnJkYXRhIikKc3ZyMjAwPC1yZXN1bHRzX2ZpbmFsX21vZGVscwoKZ2xtbmV0MjUwW1snY2FuY2VyJ11dJG56ZXJvCnN2cjIwMFtbJ2NhbmNlciddXSQKYGBgCgo=