Functions
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")
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 = FeaturePlot(acc_immune,features = "APM_score"),title = "score")
score

NA
Exhaustion markers
exhausted_genes = c("PDCD1","CD244","CD160","CTLA4","HAVCR2")
FeaturePlot(acc_immune,features = exhausted_genes)

Immune receptors
receptors = c("CCR3", "CCR4", "CCR10","CXCR2", "CXCR3", "CXCR4", "IL17A")
FeaturePlot(acc_immune,features = receptors)

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)
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
ln_types = all_environment %>% filter(microenviroment == "LN") %>% rownames()
pri_types = all_environment %>% filter(microenviroment == "pri") %>% rownames()
print_tab(plt = ComplexHeatmap::pheatmap(mat$count_network[pri_types,pri_types])
,title = "primary significant interactions")
primary significant interactions

print_tab(plt = ComplexHeatmap::pheatmap(mat$count_network[ln_types,ln_types])
,title = "LN significant interactions")
LN significant interactions

NA
uniq_interactions <- function(cell_type1, cell_type2_a ,cell_type2_b, gene.family = NULL,genes = NULL) {
require(purrr)
a = plot_cpdb(cell_type1 = cell_type1, cell_type2 =cell_type2_a, scdata = acc_cancer_cd45_caf,
idents = 'cell_type', means = means, pvals = pvals,
gene.family = gene.family,return_table = T, p.adjust.method = "fdr",keep_significant_only = F, genes = genes)
b = plot_cpdb(cell_type1 = cell_type1, cell_type2 = cell_type2_b, scdata = acc_cancer_cd45_caf,
idents = 'cell_type', means = means, pvals = pvals,
gene.family = gene.family,return_table = T,p.adjust.method = "fdr",keep_significant_only = F, genes = genes)
all = list()
i=0
nelements = a$Var2 %>% unique() %>% length()
a_couples = a$Var2 %>% unique()%>% as.vector()
b_couples = b$Var2 %>% unique()%>% as.vector()
for (i in 1:nelements) {
sig_couples_a = a %>% filter(Var2 == a_couples[i]) %>% filter(pvals_adj <= 0.05) %>% pull(Var1) %>% as.vector()
sig_couples_b = b %>% filter(Var2 == b_couples[i]) %>% filter(pvals_adj <= 0.05) %>% pull(Var1) %>% as.vector()
only_in_a = sig_couples_a[! sig_couples_a %in% sig_couples_b]
all[[a_couples[i]]] = only_in_a
i = i+1
}
all = t(map_dfr(all, ~as_tibble(t(.)))) %>% as.data.frame() %>% set_names(a_couples)
return(all)
}
Costimulatory interactions
print_tab(plt =
plot_cpdb(cell_type1 = 'CD|B|Macro|mono', cell_type2 = 'Luminal', 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 Luminal")
,title = "Luminal")
Luminal

print_tab(plt =
plot_cpdb(cell_type1 = 'CD|B|Macro|mono', cell_type2 = 'Myo', 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 Myo")
,title = "Myo")
Myo

print_tab(plt =
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)+
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
Loading required package: purrr

Warning message: The x argument of
as_tibble.matrix() must have unique column names if
.name_repair is omitted as of tibble 2.0.0. Using
compatibility .name_repair. This warning is displayed once
every 8 hours. Call lifecycle::last_lifecycle_warnings() to
see where this warning was generated.
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")
Coinhibitory interactions
print_tab(plot_cpdb(cell_type1 = 'CD|B|Macro|mono', cell_type2 = 'Luminal', 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 Luminal"),title = "Luminal")
Luminal

print_tab(plot_cpdb(cell_type1 = 'CD|B|Macro|mono', cell_type2 = 'Myo', 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 Myo"),title = "Myo")
Myo

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")
Chemokines interactions
print_tab(
plot_cpdb(cell_type1 = 'CD|B|Macro|mono', cell_type2 = 'Luminal', 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 Luminal"),title = "Luminal")
Luminal

print_tab(
plot_cpdb(cell_type1 = 'CD|B|Macro|mono', cell_type2 = 'Myo', 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 Myo"),title = "Myo")
Myo

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")
Chemokine ligands
genes = c("CXCL1\\D", "CXCL2\\D","CXCL3\\D","CXCL17","C3","CXCL14")
print_tab(plot_cpdb(cell_type1 = 'CD|B|Macro|mono', cell_type2 = 'Myo', 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 = "Myo")
Myo

print_tab(plot_cpdb(cell_type1 = 'CD|B|Macro|mono', cell_type2 = 'Luminal', 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 = "Luminal")
Luminal

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")
CCL22
and CCL28
print_tab(plot_cpdb(cell_type1 = 'CD|B|Macro|mono', cell_type2 = 'Myo', 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 = "Myo")
Myo

print_tab(plot_cpdb(cell_type1 = 'CD|B|Macro|mono', cell_type2 = 'Luminal', 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 = "Luminal")
Luminal

NA
Notch signaling
interactions with immune
plot_cpdb(cell_type1 = 'CD|B|Macro|mono', cell_type2 = 'Myo', 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)

plot_cpdb(cell_type1 = 'CD|B|Macro|mono', cell_type2 = 'Luminal', 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)

Notch signaling
interactions with CAF
plot_cpdb(cell_type1 = 'CAF', cell_type2 = 'Myo', 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)

plot_cpdb(cell_type1 = 'CAF', cell_type2 = 'Luminal', 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)

LS0tCnRpdGxlOiAnYHIgcnN0dWRpb2FwaTo6Z2V0U291cmNlRWRpdG9yQ29udGV4dCgpJHBhdGggJT4lIGJhc2VuYW1lKCkgJT4lIGdzdWIocGF0dGVybiA9ICJcXC5SbWQiLHJlcGxhY2VtZW50ID0gIiIpYCcgCmF1dGhvcjogIkF2aXNoYWkgV2l6ZWwiCmRhdGU6ICdgciBTeXMudGltZSgpYCcKb3V0cHV0OiAKICBodG1sX25vdGVib29rOiAKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgdG9jOiB5ZXMKICAgIHRvY19jb2xsYXBzZTogeWVzCiAgICB0b2NfZmxvYXQ6IAogICAgICBjb2xsYXBzZWQ6IEZBTFNFCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIHRvY19kZXB0aDogMQotLS0KCgoKIyBGdW5jdGlvbnMKCmBgYHtyIHdhcm5pbmc9RkFMU0V9CmBgYAoKIyBEYXRhCgpgYGB7cn0KYWNjX2ltbXVuZSA9IExvYWRINVNldXJhdChmaWxlID0gIi4vRGF0YS9hY2NfaW1tdW5lXzVLdmFyR2VuZXNfVjJfY2VsbElkZW50aXR5Lmg1c2V1cmF0IikKYGBgCgoKYGBge3J9CmFjY19pbW11bmUkb3JpZ2luICAlPD4lICBnc3ViKHBhdHRlcm4gPSAiUHJpbWFyeSIscmVwbGFjZW1lbnQgPSAicHJpIikKaWRlbnRfb3JpZ2luID0gRmV0Y2hEYXRhKG9iamVjdCA9IGFjY19pbW11bmUsdmFycyA9IGMoIm9yaWdpbiIsImNlbGxfaWRlbnRpdHkiKSkKaWRlbnRfb3JpZ2luJGNvbWJpbmUgPSBwYXN0ZShpZGVudF9vcmlnaW4kY2VsbF9pZGVudGl0eSAsIGlkZW50X29yaWdpbiRvcmlnaW4pCmlkZW50X29yaWdpbiRnZW5lcmFsX2lkZW50aXR5ID0gaWRlbnRfb3JpZ2luJGNlbGxfaWRlbnRpdHkKYWNjX2ltbXVuZSAlPD4lIEFkZE1ldGFEYXRhKG1ldGFkYXRhID0gaWRlbnRfb3JpZ2luWywiY29tYmluZSIsIGRyb3A9Rl0sY29sLm5hbWUgPSAiY2VsbF9pZGVudGl0eSIpCkRpbVBsb3QoYWNjX2ltbXVuZSxncm91cC5ieSAgPSAiY2VsbF9pZGVudGl0eSIpCmBgYAojIEFudGlnZW4gcHJlc2VudGluZyBtYWNoaW5lcnkgey50YWJzZXR9CmBgYHtyfQphcG1fZ2VuZXMgPSBjKCJITEEtQSIsIkhMQS1CIiwiSExBLUMiLCJCMk0iLCJUQVAxIiwiVEFQMiIsICJUQVBCUCIpCmFwbV9zY29yZSA9IEZldGNoRGF0YShhY2NfaW1tdW5lLHZhcnMgPSBhcG1fZ2VuZXMsc2xvdCA9ICJkYXRhIikgJT4lIHJvd01lYW5zKCkKYWNjX2ltbXVuZSA9IEFkZE1ldGFEYXRhKG9iamVjdCA9IGFjY19pbW11bmUsbWV0YWRhdGEgPSBhcG1fc2NvcmUsY29sLm5hbWUgPSAiQVBNX3Njb3JlIikKYGBgCgpgYGB7ciBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMCwgcmVzdWx0cz0nYXNpcyd9CnByaW50X3RhYihwbHQgPSBGZWF0dXJlUGxvdChhY2NfaW1tdW5lLGZlYXR1cmVzID0gYXBtX2dlbmVzKSx0aXRsZSA9ICJnZW5lcyIpCnByaW50X3RhYihwbHQgPSBGZWF0dXJlUGxvdChhY2NfaW1tdW5lLGZlYXR1cmVzID0gIkFQTV9zY29yZSIpLHRpdGxlID0gInNjb3JlIikKYGBgCgojIEV4aGF1c3Rpb24gbWFya2VycwpgYGB7ciBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMH0KZXhoYXVzdGVkX2dlbmVzID0gYygiUERDRDEiLCJDRDI0NCIsIkNEMTYwIiwiQ1RMQTQiLCJIQVZDUjIiKQpGZWF0dXJlUGxvdChhY2NfaW1tdW5lLGZlYXR1cmVzID0gZXhoYXVzdGVkX2dlbmVzKQpgYGAKIyBJbW11bmUgcmVjZXB0b3JzCmBgYHtyIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEwfQpyZWNlcHRvcnMgPSBjKCJDQ1IzIiwgIkNDUjQiLCAiQ0NSMTAiLCJDWENSMiIsICJDWENSMyIsICJDWENSNCIsICJJTDE3QSIpCkZlYXR1cmVQbG90KGFjY19pbW11bmUsZmVhdHVyZXMgPSByZWNlcHRvcnMpCmBgYAoKIyBDZWxscGhvbmVEQiB7LnRhYnNldH0KYGBge3J9CmFjY19jYW5jZXJfY2VsbHMgPSByZWFkUkRTKCIvc2NpL2xhYnMveW90YW1kL2xhYl9zaGFyZS9hdmlzaGFpLndpemVsL1JfcHJvamVjdHMvQUNDX21pY3JvZW52L0RhdGEvYWNjX3RwbV9uQ291bnRfbWl0b19ubzE0Nl8xNWtfY2FuY2VyY2VsbHMucmRzIikKYWNjX2NhZiA9IHJlYWRSRFMoIi9zY2kvbGFicy95b3RhbWQvbGFiX3NoYXJlL0FDQy9BQ0Nfc2MvYW5hbHlzaXMvYWNjX3RwbV9uQ291bnRfbWl0b19ubzE0Nl9jYWZzLnJkcyIpCmBgYAoKYGBge3J9CiMgbWVyZ2UgY2FuY2VyLCBpbW11bmUgYW5kIENBRgpjb21tb25fZ2VuZXMgPSByb3duYW1lcyhhY2NfY2FuY2VyX2NlbGxzKSAlPiUgaW50ZXJzZWN0IChyb3duYW1lcyhhY2NfaW1tdW5lKSkgJT4lIGludGVyc2VjdChyb3duYW1lcyhhY2NfY2FmX2NlbGxzKSkKYWNjX2NhbmNlcl9hbmRfY2Q0NSA9IG1lcmdlKGFjY19jYW5jZXJfY2VsbHNbY29tbW9uX2dlbmVzLF0sYWNjX2ltbXVuZVtjb21tb25fZ2VuZXMsXSkKb3ZlcmxhcHBpbmdfY2VsbHMgPSBjb2xuYW1lcyhhY2NfY2FuY2VyX2NlbGxzKSAlPiUgaW50ZXJzZWN0KGNvbG5hbWVzKGFjY19jYWYpKSAKYWNjX2NhbmNlcl9jZDQ1X2NhZiA9IG1lcmdlKGFjY19jYW5jZXJfYW5kX2NkNDVbY29tbW9uX2dlbmVzLF0sYWNjX2NhZl9jZWxsc1tjb21tb25fZ2VuZXMsIWNvbG5hbWVzKGFjY19jYWZfY2VsbHMpICVpbiUgb3ZlcmxhcHBpbmdfY2VsbHNdICkKYGBgCgpgYGB7cn0KI2NyZWF0ZSBvcmlnaW4gbWV0YWRhdGEgaW4gYWNjCmxuX3BsYXRlcyA9IGMoIkFDQzIyLkxOLlAxMSIsICJBQ0MyMi5QMTIuTE4iLCAgIkFDQzcuUDEzIiApCmFjY19vcmlnaW4gPSBGZXRjaERhdGEob2JqZWN0ID0gYWNjX2NhbmNlcl9jZWxscyx2YXJzID0gIm9yaWcuaWRlbnQiKSAlPiUgbXV0YXRlKG9yaWdpbiA9IGlmX2Vsc2UoY29uZGl0aW9uID0gb3JpZy5pZGVudCAlaW4lIGxuX3BsYXRlcyx0cnVlID0gIkxOIixmYWxzZSA9ICJwcmkiKSkKYWNjX2NhbmNlcl9jZWxscyAlPD4lIEFkZE1ldGFEYXRhKG1ldGFkYXRhID0gYWNjX29yaWdpblssIm9yaWdpbiIsZHJvcD1GXSxjb2wubmFtZSA9ICJvcmlnaW4iKQpgYGAKCmBgYHtyfQojY3JlYXRlIG9yaWdpbiBtZXRhZGF0YSBpbiBjYWYKbG5fcGxhdGVzID0gYygiQUNDMjIuTE4uUDExIiwgIkFDQzIyLlAxMi5MTiIsICAiQUNDNy5QMTMiICkKY2FmX29yaWdpbiA9IEZldGNoRGF0YShvYmplY3QgPSBhY2NfY2FmLHZhcnMgPSAib3JpZy5pZGVudCIpICU+JSBtdXRhdGUob3JpZ2luID0gaWZfZWxzZShjb25kaXRpb24gPSBvcmlnLmlkZW50ICVpbiUgbG5fcGxhdGVzLHRydWUgPSAiTE4iLGZhbHNlID0gInByaSIpKQphY2NfY2FmICU8PiUgQWRkTWV0YURhdGEobWV0YWRhdGEgPSBjYWZfb3JpZ2luWywib3JpZ2luIixkcm9wPUZdLGNvbC5uYW1lID0gIm9yaWdpbiIpCmBgYAoKYGBge3J9CiAgI2NyZWF0ZSBtZXRhZGF0YQoKI2NyZWF0ZSBsdW1pbmFsX292ZXJfbXlvCmdzPWFjY19jYW5jZXJfY2VsbHNAYXNzYXlzJFJOQUB2YXIuZmVhdHVyZXMKbXlvc2NvcmU9YXBwbHkoYWNjX2NhbmNlcl9jZWxsc0Bhc3NheXMkUk5BQHNjYWxlLmRhdGFbaW50ZXJzZWN0KGMoIlRQNjMiLCJUUDczIiwiQ0FWMSIsIkNESDMiLCJLUlQ1IiwiS1JUMTQiLCJBQ1RBMiIsIlRBR0xOIiwiTVlMSyIsIkRLSzMiKSxncyksXSwyLG1lYW4pCmxlc2NvcmU9YXBwbHkoYWNjX2NhbmNlcl9jZWxsc0Bhc3NheXMkUk5BQHNjYWxlLmRhdGFbaW50ZXJzZWN0KGMoIktJVCIsIkVIRiIsIkVMRjUiLCJLUlQ3IiwiQ0xETjMiLCJDTERONCIsIkNEMjQiLCJMR0FMUzMiLCJMQ04yIiwiU0xQSSIpLGdzKSxdLDIsbWVhbikKYWNjX2NhbmNlcl9jZWxscz1BZGRNZXRhRGF0YShhY2NfY2FuY2VyX2NlbGxzLGxlc2NvcmUtbXlvc2NvcmUsImx1bWluYWxfb3Zlcl9teW8iKQoKI2NyZWF0ZSBsdW1fb3JfbXlvCmx1bV9vdmVyX215byA9IEZldGNoRGF0YShvYmplY3QgPSBhY2NfY2FuY2VyX2NlbGxzLHZhcnMgPSAibHVtaW5hbF9vdmVyX215byIpCmx1bV9vdmVyX215byRsdW1fb3JfbXlvID0gIlVua25vd24iCmx1bV9vdmVyX215byRsdW1fb3JfbXlvIFtsdW1fb3Zlcl9teW8kbHVtaW5hbF9vdmVyX215bz4xXSAgPSAiTHVtaW5hbCIKbHVtX292ZXJfbXlvJGx1bV9vcl9teW8gW2x1bV9vdmVyX215byRsdW1pbmFsX292ZXJfbXlvPCgtMSldICA9ICJNeW8iCmx1bV9vcl9teW8gPSBsdW1fb3Zlcl9teW9bLCJsdW1fb3JfbXlvIixkcm9wID0gRl0KCmx1bV9vcl9teW8kY29tYmluZSA9IHBhc3RlKGx1bV9vcl9teW8kbHVtX29yX215byAsIGFjY19jYW5jZXJfY2VsbHMkb3JpZ2luKSAjYWRkIGVudmlyb25tZW50CmFjY19jYW5jZXJfY2VsbHMgJTw+JSBBZGRNZXRhRGF0YShtZXRhZGF0YSA9IGx1bV9vcl9teW9bLCJjb21iaW5lIixkcm9wPUZdLGNvbC5uYW1lID0gImNlbGxfaWRlbnRpdHkiKQoKI2FkZCBlbnZpcmlubWVudCB0byBDQUYgaWRlbnRpdHkKYWNjX2NhZiRjZWxsX2lkZW50aXR5ID0gcGFzdGUoYWNjX2NhZiRjZWxsLnR5cGUgLCBhY2NfY2FmJG9yaWdpbikgI2FkZCBlbnZpcm9ubWVudAoKYGBgCgpgYGB7cn0KI2NyZWF0ZSAgbWV0YWRhdGEKCiMgY29tYmluZQppbW11bmVfaWRlbnRpdHkgPUZldGNoRGF0YShvYmplY3QgPSBhY2NfaW1tdW5lLHZhcnMgPSAiY2VsbF9pZGVudGl0eSIpCmNhZl9pZGVudGl0eSA9RmV0Y2hEYXRhKG9iamVjdCA9IGFjY19jYWYsdmFycyA9ICJjZWxsX2lkZW50aXR5IikKY2FuY2VyX2lkZW50aXR5ID1GZXRjaERhdGEob2JqZWN0ID0gYWNjX2NhbmNlcl9jZWxscyx2YXJzID0gImNlbGxfaWRlbnRpdHkiKSU+JSBmaWx0ZXIoIWNlbGxfaWRlbnRpdHkgJWluJSBjKCJVbmtub3duIHByaSIsIlVua25vd24gTE4iKSkgI3JlbW92ZSB1bmtub3duIGNlbGxzCgphbGxfaWRlbnRpdHkgPSBkby5jYWxsKCJyYmluZCIsIGxpc3QoY2FuY2VyX2lkZW50aXR5LCBpbW11bmVfaWRlbnRpdHksIGNhZl9pZGVudGl0eSkpCgojcmVuYW1lIGFuZCBzb3J0IGNvbHVtbnMKYWxsX2lkZW50aXR5JGJhcmNvZGVfc2FtcGxlID0gcm93bmFtZXMoYWxsX2lkZW50aXR5KQphbGxfaWRlbnRpdHkgPSBhbGxfaWRlbnRpdHkgJT4lIHJlbmFtZShjZWxsX3R5cGUgPSBjZWxsX2lkZW50aXR5KQphbGxfaWRlbnRpdHkgPSBhbGxfaWRlbnRpdHlbLGMoMiwxKV0KYGBgCgpgYGB7cn0KI2NyZWF0ZSAgZW52aXJvbWVudAppbW11bmVfZW52aXJvbWVudCA9IEZldGNoRGF0YShvYmplY3QgPSBhY2NfaW1tdW5lLHZhcnMgPSBjKCJjZWxsX2lkZW50aXR5IiwgIm9yaWdpbiIpKSAlPiUgc2V0X25hbWVzKGMoImNlbGxfdHlwZSIsIm1pY3JvZW52aXJvbWVudCIpKQphY2NfZW52aXJvbWVudCA9IEZldGNoRGF0YShvYmplY3QgPSBhY2NfY2FuY2VyX2NlbGxzLHZhcnMgPSBjKCJjZWxsX2lkZW50aXR5IiwgIm9yaWdpbiIpKSU+JQogIGZpbHRlcighY2VsbF9pZGVudGl0eSAlaW4lIGMoIlVua25vd24gcHJpIiwiVW5rbm93biBMTiIpKSU+JSAgI3JlbW92ZSB1bmtub3duIAogIHNldF9uYW1lcyhjKCJjZWxsX3R5cGUiLCJtaWNyb2Vudmlyb21lbnQiKSkKY2FmX2Vudmlyb21lbnQgPSBGZXRjaERhdGEob2JqZWN0ID0gYWNjX2NhZix2YXJzID0gYygiY2VsbF9pZGVudGl0eSIsICJvcmlnaW4iKSkgJT4lIHNldF9uYW1lcyhjKCJjZWxsX3R5cGUiLCJtaWNyb2Vudmlyb21lbnQiKSkKCmFsbF9lbnZpcm9ubWVudCA9IGRvLmNhbGwoInJiaW5kIiwgbGlzdChpbW11bmVfZW52aXJvbWVudCwgYWNjX2Vudmlyb21lbnQsIGNhZl9lbnZpcm9tZW50KSkKYWxsX2Vudmlyb25tZW50ID0gZGF0YS5mcmFtZShjZWxsX3R5cGUgPSBhbGxfZW52aXJvbm1lbnQkY2VsbF90eXBlICU+JSB1bmlxdWUoKSkgJT4lIG11dGF0ZShtaWNyb2Vudmlyb21lbnQgPSBpZl9lbHNlKGNvbmRpdGlvbiA9IGdyZXBsKHggPSAgY2VsbF90eXBlLHBhdHRlcm4gPSAgIkxOIiksdHJ1ZSA9ICJMTiIsZmFsc2UgPSAicHJpIikpICMgZml4IGVudmlyb25tZW50IGNvbnRhaW4gZXZlcnkgY2VsbCB0eXBlLCBub3QgZXZlcnkgY2VsbAoKYGBgCgoKYGBge3J9CndyaXRlLnRhYmxlKHggPSBhbGxfaWRlbnRpdHksZmlsZSA9ICIuL0RhdGEvQ2VsbHBob25lREIvaW5wdXRfVjIvbWV0YWRhdGEudHN2Iixyb3cubmFtZXMgPUYsc2VwID0gIlx0IikKd3JpdGUudGFibGUoeCA9IGFsbF9lbnZpcm9ubWVudCxmaWxlID0gIi4vRGF0YS9DZWxscGhvbmVEQi9pbnB1dF9WMi9lbnZpcm9tZW50LnRzdiIscm93Lm5hbWVzID1GLHNlcCA9ICJcdCIpCmBgYAoKYGBge3J9CmFjY19jYW5jZXJfY2Q0NV9jYWYgPSBhY2NfY2FuY2VyX2NkNDVfY2FmWyxyb3duYW1lcyhhbGxfaWRlbnRpdHkpXQpmd3JpdGUoYXMuZGF0YS5mcmFtZShhY2NfY2FuY2VyX2NkNDVfY2FmQGFzc2F5c1tbIlJOQSJdXUBkYXRhKSwgZmlsZSA9ICIuL0RhdGEvQ2VsbHBob25lREIvaW5wdXRfVjIvY291bnRzLnR4dCIsc2VwID0gIlx0Iixyb3cubmFtZXMgPSBUKQpgYGAKCgpgYGB7cHl0aG9uIGluY2x1ZGU9RkFMU0V9CiNkb3dubG9hZCBkYXRhYmFzZQppbXBvcnQgcGFuZGFzIGFzIHBkCmltcG9ydCBnbG9iCmltcG9ydCBvcwojIC0tIFZlcnNpb24gb2YgdGhlIGRhdGFic2UKY3BkYl92ZXJzaW9uID0gJ3Y0LjEuMCcKCiMgLS0gUGF0aCB3aGVyZSB0aGUgaW5wdXQgZmlsZXMgdG8gZ2VuZXJhdGUgdGhlIGRhdGFiYXNlIGFyZSBsb2NhdGVkCmNwZGJfdGFyZ2V0X2RpciA9IG9zLnBhdGguam9pbignLi9EYXRhL0NlbGxwaG9uZURCLycsIGNwZGJfdmVyc2lvbikKCiMgRG93bmxvYWQgZGF0YWJhc2UKZnJvbSBjZWxscGhvbmVkYi51dGlscyBpbXBvcnQgZGJfdXRpbHMKZGJfdXRpbHMuZG93bmxvYWRfZGF0YWJhc2UoY3BkYl90YXJnZXRfZGlyLCBjcGRiX3ZlcnNpb24pCmBgYAoKYGBge3B5dGhvbiBpbmNsdWRlPUZBTFNFfQpmcm9tIGNlbGxwaG9uZWRiLnNyYy5jb3JlLm1ldGhvZHMgaW1wb3J0IGNwZGJfc3RhdGlzdGljYWxfYW5hbHlzaXNfbWV0aG9kCmZvbGRlciA9ICJpbnB1dF9WMiIKZm9sZGVyX291dHB1dCA9ICJvdXRwdXRfVjIiCmRlY29udm9sdXRlZCwgbWVhbnMsIHB2YWx1ZXMsIHNpZ25pZmljYW50X21lYW5zID0gY3BkYl9zdGF0aXN0aWNhbF9hbmFseXNpc19tZXRob2QuY2FsbCgKICAgIGNwZGJfZmlsZV9wYXRoID0gIi4vRGF0YS9DZWxscGhvbmVEQi92NC4xLjAvY2VsbHBob25lZGIuemlwIiwgICAgICAgICAgICAgICAgICMgbWFuZGF0b3J5OiBDZWxsUGhvbmVEQiBkYXRhYmFzZSB6aXAgZmlsZS4KICAgIG1ldGFfZmlsZV9wYXRoID0gIi4vRGF0YS9DZWxscGhvbmVEQi8iK2ZvbGRlcisiL21ldGFkYXRhLnRzdiIsICAgICAgICAgICAgICAgICAjIG1hbmRhdG9yeTogdHN2IGZpbGUgZGVmaW5pbmcgYmFyY29kZXMgdG8gY2VsbCBsYWJlbC4KICAgIGNvdW50c19maWxlX3BhdGggPSAiLi9EYXRhL0NlbGxwaG9uZURCLyIrZm9sZGVyKyIvY291bnRzLnR4dCIsICAgICAgICAgICAgICMgbWFuZGF0b3J5OiBub3JtYWxpemVkIGNvdW50IG1hdHJpeC4KICAgIGNvdW50c19kYXRhID0gJ2hnbmNfc3ltYm9sJywgICAgICAgICAgICAgICAgICAgICAjIGRlZmluZXMgdGhlIGdlbmUgYW5ub3RhdGlvbiBpbiBjb3VudHMgbWF0cml4LgogICAgIG1pY3JvZW52c19maWxlX3BhdGggPSAiLi9EYXRhL0NlbGxwaG9uZURCLyIrZm9sZGVyKyIvZW52aXJvbWVudC50c3YiLAogICAgb3V0cHV0X3BhdGggPSAiLi9EYXRhL0NlbGxwaG9uZURCLyIgKyBmb2xkZXJfb3V0cHV0LCAjIFBhdGggdG8gc2F2ZSByZXN1bHRzLgogICAgb3V0cHV0X3N1ZmZpeCA9ICIiIAopCmBgYCAgIAoKCmBgYHtyfQpsaWJyYXJ5KGt0cGxvdHMpCmxpYnJhcnkocmV0aWN1bGF0ZSkKYWNjX2NhbmNlcl9jZDQ1X2NhZiRjZWxsX3R5cGUgPSBhbGxfaWRlbnRpdHlbLDIsZHJvcCA9IEZdICMgYWRkIGNlbGxzIGlkZW50aXRpZXMgdG8gU2V1cmF0CgojcmVhZCBkYXRhOgojIHB2YWxzID0gIHB5JHB2YWx1ZXMKIyBtZWFucyA9IHB5JG1lYW5zCgojICNvcjoKcHZhbHMgPSByZWFkLmRlbGltKCIuL0RhdGEvQ2VsbHBob25lREIvb3V0cHV0X1YyL3N0YXRpc3RpY2FsX2FuYWx5c2lzX3B2YWx1ZXNfLnR4dCIsY2hlY2submFtZXMgPSBGKQptZWFucyA9IHJlYWQuZGVsaW0oIi4vRGF0YS9DZWxscGhvbmVEQi9vdXRwdXRfVjIvc3RhdGlzdGljYWxfYW5hbHlzaXNfbWVhbnNfLnR4dCIsY2hlY2submFtZXMgPSBGKQoKYGBgCgoKYGBge3J9CnRyYWNlKHBsb3RfY3BkYl9oZWF0bWFwLGVkaXQgPSBUKQp1bnRyYWNlKHBsb3RfY3BkYl9oZWF0bWFwKQp1bmRlYnVnKHBsb3RfY3BkYl9oZWF0bWFwKQptYXQgPSBwbG90X2NwZGJfaGVhdG1hcChzY2RhdGEgPSBhY2NfY2FuY2VyX2NkNDVfY2FmLCBpZGVudHMgPSAnY2VsbF90eXBlJyxwdmFscyA9ICBwdmFscyxtYWluID0gIk51bWJlciBvZiBzaWduaWZpY2FudCBpbnRlcmFjdGlvbnMiLGFscGhhID0gMC4wNSx0cmVlaGVpZ2h0X3JvdyA9IDUwLHJldHVybl90YWJsZXMgPSBUKQpgYGAKYGBge3J9CnJvd25hbWVzKGFsbF9lbnZpcm9ubWVudCkgPSBhbGxfZW52aXJvbm1lbnQkY2VsbF90eXBlCmFsbF9lbnZpcm9ubWVudCRjZWxsX3R5cGUgPC0gTlVMTApgYGAKCmBgYHtyIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CmxuX3R5cGVzID0gYWxsX2Vudmlyb25tZW50ICU+JSBmaWx0ZXIobWljcm9lbnZpcm9tZW50ID09ICJMTiIpICU+JSByb3duYW1lcygpCnByaV90eXBlcyA9IGFsbF9lbnZpcm9ubWVudCAlPiUgZmlsdGVyKG1pY3JvZW52aXJvbWVudCA9PSAicHJpIikgJT4lIHJvd25hbWVzKCkKCnByaW50X3RhYihwbHQgPSAgQ29tcGxleEhlYXRtYXA6OnBoZWF0bWFwKG1hdCRjb3VudF9uZXR3b3JrW3ByaV90eXBlcyxwcmlfdHlwZXNdKQogICAgICAgICAgLHRpdGxlID0gInByaW1hcnkgc2lnbmlmaWNhbnQgaW50ZXJhY3Rpb25zIikKCnByaW50X3RhYihwbHQgPSBDb21wbGV4SGVhdG1hcDo6cGhlYXRtYXAobWF0JGNvdW50X25ldHdvcmtbbG5fdHlwZXMsbG5fdHlwZXNdKQogICAgICAgICAgLHRpdGxlID0gIkxOIHNpZ25pZmljYW50IGludGVyYWN0aW9ucyIpCgoKYGBgCgpgYGB7cn0KdW5pcV9pbnRlcmFjdGlvbnMgPC0gZnVuY3Rpb24oY2VsbF90eXBlMSwgY2VsbF90eXBlMl9hICxjZWxsX3R5cGUyX2IsIGdlbmUuZmFtaWx5ID0gTlVMTCxnZW5lcyA9IE5VTEwpIHsKICByZXF1aXJlKHB1cnJyKQogIGEgPSBwbG90X2NwZGIoY2VsbF90eXBlMSA9IGNlbGxfdHlwZTEsIGNlbGxfdHlwZTIgPWNlbGxfdHlwZTJfYSwgc2NkYXRhID0gYWNjX2NhbmNlcl9jZDQ1X2NhZiwKICAgICAgICAgICAgICAgICAgICAgIGlkZW50cyA9ICdjZWxsX3R5cGUnLCBtZWFucyA9IG1lYW5zLCBwdmFscyA9IHB2YWxzLAogICAgICAgICAgICAgICAgICAgICAgZ2VuZS5mYW1pbHkgPSBnZW5lLmZhbWlseSxyZXR1cm5fdGFibGUgPSBULCBwLmFkanVzdC5tZXRob2QgPSAiZmRyIixrZWVwX3NpZ25pZmljYW50X29ubHkgPSBGLCBnZW5lcyA9IGdlbmVzKQogIAogIGIgPSBwbG90X2NwZGIoY2VsbF90eXBlMSA9IGNlbGxfdHlwZTEsIGNlbGxfdHlwZTIgPSBjZWxsX3R5cGUyX2IsIHNjZGF0YSA9IGFjY19jYW5jZXJfY2Q0NV9jYWYsCiAgICAgICAgICAgICAgICAgICAgICBpZGVudHMgPSAnY2VsbF90eXBlJywgbWVhbnMgPSBtZWFucywgcHZhbHMgPSBwdmFscywKICAgICAgICAgICAgICAgICAgICAgIGdlbmUuZmFtaWx5ID0gZ2VuZS5mYW1pbHkscmV0dXJuX3RhYmxlID0gVCxwLmFkanVzdC5tZXRob2QgPSAiZmRyIixrZWVwX3NpZ25pZmljYW50X29ubHkgPSBGLCBnZW5lcyA9IGdlbmVzKQogIAogIAogIGFsbCA9IGxpc3QoKQogIGk9MAogIG5lbGVtZW50cyA9IGEkVmFyMiAlPiUgdW5pcXVlKCkgJT4lIGxlbmd0aCgpCiAgYV9jb3VwbGVzID0gYSRWYXIyICU+JSB1bmlxdWUoKSU+JSBhcy52ZWN0b3IoKSAgCiAgYl9jb3VwbGVzID0gYiRWYXIyICU+JSB1bmlxdWUoKSU+JSBhcy52ZWN0b3IoKSAgCiAgZm9yIChpIGluIDE6bmVsZW1lbnRzKSB7CiAgICBzaWdfY291cGxlc19hID0gYSAlPiUgZmlsdGVyKFZhcjIgPT0gYV9jb3VwbGVzW2ldKSAlPiUgZmlsdGVyKHB2YWxzX2FkaiA8PSAwLjA1KSAlPiUgIHB1bGwoVmFyMSkgJT4lIGFzLnZlY3RvcigpICAKICAgIHNpZ19jb3VwbGVzX2IgPSBiICU+JSBmaWx0ZXIoVmFyMiA9PSBiX2NvdXBsZXNbaV0pICU+JSBmaWx0ZXIocHZhbHNfYWRqIDw9IDAuMDUpICU+JSAgcHVsbChWYXIxKSAlPiUgYXMudmVjdG9yKCkgIAogICAgb25seV9pbl9hID0gc2lnX2NvdXBsZXNfYVshIHNpZ19jb3VwbGVzX2EgJWluJSBzaWdfY291cGxlc19iXQogICAgYWxsW1thX2NvdXBsZXNbaV1dXSA9IG9ubHlfaW5fYSAKICAgIGkgPSBpKzEKICB9CiAgYWxsID0gdChtYXBfZGZyKGFsbCwgfmFzX3RpYmJsZSh0KC4pKSkpICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lICBzZXRfbmFtZXMoYV9jb3VwbGVzKQogIHJldHVybihhbGwpCn0KCmBgYAojIENvc3RpbXVsYXRvcnkgaW50ZXJhY3Rpb25zIHsudGFic2V0fQpgYGB7ciBmaWcuaGVpZ2h0PTEyLCBmaWcud2lkdGg9MjAsIHJlc3VsdHM9J2FzaXMnfQoKcHJpbnRfdGFiKHBsdCA9IAogICAgICAgICAgICBwbG90X2NwZGIoY2VsbF90eXBlMSA9ICdDRHxCfE1hY3JvfG1vbm8nLCBjZWxsX3R5cGUyID0gJ0x1bWluYWwnLCBzY2RhdGEgPSBhY2NfY2FuY2VyX2NkNDVfY2FmLAogICAgICAgICAgICAgICAgICAgICAgaWRlbnRzID0gJ2NlbGxfdHlwZScsIG1lYW5zID0gbWVhbnMsIHB2YWxzID0gcHZhbHMsCiAgICAgICAgICAgICAgICAgICAgICBnZW5lLmZhbWlseSA9ICdjb3N0aW11bGF0b3J5JyxyZXR1cm5fdGFibGUgPSBGLG1heF9zaXplID0gMyxwLmFkanVzdC5tZXRob2QgPSAiZmRyIixrZWVwX3NpZ25pZmljYW50X29ubHkgPSBULGNsdXN0ZXJfcm93cyA9IFQpKwogICAgICAgICAgICBnZ3RpdGxlKCJDb3N0aW11bGF0b3J5IEx1bWluYWwiKQogICx0aXRsZSA9ICJMdW1pbmFsIikKCgpwcmludF90YWIocGx0ID0gCiAgICAgICAgICAgIHBsb3RfY3BkYihjZWxsX3R5cGUxID0gJ0NEfEJ8TWFjcm98bW9ubycsIGNlbGxfdHlwZTIgPSAnTXlvJywgc2NkYXRhID0gYWNjX2NhbmNlcl9jZDQ1X2NhZiwKICAgICAgICAgICAgICAgICAgICAgIGlkZW50cyA9ICdjZWxsX3R5cGUnLCBtZWFucyA9IG1lYW5zLCBwdmFscyA9IHB2YWxzLAogICAgICAgICAgICAgICAgICAgICAgZ2VuZS5mYW1pbHkgPSAnY29zdGltdWxhdG9yeScscmV0dXJuX3RhYmxlID0gRixtYXhfc2l6ZSA9IDMscC5hZGp1c3QubWV0aG9kID0gImZkciIsa2VlcF9zaWduaWZpY2FudF9vbmx5ID0gVCxjbHVzdGVyX3Jvd3MgPSBGKSsKICAgICAgICAgICAgZ2d0aXRsZSgiQ29zdGltdWxhdG9yeSBNeW8iKQogICx0aXRsZSA9ICJNeW8iKQoKcHJpbnRfdGFiKHBsdCA9IAogICAgICAgICAgICBwbG90X2NwZGIoY2VsbF90eXBlMSA9ICdDRHxCfE1hY3JvfG1vbm8nLCBjZWxsX3R5cGUyID0gJ0NBRicsIHNjZGF0YSA9IGFjY19jYW5jZXJfY2Q0NV9jYWYsCiAgICAgICAgICAgICAgICAgICAgICBpZGVudHMgPSAnY2VsbF90eXBlJywgbWVhbnMgPSBtZWFucywgcHZhbHMgPSBwdmFscywKICAgICAgICAgICAgICAgICAgICAgIGdlbmUuZmFtaWx5ID0gJ2Nvc3RpbXVsYXRvcnknLHJldHVybl90YWJsZSA9IEYsbWF4X3NpemUgPSAzLHAuYWRqdXN0Lm1ldGhvZCA9ICJmZHIiLGtlZXBfc2lnbmlmaWNhbnRfb25seSA9IFQsY2x1c3Rlcl9yb3dzID0gRikrCiAgICAgICAgICAgIGdndGl0bGUoIkNvc3RpbXVsYXRvcnkgQ0FGIikKICAsdGl0bGUgPSAiQ0FGIikKCnByaW50X3RhYihwbHQgPSAKICAgICAgICAgICAgdW5pcV9pbnRlcmFjdGlvbnMoY2VsbF90eXBlMSA9ICdDRHxCfE1hY3JvfG1vbm8nLGNlbGxfdHlwZTJfYSAgPSAnTHVtaW5hbCBwcmknLGNlbGxfdHlwZTJfYiA9ICJNeW8iLGdlbmUuZmFtaWx5ID0gIkNvc3RpbXVsYXRvcnkiKQosdGl0bGUgPSAidW5pcXVlIGluIGx1bWluYWwgcHJpIikKCgpwcmludF90YWIocGx0ID0gCiAgICAgICAgICAgIHVuaXFfaW50ZXJhY3Rpb25zKGNlbGxfdHlwZTEgPSAnQ0R8QnxNYWNyb3xtb25vJyxjZWxsX3R5cGUyX2EgID0gJ015byBwcmknLGNlbGxfdHlwZTJfYiA9ICJMdW1pbmFsIixnZW5lLmZhbWlseSA9ICJDb3N0aW11bGF0b3J5IikKLHRpdGxlID0gInVuaXF1ZSBpbiBteW8gcHJpIikKCnByaW50X3RhYihwbHQgPSAKICAgICAgICAgICAgdW5pcV9pbnRlcmFjdGlvbnMoY2VsbF90eXBlMSA9ICdDRHxCfE1hY3JvfG1vbm8nLGNlbGxfdHlwZTJfYSAgPSAnTHVtaW5hbCBMTicsY2VsbF90eXBlMl9iID0gIk15byIsZ2VuZS5mYW1pbHkgPSAiQ29zdGltdWxhdG9yeSIpCix0aXRsZSA9ICJ1bmlxdWUgaW4gbHVtaW5hbCBMTiIpCgoKcHJpbnRfdGFiKHBsdCA9IAogICAgICAgICAgICB1bmlxX2ludGVyYWN0aW9ucyhjZWxsX3R5cGUxID0gJ0NEfEJ8TWFjcm98bW9ubycsY2VsbF90eXBlMl9hICA9ICdNeW8gTE4nLGNlbGxfdHlwZTJfYiA9ICJMdW1pbmFsIixnZW5lLmZhbWlseSA9ICJDb3N0aW11bGF0b3J5IikKLHRpdGxlID0gInVuaXF1ZSBpbiBteW8gTE4iKQoKYGBgCgoKIyBDb2luaGliaXRvcnkgaW50ZXJhY3Rpb25zIHsudGFic2V0fQoKYGBge3IgZmlnLmhlaWdodD01LHJlc3VsdHM9J2FzaXMnfQpwcmludF90YWIocGxvdF9jcGRiKGNlbGxfdHlwZTEgPSAnQ0R8QnxNYWNyb3xtb25vJywgY2VsbF90eXBlMiA9ICdMdW1pbmFsJywgc2NkYXRhID0gYWNjX2NhbmNlcl9jZDQ1X2NhZiwKICAgICAgICAgIGlkZW50cyA9ICdjZWxsX3R5cGUnLCBtZWFucyA9IG1lYW5zLCBwdmFscyA9IHB2YWxzLAogICAgICAgICAgZ2VuZS5mYW1pbHkgPSAnY29pbmhpYml0b3J5JyxyZXR1cm5fdGFibGUgPSBGLG1heF9zaXplID0gNCxwLmFkanVzdC5tZXRob2QgPSAiZmRyIixrZWVwX3NpZ25pZmljYW50X29ubHkgPSBGLGNsdXN0ZXJfcm93cyA9IEYpKwogIGdndGl0bGUoImNvaW5oaWJpdG9yeSBMdW1pbmFsIiksdGl0bGUgPSAiTHVtaW5hbCIpCgpwcmludF90YWIocGxvdF9jcGRiKGNlbGxfdHlwZTEgPSAnQ0R8QnxNYWNyb3xtb25vJywgY2VsbF90eXBlMiA9ICdNeW8nLCBzY2RhdGEgPSBhY2NfY2FuY2VyX2NkNDVfY2FmLAogICAgICAgICAgaWRlbnRzID0gJ2NlbGxfdHlwZScsIG1lYW5zID0gbWVhbnMsIHB2YWxzID0gcHZhbHMsCiAgICAgICAgICBnZW5lLmZhbWlseSA9ICdjb2luaGliaXRvcnknLHJldHVybl90YWJsZSA9IEYsbWF4X3NpemUgPSA0LHAuYWRqdXN0Lm1ldGhvZCA9ICJmZHIiLGtlZXBfc2lnbmlmaWNhbnRfb25seSA9IEYsY2x1c3Rlcl9yb3dzID0gRikrCiAgZ2d0aXRsZSgiY29pbmhpYml0b3J5IE15byIpLHRpdGxlID0gIk15byIpCgpwcmludF90YWIocGx0ID0gCiAgICAgICAgICAgIHVuaXFfaW50ZXJhY3Rpb25zKGNlbGxfdHlwZTEgPSAnQ0R8QnxNYWNyb3xtb25vJyxjZWxsX3R5cGUyX2EgID0gJ0x1bWluYWwgTE4nLGNlbGxfdHlwZTJfYiA9ICJNeW8gTE4iLGdlbmUuZmFtaWx5ID0gImNvaW5oaWJpdG9yeSIpCix0aXRsZSA9ICJ1bmlxdWUgaW4gbHVtaW5hbCBMTiIpCgoKcHJpbnRfdGFiKHBsdCA9IAogICAgICAgICAgICB1bmlxX2ludGVyYWN0aW9ucyhjZWxsX3R5cGUxID0gJ0NEfEJ8TWFjcm98bW9ubycsY2VsbF90eXBlMl9hICA9ICdNeW8gTE4nLGNlbGxfdHlwZTJfYiA9ICJMdW1pbmFsIExOIixnZW5lLmZhbWlseSA9ICJjb2luaGliaXRvcnkiKQosdGl0bGUgPSAidW5pcXVlIGluIG15byBMTiIpCgoKcHJpbnRfdGFiKHBsdCA9IAogICAgICAgICAgICB1bmlxX2ludGVyYWN0aW9ucyhjZWxsX3R5cGUxID0gJ0NEfEJ8TWFjcm98bW9ubycsY2VsbF90eXBlMl9hICA9ICdMdW1pbmFsIHByaScsY2VsbF90eXBlMl9iID0gIk15byBwcmkiLGdlbmUuZmFtaWx5ID0gImNvaW5oaWJpdG9yeSIpCix0aXRsZSA9ICJ1bmlxdWUgaW4gbHVtaW5hbCBwcmkiKQoKcHJpbnRfdGFiKHBsdCA9IAogICAgICAgICAgICB1bmlxX2ludGVyYWN0aW9ucyhjZWxsX3R5cGUxID0gJ0NEfEJ8TWFjcm98bW9ubycsY2VsbF90eXBlMl9hICA9ICdNeW8gcHJpJyxjZWxsX3R5cGUyX2IgPSAiTHVtaW5hbCBwcmkiLGdlbmUuZmFtaWx5ID0gImNvaW5oaWJpdG9yeSIpCix0aXRsZSA9ICJ1bmlxdWUgaW4gbXlvIHByaSIpCmBgYAoKIyBDaGVtb2tpbmVzIGludGVyYWN0aW9ucyB7LnRhYnNldH0KYGBge3IgZmlnLmhlaWdodD02LCByZXN1bHRzPSdhc2lzJ30KcHJpbnRfdGFiKAogIHBsb3RfY3BkYihjZWxsX3R5cGUxID0gJ0NEfEJ8TWFjcm98bW9ubycsIGNlbGxfdHlwZTIgPSAnTHVtaW5hbCcsIHNjZGF0YSA9IGFjY19jYW5jZXJfY2Q0NV9jYWYsCiAgICAgICAgICBpZGVudHMgPSAnY2VsbF90eXBlJywgbWVhbnMgPSBtZWFucywgcHZhbHMgPSBwdmFscywKICAgICAgICAgIGdlbmUuZmFtaWx5ID0gJ2NoZW1va2luZXMnLHJldHVybl90YWJsZSA9IEYsbWF4X3NpemUgPSA0LHAuYWRqdXN0Lm1ldGhvZCA9ICJmZHIiLGtlZXBfc2lnbmlmaWNhbnRfb25seSA9IEYsY2x1c3Rlcl9yb3dzID0gRikrCiAgZ2d0aXRsZSgiY2hlbW9raW5lcyBMdW1pbmFsIiksdGl0bGUgPSAiTHVtaW5hbCIpCgpwcmludF90YWIoCiAgcGxvdF9jcGRiKGNlbGxfdHlwZTEgPSAnQ0R8QnxNYWNyb3xtb25vJywgY2VsbF90eXBlMiA9ICdNeW8nLCBzY2RhdGEgPSBhY2NfY2FuY2VyX2NkNDVfY2FmLAogICAgICAgICAgaWRlbnRzID0gJ2NlbGxfdHlwZScsIG1lYW5zID0gbWVhbnMsIHB2YWxzID0gcHZhbHMsCiAgICAgICAgICBnZW5lLmZhbWlseSA9ICdjaGVtb2tpbmVzJyxyZXR1cm5fdGFibGUgPSBGLG1heF9zaXplID0gNCxwLmFkanVzdC5tZXRob2QgPSAiZmRyIixrZWVwX3NpZ25pZmljYW50X29ubHkgPSBGLGNsdXN0ZXJfcm93cyA9IEYpKwogIGdndGl0bGUoImNoZW1va2luZXMgTXlvIiksdGl0bGUgPSAiTXlvIikKCgpwcmludF90YWIocGx0ID0gCiAgICAgICAgICAgIHVuaXFfaW50ZXJhY3Rpb25zKGNlbGxfdHlwZTEgPSAnQ0R8QnxNYWNyb3xtb25vJyxjZWxsX3R5cGUyX2EgID0gJ0x1bWluYWwgTE4nLGNlbGxfdHlwZTJfYiA9ICJNeW8gTE4iLGdlbmUuZmFtaWx5ID0gImNoZW1va2luZXMiKQosdGl0bGUgPSAidW5pcXVlIGluIGx1bWluYWwgTE4iKQoKCnByaW50X3RhYihwbHQgPSAKICAgICAgICAgICAgdW5pcV9pbnRlcmFjdGlvbnMoY2VsbF90eXBlMSA9ICdDRHxCfE1hY3JvfG1vbm8nLGNlbGxfdHlwZTJfYSAgPSAnTXlvIExOJyxjZWxsX3R5cGUyX2IgPSAiTHVtaW5hbCBMTiIsZ2VuZS5mYW1pbHkgPSAiY2hlbW9raW5lcyIpCix0aXRsZSA9ICJ1bmlxdWUgaW4gbXlvIExOIikKCgpwcmludF90YWIocGx0ID0gCiAgICAgICAgICAgIHVuaXFfaW50ZXJhY3Rpb25zKGNlbGxfdHlwZTEgPSAnQ0R8QnxNYWNyb3xtb25vJyxjZWxsX3R5cGUyX2EgID0gJ0x1bWluYWwgcHJpJyxjZWxsX3R5cGUyX2IgPSAiTXlvIHByaSIsZ2VuZS5mYW1pbHkgPSAiY2hlbW9raW5lcyIpCix0aXRsZSA9ICJ1bmlxdWUgaW4gbHVtaW5hbCBwcmkiKQoKcHJpbnRfdGFiKHBsdCA9IAogICAgICAgICAgICB1bmlxX2ludGVyYWN0aW9ucyhjZWxsX3R5cGUxID0gJ0NEfEJ8TWFjcm98bW9ubycsY2VsbF90eXBlMl9hICA9ICdNeW8gcHJpJyxjZWxsX3R5cGUyX2IgPSAiTHVtaW5hbCBwcmkiLGdlbmUuZmFtaWx5ID0gImNoZW1va2luZXMiKQosdGl0bGUgPSAidW5pcXVlIGluIG15byBwcmkiKQpgYGAKIyBDaGVtb2tpbmUgbGlnYW5kcyB7LnRhYnNldH0KYGBge3IgcmVzdWx0cz0nYXNpcyd9CmdlbmVzID0gYygiQ1hDTDFcXEQiLCAiQ1hDTDJcXEQiLCJDWENMM1xcRCIsIkNYQ0wxNyIsIkMzIiwiQ1hDTDE0IikKcHJpbnRfdGFiKHBsb3RfY3BkYihjZWxsX3R5cGUxID0gJ0NEfEJ8TWFjcm98bW9ubycsIGNlbGxfdHlwZTIgPSAnTXlvJywgc2NkYXRhID0gYWNjX2NhbmNlcl9jZDQ1X2NhZiwKICAgIGlkZW50cyA9ICdjZWxsX3R5cGUnLCBtZWFucyA9IG1lYW5zLCBwdmFscyA9IHB2YWxzLAogZ2VuZXMgPSBnZW5lcyxyZXR1cm5fdGFibGUgPSBGLG1heF9zaXplID0gNCxwLmFkanVzdC5tZXRob2QgPSAiZmRyIiAsa2VlcF9zaWduaWZpY2FudF9vbmx5ID0gRikgCiAsdGl0bGUgPSAiTXlvIikKCnByaW50X3RhYihwbG90X2NwZGIoY2VsbF90eXBlMSA9ICdDRHxCfE1hY3JvfG1vbm8nLCBjZWxsX3R5cGUyID0gJ0x1bWluYWwnLCBzY2RhdGEgPSBhY2NfY2FuY2VyX2NkNDVfY2FmLAogICAgaWRlbnRzID0gJ2NlbGxfdHlwZScsIG1lYW5zID0gbWVhbnMsIHB2YWxzID0gcHZhbHMsCiAgZ2VuZXMgPSBnZW5lcyxyZXR1cm5fdGFibGUgPSBGLG1heF9zaXplID0gNCxwLmFkanVzdC5tZXRob2QgPSAiZmRyIiAsa2VlcF9zaWduaWZpY2FudF9vbmx5ID0gRikgCix0aXRsZSA9ICJMdW1pbmFsIikKCgpwcmludF90YWIocGx0ID0gCiAgICAgICAgICAgIHVuaXFfaW50ZXJhY3Rpb25zKGNlbGxfdHlwZTEgPSAnQ0R8QnxNYWNyb3xtb25vJyxjZWxsX3R5cGUyX2EgID0gJ0x1bWluYWwgTE4nLGNlbGxfdHlwZTJfYiA9ICJNeW8gTE4iLGdlbmVzID0gZ2VuZXMpCix0aXRsZSA9ICJ1bmlxdWUgaW4gbHVtaW5hbCBMTiIpCgoKcHJpbnRfdGFiKHBsdCA9IAogICAgICAgICAgICB1bmlxX2ludGVyYWN0aW9ucyhjZWxsX3R5cGUxID0gJ0NEfEJ8TWFjcm98bW9ubycsY2VsbF90eXBlMl9hICA9ICdNeW8gTE4nLGNlbGxfdHlwZTJfYiA9ICJMdW1pbmFsIExOIixnZW5lcyA9IGdlbmVzKQosdGl0bGUgPSAidW5pcXVlIGluIG15byBMTiIpCgoKcHJpbnRfdGFiKHBsdCA9IAogICAgICAgICAgICB1bmlxX2ludGVyYWN0aW9ucyhjZWxsX3R5cGUxID0gJ0NEfEJ8TWFjcm98bW9ubycsY2VsbF90eXBlMl9hICA9ICdMdW1pbmFsIHByaScsY2VsbF90eXBlMl9iID0gIk15byBwcmkiLGdlbmVzID0gZ2VuZXMpCix0aXRsZSA9ICJ1bmlxdWUgaW4gbHVtaW5hbCBwcmkiKQoKcHJpbnRfdGFiKHBsdCA9IAogICAgICAgICAgICB1bmlxX2ludGVyYWN0aW9ucyhjZWxsX3R5cGUxID0gJ0NEfEJ8TWFjcm98bW9ubycsY2VsbF90eXBlMl9hICA9ICdNeW8gcHJpJyxjZWxsX3R5cGUyX2IgPSAiTHVtaW5hbCBwcmkiLGdlbmVzID0gZ2VuZXMpCix0aXRsZSA9ICJ1bmlxdWUgaW4gbXlvIHByaSIpCmBgYAojIENDTDIyIGFuZCBDQ0wyOCB7LnRhYnNldH0KYGBge3IgcmVzdWx0cz0nYXNpcyd9CnByaW50X3RhYihwbG90X2NwZGIoY2VsbF90eXBlMSA9ICdDRHxCfE1hY3JvfG1vbm8nLCBjZWxsX3R5cGUyID0gJ015bycsIHNjZGF0YSA9IGFjY19jYW5jZXJfY2Q0NV9jYWYsCiAgICBpZGVudHMgPSAnY2VsbF90eXBlJywgbWVhbnMgPSBtZWFucywgcHZhbHMgPSBwdmFscywKIGdlbmVzID0gYygiQ0NMMjIiLCAiQ0NMMjgiICkscmV0dXJuX3RhYmxlID0gRixtYXhfc2l6ZSA9IDQscC5hZGp1c3QubWV0aG9kID0gImZkciIgLGtlZXBfc2lnbmlmaWNhbnRfb25seSA9IEYpLHRpdGxlID0gIk15byIpCgpwcmludF90YWIocGxvdF9jcGRiKGNlbGxfdHlwZTEgPSAnQ0R8QnxNYWNyb3xtb25vJywgY2VsbF90eXBlMiA9ICdMdW1pbmFsJywgc2NkYXRhID0gYWNjX2NhbmNlcl9jZDQ1X2NhZiwKICAgIGlkZW50cyA9ICdjZWxsX3R5cGUnLCBtZWFucyA9IG1lYW5zLCBwdmFscyA9IHB2YWxzLAogIGdlbmVzID0gYygiQ0NMMjIiLCAiQ0NMMjgiICkscmV0dXJuX3RhYmxlID0gRixtYXhfc2l6ZSA9IDYscC5hZGp1c3QubWV0aG9kID0gImZkciIgLGtlZXBfc2lnbmlmaWNhbnRfb25seSA9IEYpLHRpdGxlID0gIkx1bWluYWwiKQoKCgpgYGAKCiMgTm90Y2ggc2lnbmFsaW5nIGludGVyYWN0aW9ucyB3aXRoIGltbXVuZQpgYGB7ciBmaWcuaGVpZ2h0PTZ9CnBsb3RfY3BkYihjZWxsX3R5cGUxID0gJ0NEfEJ8TWFjcm98bW9ubycsIGNlbGxfdHlwZTIgPSAnTXlvJywgc2NkYXRhID0gYWNjX2NhbmNlcl9jZDQ1X2NhZiwKICAgIGlkZW50cyA9ICdjZWxsX3R5cGUnLCBtZWFucyA9IG1lYW5zLCBwdmFscyA9IHB2YWxzLAogZ2VuZXMgPWMoIkpBRyIsICJNWUIiICwgIk5PVENIIiwiSEVTMSIsIkhFWSIpLHJldHVybl90YWJsZSA9IEYsbWF4X3NpemUgPSA0LHAuYWRqdXN0Lm1ldGhvZCA9ICJmZHIiICxrZWVwX3NpZ25pZmljYW50X29ubHkgPSBGKSAKCnBsb3RfY3BkYihjZWxsX3R5cGUxID0gJ0NEfEJ8TWFjcm98bW9ubycsIGNlbGxfdHlwZTIgPSAnTHVtaW5hbCcsIHNjZGF0YSA9IGFjY19jYW5jZXJfY2Q0NV9jYWYsCiAgICBpZGVudHMgPSAnY2VsbF90eXBlJywgbWVhbnMgPSBtZWFucywgcHZhbHMgPSBwdmFscywKICBnZW5lcyA9IGMoIkpBRyIsICJNWUIiICwgIk5PVENIIiwiSEVTMSIsIkhFWSIpLHJldHVybl90YWJsZSA9IEYsbWF4X3NpemUgPSA0LHAuYWRqdXN0Lm1ldGhvZCA9ICJmZHIiICxrZWVwX3NpZ25pZmljYW50X29ubHkgPSBGKSAKYGBgCgojIE5vdGNoIHNpZ25hbGluZyBpbnRlcmFjdGlvbnMgd2l0aCBDQUYKCmBgYHtyIGZpZy5oZWlnaHQ9Nn0KcGxvdF9jcGRiKGNlbGxfdHlwZTEgPSAnQ0FGJywgY2VsbF90eXBlMiA9ICdNeW8nLCBzY2RhdGEgPSBhY2NfY2FuY2VyX2NkNDVfY2FmLAogICAgaWRlbnRzID0gJ2NlbGxfdHlwZScsIG1lYW5zID0gbWVhbnMsIHB2YWxzID0gcHZhbHMsCiBnZW5lcyA9IGMoIkpBRyIsICJNWUIiICkscmV0dXJuX3RhYmxlID0gRixtYXhfc2l6ZSA9IDQscC5hZGp1c3QubWV0aG9kID0gImZkciIgLGtlZXBfc2lnbmlmaWNhbnRfb25seSA9IEYpIAoKcGxvdF9jcGRiKGNlbGxfdHlwZTEgPSAnQ0FGJywgY2VsbF90eXBlMiA9ICdMdW1pbmFsJywgc2NkYXRhID0gYWNjX2NhbmNlcl9jZDQ1X2NhZiwKICAgIGlkZW50cyA9ICdjZWxsX3R5cGUnLCBtZWFucyA9IG1lYW5zLCBwdmFscyA9IHB2YWxzLAogIGdlbmVzID0gYygiSkFHIiwgIk1ZQiIgLCAiTk9UQ0giLCJIRVMxIiwiSEVZIikscmV0dXJuX3RhYmxlID0gRixtYXhfc2l6ZSA9IDQscC5hZGp1c3QubWV0aG9kID0gImZkciIgLGtlZXBfc2lnbmlmaWNhbnRfb25seSA9IEYpIApgYGAKCjxzY3JpcHQgc3JjPSJodHRwczovL2h5cG90aGVzLmlzL2VtYmVkLmpzIiBhc3luYz48L3NjcmlwdD4KCg==