1 Introduction

This document is intended to provide a general overview of the TMRC2 samples which have thus far been sequenced. In some cases, this includes only those samples starting in 2019; in other instances I am including our previous (2015-2016) samples.

In all cases the processing performed was:

  1. Default trimming was performed.
  2. Hisat2 was used to map the remaining reads against the Leishmania panamensis genome revision 36.
  3. The alignments from hisat2 were used to count reads/gene against the revision 36 annotations with htseq.
  4. These alignments were also passed to the pileup functionality of samtools and the vcf/bcf utilities in order to make a matrix of all observed differences between each sample with respect to the reference.

The analyses in this document use the matrices of counts/gene from #3 and variants/position from #4 in order to provide some images and metrics describing the samples we have sequenced so far.

2 Annotations

Everything which follows depends on the Existing TriTrypDB annotations revision 46, circa 2019. The following block loads a database of these annotations and turns it into a matrix where the rows are genes and columns are all the annotation types provided by TriTrypDB.

The same database was used to create a matrix of orthologous genes between L.panamensis and all of the other species in the TriTrypDB.

tt <- sm(library(EuPathDB))
tt <- sm(library(org.Lpanamensis.MHOMCOL81L13.v46.eg.db))
pan_db <- org.Lpanamensis.MHOMCOL81L13.v46.eg.db
all_fields <- columns(pan_db)

all_lp_annot <- sm(load_orgdb_annotations(
    pan_db,
    keytype = "gid",
    fields = c("annot_gene_entrez_id", "annot_gene_name",
               "annot_strand", "annot_chromosome", "annot_cds_length",
               "annot_gene_product")))$genes

lp_go <- sm(load_orgdb_go(pan_db))
lp_lengths <- all_lp_annot[, c("gid", "annot_cds_length")]
colnames(lp_lengths)  <- c("ID", "length")
all_lp_annot[["annot_gene_product"]] <- tolower(all_lp_annot[["annot_gene_product"]])
orthos <- sm(EuPathDB::extract_eupath_orthologs(db = pan_db))

hisat_annot <- all_lp_annot
## rownames(hisat_annot) <- paste0("exon_", rownames(hisat_annot), ".E1")

3 TODO:

Resequence samples: TMRC20002, TMRC20006, TMRC20004 (maybe TMRC20008 and TMRC20029)

4 Generate Expressionsets and Sample Estimation

The process of sample estimation takes two primary inputs:

  1. The sample sheet, which contains all the metadata we currently have on hand, including filenames for the outputs of #3 and #4 above.
  2. The gene annotations.

An expressionset is a data structure used in R to examine RNASeq data. It is comprised of annotations, metadata, and expression data. In the case of our processing pipeline, the location of the expression data is provided by the filenames in the metadata.

The first lines of the following block create the Expressionset. All of the following lines perform various normalizations and generate plots from it.

4.1 Notes

The following samples are much lower coverage:

  • TMRC20002
  • TMRC20006
  • TMRC20007
  • TMRC20008

4.2 TODO:

  1. Do the multi-gene family removal right here instead of way down at the bottom
  2. Add zymodeme snps to the annotation later.
  3. Start phylogenetic analysis of variant table.
sample_sheet <- glue::glue("sample_sheets/tmrc2_samples_20210601.xlsx")

sanitize_columns <- c("passagenumber", "clinicalresponse", "clinicalcategorical",
                      "zymodemecategorical", "phenotypiccharacteristics")
lp_expt <- sm(create_expt(sample_sheet,
                          gene_info = hisat_annot,
                          id_column = "hpglidentifier",
                          file_column = "lpanamensisv36hisatfile")) %>%
  set_expt_conditions(fact = "zymodemecategorical") %>%
  subset_expt(nonzero = 8600) %>%
  semantic_expt_filter(semantic = c("amastin", "gp63", "leishmanolysin"),
                       semantic_column = "annot_gene_product") %>%
  sanitize_expt_metadata(columns = sanitize_columns) %>%
  set_expt_factors(columns = sanitize_columns, class = "factor")
## The samples (and read coverage) removed when filtering 8600 non-zero genes are:
## TMRC20002 TMRC20004 TMRC20006 TMRC20029 TMRC20008 
##  11681227    564812   6670348   1658096   6249790
## subset_expt(): There were 52, now there are 47 samples.
## semantic_expt_filter(): Removed 68 genes.
libsizes <- plot_libsize(lp_expt)
libsizes$plot

## I think samples 7,10 should be removed at minimum, probably also 9,11
nonzero <- plot_nonzero(lp_expt)
nonzero$plot
## Warning: ggrepel: 6 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

plot_boxplot(lp_expt)
## 3164 entries are 0.  We are on a log scale, adding 1 to the data.

filter_plot <- plot_libsize_prepost(lp_expt)
filter_plot$lowgene_plot
## Warning: Using alpha for a discrete variable is not advised.

filter_plot$count_plot

4.3 Distribution Visualization

Najib’s favorite plots are of course the PCA/TNSE. These are nice to look at in order to get a sense of the relationships between samples. They also provide a good opportunity to see what happens when one applies different normalizations, surrogate analyses, filters, etc. In addition, one may set different experimental factors as the primary ‘condition’ (usually the color of plots) and surrogate ‘batches’.

4.4 By Susceptilibity

Column ‘Q’ in the sample sheet, make a categorical version of it with these parameters:

  • 0 <= x <= 35 is resistant
  • 36 <= x <= 48 is ambiguous
  • 49 <= x is sensitive
starting <- as.numeric(pData(lp_expt)[["susceptibilityinfectionreduction32ugmlsbvhistoricaldata"]])
sus_categorical <- starting
na_idx <- is.na(starting)
sus_categorical[na_idx] <- "unknown"

resist_idx <- starting <= 0.35
sus_categorical[resist_idx] <- "resistant"
indeterminant_idx <- starting >= 0.36 & starting <= 0.48
sus_categorical[indeterminant_idx] <- "ambiguous"
susceptible_idx <- starting >= 0.49
sus_categorical[susceptible_idx] <- "sensitive"

pData(lp_expt$expressionset)[["sus_category"]] <- sus_categorical
clinical_samples <- lp_expt %>%
  set_expt_batches(fact = sus_categorical)

clinical_norm <- sm(normalize_expt(clinical_samples, norm = "quant", transform = "log2",
                                   convert = "cpm", batch = FALSE, filter = TRUE))
zymo_pca <- plot_pca(clinical_norm, plot_title = "PCA of parasite expression values")
pp(file = "images/zymo_pca_sus_shape.png", image = zymo_pca$plot)

zymo_3dpca <- plot_3d_pca(zymo_pca)
zymo_3dpca$plot
zymo_tsne <- plot_tsne(clinical_norm, plot_title = "TSNE of parasite expression values")
zymo_tsne$plot
## Warning: ggrepel: 23 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

clinical_nb <- normalize_expt(clinical_samples, convert = "cpm", transform = "log2",
                         filter = TRUE, batch = "svaseq")
## Removing 145 low-count genes (8565 remaining).
## batch_counts: Before batch/surrogate estimation, 568 entries are x==0: 0%.
## batch_counts: Before batch/surrogate estimation, 2107 entries are 0<x<1: 1%.
## Setting 129 low elements to zero.
## transform_counts: Found 129 values equal to 0, adding 1 to the matrix.
clinical_nb_pca <- plot_pca(clinical_nb, plot_title = "PCA of parasite expression values")
pp(file = "images/clinical_nb_pca_sus_shape.png", image = clinical_nb_pca$plot)

clinical_nb_tsne <- plot_tsne(clinical_nb, plot_title = "TSNE of parasite expression values")
clinical_nb_tsne$plot

corheat <- plot_corheat(clinical_norm, plot_title = "Correlation heatmap of parasite
                 expression values
")
corheat$plot

plot_sm(clinical_norm)$plot
## Performing correlation.

4.5 By Cure/Fail status

cf_expt <- set_expt_conditions(lp_expt, fact = "clinicalcategorical") %>%
  set_expt_batches(fact = sus_categorical)

cf_norm <- normalize_expt(cf_expt, convert = "cpm", transform = "log2",
                          norm = "quant", filter = TRUE)
## Removing 145 low-count genes (8565 remaining).
## transform_counts: Found 2 values equal to 0, adding 1 to the matrix.
start_cf <- plot_pca(cf_norm, plot_title = "PCA of parasite expression values")
pp(file = "images/cf_sus_shape.png", image = start_cf$plot)

cf_nb <- normalize_expt(cf_expt, convert = "cpm", transform = "log2",
                        norm = "quant", filter = TRUE, batch = "svaseq")
## Warning in normalize_expt(cf_expt, convert = "cpm", transform = "log2", :
## Quantile normalization and sva do not always play well together.
## Removing 145 low-count genes (8565 remaining).
## batch_counts: Before batch/surrogate estimation, 2 entries are x==0: 0%.
## batch_counts: Before batch/surrogate estimation, 2573 entries are 0<x<1: 1%.
## Setting 67 low elements to zero.
## transform_counts: Found 67 values equal to 0, adding 1 to the matrix.
cf_nb_pca <- plot_pca(cf_nb, plot_title = "PCA of parasite expression values")
pp(file = "images/cf_sus_share_nb.png", image = cf_nb_pca$plot)
## Warning: ggrepel: 2 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

cf_norm <- normalize_expt(cf_expt, transform = "log2", convert = "cpm",
                          filter = TRUE, norm = "quant")
## Removing 145 low-count genes (8565 remaining).
## transform_counts: Found 2 values equal to 0, adding 1 to the matrix.
test <- pca_information(cf_norm,
                        expt_factors = c("clinicalcategorical", "zymodemecategorical",
                                         "pathogenstrain", "passagenumber"),
                        num_components = 6, plot_pcas = TRUE)
test$anova_p
##                           PC1     PC2       PC3     PC4    PC5    PC6
## clinicalcategorical 4.067e-01 0.91829 8.951e-04 0.45541 0.8572 0.3990
## zymodemecategorical 2.381e-06 0.02917 2.717e-01 0.72493 0.1045 0.4399
## pathogenstrain      6.072e-01 0.07173 5.510e-06 0.43202 0.4455 0.7410
## passagenumber       7.131e-03 0.09458 3.026e-01 0.00987 0.3880 0.8164
test$cor_heatmap

sus_expt <- set_expt_conditions(lp_expt, fact = "sus_category") %>%
  set_expt_batches(fact = "zymodemecategorical")

sus_norm <- normalize_expt(sus_expt, transform = "log2", convert = "cpm",
                           norm = "quant", filter = TRUE)
## Removing 145 low-count genes (8565 remaining).
## transform_counts: Found 2 values equal to 0, adding 1 to the matrix.
sus_pca <- plot_pca(sus_norm, plot_title = "PCA of parasite expression values")
sus_pca$plot

sus_nb <- normalize_expt(sus_expt, transform = "log2", convert = "cpm",
                         batch = "svaseq", filter = TRUE)
## Removing 145 low-count genes (8565 remaining).
## batch_counts: Before batch/surrogate estimation, 568 entries are x==0: 0%.
## batch_counts: Before batch/surrogate estimation, 2107 entries are 0<x<1: 1%.
## Setting 110 low elements to zero.
## transform_counts: Found 110 values equal to 0, adding 1 to the matrix.
sus_nb_pca <- plot_pca(sus_nb, plot_title = "PCA of parasite expression values")
pp(file = "images/sus_nb_pca.png", image = sus_nb_pca$plot)

At this time, we do not have very many samples, so the set of metrics/plots is fairly limited. There is really only one factor in the metadata which we can use for performing differential expression analyses, the ‘zymodeme’.

5 Zymodeme analyses

The following sections perform a series of analyses which seek to elucidate differences between the zymodemes 2.2 and 2.3 either through differential expression or variant profiles.

5.1 Differential expression

5.1.1 With respect to zymodeme attribution

TODO: Do this with and without sva and compare the results.

zy_expt <- subset_expt(lp_expt, subset = "condition=='z2.2'|condition=='z2.3'")
## subset_expt(): There were 47, now there are 25 samples.
zy_norm <- normalize_expt(zy_expt, filter = TRUE, convert = "cpm", norm = "quant")
## Removing 167 low-count genes (8543 remaining).
zy_de_nobatch <- sm(all_pairwise(zy_expt, filter = TRUE, model_batch = "svaseq"))
zy_de <- sm(all_pairwise(zy_expt, filter = TRUE, model_batch = "svaseq"))
zy_table <- sm(combine_de_tables(zy_de, excel = glue::glue("excel/zy_tables-v{ver}.xlsx")))
zy_sig <- sm(extract_significant_genes(zy_table, excel = glue::glue("excel/zy_sig-v{ver}.xlsx")))

5.1.2 Images of zymodeme DE

zy_table[["plots"]][["z23_vs_z22"]][["deseq_ma_plots"]][["plot"]]

5.2 With respect to cure/failure

In contrast, we can search for genes which are differentially expressed with respect to cure/failure status.

cf_de <- sm(all_pairwise(cf_expt, filter = TRUE, model_batch = "svaseq"))
cf_table <- sm(combine_de_tables(cf_de, excel = glue::glue("excel/cf_tables-v{ver}.xlsx")))
cf_sig <- sm(extract_significant_genes(cf_table, excel = glue::glue("excel/cf_sig-v{ver}.xlsx")))

5.3 With respect to susceptibility

Finally, we can use our category of susceptibility and look for genes which change from sensitive to resistant. Keep in mind, though, that for the moment we have a lot of ambiguous and unknown strains.

sus_de <- sm(all_pairwise(sus_expt, filter = TRUE, model_batch = "svaseq"))
sus_table <- sm(combine_de_tables(sus_de, excel = glue::glue("excel/sus_tables-v{ver}.xlsx")))
sus_sig <- sm(extract_significant_genes(sus_table, excel = glue::glue("excel/sus_sig-v{ver}.xlsx")))

5.4 Ontology searches

Now let us look for ontology categories which are increased in the 2.3 samples followed by the 2.2 samples.

## Gene categories more represented in the 2.3 group.
zy_go_up <- sm(simple_goseq(sig_genes = zy_sig[["deseq"]][["ups"]][[1]],
                            go_db = lp_go, length_db = lp_lengths))

## Gene categories more represented in the 2.2 group.
zy_go_down <- sm(simple_goseq(sig_genes = zy_sig[["deseq"]][["downs"]][[1]],
                              go_db = lp_go, length_db = lp_lengths))

5.4.1 A couple plots from the differential expression

5.4.1.1 Number of genes in agreement among DE methods, 2.3 more than 2.2

In the function ‘combined_de_tables()’ above, one of the tasks performed is to look at the agreement among DESeq2, limma, and edgeR. The following show a couple of these for the set of genes observed with a fold-change >= |2| and adjusted p-value <= 0.05.

zy_table[["venns"]][[1]][["p_lfc1"]][["up_noweight"]]

5.4.1.2 Number of genes in agreement among DE methods, 2.2 more than 2.3

zy_table[["venns"]][[1]][["p_lfc1"]][["down_noweight"]]

5.4.1.3 MA plot of the differential expression between the zymodemes.

zy_table$plots[[1]][["deseq_ma_plots"]][["plot"]]

5.4.1.4 goseq ontology plots of groups of genes, 2.3 more than 2.2

zy_go_up$pvalue_plots$bpp_plot_over

5.4.1.5 goseq ontology plots of groups of genes, 2.2 more than 2.3

zy_go_down$pvalue_plots$bpp_plot_over

5.5 Zymodeme enzyme gene IDs

Najib read me an email listing off the gene names associated with the zymodeme classification. I took those names and cross referenced them against the Leishmania panamensis gene annotations and found the following:

They are:

  1. ALAT: LPAL13_120010900 – alanine aminotransferase
  2. ASAT: LPAL13_340013000 – aspartate aminotransferase
  3. G6PD: LPAL13_000054100 – glucase-6-phosphate 1-dehydrogenase
  4. NH: LPAL13_14006100, LPAL13_180018500 – inosine-guanine nucleoside hydrolase
  5. MPI: LPAL13_320022300 (maybe) – mannose phosphate isomerase (I chose phosphomannose isomerase)

Given these 6 gene IDs (NH has two gene IDs associated with it), I can do some looking for specific differences among the various samples.

5.5.1 Expression levels of zymodeme genes

The following creates a colorspace (red to green) heatmap showing the observed expression of these genes in every sample.

my_genes <- c("LPAL13_120010900", "LPAL13_340013000", "LPAL13_000054100",
              "LPAL13_140006100", "LPAL13_180018500", "LPAL13_320022300",
              "other")
my_names <- c("ALAT", "ASAT", "G6PD", "NHv1", "NHv2", "MPI", "other")

zymo_expt <- exclude_genes_expt(zy_norm, ids = my_genes, method = "keep")
## Before removal, there were 8543 genes, now there are 6.
## There are 25 samples which kept less than 90 percent counts.
## TMRC20001 TMRC20005 TMRC20039 TMRC20037 TMRC20038 TMRC20041 TMRC20015 TMRC20009 
##    0.1310    0.1318    0.1299    0.1100    0.1128    0.1179    0.1146    0.1135 
## TMRC20010 TMRC20016 TMRC20011 TMRC20012 TMRC20013 TMRC20017 TMRC20014 TMRC20018 
##    0.1098    0.1059    0.1101    0.1205    0.1205    0.1063    0.1089    0.1144 
## TMRC20021 TMRC20022 TMRC20053 TMRC20052 TMRC20064 TMRC20051 TMRC20050 TMRC20062 
##    0.1061    0.1305    0.1182    0.1104    0.1138    0.1280    0.1151    0.1283 
## TMRC20054 
##    0.1276
zymo_heatmap <- plot_sample_heatmap(zymo_expt, row_label = my_names)
zymo_heatmap

5.6 Empirically observed Zymodeme genes from differential expression analysis

In contrast, the following plots take the set of genes which are shared among all differential expression methods (|lfc| >= 1.0 and adjp <= 0.05) and use them to make categories of genes which are increased in 2.3 or 2.2.

shared_zymo <- intersect_significant(zy_table)
## Deleting the file excel/intersect_significant.xlsx before writing the tables.
up_shared <- shared_zymo[["ups"]][[1]][["data"]][["all"]]
rownames(up_shared)
##  [1] "LPAL13_000033300" "LPAL13_000012000" "LPAL13_310031300" "LPAL13_000038400"
##  [5] "LPAL13_000038500" "LPAL13_000012100" "LPAL13_340039600" "LPAL13_050005000"
##  [9] "LPAL13_310031000" "LPAL13_310039200" "LPAL13_210015500" "LPAL13_350063000"
## [13] "LPAL13_140019300" "LPAL13_270034100" "LPAL13_340039700" "LPAL13_180013900"
## [17] "LPAL13_170015400" "LPAL13_350013200" "LPAL13_330021800" "LPAL13_140019100"
## [21] "LPAL13_240009700" "LPAL13_330021900" "LPAL13_140019200" "LPAL13_000052700"
## [25] "LPAL13_250025700" "LPAL13_350073200" "LPAL13_310028500" "LPAL13_320038700"
## [29] "LPAL13_210005000" "LPAL13_300031600" "LPAL13_110015700" "LPAL13_000045100"
## [33] "LPAL13_230011200" "LPAL13_040007800" "LPAL13_230011400" "LPAL13_290016200"
## [37] "LPAL13_310032500" "LPAL13_230011500" "LPAL13_140019400" "LPAL13_000010600"
## [41] "LPAL13_100005800"
upshared_expt <- exclude_genes_expt(zy_norm, ids = rownames(up_shared), method = "keep")
## Before removal, there were 8543 genes, now there are 41.
## There are 25 samples which kept less than 90 percent counts.
## TMRC20001 TMRC20005 TMRC20039 TMRC20037 TMRC20038 TMRC20041 TMRC20015 TMRC20009 
##    0.4245    0.1639    0.2311    0.6340    0.7125    0.2043    0.5332    0.1935 
## TMRC20010 TMRC20016 TMRC20011 TMRC20012 TMRC20013 TMRC20017 TMRC20014 TMRC20018 
##    0.4926    0.4036    0.2015    0.1613    0.4721    0.2591    0.2134    0.4470 
## TMRC20021 TMRC20022 TMRC20053 TMRC20052 TMRC20064 TMRC20051 TMRC20050 TMRC20062 
##    0.5088    0.1852    0.2650    0.5964    0.5949    0.8250    0.2773    0.8369 
## TMRC20054 
##    0.7197

We can plot a quick heatmap to get a sense of the differences observed between the genes which are different between the two zymodemes.

5.6.1 Heatmap of zymodeme gene expression increased in 2.3 vs. 2.2

high_23_heatmap <- plot_sample_heatmap(upshared_expt, row_label = rownames(up_shared))
high_23_heatmap

5.6.2 Heatmap of zymodeme gene expression increased in 2.2 vs. 2.3

down_shared <- shared_zymo[["downs"]][[1]][["data"]][["all"]]
downshared_expt <- exclude_genes_expt(zy_norm, ids = rownames(down_shared), method = "keep")
## Before removal, there were 8543 genes, now there are 63.
## There are 25 samples which kept less than 90 percent counts.
## TMRC20001 TMRC20005 TMRC20039 TMRC20037 TMRC20038 TMRC20041 TMRC20015 TMRC20009 
##    0.2181    0.6764    0.6475    0.1938    0.1849    0.6785    0.1786    0.6274 
## TMRC20010 TMRC20016 TMRC20011 TMRC20012 TMRC20013 TMRC20017 TMRC20014 TMRC20018 
##    0.1628    0.2041    0.5594    0.5529    0.1608    0.6469    0.6368    0.1568 
## TMRC20021 TMRC20022 TMRC20053 TMRC20052 TMRC20064 TMRC20051 TMRC20050 TMRC20062 
##    0.1565    0.6738    0.5544    0.1747    0.1908    0.1781    0.6052    0.1779 
## TMRC20054 
##    0.1921
high_22_heatmap <- plot_sample_heatmap(downshared_expt, row_label = rownames(down_shared))
high_22_heatmap

6 SNP profiles

Now I will combine our previous samples and our new samples in the hopes of finding variant positions which help elucidate currently unknown aspects of either group via their clustering to known samples from the other group. In other words, we do not know the zymodeme annotations for the old samples nor the strain identities (or the shortcut ‘chronic vs. self-healing’) for the new samples. I hope to make educated guesses given the variant profiles. There are some differences in how the previous and current data sets were analyzed (though I have since redone the old samples so it should be trivial to remove those differences now).

I added our 2016 data to a specific TMRC2 sample sheet, dated 20191203. Thus I will load the data here. That previous data was mapped using tophat, so I will also need to make some changes to the gene names to accomodate the two mappings.

old_expt <- sm(create_expt("sample_sheets/tmrc2_samples_20191203.xlsx",
                           file_column = "tophat2file"))

tt <- lp_expt[["expressionset"]]
rownames(tt) <- gsub(pattern = "^exon_", replacement = "", x = rownames(tt))
rownames(tt) <- gsub(pattern = "\\.E1$", replacement = "", x = rownames(tt))
lp_expt$expressionset <- tt

tt <- old_expt$expressionset
rownames(tt) <- gsub(pattern = "^exon_", replacement = "", x = rownames(tt))
rownames(tt) <- gsub(pattern = "\\.1$", replacement = "", x = rownames(tt))
old_expt$expressionset <- tt
rm(tt)

6.1 Create the SNP expressionset

One other important caveat, we have a group of new samples which have not yet run through the variant search pipeline, so I need to remove them from consideration. Though it looks like they finished overnight…

## The next line drops the samples which are missing the SNP pipeline.
lp_snp <- subset_expt(lp_expt, subset="!is.na(pData(lp_expt)[['bcftable']])")
## subset_expt(): There were 47, now there are 46 samples.
new_snps <- sm(count_expt_snps(lp_snp, annot_column = "bcftable"))
old_snps <- sm(count_expt_snps(old_expt, annot_column = "bcftable", snp_column = 2))

both_snps <- combine_expts(new_snps, old_snps)
both_norm <- sm(normalize_expt(both_snps, transform = "log2", convert = "cpm", filter = TRUE))

## strains <- both_norm[["design"]][["strain"]]
both_norm <- set_expt_conditions(both_norm, fact = "strain")

The data structure ‘both_norm’ now contains our 2016 data along with the newer data collected since 2019.

6.2 Plot of SNP profiles for zymodemes

The following plot shows the SNP profiles of all samples (old and new) where the colors at the top show either the 2.2 strains (orange), 2.3 strains (green), the previous samples (purple), or the various lab strains (pink etc).

old_new_variant_heatmap <- plot_disheat(both_norm)
pp(file = "images/raw_snp_disheat.png", image = old_new_variant_heatmap,
   height = 12, width = 12)

The function get_snp_sets() takes the provided metadata factor (in this case ‘condition’) and looks for variants which are exclusive to each element in it. In this case, this is looking for differences between 2.2 and 2.3, as well as the set shared among them.

snp_sets <- get_snp_sets(both_snps, factor = "condition")
## The factor z2.3 has 14 rows.
## The factor z2.2 has 11 rows.
## The factor unknown has 21 rows.
## The factor sh has 13 rows.
## The factor chr has 14 rows.
## The factor inf has 6 rows.
## Iterating over 727 elements.
both_expt <- combine_expts(lp_expt, old_expt)

snp_genes <- sm(snps_vs_genes(both_expt, snp_sets, expt_name_col = "chromosome"))
## I think we have some metrics here we can plot...
snp_subset <- sm(snp_subset_genes(
  both_expt, both_snps,
  genes = c("LPAL13_120010900", "LPAL13_340013000", "LPAL13_000054100",
            "LPAL13_140006100", "LPAL13_180018500", "LPAL13_320022300")))
zymo_heat <- plot_sample_heatmap(snp_subset, row_label = rownames(exprs(snp_subset)))
zymo_heat

Didn’t I create a set of densities by chromosome? Oh I think they come in from get_snp_sets()

6.3 SNPS associated with clinical response in the TMRC samples

clinical_sets <- get_snp_sets(new_snps, factor = "clinicalresponse")
## The factor cure has 17 rows.
## The factor failure has 15 rows.
## The factor laboratory line has only 1 row.
## The factor nd has 3 rows.
## The factor reference strain has 3 rows.
## The factor unknown has 7 rows.
## Iterating over 693 elements.
density_vec <- clinical_sets[["density"]]
chromosome_idx <- grep(pattern = "LpaL", x = names(density_vec))
density_df <- as.data.frame(density_vec[chromosome_idx])
density_df[["chr"]] <- rownames(density_df)
colnames(density_df) <- c("density_vec", "chr")
ggplot(density_df, aes_string(x = "chr", y = "density_vec")) +
  ggplot2::geom_col() +
  ggplot2::theme(axis.text = ggplot2::element_text(size = 10, colour = "black"),
                 axis.text.x = ggplot2::element_text(angle = 90, vjust = 0.5))

## clinical_written <- write_variants(new_snps)

6.3.1 Cross reference these variants by gene

clinical_genes <- sm(snps_vs_genes(lp_expt, clinical_sets, expt_name_col = "chromosome"))

snp_density <- merge(as.data.frame(clinical_genes[["summary_by_gene"]]),
                     as.data.frame(fData(lp_expt)),
                     by = "row.names")
snp_density <- snp_density[, c(1, 2, 4, 15)]
colnames(snp_density) <- c("name", "snps", "product", "length")
snp_density[["product"]] <- tolower(snp_density[["product"]])
snp_density[["length"]] <- as.numeric(snp_density[["length"]])
snp_density[["density"]] <- snp_density[["snps"]] / snp_density[["length"]]
snp_idx <- order(snp_density[["density"]], decreasing = TRUE)
snp_density <- snp_density[snp_idx, ]

removers <- c("amastin", "gp63", "leishmanolysin")
for (r in removers) {
  drop_idx <- grepl(pattern = r, x = snp_density[["product"]])
  snp_density <- snp_density[!drop_idx, ]
}
## Filter these for [A|a]mastin gp63 Leishmanolysin
clinical_snps <- snps_intersections(lp_expt, clinical_sets, chr_column = "chromosome")

as.data.frame(clinical_snps[["inters"]][["failure, reference strain"]])
##                                       seqnames  start    end width strand
## chr_LpaL13-10_pos_233490_ref_C_alt_G LpaL13-10 233490 233491     2      +
## chr_LpaL13-15_pos_42885_ref_A_alt_G  LpaL13-15  42885  42886     2      +
## chr_LpaL13-24_pos_163196_ref_C_alt_A LpaL13-24 163196 163197     2      +
## chr_LpaL13-31_pos_852703_ref_C_alt_A LpaL13-31 852703 852704     2      +
as.data.frame(clinical_snps[["inters"]][["cure"]])
##                                           seqnames   start     end width strand
## chr_LpaL13-01_pos_169299_ref_A_alt_G     LpaL13-01  169299  169300     2      +
## chr_LpaL13-08_pos_184791_ref_T_alt_A     LpaL13-08  184791  184792     2      +
## chr_LpaL13-10_pos_347757_ref_A_alt_C     LpaL13-10  347757  347758     2      +
## chr_LpaL13-11_pos_433123_ref_C_alt_T     LpaL13-11  433123  433124     2      +
## chr_LpaL13-15_pos_47170_ref_G_alt_C      LpaL13-15   47170   47171     2      +
## chr_LpaL13-16_pos_456493_ref_A_alt_G     LpaL13-16  456493  456494     2      +
## chr_LpaL13-20.1_pos_106634_ref_G_alt_A LpaL13-20.1  106634  106635     2      +
## chr_LpaL13-20.1_pos_112635_ref_A_alt_C LpaL13-20.1  112635  112636     2      +
## chr_LpaL13-20.1_pos_369935_ref_C_alt_T LpaL13-20.1  369935  369936     2      +
## chr_LpaL13-20.1_pos_370282_ref_C_alt_T LpaL13-20.1  370282  370283     2      +
## chr_LpaL13-20.1_pos_371356_ref_T_alt_C LpaL13-20.1  371356  371357     2      +
## chr_LpaL13-20.1_pos_380785_ref_A_alt_G LpaL13-20.1  380785  380786     2      +
## chr_LpaL13-20.1_pos_381107_ref_T_alt_C LpaL13-20.1  381107  381108     2      +
## chr_LpaL13-20.1_pos_382801_ref_A_alt_C LpaL13-20.1  382801  382802     2      +
## chr_LpaL13-20.1_pos_386522_ref_G_alt_A LpaL13-20.1  386522  386523     2      +
## chr_LpaL13-20.1_pos_386926_ref_G_alt_A LpaL13-20.1  386926  386927     2      +
## chr_LpaL13-20.1_pos_390908_ref_G_alt_A LpaL13-20.1  390908  390909     2      +
## chr_LpaL13-20.1_pos_391058_ref_C_alt_A LpaL13-20.1  391058  391059     2      +
## chr_LpaL13-20.1_pos_395411_ref_C_alt_G LpaL13-20.1  395411  395412     2      +
## chr_LpaL13-20.1_pos_412461_ref_C_alt_T LpaL13-20.1  412461  412462     2      +
## chr_LpaL13-20.1_pos_418289_ref_G_alt_A LpaL13-20.1  418289  418290     2      +
## chr_LpaL13-20.1_pos_433900_ref_C_alt_A LpaL13-20.1  433900  433901     2      +
## chr_LpaL13-20.1_pos_441730_ref_G_alt_C LpaL13-20.1  441730  441731     2      +
## chr_LpaL13-20.1_pos_455242_ref_G_alt_A LpaL13-20.1  455242  455243     2      +
## chr_LpaL13-20.1_pos_455533_ref_G_alt_C LpaL13-20.1  455533  455534     2      +
## chr_LpaL13-20.1_pos_460767_ref_T_alt_C LpaL13-20.1  460767  460768     2      +
## chr_LpaL13-20.1_pos_461944_ref_C_alt_T LpaL13-20.1  461944  461945     2      +
## chr_LpaL13-20.1_pos_465405_ref_T_alt_C LpaL13-20.1  465405  465406     2      +
## chr_LpaL13-20.1_pos_465754_ref_G_alt_A LpaL13-20.1  465754  465755     2      +
## chr_LpaL13-20.1_pos_465865_ref_G_alt_A LpaL13-20.1  465865  465866     2      +
## chr_LpaL13-20.1_pos_467343_ref_C_alt_T LpaL13-20.1  467343  467344     2      +
## chr_LpaL13-20.1_pos_534889_ref_C_alt_T LpaL13-20.1  534889  534890     2      +
## chr_LpaL13-20.1_pos_535544_ref_G_alt_A LpaL13-20.1  535544  535545     2      +
## chr_LpaL13-20.1_pos_537604_ref_T_alt_A LpaL13-20.1  537604  537605     2      +
## chr_LpaL13-20.1_pos_537764_ref_G_alt_A LpaL13-20.1  537764  537765     2      +
## chr_LpaL13-23_pos_296439_ref_A_alt_G     LpaL13-23  296439  296440     2      +
## chr_LpaL13-23_pos_296880_ref_C_alt_T     LpaL13-23  296880  296881     2      +
## chr_LpaL13-23_pos_296937_ref_G_alt_A     LpaL13-23  296937  296938     2      +
## chr_LpaL13-31_pos_1188862_ref_A_alt_G    LpaL13-31 1188862 1188863     2      +
## chr_LpaL13-31_pos_125653_ref_C_alt_T     LpaL13-31  125653  125654     2      +
## chr_LpaL13-33_pos_293184_ref_G_alt_A     LpaL13-33  293184  293185     2      +
head(clinical_snps[["gene_summaries"]][["failure, reference strain"]])
## LPAL13_100011200 LPAL13_150006200 LPAL13_240010100 LPAL13_310025800 
##                1                1                1                1 
## LPAL13_000005000 LPAL13_000005400 
##                0                0
head(clinical_snps[["gene_summaries"]][["cure"]], n = 30)
## LPAL13_200017900 LPAL13_200014600 LPAL13_230015000 LPAL13_200014900 
##                4                3                3                2 
## LPAL13_200015100 LPAL13_200015200 LPAL13_200017600 LPAL13_200017800 
##                2                2                2                2 
## LPAL13_200019500 LPAL13_200019600 LPAL13_010010900 LPAL13_080009800 
##                2                2                1                1 
## LPAL13_100014700 LPAL13_110015500 LPAL13_150006300 LPAL13_160017600 
##                1                1                1                1 
## LPAL13_200008300 LPAL13_200008400 LPAL13_200015000 LPAL13_200015300 
##                1                1                1                1 
## LPAL13_200016400 LPAL13_200016500 LPAL13_200016900 LPAL13_200017200 
##                1                1                1                1 
## LPAL13_310008900 LPAL13_310034900 LPAL13_330014300 LPAL13_000005000 
##                1                1                1                0 
## LPAL13_000005400 LPAL13_000005500 
##                0                0
annot <- fData(lp_expt)
clinical_interest <- as.data.frame(clinical_snps[["gene_summaries"]][["cure"]])
clinical_interest <- merge(clinical_interest,
                           as.data.frame(clinical_snps[["gene_summaries"]][["failure, reference strain"]]),
                           by = "row.names")
rownames(clinical_interest) <- clinical_interest[["Row.names"]]
clinical_interest[["Row.names"]] <- NULL
colnames(clinical_interest) <- c("cure_snps","fail_snps")
annot <- merge(annot, clinical_interest, by = "row.names")
rownames(annot) <- annot[["Row.names"]]
annot[["Row.names"]] <- NULL
fData(lp_expt$expressionset) <- annot

7 Zymodeme for new samples

The heatmap produced here should show the variants only for the zymodeme genes.

7.1 Hunt for snp clusters

I am thinking that if we find clusters of locations which are variant, that might provide some PCR testing possibilities.

new_sets <- get_snp_sets(new_snps, factor = "phenotypiccharacteristics")
## The factor 22 has 11 rows.
## The factor 23 has 14 rows.
## The factor laboratory line has only 1 row.
## The factor notapplicable has 17 rows.
## The factor reference strain has 3 rows.
## Iterating over 693 elements.
summary(new_sets)
##               Length Class      Mode     
## medians         6    data.frame list     
## possibilities   5    -none-     character
## intersections  31    -none-     list     
## chr_data      693    -none-     list     
## set_names      32    -none-     list     
## invert_names   32    -none-     list     
## density       693    -none-     numeric
## 1000000: 2.2
## 0100000: 2.3

summary(new_sets[["intersections"]][["10000"]])
##    Length     Class      Mode 
##       511 character character
head(new_sets$intersections[["10000"]], n = 100)
##   [1] "chr_LpaL13-01_pos_90954_ref_C_alt_T"    
##   [2] "chr_LpaL13-02_pos_34726_ref_C_alt_T"    
##   [3] "chr_LpaL13-04_pos_155896_ref_G_alt_A"   
##   [4] "chr_LpaL13-04_pos_158684_ref_A_alt_G"   
##   [5] "chr_LpaL13-04_pos_161099_ref_C_alt_A"   
##   [6] "chr_LpaL13-04_pos_162919_ref_T_alt_G"   
##   [7] "chr_LpaL13-04_pos_162921_ref_A_alt_C"   
##   [8] "chr_LpaL13-04_pos_162923_ref_A_alt_T"   
##   [9] "chr_LpaL13-04_pos_440493_ref_A_alt_G"   
##  [10] "chr_LpaL13-05_pos_149067_ref_C_alt_T"   
##  [11] "chr_LpaL13-05_pos_192545_ref_C_alt_G"   
##  [12] "chr_LpaL13-05_pos_194408_ref_C_alt_T"   
##  [13] "chr_LpaL13-05_pos_253789_ref_C_alt_T"   
##  [14] "chr_LpaL13-05_pos_260509_ref_A_alt_C"   
##  [15] "chr_LpaL13-05_pos_260510_ref_C_alt_G"   
##  [16] "chr_LpaL13-05_pos_260511_ref_A_alt_T"   
##  [17] "chr_LpaL13-05_pos_260512_ref_G_alt_C"   
##  [18] "chr_LpaL13-06_pos_470502_ref_G_alt_T"   
##  [19] "chr_LpaL13-07_pos_185877_ref_T_alt_G"   
##  [20] "chr_LpaL13-07_pos_185878_ref_T_alt_G"   
##  [21] "chr_LpaL13-07_pos_185881_ref_A_alt_G"   
##  [22] "chr_LpaL13-07_pos_96131_ref_C_alt_T"    
##  [23] "chr_LpaL13-07_pos_97600_ref_G_alt_A"    
##  [24] "chr_LpaL13-08_pos_182626_ref_G_alt_A"   
##  [25] "chr_LpaL13-08_pos_184791_ref_T_alt_A"   
##  [26] "chr_LpaL13-08_pos_186299_ref_A_alt_G"   
##  [27] "chr_LpaL13-08_pos_187404_ref_G_alt_C"   
##  [28] "chr_LpaL13-08_pos_188116_ref_T_alt_C"   
##  [29] "chr_LpaL13-09_pos_100186_ref_C_alt_T"   
##  [30] "chr_LpaL13-09_pos_160169_ref_C_alt_T"   
##  [31] "chr_LpaL13-09_pos_160173_ref_C_alt_A"   
##  [32] "chr_LpaL13-09_pos_160175_ref_C_alt_T"   
##  [33] "chr_LpaL13-09_pos_160177_ref_C_alt_G"   
##  [34] "chr_LpaL13-09_pos_177788_ref_C_alt_T"   
##  [35] "chr_LpaL13-09_pos_454418_ref_G_alt_T"   
##  [36] "chr_LpaL13-09_pos_513307_ref_C_alt_T"   
##  [37] "chr_LpaL13-09_pos_513631_ref_C_alt_T"   
##  [38] "chr_LpaL13-09_pos_64262_ref_C_alt_T"    
##  [39] "chr_LpaL13-09_pos_69179_ref_C_alt_T"    
##  [40] "chr_LpaL13-09_pos_69184_ref_G_alt_A"    
##  [41] "chr_LpaL13-10_pos_154933_ref_G_alt_A"   
##  [42] "chr_LpaL13-10_pos_174788_ref_G_alt_T"   
##  [43] "chr_LpaL13-10_pos_177730_ref_C_alt_G"   
##  [44] "chr_LpaL13-10_pos_408510_ref_T_alt_C"   
##  [45] "chr_LpaL13-10_pos_408516_ref_G_alt_C"   
##  [46] "chr_LpaL13-10_pos_408518_ref_G_alt_C"   
##  [47] "chr_LpaL13-11_pos_178942_ref_G_alt_A"   
##  [48] "chr_LpaL13-11_pos_304952_ref_G_alt_T"   
##  [49] "chr_LpaL13-11_pos_430698_ref_A_alt_T"   
##  [50] "chr_LpaL13-11_pos_430699_ref_A_alt_G"   
##  [51] "chr_LpaL13-11_pos_430700_ref_A_alt_T"   
##  [52] "chr_LpaL13-11_pos_431815_ref_C_alt_G"   
##  [53] "chr_LpaL13-11_pos_431816_ref_A_alt_C"   
##  [54] "chr_LpaL13-11_pos_431817_ref_C_alt_A"   
##  [55] "chr_LpaL13-11_pos_433123_ref_C_alt_T"   
##  [56] "chr_LpaL13-12_pos_62_ref_G_alt_A"       
##  [57] "chr_LpaL13-12_pos_69_ref_C_alt_T"       
##  [58] "chr_LpaL13-14_pos_35906_ref_C_alt_G"    
##  [59] "chr_LpaL13-14_pos_35908_ref_T_alt_C"    
##  [60] "chr_LpaL13-14_pos_35909_ref_A_alt_G"    
##  [61] "chr_LpaL13-14_pos_35911_ref_C_alt_G"    
##  [62] "chr_LpaL13-14_pos_88264_ref_C_alt_T"    
##  [63] "chr_LpaL13-14_pos_94818_ref_G_alt_T"    
##  [64] "chr_LpaL13-14_pos_94819_ref_C_alt_T"    
##  [65] "chr_LpaL13-14_pos_95037_ref_C_alt_T"    
##  [66] "chr_LpaL13-14_pos_95228_ref_T_alt_C"    
##  [67] "chr_LpaL13-15_pos_117545_ref_A_alt_T"   
##  [68] "chr_LpaL13-15_pos_262416_ref_T_alt_C"   
##  [69] "chr_LpaL13-15_pos_47170_ref_G_alt_C"    
##  [70] "chr_LpaL13-16_pos_111009_ref_G_alt_A"   
##  [71] "chr_LpaL13-16_pos_307792_ref_C_alt_G"   
##  [72] "chr_LpaL13-16_pos_442217_ref_A_alt_G"   
##  [73] "chr_LpaL13-16_pos_625854_ref_C_alt_G"   
##  [74] "chr_LpaL13-17_pos_138176_ref_C_alt_G"   
##  [75] "chr_LpaL13-17_pos_273710_ref_C_alt_T"   
##  [76] "chr_LpaL13-17_pos_316108_ref_G_alt_T"   
##  [77] "chr_LpaL13-17_pos_316121_ref_A_alt_C"   
##  [78] "chr_LpaL13-17_pos_316124_ref_A_alt_C"   
##  [79] "chr_LpaL13-17_pos_3449_ref_G_alt_T"     
##  [80] "chr_LpaL13-17_pos_3451_ref_G_alt_C"     
##  [81] "chr_LpaL13-17_pos_3452_ref_G_alt_C"     
##  [82] "chr_LpaL13-18_pos_125990_ref_C_alt_T"   
##  [83] "chr_LpaL13-18_pos_341927_ref_G_alt_A"   
##  [84] "chr_LpaL13-18_pos_341928_ref_C_alt_T"   
##  [85] "chr_LpaL13-18_pos_341929_ref_A_alt_G"   
##  [86] "chr_LpaL13-18_pos_763_ref_A_alt_G"      
##  [87] "chr_LpaL13-19_pos_81982_ref_C_alt_G"    
##  [88] "chr_LpaL13-20.1_pos_1015992_ref_G_alt_T"
##  [89] "chr_LpaL13-20.1_pos_1015994_ref_G_alt_A"
##  [90] "chr_LpaL13-20.1_pos_103841_ref_C_alt_G" 
##  [91] "chr_LpaL13-20.1_pos_106634_ref_G_alt_A" 
##  [92] "chr_LpaL13-20.1_pos_1081477_ref_A_alt_C"
##  [93] "chr_LpaL13-20.1_pos_108182_ref_A_alt_C" 
##  [94] "chr_LpaL13-20.1_pos_109501_ref_G_alt_A" 
##  [95] "chr_LpaL13-20.1_pos_111816_ref_C_alt_T" 
##  [96] "chr_LpaL13-20.1_pos_111821_ref_C_alt_G" 
##  [97] "chr_LpaL13-20.1_pos_111823_ref_T_alt_G" 
##  [98] "chr_LpaL13-20.1_pos_111898_ref_G_alt_C" 
##  [99] "chr_LpaL13-20.1_pos_112027_ref_C_alt_T" 
## [100] "chr_LpaL13-20.1_pos_112042_ref_C_alt_T"
sequential_variants <- function(snp_sets, conditions = NULL, minimum = 3, maximum_separation = 3) {
  if (is.null(conditions)) {
    conditions <- 1
  }
  intersection_sets <- snp_sets[["intersections"]]
  intersection_names <- snp_sets[["set_names"]]
  chosen_intersection <- 1
  if (is.numeric(conditions)) {
    chosen_intersection <- conditions
  } else {
    intersection_idx <- intersection_names == conditions
    chosen_intersection <- names(intersection_names)[intersection_idx]
  }

  possible_positions <- intersection_sets[[chosen_intersection]]
  position_table <- data.frame(row.names = possible_positions)
  pat <- "^chr_(.+)_pos_(.+)_ref_.*$"
  position_table[["chr"]] <- gsub(pattern = pat, replacement = "\\1", x = rownames(position_table))
  position_table[["pos"]] <- as.numeric(gsub(pattern = pat, replacement = "\\2", x = rownames(position_table)))
  position_idx <- order(position_table[, "chr"], position_table[, "pos"])
  position_table <- position_table[position_idx, ]
  position_table[["dist"]] <- 0

  last_chr <- ""
  for (r in 1:nrow(position_table)) {
    this_chr <- position_table[r, "chr"]
    if (r == 1) {
      position_table[r, "dist"] <- position_table[r, "pos"]
      last_chr <- this_chr
      next
    }
    if (this_chr == last_chr) {
      position_table[r, "dist"] <- position_table[r, "pos"] - position_table[r - 1, "pos"]
    } else {
      position_table[r, "dist"] <- position_table[r, "pos"]
    }
    last_chr <- this_chr
  }

  sequentials <- position_table[["dist"]] <= maximum_separation
  message("There are ", sum(sequentials), " candidate regions.")

  ## The following can tell me how many runs of each length occurred, that is not quite what I want.
  ## Now use run length encoding to find the set of sequential sequentials!
  rle_result <- rle(sequentials)
  rle_values <- rle_result[["values"]]
  ## The following line is equivalent to just leaving values alone:
  ## true_values <- rle_result[["values"]] == TRUE
  rle_lengths <- rle_result[["lengths"]]
  true_sequentials <- rle_lengths[rle_values]
  rle_idx <- cumsum(rle_lengths)[which(rle_values)]

  position_table[["last_sequential"]] <- 0
  count <- 0
  for (r in rle_idx) {
    count <- count + 1
    position_table[r, "last_sequential"] <- true_sequentials[count]
  }
  message("The maximum sequential set is: ", max(position_table[["last_sequential"]]), ".")

  wanted_idx <- position_table[["last_sequential"]] >= minimum
  wanted <- position_table[wanted_idx, c("chr", "pos")]
  return(wanted)
}

zymo22_sequentials <- sequential_variants(new_sets, conditions = "22")
## There are 75 candidate regions.
## The maximum sequential set is: 3.
zymo22_sequentials
##                                                           chr    pos
## chr_LpaL13-05_pos_260512_ref_G_alt_C                LpaL13-05 260512
## chr_LpaL13-14_pos_35911_ref_C_alt_G                 LpaL13-14  35911
## chr_LpaL13-24_pos_163302_ref_A_alt_C                LpaL13-24 163302
## chr_LpaL13-26_pos_563688_ref_T_alt_G                LpaL13-26 563688
## chr_LpaL13-27_pos_918786_ref_G_alt_C                LpaL13-27 918786
## chr_LpaL13-32_pos_362069_ref_T_alt_G                LpaL13-32 362069
## chr_LPAL13-SCAF000209_pos_13323_ref_C_alt_A LPAL13-SCAF000209  13323
zymo23_sequentials <- sequential_variants(new_sets, conditions = "23",
                                          minimum = 1, maximum_separation = 3)
## There are 587 candidate regions.
## The maximum sequential set is: 1.
zymo23_sequentials
##                                                           chr     pos
## chr_LpaL13-01_pos_72639_ref_G_alt_T                 LpaL13-01   72639
## chr_LpaL13-01_pos_142003_ref_T_alt_G                LpaL13-01  142003
## chr_LpaL13-01_pos_156767_ref_T_alt_G                LpaL13-01  156767
## chr_LpaL13-02_pos_2382_ref_A_alt_G                  LpaL13-02    2382
## chr_LpaL13-02_pos_2553_ref_C_alt_G                  LpaL13-02    2553
## chr_LpaL13-02_pos_24867_ref_C_alt_T                 LpaL13-02   24867
## chr_LpaL13-02_pos_52919_ref_C_alt_T                 LpaL13-02   52919
## chr_LpaL13-02_pos_172409_ref_T_alt_G                LpaL13-02  172409
## chr_LpaL13-03_pos_68954_ref_C_alt_A                 LpaL13-03   68954
## chr_LpaL13-03_pos_271279_ref_G_alt_A                LpaL13-03  271279
## chr_LpaL13-03_pos_304783_ref_T_alt_C                LpaL13-03  304783
## chr_LpaL13-04_pos_45047_ref_G_alt_A                 LpaL13-04   45047
## chr_LpaL13-04_pos_131993_ref_G_alt_T                LpaL13-04  131993
## chr_LpaL13-04_pos_336334_ref_G_alt_A                LpaL13-04  336334
## chr_LpaL13-05_pos_106738_ref_G_alt_T                LpaL13-05  106738
## chr_LpaL13-05_pos_158708_ref_A_alt_G                LpaL13-05  158708
## chr_LpaL13-06_pos_15383_ref_T_alt_A                 LpaL13-06   15383
## chr_LpaL13-06_pos_38013_ref_C_alt_G                 LpaL13-06   38013
## chr_LpaL13-06_pos_302908_ref_C_alt_T                LpaL13-06  302908
## chr_LpaL13-06_pos_320218_ref_C_alt_A                LpaL13-06  320218
## chr_LpaL13-06_pos_343598_ref_C_alt_T                LpaL13-06  343598
## chr_LpaL13-06_pos_351400_ref_C_alt_A                LpaL13-06  351400
## chr_LpaL13-06_pos_423743_ref_T_alt_C                LpaL13-06  423743
## chr_LpaL13-06_pos_450281_ref_T_alt_C                LpaL13-06  450281
## chr_LpaL13-07_pos_93544_ref_A_alt_G                 LpaL13-07   93544
## chr_LpaL13-07_pos_124413_ref_G_alt_A                LpaL13-07  124413
## chr_LpaL13-07_pos_274670_ref_C_alt_T                LpaL13-07  274670
## chr_LpaL13-07_pos_349417_ref_A_alt_G                LpaL13-07  349417
## chr_LpaL13-07_pos_438941_ref_T_alt_C                LpaL13-07  438941
## chr_LpaL13-07_pos_514751_ref_C_alt_T                LpaL13-07  514751
## chr_LpaL13-08_pos_11457_ref_G_alt_A                 LpaL13-08   11457
## chr_LpaL13-08_pos_18595_ref_G_alt_T                 LpaL13-08   18595
## chr_LpaL13-08_pos_79069_ref_A_alt_G                 LpaL13-08   79069
## chr_LpaL13-08_pos_82449_ref_T_alt_C                 LpaL13-08   82449
## chr_LpaL13-08_pos_232436_ref_G_alt_A                LpaL13-08  232436
## chr_LpaL13-08_pos_241618_ref_G_alt_A                LpaL13-08  241618
## chr_LpaL13-09_pos_140598_ref_T_alt_A                LpaL13-09  140598
## chr_LpaL13-09_pos_391215_ref_G_alt_T                LpaL13-09  391215
## chr_LpaL13-09_pos_436383_ref_C_alt_T                LpaL13-09  436383
## chr_LpaL13-09_pos_479159_ref_A_alt_T                LpaL13-09  479159
## chr_LpaL13-10_pos_20799_ref_G_alt_A                 LpaL13-10   20799
## chr_LpaL13-10_pos_45747_ref_G_alt_A                 LpaL13-10   45747
## chr_LpaL13-10_pos_69585_ref_C_alt_A                 LpaL13-10   69585
## chr_LpaL13-10_pos_146874_ref_C_alt_G                LpaL13-10  146874
## chr_LpaL13-10_pos_168240_ref_C_alt_A                LpaL13-10  168240
## chr_LpaL13-10_pos_181135_ref_T_alt_C                LpaL13-10  181135
## chr_LpaL13-10_pos_183330_ref_A_alt_G                LpaL13-10  183330
## chr_LpaL13-10_pos_185750_ref_T_alt_C                LpaL13-10  185750
## chr_LpaL13-10_pos_186009_ref_T_alt_C                LpaL13-10  186009
## chr_LpaL13-10_pos_209333_ref_A_alt_G                LpaL13-10  209333
## chr_LpaL13-10_pos_274720_ref_A_alt_G                LpaL13-10  274720
## chr_LpaL13-10_pos_335796_ref_A_alt_G                LpaL13-10  335796
## chr_LpaL13-10_pos_342572_ref_A_alt_G                LpaL13-10  342572
## chr_LpaL13-10_pos_349971_ref_A_alt_G                LpaL13-10  349971
## chr_LpaL13-10_pos_438201_ref_T_alt_C                LpaL13-10  438201
## chr_LpaL13-10_pos_492366_ref_G_alt_A                LpaL13-10  492366
## chr_LpaL13-11_pos_39438_ref_G_alt_A                 LpaL13-11   39438
## chr_LpaL13-11_pos_118303_ref_C_alt_G                LpaL13-11  118303
## chr_LpaL13-11_pos_151109_ref_G_alt_A                LpaL13-11  151109
## chr_LpaL13-11_pos_273307_ref_T_alt_A                LpaL13-11  273307
## chr_LpaL13-11_pos_312076_ref_C_alt_A                LpaL13-11  312076
## chr_LpaL13-11_pos_379204_ref_C_alt_T                LpaL13-11  379204
## chr_LpaL13-11_pos_383384_ref_A_alt_C                LpaL13-11  383384
## chr_LpaL13-11_pos_388157_ref_T_alt_A                LpaL13-11  388157
## chr_LpaL13-11_pos_421255_ref_C_alt_T                LpaL13-11  421255
## chr_LpaL13-11_pos_437349_ref_C_alt_T                LpaL13-11  437349
## chr_LpaL13-11_pos_500916_ref_A_alt_C                LpaL13-11  500916
## chr_LpaL13-12_pos_183825_ref_A_alt_G                LpaL13-12  183825
## chr_LpaL13-12_pos_188844_ref_G_alt_T                LpaL13-12  188844
## chr_LpaL13-12_pos_210931_ref_C_alt_T                LpaL13-12  210931
## chr_LpaL13-12_pos_307454_ref_T_alt_C                LpaL13-12  307454
## chr_LpaL13-12_pos_317968_ref_T_alt_C                LpaL13-12  317968
## chr_LpaL13-12_pos_368665_ref_G_alt_A                LpaL13-12  368665
## chr_LpaL13-12_pos_373774_ref_A_alt_G                LpaL13-12  373774
## chr_LpaL13-12_pos_377477_ref_C_alt_T                LpaL13-12  377477
## chr_LpaL13-13_pos_38616_ref_C_alt_T                 LpaL13-13   38616
## chr_LpaL13-13_pos_59334_ref_G_alt_A                 LpaL13-13   59334
## chr_LpaL13-13_pos_312261_ref_G_alt_T                LpaL13-13  312261
## chr_LpaL13-13_pos_320014_ref_C_alt_A                LpaL13-13  320014
## chr_LpaL13-13_pos_389288_ref_G_alt_A                LpaL13-13  389288
## chr_LpaL13-13_pos_400738_ref_T_alt_G                LpaL13-13  400738
## chr_LpaL13-13_pos_523263_ref_A_alt_T                LpaL13-13  523263
## chr_LpaL13-14_pos_119436_ref_G_alt_T                LpaL13-14  119436
## chr_LpaL13-14_pos_123246_ref_G_alt_A                LpaL13-14  123246
## chr_LpaL13-14_pos_363946_ref_A_alt_G                LpaL13-14  363946
## chr_LpaL13-14_pos_389870_ref_G_alt_C                LpaL13-14  389870
## chr_LpaL13-14_pos_431741_ref_G_alt_A                LpaL13-14  431741
## chr_LpaL13-14_pos_434109_ref_C_alt_A                LpaL13-14  434109
## chr_LpaL13-15_pos_12785_ref_C_alt_G                 LpaL13-15   12785
## chr_LpaL13-15_pos_51120_ref_G_alt_T                 LpaL13-15   51120
## chr_LpaL13-15_pos_210899_ref_C_alt_A                LpaL13-15  210899
## chr_LpaL13-15_pos_237985_ref_C_alt_A                LpaL13-15  237985
## chr_LpaL13-15_pos_238433_ref_C_alt_T                LpaL13-15  238433
## chr_LpaL13-15_pos_324735_ref_A_alt_G                LpaL13-15  324735
## chr_LpaL13-15_pos_353353_ref_G_alt_A                LpaL13-15  353353
## chr_LpaL13-15_pos_367917_ref_C_alt_T                LpaL13-15  367917
## chr_LpaL13-16_pos_159798_ref_G_alt_A                LpaL13-16  159798
## chr_LpaL13-16_pos_248755_ref_G_alt_A                LpaL13-16  248755
## chr_LpaL13-16_pos_319437_ref_C_alt_G                LpaL13-16  319437
## chr_LpaL13-16_pos_328067_ref_T_alt_C                LpaL13-16  328067
## chr_LpaL13-16_pos_359053_ref_A_alt_G                LpaL13-16  359053
## chr_LpaL13-16_pos_510871_ref_T_alt_C                LpaL13-16  510871
## chr_LpaL13-16_pos_542589_ref_T_alt_C                LpaL13-16  542589
## chr_LpaL13-16_pos_632658_ref_A_alt_G                LpaL13-16  632658
## chr_LpaL13-17_pos_4943_ref_T_alt_G                  LpaL13-17    4943
## chr_LpaL13-17_pos_10790_ref_C_alt_T                 LpaL13-17   10790
## chr_LpaL13-17_pos_63803_ref_A_alt_G                 LpaL13-17   63803
## chr_LpaL13-17_pos_77212_ref_T_alt_C                 LpaL13-17   77212
## chr_LpaL13-17_pos_149908_ref_T_alt_G                LpaL13-17  149908
## chr_LpaL13-17_pos_201141_ref_C_alt_A                LpaL13-17  201141
## chr_LpaL13-17_pos_267792_ref_T_alt_C                LpaL13-17  267792
## chr_LpaL13-17_pos_348712_ref_G_alt_T                LpaL13-17  348712
## chr_LpaL13-17_pos_350657_ref_G_alt_A                LpaL13-17  350657
## chr_LpaL13-17_pos_514887_ref_A_alt_C                LpaL13-17  514887
## chr_LpaL13-17_pos_545470_ref_C_alt_T                LpaL13-17  545470
## chr_LpaL13-18_pos_33073_ref_T_alt_C                 LpaL13-18   33073
## chr_LpaL13-18_pos_86828_ref_G_alt_T                 LpaL13-18   86828
## chr_LpaL13-18_pos_142231_ref_A_alt_T                LpaL13-18  142231
## chr_LpaL13-18_pos_142844_ref_C_alt_T                LpaL13-18  142844
## chr_LpaL13-18_pos_165728_ref_T_alt_A                LpaL13-18  165728
## chr_LpaL13-18_pos_320509_ref_A_alt_G                LpaL13-18  320509
## chr_LpaL13-18_pos_350380_ref_G_alt_T                LpaL13-18  350380
## chr_LpaL13-18_pos_568544_ref_A_alt_G                LpaL13-18  568544
## chr_LpaL13-18_pos_570476_ref_T_alt_C                LpaL13-18  570476
## chr_LpaL13-19_pos_36729_ref_A_alt_T                 LpaL13-19   36729
## chr_LpaL13-19_pos_162759_ref_T_alt_C                LpaL13-19  162759
## chr_LpaL13-19_pos_183104_ref_G_alt_A                LpaL13-19  183104
## chr_LpaL13-19_pos_209269_ref_C_alt_A                LpaL13-19  209269
## chr_LpaL13-19_pos_461576_ref_T_alt_C                LpaL13-19  461576
## chr_LpaL13-20.1_pos_49543_ref_G_alt_A             LpaL13-20.1   49543
## chr_LpaL13-20.1_pos_102542_ref_T_alt_G            LpaL13-20.1  102542
## chr_LpaL13-20.1_pos_106389_ref_C_alt_T            LpaL13-20.1  106389
## chr_LpaL13-20.1_pos_159848_ref_T_alt_A            LpaL13-20.1  159848
## chr_LpaL13-20.1_pos_236893_ref_A_alt_G            LpaL13-20.1  236893
## chr_LpaL13-20.1_pos_258755_ref_T_alt_G            LpaL13-20.1  258755
## chr_LpaL13-20.1_pos_307947_ref_T_alt_C            LpaL13-20.1  307947
## chr_LpaL13-20.1_pos_308094_ref_G_alt_C            LpaL13-20.1  308094
## chr_LpaL13-20.1_pos_321364_ref_G_alt_T            LpaL13-20.1  321364
## chr_LpaL13-20.1_pos_335309_ref_T_alt_G            LpaL13-20.1  335309
## chr_LpaL13-20.1_pos_346113_ref_A_alt_G            LpaL13-20.1  346113
## chr_LpaL13-20.1_pos_350379_ref_C_alt_G            LpaL13-20.1  350379
## chr_LpaL13-20.1_pos_350414_ref_C_alt_A            LpaL13-20.1  350414
## chr_LpaL13-20.1_pos_351279_ref_T_alt_C            LpaL13-20.1  351279
## chr_LpaL13-20.1_pos_412280_ref_T_alt_C            LpaL13-20.1  412280
## chr_LpaL13-20.1_pos_452258_ref_G_alt_A            LpaL13-20.1  452258
## chr_LpaL13-20.1_pos_480534_ref_A_alt_G            LpaL13-20.1  480534
## chr_LpaL13-20.1_pos_592864_ref_G_alt_A            LpaL13-20.1  592864
## chr_LpaL13-20.1_pos_596134_ref_A_alt_T            LpaL13-20.1  596134
## chr_LpaL13-20.1_pos_619143_ref_G_alt_C            LpaL13-20.1  619143
## chr_LpaL13-20.1_pos_623449_ref_C_alt_T            LpaL13-20.1  623449
## chr_LpaL13-20.1_pos_632487_ref_T_alt_A            LpaL13-20.1  632487
## chr_LpaL13-20.1_pos_647159_ref_A_alt_G            LpaL13-20.1  647159
## chr_LpaL13-20.1_pos_655463_ref_A_alt_G            LpaL13-20.1  655463
## chr_LpaL13-20.1_pos_678891_ref_C_alt_A            LpaL13-20.1  678891
## chr_LpaL13-20.1_pos_695644_ref_C_alt_T            LpaL13-20.1  695644
## chr_LpaL13-20.1_pos_818301_ref_G_alt_A            LpaL13-20.1  818301
## chr_LpaL13-20.1_pos_831668_ref_G_alt_A            LpaL13-20.1  831668
## chr_LpaL13-20.1_pos_922805_ref_G_alt_T            LpaL13-20.1  922805
## chr_LpaL13-20.1_pos_993266_ref_G_alt_A            LpaL13-20.1  993266
## chr_LpaL13-20.1_pos_1016356_ref_A_alt_T           LpaL13-20.1 1016356
## chr_LpaL13-20.1_pos_1054512_ref_A_alt_T           LpaL13-20.1 1054512
## chr_LpaL13-20.1_pos_1059367_ref_A_alt_T           LpaL13-20.1 1059367
## chr_LpaL13-20.1_pos_1088646_ref_T_alt_C           LpaL13-20.1 1088646
## chr_LpaL13-20.1_pos_1177324_ref_G_alt_A           LpaL13-20.1 1177324
## chr_LpaL13-20.1_pos_1248973_ref_G_alt_A           LpaL13-20.1 1248973
## chr_LpaL13-20.1_pos_1281310_ref_G_alt_T           LpaL13-20.1 1281310
## chr_LpaL13-20.1_pos_1298166_ref_G_alt_A           LpaL13-20.1 1298166
## chr_LpaL13-20.1_pos_1317156_ref_A_alt_G           LpaL13-20.1 1317156
## chr_LpaL13-20.1_pos_1412845_ref_C_alt_T           LpaL13-20.1 1412845
## chr_LpaL13-20.1_pos_1453218_ref_G_alt_C           LpaL13-20.1 1453218
## chr_LpaL13-20.1_pos_1501722_ref_C_alt_T           LpaL13-20.1 1501722
## chr_LpaL13-20.1_pos_1596088_ref_A_alt_T           LpaL13-20.1 1596088
## chr_LpaL13-20.2_pos_152433_ref_A_alt_G            LpaL13-20.2  152433
## chr_LpaL13-20.2_pos_178900_ref_T_alt_C            LpaL13-20.2  178900
## chr_LpaL13-20.2_pos_311367_ref_C_alt_A            LpaL13-20.2  311367
## chr_LpaL13-20.2_pos_315818_ref_G_alt_A            LpaL13-20.2  315818
## chr_LpaL13-20.2_pos_357266_ref_A_alt_C            LpaL13-20.2  357266
## chr_LpaL13-20.2_pos_390700_ref_T_alt_C            LpaL13-20.2  390700
## chr_LpaL13-20.2_pos_456013_ref_T_alt_G            LpaL13-20.2  456013
## chr_LpaL13-20.2_pos_487417_ref_G_alt_A            LpaL13-20.2  487417
## chr_LpaL13-20.2_pos_491339_ref_T_alt_G            LpaL13-20.2  491339
## chr_LpaL13-20.2_pos_644823_ref_A_alt_G            LpaL13-20.2  644823
## chr_LpaL13-21_pos_786_ref_T_alt_C                   LpaL13-21     786
## chr_LpaL13-21_pos_82460_ref_T_alt_G                 LpaL13-21   82460
## chr_LpaL13-21_pos_115487_ref_G_alt_A                LpaL13-21  115487
## chr_LpaL13-21_pos_231537_ref_A_alt_C                LpaL13-21  231537
## chr_LpaL13-21_pos_250873_ref_C_alt_A                LpaL13-21  250873
## chr_LpaL13-21_pos_262475_ref_A_alt_C                LpaL13-21  262475
## chr_LpaL13-21_pos_325397_ref_G_alt_A                LpaL13-21  325397
## chr_LpaL13-21_pos_392015_ref_T_alt_C                LpaL13-21  392015
## chr_LpaL13-21_pos_437707_ref_G_alt_A                LpaL13-21  437707
## chr_LpaL13-22_pos_1330_ref_C_alt_G                  LpaL13-22    1330
## chr_LpaL13-22_pos_1427_ref_C_alt_T                  LpaL13-22    1427
## chr_LpaL13-22_pos_10851_ref_G_alt_A                 LpaL13-22   10851
## chr_LpaL13-22_pos_55037_ref_A_alt_G                 LpaL13-22   55037
## chr_LpaL13-22_pos_80846_ref_C_alt_T                 LpaL13-22   80846
## chr_LpaL13-22_pos_81469_ref_T_alt_G                 LpaL13-22   81469
## chr_LpaL13-22_pos_98378_ref_A_alt_G                 LpaL13-22   98378
## chr_LpaL13-22_pos_126348_ref_C_alt_T                LpaL13-22  126348
## chr_LpaL13-22_pos_141139_ref_A_alt_G                LpaL13-22  141139
## chr_LpaL13-22_pos_165209_ref_A_alt_C                LpaL13-22  165209
## chr_LpaL13-22_pos_190341_ref_A_alt_G                LpaL13-22  190341
## chr_LpaL13-22_pos_227606_ref_A_alt_C                LpaL13-22  227606
## chr_LpaL13-22_pos_244970_ref_C_alt_T                LpaL13-22  244970
## chr_LpaL13-22_pos_264878_ref_T_alt_C                LpaL13-22  264878
## chr_LpaL13-22_pos_289710_ref_C_alt_T                LpaL13-22  289710
## chr_LpaL13-22_pos_381982_ref_C_alt_A                LpaL13-22  381982
## chr_LpaL13-23_pos_69959_ref_C_alt_T                 LpaL13-23   69959
## chr_LpaL13-23_pos_106771_ref_T_alt_C                LpaL13-23  106771
## chr_LpaL13-23_pos_133025_ref_A_alt_G                LpaL13-23  133025
## chr_LpaL13-23_pos_287616_ref_G_alt_A                LpaL13-23  287616
## chr_LpaL13-23_pos_361878_ref_T_alt_G                LpaL13-23  361878
## chr_LpaL13-23_pos_368180_ref_T_alt_A                LpaL13-23  368180
## chr_LpaL13-23_pos_446645_ref_T_alt_C                LpaL13-23  446645
## chr_LpaL13-23_pos_467640_ref_A_alt_C                LpaL13-23  467640
## chr_LpaL13-23_pos_507383_ref_T_alt_A                LpaL13-23  507383
## chr_LpaL13-23_pos_624501_ref_A_alt_G                LpaL13-23  624501
## chr_LpaL13-23_pos_682320_ref_C_alt_T                LpaL13-23  682320
## chr_LpaL13-24_pos_14947_ref_T_alt_A                 LpaL13-24   14947
## chr_LpaL13-24_pos_93202_ref_T_alt_C                 LpaL13-24   93202
## chr_LpaL13-24_pos_165630_ref_G_alt_A                LpaL13-24  165630
## chr_LpaL13-24_pos_167919_ref_A_alt_C                LpaL13-24  167919
## chr_LpaL13-24_pos_229152_ref_G_alt_A                LpaL13-24  229152
## chr_LpaL13-24_pos_520571_ref_G_alt_A                LpaL13-24  520571
## chr_LpaL13-24_pos_742627_ref_T_alt_A                LpaL13-24  742627
## chr_LpaL13-24_pos_817334_ref_G_alt_A                LpaL13-24  817334
## chr_LpaL13-24_pos_827937_ref_G_alt_A                LpaL13-24  827937
## chr_LpaL13-25_pos_27738_ref_G_alt_A                 LpaL13-25   27738
## chr_LpaL13-25_pos_117529_ref_A_alt_G                LpaL13-25  117529
## chr_LpaL13-25_pos_141731_ref_C_alt_A                LpaL13-25  141731
## chr_LpaL13-25_pos_286304_ref_T_alt_G                LpaL13-25  286304
## chr_LpaL13-25_pos_310838_ref_C_alt_A                LpaL13-25  310838
## chr_LpaL13-25_pos_359427_ref_C_alt_A                LpaL13-25  359427
## chr_LpaL13-25_pos_499205_ref_C_alt_T                LpaL13-25  499205
## chr_LpaL13-25_pos_557815_ref_T_alt_C                LpaL13-25  557815
## chr_LpaL13-25_pos_657979_ref_T_alt_C                LpaL13-25  657979
## chr_LpaL13-26_pos_6789_ref_A_alt_G                  LpaL13-26    6789
## chr_LpaL13-26_pos_140432_ref_G_alt_A                LpaL13-26  140432
## chr_LpaL13-26_pos_203702_ref_T_alt_C                LpaL13-26  203702
## chr_LpaL13-26_pos_239077_ref_G_alt_A                LpaL13-26  239077
## chr_LpaL13-26_pos_422409_ref_C_alt_T                LpaL13-26  422409
## chr_LpaL13-26_pos_456454_ref_C_alt_T                LpaL13-26  456454
## chr_LpaL13-26_pos_710492_ref_C_alt_A                LpaL13-26  710492
## chr_LpaL13-26_pos_757994_ref_T_alt_G                LpaL13-26  757994
## chr_LpaL13-26_pos_963074_ref_G_alt_T                LpaL13-26  963074
## chr_LpaL13-27_pos_46029_ref_T_alt_C                 LpaL13-27   46029
## chr_LpaL13-27_pos_107922_ref_T_alt_C                LpaL13-27  107922
## chr_LpaL13-27_pos_264381_ref_A_alt_G                LpaL13-27  264381
## chr_LpaL13-27_pos_264491_ref_C_alt_A                LpaL13-27  264491
## chr_LpaL13-27_pos_318020_ref_T_alt_A                LpaL13-27  318020
## chr_LpaL13-27_pos_326409_ref_G_alt_A                LpaL13-27  326409
## chr_LpaL13-27_pos_334107_ref_T_alt_G                LpaL13-27  334107
## chr_LpaL13-27_pos_336309_ref_C_alt_T                LpaL13-27  336309
## chr_LpaL13-27_pos_455953_ref_G_alt_T                LpaL13-27  455953
## chr_LpaL13-27_pos_484782_ref_T_alt_C                LpaL13-27  484782
## chr_LpaL13-27_pos_490159_ref_C_alt_T                LpaL13-27  490159
## chr_LpaL13-27_pos_585702_ref_T_alt_A                LpaL13-27  585702
## chr_LpaL13-27_pos_604602_ref_T_alt_C                LpaL13-27  604602
## chr_LpaL13-27_pos_642439_ref_C_alt_T                LpaL13-27  642439
## chr_LpaL13-27_pos_650440_ref_C_alt_T                LpaL13-27  650440
## chr_LpaL13-27_pos_752765_ref_A_alt_G                LpaL13-27  752765
## chr_LpaL13-27_pos_762578_ref_C_alt_T                LpaL13-27  762578
## chr_LpaL13-27_pos_818479_ref_G_alt_A                LpaL13-27  818479
## chr_LpaL13-27_pos_976127_ref_A_alt_G                LpaL13-27  976127
## chr_LpaL13-27_pos_1027712_ref_G_alt_A               LpaL13-27 1027712
## chr_LpaL13-27_pos_1032145_ref_A_alt_G               LpaL13-27 1032145
## chr_LpaL13-28_pos_51359_ref_T_alt_G                 LpaL13-28   51359
## chr_LpaL13-28_pos_129399_ref_T_alt_G                LpaL13-28  129399
## chr_LpaL13-28_pos_185302_ref_C_alt_T                LpaL13-28  185302
## chr_LpaL13-28_pos_193243_ref_C_alt_T                LpaL13-28  193243
## chr_LpaL13-28_pos_235583_ref_T_alt_G                LpaL13-28  235583
## chr_LpaL13-28_pos_357672_ref_C_alt_T                LpaL13-28  357672
## chr_LpaL13-28_pos_510531_ref_G_alt_A                LpaL13-28  510531
## chr_LpaL13-28_pos_518230_ref_C_alt_T                LpaL13-28  518230
## chr_LpaL13-28_pos_553388_ref_A_alt_G                LpaL13-28  553388
## chr_LpaL13-28_pos_608455_ref_C_alt_G                LpaL13-28  608455
## chr_LpaL13-28_pos_655760_ref_T_alt_C                LpaL13-28  655760
## chr_LpaL13-28_pos_857964_ref_C_alt_T                LpaL13-28  857964
## chr_LpaL13-28_pos_1047369_ref_A_alt_G               LpaL13-28 1047369
## chr_LpaL13-28_pos_1096571_ref_A_alt_G               LpaL13-28 1096571
## chr_LpaL13-28_pos_1108299_ref_G_alt_C               LpaL13-28 1108299
## chr_LpaL13-29_pos_87918_ref_G_alt_A                 LpaL13-29   87918
## chr_LpaL13-29_pos_268342_ref_G_alt_T                LpaL13-29  268342
## chr_LpaL13-29_pos_271936_ref_G_alt_A                LpaL13-29  271936
## chr_LpaL13-29_pos_311984_ref_A_alt_T                LpaL13-29  311984
## chr_LpaL13-29_pos_447354_ref_C_alt_G                LpaL13-29  447354
## chr_LpaL13-29_pos_489037_ref_A_alt_C                LpaL13-29  489037
## chr_LpaL13-29_pos_495654_ref_T_alt_C                LpaL13-29  495654
## chr_LpaL13-29_pos_639630_ref_G_alt_A                LpaL13-29  639630
## chr_LpaL13-29_pos_708844_ref_C_alt_T                LpaL13-29  708844
## chr_LpaL13-29_pos_723056_ref_T_alt_C                LpaL13-29  723056
## chr_LpaL13-29_pos_762309_ref_G_alt_T                LpaL13-29  762309
## chr_LpaL13-29_pos_830090_ref_G_alt_C                LpaL13-29  830090
## chr_LpaL13-29_pos_830342_ref_G_alt_A                LpaL13-29  830342
## chr_LpaL13-29_pos_847817_ref_G_alt_A                LpaL13-29  847817
## chr_LpaL13-29_pos_874427_ref_T_alt_C                LpaL13-29  874427
## chr_LpaL13-29_pos_882046_ref_C_alt_G                LpaL13-29  882046
## chr_LpaL13-29_pos_901968_ref_C_alt_T                LpaL13-29  901968
## chr_LpaL13-29_pos_911556_ref_T_alt_C                LpaL13-29  911556
## chr_LpaL13-29_pos_968326_ref_G_alt_T                LpaL13-29  968326
## chr_LpaL13-29_pos_1016671_ref_G_alt_A               LpaL13-29 1016671
## chr_LpaL13-29_pos_1025249_ref_A_alt_G               LpaL13-29 1025249
## chr_LpaL13-30_pos_7706_ref_G_alt_C                  LpaL13-30    7706
## chr_LpaL13-30_pos_32005_ref_G_alt_C                 LpaL13-30   32005
## chr_LpaL13-30_pos_133830_ref_G_alt_A                LpaL13-30  133830
## chr_LpaL13-30_pos_466995_ref_A_alt_G                LpaL13-30  466995
## chr_LpaL13-30_pos_469681_ref_A_alt_G                LpaL13-30  469681
## chr_LpaL13-30_pos_595434_ref_T_alt_A                LpaL13-30  595434
## chr_LpaL13-30_pos_685197_ref_C_alt_A                LpaL13-30  685197
## chr_LpaL13-30_pos_696153_ref_T_alt_C                LpaL13-30  696153
## chr_LpaL13-30_pos_698488_ref_T_alt_C                LpaL13-30  698488
## chr_LpaL13-30_pos_703596_ref_G_alt_A                LpaL13-30  703596
## chr_LpaL13-30_pos_721396_ref_T_alt_C                LpaL13-30  721396
## chr_LpaL13-30_pos_736960_ref_G_alt_C                LpaL13-30  736960
## chr_LpaL13-30_pos_774672_ref_G_alt_T                LpaL13-30  774672
## chr_LpaL13-30_pos_779385_ref_A_alt_G                LpaL13-30  779385
## chr_LpaL13-30_pos_812940_ref_T_alt_C                LpaL13-30  812940
## chr_LpaL13-30_pos_823192_ref_A_alt_C                LpaL13-30  823192
## chr_LpaL13-30_pos_909885_ref_C_alt_G                LpaL13-30  909885
## chr_LpaL13-30_pos_939790_ref_C_alt_T                LpaL13-30  939790
## chr_LpaL13-30_pos_940195_ref_A_alt_G                LpaL13-30  940195
## chr_LpaL13-30_pos_954081_ref_C_alt_A                LpaL13-30  954081
## chr_LpaL13-30_pos_1035259_ref_G_alt_A               LpaL13-30 1035259
## chr_LpaL13-30_pos_1054092_ref_A_alt_G               LpaL13-30 1054092
## chr_LpaL13-30_pos_1203433_ref_C_alt_G               LpaL13-30 1203433
## chr_LpaL13-31_pos_69987_ref_G_alt_A                 LpaL13-31   69987
## chr_LpaL13-31_pos_130356_ref_G_alt_A                LpaL13-31  130356
## chr_LpaL13-31_pos_196263_ref_G_alt_C                LpaL13-31  196263
## chr_LpaL13-31_pos_226748_ref_C_alt_T                LpaL13-31  226748
## chr_LpaL13-31_pos_246599_ref_A_alt_G                LpaL13-31  246599
## chr_LpaL13-31_pos_263456_ref_A_alt_G                LpaL13-31  263456
## chr_LpaL13-31_pos_298515_ref_G_alt_A                LpaL13-31  298515
## chr_LpaL13-31_pos_302436_ref_A_alt_G                LpaL13-31  302436
## chr_LpaL13-31_pos_330835_ref_T_alt_C                LpaL13-31  330835
## chr_LpaL13-31_pos_365126_ref_G_alt_A                LpaL13-31  365126
## chr_LpaL13-31_pos_369350_ref_A_alt_G                LpaL13-31  369350
## chr_LpaL13-31_pos_419809_ref_G_alt_A                LpaL13-31  419809
## chr_LpaL13-31_pos_422501_ref_G_alt_A                LpaL13-31  422501
## chr_LpaL13-31_pos_427852_ref_A_alt_G                LpaL13-31  427852
## chr_LpaL13-31_pos_513547_ref_G_alt_T                LpaL13-31  513547
## chr_LpaL13-31_pos_620370_ref_T_alt_C                LpaL13-31  620370
## chr_LpaL13-31_pos_724542_ref_G_alt_T                LpaL13-31  724542
## chr_LpaL13-31_pos_787040_ref_T_alt_C                LpaL13-31  787040
## chr_LpaL13-31_pos_820865_ref_T_alt_C                LpaL13-31  820865
## chr_LpaL13-31_pos_874880_ref_C_alt_A                LpaL13-31  874880
## chr_LpaL13-31_pos_888595_ref_T_alt_C                LpaL13-31  888595
## chr_LpaL13-31_pos_913528_ref_T_alt_G                LpaL13-31  913528
## chr_LpaL13-31_pos_920450_ref_C_alt_T                LpaL13-31  920450
## chr_LpaL13-31_pos_944669_ref_G_alt_A                LpaL13-31  944669
## chr_LpaL13-31_pos_979127_ref_G_alt_C                LpaL13-31  979127
## chr_LpaL13-31_pos_983058_ref_C_alt_T                LpaL13-31  983058
## chr_LpaL13-31_pos_1014458_ref_C_alt_T               LpaL13-31 1014458
## chr_LpaL13-31_pos_1043165_ref_C_alt_T               LpaL13-31 1043165
## chr_LpaL13-31_pos_1049580_ref_C_alt_T               LpaL13-31 1049580
## chr_LpaL13-31_pos_1068246_ref_C_alt_T               LpaL13-31 1068246
## chr_LpaL13-31_pos_1097639_ref_G_alt_C               LpaL13-31 1097639
## chr_LpaL13-31_pos_1119705_ref_T_alt_G               LpaL13-31 1119705
## chr_LpaL13-31_pos_1186101_ref_T_alt_G               LpaL13-31 1186101
## chr_LpaL13-31_pos_1187450_ref_G_alt_A               LpaL13-31 1187450
## chr_LpaL13-32_pos_12257_ref_T_alt_C                 LpaL13-32   12257
## chr_LpaL13-32_pos_24544_ref_G_alt_A                 LpaL13-32   24544
## chr_LpaL13-32_pos_36031_ref_C_alt_T                 LpaL13-32   36031
## chr_LpaL13-32_pos_87352_ref_G_alt_A                 LpaL13-32   87352
## chr_LpaL13-32_pos_95202_ref_C_alt_T                 LpaL13-32   95202
## chr_LpaL13-32_pos_198270_ref_T_alt_A                LpaL13-32  198270
## chr_LpaL13-32_pos_283430_ref_A_alt_C                LpaL13-32  283430
## chr_LpaL13-32_pos_295539_ref_G_alt_A                LpaL13-32  295539
## chr_LpaL13-32_pos_301346_ref_G_alt_A                LpaL13-32  301346
## chr_LpaL13-32_pos_348294_ref_G_alt_A                LpaL13-32  348294
## chr_LpaL13-32_pos_415606_ref_A_alt_G                LpaL13-32  415606
## chr_LpaL13-32_pos_441651_ref_G_alt_A                LpaL13-32  441651
## chr_LpaL13-32_pos_443631_ref_T_alt_G                LpaL13-32  443631
## chr_LpaL13-32_pos_488329_ref_G_alt_A                LpaL13-32  488329
## chr_LpaL13-32_pos_578515_ref_T_alt_C                LpaL13-32  578515
## chr_LpaL13-32_pos_591800_ref_A_alt_G                LpaL13-32  591800
## chr_LpaL13-32_pos_634598_ref_T_alt_G                LpaL13-32  634598
## chr_LpaL13-32_pos_644646_ref_A_alt_G                LpaL13-32  644646
## chr_LpaL13-32_pos_647326_ref_C_alt_G                LpaL13-32  647326
## chr_LpaL13-32_pos_651428_ref_A_alt_G                LpaL13-32  651428
## chr_LpaL13-32_pos_801223_ref_G_alt_A                LpaL13-32  801223
## chr_LpaL13-32_pos_909951_ref_G_alt_A                LpaL13-32  909951
## chr_LpaL13-32_pos_944338_ref_C_alt_T                LpaL13-32  944338
## chr_LpaL13-32_pos_950974_ref_A_alt_G                LpaL13-32  950974
## chr_LpaL13-32_pos_964646_ref_G_alt_A                LpaL13-32  964646
## chr_LpaL13-32_pos_1023196_ref_T_alt_C               LpaL13-32 1023196
## chr_LpaL13-32_pos_1034117_ref_T_alt_G               LpaL13-32 1034117
## chr_LpaL13-32_pos_1034263_ref_G_alt_A               LpaL13-32 1034263
## chr_LpaL13-32_pos_1064994_ref_A_alt_C               LpaL13-32 1064994
## chr_LpaL13-32_pos_1130801_ref_G_alt_C               LpaL13-32 1130801
## chr_LpaL13-32_pos_1228636_ref_G_alt_T               LpaL13-32 1228636
## chr_LpaL13-32_pos_1262745_ref_T_alt_G               LpaL13-32 1262745
## chr_LpaL13-32_pos_1297516_ref_A_alt_G               LpaL13-32 1297516
## chr_LpaL13-32_pos_1346048_ref_G_alt_A               LpaL13-32 1346048
## chr_LpaL13-32_pos_1390125_ref_G_alt_A               LpaL13-32 1390125
## chr_LpaL13-33_pos_15047_ref_C_alt_A                 LpaL13-33   15047
## chr_LpaL13-33_pos_73433_ref_A_alt_G                 LpaL13-33   73433
## chr_LpaL13-33_pos_80400_ref_A_alt_G                 LpaL13-33   80400
## chr_LpaL13-33_pos_103241_ref_A_alt_C                LpaL13-33  103241
## chr_LpaL13-33_pos_115935_ref_G_alt_C                LpaL13-33  115935
## chr_LpaL13-33_pos_197452_ref_C_alt_T                LpaL13-33  197452
## chr_LpaL13-33_pos_335573_ref_T_alt_A                LpaL13-33  335573
## chr_LpaL13-33_pos_389848_ref_G_alt_T                LpaL13-33  389848
## chr_LpaL13-33_pos_448962_ref_G_alt_A                LpaL13-33  448962
## chr_LpaL13-33_pos_453062_ref_G_alt_A                LpaL13-33  453062
## chr_LpaL13-33_pos_470671_ref_G_alt_C                LpaL13-33  470671
## chr_LpaL13-33_pos_562858_ref_C_alt_T                LpaL13-33  562858
## chr_LpaL13-33_pos_614285_ref_C_alt_T                LpaL13-33  614285
## chr_LpaL13-33_pos_775843_ref_A_alt_G                LpaL13-33  775843
## chr_LpaL13-33_pos_778205_ref_A_alt_C                LpaL13-33  778205
## chr_LpaL13-33_pos_842627_ref_A_alt_G                LpaL13-33  842627
## chr_LpaL13-33_pos_850975_ref_G_alt_T                LpaL13-33  850975
## chr_LpaL13-33_pos_876358_ref_C_alt_A                LpaL13-33  876358
## chr_LpaL13-33_pos_916490_ref_A_alt_C                LpaL13-33  916490
## chr_LpaL13-33_pos_1250620_ref_G_alt_T               LpaL13-33 1250620
## chr_LpaL13-33_pos_1250976_ref_A_alt_C               LpaL13-33 1250976
## chr_LpaL13-33_pos_1294800_ref_T_alt_C               LpaL13-33 1294800
## chr_LpaL13-33_pos_1303527_ref_G_alt_T               LpaL13-33 1303527
## chr_LpaL13-33_pos_1330664_ref_T_alt_C               LpaL13-33 1330664
## chr_LpaL13-33_pos_1331507_ref_G_alt_C               LpaL13-33 1331507
## chr_LpaL13-33_pos_1336052_ref_C_alt_T               LpaL13-33 1336052
## chr_LpaL13-33_pos_1369866_ref_G_alt_A               LpaL13-33 1369866
## chr_LpaL13-33_pos_1374376_ref_G_alt_T               LpaL13-33 1374376
## chr_LpaL13-34_pos_4396_ref_C_alt_T                  LpaL13-34    4396
## chr_LpaL13-34_pos_256540_ref_C_alt_T                LpaL13-34  256540
## chr_LpaL13-34_pos_271509_ref_A_alt_T                LpaL13-34  271509
## chr_LpaL13-34_pos_312059_ref_G_alt_A                LpaL13-34  312059
## chr_LpaL13-34_pos_335367_ref_C_alt_G                LpaL13-34  335367
## chr_LpaL13-34_pos_363093_ref_G_alt_A                LpaL13-34  363093
## chr_LpaL13-34_pos_372005_ref_C_alt_T                LpaL13-34  372005
## chr_LpaL13-34_pos_372052_ref_C_alt_T                LpaL13-34  372052
## chr_LpaL13-34_pos_376823_ref_G_alt_T                LpaL13-34  376823
## chr_LpaL13-34_pos_414279_ref_C_alt_T                LpaL13-34  414279
## chr_LpaL13-34_pos_448014_ref_A_alt_G                LpaL13-34  448014
## chr_LpaL13-34_pos_486207_ref_G_alt_C                LpaL13-34  486207
## chr_LpaL13-34_pos_535149_ref_G_alt_A                LpaL13-34  535149
## chr_LpaL13-34_pos_722787_ref_C_alt_T                LpaL13-34  722787
## chr_LpaL13-34_pos_723684_ref_T_alt_C                LpaL13-34  723684
## chr_LpaL13-34_pos_780201_ref_T_alt_A                LpaL13-34  780201
## chr_LpaL13-34_pos_794201_ref_A_alt_C                LpaL13-34  794201
## chr_LpaL13-34_pos_847013_ref_C_alt_G                LpaL13-34  847013
## chr_LpaL13-34_pos_850213_ref_T_alt_C                LpaL13-34  850213
## chr_LpaL13-34_pos_854825_ref_T_alt_G                LpaL13-34  854825
## chr_LpaL13-34_pos_871885_ref_C_alt_A                LpaL13-34  871885
## chr_LpaL13-34_pos_911456_ref_C_alt_G                LpaL13-34  911456
## chr_LpaL13-34_pos_920164_ref_C_alt_T                LpaL13-34  920164
## chr_LpaL13-34_pos_973395_ref_C_alt_T                LpaL13-34  973395
## chr_LpaL13-34_pos_999024_ref_A_alt_C                LpaL13-34  999024
## chr_LpaL13-34_pos_1018296_ref_C_alt_T               LpaL13-34 1018296
## chr_LpaL13-34_pos_1064831_ref_G_alt_A               LpaL13-34 1064831
## chr_LpaL13-34_pos_1074999_ref_T_alt_A               LpaL13-34 1074999
## chr_LpaL13-34_pos_1167036_ref_T_alt_G               LpaL13-34 1167036
## chr_LpaL13-34_pos_1180263_ref_A_alt_G               LpaL13-34 1180263
## chr_LpaL13-34_pos_1330085_ref_G_alt_A               LpaL13-34 1330085
## chr_LpaL13-34_pos_1333917_ref_A_alt_C               LpaL13-34 1333917
## chr_LpaL13-34_pos_1381727_ref_A_alt_T               LpaL13-34 1381727
## chr_LpaL13-34_pos_1417568_ref_A_alt_C               LpaL13-34 1417568
## chr_LpaL13-34_pos_1491349_ref_C_alt_A               LpaL13-34 1491349
## chr_LpaL13-34_pos_1557338_ref_C_alt_G               LpaL13-34 1557338
## chr_LpaL13-34_pos_1593542_ref_G_alt_A               LpaL13-34 1593542
## chr_LpaL13-34_pos_1725272_ref_G_alt_A               LpaL13-34 1725272
## chr_LpaL13-34_pos_1728344_ref_C_alt_G               LpaL13-34 1728344
## chr_LpaL13-34_pos_1763421_ref_T_alt_C               LpaL13-34 1763421
## chr_LpaL13-34_pos_1769473_ref_C_alt_T               LpaL13-34 1769473
## chr_LpaL13-34_pos_1772744_ref_C_alt_T               LpaL13-34 1772744
## chr_LpaL13-34_pos_1792403_ref_C_alt_T               LpaL13-34 1792403
## chr_LpaL13-34_pos_1824955_ref_C_alt_T               LpaL13-34 1824955
## chr_LpaL13-34_pos_1831041_ref_C_alt_T               LpaL13-34 1831041
## chr_LpaL13-34_pos_1831871_ref_T_alt_C               LpaL13-34 1831871
## chr_LpaL13-34_pos_1834691_ref_A_alt_G               LpaL13-34 1834691
## chr_LpaL13-34_pos_1894203_ref_T_alt_A               LpaL13-34 1894203
## chr_LpaL13-35_pos_61234_ref_T_alt_C                 LpaL13-35   61234
## chr_LpaL13-35_pos_83470_ref_G_alt_T                 LpaL13-35   83470
## chr_LpaL13-35_pos_122661_ref_A_alt_C                LpaL13-35  122661
## chr_LpaL13-35_pos_181780_ref_A_alt_G                LpaL13-35  181780
## chr_LpaL13-35_pos_237496_ref_C_alt_T                LpaL13-35  237496
## chr_LpaL13-35_pos_309212_ref_G_alt_A                LpaL13-35  309212
## chr_LpaL13-35_pos_316508_ref_G_alt_A                LpaL13-35  316508
## chr_LpaL13-35_pos_325722_ref_C_alt_T                LpaL13-35  325722
## chr_LpaL13-35_pos_389338_ref_C_alt_T                LpaL13-35  389338
## chr_LpaL13-35_pos_413575_ref_C_alt_A                LpaL13-35  413575
## chr_LpaL13-35_pos_429282_ref_G_alt_A                LpaL13-35  429282
## chr_LpaL13-35_pos_439087_ref_T_alt_C                LpaL13-35  439087
## chr_LpaL13-35_pos_442849_ref_G_alt_A                LpaL13-35  442849
## chr_LpaL13-35_pos_448456_ref_A_alt_G                LpaL13-35  448456
## chr_LpaL13-35_pos_485751_ref_A_alt_T                LpaL13-35  485751
## chr_LpaL13-35_pos_550908_ref_C_alt_T                LpaL13-35  550908
## chr_LpaL13-35_pos_579820_ref_G_alt_A                LpaL13-35  579820
## chr_LpaL13-35_pos_597909_ref_C_alt_T                LpaL13-35  597909
## chr_LpaL13-35_pos_612428_ref_T_alt_A                LpaL13-35  612428
## chr_LpaL13-35_pos_612489_ref_G_alt_A                LpaL13-35  612489
## chr_LpaL13-35_pos_635149_ref_C_alt_T                LpaL13-35  635149
## chr_LpaL13-35_pos_820275_ref_C_alt_G                LpaL13-35  820275
## chr_LpaL13-35_pos_827294_ref_G_alt_A                LpaL13-35  827294
## chr_LpaL13-35_pos_987523_ref_G_alt_A                LpaL13-35  987523
## chr_LpaL13-35_pos_991180_ref_T_alt_C                LpaL13-35  991180
## chr_LpaL13-35_pos_1404914_ref_T_alt_A               LpaL13-35 1404914
## chr_LpaL13-35_pos_1415412_ref_T_alt_A               LpaL13-35 1415412
## chr_LpaL13-35_pos_1567652_ref_C_alt_T               LpaL13-35 1567652
## chr_LpaL13-35_pos_1602307_ref_C_alt_T               LpaL13-35 1602307
## chr_LpaL13-35_pos_1749517_ref_G_alt_A               LpaL13-35 1749517
## chr_LpaL13-35_pos_1780578_ref_G_alt_A               LpaL13-35 1780578
## chr_LpaL13-35_pos_1806647_ref_C_alt_T               LpaL13-35 1806647
## chr_LpaL13-35_pos_1903399_ref_G_alt_T               LpaL13-35 1903399
## chr_LpaL13-35_pos_1921636_ref_G_alt_T               LpaL13-35 1921636
## chr_LpaL13-35_pos_2013788_ref_T_alt_C               LpaL13-35 2013788
## chr_LpaL13-35_pos_2015915_ref_G_alt_T               LpaL13-35 2015915
## chr_LpaL13-35_pos_2113606_ref_T_alt_A               LpaL13-35 2113606
## chr_LpaL13-35_pos_2134964_ref_A_alt_G               LpaL13-35 2134964
## chr_LpaL13-35_pos_2179249_ref_G_alt_A               LpaL13-35 2179249
## chr_LpaL13-35_pos_2184456_ref_T_alt_C               LpaL13-35 2184456
## chr_LpaL13-35_pos_2210723_ref_A_alt_G               LpaL13-35 2210723
## chr_LpaL13-35_pos_2224695_ref_A_alt_G               LpaL13-35 2224695
## chr_LpaL13-35_pos_2413985_ref_C_alt_T               LpaL13-35 2413985
## chr_LpaL13-35_pos_2439434_ref_T_alt_G               LpaL13-35 2439434
## chr_LpaL13-35_pos_2489723_ref_A_alt_C               LpaL13-35 2489723
## chr_LpaL13-35_pos_2561341_ref_C_alt_T               LpaL13-35 2561341
## chr_LPAL13-SCAF000003_pos_124_ref_T_alt_G   LPAL13-SCAF000003     124
## chr_LPAL13-SCAF000041_pos_2393_ref_A_alt_G  LPAL13-SCAF000041    2393
## chr_LPAL13-SCAF000041_pos_23349_ref_G_alt_A LPAL13-SCAF000041   23349
## chr_LPAL13-SCAF000041_pos_49674_ref_T_alt_C LPAL13-SCAF000041   49674
## chr_LPAL13-SCAF000041_pos_60912_ref_T_alt_A LPAL13-SCAF000041   60912
## chr_LPAL13-SCAF000051_pos_11977_ref_G_alt_A LPAL13-SCAF000051   11977
## chr_LPAL13-SCAF000086_pos_93_ref_C_alt_G    LPAL13-SCAF000086      93
## chr_LPAL13-SCAF000097_pos_25484_ref_G_alt_A LPAL13-SCAF000097   25484
## chr_LPAL13-SCAF000117_pos_4552_ref_G_alt_C  LPAL13-SCAF000117    4552
## chr_LPAL13-SCAF000119_pos_6296_ref_C_alt_G  LPAL13-SCAF000119    6296
## chr_LPAL13-SCAF000124_pos_41007_ref_T_alt_G LPAL13-SCAF000124   41007
## chr_LPAL13-SCAF000152_pos_476_ref_T_alt_G   LPAL13-SCAF000152     476
## chr_LPAL13-SCAF000166_pos_727_ref_G_alt_A   LPAL13-SCAF000166     727
## chr_LPAL13-SCAF000169_pos_349_ref_G_alt_A   LPAL13-SCAF000169     349
## chr_LPAL13-SCAF000169_pos_563_ref_G_alt_A   LPAL13-SCAF000169     563
## chr_LPAL13-SCAF000169_pos_1469_ref_T_alt_C  LPAL13-SCAF000169    1469
## chr_LPAL13-SCAF000172_pos_11742_ref_C_alt_T LPAL13-SCAF000172   11742
## chr_LPAL13-SCAF000172_pos_20674_ref_G_alt_A LPAL13-SCAF000172   20674
## chr_LPAL13-SCAF000177_pos_1189_ref_C_alt_A  LPAL13-SCAF000177    1189
## chr_LPAL13-SCAF000201_pos_654_ref_T_alt_C   LPAL13-SCAF000201     654
## chr_LPAL13-SCAF000204_pos_2224_ref_C_alt_T  LPAL13-SCAF000204    2224
## chr_LPAL13-SCAF000204_pos_2395_ref_G_alt_A  LPAL13-SCAF000204    2395
## chr_LPAL13-SCAF000206_pos_641_ref_C_alt_A   LPAL13-SCAF000206     641
## chr_LPAL13-SCAF000209_pos_4531_ref_A_alt_C  LPAL13-SCAF000209    4531
## chr_LPAL13-SCAF000209_pos_9468_ref_T_alt_C  LPAL13-SCAF000209    9468
## chr_LPAL13-SCAF000209_pos_12206_ref_T_alt_C LPAL13-SCAF000209   12206
## chr_LPAL13-SCAF000211_pos_168_ref_G_alt_C   LPAL13-SCAF000211     168
## chr_LPAL13-SCAF000211_pos_1755_ref_T_alt_A  LPAL13-SCAF000211    1755
## chr_LPAL13-SCAF000258_pos_953_ref_G_alt_A   LPAL13-SCAF000258     953
## chr_LPAL13-SCAF000270_pos_730_ref_C_alt_T   LPAL13-SCAF000270     730
## chr_LPAL13-SCAF000280_pos_270_ref_T_alt_G   LPAL13-SCAF000280     270
## chr_LPAL13-SCAF000287_pos_1181_ref_G_alt_T  LPAL13-SCAF000287    1181
## chr_LPAL13-SCAF000319_pos_2252_ref_A_alt_G  LPAL13-SCAF000319    2252
## chr_LPAL13-SCAF000358_pos_1101_ref_G_alt_A  LPAL13-SCAF000358    1101
## chr_LPAL13-SCAF000383_pos_940_ref_G_alt_C   LPAL13-SCAF000383     940
## chr_LPAL13-SCAF000383_pos_1165_ref_C_alt_T  LPAL13-SCAF000383    1165
## chr_LPAL13-SCAF000393_pos_729_ref_T_alt_C   LPAL13-SCAF000393     729
## chr_LPAL13-SCAF000397_pos_3894_ref_T_alt_A  LPAL13-SCAF000397    3894
## chr_LPAL13-SCAF000397_pos_3935_ref_G_alt_C  LPAL13-SCAF000397    3935
## chr_LPAL13-SCAF000398_pos_515_ref_C_alt_T   LPAL13-SCAF000398     515
## chr_LPAL13-SCAF000403_pos_1002_ref_C_alt_T  LPAL13-SCAF000403    1002
## chr_LPAL13-SCAF000403_pos_17166_ref_C_alt_A LPAL13-SCAF000403   17166
## chr_LPAL13-SCAF000418_pos_945_ref_G_alt_A   LPAL13-SCAF000418     945
## chr_LPAL13-SCAF000459_pos_615_ref_A_alt_C   LPAL13-SCAF000459     615
## chr_LPAL13-SCAF000492_pos_7320_ref_T_alt_C  LPAL13-SCAF000492    7320
## chr_LPAL13-SCAF000495_pos_370_ref_G_alt_C   LPAL13-SCAF000495     370
## chr_LPAL13-SCAF000503_pos_2597_ref_C_alt_T  LPAL13-SCAF000503    2597
## chr_LPAL13-SCAF000503_pos_11770_ref_G_alt_A LPAL13-SCAF000503   11770
## chr_LPAL13-SCAF000513_pos_710_ref_T_alt_C   LPAL13-SCAF000513     710
## chr_LPAL13-SCAF000525_pos_368_ref_G_alt_A   LPAL13-SCAF000525     368
## chr_LPAL13-SCAF000573_pos_679_ref_T_alt_C   LPAL13-SCAF000573     679
## chr_LPAL13-SCAF000577_pos_19472_ref_A_alt_T LPAL13-SCAF000577   19472
## chr_LPAL13-SCAF000582_pos_325_ref_G_alt_T   LPAL13-SCAF000582     325
## chr_LPAL13-SCAF000605_pos_8054_ref_G_alt_A  LPAL13-SCAF000605    8054
## chr_LPAL13-SCAF000605_pos_9388_ref_G_alt_A  LPAL13-SCAF000605    9388
## chr_LPAL13-SCAF000611_pos_268_ref_C_alt_G   LPAL13-SCAF000611     268
## chr_LPAL13-SCAF000615_pos_886_ref_A_alt_G   LPAL13-SCAF000615     886
## chr_LPAL13-SCAF000633_pos_1031_ref_T_alt_C  LPAL13-SCAF000633    1031
## chr_LPAL13-SCAF000650_pos_990_ref_T_alt_A   LPAL13-SCAF000650     990
## chr_LPAL13-SCAF000697_pos_12779_ref_A_alt_G LPAL13-SCAF000697   12779
## chr_LPAL13-SCAF000697_pos_16103_ref_C_alt_T LPAL13-SCAF000697   16103
## chr_LPAL13-SCAF000710_pos_1286_ref_C_alt_T  LPAL13-SCAF000710    1286
## chr_LPAL13-SCAF000735_pos_1563_ref_G_alt_T  LPAL13-SCAF000735    1563
## chr_LPAL13-SCAF000770_pos_1730_ref_C_alt_T  LPAL13-SCAF000770    1730
## chr_LPAL13-SCAF000770_pos_4330_ref_C_alt_T  LPAL13-SCAF000770    4330
## chr_LPAL13-SCAF000783_pos_13131_ref_T_alt_G LPAL13-SCAF000783   13131
## chr_LPAL13-SCAF000794_pos_1946_ref_C_alt_T  LPAL13-SCAF000794    1946
## chr_LPAL13-SCAF000805_pos_204_ref_A_alt_C   LPAL13-SCAF000805     204
## chr_LPAL13-SCAF000807_pos_507_ref_C_alt_T   LPAL13-SCAF000807     507
## chr_LPAL13-SCAF000809_pos_448_ref_G_alt_C   LPAL13-SCAF000809     448
## chr_LPAL13-SCAF000816_pos_11947_ref_C_alt_G LPAL13-SCAF000816   11947
snp_genes <- sm(snps_vs_genes(lp_expt, new_sets, expt_name_col = "chromosome"))
new_zymo_norm  <- normalize_expt(new_snps, filter = TRUE, convert = "cpm", norm = "quant", transform = TRUE)
## Removing 0 low-count genes (558524 remaining).
## transform_counts: Found 11978651 values equal to 0, adding 1 to the matrix.
new_zymo_norm <- set_expt_conditions(new_zymo_norm, fact = "phenotypiccharacteristics")

zymo_heat <- plot_disheat(new_zymo_norm)
zymo_heat[["plot"]]

zymo_subset <- snp_subset_genes(lp_expt, new_snps,
                                genes = c("LPAL13_120010900", "LPAL13_340013000", "LPAL13_000054100",
                                          "LPAL13_140006100", "LPAL13_180018500", "LPAL13_320022300"))
## Warning in .Seqinfo.mergexy(x, y): Each of the 2 combined objects has sequence levels not in the other:
##   - in 'x': LPAL13-SCAF000002, LPAL13-SCAF000003, LPAL13-SCAF000004, LPAL13-SCAF000005, LPAL13-SCAF000009, LPAL13-SCAF000010, LPAL13-SCAF000013, LPAL13-SCAF000014, LPAL13-SCAF000015, LPAL13-SCAF000018, LPAL13-SCAF000019, LPAL13-SCAF000020, LPAL13-SCAF000022, LPAL13-SCAF000023, LPAL13-SCAF000026, LPAL13-SCAF000029, LPAL13-SCAF000030, LPAL13-SCAF000031, LPAL13-SCAF000032, LPAL13-SCAF000035, LPAL13-SCAF000036, LPAL13-SCAF000037, LPAL13-SCAF000038, LPAL13-SCAF000042, LPAL13-SCAF000043, LPAL13-SCAF000045, LPAL13-SCAF000047, LPAL13-SCAF000049, LPAL13-SCAF000050, LPAL13-SCAF000052, LPAL13-SCAF000054, LPAL13-SCAF000056, LPAL13-SCAF000057, LPAL13-SCAF000058, LPAL13-SCAF000060, LPAL13-SCAF000066, LPAL13-SCAF000067, LPAL13-SCAF000069, LPAL13-SCAF000070, LPAL13-SCAF000072, LPAL13-SCAF000073, LPAL13-SCAF000081, LPAL13-SCAF000082, LPAL13-SCAF000083, LPAL13-SCAF000085, LPAL13-SCAF000086, LPAL13-SCAF000088, LPAL13-SCAF000090, LPAL13-SCAF000091, LPAL13-SCAF000092, LPAL13-SCAF000095, LPAL13-SCAF000098, LPAL13-SCAF000101, LPAL13-SCAF000103, LPAL13-SCAF000106, LPAL13-SCAF000109, LPAL13-SCAF000111, LPAL13-SCAF000112, LPAL13-SCAF000113, LPAL13-SCAF000118, LPAL13-SCAF000125, LPAL13-SCAF000126, LPAL13-SCAF000128, LPAL13-SCAF000138, LPAL13-SCAF000139, LPAL13-SCAF000140, LPAL13-SCAF000141, LPAL13-SCAF000143, LPAL13-SCAF000144, LPAL13-SCAF000145, LPAL13-SCAF000147, LPAL13-SCAF000148, LPAL13-SCAF000150, LPAL13-SCAF000151, LPAL13-SCAF000152, LPAL13-SCAF000154, LPAL13-SCAF000155, LPAL13-SCAF000156, LPAL13-SCAF000157, LPAL13-SCAF000158, LPAL13-SCAF000159, LPAL13-SCAF000160, LPAL13-SCAF000161, LPAL13-SCAF000163, LPAL13-SCAF000164, LPAL13-SCAF000167, LPAL13-SCAF000168, LPAL13-SCAF000169, LPAL13-SCAF000170, LPAL13-SCAF000175, LPAL13-SCAF000177, LPAL13-SCAF000178, LPAL13-SCAF000179, LPAL13-SCAF000180, LPAL13-SCAF000183, LPAL13-SCAF000184, LPAL13-SCAF000185, LPAL13-SCAF000189, LPAL13-SCAF000190, LPAL13-SCAF000192, LPAL13-SCAF000195, LPAL13-SCAF000196, LPAL13-SCAF000198, LPAL13-SCAF000199, LPAL13-SCAF000204, LPAL13-SCAF000207, LPAL13-SCAF000208, LPAL13-SCAF000210, LPAL13-SCAF000212, LPAL13-SCAF000213, LPAL13-SCAF000214, LPAL13-SCAF000215, LPAL13-SCAF000216, LPAL13-SCAF000218, LPAL13-SCAF000219, LPAL13-SCAF000221, LPAL13-SCAF000222, LPAL13-SCAF000223, LPAL13-SCAF000224, LPAL13-SCAF000225, LPAL13-SCAF000226, LPAL13-SCAF000228, LPAL13-SCAF000232, LPAL13-SCAF000234, LPAL13-SCAF000236, LPAL13-SCAF000238, LPAL13-SCAF000240, LPAL13-SCAF000241, LPAL13-SCAF000242, LPAL13-SCAF000243, LPAL13-SCAF000244, LPAL13-SCAF000246, LPAL13-SCAF000247, LPAL13-SCAF000249, LPAL13-SCAF000251, LPAL13-SCAF000252, LPAL13-SCAF000254, LPAL13-SCAF000255, LPAL13-SCAF000257, LPAL13-SCAF000258, LPAL13-SCAF000260, LPAL13-SCAF000262, LPAL13-SCAF000263, LPAL13-SCAF000264, LPAL13-SCAF000268, LPAL13-SCAF000269, LPAL13-SCAF000270, LPAL13-SCAF000272, LPAL13-SCAF000273, LPAL13-SCAF000274, LPAL13-SCAF000275, LPAL13-SCAF000276, LPAL13-SCAF000277, LPAL13-SCAF000278, LPAL13-SCAF000279, LPAL13-SCAF000280, LPAL13-SCAF000282, LPAL13-SCAF000283, LPAL13-SCAF000284, LPAL13-SCAF000289, LPAL13-SCAF000290, LPAL13-SCAF000293, LPAL13-SCAF000294, LPAL13-SCAF000297, LPAL13-SCAF000298, LPAL13-SCAF000299, LPAL13-SCAF000304, LPAL13-SCAF000305, LPAL13-SCAF000306, LPAL13-SCAF000307, LPAL13-SCAF000308, LPAL13-SCAF000310, LPAL13-SCAF000311, LPAL13-SCAF000312, LPAL13-SCAF000315, LPAL13-SCAF000318, LPAL13-SCAF000323, LPAL13-SCAF000324, LPAL13-SCAF000325, LPAL13-SCAF000327, LPAL13-SCAF000329, LPAL13-SCAF000331, LPAL13-SCAF000332, LPAL13-SCAF000333, LPAL13-SCAF000334, LPAL13-SCAF000336, LPAL13-SCAF000341, LPAL13-SCAF000342, LPAL13-SCAF000343, LPAL13-SCAF000344, LPAL13-SCAF000345, LPAL13-SCAF000346, LPAL13-SCAF000348, LPAL13-SCAF000349, LPAL13-SCAF000350, LPAL13-SCAF000351, LPAL13-SCAF000352, LPAL13-SCAF000353, LPAL13-SCAF000354, LPAL13-SCAF000355, LPAL13-SCAF000356, LPAL13-SCAF000357, LPAL13-SCAF000359, LPAL13-SCAF000360, LPAL13-SCAF000361, LPAL13-SCAF000362, LPAL13-SCAF000365, LPAL13-SCAF000366, LPAL13-SCAF000369, LPAL13-SCAF000371, LPAL13-SCAF000372, LPAL13-SCAF000373, LPAL13-SCAF000375, LPAL13-SCAF000376, LPAL13-SCAF000377, LPAL13-SCAF000378, LPAL13-SCAF000379, LPAL13-SCAF000380, LPAL13-SCAF000381, LPAL13-SCAF000382, LPAL13-SCAF000383, LPAL13-SCAF000384, LPAL13-SCAF000385, LPAL13-SCAF000386, LPAL13-SCAF000387, LPAL13-SCAF000388, LPAL13-SCAF000389, LPAL13-SCAF000390, LPAL13-SCAF000392, LPAL13-SCAF000393, LPAL13-SCAF000394, LPAL13-SCAF000395, LPAL13-SCAF000396, LPAL13-SCAF000397, LPAL13-SCAF000398, LPAL13-SCAF000399, LPAL13-SCAF000402, LPAL13-SCAF000404, LPAL13-SCAF000406, LPAL13-SCAF000407, LPAL13-SCAF000408, LPAL13-SCAF000409, LPAL13-SCAF000410, LPAL13-SCAF000411, LPAL13-SCAF000412, LPAL13-SCAF000413, LPAL13-SCAF000414, LPAL13-SCAF000415, LPAL13-SCAF000416, LPAL13-SCAF000418, LPAL13-SCAF000422, LPAL13-SCAF000423, LPAL13-SCAF000425, LPAL13-SCAF000427, LPAL13-SCAF000428, LPAL13-SCAF000429, LPAL13-SCAF000431, LPAL13-SCAF000433, LPAL13-SCAF000435, LPAL13-SCAF000437, LPAL13-SCAF000438, LPAL13-SCAF000439, LPAL13-SCAF000441, LPAL13-SCAF000442, LPAL13-SCAF000443, LPAL13-SCAF000444, LPAL13-SCAF000445, LPAL13-SCAF000449, LPAL13-SCAF000450, LPAL13-SCAF000451, LPAL13-SCAF000452, LPAL13-SCAF000454, LPAL13-SCAF000455, LPAL13-SCAF000457, LPAL13-SCAF000458, LPAL13-SCAF000462, LPAL13-SCAF000464, LPAL13-SCAF000466, LPAL13-SCAF000467, LPAL13-SCAF000472, LPAL13-SCAF000473, LPAL13-SCAF000474, LPAL13-SCAF000475, LPAL13-SCAF000476, LPAL13-SCAF000478, LPAL13-SCAF000479, LPAL13-SCAF000480, LPAL13-SCAF000481, LPAL13-SCAF000482, LPAL13-SCAF000485, LPAL13-SCAF000487, LPAL13-SCAF000489, LPAL13-SCAF000493, LPAL13-SCAF000494, LPAL13-SCAF000495, LPAL13-SCAF000497, LPAL13-SCAF000498, LPAL13-SCAF000499, LPAL13-SCAF000501, LPAL13-SCAF000502, LPAL13-SCAF000504, LPAL13-SCAF000506, LPAL13-SCAF000509, LPAL13-SCAF000510, LPAL13-SCAF000513, LPAL13-SCAF000514, LPAL13-SCAF000516, LPAL13-SCAF000517, LPAL13-SCAF000518, LPAL13-SCAF000519, LPAL13-SCAF000520, LPAL13-SCAF000521, LPAL13-SCAF000523, LPAL13-SCAF000524, LPAL13-SCAF000525, LPAL13-SCAF000526, LPAL13-SCAF000530, LPAL13-SCAF000531, LPAL13-SCAF000534, LPAL13-SCAF000543, LPAL13-SCAF000545, LPAL13-SCAF000546, LPAL13-SCAF000550, LPAL13-SCAF000551, LPAL13-SCAF000557, LPAL13-SCAF000559, LPAL13-SCAF000561, LPAL13-SCAF000565, LPAL13-SCAF000571, LPAL13-SCAF000579, LPAL13-SCAF000581, LPAL13-SCAF000583, LPAL13-SCAF000584, LPAL13-SCAF000589, LPAL13-SCAF000592, LPAL13-SCAF000594, LPAL13-SCAF000595, LPAL13-SCAF000596, LPAL13-SCAF000597, LPAL13-SCAF000600, LPAL13-SCAF000602, LPAL13-SCAF000604, LPAL13-SCAF000606, LPAL13-SCAF000608, LPAL13-SCAF000609, LPAL13-SCAF000612, LPAL13-SCAF000613, LPAL13-SCAF000615, LPAL13-SCAF000620, LPAL13-SCAF000621, LPAL13-SCAF000623, LPAL13-SCAF000624, LPAL13-SCAF000629, LPAL13-SCAF000630, LPAL13-SCAF000631, LPAL13-SCAF000632, LPAL13-SCAF000633, LPAL13-SCAF000634, LPAL13-SCAF000635, LPAL13-SCAF000638, LPAL13-SCAF000640, LPAL13-SCAF000642, LPAL13-SCAF000647, LPAL13-SCAF000648, LPAL13-SCAF000657, LPAL13-SCAF000658, LPAL13-SCAF000660, LPAL13-SCAF000662, LPAL13-SCAF000663, LPAL13-SCAF000664, LPAL13-SCAF000665, LPAL13-SCAF000667, LPAL13-SCAF000669, LPAL13-SCAF000670, LPAL13-SCAF000671, LPAL13-SCAF000673, LPAL13-SCAF000674, LPAL13-SCAF000675, LPAL13-SCAF000676, LPAL13-SCAF000677, LPAL13-SCAF000678, LPAL13-SCAF000680, LPAL13-SCAF000683, LPAL13-SCAF000684, LPAL13-SCAF000685, LPAL13-SCAF000686, LPAL13-SCAF000687, LPAL13-SCAF000689, LPAL13-SCAF000690, LPAL13-SCAF000691, LPAL13-SCAF000692, LPAL13-SCAF000693, LPAL13-SCAF000694, LPAL13-SCAF000696, LPAL13-SCAF000699, LPAL13-SCAF000701, LPAL13-SCAF000702, LPAL13-SCAF000703, LPAL13-SCAF000705, LPAL13-SCAF000706, LPAL13-SCAF000708, LPAL13-SCAF000709, LPAL13-SCAF000710, LPAL13-SCAF000712, LPAL13-SCAF000715, LPAL13-SCAF000718, LPAL13-SCAF000721, LPAL13-SCAF000724, LPAL13-SCAF000725, LPAL13-SCAF000728, LPAL13-SCAF000729, LPAL13-SCAF000730, LPAL13-SCAF000731, LPAL13-SCAF000733, LPAL13-SCAF000736, LPAL13-SCAF000739, LPAL13-SCAF000740, LPAL13-SCAF000741, LPAL13-SCAF000742, LPAL13-SCAF000743, LPAL13-SCAF000745, LPAL13-SCAF000746, LPAL13-SCAF000747, LPAL13-SCAF000749, LPAL13-SCAF000750, LPAL13-SCAF000751, LPAL13-SCAF0007
## Before removal, there were 558524 genes, now there are 87.
## There are 46 samples which kept less than 90 percent counts.
## tmrc20001 tmrc20005 tmrc20007 tmrc20027 tmrc20028 tmrc20032 tmrc20039 tmrc20037 
##  0.037035  0.041720  0.053085  0.059906  0.077365  0.037129  0.041766  0.028449 
## tmrc20038 tmrc20041 tmrc20015 tmrc20009 tmrc20010 tmrc20016 tmrc20011 tmrc20012 
##  0.029649  0.008748  0.026217  0.000000  0.027716  0.026359  0.024992  0.000000 
## tmrc20013 tmrc20017 tmrc20014 tmrc20018 tmrc20019 tmrc20020 tmrc20021 tmrc20022 
##  0.029377  0.020294  0.018363  0.032806  0.079907  0.072428  0.032435  0.000000 
## tmrc20025 tmrc20024 tmrc20036 tmrc20033 tmrc20026 tmrc20031 tmrc20042 tmrc20048 
##  0.063343  0.040538  0.008628  0.000000  0.081882  0.045886  0.106630  0.029476 
## tmrc20060 tmrc20053 tmrc20052 tmrc20064 tmrc20051 tmrc20050 tmrc20062 tmrc20043 
##  0.082349  0.000000  0.033177  0.033183  0.035482  0.057916  0.036751  0.032996 
## tmrc20054 tmrc20046 tmrc20047 tmrc20044 tmrc20045 tmrc20061 
##  0.036392  0.005881  0.034909  0.065649  0.006047  0.026822
zymo_subset <- set_expt_conditions(zymo_subset, fact = "phenotypiccharacteristics")
## zymo_heat <- plot_sample_heatmap(zymo_subset, row_label = rownames(exprs(snp_subset)))

des <- both_norm$design
undef_idx <- is.na(des[["strain"]])
des[undef_idx, "strain"] <- "unknown"

##hmcols <- colorRampPalette(c("yellow","black","darkblue"))(256)
correlations <- hpgl_cor(exprs(both_norm))

zymo_missing_idx <- is.na(des[["phenotypiccharacteristics"]])
des[zymo_missing_idx, "phenotypiccharacteristics"] <- "unknown"
## Warning in `[<-.factor`(`*tmp*`, iseq, value = c("unknown", "unknown",
## "unknown", : invalid factor level, NA generated
mydendro <- list(
  "clustfun" = hclust,
  "lwd" = 2.0)
col_data <- as.data.frame(des[, c("phenotypiccharacteristics", "clinicalcategorical")])
unknown_clinical <- is.na(col_data[["clinicalcategorical"]])
row_data <- as.data.frame(des[, c("strain")])
colnames(col_data) <- c("zymodeme", "outcome")
col_data[unknown_clinical, "outcome"] <- "undefined"
## Warning in `[<-.factor`(`*tmp*`, iseq, value = c("undefined", "undefined", :
## invalid factor level, NA generated
colnames(row_data) <- c("strain")
myannot <- list(
  "Col" = list("data" = col_data),
  "Row" = list("data" = row_data))
myclust <- list("cuth" = 1.0,
                "col" = BrewerClusterCol)
mylabs <- list(
  "Row" = list("nrow" = 4),
  "Col" = list("nrow" = 4))
hmcols <- colorRampPalette(c("darkblue", "beige"))(240)
map1 <- annHeatmap2(
  correlations,
  dendrogram = mydendro,
  annotation = myannot,
  cluster = myclust,
  labels = mylabs,
  ## The following controls if the picture is symmetric
  scale = "none",
  col = hmcols)
## Warning in breakColors(breaks, col): more colors than classes: ignoring 29 last
## colors
pp(file = "images/dendro_heatmap.png", image = map1, height = 20, width = 20)
## annotated Heatmap
## 
## Rows: 'dendrogram' with 2 branches and 79 members total, at height 5.258 
##   11  annotation variable(s)
## Cols: 'dendrogram' with 2 branches and 79 members total, at height 5.258 
##   8  annotation variable(s)

Print the larger heatmap so that all the labels appear. Keep in mind that as we get more samples, this image needs to continue getting bigger.

big heatmap

8 Using Variant profiles to make guesses about strains and chronic/self-healing

The following uses the same information to make some guesses about the strains used in the new samples.

des <- both_norm$design
undef_idx <- is.na(des[["strain"]])
des[undef_idx, "strain"] <- "unknown"
##hmcols <- colorRampPalette(c("yellow","black","darkblue"))(256)
correlations <- hpgl_cor(exprs(both_norm))

mydendro <- list(
  "clustfun" = hclust,
  "lwd" = 2.0)
col_data <- as.data.frame(des[, c("condition")])
row_data <- as.data.frame(des[, c("strain")])
colnames(col_data) <- c("condition")
colnames(row_data) <- c("strain")
myannot <- list(
  "Col" = list("data" = col_data),
  "Row" = list("data" = row_data))
myclust <- list("cuth" = 1.0,
                "col" = BrewerClusterCol)
mylabs <- list(
  "Row" = list("nrow" = 4),
  "Col" = list("nrow" = 4))
hmcols <- colorRampPalette(c("darkblue", "beige"))(170)
map1 <- annHeatmap2(
  correlations,
  dendrogram = mydendro,
  annotation = myannot,
  cluster = myclust,
  labels = mylabs)
##  col = hmcols)
##plot(map1)
pp(file = "images/dendro_chronic_heatmap.png", image = map1, height = 20, width = 20)
## annotated Heatmap
## 
## Rows: 'dendrogram' with 2 branches and 79 members total, at height 5.258 
##   11  annotation variable(s)
## Cols: 'dendrogram' with 2 branches and 79 members total, at height 5.258 
##   11  annotation variable(s)

chronic heatmap

pheno <- subset_expt(lp_expt, subset = "condition=='z2.2'|condition=='z2.3'")
## subset_expt(): There were 47, now there are 25 samples.
pheno <- subset_expt(pheno, subset="!is.na(pData(pheno)[['bcftable']])")
## subset_expt(): There were 25, now there are 25 samples.
pheno_snps <- sm(count_expt_snps(pheno, annot_column = "bcftable"))

xref_prop <- table(pheno_snps[["conditions"]])
pheno_snps$conditions
##  [1] "z2.3" "z2.2" "z2.2" "z2.3" "z2.3" "z2.2" "z2.3" "z2.2" "z2.3" "z2.3"
## [11] "z2.2" "z2.2" "z2.3" "z2.2" "z2.2" "z2.3" "z2.3" "z2.2" "z2.2" "z2.3"
## [21] "z2.3" "z2.3" "z2.2" "z2.3" "z2.3"
idx_tbl <- exprs(pheno_snps) > 5
new_tbl <- data.frame(row.names = rownames(exprs(pheno_snps)))
for (n in names(xref_prop)) {
  new_tbl[[n]] <- 0
  idx_cols <- which(pheno_snps[["conditions"]] == n)
  prop_col <- rowSums(idx_tbl[, idx_cols]) / xref_prop[n]
  new_tbl[n] <- prop_col
}
new_tbl[["ratio"]] <- (new_tbl[["z2.2"]] - new_tbl[["z2.3"]])
keepers <- grepl(x = rownames(new_tbl), pattern = "LpaL13")
new_tbl <- new_tbl[keepers, ]
new_tbl[["SNP"]] <- rownames(new_tbl)
new_tbl[["Chromosome"]] <- gsub(x = new_tbl[["SNP"]], pattern = "chr_(.*)_pos_.*", replacement = "\\1")
new_tbl[["Position"]] <- gsub(x = new_tbl[["SNP"]], pattern = ".*_pos_(\\d+)_.*", replacement = "\\1")
new_tbl <- new_tbl[, c("SNP", "Chromosome", "Position", "ratio")]
library(CMplot)
## Much appreciate for using CMplot.
## Full description, Bug report, Suggestion and the latest codes:
## https://github.com/YinLiLin/CMplot
CMplot(new_tbl, bin.size = 100000)
##  SNP-Density Plotting.
##  Circular-Manhattan Plotting ratio.
##  Rectangular-Manhattan Plotting ratio.
##  QQ Plotting ratio.
##  Plots are stored in: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/lpanamensis_tmrc_2019

SNP Density Circular Manhattan Rectangular Manhattan QQ

if (!isTRUE(get0("skip_load"))) {
  pander::pander(sessionInfo())
  message(paste0("This is hpgltools commit: ", get_git_commit()))
  message(paste0("Saving to ", savefile))
  tmp <- sm(saveme(filename = savefile))
}
## If you wish to reproduce this exact build of hpgltools, invoke the following:
## > git clone http://github.com/abelew/hpgltools.git
## > git reset 72947fcc6afe09da22d71967059edd84e3063341
## This is hpgltools commit: Tue Jun 1 15:57:56 2021 -0400: 72947fcc6afe09da22d71967059edd84e3063341
## Saving to tmrc2_02sample_estimation_v202106.rda.xz
tmp <- loadme(filename = savefile)
LS0tCnRpdGxlOiAiVE1SQzIgQ29tcHJlaGVuc2l2ZSBEYXRhIEFuYWx5c2lzOiAyMDIxMDYiCmF1dGhvcjogImF0YiBhYmVsZXdAZ21haWwuY29tIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKIGh0bWxfZG9jdW1lbnQ6CiAgY29kZV9kb3dubG9hZDogdHJ1ZQogIGNvZGVfZm9sZGluZzogc2hvdwogIGZpZ19jYXB0aW9uOiB0cnVlCiAgZmlnX2hlaWdodDogNwogIGZpZ193aWR0aDogNwogIGhpZ2hsaWdodDogZGVmYXVsdAogIGtlZXBfbWQ6IGZhbHNlCiAgbW9kZTogc2VsZmNvbnRhaW5lZAogIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgdGhlbWU6IHJlYWRhYmxlCiAgdG9jOiB0cnVlCiAgdG9jX2Zsb2F0OgogICBjb2xsYXBzZWQ6IGZhbHNlCiAgIHNtb290aF9zY3JvbGw6IGZhbHNlCi0tLQoKPHN0eWxlPgogIGJvZHkgLm1haW4tY29udGFpbmVyIHsKICAgIG1heC13aWR0aDogMTYwMHB4OwogIH0KPC9zdHlsZT4KCmBgYHtyIG9wdGlvbnMsIGluY2x1ZGUgPSBGQUxTRX0KbGlicmFyeShocGdsdG9vbHMpCnR0IDwtIHNtKGRldnRvb2xzOjpsb2FkX2FsbCgifi9ocGdsdG9vbHMiKSkKa25pdHI6Om9wdHNfa25pdCRzZXQocHJvZ3Jlc3MgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICB2ZXJib3NlID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSA5MCwKICAgICAgICAgICAgICAgICAgICAgZWNobyA9IFRSVUUpCmtuaXRyOjpvcHRzX2NodW5rJHNldChlcnJvciA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICBmaWcud2lkdGggPSA4LAogICAgICAgICAgICAgICAgICAgICAgZmlnLmhlaWdodCA9IDgsCiAgICAgICAgICAgICAgICAgICAgICBkcGkgPSA5NikKb2xkX29wdGlvbnMgPC0gb3B0aW9ucyhkaWdpdHMgPSA0LAogICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICBrbml0ci5kdXBsaWNhdGUubGFiZWwgPSAiYWxsb3ciKQpnZ3Bsb3QyOjp0aGVtZV9zZXQoZ2dwbG90Mjo6dGhlbWVfYncoYmFzZV9zaXplID0gMTIpKQp2ZXIgPC0gIjIwMjEwNiIKcnVuZGF0ZSA8LSBmb3JtYXQoU3lzLkRhdGUoKSwgZm9ybWF0ID0gIiVZJW0lZCIpCgojIyB0bXAgPC0gdHJ5KHNtKGxvYWRtZShmaWxlbmFtZSA9IGdzdWIocGF0dGVybiA9ICJcXC5SbWQiLCByZXBsYWNlID0gIlxcLnJkYVxcLnh6IiwgeCA9IHByZXZpb3VzX2ZpbGUpKSkpCnJtZF9maWxlIDwtIGdsdWU6OmdsdWUoInRtcmMyXzAyc2FtcGxlX2VzdGltYXRpb25fdnt2ZXJ9LlJtZCIpCnNhdmVmaWxlIDwtIGdzdWIocGF0dGVybiA9ICJcXC5SbWQiLCByZXBsYWNlID0gIlxcLnJkYVxcLnh6IiwgeCA9IHJtZF9maWxlKQoKbGlicmFyeShIZWF0cGx1cykKYGBgCgojIEludHJvZHVjdGlvbgoKVGhpcyBkb2N1bWVudCBpcyBpbnRlbmRlZCB0byBwcm92aWRlIGEgZ2VuZXJhbCBvdmVydmlldyBvZiB0aGUgVE1SQzIgc2FtcGxlcwp3aGljaCBoYXZlIHRodXMgZmFyIGJlZW4gc2VxdWVuY2VkLiAgSW4gc29tZSBjYXNlcywgdGhpcyBpbmNsdWRlcyBvbmx5IHRob3NlCnNhbXBsZXMgc3RhcnRpbmcgaW4gMjAxOTsgaW4gb3RoZXIgaW5zdGFuY2VzIEkgYW0gaW5jbHVkaW5nIG91ciBwcmV2aW91cwooMjAxNS0yMDE2KSBzYW1wbGVzLgoKSW4gYWxsIGNhc2VzIHRoZSBwcm9jZXNzaW5nIHBlcmZvcm1lZCB3YXM6CgoxLiAgRGVmYXVsdCB0cmltbWluZyB3YXMgcGVyZm9ybWVkLgoyLiAgSGlzYXQyIHdhcyB1c2VkIHRvIG1hcCB0aGUgcmVtYWluaW5nIHJlYWRzIGFnYWluc3QgdGhlIExlaXNobWFuaWEKICAgIHBhbmFtZW5zaXMgZ2Vub21lIHJldmlzaW9uIDM2LgozLiAgVGhlIGFsaWdubWVudHMgZnJvbSBoaXNhdDIgd2VyZSB1c2VkIHRvIGNvdW50IHJlYWRzL2dlbmUgYWdhaW5zdCB0aGUKICAgIHJldmlzaW9uIDM2IGFubm90YXRpb25zIHdpdGggaHRzZXEuCjQuICBUaGVzZSBhbGlnbm1lbnRzIHdlcmUgYWxzbyBwYXNzZWQgdG8gdGhlIHBpbGV1cCBmdW5jdGlvbmFsaXR5IG9mIHNhbXRvb2xzCiAgICBhbmQgdGhlIHZjZi9iY2YgdXRpbGl0aWVzIGluIG9yZGVyIHRvIG1ha2UgYSBtYXRyaXggb2YgYWxsIG9ic2VydmVkCiAgICBkaWZmZXJlbmNlcyBiZXR3ZWVuIGVhY2ggc2FtcGxlIHdpdGggcmVzcGVjdCB0byB0aGUgcmVmZXJlbmNlLgoKVGhlIGFuYWx5c2VzIGluIHRoaXMgZG9jdW1lbnQgdXNlIHRoZSBtYXRyaWNlcyBvZiBjb3VudHMvZ2VuZSBmcm9tICMzIGFuZAp2YXJpYW50cy9wb3NpdGlvbiBmcm9tICM0IGluIG9yZGVyIHRvIHByb3ZpZGUgc29tZSBpbWFnZXMgYW5kIG1ldHJpY3MgZGVzY3JpYmluZwp0aGUgc2FtcGxlcyB3ZSBoYXZlIHNlcXVlbmNlZCBzbyBmYXIuCgojIEFubm90YXRpb25zCgpFdmVyeXRoaW5nIHdoaWNoIGZvbGxvd3MgZGVwZW5kcyBvbiB0aGUgRXhpc3RpbmcgVHJpVHJ5cERCIGFubm90YXRpb25zIHJldmlzaW9uCjQ2LCBjaXJjYSAyMDE5LiAgVGhlIGZvbGxvd2luZyBibG9jayBsb2FkcyBhIGRhdGFiYXNlIG9mIHRoZXNlIGFubm90YXRpb25zIGFuZAp0dXJucyBpdCBpbnRvIGEgbWF0cml4IHdoZXJlIHRoZSByb3dzIGFyZSBnZW5lcyBhbmQgY29sdW1ucyBhcmUgYWxsIHRoZQphbm5vdGF0aW9uIHR5cGVzIHByb3ZpZGVkIGJ5IFRyaVRyeXBEQi4KClRoZSBzYW1lIGRhdGFiYXNlIHdhcyB1c2VkIHRvIGNyZWF0ZSBhIG1hdHJpeCBvZiBvcnRob2xvZ291cyBnZW5lcyBiZXR3ZWVuCkwucGFuYW1lbnNpcyBhbmQgYWxsIG9mIHRoZSBvdGhlciBzcGVjaWVzIGluIHRoZSBUcmlUcnlwREIuCgpgYGB7ciBhbm5vdH0KdHQgPC0gc20obGlicmFyeShFdVBhdGhEQikpCnR0IDwtIHNtKGxpYnJhcnkob3JnLkxwYW5hbWVuc2lzLk1IT01DT0w4MUwxMy52NDYuZWcuZGIpKQpwYW5fZGIgPC0gb3JnLkxwYW5hbWVuc2lzLk1IT01DT0w4MUwxMy52NDYuZWcuZGIKYWxsX2ZpZWxkcyA8LSBjb2x1bW5zKHBhbl9kYikKCmFsbF9scF9hbm5vdCA8LSBzbShsb2FkX29yZ2RiX2Fubm90YXRpb25zKAogICAgcGFuX2RiLAogICAga2V5dHlwZSA9ICJnaWQiLAogICAgZmllbGRzID0gYygiYW5ub3RfZ2VuZV9lbnRyZXpfaWQiLCAiYW5ub3RfZ2VuZV9uYW1lIiwKICAgICAgICAgICAgICAgImFubm90X3N0cmFuZCIsICJhbm5vdF9jaHJvbW9zb21lIiwgImFubm90X2Nkc19sZW5ndGgiLAogICAgICAgICAgICAgICAiYW5ub3RfZ2VuZV9wcm9kdWN0IikpKSRnZW5lcwoKbHBfZ28gPC0gc20obG9hZF9vcmdkYl9nbyhwYW5fZGIpKQpscF9sZW5ndGhzIDwtIGFsbF9scF9hbm5vdFssIGMoImdpZCIsICJhbm5vdF9jZHNfbGVuZ3RoIildCmNvbG5hbWVzKGxwX2xlbmd0aHMpICA8LSBjKCJJRCIsICJsZW5ndGgiKQphbGxfbHBfYW5ub3RbWyJhbm5vdF9nZW5lX3Byb2R1Y3QiXV0gPC0gdG9sb3dlcihhbGxfbHBfYW5ub3RbWyJhbm5vdF9nZW5lX3Byb2R1Y3QiXV0pCm9ydGhvcyA8LSBzbShFdVBhdGhEQjo6ZXh0cmFjdF9ldXBhdGhfb3J0aG9sb2dzKGRiID0gcGFuX2RiKSkKCmhpc2F0X2Fubm90IDwtIGFsbF9scF9hbm5vdAojIyByb3duYW1lcyhoaXNhdF9hbm5vdCkgPC0gcGFzdGUwKCJleG9uXyIsIHJvd25hbWVzKGhpc2F0X2Fubm90KSwgIi5FMSIpCmBgYAoKIyBUT0RPOgoKUmVzZXF1ZW5jZSBzYW1wbGVzOiBUTVJDMjAwMDIsIFRNUkMyMDAwNiwgVE1SQzIwMDA0IChtYXliZSBUTVJDMjAwMDggYW5kIFRNUkMyMDAyOSkKCiMgR2VuZXJhdGUgRXhwcmVzc2lvbnNldHMgYW5kIFNhbXBsZSBFc3RpbWF0aW9uCgpUaGUgcHJvY2VzcyBvZiBzYW1wbGUgZXN0aW1hdGlvbiB0YWtlcyB0d28gcHJpbWFyeSBpbnB1dHM6CgoxLiAgVGhlIHNhbXBsZSBzaGVldCwgd2hpY2ggY29udGFpbnMgYWxsIHRoZSBtZXRhZGF0YSB3ZSBjdXJyZW50bHkgaGF2ZSBvbiBoYW5kLAogICAgaW5jbHVkaW5nIGZpbGVuYW1lcyBmb3IgdGhlIG91dHB1dHMgb2YgIzMgYW5kICM0IGFib3ZlLgoyLiAgVGhlIGdlbmUgYW5ub3RhdGlvbnMuCgpBbiBleHByZXNzaW9uc2V0IGlzIGEgZGF0YSBzdHJ1Y3R1cmUgdXNlZCBpbiBSIHRvIGV4YW1pbmUgUk5BU2VxIGRhdGEuICBJdAppcyBjb21wcmlzZWQgb2YgYW5ub3RhdGlvbnMsIG1ldGFkYXRhLCBhbmQgZXhwcmVzc2lvbiBkYXRhLiAgSW4gdGhlIGNhc2Ugb2Ygb3VyCnByb2Nlc3NpbmcgcGlwZWxpbmUsIHRoZSBsb2NhdGlvbiBvZiB0aGUgZXhwcmVzc2lvbiBkYXRhIGlzIHByb3ZpZGVkIGJ5IHRoZQpmaWxlbmFtZXMgaW4gdGhlIG1ldGFkYXRhLgoKVGhlIGZpcnN0IGxpbmVzIG9mIHRoZSBmb2xsb3dpbmcgYmxvY2sgY3JlYXRlIHRoZSBFeHByZXNzaW9uc2V0LiAgQWxsIG9mIHRoZQpmb2xsb3dpbmcgbGluZXMgcGVyZm9ybSB2YXJpb3VzIG5vcm1hbGl6YXRpb25zIGFuZCBnZW5lcmF0ZSBwbG90cyBmcm9tIGl0LgoKIyMgTm90ZXMKClRoZSBmb2xsb3dpbmcgc2FtcGxlcyBhcmUgbXVjaCBsb3dlciBjb3ZlcmFnZToKCiogVE1SQzIwMDAyCiogVE1SQzIwMDA2CiogVE1SQzIwMDA3CiogVE1SQzIwMDA4CgojIyBUT0RPOgoKMS4gIERvIHRoZSBtdWx0aS1nZW5lIGZhbWlseSByZW1vdmFsIHJpZ2h0IGhlcmUgaW5zdGVhZCBvZiB3YXkgZG93biBhdCB0aGUgYm90dG9tCjIuICBBZGQgenltb2RlbWUgc25wcyB0byB0aGUgYW5ub3RhdGlvbiBsYXRlci4KMy4gIFN0YXJ0IHBoeWxvZ2VuZXRpYyBhbmFseXNpcyBvZiB2YXJpYW50IHRhYmxlLgoKCmBgYHtyIG5ld19zYW1wbGVzX2hpc2F0fQpzYW1wbGVfc2hlZXQgPC0gZ2x1ZTo6Z2x1ZSgic2FtcGxlX3NoZWV0cy90bXJjMl9zYW1wbGVzXzIwMjEwNjAxLnhsc3giKQoKc2FuaXRpemVfY29sdW1ucyA8LSBjKCJwYXNzYWdlbnVtYmVyIiwgImNsaW5pY2FscmVzcG9uc2UiLCAiY2xpbmljYWxjYXRlZ29yaWNhbCIsCiAgICAgICAgICAgICAgICAgICAgICAienltb2RlbWVjYXRlZ29yaWNhbCIsICJwaGVub3R5cGljY2hhcmFjdGVyaXN0aWNzIikKbHBfZXhwdCA8LSBzbShjcmVhdGVfZXhwdChzYW1wbGVfc2hlZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZV9pbmZvID0gaGlzYXRfYW5ub3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWRfY29sdW1uID0gImhwZ2xpZGVudGlmaWVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX2NvbHVtbiA9ICJscGFuYW1lbnNpc3YzNmhpc2F0ZmlsZSIpKSAlPiUKICBzZXRfZXhwdF9jb25kaXRpb25zKGZhY3QgPSAienltb2RlbWVjYXRlZ29yaWNhbCIpICU+JQogIHN1YnNldF9leHB0KG5vbnplcm8gPSA4NjAwKSAlPiUKICBzZW1hbnRpY19leHB0X2ZpbHRlcihzZW1hbnRpYyA9IGMoImFtYXN0aW4iLCAiZ3A2MyIsICJsZWlzaG1hbm9seXNpbiIpLAogICAgICAgICAgICAgICAgICAgICAgIHNlbWFudGljX2NvbHVtbiA9ICJhbm5vdF9nZW5lX3Byb2R1Y3QiKSAlPiUKICBzYW5pdGl6ZV9leHB0X21ldGFkYXRhKGNvbHVtbnMgPSBzYW5pdGl6ZV9jb2x1bW5zKSAlPiUKICBzZXRfZXhwdF9mYWN0b3JzKGNvbHVtbnMgPSBzYW5pdGl6ZV9jb2x1bW5zLCBjbGFzcyA9ICJmYWN0b3IiKQoKbGlic2l6ZXMgPC0gcGxvdF9saWJzaXplKGxwX2V4cHQpCmxpYnNpemVzJHBsb3QKIyMgSSB0aGluayBzYW1wbGVzIDcsMTAgc2hvdWxkIGJlIHJlbW92ZWQgYXQgbWluaW11bSwgcHJvYmFibHkgYWxzbyA5LDExCm5vbnplcm8gPC0gcGxvdF9ub256ZXJvKGxwX2V4cHQpCm5vbnplcm8kcGxvdApwbG90X2JveHBsb3QobHBfZXhwdCkKCmZpbHRlcl9wbG90IDwtIHBsb3RfbGlic2l6ZV9wcmVwb3N0KGxwX2V4cHQpCmZpbHRlcl9wbG90JGxvd2dlbmVfcGxvdApmaWx0ZXJfcGxvdCRjb3VudF9wbG90CmBgYAoKIyMgRGlzdHJpYnV0aW9uIFZpc3VhbGl6YXRpb24KCk5hamliJ3MgZmF2b3JpdGUgcGxvdHMgYXJlIG9mIGNvdXJzZSB0aGUgUENBL1ROU0UuICBUaGVzZSBhcmUgbmljZSB0byBsb29rIGF0IGluCm9yZGVyIHRvIGdldCBhIHNlbnNlIG9mIHRoZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gc2FtcGxlcy4gIFRoZXkgYWxzbyBwcm92aWRlIGEKZ29vZCBvcHBvcnR1bml0eSB0byBzZWUgd2hhdCBoYXBwZW5zIHdoZW4gb25lIGFwcGxpZXMgZGlmZmVyZW50IG5vcm1hbGl6YXRpb25zLApzdXJyb2dhdGUgYW5hbHlzZXMsIGZpbHRlcnMsIGV0Yy4gIEluIGFkZGl0aW9uLCBvbmUgbWF5IHNldCBkaWZmZXJlbnQKZXhwZXJpbWVudGFsIGZhY3RvcnMgYXMgdGhlIHByaW1hcnkgJ2NvbmRpdGlvbicgKHVzdWFsbHkgdGhlIGNvbG9yIG9mIHBsb3RzKSBhbmQKc3Vycm9nYXRlICdiYXRjaGVzJy4KCiMjIEJ5IFN1c2NlcHRpbGliaXR5CgpDb2x1bW4gJ1EnIGluIHRoZSBzYW1wbGUgc2hlZXQsIG1ha2UgYSBjYXRlZ29yaWNhbCB2ZXJzaW9uIG9mIGl0IHdpdGggdGhlc2UgcGFyYW1ldGVyczoKCiogMCA8PSB4IDw9IDM1IGlzIHJlc2lzdGFudAoqIDM2IDw9IHggPD0gNDggaXMgYW1iaWd1b3VzCiogNDkgPD0geCBpcyBzZW5zaXRpdmUKCmBgYHtyIHN1c2NlcHRpYmlsaXR5fQpzdGFydGluZyA8LSBhcy5udW1lcmljKHBEYXRhKGxwX2V4cHQpW1sic3VzY2VwdGliaWxpdHlpbmZlY3Rpb25yZWR1Y3Rpb24zMnVnbWxzYnZoaXN0b3JpY2FsZGF0YSJdXSkKc3VzX2NhdGVnb3JpY2FsIDwtIHN0YXJ0aW5nCm5hX2lkeCA8LSBpcy5uYShzdGFydGluZykKc3VzX2NhdGVnb3JpY2FsW25hX2lkeF0gPC0gInVua25vd24iCgpyZXNpc3RfaWR4IDwtIHN0YXJ0aW5nIDw9IDAuMzUKc3VzX2NhdGVnb3JpY2FsW3Jlc2lzdF9pZHhdIDwtICJyZXNpc3RhbnQiCmluZGV0ZXJtaW5hbnRfaWR4IDwtIHN0YXJ0aW5nID49IDAuMzYgJiBzdGFydGluZyA8PSAwLjQ4CnN1c19jYXRlZ29yaWNhbFtpbmRldGVybWluYW50X2lkeF0gPC0gImFtYmlndW91cyIKc3VzY2VwdGlibGVfaWR4IDwtIHN0YXJ0aW5nID49IDAuNDkKc3VzX2NhdGVnb3JpY2FsW3N1c2NlcHRpYmxlX2lkeF0gPC0gInNlbnNpdGl2ZSIKCnBEYXRhKGxwX2V4cHQkZXhwcmVzc2lvbnNldClbWyJzdXNfY2F0ZWdvcnkiXV0gPC0gc3VzX2NhdGVnb3JpY2FsCmBgYAoKYGBge3IgcHJlX3F1ZXN0aW9uc30KY2xpbmljYWxfc2FtcGxlcyA8LSBscF9leHB0ICU+JQogIHNldF9leHB0X2JhdGNoZXMoZmFjdCA9IHN1c19jYXRlZ29yaWNhbCkKCmNsaW5pY2FsX25vcm0gPC0gc20obm9ybWFsaXplX2V4cHQoY2xpbmljYWxfc2FtcGxlcywgbm9ybSA9ICJxdWFudCIsIHRyYW5zZm9ybSA9ICJsb2cyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ID0gImNwbSIsIGJhdGNoID0gRkFMU0UsIGZpbHRlciA9IFRSVUUpKQp6eW1vX3BjYSA8LSBwbG90X3BjYShjbGluaWNhbF9ub3JtLCBwbG90X3RpdGxlID0gIlBDQSBvZiBwYXJhc2l0ZSBleHByZXNzaW9uIHZhbHVlcyIpCnBwKGZpbGUgPSAiaW1hZ2VzL3p5bW9fcGNhX3N1c19zaGFwZS5wbmciLCBpbWFnZSA9IHp5bW9fcGNhJHBsb3QpCgp6eW1vXzNkcGNhIDwtIHBsb3RfM2RfcGNhKHp5bW9fcGNhKQp6eW1vXzNkcGNhJHBsb3QKCnp5bW9fdHNuZSA8LSBwbG90X3RzbmUoY2xpbmljYWxfbm9ybSwgcGxvdF90aXRsZSA9ICJUU05FIG9mIHBhcmFzaXRlIGV4cHJlc3Npb24gdmFsdWVzIikKenltb190c25lJHBsb3QKCmNsaW5pY2FsX25iIDwtIG5vcm1hbGl6ZV9leHB0KGNsaW5pY2FsX3NhbXBsZXMsIGNvbnZlcnQgPSAiY3BtIiwgdHJhbnNmb3JtID0gImxvZzIiLAogICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikKY2xpbmljYWxfbmJfcGNhIDwtIHBsb3RfcGNhKGNsaW5pY2FsX25iLCBwbG90X3RpdGxlID0gIlBDQSBvZiBwYXJhc2l0ZSBleHByZXNzaW9uIHZhbHVlcyIpCnBwKGZpbGUgPSAiaW1hZ2VzL2NsaW5pY2FsX25iX3BjYV9zdXNfc2hhcGUucG5nIiwgaW1hZ2UgPSBjbGluaWNhbF9uYl9wY2EkcGxvdCkKCmNsaW5pY2FsX25iX3RzbmUgPC0gcGxvdF90c25lKGNsaW5pY2FsX25iLCBwbG90X3RpdGxlID0gIlRTTkUgb2YgcGFyYXNpdGUgZXhwcmVzc2lvbiB2YWx1ZXMiKQpjbGluaWNhbF9uYl90c25lJHBsb3QKCmNvcmhlYXQgPC0gcGxvdF9jb3JoZWF0KGNsaW5pY2FsX25vcm0sIHBsb3RfdGl0bGUgPSAiQ29ycmVsYXRpb24gaGVhdG1hcCBvZiBwYXJhc2l0ZQogICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gdmFsdWVzCiIpCmNvcmhlYXQkcGxvdAoKcGxvdF9zbShjbGluaWNhbF9ub3JtKSRwbG90CmBgYAoKIyMgQnkgQ3VyZS9GYWlsIHN0YXR1cwoKYGBge3IgY2Zfc3RhdHVzfQpjZl9leHB0IDwtIHNldF9leHB0X2NvbmRpdGlvbnMobHBfZXhwdCwgZmFjdCA9ICJjbGluaWNhbGNhdGVnb3JpY2FsIikgJT4lCiAgc2V0X2V4cHRfYmF0Y2hlcyhmYWN0ID0gc3VzX2NhdGVnb3JpY2FsKQoKY2Zfbm9ybSA8LSBub3JtYWxpemVfZXhwdChjZl9leHB0LCBjb252ZXJ0ID0gImNwbSIsIHRyYW5zZm9ybSA9ICJsb2cyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtID0gInF1YW50IiwgZmlsdGVyID0gVFJVRSkKc3RhcnRfY2YgPC0gcGxvdF9wY2EoY2Zfbm9ybSwgcGxvdF90aXRsZSA9ICJQQ0Egb2YgcGFyYXNpdGUgZXhwcmVzc2lvbiB2YWx1ZXMiKQpwcChmaWxlID0gImltYWdlcy9jZl9zdXNfc2hhcGUucG5nIiwgaW1hZ2UgPSBzdGFydF9jZiRwbG90KQoKY2ZfbmIgPC0gbm9ybWFsaXplX2V4cHQoY2ZfZXhwdCwgY29udmVydCA9ICJjcG0iLCB0cmFuc2Zvcm0gPSAibG9nMiIsCiAgICAgICAgICAgICAgICAgICAgICAgIG5vcm0gPSAicXVhbnQiLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQpjZl9uYl9wY2EgPC0gcGxvdF9wY2EoY2ZfbmIsIHBsb3RfdGl0bGUgPSAiUENBIG9mIHBhcmFzaXRlIGV4cHJlc3Npb24gdmFsdWVzIikKcHAoZmlsZSA9ICJpbWFnZXMvY2Zfc3VzX3NoYXJlX25iLnBuZyIsIGltYWdlID0gY2ZfbmJfcGNhJHBsb3QpCgpjZl9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KGNmX2V4cHQsIHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IFRSVUUsIG5vcm0gPSAicXVhbnQiKQoKdGVzdCA8LSBwY2FfaW5mb3JtYXRpb24oY2Zfbm9ybSwKICAgICAgICAgICAgICAgICAgICAgICAgZXhwdF9mYWN0b3JzID0gYygiY2xpbmljYWxjYXRlZ29yaWNhbCIsICJ6eW1vZGVtZWNhdGVnb3JpY2FsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGF0aG9nZW5zdHJhaW4iLCAicGFzc2FnZW51bWJlciIpLAogICAgICAgICAgICAgICAgICAgICAgICBudW1fY29tcG9uZW50cyA9IDYsIHBsb3RfcGNhcyA9IFRSVUUpCnRlc3QkYW5vdmFfcAp0ZXN0JGNvcl9oZWF0bWFwCmBgYAoKYGBge3Igc3VzY2VwdGliaWxpdHlfcGNhfQpzdXNfZXhwdCA8LSBzZXRfZXhwdF9jb25kaXRpb25zKGxwX2V4cHQsIGZhY3QgPSAic3VzX2NhdGVnb3J5IikgJT4lCiAgc2V0X2V4cHRfYmF0Y2hlcyhmYWN0ID0gInp5bW9kZW1lY2F0ZWdvcmljYWwiKQoKc3VzX25vcm0gPC0gbm9ybWFsaXplX2V4cHQoc3VzX2V4cHQsIHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtID0gInF1YW50IiwgZmlsdGVyID0gVFJVRSkKc3VzX3BjYSA8LSBwbG90X3BjYShzdXNfbm9ybSwgcGxvdF90aXRsZSA9ICJQQ0Egb2YgcGFyYXNpdGUgZXhwcmVzc2lvbiB2YWx1ZXMiKQpzdXNfcGNhJHBsb3QKCnN1c19uYiA8LSBub3JtYWxpemVfZXhwdChzdXNfZXhwdCwgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQpzdXNfbmJfcGNhIDwtIHBsb3RfcGNhKHN1c19uYiwgcGxvdF90aXRsZSA9ICJQQ0Egb2YgcGFyYXNpdGUgZXhwcmVzc2lvbiB2YWx1ZXMiKQpwcChmaWxlID0gImltYWdlcy9zdXNfbmJfcGNhLnBuZyIsIGltYWdlID0gc3VzX25iX3BjYSRwbG90KQpgYGAKCkF0IHRoaXMgdGltZSwgd2UgZG8gbm90IGhhdmUgdmVyeSBtYW55IHNhbXBsZXMsIHNvIHRoZSBzZXQgb2YgbWV0cmljcy9wbG90cyBpcwpmYWlybHkgbGltaXRlZC4gIFRoZXJlIGlzIHJlYWxseSBvbmx5IG9uZSBmYWN0b3IgaW4gdGhlIG1ldGFkYXRhIHdoaWNoIHdlIGNhbgp1c2UgZm9yIHBlcmZvcm1pbmcgZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gYW5hbHlzZXMsIHRoZSAnenltb2RlbWUnLgoKIyBaeW1vZGVtZSBhbmFseXNlcwoKVGhlIGZvbGxvd2luZyBzZWN0aW9ucyBwZXJmb3JtIGEgc2VyaWVzIG9mIGFuYWx5c2VzIHdoaWNoIHNlZWsgdG8gZWx1Y2lkYXRlCmRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHp5bW9kZW1lcyAyLjIgYW5kIDIuMyBlaXRoZXIgdGhyb3VnaCBkaWZmZXJlbnRpYWwKZXhwcmVzc2lvbiBvciB2YXJpYW50IHByb2ZpbGVzLgoKIyMgRGlmZmVyZW50aWFsIGV4cHJlc3Npb24KCiMjIyBXaXRoIHJlc3BlY3QgdG8genltb2RlbWUgYXR0cmlidXRpb24KClRPRE86IERvIHRoaXMgd2l0aCBhbmQgd2l0aG91dCBzdmEgYW5kIGNvbXBhcmUgdGhlIHJlc3VsdHMuCgpgYGB7ciB6eW1vX2RlLCBmaWcuc2hvdyA9ICJoaWRlIn0KenlfZXhwdCA8LSBzdWJzZXRfZXhwdChscF9leHB0LCBzdWJzZXQgPSAiY29uZGl0aW9uPT0nejIuMid8Y29uZGl0aW9uPT0nejIuMyciKQp6eV9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KHp5X2V4cHQsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAiY3BtIiwgbm9ybSA9ICJxdWFudCIpCnp5X2RlX25vYmF0Y2ggPC0gc20oYWxsX3BhaXJ3aXNlKHp5X2V4cHQsIGZpbHRlciA9IFRSVUUsIG1vZGVsX2JhdGNoID0gInN2YXNlcSIpKQp6eV9kZSA8LSBzbShhbGxfcGFpcndpc2UoenlfZXhwdCwgZmlsdGVyID0gVFJVRSwgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIikpCnp5X3RhYmxlIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKHp5X2RlLCBleGNlbCA9IGdsdWU6OmdsdWUoImV4Y2VsL3p5X3RhYmxlcy12e3Zlcn0ueGxzeCIpKSkKenlfc2lnIDwtIHNtKGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoenlfdGFibGUsIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiZXhjZWwvenlfc2lnLXZ7dmVyfS54bHN4IikpKQpgYGAKCiMjIyBJbWFnZXMgb2Ygenltb2RlbWUgREUKCmBgYHtyIHp5bW9kX2RlX3BpY3R1cmVzfQp6eV90YWJsZVtbInBsb3RzIl1dW1siejIzX3ZzX3oyMiJdXVtbImRlc2VxX21hX3Bsb3RzIl1dW1sicGxvdCJdXQpgYGAKCiMjIFdpdGggcmVzcGVjdCB0byBjdXJlL2ZhaWx1cmUKCkluIGNvbnRyYXN0LCB3ZSBjYW4gc2VhcmNoIGZvciBnZW5lcyB3aGljaCBhcmUgZGlmZmVyZW50aWFsbHkKZXhwcmVzc2VkIHdpdGggcmVzcGVjdCB0byBjdXJlL2ZhaWx1cmUgc3RhdHVzLgoKYGBge3IgY3VyZWZhaWxfZGUsIGZpZy5zaG93ID0gImhpZGUifQpjZl9kZSA8LSBzbShhbGxfcGFpcndpc2UoY2ZfZXhwdCwgZmlsdGVyID0gVFJVRSwgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIikpCmNmX3RhYmxlIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKGNmX2RlLCBleGNlbCA9IGdsdWU6OmdsdWUoImV4Y2VsL2NmX3RhYmxlcy12e3Zlcn0ueGxzeCIpKSkKY2Zfc2lnIDwtIHNtKGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoY2ZfdGFibGUsIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiZXhjZWwvY2Zfc2lnLXZ7dmVyfS54bHN4IikpKQpgYGAKCiMjIFdpdGggcmVzcGVjdCB0byBzdXNjZXB0aWJpbGl0eQoKRmluYWxseSwgd2UgY2FuIHVzZSBvdXIgY2F0ZWdvcnkgb2Ygc3VzY2VwdGliaWxpdHkgYW5kIGxvb2sgZm9yIGdlbmVzCndoaWNoIGNoYW5nZSBmcm9tIHNlbnNpdGl2ZSB0byByZXNpc3RhbnQuICBLZWVwIGluIG1pbmQsIHRob3VnaCwgdGhhdApmb3IgdGhlIG1vbWVudCB3ZSBoYXZlIGEgbG90IG9mIGFtYmlndW91cyBhbmQgdW5rbm93biBzdHJhaW5zLgoKYGBge3IgY3VyZWZhaWxfZGUsIGZpZy5zaG93ID0gImhpZGUifQpzdXNfZGUgPC0gc20oYWxsX3BhaXJ3aXNlKHN1c19leHB0LCBmaWx0ZXIgPSBUUlVFLCBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiKSkKc3VzX3RhYmxlIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKHN1c19kZSwgZXhjZWwgPSBnbHVlOjpnbHVlKCJleGNlbC9zdXNfdGFibGVzLXZ7dmVyfS54bHN4IikpKQpzdXNfc2lnIDwtIHNtKGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoc3VzX3RhYmxlLCBleGNlbCA9IGdsdWU6OmdsdWUoImV4Y2VsL3N1c19zaWctdnt2ZXJ9Lnhsc3giKSkpCmBgYAoKIyMgT250b2xvZ3kgc2VhcmNoZXMKCk5vdyBsZXQgdXMgbG9vayBmb3Igb250b2xvZ3kgY2F0ZWdvcmllcyB3aGljaCBhcmUgaW5jcmVhc2VkIGluIHRoZSAyLjMKc2FtcGxlcyBmb2xsb3dlZCBieSB0aGUgMi4yIHNhbXBsZXMuCgpgYGB7ciBnbywgc2lnLnNob3cgPSAiaGlkZSJ9CiMjIEdlbmUgY2F0ZWdvcmllcyBtb3JlIHJlcHJlc2VudGVkIGluIHRoZSAyLjMgZ3JvdXAuCnp5X2dvX3VwIDwtIHNtKHNpbXBsZV9nb3NlcShzaWdfZ2VuZXMgPSB6eV9zaWdbWyJkZXNlcSJdXVtbInVwcyJdXVtbMV1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29fZGIgPSBscF9nbywgbGVuZ3RoX2RiID0gbHBfbGVuZ3RocykpCgojIyBHZW5lIGNhdGVnb3JpZXMgbW9yZSByZXByZXNlbnRlZCBpbiB0aGUgMi4yIGdyb3VwLgp6eV9nb19kb3duIDwtIHNtKHNpbXBsZV9nb3NlcShzaWdfZ2VuZXMgPSB6eV9zaWdbWyJkZXNlcSJdXVtbImRvd25zIl1dW1sxXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvX2RiID0gbHBfZ28sIGxlbmd0aF9kYiA9IGxwX2xlbmd0aHMpKQpgYGAKCiMjIyBBIGNvdXBsZSBwbG90cyBmcm9tIHRoZSBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbgoKIyMjIyBOdW1iZXIgb2YgZ2VuZXMgaW4gYWdyZWVtZW50IGFtb25nIERFIG1ldGhvZHMsIDIuMyBtb3JlIHRoYW4gMi4yCgpJbiB0aGUgZnVuY3Rpb24gJ2NvbWJpbmVkX2RlX3RhYmxlcygpJyBhYm92ZSwgb25lIG9mIHRoZSB0YXNrcwpwZXJmb3JtZWQgaXMgdG8gbG9vayBhdCB0aGUgYWdyZWVtZW50IGFtb25nIERFU2VxMiwgbGltbWEsIGFuZCBlZGdlUi4KVGhlIGZvbGxvd2luZyBzaG93IGEgY291cGxlIG9mIHRoZXNlIGZvciB0aGUgc2V0IG9mIGdlbmVzIG9ic2VydmVkCndpdGggYSBmb2xkLWNoYW5nZSA+PSB8MnwgYW5kIGFkanVzdGVkIHAtdmFsdWUgPD0gMC4wNS4KCmBgYHtyIGRlX3Bsb3RzfQp6eV90YWJsZVtbInZlbm5zIl1dW1sxXV1bWyJwX2xmYzEiXV1bWyJ1cF9ub3dlaWdodCJdXQpgYGAKCiMjIyMgTnVtYmVyIG9mIGdlbmVzIGluIGFncmVlbWVudCBhbW9uZyBERSBtZXRob2RzLCAyLjIgbW9yZSB0aGFuIDIuMwoKYGBge3IgZGVfcGxvdHN9Cnp5X3RhYmxlW1sidmVubnMiXV1bWzFdXVtbInBfbGZjMSJdXVtbImRvd25fbm93ZWlnaHQiXV0KYGBgCgojIyMjIE1BIHBsb3Qgb2YgdGhlIGRpZmZlcmVudGlhbCBleHByZXNzaW9uIGJldHdlZW4gdGhlIHp5bW9kZW1lcy4KCmBgYHtyIG90aGVyX3Bsb3RzfQp6eV90YWJsZSRwbG90c1tbMV1dW1siZGVzZXFfbWFfcGxvdHMiXV1bWyJwbG90Il1dCmBgYAoKIyMjIyBnb3NlcSBvbnRvbG9neSBwbG90cyBvZiBncm91cHMgb2YgZ2VuZXMsIDIuMyBtb3JlIHRoYW4gMi4yCgpgYGB7ciBnb3NlcV91cH0KenlfZ29fdXAkcHZhbHVlX3Bsb3RzJGJwcF9wbG90X292ZXIKYGBgCgojIyMjIGdvc2VxIG9udG9sb2d5IHBsb3RzIG9mIGdyb3VwcyBvZiBnZW5lcywgMi4yIG1vcmUgdGhhbiAyLjMKCmBgYHtyIGdvc2VxX2Rvd259Cnp5X2dvX2Rvd24kcHZhbHVlX3Bsb3RzJGJwcF9wbG90X292ZXIKYGBgCgojIyBaeW1vZGVtZSBlbnp5bWUgZ2VuZSBJRHMKCk5hamliIHJlYWQgbWUgYW4gZW1haWwgbGlzdGluZyBvZmYgdGhlIGdlbmUgbmFtZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB6eW1vZGVtZQpjbGFzc2lmaWNhdGlvbi4gIEkgdG9vayB0aG9zZSBuYW1lcyBhbmQgY3Jvc3MgcmVmZXJlbmNlZCB0aGVtIGFnYWluc3QgdGhlCkxlaXNobWFuaWEgcGFuYW1lbnNpcyBnZW5lIGFubm90YXRpb25zIGFuZCBmb3VuZCB0aGUgZm9sbG93aW5nOgoKVGhleSBhcmU6CgoxLiBBTEFUOiBMUEFMMTNfMTIwMDEwOTAwIC0tIGFsYW5pbmUgYW1pbm90cmFuc2ZlcmFzZQoyLiBBU0FUOiBMUEFMMTNfMzQwMDEzMDAwIC0tIGFzcGFydGF0ZSBhbWlub3RyYW5zZmVyYXNlCjMuIEc2UEQ6IExQQUwxM18wMDAwNTQxMDAgLS0gZ2x1Y2FzZS02LXBob3NwaGF0ZSAxLWRlaHlkcm9nZW5hc2UKNC4gTkg6IExQQUwxM18xNDAwNjEwMCwgTFBBTDEzXzE4MDAxODUwMCAtLSBpbm9zaW5lLWd1YW5pbmUgbnVjbGVvc2lkZSBoeWRyb2xhc2UKNS4gTVBJOiBMUEFMMTNfMzIwMDIyMzAwIChtYXliZSkgLS0gbWFubm9zZSBwaG9zcGhhdGUgaXNvbWVyYXNlIChJIGNob3NlIHBob3NwaG9tYW5ub3NlIGlzb21lcmFzZSkKCkdpdmVuIHRoZXNlIDYgZ2VuZSBJRHMgKE5IIGhhcyB0d28gZ2VuZSBJRHMgYXNzb2NpYXRlZCB3aXRoIGl0KSwgSSBjYW4gZG8gc29tZQpsb29raW5nIGZvciBzcGVjaWZpYyBkaWZmZXJlbmNlcyBhbW9uZyB0aGUgdmFyaW91cyBzYW1wbGVzLgoKIyMjIEV4cHJlc3Npb24gbGV2ZWxzIG9mIHp5bW9kZW1lIGdlbmVzCgpUaGUgZm9sbG93aW5nIGNyZWF0ZXMgYSBjb2xvcnNwYWNlIChyZWQgdG8gZ3JlZW4pIGhlYXRtYXAgc2hvd2luZyB0aGUgb2JzZXJ2ZWQKZXhwcmVzc2lvbiBvZiB0aGVzZSBnZW5lcyBpbiBldmVyeSBzYW1wbGUuCgpgYGB7ciB6eW1vZGVtZXN9Cm15X2dlbmVzIDwtIGMoIkxQQUwxM18xMjAwMTA5MDAiLCAiTFBBTDEzXzM0MDAxMzAwMCIsICJMUEFMMTNfMDAwMDU0MTAwIiwKICAgICAgICAgICAgICAiTFBBTDEzXzE0MDAwNjEwMCIsICJMUEFMMTNfMTgwMDE4NTAwIiwgIkxQQUwxM18zMjAwMjIzMDAiLAogICAgICAgICAgICAgICJvdGhlciIpCm15X25hbWVzIDwtIGMoIkFMQVQiLCAiQVNBVCIsICJHNlBEIiwgIk5IdjEiLCAiTkh2MiIsICJNUEkiLCAib3RoZXIiKQoKenltb19leHB0IDwtIGV4Y2x1ZGVfZ2VuZXNfZXhwdCh6eV9ub3JtLCBpZHMgPSBteV9nZW5lcywgbWV0aG9kID0gImtlZXAiKQp6eW1vX2hlYXRtYXAgPC0gcGxvdF9zYW1wbGVfaGVhdG1hcCh6eW1vX2V4cHQsIHJvd19sYWJlbCA9IG15X25hbWVzKQp6eW1vX2hlYXRtYXAKYGBgCgojIyBFbXBpcmljYWxseSBvYnNlcnZlZCBaeW1vZGVtZSBnZW5lcyBmcm9tIGRpZmZlcmVudGlhbCBleHByZXNzaW9uIGFuYWx5c2lzCgpJbiBjb250cmFzdCwgdGhlIGZvbGxvd2luZyBwbG90cyB0YWtlIHRoZSBzZXQgb2YgZ2VuZXMgd2hpY2ggYXJlIHNoYXJlZCBhbW9uZwphbGwgZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gbWV0aG9kcyAofGxmY3wgPj0gMS4wIGFuZCBhZGpwIDw9IDAuMDUpIGFuZCB1c2UgdGhlbQp0byBtYWtlIGNhdGVnb3JpZXMgb2YgZ2VuZXMgd2hpY2ggYXJlIGluY3JlYXNlZCBpbiAyLjMgb3IgMi4yLgoKYGBge3Igenltb2RlbWVfZ2VuZXNfZW1waXJpY2FsfQpzaGFyZWRfenltbyA8LSBpbnRlcnNlY3Rfc2lnbmlmaWNhbnQoenlfdGFibGUpCnVwX3NoYXJlZCA8LSBzaGFyZWRfenltb1tbInVwcyJdXVtbMV1dW1siZGF0YSJdXVtbImFsbCJdXQpyb3duYW1lcyh1cF9zaGFyZWQpCnVwc2hhcmVkX2V4cHQgPC0gZXhjbHVkZV9nZW5lc19leHB0KHp5X25vcm0sIGlkcyA9IHJvd25hbWVzKHVwX3NoYXJlZCksIG1ldGhvZCA9ICJrZWVwIikKYGBgCgpXZSBjYW4gcGxvdCBhIHF1aWNrIGhlYXRtYXAgdG8gZ2V0IGEgc2Vuc2Ugb2YgdGhlIGRpZmZlcmVuY2VzIG9ic2VydmVkCmJldHdlZW4gdGhlIGdlbmVzIHdoaWNoIGFyZSBkaWZmZXJlbnQgYmV0d2VlbiB0aGUgdHdvIHp5bW9kZW1lcy4KCiMjIyBIZWF0bWFwIG9mIHp5bW9kZW1lIGdlbmUgZXhwcmVzc2lvbiBpbmNyZWFzZWQgaW4gMi4zIHZzLiAyLjIKCmBgYHtyIHp5bW9lbXB1cH0KaGlnaF8yM19oZWF0bWFwIDwtIHBsb3Rfc2FtcGxlX2hlYXRtYXAodXBzaGFyZWRfZXhwdCwgcm93X2xhYmVsID0gcm93bmFtZXModXBfc2hhcmVkKSkKaGlnaF8yM19oZWF0bWFwCmBgYAoKIyMjIEhlYXRtYXAgb2Ygenltb2RlbWUgZ2VuZSBleHByZXNzaW9uIGluY3JlYXNlZCBpbiAyLjIgdnMuIDIuMwoKYGBge3Igenltb2VtZG93bn0KZG93bl9zaGFyZWQgPC0gc2hhcmVkX3p5bW9bWyJkb3ducyJdXVtbMV1dW1siZGF0YSJdXVtbImFsbCJdXQpkb3duc2hhcmVkX2V4cHQgPC0gZXhjbHVkZV9nZW5lc19leHB0KHp5X25vcm0sIGlkcyA9IHJvd25hbWVzKGRvd25fc2hhcmVkKSwgbWV0aG9kID0gImtlZXAiKQpoaWdoXzIyX2hlYXRtYXAgPC0gcGxvdF9zYW1wbGVfaGVhdG1hcChkb3duc2hhcmVkX2V4cHQsIHJvd19sYWJlbCA9IHJvd25hbWVzKGRvd25fc2hhcmVkKSkKaGlnaF8yMl9oZWF0bWFwCmBgYAoKIyBTTlAgcHJvZmlsZXMKCk5vdyBJIHdpbGwgY29tYmluZSBvdXIgcHJldmlvdXMgc2FtcGxlcyBhbmQgb3VyIG5ldyBzYW1wbGVzIGluIHRoZQpob3BlcyBvZiBmaW5kaW5nIHZhcmlhbnQgcG9zaXRpb25zIHdoaWNoIGhlbHAgZWx1Y2lkYXRlIGN1cnJlbnRseQp1bmtub3duIGFzcGVjdHMgb2YgZWl0aGVyIGdyb3VwIHZpYSB0aGVpciBjbHVzdGVyaW5nIHRvIGtub3duIHNhbXBsZXMKZnJvbSB0aGUgb3RoZXIgZ3JvdXAuIEluIG90aGVyIHdvcmRzLCB3ZSBkbyBub3Qga25vdyB0aGUgenltb2RlbWUKYW5ub3RhdGlvbnMgZm9yIHRoZSBvbGQgc2FtcGxlcyBub3IgdGhlIHN0cmFpbiBpZGVudGl0aWVzIChvciB0aGUKc2hvcnRjdXQgJ2Nocm9uaWMgdnMuIHNlbGYtaGVhbGluZycpIGZvciB0aGUgbmV3IHNhbXBsZXMuIEkgaG9wZSB0bwptYWtlIGVkdWNhdGVkIGd1ZXNzZXMgZ2l2ZW4gdGhlIHZhcmlhbnQgcHJvZmlsZXMuIFRoZXJlIGFyZSBzb21lCmRpZmZlcmVuY2VzIGluIGhvdyB0aGUgcHJldmlvdXMgYW5kIGN1cnJlbnQgZGF0YSBzZXRzIHdlcmUgYW5hbHl6ZWQKKHRob3VnaCBJIGhhdmUgc2luY2UgcmVkb25lIHRoZSBvbGQgc2FtcGxlcyBzbyBpdCBzaG91bGQgYmUgdHJpdmlhbCB0bwpyZW1vdmUgdGhvc2UgZGlmZmVyZW5jZXMgbm93KS4KCkkgYWRkZWQgb3VyIDIwMTYgZGF0YSB0byBhIHNwZWNpZmljIFRNUkMyIHNhbXBsZSBzaGVldCwKZGF0ZWQgMjAxOTEyMDMuICBUaHVzIEkgd2lsbCBsb2FkIHRoZSBkYXRhIGhlcmUuICBUaGF0IHByZXZpb3VzIGRhdGEKd2FzIG1hcHBlZCB1c2luZyB0b3BoYXQsIHNvIEkgd2lsbCBhbHNvIG5lZWQgdG8gbWFrZSBzb21lIGNoYW5nZXMgdG8KdGhlIGdlbmUgbmFtZXMgdG8gYWNjb21vZGF0ZSB0aGUgdHdvIG1hcHBpbmdzLgoKYGBge3Igb2xkbmV3X3ZhcmlhbnRzfQpvbGRfZXhwdCA8LSBzbShjcmVhdGVfZXhwdCgic2FtcGxlX3NoZWV0cy90bXJjMl9zYW1wbGVzXzIwMTkxMjAzLnhsc3giLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX2NvbHVtbiA9ICJ0b3BoYXQyZmlsZSIpKQoKdHQgPC0gbHBfZXhwdFtbImV4cHJlc3Npb25zZXQiXV0Kcm93bmFtZXModHQpIDwtIGdzdWIocGF0dGVybiA9ICJeZXhvbl8iLCByZXBsYWNlbWVudCA9ICIiLCB4ID0gcm93bmFtZXModHQpKQpyb3duYW1lcyh0dCkgPC0gZ3N1YihwYXR0ZXJuID0gIlxcLkUxJCIsIHJlcGxhY2VtZW50ID0gIiIsIHggPSByb3duYW1lcyh0dCkpCmxwX2V4cHQkZXhwcmVzc2lvbnNldCA8LSB0dAoKdHQgPC0gb2xkX2V4cHQkZXhwcmVzc2lvbnNldApyb3duYW1lcyh0dCkgPC0gZ3N1YihwYXR0ZXJuID0gIl5leG9uXyIsIHJlcGxhY2VtZW50ID0gIiIsIHggPSByb3duYW1lcyh0dCkpCnJvd25hbWVzKHR0KSA8LSBnc3ViKHBhdHRlcm4gPSAiXFwuMSQiLCByZXBsYWNlbWVudCA9ICIiLCB4ID0gcm93bmFtZXModHQpKQpvbGRfZXhwdCRleHByZXNzaW9uc2V0IDwtIHR0CnJtKHR0KQpgYGAKCiMjIENyZWF0ZSB0aGUgU05QIGV4cHJlc3Npb25zZXQKCk9uZSBvdGhlciBpbXBvcnRhbnQgY2F2ZWF0LCB3ZSBoYXZlIGEgZ3JvdXAgb2YgbmV3IHNhbXBsZXMgd2hpY2ggaGF2ZQpub3QgeWV0IHJ1biB0aHJvdWdoIHRoZSB2YXJpYW50IHNlYXJjaCBwaXBlbGluZSwgc28gSSBuZWVkIHRvIHJlbW92ZQp0aGVtIGZyb20gY29uc2lkZXJhdGlvbi4gIFRob3VnaCBpdCBsb29rcyBsaWtlIHRoZXkgZmluaXNoZWQgb3Zlcm5pZ2h0Li4uCgpgYGB7ciBjb3VudF9leHB0X29sZF9uZXd9CiMjIFRoZSBuZXh0IGxpbmUgZHJvcHMgdGhlIHNhbXBsZXMgd2hpY2ggYXJlIG1pc3NpbmcgdGhlIFNOUCBwaXBlbGluZS4KbHBfc25wIDwtIHN1YnNldF9leHB0KGxwX2V4cHQsIHN1YnNldD0iIWlzLm5hKHBEYXRhKGxwX2V4cHQpW1snYmNmdGFibGUnXV0pIikKbmV3X3NucHMgPC0gc20oY291bnRfZXhwdF9zbnBzKGxwX3NucCwgYW5ub3RfY29sdW1uID0gImJjZnRhYmxlIikpCm9sZF9zbnBzIDwtIHNtKGNvdW50X2V4cHRfc25wcyhvbGRfZXhwdCwgYW5ub3RfY29sdW1uID0gImJjZnRhYmxlIiwgc25wX2NvbHVtbiA9IDIpKQoKYm90aF9zbnBzIDwtIGNvbWJpbmVfZXhwdHMobmV3X3NucHMsIG9sZF9zbnBzKQpib3RoX25vcm0gPC0gc20obm9ybWFsaXplX2V4cHQoYm90aF9zbnBzLCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwgZmlsdGVyID0gVFJVRSkpCgojIyBzdHJhaW5zIDwtIGJvdGhfbm9ybVtbImRlc2lnbiJdXVtbInN0cmFpbiJdXQpib3RoX25vcm0gPC0gc2V0X2V4cHRfY29uZGl0aW9ucyhib3RoX25vcm0sIGZhY3QgPSAic3RyYWluIikKYGBgCgpUaGUgZGF0YSBzdHJ1Y3R1cmUgJ2JvdGhfbm9ybScgbm93IGNvbnRhaW5zIG91ciAyMDE2IGRhdGEgYWxvbmcgd2l0aAp0aGUgbmV3ZXIgZGF0YSBjb2xsZWN0ZWQgc2luY2UgMjAxOS4KCiMjIFBsb3Qgb2YgU05QIHByb2ZpbGVzIGZvciB6eW1vZGVtZXMKClRoZSBmb2xsb3dpbmcgcGxvdCBzaG93cyB0aGUgU05QIHByb2ZpbGVzIG9mIGFsbCBzYW1wbGVzIChvbGQgYW5kIG5ldykgd2hlcmUgdGhlCmNvbG9ycyBhdCB0aGUgdG9wIHNob3cgZWl0aGVyIHRoZSAyLjIgc3RyYWlucyAob3JhbmdlKSwgMi4zIHN0cmFpbnMgKGdyZWVuKSwgdGhlCnByZXZpb3VzIHNhbXBsZXMgKHB1cnBsZSksIG9yIHRoZSB2YXJpb3VzIGxhYiBzdHJhaW5zIChwaW5rIGV0YykuCgpgYGB7ciBwbG90dGluZ192YXJpYW50c30Kb2xkX25ld192YXJpYW50X2hlYXRtYXAgPC0gcGxvdF9kaXNoZWF0KGJvdGhfbm9ybSkKcHAoZmlsZSA9ICJpbWFnZXMvcmF3X3NucF9kaXNoZWF0LnBuZyIsIGltYWdlID0gb2xkX25ld192YXJpYW50X2hlYXRtYXAsCiAgIGhlaWdodCA9IDEyLCB3aWR0aCA9IDEyKQpgYGAKClRoZSBmdW5jdGlvbiBnZXRfc25wX3NldHMoKSB0YWtlcyB0aGUgcHJvdmlkZWQgbWV0YWRhdGEgZmFjdG9yIChpbgp0aGlzIGNhc2UgJ2NvbmRpdGlvbicpIGFuZCBsb29rcyBmb3IgdmFyaWFudHMgd2hpY2ggYXJlIGV4Y2x1c2l2ZSB0bwplYWNoIGVsZW1lbnQgaW4gaXQuICBJbiB0aGlzIGNhc2UsIHRoaXMgaXMgbG9va2luZyBmb3IgZGlmZmVyZW5jZXMKYmV0d2VlbiAyLjIgYW5kIDIuMywgYXMgd2VsbCBhcyB0aGUgc2V0IHNoYXJlZCBhbW9uZyB0aGVtLgoKYGBge3IgZ2V0X3NucF9zZXRzMX0Kc25wX3NldHMgPC0gZ2V0X3NucF9zZXRzKGJvdGhfc25wcywgZmFjdG9yID0gImNvbmRpdGlvbiIpCmJvdGhfZXhwdCA8LSBjb21iaW5lX2V4cHRzKGxwX2V4cHQsIG9sZF9leHB0KQoKc25wX2dlbmVzIDwtIHNtKHNucHNfdnNfZ2VuZXMoYm90aF9leHB0LCBzbnBfc2V0cywgZXhwdF9uYW1lX2NvbCA9ICJjaHJvbW9zb21lIikpCiMjIEkgdGhpbmsgd2UgaGF2ZSBzb21lIG1ldHJpY3MgaGVyZSB3ZSBjYW4gcGxvdC4uLgpzbnBfc3Vic2V0IDwtIHNtKHNucF9zdWJzZXRfZ2VuZXMoCiAgYm90aF9leHB0LCBib3RoX3NucHMsCiAgZ2VuZXMgPSBjKCJMUEFMMTNfMTIwMDEwOTAwIiwgIkxQQUwxM18zNDAwMTMwMDAiLCAiTFBBTDEzXzAwMDA1NDEwMCIsCiAgICAgICAgICAgICJMUEFMMTNfMTQwMDA2MTAwIiwgIkxQQUwxM18xODAwMTg1MDAiLCAiTFBBTDEzXzMyMDAyMjMwMCIpKSkKenltb19oZWF0IDwtIHBsb3Rfc2FtcGxlX2hlYXRtYXAoc25wX3N1YnNldCwgcm93X2xhYmVsID0gcm93bmFtZXMoZXhwcnMoc25wX3N1YnNldCkpKQp6eW1vX2hlYXQKYGBgCgpEaWRuJ3QgSSBjcmVhdGUgYSBzZXQgb2YgZGVuc2l0aWVzIGJ5IGNocm9tb3NvbWU/Ck9oIEkgdGhpbmsgdGhleSBjb21lIGluIGZyb20gZ2V0X3NucF9zZXRzKCkKCiMjIFNOUFMgYXNzb2NpYXRlZCB3aXRoIGNsaW5pY2FsIHJlc3BvbnNlIGluIHRoZSBUTVJDIHNhbXBsZXMKCmBgYHtyIHNucF9jbGluaWNhbH0KY2xpbmljYWxfc2V0cyA8LSBnZXRfc25wX3NldHMobmV3X3NucHMsIGZhY3RvciA9ICJjbGluaWNhbHJlc3BvbnNlIikKCmRlbnNpdHlfdmVjIDwtIGNsaW5pY2FsX3NldHNbWyJkZW5zaXR5Il1dCmNocm9tb3NvbWVfaWR4IDwtIGdyZXAocGF0dGVybiA9ICJMcGFMIiwgeCA9IG5hbWVzKGRlbnNpdHlfdmVjKSkKZGVuc2l0eV9kZiA8LSBhcy5kYXRhLmZyYW1lKGRlbnNpdHlfdmVjW2Nocm9tb3NvbWVfaWR4XSkKZGVuc2l0eV9kZltbImNociJdXSA8LSByb3duYW1lcyhkZW5zaXR5X2RmKQpjb2xuYW1lcyhkZW5zaXR5X2RmKSA8LSBjKCJkZW5zaXR5X3ZlYyIsICJjaHIiKQpnZ3Bsb3QoZGVuc2l0eV9kZiwgYWVzX3N0cmluZyh4ID0gImNociIsIHkgPSAiZGVuc2l0eV92ZWMiKSkgKwogIGdncGxvdDI6Omdlb21fY29sKCkgKwogIGdncGxvdDI6OnRoZW1lKGF4aXMudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTAsIGNvbG91ciA9ICJibGFjayIpLAogICAgICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41KSkKCiMjIGNsaW5pY2FsX3dyaXR0ZW4gPC0gd3JpdGVfdmFyaWFudHMobmV3X3NucHMpCmBgYAoKIyMjIENyb3NzIHJlZmVyZW5jZSB0aGVzZSB2YXJpYW50cyBieSBnZW5lCgpgYGB7ciBzbnBfY2xhc3NpZmljYXRpb25zfQpjbGluaWNhbF9nZW5lcyA8LSBzbShzbnBzX3ZzX2dlbmVzKGxwX2V4cHQsIGNsaW5pY2FsX3NldHMsIGV4cHRfbmFtZV9jb2wgPSAiY2hyb21vc29tZSIpKQoKc25wX2RlbnNpdHkgPC0gbWVyZ2UoYXMuZGF0YS5mcmFtZShjbGluaWNhbF9nZW5lc1tbInN1bW1hcnlfYnlfZ2VuZSJdXSksCiAgICAgICAgICAgICAgICAgICAgIGFzLmRhdGEuZnJhbWUoZkRhdGEobHBfZXhwdCkpLAogICAgICAgICAgICAgICAgICAgICBieSA9ICJyb3cubmFtZXMiKQpzbnBfZGVuc2l0eSA8LSBzbnBfZGVuc2l0eVssIGMoMSwgMiwgNCwgMTUpXQpjb2xuYW1lcyhzbnBfZGVuc2l0eSkgPC0gYygibmFtZSIsICJzbnBzIiwgInByb2R1Y3QiLCAibGVuZ3RoIikKc25wX2RlbnNpdHlbWyJwcm9kdWN0Il1dIDwtIHRvbG93ZXIoc25wX2RlbnNpdHlbWyJwcm9kdWN0Il1dKQpzbnBfZGVuc2l0eVtbImxlbmd0aCJdXSA8LSBhcy5udW1lcmljKHNucF9kZW5zaXR5W1sibGVuZ3RoIl1dKQpzbnBfZGVuc2l0eVtbImRlbnNpdHkiXV0gPC0gc25wX2RlbnNpdHlbWyJzbnBzIl1dIC8gc25wX2RlbnNpdHlbWyJsZW5ndGgiXV0Kc25wX2lkeCA8LSBvcmRlcihzbnBfZGVuc2l0eVtbImRlbnNpdHkiXV0sIGRlY3JlYXNpbmcgPSBUUlVFKQpzbnBfZGVuc2l0eSA8LSBzbnBfZGVuc2l0eVtzbnBfaWR4LCBdCgpyZW1vdmVycyA8LSBjKCJhbWFzdGluIiwgImdwNjMiLCAibGVpc2htYW5vbHlzaW4iKQpmb3IgKHIgaW4gcmVtb3ZlcnMpIHsKICBkcm9wX2lkeCA8LSBncmVwbChwYXR0ZXJuID0gciwgeCA9IHNucF9kZW5zaXR5W1sicHJvZHVjdCJdXSkKICBzbnBfZGVuc2l0eSA8LSBzbnBfZGVuc2l0eVshZHJvcF9pZHgsIF0KfQojIyBGaWx0ZXIgdGhlc2UgZm9yIFtBfGFdbWFzdGluIGdwNjMgTGVpc2htYW5vbHlzaW4KYGBgCgoKYGBge3Igc25wX2ludGVyc2VjdGlvbnN9CmNsaW5pY2FsX3NucHMgPC0gc25wc19pbnRlcnNlY3Rpb25zKGxwX2V4cHQsIGNsaW5pY2FsX3NldHMsIGNocl9jb2x1bW4gPSAiY2hyb21vc29tZSIpCgphcy5kYXRhLmZyYW1lKGNsaW5pY2FsX3NucHNbWyJpbnRlcnMiXV1bWyJmYWlsdXJlLCByZWZlcmVuY2Ugc3RyYWluIl1dKQphcy5kYXRhLmZyYW1lKGNsaW5pY2FsX3NucHNbWyJpbnRlcnMiXV1bWyJjdXJlIl1dKQoKaGVhZChjbGluaWNhbF9zbnBzW1siZ2VuZV9zdW1tYXJpZXMiXV1bWyJmYWlsdXJlLCByZWZlcmVuY2Ugc3RyYWluIl1dKQpoZWFkKGNsaW5pY2FsX3NucHNbWyJnZW5lX3N1bW1hcmllcyJdXVtbImN1cmUiXV0sIG4gPSAzMCkKCmFubm90IDwtIGZEYXRhKGxwX2V4cHQpCmNsaW5pY2FsX2ludGVyZXN0IDwtIGFzLmRhdGEuZnJhbWUoY2xpbmljYWxfc25wc1tbImdlbmVfc3VtbWFyaWVzIl1dW1siY3VyZSJdXSkKY2xpbmljYWxfaW50ZXJlc3QgPC0gbWVyZ2UoY2xpbmljYWxfaW50ZXJlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmRhdGEuZnJhbWUoY2xpbmljYWxfc25wc1tbImdlbmVfc3VtbWFyaWVzIl1dW1siZmFpbHVyZSwgcmVmZXJlbmNlIHN0cmFpbiJdXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gInJvdy5uYW1lcyIpCnJvd25hbWVzKGNsaW5pY2FsX2ludGVyZXN0KSA8LSBjbGluaWNhbF9pbnRlcmVzdFtbIlJvdy5uYW1lcyJdXQpjbGluaWNhbF9pbnRlcmVzdFtbIlJvdy5uYW1lcyJdXSA8LSBOVUxMCmNvbG5hbWVzKGNsaW5pY2FsX2ludGVyZXN0KSA8LSBjKCJjdXJlX3NucHMiLCJmYWlsX3NucHMiKQphbm5vdCA8LSBtZXJnZShhbm5vdCwgY2xpbmljYWxfaW50ZXJlc3QsIGJ5ID0gInJvdy5uYW1lcyIpCnJvd25hbWVzKGFubm90KSA8LSBhbm5vdFtbIlJvdy5uYW1lcyJdXQphbm5vdFtbIlJvdy5uYW1lcyJdXSA8LSBOVUxMCmZEYXRhKGxwX2V4cHQkZXhwcmVzc2lvbnNldCkgPC0gYW5ub3QKYGBgCgojIFp5bW9kZW1lIGZvciBuZXcgc2FtcGxlcwoKVGhlIGhlYXRtYXAgcHJvZHVjZWQgaGVyZSBzaG91bGQgc2hvdyB0aGUgdmFyaWFudHMgb25seSBmb3IgdGhlIHp5bW9kZW1lIGdlbmVzLgoKIyMgSHVudCBmb3Igc25wIGNsdXN0ZXJzCgpJIGFtIHRoaW5raW5nIHRoYXQgaWYgd2UgZmluZCBjbHVzdGVycyBvZiBsb2NhdGlvbnMgd2hpY2ggYXJlIHZhcmlhbnQsIHRoYXQKbWlnaHQgcHJvdmlkZSBzb21lIFBDUiB0ZXN0aW5nIHBvc3NpYmlsaXRpZXMuCgpgYGB7ciBuZXdfenltb30KbmV3X3NldHMgPC0gZ2V0X3NucF9zZXRzKG5ld19zbnBzLCBmYWN0b3IgPSAicGhlbm90eXBpY2NoYXJhY3RlcmlzdGljcyIpCnN1bW1hcnkobmV3X3NldHMpCiMjIDEwMDAwMDA6IDIuMgojIyAwMTAwMDAwOiAyLjMKCnN1bW1hcnkobmV3X3NldHNbWyJpbnRlcnNlY3Rpb25zIl1dW1siMTAwMDAiXV0pCmhlYWQobmV3X3NldHMkaW50ZXJzZWN0aW9uc1tbIjEwMDAwIl1dLCBuID0gMTAwKQoKc2VxdWVudGlhbF92YXJpYW50cyA8LSBmdW5jdGlvbihzbnBfc2V0cywgY29uZGl0aW9ucyA9IE5VTEwsIG1pbmltdW0gPSAzLCBtYXhpbXVtX3NlcGFyYXRpb24gPSAzKSB7CiAgaWYgKGlzLm51bGwoY29uZGl0aW9ucykpIHsKICAgIGNvbmRpdGlvbnMgPC0gMQogIH0KICBpbnRlcnNlY3Rpb25fc2V0cyA8LSBzbnBfc2V0c1tbImludGVyc2VjdGlvbnMiXV0KICBpbnRlcnNlY3Rpb25fbmFtZXMgPC0gc25wX3NldHNbWyJzZXRfbmFtZXMiXV0KICBjaG9zZW5faW50ZXJzZWN0aW9uIDwtIDEKICBpZiAoaXMubnVtZXJpYyhjb25kaXRpb25zKSkgewogICAgY2hvc2VuX2ludGVyc2VjdGlvbiA8LSBjb25kaXRpb25zCiAgfSBlbHNlIHsKICAgIGludGVyc2VjdGlvbl9pZHggPC0gaW50ZXJzZWN0aW9uX25hbWVzID09IGNvbmRpdGlvbnMKICAgIGNob3Nlbl9pbnRlcnNlY3Rpb24gPC0gbmFtZXMoaW50ZXJzZWN0aW9uX25hbWVzKVtpbnRlcnNlY3Rpb25faWR4XQogIH0KCiAgcG9zc2libGVfcG9zaXRpb25zIDwtIGludGVyc2VjdGlvbl9zZXRzW1tjaG9zZW5faW50ZXJzZWN0aW9uXV0KICBwb3NpdGlvbl90YWJsZSA8LSBkYXRhLmZyYW1lKHJvdy5uYW1lcyA9IHBvc3NpYmxlX3Bvc2l0aW9ucykKICBwYXQgPC0gIl5jaHJfKC4rKV9wb3NfKC4rKV9yZWZfLiokIgogIHBvc2l0aW9uX3RhYmxlW1siY2hyIl1dIDwtIGdzdWIocGF0dGVybiA9IHBhdCwgcmVwbGFjZW1lbnQgPSAiXFwxIiwgeCA9IHJvd25hbWVzKHBvc2l0aW9uX3RhYmxlKSkKICBwb3NpdGlvbl90YWJsZVtbInBvcyJdXSA8LSBhcy5udW1lcmljKGdzdWIocGF0dGVybiA9IHBhdCwgcmVwbGFjZW1lbnQgPSAiXFwyIiwgeCA9IHJvd25hbWVzKHBvc2l0aW9uX3RhYmxlKSkpCiAgcG9zaXRpb25faWR4IDwtIG9yZGVyKHBvc2l0aW9uX3RhYmxlWywgImNociJdLCBwb3NpdGlvbl90YWJsZVssICJwb3MiXSkKICBwb3NpdGlvbl90YWJsZSA8LSBwb3NpdGlvbl90YWJsZVtwb3NpdGlvbl9pZHgsIF0KICBwb3NpdGlvbl90YWJsZVtbImRpc3QiXV0gPC0gMAoKICBsYXN0X2NociA8LSAiIgogIGZvciAociBpbiAxOm5yb3cocG9zaXRpb25fdGFibGUpKSB7CiAgICB0aGlzX2NociA8LSBwb3NpdGlvbl90YWJsZVtyLCAiY2hyIl0KICAgIGlmIChyID09IDEpIHsKICAgICAgcG9zaXRpb25fdGFibGVbciwgImRpc3QiXSA8LSBwb3NpdGlvbl90YWJsZVtyLCAicG9zIl0KICAgICAgbGFzdF9jaHIgPC0gdGhpc19jaHIKICAgICAgbmV4dAogICAgfQogICAgaWYgKHRoaXNfY2hyID09IGxhc3RfY2hyKSB7CiAgICAgIHBvc2l0aW9uX3RhYmxlW3IsICJkaXN0Il0gPC0gcG9zaXRpb25fdGFibGVbciwgInBvcyJdIC0gcG9zaXRpb25fdGFibGVbciAtIDEsICJwb3MiXQogICAgfSBlbHNlIHsKICAgICAgcG9zaXRpb25fdGFibGVbciwgImRpc3QiXSA8LSBwb3NpdGlvbl90YWJsZVtyLCAicG9zIl0KICAgIH0KICAgIGxhc3RfY2hyIDwtIHRoaXNfY2hyCiAgfQoKICBzZXF1ZW50aWFscyA8LSBwb3NpdGlvbl90YWJsZVtbImRpc3QiXV0gPD0gbWF4aW11bV9zZXBhcmF0aW9uCiAgbWVzc2FnZSgiVGhlcmUgYXJlICIsIHN1bShzZXF1ZW50aWFscyksICIgY2FuZGlkYXRlIHJlZ2lvbnMuIikKCiAgIyMgVGhlIGZvbGxvd2luZyBjYW4gdGVsbCBtZSBob3cgbWFueSBydW5zIG9mIGVhY2ggbGVuZ3RoIG9jY3VycmVkLCB0aGF0IGlzIG5vdCBxdWl0ZSB3aGF0IEkgd2FudC4KICAjIyBOb3cgdXNlIHJ1biBsZW5ndGggZW5jb2RpbmcgdG8gZmluZCB0aGUgc2V0IG9mIHNlcXVlbnRpYWwgc2VxdWVudGlhbHMhCiAgcmxlX3Jlc3VsdCA8LSBybGUoc2VxdWVudGlhbHMpCiAgcmxlX3ZhbHVlcyA8LSBybGVfcmVzdWx0W1sidmFsdWVzIl1dCiAgIyMgVGhlIGZvbGxvd2luZyBsaW5lIGlzIGVxdWl2YWxlbnQgdG8ganVzdCBsZWF2aW5nIHZhbHVlcyBhbG9uZToKICAjIyB0cnVlX3ZhbHVlcyA8LSBybGVfcmVzdWx0W1sidmFsdWVzIl1dID09IFRSVUUKICBybGVfbGVuZ3RocyA8LSBybGVfcmVzdWx0W1sibGVuZ3RocyJdXQogIHRydWVfc2VxdWVudGlhbHMgPC0gcmxlX2xlbmd0aHNbcmxlX3ZhbHVlc10KICBybGVfaWR4IDwtIGN1bXN1bShybGVfbGVuZ3Rocylbd2hpY2gocmxlX3ZhbHVlcyldCgogIHBvc2l0aW9uX3RhYmxlW1sibGFzdF9zZXF1ZW50aWFsIl1dIDwtIDAKICBjb3VudCA8LSAwCiAgZm9yIChyIGluIHJsZV9pZHgpIHsKICAgIGNvdW50IDwtIGNvdW50ICsgMQogICAgcG9zaXRpb25fdGFibGVbciwgImxhc3Rfc2VxdWVudGlhbCJdIDwtIHRydWVfc2VxdWVudGlhbHNbY291bnRdCiAgfQogIG1lc3NhZ2UoIlRoZSBtYXhpbXVtIHNlcXVlbnRpYWwgc2V0IGlzOiAiLCBtYXgocG9zaXRpb25fdGFibGVbWyJsYXN0X3NlcXVlbnRpYWwiXV0pLCAiLiIpCgogIHdhbnRlZF9pZHggPC0gcG9zaXRpb25fdGFibGVbWyJsYXN0X3NlcXVlbnRpYWwiXV0gPj0gbWluaW11bQogIHdhbnRlZCA8LSBwb3NpdGlvbl90YWJsZVt3YW50ZWRfaWR4LCBjKCJjaHIiLCAicG9zIildCiAgcmV0dXJuKHdhbnRlZCkKfQoKenltbzIyX3NlcXVlbnRpYWxzIDwtIHNlcXVlbnRpYWxfdmFyaWFudHMobmV3X3NldHMsIGNvbmRpdGlvbnMgPSAiMjIiKQp6eW1vMjJfc2VxdWVudGlhbHMKenltbzIzX3NlcXVlbnRpYWxzIDwtIHNlcXVlbnRpYWxfdmFyaWFudHMobmV3X3NldHMsIGNvbmRpdGlvbnMgPSAiMjMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtID0gMSwgbWF4aW11bV9zZXBhcmF0aW9uID0gMykKenltbzIzX3NlcXVlbnRpYWxzCmBgYAoKYGBge3Igenltb19oZWF0bWFwc30Kc25wX2dlbmVzIDwtIHNtKHNucHNfdnNfZ2VuZXMobHBfZXhwdCwgbmV3X3NldHMsIGV4cHRfbmFtZV9jb2wgPSAiY2hyb21vc29tZSIpKQpuZXdfenltb19ub3JtICA8LSBub3JtYWxpemVfZXhwdChuZXdfc25wcywgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJjcG0iLCBub3JtID0gInF1YW50IiwgdHJhbnNmb3JtID0gVFJVRSkKbmV3X3p5bW9fbm9ybSA8LSBzZXRfZXhwdF9jb25kaXRpb25zKG5ld196eW1vX25vcm0sIGZhY3QgPSAicGhlbm90eXBpY2NoYXJhY3RlcmlzdGljcyIpCgp6eW1vX2hlYXQgPC0gcGxvdF9kaXNoZWF0KG5ld196eW1vX25vcm0pCnp5bW9faGVhdFtbInBsb3QiXV0KCnp5bW9fc3Vic2V0IDwtIHNucF9zdWJzZXRfZ2VuZXMobHBfZXhwdCwgbmV3X3NucHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXMgPSBjKCJMUEFMMTNfMTIwMDEwOTAwIiwgIkxQQUwxM18zNDAwMTMwMDAiLCAiTFBBTDEzXzAwMDA1NDEwMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMUEFMMTNfMTQwMDA2MTAwIiwgIkxQQUwxM18xODAwMTg1MDAiLCAiTFBBTDEzXzMyMDAyMjMwMCIpKQoKenltb19zdWJzZXQgPC0gc2V0X2V4cHRfY29uZGl0aW9ucyh6eW1vX3N1YnNldCwgZmFjdCA9ICJwaGVub3R5cGljY2hhcmFjdGVyaXN0aWNzIikKIyMgenltb19oZWF0IDwtIHBsb3Rfc2FtcGxlX2hlYXRtYXAoenltb19zdWJzZXQsIHJvd19sYWJlbCA9IHJvd25hbWVzKGV4cHJzKHNucF9zdWJzZXQpKSkKCmRlcyA8LSBib3RoX25vcm0kZGVzaWduCnVuZGVmX2lkeCA8LSBpcy5uYShkZXNbWyJzdHJhaW4iXV0pCmRlc1t1bmRlZl9pZHgsICJzdHJhaW4iXSA8LSAidW5rbm93biIKCiMjaG1jb2xzIDwtIGNvbG9yUmFtcFBhbGV0dGUoYygieWVsbG93IiwiYmxhY2siLCJkYXJrYmx1ZSIpKSgyNTYpCmNvcnJlbGF0aW9ucyA8LSBocGdsX2NvcihleHBycyhib3RoX25vcm0pKQoKenltb19taXNzaW5nX2lkeCA8LSBpcy5uYShkZXNbWyJwaGVub3R5cGljY2hhcmFjdGVyaXN0aWNzIl1dKQpkZXNbenltb19taXNzaW5nX2lkeCwgInBoZW5vdHlwaWNjaGFyYWN0ZXJpc3RpY3MiXSA8LSAidW5rbm93biIKbXlkZW5kcm8gPC0gbGlzdCgKICAiY2x1c3RmdW4iID0gaGNsdXN0LAogICJsd2QiID0gMi4wKQpjb2xfZGF0YSA8LSBhcy5kYXRhLmZyYW1lKGRlc1ssIGMoInBoZW5vdHlwaWNjaGFyYWN0ZXJpc3RpY3MiLCAiY2xpbmljYWxjYXRlZ29yaWNhbCIpXSkKdW5rbm93bl9jbGluaWNhbCA8LSBpcy5uYShjb2xfZGF0YVtbImNsaW5pY2FsY2F0ZWdvcmljYWwiXV0pCnJvd19kYXRhIDwtIGFzLmRhdGEuZnJhbWUoZGVzWywgYygic3RyYWluIildKQpjb2xuYW1lcyhjb2xfZGF0YSkgPC0gYygienltb2RlbWUiLCAib3V0Y29tZSIpCmNvbF9kYXRhW3Vua25vd25fY2xpbmljYWwsICJvdXRjb21lIl0gPC0gInVuZGVmaW5lZCIKCmNvbG5hbWVzKHJvd19kYXRhKSA8LSBjKCJzdHJhaW4iKQpteWFubm90IDwtIGxpc3QoCiAgIkNvbCIgPSBsaXN0KCJkYXRhIiA9IGNvbF9kYXRhKSwKICAiUm93IiA9IGxpc3QoImRhdGEiID0gcm93X2RhdGEpKQpteWNsdXN0IDwtIGxpc3QoImN1dGgiID0gMS4wLAogICAgICAgICAgICAgICAgImNvbCIgPSBCcmV3ZXJDbHVzdGVyQ29sKQpteWxhYnMgPC0gbGlzdCgKICAiUm93IiA9IGxpc3QoIm5yb3ciID0gNCksCiAgIkNvbCIgPSBsaXN0KCJucm93IiA9IDQpKQpobWNvbHMgPC0gY29sb3JSYW1wUGFsZXR0ZShjKCJkYXJrYmx1ZSIsICJiZWlnZSIpKSgyNDApCm1hcDEgPC0gYW5uSGVhdG1hcDIoCiAgY29ycmVsYXRpb25zLAogIGRlbmRyb2dyYW0gPSBteWRlbmRybywKICBhbm5vdGF0aW9uID0gbXlhbm5vdCwKICBjbHVzdGVyID0gbXljbHVzdCwKICBsYWJlbHMgPSBteWxhYnMsCiAgIyMgVGhlIGZvbGxvd2luZyBjb250cm9scyBpZiB0aGUgcGljdHVyZSBpcyBzeW1tZXRyaWMKICBzY2FsZSA9ICJub25lIiwKICBjb2wgPSBobWNvbHMpCnBwKGZpbGUgPSAiaW1hZ2VzL2RlbmRyb19oZWF0bWFwLnBuZyIsIGltYWdlID0gbWFwMSwgaGVpZ2h0ID0gMjAsIHdpZHRoID0gMjApCmBgYAoKUHJpbnQgdGhlIGxhcmdlciBoZWF0bWFwIHNvIHRoYXQgYWxsIHRoZSBsYWJlbHMgYXBwZWFyLiAgS2VlcCBpbiBtaW5kCnRoYXQgYXMgd2UgZ2V0IG1vcmUgc2FtcGxlcywgdGhpcyBpbWFnZSBuZWVkcyB0byBjb250aW51ZSBnZXR0aW5nCmJpZ2dlci4KCiFbYmlnIGhlYXRtYXBdKGltYWdlcy9kZW5kcm9faGVhdG1hcC5wbmcpCgoKIyBVc2luZyBWYXJpYW50IHByb2ZpbGVzIHRvIG1ha2UgZ3Vlc3NlcyBhYm91dCBzdHJhaW5zIGFuZCBjaHJvbmljL3NlbGYtaGVhbGluZwoKVGhlIGZvbGxvd2luZyB1c2VzIHRoZSBzYW1lIGluZm9ybWF0aW9uIHRvIG1ha2Ugc29tZSBndWVzc2VzIGFib3V0IHRoZSBzdHJhaW5zCnVzZWQgaW4gdGhlIG5ldyBzYW1wbGVzLgoKYGBge3Igb2xkX2FuZF9uZXdfY2hyb25pY30KZGVzIDwtIGJvdGhfbm9ybSRkZXNpZ24KdW5kZWZfaWR4IDwtIGlzLm5hKGRlc1tbInN0cmFpbiJdXSkKZGVzW3VuZGVmX2lkeCwgInN0cmFpbiJdIDwtICJ1bmtub3duIgojI2htY29scyA8LSBjb2xvclJhbXBQYWxldHRlKGMoInllbGxvdyIsImJsYWNrIiwiZGFya2JsdWUiKSkoMjU2KQpjb3JyZWxhdGlvbnMgPC0gaHBnbF9jb3IoZXhwcnMoYm90aF9ub3JtKSkKCm15ZGVuZHJvIDwtIGxpc3QoCiAgImNsdXN0ZnVuIiA9IGhjbHVzdCwKICAibHdkIiA9IDIuMCkKY29sX2RhdGEgPC0gYXMuZGF0YS5mcmFtZShkZXNbLCBjKCJjb25kaXRpb24iKV0pCnJvd19kYXRhIDwtIGFzLmRhdGEuZnJhbWUoZGVzWywgYygic3RyYWluIildKQpjb2xuYW1lcyhjb2xfZGF0YSkgPC0gYygiY29uZGl0aW9uIikKY29sbmFtZXMocm93X2RhdGEpIDwtIGMoInN0cmFpbiIpCm15YW5ub3QgPC0gbGlzdCgKICAiQ29sIiA9IGxpc3QoImRhdGEiID0gY29sX2RhdGEpLAogICJSb3ciID0gbGlzdCgiZGF0YSIgPSByb3dfZGF0YSkpCm15Y2x1c3QgPC0gbGlzdCgiY3V0aCIgPSAxLjAsCiAgICAgICAgICAgICAgICAiY29sIiA9IEJyZXdlckNsdXN0ZXJDb2wpCm15bGFicyA8LSBsaXN0KAogICJSb3ciID0gbGlzdCgibnJvdyIgPSA0KSwKICAiQ29sIiA9IGxpc3QoIm5yb3ciID0gNCkpCmhtY29scyA8LSBjb2xvclJhbXBQYWxldHRlKGMoImRhcmtibHVlIiwgImJlaWdlIikpKDE3MCkKbWFwMSA8LSBhbm5IZWF0bWFwMigKICBjb3JyZWxhdGlvbnMsCiAgZGVuZHJvZ3JhbSA9IG15ZGVuZHJvLAogIGFubm90YXRpb24gPSBteWFubm90LAogIGNsdXN0ZXIgPSBteWNsdXN0LAogIGxhYmVscyA9IG15bGFicykKIyMgIGNvbCA9IGhtY29scykKIyNwbG90KG1hcDEpCnBwKGZpbGUgPSAiaW1hZ2VzL2RlbmRyb19jaHJvbmljX2hlYXRtYXAucG5nIiwgaW1hZ2UgPSBtYXAxLCBoZWlnaHQgPSAyMCwgd2lkdGggPSAyMCkKYGBgCgohW2Nocm9uaWMgaGVhdG1hcF0oaW1hZ2VzL2RlbmRyb19jaHJvbmljX2hlYXRtYXAucG5nKQoKYGBge3IgdGhlcmVzYV9pZGVhfQpwaGVubyA8LSBzdWJzZXRfZXhwdChscF9leHB0LCBzdWJzZXQgPSAiY29uZGl0aW9uPT0nejIuMid8Y29uZGl0aW9uPT0nejIuMyciKQpwaGVubyA8LSBzdWJzZXRfZXhwdChwaGVubywgc3Vic2V0PSIhaXMubmEocERhdGEocGhlbm8pW1snYmNmdGFibGUnXV0pIikKcGhlbm9fc25wcyA8LSBzbShjb3VudF9leHB0X3NucHMocGhlbm8sIGFubm90X2NvbHVtbiA9ICJiY2Z0YWJsZSIpKQoKeHJlZl9wcm9wIDwtIHRhYmxlKHBoZW5vX3NucHNbWyJjb25kaXRpb25zIl1dKQpwaGVub19zbnBzJGNvbmRpdGlvbnMKaWR4X3RibCA8LSBleHBycyhwaGVub19zbnBzKSA+IDUKbmV3X3RibCA8LSBkYXRhLmZyYW1lKHJvdy5uYW1lcyA9IHJvd25hbWVzKGV4cHJzKHBoZW5vX3NucHMpKSkKZm9yIChuIGluIG5hbWVzKHhyZWZfcHJvcCkpIHsKICBuZXdfdGJsW1tuXV0gPC0gMAogIGlkeF9jb2xzIDwtIHdoaWNoKHBoZW5vX3NucHNbWyJjb25kaXRpb25zIl1dID09IG4pCiAgcHJvcF9jb2wgPC0gcm93U3VtcyhpZHhfdGJsWywgaWR4X2NvbHNdKSAvIHhyZWZfcHJvcFtuXQogIG5ld190Ymxbbl0gPC0gcHJvcF9jb2wKfQpuZXdfdGJsW1sicmF0aW8iXV0gPC0gKG5ld190YmxbWyJ6Mi4yIl1dIC0gbmV3X3RibFtbInoyLjMiXV0pCmtlZXBlcnMgPC0gZ3JlcGwoeCA9IHJvd25hbWVzKG5ld190YmwpLCBwYXR0ZXJuID0gIkxwYUwxMyIpCm5ld190YmwgPC0gbmV3X3RibFtrZWVwZXJzLCBdCm5ld190YmxbWyJTTlAiXV0gPC0gcm93bmFtZXMobmV3X3RibCkKbmV3X3RibFtbIkNocm9tb3NvbWUiXV0gPC0gZ3N1Yih4ID0gbmV3X3RibFtbIlNOUCJdXSwgcGF0dGVybiA9ICJjaHJfKC4qKV9wb3NfLioiLCByZXBsYWNlbWVudCA9ICJcXDEiKQpuZXdfdGJsW1siUG9zaXRpb24iXV0gPC0gZ3N1Yih4ID0gbmV3X3RibFtbIlNOUCJdXSwgcGF0dGVybiA9ICIuKl9wb3NfKFxcZCspXy4qIiwgcmVwbGFjZW1lbnQgPSAiXFwxIikKbmV3X3RibCA8LSBuZXdfdGJsWywgYygiU05QIiwgIkNocm9tb3NvbWUiLCAiUG9zaXRpb24iLCAicmF0aW8iKV0KbGlicmFyeShDTXBsb3QpCkNNcGxvdChuZXdfdGJsLCBiaW4uc2l6ZSA9IDEwMDAwMCkKYGBgCgohW1NOUCBEZW5zaXR5XShTTlAtRGVuc2l0eS5yYXRpby5qcGcpCiFbQ2lyY3VsYXIgTWFuaGF0dGFuXShDaXJjdWxhci1NYW5oYXR0YW4ucmF0aW8uanBnKQohW1JlY3Rhbmd1bGFyIE1hbmhhdHRhbl0oUmVjdGFuZ3VsYXItTWFuaGF0dGFuLnJhdGlvLmpwZykKIVtRUV0oUVFwbG90LnJhdGlvLmpwZykKCgoKCmBgYHtyIHNhdmVtZX0KaWYgKCFpc1RSVUUoZ2V0MCgic2tpcF9sb2FkIikpKSB7CiAgcGFuZGVyOjpwYW5kZXIoc2Vzc2lvbkluZm8oKSkKICBtZXNzYWdlKHBhc3RlMCgiVGhpcyBpcyBocGdsdG9vbHMgY29tbWl0OiAiLCBnZXRfZ2l0X2NvbW1pdCgpKSkKICBtZXNzYWdlKHBhc3RlMCgiU2F2aW5nIHRvICIsIHNhdmVmaWxlKSkKICB0bXAgPC0gc20oc2F2ZW1lKGZpbGVuYW1lID0gc2F2ZWZpbGUpKQp9CmBgYAoKYGBge3IgbG9hZG1lX2FmdGVyLCBldmFsID0gRkFMU0V9CnRtcCA8LSBsb2FkbWUoZmlsZW5hbWUgPSBzYXZlZmlsZSkKYGBgCg==