J. Taroni 2018

E-MTAB-2452: Sorted peripheral blood cells (CD4+ T cells, CD14+ monocytes, CD16+ neutrophils) profiled on microarray from several autoimmune diseases. This dataset is a good control for further investigating recount2 PLIER model (cross-platform) transfer learning.

Functions and set up

`%>%` <- dplyr::`%>%`
library(AnnotationDbi)
Loading required package: stats4
Loading required package: BiocGenerics
Loading required package: parallel

Attaching package: ‘BiocGenerics’

The following objects are masked from ‘package:parallel’:

    clusterApply, clusterApplyLB, clusterCall, clusterEvalQ, clusterExport,
    clusterMap, parApply, parCapply, parLapply, parLapplyLB, parRapply,
    parSapply, parSapplyLB

The following objects are masked from ‘package:stats’:

    IQR, mad, sd, var, xtabs

The following objects are masked from ‘package:base’:

    anyDuplicated, append, as.data.frame, cbind, colMeans, colnames,
    colSums, do.call, duplicated, eval, evalq, Filter, Find, get, grep,
    grepl, intersect, is.unsorted, lapply, lengths, Map, mapply, match,
    mget, order, paste, pmax, pmax.int, pmin, pmin.int, Position, rank,
    rbind, Reduce, rowMeans, rownames, rowSums, sapply, setdiff, sort,
    table, tapply, union, unique, unsplit, which, which.max, which.min

Loading required package: Biobase
Welcome to Bioconductor

    Vignettes contain introductory material; view with 'browseVignettes()'.
    To cite Bioconductor, see 'citation("Biobase")', and for packages
    'citation("pkgname")'.

Loading required package: IRanges
Loading required package: S4Vectors

Attaching package: ‘S4Vectors’

The following object is masked from ‘package:base’:

    expand.grid
# custom functions
source(file.path("util", "plier_util.R"))
# plot and result directory setup for this notebook
plot.dir <- file.path("plots", "03")
dir.create(plot.dir, recursive = TRUE, showWarnings = FALSE)
results.dir <- file.path("results", "03")
dir.create(results.dir, recursive = TRUE, showWarnings = FALSE)

Read in data

recount2 PLIER model

plier.results <- readRDS(file.path("data", "recount2_PLIER_data", 
                                   "recount_PLIER_model.RDS"))

Isolated cell subsets microarray data

# read in E-MTAB-2452 expression data that has been processed with SCANfast
exprs.df <- readr::read_tsv(file.path("data", "expression_data",
                                      "E-MTAB-2452_hugene11st_SCANfast.pcl"))
Missing column names filled in: 'X1' [1]Parsed with column specification:
cols(
  .default = col_double(),
  X1 = col_character()
)
See spec(...) for full column specifications.

|===                                                                          |   4%
|====                                                                         |   6%
|====                                                                 |   7%    1 MB
|=====                                                                |   8%    1 MB
|======                                                               |   9%    1 MB
|=======                                                              |  10%    1 MB
|=======                                                              |  11%    1 MB
|========                                                             |  12%    1 MB
|=========                                                            |  13%    2 MB
|=========                                                            |  14%    2 MB
|==========                                                           |  15%    2 MB
|===========                                                          |  16%    2 MB
|============                                                         |  17%    2 MB
|============                                                         |  18%    2 MB
|=============                                                        |  19%    2 MB
|==============                                                       |  20%    3 MB
|==============                                                       |  21%    3 MB
|===============                                                      |  22%    3 MB
|================                                                     |  23%    3 MB
|================                                                     |  24%    3 MB
|=================                                                    |  25%    3 MB
|==================                                                   |  26%    4 MB
|===================                                                  |  27%    4 MB
|===================                                                  |  28%    4 MB
|====================                                                 |  29%    4 MB
|=====================                                                |  30%    4 MB
|=====================                                                |  31%    4 MB
|======================                                               |  32%    5 MB
|=======================                                              |  33%    5 MB
|========================                                             |  34%    5 MB
|========================                                             |  35%    5 MB
|=========================                                            |  36%    5 MB
|==========================                                           |  37%    5 MB
|==========================                                           |  38%    5 MB
|===========================                                          |  39%    6 MB
|============================                                         |  40%    6 MB
|=============================                                        |  41%    6 MB
|=============================                                        |  42%    6 MB
|==============================                                       |  43%    6 MB
|===============================                                      |  44%    6 MB
|===============================                                      |  45%    7 MB
|================================                                     |  46%    7 MB
|=================================                                    |  47%    7 MB
|==================================                                   |  48%    7 MB
|==================================                                   |  49%    7 MB
|===================================                                  |  50%    7 MB
|====================================                                 |  51%    8 MB
|====================================                                 |  52%    8 MB
|=====================================                                |  53%    8 MB
|======================================                               |  54%    8 MB
|=======================================                              |  55%    8 MB
|=======================================                              |  56%    8 MB
|========================================                             |  57%    9 MB
|=========================================                            |  58%    9 MB
|=========================================                            |  59%    9 MB
|==========================================                           |  60%    9 MB
|===========================================                          |  61%    9 MB
|===========================================                          |  62%    9 MB
|============================================                         |  63%    9 MB
|=============================================                        |  64%   10 MB
|=============================================                        |  65%   10 MB
|==============================================                       |  66%   10 MB
|===============================================                      |  67%   10 MB
|================================================                     |  68%   10 MB
|================================================                     |  69%   10 MB
|=================================================                    |  70%   11 MB
|==================================================                   |  71%   11 MB
|==================================================                   |  72%   11 MB
|===================================================                  |  73%   11 MB
|====================================================                 |  74%   11 MB
|=====================================================                |  75%   11 MB
|=====================================================                |  76%   11 MB
|======================================================               |  77%   12 MB
|=======================================================              |  78%   12 MB
|=======================================================              |  79%   12 MB
|========================================================             |  80%   12 MB
|=========================================================            |  81%   12 MB
|=========================================================            |  82%   12 MB
|==========================================================           |  83%   13 MB
|===========================================================          |  84%   13 MB
|============================================================         |  85%   13 MB
|============================================================         |  86%   13 MB
|=============================================================        |  87%   13 MB
|==============================================================       |  88%   13 MB
|==============================================================       |  89%   14 MB
|===============================================================      |  90%   14 MB
|================================================================     |  91%   14 MB
|================================================================     |  92%   14 MB
|=================================================================    |  93%   14 MB
|==================================================================   |  94%   14 MB
|===================================================================  |  95%   14 MB
|===================================================================  |  96%   15 MB
|==================================================================== |  97%   15 MB
|=====================================================================|  98%   15 MB
|=====================================================================|  99%   15 MB
|======================================================================| 100%   15 MB
colnames(exprs.df)[1] <- "EntrezID"

Conversion to gene symbol

# remove trailing "_at" (result of using BrainArray) to get EntrezIDs
exprs.df$EntrezID <- gsub("_at", "", exprs.df$EntrezID)
# conversion to gene symbol
symbol.obj <- org.Hs.eg.db::org.Hs.egSYMBOL
mapped.genes <- AnnotationDbi::mappedkeys(symbol.obj)
symbol.list <- as.list(symbol.obj[mapped.genes])
symbol.df <- as.data.frame(cbind(names(symbol.list), unlist(symbol.list)))
colnames(symbol.df) <- c("EntrezID", "GeneSymbol")
# inner join
annot.data <- dplyr::inner_join(symbol.df, exprs.df, by = "EntrezID")
Column `EntrezID` joining factor and character vector, coercing into character vector
# remove objects only necessary for annotation
rm(mapped.genes, symbol.list, symbol.obj, symbol.df)
# write to file
gs.file <- file.path("data", "expression_data", 
                     "E-MTAB-2452_hugene11st_SCANfast_with_GeneSymbol.pcl")
readr::write_tsv(annot.data, path = gs.file)
# get as a matrix 
exprs.mat <- as.matrix(annot.data[, 3:ncol(annot.data)])
rownames(exprs.mat) <- annot.data$GeneSymbol

Apply recount2 model

B matrix

iso.b.matrix <- GetNewDataB(exprs.mat = exprs.mat,
                            plier.model = plier.results)
Loading required package: PLIER
Loading required package: RColorBrewer
Loading required package: gplots

Attaching package: ‘gplots’

The following object is masked from ‘package:IRanges’:

    space

The following object is masked from ‘package:S4Vectors’:

    space

The following object is masked from ‘package:stats’:

    lowess

Loading required package: pheatmap
Loading required package: glmnet
Loading required package: Matrix

Attaching package: ‘Matrix’

The following object is masked from ‘package:S4Vectors’:

    expand

Loading required package: foreach
Loaded glmnet 2.0-13

Loading required package: knitr
Loading required package: rsvd
Loading required package: qvalue
head(iso.b.matrix[, 1:10])
                                                 CD14_triad0058_1.CEL
1,REACTOME_MRNA_SPLICING                                  0.067106412
2,SVM Monocytes                                           0.232957061
3,REACTOME_TRANSMISSION_ACROSS_CHEMICAL_SYNAPSES         -0.011655091
4,REACTOME_NEURONAL_SYSTEM                               -0.067716284
LV 5                                                      0.010245267
LV 6                                                      0.001491663
                                                 CD14_triad0058_2.CEL
1,REACTOME_MRNA_SPLICING                                   0.04966645
2,SVM Monocytes                                            0.25400019
3,REACTOME_TRANSMISSION_ACROSS_CHEMICAL_SYNAPSES          -0.01469445
4,REACTOME_NEURONAL_SYSTEM                                -0.09668289
LV 5                                                       0.01236375
LV 6                                                      -0.02168559
                                                 CD14_triad0058_3.CEL
1,REACTOME_MRNA_SPLICING                                  0.082299659
2,SVM Monocytes                                           0.212679441
3,REACTOME_TRANSMISSION_ACROSS_CHEMICAL_SYNAPSES         -0.009044731
4,REACTOME_NEURONAL_SYSTEM                               -0.063541877
LV 5                                                      0.003987257
LV 6                                                      0.017852705
                                                 CD14_triad0058_4.CEL
1,REACTOME_MRNA_SPLICING                                  0.078970621
2,SVM Monocytes                                           0.257875145
3,REACTOME_TRANSMISSION_ACROSS_CHEMICAL_SYNAPSES         -0.043604428
4,REACTOME_NEURONAL_SYSTEM                               -0.076126418
LV 5                                                     -0.007174178
LV 6                                                     -0.019207945
                                                 CD14_triad0058_5.CEL
1,REACTOME_MRNA_SPLICING                                  0.066609286
2,SVM Monocytes                                           0.222294145
3,REACTOME_TRANSMISSION_ACROSS_CHEMICAL_SYNAPSES         -0.008187733
4,REACTOME_NEURONAL_SYSTEM                               -0.032182088
LV 5                                                     -0.005368010
LV 6                                                     -0.002825871
                                                 CD14_triad0058_6.CEL
1,REACTOME_MRNA_SPLICING                                  0.113726151
2,SVM Monocytes                                           0.264977049
3,REACTOME_TRANSMISSION_ACROSS_CHEMICAL_SYNAPSES         -0.035042814
4,REACTOME_NEURONAL_SYSTEM                               -0.072400980
LV 5                                                     -0.029497357
LV 6                                                     -0.001938951
                                                 CD14_triad0058_7.CEL
1,REACTOME_MRNA_SPLICING                                   0.06027642
2,SVM Monocytes                                            0.28752454
3,REACTOME_TRANSMISSION_ACROSS_CHEMICAL_SYNAPSES          -0.01073898
4,REACTOME_NEURONAL_SYSTEM                                -0.04019075
LV 5                                                       0.01692032
LV 6                                                      -0.03281626
                                                 CD14_triad0058_8.CEL
1,REACTOME_MRNA_SPLICING                                  0.074128734
2,SVM Monocytes                                           0.220520916
3,REACTOME_TRANSMISSION_ACROSS_CHEMICAL_SYNAPSES         -0.006925421
4,REACTOME_NEURONAL_SYSTEM                               -0.068050390
LV 5                                                     -0.011935084
LV 6                                                      0.006903267
                                                 CD14_triad0062_10.CEL
1,REACTOME_MRNA_SPLICING                                  -0.007857945
2,SVM Monocytes                                            0.314180137
3,REACTOME_TRANSMISSION_ACROSS_CHEMICAL_SYNAPSES          -0.047472878
4,REACTOME_NEURONAL_SYSTEM                                 0.013726798
LV 5                                                      -0.006147173
LV 6                                                      -0.058201924
                                                 CD14_triad0062_11.CEL
1,REACTOME_MRNA_SPLICING                                    0.06326480
2,SVM Monocytes                                             0.25731682
3,REACTOME_TRANSMISSION_ACROSS_CHEMICAL_SYNAPSES           -0.01583182
4,REACTOME_NEURONAL_SYSTEM                                 -0.04384992
LV 5                                                       -0.00290343
LV 6                                                       -0.02864669
# write to file
iso.b.file <- file.path(results.dir, "E-MTAB-2452_B_matrix_recount2_model.txt")
write.table(iso.b.matrix, file = iso.b.file, sep = "\t", quote = FALSE)

Heatmap

# differences in cell type LVs?
indx.relevant.lv <- c(grep("CD4", rownames(iso.b.matrix)),
                      grep("Monocyte", rownames(iso.b.matrix)),
                      grep("Neutrophil", rownames(iso.b.matrix)))
# get row side color vector matching relevant cell type LVs
row.colors.vec <- c(rep("#1E90EF", sum(grepl("CD4", rownames(iso.b.matrix)))),
                    rep("#000000", 
                        sum(grepl("Monocyte", rownames(iso.b.matrix)))), 
                    rep("#32CD32",
                        sum(grepl("Neutrophil", rownames(iso.b.matrix)))))
# get col side color vector based on what cell type each sample is
col.colors.vec <- rep("white", ncol(iso.b.matrix))
col.colors.vec[grep("CD4", colnames(iso.b.matrix))] <- "#1E90EF"
col.colors.vec[grep("CD14", colnames(iso.b.matrix))] <- "#000000"
col.colors.vec[grep("CD16", colnames(iso.b.matrix))] <- "#32CD32"
# heatmap
gplots::heatmap.2(iso.b.matrix[indx.relevant.lv, ], 
                  trace = "none",
                  col = colorRampPalette(c("blue", "white", "red")),
                  labCol = FALSE, cexRow = 0.75,
                  RowSideColors = row.colors.vec,
                  ColSideColors = col.colors.vec,
                  density.info = "none",
                  margins = c(2.5, 14),
                  main = "Isolated cell populations\nmicroarray",
                  ylab = "recount2 LVs",
                  xlab = "Samples", 
                  colsep = 0:ncol(iso.b.matrix), 
                  rowsep = 0:length(indx.relevant.lv), 
                  sepcolor = "#666666", sepwidth = c(0.001, 0.001))
legend("topright", 
       legend = c("CD4 T cell", "CD14, monocyte", "CD16, neutrophil"),
       col = c("#1E90EF", "#000000", "#32CD32"), cex = 0.5,
       lty = 1, lwd = 6)

# save heatmap as pdf -- can not figure out another way around this, hm just
# returns a list
pdf(file.path(plot.dir, "E-MTAB-2452_recount_PLIER_cell_type_LVs_B.pdf"),
    width = 7, height = 5)
gplots::heatmap.2(iso.b.matrix[indx.relevant.lv, ], 
                  trace = "none",
                  col = colorRampPalette(c("blue", "white", "red")),
                  labCol = FALSE, cexRow = 0.75,
                  RowSideColors = row.colors.vec,
                  ColSideColors = col.colors.vec,
                  density.info = "none",
                  margins = c(2.5, 14),
                  main = "Isolated cell populations\nmicroarray",
                  ylab = "recount2 LVs",
                  xlab = "Samples", 
                  colsep = 0:ncol(iso.b.matrix), 
                  rowsep = 0:length(indx.relevant.lv), 
                  sepcolor = "#666666", sepwidth = c(0.001, 0.001))
legend("topright", 
       legend = c("CD4 T cell", "CD14, monocyte", "CD16, neutrophil"),
       col = c("#1E90EF", "#000000", "#32CD32"), cex = 0.5,
       lty = 1, lwd = 6)
dev.off()
null device 
          1 
LS0tCnRpdGxlOiAiSXNvbGF0ZWQgaW1tdW5lIGNlbGwgcG9wdWxhdGlvbnM6IG1pY3JvYXJyYXkgZGF0YSIKb3V0cHV0OiAgIAogIGh0bWxfbm90ZWJvb2s6IAogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKLS0tCgoqKkouIFRhcm9uaSAyMDE4KioKCltFLU1UQUItMjQ1Ml0oaHR0cHM6Ly93d3cuZWJpLmFjLnVrL2FycmF5ZXhwcmVzcy9leHBlcmltZW50cy9FLU1UQUItMjQ1Mi8pOiAKU29ydGVkIHBlcmlwaGVyYWwgYmxvb2QgY2VsbHMgKENENCsgVCBjZWxscywgQ0QxNCsgbW9ub2N5dGVzLCBDRDE2KyBuZXV0cm9waGlscykKcHJvZmlsZWQgb24gbWljcm9hcnJheSBmcm9tIHNldmVyYWwgYXV0b2ltbXVuZSBkaXNlYXNlcy4KVGhpcyBkYXRhc2V0IGlzIGEgZ29vZCBjb250cm9sIGZvciBmdXJ0aGVyIGludmVzdGlnYXRpbmcgcmVjb3VudDIgUExJRVIgbW9kZWwgCihjcm9zcy1wbGF0Zm9ybSkgdHJhbnNmZXIgbGVhcm5pbmcuCgojIyBGdW5jdGlvbnMgYW5kIHNldCB1cAoKYGBge3J9CmAlPiVgIDwtIGRwbHlyOjpgJT4lYApsaWJyYXJ5KEFubm90YXRpb25EYmkpCiMgY3VzdG9tIGZ1bmN0aW9ucwpzb3VyY2UoZmlsZS5wYXRoKCJ1dGlsIiwgInBsaWVyX3V0aWwuUiIpKQpgYGAKCmBgYHtyfQojIHBsb3QgYW5kIHJlc3VsdCBkaXJlY3Rvcnkgc2V0dXAgZm9yIHRoaXMgbm90ZWJvb2sKcGxvdC5kaXIgPC0gZmlsZS5wYXRoKCJwbG90cyIsICIwMyIpCmRpci5jcmVhdGUocGxvdC5kaXIsIHJlY3Vyc2l2ZSA9IFRSVUUsIHNob3dXYXJuaW5ncyA9IEZBTFNFKQpyZXN1bHRzLmRpciA8LSBmaWxlLnBhdGgoInJlc3VsdHMiLCAiMDMiKQpkaXIuY3JlYXRlKHJlc3VsdHMuZGlyLCByZWN1cnNpdmUgPSBUUlVFLCBzaG93V2FybmluZ3MgPSBGQUxTRSkKYGBgCgojIyBSZWFkIGluIGRhdGEKCiMjIyBgcmVjb3VudDJgIFBMSUVSIG1vZGVsCgpgYGB7cn0KcGxpZXIucmVzdWx0cyA8LSByZWFkUkRTKGZpbGUucGF0aCgiZGF0YSIsICJyZWNvdW50Ml9QTElFUl9kYXRhIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlY291bnRfUExJRVJfbW9kZWwuUkRTIikpCmBgYAoKIyMjIElzb2xhdGVkIGNlbGwgc3Vic2V0cyBtaWNyb2FycmF5IGRhdGEKYGBge3J9CiMgcmVhZCBpbiBFLU1UQUItMjQ1MiBleHByZXNzaW9uIGRhdGEgdGhhdCBoYXMgYmVlbiBwcm9jZXNzZWQgd2l0aCBTQ0FOZmFzdApleHBycy5kZiA8LSByZWFkcjo6cmVhZF90c3YoZmlsZS5wYXRoKCJkYXRhIiwgImV4cHJlc3Npb25fZGF0YSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkUtTVRBQi0yNDUyX2h1Z2VuZTExc3RfU0NBTmZhc3QucGNsIikpCmNvbG5hbWVzKGV4cHJzLmRmKVsxXSA8LSAiRW50cmV6SUQiCmBgYAoKIyMjIyBDb252ZXJzaW9uIHRvIGdlbmUgc3ltYm9sCmBgYHtyfQojIHJlbW92ZSB0cmFpbGluZyAiX2F0IiAocmVzdWx0IG9mIHVzaW5nIEJyYWluQXJyYXkpIHRvIGdldCBFbnRyZXpJRHMKZXhwcnMuZGYkRW50cmV6SUQgPC0gZ3N1YigiX2F0IiwgIiIsIGV4cHJzLmRmJEVudHJleklEKQoKIyBjb252ZXJzaW9uIHRvIGdlbmUgc3ltYm9sCnN5bWJvbC5vYmogPC0gb3JnLkhzLmVnLmRiOjpvcmcuSHMuZWdTWU1CT0wKbWFwcGVkLmdlbmVzIDwtIEFubm90YXRpb25EYmk6Om1hcHBlZGtleXMoc3ltYm9sLm9iaikKc3ltYm9sLmxpc3QgPC0gYXMubGlzdChzeW1ib2wub2JqW21hcHBlZC5nZW5lc10pCnN5bWJvbC5kZiA8LSBhcy5kYXRhLmZyYW1lKGNiaW5kKG5hbWVzKHN5bWJvbC5saXN0KSwgdW5saXN0KHN5bWJvbC5saXN0KSkpCmNvbG5hbWVzKHN5bWJvbC5kZikgPC0gYygiRW50cmV6SUQiLCAiR2VuZVN5bWJvbCIpCgojIGlubmVyIGpvaW4KYW5ub3QuZGF0YSA8LSBkcGx5cjo6aW5uZXJfam9pbihzeW1ib2wuZGYsIGV4cHJzLmRmLCBieSA9ICJFbnRyZXpJRCIpCgojIHJlbW92ZSBvYmplY3RzIG9ubHkgbmVjZXNzYXJ5IGZvciBhbm5vdGF0aW9uCnJtKG1hcHBlZC5nZW5lcywgc3ltYm9sLmxpc3QsIHN5bWJvbC5vYmosIHN5bWJvbC5kZikKCiMgd3JpdGUgdG8gZmlsZQpncy5maWxlIDwtIGZpbGUucGF0aCgiZGF0YSIsICJleHByZXNzaW9uX2RhdGEiLCAKICAgICAgICAgICAgICAgICAgICAgIkUtTVRBQi0yNDUyX2h1Z2VuZTExc3RfU0NBTmZhc3Rfd2l0aF9HZW5lU3ltYm9sLnBjbCIpCnJlYWRyOjp3cml0ZV90c3YoYW5ub3QuZGF0YSwgcGF0aCA9IGdzLmZpbGUpCgojIGdldCBhcyBhIG1hdHJpeCAKZXhwcnMubWF0IDwtIGFzLm1hdHJpeChhbm5vdC5kYXRhWywgMzpuY29sKGFubm90LmRhdGEpXSkKcm93bmFtZXMoZXhwcnMubWF0KSA8LSBhbm5vdC5kYXRhJEdlbmVTeW1ib2wKYGBgCgojIyBBcHBseSByZWNvdW50MiBtb2RlbAoKIyMjIEIgbWF0cml4CmBgYHtyfQppc28uYi5tYXRyaXggPC0gR2V0TmV3RGF0YUIoZXhwcnMubWF0ID0gZXhwcnMubWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxpZXIubW9kZWwgPSBwbGllci5yZXN1bHRzKQpoZWFkKGlzby5iLm1hdHJpeFssIDE6MTBdKQpgYGAKYGBge3J9CiMgd3JpdGUgdG8gZmlsZQppc28uYi5maWxlIDwtIGZpbGUucGF0aChyZXN1bHRzLmRpciwgIkUtTVRBQi0yNDUyX0JfbWF0cml4X3JlY291bnQyX21vZGVsLnR4dCIpCndyaXRlLnRhYmxlKGlzby5iLm1hdHJpeCwgZmlsZSA9IGlzby5iLmZpbGUsIHNlcCA9ICJcdCIsIHF1b3RlID0gRkFMU0UpCmBgYAoKIyMjIEhlYXRtYXAKCmBgYHtyfQojIGRpZmZlcmVuY2VzIGluIGNlbGwgdHlwZSBMVnM/CmluZHgucmVsZXZhbnQubHYgPC0gYyhncmVwKCJDRDQiLCByb3duYW1lcyhpc28uYi5tYXRyaXgpKSwKICAgICAgICAgICAgICAgICAgICAgIGdyZXAoIk1vbm9jeXRlIiwgcm93bmFtZXMoaXNvLmIubWF0cml4KSksCiAgICAgICAgICAgICAgICAgICAgICBncmVwKCJOZXV0cm9waGlsIiwgcm93bmFtZXMoaXNvLmIubWF0cml4KSkpCgojIGdldCByb3cgc2lkZSBjb2xvciB2ZWN0b3IgbWF0Y2hpbmcgcmVsZXZhbnQgY2VsbCB0eXBlIExWcwpyb3cuY29sb3JzLnZlYyA8LSBjKHJlcCgiIzFFOTBFRiIsIHN1bShncmVwbCgiQ0Q0Iiwgcm93bmFtZXMoaXNvLmIubWF0cml4KSkpKSwKICAgICAgICAgICAgICAgICAgICByZXAoIiMwMDAwMDAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgc3VtKGdyZXBsKCJNb25vY3l0ZSIsIHJvd25hbWVzKGlzby5iLm1hdHJpeCkpKSksIAogICAgICAgICAgICAgICAgICAgIHJlcCgiIzMyQ0QzMiIsCiAgICAgICAgICAgICAgICAgICAgICAgIHN1bShncmVwbCgiTmV1dHJvcGhpbCIsIHJvd25hbWVzKGlzby5iLm1hdHJpeCkpKSkpCgojIGdldCBjb2wgc2lkZSBjb2xvciB2ZWN0b3IgYmFzZWQgb24gd2hhdCBjZWxsIHR5cGUgZWFjaCBzYW1wbGUgaXMKY29sLmNvbG9ycy52ZWMgPC0gcmVwKCJ3aGl0ZSIsIG5jb2woaXNvLmIubWF0cml4KSkKY29sLmNvbG9ycy52ZWNbZ3JlcCgiQ0Q0IiwgY29sbmFtZXMoaXNvLmIubWF0cml4KSldIDwtICIjMUU5MEVGIgpjb2wuY29sb3JzLnZlY1tncmVwKCJDRDE0IiwgY29sbmFtZXMoaXNvLmIubWF0cml4KSldIDwtICIjMDAwMDAwIgpjb2wuY29sb3JzLnZlY1tncmVwKCJDRDE2IiwgY29sbmFtZXMoaXNvLmIubWF0cml4KSldIDwtICIjMzJDRDMyIgoKIyBoZWF0bWFwCmdwbG90czo6aGVhdG1hcC4yKGlzby5iLm1hdHJpeFtpbmR4LnJlbGV2YW50Lmx2LCBdLCAKICAgICAgICAgICAgICAgICAgdHJhY2UgPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgIGNvbCA9IGNvbG9yUmFtcFBhbGV0dGUoYygiYmx1ZSIsICJ3aGl0ZSIsICJyZWQiKSksCiAgICAgICAgICAgICAgICAgIGxhYkNvbCA9IEZBTFNFLCBjZXhSb3cgPSAwLjc1LAogICAgICAgICAgICAgICAgICBSb3dTaWRlQ29sb3JzID0gcm93LmNvbG9ycy52ZWMsCiAgICAgICAgICAgICAgICAgIENvbFNpZGVDb2xvcnMgPSBjb2wuY29sb3JzLnZlYywKICAgICAgICAgICAgICAgICAgZGVuc2l0eS5pbmZvID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICBtYXJnaW5zID0gYygyLjUsIDE0KSwKICAgICAgICAgICAgICAgICAgbWFpbiA9ICJJc29sYXRlZCBjZWxsIHBvcHVsYXRpb25zXG5taWNyb2FycmF5IiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJyZWNvdW50MiBMVnMiLAogICAgICAgICAgICAgICAgICB4bGFiID0gIlNhbXBsZXMiLCAKICAgICAgICAgICAgICAgICAgY29sc2VwID0gMDpuY29sKGlzby5iLm1hdHJpeCksIAogICAgICAgICAgICAgICAgICByb3dzZXAgPSAwOmxlbmd0aChpbmR4LnJlbGV2YW50Lmx2KSwgCiAgICAgICAgICAgICAgICAgIHNlcGNvbG9yID0gIiM2NjY2NjYiLCBzZXB3aWR0aCA9IGMoMC4wMDEsIDAuMDAxKSkKbGVnZW5kKCJ0b3ByaWdodCIsIAogICAgICAgbGVnZW5kID0gYygiQ0Q0IFQgY2VsbCIsICJDRDE0LCBtb25vY3l0ZSIsICJDRDE2LCBuZXV0cm9waGlsIiksCiAgICAgICBjb2wgPSBjKCIjMUU5MEVGIiwgIiMwMDAwMDAiLCAiIzMyQ0QzMiIpLCBjZXggPSAwLjUsCiAgICAgICBsdHkgPSAxLCBsd2QgPSA2KQpgYGAKYGBge3J9CiMgc2F2ZSBoZWF0bWFwIGFzIHBkZiAtLSBjYW4gbm90IGZpZ3VyZSBvdXQgYW5vdGhlciB3YXkgYXJvdW5kIHRoaXMsIGhtIGp1c3QKIyByZXR1cm5zIGEgbGlzdApwZGYoZmlsZS5wYXRoKHBsb3QuZGlyLCAiRS1NVEFCLTI0NTJfcmVjb3VudF9QTElFUl9jZWxsX3R5cGVfTFZzX0IucGRmIiksCiAgICB3aWR0aCA9IDcsIGhlaWdodCA9IDUpCmdwbG90czo6aGVhdG1hcC4yKGlzby5iLm1hdHJpeFtpbmR4LnJlbGV2YW50Lmx2LCBdLCAKICAgICAgICAgICAgICAgICAgdHJhY2UgPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgIGNvbCA9IGNvbG9yUmFtcFBhbGV0dGUoYygiYmx1ZSIsICJ3aGl0ZSIsICJyZWQiKSksCiAgICAgICAgICAgICAgICAgIGxhYkNvbCA9IEZBTFNFLCBjZXhSb3cgPSAwLjc1LAogICAgICAgICAgICAgICAgICBSb3dTaWRlQ29sb3JzID0gcm93LmNvbG9ycy52ZWMsCiAgICAgICAgICAgICAgICAgIENvbFNpZGVDb2xvcnMgPSBjb2wuY29sb3JzLnZlYywKICAgICAgICAgICAgICAgICAgZGVuc2l0eS5pbmZvID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICBtYXJnaW5zID0gYygyLjUsIDE0KSwKICAgICAgICAgICAgICAgICAgbWFpbiA9ICJJc29sYXRlZCBjZWxsIHBvcHVsYXRpb25zXG5taWNyb2FycmF5IiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJyZWNvdW50MiBMVnMiLAogICAgICAgICAgICAgICAgICB4bGFiID0gIlNhbXBsZXMiLCAKICAgICAgICAgICAgICAgICAgY29sc2VwID0gMDpuY29sKGlzby5iLm1hdHJpeCksIAogICAgICAgICAgICAgICAgICByb3dzZXAgPSAwOmxlbmd0aChpbmR4LnJlbGV2YW50Lmx2KSwgCiAgICAgICAgICAgICAgICAgIHNlcGNvbG9yID0gIiM2NjY2NjYiLCBzZXB3aWR0aCA9IGMoMC4wMDEsIDAuMDAxKSkKbGVnZW5kKCJ0b3ByaWdodCIsIAogICAgICAgbGVnZW5kID0gYygiQ0Q0IFQgY2VsbCIsICJDRDE0LCBtb25vY3l0ZSIsICJDRDE2LCBuZXV0cm9waGlsIiksCiAgICAgICBjb2wgPSBjKCIjMUU5MEVGIiwgIiMwMDAwMDAiLCAiIzMyQ0QzMiIpLCBjZXggPSAwLjUsCiAgICAgICBsdHkgPSAxLCBsd2QgPSA2KQpkZXYub2ZmKCkKYGBgCgo=