1 Sample Estimation, Macrophages: 20180822

This document is concerned with analyzing RNAseq data of human and parasite during the infection of human macrophages. A few different strains of L. panamensis were used; the experiment is therefore segregated into groups named ‘self-healing’, ‘chronic’, and ‘uninfected’. Two separate sets of libraries were generated, one earlier set with greater coverage, and a later set including only 1 uninfected sample, and 2-3 chronic samples.

2 Figure S1

Figure S1 should include nice versions of the sample metrics. The normalization chosen is batch-in-model.

First, however, we will make some plots of the raw data.

Sample names are going to be ‘infectionstate_strainnumber’ : chr_7721

  • Panel A: Library sizes.
  • Panel B: Heatmap distance raw.
  • Panel C: PCA
  • Panel D: TSNE

First look for clustering patterns in the raw data, in all data followed by only the CDS regions.

2.1 Write S1 images

Once the experiment has been written with the various normalizations in place, we can use that to print and view some representative plots.

## Writing the image to: images/figure_s1a_cds.pdf and calling dev.off().

## Writing the image to: images/figure_s1b_cds.pdf and calling dev.off().

## Writing the image to: images/figure_s1c_cds.pdf and calling dev.off().

## Writing the image to: images/figure_s1d_cds.pdf and calling dev.off().

3 Figure 1

  • Figure 1a distance heatmap of the normalized data.
  • Figure 1b is a PCA of the normalized data.

In a similar fashion to what is above, I am printing the figure 1 images.

## Writing the image to: images/figure_1a_cds.pdf and calling dev.off().

## Writing the image to: images/figure_1b_cds.pdf and calling dev.off().

sampleid condition batch batch_int colors labels PC1 PC2 pc_1 pc_2 pc_3 pc_4 pc_5 pc_6 pc_7 pc_8 pc_9 pc_10
uninf_1 HPGL0241 uninf a 1 #009900 HPGL0241 -0.5987 -0.2058 -0.5987 -0.2058 0.2790 -0.1521 0.4206 0.1964 0.2007 0.2818 -0.0099 0.2684
uninf_2 HPGL0637 uninf b 2 #009900 HPGL0637 0.1306 -0.4520 0.1306 -0.4520 0.5594 0.2434 -0.2295 0.1217 -0.0561 -0.0296 0.0009 -0.4940
sh_2271 HPGL0242 sh a 1 #000099 HPGL0242 -0.3149 0.0726 -0.3149 0.0726 0.0099 -0.1401 -0.5103 -0.0125 -0.0491 -0.4678 -0.4939 0.2432
sh_2272 HPGL0243 sh a 1 #000099 HPGL0243 -0.1489 -0.2395 -0.1489 -0.2395 -0.1900 0.0505 -0.0781 -0.2077 -0.3461 -0.2708 0.7086 0.2155
sh_2189 HPGL0638 sh b 2 #000099 HPGL0638 0.0391 -0.1299 0.0391 -0.1299 -0.3943 -0.6842 0.0739 0.0102 0.0430 0.0219 -0.0258 -0.5085
sh_1022 HPGL0639 sh b 2 #000099 HPGL0639 -0.3629 0.5818 -0.3629 0.5818 -0.1045 0.4153 0.1574 -0.1299 -0.0116 -0.0384 0.0331 -0.4595
chr_5433 HPGL0244 chr a 1 #990000 HPGL0244 0.4558 0.1832 0.4558 0.1832 0.2411 -0.0841 0.5662 0.0524 -0.0595 -0.4941 -0.0872 0.1547
chr_1320 HPGL0245 chr a 1 #990000 HPGL0245 0.2144 -0.1355 0.2144 -0.1355 -0.2775 0.2678 -0.1065 -0.0517 0.8093 -0.0492 0.0875 0.1302
chr_2504 HPGL0246 chr a 1 #990000 HPGL0246 0.2220 0.3663 0.2220 0.3663 0.3686 -0.2812 -0.2576 -0.4617 0.0324 0.4324 0.1288 0.1630
chr_5430 HPGL0247 chr a 1 #990000 HPGL0247 0.1616 -0.2929 0.1616 -0.2929 -0.3317 0.3060 0.1752 -0.2835 -0.3661 0.3492 -0.4554 0.1385
chr_5397 HPGL0248 chr a 1 #990000 HPGL0248 0.2020 0.2518 0.2020 0.2518 -0.1600 0.0588 -0.2114 0.7664 -0.1969 0.2647 0.1134 0.1486

4 Sample metrics

The following is mostly used to compare different methodologies and is therefore not likely to be useful for most.

The various metrics used to describe and examine the data come once before, and once after normalization.

Some other analyses performed suggest a possible switch between two samples. We can artifically see what the data would look like if that is true by switching those two samples in a separate experimental design.

5 TODO 201611 #4

PBMC: variance partition human, “Are there any genes with variance we can ascribe to condition?” That set of genes is the most interesting. – use the variance parition table and pull the top 200. Report back the % variance by condition for all of these genes.

6 Variance Partition

In the following, I will attempt to find the variance associated with different experimental factors in the macrophage data with mappings against the human transcriptome.

## There were 25, now there are 7 samples.
## The new colors are a character, changing according to condition.

Now lets try removing some of the surrogates, the two primary candidates are the strains which I proxy with 3 columns: snpclade, snpcladev2, and snpcladev3; and the batch. In this data set batch is either a or b.

In theory, sva should pick up both of those in one invocation.

6.1 Start with a pca from sva

## NULL

6.2 Try limma’s removebatcheffect

Another method might be to try using limmaresid to explicitly pull both columns.

Another method might be to try pca on two separate invocations.

6.2.1 Show the plots from above.

## NULL
## If you wish to reproduce this exact build of hpgltools, invoke the following:
## > git clone http://github.com/abelew/hpgltools.git
## > git reset 95ee596d3b8007c0f633314bc34b759e00fb3132
## This is hpgltools commit: Mon Feb 4 11:44:16 2019 -0500: 95ee596d3b8007c0f633314bc34b759e00fb3132
## Saving to 02_estimation_macrophage_20180822-v20180822.rda.xz

R version 3.5.2 (2018-12-20)

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

locale: LC_CTYPE=en_US.utf8, LC_NUMERIC=C, LC_TIME=en_US.utf8, LC_COLLATE=en_US.utf8, LC_MONETARY=en_US.utf8, LC_MESSAGES=en_US.utf8, LC_PAPER=en_US.utf8, LC_NAME=C, LC_ADDRESS=C, LC_TELEPHONE=C, LC_MEASUREMENT=en_US.utf8 and LC_IDENTIFICATION=C

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

other attached packages: variancePartition(v.1.12.1), ruv(v.0.9.7), bindrcpp(v.0.2.2), hpgltools(v.2018.11), Biobase(v.2.42.0) and BiocGenerics(v.0.28.0)

loaded via a namespace (and not attached): backports(v.1.1.3), fastmatch(v.1.1-0), plyr(v.1.8.4), igraph(v.1.2.2), lazyeval(v.0.2.1), splines(v.3.5.2), BiocParallel(v.1.16.5), usethis(v.1.4.0), GenomeInfoDb(v.1.18.1), ggplot2(v.3.1.0), urltools(v.1.7.1), sva(v.3.30.1), digest(v.0.6.18), foreach(v.1.4.4), htmltools(v.0.3.6), GOSemSim(v.2.8.0), viridis(v.0.5.1), GO.db(v.3.7.0), gdata(v.2.18.0), magrittr(v.1.5), memoise(v.1.1.0), doParallel(v.1.0.14), openxlsx(v.4.1.0), limma(v.3.38.3), remotes(v.2.0.2), Biostrings(v.2.50.2), annotate(v.1.60.0), matrixStats(v.0.54.0), enrichplot(v.1.2.0), prettyunits(v.1.0.2), colorspace(v.1.4-0), blob(v.1.1.1), ggrepel(v.0.8.0), xfun(v.0.4), dplyr(v.0.7.8), jsonlite(v.1.6), callr(v.3.1.1), crayon(v.1.3.4), RCurl(v.1.95-4.11), graph(v.1.60.0), genefilter(v.1.64.0), lme4(v.1.1-19), bindr(v.0.1.1), survival(v.2.43-3), iterators(v.1.0.10), glue(v.1.3.0), gtable(v.0.2.0), zlibbioc(v.1.28.0), XVector(v.0.22.0), UpSetR(v.1.3.3), DelayedArray(v.0.8.0), pkgbuild(v.1.0.2), scales(v.1.0.0), DOSE(v.3.8.2), edgeR(v.3.24.3), DBI(v.1.0.0), Rcpp(v.1.0.0), viridisLite(v.0.3.0), xtable(v.1.8-3), progress(v.1.2.0), units(v.0.6-2), gridGraphics(v.0.3-0), bit(v.1.1-14), europepmc(v.0.3), preprocessCore(v.1.45.0), OrganismDbi(v.1.24.0), stats4(v.3.5.2), httr(v.1.4.0), fgsea(v.1.8.0), gplots(v.3.0.1), RColorBrewer(v.1.1-2), pkgconfig(v.2.0.2), XML(v.3.98-1.16), farver(v.1.1.0), locfit(v.1.5-9.1), labeling(v.0.3), ggplotify(v.0.0.3), tidyselect(v.0.2.5), rlang(v.0.3.1), reshape2(v.1.4.3), AnnotationDbi(v.1.44.0), munsell(v.0.5.0), tools(v.3.5.2), cli(v.1.0.1), RSQLite(v.2.1.1), ggridges(v.0.5.1), devtools(v.2.0.1), evaluate(v.0.12), stringr(v.1.3.1), yaml(v.2.2.0), processx(v.3.2.1), knitr(v.1.21), bit64(v.0.9-7), fs(v.1.2.6), pander(v.0.6.3), zip(v.1.0.0), caTools(v.1.17.1.1), purrr(v.0.2.5), ggraph(v.1.0.2), packrat(v.0.5.0), RBGL(v.1.58.1), nlme(v.3.1-137), xml2(v.1.2.0), DO.db(v.2.9), biomaRt(v.2.38.0), compiler(v.3.5.2), pbkrtest(v.0.4-7), rstudioapi(v.0.9.0), testthat(v.2.0.1), tibble(v.2.0.1), tweenr(v.1.0.1), stringi(v.1.2.4), highr(v.0.7), ps(v.1.3.0), GenomicFeatures(v.1.34.1), desc(v.1.2.0), lattice(v.0.20-38), Matrix(v.1.2-15), nloptr(v.1.2.1), pillar(v.1.3.1), BiocManager(v.1.30.4), triebeard(v.0.3.0), corpcor(v.1.6.9), data.table(v.1.12.0), cowplot(v.0.9.4), bitops(v.1.0-6), rtracklayer(v.1.42.1), GenomicRanges(v.1.34.0), qvalue(v.2.14.1), colorRamps(v.2.3), directlabels(v.2018.05.22), R6(v.2.3.0), KernSmooth(v.2.23-15), gridExtra(v.2.3), IRanges(v.2.16.0), sessioninfo(v.1.1.1), codetools(v.0.2-16), MASS(v.7.3-51.1), gtools(v.3.8.1), assertthat(v.0.2.0), pkgload(v.1.0.2), SummarizedExperiment(v.1.12.0), rprojroot(v.1.3-2), withr(v.2.1.2), GenomicAlignments(v.1.18.1), Rsamtools(v.1.34.0), S4Vectors(v.0.20.1), GenomeInfoDbData(v.1.2.0), mgcv(v.1.8-26), hms(v.0.4.2), clusterProfiler(v.3.10.1), quadprog(v.1.5-5), grid(v.3.5.2), tidyr(v.0.8.2), minqa(v.1.2.4), rvcheck(v.0.1.3), rmarkdown(v.1.11), Rtsne(v.0.15), ggforce(v.0.1.3) and base64enc(v.0.1-3)

LS0tCnRpdGxlOiAiTC5wYW5hbWVuc2lzIDIwMTgwODIyOiBTYW1wbGUgZXN0aW1hdGlvbiBvZiBIdW1hbiBtYWNyb3BoYWdlcy4iCmF1dGhvcjogImF0YiBhYmVsZXdAZ21haWwuY29tIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICB3aWR0aDogMzAwCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgdG9jX2Zsb2F0OiB0cnVlCiAgQmlvY1N0eWxlOjpodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgdG9jX2Zsb2F0OiB0cnVlCiAgaHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGZpZ19oZWlnaHQ6IDcKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgc2VsZl9jb250YWluZWQ6IHRydWUKICAgIHRoZW1lOiByZWFkYWJsZQogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogZmFsc2UKICAgICAgc21vb3RoX3Njcm9sbDogZmFsc2UKLS0tCgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgpib2R5LCB0ZCB7CiAgZm9udC1zaXplOiAxNnB4Owp9CmNvZGUucnsKICBmb250LXNpemU6IDE2cHg7Cn0KcHJlIHsKIGZvbnQtc2l6ZTogMTZweAp9Cjwvc3R5bGU+CgpgYGB7ciBvcHRpb25zLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KCJocGdsdG9vbHMiKQp0dCA8LSBkZXZ0b29sczo6bG9hZF9hbGwoIn4vaHBnbHRvb2xzIikKa25pdHI6Om9wdHNfa25pdCRzZXQocHJvZ3Jlc3M9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZT1UUlVFLAogICAgICAgICAgICAgICAgICAgICB3aWR0aD0xMTAsCiAgICAgICAgICAgICAgICAgICAgIGVjaG89VFJVRSkKa25pdHI6Om9wdHNfY2h1bmskc2V0KGVycm9yPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgICBmaWcud2lkdGg9OCwKICAgICAgICAgICAgICAgICAgICAgIGZpZy5oZWlnaHQ9OCwKICAgICAgICAgICAgICAgICAgICAgIGRwaT05NikKb2xkX29wdGlvbnMgPC0gb3B0aW9ucyhkaWdpdHM9NCwKICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzPUZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgIGtuaXRyLmR1cGxpY2F0ZS5sYWJlbD0iYWxsb3ciKQpwcmV2aW91c19maWxlIDwtICIwMV9hbm5vdGF0aW9uXzIwMTgwODIyLlJtZCIKdmVyIDwtICIyMDE4MDgyMiIKCnRtcCA8LSBsb2FkbWUoZmlsZW5hbWU9cGFzdGUwKGdzdWIocGF0dGVybj0iXFwuUm1kIiwgcmVwbGFjZT0iIiwgeD1wcmV2aW91c19maWxlKSwgIi12IiwgdmVyLCAiLnJkYS54eiIpKQpybWRfZmlsZSA8LSAiMDJfZXN0aW1hdGlvbl9tYWNyb3BoYWdlXzIwMTgwODIyLlJtZCIKYGBgCgojIFNhbXBsZSBFc3RpbWF0aW9uLCBNYWNyb3BoYWdlczogYHIgdmVyYAoKVGhpcyBkb2N1bWVudCBpcyBjb25jZXJuZWQgd2l0aCBhbmFseXppbmcgUk5Bc2VxIGRhdGEgb2YgaHVtYW4gYW5kIHBhcmFzaXRlIGR1cmluZyB0aGUgaW5mZWN0aW9uIG9mCmh1bWFuIG1hY3JvcGhhZ2VzLiAgQSBmZXcgZGlmZmVyZW50IHN0cmFpbnMgb2YgTC4gcGFuYW1lbnNpcyB3ZXJlIHVzZWQ7IHRoZSBleHBlcmltZW50IGlzIHRoZXJlZm9yZQpzZWdyZWdhdGVkIGludG8gZ3JvdXBzIG5hbWVkICdzZWxmLWhlYWxpbmcnLCAnY2hyb25pYycsIGFuZCAndW5pbmZlY3RlZCcuICBUd28gc2VwYXJhdGUgc2V0cyBvZgpsaWJyYXJpZXMgd2VyZSBnZW5lcmF0ZWQsIG9uZSBlYXJsaWVyIHNldCB3aXRoIGdyZWF0ZXIgY292ZXJhZ2UsIGFuZCBhIGxhdGVyIHNldCBpbmNsdWRpbmcgb25seSAxCnVuaW5mZWN0ZWQgc2FtcGxlLCBhbmQgMi0zIGNocm9uaWMgc2FtcGxlcy4KCiMjIEV4dHJhY3QgdGhlIG1hY3JvcGhhZ2UgZXhwZXJpbWVudAoKVGhlIGZvbGxvd2luZyBzdWJzZXQgb3BlcmF0aW9uIGV4dHJhY3QgdGhlIHNhbXBsZXMgdXNlZCBmb3IgdGhlIG1hY3JvcGhhZ2UgZXhwZXJpbWVudC4gVGhlIG5leHQKdGhyZWUgbGluZXMgdGhlbiBjaGFuZ2UgdGhlIGNvbG9ycyBmcm9tIHRoZSBkZWZhdWx0cy4KCmBgYHtyIG1hY3JvcGhhZ2VzfQojIyBUaGlzIHdhcyBtYWRlIGluIDAxX2Fubm90YXRpb25fMjAxODA4MjIuUm1kCiMjaHNfZXhwdCA8LSBzbShjcmVhdGVfZXhwdChtZXRhZGF0YT0ic2FtcGxlX3NoZWV0cy9hbGxfc2FtcGxlcy1jb21iaW5lZC54bHN4IiwKIyMgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVfaW5mbz1oc19hbm5vdGF0aW9ucywKIyMgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfY29sdW1uPSJodW1hbmZpbGUiKSkKCmhzX21hY3IgPC0gc3Vic2V0X2V4cHQoaHNfZXhwdCwgc3Vic2V0PSJleHBlcmltZW50bmFtZT09J21hY3JvcGhhZ2UnIikKbmV3X2NvbG9ycyA8LSBjKCIjMDA5OTAwIiwgIiM5OTAwMDAiLCAiIzAwMDA5OSIpCm5hbWVzKG5ld19jb2xvcnMpIDwtIGMoInVuaW5mIiwgImNociIsICJzaCIpCgpoc19tYWNyIDwtIHNldF9leHB0X2NvbG9ycyhoc19tYWNyLCBjb2xvcnM9bmV3X2NvbG9ycykKbGFiZWxzIDwtIGFzLmNoYXJhY3RlcihwRGF0YShoc19tYWNyKVtbImxhYmVsIl1dKQpoc19tYWNyIDwtIHNldF9leHB0X3NhbXBsZW5hbWVzKGhzX21hY3IsIGxhYmVscykKCmhzX2Nkc19leHB0IDwtIGV4Y2x1ZGVfZ2VuZXNfZXhwdChoc19leHB0LCBjb2x1bW49J1R5cGUnLCBwYXR0ZXJucz0icHJvdGVpbl9jb2RpbmciLCBtZXRob2Q9ImtlZXAiKQpoc19jZHNfbWFjciA8LSBzdWJzZXRfZXhwdChoc19jZHNfZXhwdCwgc3Vic2V0PSJleHBlcmltZW50bmFtZT09J21hY3JvcGhhZ2UnIikKaHNfY2RzX21hY3IgPC0gc2V0X2V4cHRfY29sb3JzKGhzX2Nkc19tYWNyLCBjb2xvcnM9bmV3X2NvbG9ycykKaHNfY2RzX21hY3IgPC0gc2V0X2V4cHRfc2FtcGxlbmFtZXMoaHNfY2RzX21hY3IsIGxhYmVscykKYGBgCgojIEZpZ3VyZSBTMQoKRmlndXJlIFMxIHNob3VsZCBpbmNsdWRlIG5pY2UgdmVyc2lvbnMgb2YgdGhlIHNhbXBsZSBtZXRyaWNzLgpUaGUgbm9ybWFsaXphdGlvbiBjaG9zZW4gaXMgYmF0Y2gtaW4tbW9kZWwuCgpGaXJzdCwgaG93ZXZlciwgd2Ugd2lsbCBtYWtlIHNvbWUgcGxvdHMgb2YgdGhlIHJhdyBkYXRhLgoKU2FtcGxlIG5hbWVzIGFyZSBnb2luZyB0byBiZSAnaW5mZWN0aW9uc3RhdGVfc3RyYWlubnVtYmVyJyA6IGNocl83NzIxCgoqIFBhbmVsIEE6IExpYnJhcnkgc2l6ZXMuCiogUGFuZWwgQjogSGVhdG1hcCBkaXN0YW5jZSByYXcuCiogUGFuZWwgQzogUENBCiogUGFuZWwgRDogVFNORQoKYGBge3IgZmlnX3MxX3dyaXRlLCBmaWcuc2hvdz0iaGlkZSJ9CiMjIFdlIGFyZSBvbmx5IGRlYWxpbmcgd2l0aCB0aGUgQ0RTIGRhdGEgZnJvbSBub3cgb24uCiMjIGZpZ19zMSA8LSBzbSh3cml0ZV9leHB0KAojIyAgaHNfbWFjciwgbm9ybT0icXVhbnQiLCB2aW9saW49RkFMU0UsIGNvbnZlcnQ9ImNwbSIsCiMjICB0cmFuc2Zvcm09ImxvZzIiLCBiYXRjaD0icGNhIiwgZmlsdGVyPVRSVUUsCiMjICBleGNlbD1wYXN0ZTAoImV4Y2VsL2ZpZ3VyZV9zMV9zYW1wbGVfZXN0aW1hdGlvbi12IiwgdmVyLCAiLnhsc3giKSkpCmZpZ19zMV9jZHMgPC0gc20od3JpdGVfZXhwdCgKICBoc19jZHNfbWFjciwgbm9ybT0icXVhbnQiLCB2aW9saW49RkFMU0UsIGNvbnZlcnQ9ImNwbSIsCiAgdHJhbnNmb3JtPSJsb2cyIiwgYmF0Y2g9InBjYSIsIGZpbHRlcj1UUlVFLAogIGV4Y2VsPXBhc3RlMCgiZXhjZWwvZmlndXJlX3MxX3NhbXBsZV9lc3RpbWF0aW9uX2Nkc19vbmx5LXYiLCB2ZXIsICIueGxzeCIpKSkKYGBgCgpGaXJzdCBsb29rIGZvciBjbHVzdGVyaW5nIHBhdHRlcm5zIGluIHRoZSByYXcgZGF0YSwgaW4gYWxsIGRhdGEgZm9sbG93ZWQgYnkgb25seSB0aGUgQ0RTIHJlZ2lvbnMuCgpgYGB7ciBmaWd1cmVfczF9CiMjIHBsb3RfdHNuZShoc19tYWNyKSRwbG90CnBsb3RfdHNuZShoc19jZHNfbWFjcikkcGxvdApgYGAKCiMjIFdyaXRlIFMxIGltYWdlcwoKT25jZSB0aGUgZXhwZXJpbWVudCBoYXMgYmVlbiB3cml0dGVuIHdpdGggdGhlIHZhcmlvdXMgbm9ybWFsaXphdGlvbnMgaW4gcGxhY2UsCndlIGNhbiB1c2UgdGhhdCB0byBwcmludCBhbmQgdmlldyBzb21lIHJlcHJlc2VudGF0aXZlIHBsb3RzLgoKYGBge3Igdmlld19maWdfczF9CnBwKGZpbGU9ImltYWdlcy9maWd1cmVfczFhX2Nkcy5wZGYiLCBpbWFnZT1maWdfczFfY2RzJHJhd19saWJzaXplKQojIyBTaG93IHRoZSBsaWJyYXJ5IHNpemVzIG9mIGNkcyBmZWF0dXJlcy4KCnBwKGZpbGU9ImltYWdlcy9maWd1cmVfczFiX2Nkcy5wZGYiLCBpbWFnZT1maWdfczFfY2RzJHJhd19kaXNoZWF0KQojIyBTaG93IHRoZSBjbHVzdGVyaW5nIGJ5IGV1Y2xpZGVhbiBkaXN0YW5jZSBvZiB0aGUgcmF3IGRhdGEgY2RzIGZlYXR1cmVzLgoKcHAoZmlsZT0iaW1hZ2VzL2ZpZ3VyZV9zMWNfY2RzLnBkZiIsIGltYWdlPWZpZ19zMV9jZHMkcmF3X3NjYWxlZF9wY2EpCiMjIERvIGEgUENBIHBsb3Qgb2YgdGhlIGxvZzIobm9ybWFsaXplZChkYXRhKSkgd2l0aG91dCBhbnkgYmF0Y2gtaW4tbW9kZWwgKGNkcyBmZWF0dXJlcykKCnBwKGZpbGU9ImltYWdlcy9maWd1cmVfczFkX2Nkcy5wZGYiLCBpbWFnZT1maWdfczFfY2RzJG5vcm1fY29yaGVhdCkKIyMgRG8gYSBub3JtYWxpemVkIGNvcnJlbGF0aW9uIGhlYXRtYXAKYGBgCgojIEZpZ3VyZSAxCgogKiBGaWd1cmUgMWEgZGlzdGFuY2UgaGVhdG1hcCBvZiB0aGUgbm9ybWFsaXplZCBkYXRhLgogKiBGaWd1cmUgMWIgaXMgYSBQQ0Egb2YgdGhlIG5vcm1hbGl6ZWQgZGF0YS4KCkluIGEgc2ltaWxhciBmYXNoaW9uIHRvIHdoYXQgaXMgYWJvdmUsIEkgYW0gcHJpbnRpbmcgdGhlIGZpZ3VyZSAxIGltYWdlcy4KCmBgYHtyIGZpZ3VyZV8xfQojIyBwcChmaWxlPSJpbWFnZXMvZmlndXJlXzFhLnBkZiIsIGZpZ19zMV9jZHMkbm9ybV9kaXNoZWF0KQojIyBTaG93IHRoZSBjaGFuZ2VzIGluIGNsdXN0ZXJpbmcgYWZ0ZXIgYWRkaW5nIGJhdGNoIHRvIHRoZSBtb2RlbCBhbmQgbm9ybWFsaXppbmcuCgpwcChmaWxlPSJpbWFnZXMvZmlndXJlXzFhX2Nkcy5wZGYiLCBpbWFnZT1maWdfczFfY2RzJG5vcm1fZGlzaGVhdCkKIyMgT2JzZXJ2ZSB0aGF0IHRoZSBjbHVzdGVyaW5nIGlzIG5lYXJseSBpZGVudGljYWwgd2hlbiBvbmx5IGxvb2tpbmcgYXQgdGhlIENEUyBmZWF0dXJlcy4KCiMjIHBwKGZpbGU9ImltYWdlcy9maWd1cmVfMWJfY2RzLnBkZiIsIGltYWdlPWZpZ19zMV9jZHMkbm9ybV9wY2EpCiMjIFZpc3VhbGl6ZSB0aGUgY2x1c3RlcmluZyBhZnRlciBub3JtYWxpemF0aW9uIHZpYSBQQ0EuCiMjIGtuaXRyOjprYWJsZShmaWdfczFfY2RzJG5vcm1fcGNhX3RhYmxlKQojIyB3cml0ZS5jc3YoZmlnX3MxX2NkcyRub3JtX3BjYV90YWJsZSwgZmlsZT0iaW1hZ2VzL2ZpZ18xYi5jc3YiKQoKcHAoZmlsZT0iaW1hZ2VzL2ZpZ3VyZV8xYl9jZHMucGRmIiwgaW1hZ2U9ZmlnX3MxX2NkcyRub3JtX3BjYSkKIyMgT25jZSBhZ2Fpbiwgc2VlIHRoYXQgaXQgaXMgbW9zdGx5IHVuY2hhbmdlZCB3aGVuIHVzaW5nIG9ubHkgQ0RTIGZlYXR1cmVzLgprbml0cjo6a2FibGUoZmlnX3MxX2NkcyRub3JtX3BjYV90YWJsZSkKd3JpdGUuY3N2KGZpZ19zMV9jZHMkbm9ybV9wY2FfdGFibGUsIGZpbGU9ImltYWdlcy9maWdfMWFfY2RzLmNzdiIpCmBgYAoKIyBTYW1wbGUgbWV0cmljcwoKVGhlIGZvbGxvd2luZyBpcyBtb3N0bHkgdXNlZCB0byBjb21wYXJlIGRpZmZlcmVudCBtZXRob2RvbG9naWVzIGFuZCBpcyB0aGVyZWZvcmUKbm90IGxpa2VseSB0byBiZSB1c2VmdWwgZm9yIG1vc3QuCgpUaGUgdmFyaW91cyBtZXRyaWNzIHVzZWQgdG8gZGVzY3JpYmUgYW5kIGV4YW1pbmUgdGhlIGRhdGEgY29tZSBvbmNlIGJlZm9yZSwgYW5kIG9uY2UgYWZ0ZXIgbm9ybWFsaXphdGlvbi4KClNvbWUgb3RoZXIgYW5hbHlzZXMgcGVyZm9ybWVkIHN1Z2dlc3QgYSBwb3NzaWJsZSBzd2l0Y2ggYmV0d2VlbiB0d28gc2FtcGxlcy4gIFdlIGNhbiBhcnRpZmljYWxseSBzZWUKd2hhdCB0aGUgZGF0YSB3b3VsZCBsb29rIGxpa2UgaWYgdGhhdCBpcyB0cnVlIGJ5IHN3aXRjaGluZyB0aG9zZSB0d28gc2FtcGxlcyBpbiBhIHNlcGFyYXRlCmV4cGVyaW1lbnRhbCBkZXNpZ24uCgojIFRPRE8gMjAxNjExICM0CgpQQk1DOiB2YXJpYW5jZSBwYXJ0aXRpb24gaHVtYW4sICJBcmUgdGhlcmUgYW55IGdlbmVzIHdpdGggdmFyaWFuY2Ugd2UgY2FuIGFzY3JpYmUgdG8gY29uZGl0aW9uPyIKVGhhdCBzZXQgb2YgZ2VuZXMgaXMgdGhlIG1vc3QgaW50ZXJlc3RpbmcuIC0tIHVzZSB0aGUgdmFyaWFuY2UgcGFyaXRpb24gdGFibGUgYW5kIHB1bGwgdGhlIHRvcCAyMDAuClJlcG9ydCBiYWNrIHRoZSAlIHZhcmlhbmNlIGJ5IGNvbmRpdGlvbiBmb3IgYWxsIG9mIHRoZXNlIGdlbmVzLgoKIyBWYXJpYW5jZSBQYXJ0aXRpb24KCkluIHRoZSBmb2xsb3dpbmcsIEkgd2lsbCBhdHRlbXB0IHRvIGZpbmQgdGhlIHZhcmlhbmNlIGFzc29jaWF0ZWQgd2l0aCBkaWZmZXJlbnQgZXhwZXJpbWVudGFsIGZhY3RvcnMKaW4gdGhlIG1hY3JvcGhhZ2UgZGF0YSB3aXRoIG1hcHBpbmdzIGFnYWluc3QgdGhlIGh1bWFuIHRyYW5zY3JpcHRvbWUuCgpgYGB7ciBwYXJhc2l0ZV9lc3RpbWF0ZXNfbm9ybWFsLCBmaWcuc2hvdz0iaGlkZSJ9CnBhcmFzaXRlX2V4cHQgPC0gc20oY3JlYXRlX2V4cHQoCiAgbWV0YWRhdGE9InNhbXBsZV9zaGVldHMvYWxsX3NhbXBsZXMtY29tYmluZWQueGxzeCIsCiAgZ2VuZV9pbmZvPWxwX2Fubm90YXRpb25zLAogIGZpbGVfY29sdW1uPSJwYXJhc2l0ZWZpbGUiKSkKCmxwX21hY3IgPC0gc3Vic2V0X2V4cHQocGFyYXNpdGVfZXhwdCwgc3Vic2V0PSJleHBlcmltZW50bmFtZT09J21hY3JvcGhhZ2UnIikKY2hvc2VuX2NvbG9ycyA8LSBjKCIjOTkwMDAwIiwgIiMwMDAwOTkiKQpuYW1lcyhjaG9zZW5fY29sb3JzKSA8LSBjKCJjaHIiLCAic2giKQpscF9tYWNyIDwtIHNldF9leHB0X2NvbG9ycyhscF9tYWNyLCBjb2xvcnM9Y2hvc2VuX2NvbG9ycykKbHBfdGVzdGluZyA8LSBzbSh3cml0ZV9leHB0KAogIGxwX21hY3IsIHZpb2xpbj1UUlVFLAogIGV4Y2VsPXBhc3RlMCgiZXhjZWwvbWFjcm9waGFnZV9wYXJhc2l0ZV9kYXRhLXYiLCB2ZXIsICIueGxzeCIpKSkKYGBgCgpgYGB7ciB2cF9zaG93fQpscF90ZXN0aW5nJG5vcm1fcGNhCmxwX3Rlc3Rpbmckbm9ybV92aW9saW4KYGBgCgpOb3cgbGV0cyB0cnkgcmVtb3Zpbmcgc29tZSBvZiB0aGUgc3Vycm9nYXRlcywgdGhlIHR3byBwcmltYXJ5IGNhbmRpZGF0ZXMgYXJlIHRoZSBzdHJhaW5zCndoaWNoIEkgcHJveHkgd2l0aCAzIGNvbHVtbnM6IHNucGNsYWRlLCBzbnBjbGFkZXYyLCBhbmQgc25wY2xhZGV2MzsgYW5kIHRoZSBiYXRjaC4gIEluIHRoaXMKZGF0YSBzZXQgYmF0Y2ggaXMgZWl0aGVyIGEgb3IgYi4KCkluIHRoZW9yeSwgc3ZhIHNob3VsZCBwaWNrIHVwIGJvdGggb2YgdGhvc2UgaW4gb25lIGludm9jYXRpb24uCgpgYGB7ciBnZW5lcmF0ZV9ncmFwaHMsIGZpZy5zaG93PSJoaWRlIn0KIyMgUGVyZm9ybSBhICdub3JtYWwnIHN2YQpscF9tYWNyX3N2YSA8LSBzbShub3JtYWxpemVfZXhwdChscF9tYWNyLCBiYXRjaD0ic3Zhc2VxIiwgZmlsdGVyPVRSVUUpKQojIyBQbGF5IHdpdGggdGhlIG5vcm1hbGl6YXRpb24gb2YgaXQKbHBfbWFjcl9zdmFfbm9ybSA8LSBzbShub3JtYWxpemVfZXhwdChscF9tYWNyX3N2YSwgZmlsdGVyPVRSVUUsIGNvbnZlcnQ9ImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybT0icXVhbnQiLCB0cmFuc2Zvcm09ImxvZzIiKSkKbHBfbWFjcl9zdmFfbm9ybV9tZXRyIDwtIHNtKGdyYXBoX21ldHJpY3MobHBfbWFjcl9zdmFfbm9ybSkpCiMjIFRyeSBsaW1tYSdzIG1ldGhvZApscF9tYWNyX2xpbW1hX2ZjcWxyIDwtIHNtKG5vcm1hbGl6ZV9leHB0KGxwX21hY3IsIGJhdGNoPSJsaW1tYSIsIGZpbHRlcj1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2gyPSJzbnBjbGFkZXYzIiwgY29udmVydD0iY3BtIiwgbm9ybT0icXVhbnQiKSkKYGBgCgojIyBTdGFydCB3aXRoIGEgcGNhIGZyb20gc3ZhCgpgYGB7ciBzdmFfYXR0ZW1wdH0KbHBfbWFjcl9zdmFfbm9ybV9tZXRyJHBjYXBsb3QKYGBgCgojIyBUcnkgbGltbWEncyByZW1vdmViYXRjaGVmZmVjdAoKQW5vdGhlciBtZXRob2QgbWlnaHQgYmUgdG8gdHJ5IHVzaW5nIGxpbW1hcmVzaWQgdG8gZXhwbGljaXRseSBwdWxsIGJvdGggY29sdW1ucy4KCmBgYHtyIHJlc2lkX2F0dGVtcHR9CnBsb3RfcGNhKGxwX21hY3JfbGltbWFfZmNxbHIpJHBsb3QKYGBgCgpBbm90aGVyIG1ldGhvZCBtaWdodCBiZSB0byB0cnkgcGNhIG9uIHR3byBzZXBhcmF0ZSBpbnZvY2F0aW9ucy4KCmBgYHtyIHBlcmZvcm1fcmVzaWR1YWxzLCBmaWcuc2hvdz0iaGlkZSJ9CiMjIGZycnByIHJwcnJmCiMjIHJhdyhwY2EocmF3KHJhdyhmaWx0ZXIoZGF0YSkpKSkpCiMjIHRodXMgZmNxc2wgd291bGQgYmUgbG9nMihzdmEocXVhbnQoY3BtKGZpbHRlcihkYXRhKSkpKSkKbHBfbWFjcl9ycHJyZiA8LSBzbShub3JtYWxpemVfZXhwdChscF9tYWNyLCBiYXRjaD0icGNhIiwgZmlsdGVyPVRSVUUpKQpscF9tYWNyX3JwcnJmIDwtIHNldF9leHB0X2JhdGNoZXMoZXhwdD1scF9tYWNyX3JwcnJmLCBmYWN0PSJzbnBjbGFkZXYzIikKbHBfbWFjcl9ycHJyZiA8LSBzbShub3JtYWxpemVfZXhwdChscF9tYWNyX3JwcnJmLCBiYXRjaD0icGNhIikpCmxwX21hY3JfbHBxY2YgPC0gc20obm9ybWFsaXplX2V4cHQobHBfbWFjcl9ycHJyZiwgY29udmVydD0iY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtPSJxdWFudCIsIHRyYW5zZm9ybT0ibG9nMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyPVRSVUUpKQpscF9tYWNyX2xwcWNmX21ldHIgPC0gc20oZ3JhcGhfbWV0cmljcyhscF9tYWNyX2xwcWNmKSkKYGBgCgojIyMgU2hvdyB0aGUgcGxvdHMgZnJvbSBhYm92ZS4KCmBgYHtyIHBjYV9hdHRlbXB0fQpscF9tYWNyX2xwcWNmX21ldHIkcGNhcGxvdApgYGAKCmBgYHtyIHNhdmVtZX0KbWVzc2FnZShwYXN0ZTAoIlRoaXMgaXMgaHBnbHRvb2xzIGNvbW1pdDogIiwgZ2V0X2dpdF9jb21taXQoKSkpCnRoaXNfc2F2ZSA8LSBwYXN0ZTAoZ3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSIiLCB4PXJtZF9maWxlKSwgIi12IiwgdmVyLCAiLnJkYS54eiIpCm1lc3NhZ2UocGFzdGUwKCJTYXZpbmcgdG8gIiwgdGhpc19zYXZlKSkKdG1wIDwtIHNtKHNhdmVtZShmaWxlbmFtZT10aGlzX3NhdmUpKQpwYW5kZXI6OnBhbmRlcihzZXNzaW9uSW5mbygpKQpgYGAK