1 Functions

2 Data

acc_immune = LoadH5Seurat(file = "./Data/acc_immune_5KvarGenes_V2_cellIdentity.h5seurat")
acc_immune$origin  %<>%  gsub(pattern = "Primary",replacement = "pri")
ident_origin = FetchData(object = acc_immune,vars = c("origin","cell_identity"))
ident_origin$combine = paste(ident_origin$cell_identity , ident_origin$origin)
ident_origin$general_identity = ident_origin$cell_identity
acc_immune %<>% AddMetaData(metadata = ident_origin[,"combine", drop=F],col.name = "cell_identity")
DimPlot(acc_immune,group.by  = "cell_identity")

3 Antigen presenting machinery

apm_genes = c("HLA-A","HLA-B","HLA-C","B2M","TAP1","TAP2", "TAPBP")
apm_score = FetchData(acc_immune,vars = apm_genes,slot = "data") %>% rowMeans()
acc_immune = AddMetaData(object = acc_immune,metadata = apm_score,col.name = "APM_score")
print_tab(plt = FeaturePlot(acc_immune,features = apm_genes),title = "genes")

genes

print_tab(plt = VlnPlot(object = acc_immune,features = apm_genes,group.by = "cell_identity")
,title = "genes violin")

genes violin

print_tab(plt = FeaturePlot(acc_immune,features = "APM_score"),title = "score")

score

NA

4 Exhaustion markers

exhausted_genes = c("PDCD1","CD244","CD160","CTLA4","HAVCR2")
print_tab(plt = FeaturePlot(acc_immune,features = exhausted_genes),title = "UMAP")

UMAP

print_tab(plt = VlnPlot(object = acc_immune,features = exhausted_genes,group.by = "cell_identity"),title = "Violin plot")

Violin plot

NA

5 Immune receptors

receptors = c("CCR3", "CCR4", "CCR10","CXCR2", "CXCR3", "CXCR4", "IL17A")
print_tab(plt = FeaturePlot(acc_immune,features = receptors), title = "UMAP")

UMAP

print_tab(plt = VlnPlot(object = acc_immune,features = receptors,group.by = "cell_identity"),title = "Violin plot")

Violin plot

NA

6 CellphoneDB

acc_cancer_cells = readRDS("/sci/labs/yotamd/lab_share/avishai.wizel/R_projects/ACC_microenv/Data/acc_tpm_nCount_mito_no146_15k_cancercells.rds")
acc_caf = readRDS("/sci/labs/yotamd/lab_share/ACC/ACC_sc/analysis/acc_tpm_nCount_mito_no146_cafs.rds")
# merge cancer, immune and CAF
common_genes = rownames(acc_cancer_cells) %>% intersect (rownames(acc_immune)) %>% intersect(rownames(acc_caf_cells))
acc_cancer_and_cd45 = merge(acc_cancer_cells[common_genes,],acc_immune[common_genes,])
overlapping_cells = colnames(acc_cancer_cells) %>% intersect(colnames(acc_caf)) 
acc_cancer_cd45_caf = merge(acc_cancer_and_cd45[common_genes,],acc_caf_cells[common_genes,!colnames(acc_caf_cells) %in% overlapping_cells] )
#create origin metadata in acc
ln_plates = c("ACC22.LN.P11", "ACC22.P12.LN",  "ACC7.P13" )
acc_origin = FetchData(object = acc_cancer_cells,vars = "orig.ident") %>% mutate(origin = if_else(condition = orig.ident %in% ln_plates,true = "LN",false = "pri"))
acc_cancer_cells %<>% AddMetaData(metadata = acc_origin[,"origin",drop=F],col.name = "origin")
#create origin metadata in caf
ln_plates = c("ACC22.LN.P11", "ACC22.P12.LN",  "ACC7.P13" )
caf_origin = FetchData(object = acc_caf,vars = "orig.ident") %>% mutate(origin = if_else(condition = orig.ident %in% ln_plates,true = "LN",false = "pri"))
acc_caf %<>% AddMetaData(metadata = caf_origin[,"origin",drop=F],col.name = "origin")
  #create metadata

#create luminal_over_myo
gs=acc_cancer_cells@assays$RNA@var.features
myoscore=apply(acc_cancer_cells@assays$RNA@scale.data[intersect(c("TP63","TP73","CAV1","CDH3","KRT5","KRT14","ACTA2","TAGLN","MYLK","DKK3"),gs),],2,mean)
lescore=apply(acc_cancer_cells@assays$RNA@scale.data[intersect(c("KIT","EHF","ELF5","KRT7","CLDN3","CLDN4","CD24","LGALS3","LCN2","SLPI"),gs),],2,mean)
acc_cancer_cells=AddMetaData(acc_cancer_cells,lescore-myoscore,"luminal_over_myo")

#create lum_or_myo
lum_over_myo = FetchData(object = acc_cancer_cells,vars = "luminal_over_myo")
lum_over_myo$lum_or_myo = "Unknown"
lum_over_myo$lum_or_myo [lum_over_myo$luminal_over_myo>1]  = "Luminal"
lum_over_myo$lum_or_myo [lum_over_myo$luminal_over_myo<(-1)]  = "Myo"
lum_or_myo = lum_over_myo[,"lum_or_myo",drop = F]

lum_or_myo$combine = paste(lum_or_myo$lum_or_myo , acc_cancer_cells$origin) #add environment
acc_cancer_cells %<>% AddMetaData(metadata = lum_or_myo[,"combine",drop=F],col.name = "cell_identity")

#add envirinment to CAF identity
acc_caf$cell_identity = paste(acc_caf$cell.type , acc_caf$origin) #add environment
#create  metadata

# combine
immune_identity =FetchData(object = acc_immune,vars = "cell_identity")
caf_identity =FetchData(object = acc_caf,vars = "cell_identity")
cancer_identity =FetchData(object = acc_cancer_cells,vars = "cell_identity")%>% filter(!cell_identity %in% c("Unknown pri","Unknown LN")) #remove unknown cells

all_identity = do.call("rbind", list(cancer_identity, immune_identity, caf_identity))

#rename and sort columns
all_identity$barcode_sample = rownames(all_identity)
all_identity = all_identity %>% rename(cell_type = cell_identity)
all_identity = all_identity[,c(2,1)]
a = data.frame(cell_type = all_environment$cell_type %>% unique()) %>% mutate(microenviroment = if_else(condition = grepl(pattern = all_environment$cell_type, "LN"),true = "LN",false = "pri"))
Warning: Problem while computing `microenviroment = if_else(...)`.
ℹ argument 'pattern' has length > 1 and only the first element will be used
write.table(x = all_identity,file = "./Data/CellphoneDB/input_V2/metadata.tsv",row.names =F,sep = "\t")
write.table(x = all_environment,file = "./Data/CellphoneDB/input_V2/enviroment.tsv",row.names =F,sep = "\t")
acc_cancer_cd45_caf = acc_cancer_cd45_caf[,rownames(all_identity)]
fwrite(as.data.frame(acc_cancer_cd45_caf@assays[["RNA"]]@data), file = "./Data/CellphoneDB/input_V2/counts.txt",sep = "\t",row.names = T)
library(ktplots)
library(reticulate)
acc_cancer_cd45_caf$cell_type = all_identity[,2,drop = F] # add cells identities to Seurat

#read data:
# pvals =  py$pvalues
# means = py$means

# #or:
pvals = read.delim("./Data/CellphoneDB/output_V2/statistical_analysis_pvalues_.txt",check.names = F)
means = read.delim("./Data/CellphoneDB/output_V2/statistical_analysis_means_.txt",check.names = F)
trace(plot_cpdb_heatmap,edit = T)
untrace(plot_cpdb_heatmap)
undebug(plot_cpdb_heatmap)
mat = plot_cpdb_heatmap(scdata = acc_cancer_cd45_caf, idents = 'cell_type',pvals =  pvals,main = "Number of significant interactions",alpha = 0.05,treeheight_row = 50,return_tables = T)
rownames(all_environment) = all_environment$cell_type
all_environment$cell_type <- NULL

trace(plot_cpdb,edit = T)
Warning in edit.default(def, editor = editor, file = file) :
  deparse may be incomplete
Tracing function "plot_cpdb" in package "ktplots"
[1] "plot_cpdb"
my_plot_cpdb <- function(...,caf = F) {
  p = plot_cpdb(...)
  pg <- ggplot_build(p)
  if (caf == F){
    pg$plot$data  %<>%  mutate(lum_or_myo = if_else(condition = grepl(pattern = "Luminal",x = Var2),true = "Luminal",false = "Myo")) %>% mutate(
      direction =if_else(condition = grepl(pattern = "-Luminal|-Myo",x = Var2),true = "cancel-immune",false = "immune-cancer")) 
      pg$plot+facet_grid(cols = vars(direction,lum_or_myo),scales = "free_x")+ylab("Interacting pair") +
      theme(axis.title.y = element_text(angle = 90,size = 20))
      
  }else{
    pg$plot$data  %<>%  mutate(direction =if_else(condition = grepl(pattern = "-CAF",x = Var2),true = "CAF-immune",false = "immune-CAF")) 
      pg$plot+facet_grid(cols = vars(direction),scales = "free_x")+ylab("Interacting pair") +
      theme(axis.title.y = element_text(angle = 90,size = 20))
  }
  

}

7 Costimulatory interactions


print_tab(plt = 
            my_plot_cpdb(cell_type1 = 'CD|B|Macro|mono', cell_type2 = 'Luminal pri|Myo pri', scdata = acc_cancer_cd45_caf,
                      idents = 'cell_type', means = means, pvals = pvals,
                      gene.family = 'costimulatory',return_table = F,max_size = 3,p.adjust.method = "fdr",keep_significant_only = T,cluster_rows = T)+
            ggtitle("Costimulatory primary")
  ,title = "Primary")

Primary

print_tab(plt = 
            my_plot_cpdb(cell_type1 = 'CD|B|Macro|mono', cell_type2 = 'Luminal LN|Myo LN', scdata = acc_cancer_cd45_caf,
                      idents = 'cell_type', means = means, pvals = pvals,
                      gene.family = 'costimulatory',return_table = F,max_size = 3,p.adjust.method = "fdr",keep_significant_only = T,cluster_rows = F)+
            ggtitle("Costimulatory LN")
  ,title = "LN")

LN

print_tab(plt = 
            my_plot_cpdb(cell_type1 = 'CD|B|Macro|mono', cell_type2 = 'CAF', scdata = acc_cancer_cd45_caf,
                      idents = 'cell_type', means = means, pvals = pvals,
                      gene.family = 'costimulatory',return_table = F,max_size = 3,p.adjust.method = "fdr",keep_significant_only = T,cluster_rows = F,caf = T)+
            ggtitle("Costimulatory CAF")
  ,title = "CAF")

CAF

print_tab(plt = 
            uniq_interactions(cell_type1 = 'CD|B|Macro|mono',cell_type2_a  = 'Luminal pri',cell_type2_b = "Myo",gene.family = "Costimulatory")
,title = "unique in luminal pri")

unique in luminal pri

print_tab(plt = 
            uniq_interactions(cell_type1 = 'CD|B|Macro|mono',cell_type2_a  = 'Myo pri',cell_type2_b = "Luminal",gene.family = "Costimulatory")
,title = "unique in myo pri")

unique in myo pri

print_tab(plt = 
            uniq_interactions(cell_type1 = 'CD|B|Macro|mono',cell_type2_a  = 'Luminal LN',cell_type2_b = "Myo",gene.family = "Costimulatory")
,title = "unique in luminal LN")

unique in luminal LN

print_tab(plt = 
            uniq_interactions(cell_type1 = 'CD|B|Macro|mono',cell_type2_a  = 'Myo LN',cell_type2_b = "Luminal",gene.family = "Costimulatory")
,title = "unique in myo LN")

unique in myo LN

NA

8 Coinhibitory interactions

print_tab(my_plot_cpdb(cell_type1 = 'CD|B|Macro|mono', cell_type2 = 'Luminal pri|Myo pri', scdata = acc_cancer_cd45_caf,
          idents = 'cell_type', means = means, pvals = pvals,
          gene.family = 'coinhibitory',return_table = F,max_size = 4,p.adjust.method = "fdr",keep_significant_only = F,cluster_rows = F)+
  ggtitle("coinhibitory primary"),title = "Primary")

Primary

print_tab(my_plot_cpdb(cell_type1 = 'CD|B|Macro|mono', cell_type2 = 'Luminal LN|Myo LN', scdata = acc_cancer_cd45_caf,
          idents = 'cell_type', means = means, pvals = pvals,
          gene.family = 'coinhibitory',return_table = F,max_size = 4,p.adjust.method = "fdr",keep_significant_only = F,cluster_rows = F)+
  ggtitle("coinhibitory LN"),title = "LN")

LN

print_tab(plt = 
            my_plot_cpdb(cell_type1 = 'CD|B|Macro|mono', cell_type2 = 'CAF', scdata = acc_cancer_cd45_caf,
                      idents = 'cell_type', means = means, pvals = pvals,
                      gene.family = 'coinhibitory',return_table = F,max_size = 3,p.adjust.method = "fdr",keep_significant_only = T,cluster_rows = F,caf = T)+
            ggtitle("coinhibitory CAF")
  ,title = "CAF")

CAF

print_tab(plt = 
            uniq_interactions(cell_type1 = 'CD|B|Macro|mono',cell_type2_a  = 'Luminal LN',cell_type2_b = "Myo LN",gene.family = "coinhibitory")
,title = "unique in luminal LN")

unique in luminal LN

print_tab(plt = 
            uniq_interactions(cell_type1 = 'CD|B|Macro|mono',cell_type2_a  = 'Myo LN',cell_type2_b = "Luminal LN",gene.family = "coinhibitory")
,title = "unique in myo LN")

unique in myo LN

print_tab(plt = 
            uniq_interactions(cell_type1 = 'CD|B|Macro|mono',cell_type2_a  = 'Luminal pri',cell_type2_b = "Myo pri",gene.family = "coinhibitory")
,title = "unique in luminal pri")

unique in luminal pri

print_tab(plt = 
            uniq_interactions(cell_type1 = 'CD|B|Macro|mono',cell_type2_a  = 'Myo pri',cell_type2_b = "Luminal pri",gene.family = "coinhibitory")
,title = "unique in myo pri")

unique in myo pri

NA

9 Chemokines interactions

print_tab(
  my_plot_cpdb(cell_type1 = 'CD|B|Macro|mono', cell_type2 = 'Luminal pri|Myo pri', scdata = acc_cancer_cd45_caf,
          idents = 'cell_type', means = means, pvals = pvals,
          gene.family = 'chemokines',return_table = F,max_size = 4,p.adjust.method = "fdr",keep_significant_only = F,cluster_rows = F)+
  ggtitle("chemokines primary"),title = "Primary")

Primary

print_tab(
  my_plot_cpdb(cell_type1 = 'CD|B|Macro|mono', cell_type2 = 'Luminal LN|Myo LN', scdata = acc_cancer_cd45_caf,
          idents = 'cell_type', means = means, pvals = pvals,
          gene.family = 'chemokines',return_table = F,max_size = 4,p.adjust.method = "fdr",keep_significant_only = F,cluster_rows = F)+
  ggtitle("chemokines LN"),title = "LN")

LN

print_tab(plt = 
            my_plot_cpdb(cell_type1 = 'CD|B|Macro|mono', cell_type2 = 'CAF', scdata = acc_cancer_cd45_caf,
                      idents = 'cell_type', means = means, pvals = pvals,
                      gene.family = 'chemokines',return_table = F,max_size = 3,p.adjust.method = "fdr",keep_significant_only = T,cluster_rows = F,caf = T)+
            ggtitle("chemokines CAF")
  ,title = "CAF")

CAF

print_tab(plt = 
            uniq_interactions(cell_type1 = 'CD|B|Macro|mono',cell_type2_a  = 'Luminal LN',cell_type2_b = "Myo LN",gene.family = "chemokines")
,title = "unique in luminal LN")

unique in luminal LN

print_tab(plt = 
            uniq_interactions(cell_type1 = 'CD|B|Macro|mono',cell_type2_a  = 'Myo LN',cell_type2_b = "Luminal LN",gene.family = "chemokines")
,title = "unique in myo LN")

unique in myo LN

print_tab(plt = 
            uniq_interactions(cell_type1 = 'CD|B|Macro|mono',cell_type2_a  = 'Luminal pri',cell_type2_b = "Myo pri",gene.family = "chemokines")
,title = "unique in luminal pri")

unique in luminal pri

print_tab(plt = 
            uniq_interactions(cell_type1 = 'CD|B|Macro|mono',cell_type2_a  = 'Myo pri',cell_type2_b = "Luminal pri",gene.family = "chemokines")
,title = "unique in myo pri")

unique in myo pri

NA

10 Chemokine ligands

genes = c("CXCL1\\D", "CXCL2\\D","CXCL3\\D","CXCL17","C3","CXCL14")
print_tab(my_plot_cpdb(cell_type1 = 'CD|B|Macro|mono', cell_type2 = 'Luminal pri|Myo pri', scdata = acc_cancer_cd45_caf,
    idents = 'cell_type', means = means, pvals = pvals,
 genes = genes,return_table = F,max_size = 4,p.adjust.method = "fdr" ,keep_significant_only = F) 
 ,title = "Primary")

Primary

print_tab(my_plot_cpdb(cell_type1 = 'CD|B|Macro|mono', cell_type2 = 'Luminal LN|Myo LN', scdata = acc_cancer_cd45_caf,
    idents = 'cell_type', means = means, pvals = pvals,
  genes = genes,return_table = F,max_size = 4,p.adjust.method = "fdr" ,keep_significant_only = F) 
,title = "LN")

LN

print_tab(plt = 
            uniq_interactions(cell_type1 = 'CD|B|Macro|mono',cell_type2_a  = 'Luminal LN',cell_type2_b = "Myo LN",genes = genes)
,title = "unique in luminal LN")

unique in luminal LN

print_tab(plt = 
            uniq_interactions(cell_type1 = 'CD|B|Macro|mono',cell_type2_a  = 'Myo LN',cell_type2_b = "Luminal LN",genes = genes)
,title = "unique in myo LN")

unique in myo LN

print_tab(plt = 
            uniq_interactions(cell_type1 = 'CD|B|Macro|mono',cell_type2_a  = 'Luminal pri',cell_type2_b = "Myo pri",genes = genes)
,title = "unique in luminal pri")

unique in luminal pri

print_tab(plt = 
            uniq_interactions(cell_type1 = 'CD|B|Macro|mono',cell_type2_a  = 'Myo pri',cell_type2_b = "Luminal pri",genes = genes)
,title = "unique in myo pri")

unique in myo pri

NA

11 CCL22 and CCL28

print_tab(my_plot_cpdb(cell_type1 = 'CD|B|Macro|mono', cell_type2 = 'Luminal pri|Myo pri', scdata = acc_cancer_cd45_caf,
    idents = 'cell_type', means = means, pvals = pvals,
 genes = c("CCL22", "CCL28" ),return_table = F,max_size = 4,p.adjust.method = "fdr" ,keep_significant_only = F),title = "Primary")

Primary

print_tab(my_plot_cpdb(cell_type1 = 'CD|B|Macro|mono', cell_type2 = 'Luminal LN|Myo LN', scdata = acc_cancer_cd45_caf,
    idents = 'cell_type', means = means, pvals = pvals,
  genes = c("CCL22", "CCL28" ),return_table = F,max_size = 6,p.adjust.method = "fdr" ,keep_significant_only = F),title = "LN")

LN

NA

12 Notch signaling interactions with immune

print_tab(plt = 
            my_plot_cpdb(cell_type1 = 'CD|B|Macro|mono', cell_type2 = 'Luminal pri|Myo pri', scdata = acc_cancer_cd45_caf,
                         idents = 'cell_type', means = means, pvals = pvals,
                         genes =c("JAG", "MYB" , "NOTCH","HES1","HEY"),return_table = F,max_size = 4,p.adjust.method = "fdr" ,keep_significant_only = F) 
        ,title = "Primary")

Primary

print_tab(plt = 
            my_plot_cpdb(cell_type1 = 'CD|B|Macro|mono', cell_type2 = 'Luminal LN|Myo LN', scdata = acc_cancer_cd45_caf,
                         idents = 'cell_type', means = means, pvals = pvals,
                         genes =c("JAG", "MYB" , "NOTCH","HES1","HEY"),return_table = F,max_size = 4,p.adjust.method = "fdr" ,keep_significant_only = F) 
        ,title = "Primary")

Primary

NA

13 Notch signaling interactions with CAF

print_tab(plt = 
            plot_cpdb(cell_type1 = 'CAF', cell_type2 = 'Luminal pri|Myo pri', scdata = acc_cancer_cd45_caf,
                      idents = 'cell_type', means = means, pvals = pvals,
                      genes = c("JAG", "MYB" ),return_table = F,max_size = 4,p.adjust.method = "fdr" ,keep_significant_only = F) 
          ,title = "Primary")

Primary

print_tab(plt = 
            plot_cpdb(cell_type1 = 'CAF', cell_type2 = 'Luminal LN|Myo LN', scdata = acc_cancer_cd45_caf,
                      idents = 'cell_type', means = means, pvals = pvals,
                      genes = c("JAG", "MYB" ),return_table = F,max_size = 4,p.adjust.method = "fdr" ,keep_significant_only = F) 
          ,title = "Primary") 

Primary

NA

LS0tCnRpdGxlOiAnYHIgcnN0dWRpb2FwaTo6Z2V0U291cmNlRWRpdG9yQ29udGV4dCgpJHBhdGggJT4lIGJhc2VuYW1lKCkgJT4lIGdzdWIocGF0dGVybiA9ICJcXC5SbWQiLHJlcGxhY2VtZW50ID0gIiIpYCcgCmF1dGhvcjogIkF2aXNoYWkgV2l6ZWwiCmRhdGU6ICdgciBTeXMudGltZSgpYCcKb3V0cHV0OiAKICBodG1sX25vdGVib29rOiAKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgdG9jOiB5ZXMKICAgIHRvY19jb2xsYXBzZTogeWVzCiAgICB0b2NfZmxvYXQ6IAogICAgICBjb2xsYXBzZWQ6IEZBTFNFCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIHRvY19kZXB0aDogMQotLS0KCgoKIyBGdW5jdGlvbnMKCmBgYHtyIHdhcm5pbmc9RkFMU0V9CmBgYAoKIyBEYXRhCgpgYGB7cn0KYWNjX2ltbXVuZSA9IExvYWRINVNldXJhdChmaWxlID0gIi4vRGF0YS9hY2NfaW1tdW5lXzVLdmFyR2VuZXNfVjJfY2VsbElkZW50aXR5Lmg1c2V1cmF0IikKYGBgCgoKYGBge3J9CmFjY19pbW11bmUkb3JpZ2luICAlPD4lICBnc3ViKHBhdHRlcm4gPSAiUHJpbWFyeSIscmVwbGFjZW1lbnQgPSAicHJpIikKaWRlbnRfb3JpZ2luID0gRmV0Y2hEYXRhKG9iamVjdCA9IGFjY19pbW11bmUsdmFycyA9IGMoIm9yaWdpbiIsImNlbGxfaWRlbnRpdHkiKSkKaWRlbnRfb3JpZ2luJGNvbWJpbmUgPSBwYXN0ZShpZGVudF9vcmlnaW4kY2VsbF9pZGVudGl0eSAsIGlkZW50X29yaWdpbiRvcmlnaW4pCmlkZW50X29yaWdpbiRnZW5lcmFsX2lkZW50aXR5ID0gaWRlbnRfb3JpZ2luJGNlbGxfaWRlbnRpdHkKYWNjX2ltbXVuZSAlPD4lIEFkZE1ldGFEYXRhKG1ldGFkYXRhID0gaWRlbnRfb3JpZ2luWywiY29tYmluZSIsIGRyb3A9Rl0sY29sLm5hbWUgPSAiY2VsbF9pZGVudGl0eSIpCkRpbVBsb3QoYWNjX2ltbXVuZSxncm91cC5ieSAgPSAiY2VsbF9pZGVudGl0eSIpCmBgYAojIEFudGlnZW4gcHJlc2VudGluZyBtYWNoaW5lcnkgey50YWJzZXR9CmBgYHtyfQphcG1fZ2VuZXMgPSBjKCJITEEtQSIsIkhMQS1CIiwiSExBLUMiLCJCMk0iLCJUQVAxIiwiVEFQMiIsICJUQVBCUCIpCmFwbV9zY29yZSA9IEZldGNoRGF0YShhY2NfaW1tdW5lLHZhcnMgPSBhcG1fZ2VuZXMsc2xvdCA9ICJkYXRhIikgJT4lIHJvd01lYW5zKCkKYWNjX2ltbXVuZSA9IEFkZE1ldGFEYXRhKG9iamVjdCA9IGFjY19pbW11bmUsbWV0YWRhdGEgPSBhcG1fc2NvcmUsY29sLm5hbWUgPSAiQVBNX3Njb3JlIikKYGBgCgpgYGB7ciBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9MTAsIHJlc3VsdHM9J2FzaXMnfQpwcmludF90YWIocGx0ID0gRmVhdHVyZVBsb3QoYWNjX2ltbXVuZSxmZWF0dXJlcyA9IGFwbV9nZW5lcyksdGl0bGUgPSAiZ2VuZXMiKQpwcmludF90YWIocGx0ID0gVmxuUGxvdChvYmplY3QgPSBhY2NfaW1tdW5lLGZlYXR1cmVzID0gYXBtX2dlbmVzLGdyb3VwLmJ5ID0gImNlbGxfaWRlbnRpdHkiKQosdGl0bGUgPSAiZ2VuZXMgdmlvbGluIikKCnByaW50X3RhYihwbHQgPSBGZWF0dXJlUGxvdChhY2NfaW1tdW5lLGZlYXR1cmVzID0gIkFQTV9zY29yZSIpLHRpdGxlID0gInNjb3JlIikKYGBgCgojIEV4aGF1c3Rpb24gbWFya2VycyB7LnRhYnNldH0KYGBge3IgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTAscmVzdWx0cz0nYXNpcyd9CmV4aGF1c3RlZF9nZW5lcyA9IGMoIlBEQ0QxIiwiQ0QyNDQiLCJDRDE2MCIsIkNUTEE0IiwiSEFWQ1IyIikKcHJpbnRfdGFiKHBsdCA9IEZlYXR1cmVQbG90KGFjY19pbW11bmUsZmVhdHVyZXMgPSBleGhhdXN0ZWRfZ2VuZXMpLHRpdGxlID0gIlVNQVAiKQpwcmludF90YWIocGx0ID0gVmxuUGxvdChvYmplY3QgPSBhY2NfaW1tdW5lLGZlYXR1cmVzID0gZXhoYXVzdGVkX2dlbmVzLGdyb3VwLmJ5ID0gImNlbGxfaWRlbnRpdHkiKSx0aXRsZSA9ICJWaW9saW4gcGxvdCIpCgpgYGAKIyBJbW11bmUgcmVjZXB0b3JzIHsudGFic2V0fQpgYGB7ciBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMCwgcmVzdWx0cz0nYXNpcyd9CnJlY2VwdG9ycyA9IGMoIkNDUjMiLCAiQ0NSNCIsICJDQ1IxMCIsIkNYQ1IyIiwgIkNYQ1IzIiwgIkNYQ1I0IiwgIklMMTdBIikKcHJpbnRfdGFiKHBsdCA9IEZlYXR1cmVQbG90KGFjY19pbW11bmUsZmVhdHVyZXMgPSByZWNlcHRvcnMpLCB0aXRsZSA9ICJVTUFQIikKcHJpbnRfdGFiKHBsdCA9IFZsblBsb3Qob2JqZWN0ID0gYWNjX2ltbXVuZSxmZWF0dXJlcyA9IHJlY2VwdG9ycyxncm91cC5ieSA9ICJjZWxsX2lkZW50aXR5IiksdGl0bGUgPSAiVmlvbGluIHBsb3QiKQoKYGBgCgojIENlbGxwaG9uZURCIHsudGFic2V0fQpgYGB7cn0KYWNjX2NhbmNlcl9jZWxscyA9IHJlYWRSRFMoIi9zY2kvbGFicy95b3RhbWQvbGFiX3NoYXJlL2F2aXNoYWkud2l6ZWwvUl9wcm9qZWN0cy9BQ0NfbWljcm9lbnYvRGF0YS9hY2NfdHBtX25Db3VudF9taXRvX25vMTQ2XzE1a19jYW5jZXJjZWxscy5yZHMiKQphY2NfY2FmID0gcmVhZFJEUygiL3NjaS9sYWJzL3lvdGFtZC9sYWJfc2hhcmUvQUNDL0FDQ19zYy9hbmFseXNpcy9hY2NfdHBtX25Db3VudF9taXRvX25vMTQ2X2NhZnMucmRzIikKYGBgCgpgYGB7cn0KIyBtZXJnZSBjYW5jZXIsIGltbXVuZSBhbmQgQ0FGCmNvbW1vbl9nZW5lcyA9IHJvd25hbWVzKGFjY19jYW5jZXJfY2VsbHMpICU+JSBpbnRlcnNlY3QgKHJvd25hbWVzKGFjY19pbW11bmUpKSAlPiUgaW50ZXJzZWN0KHJvd25hbWVzKGFjY19jYWZfY2VsbHMpKQphY2NfY2FuY2VyX2FuZF9jZDQ1ID0gbWVyZ2UoYWNjX2NhbmNlcl9jZWxsc1tjb21tb25fZ2VuZXMsXSxhY2NfaW1tdW5lW2NvbW1vbl9nZW5lcyxdKQpvdmVybGFwcGluZ19jZWxscyA9IGNvbG5hbWVzKGFjY19jYW5jZXJfY2VsbHMpICU+JSBpbnRlcnNlY3QoY29sbmFtZXMoYWNjX2NhZikpIAphY2NfY2FuY2VyX2NkNDVfY2FmID0gbWVyZ2UoYWNjX2NhbmNlcl9hbmRfY2Q0NVtjb21tb25fZ2VuZXMsXSxhY2NfY2FmX2NlbGxzW2NvbW1vbl9nZW5lcywhY29sbmFtZXMoYWNjX2NhZl9jZWxscykgJWluJSBvdmVybGFwcGluZ19jZWxsc10gKQpgYGAKCmBgYHtyfQojY3JlYXRlIG9yaWdpbiBtZXRhZGF0YSBpbiBhY2MKbG5fcGxhdGVzID0gYygiQUNDMjIuTE4uUDExIiwgIkFDQzIyLlAxMi5MTiIsICAiQUNDNy5QMTMiICkKYWNjX29yaWdpbiA9IEZldGNoRGF0YShvYmplY3QgPSBhY2NfY2FuY2VyX2NlbGxzLHZhcnMgPSAib3JpZy5pZGVudCIpICU+JSBtdXRhdGUob3JpZ2luID0gaWZfZWxzZShjb25kaXRpb24gPSBvcmlnLmlkZW50ICVpbiUgbG5fcGxhdGVzLHRydWUgPSAiTE4iLGZhbHNlID0gInByaSIpKQphY2NfY2FuY2VyX2NlbGxzICU8PiUgQWRkTWV0YURhdGEobWV0YWRhdGEgPSBhY2Nfb3JpZ2luWywib3JpZ2luIixkcm9wPUZdLGNvbC5uYW1lID0gIm9yaWdpbiIpCmBgYAoKYGBge3J9CiNjcmVhdGUgb3JpZ2luIG1ldGFkYXRhIGluIGNhZgpsbl9wbGF0ZXMgPSBjKCJBQ0MyMi5MTi5QMTEiLCAiQUNDMjIuUDEyLkxOIiwgICJBQ0M3LlAxMyIgKQpjYWZfb3JpZ2luID0gRmV0Y2hEYXRhKG9iamVjdCA9IGFjY19jYWYsdmFycyA9ICJvcmlnLmlkZW50IikgJT4lIG11dGF0ZShvcmlnaW4gPSBpZl9lbHNlKGNvbmRpdGlvbiA9IG9yaWcuaWRlbnQgJWluJSBsbl9wbGF0ZXMsdHJ1ZSA9ICJMTiIsZmFsc2UgPSAicHJpIikpCmFjY19jYWYgJTw+JSBBZGRNZXRhRGF0YShtZXRhZGF0YSA9IGNhZl9vcmlnaW5bLCJvcmlnaW4iLGRyb3A9Rl0sY29sLm5hbWUgPSAib3JpZ2luIikKYGBgCgpgYGB7cn0KICAjY3JlYXRlIG1ldGFkYXRhCgojY3JlYXRlIGx1bWluYWxfb3Zlcl9teW8KZ3M9YWNjX2NhbmNlcl9jZWxsc0Bhc3NheXMkUk5BQHZhci5mZWF0dXJlcwpteW9zY29yZT1hcHBseShhY2NfY2FuY2VyX2NlbGxzQGFzc2F5cyRSTkFAc2NhbGUuZGF0YVtpbnRlcnNlY3QoYygiVFA2MyIsIlRQNzMiLCJDQVYxIiwiQ0RIMyIsIktSVDUiLCJLUlQxNCIsIkFDVEEyIiwiVEFHTE4iLCJNWUxLIiwiREtLMyIpLGdzKSxdLDIsbWVhbikKbGVzY29yZT1hcHBseShhY2NfY2FuY2VyX2NlbGxzQGFzc2F5cyRSTkFAc2NhbGUuZGF0YVtpbnRlcnNlY3QoYygiS0lUIiwiRUhGIiwiRUxGNSIsIktSVDciLCJDTEROMyIsIkNMRE40IiwiQ0QyNCIsIkxHQUxTMyIsIkxDTjIiLCJTTFBJIiksZ3MpLF0sMixtZWFuKQphY2NfY2FuY2VyX2NlbGxzPUFkZE1ldGFEYXRhKGFjY19jYW5jZXJfY2VsbHMsbGVzY29yZS1teW9zY29yZSwibHVtaW5hbF9vdmVyX215byIpCgojY3JlYXRlIGx1bV9vcl9teW8KbHVtX292ZXJfbXlvID0gRmV0Y2hEYXRhKG9iamVjdCA9IGFjY19jYW5jZXJfY2VsbHMsdmFycyA9ICJsdW1pbmFsX292ZXJfbXlvIikKbHVtX292ZXJfbXlvJGx1bV9vcl9teW8gPSAiVW5rbm93biIKbHVtX292ZXJfbXlvJGx1bV9vcl9teW8gW2x1bV9vdmVyX215byRsdW1pbmFsX292ZXJfbXlvPjFdICA9ICJMdW1pbmFsIgpsdW1fb3Zlcl9teW8kbHVtX29yX215byBbbHVtX292ZXJfbXlvJGx1bWluYWxfb3Zlcl9teW88KC0xKV0gID0gIk15byIKbHVtX29yX215byA9IGx1bV9vdmVyX215b1ssImx1bV9vcl9teW8iLGRyb3AgPSBGXQoKbHVtX29yX215byRjb21iaW5lID0gcGFzdGUobHVtX29yX215byRsdW1fb3JfbXlvICwgYWNjX2NhbmNlcl9jZWxscyRvcmlnaW4pICNhZGQgZW52aXJvbm1lbnQKYWNjX2NhbmNlcl9jZWxscyAlPD4lIEFkZE1ldGFEYXRhKG1ldGFkYXRhID0gbHVtX29yX215b1ssImNvbWJpbmUiLGRyb3A9Rl0sY29sLm5hbWUgPSAiY2VsbF9pZGVudGl0eSIpCgojYWRkIGVudmlyaW5tZW50IHRvIENBRiBpZGVudGl0eQphY2NfY2FmJGNlbGxfaWRlbnRpdHkgPSBwYXN0ZShhY2NfY2FmJGNlbGwudHlwZSAsIGFjY19jYWYkb3JpZ2luKSAjYWRkIGVudmlyb25tZW50CgpgYGAKCmBgYHtyfQojY3JlYXRlICBtZXRhZGF0YQoKIyBjb21iaW5lCmltbXVuZV9pZGVudGl0eSA9RmV0Y2hEYXRhKG9iamVjdCA9IGFjY19pbW11bmUsdmFycyA9ICJjZWxsX2lkZW50aXR5IikKY2FmX2lkZW50aXR5ID1GZXRjaERhdGEob2JqZWN0ID0gYWNjX2NhZix2YXJzID0gImNlbGxfaWRlbnRpdHkiKQpjYW5jZXJfaWRlbnRpdHkgPUZldGNoRGF0YShvYmplY3QgPSBhY2NfY2FuY2VyX2NlbGxzLHZhcnMgPSAiY2VsbF9pZGVudGl0eSIpJT4lIGZpbHRlcighY2VsbF9pZGVudGl0eSAlaW4lIGMoIlVua25vd24gcHJpIiwiVW5rbm93biBMTiIpKSAjcmVtb3ZlIHVua25vd24gY2VsbHMKCmFsbF9pZGVudGl0eSA9IGRvLmNhbGwoInJiaW5kIiwgbGlzdChjYW5jZXJfaWRlbnRpdHksIGltbXVuZV9pZGVudGl0eSwgY2FmX2lkZW50aXR5KSkKCiNyZW5hbWUgYW5kIHNvcnQgY29sdW1ucwphbGxfaWRlbnRpdHkkYmFyY29kZV9zYW1wbGUgPSByb3duYW1lcyhhbGxfaWRlbnRpdHkpCmFsbF9pZGVudGl0eSA9IGFsbF9pZGVudGl0eSAlPiUgcmVuYW1lKGNlbGxfdHlwZSA9IGNlbGxfaWRlbnRpdHkpCmFsbF9pZGVudGl0eSA9IGFsbF9pZGVudGl0eVssYygyLDEpXQpgYGAKCmBgYHtyfQojY3JlYXRlICBlbnZpcm9tZW50CmltbXVuZV9lbnZpcm9tZW50ID0gRmV0Y2hEYXRhKG9iamVjdCA9IGFjY19pbW11bmUsdmFycyA9IGMoImNlbGxfaWRlbnRpdHkiLCAib3JpZ2luIikpICU+JSBzZXRfbmFtZXMoYygiY2VsbF90eXBlIiwibWljcm9lbnZpcm9tZW50IikpCmFjY19lbnZpcm9tZW50ID0gRmV0Y2hEYXRhKG9iamVjdCA9IGFjY19jYW5jZXJfY2VsbHMsdmFycyA9IGMoImNlbGxfaWRlbnRpdHkiLCAib3JpZ2luIikpJT4lCiAgZmlsdGVyKCFjZWxsX2lkZW50aXR5ICVpbiUgYygiVW5rbm93biBwcmkiLCJVbmtub3duIExOIikpJT4lICAjcmVtb3ZlIHVua25vd24gCiAgc2V0X25hbWVzKGMoImNlbGxfdHlwZSIsIm1pY3JvZW52aXJvbWVudCIpKQpjYWZfZW52aXJvbWVudCA9IEZldGNoRGF0YShvYmplY3QgPSBhY2NfY2FmLHZhcnMgPSBjKCJjZWxsX2lkZW50aXR5IiwgIm9yaWdpbiIpKSAlPiUgc2V0X25hbWVzKGMoImNlbGxfdHlwZSIsIm1pY3JvZW52aXJvbWVudCIpKQoKYWxsX2Vudmlyb25tZW50ID0gZG8uY2FsbCgicmJpbmQiLCBsaXN0KGltbXVuZV9lbnZpcm9tZW50LCBhY2NfZW52aXJvbWVudCwgY2FmX2Vudmlyb21lbnQpKQphbGxfZW52aXJvbm1lbnQgPSBkYXRhLmZyYW1lKGNlbGxfdHlwZSA9IGFsbF9lbnZpcm9ubWVudCRjZWxsX3R5cGUgJT4lIHVuaXF1ZSgpKSAlPiUgbXV0YXRlKG1pY3JvZW52aXJvbWVudCA9IGlmX2Vsc2UoY29uZGl0aW9uID0gZ3JlcGwoeCA9ICBjZWxsX3R5cGUscGF0dGVybiA9ICAiTE4iKSx0cnVlID0gIkxOIixmYWxzZSA9ICJwcmkiKSkgIyBmaXggZW52aXJvbm1lbnQgY29udGFpbiBldmVyeSBjZWxsIHR5cGUsIG5vdCBldmVyeSBjZWxsCgpgYGAKCgpgYGB7cn0Kd3JpdGUudGFibGUoeCA9IGFsbF9pZGVudGl0eSxmaWxlID0gIi4vRGF0YS9DZWxscGhvbmVEQi9pbnB1dF9WMi9tZXRhZGF0YS50c3YiLHJvdy5uYW1lcyA9RixzZXAgPSAiXHQiKQp3cml0ZS50YWJsZSh4ID0gYWxsX2Vudmlyb25tZW50LGZpbGUgPSAiLi9EYXRhL0NlbGxwaG9uZURCL2lucHV0X1YyL2Vudmlyb21lbnQudHN2Iixyb3cubmFtZXMgPUYsc2VwID0gIlx0IikKYGBgCgpgYGB7cn0KYWNjX2NhbmNlcl9jZDQ1X2NhZiA9IGFjY19jYW5jZXJfY2Q0NV9jYWZbLHJvd25hbWVzKGFsbF9pZGVudGl0eSldCmZ3cml0ZShhcy5kYXRhLmZyYW1lKGFjY19jYW5jZXJfY2Q0NV9jYWZAYXNzYXlzW1siUk5BIl1dQGRhdGEpLCBmaWxlID0gIi4vRGF0YS9DZWxscGhvbmVEQi9pbnB1dF9WMi9jb3VudHMudHh0IixzZXAgPSAiXHQiLHJvdy5uYW1lcyA9IFQpCmBgYAoKCmBgYHtweXRob24gaW5jbHVkZT1GQUxTRX0KI2Rvd25sb2FkIGRhdGFiYXNlCmltcG9ydCBwYW5kYXMgYXMgcGQKaW1wb3J0IGdsb2IKaW1wb3J0IG9zCiMgLS0gVmVyc2lvbiBvZiB0aGUgZGF0YWJzZQpjcGRiX3ZlcnNpb24gPSAndjQuMS4wJwoKIyAtLSBQYXRoIHdoZXJlIHRoZSBpbnB1dCBmaWxlcyB0byBnZW5lcmF0ZSB0aGUgZGF0YWJhc2UgYXJlIGxvY2F0ZWQKY3BkYl90YXJnZXRfZGlyID0gb3MucGF0aC5qb2luKCcuL0RhdGEvQ2VsbHBob25lREIvJywgY3BkYl92ZXJzaW9uKQoKIyBEb3dubG9hZCBkYXRhYmFzZQpmcm9tIGNlbGxwaG9uZWRiLnV0aWxzIGltcG9ydCBkYl91dGlscwpkYl91dGlscy5kb3dubG9hZF9kYXRhYmFzZShjcGRiX3RhcmdldF9kaXIsIGNwZGJfdmVyc2lvbikKYGBgCgpgYGB7cHl0aG9uIGluY2x1ZGU9RkFMU0V9CmZyb20gY2VsbHBob25lZGIuc3JjLmNvcmUubWV0aG9kcyBpbXBvcnQgY3BkYl9zdGF0aXN0aWNhbF9hbmFseXNpc19tZXRob2QKZm9sZGVyID0gImlucHV0X1YyIgpmb2xkZXJfb3V0cHV0ID0gIm91dHB1dF9WMiIKZGVjb252b2x1dGVkLCBtZWFucywgcHZhbHVlcywgc2lnbmlmaWNhbnRfbWVhbnMgPSBjcGRiX3N0YXRpc3RpY2FsX2FuYWx5c2lzX21ldGhvZC5jYWxsKAogICAgY3BkYl9maWxlX3BhdGggPSAiLi9EYXRhL0NlbGxwaG9uZURCL3Y0LjEuMC9jZWxscGhvbmVkYi56aXAiLCAgICAgICAgICAgICAgICAgIyBtYW5kYXRvcnk6IENlbGxQaG9uZURCIGRhdGFiYXNlIHppcCBmaWxlLgogICAgbWV0YV9maWxlX3BhdGggPSAiLi9EYXRhL0NlbGxwaG9uZURCLyIrZm9sZGVyKyIvbWV0YWRhdGEudHN2IiwgICAgICAgICAgICAgICAgICMgbWFuZGF0b3J5OiB0c3YgZmlsZSBkZWZpbmluZyBiYXJjb2RlcyB0byBjZWxsIGxhYmVsLgogICAgY291bnRzX2ZpbGVfcGF0aCA9ICIuL0RhdGEvQ2VsbHBob25lREIvIitmb2xkZXIrIi9jb3VudHMudHh0IiwgICAgICAgICAgICAgIyBtYW5kYXRvcnk6IG5vcm1hbGl6ZWQgY291bnQgbWF0cml4LgogICAgY291bnRzX2RhdGEgPSAnaGduY19zeW1ib2wnLCAgICAgICAgICAgICAgICAgICAgICMgZGVmaW5lcyB0aGUgZ2VuZSBhbm5vdGF0aW9uIGluIGNvdW50cyBtYXRyaXguCiAgICAgbWljcm9lbnZzX2ZpbGVfcGF0aCA9ICIuL0RhdGEvQ2VsbHBob25lREIvIitmb2xkZXIrIi9lbnZpcm9tZW50LnRzdiIsCiAgICBvdXRwdXRfcGF0aCA9ICIuL0RhdGEvQ2VsbHBob25lREIvIiArIGZvbGRlcl9vdXRwdXQsICMgUGF0aCB0byBzYXZlIHJlc3VsdHMuCiAgICBvdXRwdXRfc3VmZml4ID0gIiIgCikKYGBgICAgCgoKYGBge3J9CmxpYnJhcnkoa3RwbG90cykKbGlicmFyeShyZXRpY3VsYXRlKQphY2NfY2FuY2VyX2NkNDVfY2FmJGNlbGxfdHlwZSA9IGFsbF9pZGVudGl0eVssMixkcm9wID0gRl0gIyBhZGQgY2VsbHMgaWRlbnRpdGllcyB0byBTZXVyYXQKCiNyZWFkIGRhdGE6CiMgcHZhbHMgPSAgcHkkcHZhbHVlcwojIG1lYW5zID0gcHkkbWVhbnMKCiMgI29yOgpwdmFscyA9IHJlYWQuZGVsaW0oIi4vRGF0YS9DZWxscGhvbmVEQi9vdXRwdXRfVjIvc3RhdGlzdGljYWxfYW5hbHlzaXNfcHZhbHVlc18udHh0IixjaGVjay5uYW1lcyA9IEYpCm1lYW5zID0gcmVhZC5kZWxpbSgiLi9EYXRhL0NlbGxwaG9uZURCL291dHB1dF9WMi9zdGF0aXN0aWNhbF9hbmFseXNpc19tZWFuc18udHh0IixjaGVjay5uYW1lcyA9IEYpCgpgYGAKCgpgYGB7cn0KdHJhY2UocGxvdF9jcGRiX2hlYXRtYXAsZWRpdCA9IFQpCnVudHJhY2UocGxvdF9jcGRiX2hlYXRtYXApCnVuZGVidWcocGxvdF9jcGRiX2hlYXRtYXApCm1hdCA9IHBsb3RfY3BkYl9oZWF0bWFwKHNjZGF0YSA9IGFjY19jYW5jZXJfY2Q0NV9jYWYsIGlkZW50cyA9ICdjZWxsX3R5cGUnLHB2YWxzID0gIHB2YWxzLG1haW4gPSAiTnVtYmVyIG9mIHNpZ25pZmljYW50IGludGVyYWN0aW9ucyIsYWxwaGEgPSAwLjA1LHRyZWVoZWlnaHRfcm93ID0gNTAscmV0dXJuX3RhYmxlcyA9IFQpCmBgYAoKCmBgYHtyfQpyb3duYW1lcyhhbGxfZW52aXJvbm1lbnQpID0gYWxsX2Vudmlyb25tZW50JGNlbGxfdHlwZQphbGxfZW52aXJvbm1lbnQkY2VsbF90eXBlIDwtIE5VTEwKYGBgCgpgYGB7ciBlY2hvPVRSVUUsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTE4LCByZXN1bHRzPSdhc2lzJ30KbG5fdHlwZXMgPSBhbGxfZW52aXJvbm1lbnQgJT4lIGZpbHRlcihtaWNyb2Vudmlyb21lbnQgPT0gIkxOIikgJT4lIHJvd25hbWVzKCkKcHJpX3R5cGVzID0gYWxsX2Vudmlyb25tZW50ICU+JSBmaWx0ZXIobWljcm9lbnZpcm9tZW50ID09ICJwcmkiKSAlPiUgcm93bmFtZXMoKQoKCnAxPSBwaGVhdG1hcDo6cGhlYXRtYXAobWF0JGNvdW50X25ldHdvcmtbcHJpX3R5cGVzLHByaV90eXBlc10sbWFpbiA9ICJOdW1iZXIgb2Ygc2lnbmlmaWNhbnQgaW50ZXJhY3Rpb25zLSBwcmltYXJ5IixzaWxlbnQgPSBUKSBbWzRdXQpwMiA9IHBoZWF0bWFwOjpwaGVhdG1hcChtYXQkY291bnRfbmV0d29ya1tsbl90eXBlcyxsbl90eXBlc10sbWFpbiA9ICJOdW1iZXIgb2Ygc2lnbmlmaWNhbnQgaW50ZXJhY3Rpb25zLSBMTiIsc2lsZW50ID0gVClbWzRdXQpncmlkRXh0cmE6OmdyaWQuYXJyYW5nZShwMSwgcDIsbnJvdyA9IDEsbmNvbD0yKQpgYGAKCmBgYHtyfQp1bmlxX2ludGVyYWN0aW9ucyA8LSBmdW5jdGlvbihjZWxsX3R5cGUxLCBjZWxsX3R5cGUyX2EgLGNlbGxfdHlwZTJfYiwgZ2VuZS5mYW1pbHkgPSBOVUxMLGdlbmVzID0gTlVMTCkgewogIHJlcXVpcmUocHVycnIpCiAgYSA9IHBsb3RfY3BkYihjZWxsX3R5cGUxID0gY2VsbF90eXBlMSwgY2VsbF90eXBlMiA9Y2VsbF90eXBlMl9hLCBzY2RhdGEgPSBhY2NfY2FuY2VyX2NkNDVfY2FmLAogICAgICAgICAgICAgICAgICAgICAgaWRlbnRzID0gJ2NlbGxfdHlwZScsIG1lYW5zID0gbWVhbnMsIHB2YWxzID0gcHZhbHMsCiAgICAgICAgICAgICAgICAgICAgICBnZW5lLmZhbWlseSA9IGdlbmUuZmFtaWx5LHJldHVybl90YWJsZSA9IFQsIHAuYWRqdXN0Lm1ldGhvZCA9ICJmZHIiLGtlZXBfc2lnbmlmaWNhbnRfb25seSA9IEYsIGdlbmVzID0gZ2VuZXMpCiAgCiAgYiA9IHBsb3RfY3BkYihjZWxsX3R5cGUxID0gY2VsbF90eXBlMSwgY2VsbF90eXBlMiA9IGNlbGxfdHlwZTJfYiwgc2NkYXRhID0gYWNjX2NhbmNlcl9jZDQ1X2NhZiwKICAgICAgICAgICAgICAgICAgICAgIGlkZW50cyA9ICdjZWxsX3R5cGUnLCBtZWFucyA9IG1lYW5zLCBwdmFscyA9IHB2YWxzLAogICAgICAgICAgICAgICAgICAgICAgZ2VuZS5mYW1pbHkgPSBnZW5lLmZhbWlseSxyZXR1cm5fdGFibGUgPSBULHAuYWRqdXN0Lm1ldGhvZCA9ICJmZHIiLGtlZXBfc2lnbmlmaWNhbnRfb25seSA9IEYsIGdlbmVzID0gZ2VuZXMpCiAgCiAgCiAgYWxsID0gbGlzdCgpCiAgaT0wCiAgbmVsZW1lbnRzID0gYSRWYXIyICU+JSB1bmlxdWUoKSAlPiUgbGVuZ3RoKCkKICBhX2NvdXBsZXMgPSBhJFZhcjIgJT4lIHVuaXF1ZSgpJT4lIGFzLnZlY3RvcigpICAKICBiX2NvdXBsZXMgPSBiJFZhcjIgJT4lIHVuaXF1ZSgpJT4lIGFzLnZlY3RvcigpICAKICBmb3IgKGkgaW4gMTpuZWxlbWVudHMpIHsKICAgIHNpZ19jb3VwbGVzX2EgPSBhICU+JSBmaWx0ZXIoVmFyMiA9PSBhX2NvdXBsZXNbaV0pICU+JSBmaWx0ZXIocHZhbHNfYWRqIDw9IDAuMDUpICU+JSAgcHVsbChWYXIxKSAlPiUgYXMudmVjdG9yKCkgIAogICAgc2lnX2NvdXBsZXNfYiA9IGIgJT4lIGZpbHRlcihWYXIyID09IGJfY291cGxlc1tpXSkgJT4lIGZpbHRlcihwdmFsc19hZGogPD0gMC4wNSkgJT4lICBwdWxsKFZhcjEpICU+JSBhcy52ZWN0b3IoKSAgCiAgICBvbmx5X2luX2EgPSBzaWdfY291cGxlc19hWyEgc2lnX2NvdXBsZXNfYSAlaW4lIHNpZ19jb3VwbGVzX2JdCiAgICBhbGxbW2FfY291cGxlc1tpXV1dID0gb25seV9pbl9hIAogICAgaSA9IGkrMQogIH0KICBhbGwgPSB0KG1hcF9kZnIoYWxsLCB+YXNfdGliYmxlKHQoLikpKSkgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgIHNldF9uYW1lcyhhX2NvdXBsZXMpCiAgcmV0dXJuKGFsbCkKfQoKCnRyYWNlKHBsb3RfY3BkYixlZGl0ID0gVCkKYGBgCgpgYGB7cn0KbXlfcGxvdF9jcGRiIDwtIGZ1bmN0aW9uKC4uLixjYWYgPSBGKSB7CiAgcCA9IHBsb3RfY3BkYiguLi4pCiAgcGcgPC0gZ2dwbG90X2J1aWxkKHApCiAgaWYgKGNhZiA9PSBGKXsKICAgIHBnJHBsb3QkZGF0YSAgJTw+JSAgbXV0YXRlKGx1bV9vcl9teW8gPSBpZl9lbHNlKGNvbmRpdGlvbiA9IGdyZXBsKHBhdHRlcm4gPSAiTHVtaW5hbCIseCA9IFZhcjIpLHRydWUgPSAiTHVtaW5hbCIsZmFsc2UgPSAiTXlvIikpICU+JSBtdXRhdGUoCiAgICAgIGRpcmVjdGlvbiA9aWZfZWxzZShjb25kaXRpb24gPSBncmVwbChwYXR0ZXJuID0gIi1MdW1pbmFsfC1NeW8iLHggPSBWYXIyKSx0cnVlID0gImNhbmNlbC1pbW11bmUiLGZhbHNlID0gImltbXVuZS1jYW5jZXIiKSkgCiAgICAgIHBnJHBsb3QrZmFjZXRfZ3JpZChjb2xzID0gdmFycyhkaXJlY3Rpb24sbHVtX29yX215byksc2NhbGVzID0gImZyZWVfeCIpK3lsYWIoIkludGVyYWN0aW5nIHBhaXIiKSArCiAgICAgIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLHNpemUgPSAyMCkpCiAgICAgIAogIH1lbHNlewogICAgcGckcGxvdCRkYXRhICAlPD4lICBtdXRhdGUoZGlyZWN0aW9uID1pZl9lbHNlKGNvbmRpdGlvbiA9IGdyZXBsKHBhdHRlcm4gPSAiLUNBRiIseCA9IFZhcjIpLHRydWUgPSAiQ0FGLWltbXVuZSIsZmFsc2UgPSAiaW1tdW5lLUNBRiIpKSAKICAgICAgcGckcGxvdCtmYWNldF9ncmlkKGNvbHMgPSB2YXJzKGRpcmVjdGlvbiksc2NhbGVzID0gImZyZWVfeCIpK3lsYWIoIkludGVyYWN0aW5nIHBhaXIiKSArCiAgICAgIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLHNpemUgPSAyMCkpCiAgfQogIAoKfQpgYGAKCgojIENvc3RpbXVsYXRvcnkgaW50ZXJhY3Rpb25zIHsudGFic2V0fQpgYGB7ciBmaWcuaGVpZ2h0PTEyLCBmaWcud2lkdGg9MjAsIHJlc3VsdHM9J2FzaXMnfQoKcHJpbnRfdGFiKHBsdCA9IAogICAgICAgICAgICBteV9wbG90X2NwZGIoY2VsbF90eXBlMSA9ICdDRHxCfE1hY3JvfG1vbm8nLCBjZWxsX3R5cGUyID0gJ0x1bWluYWwgcHJpfE15byBwcmknLCBzY2RhdGEgPSBhY2NfY2FuY2VyX2NkNDVfY2FmLAogICAgICAgICAgICAgICAgICAgICAgaWRlbnRzID0gJ2NlbGxfdHlwZScsIG1lYW5zID0gbWVhbnMsIHB2YWxzID0gcHZhbHMsCiAgICAgICAgICAgICAgICAgICAgICBnZW5lLmZhbWlseSA9ICdjb3N0aW11bGF0b3J5JyxyZXR1cm5fdGFibGUgPSBGLG1heF9zaXplID0gMyxwLmFkanVzdC5tZXRob2QgPSAiZmRyIixrZWVwX3NpZ25pZmljYW50X29ubHkgPSBULGNsdXN0ZXJfcm93cyA9IFQpKwogICAgICAgICAgICBnZ3RpdGxlKCJDb3N0aW11bGF0b3J5IHByaW1hcnkiKQogICx0aXRsZSA9ICJQcmltYXJ5IikKCgpwcmludF90YWIocGx0ID0gCiAgICAgICAgICAgIG15X3Bsb3RfY3BkYihjZWxsX3R5cGUxID0gJ0NEfEJ8TWFjcm98bW9ubycsIGNlbGxfdHlwZTIgPSAnTHVtaW5hbCBMTnxNeW8gTE4nLCBzY2RhdGEgPSBhY2NfY2FuY2VyX2NkNDVfY2FmLAogICAgICAgICAgICAgICAgICAgICAgaWRlbnRzID0gJ2NlbGxfdHlwZScsIG1lYW5zID0gbWVhbnMsIHB2YWxzID0gcHZhbHMsCiAgICAgICAgICAgICAgICAgICAgICBnZW5lLmZhbWlseSA9ICdjb3N0aW11bGF0b3J5JyxyZXR1cm5fdGFibGUgPSBGLG1heF9zaXplID0gMyxwLmFkanVzdC5tZXRob2QgPSAiZmRyIixrZWVwX3NpZ25pZmljYW50X29ubHkgPSBULGNsdXN0ZXJfcm93cyA9IEYpKwogICAgICAgICAgICBnZ3RpdGxlKCJDb3N0aW11bGF0b3J5IExOIikKICAsdGl0bGUgPSAiTE4iKQoKcHJpbnRfdGFiKHBsdCA9IAogICAgICAgICAgICBteV9wbG90X2NwZGIoY2VsbF90eXBlMSA9ICdDRHxCfE1hY3JvfG1vbm8nLCBjZWxsX3R5cGUyID0gJ0NBRicsIHNjZGF0YSA9IGFjY19jYW5jZXJfY2Q0NV9jYWYsCiAgICAgICAgICAgICAgICAgICAgICBpZGVudHMgPSAnY2VsbF90eXBlJywgbWVhbnMgPSBtZWFucywgcHZhbHMgPSBwdmFscywKICAgICAgICAgICAgICAgICAgICAgIGdlbmUuZmFtaWx5ID0gJ2Nvc3RpbXVsYXRvcnknLHJldHVybl90YWJsZSA9IEYsbWF4X3NpemUgPSAzLHAuYWRqdXN0Lm1ldGhvZCA9ICJmZHIiLGtlZXBfc2lnbmlmaWNhbnRfb25seSA9IFQsY2x1c3Rlcl9yb3dzID0gRixjYWYgPSBUKSsKICAgICAgICAgICAgZ2d0aXRsZSgiQ29zdGltdWxhdG9yeSBDQUYiKQogICx0aXRsZSA9ICJDQUYiKQoKcHJpbnRfdGFiKHBsdCA9IAogICAgICAgICAgICB1bmlxX2ludGVyYWN0aW9ucyhjZWxsX3R5cGUxID0gJ0NEfEJ8TWFjcm98bW9ubycsY2VsbF90eXBlMl9hICA9ICdMdW1pbmFsIHByaScsY2VsbF90eXBlMl9iID0gIk15byIsZ2VuZS5mYW1pbHkgPSAiQ29zdGltdWxhdG9yeSIpCix0aXRsZSA9ICJ1bmlxdWUgaW4gbHVtaW5hbCBwcmkiKQoKCnByaW50X3RhYihwbHQgPSAKICAgICAgICAgICAgdW5pcV9pbnRlcmFjdGlvbnMoY2VsbF90eXBlMSA9ICdDRHxCfE1hY3JvfG1vbm8nLGNlbGxfdHlwZTJfYSAgPSAnTXlvIHByaScsY2VsbF90eXBlMl9iID0gIkx1bWluYWwiLGdlbmUuZmFtaWx5ID0gIkNvc3RpbXVsYXRvcnkiKQosdGl0bGUgPSAidW5pcXVlIGluIG15byBwcmkiKQoKcHJpbnRfdGFiKHBsdCA9IAogICAgICAgICAgICB1bmlxX2ludGVyYWN0aW9ucyhjZWxsX3R5cGUxID0gJ0NEfEJ8TWFjcm98bW9ubycsY2VsbF90eXBlMl9hICA9ICdMdW1pbmFsIExOJyxjZWxsX3R5cGUyX2IgPSAiTXlvIixnZW5lLmZhbWlseSA9ICJDb3N0aW11bGF0b3J5IikKLHRpdGxlID0gInVuaXF1ZSBpbiBsdW1pbmFsIExOIikKCgpwcmludF90YWIocGx0ID0gCiAgICAgICAgICAgIHVuaXFfaW50ZXJhY3Rpb25zKGNlbGxfdHlwZTEgPSAnQ0R8QnxNYWNyb3xtb25vJyxjZWxsX3R5cGUyX2EgID0gJ015byBMTicsY2VsbF90eXBlMl9iID0gIkx1bWluYWwiLGdlbmUuZmFtaWx5ID0gIkNvc3RpbXVsYXRvcnkiKQosdGl0bGUgPSAidW5pcXVlIGluIG15byBMTiIpCgpgYGAKCgoKIyBDb2luaGliaXRvcnkgaW50ZXJhY3Rpb25zIHsudGFic2V0fQoKYGBge3IgZmlnLmhlaWdodD01LHJlc3VsdHM9J2FzaXMnfQpwcmludF90YWIobXlfcGxvdF9jcGRiKGNlbGxfdHlwZTEgPSAnQ0R8QnxNYWNyb3xtb25vJywgY2VsbF90eXBlMiA9ICdMdW1pbmFsIHByaXxNeW8gcHJpJywgc2NkYXRhID0gYWNjX2NhbmNlcl9jZDQ1X2NhZiwKICAgICAgICAgIGlkZW50cyA9ICdjZWxsX3R5cGUnLCBtZWFucyA9IG1lYW5zLCBwdmFscyA9IHB2YWxzLAogICAgICAgICAgZ2VuZS5mYW1pbHkgPSAnY29pbmhpYml0b3J5JyxyZXR1cm5fdGFibGUgPSBGLG1heF9zaXplID0gNCxwLmFkanVzdC5tZXRob2QgPSAiZmRyIixrZWVwX3NpZ25pZmljYW50X29ubHkgPSBGLGNsdXN0ZXJfcm93cyA9IEYpKwogIGdndGl0bGUoImNvaW5oaWJpdG9yeSBwcmltYXJ5IiksdGl0bGUgPSAiUHJpbWFyeSIpCgpwcmludF90YWIobXlfcGxvdF9jcGRiKGNlbGxfdHlwZTEgPSAnQ0R8QnxNYWNyb3xtb25vJywgY2VsbF90eXBlMiA9ICdMdW1pbmFsIExOfE15byBMTicsIHNjZGF0YSA9IGFjY19jYW5jZXJfY2Q0NV9jYWYsCiAgICAgICAgICBpZGVudHMgPSAnY2VsbF90eXBlJywgbWVhbnMgPSBtZWFucywgcHZhbHMgPSBwdmFscywKICAgICAgICAgIGdlbmUuZmFtaWx5ID0gJ2NvaW5oaWJpdG9yeScscmV0dXJuX3RhYmxlID0gRixtYXhfc2l6ZSA9IDQscC5hZGp1c3QubWV0aG9kID0gImZkciIsa2VlcF9zaWduaWZpY2FudF9vbmx5ID0gRixjbHVzdGVyX3Jvd3MgPSBGKSsKICBnZ3RpdGxlKCJjb2luaGliaXRvcnkgTE4iKSx0aXRsZSA9ICJMTiIpCgoKcHJpbnRfdGFiKHBsdCA9IAogICAgICAgICAgICBteV9wbG90X2NwZGIoY2VsbF90eXBlMSA9ICdDRHxCfE1hY3JvfG1vbm8nLCBjZWxsX3R5cGUyID0gJ0NBRicsIHNjZGF0YSA9IGFjY19jYW5jZXJfY2Q0NV9jYWYsCiAgICAgICAgICAgICAgICAgICAgICBpZGVudHMgPSAnY2VsbF90eXBlJywgbWVhbnMgPSBtZWFucywgcHZhbHMgPSBwdmFscywKICAgICAgICAgICAgICAgICAgICAgIGdlbmUuZmFtaWx5ID0gJ2NvaW5oaWJpdG9yeScscmV0dXJuX3RhYmxlID0gRixtYXhfc2l6ZSA9IDMscC5hZGp1c3QubWV0aG9kID0gImZkciIsa2VlcF9zaWduaWZpY2FudF9vbmx5ID0gVCxjbHVzdGVyX3Jvd3MgPSBGLGNhZiA9IFQpKwogICAgICAgICAgICBnZ3RpdGxlKCJjb2luaGliaXRvcnkgQ0FGIikKICAsdGl0bGUgPSAiQ0FGIikKCnByaW50X3RhYihwbHQgPSAKICAgICAgICAgICAgdW5pcV9pbnRlcmFjdGlvbnMoY2VsbF90eXBlMSA9ICdDRHxCfE1hY3JvfG1vbm8nLGNlbGxfdHlwZTJfYSAgPSAnTHVtaW5hbCBMTicsY2VsbF90eXBlMl9iID0gIk15byBMTiIsZ2VuZS5mYW1pbHkgPSAiY29pbmhpYml0b3J5IikKLHRpdGxlID0gInVuaXF1ZSBpbiBsdW1pbmFsIExOIikKCgpwcmludF90YWIocGx0ID0gCiAgICAgICAgICAgIHVuaXFfaW50ZXJhY3Rpb25zKGNlbGxfdHlwZTEgPSAnQ0R8QnxNYWNyb3xtb25vJyxjZWxsX3R5cGUyX2EgID0gJ015byBMTicsY2VsbF90eXBlMl9iID0gIkx1bWluYWwgTE4iLGdlbmUuZmFtaWx5ID0gImNvaW5oaWJpdG9yeSIpCix0aXRsZSA9ICJ1bmlxdWUgaW4gbXlvIExOIikKCgpwcmludF90YWIocGx0ID0gCiAgICAgICAgICAgIHVuaXFfaW50ZXJhY3Rpb25zKGNlbGxfdHlwZTEgPSAnQ0R8QnxNYWNyb3xtb25vJyxjZWxsX3R5cGUyX2EgID0gJ0x1bWluYWwgcHJpJyxjZWxsX3R5cGUyX2IgPSAiTXlvIHByaSIsZ2VuZS5mYW1pbHkgPSAiY29pbmhpYml0b3J5IikKLHRpdGxlID0gInVuaXF1ZSBpbiBsdW1pbmFsIHByaSIpCgpwcmludF90YWIocGx0ID0gCiAgICAgICAgICAgIHVuaXFfaW50ZXJhY3Rpb25zKGNlbGxfdHlwZTEgPSAnQ0R8QnxNYWNyb3xtb25vJyxjZWxsX3R5cGUyX2EgID0gJ015byBwcmknLGNlbGxfdHlwZTJfYiA9ICJMdW1pbmFsIHByaSIsZ2VuZS5mYW1pbHkgPSAiY29pbmhpYml0b3J5IikKLHRpdGxlID0gInVuaXF1ZSBpbiBteW8gcHJpIikKYGBgCgojIENoZW1va2luZXMgaW50ZXJhY3Rpb25zIHsudGFic2V0fQpgYGB7ciBmaWcuaGVpZ2h0PTcsIHJlc3VsdHM9J2FzaXMnfQpwcmludF90YWIoCiAgbXlfcGxvdF9jcGRiKGNlbGxfdHlwZTEgPSAnQ0R8QnxNYWNyb3xtb25vJywgY2VsbF90eXBlMiA9ICdMdW1pbmFsIHByaXxNeW8gcHJpJywgc2NkYXRhID0gYWNjX2NhbmNlcl9jZDQ1X2NhZiwKICAgICAgICAgIGlkZW50cyA9ICdjZWxsX3R5cGUnLCBtZWFucyA9IG1lYW5zLCBwdmFscyA9IHB2YWxzLAogICAgICAgICAgZ2VuZS5mYW1pbHkgPSAnY2hlbW9raW5lcycscmV0dXJuX3RhYmxlID0gRixtYXhfc2l6ZSA9IDQscC5hZGp1c3QubWV0aG9kID0gImZkciIsa2VlcF9zaWduaWZpY2FudF9vbmx5ID0gRixjbHVzdGVyX3Jvd3MgPSBGKSsKICBnZ3RpdGxlKCJjaGVtb2tpbmVzIHByaW1hcnkiKSx0aXRsZSA9ICJQcmltYXJ5IikKCnByaW50X3RhYigKICBteV9wbG90X2NwZGIoY2VsbF90eXBlMSA9ICdDRHxCfE1hY3JvfG1vbm8nLCBjZWxsX3R5cGUyID0gJ0x1bWluYWwgTE58TXlvIExOJywgc2NkYXRhID0gYWNjX2NhbmNlcl9jZDQ1X2NhZiwKICAgICAgICAgIGlkZW50cyA9ICdjZWxsX3R5cGUnLCBtZWFucyA9IG1lYW5zLCBwdmFscyA9IHB2YWxzLAogICAgICAgICAgZ2VuZS5mYW1pbHkgPSAnY2hlbW9raW5lcycscmV0dXJuX3RhYmxlID0gRixtYXhfc2l6ZSA9IDQscC5hZGp1c3QubWV0aG9kID0gImZkciIsa2VlcF9zaWduaWZpY2FudF9vbmx5ID0gRixjbHVzdGVyX3Jvd3MgPSBGKSsKICBnZ3RpdGxlKCJjaGVtb2tpbmVzIExOIiksdGl0bGUgPSAiTE4iKQoKCgpwcmludF90YWIocGx0ID0gCiAgICAgICAgICAgIG15X3Bsb3RfY3BkYihjZWxsX3R5cGUxID0gJ0NEfEJ8TWFjcm98bW9ubycsIGNlbGxfdHlwZTIgPSAnQ0FGJywgc2NkYXRhID0gYWNjX2NhbmNlcl9jZDQ1X2NhZiwKICAgICAgICAgICAgICAgICAgICAgIGlkZW50cyA9ICdjZWxsX3R5cGUnLCBtZWFucyA9IG1lYW5zLCBwdmFscyA9IHB2YWxzLAogICAgICAgICAgICAgICAgICAgICAgZ2VuZS5mYW1pbHkgPSAnY2hlbW9raW5lcycscmV0dXJuX3RhYmxlID0gRixtYXhfc2l6ZSA9IDMscC5hZGp1c3QubWV0aG9kID0gImZkciIsa2VlcF9zaWduaWZpY2FudF9vbmx5ID0gVCxjbHVzdGVyX3Jvd3MgPSBGLGNhZiA9IFQpKwogICAgICAgICAgICBnZ3RpdGxlKCJjaGVtb2tpbmVzIENBRiIpCiAgLHRpdGxlID0gIkNBRiIpCgpwcmludF90YWIocGx0ID0gCiAgICAgICAgICAgIHVuaXFfaW50ZXJhY3Rpb25zKGNlbGxfdHlwZTEgPSAnQ0R8QnxNYWNyb3xtb25vJyxjZWxsX3R5cGUyX2EgID0gJ0x1bWluYWwgTE4nLGNlbGxfdHlwZTJfYiA9ICJNeW8gTE4iLGdlbmUuZmFtaWx5ID0gImNoZW1va2luZXMiKQosdGl0bGUgPSAidW5pcXVlIGluIGx1bWluYWwgTE4iKQoKCnByaW50X3RhYihwbHQgPSAKICAgICAgICAgICAgdW5pcV9pbnRlcmFjdGlvbnMoY2VsbF90eXBlMSA9ICdDRHxCfE1hY3JvfG1vbm8nLGNlbGxfdHlwZTJfYSAgPSAnTXlvIExOJyxjZWxsX3R5cGUyX2IgPSAiTHVtaW5hbCBMTiIsZ2VuZS5mYW1pbHkgPSAiY2hlbW9raW5lcyIpCix0aXRsZSA9ICJ1bmlxdWUgaW4gbXlvIExOIikKCgpwcmludF90YWIocGx0ID0gCiAgICAgICAgICAgIHVuaXFfaW50ZXJhY3Rpb25zKGNlbGxfdHlwZTEgPSAnQ0R8QnxNYWNyb3xtb25vJyxjZWxsX3R5cGUyX2EgID0gJ0x1bWluYWwgcHJpJyxjZWxsX3R5cGUyX2IgPSAiTXlvIHByaSIsZ2VuZS5mYW1pbHkgPSAiY2hlbW9raW5lcyIpCix0aXRsZSA9ICJ1bmlxdWUgaW4gbHVtaW5hbCBwcmkiKQoKcHJpbnRfdGFiKHBsdCA9IAogICAgICAgICAgICB1bmlxX2ludGVyYWN0aW9ucyhjZWxsX3R5cGUxID0gJ0NEfEJ8TWFjcm98bW9ubycsY2VsbF90eXBlMl9hICA9ICdNeW8gcHJpJyxjZWxsX3R5cGUyX2IgPSAiTHVtaW5hbCBwcmkiLGdlbmUuZmFtaWx5ID0gImNoZW1va2luZXMiKQosdGl0bGUgPSAidW5pcXVlIGluIG15byBwcmkiKQpgYGAKIyBDaGVtb2tpbmUgbGlnYW5kcyB7LnRhYnNldH0KYGBge3IgZmlnLmhlaWdodD04LCByZXN1bHRzPSdhc2lzJ30KZ2VuZXMgPSBjKCJDWENMMVxcRCIsICJDWENMMlxcRCIsIkNYQ0wzXFxEIiwiQ1hDTDE3IiwiQzMiLCJDWENMMTQiKQpwcmludF90YWIobXlfcGxvdF9jcGRiKGNlbGxfdHlwZTEgPSAnQ0R8QnxNYWNyb3xtb25vJywgY2VsbF90eXBlMiA9ICdMdW1pbmFsIHByaXxNeW8gcHJpJywgc2NkYXRhID0gYWNjX2NhbmNlcl9jZDQ1X2NhZiwKICAgIGlkZW50cyA9ICdjZWxsX3R5cGUnLCBtZWFucyA9IG1lYW5zLCBwdmFscyA9IHB2YWxzLAogZ2VuZXMgPSBnZW5lcyxyZXR1cm5fdGFibGUgPSBGLG1heF9zaXplID0gNCxwLmFkanVzdC5tZXRob2QgPSAiZmRyIiAsa2VlcF9zaWduaWZpY2FudF9vbmx5ID0gRikgCiAsdGl0bGUgPSAiUHJpbWFyeSIpCgpwcmludF90YWIobXlfcGxvdF9jcGRiKGNlbGxfdHlwZTEgPSAnQ0R8QnxNYWNyb3xtb25vJywgY2VsbF90eXBlMiA9ICdMdW1pbmFsIExOfE15byBMTicsIHNjZGF0YSA9IGFjY19jYW5jZXJfY2Q0NV9jYWYsCiAgICBpZGVudHMgPSAnY2VsbF90eXBlJywgbWVhbnMgPSBtZWFucywgcHZhbHMgPSBwdmFscywKICBnZW5lcyA9IGdlbmVzLHJldHVybl90YWJsZSA9IEYsbWF4X3NpemUgPSA0LHAuYWRqdXN0Lm1ldGhvZCA9ICJmZHIiICxrZWVwX3NpZ25pZmljYW50X29ubHkgPSBGKSAKLHRpdGxlID0gIkxOIikKCgpwcmludF90YWIocGx0ID0gCiAgICAgICAgICAgIHVuaXFfaW50ZXJhY3Rpb25zKGNlbGxfdHlwZTEgPSAnQ0R8QnxNYWNyb3xtb25vJyxjZWxsX3R5cGUyX2EgID0gJ0x1bWluYWwgTE4nLGNlbGxfdHlwZTJfYiA9ICJNeW8gTE4iLGdlbmVzID0gZ2VuZXMpCix0aXRsZSA9ICJ1bmlxdWUgaW4gbHVtaW5hbCBMTiIpCgoKcHJpbnRfdGFiKHBsdCA9IAogICAgICAgICAgICB1bmlxX2ludGVyYWN0aW9ucyhjZWxsX3R5cGUxID0gJ0NEfEJ8TWFjcm98bW9ubycsY2VsbF90eXBlMl9hICA9ICdNeW8gTE4nLGNlbGxfdHlwZTJfYiA9ICJMdW1pbmFsIExOIixnZW5lcyA9IGdlbmVzKQosdGl0bGUgPSAidW5pcXVlIGluIG15byBMTiIpCgoKcHJpbnRfdGFiKHBsdCA9IAogICAgICAgICAgICB1bmlxX2ludGVyYWN0aW9ucyhjZWxsX3R5cGUxID0gJ0NEfEJ8TWFjcm98bW9ubycsY2VsbF90eXBlMl9hICA9ICdMdW1pbmFsIHByaScsY2VsbF90eXBlMl9iID0gIk15byBwcmkiLGdlbmVzID0gZ2VuZXMpCix0aXRsZSA9ICJ1bmlxdWUgaW4gbHVtaW5hbCBwcmkiKQoKcHJpbnRfdGFiKHBsdCA9IAogICAgICAgICAgICB1bmlxX2ludGVyYWN0aW9ucyhjZWxsX3R5cGUxID0gJ0NEfEJ8TWFjcm98bW9ubycsY2VsbF90eXBlMl9hICA9ICdNeW8gcHJpJyxjZWxsX3R5cGUyX2IgPSAiTHVtaW5hbCBwcmkiLGdlbmVzID0gZ2VuZXMpCix0aXRsZSA9ICJ1bmlxdWUgaW4gbXlvIHByaSIpCmBgYAojIENDTDIyIGFuZCBDQ0wyOCB7LnRhYnNldH0KYGBge3IgcmVzdWx0cz0nYXNpcyd9CnByaW50X3RhYihteV9wbG90X2NwZGIoY2VsbF90eXBlMSA9ICdDRHxCfE1hY3JvfG1vbm8nLCBjZWxsX3R5cGUyID0gJ0x1bWluYWwgcHJpfE15byBwcmknLCBzY2RhdGEgPSBhY2NfY2FuY2VyX2NkNDVfY2FmLAogICAgaWRlbnRzID0gJ2NlbGxfdHlwZScsIG1lYW5zID0gbWVhbnMsIHB2YWxzID0gcHZhbHMsCiBnZW5lcyA9IGMoIkNDTDIyIiwgIkNDTDI4IiApLHJldHVybl90YWJsZSA9IEYsbWF4X3NpemUgPSA0LHAuYWRqdXN0Lm1ldGhvZCA9ICJmZHIiICxrZWVwX3NpZ25pZmljYW50X29ubHkgPSBGKSx0aXRsZSA9ICJQcmltYXJ5IikKCnByaW50X3RhYihteV9wbG90X2NwZGIoY2VsbF90eXBlMSA9ICdDRHxCfE1hY3JvfG1vbm8nLCBjZWxsX3R5cGUyID0gJ0x1bWluYWwgTE58TXlvIExOJywgc2NkYXRhID0gYWNjX2NhbmNlcl9jZDQ1X2NhZiwKICAgIGlkZW50cyA9ICdjZWxsX3R5cGUnLCBtZWFucyA9IG1lYW5zLCBwdmFscyA9IHB2YWxzLAogIGdlbmVzID0gYygiQ0NMMjIiLCAiQ0NMMjgiICkscmV0dXJuX3RhYmxlID0gRixtYXhfc2l6ZSA9IDYscC5hZGp1c3QubWV0aG9kID0gImZkciIgLGtlZXBfc2lnbmlmaWNhbnRfb25seSA9IEYpLHRpdGxlID0gIkxOIikKCgoKYGBgCgojIE5vdGNoIHNpZ25hbGluZyBpbnRlcmFjdGlvbnMgd2l0aCBpbW11bmUgey50YWJzZXR9CmBgYHtyIGZpZy5oZWlnaHQ9NiwgcmVzdWx0cz0nYXNpcyd9CnByaW50X3RhYihwbHQgPSAKICAgICAgICAgICAgbXlfcGxvdF9jcGRiKGNlbGxfdHlwZTEgPSAnQ0R8QnxNYWNyb3xtb25vJywgY2VsbF90eXBlMiA9ICdMdW1pbmFsIHByaXxNeW8gcHJpJywgc2NkYXRhID0gYWNjX2NhbmNlcl9jZDQ1X2NhZiwKICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50cyA9ICdjZWxsX3R5cGUnLCBtZWFucyA9IG1lYW5zLCBwdmFscyA9IHB2YWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXMgPWMoIkpBRyIsICJNWUIiICwgIk5PVENIIiwiSEVTMSIsIkhFWSIpLHJldHVybl90YWJsZSA9IEYsbWF4X3NpemUgPSA0LHAuYWRqdXN0Lm1ldGhvZCA9ICJmZHIiICxrZWVwX3NpZ25pZmljYW50X29ubHkgPSBGKSAKICAgICAgICAsdGl0bGUgPSAiUHJpbWFyeSIpCgpwcmludF90YWIocGx0ID0gCiAgICAgICAgICAgIG15X3Bsb3RfY3BkYihjZWxsX3R5cGUxID0gJ0NEfEJ8TWFjcm98bW9ubycsIGNlbGxfdHlwZTIgPSAnTHVtaW5hbCBMTnxNeW8gTE4nLCBzY2RhdGEgPSBhY2NfY2FuY2VyX2NkNDVfY2FmLAogICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRzID0gJ2NlbGxfdHlwZScsIG1lYW5zID0gbWVhbnMsIHB2YWxzID0gcHZhbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcyA9YygiSkFHIiwgIk1ZQiIgLCAiTk9UQ0giLCJIRVMxIiwiSEVZIikscmV0dXJuX3RhYmxlID0gRixtYXhfc2l6ZSA9IDQscC5hZGp1c3QubWV0aG9kID0gImZkciIgLGtlZXBfc2lnbmlmaWNhbnRfb25seSA9IEYpIAogICAgICAgICx0aXRsZSA9ICJQcmltYXJ5IikKYGBgCgojIE5vdGNoIHNpZ25hbGluZyBpbnRlcmFjdGlvbnMgd2l0aCBDQUYgey50YWJzZXR9CgpgYGB7ciBmaWcuaGVpZ2h0PTYgLHJlc3VsdHM9J2FzaXMnfQpwcmludF90YWIocGx0ID0gCiAgICAgICAgICAgIHBsb3RfY3BkYihjZWxsX3R5cGUxID0gJ0NBRicsIGNlbGxfdHlwZTIgPSAnTHVtaW5hbCBwcml8TXlvIHByaScsIHNjZGF0YSA9IGFjY19jYW5jZXJfY2Q0NV9jYWYsCiAgICAgICAgICAgICAgICAgICAgICBpZGVudHMgPSAnY2VsbF90eXBlJywgbWVhbnMgPSBtZWFucywgcHZhbHMgPSBwdmFscywKICAgICAgICAgICAgICAgICAgICAgIGdlbmVzID0gYygiSkFHIiwgIk1ZQiIgKSxyZXR1cm5fdGFibGUgPSBGLG1heF9zaXplID0gNCxwLmFkanVzdC5tZXRob2QgPSAiZmRyIiAsa2VlcF9zaWduaWZpY2FudF9vbmx5ID0gRikgCiAgICAgICAgICAsdGl0bGUgPSAiUHJpbWFyeSIpCgpwcmludF90YWIocGx0ID0gCiAgICAgICAgICAgIHBsb3RfY3BkYihjZWxsX3R5cGUxID0gJ0NBRicsIGNlbGxfdHlwZTIgPSAnTHVtaW5hbCBMTnxNeW8gTE4nLCBzY2RhdGEgPSBhY2NfY2FuY2VyX2NkNDVfY2FmLAogICAgICAgICAgICAgICAgICAgICAgaWRlbnRzID0gJ2NlbGxfdHlwZScsIG1lYW5zID0gbWVhbnMsIHB2YWxzID0gcHZhbHMsCiAgICAgICAgICAgICAgICAgICAgICBnZW5lcyA9IGMoIkpBRyIsICJNWUIiICkscmV0dXJuX3RhYmxlID0gRixtYXhfc2l6ZSA9IDQscC5hZGp1c3QubWV0aG9kID0gImZkciIgLGtlZXBfc2lnbmlmaWNhbnRfb25seSA9IEYpIAogICAgICAgICAgLHRpdGxlID0gIlByaW1hcnkiKSAKYGBgCgo8c2NyaXB0IHNyYz0iaHR0cHM6Ly9oeXBvdGhlcy5pcy9lbWJlZC5qcyIgYXN5bmM+PC9zY3JpcHQ+Cgo=