0.1 Parameters

suffix = ""

0.2 functions

0.3 Data

xeno = readRDS("./Data/10x_xeno_1000.Rds")
lung = readRDS("./Data/lung_cancercells_withTP_onlyPatients.rds")
lung_patients = lung$patient.ident %>% unique() %>% as.character()
lung_patients_filtered = lung_patients[!(lung_patients %in% c("X1055new","X1099"))] # remove patients with less than 100 malignant cells
lung = subset(x = lung,subset = patient.ident %in% lung_patients_filtered)

1 HIF1 targets

#from:
# https://pubmed.ncbi.nlm.nih.gov/36384128/

hif_targets = "LDHA
PPFIA4
PFKFB4
AK4
ERO1A
BNIP3L
BNIP3
PFKL
ENO1
MIR210HG
TPI1
HILPDA
PGK1
INSIG2
AK4P1
AC114803.1
ENO2
FUT11
EGLN3
NDRG1
BNIP3P1
WDR54
OVOL1-AS1
STC2
DDX41
C4orf47
GYS1
ANKRD37
BICDL2
P4HA1
PDK1
OSMR
PKM
LDHAP5
AL158201.1
PFKP
MIR210
NLRP3P1
GSX1
AL109946.1
PGAM1
SLC16A3
ISM2
TCAF2
ARID3A
KDM3A
JMJD6
C4orf3
" 


hif_targets = strsplit(hif_targets,"\n")[[1]]
hif_targets
 [1] "LDHA"       "PPFIA4"     "PFKFB4"     "AK4"        "ERO1A"      "BNIP3L"     "BNIP3"      "PFKL"       "ENO1"      
[10] "MIR210HG"   "TPI1"       "HILPDA"     "PGK1"       "INSIG2"     "AK4P1"      "AC114803.1" "ENO2"       "FUT11"     
[19] "EGLN3"      "NDRG1"      "BNIP3P1"    "WDR54"      "OVOL1-AS1"  "STC2"       "DDX41"      "C4orf47"    "GYS1"      
[28] "ANKRD37"    "BICDL2"     "P4HA1"      "PDK1"       "OSMR"       "PKM"        "LDHAP5"     "AL158201.1" "PFKP"      
[37] "MIR210"     "NLRP3P1"    "GSX1"       "AL109946.1" "PGAM1"      "SLC16A3"    "ISM2"       "TCAF2"      "ARID3A"    
[46] "KDM3A"      "JMJD6"      "C4orf3"    

2 Xeno

hif_targets_exp = FetchData(object = xeno,vars = c(hif_targets))

Warning in FetchData.Seurat(object = xeno, vars = c(hif_targets)) : The following requested variables were not found: AK4P1, BNIP3P1, LDHAP5, AL158201.1, MIR210, NLRP3P1, AL109946.1

hif_targets_exp = hif_targets_exp[,colSums(hif_targets_exp[])>0] #remove no expression genes
hif_cor = cor(hif_targets_exp)
pht1 = pheatmap(mat = hif_cor,silent = T)
num_of_clusters = 3
clustering_distance = "euclidean"
myannotation = as.data.frame(cutree(pht1[["tree_row"]], k = num_of_clusters)) #split into k clusters
 
names(myannotation)[1] = "cluster"
  myannotation$cluster = as.factor(myannotation$cluster)
  
  palette1 <-brewer.pal(num_of_clusters, "Paired")

  names(palette1) = unique(myannotation$cluster)
  ann_colors = list (cluster = palette1)
  annotation = list(ann_colors = ann_colors, myannotation = myannotation)
  
  colors <- c(seq(-1,1,by=0.01))
  my_palette <- c("blue",colorRampPalette(colors = c("blue", "white", "red"))
                                                   (n = length(colors)-3), "red")


  print_tab(plt = 
                pheatmap(mat = hif_cor,annotation_col =  annotation[["myannotation"]], annotation_colors = annotation[["ann_colors"]], clustering_distance_rows = clustering_distance,clustering_distance_cols = clustering_distance,color = my_palette,breaks = colors,show_rownames = T,show_colnames = F,fontsize_row = 9)
            ,title = "genes expression heatmap")

genes expression heatmap

NA

cluster_3_genes = annotation[["myannotation"]] %>% dplyr::filter(cluster == 3) %>% rownames() #take relevant genes
hif_targets_by_tp = FetchData(object = xeno,vars = c(cluster_3_genes)) %>% rowSums() %>% as.data.frame() #mean expression
names(hif_targets_by_tp)[1] = "hif1_targets_mean"

hif_targets_by_tp = cbind(hif_targets_by_tp,FetchData(object = xeno,vars = c("orig.ident","treatment"))) # add vars

hif_targets_by_tp_forPlot =  hif_targets_by_tp %>% mutate(orig.ident = paste("model",orig.ident)) #add "model" before model num
my_comparisons = list( c("NT", "OSI") )
plt = ggplot(hif_targets_by_tp_forPlot, aes(x=treatment, y=hif1_targets_mean)) +
  geom_boxplot() +
  scale_y_continuous(limits = c(0, 37))+ #scale axis 
  facet_wrap(~orig.ident, nrow = 2, strip.position = "top")+
  stat_compare_means(comparisons = my_comparisons,method = "wilcox.test") + # Add pairwise comparisons p-value
ylab("HIF target genes")
xeno_cluster_3 = cluster_3_genes
print_tab(plt = plt,title = "cluster 3 genes")

cluster 3 genes

NA

cluster_3_genes = annotation[["myannotation"]] %>% dplyr::filter(cluster == 3 | cluster == 2) %>% rownames() #take relevant genes
hif_targets_by_tp = FetchData(object = xeno,vars = c(cluster_3_genes)) %>% rowSums() %>% as.data.frame() #mean expression
names(hif_targets_by_tp)[1] = "hif1_targets_mean"

hif_targets_by_tp = cbind(hif_targets_by_tp,FetchData(object = xeno,vars = c("orig.ident","treatment"))) # add vars

hif_targets_by_tp_forPlot =  hif_targets_by_tp %>% mutate(orig.ident = paste("model",orig.ident)) #add "model" before model num
my_comparisons = list( c("NT", "OSI") )
plt = ggplot(hif_targets_by_tp_forPlot, aes(x=treatment, y=hif1_targets_mean)) +
  geom_boxplot() +
  scale_y_continuous(limits = c(0, 50))+ #scale axis 
  facet_wrap(~orig.ident, nrow = 2, strip.position = "top")+
  stat_compare_means(comparisons = my_comparisons,method = "wilcox.test")+ # Add pairwise comparisons p-value
ylab("HIF target genes")
xeno_cluster_3_2 = cluster_3_genes

print_tab(plt = plt,title = "cluster 3+2 genes")

cluster 3+2 genes

NA

3 Patients

hif_targets_exp = FetchData(object = lung,vars = c(hif_targets))
Warning in FetchData.Seurat(object = lung, vars = c(hif_targets)) :
  The following requested variables were not found: AC114803.1, BNIP3P1, OVOL1-AS1, BICDL2, LDHAP5, AL158201.1, NLRP3P1, GSX1, AL109946.1
hif_targets_exp = hif_targets_exp[,colSums(hif_targets_exp[])>0] #remove no expression genes
hif_cor = cor(hif_targets_exp)
pht1 = pheatmap(mat = hif_cor,silent = T)
num_of_clusters = 4
clustering_distance = "euclidean"
myannotation = as.data.frame(cutree(pht1[["tree_row"]], k = num_of_clusters)) #split into k clusters
 
names(myannotation)[1] = "cluster"
  myannotation$cluster = as.factor(myannotation$cluster)
  
  palette1 <-brewer.pal(num_of_clusters, "Paired")

  names(palette1) = unique(myannotation$cluster)
  ann_colors = list (cluster = palette1)
  annotation = list(ann_colors = ann_colors, myannotation = myannotation)
  
  colors <- c(seq(-1,1,by=0.01))
  my_palette <- c("blue",colorRampPalette(colors = c("blue", "white", "red"))
                                                   (n = length(colors)-3), "red")


  print_tab(plt = 
                pheatmap(mat = hif_cor,annotation_col =  annotation[["myannotation"]], annotation_colors = annotation[["ann_colors"]], clustering_distance_rows = clustering_distance,clustering_distance_cols = clustering_distance,color = my_palette,breaks = colors,show_rownames = T,show_colnames = F,fontsize_row = 9)
            ,title = "genes expression heatmap")

genes expression heatmap

NA

cluster_3_genes = annotation[["myannotation"]] %>% dplyr::filter(cluster == 1) %>% rownames() #take relevant genes
hif_targets_by_tp = FetchData(object = lung,vars = c(cluster_3_genes)) %>% rowSums() %>% as.data.frame() #mean expression
names(hif_targets_by_tp)[1] = "hif1_targets_mean"

hif_targets_by_tp = cbind(hif_targets_by_tp,FetchData(object = lung,vars = c("patient.ident","time.point"))) # add vars

hif_targets_by_tp_forPlot =  hif_targets_by_tp %>% mutate(patient.ident = paste("patient ",patient.ident)) #add "model" before model num
my_comparisons = list( c("pre-treatment", "on-treatment") )
plt = ggplot(hif_targets_by_tp_forPlot, aes(x=time.point, y=hif1_targets_mean)) +
  geom_boxplot() +
  scale_y_continuous(limits = c(0, max(hif_targets_by_tp_forPlot$hif1_targets_mean)*1.1))+ #scale axis
  facet_wrap(~patient.ident, nrow = 2, strip.position = "top")+
  stat_compare_means(comparisons = my_comparisons,method = "wilcox.test") + # Add pairwise comparisons p-value
ylab("HIF target genes")

print_tab(plt = plt,title = "cluster 1 genes")

cluster 1 genes

NA

cluster_3_genes = annotation[["myannotation"]] %>% dplyr::filter(cluster == 1 | cluster == 4) %>% rownames() #take relevant genes
hif_targets_by_tp = FetchData(object = lung,vars = c(cluster_3_genes)) %>% rowSums() %>% as.data.frame() #mean expression
names(hif_targets_by_tp)[1] = "hif1_targets_mean"

hif_targets_by_tp = cbind(hif_targets_by_tp,FetchData(object = lung,vars = c("patient.ident","time.point"))) # add vars

hif_targets_by_tp_forPlot =  hif_targets_by_tp %>% mutate(patient.ident = paste("patient ",patient.ident)) #add "model" before model num
my_comparisons = list( c("pre-treatment", "on-treatment") )
plt = ggplot(hif_targets_by_tp_forPlot, aes(x=time.point, y=hif1_targets_mean)) +
  geom_boxplot() +
  scale_y_continuous(limits = c(0, max(hif_targets_by_tp_forPlot$hif1_targets_mean)*1.1))+ #extend y axis for pval
  facet_wrap(~patient.ident, nrow = 2, strip.position = "top")+
  stat_compare_means(comparisons = my_comparisons,method = "wilcox.test") + # Add pairwise comparisons p-value
ylab("HIF target genes")

print_tab(plt = plt,title = "cluster 1+4 genes")

cluster 1+4 genes

NA

cluster_3_genes =xeno_cluster_3
hif_targets_by_tp = FetchData(object = lung,vars = c(cluster_3_genes)) %>% rowSums() %>% as.data.frame() #mean expression
names(hif_targets_by_tp)[1] = "hif1_targets_mean"

hif_targets_by_tp = cbind(hif_targets_by_tp,FetchData(object = lung,vars = c("patient.ident","time.point"))) # add vars

hif_targets_by_tp_forPlot =  hif_targets_by_tp %>% mutate(patient.ident = paste("patient ",patient.ident)) #add "model" before model num
my_comparisons = list( c("pre-treatment", "on-treatment") )
plt = ggplot(hif_targets_by_tp_forPlot, aes(x=time.point, y=hif1_targets_mean)) +
  geom_boxplot() +
  scale_y_continuous(limits = c(0, max(hif_targets_by_tp_forPlot$hif1_targets_mean)*1.1))+ #extend y axis for pval
  facet_wrap(~patient.ident, nrow = 2, strip.position = "top")+
  stat_compare_means(comparisons = my_comparisons,method = "wilcox.test") + # Add pairwise comparisons p-value
ylab("HIF target genes")

print_tab(plt = plt,title = "models cluster 3")

models cluster 3

NA

cluster_3_genes =xeno_cluster_3_2
hif_targets_by_tp = FetchData(object = lung,vars = c(cluster_3_genes)) %>% rowSums() %>% as.data.frame() #mean expression

Warning in FetchData.Seurat(object = lung, vars = c(cluster_3_genes)) : The following requested variables were not found: AC114803.1, OVOL1-AS1, BICDL2

names(hif_targets_by_tp)[1] = "hif1_targets_mean"

hif_targets_by_tp = cbind(hif_targets_by_tp,FetchData(object = lung,vars = c("patient.ident","time.point"))) # add vars

hif_targets_by_tp_forPlot =  hif_targets_by_tp %>% mutate(patient.ident = paste("patient ",patient.ident)) #add "model" before model num
my_comparisons = list( c("pre-treatment", "on-treatment") )
plt = ggplot(hif_targets_by_tp_forPlot, aes(x=time.point, y=hif1_targets_mean)) +
  geom_boxplot() +
  scale_y_continuous(limits = c(0, max(hif_targets_by_tp_forPlot$hif1_targets_mean)*1.1))+ #extend y axis for pval
  facet_wrap(~patient.ident, nrow = 2, strip.position = "top")+
  stat_compare_means(comparisons = my_comparisons,method = "wilcox.test") + # Add pairwise comparisons p-value
ylab("HIF target genes")

print_tab(plt = plt,title = "models cluster 3+2")

models cluster 3+2

NA

LS0tCnRpdGxlOiAnYHIgcnN0dWRpb2FwaTo6Z2V0U291cmNlRWRpdG9yQ29udGV4dCgpJHBhdGggJT4lIGJhc2VuYW1lKCkgJT4lIGdzdWIocGF0dGVybiA9ICJcXC5SbWQiLHJlcGxhY2VtZW50ID0gIiIpYCcgCmF1dGhvcjogIkF2aXNoYWkgV2l6ZWwiCmRhdGU6ICdgciBTeXMudGltZSgpYCcKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICB0b2M6IHllcwogICAgdG9jX2NvbGxhcHNlOiB5ZXMKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiBGQUxTRQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICB0b2NfZGVwdGg6IDEKLS0tCgojIyBQYXJhbWV0ZXJzCgpgYGB7ciB3YXJuaW5nPUZBTFNFfQpzdWZmaXggPSAiIgpgYGAKCgojIyBmdW5jdGlvbnMKCmBgYHtyIHdhcm5pbmc9RkFMU0V9CmBgYAoKIyMgRGF0YQoKYGBge3J9Cnhlbm8gPSByZWFkUkRTKCIuL0RhdGEvMTB4X3hlbm9fMTAwMC5SZHMiKQpsdW5nID0gcmVhZFJEUygiLi9EYXRhL2x1bmdfY2FuY2VyY2VsbHNfd2l0aFRQX29ubHlQYXRpZW50cy5yZHMiKQpsdW5nX3BhdGllbnRzID0gbHVuZyRwYXRpZW50LmlkZW50ICU+JSB1bmlxdWUoKSAlPiUgYXMuY2hhcmFjdGVyKCkKbHVuZ19wYXRpZW50c19maWx0ZXJlZCA9IGx1bmdfcGF0aWVudHNbIShsdW5nX3BhdGllbnRzICVpbiUgYygiWDEwNTVuZXciLCJYMTA5OSIpKV0gIyByZW1vdmUgcGF0aWVudHMgd2l0aCBsZXNzIHRoYW4gMTAwIG1hbGlnbmFudCBjZWxscwpsdW5nID0gc3Vic2V0KHggPSBsdW5nLHN1YnNldCA9IHBhdGllbnQuaWRlbnQgJWluJSBsdW5nX3BhdGllbnRzX2ZpbHRlcmVkKQpgYGAKCgojIEhJRjEgdGFyZ2V0cwpgYGB7cn0KI2Zyb206CiMgaHR0cHM6Ly9wdWJtZWQubmNiaS5ubG0ubmloLmdvdi8zNjM4NDEyOC8KCmhpZl90YXJnZXRzID0gIkxESEEKUFBGSUE0ClBGS0ZCNApBSzQKRVJPMUEKQk5JUDNMCkJOSVAzClBGS0wKRU5PMQpNSVIyMTBIRwpUUEkxCkhJTFBEQQpQR0sxCklOU0lHMgpBSzRQMQpBQzExNDgwMy4xCkVOTzIKRlVUMTEKRUdMTjMKTkRSRzEKQk5JUDNQMQpXRFI1NApPVk9MMS1BUzEKU1RDMgpERFg0MQpDNG9yZjQ3CkdZUzEKQU5LUkQzNwpCSUNETDIKUDRIQTEKUERLMQpPU01SClBLTQpMREhBUDUKQUwxNTgyMDEuMQpQRktQCk1JUjIxMApOTFJQM1AxCkdTWDEKQUwxMDk5NDYuMQpQR0FNMQpTTEMxNkEzCklTTTIKVENBRjIKQVJJRDNBCktETTNBCkpNSkQ2CkM0b3JmMwoiIAoKCmhpZl90YXJnZXRzID0gc3Ryc3BsaXQoaGlmX3RhcmdldHMsIlxuIilbWzFdXQpoaWZfdGFyZ2V0cwpgYGAKCiMgWGVubyB7LnRhYnNldH0KYGBge3IgcmVzdWx0cz0nYXNpcyd9CmhpZl90YXJnZXRzX2V4cCA9IEZldGNoRGF0YShvYmplY3QgPSB4ZW5vLHZhcnMgPSBjKGhpZl90YXJnZXRzKSkKaGlmX3RhcmdldHNfZXhwID0gaGlmX3RhcmdldHNfZXhwWyxjb2xTdW1zKGhpZl90YXJnZXRzX2V4cFtdKT4wXSAjcmVtb3ZlIG5vIGV4cHJlc3Npb24gZ2VuZXMKaGlmX2NvciA9IGNvcihoaWZfdGFyZ2V0c19leHApCnBodDEgPSBwaGVhdG1hcChtYXQgPSBoaWZfY29yLHNpbGVudCA9IFQpCmBgYAoKYGBge3IgZWNobz1UUlVFLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMiwgcmVzdWx0cz0nYXNpcyd9Cm51bV9vZl9jbHVzdGVycyA9IDMKY2x1c3RlcmluZ19kaXN0YW5jZSA9ICJldWNsaWRlYW4iCm15YW5ub3RhdGlvbiA9IGFzLmRhdGEuZnJhbWUoY3V0cmVlKHBodDFbWyJ0cmVlX3JvdyJdXSwgayA9IG51bV9vZl9jbHVzdGVycykpICNzcGxpdCBpbnRvIGsgY2x1c3RlcnMKIApuYW1lcyhteWFubm90YXRpb24pWzFdID0gImNsdXN0ZXIiCiAgbXlhbm5vdGF0aW9uJGNsdXN0ZXIgPSBhcy5mYWN0b3IobXlhbm5vdGF0aW9uJGNsdXN0ZXIpCiAgCiAgcGFsZXR0ZTEgPC1icmV3ZXIucGFsKG51bV9vZl9jbHVzdGVycywgIlBhaXJlZCIpCgogIG5hbWVzKHBhbGV0dGUxKSA9IHVuaXF1ZShteWFubm90YXRpb24kY2x1c3RlcikKICBhbm5fY29sb3JzID0gbGlzdCAoY2x1c3RlciA9IHBhbGV0dGUxKQogIGFubm90YXRpb24gPSBsaXN0KGFubl9jb2xvcnMgPSBhbm5fY29sb3JzLCBteWFubm90YXRpb24gPSBteWFubm90YXRpb24pCiAgCiAgY29sb3JzIDwtIGMoc2VxKC0xLDEsYnk9MC4wMSkpCiAgbXlfcGFsZXR0ZSA8LSBjKCJibHVlIixjb2xvclJhbXBQYWxldHRlKGNvbG9ycyA9IGMoImJsdWUiLCAid2hpdGUiLCAicmVkIikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuID0gbGVuZ3RoKGNvbG9ycyktMyksICJyZWQiKQoKCiAgcHJpbnRfdGFiKHBsdCA9IAogICAgICAgICAgICAgICAgcGhlYXRtYXAobWF0ID0gaGlmX2Nvcixhbm5vdGF0aW9uX2NvbCA9ICBhbm5vdGF0aW9uW1sibXlhbm5vdGF0aW9uIl1dLCBhbm5vdGF0aW9uX2NvbG9ycyA9IGFubm90YXRpb25bWyJhbm5fY29sb3JzIl1dLCBjbHVzdGVyaW5nX2Rpc3RhbmNlX3Jvd3MgPSBjbHVzdGVyaW5nX2Rpc3RhbmNlLGNsdXN0ZXJpbmdfZGlzdGFuY2VfY29scyA9IGNsdXN0ZXJpbmdfZGlzdGFuY2UsY29sb3IgPSBteV9wYWxldHRlLGJyZWFrcyA9IGNvbG9ycyxzaG93X3Jvd25hbWVzID0gVCxzaG93X2NvbG5hbWVzID0gRixmb250c2l6ZV9yb3cgPSA5KQogICAgICAgICAgICAsdGl0bGUgPSAiZ2VuZXMgZXhwcmVzc2lvbiBoZWF0bWFwIikKYGBgCgoKCmBgYHtyIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CmNsdXN0ZXJfM19nZW5lcyA9IGFubm90YXRpb25bWyJteWFubm90YXRpb24iXV0gJT4lIGRwbHlyOjpmaWx0ZXIoY2x1c3RlciA9PSAzKSAlPiUgcm93bmFtZXMoKSAjdGFrZSByZWxldmFudCBnZW5lcwpoaWZfdGFyZ2V0c19ieV90cCA9IEZldGNoRGF0YShvYmplY3QgPSB4ZW5vLHZhcnMgPSBjKGNsdXN0ZXJfM19nZW5lcykpICU+JSByb3dTdW1zKCkgJT4lIGFzLmRhdGEuZnJhbWUoKSAjbWVhbiBleHByZXNzaW9uCm5hbWVzKGhpZl90YXJnZXRzX2J5X3RwKVsxXSA9ICJoaWYxX3RhcmdldHNfbWVhbiIKCmhpZl90YXJnZXRzX2J5X3RwID0gY2JpbmQoaGlmX3RhcmdldHNfYnlfdHAsRmV0Y2hEYXRhKG9iamVjdCA9IHhlbm8sdmFycyA9IGMoIm9yaWcuaWRlbnQiLCJ0cmVhdG1lbnQiKSkpICMgYWRkIHZhcnMKCmhpZl90YXJnZXRzX2J5X3RwX2ZvclBsb3QgPSAgaGlmX3RhcmdldHNfYnlfdHAgJT4lIG11dGF0ZShvcmlnLmlkZW50ID0gcGFzdGUoIm1vZGVsIixvcmlnLmlkZW50KSkgI2FkZCAibW9kZWwiIGJlZm9yZSBtb2RlbCBudW0KbXlfY29tcGFyaXNvbnMgPSBsaXN0KCBjKCJOVCIsICJPU0kiKSApCnBsdCA9IGdncGxvdChoaWZfdGFyZ2V0c19ieV90cF9mb3JQbG90LCBhZXMoeD10cmVhdG1lbnQsIHk9aGlmMV90YXJnZXRzX21lYW4pKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDM3KSkrICNzY2FsZSBheGlzIAogIGZhY2V0X3dyYXAofm9yaWcuaWRlbnQsIG5yb3cgPSAyLCBzdHJpcC5wb3NpdGlvbiA9ICJ0b3AiKSsKICBzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBteV9jb21wYXJpc29ucyxtZXRob2QgPSAid2lsY294LnRlc3QiKSArICMgQWRkIHBhaXJ3aXNlIGNvbXBhcmlzb25zIHAtdmFsdWUKeWxhYigiSElGIHRhcmdldCBnZW5lcyIpCnhlbm9fY2x1c3Rlcl8zID0gY2x1c3Rlcl8zX2dlbmVzCnByaW50X3RhYihwbHQgPSBwbHQsdGl0bGUgPSAiY2x1c3RlciAzIGdlbmVzIikKYGBgCgpgYGB7ciBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQpjbHVzdGVyXzNfZ2VuZXMgPSBhbm5vdGF0aW9uW1sibXlhbm5vdGF0aW9uIl1dICU+JSBkcGx5cjo6ZmlsdGVyKGNsdXN0ZXIgPT0gMyB8IGNsdXN0ZXIgPT0gMikgJT4lIHJvd25hbWVzKCkgI3Rha2UgcmVsZXZhbnQgZ2VuZXMKaGlmX3RhcmdldHNfYnlfdHAgPSBGZXRjaERhdGEob2JqZWN0ID0geGVubyx2YXJzID0gYyhjbHVzdGVyXzNfZ2VuZXMpKSAlPiUgcm93U3VtcygpICU+JSBhcy5kYXRhLmZyYW1lKCkgI21lYW4gZXhwcmVzc2lvbgpuYW1lcyhoaWZfdGFyZ2V0c19ieV90cClbMV0gPSAiaGlmMV90YXJnZXRzX21lYW4iCgpoaWZfdGFyZ2V0c19ieV90cCA9IGNiaW5kKGhpZl90YXJnZXRzX2J5X3RwLEZldGNoRGF0YShvYmplY3QgPSB4ZW5vLHZhcnMgPSBjKCJvcmlnLmlkZW50IiwidHJlYXRtZW50IikpKSAjIGFkZCB2YXJzCgpoaWZfdGFyZ2V0c19ieV90cF9mb3JQbG90ID0gIGhpZl90YXJnZXRzX2J5X3RwICU+JSBtdXRhdGUob3JpZy5pZGVudCA9IHBhc3RlKCJtb2RlbCIsb3JpZy5pZGVudCkpICNhZGQgIm1vZGVsIiBiZWZvcmUgbW9kZWwgbnVtCm15X2NvbXBhcmlzb25zID0gbGlzdCggYygiTlQiLCAiT1NJIikgKQpwbHQgPSBnZ3Bsb3QoaGlmX3RhcmdldHNfYnlfdHBfZm9yUGxvdCwgYWVzKHg9dHJlYXRtZW50LCB5PWhpZjFfdGFyZ2V0c19tZWFuKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCA1MCkpKyAjc2NhbGUgYXhpcyAKICBmYWNldF93cmFwKH5vcmlnLmlkZW50LCBucm93ID0gMiwgc3RyaXAucG9zaXRpb24gPSAidG9wIikrCiAgc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbXlfY29tcGFyaXNvbnMsbWV0aG9kID0gIndpbGNveC50ZXN0IikrICMgQWRkIHBhaXJ3aXNlIGNvbXBhcmlzb25zIHAtdmFsdWUKeWxhYigiSElGIHRhcmdldCBnZW5lcyIpCnhlbm9fY2x1c3Rlcl8zXzIgPSBjbHVzdGVyXzNfZ2VuZXMKCnByaW50X3RhYihwbHQgPSBwbHQsdGl0bGUgPSAiY2x1c3RlciAzKzIgZ2VuZXMiKQpgYGAKCiMgUGF0aWVudHMgey50YWJzZXR9CmBgYHtyIH0KaGlmX3RhcmdldHNfZXhwID0gRmV0Y2hEYXRhKG9iamVjdCA9IGx1bmcsdmFycyA9IGMoaGlmX3RhcmdldHMpKQpoaWZfdGFyZ2V0c19leHAgPSBoaWZfdGFyZ2V0c19leHBbLGNvbFN1bXMoaGlmX3RhcmdldHNfZXhwW10pPjBdICNyZW1vdmUgbm8gZXhwcmVzc2lvbiBnZW5lcwpoaWZfY29yID0gY29yKGhpZl90YXJnZXRzX2V4cCkKcGh0MSA9IHBoZWF0bWFwKG1hdCA9IGhpZl9jb3Isc2lsZW50ID0gVCkKYGBgCgpgYGB7ciBlY2hvPVRSVUUsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEyLCByZXN1bHRzPSdhc2lzJ30KbnVtX29mX2NsdXN0ZXJzID0gNApjbHVzdGVyaW5nX2Rpc3RhbmNlID0gImV1Y2xpZGVhbiIKbXlhbm5vdGF0aW9uID0gYXMuZGF0YS5mcmFtZShjdXRyZWUocGh0MVtbInRyZWVfcm93Il1dLCBrID0gbnVtX29mX2NsdXN0ZXJzKSkgI3NwbGl0IGludG8gayBjbHVzdGVycwogCm5hbWVzKG15YW5ub3RhdGlvbilbMV0gPSAiY2x1c3RlciIKICBteWFubm90YXRpb24kY2x1c3RlciA9IGFzLmZhY3RvcihteWFubm90YXRpb24kY2x1c3RlcikKICAKICBwYWxldHRlMSA8LWJyZXdlci5wYWwobnVtX29mX2NsdXN0ZXJzLCAiUGFpcmVkIikKCiAgbmFtZXMocGFsZXR0ZTEpID0gdW5pcXVlKG15YW5ub3RhdGlvbiRjbHVzdGVyKQogIGFubl9jb2xvcnMgPSBsaXN0IChjbHVzdGVyID0gcGFsZXR0ZTEpCiAgYW5ub3RhdGlvbiA9IGxpc3QoYW5uX2NvbG9ycyA9IGFubl9jb2xvcnMsIG15YW5ub3RhdGlvbiA9IG15YW5ub3RhdGlvbikKICAKICBjb2xvcnMgPC0gYyhzZXEoLTEsMSxieT0wLjAxKSkKICBteV9wYWxldHRlIDwtIGMoImJsdWUiLGNvbG9yUmFtcFBhbGV0dGUoY29sb3JzID0gYygiYmx1ZSIsICJ3aGl0ZSIsICJyZWQiKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG4gPSBsZW5ndGgoY29sb3JzKS0zKSwgInJlZCIpCgoKICBwcmludF90YWIocGx0ID0gCiAgICAgICAgICAgICAgICBwaGVhdG1hcChtYXQgPSBoaWZfY29yLGFubm90YXRpb25fY29sID0gIGFubm90YXRpb25bWyJteWFubm90YXRpb24iXV0sIGFubm90YXRpb25fY29sb3JzID0gYW5ub3RhdGlvbltbImFubl9jb2xvcnMiXV0sIGNsdXN0ZXJpbmdfZGlzdGFuY2Vfcm93cyA9IGNsdXN0ZXJpbmdfZGlzdGFuY2UsY2x1c3RlcmluZ19kaXN0YW5jZV9jb2xzID0gY2x1c3RlcmluZ19kaXN0YW5jZSxjb2xvciA9IG15X3BhbGV0dGUsYnJlYWtzID0gY29sb3JzLHNob3dfcm93bmFtZXMgPSBULHNob3dfY29sbmFtZXMgPSBGLGZvbnRzaXplX3JvdyA9IDkpCiAgICAgICAgICAgICx0aXRsZSA9ICJnZW5lcyBleHByZXNzaW9uIGhlYXRtYXAiKQpgYGAKCmBgYHtyIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CmNsdXN0ZXJfM19nZW5lcyA9IGFubm90YXRpb25bWyJteWFubm90YXRpb24iXV0gJT4lIGRwbHlyOjpmaWx0ZXIoY2x1c3RlciA9PSAxKSAlPiUgcm93bmFtZXMoKSAjdGFrZSByZWxldmFudCBnZW5lcwpoaWZfdGFyZ2V0c19ieV90cCA9IEZldGNoRGF0YShvYmplY3QgPSBsdW5nLHZhcnMgPSBjKGNsdXN0ZXJfM19nZW5lcykpICU+JSByb3dTdW1zKCkgJT4lIGFzLmRhdGEuZnJhbWUoKSAjbWVhbiBleHByZXNzaW9uCm5hbWVzKGhpZl90YXJnZXRzX2J5X3RwKVsxXSA9ICJoaWYxX3RhcmdldHNfbWVhbiIKCmhpZl90YXJnZXRzX2J5X3RwID0gY2JpbmQoaGlmX3RhcmdldHNfYnlfdHAsRmV0Y2hEYXRhKG9iamVjdCA9IGx1bmcsdmFycyA9IGMoInBhdGllbnQuaWRlbnQiLCJ0aW1lLnBvaW50IikpKSAjIGFkZCB2YXJzCgpoaWZfdGFyZ2V0c19ieV90cF9mb3JQbG90ID0gIGhpZl90YXJnZXRzX2J5X3RwICU+JSBtdXRhdGUocGF0aWVudC5pZGVudCA9IHBhc3RlKCJwYXRpZW50ICIscGF0aWVudC5pZGVudCkpICNhZGQgIm1vZGVsIiBiZWZvcmUgbW9kZWwgbnVtCm15X2NvbXBhcmlzb25zID0gbGlzdCggYygicHJlLXRyZWF0bWVudCIsICJvbi10cmVhdG1lbnQiKSApCnBsdCA9IGdncGxvdChoaWZfdGFyZ2V0c19ieV90cF9mb3JQbG90LCBhZXMoeD10aW1lLnBvaW50LCB5PWhpZjFfdGFyZ2V0c19tZWFuKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCBtYXgoaGlmX3RhcmdldHNfYnlfdHBfZm9yUGxvdCRoaWYxX3RhcmdldHNfbWVhbikqMS4xKSkrICNzY2FsZSBheGlzCiAgZmFjZXRfd3JhcCh+cGF0aWVudC5pZGVudCwgbnJvdyA9IDIsIHN0cmlwLnBvc2l0aW9uID0gInRvcCIpKwogIHN0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IG15X2NvbXBhcmlzb25zLG1ldGhvZCA9ICJ3aWxjb3gudGVzdCIpICsgIyBBZGQgcGFpcndpc2UgY29tcGFyaXNvbnMgcC12YWx1ZQp5bGFiKCJISUYgdGFyZ2V0IGdlbmVzIikKCnByaW50X3RhYihwbHQgPSBwbHQsdGl0bGUgPSAiY2x1c3RlciAxIGdlbmVzIikKYGBgCmBgYHtyIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CmNsdXN0ZXJfM19nZW5lcyA9IGFubm90YXRpb25bWyJteWFubm90YXRpb24iXV0gJT4lIGRwbHlyOjpmaWx0ZXIoY2x1c3RlciA9PSAxIHwgY2x1c3RlciA9PSA0KSAlPiUgcm93bmFtZXMoKSAjdGFrZSByZWxldmFudCBnZW5lcwpoaWZfdGFyZ2V0c19ieV90cCA9IEZldGNoRGF0YShvYmplY3QgPSBsdW5nLHZhcnMgPSBjKGNsdXN0ZXJfM19nZW5lcykpICU+JSByb3dTdW1zKCkgJT4lIGFzLmRhdGEuZnJhbWUoKSAjbWVhbiBleHByZXNzaW9uCm5hbWVzKGhpZl90YXJnZXRzX2J5X3RwKVsxXSA9ICJoaWYxX3RhcmdldHNfbWVhbiIKCmhpZl90YXJnZXRzX2J5X3RwID0gY2JpbmQoaGlmX3RhcmdldHNfYnlfdHAsRmV0Y2hEYXRhKG9iamVjdCA9IGx1bmcsdmFycyA9IGMoInBhdGllbnQuaWRlbnQiLCJ0aW1lLnBvaW50IikpKSAjIGFkZCB2YXJzCgpoaWZfdGFyZ2V0c19ieV90cF9mb3JQbG90ID0gIGhpZl90YXJnZXRzX2J5X3RwICU+JSBtdXRhdGUocGF0aWVudC5pZGVudCA9IHBhc3RlKCJwYXRpZW50ICIscGF0aWVudC5pZGVudCkpICNhZGQgIm1vZGVsIiBiZWZvcmUgbW9kZWwgbnVtCm15X2NvbXBhcmlzb25zID0gbGlzdCggYygicHJlLXRyZWF0bWVudCIsICJvbi10cmVhdG1lbnQiKSApCnBsdCA9IGdncGxvdChoaWZfdGFyZ2V0c19ieV90cF9mb3JQbG90LCBhZXMoeD10aW1lLnBvaW50LCB5PWhpZjFfdGFyZ2V0c19tZWFuKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCBtYXgoaGlmX3RhcmdldHNfYnlfdHBfZm9yUGxvdCRoaWYxX3RhcmdldHNfbWVhbikqMS4xKSkrICNleHRlbmQgeSBheGlzIGZvciBwdmFsCiAgZmFjZXRfd3JhcCh+cGF0aWVudC5pZGVudCwgbnJvdyA9IDIsIHN0cmlwLnBvc2l0aW9uID0gInRvcCIpKwogIHN0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IG15X2NvbXBhcmlzb25zLG1ldGhvZCA9ICJ3aWxjb3gudGVzdCIpICsgIyBBZGQgcGFpcndpc2UgY29tcGFyaXNvbnMgcC12YWx1ZQp5bGFiKCJISUYgdGFyZ2V0IGdlbmVzIikKCnByaW50X3RhYihwbHQgPSBwbHQsdGl0bGUgPSAiY2x1c3RlciAxKzQgZ2VuZXMiKQpgYGAKYGBge3IgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30KY2x1c3Rlcl8zX2dlbmVzID14ZW5vX2NsdXN0ZXJfMwpoaWZfdGFyZ2V0c19ieV90cCA9IEZldGNoRGF0YShvYmplY3QgPSBsdW5nLHZhcnMgPSBjKGNsdXN0ZXJfM19nZW5lcykpICU+JSByb3dTdW1zKCkgJT4lIGFzLmRhdGEuZnJhbWUoKSAjbWVhbiBleHByZXNzaW9uCm5hbWVzKGhpZl90YXJnZXRzX2J5X3RwKVsxXSA9ICJoaWYxX3RhcmdldHNfbWVhbiIKCmhpZl90YXJnZXRzX2J5X3RwID0gY2JpbmQoaGlmX3RhcmdldHNfYnlfdHAsRmV0Y2hEYXRhKG9iamVjdCA9IGx1bmcsdmFycyA9IGMoInBhdGllbnQuaWRlbnQiLCJ0aW1lLnBvaW50IikpKSAjIGFkZCB2YXJzCgpoaWZfdGFyZ2V0c19ieV90cF9mb3JQbG90ID0gIGhpZl90YXJnZXRzX2J5X3RwICU+JSBtdXRhdGUocGF0aWVudC5pZGVudCA9IHBhc3RlKCJwYXRpZW50ICIscGF0aWVudC5pZGVudCkpICNhZGQgIm1vZGVsIiBiZWZvcmUgbW9kZWwgbnVtCm15X2NvbXBhcmlzb25zID0gbGlzdCggYygicHJlLXRyZWF0bWVudCIsICJvbi10cmVhdG1lbnQiKSApCnBsdCA9IGdncGxvdChoaWZfdGFyZ2V0c19ieV90cF9mb3JQbG90LCBhZXMoeD10aW1lLnBvaW50LCB5PWhpZjFfdGFyZ2V0c19tZWFuKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCBtYXgoaGlmX3RhcmdldHNfYnlfdHBfZm9yUGxvdCRoaWYxX3RhcmdldHNfbWVhbikqMS4xKSkrICNleHRlbmQgeSBheGlzIGZvciBwdmFsCiAgZmFjZXRfd3JhcCh+cGF0aWVudC5pZGVudCwgbnJvdyA9IDIsIHN0cmlwLnBvc2l0aW9uID0gInRvcCIpKwogIHN0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IG15X2NvbXBhcmlzb25zLG1ldGhvZCA9ICJ3aWxjb3gudGVzdCIpICsgIyBBZGQgcGFpcndpc2UgY29tcGFyaXNvbnMgcC12YWx1ZQp5bGFiKCJISUYgdGFyZ2V0IGdlbmVzIikKCnByaW50X3RhYihwbHQgPSBwbHQsdGl0bGUgPSAibW9kZWxzIGNsdXN0ZXIgMyIpCmBgYApgYGB7ciBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQpjbHVzdGVyXzNfZ2VuZXMgPXhlbm9fY2x1c3Rlcl8zXzIKaGlmX3RhcmdldHNfYnlfdHAgPSBGZXRjaERhdGEob2JqZWN0ID0gbHVuZyx2YXJzID0gYyhjbHVzdGVyXzNfZ2VuZXMpKSAlPiUgcm93U3VtcygpICU+JSBhcy5kYXRhLmZyYW1lKCkgI21lYW4gZXhwcmVzc2lvbgpuYW1lcyhoaWZfdGFyZ2V0c19ieV90cClbMV0gPSAiaGlmMV90YXJnZXRzX21lYW4iCgpoaWZfdGFyZ2V0c19ieV90cCA9IGNiaW5kKGhpZl90YXJnZXRzX2J5X3RwLEZldGNoRGF0YShvYmplY3QgPSBsdW5nLHZhcnMgPSBjKCJwYXRpZW50LmlkZW50IiwidGltZS5wb2ludCIpKSkgIyBhZGQgdmFycwoKaGlmX3RhcmdldHNfYnlfdHBfZm9yUGxvdCA9ICBoaWZfdGFyZ2V0c19ieV90cCAlPiUgbXV0YXRlKHBhdGllbnQuaWRlbnQgPSBwYXN0ZSgicGF0aWVudCAiLHBhdGllbnQuaWRlbnQpKSAjYWRkICJtb2RlbCIgYmVmb3JlIG1vZGVsIG51bQpteV9jb21wYXJpc29ucyA9IGxpc3QoIGMoInByZS10cmVhdG1lbnQiLCAib24tdHJlYXRtZW50IikgKQpwbHQgPSBnZ3Bsb3QoaGlmX3RhcmdldHNfYnlfdHBfZm9yUGxvdCwgYWVzKHg9dGltZS5wb2ludCwgeT1oaWYxX3RhcmdldHNfbWVhbikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgbWF4KGhpZl90YXJnZXRzX2J5X3RwX2ZvclBsb3QkaGlmMV90YXJnZXRzX21lYW4pKjEuMSkpKyAjZXh0ZW5kIHkgYXhpcyBmb3IgcHZhbAogIGZhY2V0X3dyYXAofnBhdGllbnQuaWRlbnQsIG5yb3cgPSAyLCBzdHJpcC5wb3NpdGlvbiA9ICJ0b3AiKSsKICBzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBteV9jb21wYXJpc29ucyxtZXRob2QgPSAid2lsY294LnRlc3QiKSArICMgQWRkIHBhaXJ3aXNlIGNvbXBhcmlzb25zIHAtdmFsdWUKeWxhYigiSElGIHRhcmdldCBnZW5lcyIpCgpwcmludF90YWIocGx0ID0gcGx0LHRpdGxlID0gIm1vZGVscyBjbHVzdGVyIDMrMiIpCmBgYAo=