We’ll use limma to identify genes that are differentially expressed between microarray and RNA-seq samples in the test compendium.

Note that I had to roll back the R version here to get Rsamtools to install. This will be captured by sessionInfo() below.

Set up

`%>%` <- dplyr::`%>%`
library(limma)
library(GenomicRanges)
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 object is masked from ‘package:limma’:

    plotMA

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: S4Vectors

Attaching package: ‘S4Vectors’

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

    expand.grid

Loading required package: IRanges
Loading required package: GenomeInfoDb
library(rtracklayer)
library(Rsamtools)
Loading required package: Biostrings
Loading required package: XVector

Attaching package: ‘Biostrings’

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

    strsplit
results_dir <- "results"
dir.create(results_dir, showWarnings = FALSE)

Read in data

Test compendium expression matrix

exprs_mat_file <- file.path("data", "larger_compendium_exprs_mat.RDS")
exprs_mat <- readRDS(exprs_mat_file)

Generate technology labels using the sample names

sample_names <- colnames(exprs_mat)
compendium_technology_labels <- rep("MICROARRAY", length(sample_names))
compendium_technology_labels[grep("SRR|ERR|DRR", sample_names)] <- "RNASEQ"

Differential expression

Test for genes that are differentially expressed between technologies

design_matrix <- model.matrix(~ compendium_technology_labels)
fit <- lmFit(exprs_mat, design = design_matrix)
fit2 <- eBayes(fit)
diff_exp_stats <- topTable(fit2, number = nrow(exprs_mat)) %>%
  as.data.frame() %>%
  tibble::rownames_to_column("Gene")
Removing intercept from test coefficients

Save to file

readr::write_tsv(diff_exp_stats, 
                 file.path(results_dir, 
                           "larger_compendium_diff_exprs_technologies.tsv"))

Let’s take a peak at the “top” differentially expressed genes.

diff_exp_stats %>%
  dplyr::filter(adj.P.Val < 0.00001) %>%
  dplyr::arrange(`t`) %>%
  head()
data.frame(
  expression_value = exprs_mat["ENSDARG00000098608", ],
  technology = compendium_technology_labels
) %>%
  ggplot2::ggplot(ggplot2::aes(x = technology, y = expression_value)) +
  ggplot2::geom_boxplot() +
  ggplot2::labs(title = "ENSDARG00000098608", subtitle = "t = -234.7375") +
  ggplot2::theme_bw()

Genes with negative t values have lower values in RNA-seq samples.

Let’s take a look at the genes that have higher values in RNA-seq samples (positive t).

diff_exp_stats %>%
  dplyr::filter(adj.P.Val < 0.00001) %>%
  dplyr::arrange(`t`) %>%
  tail()
data.frame(
  expression_value = exprs_mat["ENSDARG00000060767", ],
  technology = compendium_technology_labels
) %>%
  ggplot2::ggplot(ggplot2::aes(x = technology, y = expression_value)) +
  ggplot2::geom_boxplot() +
  ggplot2::labs(title = "ENSDARG00000060767", subtitle = "t = 165.2244") +
  ggplot2::theme_bw()

Relationship with gene lengths?

Is there any relationship between the length of a gene and its t statistic?

GRCz11 related files were obtained in 00-data_download.sh

Adapted from: https://github.com/dpryan79/Answers/blob/d2d7366fec907fd92ccf03e77c2d53cfe45b02c9/SEQanswers_42420/GTF2LengthGC.R

See also: https://bioinformatics.stackexchange.com/questions/2567/how-can-i-calculate-gene-length-for-rpkm-calculation-from-counts-data

Non-duplicated exons from each gene are summed up to get the length (“union gene model”).

# obtained in 00-data_download.sh
gtf_file <- file.path("data", "GRCz11", "Danio_rerio.GRCz11.95.gtf")
# Load the annotation and reduce it -- filtering for exons
gtf <- import.gff(gtf_file, format = "gtf", genome = "GRCz11.95", 
                  feature.type = "exon")
grl <- reduce(split(gtf, elementMetadata(gtf)$gene_id))
reduced_gtf <- unlist(grl, use.names = TRUE)
elementMetadata(reduced_gtf)$gene_id <- rep(names(grl), elementNROWS(grl))
# add the widths to the metadata slot -- number of values in the range
elementMetadata(reduced_gtf)$widths <- width(reduced_gtf)
output <- t(sapply(
  split(reduced_gtf, elementMetadata(reduced_gtf)$gene_id), 
  # for each gene sum exon widths
  function(x) sum(elementMetadata(x)$widths)))
output[, 1:5]
ENSDARG00000000001 ENSDARG00000000002 ENSDARG00000000018 ENSDARG00000000019 ENSDARG00000000068 
              2476               2604               3013               2758               2397 
gene_lengths_df <- data.frame(Gene = colnames(output),
                              gene_length = output[1, ])
readr::write_tsv(gene_lengths_df, 
                 file.path("data", 
                           "Danio_rerio.GRCz11_gene_lengths_exons.tsv"))
# if one already had the gene lengths file, it could be loaded:
# gene_lengths_df <-
#   readr::read_tsv(file.path("data", 
#                             "Danio_rerio.GRCz11_gene_names_and_lengths.tsv"),
#                   col_names = FALSE) %>%
#   dplyr::mutate(X1 = sub("gene:", "", X1))

Join the t-statistic with the gene lengths and make a scatterplot

dplyr::inner_join(diff_exp_stats, gene_lengths_df, 
                  by = "Gene") %>%
  dplyr::select(c("Gene", "t", "gene_length")) %>%
  ggplot2::ggplot(ggplot2::aes(x = `t`, y = gene_length)) +
  ggplot2::geom_point(alpha = 0.2) +
  ggplot2::geom_smooth() +
  ggplot2::theme_bw() +
  ggplot2::labs(x = "t statistic", y = "gene length")
Column `Gene` joining character vector and factor, coercing into character vector

As noted above:

Genes with negative t values have lower values in RNA-seq samples.

So longer genes tend to have higher expression values in RNA-seq data.

scatter_file <- file.path("plots", "larger_compendium_tstat_length_scatter.png")
ggplot2::ggsave(filename = scatter_file,
                plot = ggplot2::last_plot())
Saving 7 x 7 in image

Session info

sessionInfo()
R version 3.4.4 (2018-03-15)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Debian GNU/Linux 9 (stretch)

Matrix products: default
BLAS: /usr/lib/openblas-base/libblas.so.3
LAPACK: /usr/lib/libopenblasp-r0.2.19.so

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8     LC_MONETARY=en_US.UTF-8   
 [6] LC_MESSAGES=C              LC_PAPER=en_US.UTF-8       LC_NAME=C                  LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] parallel  stats4    stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] bindrcpp_0.2.2       Rsamtools_1.30.0     Biostrings_2.46.0    XVector_0.18.0       rtracklayer_1.38.3   GenomicRanges_1.30.3
 [7] GenomeInfoDb_1.14.0  IRanges_2.12.0       S4Vectors_0.16.0     BiocGenerics_0.24.0  limma_3.34.9        

loaded via a namespace (and not attached):
 [1] SummarizedExperiment_1.8.1 lattice_0.20-35            colorspace_1.3-2           htmltools_0.3.6            yaml_2.1.18               
 [6] mgcv_1.8-23                base64enc_0.1-3            XML_3.98-1.11              rlang_0.2.0                pillar_1.2.1              
[11] glue_1.2.0                 BiocParallel_1.12.0        matrixStats_0.54.0         GenomeInfoDbData_1.0.0     bindr_0.1.1               
[16] plyr_1.8.4                 stringr_1.3.0              zlibbioc_1.24.0            munsell_0.4.3              gtable_0.2.0              
[21] evaluate_0.10.1            labeling_0.3               Biobase_2.38.0             knitr_1.20                 Rcpp_0.12.16              
[26] readr_1.1.1                scales_0.5.0               backports_1.1.2            DelayedArray_0.4.1         jsonlite_1.5              
[31] ggplot2_2.2.1              hms_0.4.2                  digest_0.6.15              stringi_1.1.7              dplyr_0.7.4               
[36] grid_3.4.4                 rprojroot_1.3-2            tools_3.4.4                bitops_1.0-6               magrittr_1.5              
[41] lazyeval_0.2.1             RCurl_1.95-4.11            tibble_1.4.2               pkgconfig_2.0.1            Matrix_1.2-12             
[46] assertthat_0.2.0           rmarkdown_1.9              R6_2.2.2                   GenomicAlignments_1.14.2   nlme_3.1-131.1            
[51] compiler_3.4.4            
LS0tCnRpdGxlOiAiV2hhdCBnZW5lcyBhcmUgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGJldHdlZW4gdGVjaG5vbG9naWVzPyIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgdG9jOiBUUlVFCiAgICB0b2NfZmxvYXQ6IFRSVUUKYXV0aG9yOiBKLiBUYXJvbmkgZm9yIENDREwKZGF0ZTogMjAxOQotLS0KCldlJ2xsIHVzZSBgbGltbWFgIHRvIGlkZW50aWZ5IGdlbmVzIHRoYXQgYXJlIGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBiZXR3ZWVuCm1pY3JvYXJyYXkgYW5kIFJOQS1zZXEgc2FtcGxlcyBpbiB0aGUgdGVzdCBjb21wZW5kaXVtLgoKTm90ZSB0aGF0IEkgaGFkIHRvIHJvbGwgYmFjayB0aGUgUiB2ZXJzaW9uIGhlcmUgdG8gZ2V0IGBSc2FtdG9vbHNgIHRvIGluc3RhbGwuClRoaXMgd2lsbCBiZSBjYXB0dXJlZCBieSBgc2Vzc2lvbkluZm8oKWAgYmVsb3cuCgojIyBTZXQgdXAKCmBgYHtyfQpgJT4lYCA8LSBkcGx5cjo6YCU+JWAKYGBgCgpgYGB7cn0KbGlicmFyeShsaW1tYSkKbGlicmFyeShHZW5vbWljUmFuZ2VzKQpsaWJyYXJ5KHJ0cmFja2xheWVyKQpsaWJyYXJ5KFJzYW10b29scykKYGBgCgpgYGB7cn0KcmVzdWx0c19kaXIgPC0gInJlc3VsdHMiCmRpci5jcmVhdGUocmVzdWx0c19kaXIsIHNob3dXYXJuaW5ncyA9IEZBTFNFKQpgYGAKCiMjIFJlYWQgaW4gZGF0YQoKVGVzdCBjb21wZW5kaXVtIGV4cHJlc3Npb24gbWF0cml4CgpgYGB7cn0KZXhwcnNfbWF0X2ZpbGUgPC0gZmlsZS5wYXRoKCJkYXRhIiwgImxhcmdlcl9jb21wZW5kaXVtX2V4cHJzX21hdC5SRFMiKQpleHByc19tYXQgPC0gcmVhZFJEUyhleHByc19tYXRfZmlsZSkKYGBgCgpHZW5lcmF0ZSB0ZWNobm9sb2d5IGxhYmVscyB1c2luZyB0aGUgc2FtcGxlIG5hbWVzCgpgYGB7cn0Kc2FtcGxlX25hbWVzIDwtIGNvbG5hbWVzKGV4cHJzX21hdCkKY29tcGVuZGl1bV90ZWNobm9sb2d5X2xhYmVscyA8LSByZXAoIk1JQ1JPQVJSQVkiLCBsZW5ndGgoc2FtcGxlX25hbWVzKSkKY29tcGVuZGl1bV90ZWNobm9sb2d5X2xhYmVsc1tncmVwKCJTUlJ8RVJSfERSUiIsIHNhbXBsZV9uYW1lcyldIDwtICJSTkFTRVEiCmBgYAoKIyMgRGlmZmVyZW50aWFsIGV4cHJlc3Npb24KClRlc3QgZm9yIGdlbmVzIHRoYXQgYXJlIGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBiZXR3ZWVuIHRlY2hub2xvZ2llcwoKYGBge3J9CmRlc2lnbl9tYXRyaXggPC0gbW9kZWwubWF0cml4KH4gY29tcGVuZGl1bV90ZWNobm9sb2d5X2xhYmVscykKZml0IDwtIGxtRml0KGV4cHJzX21hdCwgZGVzaWduID0gZGVzaWduX21hdHJpeCkKZml0MiA8LSBlQmF5ZXMoZml0KQpkaWZmX2V4cF9zdGF0cyA8LSB0b3BUYWJsZShmaXQyLCBudW1iZXIgPSBucm93KGV4cHJzX21hdCkpICU+JQogIGFzLmRhdGEuZnJhbWUoKSAlPiUKICB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbigiR2VuZSIpCmBgYAoKU2F2ZSB0byBmaWxlCgpgYGB7cn0KcmVhZHI6OndyaXRlX3RzdihkaWZmX2V4cF9zdGF0cywgCiAgICAgICAgICAgICAgICAgZmlsZS5wYXRoKHJlc3VsdHNfZGlyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhcmdlcl9jb21wZW5kaXVtX2RpZmZfZXhwcnNfdGVjaG5vbG9naWVzLnRzdiIpKQpgYGAKCkxldCdzIHRha2UgYSBwZWFrIGF0IHRoZSAidG9wIiBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQgZ2VuZXMuCgpgYGB7cn0KZGlmZl9leHBfc3RhdHMgJT4lCiAgZHBseXI6OmZpbHRlcihhZGouUC5WYWwgPCAwLjAwMDAxKSAlPiUKICBkcGx5cjo6YXJyYW5nZShgdGApICU+JQogIGhlYWQoKQpgYGAKCmBgYHtyfQpkYXRhLmZyYW1lKAogIGV4cHJlc3Npb25fdmFsdWUgPSBleHByc19tYXRbIkVOU0RBUkcwMDAwMDA5ODYwOCIsIF0sCiAgdGVjaG5vbG9neSA9IGNvbXBlbmRpdW1fdGVjaG5vbG9neV9sYWJlbHMKKSAlPiUKICBnZ3Bsb3QyOjpnZ3Bsb3QoZ2dwbG90Mjo6YWVzKHggPSB0ZWNobm9sb2d5LCB5ID0gZXhwcmVzc2lvbl92YWx1ZSkpICsKICBnZ3Bsb3QyOjpnZW9tX2JveHBsb3QoKSArCiAgZ2dwbG90Mjo6bGFicyh0aXRsZSA9ICJFTlNEQVJHMDAwMDAwOTg2MDgiLCBzdWJ0aXRsZSA9ICJ0ID0gLTIzNC43Mzc1IikgKwogIGdncGxvdDI6OnRoZW1lX2J3KCkKYGBgCgpHZW5lcyB3aXRoIG5lZ2F0aXZlIGB0YCB2YWx1ZXMgaGF2ZSBsb3dlciB2YWx1ZXMgaW4gUk5BLXNlcSBzYW1wbGVzLgoKTGV0J3MgdGFrZSBhIGxvb2sgYXQgdGhlIGdlbmVzIHRoYXQgaGF2ZSBoaWdoZXIgdmFsdWVzIGluIFJOQS1zZXEgc2FtcGxlcyAKKHBvc2l0aXZlIGB0YCkuCgpgYGB7cn0KZGlmZl9leHBfc3RhdHMgJT4lCiAgZHBseXI6OmZpbHRlcihhZGouUC5WYWwgPCAwLjAwMDAxKSAlPiUKICBkcGx5cjo6YXJyYW5nZShgdGApICU+JQogIHRhaWwoKQpgYGAKCmBgYHtyfQpkYXRhLmZyYW1lKAogIGV4cHJlc3Npb25fdmFsdWUgPSBleHByc19tYXRbIkVOU0RBUkcwMDAwMDA2MDc2NyIsIF0sCiAgdGVjaG5vbG9neSA9IGNvbXBlbmRpdW1fdGVjaG5vbG9neV9sYWJlbHMKKSAlPiUKICBnZ3Bsb3QyOjpnZ3Bsb3QoZ2dwbG90Mjo6YWVzKHggPSB0ZWNobm9sb2d5LCB5ID0gZXhwcmVzc2lvbl92YWx1ZSkpICsKICBnZ3Bsb3QyOjpnZW9tX2JveHBsb3QoKSArCiAgZ2dwbG90Mjo6bGFicyh0aXRsZSA9ICJFTlNEQVJHMDAwMDAwNjA3NjciLCBzdWJ0aXRsZSA9ICJ0ID0gMTY1LjIyNDQiKSArCiAgZ2dwbG90Mjo6dGhlbWVfYncoKQpgYGAKCiMjIyBSZWxhdGlvbnNoaXAgd2l0aCBnZW5lIGxlbmd0aHM/CgpJcyB0aGVyZSBhbnkgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIGxlbmd0aCBvZiBhIGdlbmUgYW5kIGl0cyBgdGAgc3RhdGlzdGljPwoKYEdSQ3oxMWAgcmVsYXRlZCBmaWxlcyB3ZXJlIG9idGFpbmVkIGluIGAwMC1kYXRhX2Rvd25sb2FkLnNoYAoKQWRhcHRlZCBmcm9tOgpodHRwczovL2dpdGh1Yi5jb20vZHByeWFuNzkvQW5zd2Vycy9ibG9iL2QyZDczNjZmZWM5MDdmZDkyY2NmMDNlNzdjMmQ1M2NmZTQ1YjAyYzkvU0VRYW5zd2Vyc180MjQyMC9HVEYyTGVuZ3RoR0MuUgoKU2VlIGFsc286IGh0dHBzOi8vYmlvaW5mb3JtYXRpY3Muc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzI1NjcvaG93LWNhbi1pLWNhbGN1bGF0ZS1nZW5lLWxlbmd0aC1mb3ItcnBrbS1jYWxjdWxhdGlvbi1mcm9tLWNvdW50cy1kYXRhCgpOb24tZHVwbGljYXRlZCBleG9ucyBmcm9tIGVhY2ggZ2VuZSBhcmUgc3VtbWVkIHVwIHRvIGdldCB0aGUgbGVuZ3RoIAooInVuaW9uIGdlbmUgbW9kZWwiKS4KCmBgYHtyfQojIG9idGFpbmVkIGluIDAwLWRhdGFfZG93bmxvYWQuc2gKZ3RmX2ZpbGUgPC0gZmlsZS5wYXRoKCJkYXRhIiwgIkdSQ3oxMSIsICJEYW5pb19yZXJpby5HUkN6MTEuOTUuZ3RmIikKCiMgTG9hZCB0aGUgYW5ub3RhdGlvbiBhbmQgcmVkdWNlIGl0IC0tIGZpbHRlcmluZyBmb3IgZXhvbnMKZ3RmIDwtIGltcG9ydC5nZmYoZ3RmX2ZpbGUsIGZvcm1hdCA9ICJndGYiLCBnZW5vbWUgPSAiR1JDejExLjk1IiwgCiAgICAgICAgICAgICAgICAgIGZlYXR1cmUudHlwZSA9ICJleG9uIikKZ3JsIDwtIHJlZHVjZShzcGxpdChndGYsIGVsZW1lbnRNZXRhZGF0YShndGYpJGdlbmVfaWQpKQpyZWR1Y2VkX2d0ZiA8LSB1bmxpc3QoZ3JsLCB1c2UubmFtZXMgPSBUUlVFKQplbGVtZW50TWV0YWRhdGEocmVkdWNlZF9ndGYpJGdlbmVfaWQgPC0gcmVwKG5hbWVzKGdybCksIGVsZW1lbnROUk9XUyhncmwpKQoKIyBhZGQgdGhlIHdpZHRocyB0byB0aGUgbWV0YWRhdGEgc2xvdCAtLSBudW1iZXIgb2YgdmFsdWVzIGluIHRoZSByYW5nZQplbGVtZW50TWV0YWRhdGEocmVkdWNlZF9ndGYpJHdpZHRocyA8LSB3aWR0aChyZWR1Y2VkX2d0ZikKb3V0cHV0IDwtIHQoc2FwcGx5KAogIHNwbGl0KHJlZHVjZWRfZ3RmLCBlbGVtZW50TWV0YWRhdGEocmVkdWNlZF9ndGYpJGdlbmVfaWQpLCAKICAjIGZvciBlYWNoIGdlbmUgc3VtIGV4b24gd2lkdGhzCiAgZnVuY3Rpb24oeCkgc3VtKGVsZW1lbnRNZXRhZGF0YSh4KSR3aWR0aHMpKSkKb3V0cHV0WywgMTo1XQpgYGAKCmBgYHtyfQpnZW5lX2xlbmd0aHNfZGYgPC0gZGF0YS5mcmFtZShHZW5lID0gY29sbmFtZXMob3V0cHV0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZV9sZW5ndGggPSBvdXRwdXRbMSwgXSkKcmVhZHI6OndyaXRlX3RzdihnZW5lX2xlbmd0aHNfZGYsIAogICAgICAgICAgICAgICAgIGZpbGUucGF0aCgiZGF0YSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAiRGFuaW9fcmVyaW8uR1JDejExX2dlbmVfbGVuZ3Roc19leG9ucy50c3YiKSkKYGBgCgpgYGB7cn0KIyBpZiBvbmUgYWxyZWFkeSBoYWQgdGhlIGdlbmUgbGVuZ3RocyBmaWxlLCBpdCBjb3VsZCBiZSBsb2FkZWQ6CiMgZ2VuZV9sZW5ndGhzX2RmIDwtCiMgICByZWFkcjo6cmVhZF90c3YoZmlsZS5wYXRoKCJkYXRhIiwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEYW5pb19yZXJpby5HUkN6MTFfZ2VuZV9uYW1lc19hbmRfbGVuZ3Rocy50c3YiKSwKIyAgICAgICAgICAgICAgICAgICBjb2xfbmFtZXMgPSBGQUxTRSkgJT4lCiMgICBkcGx5cjo6bXV0YXRlKFgxID0gc3ViKCJnZW5lOiIsICIiLCBYMSkpCmBgYAoKSm9pbiB0aGUgdC1zdGF0aXN0aWMgd2l0aCB0aGUgZ2VuZSBsZW5ndGhzIGFuZCBtYWtlIGEgc2NhdHRlcnBsb3QKCmBgYHtyfQpkcGx5cjo6aW5uZXJfam9pbihkaWZmX2V4cF9zdGF0cywgZ2VuZV9sZW5ndGhzX2RmLCAKICAgICAgICAgICAgICAgICAgYnkgPSAiR2VuZSIpICU+JQogIGRwbHlyOjpzZWxlY3QoYygiR2VuZSIsICJ0IiwgImdlbmVfbGVuZ3RoIikpICU+JQogIGdncGxvdDI6OmdncGxvdChnZ3Bsb3QyOjphZXMoeCA9IGB0YCwgeSA9IGdlbmVfbGVuZ3RoKSkgKwogIGdncGxvdDI6Omdlb21fcG9pbnQoYWxwaGEgPSAwLjIpICsKICBnZ3Bsb3QyOjpnZW9tX3Ntb290aCgpICsKICBnZ3Bsb3QyOjp0aGVtZV9idygpICsKICBnZ3Bsb3QyOjpsYWJzKHggPSAidCBzdGF0aXN0aWMiLCB5ID0gImdlbmUgbGVuZ3RoIikKYGBgCgpBcyBub3RlZCBhYm92ZToKCj4gR2VuZXMgd2l0aCBuZWdhdGl2ZSBgdGAgdmFsdWVzIGhhdmUgbG93ZXIgdmFsdWVzIGluIFJOQS1zZXEgc2FtcGxlcy4KClNvIGxvbmdlciBnZW5lcyB0ZW5kIHRvIGhhdmUgaGlnaGVyIGV4cHJlc3Npb24gdmFsdWVzIGluIFJOQS1zZXEgZGF0YS4KCmBgYHtyfQpzY2F0dGVyX2ZpbGUgPC0gZmlsZS5wYXRoKCJwbG90cyIsICJsYXJnZXJfY29tcGVuZGl1bV90c3RhdF9sZW5ndGhfc2NhdHRlci5wbmciKQpnZ3Bsb3QyOjpnZ3NhdmUoZmlsZW5hbWUgPSBzY2F0dGVyX2ZpbGUsCiAgICAgICAgICAgICAgICBwbG90ID0gZ2dwbG90Mjo6bGFzdF9wbG90KCkpCmBgYAoKIyMgU2Vzc2lvbiBpbmZvCgpgYGB7cn0Kc2Vzc2lvbkluZm8oKQpgYGAKCg==