index.html annotation.html

This document turns to the infection of PBMC cells with L.panamensis. This data is particularly strangely affected by the different strains used to infect the cells, and as a result is both useful and troubling.

1 Look during infection

“Changes during infection hpgl0630-0636 and hpgl0650-hpgl0663”

Start out by creating the expt and poking at it to see how well/badly behaved the data is.

## Reread the sample sheet because I am fiddling with other possible surrogates (like strain)
## In fact, copy it to a separate sheet because these samples are a mess
infect_para <- expt_subset(parasite_expt, subset="experimentname=='infection'")
chosen_colors <- c("#990000", "#000099")
names(chosen_colors) <- c("pbmc_ch","pbmc_sh")
infect_para <- set_expt_colors(infect_para, colors=chosen_colors)

1.1 Generate plots describing the data

The following creates all the metric plots of the raw data.

infect_para_metrics <- sm(graph_metrics(infect_para))

Now visualize some relevant metrics.

## Repeat for the parasite
infect_para_metrics$libsize

## Wow, the range of coverage is shockingly large
infect_para_metrics$density

## But this looks much better I think
infect_para_metrics$boxplot

infect_para_written <- sm(write_expt(infect_para,
                          excel=paste0("excel/infection_parasite_data-v", ver, ".xlsx"),
                          violin=TRUE))

1.1.1 Default normalization

Now perform the ‘default’ normalization we use in the lab and look again.

infectpara_norm <- sm(normalize_expt(infect_para, convert="cpm", filter=TRUE, norm="quant"))
infectpara_norm_metrics <- sm(graph_metrics(infectpara_norm))

1.2 PCA: Parasite edition

In this section, try out some normalizations/batch corrections and see the effect in PCA plots.

Start out by taking the parasite data and doing the default normalization and see what there is to see.

l2qcpm_para <- sm(normalize_expt(infect_para, transform="log2", convert="cpm",
                                 norm="quant", filter=TRUE))
l2qcpm_para_pca <- sm(plot_pca(l2qcpm_para))
l2qcpm_para_pca$plot

## Though the colors don't show it well, the samples are actually split beautifully by strain, but
## clearly not by chronic/healing
knitr::kable(l2qcpm_para_pca$table)
sampleid condition batch batch_int PC1 PC2 colors labels
hpgl0631 HPGL0631 pbmc_ch d108 2 -0.4988 -0.1901 #990000 HPGL0631
hpgl0632 HPGL0632 pbmc_ch d108 2 0.1617 -0.1427 #990000 HPGL0632
hpgl0633 HPGL0633 pbmc_ch d108 2 -0.0137 0.2963 #990000 HPGL0633
hpgl0634 HPGL0634 pbmc_sh d108 2 0.1339 -0.2135 #000099 HPGL0634
hpgl0635 HPGL0635 pbmc_sh d108 2 -0.0474 0.3478 #000099 HPGL0635
hpgl0636 HPGL0636 pbmc_sh d108 2 0.1801 -0.1622 #000099 HPGL0636
hpgl0651 HPGL0651 pbmc_ch d110 3 -0.4560 -0.1643 #990000 HPGL0651
hpgl0652 HPGL0652 pbmc_ch d110 3 0.2050 -0.0989 #990000 HPGL0652
hpgl0653 HPGL0653 pbmc_ch d110 3 0.0627 0.3543 #990000 HPGL0653
hpgl0654 HPGL0654 pbmc_sh d110 3 0.1987 -0.1988 #000099 HPGL0654
hpgl0655 HPGL0655 pbmc_sh d110 3 -0.0084 0.3517 #000099 HPGL0655
hpgl0656 HPGL0656 pbmc_sh d110 3 0.2129 -0.1374 #000099 HPGL0656
hpgl0658 HPGL0658 pbmc_ch d107 1 -0.5060 -0.1996 #990000 HPGL0658
hpgl0659 HPGL0659 pbmc_ch d107 1 0.1391 -0.1387 #990000 HPGL0659
hpgl0660 HPGL0660 pbmc_ch d107 1 -0.0029 0.3053 #990000 HPGL0660
hpgl0661 HPGL0661 pbmc_sh d107 1 0.1403 -0.1908 #000099 HPGL0661
hpgl0662 HPGL0662 pbmc_sh d107 1 -0.0800 0.3288 #000099 HPGL0662
hpgl0663 HPGL0663 pbmc_sh d107 1 0.1788 -0.1472 #000099 HPGL0663

Now repeat the same thing, but let sva minimize surrogate variables.

l2qcpm_normbatch <- sm(normalize_expt(infect_para, transform="log2", convert="cpm", norm="quant", filter=TRUE, batch="sva"))
l2qcpm_normbatch_pca <- plot_pca(l2qcpm_normbatch)

Now plot the result and see if things make more sense.

l2qcpm_normbatch_pca$plot
Adding SVA to the normalization does not help much.

Adding SVA to the normalization does not help much.

## That does nothing significant to clarify things.
knitr::kable(l2qcpm_normbatch_pca$table)
sampleid condition batch batch_int PC1 PC2 colors labels
hpgl0631 HPGL0631 pbmc_ch d108 2 -0.3179 -0.0846 #990000 HPGL0631
hpgl0632 HPGL0632 pbmc_ch d108 2 0.5265 0.0599 #990000 HPGL0632
hpgl0633 HPGL0633 pbmc_ch d108 2 -0.1376 0.0246 #990000 HPGL0633
hpgl0634 HPGL0634 pbmc_sh d108 2 -0.1523 0.3362 #000099 HPGL0634
hpgl0635 HPGL0635 pbmc_sh d108 2 -0.1448 -0.0992 #000099 HPGL0635
hpgl0636 HPGL0636 pbmc_sh d108 2 -0.1758 -0.1116 #000099 HPGL0636
hpgl0651 HPGL0651 pbmc_ch d110 3 0.0806 0.0665 #990000 HPGL0651
hpgl0652 HPGL0652 pbmc_ch d110 3 -0.2465 0.0111 #990000 HPGL0652
hpgl0653 HPGL0653 pbmc_ch d110 3 -0.1124 0.0524 #990000 HPGL0653
hpgl0654 HPGL0654 pbmc_sh d110 3 -0.2810 0.0921 #000099 HPGL0654
hpgl0655 HPGL0655 pbmc_sh d110 3 0.2511 0.0681 #000099 HPGL0655
hpgl0656 HPGL0656 pbmc_sh d110 3 0.0701 -0.4988 #000099 HPGL0656
hpgl0658 HPGL0658 pbmc_ch d107 1 0.0630 0.0351 #990000 HPGL0658
hpgl0659 HPGL0659 pbmc_ch d107 1 -0.1255 0.2471 #990000 HPGL0659
hpgl0660 HPGL0660 pbmc_ch d107 1 -0.1392 0.0171 #990000 HPGL0660
hpgl0661 HPGL0661 pbmc_sh d107 1 0.4089 0.3793 #000099 HPGL0661
hpgl0662 HPGL0662 pbmc_sh d107 1 0.2387 0.0189 #000099 HPGL0662
hpgl0663 HPGL0663 pbmc_sh d107 1 0.1941 -0.6142 #000099 HPGL0663

No, not really, so lets change things by putting the ‘snp status’ as the “batch” factor and minimize it with sva/combat.

infect_parav2 <- set_expt_condition(infect_para, fact="state")
infect_parav2 <- set_expt_batch(infect_parav2, fact="snpclade")
l2qcpm_snpbatch_straincond_sva <- sm(normalize_expt(infect_parav2, transform="log2", convert="cpm",
                                                    norm="quant", filter=TRUE,
                                                    batch="sva"))
l2qcpm_snpbatch_straincond_pca <- plot_pca(l2qcpm_snpbatch_straincond_sva)
l2qcpm_snpbatch_straincond_pca$plot
SNP status does not clarify things.

SNP status does not clarify things.

## Pulling strain 5430 away from the others makes a semi-split
knitr::kable(l2qcpm_snpbatch_straincond_pca$table)
sampleid condition batch batch_int PC1 PC2 colors labels
hpgl0631 HPGL0631 chronic red 4 -0.3179 -0.0846 #1B9E77 HPGL0631
hpgl0632 HPGL0632 chronic yellow 6 0.5265 0.0599 #1B9E77 HPGL0632
hpgl0633 HPGL0633 chronic blue_chronic 1 -0.1376 0.0246 #1B9E77 HPGL0633
hpgl0634 HPGL0634 self_heal white 5 -0.1523 0.3362 #7570B3 HPGL0634
hpgl0635 HPGL0635 self_heal blue_self 2 -0.1448 -0.0992 #7570B3 HPGL0635
hpgl0636 HPGL0636 self_heal pink 3 -0.1758 -0.1116 #7570B3 HPGL0636
hpgl0651 HPGL0651 chronic red 4 0.0806 0.0665 #1B9E77 HPGL0651
hpgl0652 HPGL0652 chronic yellow 6 -0.2465 0.0111 #1B9E77 HPGL0652
hpgl0653 HPGL0653 chronic blue_chronic 1 -0.1124 0.0524 #1B9E77 HPGL0653
hpgl0654 HPGL0654 self_heal white 5 -0.2810 0.0921 #7570B3 HPGL0654
hpgl0655 HPGL0655 self_heal blue_self 2 0.2511 0.0681 #7570B3 HPGL0655
hpgl0656 HPGL0656 self_heal pink 3 0.0701 -0.4988 #7570B3 HPGL0656
hpgl0658 HPGL0658 chronic red 4 0.0630 0.0351 #1B9E77 HPGL0658
hpgl0659 HPGL0659 chronic yellow 6 -0.1255 0.2471 #1B9E77 HPGL0659
hpgl0660 HPGL0660 chronic blue_chronic 1 -0.1392 0.0171 #1B9E77 HPGL0660
hpgl0661 HPGL0661 self_heal white 5 0.4089 0.3793 #7570B3 HPGL0661
hpgl0662 HPGL0662 self_heal blue_self 2 0.2387 0.0189 #7570B3 HPGL0662
hpgl0663 HPGL0663 self_heal pink 3 0.1941 -0.6142 #7570B3 HPGL0663
l2qcpm_snpbatch_straincond_pca <- plot_pca(l2qcpm_snpbatch_straincond_combat)
l2qcpm_snpbatch_straincond_pca$plot
SNP status does not clarify things.

SNP status does not clarify things.

## Doing the same thing with combat has little or no effect.
knitr::kable(l2qcpm_snpbatch_straincond_pca$table)
sampleid condition batch batch_int PC1 PC2 colors labels
hpgl0631 HPGL0631 chronic red 4 -0.4988 -0.1901 #1B9E77 HPGL0631
hpgl0632 HPGL0632 chronic yellow 6 0.1617 -0.1427 #1B9E77 HPGL0632
hpgl0633 HPGL0633 chronic blue_chronic 1 -0.0137 0.2963 #1B9E77 HPGL0633
hpgl0634 HPGL0634 self_heal white 5 0.1339 -0.2135 #7570B3 HPGL0634
hpgl0635 HPGL0635 self_heal blue_self 2 -0.0474 0.3478 #7570B3 HPGL0635
hpgl0636 HPGL0636 self_heal pink 3 0.1801 -0.1622 #7570B3 HPGL0636
hpgl0651 HPGL0651 chronic red 4 -0.4560 -0.1643 #1B9E77 HPGL0651
hpgl0652 HPGL0652 chronic yellow 6 0.2050 -0.0989 #1B9E77 HPGL0652
hpgl0653 HPGL0653 chronic blue_chronic 1 0.0627 0.3543 #1B9E77 HPGL0653
hpgl0654 HPGL0654 self_heal white 5 0.1987 -0.1988 #7570B3 HPGL0654
hpgl0655 HPGL0655 self_heal blue_self 2 -0.0084 0.3517 #7570B3 HPGL0655
hpgl0656 HPGL0656 self_heal pink 3 0.2129 -0.1374 #7570B3 HPGL0656
hpgl0658 HPGL0658 chronic red 4 -0.5060 -0.1996 #1B9E77 HPGL0658
hpgl0659 HPGL0659 chronic yellow 6 0.1391 -0.1387 #1B9E77 HPGL0659
hpgl0660 HPGL0660 chronic blue_chronic 1 -0.0029 0.3053 #1B9E77 HPGL0660
hpgl0661 HPGL0661 self_heal white 5 0.1403 -0.1908 #7570B3 HPGL0661
hpgl0662 HPGL0662 self_heal blue_self 2 -0.0800 0.3288 #7570B3 HPGL0662
hpgl0663 HPGL0663 self_heal pink 3 0.1788 -0.1472 #7570B3 HPGL0663

Ok, so let us remove the healing state with combat and see if that allows us to see a split on some other factor.

infect_parastrain <- set_expt_condition(infect_para, fact="pathogenstrain")
infect_parastrain <- set_expt_batch(infect_parastrain, fact="state")
l2qcpm_parastrain <- sm(normalize_expt(infect_parastrain, transform="log2", convert="cpm", norm="quant", filter=TRUE, batch="combat_scale"))
l2qcpm_parastrain_pca <- plot_pca(l2qcpm_parastrain)
l2qcpm_parastrain_pca$plot
hmm ok, I think I quit for today.

hmm ok, I think I quit for today.

## wtf!?!?  how did this happen?
knitr::kable(l2qcpm_parastrain_pca$table)
sampleid condition batch batch_int PC1 PC2 colors labels
hpgl0631 HPGL0631 s5430 chronic 1 -0.4266 0.2780 #1B9E77 HPGL0631
hpgl0632 HPGL0632 s5397 chronic 1 -0.1580 -0.3384 #D95F02 HPGL0632
hpgl0633 HPGL0633 s2504 chronic 1 -0.0378 -0.0036 #7570B3 HPGL0633
hpgl0634 HPGL0634 s2272 self_heal 2 0.1090 -0.0865 #E7298A HPGL0634
hpgl0635 HPGL0635 s1022 self_heal 2 0.2916 0.3432 #66A61E HPGL0635
hpgl0636 HPGL0636 s2189 self_heal 2 0.1751 -0.1096 #E6AB02 HPGL0636
hpgl0651 HPGL0651 s5430 chronic 1 -0.4043 0.2412 #1B9E77 HPGL0651
hpgl0652 HPGL0652 s5397 chronic 1 -0.1295 -0.3764 #D95F02 HPGL0652
hpgl0653 HPGL0653 s2504 chronic 1 0.0055 -0.0715 #7570B3 HPGL0653
hpgl0654 HPGL0654 s2272 self_heal 2 0.1340 -0.1603 #E7298A HPGL0654
hpgl0655 HPGL0655 s1022 self_heal 2 0.3060 0.2918 #66A61E HPGL0655
hpgl0656 HPGL0656 s2189 self_heal 2 0.1928 -0.1450 #E6AB02 HPGL0656
hpgl0658 HPGL0658 s5430 chronic 1 -0.4317 0.2803 #1B9E77 HPGL0658
hpgl0659 HPGL0659 s5397 chronic 1 -0.1645 -0.3141 #D95F02 HPGL0659
hpgl0660 HPGL0660 s2504 chronic 1 -0.0336 -0.0085 #7570B3 HPGL0660
hpgl0661 HPGL0661 s2272 self_heal 2 0.1228 -0.0884 #E7298A HPGL0661
hpgl0662 HPGL0662 s1022 self_heal 2 0.2723 0.3717 #66A61E HPGL0662
hpgl0663 HPGL0663 s2189 self_heal 2 0.1770 -0.1041 #E6AB02 HPGL0663

index.html

LS0tCnRpdGxlOiAiUk5Bc2VxIG9mIEwucGFuYW1lbnNpczogSW5mZWN0aW9uIFNhbXBsZSBFc3RpbWF0aW9uLCBwYXJhc2l0ZSB0cmFuc2NyaXB0b21lLiIKYXV0aG9yOiAiYXRiIGFiZWxld0BnbWFpbC5jb20iCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogaHRtbF9kb2N1bWVudDoKICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgY29kZV9mb2xkaW5nOiBzaG93CiAgZmlnX2NhcHRpb246IHRydWUKICBmaWdfaGVpZ2h0OiA3CiAgZmlnX3dpZHRoOiA3CiAgaGlnaGxpZ2h0OiB0YW5nbwogIGtlZXBfbWQ6IGZhbHNlCiAgbW9kZTogc2VsZmNvbnRhaW5lZAogIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgdGhlbWU6IGNvc21vCiAgdG9jOiB0cnVlCiAgdG9jX2Zsb2F0OgogICAgY29sbGFwc2VkOiBmYWxzZQogICAgc21vb3RoX3Njcm9sbDogZmFsc2UKLS0tCgo8c3R5bGU+CiAgPCEtLSBEb2N1bWVudCBwcmVsdWRlIHJldmlzaW9uIDIwMTYtMTAgLS0+CiAgYm9keSAubWFpbi1jb250YWluZXIgewogICAgbWF4LXdpZHRoOiAxNjAwcHg7Cn0KPC9zdHlsZT4KCmBgYHtyIG9wdGlvbnMsIGluY2x1ZGU9RkFMU0V9CiMjIFRoZXNlIGFyZSB0aGUgb3B0aW9ucyBJIHRlbmQgdG8gZmF2b3IKbGlicmFyeSgiaHBnbHRvb2xzIikKdHQgPC0gc20oZGV2dG9vbHM6OmxvYWRfYWxsKCJ+L2hwZ2x0b29scyIpKQprbml0cjo6b3B0c19rbml0JHNldCgKICAgIHByb2dyZXNzID0gVFJVRSwKICAgIHZlcmJvc2UgPSBUUlVFLAogICAgd2lkdGggPSA5MCwKICAgIGVjaG8gPSBUUlVFKQprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgICBlcnJvciA9IFRSVUUsCiAgICBmaWcud2lkdGggPSA4LAogICAgZmlnLmhlaWdodCA9IDgsCiAgICBkcGkgPSA5NikKb3B0aW9ucygKICAgIGRpZ2l0cyA9IDQsCiAgICBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UsCiAgICBrbml0ci5kdXBsaWNhdGUubGFiZWwgPSAiYWxsb3ciKQpnZ3Bsb3QyOjp0aGVtZV9zZXQoZ2dwbG90Mjo6dGhlbWVfYncoYmFzZV9zaXplPTEwKSkKc2V0LnNlZWQoMSkKcm1kX2ZpbGUgPC0gImluZmVjdGlvbl9lc3RpbWF0aW9uX3BhcmFzaXRlLlJtZCIKdmVyIDwtICIyMDE3MDIwMiIKYGBgCgpbaW5kZXguaHRtbF0oaW5kZXguaHRtbCkgW2Fubm90YXRpb24uaHRtbF0oYW5ub3RhdGlvbi5odG1sKQoKYGBge3IgcmVuZGVyaW5nLCBpbmNsdWRlPUZBTFNFLCBldmFsPUZBTFNFfQojIyBUaGlzIGJsb2NrIGlzIHVzZWQgdG8gcmVuZGVyIGEgZG9jdW1lbnQgZnJvbSB3aXRoaW4gaXQuCnJtYXJrZG93bjo6cmVuZGVyKHJtZF9maWxlKQoKIyMgQW4gZXh0cmEgcmVuZGVyZXIgZm9yIHBkZiBvdXRwdXQKcm1hcmtkb3duOjpyZW5kZXIocm1kX2ZpbGUsIG91dHB1dF9mb3JtYXQ9InBkZl9kb2N1bWVudCIsIG91dHB1dF9vcHRpb25zPWMoInNraXBfaHRtbCIpKQojIyBPciB0byBzYXZlL2xvYWQgbGFyZ2UgUmRhdGEgZmlsZXMuCmhwZ2x0b29sczo6OnNhdmVtZSgpCmhwZ2x0b29sczo6OmxvYWRtZSgpCnJtKGxpc3Q9bHMoKSkKYGBgCgoKVGhpcyBkb2N1bWVudCB0dXJucyB0byB0aGUgaW5mZWN0aW9uIG9mIFBCTUMgY2VsbHMgd2l0aCBMLnBhbmFtZW5zaXMuICBUaGlzIGRhdGEgaXMgcGFydGljdWxhcmx5IHN0cmFuZ2VseQphZmZlY3RlZCBieSB0aGUgZGlmZmVyZW50IHN0cmFpbnMgdXNlZCB0byBpbmZlY3QgdGhlIGNlbGxzLCBhbmQgYXMgYSByZXN1bHQgaXMgYm90aCB1c2VmdWwgYW5kIHRyb3VibGluZy4KCmBgYHtyIGxvYWRtZSwgaW5jbHVkZT1GQUxTRX0KdG1wIDwtIHNtKGxvYWRtZShmaWxlbmFtZT0iYW5ub3RhdGlvbi5yZGEueHoiKSkKYGBgCgojIExvb2sgZHVyaW5nIGluZmVjdGlvbgoKIkNoYW5nZXMgZHVyaW5nIGluZmVjdGlvbiBocGdsMDYzMC0wNjM2IGFuZCBocGdsMDY1MC1ocGdsMDY2MyIKClN0YXJ0IG91dCBieSBjcmVhdGluZyB0aGUgZXhwdCBhbmQgcG9raW5nIGF0IGl0IHRvIHNlZSBob3cgd2VsbC9iYWRseSBiZWhhdmVkIHRoZSBkYXRhIGlzLgoKYGBge3IgaW5mZWN0aW9uX2V4cHR9CiMjIFJlcmVhZCB0aGUgc2FtcGxlIHNoZWV0IGJlY2F1c2UgSSBhbSBmaWRkbGluZyB3aXRoIG90aGVyIHBvc3NpYmxlIHN1cnJvZ2F0ZXMgKGxpa2Ugc3RyYWluKQojIyBJbiBmYWN0LCBjb3B5IGl0IHRvIGEgc2VwYXJhdGUgc2hlZXQgYmVjYXVzZSB0aGVzZSBzYW1wbGVzIGFyZSBhIG1lc3MKaW5mZWN0X3BhcmEgPC0gZXhwdF9zdWJzZXQocGFyYXNpdGVfZXhwdCwgc3Vic2V0PSJleHBlcmltZW50bmFtZT09J2luZmVjdGlvbiciKQpjaG9zZW5fY29sb3JzIDwtIGMoIiM5OTAwMDAiLCAiIzAwMDA5OSIpCm5hbWVzKGNob3Nlbl9jb2xvcnMpIDwtIGMoInBibWNfY2giLCJwYm1jX3NoIikKaW5mZWN0X3BhcmEgPC0gc2V0X2V4cHRfY29sb3JzKGluZmVjdF9wYXJhLCBjb2xvcnM9Y2hvc2VuX2NvbG9ycykKYGBgCgojIyBHZW5lcmF0ZSBwbG90cyBkZXNjcmliaW5nIHRoZSBkYXRhCgpUaGUgZm9sbG93aW5nIGNyZWF0ZXMgYWxsIHRoZSBtZXRyaWMgcGxvdHMgb2YgdGhlIHJhdyBkYXRhLgoKYGBge3IgbWFjcm9waGFnZV9wbG90cywgZmlnLnNob3c9ImhpZGUifQppbmZlY3RfcGFyYV9tZXRyaWNzIDwtIHNtKGdyYXBoX21ldHJpY3MoaW5mZWN0X3BhcmEpKQpgYGAKCk5vdyB2aXN1YWxpemUgc29tZSByZWxldmFudCBtZXRyaWNzLgoKYGBge3IgbWFjcm9waGFnZV9yYXdfbWV0cmljc30KIyMgUmVwZWF0IGZvciB0aGUgcGFyYXNpdGUKaW5mZWN0X3BhcmFfbWV0cmljcyRsaWJzaXplCiMjIFdvdywgdGhlIHJhbmdlIG9mIGNvdmVyYWdlIGlzIHNob2NraW5nbHkgbGFyZ2UKaW5mZWN0X3BhcmFfbWV0cmljcyRkZW5zaXR5CiMjIEJ1dCB0aGlzIGxvb2tzIG11Y2ggYmV0dGVyIEkgdGhpbmsKaW5mZWN0X3BhcmFfbWV0cmljcyRib3hwbG90CgppbmZlY3RfcGFyYV93cml0dGVuIDwtIHNtKHdyaXRlX2V4cHQoaW5mZWN0X3BhcmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZWw9cGFzdGUwKCJleGNlbC9pbmZlY3Rpb25fcGFyYXNpdGVfZGF0YS12IiwgdmVyLCAiLnhsc3giKSwKICAgICAgICAgICAgICAgICAgICAgICAgICB2aW9saW49VFJVRSkpCmBgYAoKIyMjIERlZmF1bHQgbm9ybWFsaXphdGlvbgoKTm93IHBlcmZvcm0gdGhlICdkZWZhdWx0JyBub3JtYWxpemF0aW9uIHdlIHVzZSBpbiB0aGUgbGFiIGFuZCBsb29rIGFnYWluLgoKYGBge3Igbm9ybWFsaXplX2luZmVjdCwgZmlnLnNob3c9ImhpZGUifQppbmZlY3RwYXJhX25vcm0gPC0gc20obm9ybWFsaXplX2V4cHQoaW5mZWN0X3BhcmEsIGNvbnZlcnQ9ImNwbSIsIGZpbHRlcj1UUlVFLCBub3JtPSJxdWFudCIpKQppbmZlY3RwYXJhX25vcm1fbWV0cmljcyA8LSBzbShncmFwaF9tZXRyaWNzKGluZmVjdHBhcmFfbm9ybSkpCmBgYAoKIyMgUENBOiBQYXJhc2l0ZSBlZGl0aW9uCgpJbiB0aGlzIHNlY3Rpb24sIHRyeSBvdXQgc29tZSBub3JtYWxpemF0aW9ucy9iYXRjaCBjb3JyZWN0aW9ucyBhbmQgc2VlIHRoZSBlZmZlY3QgaW4gUENBIHBsb3RzLgoKU3RhcnQgb3V0IGJ5IHRha2luZyB0aGUgcGFyYXNpdGUgZGF0YSBhbmQgZG9pbmcgdGhlIGRlZmF1bHQgbm9ybWFsaXphdGlvbiBhbmQgc2VlIHdoYXQgdGhlcmUgaXMgdG8gc2VlLgoKYGBge3IgcGNhX3BhcmFzaXRlfQpsMnFjcG1fcGFyYSA8LSBzbShub3JtYWxpemVfZXhwdChpbmZlY3RfcGFyYSwgdHJhbnNmb3JtPSJsb2cyIiwgY29udmVydD0iY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybT0icXVhbnQiLCBmaWx0ZXI9VFJVRSkpCmwycWNwbV9wYXJhX3BjYSA8LSBzbShwbG90X3BjYShsMnFjcG1fcGFyYSkpCmwycWNwbV9wYXJhX3BjYSRwbG90CiMjIFRob3VnaCB0aGUgY29sb3JzIGRvbid0IHNob3cgaXQgd2VsbCwgdGhlIHNhbXBsZXMgYXJlIGFjdHVhbGx5IHNwbGl0IGJlYXV0aWZ1bGx5IGJ5IHN0cmFpbiwgYnV0CiMjIGNsZWFybHkgbm90IGJ5IGNocm9uaWMvaGVhbGluZwprbml0cjo6a2FibGUobDJxY3BtX3BhcmFfcGNhJHRhYmxlKQpgYGAKCk5vdyByZXBlYXQgdGhlIHNhbWUgdGhpbmcsIGJ1dCBsZXQgc3ZhIG1pbmltaXplIHN1cnJvZ2F0ZSB2YXJpYWJsZXMuCgpgYGB7ciBwY2Ffc3ZhLCBmaWcuc2hvdz0iaGlkZSJ9CmwycWNwbV9ub3JtYmF0Y2ggPC0gc20obm9ybWFsaXplX2V4cHQoaW5mZWN0X3BhcmEsIHRyYW5zZm9ybT0ibG9nMiIsIGNvbnZlcnQ9ImNwbSIsIG5vcm09InF1YW50IiwgZmlsdGVyPVRSVUUsIGJhdGNoPSJzdmEiKSkKbDJxY3BtX25vcm1iYXRjaF9wY2EgPC0gcGxvdF9wY2EobDJxY3BtX25vcm1iYXRjaCkKYGBgCgpOb3cgcGxvdCB0aGUgcmVzdWx0IGFuZCBzZWUgaWYgdGhpbmdzIG1ha2UgbW9yZSBzZW5zZS4KCmBgYHtyIHBjYV9zdmFfcGxvdCwgZmlnLmNhcD0iQWRkaW5nIFNWQSB0byB0aGUgbm9ybWFsaXphdGlvbiBkb2VzIG5vdCBoZWxwIG11Y2guIn0KbDJxY3BtX25vcm1iYXRjaF9wY2EkcGxvdAojIyBUaGF0IGRvZXMgbm90aGluZyBzaWduaWZpY2FudCB0byBjbGFyaWZ5IHRoaW5ncy4Ka25pdHI6OmthYmxlKGwycWNwbV9ub3JtYmF0Y2hfcGNhJHRhYmxlKQpgYGAKCk5vLCBub3QgcmVhbGx5LCBzbyBsZXRzIGNoYW5nZSB0aGluZ3MgYnkgcHV0dGluZyB0aGUgJ3NucCBzdGF0dXMnIGFzIHRoZSAiYmF0Y2giIGZhY3RvciBhbmQgbWluaW1pemUgaXQgd2l0aCBzdmEvY29tYmF0LgoKYGBge3IgcGNhX3NucCwgZmlnLnNob3c9ImhpZGUifQppbmZlY3RfcGFyYXYyIDwtIHNldF9leHB0X2NvbmRpdGlvbihpbmZlY3RfcGFyYSwgZmFjdD0ic3RhdGUiKQppbmZlY3RfcGFyYXYyIDwtIHNldF9leHB0X2JhdGNoKGluZmVjdF9wYXJhdjIsIGZhY3Q9InNucGNsYWRlIikKbDJxY3BtX3NucGJhdGNoX3N0cmFpbmNvbmRfc3ZhIDwtIHNtKG5vcm1hbGl6ZV9leHB0KGluZmVjdF9wYXJhdjIsIHRyYW5zZm9ybT0ibG9nMiIsIGNvbnZlcnQ9ImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtPSJxdWFudCIsIGZpbHRlcj1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2g9InN2YSIpKQpgYGAKCmBgYHtyIHBjYV9zbnBfcGxvdCwgZmlnLmNhcD0iU05QIHN0YXR1cyBkb2VzIG5vdCBjbGFyaWZ5IHRoaW5ncy4ifQpsMnFjcG1fc25wYmF0Y2hfc3RyYWluY29uZF9wY2EgPC0gcGxvdF9wY2EobDJxY3BtX3NucGJhdGNoX3N0cmFpbmNvbmRfc3ZhKQpsMnFjcG1fc25wYmF0Y2hfc3RyYWluY29uZF9wY2EkcGxvdAojIyBQdWxsaW5nIHN0cmFpbiA1NDMwIGF3YXkgZnJvbSB0aGUgb3RoZXJzIG1ha2VzIGEgc2VtaS1zcGxpdAprbml0cjo6a2FibGUobDJxY3BtX3NucGJhdGNoX3N0cmFpbmNvbmRfcGNhJHRhYmxlKQpsMnFjcG1fc25wYmF0Y2hfc3RyYWluY29uZF9wY2EgPC0gcGxvdF9wY2EobDJxY3BtX3NucGJhdGNoX3N0cmFpbmNvbmRfY29tYmF0KQpsMnFjcG1fc25wYmF0Y2hfc3RyYWluY29uZF9wY2EkcGxvdAojIyBEb2luZyB0aGUgc2FtZSB0aGluZyB3aXRoIGNvbWJhdCBoYXMgbGl0dGxlIG9yIG5vIGVmZmVjdC4Ka25pdHI6OmthYmxlKGwycWNwbV9zbnBiYXRjaF9zdHJhaW5jb25kX3BjYSR0YWJsZSkKYGBgCgpPaywgc28gbGV0IHVzIHJlbW92ZSB0aGUgaGVhbGluZyBzdGF0ZSB3aXRoIGNvbWJhdCBhbmQgc2VlIGlmIHRoYXQgYWxsb3dzIHVzIHRvIHNlZSBhIHNwbGl0IG9uIHNvbWUgb3RoZXIgZmFjdG9yLgoKYGBge3IgcGNhX2hlYWwsIGZpZy5zaG93PSJoaWRlIn0KaW5mZWN0X3BhcmFzdHJhaW4gPC0gc2V0X2V4cHRfY29uZGl0aW9uKGluZmVjdF9wYXJhLCBmYWN0PSJwYXRob2dlbnN0cmFpbiIpCmluZmVjdF9wYXJhc3RyYWluIDwtIHNldF9leHB0X2JhdGNoKGluZmVjdF9wYXJhc3RyYWluLCBmYWN0PSJzdGF0ZSIpCmwycWNwbV9wYXJhc3RyYWluIDwtIHNtKG5vcm1hbGl6ZV9leHB0KGluZmVjdF9wYXJhc3RyYWluLCB0cmFuc2Zvcm09ImxvZzIiLCBjb252ZXJ0PSJjcG0iLCBub3JtPSJxdWFudCIsIGZpbHRlcj1UUlVFLCBiYXRjaD0iY29tYmF0X3NjYWxlIikpCmBgYAoKYGBge3IgcGNhX2hlYWxfcGxvdCwgZmlnLmNhcD0iaG1tIG9rLCBJIHRoaW5rIEkgcXVpdCBmb3IgdG9kYXkuIn0KbDJxY3BtX3BhcmFzdHJhaW5fcGNhIDwtIHBsb3RfcGNhKGwycWNwbV9wYXJhc3RyYWluKQpsMnFjcG1fcGFyYXN0cmFpbl9wY2EkcGxvdAojIyB3dGYhPyE/ICBob3cgZGlkIHRoaXMgaGFwcGVuPwprbml0cjo6a2FibGUobDJxY3BtX3BhcmFzdHJhaW5fcGNhJHRhYmxlKQpgYGAKCmBgYHtyIHNhdmVfZXN0aW1hdGlvbiwgaW5jbHVkZT1GQUxTRX0KdG1wIDwtIHNtKHNhdmVtZShmaWxlbmFtZT0iaW5mZWN0aW9uX2VzdGltYXRpb24ucmRhLnh6IikpCmBgYAoKW2luZGV4Lmh0bWxdKGluZGV4Lmh0bWwpCg==