Loading the Expression Data
The expression data are taken from this study: https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE84144
Download the RNA-seq normalized counts matrices (one matrix per
replicate) from: - https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSM2227697
- https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSM2227698
- https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSM2227699
hdfn.expression1 <- read.delim(paste0(DATA_DIR, "GSE84144-hdfn-1.tsv"), as.is = TRUE, header = TRUE, row.names = 1)
hdfn.expression1 <- rownames_to_column(hdfn.expression1, "ID_REF")
hdfn.expression1 <- hdfn.expression1[c("ID_REF", "VALUE")]
hdfn.expression2 <- read.delim(paste0(DATA_DIR, "GSE84144-hdfn-2.tsv"), as.is = TRUE, header = TRUE, row.names = 1)
hdfn.expression2 <- rownames_to_column(hdfn.expression2, "ID_REF")
hdfn.expression2 <- hdfn.expression2[c("ID_REF", "VALUE")]
hdfn.expression3 <- read.delim(paste0(DATA_DIR, "GSE84144-hdfn-3.tsv"), as.is = TRUE, header = TRUE, row.names = 1)
hdfn.expression3 <- rownames_to_column(hdfn.expression3, "ID_REF")
hdfn.expression3 <- hdfn.expression3[c("ID_REF", "VALUE")]
hdfn.expression3
Merge the gene expression data for the three replicates into one data
frame.
hdfn.expression <- left_join(hdfn.expression1, hdfn.expression2, join_by(ID_REF))
hdfn.expression <- left_join(hdfn.expression, hdfn.expression3, join_by(ID_REF))
hdfn.expression <- hdfn.expression %>% rename("VALUE.x" = "Replicate 1", "VALUE.y" = "Replicate 2", "VALUE" = "Replicate 3")
hdfn.expression
Map the Illumina probe IDs to Ensembl accessions.
illumina_to_ensembl = data.frame(gene_id=unlist(mget(x = hdfn.expression[["ID_REF"]], envir = illuminaHumanv4ENSEMBL)))
illumina_to_ensembl <- rownames_to_column(illumina_to_ensembl, "ID_REF")
illumina_to_ensembl
hdfn.expression <- left_join(hdfn.expression, illumina_to_ensembl)
Joining with `by = join_by(ID_REF)`
hdfn.expression
Exploratory Data Analysis
We load the gene sets from RCDdb: https://pubmed.ncbi.nlm.nih.gov/39257527/
RCDdb <- "data/RCDdb/"
Necroptosis
Load the gene set.
genes <- read.csv(paste0(RCDdb, "Necroptosis.csv"))
genes$gene_id <- cleanid(genes$gene_id)
genes <- distinct(genes, gene_id, .keep_all = TRUE)
genes <- subset(genes, gene_id != "")
genes
Get the normalized expression data for the genes in the gene set.
tpm.df <- hdfn.expression %>% dplyr::filter(gene_id %in% genes$gene_id)
tpm.df <- left_join(tpm.df, genes %>% dplyr::select(gene_id, gene), by = c("gene_id" = "gene_id"))
tpm.df <- distinct(tpm.df, gene, .keep_all = TRUE)
rownames(tpm.df) <- tpm.df$gene
tpm.df <- subset(tpm.df, select = -c(gene_id, ID_REF, gene) )
tpm.df <- tpm.df[ order(row.names(tpm.df)), , drop = FALSE]
tpm.df
Plot the results.
tpm.matrix <- as.matrix(tpm.df)
heatmap.2(tpm.matrix, srtCol=360, cellnote = tpm.matrix, dendrogram="none", Colv=FALSE, Rowv=FALSE,
col=brewer.pal(n = 9, name = "BuPu")[5:9], trace="none", key = FALSE, lwid=c(0.1,4), lhei=c(0.1,4),
cexCol=1, cexRow=0.75, symm = TRUE)
Ferroptosis
Load the gene set.
genes <- read.csv(paste0(RCDdb, "Ferroptosis.csv"))
genes$gene_id <- cleanid(genes$gene_id)
genes <- distinct(genes, gene_id, .keep_all = TRUE)
genes <- subset(genes, gene_id != "")
genes
Get the normalized expression data for the genes in the gene set.
tpm.df <- hdfn.expression %>% dplyr::filter(gene_id %in% genes$gene_id)
tpm.df <- left_join(tpm.df, genes %>% dplyr::select(gene_id, gene), by = c("gene_id" = "gene_id"))
tpm.df <- distinct(tpm.df, gene, .keep_all = TRUE)
rownames(tpm.df) <- tpm.df$gene
tpm.df <- subset(tpm.df, select = -c(gene_id, ID_REF, gene) )
tpm.df <- tpm.df[ order(row.names(tpm.df)), , drop = FALSE]
tpm.df
Plot the results.
tpm.matrix <- as.matrix(tpm.df)
heatmap.2(tpm.matrix, srtCol=360, cellnote = tpm.matrix, dendrogram="none", Colv=FALSE, Rowv=FALSE,
col=brewer.pal(n = 9, name = "BuPu")[5:9], trace="none", key = FALSE, lwid=c(0.1,4), lhei=c(0.1,4),
cexCol=1, cexRow=0.75, symm = TRUE)
Pyroptosis
Load the gene set.
genes <- read.csv(paste0(RCDdb, "Pyroptosis.csv"))
genes$gene_id <- cleanid(genes$gene_id)
genes <- distinct(genes, gene_id, .keep_all = TRUE)
genes <- subset(genes, gene_id != "")
genes
Get the normalized expression data for the genes in the gene set.
tpm.df <- hdfn.expression %>% dplyr::filter(gene_id %in% genes$gene_id)
tpm.df <- left_join(tpm.df, genes %>% dplyr::select(gene_id, gene), by = c("gene_id" = "gene_id"))
tpm.df <- distinct(tpm.df, gene, .keep_all = TRUE)
rownames(tpm.df) <- tpm.df$gene
tpm.df <- subset(tpm.df, select = -c(gene_id, ID_REF, gene) )
tpm.df <- tpm.df[ order(row.names(tpm.df)), , drop = FALSE]
tpm.df
Plot the results.
tpm.matrix <- as.matrix(tpm.df)
heatmap.2(tpm.matrix, srtCol=360, cellnote = tpm.matrix, dendrogram="none", Colv=FALSE, Rowv=FALSE,
col=brewer.pal(n = 9, name = "BuPu")[5:9], trace="none", key = FALSE, lwid=c(0.1,4), lhei=c(0.1,4),
cexCol=1, cexRow=0.75, symm = TRUE)
LS0tDQp0aXRsZTogIkdlbmUgRXhwcmVzc2lvbiBBbmFseXNpcyINCnN1YnRpdGxlOiAiSHVtYW4gRGVybWFsIEZpYnJvYmxhc3RzLCBuZW9uYXRhbCAoSERGbikgfCBHU0U4NDE0NCB8IE5lY3JvcHRvc2lzLCBGZXJyb3B0b3NpcyAmIFB5cm9wdG9zaXMiDQphdXRob3I6IA0KICAtIE1hcmsgRWR3YXJkIE0uIEdvbnphbGVzXltEZSBMYSBTYWxsZSBVbml2ZXJzaXR5LCBNYW5pbGEsIFBoaWxpcHBpbmVzLCBnb256YWxlcy5tYXJrZWR3YXJkQGdtYWlsLmNvbV0NCiAgLSBEci4gQW5pc2ggTS5TLiBTaHJlc3RoYV5bRGUgTGEgU2FsbGUgVW5pdmVyc2l0eSwgTWFuaWxhLCBQaGlsaXBwaW5lcywgYW5pc2guc2hyZXN0aGFAZGxzdS5lZHUucGhdDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIyBJLiBQcmVsaW1pbmFyaWVzDQoNCiMjIyBMb2FkaW5nIGxpYnJhcmllcw0KDQpgYGB7ciwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCmxpYnJhcnkoInRpZHl2ZXJzZSIpDQpsaWJyYXJ5KCJ0aWJibGUiKQ0KbGlicmFyeSgibXNpZ2RiciIpDQpsaWJyYXJ5KCJnZ3Bsb3QyIikNCmxpYnJhcnkoImVuc2VtYmxkYiIpDQpsaWJyYXJ5KCJwdXJyciIpDQpsaWJyYXJ5KCJtYWdyaXR0ciIpDQpsaWJyYXJ5KCJtYXRyaXhTdGF0cyIpDQpsaWJyYXJ5KCJkcGx5ciIpDQpsaWJyYXJ5KCJncmV4IikNCmxpYnJhcnkoImdwbG90cyIpDQpsaWJyYXJ5KCJSQ29sb3JCcmV3ZXIiKQ0KbGlicmFyeSgiaWxsdW1pbmFIdW1hbnY0LmRiIikNCmBgYA0KDQojIyMgQ29uc3RhbnRzDQpgYGB7cn0NCkRBVEFfRElSIDwtICJkYXRhL0hERm4vIg0KYGBgDQoNCiMjIExvYWRpbmcgdGhlIEV4cHJlc3Npb24gRGF0YQ0KDQpUaGUgZXhwcmVzc2lvbiBkYXRhIGFyZSB0YWtlbiBmcm9tIHRoaXMgc3R1ZHk6IGh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3YvZ2VvL3F1ZXJ5L2FjYy5jZ2k/YWNjPUdTRTg0MTQ0DQoNCkRvd25sb2FkIHRoZSBSTkEtc2VxIG5vcm1hbGl6ZWQgY291bnRzIG1hdHJpY2VzIChvbmUgbWF0cml4IHBlciByZXBsaWNhdGUpIGZyb206DQotIGh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3YvZ2VvL3F1ZXJ5L2FjYy5jZ2k/YWNjPUdTTTIyMjc2OTcNCi0gaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9nZW8vcXVlcnkvYWNjLmNnaT9hY2M9R1NNMjIyNzY5OA0KLSBodHRwczovL3d3dy5uY2JpLm5sbS5uaWguZ292L2dlby9xdWVyeS9hY2MuY2dpP2FjYz1HU00yMjI3Njk5DQoNCmBgYHtyfQ0KaGRmbi5leHByZXNzaW9uMSA8LSByZWFkLmRlbGltKHBhc3RlMChEQVRBX0RJUiwgIkdTRTg0MTQ0LWhkZm4tMS50c3YiKSwgYXMuaXMgPSBUUlVFLCBoZWFkZXIgPSBUUlVFLCByb3cubmFtZXMgPSAxKQ0KaGRmbi5leHByZXNzaW9uMSA8LSByb3duYW1lc190b19jb2x1bW4oaGRmbi5leHByZXNzaW9uMSwgIklEX1JFRiIpDQpoZGZuLmV4cHJlc3Npb24xIDwtIGhkZm4uZXhwcmVzc2lvbjFbYygiSURfUkVGIiwgIlZBTFVFIildDQoNCmhkZm4uZXhwcmVzc2lvbjIgPC0gcmVhZC5kZWxpbShwYXN0ZTAoREFUQV9ESVIsICJHU0U4NDE0NC1oZGZuLTIudHN2IiksIGFzLmlzID0gVFJVRSwgaGVhZGVyID0gVFJVRSwgcm93Lm5hbWVzID0gMSkNCmhkZm4uZXhwcmVzc2lvbjIgPC0gcm93bmFtZXNfdG9fY29sdW1uKGhkZm4uZXhwcmVzc2lvbjIsICJJRF9SRUYiKQ0KaGRmbi5leHByZXNzaW9uMiA8LSBoZGZuLmV4cHJlc3Npb24yW2MoIklEX1JFRiIsICJWQUxVRSIpXQ0KDQpoZGZuLmV4cHJlc3Npb24zIDwtIHJlYWQuZGVsaW0ocGFzdGUwKERBVEFfRElSLCAiR1NFODQxNDQtaGRmbi0zLnRzdiIpLCBhcy5pcyA9IFRSVUUsIGhlYWRlciA9IFRSVUUsIHJvdy5uYW1lcyA9IDEpDQpoZGZuLmV4cHJlc3Npb24zIDwtIHJvd25hbWVzX3RvX2NvbHVtbihoZGZuLmV4cHJlc3Npb24zLCAiSURfUkVGIikNCmhkZm4uZXhwcmVzc2lvbjMgPC0gaGRmbi5leHByZXNzaW9uM1tjKCJJRF9SRUYiLCAiVkFMVUUiKV0NCg0KaGRmbi5leHByZXNzaW9uMw0KYGBgDQoNCk1lcmdlIHRoZSBnZW5lIGV4cHJlc3Npb24gZGF0YSBmb3IgdGhlIHRocmVlIHJlcGxpY2F0ZXMgaW50byBvbmUgZGF0YSBmcmFtZS4NCg0KYGBge3J9DQpoZGZuLmV4cHJlc3Npb24gPC0gbGVmdF9qb2luKGhkZm4uZXhwcmVzc2lvbjEsIGhkZm4uZXhwcmVzc2lvbjIsIGpvaW5fYnkoSURfUkVGKSkNCmhkZm4uZXhwcmVzc2lvbiA8LSBsZWZ0X2pvaW4oaGRmbi5leHByZXNzaW9uLCBoZGZuLmV4cHJlc3Npb24zLCBqb2luX2J5KElEX1JFRikpDQpoZGZuLmV4cHJlc3Npb24gPC0gaGRmbi5leHByZXNzaW9uICU+JSByZW5hbWUoIlZBTFVFLngiID0gIlJlcGxpY2F0ZSAxIiwgIlZBTFVFLnkiID0gIlJlcGxpY2F0ZSAyIiwgIlZBTFVFIiA9ICJSZXBsaWNhdGUgMyIpDQpoZGZuLmV4cHJlc3Npb24NCmBgYA0KDQpNYXAgdGhlIElsbHVtaW5hIHByb2JlIElEcyB0byBFbnNlbWJsIGFjY2Vzc2lvbnMuDQoNCmBgYHtyfQ0KaWxsdW1pbmFfdG9fZW5zZW1ibCA9IGRhdGEuZnJhbWUoZ2VuZV9pZD11bmxpc3QobWdldCh4ID0gaGRmbi5leHByZXNzaW9uW1siSURfUkVGIl1dLCBlbnZpciA9IGlsbHVtaW5hSHVtYW52NEVOU0VNQkwpKSkNCmlsbHVtaW5hX3RvX2Vuc2VtYmwgPC0gcm93bmFtZXNfdG9fY29sdW1uKGlsbHVtaW5hX3RvX2Vuc2VtYmwsICJJRF9SRUYiKQ0KaWxsdW1pbmFfdG9fZW5zZW1ibA0KYGBgDQoNCmBgYHtyfQ0KaGRmbi5leHByZXNzaW9uIDwtIGxlZnRfam9pbihoZGZuLmV4cHJlc3Npb24sIGlsbHVtaW5hX3RvX2Vuc2VtYmwpDQpoZGZuLmV4cHJlc3Npb24NCmBgYA0KDQojIyBFeHBsb3JhdG9yeSBEYXRhIEFuYWx5c2lzDQoNCldlIGxvYWQgdGhlIGdlbmUgc2V0cyBmcm9tIFJDRGRiOiBodHRwczovL3B1Ym1lZC5uY2JpLm5sbS5uaWguZ292LzM5MjU3NTI3Lw0KDQpgYGB7cn0NClJDRGRiIDwtICJkYXRhL1JDRGRiLyINCmBgYA0KDQojIyMgTmVjcm9wdG9zaXMNCg0KTG9hZCB0aGUgZ2VuZSBzZXQuDQoNCmBgYHtyfQ0KZ2VuZXMgPC0gcmVhZC5jc3YocGFzdGUwKFJDRGRiLCAiTmVjcm9wdG9zaXMuY3N2IikpDQpnZW5lcyRnZW5lX2lkIDwtIGNsZWFuaWQoZ2VuZXMkZ2VuZV9pZCkNCmdlbmVzIDwtIGRpc3RpbmN0KGdlbmVzLCBnZW5lX2lkLCAua2VlcF9hbGwgPSBUUlVFKQ0KZ2VuZXMgPC0gc3Vic2V0KGdlbmVzLCBnZW5lX2lkICE9ICIiKQ0KZ2VuZXMNCmBgYA0KDQpHZXQgdGhlIG5vcm1hbGl6ZWQgZXhwcmVzc2lvbiBkYXRhIGZvciB0aGUgZ2VuZXMgaW4gdGhlIGdlbmUgc2V0Lg0KDQpgYGB7cn0NCnRwbS5kZiA8LSBoZGZuLmV4cHJlc3Npb24gJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZV9pZCAlaW4lIGdlbmVzJGdlbmVfaWQpDQp0cG0uZGYgPC0gbGVmdF9qb2luKHRwbS5kZiwgZ2VuZXMgJT4lIGRwbHlyOjpzZWxlY3QoZ2VuZV9pZCwgZ2VuZSksIGJ5ID0gYygiZ2VuZV9pZCIgPSAiZ2VuZV9pZCIpKQ0KdHBtLmRmIDwtIGRpc3RpbmN0KHRwbS5kZiwgZ2VuZSwgLmtlZXBfYWxsID0gVFJVRSkNCnJvd25hbWVzKHRwbS5kZikgPC0gdHBtLmRmJGdlbmUNCnRwbS5kZiA8LSBzdWJzZXQodHBtLmRmLCBzZWxlY3QgPSAtYyhnZW5lX2lkLCBJRF9SRUYsIGdlbmUpICkNCnRwbS5kZiA8LSB0cG0uZGZbIG9yZGVyKHJvdy5uYW1lcyh0cG0uZGYpKSwgLCBkcm9wID0gRkFMU0VdDQp0cG0uZGYNCmBgYA0KDQpQbG90IHRoZSByZXN1bHRzLg0KDQpgYGB7ciwgZmlnLmhlaWdodD0zMCwgZmlnLndpZHRoPTEwfQ0KdHBtLm1hdHJpeCA8LSBhcy5tYXRyaXgodHBtLmRmKQ0KaGVhdG1hcC4yKHRwbS5tYXRyaXgsIHNydENvbD0zNjAsIGNlbGxub3RlID0gdHBtLm1hdHJpeCwgZGVuZHJvZ3JhbT0ibm9uZSIsIENvbHY9RkFMU0UsIFJvd3Y9RkFMU0UsDQogICAgICAgICAgY29sPWJyZXdlci5wYWwobiA9IDksIG5hbWUgPSAiQnVQdSIpWzU6OV0sIHRyYWNlPSJub25lIiwga2V5ID0gRkFMU0UsIGx3aWQ9YygwLjEsNCksIGxoZWk9YygwLjEsNCksDQogICAgICAgICAgY2V4Q29sPTEsIGNleFJvdz0wLjc1LCBzeW1tID0gVFJVRSkNCmBgYA0KIyMjIEZlcnJvcHRvc2lzDQoNCkxvYWQgdGhlIGdlbmUgc2V0Lg0KDQpgYGB7cn0NCmdlbmVzIDwtIHJlYWQuY3N2KHBhc3RlMChSQ0RkYiwgIkZlcnJvcHRvc2lzLmNzdiIpKQ0KZ2VuZXMkZ2VuZV9pZCA8LSBjbGVhbmlkKGdlbmVzJGdlbmVfaWQpDQpnZW5lcyA8LSBkaXN0aW5jdChnZW5lcywgZ2VuZV9pZCwgLmtlZXBfYWxsID0gVFJVRSkNCmdlbmVzIDwtIHN1YnNldChnZW5lcywgZ2VuZV9pZCAhPSAiIikNCmdlbmVzDQpgYGANCg0KR2V0IHRoZSBub3JtYWxpemVkIGV4cHJlc3Npb24gZGF0YSBmb3IgdGhlIGdlbmVzIGluIHRoZSBnZW5lIHNldC4NCg0KYGBge3J9DQp0cG0uZGYgPC0gaGRmbi5leHByZXNzaW9uICU+JSBkcGx5cjo6ZmlsdGVyKGdlbmVfaWQgJWluJSBnZW5lcyRnZW5lX2lkKQ0KdHBtLmRmIDwtIGxlZnRfam9pbih0cG0uZGYsIGdlbmVzICU+JSBkcGx5cjo6c2VsZWN0KGdlbmVfaWQsIGdlbmUpLCBieSA9IGMoImdlbmVfaWQiID0gImdlbmVfaWQiKSkNCnRwbS5kZiA8LSBkaXN0aW5jdCh0cG0uZGYsIGdlbmUsIC5rZWVwX2FsbCA9IFRSVUUpDQpyb3duYW1lcyh0cG0uZGYpIDwtIHRwbS5kZiRnZW5lDQp0cG0uZGYgPC0gc3Vic2V0KHRwbS5kZiwgc2VsZWN0ID0gLWMoZ2VuZV9pZCwgSURfUkVGLCBnZW5lKSApDQp0cG0uZGYgPC0gdHBtLmRmWyBvcmRlcihyb3cubmFtZXModHBtLmRmKSksICwgZHJvcCA9IEZBTFNFXQ0KdHBtLmRmDQpgYGANCg0KUGxvdCB0aGUgcmVzdWx0cy4NCg0KYGBge3IsIGZpZy5oZWlnaHQ9MTUwLCBmaWcud2lkdGg9MTB9DQp0cG0ubWF0cml4IDwtIGFzLm1hdHJpeCh0cG0uZGYpDQpoZWF0bWFwLjIodHBtLm1hdHJpeCwgc3J0Q29sPTM2MCwgY2VsbG5vdGUgPSB0cG0ubWF0cml4LCBkZW5kcm9ncmFtPSJub25lIiwgQ29sdj1GQUxTRSwgUm93dj1GQUxTRSwNCiAgICAgICAgICBjb2w9YnJld2VyLnBhbChuID0gOSwgbmFtZSA9ICJCdVB1IilbNTo5XSwgdHJhY2U9Im5vbmUiLCBrZXkgPSBGQUxTRSwgbHdpZD1jKDAuMSw0KSwgbGhlaT1jKDAuMSw0KSwNCiAgICAgICAgICBjZXhDb2w9MSwgY2V4Um93PTAuNzUsIHN5bW0gPSBUUlVFKQ0KYGBgDQoNCiMjIyBQeXJvcHRvc2lzDQoNCkxvYWQgdGhlIGdlbmUgc2V0Lg0KDQpgYGB7cn0NCmdlbmVzIDwtIHJlYWQuY3N2KHBhc3RlMChSQ0RkYiwgIlB5cm9wdG9zaXMuY3N2IikpDQpnZW5lcyRnZW5lX2lkIDwtIGNsZWFuaWQoZ2VuZXMkZ2VuZV9pZCkNCmdlbmVzIDwtIGRpc3RpbmN0KGdlbmVzLCBnZW5lX2lkLCAua2VlcF9hbGwgPSBUUlVFKQ0KZ2VuZXMgPC0gc3Vic2V0KGdlbmVzLCBnZW5lX2lkICE9ICIiKQ0KZ2VuZXMNCmBgYA0KDQpHZXQgdGhlIG5vcm1hbGl6ZWQgZXhwcmVzc2lvbiBkYXRhIGZvciB0aGUgZ2VuZXMgaW4gdGhlIGdlbmUgc2V0Lg0KDQpgYGB7cn0NCnRwbS5kZiA8LSBoZGZuLmV4cHJlc3Npb24gJT4lIGRwbHlyOjpmaWx0ZXIoZ2VuZV9pZCAlaW4lIGdlbmVzJGdlbmVfaWQpDQp0cG0uZGYgPC0gbGVmdF9qb2luKHRwbS5kZiwgZ2VuZXMgJT4lIGRwbHlyOjpzZWxlY3QoZ2VuZV9pZCwgZ2VuZSksIGJ5ID0gYygiZ2VuZV9pZCIgPSAiZ2VuZV9pZCIpKQ0KdHBtLmRmIDwtIGRpc3RpbmN0KHRwbS5kZiwgZ2VuZSwgLmtlZXBfYWxsID0gVFJVRSkNCnJvd25hbWVzKHRwbS5kZikgPC0gdHBtLmRmJGdlbmUNCnRwbS5kZiA8LSBzdWJzZXQodHBtLmRmLCBzZWxlY3QgPSAtYyhnZW5lX2lkLCBJRF9SRUYsIGdlbmUpICkNCnRwbS5kZiA8LSB0cG0uZGZbIG9yZGVyKHJvdy5uYW1lcyh0cG0uZGYpKSwgLCBkcm9wID0gRkFMU0VdDQp0cG0uZGYNCmBgYA0KDQpQbG90IHRoZSByZXN1bHRzLg0KDQpgYGB7ciwgZmlnLmhlaWdodD0yMCwgZmlnLndpZHRoPTEwfQ0KdHBtLm1hdHJpeCA8LSBhcy5tYXRyaXgodHBtLmRmKQ0KaGVhdG1hcC4yKHRwbS5tYXRyaXgsIHNydENvbD0zNjAsIGNlbGxub3RlID0gdHBtLm1hdHJpeCwgZGVuZHJvZ3JhbT0ibm9uZSIsIENvbHY9RkFMU0UsIFJvd3Y9RkFMU0UsDQogICAgICAgICAgY29sPWJyZXdlci5wYWwobiA9IDksIG5hbWUgPSAiQnVQdSIpWzU6OV0sIHRyYWNlPSJub25lIiwga2V5ID0gRkFMU0UsIGx3aWQ9YygwLjEsNCksIGxoZWk9YygwLjEsNCksDQogICAgICAgICAgY2V4Q29sPTEsIGNleFJvdz0wLjc1LCBzeW1tID0gVFJVRSkNCmBgYA==