Performance of prime-seq across many experiments

###1. Load the following packages:

library(tidyverse)
library(ggsignif)
library(ggplotify)
library(ggrepel)
library(ggbeeswarm)
library(edgeR)
library(genefilter)
library(grid)
library(gridExtra)
library(ggsci)
library(UpSetR)
library(cowplot)

###2. Load following functions:

### all necessary custom functions are in the following script
source("/data/share/htp/prime-seq_Paper/Scripts/custom_functions.R")

theme_pub <- theme_bw() + theme(plot.title = element_text(hjust = 0.5, size=18, face="bold"),
                                     axis.text = element_text(colour="black", size=14), 
                                     axis.title=element_text(size=16,face="bold"), 
                                     legend.text=element_text(size=14),
                                     legend.position="right",
                                     axis.line.x = element_line(colour = "black"), 
                                     axis.line.y = element_line(colour = "black"),
                                     strip.background=element_blank(), 
                                     strip.text=element_text(size=16))  

theme_set(theme_pub)

#prevent scientific notation
options(scipen=999)

fig_path<-"/data/share/htp/prime-seq_Paper/Fig_graphic/sensitivity/"

###3. Main - Sensitivity figure number of umis

ggsave("/data/share/htp/prime-seq_Paper/Fig_graphic/sensitivity/a1.pdf", a1, width = 13, height = 5, units = "in")
Error in ggsave("/data/share/htp/prime-seq_Paper/Fig_graphic/sensitivity/a1.pdf",  : 
  could not find function "ggsave"

###4. Supp - Sensitivity figure number of genes


prime_df <- read.csv("prime_seq_projects.csv", header = T, stringsAsFactors = T, sep = ";")
prime_df_long <- pivot_longer(prime_df, 
                              c(Genes_Exon_Only, Genes_Intron_Only, Genes_Both), 
                              values_to = "Number_Genes", 
                              names_to = "Feature")
#relevel factors
prime_df_long$Sample_Type<-factor(prime_df_long$Sample_Type,
                                levels=c("Nervous", "Cardiopulmonary", 
                                         "Digestive/Excretory", 
                                         "Renal/Urinary","Reproductive", 
                                         "Musculoskeletal","Immune","Cell Line",
                                         "PDX","Plant", 
                                         "Plant/Fungus","Fungus"))
prime_df_long$Feature<-factor(prime_df_long$Feature,
                                levels=rev(c("Genes_Both", "Genes_Exon_Only",
                                         "Genes_Intron_Only")))

# plot
a <- ggplot(prime_df_long[prime_df_long$Category == "A",], aes(x = reorder(Project, -Number_Genes), y = Number_Genes, fill = Feature, alpha = Average_reads_per_sample))+
    geom_bar(stat="identity", width = 1)+
    facet_grid(Sample_Type~., scales="free", space = "free", switch = "y") +
    ylab("Number of Genes") +
    coord_flip() +
    ylim(0,30500)+
    scale_fill_manual(labels = c("Intron", "Exon", "Both"), 
                      values = c("#118730", "#1a5084", "gray60"))+
    scale_alpha_continuous(range = c(0.6, 1), guide = FALSE)+
    guides(fill = guide_legend(reverse=T))+
    theme_pub+
    theme(legend.position="none", 
          axis.title.y = element_blank(), 
          axis.text.y = element_blank(),
          strip.text.y.left = element_text(angle = 0, size = 10),
          strip.placement = "outside",
          panel.grid.major = element_blank(), 
          panel.grid.minor.y = element_blank(),
          axis.ticks.y = element_blank()) 

b <- ggplot(prime_df_long[prime_df_long$Category == "B",], aes(x = reorder(Project, -Number_Genes), y = Number_Genes, fill = Feature, alpha = Average_reads_per_sample))+
    geom_bar(stat="identity", width = 1)+
    facet_grid(Sample_Type~., scales="free", space = "free", switch = "y") +
    ylab("Number of Genes") +
    coord_flip() +
    ylim(0,40500)+
    scale_fill_manual(labels = c("Intron", "Exon", "Both"), 
                      values = c("#118730", "#1a5084", "gray60"))+
    scale_alpha_continuous(range = c(0.6, 1), guide = FALSE)+
    guides(fill = guide_legend(reverse=T))+
    theme_pub+
    theme(legend.position="none", 
          axis.title.y = element_blank(), 
          axis.text.y = element_blank(),
          strip.text.y.left = element_text(angle = 0, size = 10),
          strip.placement = "outside",
          panel.grid.major = element_blank(), 
          panel.grid.minor.y = element_blank(),
          axis.ticks.y = element_blank()) 

c <- ggplot(prime_df_long[prime_df_long$Category == "C",], aes(x = reorder(Project, -Number_Genes), y = Number_Genes, fill = Feature, alpha = Average_reads_per_sample))+
    geom_bar(stat="identity", width = 1)+
    facet_grid(Sample_Type~., scales="free", space = "free", switch = "y") +
    ylab("Number of Genes") +
    coord_flip() +
    ylim(0,30500)+
    scale_fill_manual(labels = c("Intron", "Exon", "Both"), 
                      values = c("#118730", "#1a5084", "gray60"))+
    scale_alpha_continuous(range = c(0.6, 1), guide = FALSE)+
    guides(fill = guide_legend(reverse=T))+
    theme_pub+
    theme(legend.position="none", 
          axis.title.y = element_blank(), 
          axis.text.y = element_blank(),
          strip.text.y.left = element_text(angle = 0, size = 10),
          strip.placement = "outside",
          panel.grid.major = element_blank(), 
          panel.grid.minor.y = element_blank(),
          axis.ticks.y = element_blank()) 


ggsave("/data/share/htp/prime-seq_Paper/Fig_graphic/sensitivity/a.pdf", a, width = 8, height = 11, units = "in")

ggsave("/data/share/htp/prime-seq_Paper/Fig_graphic/sensitivity/b.pdf", b, width = 8, height = 5.97, units = "in")

ggsave("/data/share/htp/prime-seq_Paper/Fig_graphic/sensitivity/c.pdf", c, width = 8, height = 2, units = "in")
LS0tCnRpdGxlOiAiU2Vuc2l0aXZpdHlfZ3JhcGhpYyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKUGVyZm9ybWFuY2Ugb2YgcHJpbWUtc2VxIGFjcm9zcyBtYW55IGV4cGVyaW1lbnRzCgoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpCmBgYAoKIyMjMS4gTG9hZCB0aGUgZm9sbG93aW5nIHBhY2thZ2VzOgoKYGBge3IgcGFja2FnZXN9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGdnc2lnbmlmKQpsaWJyYXJ5KGdncGxvdGlmeSkKbGlicmFyeShnZ3JlcGVsKQpsaWJyYXJ5KGdnYmVlc3dhcm0pCmxpYnJhcnkoZWRnZVIpCmxpYnJhcnkoZ2VuZWZpbHRlcikKbGlicmFyeShncmlkKQpsaWJyYXJ5KGdyaWRFeHRyYSkKbGlicmFyeShnZ3NjaSkKbGlicmFyeShVcFNldFIpCmxpYnJhcnkoY293cGxvdCkKCmBgYAoKIyMjMi4gTG9hZCBmb2xsb3dpbmcgZnVuY3Rpb25zOgoKCmBgYHtyIGZ1bmN0aW9uc30KIyMjIGFsbCBuZWNlc3NhcnkgY3VzdG9tIGZ1bmN0aW9ucyBhcmUgaW4gdGhlIGZvbGxvd2luZyBzY3JpcHQKc291cmNlKCIvZGF0YS9zaGFyZS9odHAvcHJpbWUtc2VxX1BhcGVyL1NjcmlwdHMvY3VzdG9tX2Z1bmN0aW9ucy5SIikKCnRoZW1lX3B1YiA8LSB0aGVtZV9idygpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZT0xOCwgZmFjZT0iYm9sZCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG91cj0iYmxhY2siLCBzaXplPTE0KSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTE2LGZhY2U9ImJvbGQiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb249InJpZ2h0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaXAuYmFja2dyb3VuZD1lbGVtZW50X2JsYW5rKCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaXAudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xNikpICAKCnRoZW1lX3NldCh0aGVtZV9wdWIpCgojcHJldmVudCBzY2llbnRpZmljIG5vdGF0aW9uCm9wdGlvbnMoc2NpcGVuPTk5OSkKCmZpZ19wYXRoPC0iL2RhdGEvc2hhcmUvaHRwL3ByaW1lLXNlcV9QYXBlci9GaWdfZ3JhcGhpYy9zZW5zaXRpdml0eS8iCgpgYGAKCiMjIzMuIE1haW4gLSBTZW5zaXRpdml0eSBmaWd1cmUgbnVtYmVyIG9mIHVtaXMKCmBgYHtyIH0KCnByaW1lX2RmIDwtIHJlYWQuY3N2KCJwcmltZV9zZXFfcHJvamVjdHMuY3N2IiwgaGVhZGVyID0gVCwgc3RyaW5nc0FzRmFjdG9ycyA9IFQsIHNlcCA9ICIsIikKcHJpbWVfZGZfbG9uZyA8LSBwaXZvdF9sb25nZXIocHJpbWVfZGYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKFVNSV9FeG9uaWMsIFVNSV9JbnRyb25pYyksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiTnVtYmVyX1VNSXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiRmVhdHVyZSIpCgojcmVsZXZlbCBmYWN0b3JzCnByaW1lX2RmX2xvbmckU2FtcGxlX1R5cGU8LWZhY3RvcihwcmltZV9kZl9sb25nJFNhbXBsZV9UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscz1jKCJOZXJ2b3VzIiwgIkNhcmRpb3B1bG1vbmFyeSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaWdlc3RpdmUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXJpbmFyeSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbW11bmUiLCJDYW5jZXIgQ2VsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBsdXJpcG90ZW50IENlbGwiKSkKcHJpbWVfZGZfbG9uZyRGZWF0dXJlPC1mYWN0b3IocHJpbWVfZGZfbG9uZyRGZWF0dXJlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscz1yZXYoYygiVU1JX0V4b25pYyIsICJVTUlfSW50cm9uaWMiKSkpCgojIHBsb3QKYTEgPC0gZ2dwbG90KHByaW1lX2RmX2xvbmcsIGFlcyh4ID0gcmVvcmRlcihQcm9qZWN0LCAtZnJhY19pbmV4X3VtaSksIHkgPSBOdW1iZXJfVU1JcywgZmlsbCA9IEZlYXR1cmUsIGFscGhhID0gYXMubnVtZXJpYyhBdmVyYWdlX3JlYWRzX3Blcl9zYW1wbGUpKSkrCiAgICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uID0gImZpbGwiKSsKICAgIGZhY2V0X2dyaWQoflNhbXBsZV9UeXBlLCBzY2FsZXM9ImZyZWUiLCBzcGFjZSA9ICJmcmVlIiwgc3dpdGNoID0gIngiKSArCiAgICB5bGFiKCJGcmFjdGlvbiBvZiBVTUlzIikgKwogICAgc2NhbGVfZmlsbF9tYW51YWwobGFiZWxzID0gYygiSW50cm9uIiwgIkV4b24iKSwgCiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCIjMTE4NzMwIiwgIiMxYTUwODQiKSkrCiAgICBzY2FsZV9hbHBoYV9jb250aW51b3VzKHJhbmdlID0gYygwLjc1LCAxKSwgZ3VpZGUgPSBGQUxTRSkrCiAgICBndWlkZXMoZmlsbCA9IGd1aWRlX2xlZ2VuZChyZXZlcnNlPVQpKSsKICAgIHRoZW1lX3B1YisKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsIAogICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHNpemUgPSAxMCksCiAgICAgICAgICBzdHJpcC5wbGFjZW1lbnQgPSAib3V0c2lkZSIsCiAgICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSkgCgpnZ3NhdmUoIi9kYXRhL3NoYXJlL2h0cC9wcmltZS1zZXFfUGFwZXIvRmlnX2dyYXBoaWMvc2Vuc2l0aXZpdHkvYTEucGRmIiwgYTEsIHdpZHRoID0gMTAsIGhlaWdodCA9IDUsIHVuaXRzID0gImluIikKCmBgYAoKCiMjIzQuIFN1cHAgLSBTZW5zaXRpdml0eSBmaWd1cmUgbnVtYmVyIG9mIGdlbmVzCgpgYGB7ciB9CgpwcmltZV9kZiA8LSByZWFkLmNzdigicHJpbWVfc2VxX3Byb2plY3RzX2dlbmVfbnVtLmNzdiIsIGhlYWRlciA9IFQsIHN0cmluZ3NBc0ZhY3RvcnMgPSBULCBzZXAgPSAiLCIpCnByaW1lX2RmX2xvbmcgPC0gcGl2b3RfbG9uZ2VyKHByaW1lX2RmLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyhHZW5lc19FeG9uX09ubHksIEdlbmVzX0ludHJvbl9Pbmx5LCBHZW5lc19Cb3RoKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJOdW1iZXJfR2VuZXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiRmVhdHVyZSIpCgojcmVsZXZlbCBmYWN0b3JzCnByaW1lX2RmX2xvbmckU2FtcGxlX1R5cGU8LWZhY3RvcihwcmltZV9kZl9sb25nJFNhbXBsZV9UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscz1jKCJOZXJ2b3VzIiwgIkNhcmRpb3B1bG1vbmFyeSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaWdlc3RpdmUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXJpbmFyeSIsIlJlcHJvZHVjdGl2ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNdXNjdWxvc2tlbGV0YWwiLCJJbW11bmUiLCJDYW5jZXIgQ2VsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBEWCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBsdXJpcG90ZW50IENlbGwiLCJQbGFudCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQbGFudC9GdW5ndXMiLCJGdW5ndXMiKSkKcHJpbWVfZGZfbG9uZyRGZWF0dXJlPC1mYWN0b3IocHJpbWVfZGZfbG9uZyRGZWF0dXJlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscz1yZXYoYygiR2VuZXNfRXhvbl9Pbmx5IiwgIkdlbmVzX0JvdGgiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2VuZXNfSW50cm9uX09ubHkiKSkpCgojIHBsb3QKYSA8LSBnZ3Bsb3QocHJpbWVfZGZfbG9uZ1twcmltZV9kZl9sb25nJENhdGVnb3J5ID09ICJBIixdLCBhZXMoeCA9IHJlb3JkZXIoUHJvamVjdCwgLU51bWJlcl9HZW5lcyksIHkgPSBOdW1iZXJfR2VuZXMsIGZpbGwgPSBGZWF0dXJlLCBhbHBoYSA9IGFzLm51bWVyaWMoQXZlcmFnZV9yZWFkc19wZXJfc2FtcGxlKSkpKwogICAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCB3aWR0aCA9IDEpKwogICAgZmFjZXRfZ3JpZChTYW1wbGVfVHlwZX4uLCBzY2FsZXM9ImZyZWUiLCBzcGFjZSA9ICJmcmVlIiwgc3dpdGNoID0gInkiKSArCiAgICB5bGFiKCJOdW1iZXIgb2YgR2VuZXMiKSArCiAgICBjb29yZF9mbGlwKCkgKwogICAgeWxpbSgwLDMwNTAwKSsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKGxhYmVscyA9IGMoIkludHJvbiIsICJCb3RoIiwgIkV4b24iKSwgCiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCIjMTE4NzMwIiwgIiM1RjhBOEIiLCAiIzFhNTA4NCIpKSsKICAgIHNjYWxlX2FscGhhX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDAuNzUsIDEpLCBndWlkZSA9IEZBTFNFKSsKICAgIGd1aWRlcyhmaWxsID0gZ3VpZGVfbGVnZW5kKHJldmVyc2U9VCkpKwogICAgdGhlbWVfcHViKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiwgCiAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBzdHJpcC50ZXh0LnkubGVmdCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIHNpemUgPSAxMCksCiAgICAgICAgICBzdHJpcC5wbGFjZW1lbnQgPSAib3V0c2lkZSIsCiAgICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICAgIHBhbmVsLmdyaWQubWlub3IueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSkgCgpiIDwtIGdncGxvdChwcmltZV9kZl9sb25nW3ByaW1lX2RmX2xvbmckQ2F0ZWdvcnkgPT0gIkIiLF0sIGFlcyh4ID0gcmVvcmRlcihQcm9qZWN0LCAtTnVtYmVyX0dlbmVzKSwgeSA9IE51bWJlcl9HZW5lcywgZmlsbCA9IEZlYXR1cmUsIGFscGhhID0gYXMubnVtZXJpYyhBdmVyYWdlX3JlYWRzX3Blcl9zYW1wbGUpKSkrCiAgICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHdpZHRoID0gMSkrCiAgICBmYWNldF9ncmlkKFNhbXBsZV9UeXBlfi4sIHNjYWxlcz0iZnJlZSIsIHNwYWNlID0gImZyZWUiLCBzd2l0Y2ggPSAieSIpICsKICAgIHlsYWIoIk51bWJlciBvZiBHZW5lcyIpICsKICAgIGNvb3JkX2ZsaXAoKSArCiAgICB5bGltKDAsNDAwMDApKwogICAgc2NhbGVfZmlsbF9tYW51YWwobGFiZWxzID0gYygiSW50cm9uIiwgIkJvdGgiLCAiRXhvbiIpLCAKICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIiMxMTg3MzAiLCAiIzVGOEE4QiIsICIjMWE1MDg0IikpKwogICAgc2NhbGVfYWxwaGFfY29udGludW91cyhyYW5nZSA9IGMoMC43NSwgMSksIGd1aWRlID0gRkFMU0UpKwogICAgZ3VpZGVzKGZpbGwgPSBndWlkZV9sZWdlbmQocmV2ZXJzZT1UKSkrCiAgICB0aGVtZV9wdWIrCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiLCAKICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIHN0cmlwLnRleHQueS5sZWZ0ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMCwgc2l6ZSA9IDEwKSwKICAgICAgICAgIHN0cmlwLnBsYWNlbWVudCA9ICJvdXRzaWRlIiwKICAgICAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgICAgcGFuZWwuZ3JpZC5taW5vci55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKSAKCmMgPC0gZ2dwbG90KHByaW1lX2RmX2xvbmdbcHJpbWVfZGZfbG9uZyRDYXRlZ29yeSA9PSAiQyIsXSwgYWVzKHggPSByZW9yZGVyKFByb2plY3QsIC1OdW1iZXJfR2VuZXMpLCB5ID0gTnVtYmVyX0dlbmVzLCBmaWxsID0gRmVhdHVyZSwgYWxwaGEgPSBhcy5udW1lcmljKEF2ZXJhZ2VfcmVhZHNfcGVyX3NhbXBsZSkpKSsKICAgIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5Iiwgd2lkdGggPSAxKSsKICAgIGZhY2V0X2dyaWQoU2FtcGxlX1R5cGV+Liwgc2NhbGVzPSJmcmVlIiwgc3BhY2UgPSAiZnJlZSIsIHN3aXRjaCA9ICJ5IikgKwogICAgeWxhYigiTnVtYmVyIG9mIEdlbmVzIikgKwogICAgY29vcmRfZmxpcCgpICsKICAgIHlsaW0oMCwzMDUwMCkrCiAgICBzY2FsZV9maWxsX21hbnVhbChsYWJlbHMgPSBjKCJJbnRyb24iLCAiQm90aCIsICJFeG9uIiksIAogICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiIzExODczMCIsICIjNUY4QThCIiwgIiMxYTUwODQiKSkrCiAgICBzY2FsZV9hbHBoYV9jb250aW51b3VzKHJhbmdlID0gYygwLjc1LCAxKSwgZ3VpZGUgPSBGQUxTRSkrCiAgICBndWlkZXMoZmlsbCA9IGd1aWRlX2xlZ2VuZChyZXZlcnNlPVQpKSsKICAgIHRoZW1lX3B1YisKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsIAogICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgc3RyaXAudGV4dC55LmxlZnQgPSBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCBzaXplID0gMTApLAogICAgICAgICAgc3RyaXAucGxhY2VtZW50ID0gIm91dHNpZGUiLAogICAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkpIAoKCmdnc2F2ZSgiL2RhdGEvc2hhcmUvaHRwL3ByaW1lLXNlcV9QYXBlci9GaWdfZ3JhcGhpYy9zZW5zaXRpdml0eS9hLnBkZiIsIGEsIHdpZHRoID0gOCwgaGVpZ2h0ID0gMTEsIHVuaXRzID0gImluIikKCmdnc2F2ZSgiL2RhdGEvc2hhcmUvaHRwL3ByaW1lLXNlcV9QYXBlci9GaWdfZ3JhcGhpYy9zZW5zaXRpdml0eS9iLnBkZiIsIGIsIHdpZHRoID0gOCwgaGVpZ2h0ID0gNS45NywgdW5pdHMgPSAiaW4iKQoKZ2dzYXZlKCIvZGF0YS9zaGFyZS9odHAvcHJpbWUtc2VxX1BhcGVyL0ZpZ19ncmFwaGljL3NlbnNpdGl2aXR5L2MucGRmIiwgYywgd2lkdGggPSA3LjksIGhlaWdodCA9IDIsIHVuaXRzID0gImluIikKCgoKYGBg