1 Introduction

This is a very preliminary look into how we might combine our library of human infected samples with a set of (mostly macrophage) samples which I downloaded from the SRA. The current data is comprised of ~ 370 samples salmon mapped against hg38 revision 91.

2 Annotation data for download human data.

This short document should gather the annotation data required for playing with the data downloaded from SRA and friends.

hs_gff <- "reference/hg38_91.gff"
hs_gff_annot <- sm(load_gff_annotations(hs_gff, id_col="gene_id"))
hs_annot <- sm(load_biomart_annotations())$annotation
hs_annot$ID <- hs_annot$geneID
rownames(hs_annot) <- make.names(hs_annot[["ensembl_gene_id"]], unique=TRUE)
dim(hs_annot)
## [1] 197995     12
hs_size_dist <- plot_histogram(hs_annot[["cds_length"]])
hs_size_dist +
  ggplot2::scale_x_continuous(limits=c(0, 20000))
## Warning: Removed 103681 rows containing non-finite values (stat_bin).
## Warning: Removed 103681 rows containing non-finite values (stat_density).
## Warning: Removed 2 rows containing missing values (geom_bar).

hs_go_biomart <- sm(load_biomart_go())

hs_lengths <- hs_annot[, c("ensembl_gene_id", "cds_length")]
colnames(hs_lengths) <- c("ID", "width")

rownames(hs_annot) <- make.names(
  paste0(hs_annot[["ensembl_transcript_id"]], ".",
         hs_annot[["transcript_version"]]),
  unique=TRUE)
hs_tx_gene <- hs_annot[, c("ensembl_gene_id", "ensembl_transcript_id")]
hs_tx_gene[["id"]] <- rownames(hs_tx_gene)
hs_tx_gene <- hs_tx_gene[, c("id", "ensembl_gene_id")]
new_hs_annot <- hs_annot
rownames(new_hs_annot) <- make.names(hs_annot[["ensembl_gene_id"]], unique=TRUE)
hs_expt <- create_expt("sample_sheets/all_samples_202104.xlsx",
                       gene_info=new_hs_annot,
                       tx_gene_map=hs_tx_gene,
                       file_column="salmonfile")
## Reading the sample metadata.
## The sample definitions comprises: 369 rows(samples) and 62 columns(metadata fields).
## Reading count tables.
## Using the transcript to gene mapping.
## Reading salmon data with tximport.
## Finished reading count data.
## Matched 19629 annotations and counts.
## Bringing together the count matrix and gene information.
## The mapped IDs are not the rownames of your gene information, changing them now.
## Some annotations were lost in merging, setting them to 'undefined'.
## Saving the expressionset to 'expt.rda'.
## The final expressionset has 19629 rows and 369 columns.
cds_entries <- fData(hs_expt)
cds_entries <- cds_entries[["gene_biotype"]] == "protein_coding"
hs_cds_expt <- hs_expt
hs_cds_expt$expressionset <- hs_cds_expt$expressionset[cds_entries, ]
new_cds_entries <- fData(hs_cds_expt)

3 Initial plots

Najib loves his PCA!

plot_nonzero(hs_cds_expt)$plot
## Warning: ggrepel: 360 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

hs_cds_norm <- normalize_expt(hs_cds_expt, transform = "log2", convert = "cpm",
                              norm = "quant", filter = TRUE)
## Removing 0 low-count genes (19201 remaining).
## transform_counts: Found 6662 values equal to 0, adding 1 to the matrix.
hs_cds_pca <- plot_pca(hs_cds_norm)
## plot labels was not set and there are more than 100 samples, disabling it.
hs_cds_pca$plot
## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure
## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure

hs_cds_nb <- normalize_expt(hs_cds_expt, transform = "log2", convert = "cpm",
                            filter = "simple", batch = "svaseq")
## Removing 54 low-count genes (19147 remaining).
## batch_counts: Before batch/surrogate estimation, 1921423 entries are x==0: 27%.
## batch_counts: Before batch/surrogate estimation, 965762 entries are 0<x<1: 14%.
## Setting 526138 low elements to zero.
## transform_counts: Found 526138 values equal to 0, adding 1 to the matrix.
hs_cds_nb_pca <- plot_pca(hs_cds_nb)
## plot labels was not set and there are more than 100 samples, disabling it.
hs_cds_nb_pca$plot

pander::pander(sessionInfo())

R version 4.0.3 (2020-10-10)

Platform: x86_64-pc-linux-gnu (64-bit)

locale: 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, LC_MESSAGES=en_US.UTF-8, LC_PAPER=en_US.UTF-8, LC_NAME=C, LC_ADDRESS=C, LC_TELEPHONE=C, LC_MEASUREMENT=en_US.UTF-8 and LC_IDENTIFICATION=C

attached base packages: parallel, stats, graphics, grDevices, utils, datasets, methods and base

other attached packages: ruv(v.0.9.7.1), hpgltools(v.1.0), testthat(v.3.0.2), R6(v.2.5.0), Biobase(v.2.50.0) and BiocGenerics(v.0.36.0)

loaded via a namespace (and not attached): utf8(v.1.1.4), tidyselect(v.1.1.0), lme4(v.1.1-26), RSQLite(v.2.2.3), AnnotationDbi(v.1.52.0), grid(v.4.0.3), BiocParallel(v.1.24.1), devtools(v.2.3.2), scatterpie(v.0.1.5), munsell(v.0.5.0), preprocessCore(v.1.52.1), codetools(v.0.2-18), statmod(v.1.4.35), withr(v.2.4.1), colorspace(v.2.0-0), GOSemSim(v.2.16.1), highr(v.0.8), knitr(v.1.31), rstudioapi(v.0.13), stats4(v.4.0.3), DOSE(v.3.16.0), MatrixGenerics(v.1.2.1), labeling(v.0.4.2), tximport(v.1.18.0), GenomeInfoDbData(v.1.2.4), polyclip(v.1.10-0), bit64(v.4.0.5), farver(v.2.0.3), rprojroot(v.2.0.2), downloader(v.0.4), vctrs(v.0.3.6), generics(v.0.1.0), xfun(v.0.21), BiocFileCache(v.1.14.0), doParallel(v.1.0.16), GenomeInfoDb(v.1.26.2), graphlayouts(v.0.7.1), locfit(v.1.5-9.4), bitops(v.1.0-6), cachem(v.1.0.4), fgsea(v.1.16.0), DelayedArray(v.0.16.1), assertthat(v.0.2.1), scales(v.1.1.1), ggraph(v.2.0.5), enrichplot(v.1.10.2), gtable(v.0.3.0), sva(v.3.38.0), processx(v.3.4.5), tidygraph(v.1.2.0), rlang(v.0.4.10), genefilter(v.1.72.1), splines(v.4.0.3), rtracklayer(v.1.50.0), broom(v.0.7.5), BiocManager(v.1.30.10), yaml(v.2.2.1), reshape2(v.1.4.4), GenomicFeatures(v.1.42.1), backports(v.1.2.1), qvalue(v.2.22.0), clusterProfiler(v.3.18.1), tools(v.4.0.3), usethis(v.2.0.1), ggplot2(v.3.3.3), ellipsis(v.0.3.1), gplots(v.3.1.1), jquerylib(v.0.1.3), RColorBrewer(v.1.1-2), sessioninfo(v.1.1.1), Rcpp(v.1.0.6), plyr(v.1.8.6), progress(v.1.2.2), zlibbioc(v.1.36.0), purrr(v.0.3.4), RCurl(v.1.98-1.2), ps(v.1.5.0), prettyunits(v.1.1.1), openssl(v.1.4.3), viridis(v.0.5.1), cowplot(v.1.1.1), S4Vectors(v.0.28.1), SummarizedExperiment(v.1.20.0), ggrepel(v.0.9.1), colorRamps(v.2.3), fs(v.1.5.0), variancePartition(v.1.20.0), magrittr(v.2.0.1), data.table(v.1.14.0), DO.db(v.2.9), openxlsx(v.4.2.3), matrixStats(v.0.58.0), pkgload(v.1.2.0), hms(v.1.0.0), evaluate(v.0.14), xtable(v.1.8-4), pbkrtest(v.0.5-0.1), XML(v.3.99-0.5), IRanges(v.2.24.1), gridExtra(v.2.3), compiler(v.4.0.3), biomaRt(v.2.46.3), tibble(v.3.0.6), KernSmooth(v.2.23-18), crayon(v.1.4.1), shadowtext(v.0.0.7), minqa(v.1.2.4), htmltools(v.0.5.1.1), corpcor(v.1.6.9), mgcv(v.1.8-34), tidyr(v.1.1.2), DBI(v.1.1.1), tweenr(v.1.0.1), dbplyr(v.2.1.0), MASS(v.7.3-53.1), rappdirs(v.0.3.3), boot(v.1.3-27), readr(v.1.4.0), Matrix(v.1.3-2), cli(v.2.3.1), igraph(v.1.2.6), GenomicRanges(v.1.42.0), pkgconfig(v.2.0.3), rvcheck(v.0.1.8), GenomicAlignments(v.1.26.0), xml2(v.1.3.2), foreach(v.1.5.1), annotate(v.1.68.0), bslib(v.0.2.4), XVector(v.0.30.0), stringr(v.1.4.0), callr(v.3.5.1), digest(v.0.6.27), Biostrings(v.2.58.0), rmarkdown(v.2.7), fastmatch(v.1.1-0), edgeR(v.3.32.1), PROPER(v.1.22.0), curl(v.4.3), Rsamtools(v.2.6.0), gtools(v.3.8.2), nloptr(v.1.2.2.2), lifecycle(v.1.0.0), nlme(v.3.1-152), jsonlite(v.1.7.2), desc(v.1.2.0), viridisLite(v.0.3.0), askpass(v.1.1), limma(v.3.46.0), fansi(v.0.4.2), pillar(v.1.5.0), lattice(v.0.20-41), fastmap(v.1.1.0), httr(v.1.4.2), pkgbuild(v.1.2.0), survival(v.3.2-7), GO.db(v.3.12.1), glue(v.1.4.2), remotes(v.2.2.0), zip(v.2.1.1), iterators(v.1.0.13), pander(v.0.6.3), bit(v.4.0.4), ggforce(v.0.3.2), stringi(v.1.5.3), sass(v.0.3.1), blob(v.1.2.1), caTools(v.1.18.1), memoise(v.2.0.0) and dplyr(v.1.0.4)

message(paste0("This is hpgltools commit: ", get_git_commit()))
## If you wish to reproduce this exact build of hpgltools, invoke the following:
## > git clone http://github.com/abelew/hpgltools.git
## > git reset ad4239cab7311278f24a38d1b488513292f5f835
## This is hpgltools commit: Mon Apr 26 14:24:06 2021 -0400: ad4239cab7311278f24a38d1b488513292f5f835
this_save <- paste0(gsub(pattern="\\.Rmd", replace="", x=rmd_file), "-v", ver, ".rda.xz")
message(paste0("Saving to ", this_save))
## Saving to 02_estimation_202104-v202104.rda.xz
tmp <- sm(saveme(filename=this_save))

4 Estimates!

hs_expt <- set_expt_conditions(hs_expt, fact="infectstate")
hs_expt <- set_expt_batches(hs_expt, fact="studypmid")

plot_libsize(hs_expt)$plot

hs_norm <- normalize_expt(hs_expt, transform="log2", convert="cpm",
                          norm="quant", filter="simple")
## Removing 81 low-count genes (19548 remaining).
## transform_counts: Found 7380 values equal to 0, adding 1 to the matrix.
hs_cor <- plot_corheat(hs_norm)

hs_pca <- plot_pca(hs_norm)
## Potentially check over the experimental design, there appear to be missing values.
## Warning in plot_pca(hs_norm): There are NA values in the component data. This
## can lead to weird plotting errors.
## plot labels was not set and there are more than 100 samples, disabling it.
hs_pca$plot
## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure
## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure
## Warning: Removed 267 rows containing missing values (geom_point).

hs_nb <- normalize_expt(hs_expt, transform="log2", convert="cpm",
                          norm="quant", filter="simple", batch="svaseq")
## Warning in normalize_expt(hs_expt, transform = "log2", convert = "cpm", :
## Quantile normalization and sva do not always play well together.
## Removing 81 low-count genes (19548 remaining).
## batch_counts: Before batch/surrogate estimation, 7380 entries are x==0: 0%.
## batch_counts: Before batch/surrogate estimation, 2972809 entries are 0<x<1: 41%.
## Setting 320780 low elements to zero.
## transform_counts: Found 320780 values equal to 0, adding 1 to the matrix.
hs_nb_pca <- plot_pca(hs_nb)
## Potentially check over the experimental design, there appear to be missing values.
## Warning in plot_pca(hs_nb): There are NA values in the component data. This can
## lead to weird plotting errors.
## plot labels was not set and there are more than 100 samples, disabling it.
hs_nb_pca$plot
## Warning: Removed 267 rows containing missing values (geom_point).

hs_expt <- set_expt_conditions(hs_expt, fact="expttime")

hs_norm <- normalize_expt(hs_expt, transform="log2",
                          norm="quant", filter="simple", batch="svaseq")
## Warning in normalize_expt(hs_expt, transform = "log2", norm = "quant", filter =
## "simple", : Quantile normalization and sva do not always play well together.
## Removing 81 low-count genes (19548 remaining).
## batch_counts: Before batch/surrogate estimation, 7380 entries are x==0: 0%.
## batch_counts: Before batch/surrogate estimation, 1634088 entries are 0<x<1: 23%.
## Error in solve.default(t(mod) %*% mod) : 
##   Lapack routine dgesv: system is exactly singular: U[44,44] = 0
## Warning in all_adjusters(count_table, design = design, estimate_type = method, :
## It is highly likely that the underlying reason for this error is too many 0's in
## the dataset, please try doing a filtering of the data and retry.
## Error in solve.default(t(mod) %*% mod) : 
##   Lapack routine dgesv: system is exactly singular: U[44,44] = 0
## Warning in do_batch(count_table, method = batch, expt_design = expt_design, :
## The batch_counts call failed. Returning non-batch reduced data.
## transform_counts: Found 7380 values equal to 0, adding 1 to the matrix.
hs_pca <- plot_pca(hs_norm)
## Potentially check over the experimental design, there appear to be missing values.
## Warning in plot_pca(hs_norm): There are NA values in the component data. This
## can lead to weird plotting errors.
## plot labels was not set and there are more than 100 samples, disabling it.
hs_pca$plot
## Warning: Removed 267 rows containing missing values (geom_point).

pander::pander(sessionInfo())
message(paste0("This is hpgltools commit: ", get_git_commit()))
this_save <- paste0(gsub(pattern="\\.Rmd", replace="", x=rmd_file), "-v", ver, ".rda.xz")
message(paste0("Saving to ", this_save))
tmp <- sm(saveme(filename=this_save))
LS0tCnRpdGxlOiAiRG93bmxvYWRlZCBkYXRhIHNldHMsIHNhbXBsZSBlc3RpbWF0aW9uLiIKYXV0aG9yOiAiYXRiIGFiZWxld0BnbWFpbC5jb20iCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgICB0aGVtZTogcmVhZGFibGUKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IGZhbHNlCiAgICAgIHNtb290aF9zY3JvbGw6IGZhbHNlCiAgcm1kZm9ybWF0czo6cmVhZHRoZWRvd246CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGRmX3ByaW50OiBwYWdlZAogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGZpZ19oZWlnaHQ6IDcKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAgd2lkdGg6IDMwMAogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIHRvY19mbG9hdDogdHJ1ZQogIEJpb2NTdHlsZTo6aHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGZpZ19oZWlnaHQ6IDcKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIHRvY19mbG9hdDogdHJ1ZQotLS0KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CmJvZHksIHRkIHsKICBmb250LXNpemU6IDE2cHg7Cn0KY29kZS5yewogIGZvbnQtc2l6ZTogMTZweDsKfQpwcmUgewogZm9udC1zaXplOiAxNnB4Cn0KPC9zdHlsZT4KCmBgYHtyIG9wdGlvbnMsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoImhwZ2x0b29scyIpCnR0IDwtIGRldnRvb2xzOjpsb2FkX2FsbCgifi9ocGdsdG9vbHMiKQprbml0cjo6b3B0c19rbml0JHNldCh3aWR0aD0xMjAsCiAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2U9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgZWNobz1UUlVFKQprbml0cjo6b3B0c19jaHVuayRzZXQoZXJyb3I9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgIGRwaT05NikKb2xkX29wdGlvbnMgPC0gb3B0aW9ucyhkaWdpdHM9NCwKICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzPUZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgIGtuaXRyLmR1cGxpY2F0ZS5sYWJlbD0iYWxsb3ciKQpnZ3Bsb3QyOjp0aGVtZV9zZXQoZ2dwbG90Mjo6dGhlbWVfYncoYmFzZV9zaXplPTEwKSkKcnVuZGF0ZSA8LSBmb3JtYXQoU3lzLkRhdGUoKSwgZm9ybWF0PSIlWSVtJWQiKQoKdmVyIDwtICIyMDIxMDQiCnJtZF9maWxlIDwtICIwMl9lc3RpbWF0aW9uXzIwMjEwNC5SbWQiCmBgYAoKIyBJbnRyb2R1Y3Rpb24KClRoaXMgaXMgYSB2ZXJ5IHByZWxpbWluYXJ5IGxvb2sgaW50byBob3cgd2UgbWlnaHQgY29tYmluZSBvdXIgbGlicmFyeQpvZiBodW1hbiBpbmZlY3RlZCBzYW1wbGVzIHdpdGggYSBzZXQgb2YgKG1vc3RseSBtYWNyb3BoYWdlKSBzYW1wbGVzCndoaWNoIEkgZG93bmxvYWRlZCBmcm9tIHRoZSBTUkEuICBUaGUgY3VycmVudCBkYXRhIGlzIGNvbXByaXNlZCBvZiB+CjM3MCBzYW1wbGVzIHNhbG1vbiBtYXBwZWQgYWdhaW5zdCBoZzM4IHJldmlzaW9uIDkxLgoKIyBBbm5vdGF0aW9uIGRhdGEgZm9yIGRvd25sb2FkIGh1bWFuIGRhdGEuCgpUaGlzIHNob3J0IGRvY3VtZW50IHNob3VsZCBnYXRoZXIgdGhlIGFubm90YXRpb24gZGF0YSByZXF1aXJlZCBmb3IgcGxheWluZyB3aXRoCnRoZSBkYXRhIGRvd25sb2FkZWQgZnJvbSBTUkEgYW5kIGZyaWVuZHMuCgpgYGB7ciBhbm5vdH0KaHNfZ2ZmIDwtICJyZWZlcmVuY2UvaGczOF85MS5nZmYiCmhzX2dmZl9hbm5vdCA8LSBzbShsb2FkX2dmZl9hbm5vdGF0aW9ucyhoc19nZmYsIGlkX2NvbD0iZ2VuZV9pZCIpKQpoc19hbm5vdCA8LSBzbShsb2FkX2Jpb21hcnRfYW5ub3RhdGlvbnMoKSkkYW5ub3RhdGlvbgpoc19hbm5vdCRJRCA8LSBoc19hbm5vdCRnZW5lSUQKcm93bmFtZXMoaHNfYW5ub3QpIDwtIG1ha2UubmFtZXMoaHNfYW5ub3RbWyJlbnNlbWJsX2dlbmVfaWQiXV0sIHVuaXF1ZT1UUlVFKQpkaW0oaHNfYW5ub3QpCgpoc19zaXplX2Rpc3QgPC0gcGxvdF9oaXN0b2dyYW0oaHNfYW5ub3RbWyJjZHNfbGVuZ3RoIl1dKQpoc19zaXplX2Rpc3QgKwogIGdncGxvdDI6OnNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygwLCAyMDAwMCkpCgpoc19nb19iaW9tYXJ0IDwtIHNtKGxvYWRfYmlvbWFydF9nbygpKQoKaHNfbGVuZ3RocyA8LSBoc19hbm5vdFssIGMoImVuc2VtYmxfZ2VuZV9pZCIsICJjZHNfbGVuZ3RoIildCmNvbG5hbWVzKGhzX2xlbmd0aHMpIDwtIGMoIklEIiwgIndpZHRoIikKCnJvd25hbWVzKGhzX2Fubm90KSA8LSBtYWtlLm5hbWVzKAogIHBhc3RlMChoc19hbm5vdFtbImVuc2VtYmxfdHJhbnNjcmlwdF9pZCJdXSwgIi4iLAogICAgICAgICBoc19hbm5vdFtbInRyYW5zY3JpcHRfdmVyc2lvbiJdXSksCiAgdW5pcXVlPVRSVUUpCmhzX3R4X2dlbmUgPC0gaHNfYW5ub3RbLCBjKCJlbnNlbWJsX2dlbmVfaWQiLCAiZW5zZW1ibF90cmFuc2NyaXB0X2lkIildCmhzX3R4X2dlbmVbWyJpZCJdXSA8LSByb3duYW1lcyhoc190eF9nZW5lKQpoc190eF9nZW5lIDwtIGhzX3R4X2dlbmVbLCBjKCJpZCIsICJlbnNlbWJsX2dlbmVfaWQiKV0KbmV3X2hzX2Fubm90IDwtIGhzX2Fubm90CnJvd25hbWVzKG5ld19oc19hbm5vdCkgPC0gbWFrZS5uYW1lcyhoc19hbm5vdFtbImVuc2VtYmxfZ2VuZV9pZCJdXSwgdW5pcXVlPVRSVUUpCmBgYAoKYGBge3IgZXhwdH0KaHNfZXhwdCA8LSBjcmVhdGVfZXhwdCgic2FtcGxlX3NoZWV0cy9hbGxfc2FtcGxlc18yMDIxMDQueGxzeCIsCiAgICAgICAgICAgICAgICAgICAgICAgZ2VuZV9pbmZvPW5ld19oc19hbm5vdCwKICAgICAgICAgICAgICAgICAgICAgICB0eF9nZW5lX21hcD1oc190eF9nZW5lLAogICAgICAgICAgICAgICAgICAgICAgIGZpbGVfY29sdW1uPSJzYWxtb25maWxlIikKCmNkc19lbnRyaWVzIDwtIGZEYXRhKGhzX2V4cHQpCmNkc19lbnRyaWVzIDwtIGNkc19lbnRyaWVzW1siZ2VuZV9iaW90eXBlIl1dID09ICJwcm90ZWluX2NvZGluZyIKaHNfY2RzX2V4cHQgPC0gaHNfZXhwdApoc19jZHNfZXhwdCRleHByZXNzaW9uc2V0IDwtIGhzX2Nkc19leHB0JGV4cHJlc3Npb25zZXRbY2RzX2VudHJpZXMsIF0KbmV3X2Nkc19lbnRyaWVzIDwtIGZEYXRhKGhzX2Nkc19leHB0KQpgYGAKCiMgSW5pdGlhbCBwbG90cwoKTmFqaWIgbG92ZXMgaGlzIFBDQSEKCmBgYHtyIGluaXRpYWxfcGxvdHN9CnBsb3Rfbm9uemVybyhoc19jZHNfZXhwdCkkcGxvdAoKaHNfY2RzX25vcm0gPC0gbm9ybWFsaXplX2V4cHQoaHNfY2RzX2V4cHQsIHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtID0gInF1YW50IiwgZmlsdGVyID0gVFJVRSkKaHNfY2RzX3BjYSA8LSBwbG90X3BjYShoc19jZHNfbm9ybSkKaHNfY2RzX3BjYSRwbG90Cgpoc19jZHNfbmIgPC0gbm9ybWFsaXplX2V4cHQoaHNfY2RzX2V4cHQsIHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gInNpbXBsZSIsIGJhdGNoID0gInN2YXNlcSIpCmhzX2Nkc19uYl9wY2EgPC0gcGxvdF9wY2EoaHNfY2RzX25iKQpoc19jZHNfbmJfcGNhJHBsb3QKYGBgCgoKYGBge3Igc2F2ZW1lfQpwYW5kZXI6OnBhbmRlcihzZXNzaW9uSW5mbygpKQptZXNzYWdlKHBhc3RlMCgiVGhpcyBpcyBocGdsdG9vbHMgY29tbWl0OiAiLCBnZXRfZ2l0X2NvbW1pdCgpKSkKdGhpc19zYXZlIDwtIHBhc3RlMChnc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IiIsIHg9cm1kX2ZpbGUpLCAiLXYiLCB2ZXIsICIucmRhLnh6IikKbWVzc2FnZShwYXN0ZTAoIlNhdmluZyB0byAiLCB0aGlzX3NhdmUpKQp0bXAgPC0gc20oc2F2ZW1lKGZpbGVuYW1lPXRoaXNfc2F2ZSkpCmBgYAoKCiMgRXN0aW1hdGVzIQoKYGBge3IgZXN0aW1hdGV9CmhzX2V4cHQgPC0gc2V0X2V4cHRfY29uZGl0aW9ucyhoc19leHB0LCBmYWN0PSJpbmZlY3RzdGF0ZSIpCmhzX2V4cHQgPC0gc2V0X2V4cHRfYmF0Y2hlcyhoc19leHB0LCBmYWN0PSJzdHVkeXBtaWQiKQoKcGxvdF9saWJzaXplKGhzX2V4cHQpJHBsb3QKaHNfbm9ybSA8LSBub3JtYWxpemVfZXhwdChoc19leHB0LCB0cmFuc2Zvcm09ImxvZzIiLCBjb252ZXJ0PSJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm09InF1YW50IiwgZmlsdGVyPSJzaW1wbGUiKQpoc19jb3IgPC0gcGxvdF9jb3JoZWF0KGhzX25vcm0pCmhzX3BjYSA8LSBwbG90X3BjYShoc19ub3JtKQpoc19wY2EkcGxvdAoKaHNfbmIgPC0gbm9ybWFsaXplX2V4cHQoaHNfZXhwdCwgdHJhbnNmb3JtPSJsb2cyIiwgY29udmVydD0iY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtPSJxdWFudCIsIGZpbHRlcj0ic2ltcGxlIiwgYmF0Y2g9InN2YXNlcSIpCgpoc19uYl9wY2EgPC0gcGxvdF9wY2EoaHNfbmIpCmhzX25iX3BjYSRwbG90Cgpoc19leHB0IDwtIHNldF9leHB0X2NvbmRpdGlvbnMoaHNfZXhwdCwgZmFjdD0iZXhwdHRpbWUiKQoKaHNfbm9ybSA8LSBub3JtYWxpemVfZXhwdChoc19leHB0LCB0cmFuc2Zvcm09ImxvZzIiLAogICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm09InF1YW50IiwgZmlsdGVyPSJzaW1wbGUiLCBiYXRjaD0ic3Zhc2VxIikKaHNfcGNhIDwtIHBsb3RfcGNhKGhzX25vcm0pCmhzX3BjYSRwbG90CmBgYAoKYGBge3Igc2F2ZW1lLCBldmFsPUZBTFNFfQpwYW5kZXI6OnBhbmRlcihzZXNzaW9uSW5mbygpKQptZXNzYWdlKHBhc3RlMCgiVGhpcyBpcyBocGdsdG9vbHMgY29tbWl0OiAiLCBnZXRfZ2l0X2NvbW1pdCgpKSkKdGhpc19zYXZlIDwtIHBhc3RlMChnc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IiIsIHg9cm1kX2ZpbGUpLCAiLXYiLCB2ZXIsICIucmRhLnh6IikKbWVzc2FnZShwYXN0ZTAoIlNhdmluZyB0byAiLCB0aGlzX3NhdmUpKQp0bXAgPC0gc20oc2F2ZW1lKGZpbGVuYW1lPXRoaXNfc2F2ZSkpCmBgYAoKYGBge3IgbG9hZG1lLCBldmFsPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQp0bXAgPC0gbG9hZG1lKGZpbGVuYW1lPXRoaXNfc2F2ZSkKYGBgCg==