1 Changelog

  • Set input data to the new 202212 dataset. Looking for some messed up colors.
  • Reasonably certain I figured out the color discrepency. I was letting the eosinophil dataset choose its own colors rather than force them to be the same as the other cell types; even though I thought I told them to explicitly set their colors to be the same as the others. I think the changes I made in datasets.Rmd fixed this, so I regenerated the rda/etc in that document and am now testing the colors here.

2 Introduction

Moving all of the visualization and diagnostic tasks to this document. The metadata and gene annotation data collection tasks are therefore in tmrc3_data_structures.Rmd. The reasons for some of the data structure creation in that document is made clear in this document, but they are all performed there.

3 Notes

  1. Lesion vs Ulcer: Ulcer is the base of the crater of the lesion observed. The lesion is this, the border, and any region with signs of inflammation. It is not known if these metrics are equivalent, or if one is better than the other. Some people do not have ulcers and therefore in those cases we can only really consider the lesion size. E.g. most people in Colombia have ulcers, which are the cratered sore; however there are a few people who have a ‘plaque’ or some form of smaller, less intrusive presentation – these are still cutaneous.

Thus the lesion size is the more inclusive metric, but potentially ulcer size is more informative? Any inflammation in the skin causes the person to be defined as failure.

  1. Note from Maria Adelaida: Some chemokines are suggestive of Eosinophil recruitment.

3.1 Goals

These samples are from patients who either successfully cleared a Leishmania panamensis infection following treatment, or did not. They include biopsies from each patient along with purifications for Monocytes, Neutrophils, and Eosinophils. When possible, this process was repeated over three visits; but some patients did not return for the second or third visit.

The over-arching goal is to look for attributes(most likely genes) which distinguish patients who do and do not cure the infection after treatment. If possible, these will be apparent on the first visit.

plot_legend(hs_expt)$plot

all_nz <- plot_nonzero(hs_expt)
## The following samples have less than 12949.95 genes.
##  [1] "TMRC30010" "TMRC30140" "TMRC30280" "TMRC30284" "TMRC30050" "TMRC30056" "TMRC30052" "TMRC30058" "TMRC30031" "TMRC30038" "TMRC30265"
## Scale for colour is already present.
## Adding another scale for colour, which will replace the existing scale.
## Scale for fill is already present.
## Adding another scale for fill, which will replace the existing scale.
## Not putting labels on the plot.
all_nz$plot

3.2 Figure XX + 1: Non-zero genes after sample filtering

The following plot is essentially identical to the previous with two exceptions:

  1. The samples with too few genes (11,000 currently) are gone. In the current iteration of the datasets Rmd, this comprises either two or three samples.
  2. The samples are colored by cure(purple)/fail(yellow)
nz_post <- plot_nonzero(tc_valid, plot_labels = FALSE)
## The following samples have less than 12949.95 genes.
## [1] "TMRC30140" "TMRC30280" "TMRC30284" "TMRC30056" "TMRC30058" "TMRC30031" "TMRC30265"
## Scale for colour is already present.
## Adding another scale for colour, which will replace the existing scale.
## Scale for fill is already present.
## Adding another scale for fill, which will replace the existing scale.
## Not putting labels on the plot.
nz_post$plot

3.3 Quick picture before removing miltefosine samples

Maria Adelaida’s quote: “I would like one picture of all samples including the miltefosine so that I can keep in my mind why we removed them.”

4 PCA with both drugs

tc_expt_norm <- normalize_expt(hs_expt, filter = TRUE, norm = "quant",
                               convert = "cpm", transform = "log2") %>%
  set_expt_batches(fact = "drug")
## Removing 5149 low-count genes (14774 remaining).
## transform_counts: Found 855 values equal to 0, adding 1 to the matrix.
## 
##    antimony miltefosine 
##         202           8
tc_expt_drug_pca <- plot_pca(tc_expt_norm, cis = NULL)
tc_expt_drug_pca <- plot_pca(tc_expt_norm)
tc_expt_drug_pca$plot

tc_expt_nb <- normalize_expt(hs_expt, filter = TRUE, convert = "cpm",
                             transform = "log2", batch = "svaseq") %>%
  set_expt_batches(fact = "drug")
## Removing 5149 low-count genes (14774 remaining).
## Setting 35565 low elements to zero.
## transform_counts: Found 35565 values equal to 0, adding 1 to the matrix.
## 
##    antimony miltefosine 
##         202           8
tc_expt_drug_nb_pca <- plot_pca(tc_expt_nb, plot_labels = "normal")
tc_expt_drug_nb_pca$plot

t_expt_drug <- subset_expt(hs_expt, subset = "clinic=='Tumaco'")
## subset_expt(): There were 210, now there are 143 samples.
t_expt_norm <- normalize_expt(t_expt_drug, filter = TRUE, norm = "quant",
                              convert = "cpm", transform = "log2") %>%
  set_expt_batches(fact = "drug")
## Removing 5676 low-count genes (14247 remaining).
## transform_counts: Found 388 values equal to 0, adding 1 to the matrix.
## 
##    antimony miltefosine 
##         135           8
t_expt_drug_pca <- plot_pca(t_expt_norm)
t_expt_drug_pca$plot

t_expt_nb <- normalize_expt(t_expt_drug, filter = TRUE, convert = "cpm",
                             transform = "log2", batch = "svaseq") %>%
  set_expt_batches(fact = "drug")
## Removing 5676 low-count genes (14247 remaining).
## Setting 18820 low elements to zero.
## transform_counts: Found 18820 values equal to 0, adding 1 to the matrix.
## 
##    antimony miltefosine 
##         135           8
t_expt_drug_nb_pca <- plot_pca(t_expt_nb)
t_expt_drug_nb_pca$plot

4.1 Summarize: Tally samples after filtering

We need to keep track of how many of each sample type is lost when we do our various filters. Thus I am repeating the same set of tallies. This will likely happen one more time, following the removal of samples which came from Cali.

table(pData(tc_valid)$drug)
## 
## antimony 
##      184
table(pData(tc_valid)$clinic)
## 
##   Cali Tumaco 
##     61    123
table(pData(tc_valid)$finaloutcome)
## 
##    cure failure 
##     122      62
table(pData(tc_valid)$typeofcells)
## 
##      biopsy eosinophils   monocytes neutrophils 
##          18          41          63          62
table(pData(tc_valid)$visit)
## 
##  3  2  1 
## 51 50 83
summary(as.numeric(pData(tc_valid)$eb_lc_tiempo_evolucion))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    2.00    4.00    6.00    8.19   12.00   21.00
summary(as.numeric(pData(tc_valid)$eb_lc_tto_mcto_glucan_dosis))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    13.0    14.8    19.0    17.5    20.0    20.0
summary(as.numeric(pData(tc_valid)$v3_lc_ejey_lesion_mm_1))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     0.0     7.2    32.0   303.4   999.0   999.0
summary(as.numeric(pData(tc_valid)$v3_lc_lesion_area_1))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       0     226     999    2328    2448   16965
summary(as.numeric(pData(tc_valid)$v3_lc_ejex_ulcera_mm_1))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     0.0     0.0    12.5   295.9   999.0   999.0
table(pData(tc_valid)$eb_lc_sexo)
## 
##   1   2 
## 156  28
table(pData(tc_valid)$eb_lc_etnia)
## 
##  1  2  3 
## 91 46 47
summary(as.numeric(pData(tc_valid)$edad))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    18.0    25.0    28.5    30.7    36.0    51.0
table(pData(tc_valid)$eb_lc_peso)
## 
##  53.9  57.9    58  58.1  58.3  58.6    59  59.6    62    63    67  69.4    72    75  76.5    77    78  79.2    82  83.3  83.4  86.4    87    89 
##     9     2     6     7    10     3     8     1     6     6     6    10     9     2     3    18    10    10     9     4    10     9     3     9 
##  93.3   100 100.8 
##     7     5     2
table(pData(tc_valid)$eb_lc_estatura)
## 
## 152 154 155 156 158 159 160 163 164 165 166 167 169 172 173 174 176 177 182 183 
##   1  10   9   6  15   2   3   9  15  12  19   3   2  10   9  32   1   7   9  10
length(unique(pData(tc_valid)[["codigo_paciente"]]))
## [1] 29

5 Host Distributions/Visualizations of interest

The sets of samples used to visualize the data will also comprise the sets used when later performing the various differential expression analyses.

5.1 Global metrics

Start out with some initial metrics of all samples. The most obvious are plots of the numbers of non-zero genes observed, heatmaps showing the relative relationships among the samples, the relative library sizes, and some PCA. It might be smart to split the library sizes up across subsets of the data, because they have expanded too far to see well on a computer screen.

The most likely factors to query when considering the entire dataset are cure/fail, visit, and cell type. This is the level at which we will choose samples to exclude from future analyses.

plot_legend(tc_biopsies)$plot

plot_libsize(tc_biopsies)$plot

plot_nonzero(tc_biopsies)$plot
## Scale for colour is already present.
## Adding another scale for colour, which will replace the existing scale.
## Scale for fill is already present.
## Adding another scale for fill, which will replace the existing scale.
## Not putting labels on the plot.

There is a (relatively)new function in the following block. plot_libsize_prepost attempts to provide an idea about how much data is lost when low-count filtering the data.

The first plot it produces is a barplot of the number of reads removed by the filter from each sample. The second plot has two bars, the top bar is labeled with the number of low-count genes before the filter. The lower bar represents the number after the filter and is assumed to be quite low.

biopsy_prepost <- plot_libsize_prepost(tc_biopsies)
biopsy_prepost$count_plot

biopsy_prepost$lowgene_plot
## Warning: Using alpha for a discrete variable is not advised.

## Minimum number of biopsy genes: ~ 14,000

plot_libsize(tc_eosinophils)$plot

plot_nonzero(tc_eosinophils)$plot
## Scale for colour is already present.
## Adding another scale for colour, which will replace the existing scale.
## Scale for fill is already present.
## Adding another scale for fill, which will replace the existing scale.
## Not putting labels on the plot.

eosinophil_prepost <- plot_libsize_prepost(tc_eosinophils)
eosinophil_prepost$count_plot

eosinophil_prepost$lowgene_plot
## Warning: Using alpha for a discrete variable is not advised.

## Minimum number of eosinophil genes: ~ 13,500

plot_libsize(tc_monocytes)$plot

plot_nonzero(tc_monocytes)$plot
## The following samples have less than 12949.95 genes.
## [1] "TMRC30056"
## Scale for colour is already present.
## Adding another scale for colour, which will replace the existing scale.
## Scale for fill is already present.
## Adding another scale for fill, which will replace the existing scale.
## Not putting labels on the plot.

monocyte_prepost <- plot_libsize_prepost(tc_monocytes)
monocyte_prepost$count_plot

monocyte_prepost$lowgene_plot
## Warning: Using alpha for a discrete variable is not advised.

## Minimum number of monocyte genes: ~ 7,500 before setting the minimum.

plot_libsize(tc_neutrophils)$plot

plot_nonzero(tc_neutrophils)$plot
## The following samples have less than 12949.95 genes.
## [1] "TMRC30140" "TMRC30280" "TMRC30284" "TMRC30058" "TMRC30031" "TMRC30265"
## Scale for colour is already present.
## Adding another scale for colour, which will replace the existing scale.
## Scale for fill is already present.
## Adding another scale for fill, which will replace the existing scale.
## Not putting labels on the plot.

neutrophil_prepost <- plot_libsize_prepost(tc_neutrophils)
neutrophil_prepost$count_plot

neutrophil_prepost$lowgene_plot
## Warning: Using alpha for a discrete variable is not advised.

## Minimum number of neutrophil genes: ~ 10,000 before setting minimum coverage.

The above block just repeats the same two plots on a per-celltype basis: the number of reads observed / sample and a plot of observed genes with respect to coverage. I made some comments with my observations about the number of genes.

5.2 Global views of all cell types

Now that those ‘global’ metrics are out of the way, lets look at some global metrics of the data following normalization; the most likely plots are of course PCA but also a couple of heatmaps.

5.2.1 Figure 1

In the google doc TMRC3_Aug18_2021, there is an example of an image for the first figure:

“Transcriptomic profiles of primary innate cells of CL patients show unique transcriptional signatures - Remove PBMCs and M0, maybe biopsies as well (but Remove WT samples)”

While we were talking in a meeting however, it sounded like there was some desire to keep all cell types. Therefore the following block has one image with everything and one following the above.

tc_type <- set_expt_conditions(tc_valid, fact = "typeofcells") %>%
  set_expt_batches(fact = "finaloutcome") %>%
  set_expt_colors(color_choices[["type"]])
## 
##      biopsy eosinophils   monocytes neutrophils 
##          18          41          63          62 
## 
##    cure failure 
##     122      62
tc_norm <- sm(normalize_expt(tc_type, transform = "log2", norm = "quant",
                             convert = "cpm", filter = TRUE))

tc_pca <- plot_pca(tc_norm, plot_labels = FALSE,
                    plot_title = "PCA - Cell type", size_column = "visitnumber")
tc_pca$plot

tc_pca <- plot_pca(tc_norm, plot_labels = FALSE,
                   plot_title = "PCA - Cell type")
tc_pca$plot

tc_pca_nosize <- plot_pca(tc_norm, plot_labels = FALSE)
tc_pca_nosize$plot

write.csv(tc_pca$table, file = "coords/tc_donor_pca_coords.csv")
tc_cf_norm <- set_expt_batches(tc_norm, fact = "visitnumber")
## 
##  3  2  1 
## 51 50 83
tc_cf_corheat <- plot_corheat(tc_cf_norm, plot_title = "Heirarchical clustering:
         cell types")
tc_cf_corheat$plot

tc_cf_disheat <- plot_disheat(tc_cf_norm, plot_title = "Heirarchical clustering:
         cell types")
tc_cf_disheat$plot

5.3 Figure 1B: Transcriptomic profiles of primary innate cells

A potential figure legend for the following images might include:

The observed counts per gene for all of the clinical samples were filtered, log transformed, cpm converted, and quantile normalized. The colors were defined by cell types and shapes by patient visit. When the first two principle components were plotted, clustering was observed by cell type. The biopsy samples were significantly different from the innate immune cell types.

fig1v2_norm <- normalize_expt(tc_type, transform = "log2",
                              convert = "cpm", norm = "quant", filter = TRUE)
## Removing 5633 low-count genes (14290 remaining).
## transform_counts: Found 675 values equal to 0, adding 1 to the matrix.
fig1v2_pca <- plot_pca(fig1v2_norm, cis = FALSE)
fig1v2_pca$plot

6 Compare samples by clinic

Spoiler alert: This section will eventually suggest pretty strongly that we will not easily be able to use the Cali samples. Thus, after finishing it, we will likely exclude those samples.

Take a moment to view the biopsy samples. We separated them by clinic (Cali or Tumaco), and this view of the samples is the only one which does not suggest a strong difference between the two clinics. However, it also suggests that the biopsy samples will not prove very helpful.

6.1 Biopsies by clinic

tc_biopsies_norm <- normalize_expt(tc_biopsies, transform = "log2",
                                   convert = "cpm", norm = "quant", filter = TRUE)
## Removing 6315 low-count genes (13608 remaining).
## transform_counts: Found 206 values equal to 0, adding 1 to the matrix.
tc_biopsies_pca <- plot_pca(tc_biopsies_norm, plot_labels = FALSE)
tc_biopsies_pca$plot

tc_biopsies_nb <- normalize_expt(tc_biopsies, transform = "log2",
                                 convert = "cpm", batch = "svaseq", filter = TRUE)
## Removing 6315 low-count genes (13608 remaining).
## Setting 290 low elements to zero.
## transform_counts: Found 290 values equal to 0, adding 1 to the matrix.
tc_biopsies_nb_pca <- plot_pca(tc_biopsies_nb, plot_labels = FALSE)
tc_biopsies_nb_pca$plot

6.2 Patient Race and clinic?

Here is the relevant field for ethnicity from the codebook:

1 Afrocolombiana 2 Indígena 3 Mestiza 4 Blanca 5 Mulata 6 Otra 8 NO DATO

6.2.1 All samples, both clinics

etnia_expt <- set_expt_conditions(tc_valid, fact = "clinic_etnia") %>%
  set_expt_colors(color_choices[["clinic_etnia"]])
## 
##    Cali_afrocol   Cali_indigena    Cali_mestiza  Tumaco_afrocol Tumaco_indigena  Tumaco_mestiza 
##              15              27              19              76              19              28
etnia_norm <- normalize_expt(etnia_expt, transform = "log2", convert = "cpm",
                             filter = TRUE, norm = "quant")
## Removing 5633 low-count genes (14290 remaining).
## transform_counts: Found 675 values equal to 0, adding 1 to the matrix.
plot_pca(etnia_norm)$plot
## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure

## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure

etnia_nb <- normalize_expt(etnia_expt, transform = "log2", convert = "cpm",
                             filter = TRUE, batch = "svaseq")
## Removing 5633 low-count genes (14290 remaining).
## Setting 26373 low elements to zero.
## transform_counts: Found 26373 values equal to 0, adding 1 to the matrix.
plot_pca(etnia_nb)$plot

6.2.1.1 Only Tumaco

t_etnia_expt <- set_expt_conditions(t_clinical, fact = "etnia") %>%
  set_expt_colors(color_choices[["ethnicity"]])
## 
##  afrocol indigena  mestiza 
##       76       19       28
t_etnia_norm <- normalize_expt(t_etnia_expt, transform = "log2", convert = "cpm",
                               filter = TRUE, norm = "quant")
## Removing 5774 low-count genes (14149 remaining).
## transform_counts: Found 299 values equal to 0, adding 1 to the matrix.
plot_pca(t_etnia_norm)$plot

t_etnia_nb <- normalize_expt(t_etnia_expt, transform = "log2", convert = "cpm",
                             filter = TRUE, batch = "svaseq")
## Removing 5774 low-count genes (14149 remaining).
## Setting 15817 low elements to zero.
## transform_counts: Found 15817 values equal to 0, adding 1 to the matrix.
plot_pca(t_etnia_nb)$plot

6.2.2 Biopsy samples, both clinics.

tc_bp_ec <- set_expt_conditions(tc_biopsies, fact = "clinic_etnia") %>%
  set_expt_colors(color_choices[["clinic_etnia"]])
## 
##    Cali_afrocol   Cali_indigena    Cali_mestiza  Tumaco_afrocol Tumaco_indigena  Tumaco_mestiza 
##               1               1               2               8               2               4
etnia_bp_norm <- normalize_expt(tc_bp_ec, transform = "log2", convert = "cpm",
                                filter = TRUE, norm = "quant")
## Removing 6315 low-count genes (13608 remaining).
## transform_counts: Found 206 values equal to 0, adding 1 to the matrix.
plot_pca(etnia_bp_norm)$plot

6.2.2.1 Biopsy samples, Tumaco.

t_bp_ec <- set_expt_conditions(tc_biopsies, fact = "etnia") %>%
  set_expt_colors(color_choices[["ethnicity"]])
## 
##  afrocol indigena  mestiza 
##        9        3        6
t_etnia_bp_norm <- normalize_expt(t_bp_ec, transform = "log2", convert = "cpm",
                                  filter = TRUE, norm = "quant")
## Removing 6315 low-count genes (13608 remaining).
## transform_counts: Found 206 values equal to 0, adding 1 to the matrix.
plot_pca(t_etnia_bp_norm)$plot

I think there are not enough samples to try sva with this.

6.2.3 Eosinophil samples, both clinics.

tc_eo_ec <- set_expt_conditions(tc_eosinophils, fact = "clinic_etnia") %>%
  set_expt_colors(color_choices[["clinic_etnia"]])
## 
##    Cali_afrocol   Cali_indigena    Cali_mestiza  Tumaco_afrocol Tumaco_indigena  Tumaco_mestiza 
##               2               8               5              14               5               7
etnia_eo_norm <- normalize_expt(tc_eo_ec, transform = "log2", convert = "cpm",
                                filter = TRUE, norm = "quant")
## Removing 9059 low-count genes (10864 remaining).
## transform_counts: Found 5 values equal to 0, adding 1 to the matrix.
plot_pca(etnia_eo_norm)$plot

6.2.3.1 Eosinophil samples, Tumaco.

t_eo_ec <- set_expt_conditions(t_eosinophils, fact = "etnia") %>%
  set_expt_colors(color_choices[["ethnicity"]])
## 
##  afrocol indigena  mestiza 
##       14        5        7
t_etnia_eo_norm <- normalize_expt(t_eo_ec, transform = "log2", convert = "cpm",
                                filter = TRUE, norm = "quant")
## Removing 9393 low-count genes (10530 remaining).
## transform_counts: Found 1 values equal to 0, adding 1 to the matrix.
plot_pca(t_etnia_eo_norm)$plot

6.2.4 Monocyte samples, both clinics.

tc_mo_ec <- set_expt_conditions(tc_monocytes, fact = "clinic_etnia") %>%
  set_expt_colors(color_choices[["clinic_etnia"]])
## 
##    Cali_afrocol   Cali_indigena    Cali_mestiza  Tumaco_afrocol Tumaco_indigena  Tumaco_mestiza 
##               6               9               6              27               6               9
etnia_mo_norm <- normalize_expt(tc_mo_ec, transform = "log2", convert = "cpm",
                                filter = TRUE, norm = "quant")
## Removing 8819 low-count genes (11104 remaining).
## transform_counts: Found 12 values equal to 0, adding 1 to the matrix.
plot_pca(etnia_mo_norm)$plot

etnia_mo_nb <- normalize_expt(tc_mo_ec, transform = "log2", convert = "cpm",
                              filter = TRUE, batch = "svaseq")
## Removing 8819 low-count genes (11104 remaining).
## Setting 1580 low elements to zero.
## transform_counts: Found 1580 values equal to 0, adding 1 to the matrix.
plot_pca(etnia_mo_nb)$plot

6.2.4.1 Monocyte samples, Tumaco.

t_mo_ec <- set_expt_conditions(t_monocytes, fact = "etnia") %>%
  set_expt_colors(color_choices[["ethnicity"]])
## 
##  afrocol indigena  mestiza 
##       27        6        9
t_etnia_mo_norm <- normalize_expt(t_mo_ec, transform = "log2", convert = "cpm",
                                  filter = TRUE, norm = "quant")
## Removing 9064 low-count genes (10859 remaining).
## transform_counts: Found 5 values equal to 0, adding 1 to the matrix.
plot_pca(t_etnia_mo_norm)$plot

t_etnia_mo_nb <- normalize_expt(t_mo_ec, transform = "log2", convert = "cpm",
                                filter = TRUE, batch = "svaseq")
## Removing 9064 low-count genes (10859 remaining).
## Setting 755 low elements to zero.
## transform_counts: Found 755 values equal to 0, adding 1 to the matrix.
plot_pca(t_etnia_mo_nb)$plot

6.2.5 Neutrophil samples, both clinics.

tc_ne_ec <- set_expt_conditions(tc_neutrophils, fact = "clinic_etnia") %>%
    set_expt_colors(color_choices[["clinic_etnia"]])
## 
##    Cali_afrocol   Cali_indigena    Cali_mestiza  Tumaco_afrocol Tumaco_indigena  Tumaco_mestiza 
##               6               9               6              27               6               8
etnia_ne_norm <- normalize_expt(tc_ne_ec, transform = "log2", convert = "cpm",
                                filter = TRUE, norm = "quant")
## Removing 10681 low-count genes (9242 remaining).
## transform_counts: Found 1 values equal to 0, adding 1 to the matrix.
plot_pca(etnia_ne_norm)$plot

6.2.5.1 Neutrophil samples, Tumaco.

t_ne_ec <- set_expt_conditions(t_neutrophils, fact = "etnia") %>%
    set_expt_colors(color_choices[["ethnicity"]])
## 
##  afrocol indigena  mestiza 
##       27        6        8
t_etnia_ne_norm <- normalize_expt(t_ne_ec, transform = "log2", convert = "cpm",
                                  filter = TRUE, norm = "quant")
## Removing 10824 low-count genes (9099 remaining).
## transform_counts: Found 1 values equal to 0, adding 1 to the matrix.
plot_pca(t_etnia_ne_norm)$plot

6.3 Sex

sex_expt <- set_expt_conditions(tc_valid, fact = "sex") %>%
  set_expt_colors(color_choices[["sex"]])
## 
## female   male 
##     28    156
sex_norm <- normalize_expt(sex_expt, transform = "log2", convert = "cpm",
                           filter = TRUE, norm = "quant")
## Removing 5633 low-count genes (14290 remaining).
## transform_counts: Found 675 values equal to 0, adding 1 to the matrix.
plot_pca(sex_norm)$plot

sex_nb <- normalize_expt(sex_expt, transform = "log2", convert = "cpm",
                         filter = TRUE, batch = "svaseq")
## Removing 5633 low-count genes (14290 remaining).
## Setting 26263 low elements to zero.
## transform_counts: Found 26263 values equal to 0, adding 1 to the matrix.
plot_pca(sex_nb)$plot

6.4 Sex and clinic

6.4.1 All samples, both clinics

clinic_sex_expt <- set_expt_conditions(tc_valid, fact = "clinic_sex") %>%
  set_expt_colors(color_choices[["clinic_sex"]])
## 
##   Cali_female     Cali_male Tumaco_female   Tumaco_male 
##             6            55            22           101
clinic_sex_norm <- normalize_expt(clinic_sex_expt, transform = "log2", convert = "cpm",
                                  filter = TRUE, norm = "quant")
## Removing 5633 low-count genes (14290 remaining).
## transform_counts: Found 675 values equal to 0, adding 1 to the matrix.
plot_pca(clinic_sex_norm)$plot

clinic_sex_nb <- normalize_expt(clinic_sex_expt, transform = "log2", convert = "cpm",
                             filter = TRUE, batch = "svaseq")
## Removing 5633 low-count genes (14290 remaining).
## Setting 28982 low elements to zero.
## transform_counts: Found 28982 values equal to 0, adding 1 to the matrix.
plot_pca(clinic_sex_nb)$plot

6.4.2 Biopsy samples, both clinics.

tc_bp_sc <- set_expt_conditions(tc_biopsies, fact = "clinic_sex") %>%
  set_expt_colors(color_choices[["clinic_sex"]])
## 
##     Cali_male Tumaco_female   Tumaco_male 
##             4             3            11
## Warning in set_expt_colors(., color_choices[["clinic_sex"]]): Colors for the following categories are not being used: Cali_female.
clinic_sex_bp_norm <- normalize_expt(tc_bp_sc, transform = "log2", convert = "cpm",
                                filter = TRUE, norm = "quant")
## Removing 6315 low-count genes (13608 remaining).
## transform_counts: Found 206 values equal to 0, adding 1 to the matrix.
plot_pca(clinic_sex_bp_norm)$plot

I think there are not enough samples to try sva with this.

6.4.3 Eosinophil samples, both clinics.

tc_eo_sc <- set_expt_conditions(tc_eosinophils, fact = "clinic_sex") %>%
  set_expt_colors(color_choices[["clinic_sex"]])
## 
##   Cali_female     Cali_male Tumaco_female   Tumaco_male 
##             2            13             5            21
clinic_sex_eo_norm <- normalize_expt(tc_eo_sc, transform = "log2", convert = "cpm",
                                     filter = TRUE, norm = "quant")
## Removing 9059 low-count genes (10864 remaining).
## transform_counts: Found 5 values equal to 0, adding 1 to the matrix.
plot_pca(clinic_sex_eo_norm)$plot

6.4.4 Monocyte samples, both clinics.

tc_mo_sc <- set_expt_conditions(tc_monocytes, fact = "clinic_sex") %>%
  set_expt_colors(color_choices[["clinic_sex"]])
## 
##   Cali_female     Cali_male Tumaco_female   Tumaco_male 
##             2            19             7            35
etnia_mo_norm <- normalize_expt(tc_mo_sc, transform = "log2", convert = "cpm",
                                filter = TRUE, norm = "quant")
## Removing 8819 low-count genes (11104 remaining).
## transform_counts: Found 12 values equal to 0, adding 1 to the matrix.
plot_pca(etnia_mo_norm)$plot

etnia_mo_nb <- normalize_expt(tc_mo_sc, transform = "log2", convert = "cpm",
                              filter = TRUE, batch = "svaseq")
## Removing 8819 low-count genes (11104 remaining).
## Setting 1577 low elements to zero.
## transform_counts: Found 1577 values equal to 0, adding 1 to the matrix.
plot_pca(etnia_mo_nb)$plot

6.4.5 Neutrophil samples, both clinics.

tc_ne_sc <- set_expt_conditions(tc_neutrophils, fact = "clinic_sex") %>%
    set_expt_colors(color_choices[["clinic_sex"]])
## 
##   Cali_female     Cali_male Tumaco_female   Tumaco_male 
##             2            19             7            34
etnia_ne_norm <- normalize_expt(tc_ne_sc, transform = "log2", convert = "cpm",
                                filter = TRUE, norm = "quant")
## Removing 10681 low-count genes (9242 remaining).
## transform_counts: Found 1 values equal to 0, adding 1 to the matrix.
plot_pca(etnia_ne_norm)$plot

6.5 Eosinophils by clinic

In contrast, the Eosinophil samples do have significant amounts of variance which discriminates the two clinics. At the time of this writing, there are fewer eosinophil samples than monocytes nor neutrophils; as a result there are no samples which failed from Cali. This is somewhat limiting is we wish to look for differences between the cure and fail samples which came from the two clinics.

tc_eosinophils_norm <- normalize_expt(tc_eosinophils, transform = "log2",
                                      convert = "cpm", norm = "quant", filter = TRUE)
## Removing 9059 low-count genes (10864 remaining).
## transform_counts: Found 5 values equal to 0, adding 1 to the matrix.
tc_eosinophils_pca <- plot_pca(tc_eosinophils_norm, plot_labels = FALSE)
tc_eosinophils_pca$plot

tc_eosinophils_nb <- normalize_expt(tc_eosinophils, transform = "log2",
                                    convert = "cpm", batch = "svaseq", filter = TRUE)
## Removing 9059 low-count genes (10864 remaining).
## Setting 1043 low elements to zero.
## transform_counts: Found 1043 values equal to 0, adding 1 to the matrix.
tc_eosinophils_nb_pca <- plot_pca(tc_eosinophils_nb, plot_labels = FALSE)
tc_eosinophils_nb_pca$plot

6.6 Monocytes by clinic

In contrast with the eosinophil samples, we have one patient’s monocyte and neutrophil samples which did not cure. As we will see, there is one person from Cali who did not cure, this person is not different with respect to tracscriptome than the other people from Cali.

tc_monocytes_norm <- normalize_expt(tc_monocytes, transform = "log2",
                                       convert = "cpm", norm = "quant", filter = TRUE)
## Removing 8819 low-count genes (11104 remaining).
## transform_counts: Found 12 values equal to 0, adding 1 to the matrix.
tc_monocytes_pca <- plot_pca(tc_monocytes_norm, plot_labels = FALSE)
tc_monocytes_pca$plot

tc_monocytes_nb <- normalize_expt(tc_monocytes, transform = "log2",
                                  convert = "cpm", batch = "svaseq", filter = TRUE)
## Removing 8819 low-count genes (11104 remaining).
## Setting 1447 low elements to zero.
## transform_counts: Found 1447 values equal to 0, adding 1 to the matrix.
tc_monocytes_nb_pca <- plot_pca(tc_monocytes_nb, plot_labels = FALSE)
tc_monocytes_nb_pca$plot

6.7 Neutrophils by clinic

Finally, that same one person does appear to be different than the others from Cali.

tc_neutrophils_norm <- normalize_expt(tc_neutrophils, transform = "log2",
                                      convert = "cpm", norm = "quant", filter = TRUE)
## Removing 10681 low-count genes (9242 remaining).
## transform_counts: Found 1 values equal to 0, adding 1 to the matrix.
tc_neutrophils_pca <- plot_pca(tc_neutrophils_norm, plot_labels = FALSE)
tc_neutrophils_pca$plot

tc_neutrophils_nb <- normalize_expt(tc_neutrophils, transform = "log2",
                                    convert = "cpm", batch = "svaseq", filter = TRUE)
## Removing 10681 low-count genes (9242 remaining).
## Setting 1541 low elements to zero.
## transform_counts: Found 1541 values equal to 0, adding 1 to the matrix.
tc_neutrophils_nb_pca <- plot_pca(tc_neutrophils_nb, plot_labels = FALSE)
tc_neutrophils_nb_pca$plot

6.8 PCA: Compare clinics

Now that we have these various subsets, perform an explicit comparison of the samples which came from the two clinics.

tc_clinic_type <- tc_valid %>%
  set_expt_conditions(fact = "clinic") %>%
  set_expt_batches(fact = "typeofcells")
## 
##   Cali Tumaco 
##     61    123 
## 
##      biopsy eosinophils   monocytes neutrophils 
##          18          41          63          62
tc_clinic_type_norm <- normalize_expt(tc_clinic_type, transform = "log2", convert = "cpm",
                                      norm = "quant", filter = TRUE)
## Removing 5633 low-count genes (14290 remaining).
## transform_counts: Found 675 values equal to 0, adding 1 to the matrix.
tc_clinic_type_pca <- plot_pca(tc_clinic_type_norm)
tc_clinic_type_pca$plot

tc_clinic_type_nb <- normalize_expt(tc_clinic_type, transform = "log2", convert = "cpm",
                                    batch = "svaseq", filter = TRUE)
## Removing 5633 low-count genes (14290 remaining).
## Setting 31271 low elements to zero.
## transform_counts: Found 31271 values equal to 0, adding 1 to the matrix.
tc_clinic_type_nb_pca <- plot_pca(tc_clinic_type_nb)
tc_clinic_type_nb_pca$plot

tc_clinical_norm <- sm(normalize_expt(tc_clinical, filter = "simple", transform = "log2",
                                      norm = "quant", convert = "cpm"))
clinical_pca <- plot_pca(tc_clinical_norm, plot_labels = FALSE,
                         cis = NULL,
                         plot_title = "PCA - clinical samples")
clinical_pca$plot

tc_clinical_nb <- normalize_expt(tc_clinical, filter = "simple", transform = "log2",
                                 batch = "svaseq", convert = "cpm")
## Removing 1872 low-count genes (18051 remaining).
## Setting 156640 low elements to zero.
## transform_counts: Found 156640 values equal to 0, adding 1 to the matrix.
tc_clinical_nb_pca <- plot_pca(tc_clinical_nb)
tc_clinical_nb_pca$plot

clinical_pca_info <- pca_information(
    tc_clinical_norm, plot_pcas = TRUE, num_components = 30,
    expt_factors = c("visitnumber", "typeofcells", "finaloutcome",
                   "clinic", "donor"))
clinical_pca_info$anova_neglogp_heatmap

clinical_pca_info$pca_plots$PC4_PC7
## Warning: ggrepel: 114 unlabeled data points (too many overlaps). Consider increasing max.overlaps

clinical_scores <- pca_highscores(tc_clinical_norm)
clinical_scores[["highest"]][,"Comp.4"]
##  [1] "15.73:ENSG00000168329" "14.96:ENSG00000133574" "14.03:ENSG00000204389" "14.02:ENSG00000171115" "13.89:ENSG00000163563"
##  [6] "13.47:ENSG00000179144" "13.17:ENSG00000004799" "13.11:ENSG00000180871" "13:ENSG00000172086"    "12.77:ENSG00000091106"
## [11] "12.61:ENSG00000121858" "12.37:ENSG00000123405" "12.36:ENSG00000175538" "12.04:ENSG00000138449" "12.01:ENSG00000109971"
## [16] "11.84:ENSG00000165118" "11.6:ENSG00000088986"  "11.59:ENSG00000135828" "11.37:ENSG00000038274" "11.17:ENSG00000130150"
test_factors <- c("visitnumber", "typeofcells", "finaloutcome",
                  "clinic", "sex", "etnia")
clinical_varpart <- simple_varpart(tc_clinical, factors = test_factors)
## Loading required package: Matrix
## 
## Attaching package: 'Matrix'
## The following object is masked from 'package:S4Vectors':
## 
##     expand
## 
## Total:197 s

6.9 Iterative SVA followed by PCA

Another way to explore the effect of SVA is to iteratively increase the number of SVs removed by it and look at some simple plots of the resulting data. Ideally, this should complement the methods employed by Theresa.

first <- normalize_expt(tc_clinical, transform = "log2", convert = "cpm",
                        filter = TRUE, batch = "svaseq", surrogates = 1)
## Removing 5633 low-count genes (14290 remaining).
## Setting 192779 low elements to zero.
## transform_counts: Found 192779 values equal to 0, adding 1 to the matrix.
first_info <- pca_information(
    first, plot_pcas = TRUE, num_components = 30,
    expt_factors = c("visitnumber", "typeofcells",
                     "finaloutcome", "clinic"))
first_info$anova_neglogp_heatmap

first_info$pca_plots[["PC1_PC2"]]
## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure

## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure
## Warning: ggrepel: 176 unlabeled data points (too many overlaps). Consider increasing max.overlaps

second <- normalize_expt(tc_clinical, transform = "log2", convert = "cpm",
                         filter = TRUE, batch = "svaseq", surrogates = 2) %>%
  set_expt_batches(fact = "clinic")
## Removing 5633 low-count genes (14290 remaining).
## Setting 31218 low elements to zero.
## transform_counts: Found 31218 values equal to 0, adding 1 to the matrix.
## 
##   Cali Tumaco 
##     61    123
second_info <- pca_information(
    second, plot_pcas = TRUE, num_components = 30,
    expt_factors = c("visitnumber", "typeofcells",
                     "finaloutcome", "clinic"))
second_info$anova_neglogp_heatmap

third <- normalize_expt(tc_clinical, transform = "log2", convert = "cpm",
                        filter = TRUE, batch = "svaseq", surrogates = 3) %>%
  set_expt_batches(fact = "clinic")
## Removing 5633 low-count genes (14290 remaining).
## Setting 27267 low elements to zero.
## transform_counts: Found 27267 values equal to 0, adding 1 to the matrix.
## 
##   Cali Tumaco 
##     61    123
third_info <- pca_information(
    third, plot_pcas = TRUE, num_components = 30,
    expt_factors = c("visitnumber", "typeofcells",
                     "finaloutcome", "clinic"))
third_info$anova_neglogp_heatmap

fourth <- normalize_expt(tc_clinical, transform = "log2", convert = "cpm",
                         filter = TRUE, batch = "svaseq", surrogates = 4) %>%
  set_expt_batches(fact = "clinic")
## Removing 5633 low-count genes (14290 remaining).
## Setting 25946 low elements to zero.
## transform_counts: Found 25946 values equal to 0, adding 1 to the matrix.
## 
##   Cali Tumaco 
##     61    123
fourth_info <- pca_information(
    fourth, plot_pcas = TRUE, num_components = 30,
    expt_factors = c("visitnumber", "typeofcells",
                     "finaloutcome", "clinic"))
fourth_info$anova_neglogp_heatmap

fourth_info[["pca_plots"]][["PC1_PC2"]]
## Warning: ggrepel: 109 unlabeled data points (too many overlaps). Consider increasing max.overlaps

fifth <- normalize_expt(tc_clinical, transform = "log2", convert = "cpm",
                        filter = TRUE, batch = "svaseq", surrogates = 5) %>%
  set_expt_batches(fact = "clinic")
## Removing 5633 low-count genes (14290 remaining).
## Setting 27033 low elements to zero.
## transform_counts: Found 27033 values equal to 0, adding 1 to the matrix.
## 
##   Cali Tumaco 
##     61    123
fifth_info <- pca_information(
    fifth, plot_pcas = TRUE, num_components = 30,
    expt_factors = c("visitnumber", "typeofcells",
                     "finaloutcome", "clinic"))
fifth_info$anova_neglogp_heatmap

fifth_info[["pca_plots"]][["PC1_PC12"]]
## Warning: ggrepel: 112 unlabeled data points (too many overlaps). Consider increasing max.overlaps

sixth <- normalize_expt(tc_clinical, transform = "log2", convert = "cpm",
                        filter = TRUE, batch="svaseq", surrogates = 6) %>%
  set_expt_batches(fact = "clinic")
## Removing 5633 low-count genes (14290 remaining).
## Setting 23957 low elements to zero.
## transform_counts: Found 23957 values equal to 0, adding 1 to the matrix.
## 
##   Cali Tumaco 
##     61    123
sixth_info <- pca_information(
    sixth, plot_pcas = TRUE, num_components = 30,
    expt_factors = c("visitnumber", "typeofcells",
                     "finaloutcome", "clinic"))
sixth_info$anova_neglogp_heatmap

seventh <- normalize_expt(tc_clinical, transform = "log2", convert = "cpm",
                          filter = TRUE, batch = "svaseq", surrogates = 7) %>%
  set_expt_batches(fact = "clinic")
## Removing 5633 low-count genes (14290 remaining).
## Setting 24476 low elements to zero.
## transform_counts: Found 24476 values equal to 0, adding 1 to the matrix.
## 
##   Cali Tumaco 
##     61    123
seventh_info <- pca_information(
    seventh, plot_pcas = TRUE, num_components = 30,
    expt_factors = c("visitnumber", "typeofcells",
                     "finaloutcome", "clinic"))
seventh_info$anova_neglogp_heatmap

eighth <- normalize_expt(tc_clinical, transform = "log2", convert = "cpm",
                        filter = TRUE, batch = "svaseq", surrogates = 8)
## Removing 5633 low-count genes (14290 remaining).
## Setting 24108 low elements to zero.
## transform_counts: Found 24108 values equal to 0, adding 1 to the matrix.
eighth_info <- pca_information(
    eighth, plot_pcas = TRUE, num_components = 30,
    expt_factors = c("visitnumber", "typeofcells",
                     "finaloutcome", "clinic"))
eighth_info$anova_neglogp_heatmap

## Mostly running twice to make sure that reordering the factors does not affect the end result.
tc_varpart <- simple_varpart(
  tc_clinical, factors = c("visitnumber", "typeofcells",
                           "finaloutcome", "clinic", "sex", "etnia"))
## 
## Total:202 s
tc_varpart[["partition_plot"]]

tc_varpartv2 <- simple_varpart(
  tc_clinical, factors = c("donor", "visitnumber", "typeofcells",
                           "finaloutcome"))
## 
## Total:151 s
tc_varpartv2[["partition_plot"]]

## Summarize: Collect Tumaco sample numbers.

At least in theory, everything which follows will be using the above ‘clinical’ data structure. Thus, let us count it up and get a sense of what we will work with.

table(pData(t_clinical)$drug)
## 
## antimony 
##      123
table(pData(t_clinical)$clinic)
## 
## Tumaco 
##    123
table(pData(t_clinical)$finaloutcome)
## 
##    cure failure 
##      67      56
table(pData(t_clinical)$typeofcells)
## 
##      biopsy eosinophils   monocytes neutrophils 
##          14          26          42          41
table(pData(t_clinical)$visit)
## 
##  3  2  1 
## 34 35 54
summary(as.numeric(pData(t_clinical)$eb_lc_tiempo_evolucion))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    2.00    4.00    4.00    7.03    8.00   21.00
summary(as.numeric(pData(t_clinical)$eb_lc_tto_mcto_glucan_dosis))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##      13      14      17      17      20      20
summary(as.numeric(pData(t_clinical)$v3_lc_ejey_lesion_mm_1))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     3.0     7.2    31.3   389.6   999.0   999.0
summary(as.numeric(pData(t_clinical)$v3_lc_lesion_area_1))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##      46     222     999    1089     999    5055
summary(as.numeric(pData(t_clinical)$v3_lc_ejex_ulcera_mm_1))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       0       0       0     383     999     999
table(pData(t_clinical)$eb_lc_sexo)
## 
##   1   2 
## 101  22
table(pData(t_clinical)$eb_lc_etnia)
## 
##  1  2  3 
## 76 19 28
summary(as.numeric(pData(t_clinical)$edad))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    18.0    23.0    25.0    28.5    34.0    51.0
table(pData(t_clinical)$eb_lc_peso)
## 
##  53.9  57.9  58.1  58.3  58.6    59  59.6    62    63  69.4    77    78  79.2  83.3  83.4  86.4  93.3 100.8 
##     9     2     7    10     3     8     1     6     6    10     9    10    10     4    10     9     7     2
table(pData(t_clinical)$eb_lc_estatura)
## 
## 152 154 158 159 163 164 165 166 172 173 174 176 177 182 183 
##   1  10  15   2   9  15  12  10  10   4   8   1   7   9  10
length(unique(pData(t_clinical)[["codigo_paciente"]]))
## [1] 19
only_cure <- pData(t_clinical)[["finaloutcome"]] == "cure"
c_meta <- pData(t_clinical)[only_cure, ]
length(unique(c_meta[["codigo_paciente"]]))
## [1] 10
only_fail <- pData(t_clinical)[["finaloutcome"]] == "failure"
f_meta <- pData(t_clinical)[only_fail, ]
length(unique(f_meta[["codigo_paciente"]]))
## [1] 9

6.10 Visualize: Repeat plots using only the Tumaco samples

6.10.1 All samples

t_clinical_nobiop_norm <- normalize_expt(t_clinical_nobiop, filter = TRUE, norm = "quant",
                                         convert = "cpm", transform = "log2")
## Removing 8016 low-count genes (11907 remaining).
## transform_counts: Found 93 values equal to 0, adding 1 to the matrix.
t_clinical_nobiop_pca <- plot_pca(t_clinical_nobiop_norm, plot_labels = FALSE)
t_clinical_nobiop_pca$plot

t_clinical_nobiop_nb <- normalize_expt(t_clinical_nobiop, filter = TRUE, convert = "cpm",
                                       transform = "log2", batch = "svaseq")
## Removing 8016 low-count genes (11907 remaining).
## Setting 9578 low elements to zero.
## transform_counts: Found 9578 values equal to 0, adding 1 to the matrix.
t_clinical_nobiop_nb_pca <- plot_pca(t_clinical_nobiop_nb, plot_labels = FALSE)
t_clinical_nobiop_nb_pca$plot

Now we have a new, smaller set of primary samples which are categorized by cell type.

6.10.2 Visualize: Biopsy samples only Tumaco

Sadly, the biopsy samples remain basically impenetrable. This makes me sad, I think it would be particularly nice if we could judge cure/fail from a visit 1 biopsy.

t_biopsies_norm <- normalize_expt(t_biopsies, transform = "log2", convert = "cpm",
  norm = "quant", filter = TRUE)
## Removing 6417 low-count genes (13506 remaining).
## transform_counts: Found 136 values equal to 0, adding 1 to the matrix.
t_biopsies_pca <- plot_pca(t_biopsies_norm,
  plot_labels = FALSE)
t_biopsies_pca$plot

t_biopsies_nb <- normalize_expt(t_biopsies, transform = "log2", convert = "cpm",
                                batch = "svaseq", filter = TRUE)
## Removing 6417 low-count genes (13506 remaining).
## Setting 145 low elements to zero.
## transform_counts: Found 145 values equal to 0, adding 1 to the matrix.
t_biopsies_nb_pca <- plot_pca(t_biopsies_nb, plot_labels = FALSE)
t_biopsies_nb_pca$plot

6.10.3 Visualize: Monocyte samples only Tumaco

In contrast, I suspect that we can get meaningful data from the other cell types. The monocyte samples are still a bit messy.

t_monocyte_norm <- normalize_expt(t_monocytes, transform = "log2", convert = "cpm",
                                  norm = "quant", filter = TRUE)
## Removing 9064 low-count genes (10859 remaining).
## transform_counts: Found 5 values equal to 0, adding 1 to the matrix.
t_monocyte_pca <- plot_pca(t_monocyte_norm,
  plot_labels = FALSE)
t_monocyte_pca$plot

t_monocyte_nb <- normalize_expt(t_monocytes, transform = "log2", convert = "cpm",
                                batch = "svaseq", filter = TRUE)
## Removing 9064 low-count genes (10859 remaining).
## Setting 730 low elements to zero.
## transform_counts: Found 730 values equal to 0, adding 1 to the matrix.
t_monocyte_nb_pca <- plot_pca(t_monocyte_nb, plot_labels = FALSE)
t_monocyte_nb_pca$plot

6.10.4 Visualize: Neutrophil samples only Tumaco

Well, really all the cell types remain pretty messy. There is always at least one person in one visit or another who really does not fit well with the rest of the cohort.

t_neutrophil_norm <- normalize_expt(t_neutrophils, transform = "log2", convert = "cpm",
                                    norm = "quant", filter = TRUE)
## Removing 10824 low-count genes (9099 remaining).
## transform_counts: Found 1 values equal to 0, adding 1 to the matrix.
t_neutrophil_pca <- plot_pca(t_neutrophil_norm,
                             plot_labels = FALSE)
t_neutrophil_pca$plot

t_neutrophil_nb <- normalize_expt(t_neutrophils, transform = "log2", convert = "cpm",
                                     batch = "svaseq", filter = TRUE)
## Removing 10824 low-count genes (9099 remaining).
## Setting 750 low elements to zero.
## transform_counts: Found 750 values equal to 0, adding 1 to the matrix.
t_neutrophil_nb_pca <- plot_pca(t_neutrophil_nb, plot_labels = FALSE)
t_neutrophil_nb_pca$plot

6.10.5 Visualize: Eosinophil samples only Tumaco

t_eosinophil_norm <- normalize_expt(t_eosinophils, transform = "log2", convert = "cpm",
                                    norm = "quant", filter = TRUE)
## Removing 9393 low-count genes (10530 remaining).
## transform_counts: Found 1 values equal to 0, adding 1 to the matrix.
t_eosinophil_pca <- plot_pca(t_eosinophil_norm,
                             plot_labels = FALSE)
t_eosinophil_pca$plot

t_eosinophil_nb <- normalize_expt(t_eosinophils, transform = "log2", convert = "cpm",
                                  batch = "svaseq", filter = TRUE)
## Removing 9393 low-count genes (10530 remaining).
## Setting 325 low elements to zero.
## transform_counts: Found 325 values equal to 0, adding 1 to the matrix.
t_eosinophil_nb_pca <- plot_pca(t_eosinophil_nb, plot_labels = FALSE)
t_eosinophil_nb_pca$plot
## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure

## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure

6.10.6 Visualize: Look at Cell types C/F by visit

6.10.6.1 Monocytes, Visit 1

t_monocyte_v1 <- subset_expt(t_monocytes, subset = "visitnumber=='1'")
## subset_expt(): There were 42, now there are 16 samples.
t_monocyte_v1_norm <- normalize_expt(t_monocyte_v1, norm = "quant", convert = "cpm",
                                     transform = "log2", filter = TRUE)
## Removing 9444 low-count genes (10479 remaining).
## transform_counts: Found 1 values equal to 0, adding 1 to the matrix.
t_monocyte_v1_pca <- plot_pca(t_monocyte_v1_norm, plot_labels = FALSE)
t_monocyte_v1_pca$plot

t_monocyte_v1_nb <- normalize_expt(t_monocyte_v1, convert = "cpm",
                                   transform = "log2", filter = TRUE, batch = "svaseq")
## Removing 9444 low-count genes (10479 remaining).
## Setting 187 low elements to zero.
## transform_counts: Found 187 values equal to 0, adding 1 to the matrix.
t_monocyte_v1_nb_pca <- plot_pca(t_monocyte_v1_nb, plot_labels = FALSE)
t_monocyte_v1_nb_pca$plot

6.10.6.2 Monocytes Visit 2

t_monocyte_v2 <- subset_expt(t_monocytes, subset = "visitnumber=='2'")
## subset_expt(): There were 42, now there are 13 samples.
t_monocyte_v2_norm <- normalize_expt(t_monocyte_v2, norm = "quant", convert = "cpm",
                                     transform = "log2", filter = TRUE)
## Removing 9403 low-count genes (10520 remaining).
## transform_counts: Found 1 values equal to 0, adding 1 to the matrix.
t_monocyte_v2_pca <- plot_pca(t_monocyte_v2_norm, plot_labels = FALSE)
t_monocyte_v2_pca$plot

t_monocyte_v2_nb <- normalize_expt(t_monocyte_v2, convert = "cpm",
                                   transform = "log2", filter = TRUE, batch = "svaseq")
## Removing 9403 low-count genes (10520 remaining).
## Setting 115 low elements to zero.
## transform_counts: Found 115 values equal to 0, adding 1 to the matrix.
t_monocyte_v2_nb_pca <- plot_pca(t_monocyte_v2_nb, plot_labels = FALSE)
t_monocyte_v2_nb_pca$plot

6.10.6.3 Monocytes Visit 3

t_monocyte_v3 <- subset_expt(t_monocytes, subset = "visitnumber=='3'")
## subset_expt(): There were 42, now there are 13 samples.
t_monocyte_v3_norm <- normalize_expt(t_monocyte_v3, norm = "quant", convert = "cpm",
                                   transform = "log2", filter = TRUE)
## Removing 9549 low-count genes (10374 remaining).
## transform_counts: Found 16 values equal to 0, adding 1 to the matrix.
t_monocyte_v3_pca <- plot_pca(t_monocyte_v3_norm, plot_labels = FALSE)
t_monocyte_v3_pca$plot

t_monocyte_v3_nb <- normalize_expt(t_monocyte_v3, convert = "cpm",
                                   transform = "log2", filter = TRUE, batch = "svaseq")
## Removing 9549 low-count genes (10374 remaining).
## Setting 55 low elements to zero.
## transform_counts: Found 55 values equal to 0, adding 1 to the matrix.
t_monocyte_v3_nb_pca <- plot_pca(t_monocyte_v3_nb, plot_labels = FALSE)
t_monocyte_v3_nb_pca$plot

6.10.6.4 Neutrophils, Visit 1

t_neutrophil_v1 <- subset_expt(t_neutrophils, subset = "visitnumber=='1'")
## subset_expt(): There were 41, now there are 16 samples.
t_neutrophil_v1_norm <- normalize_expt(t_neutrophil_v1, norm = "quant", convert = "cpm",
                                   transform = "log2", filter = TRUE)
## Removing 11208 low-count genes (8715 remaining).
## transform_counts: Found 2 values equal to 0, adding 1 to the matrix.
t_neutrophil_v1_pca <- plot_pca(t_neutrophil_v1_norm, plot_labels = FALSE)
t_neutrophil_v1_pca$plot

t_neutrophil_v1_nb <- normalize_expt(t_neutrophil_v1, convert = "cpm",
                                     transform = "log2", filter = TRUE, batch = "ruvg")
## Removing 11208 low-count genes (8715 remaining).
## Warning in RUVSeq::RUVg(linear_mtrx, ruv_controls, k = chosen_surrogates): The expression matrix does not contain counts.
## Please, pass a matrix of counts (not logged) or set isLog to TRUE to skip the log transformation
## Setting 192 low elements to zero.
## transform_counts: Found 192 values equal to 0, adding 1 to the matrix.
t_neutrophil_v1_nb_pca <- plot_pca(t_neutrophil_v1_nb, plot_labels = FALSE)
t_neutrophil_v1_nb_pca$plot

6.10.6.5 Neutrophils Visit 2

t_neutrophil_v2 <- subset_expt(t_neutrophils, subset = "visitnumber=='2'")
## subset_expt(): There were 41, now there are 13 samples.
t_neutrophil_v2_norm <- normalize_expt(t_neutrophil_v2, norm = "quant", convert = "cpm",
                                       transform = "log2", filter = TRUE)
## Removing 11473 low-count genes (8450 remaining).
## transform_counts: Found 2 values equal to 0, adding 1 to the matrix.
t_neutrophil_v2_pca <- plot_pca(t_neutrophil_v2_norm, plot_labels = FALSE)
t_neutrophil_v2_pca$plot

t_neutrophil_v2_nb <- normalize_expt(t_neutrophil_v2, convert = "cpm",
                                     transform = "log2", filter = TRUE, batch = "svaseq")
## Removing 11473 low-count genes (8450 remaining).
## Setting 78 low elements to zero.
## transform_counts: Found 78 values equal to 0, adding 1 to the matrix.
t_neutrophil_v2_nb_pca <- plot_pca(t_neutrophil_v2_nb, plot_labels = FALSE)
t_neutrophil_v2_nb_pca$plot

6.10.6.6 Neutrophils Visit 3

t_neutrophil_v3 <- subset_expt(t_neutrophils, subset = "visitnumber=='3'")
## subset_expt(): There were 41, now there are 12 samples.
t_neutrophil_v3_norm <- normalize_expt(t_neutrophil_v3, norm = "quant", convert = "cpm",
                                       transform = "log3", filter = TRUE)
## Removing 11420 low-count genes (8503 remaining).
## transform_counts: Found 2 values equal to 0, adding 1 to the matrix.
## Did not recognize the transformation, leaving the table.
##  Recognized transformations include: 'log2', 'log10', 'log'
t_neutrophil_v3_pca <- plot_pca(t_neutrophil_v3_norm, plot_labels = FALSE)
t_neutrophil_v3_pca$plot

t_neutrophil_v3_nb <- normalize_expt(t_neutrophil_v3, convert = "cpm",
                                     transform = "log2", filter = TRUE, batch = "svaseq")
## Removing 11420 low-count genes (8503 remaining).
## Setting 83 low elements to zero.
## transform_counts: Found 83 values equal to 0, adding 1 to the matrix.
t_neutrophil_v3_nb_pca <- plot_pca(t_neutrophil_v3_nb, plot_labels = FALSE)
t_neutrophil_v3_nb_pca$plot

6.10.6.7 Eosinophils, Visit 1

t_eosinophil_v1 <- subset_expt(t_eosinophils, subset = "visitnumber=='1'")
## subset_expt(): There were 26, now there are 8 samples.
t_eosinophil_v1_norm <- normalize_expt(t_eosinophil_v1, norm = "quant", convert = "cpm",
                                   transform = "log2", filter = TRUE)
## Removing 9946 low-count genes (9977 remaining).
## transform_counts: Found 1 values equal to 0, adding 1 to the matrix.
t_eosinophil_v1_pca <- plot_pca(t_eosinophil_v1_norm, plot_labels = FALSE)
t_eosinophil_v1_pca$plot

t_eosinophil_v1_nb <- normalize_expt(t_eosinophil_v1, convert = "cpm",
                                     transform = "log2", filter = TRUE, batch = "svaseq")
## Removing 9946 low-count genes (9977 remaining).
## Setting 57 low elements to zero.
## transform_counts: Found 57 values equal to 0, adding 1 to the matrix.
t_eosinophil_v1_nb_pca <- plot_pca(t_eosinophil_v1_nb, plot_labels = FALSE)
t_eosinophil_v1_nb_pca$plot

6.10.6.8 Eosinophils Visit 2

t_eosinophil_v2 <- subset_expt(t_eosinophils, subset = "visitnumber=='2'")
## subset_expt(): There were 26, now there are 9 samples.
t_eosinophil_v2_norm <- normalize_expt(t_eosinophil_v2, norm = "quant", convert = "cpm",
                                       transform = "log2", filter = TRUE)
## Removing 9808 low-count genes (10115 remaining).
## transform_counts: Found 1 values equal to 0, adding 1 to the matrix.
t_eosinophil_v2_pca <- plot_pca(t_eosinophil_v2_norm, plot_labels = FALSE)
t_eosinophil_v2_pca$plot

t_eosinophil_v2_nb <- normalize_expt(t_eosinophil_v2, convert = "cpm",
                                     transform = "log2", filter = TRUE, batch = "svaseq")
## Removing 9808 low-count genes (10115 remaining).
## Setting 90 low elements to zero.
## transform_counts: Found 90 values equal to 0, adding 1 to the matrix.
t_eosinophil_v2_nb_pca <- plot_pca(t_eosinophil_v2_nb, plot_labels = FALSE)
t_eosinophil_v2_nb_pca$plot

6.10.6.9 Eosinophils Visit 3

t_eosinophil_v3 <- subset_expt(t_eosinophils, subset = "visitnumber=='3'")
## subset_expt(): There were 26, now there are 9 samples.
t_eosinophil_v3_norm <- normalize_expt(t_eosinophil_v3, norm = "quant", convert = "cpm",
                                       transform = "log3", filter = TRUE)
## Removing 9845 low-count genes (10078 remaining).
## transform_counts: Found 1 values equal to 0, adding 1 to the matrix.
## Did not recognize the transformation, leaving the table.
##  Recognized transformations include: 'log2', 'log10', 'log'
t_eosinophil_v3_pca <- plot_pca(t_eosinophil_v3_norm, plot_labels = FALSE)
t_eosinophil_v3_pca$plot

t_eosinophil_v3_nb <- normalize_expt(t_eosinophil_v3, convert = "cpm",
                                     transform = "log2", filter = TRUE, batch = "svaseq")
## Removing 9845 low-count genes (10078 remaining).
## Setting 48 low elements to zero.
## transform_counts: Found 48 values equal to 0, adding 1 to the matrix.
t_eosinophil_v3_nb_pca <- plot_pca(t_eosinophil_v3_nb, plot_labels = FALSE)
t_eosinophil_v3_nb_pca$plot

6.11 Recategorize: Concatenate cure/fail and cell type

In the following block the experimental condition was reset to the concatenation of clinical outcome and type of cells. There are an insufficient number of biopsy samples for them to be useful in this visualization, so they are ignored.

desired_levels <- c("cure_biopsy", "failure_biopsy", "cure_eosinophils", "failure_eosinophils",
                    "cure_monocytes", "failure_monocytes", "cure_neutrophils", "failure_neutrophils")
new_fact <- factor(
    paste0(pData(t_clinical)[["condition"]], "_",
           pData(t_clinical)[["batch"]]),
    levels=desired_levels)

t_clinical_concat <- set_expt_conditions(t_clinical, fact = new_fact) %>%
  set_expt_batches(fact = "visitnumber") %>%
  set_expt_colors(color_choices[["cf_type"]]) %>%
  subset_expt(subset="typeofcells!='biopsy'")
## 
##         cure_biopsy      failure_biopsy    cure_eosinophils failure_eosinophils      cure_monocytes   failure_monocytes    cure_neutrophils 
##                   9                   5                  17                   9                  21                  21                  20 
## failure_neutrophils 
##                  21 
## 
##  3  2  1 
## 34 35 54
## subset_expt(): There were 123, now there are 109 samples.
## Try to ensure that the levels stay in the order I want
meta <- pData(t_clinical_concat) %>%
  mutate(condition = fct_relevel(condition, desired_levels))
## Warning: There was 1 warning in `mutate()`.
## ℹ In argument: `condition = fct_relevel(condition, desired_levels)`.
## Caused by warning:
## ! 2 unknown levels in `f`: cure_biopsy and failure_biopsy
pData(t_clinical_concat) <- meta

6.11.1 Visualize: Look at Tumaco-only samples by cell type and cure/fail

The following block is pretty wild to my eyes; it seems to me that the variances introduced by cell type basically wipe out the apparent differences between cure/fail that we were able to see previously.

I suppose this is not entirely surprising, but when we had the Cali samples it at least looked like there were differences which were explicitly between cure/fail across cell types. I suppose this means those differences were actually coming from the unbalanced state of the two clinics from the perspective of clinic.

t_clinical_concat_norm <- normalize_expt(t_clinical_concat, transform = "log2", convert = "cpm",
                                       norm = "quant", filter = TRUE)
## Removing 8016 low-count genes (11907 remaining).
## transform_counts: Found 93 values equal to 0, adding 1 to the matrix.
t_clinical_concat_norm_pca <- plot_pca(t_clinical_concat_norm)
t_clinical_concat_norm_pca$plot

t_clinical_concat_nb <- normalize_expt(t_clinical_concat, transform = "log2", convert = "cpm",
                                       batch = "svaseq", filter = TRUE)
## Removing 8016 low-count genes (11907 remaining).
## Setting 9896 low elements to zero.
## transform_counts: Found 9896 values equal to 0, adding 1 to the matrix.
t_clinical_concat_nb_pca <- plot_pca(t_clinical_concat_nb)
t_clinical_concat_nb_pca$plot

7 Visit comparisons

Let us shift the focus from cell type and/or Cure/Fail to the visit number. As you are likely aware, the three visits are significantly spread apart according to the clinical treatment of each patient. Thus we will now separate the samples by visit in order to more easily see what new patterns emerge.

7.1 Recategorize: All visits together

Now let us shift the view slightly to focus on changes observed over time.

tc_visit_expt <- set_expt_conditions(tc_clinical, fact = "visitnumber") %>%
  set_expt_batches(fact = "finaloutcome") %>%
  set_expt_colors(color_choices[["visit2"]])
## 
##  3  2  1 
## 51 50 83 
## 
##    cure failure 
##     122      62
tc_visit_norm <- normalize_expt(tc_visit_expt, filter = TRUE, transform = "log2", convert = "cpm",
                                batch = "svaseq")
## Removing 5633 low-count genes (14290 remaining).
## Setting 39176 low elements to zero.
## transform_counts: Found 39176 values equal to 0, adding 1 to the matrix.
plot_pca(tc_visit_norm)$plot

t_visit_expt <- set_expt_conditions(t_clinical, fact = "visitnumber") %>%
  set_expt_batches(fact = "finaloutcome") %>%
  subset_expt(subset="typeofcells!='biopsy'")
## 
##  3  2  1 
## 34 35 54 
## 
##    cure failure 
##      67      56
## subset_expt(): There were 123, now there are 109 samples.
t_visit_norm <- normalize_expt(t_visit_expt, transform = "log2", convert = "cpm",
                             norm = "quant", filter = TRUE)
## Removing 8016 low-count genes (11907 remaining).
## transform_counts: Found 93 values equal to 0, adding 1 to the matrix.
plot_pca(t_visit_norm)$plot

t_visit_nb <- normalize_expt(t_visit_expt, transform = "log2", convert = "cpm",
                             filter = TRUE, batch = "svaseq")
## Removing 8016 low-count genes (11907 remaining).
## Setting 9614 low elements to zero.
## transform_counts: Found 9614 values equal to 0, adding 1 to the matrix.
t_visit_nb_pca <- plot_pca(t_visit_nb)
t_visit_nb_pca$plot

When looking at all cell types, it is quite difficult to see differences among the three visits.

7.2 Visualize: C/F for only the visit 1 samples

Wen we had both Cali and Tumaco samples, it looked like there was variance suggesting differences between cure and fail for visit 1. I think the following block will suggest pretty strongly that this was not true.

tv1_norm <- normalize_expt(tv1_samples, transform = "log2", convert = "cpm",
                          norm = "quant", filter = TRUE)
## Removing 5907 low-count genes (14016 remaining).
## transform_counts: Found 272 values equal to 0, adding 1 to the matrix.
plot_pca(tv1_norm)$plot

tv1_nb <- normalize_expt(tv1_samples, transform = "log2", convert = "cpm",
                        filter = TRUE, batch = "svaseq")
## Removing 5907 low-count genes (14016 remaining).
## Setting 7615 low elements to zero.
## transform_counts: Found 7615 values equal to 0, adding 1 to the matrix.
plot_pca(tv1_nb, plot_labels = FALSE)$plot

7.3 Visualize: C/F for only the visit 2 samples

tv2_clinical <- subset_expt(tv2_samples, subset = "visitnumber=='2'") %>%
  set_expt_conditions(fact = "finaloutcome") %>%
  set_expt_batches(fact = "typeofcells")
## subset_expt(): There were 35, now there are 35 samples.
## 
##    cure failure 
##      20      15 
## 
## eosinophils   monocytes neutrophils 
##           9          13          13
tv2_nb <- normalize_expt(tv2_clinical, transform = "log2", convert = "cpm", norm = "quant",
                        filter = TRUE, batch = "svaseq")
## Warning in normalize_expt(tv2_clinical, transform = "log2", convert = "cpm", : Quantile normalization and sva do not always play well together.
## Removing 8364 low-count genes (11559 remaining).
## Setting 1786 low elements to zero.
## transform_counts: Found 1786 values equal to 0, adding 1 to the matrix.
plot_pca(tv2_nb, plot_labels = FALSE)$plot

7.4 Visualize: C/F for only the visit 3 samples

tv3_clinical <- subset_expt(tv3_samples, subset = "visitnumber=='3'") %>%
  set_expt_conditions(fact = "finaloutcome") %>%
  set_expt_batches(fact = "typeofcells")
## subset_expt(): There were 34, now there are 34 samples.
## 
##    cure failure 
##      17      17 
## 
## eosinophils   monocytes neutrophils 
##           9          13          12
tv3_nb <- normalize_expt(tv3_clinical, transform = "log2", convert = "cpm", norm = "quant",
                        filter = TRUE, batch = "svaseq")
## Warning in normalize_expt(tv3_clinical, transform = "log2", convert = "cpm", : Quantile normalization and sva do not always play well together.
## Removing 8474 low-count genes (11449 remaining).
## Setting 1481 low elements to zero.
## transform_counts: Found 1481 values equal to 0, adding 1 to the matrix.
plot_pca(tv3_nb, plot_labels = FALSE)$plot

7.4.1 Visualize: Comparing 3 visits by cell type

Separate the samples by cell type in order to more easily observe patterns with respect to visit and clinical outcome.

7.4.1.1 Monocytes across visits

t_visitcf_monocyte_norm <- normalize_expt(t_visitcf_monocyte, norm = "quant", convert = "cpm",
                                transform = "log2", filter = TRUE)
## Removing 9064 low-count genes (10859 remaining).
## transform_counts: Found 5 values equal to 0, adding 1 to the matrix.
t_visitcf_monocyte_pca <- plot_pca(t_visitcf_monocyte_norm, plot_labels = FALSE)
t_visitcf_monocyte_pca$plot

t_visitcf_monocyte_disheat <- plot_disheat(t_visitcf_monocyte_norm)
t_visitcf_monocyte_disheat$plot

t_visitcf_monocyte_nb <- normalize_expt(t_visitcf_monocyte, convert = "cpm",
                                    transform = "log2", filter = TRUE, batch = "svaseq")
## Removing 9064 low-count genes (10859 remaining).
## Setting 688 low elements to zero.
## transform_counts: Found 688 values equal to 0, adding 1 to the matrix.
t_visitcf_monocyte_nb_pca <- plot_pca(t_visitcf_monocyte_nb, plot_labels = FALSE)
t_visitcf_monocyte_nb_pca$plot

7.4.1.2 Eosinophils across visits

t_visitcf_eosinophil_norm <- normalize_expt(t_visitcf_eosinophil, norm = "quant", convert = "cpm",
                                transform = "log2", filter = TRUE)
## Removing 9393 low-count genes (10530 remaining).
## transform_counts: Found 1 values equal to 0, adding 1 to the matrix.
t_visitcf_eosinophil_pca <- plot_pca(t_visitcf_eosinophil_norm, plot_labels = FALSE)
t_visitcf_eosinophil_pca$plot

t_visitcf_eosinophil_disheat <- plot_disheat(t_visitcf_eosinophil_norm)
t_visitcf_eosinophil_disheat$plot

t_visitcf_eosinophil_nb <- normalize_expt(t_visitcf_eosinophil, convert = "cpm",
                                    transform = "log2", filter = TRUE, batch = "svaseq")
## Removing 9393 low-count genes (10530 remaining).
## Setting 374 low elements to zero.
## transform_counts: Found 374 values equal to 0, adding 1 to the matrix.
t_visitcf_eosinophil_nb_pca <- plot_pca(t_visitcf_eosinophil_nb, plot_labels = FALSE)
t_visitcf_eosinophil_nb_pca$plot

7.4.1.3 Neutrophils across visits

t_visitcf_neutrophil_norm <- normalize_expt(t_visitcf_neutrophil, norm = "quant", convert = "cpm",
                                transform = "log2", filter = TRUE)
## Removing 10824 low-count genes (9099 remaining).
## transform_counts: Found 1 values equal to 0, adding 1 to the matrix.
t_visitcf_neutrophil_pca <- plot_pca(t_visitcf_neutrophil_norm, plot_labels = FALSE)
t_visitcf_neutrophil_pca$plot

t_visitcf_neutrophil_disheat <- plot_disheat(t_visitcf_neutrophil_norm)
t_visitcf_neutrophil_disheat$plot

t_visitcf_neutrophil_nb <- normalize_expt(t_visitcf_neutrophil, convert = "cpm",
                                    transform = "log2", filter = TRUE, batch = "svaseq")
## Removing 10824 low-count genes (9099 remaining).
## Setting 686 low elements to zero.
## transform_counts: Found 686 values equal to 0, adding 1 to the matrix.
t_visitcf_neutrophil_nb_pca <- plot_pca(t_visitcf_neutrophil_nb, plot_labels = FALSE)
t_visitcf_neutrophil_nb_pca$plot

7.4.1.4 Celltypes by visit, C/F batch: Monocytes

t_visitcf_monocyte <- set_expt_conditions(t_visitcf_monocyte, prefix = "v",
                                          fact = "visitnumber") %>%
  set_expt_batches("finaloutcome") %>%
  set_expt_colors(color_choices[["visit"]])
## 
## v1 v2 v3 
## 16 13 13 
## 
##    cure failure 
##      21      21
t_visitcf_monocyte_norm <- normalize_expt(t_visitcf_monocyte,
                                          transform = "log2", convert = "cpm",
                                          norm = "quant", filter = TRUE)
## Removing 9064 low-count genes (10859 remaining).
## transform_counts: Found 5 values equal to 0, adding 1 to the matrix.
t_visitcf_monocyte_pca <- plot_pca(t_visitcf_monocyte_norm, plot_labels = FALSE)
t_visitcf_monocyte_pca$plot

7.4.1.5 Celltypes by visit, C/F batch: Eosinophils

t_visitcf_eosinophil <- set_expt_conditions(t_visitcf_eosinophil, prefix = "v",
                                            fact = "visitnumber") %>%
  set_expt_batches("finaloutcome") %>%
  set_expt_colors(color_choices[["visit"]])
## 
## v1 v2 v3 
##  8  9  9 
## 
##    cure failure 
##      17       9
t_visitcf_eosinophil_norm <- normalize_expt(t_visitcf_eosinophil,
                                          transform = "log2", convert = "cpm",
                                          norm = "quant", filter = TRUE)
## Removing 9393 low-count genes (10530 remaining).
## transform_counts: Found 1 values equal to 0, adding 1 to the matrix.
t_visitcf_eosinophil_pca <- plot_pca(t_visitcf_eosinophil_norm, plot_labels = FALSE)
t_visitcf_eosinophil_pca$plot

7.4.1.6 Celltypes by visit, C/F batch: Neutrophils

t_visitcf_neutrophil <- set_expt_conditions(t_visitcf_neutrophil, prefix = "v",
                                            fact = "visitnumber") %>%
  set_expt_batches("finaloutcome") %>%
  set_expt_colors(color_choices[["visit"]])
## 
## v1 v2 v3 
## 16 13 12 
## 
##    cure failure 
##      20      21
t_visitcf_neutrophil_norm <- normalize_expt(t_visitcf_neutrophil,
                                          transform = "log2", convert = "cpm",
                                          norm = "quant", filter = TRUE)
## Removing 10824 low-count genes (9099 remaining).
## transform_counts: Found 1 values equal to 0, adding 1 to the matrix.
t_visitcf_neutrophil_pca <- plot_pca(t_visitcf_neutrophil_norm, plot_labels = FALSE)
t_visitcf_neutrophil_pca$plot

8 Persistence

8.0.1 Take a look

See if there are any patterns which look usable.

## All
t_persistence_norm <- normalize_expt(t_persistence, transform = "log2", convert = "cpm",
                                   norm = "quant", filter = TRUE)
## Removing 8537 low-count genes (11386 remaining).
## transform_counts: Found 15 values equal to 0, adding 1 to the matrix.
plot_pca(t_persistence_norm)$plot

t_persistence_nb <- normalize_expt(t_persistence, transform = "log2", convert = "cpm",
                                 batch = "svaseq", filter = TRUE)
## Removing 8537 low-count genes (11386 remaining).
## Setting 1538 low elements to zero.
## transform_counts: Found 1538 values equal to 0, adding 1 to the matrix.
plot_pca(t_persistence_nb)$plot

## Biopsies
##persistence_biopsy_norm <- normalize_expt(persistence_biopsy, transform = "log2", convert = "cpm",
##                                   norm = "quant", filter = TRUE)
##plot_pca(persistence_biopsy_norm)$plot
## Insufficient data

## Monocytes
t_persistence_monocyte_norm <- normalize_expt(t_persistence_monocyte, transform = "log2", convert = "cpm",
                                              norm = "quant", filter = TRUE)
## Removing 9597 low-count genes (10326 remaining).
## transform_counts: Found 1 values equal to 0, adding 1 to the matrix.
plot_pca(t_persistence_monocyte_norm)$plot

t_persistence_monocyte_nb <- normalize_expt(t_persistence_monocyte, transform = "log2", convert = "cpm",
                                 batch = "svaseq", filter = TRUE)
## Removing 9597 low-count genes (10326 remaining).
## Setting 46 low elements to zero.
## transform_counts: Found 46 values equal to 0, adding 1 to the matrix.
plot_pca(t_persistence_monocyte_nb)$plot

## Neutrophils
t_persistence_neutrophil_norm <- normalize_expt(t_persistence_neutrophil, transform = "log2", convert = "cpm",
                                                norm = "quant", filter = TRUE)
## Removing 11531 low-count genes (8392 remaining).
## transform_counts: Found 2 values equal to 0, adding 1 to the matrix.
plot_pca(t_persistence_neutrophil_norm)$plot

t_persistence_neutrophil_nb <- normalize_expt(t_persistence_neutrophil, transform = "log2", convert = "cpm",
                                 batch = "svaseq", filter = TRUE)
## Removing 11531 low-count genes (8392 remaining).
## Setting 46 low elements to zero.
## transform_counts: Found 46 values equal to 0, adding 1 to the matrix.
plot_pca(t_persistence_neutrophil_nb)$plot

## Eosinophils
t_persistence_eosinophil_norm <- normalize_expt(t_persistence_eosinophil, transform = "log2", convert = "cpm",
                                   norm = "quant", filter = TRUE)
## Removing 9895 low-count genes (10028 remaining).
## transform_counts: Found 1 values equal to 0, adding 1 to the matrix.
plot_pca(t_persistence_eosinophil_norm)$plot

t_persistence_eosinophil_nb <- normalize_expt(t_persistence_eosinophil, transform = "log2", convert = "cpm",
                                 batch = "svaseq", filter = TRUE)
## Removing 9895 low-count genes (10028 remaining).
## Setting 25 low elements to zero.
## transform_counts: Found 25 values equal to 0, adding 1 to the matrix.
plot_pca(t_persistence_eosinophil_nb)$plot

9 Classify me!

I wrote out all the z2.2 and z2.3 specific variants to a couple files, I want to see if I can classify a human sample as infected with 2.2 or 2.3.

z22 <- read.csv("csv/variants_22.csv")
z23 <- read.csv("csv/variants_23.csv")
cure <- read.csv("csv/cure_variants.txt")
fail <- read.csv("csv/fail_variants.txt")
z22_vec <- gsub(pattern="\\-", replacement="_", x=z22[["x"]])
z23_vec <- gsub(pattern="\\-", replacement="_", x=z23[["x"]])
cure_vec <- gsub(pattern="\\-", replacement="_", x=cure)
fail_vec <- gsub(pattern="\\-", replacement="_", x=fail)

classify_zymo <- function(sample) {
  arbitrary_tags <- sm(readr::read_tsv(sample))
  arbitrary_ids <- arbitrary_tags[["position"]]
  message("Length: ", length(arbitrary_ids), ", z22: ",
          sum(arbitrary_ids %in% z22_vec) / (length(z22_vec)), " z23: ",
          sum(arbitrary_ids %in% z23_vec) / (length(z23_vec)))
}

arbitrary_sample <- "preprocessing/TMRC30156/outputs/40freebayes_lpanamensis_v36/all_tags.txt.xz"
classify_zymo(arbitrary_sample)
##if (!isTRUE(get0("skip_load"))) {
##  pander::pander(sessionInfo())
##  message("This is hpgltools commit: ", get_git_commit())
##  message("Saving to ", savefile)
##  tmp <- sm(saveme(filename=savefile))
##}

10 Visualizing composite scores

First lets get the gene IDs and colors for these plots.

library(viridis)
## Loading required package: viridisLite
wanted_genes <- c("IFI44L", "IFI27", "PRR5", "PRR5-ARHGAP8", "RHCE",
                  "FBXO39", "RSAD2", "SMTNL1", "USP18", "AFAP1")
wanted_idx <- fData(tc_valid)[["hgnc_symbol"]] %in% wanted_genes
wanted_ids <- rownames(fData(tc_valid))[wanted_idx]

10.1 All samples, all visits

few <-  subset_genes(tc_valid, ids = wanted_ids, method = "keep") %>%
  set_expt_conditions(fact = "finaloutcome") %>%
  normalize_expt(transform = "log2", convert = "rpkm",
                 column = "mean_cds_len")
## remove_genes_expt(), before removal, there were 19923 genes, now there are 10.
## There are 184 samples which kept less than 90 percent counts.
## TMRC30156 TMRC30185 TMRC30186 TMRC30178 TMRC30179 TMRC30221 TMRC30222 TMRC30223 TMRC30224 TMRC30269 TMRC30148 TMRC30149 TMRC30253 TMRC30150 
##  0.074966  0.005211  0.004192  0.010342  0.012853  0.008657  0.011388  0.012338  0.012827  0.113779  0.025330  0.080425  0.092059  0.022888 
## TMRC30140 TMRC30138 TMRC30176 TMRC30153 TMRC30151 TMRC30234 TMRC30235 TMRC30270 TMRC30225 TMRC30226 TMRC30227 TMRC30016 TMRC30228 TMRC30229 
##  0.058740  0.013444  0.033932  0.056567  0.010846  0.022165  0.036248  0.105906  0.018197  0.066756  0.012887  0.053401  0.010447  0.017396 
## TMRC30230 TMRC30017 TMRC30231 TMRC30232 TMRC30233 TMRC30018 TMRC30209 TMRC30210 TMRC30211 TMRC30212 TMRC30213 TMRC30216 TMRC30214 TMRC30215 
##  0.007235  0.163567  0.011375  0.015075  0.007098  0.198309  0.014239  0.030266  0.013336  0.013080  0.013782  0.013333  0.026955  0.037396 
## TMRC30271 TMRC30273 TMRC30275 TMRC30272 TMRC30274 TMRC30276 TMRC30254 TMRC30255 TMRC30256 TMRC30277 TMRC30239 TMRC30240 TMRC30278 TMRC30279 
##  0.002904  0.008121  0.004977  0.003983  0.011100  0.009685  0.002683  0.004998  0.003678  0.028914  0.011614  0.011747  0.005125  0.009030 
## TMRC30280 TMRC30257 TMRC30019 TMRC30258 TMRC30281 TMRC30283 TMRC30284 TMRC30282 TMRC30285 TMRC30071 TMRC30020 TMRC30056 TMRC30113 TMRC30105 
##  0.004587  0.056482  0.137238  0.042364  0.006149  0.006349  0.018823  0.007745  0.011814  0.003604  0.069016  0.024332  0.003870  0.027699 
## TMRC30058 TMRC30164 TMRC30080 TMRC30094 TMRC30119 TMRC30082 TMRC30103 TMRC30122 TMRC30022 TMRC30169 TMRC30093 TMRC30029 TMRC30107 TMRC30170 
##  0.064838  0.004041  0.029852  0.057588  0.011127  0.004927  0.250989  0.005860  0.087377  0.007922  0.008303  0.013187  0.007180  0.010832 
## TMRC30032 TMRC30096 TMRC30083 TMRC30028 TMRC30115 TMRC30118 TMRC30180 TMRC30014 TMRC30121 TMRC30196 TMRC30030 TMRC30021 TMRC30026 TMRC30037 
##  0.010258  0.010897  0.026117  0.010995  0.008703  0.021574  0.021135  0.004655  0.016174  0.010626  0.006697  0.011014  0.110319  0.009305 
## TMRC30031 TMRC30165 TMRC30027 TMRC30044 TMRC30194 TMRC30166 TMRC30195 TMRC30048 TMRC30054 TMRC30045 TMRC30046 TMRC30070 TMRC30049 TMRC30055 
##  0.011136  0.033555  0.010749  0.073286  0.006814  0.164854  0.007850  0.019524  0.042561  0.073223  0.031598  0.015249  0.062952  0.026184 
## TMRC30047 TMRC30191 TMRC30053 TMRC30041 TMRC30068 TMRC30171 TMRC30192 TMRC30139 TMRC30042 TMRC30158 TMRC30132 TMRC30160 TMRC30157 TMRC30183 
##  0.171839  0.004217  0.318381  0.009402  0.055379  0.016379  0.003692  0.023785  0.009871  0.018550  0.005345  0.033927  0.009122  0.007546 
## TMRC30167 TMRC30123 TMRC30181 TMRC30072 TMRC30133 TMRC30043 TMRC30078 TMRC30116 TMRC30184 TMRC30076 TMRC30159 TMRC30129 TMRC30088 TMRC30172 
##  0.009458  0.129526  0.010955  0.074091  0.012120  0.004400  0.077860  0.332469  0.008484  0.280253  0.006340  0.023853  0.366220  0.020876 
## TMRC30134 TMRC30174 TMRC30137 TMRC30161 TMRC30142 TMRC30175 TMRC30145 TMRC30143 TMRC30168 TMRC30197 TMRC30146 TMRC30182 TMRC30199 TMRC30198 
##  0.008721  0.007188  0.028016  0.008836  0.016101  0.006401  0.014412  0.037261  0.002339  0.011999  0.016008  0.003287  0.011593  0.040711 
## TMRC30201 TMRC30200 TMRC30203 TMRC30202 TMRC30205 TMRC30204 TMRC30152 TMRC30177 TMRC30155 TMRC30154 TMRC30241 TMRC30237 TMRC30206 TMRC30136 
##  0.009860  0.012649  0.019504  0.007974  0.076901  0.070550  0.081850  0.136282  0.178406  0.109753  0.191504  0.007216  0.234763  0.002704 
## TMRC30207 TMRC30238 TMRC30074 TMRC30217 TMRC30208 TMRC30077 TMRC30219 TMRC30218 TMRC30079 TMRC30220 TMRC30135 TMRC30173 TMRC30264 TMRC30144 
##  0.006025  0.015708  0.054755  0.008583  0.014484  0.043056  0.004538  0.006692  0.065256  0.002911  0.010143  0.013179  0.062793  0.008605 
## TMRC30147 TMRC30265 
##  0.007425  0.255307 
## 
##    cure failure 
##     122      62
## transform_counts: Found 102 values equal to 0, adding 1 to the matrix.
shp <- plot_sample_heatmap(few, heatmap_colors = viridis, row_label = wanted_genes)
shp

few <-  subset_genes(t_clinical, ids = wanted_ids, method = "keep") %>%
  set_expt_conditions(fact = "finaloutcome") %>%
  normalize_expt(transform = "log2", convert = "rpkm",
                 column = "mean_cds_len")
## remove_genes_expt(), before removal, there were 19923 genes, now there are 10.
## There are 123 samples which kept less than 90 percent counts.
## TMRC30016 TMRC30017 TMRC30018 TMRC30019 TMRC30071 TMRC30020 TMRC30056 TMRC30113 TMRC30105 TMRC30058 TMRC30164 TMRC30080 TMRC30094 TMRC30119 
##  0.053401  0.163567  0.198309  0.137238  0.003604  0.069016  0.024332  0.003870  0.027699  0.064838  0.004041  0.029852  0.057588  0.011127 
## TMRC30082 TMRC30103 TMRC30122 TMRC30022 TMRC30169 TMRC30093 TMRC30029 TMRC30107 TMRC30170 TMRC30032 TMRC30096 TMRC30083 TMRC30028 TMRC30115 
##  0.004927  0.250989  0.005860  0.087377  0.007922  0.008303  0.013187  0.007180  0.010832  0.010258  0.010897  0.026117  0.010995  0.008703 
## TMRC30118 TMRC30180 TMRC30014 TMRC30121 TMRC30196 TMRC30030 TMRC30021 TMRC30026 TMRC30037 TMRC30031 TMRC30165 TMRC30027 TMRC30044 TMRC30194 
##  0.021574  0.021135  0.004655  0.016174  0.010626  0.006697  0.011014  0.110319  0.009305  0.011136  0.033555  0.010749  0.073286  0.006814 
## TMRC30166 TMRC30195 TMRC30048 TMRC30054 TMRC30045 TMRC30046 TMRC30070 TMRC30049 TMRC30055 TMRC30047 TMRC30191 TMRC30053 TMRC30041 TMRC30068 
##  0.164854  0.007850  0.019524  0.042561  0.073223  0.031598  0.015249  0.062952  0.026184  0.171839  0.004217  0.318381  0.009402  0.055379 
## TMRC30171 TMRC30192 TMRC30139 TMRC30042 TMRC30158 TMRC30132 TMRC30160 TMRC30157 TMRC30183 TMRC30167 TMRC30123 TMRC30181 TMRC30072 TMRC30133 
##  0.016379  0.003692  0.023785  0.009871  0.018550  0.005345  0.033927  0.009122  0.007546  0.009458  0.129526  0.010955  0.074091  0.012120 
## TMRC30043 TMRC30078 TMRC30116 TMRC30184 TMRC30076 TMRC30159 TMRC30129 TMRC30088 TMRC30172 TMRC30134 TMRC30174 TMRC30137 TMRC30161 TMRC30142 
##  0.004400  0.077860  0.332469  0.008484  0.280253  0.006340  0.023853  0.366220  0.020876  0.008721  0.007188  0.028016  0.008836  0.016101 
## TMRC30175 TMRC30145 TMRC30143 TMRC30168 TMRC30197 TMRC30146 TMRC30182 TMRC30199 TMRC30198 TMRC30201 TMRC30200 TMRC30203 TMRC30202 TMRC30205 
##  0.006401  0.014412  0.037261  0.002339  0.011999  0.016008  0.003287  0.011593  0.040711  0.009860  0.012649  0.019504  0.007974  0.076901 
## TMRC30204 TMRC30152 TMRC30177 TMRC30155 TMRC30154 TMRC30241 TMRC30237 TMRC30206 TMRC30136 TMRC30207 TMRC30238 TMRC30074 TMRC30217 TMRC30208 
##  0.070550  0.081850  0.136282  0.178406  0.109753  0.191504  0.007216  0.234763  0.002704  0.006025  0.015708  0.054755  0.008583  0.014484 
## TMRC30077 TMRC30219 TMRC30218 TMRC30079 TMRC30220 TMRC30135 TMRC30173 TMRC30264 TMRC30144 TMRC30147 TMRC30265 
##  0.043056  0.004538  0.006692  0.065256  0.002911  0.010143  0.013179  0.062793  0.008605  0.007425  0.255307 
## 
##    cure failure 
##      67      56
## transform_counts: Found 39 values equal to 0, adding 1 to the matrix.
shp <- plot_sample_heatmap(few, heatmap_colors = viridis, row_label = wanted_genes)
shp

10.2 All samples, visit 1

few <- subset_genes(tc_clinical, ids = wanted_ids, method = "keep") %>%
  set_expt_conditions(fact = "finaloutcome") %>%
  subset_expt(subset = "visitnumber=='1'") %>%
  normalize_expt(transform = "log2", convert = "rpkm",
                 column = "mean_cds_len")
## remove_genes_expt(), before removal, there were 19923 genes, now there are 10.
## There are 184 samples which kept less than 90 percent counts.
## TMRC30156 TMRC30185 TMRC30186 TMRC30178 TMRC30179 TMRC30221 TMRC30222 TMRC30223 TMRC30224 TMRC30269 TMRC30148 TMRC30149 TMRC30253 TMRC30150 
##  0.074966  0.005211  0.004192  0.010342  0.012853  0.008657  0.011388  0.012338  0.012827  0.113779  0.025330  0.080425  0.092059  0.022888 
## TMRC30140 TMRC30138 TMRC30176 TMRC30153 TMRC30151 TMRC30234 TMRC30235 TMRC30270 TMRC30225 TMRC30226 TMRC30227 TMRC30016 TMRC30228 TMRC30229 
##  0.058740  0.013444  0.033932  0.056567  0.010846  0.022165  0.036248  0.105906  0.018197  0.066756  0.012887  0.053401  0.010447  0.017396 
## TMRC30230 TMRC30017 TMRC30231 TMRC30232 TMRC30233 TMRC30018 TMRC30209 TMRC30210 TMRC30211 TMRC30212 TMRC30213 TMRC30216 TMRC30214 TMRC30215 
##  0.007235  0.163567  0.011375  0.015075  0.007098  0.198309  0.014239  0.030266  0.013336  0.013080  0.013782  0.013333  0.026955  0.037396 
## TMRC30271 TMRC30273 TMRC30275 TMRC30272 TMRC30274 TMRC30276 TMRC30254 TMRC30255 TMRC30256 TMRC30277 TMRC30239 TMRC30240 TMRC30278 TMRC30279 
##  0.002904  0.008121  0.004977  0.003983  0.011100  0.009685  0.002683  0.004998  0.003678  0.028914  0.011614  0.011747  0.005125  0.009030 
## TMRC30280 TMRC30257 TMRC30019 TMRC30258 TMRC30281 TMRC30283 TMRC30284 TMRC30282 TMRC30285 TMRC30071 TMRC30020 TMRC30056 TMRC30113 TMRC30105 
##  0.004587  0.056482  0.137238  0.042364  0.006149  0.006349  0.018823  0.007745  0.011814  0.003604  0.069016  0.024332  0.003870  0.027699 
## TMRC30058 TMRC30164 TMRC30080 TMRC30094 TMRC30119 TMRC30082 TMRC30103 TMRC30122 TMRC30022 TMRC30169 TMRC30093 TMRC30029 TMRC30107 TMRC30170 
##  0.064838  0.004041  0.029852  0.057588  0.011127  0.004927  0.250989  0.005860  0.087377  0.007922  0.008303  0.013187  0.007180  0.010832 
## TMRC30032 TMRC30096 TMRC30083 TMRC30028 TMRC30115 TMRC30118 TMRC30180 TMRC30014 TMRC30121 TMRC30196 TMRC30030 TMRC30021 TMRC30026 TMRC30037 
##  0.010258  0.010897  0.026117  0.010995  0.008703  0.021574  0.021135  0.004655  0.016174  0.010626  0.006697  0.011014  0.110319  0.009305 
## TMRC30031 TMRC30165 TMRC30027 TMRC30044 TMRC30194 TMRC30166 TMRC30195 TMRC30048 TMRC30054 TMRC30045 TMRC30046 TMRC30070 TMRC30049 TMRC30055 
##  0.011136  0.033555  0.010749  0.073286  0.006814  0.164854  0.007850  0.019524  0.042561  0.073223  0.031598  0.015249  0.062952  0.026184 
## TMRC30047 TMRC30191 TMRC30053 TMRC30041 TMRC30068 TMRC30171 TMRC30192 TMRC30139 TMRC30042 TMRC30158 TMRC30132 TMRC30160 TMRC30157 TMRC30183 
##  0.171839  0.004217  0.318381  0.009402  0.055379  0.016379  0.003692  0.023785  0.009871  0.018550  0.005345  0.033927  0.009122  0.007546 
## TMRC30167 TMRC30123 TMRC30181 TMRC30072 TMRC30133 TMRC30043 TMRC30078 TMRC30116 TMRC30184 TMRC30076 TMRC30159 TMRC30129 TMRC30088 TMRC30172 
##  0.009458  0.129526  0.010955  0.074091  0.012120  0.004400  0.077860  0.332469  0.008484  0.280253  0.006340  0.023853  0.366220  0.020876 
## TMRC30134 TMRC30174 TMRC30137 TMRC30161 TMRC30142 TMRC30175 TMRC30145 TMRC30143 TMRC30168 TMRC30197 TMRC30146 TMRC30182 TMRC30199 TMRC30198 
##  0.008721  0.007188  0.028016  0.008836  0.016101  0.006401  0.014412  0.037261  0.002339  0.011999  0.016008  0.003287  0.011593  0.040711 
## TMRC30201 TMRC30200 TMRC30203 TMRC30202 TMRC30205 TMRC30204 TMRC30152 TMRC30177 TMRC30155 TMRC30154 TMRC30241 TMRC30237 TMRC30206 TMRC30136 
##  0.009860  0.012649  0.019504  0.007974  0.076901  0.070550  0.081850  0.136282  0.178406  0.109753  0.191504  0.007216  0.234763  0.002704 
## TMRC30207 TMRC30238 TMRC30074 TMRC30217 TMRC30208 TMRC30077 TMRC30219 TMRC30218 TMRC30079 TMRC30220 TMRC30135 TMRC30173 TMRC30264 TMRC30144 
##  0.006025  0.015708  0.054755  0.008583  0.014484  0.043056  0.004538  0.006692  0.065256  0.002911  0.010143  0.013179  0.062793  0.008605 
## TMRC30147 TMRC30265 
##  0.007425  0.255307 
## 
##    cure failure 
##     122      62
## subset_expt(): There were 184, now there are 83 samples.
## transform_counts: Found 43 values equal to 0, adding 1 to the matrix.
shp <- plot_sample_heatmap(few, heatmap_colors = viridis, row_label = wanted_genes)
shp

few <- subset_genes(t_clinical, ids = wanted_ids, method = "keep") %>%
  set_expt_conditions(fact = "finaloutcome") %>%
  subset_expt(subset = "visitnumber=='1'") %>%
  normalize_expt(transform = "log2", convert = "rpkm",
                 column = "mean_cds_len")
## remove_genes_expt(), before removal, there were 19923 genes, now there are 10.
## There are 123 samples which kept less than 90 percent counts.
## TMRC30016 TMRC30017 TMRC30018 TMRC30019 TMRC30071 TMRC30020 TMRC30056 TMRC30113 TMRC30105 TMRC30058 TMRC30164 TMRC30080 TMRC30094 TMRC30119 
##  0.053401  0.163567  0.198309  0.137238  0.003604  0.069016  0.024332  0.003870  0.027699  0.064838  0.004041  0.029852  0.057588  0.011127 
## TMRC30082 TMRC30103 TMRC30122 TMRC30022 TMRC30169 TMRC30093 TMRC30029 TMRC30107 TMRC30170 TMRC30032 TMRC30096 TMRC30083 TMRC30028 TMRC30115 
##  0.004927  0.250989  0.005860  0.087377  0.007922  0.008303  0.013187  0.007180  0.010832  0.010258  0.010897  0.026117  0.010995  0.008703 
## TMRC30118 TMRC30180 TMRC30014 TMRC30121 TMRC30196 TMRC30030 TMRC30021 TMRC30026 TMRC30037 TMRC30031 TMRC30165 TMRC30027 TMRC30044 TMRC30194 
##  0.021574  0.021135  0.004655  0.016174  0.010626  0.006697  0.011014  0.110319  0.009305  0.011136  0.033555  0.010749  0.073286  0.006814 
## TMRC30166 TMRC30195 TMRC30048 TMRC30054 TMRC30045 TMRC30046 TMRC30070 TMRC30049 TMRC30055 TMRC30047 TMRC30191 TMRC30053 TMRC30041 TMRC30068 
##  0.164854  0.007850  0.019524  0.042561  0.073223  0.031598  0.015249  0.062952  0.026184  0.171839  0.004217  0.318381  0.009402  0.055379 
## TMRC30171 TMRC30192 TMRC30139 TMRC30042 TMRC30158 TMRC30132 TMRC30160 TMRC30157 TMRC30183 TMRC30167 TMRC30123 TMRC30181 TMRC30072 TMRC30133 
##  0.016379  0.003692  0.023785  0.009871  0.018550  0.005345  0.033927  0.009122  0.007546  0.009458  0.129526  0.010955  0.074091  0.012120 
## TMRC30043 TMRC30078 TMRC30116 TMRC30184 TMRC30076 TMRC30159 TMRC30129 TMRC30088 TMRC30172 TMRC30134 TMRC30174 TMRC30137 TMRC30161 TMRC30142 
##  0.004400  0.077860  0.332469  0.008484  0.280253  0.006340  0.023853  0.366220  0.020876  0.008721  0.007188  0.028016  0.008836  0.016101 
## TMRC30175 TMRC30145 TMRC30143 TMRC30168 TMRC30197 TMRC30146 TMRC30182 TMRC30199 TMRC30198 TMRC30201 TMRC30200 TMRC30203 TMRC30202 TMRC30205 
##  0.006401  0.014412  0.037261  0.002339  0.011999  0.016008  0.003287  0.011593  0.040711  0.009860  0.012649  0.019504  0.007974  0.076901 
## TMRC30204 TMRC30152 TMRC30177 TMRC30155 TMRC30154 TMRC30241 TMRC30237 TMRC30206 TMRC30136 TMRC30207 TMRC30238 TMRC30074 TMRC30217 TMRC30208 
##  0.070550  0.081850  0.136282  0.178406  0.109753  0.191504  0.007216  0.234763  0.002704  0.006025  0.015708  0.054755  0.008583  0.014484 
## TMRC30077 TMRC30219 TMRC30218 TMRC30079 TMRC30220 TMRC30135 TMRC30173 TMRC30264 TMRC30144 TMRC30147 TMRC30265 
##  0.043056  0.004538  0.006692  0.065256  0.002911  0.010143  0.013179  0.062793  0.008605  0.007425  0.255307 
## 
##    cure failure 
##      67      56
## subset_expt(): There were 123, now there are 54 samples.
## transform_counts: Found 16 values equal to 0, adding 1 to the matrix.
shp <- plot_sample_heatmap(few, heatmap_colors = viridis, row_label = wanted_genes)
shp

10.3 Eosinophils, all times

few <-  subset_genes(tc_eosinophils, ids = wanted_ids, method = "keep") %>%
  set_expt_conditions(fact = "finaloutcome") %>%
  normalize_expt(transform = "log2", convert = "rpkm",
                 column = "mean_cds_len")
## remove_genes_expt(), before removal, there were 19923 genes, now there are 10.
## There are 41 samples which kept less than 90 percent counts.
## TMRC30138 TMRC30151 TMRC30227 TMRC30230 TMRC30233 TMRC30211 TMRC30216 TMRC30271 TMRC30272 TMRC30254 TMRC30277 TMRC30278 TMRC30257 TMRC30281 
##  0.013444  0.010846  0.012887  0.007235  0.007098  0.013336  0.013333  0.002904  0.003983  0.002683  0.028914  0.005125  0.056482  0.006149 
## TMRC30282 TMRC30071 TMRC30113 TMRC30164 TMRC30119 TMRC30122 TMRC30029 TMRC30032 TMRC30028 TMRC30180 TMRC30196 TMRC30048 TMRC30054 TMRC30070 
##  0.007745  0.003604  0.003870  0.004041  0.011127  0.005860  0.013187  0.010258  0.010995  0.021135  0.010626  0.019524  0.042561  0.015249 
## TMRC30043 TMRC30159 TMRC30161 TMRC30168 TMRC30182 TMRC30136 TMRC30074 TMRC30077 TMRC30079 TMRC30135 TMRC30173 TMRC30144 TMRC30147 
##  0.004400  0.006340  0.008836  0.002339  0.003287  0.002704  0.054755  0.043056  0.065256  0.010143  0.013179  0.008605  0.007425 
## 
##    cure failure 
##      32       9
## transform_counts: Found 40 values equal to 0, adding 1 to the matrix.
shp <- plot_sample_heatmap(few, heatmap_colors = viridis, row_label = wanted_genes)
shp

few <-  subset_genes(t_eosinophils, ids = wanted_ids, method = "keep") %>%
  set_expt_conditions(fact = "finaloutcome") %>%
  normalize_expt(transform = "log2", convert = "rpkm",
                 column = "mean_cds_len")
## remove_genes_expt(), before removal, there were 19923 genes, now there are 10.
## There are 26 samples which kept less than 90 percent counts.
## TMRC30071 TMRC30113 TMRC30164 TMRC30119 TMRC30122 TMRC30029 TMRC30032 TMRC30028 TMRC30180 TMRC30196 TMRC30048 TMRC30054 TMRC30070 TMRC30043 
##  0.003604  0.003870  0.004041  0.011127  0.005860  0.013187  0.010258  0.010995  0.021135  0.010626  0.019524  0.042561  0.015249  0.004400 
## TMRC30159 TMRC30161 TMRC30168 TMRC30182 TMRC30136 TMRC30074 TMRC30077 TMRC30079 TMRC30135 TMRC30173 TMRC30144 TMRC30147 
##  0.006340  0.008836  0.002339  0.003287  0.002704  0.054755  0.043056  0.065256  0.010143  0.013179  0.008605  0.007425 
## 
##    cure failure 
##      17       9
## transform_counts: Found 15 values equal to 0, adding 1 to the matrix.
shp <- plot_sample_heatmap(few, heatmap_colors = viridis, row_label = wanted_genes)
shp

10.4 Eosinophils, v1

few <-  subset_genes(tc_eosinophils, ids = wanted_ids, method = "keep") %>%
  set_expt_conditions(fact = "finaloutcome") %>%
  subset_expt(subset = "visitnumber=='1'") %>%
  normalize_expt(transform = "log2", convert = "rpkm",
                 column = "mean_cds_len")
## remove_genes_expt(), before removal, there were 19923 genes, now there are 10.
## There are 41 samples which kept less than 90 percent counts.
## TMRC30138 TMRC30151 TMRC30227 TMRC30230 TMRC30233 TMRC30211 TMRC30216 TMRC30271 TMRC30272 TMRC30254 TMRC30277 TMRC30278 TMRC30257 TMRC30281 
##  0.013444  0.010846  0.012887  0.007235  0.007098  0.013336  0.013333  0.002904  0.003983  0.002683  0.028914  0.005125  0.056482  0.006149 
## TMRC30282 TMRC30071 TMRC30113 TMRC30164 TMRC30119 TMRC30122 TMRC30029 TMRC30032 TMRC30028 TMRC30180 TMRC30196 TMRC30048 TMRC30054 TMRC30070 
##  0.007745  0.003604  0.003870  0.004041  0.011127  0.005860  0.013187  0.010258  0.010995  0.021135  0.010626  0.019524  0.042561  0.015249 
## TMRC30043 TMRC30159 TMRC30161 TMRC30168 TMRC30182 TMRC30136 TMRC30074 TMRC30077 TMRC30079 TMRC30135 TMRC30173 TMRC30144 TMRC30147 
##  0.004400  0.006340  0.008836  0.002339  0.003287  0.002704  0.054755  0.043056  0.065256  0.010143  0.013179  0.008605  0.007425 
## 
##    cure failure 
##      32       9
## subset_expt(): There were 41, now there are 14 samples.
## transform_counts: Found 15 values equal to 0, adding 1 to the matrix.
shp <- plot_sample_heatmap(few, heatmap_colors = viridis, row_label = wanted_genes)
shp

few <-  subset_genes(t_eosinophils, ids = wanted_ids, method = "keep") %>%
  set_expt_conditions(fact = "finaloutcome") %>%
  subset_expt(subset = "visitnumber=='1'") %>%
  normalize_expt(transform = "log2", convert = "rpkm",
                 column = "mean_cds_len")
## remove_genes_expt(), before removal, there were 19923 genes, now there are 10.
## There are 26 samples which kept less than 90 percent counts.
## TMRC30071 TMRC30113 TMRC30164 TMRC30119 TMRC30122 TMRC30029 TMRC30032 TMRC30028 TMRC30180 TMRC30196 TMRC30048 TMRC30054 TMRC30070 TMRC30043 
##  0.003604  0.003870  0.004041  0.011127  0.005860  0.013187  0.010258  0.010995  0.021135  0.010626  0.019524  0.042561  0.015249  0.004400 
## TMRC30159 TMRC30161 TMRC30168 TMRC30182 TMRC30136 TMRC30074 TMRC30077 TMRC30079 TMRC30135 TMRC30173 TMRC30144 TMRC30147 
##  0.006340  0.008836  0.002339  0.003287  0.002704  0.054755  0.043056  0.065256  0.010143  0.013179  0.008605  0.007425 
## 
##    cure failure 
##      17       9
## subset_expt(): There were 26, now there are 8 samples.
## transform_counts: Found 6 values equal to 0, adding 1 to the matrix.
shp <- plot_sample_heatmap(few, heatmap_colors = viridis, row_label = wanted_genes)
shp

10.5 Monocytes all

few <-  subset_genes(tc_monocytes, ids = wanted_ids, method = "keep") %>%
  set_expt_conditions(fact = "finaloutcome") %>%
  normalize_expt(transform = "log2", convert = "rpkm",
                 column = "mean_cds_len")
## remove_genes_expt(), before removal, there were 19923 genes, now there are 10.
## There are 63 samples which kept less than 90 percent counts.
## TMRC30185 TMRC30178 TMRC30221 TMRC30223 TMRC30148 TMRC30150 TMRC30176 TMRC30234 TMRC30225 TMRC30228 TMRC30231 TMRC30209 TMRC30212 TMRC30214 
##  0.005211  0.010342  0.008657  0.012338  0.025330  0.022888  0.033932  0.022165  0.018197  0.010447  0.011375  0.014239  0.013080  0.026955 
## TMRC30273 TMRC30274 TMRC30255 TMRC30239 TMRC30279 TMRC30258 TMRC30283 TMRC30056 TMRC30105 TMRC30080 TMRC30082 TMRC30169 TMRC30107 TMRC30096 
##  0.008121  0.011100  0.004998  0.011614  0.009030  0.042364  0.006349  0.024332  0.027699  0.029852  0.004927  0.007922  0.007180  0.010897 
## TMRC30115 TMRC30014 TMRC30030 TMRC30037 TMRC30165 TMRC30194 TMRC30046 TMRC30049 TMRC30055 TMRC30191 TMRC30041 TMRC30171 TMRC30139 TMRC30132 
##  0.008703  0.004655  0.006697  0.009305  0.033555  0.006814  0.031598  0.062952  0.026184  0.004217  0.009402  0.016379  0.023785  0.005345 
## TMRC30157 TMRC30183 TMRC30123 TMRC30072 TMRC30078 TMRC30184 TMRC30129 TMRC30172 TMRC30174 TMRC30142 TMRC30145 TMRC30197 TMRC30199 TMRC30201 
##  0.009122  0.007546  0.129526  0.074091  0.077860  0.008484  0.023853  0.020876  0.007188  0.016101  0.014412  0.011999  0.011593  0.009860 
## TMRC30203 TMRC30205 TMRC30237 TMRC30207 TMRC30217 TMRC30219 TMRC30264 
##  0.019504  0.076901  0.007216  0.006025  0.008583  0.004538  0.062793 
## 
##    cure failure 
##      39      24
## transform_counts: Found 10 values equal to 0, adding 1 to the matrix.
shp <- plot_sample_heatmap(few, heatmap_colors = viridis, row_label = wanted_genes)
shp

few <-  subset_genes(t_monocytes, ids = wanted_ids, method = "keep") %>%
  set_expt_conditions(fact = "finaloutcome") %>%
  normalize_expt(transform = "log2", convert = "rpkm",
                 column = "mean_cds_len")
## remove_genes_expt(), before removal, there were 19923 genes, now there are 10.
## There are 42 samples which kept less than 90 percent counts.
## TMRC30056 TMRC30105 TMRC30080 TMRC30082 TMRC30169 TMRC30107 TMRC30096 TMRC30115 TMRC30014 TMRC30030 TMRC30037 TMRC30165 TMRC30194 TMRC30046 
##  0.024332  0.027699  0.029852  0.004927  0.007922  0.007180  0.010897  0.008703  0.004655  0.006697  0.009305  0.033555  0.006814  0.031598 
## TMRC30049 TMRC30055 TMRC30191 TMRC30041 TMRC30171 TMRC30139 TMRC30132 TMRC30157 TMRC30183 TMRC30123 TMRC30072 TMRC30078 TMRC30184 TMRC30129 
##  0.062952  0.026184  0.004217  0.009402  0.016379  0.023785  0.005345  0.009122  0.007546  0.129526  0.074091  0.077860  0.008484  0.023853 
## TMRC30172 TMRC30174 TMRC30142 TMRC30145 TMRC30197 TMRC30199 TMRC30201 TMRC30203 TMRC30205 TMRC30237 TMRC30207 TMRC30217 TMRC30219 TMRC30264 
##  0.020876  0.007188  0.016101  0.014412  0.011999  0.011593  0.009860  0.019504  0.076901  0.007216  0.006025  0.008583  0.004538  0.062793 
## 
##    cure failure 
##      21      21
## transform_counts: Found 4 values equal to 0, adding 1 to the matrix.
shp <- plot_sample_heatmap(few, heatmap_colors = viridis, row_label = wanted_genes)
shp

10.6 Monocytes v1

few <-  subset_genes(tc_monocytes, ids = wanted_ids, method = "keep") %>%
  set_expt_conditions(fact = "finaloutcome") %>%
  subset_expt(subset = "visitnumber=='1'") %>%
  normalize_expt(transform = "log2", convert = "rpkm",
                 column = "mean_cds_len")
## remove_genes_expt(), before removal, there were 19923 genes, now there are 10.
## There are 63 samples which kept less than 90 percent counts.
## TMRC30185 TMRC30178 TMRC30221 TMRC30223 TMRC30148 TMRC30150 TMRC30176 TMRC30234 TMRC30225 TMRC30228 TMRC30231 TMRC30209 TMRC30212 TMRC30214 
##  0.005211  0.010342  0.008657  0.012338  0.025330  0.022888  0.033932  0.022165  0.018197  0.010447  0.011375  0.014239  0.013080  0.026955 
## TMRC30273 TMRC30274 TMRC30255 TMRC30239 TMRC30279 TMRC30258 TMRC30283 TMRC30056 TMRC30105 TMRC30080 TMRC30082 TMRC30169 TMRC30107 TMRC30096 
##  0.008121  0.011100  0.004998  0.011614  0.009030  0.042364  0.006349  0.024332  0.027699  0.029852  0.004927  0.007922  0.007180  0.010897 
## TMRC30115 TMRC30014 TMRC30030 TMRC30037 TMRC30165 TMRC30194 TMRC30046 TMRC30049 TMRC30055 TMRC30191 TMRC30041 TMRC30171 TMRC30139 TMRC30132 
##  0.008703  0.004655  0.006697  0.009305  0.033555  0.006814  0.031598  0.062952  0.026184  0.004217  0.009402  0.016379  0.023785  0.005345 
## TMRC30157 TMRC30183 TMRC30123 TMRC30072 TMRC30078 TMRC30184 TMRC30129 TMRC30172 TMRC30174 TMRC30142 TMRC30145 TMRC30197 TMRC30199 TMRC30201 
##  0.009122  0.007546  0.129526  0.074091  0.077860  0.008484  0.023853  0.020876  0.007188  0.016101  0.014412  0.011999  0.011593  0.009860 
## TMRC30203 TMRC30205 TMRC30237 TMRC30207 TMRC30217 TMRC30219 TMRC30264 
##  0.019504  0.076901  0.007216  0.006025  0.008583  0.004538  0.062793 
## 
##    cure failure 
##      39      24
## subset_expt(): There were 63, now there are 26 samples.
## transform_counts: Found 3 values equal to 0, adding 1 to the matrix.
shp <- plot_sample_heatmap(few, heatmap_colors = viridis, row_label = wanted_genes)
shp

few <-  subset_genes(t_monocytes, ids = wanted_ids, method = "keep") %>%
  set_expt_conditions(fact = "finaloutcome") %>%
  subset_expt(subset = "visitnumber=='1'") %>%
  normalize_expt(transform = "log2", convert = "rpkm",
                 column = "mean_cds_len")
## remove_genes_expt(), before removal, there were 19923 genes, now there are 10.
## There are 42 samples which kept less than 90 percent counts.
## TMRC30056 TMRC30105 TMRC30080 TMRC30082 TMRC30169 TMRC30107 TMRC30096 TMRC30115 TMRC30014 TMRC30030 TMRC30037 TMRC30165 TMRC30194 TMRC30046 
##  0.024332  0.027699  0.029852  0.004927  0.007922  0.007180  0.010897  0.008703  0.004655  0.006697  0.009305  0.033555  0.006814  0.031598 
## TMRC30049 TMRC30055 TMRC30191 TMRC30041 TMRC30171 TMRC30139 TMRC30132 TMRC30157 TMRC30183 TMRC30123 TMRC30072 TMRC30078 TMRC30184 TMRC30129 
##  0.062952  0.026184  0.004217  0.009402  0.016379  0.023785  0.005345  0.009122  0.007546  0.129526  0.074091  0.077860  0.008484  0.023853 
## TMRC30172 TMRC30174 TMRC30142 TMRC30145 TMRC30197 TMRC30199 TMRC30201 TMRC30203 TMRC30205 TMRC30237 TMRC30207 TMRC30217 TMRC30219 TMRC30264 
##  0.020876  0.007188  0.016101  0.014412  0.011999  0.011593  0.009860  0.019504  0.076901  0.007216  0.006025  0.008583  0.004538  0.062793 
## 
##    cure failure 
##      21      21
## subset_expt(): There were 42, now there are 16 samples.
## transform_counts: Found 1 values equal to 0, adding 1 to the matrix.
shp <- plot_sample_heatmap(few, heatmap_colors = viridis, row_label = wanted_genes)
shp

10.7 Neutrophils all

few <-  subset_genes(tc_neutrophils, ids = wanted_ids, method = "keep") %>%
  set_expt_conditions(fact = "finaloutcome") %>%
  normalize_expt(transform = "log2", convert = "rpkm",
                 column = "mean_cds_len")
## remove_genes_expt(), before removal, there were 19923 genes, now there are 10.
## There are 62 samples which kept less than 90 percent counts.
## TMRC30186 TMRC30179 TMRC30222 TMRC30224 TMRC30149 TMRC30140 TMRC30153 TMRC30235 TMRC30226 TMRC30229 TMRC30232 TMRC30210 TMRC30213 TMRC30215 
##  0.004192  0.012853  0.011388  0.012827  0.080425  0.058740  0.056567  0.036248  0.066756  0.017396  0.015075  0.030266  0.013782  0.037396 
## TMRC30275 TMRC30276 TMRC30256 TMRC30240 TMRC30280 TMRC30284 TMRC30285 TMRC30058 TMRC30094 TMRC30103 TMRC30093 TMRC30170 TMRC30083 TMRC30118 
##  0.004977  0.009685  0.003678  0.011747  0.004587  0.018823  0.011814  0.064838  0.057588  0.250989  0.008303  0.010832  0.026117  0.021574 
## TMRC30121 TMRC30021 TMRC30031 TMRC30027 TMRC30166 TMRC30195 TMRC30047 TMRC30053 TMRC30068 TMRC30192 TMRC30042 TMRC30158 TMRC30160 TMRC30167 
##  0.016174  0.011014  0.011136  0.010749  0.164854  0.007850  0.171839  0.318381  0.055379  0.003692  0.009871  0.018550  0.033927  0.009458 
## TMRC30181 TMRC30133 TMRC30116 TMRC30076 TMRC30088 TMRC30134 TMRC30137 TMRC30175 TMRC30143 TMRC30146 TMRC30198 TMRC30200 TMRC30202 TMRC30204 
##  0.010955  0.012120  0.332469  0.280253  0.366220  0.008721  0.028016  0.006401  0.037261  0.016008  0.040711  0.012649  0.007974  0.070550 
## TMRC30206 TMRC30238 TMRC30208 TMRC30218 TMRC30220 TMRC30265 
##  0.234763  0.015708  0.014484  0.006692  0.002911  0.255307 
## 
##    cure failure 
##      38      24
## transform_counts: Found 52 values equal to 0, adding 1 to the matrix.
shp <- plot_sample_heatmap(few, heatmap_colors = viridis, row_label = wanted_genes)
shp

few <-  subset_genes(t_neutrophils, ids = wanted_ids, method = "keep") %>%
  set_expt_conditions(fact = "finaloutcome") %>%
  normalize_expt(transform = "log2", convert = "rpkm",
                 column = "mean_cds_len")
## remove_genes_expt(), before removal, there were 19923 genes, now there are 10.
## There are 41 samples which kept less than 90 percent counts.
## TMRC30058 TMRC30094 TMRC30103 TMRC30093 TMRC30170 TMRC30083 TMRC30118 TMRC30121 TMRC30021 TMRC30031 TMRC30027 TMRC30166 TMRC30195 TMRC30047 
##  0.064838  0.057588  0.250989  0.008303  0.010832  0.026117  0.021574  0.016174  0.011014  0.011136  0.010749  0.164854  0.007850  0.171839 
## TMRC30053 TMRC30068 TMRC30192 TMRC30042 TMRC30158 TMRC30160 TMRC30167 TMRC30181 TMRC30133 TMRC30116 TMRC30076 TMRC30088 TMRC30134 TMRC30137 
##  0.318381  0.055379  0.003692  0.009871  0.018550  0.033927  0.009458  0.010955  0.012120  0.332469  0.280253  0.366220  0.008721  0.028016 
## TMRC30175 TMRC30143 TMRC30146 TMRC30198 TMRC30200 TMRC30202 TMRC30204 TMRC30206 TMRC30238 TMRC30208 TMRC30218 TMRC30220 TMRC30265 
##  0.006401  0.037261  0.016008  0.040711  0.012649  0.007974  0.070550  0.234763  0.015708  0.014484  0.006692  0.002911  0.255307 
## 
##    cure failure 
##      20      21
## transform_counts: Found 20 values equal to 0, adding 1 to the matrix.
shp <- plot_sample_heatmap(few, heatmap_colors = viridis, row_label = wanted_genes)
shp

10.8 Neutrophils v1

few <-  subset_genes(tc_neutrophils, ids = wanted_ids, method = "keep") %>%
  set_expt_conditions(fact = "finaloutcome") %>%
  subset_expt(subset = "visitnumber=='1'") %>%
  normalize_expt(transform = "log2", convert = "rpkm",
                 column = "mean_cds_len")
## remove_genes_expt(), before removal, there were 19923 genes, now there are 10.
## There are 62 samples which kept less than 90 percent counts.
## TMRC30186 TMRC30179 TMRC30222 TMRC30224 TMRC30149 TMRC30140 TMRC30153 TMRC30235 TMRC30226 TMRC30229 TMRC30232 TMRC30210 TMRC30213 TMRC30215 
##  0.004192  0.012853  0.011388  0.012827  0.080425  0.058740  0.056567  0.036248  0.066756  0.017396  0.015075  0.030266  0.013782  0.037396 
## TMRC30275 TMRC30276 TMRC30256 TMRC30240 TMRC30280 TMRC30284 TMRC30285 TMRC30058 TMRC30094 TMRC30103 TMRC30093 TMRC30170 TMRC30083 TMRC30118 
##  0.004977  0.009685  0.003678  0.011747  0.004587  0.018823  0.011814  0.064838  0.057588  0.250989  0.008303  0.010832  0.026117  0.021574 
## TMRC30121 TMRC30021 TMRC30031 TMRC30027 TMRC30166 TMRC30195 TMRC30047 TMRC30053 TMRC30068 TMRC30192 TMRC30042 TMRC30158 TMRC30160 TMRC30167 
##  0.016174  0.011014  0.011136  0.010749  0.164854  0.007850  0.171839  0.318381  0.055379  0.003692  0.009871  0.018550  0.033927  0.009458 
## TMRC30181 TMRC30133 TMRC30116 TMRC30076 TMRC30088 TMRC30134 TMRC30137 TMRC30175 TMRC30143 TMRC30146 TMRC30198 TMRC30200 TMRC30202 TMRC30204 
##  0.010955  0.012120  0.332469  0.280253  0.366220  0.008721  0.028016  0.006401  0.037261  0.016008  0.040711  0.012649  0.007974  0.070550 
## TMRC30206 TMRC30238 TMRC30208 TMRC30218 TMRC30220 TMRC30265 
##  0.234763  0.015708  0.014484  0.006692  0.002911  0.255307 
## 
##    cure failure 
##      38      24
## subset_expt(): There were 62, now there are 25 samples.
## transform_counts: Found 25 values equal to 0, adding 1 to the matrix.
shp <- plot_sample_heatmap(few, heatmap_colors = viridis, row_label = wanted_genes)
shp

few <-  subset_genes(t_neutrophils, ids = wanted_ids, method = "keep") %>%
  set_expt_conditions(fact = "finaloutcome") %>%
  subset_expt(subset = "visitnumber=='1'") %>%
  normalize_expt(transform = "log2", convert = "rpkm",
                 column = "mean_cds_len")
## remove_genes_expt(), before removal, there were 19923 genes, now there are 10.
## There are 41 samples which kept less than 90 percent counts.
## TMRC30058 TMRC30094 TMRC30103 TMRC30093 TMRC30170 TMRC30083 TMRC30118 TMRC30121 TMRC30021 TMRC30031 TMRC30027 TMRC30166 TMRC30195 TMRC30047 
##  0.064838  0.057588  0.250989  0.008303  0.010832  0.026117  0.021574  0.016174  0.011014  0.011136  0.010749  0.164854  0.007850  0.171839 
## TMRC30053 TMRC30068 TMRC30192 TMRC30042 TMRC30158 TMRC30160 TMRC30167 TMRC30181 TMRC30133 TMRC30116 TMRC30076 TMRC30088 TMRC30134 TMRC30137 
##  0.318381  0.055379  0.003692  0.009871  0.018550  0.033927  0.009458  0.010955  0.012120  0.332469  0.280253  0.366220  0.008721  0.028016 
## TMRC30175 TMRC30143 TMRC30146 TMRC30198 TMRC30200 TMRC30202 TMRC30204 TMRC30206 TMRC30238 TMRC30208 TMRC30218 TMRC30220 TMRC30265 
##  0.006401  0.037261  0.016008  0.040711  0.012649  0.007974  0.070550  0.234763  0.015708  0.014484  0.006692  0.002911  0.255307 
## 
##    cure failure 
##      20      21
## subset_expt(): There were 41, now there are 16 samples.
## transform_counts: Found 9 values equal to 0, adding 1 to the matrix.
shp <- plot_sample_heatmap(few, heatmap_colors = viridis, row_label = wanted_genes)
shp

tmp <- loadme(filename=savefile)
LS0tCnRpdGxlOiAiVE1SQzMgMjAyMzA0OiBWaXN1YWxpemluZyBBbmFseXNlcyIKYXV0aG9yOiAiYXRiIGFiZWxld0BnbWFpbC5jb20iCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogaHRtbF9kb2N1bWVudDoKICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgY29kZV9mb2xkaW5nOiBzaG93CiAgZmlnX2NhcHRpb246IHRydWUKICBmaWdfaGVpZ2h0OiA3CiAgZmlnX3dpZHRoOiA3CiAgaGlnaGxpZ2h0OiBkZWZhdWx0CiAga2VlcF9tZDogZmFsc2UKICBtb2RlOiBzZWxmY29udGFpbmVkCiAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgc2VsZl9jb250YWluZWQ6IHRydWUKICB0aGVtZTogcmVhZGFibGUKICB0b2M6IHRydWUKICB0b2NfZmxvYXQ6CiAgIGNvbGxhcHNlZDogZmFsc2UKICAgc21vb3RoX3Njcm9sbDogZmFsc2UKLS0tCgo8c3R5bGU+CiAgYm9keSAubWFpbi1jb250YWluZXIgewogICAgbWF4LXdpZHRoOiAxNjAwcHg7CiAgfQo8L3N0eWxlPgoKYGBge3Igb3B0aW9ucywgaW5jbHVkZT1GQUxTRX0KbGlicmFyeShocGdsdG9vbHMpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZm9yY2F0cykKbGlicmFyeShnbHVlKQp0dCA8LSBzbShkZXZ0b29sczo6bG9hZF9hbGwoIn4vaHBnbHRvb2xzIikpCmtuaXRyOjpvcHRzX2tuaXQkc2V0KHByb2dyZXNzID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gOTAsCiAgICAgICAgICAgICAgICAgICAgIGVjaG8gPSBUUlVFKQprbml0cjo6b3B0c19jaHVuayRzZXQoZXJyb3IgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgZmlnLndpZHRoID0gOCwKICAgICAgICAgICAgICAgICAgICAgIGZpZy5oZWlnaHQgPSA4LAogICAgICAgICAgICAgICAgICAgICAgZHBpID0gOTYpCm9sZF9vcHRpb25zIDwtIG9wdGlvbnMoZGlnaXRzID0gNCwKICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAga25pdHIuZHVwbGljYXRlLmxhYmVsID0gImFsbG93IikKZ2dwbG90Mjo6dGhlbWVfc2V0KGdncGxvdDI6OnRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDEyKSkKdmVyIDwtICIyMDIzMDQiCnByZXZpb3VzX2ZpbGUgPC0gIiIKcnVuZGF0ZSA8LSBmb3JtYXQoU3lzLkRhdGUoKSwgZm9ybWF0ID0gIiVZJW0lZCIpCgojI3RtcCA8LSB0cnkoc20obG9hZG1lKGZpbGVuYW1lPWdzdWIocGF0dGVybj0iXFwuUm1kIiwgcmVwbGFjZT0iXFwucmRhXFwueHoiLCB4PXByZXZpb3VzX2ZpbGUpKSkpCnJtZF9maWxlIDwtIGdsdWUoInRtcmMzX3Zpc3VhbGl6YXRpb25fe3Zlcn0uUm1kIikKc2F2ZWZpbGUgPC0gZ3N1YihwYXR0ZXJuID0gIlxcLlJtZCIsIHJlcGxhY2U9IlxcLnJkYVxcLnh6IiwgeCA9IHJtZF9maWxlKQpsb2FkZWQgPC0gbG9hZChmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX2RhdGFfc3RydWN0dXJlcy12e3Zlcn0ucmRhIikpCmBgYAoKIyBDaGFuZ2Vsb2cKCiogU2V0IGlucHV0IGRhdGEgdG8gdGhlIG5ldyAyMDIyMTIgZGF0YXNldC4gIExvb2tpbmcgZm9yIHNvbWUgbWVzc2VkIHVwIGNvbG9ycy4KKiBSZWFzb25hYmx5IGNlcnRhaW4gSSBmaWd1cmVkIG91dCB0aGUgY29sb3IgZGlzY3JlcGVuY3kuICBJIHdhcwogIGxldHRpbmcgdGhlIGVvc2lub3BoaWwgZGF0YXNldCBjaG9vc2UgaXRzIG93biBjb2xvcnMgcmF0aGVyIHRoYW4KICBmb3JjZSB0aGVtIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBvdGhlciBjZWxsIHR5cGVzOyBldmVuIHRob3VnaCBJCiAgX3Rob3VnaHRfIEkgdG9sZCB0aGVtIHRvIGV4cGxpY2l0bHkgc2V0IHRoZWlyIGNvbG9ycyB0byBiZSB0aGUgc2FtZQogIGFzIHRoZSBvdGhlcnMuICBJIHRoaW5rIHRoZSBjaGFuZ2VzIEkgbWFkZSBpbiBkYXRhc2V0cy5SbWQgZml4ZWQKICB0aGlzLCBzbyBJIHJlZ2VuZXJhdGVkIHRoZSByZGEvZXRjIGluIHRoYXQgZG9jdW1lbnQgYW5kIGFtIG5vdwogIHRlc3RpbmcgdGhlIGNvbG9ycyBoZXJlLgoKIyBJbnRyb2R1Y3Rpb24KCk1vdmluZyBhbGwgb2YgdGhlIHZpc3VhbGl6YXRpb24gYW5kIGRpYWdub3N0aWMgdGFza3MgdG8gdGhpcyBkb2N1bWVudC4KVGhlIG1ldGFkYXRhIGFuZCBnZW5lIGFubm90YXRpb24gZGF0YSBjb2xsZWN0aW9uIHRhc2tzIGFyZSB0aGVyZWZvcmUKaW4gdG1yYzNfZGF0YV9zdHJ1Y3R1cmVzLlJtZC4gIFRoZSByZWFzb25zIGZvciBzb21lIG9mIHRoZSBkYXRhCnN0cnVjdHVyZSBjcmVhdGlvbiBpbiB0aGF0IGRvY3VtZW50IGlzIG1hZGUgY2xlYXIgaW4gdGhpcyBkb2N1bWVudCwKYnV0IHRoZXkgYXJlIGFsbCBwZXJmb3JtZWQgdGhlcmUuCgojIE5vdGVzCgoxLiAgTGVzaW9uIHZzIFVsY2VyOiBVbGNlciBpcyB0aGUgYmFzZSBvZiB0aGUgY3JhdGVyIG9mIHRoZSBsZXNpb24Kb2JzZXJ2ZWQuICBUaGUgbGVzaW9uIGlzIHRoaXMsIHRoZSBib3JkZXIsIGFuZCBhbnkgcmVnaW9uIHdpdGggc2lnbnMKb2YgaW5mbGFtbWF0aW9uLiAgSXQgaXMgbm90IGtub3duIGlmIHRoZXNlIG1ldHJpY3MgYXJlIGVxdWl2YWxlbnQsIG9yCmlmIG9uZSBpcyBiZXR0ZXIgdGhhbiB0aGUgb3RoZXIuICBTb21lIHBlb3BsZSBkbyBub3QgaGF2ZSB1bGNlcnMgYW5kCnRoZXJlZm9yZSBpbiB0aG9zZSBjYXNlcyB3ZSBjYW4gb25seSByZWFsbHkgY29uc2lkZXIgdGhlIGxlc2lvbiBzaXplLgpFLmcuIG1vc3QgcGVvcGxlIGluIENvbG9tYmlhIGhhdmUgdWxjZXJzLCB3aGljaCBhcmUgdGhlIGNyYXRlcmVkIHNvcmU7Cmhvd2V2ZXIgdGhlcmUgYXJlIGEgZmV3IHBlb3BsZSB3aG8gaGF2ZSBhICdwbGFxdWUnIG9yIHNvbWUgZm9ybSBvZgpzbWFsbGVyLCBsZXNzIGludHJ1c2l2ZSBwcmVzZW50YXRpb24gLS0gdGhlc2UgYXJlIHN0aWxsIGN1dGFuZW91cy4KClRodXMgdGhlIGxlc2lvbiBzaXplIGlzIHRoZSBtb3JlIGluY2x1c2l2ZSBtZXRyaWMsIGJ1dCBwb3RlbnRpYWxseQp1bGNlciBzaXplIGlzIG1vcmUgaW5mb3JtYXRpdmU/ICBBbnkgaW5mbGFtbWF0aW9uIGluIHRoZSBza2luIGNhdXNlcwp0aGUgcGVyc29uIHRvIGJlIGRlZmluZWQgYXMgZmFpbHVyZS4KCjIuIE5vdGUgZnJvbSBNYXJpYSBBZGVsYWlkYTogU29tZSBjaGVtb2tpbmVzIGFyZSBzdWdnZXN0aXZlIG9mIEVvc2lub3BoaWwgcmVjcnVpdG1lbnQuCgojIyBHb2FscwoKVGhlc2Ugc2FtcGxlcyBhcmUgZnJvbSBwYXRpZW50cyB3aG8gZWl0aGVyIHN1Y2Nlc3NmdWxseSBjbGVhcmVkIGEKTGVpc2htYW5pYSBwYW5hbWVuc2lzIGluZmVjdGlvbiBmb2xsb3dpbmcgdHJlYXRtZW50LCBvciBkaWQgbm90LiAgVGhleQppbmNsdWRlIGJpb3BzaWVzIGZyb20gZWFjaCBwYXRpZW50IGFsb25nIHdpdGggcHVyaWZpY2F0aW9ucyBmb3IKTW9ub2N5dGVzLCBOZXV0cm9waGlscywgYW5kIEVvc2lub3BoaWxzLiAgV2hlbiBwb3NzaWJsZSwgdGhpcyBwcm9jZXNzCndhcyByZXBlYXRlZCBvdmVyIHRocmVlIHZpc2l0czsgYnV0IHNvbWUgcGF0aWVudHMgZGlkIG5vdCByZXR1cm4KZm9yIHRoZSBzZWNvbmQgb3IgdGhpcmQgdmlzaXQuCgpUaGUgb3Zlci1hcmNoaW5nIGdvYWwgaXMgdG8gbG9vayBmb3IgYXR0cmlidXRlcyhtb3N0IGxpa2VseSBnZW5lcykKd2hpY2ggZGlzdGluZ3Vpc2ggcGF0aWVudHMgd2hvIGRvIGFuZCBkbyBub3QgY3VyZSB0aGUgaW5mZWN0aW9uIGFmdGVyCnRyZWF0bWVudC4gIElmIHBvc3NpYmxlLCB0aGVzZSB3aWxsIGJlIGFwcGFyZW50IG9uIHRoZSBmaXJzdCB2aXNpdC4KCmBgYHtyIGhzX3ByZV9uen0KcGxvdF9sZWdlbmQoaHNfZXhwdCkkcGxvdAphbGxfbnogPC0gcGxvdF9ub256ZXJvKGhzX2V4cHQpCmFsbF9ueiRwbG90CmBgYAoKIyMgRmlndXJlIFhYICsgMTogTm9uLXplcm8gZ2VuZXMgYWZ0ZXIgc2FtcGxlIGZpbHRlcmluZwoKVGhlIGZvbGxvd2luZyBwbG90IGlzIGVzc2VudGlhbGx5IGlkZW50aWNhbCB0byB0aGUgcHJldmlvdXMgd2l0aCB0d28KZXhjZXB0aW9uczoKCjEuICBUaGUgc2FtcGxlcyB3aXRoIHRvbyBmZXcgZ2VuZXMgKDExLDAwMCBjdXJyZW50bHkpIGFyZSBnb25lLiAgSW4KICAgIHRoZSBjdXJyZW50IGl0ZXJhdGlvbiBvZiB0aGUgZGF0YXNldHMgUm1kLCB0aGlzIGNvbXByaXNlcyBlaXRoZXIKICAgIHR3byBvciB0aHJlZSBzYW1wbGVzLgoyLiAgVGhlIHNhbXBsZXMgYXJlIGNvbG9yZWQgYnkgY3VyZShwdXJwbGUpL2ZhaWwoeWVsbG93KQoKYGBge3IgbnpfcG9zdH0KbnpfcG9zdCA8LSBwbG90X25vbnplcm8odGNfdmFsaWQsIHBsb3RfbGFiZWxzID0gRkFMU0UpCm56X3Bvc3QkcGxvdApgYGAKCiMjIFF1aWNrIHBpY3R1cmUgYmVmb3JlIHJlbW92aW5nIG1pbHRlZm9zaW5lIHNhbXBsZXMKCk1hcmlhIEFkZWxhaWRhJ3MgcXVvdGU6ICJJIHdvdWxkIGxpa2Ugb25lIHBpY3R1cmUgb2YgYWxsIHNhbXBsZXMKaW5jbHVkaW5nIHRoZSBtaWx0ZWZvc2luZSBzbyB0aGF0IEkgY2FuIGtlZXAgaW4gbXkgbWluZCB3aHkgd2UgcmVtb3ZlZAp0aGVtLiIKCiMgUENBIHdpdGggYm90aCBkcnVncwoKYGBge3IgYm90aF9kcnVnc30KdGNfZXhwdF9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KGhzX2V4cHQsIGZpbHRlciA9IFRSVUUsIG5vcm0gPSAicXVhbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydCA9ICJjcG0iLCB0cmFuc2Zvcm0gPSAibG9nMiIpICU+JQogIHNldF9leHB0X2JhdGNoZXMoZmFjdCA9ICJkcnVnIikKCnRjX2V4cHRfZHJ1Z19wY2EgPC0gcGxvdF9wY2EodGNfZXhwdF9ub3JtLCBjaXMgPSBOVUxMKQp0Y19leHB0X2RydWdfcGNhIDwtIHBsb3RfcGNhKHRjX2V4cHRfbm9ybSkKdGNfZXhwdF9kcnVnX3BjYSRwbG90Cgp0Y19leHB0X25iIDwtIG5vcm1hbGl6ZV9leHB0KGhzX2V4cHQsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSAibG9nMiIsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIHNldF9leHB0X2JhdGNoZXMoZmFjdCA9ICJkcnVnIikKdGNfZXhwdF9kcnVnX25iX3BjYSA8LSBwbG90X3BjYSh0Y19leHB0X25iLCBwbG90X2xhYmVscyA9ICJub3JtYWwiKQp0Y19leHB0X2RydWdfbmJfcGNhJHBsb3QKCnRfZXhwdF9kcnVnIDwtIHN1YnNldF9leHB0KGhzX2V4cHQsIHN1YnNldCA9ICJjbGluaWM9PSdUdW1hY28nIikKdF9leHB0X25vcm0gPC0gbm9ybWFsaXplX2V4cHQodF9leHB0X2RydWcsIGZpbHRlciA9IFRSVUUsIG5vcm0gPSAicXVhbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ID0gImNwbSIsIHRyYW5zZm9ybSA9ICJsb2cyIikgJT4lCiAgc2V0X2V4cHRfYmF0Y2hlcyhmYWN0ID0gImRydWciKQp0X2V4cHRfZHJ1Z19wY2EgPC0gcGxvdF9wY2EodF9leHB0X25vcm0pCnRfZXhwdF9kcnVnX3BjYSRwbG90Cgp0X2V4cHRfbmIgPC0gbm9ybWFsaXplX2V4cHQodF9leHB0X2RydWcsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSAibG9nMiIsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIHNldF9leHB0X2JhdGNoZXMoZmFjdCA9ICJkcnVnIikKdF9leHB0X2RydWdfbmJfcGNhIDwtIHBsb3RfcGNhKHRfZXhwdF9uYikKdF9leHB0X2RydWdfbmJfcGNhJHBsb3QKYGBgCgojIyBTdW1tYXJpemU6IFRhbGx5IHNhbXBsZXMgYWZ0ZXIgZmlsdGVyaW5nCgpXZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgaG93IG1hbnkgb2YgZWFjaCBzYW1wbGUgdHlwZSBpcyBsb3N0IHdoZW4gd2UKZG8gb3VyIHZhcmlvdXMgZmlsdGVycy4gIFRodXMgSSBhbSByZXBlYXRpbmcgdGhlIHNhbWUgc2V0IG9mIHRhbGxpZXMuClRoaXMgd2lsbCBsaWtlbHkgaGFwcGVuIG9uZSBtb3JlIHRpbWUsIGZvbGxvd2luZyB0aGUgcmVtb3ZhbCBvZgpzYW1wbGVzIHdoaWNoIGNhbWUgZnJvbSBDYWxpLgoKYGBge3IgdGFibGVfdmFsaWR9CnRhYmxlKHBEYXRhKHRjX3ZhbGlkKSRkcnVnKQp0YWJsZShwRGF0YSh0Y192YWxpZCkkY2xpbmljKQp0YWJsZShwRGF0YSh0Y192YWxpZCkkZmluYWxvdXRjb21lKQp0YWJsZShwRGF0YSh0Y192YWxpZCkkdHlwZW9mY2VsbHMpCnRhYmxlKHBEYXRhKHRjX3ZhbGlkKSR2aXNpdCkKc3VtbWFyeShhcy5udW1lcmljKHBEYXRhKHRjX3ZhbGlkKSRlYl9sY190aWVtcG9fZXZvbHVjaW9uKSkKc3VtbWFyeShhcy5udW1lcmljKHBEYXRhKHRjX3ZhbGlkKSRlYl9sY190dG9fbWN0b19nbHVjYW5fZG9zaXMpKQpzdW1tYXJ5KGFzLm51bWVyaWMocERhdGEodGNfdmFsaWQpJHYzX2xjX2VqZXlfbGVzaW9uX21tXzEpKQpzdW1tYXJ5KGFzLm51bWVyaWMocERhdGEodGNfdmFsaWQpJHYzX2xjX2xlc2lvbl9hcmVhXzEpKQpzdW1tYXJ5KGFzLm51bWVyaWMocERhdGEodGNfdmFsaWQpJHYzX2xjX2VqZXhfdWxjZXJhX21tXzEpKQp0YWJsZShwRGF0YSh0Y192YWxpZCkkZWJfbGNfc2V4bykKdGFibGUocERhdGEodGNfdmFsaWQpJGViX2xjX2V0bmlhKQpzdW1tYXJ5KGFzLm51bWVyaWMocERhdGEodGNfdmFsaWQpJGVkYWQpKQp0YWJsZShwRGF0YSh0Y192YWxpZCkkZWJfbGNfcGVzbykKdGFibGUocERhdGEodGNfdmFsaWQpJGViX2xjX2VzdGF0dXJhKQoKbGVuZ3RoKHVuaXF1ZShwRGF0YSh0Y192YWxpZClbWyJjb2RpZ29fcGFjaWVudGUiXV0pKQpgYGAKCiMgSG9zdCBEaXN0cmlidXRpb25zL1Zpc3VhbGl6YXRpb25zIG9mIGludGVyZXN0CgpUaGUgc2V0cyBvZiBzYW1wbGVzIHVzZWQgdG8gdmlzdWFsaXplIHRoZSBkYXRhIHdpbGwgYWxzbyBjb21wcmlzZSB0aGUKc2V0cyB1c2VkIHdoZW4gbGF0ZXIgcGVyZm9ybWluZyB0aGUgdmFyaW91cyBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbgphbmFseXNlcy4KCiMjIEdsb2JhbCBtZXRyaWNzCgpTdGFydCBvdXQgd2l0aCBzb21lIGluaXRpYWwgbWV0cmljcyBvZiBhbGwgc2FtcGxlcy4gIFRoZSBtb3N0IG9idmlvdXMKYXJlIHBsb3RzIG9mIHRoZSBudW1iZXJzIG9mIG5vbi16ZXJvIGdlbmVzIG9ic2VydmVkLCBoZWF0bWFwcyBzaG93aW5nCnRoZSByZWxhdGl2ZSByZWxhdGlvbnNoaXBzIGFtb25nIHRoZSBzYW1wbGVzLCB0aGUgcmVsYXRpdmUgbGlicmFyeQpzaXplcywgYW5kIHNvbWUgUENBLiAgSXQgbWlnaHQgYmUgc21hcnQgdG8gc3BsaXQgdGhlIGxpYnJhcnkgc2l6ZXMgdXAKYWNyb3NzIHN1YnNldHMgb2YgdGhlIGRhdGEsIGJlY2F1c2UgdGhleSBoYXZlIGV4cGFuZGVkIHRvbyBmYXIgdG8gc2VlCndlbGwgb24gYSBjb21wdXRlciBzY3JlZW4uCgpUaGUgbW9zdCBsaWtlbHkgZmFjdG9ycyB0byBxdWVyeSB3aGVuIGNvbnNpZGVyaW5nIHRoZSBlbnRpcmUgZGF0YXNldAphcmUgY3VyZS9mYWlsLCB2aXNpdCwgYW5kIGNlbGwgdHlwZS4gIFRoaXMgaXMgdGhlIGxldmVsIGF0IHdoaWNoIHdlCndpbGwgY2hvb3NlIHNhbXBsZXMgdG8gZXhjbHVkZSBmcm9tIGZ1dHVyZSBhbmFseXNlcy4KCmBgYHtyIGdsb2JhbF9kaXN0cmlidXRpb25zfQpwbG90X2xlZ2VuZCh0Y19iaW9wc2llcykkcGxvdApwbG90X2xpYnNpemUodGNfYmlvcHNpZXMpJHBsb3QKcGxvdF9ub256ZXJvKHRjX2Jpb3BzaWVzKSRwbG90CmBgYAoKVGhlcmUgaXMgYSAocmVsYXRpdmVseSluZXcgZnVuY3Rpb24gaW4gdGhlIGZvbGxvd2luZyBibG9jay4KcGxvdF9saWJzaXplX3ByZXBvc3QgYXR0ZW1wdHMgdG8gcHJvdmlkZSBhbiBpZGVhIGFib3V0IGhvdyBtdWNoIGRhdGEKaXMgbG9zdCB3aGVuIGxvdy1jb3VudCBmaWx0ZXJpbmcgdGhlIGRhdGEuCgpUaGUgZmlyc3QgcGxvdCBpdCBwcm9kdWNlcyBpcyBhIGJhcnBsb3Qgb2YgdGhlIG51bWJlciBvZiByZWFkcyByZW1vdmVkCmJ5IHRoZSBmaWx0ZXIgZnJvbSBlYWNoIHNhbXBsZS4gIFRoZSBzZWNvbmQgcGxvdCBoYXMgdHdvIGJhcnMsIHRoZSB0b3AKYmFyIGlzIGxhYmVsZWQgd2l0aCB0aGUgbnVtYmVyIG9mIGxvdy1jb3VudCBnZW5lcyBiZWZvcmUgdGhlIGZpbHRlci4KVGhlIGxvd2VyIGJhciByZXByZXNlbnRzIHRoZSBudW1iZXIgYWZ0ZXIgdGhlIGZpbHRlciBhbmQgaXMgYXNzdW1lZCB0bwpiZSBxdWl0ZSBsb3cuCgpgYGB7ciBiaW9wc3lfcHJlcG9zdH0KYmlvcHN5X3ByZXBvc3QgPC0gcGxvdF9saWJzaXplX3ByZXBvc3QodGNfYmlvcHNpZXMpCmJpb3BzeV9wcmVwb3N0JGNvdW50X3Bsb3QKYmlvcHN5X3ByZXBvc3QkbG93Z2VuZV9wbG90CiMjIE1pbmltdW0gbnVtYmVyIG9mIGJpb3BzeSBnZW5lczogfiAxNCwwMDAKCnBsb3RfbGlic2l6ZSh0Y19lb3Npbm9waGlscykkcGxvdApwbG90X25vbnplcm8odGNfZW9zaW5vcGhpbHMpJHBsb3QKZW9zaW5vcGhpbF9wcmVwb3N0IDwtIHBsb3RfbGlic2l6ZV9wcmVwb3N0KHRjX2Vvc2lub3BoaWxzKQplb3Npbm9waGlsX3ByZXBvc3QkY291bnRfcGxvdAplb3Npbm9waGlsX3ByZXBvc3QkbG93Z2VuZV9wbG90CiMjIE1pbmltdW0gbnVtYmVyIG9mIGVvc2lub3BoaWwgZ2VuZXM6IH4gMTMsNTAwCgpwbG90X2xpYnNpemUodGNfbW9ub2N5dGVzKSRwbG90CnBsb3Rfbm9uemVybyh0Y19tb25vY3l0ZXMpJHBsb3QKbW9ub2N5dGVfcHJlcG9zdCA8LSBwbG90X2xpYnNpemVfcHJlcG9zdCh0Y19tb25vY3l0ZXMpCm1vbm9jeXRlX3ByZXBvc3QkY291bnRfcGxvdAptb25vY3l0ZV9wcmVwb3N0JGxvd2dlbmVfcGxvdAojIyBNaW5pbXVtIG51bWJlciBvZiBtb25vY3l0ZSBnZW5lczogfiA3LDUwMCBiZWZvcmUgc2V0dGluZyB0aGUgbWluaW11bS4KCnBsb3RfbGlic2l6ZSh0Y19uZXV0cm9waGlscykkcGxvdApwbG90X25vbnplcm8odGNfbmV1dHJvcGhpbHMpJHBsb3QKbmV1dHJvcGhpbF9wcmVwb3N0IDwtIHBsb3RfbGlic2l6ZV9wcmVwb3N0KHRjX25ldXRyb3BoaWxzKQpuZXV0cm9waGlsX3ByZXBvc3QkY291bnRfcGxvdApuZXV0cm9waGlsX3ByZXBvc3QkbG93Z2VuZV9wbG90CiMjIE1pbmltdW0gbnVtYmVyIG9mIG5ldXRyb3BoaWwgZ2VuZXM6IH4gMTAsMDAwIGJlZm9yZSBzZXR0aW5nIG1pbmltdW0gY292ZXJhZ2UuCmBgYAoKVGhlIGFib3ZlIGJsb2NrIGp1c3QgcmVwZWF0cyB0aGUgc2FtZSB0d28gcGxvdHMgb24gYSBwZXItY2VsbHR5cGUKYmFzaXM6IHRoZSBudW1iZXIgb2YgcmVhZHMgb2JzZXJ2ZWQgLyBzYW1wbGUgYW5kIGEgcGxvdCBvZiBvYnNlcnZlZApnZW5lcyB3aXRoIHJlc3BlY3QgdG8gY292ZXJhZ2UuICBJIG1hZGUgc29tZSBjb21tZW50cyB3aXRoIG15Cm9ic2VydmF0aW9ucyBhYm91dCB0aGUgbnVtYmVyIG9mIGdlbmVzLgoKIyMgR2xvYmFsIHZpZXdzIG9mIGFsbCBjZWxsIHR5cGVzCgpOb3cgdGhhdCB0aG9zZSAnZ2xvYmFsJyBtZXRyaWNzIGFyZSBvdXQgb2YgdGhlIHdheSwgbGV0cyBsb29rIGF0IHNvbWUKZ2xvYmFsIG1ldHJpY3Mgb2YgdGhlIGRhdGEgZm9sbG93aW5nIG5vcm1hbGl6YXRpb247IHRoZSBtb3N0IGxpa2VseQpwbG90cyBhcmUgb2YgY291cnNlIFBDQSBidXQgYWxzbyBhIGNvdXBsZSBvZiBoZWF0bWFwcy4KCiMjIyBGaWd1cmUgMQoKSW4gdGhlIGdvb2dsZSBkb2MgVE1SQzNfQXVnMThfMjAyMSwgdGhlcmUgaXMgYW4gZXhhbXBsZSBvZiBhbiBpbWFnZQpmb3IgdGhlIGZpcnN0IGZpZ3VyZToKCiJUcmFuc2NyaXB0b21pYyBwcm9maWxlcyBvZiBwcmltYXJ5IGlubmF0ZSBjZWxscyBvZiBDTCBwYXRpZW50cyBzaG93CnVuaXF1ZSB0cmFuc2NyaXB0aW9uYWwgc2lnbmF0dXJlcyAtIFJlbW92ZSBQQk1DcyBhbmQgTTAsIG1heWJlCmJpb3BzaWVzIGFzIHdlbGwgKGJ1dCBSZW1vdmUgV1Qgc2FtcGxlcykiCgpXaGlsZSB3ZSB3ZXJlIHRhbGtpbmcgaW4gYSBtZWV0aW5nIGhvd2V2ZXIsIGl0IHNvdW5kZWQgbGlrZSB0aGVyZSB3YXMKc29tZSBkZXNpcmUgdG8ga2VlcCBhbGwgY2VsbCB0eXBlcy4gIFRoZXJlZm9yZSB0aGUgZm9sbG93aW5nIGJsb2NrCmhhcyBvbmUgaW1hZ2Ugd2l0aCBldmVyeXRoaW5nIGFuZCBvbmUgZm9sbG93aW5nIHRoZSBhYm92ZS4KCmBgYHtyIGdsb2JhbF9wY2F9CnRjX3R5cGUgPC0gc2V0X2V4cHRfY29uZGl0aW9ucyh0Y192YWxpZCwgZmFjdCA9ICJ0eXBlb2ZjZWxscyIpICU+JQogIHNldF9leHB0X2JhdGNoZXMoZmFjdCA9ICJmaW5hbG91dGNvbWUiKSAlPiUKICBzZXRfZXhwdF9jb2xvcnMoY29sb3JfY2hvaWNlc1tbInR5cGUiXV0pCgp0Y19ub3JtIDwtIHNtKG5vcm1hbGl6ZV9leHB0KHRjX3R5cGUsIHRyYW5zZm9ybSA9ICJsb2cyIiwgbm9ybSA9ICJxdWFudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFKSkKCnRjX3BjYSA8LSBwbG90X3BjYSh0Y19ub3JtLCBwbG90X2xhYmVscyA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgIHBsb3RfdGl0bGUgPSAiUENBIC0gQ2VsbCB0eXBlIiwgc2l6ZV9jb2x1bW4gPSAidmlzaXRudW1iZXIiKQp0Y19wY2EkcGxvdAp0Y19wY2EgPC0gcGxvdF9wY2EodGNfbm9ybSwgcGxvdF9sYWJlbHMgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgIHBsb3RfdGl0bGUgPSAiUENBIC0gQ2VsbCB0eXBlIikKdGNfcGNhJHBsb3QKCnRjX3BjYV9ub3NpemUgPC0gcGxvdF9wY2EodGNfbm9ybSwgcGxvdF9sYWJlbHMgPSBGQUxTRSkKdGNfcGNhX25vc2l6ZSRwbG90Cgp3cml0ZS5jc3YodGNfcGNhJHRhYmxlLCBmaWxlID0gImNvb3Jkcy90Y19kb25vcl9wY2FfY29vcmRzLmNzdiIpCnRjX2NmX25vcm0gPC0gc2V0X2V4cHRfYmF0Y2hlcyh0Y19ub3JtLCBmYWN0ID0gInZpc2l0bnVtYmVyIikKdGNfY2ZfY29yaGVhdCA8LSBwbG90X2NvcmhlYXQodGNfY2Zfbm9ybSwgcGxvdF90aXRsZSA9ICJIZWlyYXJjaGljYWwgY2x1c3RlcmluZzoKICAgICAgICAgY2VsbCB0eXBlcyIpCnRjX2NmX2NvcmhlYXQkcGxvdAoKdGNfY2ZfZGlzaGVhdCA8LSBwbG90X2Rpc2hlYXQodGNfY2Zfbm9ybSwgcGxvdF90aXRsZSA9ICJIZWlyYXJjaGljYWwgY2x1c3RlcmluZzoKICAgICAgICAgY2VsbCB0eXBlcyIpCnRjX2NmX2Rpc2hlYXQkcGxvdApgYGAKCiMjIEZpZ3VyZSAxQjogVHJhbnNjcmlwdG9taWMgcHJvZmlsZXMgb2YgcHJpbWFyeSBpbm5hdGUgY2VsbHMKCkEgcG90ZW50aWFsIGZpZ3VyZSBsZWdlbmQgZm9yIHRoZSBmb2xsb3dpbmcgaW1hZ2VzIG1pZ2h0IGluY2x1ZGU6CgpUaGUgb2JzZXJ2ZWQgY291bnRzIHBlciBnZW5lIGZvciBhbGwgb2YgdGhlIGNsaW5pY2FsIHNhbXBsZXMgd2VyZQpmaWx0ZXJlZCwgbG9nIHRyYW5zZm9ybWVkLCBjcG0gY29udmVydGVkLCBhbmQgcXVhbnRpbGUgbm9ybWFsaXplZC4KVGhlIGNvbG9ycyB3ZXJlIGRlZmluZWQgYnkgY2VsbCB0eXBlcyBhbmQgc2hhcGVzIGJ5IHBhdGllbnQgdmlzaXQuCldoZW4gdGhlIGZpcnN0IHR3byBwcmluY2lwbGUgY29tcG9uZW50cyB3ZXJlIHBsb3R0ZWQsIGNsdXN0ZXJpbmcgd2FzCm9ic2VydmVkIGJ5IGNlbGwgdHlwZS4gIFRoZSBiaW9wc3kgc2FtcGxlcyB3ZXJlIHNpZ25pZmljYW50bHkKZGlmZmVyZW50IGZyb20gdGhlIGlubmF0ZSBpbW11bmUgY2VsbCB0eXBlcy4KCmBgYHtyIGZpZzFiX3RyYW5zY3JpcHRvbWljX3Byb2ZpbGVzfQpmaWcxdjJfbm9ybSA8LSBub3JtYWxpemVfZXhwdCh0Y190eXBlLCB0cmFuc2Zvcm0gPSAibG9nMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnQgPSAiY3BtIiwgbm9ybSA9ICJxdWFudCIsIGZpbHRlciA9IFRSVUUpCmZpZzF2Ml9wY2EgPC0gcGxvdF9wY2EoZmlnMXYyX25vcm0sIGNpcyA9IEZBTFNFKQpmaWcxdjJfcGNhJHBsb3QKYGBgCgojIENvbXBhcmUgc2FtcGxlcyBieSBjbGluaWMKClNwb2lsZXIgYWxlcnQ6ICBUaGlzIHNlY3Rpb24gd2lsbCBldmVudHVhbGx5IHN1Z2dlc3QgcHJldHR5IHN0cm9uZ2x5CnRoYXQgd2Ugd2lsbCBub3QgZWFzaWx5IGJlIGFibGUgdG8gdXNlIHRoZSBDYWxpIHNhbXBsZXMuICBUaHVzLCBhZnRlcgpmaW5pc2hpbmcgaXQsIHdlIHdpbGwgbGlrZWx5IGV4Y2x1ZGUgdGhvc2Ugc2FtcGxlcy4KClRha2UgYSBtb21lbnQgdG8gdmlldyB0aGUgYmlvcHN5IHNhbXBsZXMuICBXZSBzZXBhcmF0ZWQgdGhlbSBieSBjbGluaWMKKENhbGkgb3IgVHVtYWNvKSwgYW5kIHRoaXMgdmlldyBvZiB0aGUgc2FtcGxlcyBpcyB0aGUgb25seSBvbmUgd2hpY2gKZG9lcyBub3Qgc3VnZ2VzdCBhIHN0cm9uZyBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byBjbGluaWNzLgpIb3dldmVyLCBpdCBhbHNvIHN1Z2dlc3RzIHRoYXQgdGhlIGJpb3BzeSBzYW1wbGVzIHdpbGwgbm90IHByb3ZlIHZlcnkgaGVscGZ1bC4KCiMjIEJpb3BzaWVzIGJ5IGNsaW5pYwoKYGBge3Igdmlld19iaW9wc2llc30KdGNfYmlvcHNpZXNfbm9ybSA8LSBub3JtYWxpemVfZXhwdCh0Y19iaW9wc2llcywgdHJhbnNmb3JtID0gImxvZzIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnQgPSAiY3BtIiwgbm9ybSA9ICJxdWFudCIsIGZpbHRlciA9IFRSVUUpCnRjX2Jpb3BzaWVzX3BjYSA8LSBwbG90X3BjYSh0Y19iaW9wc2llc19ub3JtLCBwbG90X2xhYmVscyA9IEZBTFNFKQp0Y19iaW9wc2llc19wY2EkcGxvdAoKdGNfYmlvcHNpZXNfbmIgPC0gbm9ybWFsaXplX2V4cHQodGNfYmlvcHNpZXMsIHRyYW5zZm9ybSA9ICJsb2cyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydCA9ICJjcG0iLCBiYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQp0Y19iaW9wc2llc19uYl9wY2EgPC0gcGxvdF9wY2EodGNfYmlvcHNpZXNfbmIsIHBsb3RfbGFiZWxzID0gRkFMU0UpCnRjX2Jpb3BzaWVzX25iX3BjYSRwbG90CmBgYAoKIyMgUGF0aWVudCBSYWNlIGFuZCBjbGluaWM/CgpIZXJlIGlzIHRoZSByZWxldmFudCBmaWVsZCBmb3IgZXRobmljaXR5IGZyb20gdGhlIGNvZGVib29rOgoKMSBBZnJvY29sb21iaWFuYQoyIEluZMOtZ2VuYQozIE1lc3RpemEKNCBCbGFuY2EKNSBNdWxhdGEKNiBPdHJhCjggTk8gREFUTwoKIyMjIEFsbCBzYW1wbGVzLCBib3RoIGNsaW5pY3MKCmBgYHtyIHBhdGllbnRfcmFjZX0KZXRuaWFfZXhwdCA8LSBzZXRfZXhwdF9jb25kaXRpb25zKHRjX3ZhbGlkLCBmYWN0ID0gImNsaW5pY19ldG5pYSIpICU+JQogIHNldF9leHB0X2NvbG9ycyhjb2xvcl9jaG9pY2VzW1siY2xpbmljX2V0bmlhIl1dKQpldG5pYV9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KGV0bmlhX2V4cHQsIHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IFRSVUUsIG5vcm0gPSAicXVhbnQiKQpwbG90X3BjYShldG5pYV9ub3JtKSRwbG90CgpldG5pYV9uYiA8LSBub3JtYWxpemVfZXhwdChldG5pYV9leHB0LCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQpwbG90X3BjYShldG5pYV9uYikkcGxvdApgYGAKCiMjIyMgT25seSBUdW1hY28KCmBgYHtyIHBhdGllbnRfcmFjZV90dW1hY299CnRfZXRuaWFfZXhwdCA8LSBzZXRfZXhwdF9jb25kaXRpb25zKHRfY2xpbmljYWwsIGZhY3QgPSAiZXRuaWEiKSAlPiUKICBzZXRfZXhwdF9jb2xvcnMoY29sb3JfY2hvaWNlc1tbImV0aG5pY2l0eSJdXSkKdF9ldG5pYV9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KHRfZXRuaWFfZXhwdCwgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSBUUlVFLCBub3JtID0gInF1YW50IikKcGxvdF9wY2EodF9ldG5pYV9ub3JtKSRwbG90Cgp0X2V0bmlhX25iIDwtIG5vcm1hbGl6ZV9leHB0KHRfZXRuaWFfZXhwdCwgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikKcGxvdF9wY2EodF9ldG5pYV9uYikkcGxvdApgYGAKCiMjIyBCaW9wc3kgc2FtcGxlcywgYm90aCBjbGluaWNzLgoKYGBge3IgcGF0aWVudF9yYWNlX2Jpb3BzaWVzfQp0Y19icF9lYyA8LSBzZXRfZXhwdF9jb25kaXRpb25zKHRjX2Jpb3BzaWVzLCBmYWN0ID0gImNsaW5pY19ldG5pYSIpICU+JQogIHNldF9leHB0X2NvbG9ycyhjb2xvcl9jaG9pY2VzW1siY2xpbmljX2V0bmlhIl1dKQpldG5pYV9icF9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KHRjX2JwX2VjLCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSBUUlVFLCBub3JtID0gInF1YW50IikKcGxvdF9wY2EoZXRuaWFfYnBfbm9ybSkkcGxvdApgYGAKCiMjIyMgQmlvcHN5IHNhbXBsZXMsIFR1bWFjby4KCmBgYHtyIHBhdGllbnRfcmFjZV9iaW9wc2llc190dW1hY299CnRfYnBfZWMgPC0gc2V0X2V4cHRfY29uZGl0aW9ucyh0Y19iaW9wc2llcywgZmFjdCA9ICJldG5pYSIpICU+JQogIHNldF9leHB0X2NvbG9ycyhjb2xvcl9jaG9pY2VzW1siZXRobmljaXR5Il1dKQp0X2V0bmlhX2JwX25vcm0gPC0gbm9ybWFsaXplX2V4cHQodF9icF9lYywgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSBUUlVFLCBub3JtID0gInF1YW50IikKcGxvdF9wY2EodF9ldG5pYV9icF9ub3JtKSRwbG90CmBgYAoKSSB0aGluayB0aGVyZSBhcmUgbm90IGVub3VnaCBzYW1wbGVzIHRvIHRyeSBzdmEgd2l0aCB0aGlzLgoKIyMjIEVvc2lub3BoaWwgc2FtcGxlcywgYm90aCBjbGluaWNzLgoKYGBge3IgcGF0aWVudF9yYWNlX2Vvc2lub3BoaWxzfQp0Y19lb19lYyA8LSBzZXRfZXhwdF9jb25kaXRpb25zKHRjX2Vvc2lub3BoaWxzLCBmYWN0ID0gImNsaW5pY19ldG5pYSIpICU+JQogIHNldF9leHB0X2NvbG9ycyhjb2xvcl9jaG9pY2VzW1siY2xpbmljX2V0bmlhIl1dKQpldG5pYV9lb19ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KHRjX2VvX2VjLCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSBUUlVFLCBub3JtID0gInF1YW50IikKcGxvdF9wY2EoZXRuaWFfZW9fbm9ybSkkcGxvdApgYGAKCiMjIyMgRW9zaW5vcGhpbCBzYW1wbGVzLCBUdW1hY28uCgpgYGB7ciBwYXRpZW50X3JhY2VfZW9zaW5vcGhpbHMyfQp0X2VvX2VjIDwtIHNldF9leHB0X2NvbmRpdGlvbnModF9lb3Npbm9waGlscywgZmFjdCA9ICJldG5pYSIpICU+JQogIHNldF9leHB0X2NvbG9ycyhjb2xvcl9jaG9pY2VzW1siZXRobmljaXR5Il1dKQp0X2V0bmlhX2VvX25vcm0gPC0gbm9ybWFsaXplX2V4cHQodF9lb19lYywgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gVFJVRSwgbm9ybSA9ICJxdWFudCIpCnBsb3RfcGNhKHRfZXRuaWFfZW9fbm9ybSkkcGxvdApgYGAKCiMjIyBNb25vY3l0ZSBzYW1wbGVzLCBib3RoIGNsaW5pY3MuCgpgYGB7ciBwYXRpZW50X3JhY2VfbW9ub2N5dGVzfQp0Y19tb19lYyA8LSBzZXRfZXhwdF9jb25kaXRpb25zKHRjX21vbm9jeXRlcywgZmFjdCA9ICJjbGluaWNfZXRuaWEiKSAlPiUKICBzZXRfZXhwdF9jb2xvcnMoY29sb3JfY2hvaWNlc1tbImNsaW5pY19ldG5pYSJdXSkKZXRuaWFfbW9fbm9ybSA8LSBub3JtYWxpemVfZXhwdCh0Y19tb19lYywgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gVFJVRSwgbm9ybSA9ICJxdWFudCIpCnBsb3RfcGNhKGV0bmlhX21vX25vcm0pJHBsb3QKCmV0bmlhX21vX25iIDwtIG5vcm1hbGl6ZV9leHB0KHRjX21vX2VjLCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikKcGxvdF9wY2EoZXRuaWFfbW9fbmIpJHBsb3QKYGBgCgojIyMjIE1vbm9jeXRlIHNhbXBsZXMsIFR1bWFjby4KCmBgYHtyIHBhdGllbnRfcmFjZV9tb25vY3l0ZXNfdHVtYWNvfQp0X21vX2VjIDwtIHNldF9leHB0X2NvbmRpdGlvbnModF9tb25vY3l0ZXMsIGZhY3QgPSAiZXRuaWEiKSAlPiUKICBzZXRfZXhwdF9jb2xvcnMoY29sb3JfY2hvaWNlc1tbImV0aG5pY2l0eSJdXSkKdF9ldG5pYV9tb19ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KHRfbW9fZWMsIHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gVFJVRSwgbm9ybSA9ICJxdWFudCIpCnBsb3RfcGNhKHRfZXRuaWFfbW9fbm9ybSkkcGxvdAoKdF9ldG5pYV9tb19uYiA8LSBub3JtYWxpemVfZXhwdCh0X21vX2VjLCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQpwbG90X3BjYSh0X2V0bmlhX21vX25iKSRwbG90CmBgYAoKIyMjIE5ldXRyb3BoaWwgc2FtcGxlcywgYm90aCBjbGluaWNzLgoKYGBge3IgcGF0aWVudF9yYWNlX25ldXRyb3BoaWxzfQp0Y19uZV9lYyA8LSBzZXRfZXhwdF9jb25kaXRpb25zKHRjX25ldXRyb3BoaWxzLCBmYWN0ID0gImNsaW5pY19ldG5pYSIpICU+JQogICAgc2V0X2V4cHRfY29sb3JzKGNvbG9yX2Nob2ljZXNbWyJjbGluaWNfZXRuaWEiXV0pCmV0bmlhX25lX25vcm0gPC0gbm9ybWFsaXplX2V4cHQodGNfbmVfZWMsIHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IFRSVUUsIG5vcm0gPSAicXVhbnQiKQpwbG90X3BjYShldG5pYV9uZV9ub3JtKSRwbG90CmBgYAoKIyMjIyBOZXV0cm9waGlsIHNhbXBsZXMsIFR1bWFjby4KCmBgYHtyIHBhdGllbnRfcmFjZV9uZXV0cm9waGlsc190dW1hY299CnRfbmVfZWMgPC0gc2V0X2V4cHRfY29uZGl0aW9ucyh0X25ldXRyb3BoaWxzLCBmYWN0ID0gImV0bmlhIikgJT4lCiAgICBzZXRfZXhwdF9jb2xvcnMoY29sb3JfY2hvaWNlc1tbImV0aG5pY2l0eSJdXSkKdF9ldG5pYV9uZV9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KHRfbmVfZWMsIHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gVFJVRSwgbm9ybSA9ICJxdWFudCIpCnBsb3RfcGNhKHRfZXRuaWFfbmVfbm9ybSkkcGxvdApgYGAKCiMjIFNleAoKYGBge3Igc2V4X2J5X2l0c2VsZn0Kc2V4X2V4cHQgPC0gc2V0X2V4cHRfY29uZGl0aW9ucyh0Y192YWxpZCwgZmFjdCA9ICJzZXgiKSAlPiUKICBzZXRfZXhwdF9jb2xvcnMoY29sb3JfY2hvaWNlc1tbInNleCJdXSkKc2V4X25vcm0gPC0gbm9ybWFsaXplX2V4cHQoc2V4X2V4cHQsIHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSBUUlVFLCBub3JtID0gInF1YW50IikKcGxvdF9wY2Eoc2V4X25vcm0pJHBsb3QKCnNleF9uYiA8LSBub3JtYWxpemVfZXhwdChzZXhfZXhwdCwgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQpwbG90X3BjYShzZXhfbmIpJHBsb3QKYGBgCgojIyBTZXggYW5kIGNsaW5pYwoKIyMjIEFsbCBzYW1wbGVzLCBib3RoIGNsaW5pY3MKCmBgYHtyIHNleF9hbmRfY2xpbmljX3RvZ2V0aGVyfQpjbGluaWNfc2V4X2V4cHQgPC0gc2V0X2V4cHRfY29uZGl0aW9ucyh0Y192YWxpZCwgZmFjdCA9ICJjbGluaWNfc2V4IikgJT4lCiAgc2V0X2V4cHRfY29sb3JzKGNvbG9yX2Nob2ljZXNbWyJjbGluaWNfc2V4Il1dKQpjbGluaWNfc2V4X25vcm0gPC0gbm9ybWFsaXplX2V4cHQoY2xpbmljX3NleF9leHB0LCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IFRSVUUsIG5vcm0gPSAicXVhbnQiKQpwbG90X3BjYShjbGluaWNfc2V4X25vcm0pJHBsb3QKCmNsaW5pY19zZXhfbmIgPC0gbm9ybWFsaXplX2V4cHQoY2xpbmljX3NleF9leHB0LCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQpwbG90X3BjYShjbGluaWNfc2V4X25iKSRwbG90CmBgYAoKIyMjIEJpb3BzeSBzYW1wbGVzLCBib3RoIGNsaW5pY3MuCgpgYGB7ciBwYXRpZW50X3JhY2VfYmlvcHNpZXN9CnRjX2JwX3NjIDwtIHNldF9leHB0X2NvbmRpdGlvbnModGNfYmlvcHNpZXMsIGZhY3QgPSAiY2xpbmljX3NleCIpICU+JQogIHNldF9leHB0X2NvbG9ycyhjb2xvcl9jaG9pY2VzW1siY2xpbmljX3NleCJdXSkKY2xpbmljX3NleF9icF9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KHRjX2JwX3NjLCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSBUUlVFLCBub3JtID0gInF1YW50IikKcGxvdF9wY2EoY2xpbmljX3NleF9icF9ub3JtKSRwbG90CmBgYAoKSSB0aGluayB0aGVyZSBhcmUgbm90IGVub3VnaCBzYW1wbGVzIHRvIHRyeSBzdmEgd2l0aCB0aGlzLgoKIyMjIEVvc2lub3BoaWwgc2FtcGxlcywgYm90aCBjbGluaWNzLgoKYGBge3IgcGF0aWVudF9yYWNlX2Vvc2lub3BoaWxzfQp0Y19lb19zYyA8LSBzZXRfZXhwdF9jb25kaXRpb25zKHRjX2Vvc2lub3BoaWxzLCBmYWN0ID0gImNsaW5pY19zZXgiKSAlPiUKICBzZXRfZXhwdF9jb2xvcnMoY29sb3JfY2hvaWNlc1tbImNsaW5pY19zZXgiXV0pCmNsaW5pY19zZXhfZW9fbm9ybSA8LSBub3JtYWxpemVfZXhwdCh0Y19lb19zYywgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSBUUlVFLCBub3JtID0gInF1YW50IikKcGxvdF9wY2EoY2xpbmljX3NleF9lb19ub3JtKSRwbG90CmBgYAoKIyMjIE1vbm9jeXRlIHNhbXBsZXMsIGJvdGggY2xpbmljcy4KCmBgYHtyIHBhdGllbnRfcmFjZV9tb25vY3l0ZXN9CnRjX21vX3NjIDwtIHNldF9leHB0X2NvbmRpdGlvbnModGNfbW9ub2N5dGVzLCBmYWN0ID0gImNsaW5pY19zZXgiKSAlPiUKICBzZXRfZXhwdF9jb2xvcnMoY29sb3JfY2hvaWNlc1tbImNsaW5pY19zZXgiXV0pCmV0bmlhX21vX25vcm0gPC0gbm9ybWFsaXplX2V4cHQodGNfbW9fc2MsIHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IFRSVUUsIG5vcm0gPSAicXVhbnQiKQpwbG90X3BjYShldG5pYV9tb19ub3JtKSRwbG90CgpldG5pYV9tb19uYiA8LSBub3JtYWxpemVfZXhwdCh0Y19tb19zYywgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCnBsb3RfcGNhKGV0bmlhX21vX25iKSRwbG90CmBgYAoKIyMjIE5ldXRyb3BoaWwgc2FtcGxlcywgYm90aCBjbGluaWNzLgoKYGBge3IgcGF0aWVudF9yYWNlX25ldXRyb3BoaWxzX2JvdGh9CnRjX25lX3NjIDwtIHNldF9leHB0X2NvbmRpdGlvbnModGNfbmV1dHJvcGhpbHMsIGZhY3QgPSAiY2xpbmljX3NleCIpICU+JQogICAgc2V0X2V4cHRfY29sb3JzKGNvbG9yX2Nob2ljZXNbWyJjbGluaWNfc2V4Il1dKQpldG5pYV9uZV9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KHRjX25lX3NjLCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSBUUlVFLCBub3JtID0gInF1YW50IikKcGxvdF9wY2EoZXRuaWFfbmVfbm9ybSkkcGxvdApgYGAKCiMjIEVvc2lub3BoaWxzIGJ5IGNsaW5pYwoKSW4gY29udHJhc3QsIHRoZSBFb3Npbm9waGlsIHNhbXBsZXMgZG8gaGF2ZSBzaWduaWZpY2FudCBhbW91bnRzIG9mCnZhcmlhbmNlIHdoaWNoIGRpc2NyaW1pbmF0ZXMgdGhlIHR3byBjbGluaWNzLiAgQXQgdGhlIHRpbWUgb2YgdGhpcwp3cml0aW5nLCB0aGVyZSBhcmUgZmV3ZXIgZW9zaW5vcGhpbCBzYW1wbGVzIHRoYW4gbW9ub2N5dGVzIG5vcgpuZXV0cm9waGlsczsgYXMgYSByZXN1bHQgdGhlcmUgYXJlIG5vIHNhbXBsZXMgd2hpY2ggZmFpbGVkIGZyb20gQ2FsaS4KVGhpcyBpcyBzb21ld2hhdCBsaW1pdGluZyBpcyB3ZSB3aXNoIHRvIGxvb2sgZm9yIGRpZmZlcmVuY2VzIGJldHdlZW4KdGhlIGN1cmUgYW5kIGZhaWwgc2FtcGxlcyB3aGljaCBjYW1lIGZyb20gdGhlIHR3byBjbGluaWNzLgoKYGBge3IgY2xpbmljX2Vvc2lub3BoaWxfcGNhfQp0Y19lb3Npbm9waGlsc19ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KHRjX2Vvc2lub3BoaWxzLCB0cmFuc2Zvcm0gPSAibG9nMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydCA9ICJjcG0iLCBub3JtID0gInF1YW50IiwgZmlsdGVyID0gVFJVRSkKdGNfZW9zaW5vcGhpbHNfcGNhIDwtIHBsb3RfcGNhKHRjX2Vvc2lub3BoaWxzX25vcm0sIHBsb3RfbGFiZWxzID0gRkFMU0UpCnRjX2Vvc2lub3BoaWxzX3BjYSRwbG90Cgp0Y19lb3Npbm9waGlsc19uYiA8LSBub3JtYWxpemVfZXhwdCh0Y19lb3Npbm9waGlscywgdHJhbnNmb3JtID0gImxvZzIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ID0gImNwbSIsIGJhdGNoID0gInN2YXNlcSIsIGZpbHRlciA9IFRSVUUpCnRjX2Vvc2lub3BoaWxzX25iX3BjYSA8LSBwbG90X3BjYSh0Y19lb3Npbm9waGlsc19uYiwgcGxvdF9sYWJlbHMgPSBGQUxTRSkKdGNfZW9zaW5vcGhpbHNfbmJfcGNhJHBsb3QKYGBgCgojIyBNb25vY3l0ZXMgYnkgY2xpbmljCgpJbiBjb250cmFzdCB3aXRoIHRoZSBlb3Npbm9waGlsIHNhbXBsZXMsIHdlIGhhdmUgb25lIHBhdGllbnQncwptb25vY3l0ZSBhbmQgbmV1dHJvcGhpbCBzYW1wbGVzIHdoaWNoIGRpZCBub3QgY3VyZS4gIEFzIHdlIHdpbGwgc2VlLAp0aGVyZSBpcyBvbmUgcGVyc29uIGZyb20gQ2FsaSB3aG8gZGlkIG5vdCBjdXJlLCB0aGlzIHBlcnNvbiBpcyBub3QKZGlmZmVyZW50IHdpdGggcmVzcGVjdCB0byB0cmFjc2NyaXB0b21lIHRoYW4gdGhlIG90aGVyIHBlb3BsZSBmcm9tIENhbGkuCgpgYGB7ciBjbGluaWNfbW9ub2N5dGVfcGNhfQp0Y19tb25vY3l0ZXNfbm9ybSA8LSBub3JtYWxpemVfZXhwdCh0Y19tb25vY3l0ZXMsIHRyYW5zZm9ybSA9ICJsb2cyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydCA9ICJjcG0iLCBub3JtID0gInF1YW50IiwgZmlsdGVyID0gVFJVRSkKdGNfbW9ub2N5dGVzX3BjYSA8LSBwbG90X3BjYSh0Y19tb25vY3l0ZXNfbm9ybSwgcGxvdF9sYWJlbHMgPSBGQUxTRSkKdGNfbW9ub2N5dGVzX3BjYSRwbG90Cgp0Y19tb25vY3l0ZXNfbmIgPC0gbm9ybWFsaXplX2V4cHQodGNfbW9ub2N5dGVzLCB0cmFuc2Zvcm0gPSAibG9nMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ID0gImNwbSIsIGJhdGNoID0gInN2YXNlcSIsIGZpbHRlciA9IFRSVUUpCnRjX21vbm9jeXRlc19uYl9wY2EgPC0gcGxvdF9wY2EodGNfbW9ub2N5dGVzX25iLCBwbG90X2xhYmVscyA9IEZBTFNFKQp0Y19tb25vY3l0ZXNfbmJfcGNhJHBsb3QKYGBgCgojIyBOZXV0cm9waGlscyBieSBjbGluaWMKCkZpbmFsbHksIHRoYXQgc2FtZSBvbmUgcGVyc29uIGRvZXMgYXBwZWFyIHRvIGJlIGRpZmZlcmVudCB0aGFuIHRoZQpvdGhlcnMgZnJvbSBDYWxpLgoKYGBge3IgY2xpbmljX25ldXRyb3BoaWxfcGNhfQp0Y19uZXV0cm9waGlsc19ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KHRjX25ldXRyb3BoaWxzLCB0cmFuc2Zvcm0gPSAibG9nMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydCA9ICJjcG0iLCBub3JtID0gInF1YW50IiwgZmlsdGVyID0gVFJVRSkKdGNfbmV1dHJvcGhpbHNfcGNhIDwtIHBsb3RfcGNhKHRjX25ldXRyb3BoaWxzX25vcm0sIHBsb3RfbGFiZWxzID0gRkFMU0UpCnRjX25ldXRyb3BoaWxzX3BjYSRwbG90Cgp0Y19uZXV0cm9waGlsc19uYiA8LSBub3JtYWxpemVfZXhwdCh0Y19uZXV0cm9waGlscywgdHJhbnNmb3JtID0gImxvZzIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ID0gImNwbSIsIGJhdGNoID0gInN2YXNlcSIsIGZpbHRlciA9IFRSVUUpCnRjX25ldXRyb3BoaWxzX25iX3BjYSA8LSBwbG90X3BjYSh0Y19uZXV0cm9waGlsc19uYiwgcGxvdF9sYWJlbHMgPSBGQUxTRSkKdGNfbmV1dHJvcGhpbHNfbmJfcGNhJHBsb3QKYGBgCgojIyBQQ0E6IENvbXBhcmUgY2xpbmljcwoKTm93IHRoYXQgd2UgaGF2ZSB0aGVzZSB2YXJpb3VzIHN1YnNldHMsIHBlcmZvcm0gYW4gZXhwbGljaXQgY29tcGFyaXNvbgpvZiB0aGUgc2FtcGxlcyB3aGljaCBjYW1lIGZyb20gdGhlIHR3byBjbGluaWNzLgoKYGBge3IgY2xuaWNfY29tcGFyaXNvbjF9CnRjX2NsaW5pY190eXBlIDwtIHRjX3ZhbGlkICU+JQogIHNldF9leHB0X2NvbmRpdGlvbnMoZmFjdCA9ICJjbGluaWMiKSAlPiUKICBzZXRfZXhwdF9iYXRjaGVzKGZhY3QgPSAidHlwZW9mY2VsbHMiKQoKdGNfY2xpbmljX3R5cGVfbm9ybSA8LSBub3JtYWxpemVfZXhwdCh0Y19jbGluaWNfdHlwZSwgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybSA9ICJxdWFudCIsIGZpbHRlciA9IFRSVUUpCnRjX2NsaW5pY190eXBlX3BjYSA8LSBwbG90X3BjYSh0Y19jbGluaWNfdHlwZV9ub3JtKQp0Y19jbGluaWNfdHlwZV9wY2EkcGxvdAp0Y19jbGluaWNfdHlwZV9uYiA8LSBub3JtYWxpemVfZXhwdCh0Y19jbGluaWNfdHlwZSwgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhdGNoID0gInN2YXNlcSIsIGZpbHRlciA9IFRSVUUpCnRjX2NsaW5pY190eXBlX25iX3BjYSA8LSBwbG90X3BjYSh0Y19jbGluaWNfdHlwZV9uYikKdGNfY2xpbmljX3R5cGVfbmJfcGNhJHBsb3QKYGBgCgoKYGBge3IgdGNfdHlwZV9jZmFsX3Bsb3R9CnRjX2NsaW5pY2FsX25vcm0gPC0gc20obm9ybWFsaXplX2V4cHQodGNfY2xpbmljYWwsIGZpbHRlciA9ICJzaW1wbGUiLCB0cmFuc2Zvcm0gPSAibG9nMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybSA9ICJxdWFudCIsIGNvbnZlcnQgPSAiY3BtIikpCmNsaW5pY2FsX3BjYSA8LSBwbG90X3BjYSh0Y19jbGluaWNhbF9ub3JtLCBwbG90X2xhYmVscyA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgY2lzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RfdGl0bGUgPSAiUENBIC0gY2xpbmljYWwgc2FtcGxlcyIpCmNsaW5pY2FsX3BjYSRwbG90Cgp0Y19jbGluaWNhbF9uYiA8LSBub3JtYWxpemVfZXhwdCh0Y19jbGluaWNhbCwgZmlsdGVyID0gInNpbXBsZSIsIHRyYW5zZm9ybSA9ICJsb2cyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2ggPSAic3Zhc2VxIiwgY29udmVydCA9ICJjcG0iKQp0Y19jbGluaWNhbF9uYl9wY2EgPC0gcGxvdF9wY2EodGNfY2xpbmljYWxfbmIpCnRjX2NsaW5pY2FsX25iX3BjYSRwbG90CgpjbGluaWNhbF9wY2FfaW5mbyA8LSBwY2FfaW5mb3JtYXRpb24oCiAgICB0Y19jbGluaWNhbF9ub3JtLCBwbG90X3BjYXMgPSBUUlVFLCBudW1fY29tcG9uZW50cyA9IDMwLAogICAgZXhwdF9mYWN0b3JzID0gYygidmlzaXRudW1iZXIiLCAidHlwZW9mY2VsbHMiLCAiZmluYWxvdXRjb21lIiwKICAgICAgICAgICAgICAgICAgICJjbGluaWMiLCAiZG9ub3IiKSkKY2xpbmljYWxfcGNhX2luZm8kYW5vdmFfbmVnbG9ncF9oZWF0bWFwCmNsaW5pY2FsX3BjYV9pbmZvJHBjYV9wbG90cyRQQzRfUEM3CgpjbGluaWNhbF9zY29yZXMgPC0gcGNhX2hpZ2hzY29yZXModGNfY2xpbmljYWxfbm9ybSkKY2xpbmljYWxfc2NvcmVzW1siaGlnaGVzdCJdXVssIkNvbXAuNCJdCgp0ZXN0X2ZhY3RvcnMgPC0gYygidmlzaXRudW1iZXIiLCAidHlwZW9mY2VsbHMiLCAiZmluYWxvdXRjb21lIiwKICAgICAgICAgICAgICAgICAgImNsaW5pYyIsICJzZXgiLCAiZXRuaWEiKQpjbGluaWNhbF92YXJwYXJ0IDwtIHNpbXBsZV92YXJwYXJ0KHRjX2NsaW5pY2FsLCBmYWN0b3JzID0gdGVzdF9mYWN0b3JzKQpgYGAKCiMjIEl0ZXJhdGl2ZSBTVkEgZm9sbG93ZWQgYnkgUENBCgpBbm90aGVyIHdheSB0byBleHBsb3JlIHRoZSBlZmZlY3Qgb2YgU1ZBIGlzIHRvIGl0ZXJhdGl2ZWx5IGluY3JlYXNlCnRoZSBudW1iZXIgb2YgU1ZzIHJlbW92ZWQgYnkgaXQgYW5kIGxvb2sgYXQgc29tZSBzaW1wbGUgcGxvdHMgb2YgdGhlCnJlc3VsdGluZyBkYXRhLiAgSWRlYWxseSwgdGhpcyBzaG91bGQgY29tcGxlbWVudCB0aGUgbWV0aG9kcyBlbXBsb3llZApieSBUaGVyZXNhLgoKYGBge3IgaXRlcmF0aXZlX3N2X3JlbW92YWx9CmZpcnN0IDwtIG5vcm1hbGl6ZV9leHB0KHRjX2NsaW5pY2FsLCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIiwgc3Vycm9nYXRlcyA9IDEpCmZpcnN0X2luZm8gPC0gcGNhX2luZm9ybWF0aW9uKAogICAgZmlyc3QsIHBsb3RfcGNhcyA9IFRSVUUsIG51bV9jb21wb25lbnRzID0gMzAsCiAgICBleHB0X2ZhY3RvcnMgPSBjKCJ2aXNpdG51bWJlciIsICJ0eXBlb2ZjZWxscyIsCiAgICAgICAgICAgICAgICAgICAgICJmaW5hbG91dGNvbWUiLCAiY2xpbmljIikpCmZpcnN0X2luZm8kYW5vdmFfbmVnbG9ncF9oZWF0bWFwCmZpcnN0X2luZm8kcGNhX3Bsb3RzW1siUEMxX1BDMiJdXQoKc2Vjb25kIDwtIG5vcm1hbGl6ZV9leHB0KHRjX2NsaW5pY2FsLCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIsIHN1cnJvZ2F0ZXMgPSAyKSAlPiUKICBzZXRfZXhwdF9iYXRjaGVzKGZhY3QgPSAiY2xpbmljIikKc2Vjb25kX2luZm8gPC0gcGNhX2luZm9ybWF0aW9uKAogICAgc2Vjb25kLCBwbG90X3BjYXMgPSBUUlVFLCBudW1fY29tcG9uZW50cyA9IDMwLAogICAgZXhwdF9mYWN0b3JzID0gYygidmlzaXRudW1iZXIiLCAidHlwZW9mY2VsbHMiLAogICAgICAgICAgICAgICAgICAgICAiZmluYWxvdXRjb21lIiwgImNsaW5pYyIpKQpzZWNvbmRfaW5mbyRhbm92YV9uZWdsb2dwX2hlYXRtYXAKCnRoaXJkIDwtIG5vcm1hbGl6ZV9leHB0KHRjX2NsaW5pY2FsLCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIiwgc3Vycm9nYXRlcyA9IDMpICU+JQogIHNldF9leHB0X2JhdGNoZXMoZmFjdCA9ICJjbGluaWMiKQp0aGlyZF9pbmZvIDwtIHBjYV9pbmZvcm1hdGlvbigKICAgIHRoaXJkLCBwbG90X3BjYXMgPSBUUlVFLCBudW1fY29tcG9uZW50cyA9IDMwLAogICAgZXhwdF9mYWN0b3JzID0gYygidmlzaXRudW1iZXIiLCAidHlwZW9mY2VsbHMiLAogICAgICAgICAgICAgICAgICAgICAiZmluYWxvdXRjb21lIiwgImNsaW5pYyIpKQp0aGlyZF9pbmZvJGFub3ZhX25lZ2xvZ3BfaGVhdG1hcAoKZm91cnRoIDwtIG5vcm1hbGl6ZV9leHB0KHRjX2NsaW5pY2FsLCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIsIHN1cnJvZ2F0ZXMgPSA0KSAlPiUKICBzZXRfZXhwdF9iYXRjaGVzKGZhY3QgPSAiY2xpbmljIikKZm91cnRoX2luZm8gPC0gcGNhX2luZm9ybWF0aW9uKAogICAgZm91cnRoLCBwbG90X3BjYXMgPSBUUlVFLCBudW1fY29tcG9uZW50cyA9IDMwLAogICAgZXhwdF9mYWN0b3JzID0gYygidmlzaXRudW1iZXIiLCAidHlwZW9mY2VsbHMiLAogICAgICAgICAgICAgICAgICAgICAiZmluYWxvdXRjb21lIiwgImNsaW5pYyIpKQpmb3VydGhfaW5mbyRhbm92YV9uZWdsb2dwX2hlYXRtYXAKZm91cnRoX2luZm9bWyJwY2FfcGxvdHMiXV1bWyJQQzFfUEMyIl1dCgpmaWZ0aCA8LSBub3JtYWxpemVfZXhwdCh0Y19jbGluaWNhbCwgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIsIHN1cnJvZ2F0ZXMgPSA1KSAlPiUKICBzZXRfZXhwdF9iYXRjaGVzKGZhY3QgPSAiY2xpbmljIikKZmlmdGhfaW5mbyA8LSBwY2FfaW5mb3JtYXRpb24oCiAgICBmaWZ0aCwgcGxvdF9wY2FzID0gVFJVRSwgbnVtX2NvbXBvbmVudHMgPSAzMCwKICAgIGV4cHRfZmFjdG9ycyA9IGMoInZpc2l0bnVtYmVyIiwgInR5cGVvZmNlbGxzIiwKICAgICAgICAgICAgICAgICAgICAgImZpbmFsb3V0Y29tZSIsICJjbGluaWMiKSkKZmlmdGhfaW5mbyRhbm92YV9uZWdsb2dwX2hlYXRtYXAKZmlmdGhfaW5mb1tbInBjYV9wbG90cyJdXVtbIlBDMV9QQzEyIl1dCgpzaXh0aCA8LSBub3JtYWxpemVfZXhwdCh0Y19jbGluaWNhbCwgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IFRSVUUsIGJhdGNoPSJzdmFzZXEiLCBzdXJyb2dhdGVzID0gNikgJT4lCiAgc2V0X2V4cHRfYmF0Y2hlcyhmYWN0ID0gImNsaW5pYyIpCnNpeHRoX2luZm8gPC0gcGNhX2luZm9ybWF0aW9uKAogICAgc2l4dGgsIHBsb3RfcGNhcyA9IFRSVUUsIG51bV9jb21wb25lbnRzID0gMzAsCiAgICBleHB0X2ZhY3RvcnMgPSBjKCJ2aXNpdG51bWJlciIsICJ0eXBlb2ZjZWxscyIsCiAgICAgICAgICAgICAgICAgICAgICJmaW5hbG91dGNvbWUiLCAiY2xpbmljIikpCnNpeHRoX2luZm8kYW5vdmFfbmVnbG9ncF9oZWF0bWFwCgpzZXZlbnRoIDwtIG5vcm1hbGl6ZV9leHB0KHRjX2NsaW5pY2FsLCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiLCBzdXJyb2dhdGVzID0gNykgJT4lCiAgc2V0X2V4cHRfYmF0Y2hlcyhmYWN0ID0gImNsaW5pYyIpCnNldmVudGhfaW5mbyA8LSBwY2FfaW5mb3JtYXRpb24oCiAgICBzZXZlbnRoLCBwbG90X3BjYXMgPSBUUlVFLCBudW1fY29tcG9uZW50cyA9IDMwLAogICAgZXhwdF9mYWN0b3JzID0gYygidmlzaXRudW1iZXIiLCAidHlwZW9mY2VsbHMiLAogICAgICAgICAgICAgICAgICAgICAiZmluYWxvdXRjb21lIiwgImNsaW5pYyIpKQpzZXZlbnRoX2luZm8kYW5vdmFfbmVnbG9ncF9oZWF0bWFwCgplaWdodGggPC0gbm9ybWFsaXplX2V4cHQodGNfY2xpbmljYWwsIHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiLCBzdXJyb2dhdGVzID0gOCkKZWlnaHRoX2luZm8gPC0gcGNhX2luZm9ybWF0aW9uKAogICAgZWlnaHRoLCBwbG90X3BjYXMgPSBUUlVFLCBudW1fY29tcG9uZW50cyA9IDMwLAogICAgZXhwdF9mYWN0b3JzID0gYygidmlzaXRudW1iZXIiLCAidHlwZW9mY2VsbHMiLAogICAgICAgICAgICAgICAgICAgICAiZmluYWxvdXRjb21lIiwgImNsaW5pYyIpKQplaWdodGhfaW5mbyRhbm92YV9uZWdsb2dwX2hlYXRtYXAKYGBgCgpgYGB7ciB2YXJwYXJ0X2FsbH0KIyMgTW9zdGx5IHJ1bm5pbmcgdHdpY2UgdG8gbWFrZSBzdXJlIHRoYXQgcmVvcmRlcmluZyB0aGUgZmFjdG9ycyBkb2VzIG5vdCBhZmZlY3QgdGhlIGVuZCByZXN1bHQuCnRjX3ZhcnBhcnQgPC0gc2ltcGxlX3ZhcnBhcnQoCiAgdGNfY2xpbmljYWwsIGZhY3RvcnMgPSBjKCJ2aXNpdG51bWJlciIsICJ0eXBlb2ZjZWxscyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaW5hbG91dGNvbWUiLCAiY2xpbmljIiwgInNleCIsICJldG5pYSIpKQp0Y192YXJwYXJ0W1sicGFydGl0aW9uX3Bsb3QiXV0KCnRjX3ZhcnBhcnR2MiA8LSBzaW1wbGVfdmFycGFydCgKICB0Y19jbGluaWNhbCwgZmFjdG9ycyA9IGMoImRvbm9yIiwgInZpc2l0bnVtYmVyIiwgInR5cGVvZmNlbGxzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpbmFsb3V0Y29tZSIpKQp0Y192YXJwYXJ0djJbWyJwYXJ0aXRpb25fcGxvdCJdXQpgYGAKIyMgU3VtbWFyaXplOiBDb2xsZWN0IFR1bWFjbyBzYW1wbGUgbnVtYmVycy4KCiBBdCBsZWFzdCBpbiB0aGVvcnksIGV2ZXJ5dGhpbmcgd2hpY2ggZm9sbG93cyB3aWxsIGJlIHVzaW5nIHRoZSBhYm92ZQonY2xpbmljYWwnIGRhdGEgc3RydWN0dXJlLiAgVGh1cywgbGV0IHVzIGNvdW50IGl0IHVwIGFuZCBnZXQgYSBzZW5zZQpvZiB3aGF0IHdlIHdpbGwgd29yayB3aXRoLgoKYGBge3IgY291bnRfdHVtYWNvfQp0YWJsZShwRGF0YSh0X2NsaW5pY2FsKSRkcnVnKQp0YWJsZShwRGF0YSh0X2NsaW5pY2FsKSRjbGluaWMpCnRhYmxlKHBEYXRhKHRfY2xpbmljYWwpJGZpbmFsb3V0Y29tZSkKdGFibGUocERhdGEodF9jbGluaWNhbCkkdHlwZW9mY2VsbHMpCnRhYmxlKHBEYXRhKHRfY2xpbmljYWwpJHZpc2l0KQpzdW1tYXJ5KGFzLm51bWVyaWMocERhdGEodF9jbGluaWNhbCkkZWJfbGNfdGllbXBvX2V2b2x1Y2lvbikpCnN1bW1hcnkoYXMubnVtZXJpYyhwRGF0YSh0X2NsaW5pY2FsKSRlYl9sY190dG9fbWN0b19nbHVjYW5fZG9zaXMpKQpzdW1tYXJ5KGFzLm51bWVyaWMocERhdGEodF9jbGluaWNhbCkkdjNfbGNfZWpleV9sZXNpb25fbW1fMSkpCnN1bW1hcnkoYXMubnVtZXJpYyhwRGF0YSh0X2NsaW5pY2FsKSR2M19sY19sZXNpb25fYXJlYV8xKSkKc3VtbWFyeShhcy5udW1lcmljKHBEYXRhKHRfY2xpbmljYWwpJHYzX2xjX2VqZXhfdWxjZXJhX21tXzEpKQp0YWJsZShwRGF0YSh0X2NsaW5pY2FsKSRlYl9sY19zZXhvKQp0YWJsZShwRGF0YSh0X2NsaW5pY2FsKSRlYl9sY19ldG5pYSkKc3VtbWFyeShhcy5udW1lcmljKHBEYXRhKHRfY2xpbmljYWwpJGVkYWQpKQp0YWJsZShwRGF0YSh0X2NsaW5pY2FsKSRlYl9sY19wZXNvKQp0YWJsZShwRGF0YSh0X2NsaW5pY2FsKSRlYl9sY19lc3RhdHVyYSkKCmxlbmd0aCh1bmlxdWUocERhdGEodF9jbGluaWNhbClbWyJjb2RpZ29fcGFjaWVudGUiXV0pKQpvbmx5X2N1cmUgPC0gcERhdGEodF9jbGluaWNhbClbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiCmNfbWV0YSA8LSBwRGF0YSh0X2NsaW5pY2FsKVtvbmx5X2N1cmUsIF0KbGVuZ3RoKHVuaXF1ZShjX21ldGFbWyJjb2RpZ29fcGFjaWVudGUiXV0pKQpvbmx5X2ZhaWwgPC0gcERhdGEodF9jbGluaWNhbClbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiCmZfbWV0YSA8LSBwRGF0YSh0X2NsaW5pY2FsKVtvbmx5X2ZhaWwsIF0KbGVuZ3RoKHVuaXF1ZShmX21ldGFbWyJjb2RpZ29fcGFjaWVudGUiXV0pKQpgYGAKCiMjIFZpc3VhbGl6ZTogUmVwZWF0IHBsb3RzIHVzaW5nIG9ubHkgdGhlIFR1bWFjbyBzYW1wbGVzCgojIyMgQWxsIHNhbXBsZXMKCmBgYHtyIHZpc19hbGxfdHVtYWNvfQp0X2NsaW5pY2FsX25vYmlvcF9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KHRfY2xpbmljYWxfbm9iaW9wLCBmaWx0ZXIgPSBUUlVFLCBub3JtID0gInF1YW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ID0gImNwbSIsIHRyYW5zZm9ybSA9ICJsb2cyIikKdF9jbGluaWNhbF9ub2Jpb3BfcGNhIDwtIHBsb3RfcGNhKHRfY2xpbmljYWxfbm9iaW9wX25vcm0sIHBsb3RfbGFiZWxzID0gRkFMU0UpCnRfY2xpbmljYWxfbm9iaW9wX3BjYSRwbG90Cgp0X2NsaW5pY2FsX25vYmlvcF9uYiA8LSBub3JtYWxpemVfZXhwdCh0X2NsaW5pY2FsX25vYmlvcCwgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSAibG9nMiIsIGJhdGNoID0gInN2YXNlcSIpCnRfY2xpbmljYWxfbm9iaW9wX25iX3BjYSA8LSBwbG90X3BjYSh0X2NsaW5pY2FsX25vYmlvcF9uYiwgcGxvdF9sYWJlbHMgPSBGQUxTRSkKdF9jbGluaWNhbF9ub2Jpb3BfbmJfcGNhJHBsb3QKYGBgCgpOb3cgd2UgaGF2ZSBhIG5ldywgc21hbGxlciBzZXQgb2YgcHJpbWFyeSBzYW1wbGVzIHdoaWNoIGFyZQpjYXRlZ29yaXplZCBieSBjZWxsIHR5cGUuCgojIyMgVmlzdWFsaXplOiBCaW9wc3kgc2FtcGxlcyBvbmx5IFR1bWFjbwoKU2FkbHksIHRoZSBiaW9wc3kgc2FtcGxlcyByZW1haW4gYmFzaWNhbGx5IGltcGVuZXRyYWJsZS4gIFRoaXMgbWFrZXMKbWUgc2FkLCBJIHRoaW5rIGl0IHdvdWxkIGJlIHBhcnRpY3VsYXJseSBuaWNlIGlmIHdlIGNvdWxkIGp1ZGdlCmN1cmUvZmFpbCBmcm9tIGEgdmlzaXQgMSBiaW9wc3kuCgpgYGB7ciBub3JtYWxpemVfYmlvcHN5X3R1bWFjb19zYW1wbGVzfQp0X2Jpb3BzaWVzX25vcm0gPC0gbm9ybWFsaXplX2V4cHQodF9iaW9wc2llcywgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIsCiAgbm9ybSA9ICJxdWFudCIsIGZpbHRlciA9IFRSVUUpCgp0X2Jpb3BzaWVzX3BjYSA8LSBwbG90X3BjYSh0X2Jpb3BzaWVzX25vcm0sCiAgcGxvdF9sYWJlbHMgPSBGQUxTRSkKdF9iaW9wc2llc19wY2EkcGxvdAoKdF9iaW9wc2llc19uYiA8LSBub3JtYWxpemVfZXhwdCh0X2Jpb3BzaWVzLCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQp0X2Jpb3BzaWVzX25iX3BjYSA8LSBwbG90X3BjYSh0X2Jpb3BzaWVzX25iLCBwbG90X2xhYmVscyA9IEZBTFNFKQp0X2Jpb3BzaWVzX25iX3BjYSRwbG90CmBgYAoKIyMjIFZpc3VhbGl6ZTogTW9ub2N5dGUgc2FtcGxlcyBvbmx5IFR1bWFjbwoKSW4gY29udHJhc3QsIEkgc3VzcGVjdCB0aGF0IHdlIGNhbiBnZXQgbWVhbmluZ2Z1bCBkYXRhIGZyb20gdGhlCm90aGVyIGNlbGwgdHlwZXMuICBUaGUgbW9ub2N5dGUgc2FtcGxlcyBhcmUgc3RpbGwgYSBiaXQgbWVzc3kuCgpgYGB7ciBub3JtYWxpemVfbW9ub2N5dGVfdHVtYWNvX3NhbXBsZXN9CnRfbW9ub2N5dGVfbm9ybSA8LSBub3JtYWxpemVfZXhwdCh0X21vbm9jeXRlcywgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtID0gInF1YW50IiwgZmlsdGVyID0gVFJVRSkKCnRfbW9ub2N5dGVfcGNhIDwtIHBsb3RfcGNhKHRfbW9ub2N5dGVfbm9ybSwKICBwbG90X2xhYmVscyA9IEZBTFNFKQp0X21vbm9jeXRlX3BjYSRwbG90Cgp0X21vbm9jeXRlX25iIDwtIG5vcm1hbGl6ZV9leHB0KHRfbW9ub2N5dGVzLCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQp0X21vbm9jeXRlX25iX3BjYSA8LSBwbG90X3BjYSh0X21vbm9jeXRlX25iLCBwbG90X2xhYmVscyA9IEZBTFNFKQp0X21vbm9jeXRlX25iX3BjYSRwbG90CmBgYAoKIyMjIFZpc3VhbGl6ZTogTmV1dHJvcGhpbCBzYW1wbGVzIG9ubHkgVHVtYWNvCgpXZWxsLCByZWFsbHkgYWxsIHRoZSBjZWxsIHR5cGVzIHJlbWFpbiBwcmV0dHkgbWVzc3kuICBUaGVyZSBpcyBhbHdheXMKYXQgbGVhc3Qgb25lIHBlcnNvbiBpbiBvbmUgdmlzaXQgb3IgYW5vdGhlciB3aG8gcmVhbGx5IGRvZXMgbm90IGZpdAp3ZWxsIHdpdGggdGhlIHJlc3Qgb2YgdGhlIGNvaG9ydC4KCmBgYHtyIG5vcm1hbGl6ZV9uZXV0cm9waGlsX3R1bWFjb19zYW1wbGVzfQp0X25ldXRyb3BoaWxfbm9ybSA8LSBub3JtYWxpemVfZXhwdCh0X25ldXRyb3BoaWxzLCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybSA9ICJxdWFudCIsIGZpbHRlciA9IFRSVUUpCgp0X25ldXRyb3BoaWxfcGNhIDwtIHBsb3RfcGNhKHRfbmV1dHJvcGhpbF9ub3JtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RfbGFiZWxzID0gRkFMU0UpCnRfbmV1dHJvcGhpbF9wY2EkcGxvdAoKdF9uZXV0cm9waGlsX25iIDwtIG5vcm1hbGl6ZV9leHB0KHRfbmV1dHJvcGhpbHMsIHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKdF9uZXV0cm9waGlsX25iX3BjYSA8LSBwbG90X3BjYSh0X25ldXRyb3BoaWxfbmIsIHBsb3RfbGFiZWxzID0gRkFMU0UpCnRfbmV1dHJvcGhpbF9uYl9wY2EkcGxvdApgYGAKCiMjIyBWaXN1YWxpemU6IEVvc2lub3BoaWwgc2FtcGxlcyBvbmx5IFR1bWFjbwoKYGBge3Igbm9ybWFsaXplX2Vvc2lub3BoaWxfdHVtYWNvX3NhbXBsZXN9CnRfZW9zaW5vcGhpbF9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KHRfZW9zaW5vcGhpbHMsIHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtID0gInF1YW50IiwgZmlsdGVyID0gVFJVRSkKCnRfZW9zaW5vcGhpbF9wY2EgPC0gcGxvdF9wY2EodF9lb3Npbm9waGlsX25vcm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdF9sYWJlbHMgPSBGQUxTRSkKdF9lb3Npbm9waGlsX3BjYSRwbG90Cgp0X2Vvc2lub3BoaWxfbmIgPC0gbm9ybWFsaXplX2V4cHQodF9lb3Npbm9waGlscywgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQp0X2Vvc2lub3BoaWxfbmJfcGNhIDwtIHBsb3RfcGNhKHRfZW9zaW5vcGhpbF9uYiwgcGxvdF9sYWJlbHMgPSBGQUxTRSkKdF9lb3Npbm9waGlsX25iX3BjYSRwbG90CmBgYAoKIyMjIFZpc3VhbGl6ZTogTG9vayBhdCBDZWxsIHR5cGVzIEMvRiBieSB2aXNpdAoKIyMjIyBNb25vY3l0ZXMsIFZpc2l0IDEKCmBgYHtyIG1vbm9jeXRlc19ieV92aXNpdF92MX0KdF9tb25vY3l0ZV92MSA8LSBzdWJzZXRfZXhwdCh0X21vbm9jeXRlcywgc3Vic2V0ID0gInZpc2l0bnVtYmVyPT0nMSciKQp0X21vbm9jeXRlX3YxX25vcm0gPC0gbm9ybWFsaXplX2V4cHQodF9tb25vY3l0ZV92MSwgbm9ybSA9ICJxdWFudCIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSA9ICJsb2cyIiwgZmlsdGVyID0gVFJVRSkKdF9tb25vY3l0ZV92MV9wY2EgPC0gcGxvdF9wY2EodF9tb25vY3l0ZV92MV9ub3JtLCBwbG90X2xhYmVscyA9IEZBTFNFKQp0X21vbm9jeXRlX3YxX3BjYSRwbG90Cgp0X21vbm9jeXRlX3YxX25iIDwtIG5vcm1hbGl6ZV9leHB0KHRfbW9ub2N5dGVfdjEsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSAibG9nMiIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCnRfbW9ub2N5dGVfdjFfbmJfcGNhIDwtIHBsb3RfcGNhKHRfbW9ub2N5dGVfdjFfbmIsIHBsb3RfbGFiZWxzID0gRkFMU0UpCnRfbW9ub2N5dGVfdjFfbmJfcGNhJHBsb3QKYGBgCgojIyMjIE1vbm9jeXRlcyBWaXNpdCAyCgpgYGB7ciBtb25vY3l0ZXNfYnlfdmlzaXRfMn0KdF9tb25vY3l0ZV92MiA8LSBzdWJzZXRfZXhwdCh0X21vbm9jeXRlcywgc3Vic2V0ID0gInZpc2l0bnVtYmVyPT0nMiciKQp0X21vbm9jeXRlX3YyX25vcm0gPC0gbm9ybWFsaXplX2V4cHQodF9tb25vY3l0ZV92Miwgbm9ybSA9ICJxdWFudCIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSA9ICJsb2cyIiwgZmlsdGVyID0gVFJVRSkKdF9tb25vY3l0ZV92Ml9wY2EgPC0gcGxvdF9wY2EodF9tb25vY3l0ZV92Ml9ub3JtLCBwbG90X2xhYmVscyA9IEZBTFNFKQp0X21vbm9jeXRlX3YyX3BjYSRwbG90Cgp0X21vbm9jeXRlX3YyX25iIDwtIG5vcm1hbGl6ZV9leHB0KHRfbW9ub2N5dGVfdjIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSAibG9nMiIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCnRfbW9ub2N5dGVfdjJfbmJfcGNhIDwtIHBsb3RfcGNhKHRfbW9ub2N5dGVfdjJfbmIsIHBsb3RfbGFiZWxzID0gRkFMU0UpCnRfbW9ub2N5dGVfdjJfbmJfcGNhJHBsb3QKYGBgCgojIyMjIE1vbm9jeXRlcyBWaXNpdCAzCgpgYGB7ciBtb25vY3l0ZXNfYnlfdmlzaXRfM30KdF9tb25vY3l0ZV92MyA8LSBzdWJzZXRfZXhwdCh0X21vbm9jeXRlcywgc3Vic2V0ID0gInZpc2l0bnVtYmVyPT0nMyciKQp0X21vbm9jeXRlX3YzX25vcm0gPC0gbm9ybWFsaXplX2V4cHQodF9tb25vY3l0ZV92Mywgbm9ybSA9ICJxdWFudCIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSAibG9nMiIsIGZpbHRlciA9IFRSVUUpCnRfbW9ub2N5dGVfdjNfcGNhIDwtIHBsb3RfcGNhKHRfbW9ub2N5dGVfdjNfbm9ybSwgcGxvdF9sYWJlbHMgPSBGQUxTRSkKdF9tb25vY3l0ZV92M19wY2EkcGxvdAoKdF9tb25vY3l0ZV92M19uYiA8LSBub3JtYWxpemVfZXhwdCh0X21vbm9jeXRlX3YzLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtID0gImxvZzIiLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp0X21vbm9jeXRlX3YzX25iX3BjYSA8LSBwbG90X3BjYSh0X21vbm9jeXRlX3YzX25iLCBwbG90X2xhYmVscyA9IEZBTFNFKQp0X21vbm9jeXRlX3YzX25iX3BjYSRwbG90CmBgYAoKIyMjIyBOZXV0cm9waGlscywgVmlzaXQgMQoKYGBge3IgbmV1dHJvcGhpbHNfYnlfdmlzaXRfdjF9CnRfbmV1dHJvcGhpbF92MSA8LSBzdWJzZXRfZXhwdCh0X25ldXRyb3BoaWxzLCBzdWJzZXQgPSAidmlzaXRudW1iZXI9PScxJyIpCnRfbmV1dHJvcGhpbF92MV9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KHRfbmV1dHJvcGhpbF92MSwgbm9ybSA9ICJxdWFudCIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSAibG9nMiIsIGZpbHRlciA9IFRSVUUpCnRfbmV1dHJvcGhpbF92MV9wY2EgPC0gcGxvdF9wY2EodF9uZXV0cm9waGlsX3YxX25vcm0sIHBsb3RfbGFiZWxzID0gRkFMU0UpCnRfbmV1dHJvcGhpbF92MV9wY2EkcGxvdAoKdF9uZXV0cm9waGlsX3YxX25iIDwtIG5vcm1hbGl6ZV9leHB0KHRfbmV1dHJvcGhpbF92MSwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtID0gImxvZzIiLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJydXZnIikKdF9uZXV0cm9waGlsX3YxX25iX3BjYSA8LSBwbG90X3BjYSh0X25ldXRyb3BoaWxfdjFfbmIsIHBsb3RfbGFiZWxzID0gRkFMU0UpCnRfbmV1dHJvcGhpbF92MV9uYl9wY2EkcGxvdApgYGAKCiMjIyMgTmV1dHJvcGhpbHMgVmlzaXQgMgoKYGBge3IgbmV1dHJvcGhpbHNfYnlfdmlzaXRfMn0KdF9uZXV0cm9waGlsX3YyIDwtIHN1YnNldF9leHB0KHRfbmV1dHJvcGhpbHMsIHN1YnNldCA9ICJ2aXNpdG51bWJlcj09JzInIikKdF9uZXV0cm9waGlsX3YyX25vcm0gPC0gbm9ybWFsaXplX2V4cHQodF9uZXV0cm9waGlsX3YyLCBub3JtID0gInF1YW50IiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSAibG9nMiIsIGZpbHRlciA9IFRSVUUpCnRfbmV1dHJvcGhpbF92Ml9wY2EgPC0gcGxvdF9wY2EodF9uZXV0cm9waGlsX3YyX25vcm0sIHBsb3RfbGFiZWxzID0gRkFMU0UpCnRfbmV1dHJvcGhpbF92Ml9wY2EkcGxvdAoKdF9uZXV0cm9waGlsX3YyX25iIDwtIG5vcm1hbGl6ZV9leHB0KHRfbmV1dHJvcGhpbF92MiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtID0gImxvZzIiLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp0X25ldXRyb3BoaWxfdjJfbmJfcGNhIDwtIHBsb3RfcGNhKHRfbmV1dHJvcGhpbF92Ml9uYiwgcGxvdF9sYWJlbHMgPSBGQUxTRSkKdF9uZXV0cm9waGlsX3YyX25iX3BjYSRwbG90CmBgYAoKIyMjIyBOZXV0cm9waGlscyBWaXNpdCAzCgpgYGB7ciBuZXV0cm9waGlsc19ieV92aXNpdF8zfQp0X25ldXRyb3BoaWxfdjMgPC0gc3Vic2V0X2V4cHQodF9uZXV0cm9waGlscywgc3Vic2V0ID0gInZpc2l0bnVtYmVyPT0nMyciKQp0X25ldXRyb3BoaWxfdjNfbm9ybSA8LSBub3JtYWxpemVfZXhwdCh0X25ldXRyb3BoaWxfdjMsIG5vcm0gPSAicXVhbnQiLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSA9ICJsb2czIiwgZmlsdGVyID0gVFJVRSkKdF9uZXV0cm9waGlsX3YzX3BjYSA8LSBwbG90X3BjYSh0X25ldXRyb3BoaWxfdjNfbm9ybSwgcGxvdF9sYWJlbHMgPSBGQUxTRSkKdF9uZXV0cm9waGlsX3YzX3BjYSRwbG90Cgp0X25ldXRyb3BoaWxfdjNfbmIgPC0gbm9ybWFsaXplX2V4cHQodF9uZXV0cm9waGlsX3YzLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSAibG9nMiIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCnRfbmV1dHJvcGhpbF92M19uYl9wY2EgPC0gcGxvdF9wY2EodF9uZXV0cm9waGlsX3YzX25iLCBwbG90X2xhYmVscyA9IEZBTFNFKQp0X25ldXRyb3BoaWxfdjNfbmJfcGNhJHBsb3QKYGBgCgojIyMjIEVvc2lub3BoaWxzLCBWaXNpdCAxCgpgYGB7ciBlb3Npbm9waGlsc19ieV92aXNpdF92MX0KdF9lb3Npbm9waGlsX3YxIDwtIHN1YnNldF9leHB0KHRfZW9zaW5vcGhpbHMsIHN1YnNldCA9ICJ2aXNpdG51bWJlcj09JzEnIikKdF9lb3Npbm9waGlsX3YxX25vcm0gPC0gbm9ybWFsaXplX2V4cHQodF9lb3Npbm9waGlsX3YxLCBub3JtID0gInF1YW50IiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSA9ICJsb2cyIiwgZmlsdGVyID0gVFJVRSkKdF9lb3Npbm9waGlsX3YxX3BjYSA8LSBwbG90X3BjYSh0X2Vvc2lub3BoaWxfdjFfbm9ybSwgcGxvdF9sYWJlbHMgPSBGQUxTRSkKdF9lb3Npbm9waGlsX3YxX3BjYSRwbG90Cgp0X2Vvc2lub3BoaWxfdjFfbmIgPC0gbm9ybWFsaXplX2V4cHQodF9lb3Npbm9waGlsX3YxLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSAibG9nMiIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCnRfZW9zaW5vcGhpbF92MV9uYl9wY2EgPC0gcGxvdF9wY2EodF9lb3Npbm9waGlsX3YxX25iLCBwbG90X2xhYmVscyA9IEZBTFNFKQp0X2Vvc2lub3BoaWxfdjFfbmJfcGNhJHBsb3QKYGBgCgojIyMjIEVvc2lub3BoaWxzIFZpc2l0IDIKCmBgYHtyIGVvc2lub3BoaWxzX2J5X3Zpc2l0XzJ9CnRfZW9zaW5vcGhpbF92MiA8LSBzdWJzZXRfZXhwdCh0X2Vvc2lub3BoaWxzLCBzdWJzZXQgPSAidmlzaXRudW1iZXI9PScyJyIpCnRfZW9zaW5vcGhpbF92Ml9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KHRfZW9zaW5vcGhpbF92Miwgbm9ybSA9ICJxdWFudCIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtID0gImxvZzIiLCBmaWx0ZXIgPSBUUlVFKQp0X2Vvc2lub3BoaWxfdjJfcGNhIDwtIHBsb3RfcGNhKHRfZW9zaW5vcGhpbF92Ml9ub3JtLCBwbG90X2xhYmVscyA9IEZBTFNFKQp0X2Vvc2lub3BoaWxfdjJfcGNhJHBsb3QKCnRfZW9zaW5vcGhpbF92Ml9uYiA8LSBub3JtYWxpemVfZXhwdCh0X2Vvc2lub3BoaWxfdjIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSA9ICJsb2cyIiwgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikKdF9lb3Npbm9waGlsX3YyX25iX3BjYSA8LSBwbG90X3BjYSh0X2Vvc2lub3BoaWxfdjJfbmIsIHBsb3RfbGFiZWxzID0gRkFMU0UpCnRfZW9zaW5vcGhpbF92Ml9uYl9wY2EkcGxvdApgYGAKCiMjIyMgRW9zaW5vcGhpbHMgVmlzaXQgMwoKYGBge3IgZW9zaW5vcGhpbHNfYnlfdmlzaXRfM30KdF9lb3Npbm9waGlsX3YzIDwtIHN1YnNldF9leHB0KHRfZW9zaW5vcGhpbHMsIHN1YnNldCA9ICJ2aXNpdG51bWJlcj09JzMnIikKdF9lb3Npbm9waGlsX3YzX25vcm0gPC0gbm9ybWFsaXplX2V4cHQodF9lb3Npbm9waGlsX3YzLCBub3JtID0gInF1YW50IiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSAibG9nMyIsIGZpbHRlciA9IFRSVUUpCnRfZW9zaW5vcGhpbF92M19wY2EgPC0gcGxvdF9wY2EodF9lb3Npbm9waGlsX3YzX25vcm0sIHBsb3RfbGFiZWxzID0gRkFMU0UpCnRfZW9zaW5vcGhpbF92M19wY2EkcGxvdAoKdF9lb3Npbm9waGlsX3YzX25iIDwtIG5vcm1hbGl6ZV9leHB0KHRfZW9zaW5vcGhpbF92MywgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtID0gImxvZzIiLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp0X2Vvc2lub3BoaWxfdjNfbmJfcGNhIDwtIHBsb3RfcGNhKHRfZW9zaW5vcGhpbF92M19uYiwgcGxvdF9sYWJlbHMgPSBGQUxTRSkKdF9lb3Npbm9waGlsX3YzX25iX3BjYSRwbG90CmBgYAoKIyMgUmVjYXRlZ29yaXplOiBDb25jYXRlbmF0ZSBjdXJlL2ZhaWwgYW5kIGNlbGwgdHlwZQoKSW4gdGhlIGZvbGxvd2luZyBibG9jayB0aGUgZXhwZXJpbWVudGFsIGNvbmRpdGlvbiB3YXMgcmVzZXQgdG8gdGhlCmNvbmNhdGVuYXRpb24gb2YgY2xpbmljYWwgb3V0Y29tZSBhbmQgdHlwZSBvZiBjZWxscy4gIFRoZXJlIGFyZSBhbgppbnN1ZmZpY2llbnQgbnVtYmVyIG9mIGJpb3BzeSBzYW1wbGVzIGZvciB0aGVtIHRvIGJlIHVzZWZ1bCBpbiB0aGlzCnZpc3VhbGl6YXRpb24sIHNvIHRoZXkgYXJlIGlnbm9yZWQuCgpgYGB7ciBjZl9hbmRfdHlwZX0KZGVzaXJlZF9sZXZlbHMgPC0gYygiY3VyZV9iaW9wc3kiLCAiZmFpbHVyZV9iaW9wc3kiLCAiY3VyZV9lb3Npbm9waGlscyIsICJmYWlsdXJlX2Vvc2lub3BoaWxzIiwKICAgICAgICAgICAgICAgICAgICAiY3VyZV9tb25vY3l0ZXMiLCAiZmFpbHVyZV9tb25vY3l0ZXMiLCAiY3VyZV9uZXV0cm9waGlscyIsICJmYWlsdXJlX25ldXRyb3BoaWxzIikKbmV3X2ZhY3QgPC0gZmFjdG9yKAogICAgcGFzdGUwKHBEYXRhKHRfY2xpbmljYWwpW1siY29uZGl0aW9uIl1dLCAiXyIsCiAgICAgICAgICAgcERhdGEodF9jbGluaWNhbClbWyJiYXRjaCJdXSksCiAgICBsZXZlbHM9ZGVzaXJlZF9sZXZlbHMpCgp0X2NsaW5pY2FsX2NvbmNhdCA8LSBzZXRfZXhwdF9jb25kaXRpb25zKHRfY2xpbmljYWwsIGZhY3QgPSBuZXdfZmFjdCkgJT4lCiAgc2V0X2V4cHRfYmF0Y2hlcyhmYWN0ID0gInZpc2l0bnVtYmVyIikgJT4lCiAgc2V0X2V4cHRfY29sb3JzKGNvbG9yX2Nob2ljZXNbWyJjZl90eXBlIl1dKSAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQ9InR5cGVvZmNlbGxzIT0nYmlvcHN5JyIpCgojIyBUcnkgdG8gZW5zdXJlIHRoYXQgdGhlIGxldmVscyBzdGF5IGluIHRoZSBvcmRlciBJIHdhbnQKbWV0YSA8LSBwRGF0YSh0X2NsaW5pY2FsX2NvbmNhdCkgJT4lCiAgbXV0YXRlKGNvbmRpdGlvbiA9IGZjdF9yZWxldmVsKGNvbmRpdGlvbiwgZGVzaXJlZF9sZXZlbHMpKQpwRGF0YSh0X2NsaW5pY2FsX2NvbmNhdCkgPC0gbWV0YQpgYGAKCiMjIyBWaXN1YWxpemU6IExvb2sgYXQgVHVtYWNvLW9ubHkgc2FtcGxlcyBieSBjZWxsIHR5cGUgYW5kIGN1cmUvZmFpbAoKVGhlIGZvbGxvd2luZyBibG9jayBpcyBwcmV0dHkgd2lsZCB0byBteSBleWVzOyBpdCBzZWVtcyB0byBtZSB0aGF0IHRoZQp2YXJpYW5jZXMgaW50cm9kdWNlZCBieSBjZWxsIHR5cGUgYmFzaWNhbGx5IHdpcGUgb3V0IHRoZSBhcHBhcmVudApkaWZmZXJlbmNlcyBiZXR3ZWVuIGN1cmUvZmFpbCB0aGF0IHdlIHdlcmUgYWJsZSB0byBzZWUgcHJldmlvdXNseS4KCkkgc3VwcG9zZSB0aGlzIGlzIG5vdCBlbnRpcmVseSBzdXJwcmlzaW5nLCBidXQgd2hlbiB3ZSBoYWQgdGhlIENhbGkKc2FtcGxlcyBpdCBhdCBsZWFzdCBsb29rZWQgbGlrZSB0aGVyZSB3ZXJlIGRpZmZlcmVuY2VzIHdoaWNoIHdlcmUKZXhwbGljaXRseSBiZXR3ZWVuIGN1cmUvZmFpbCBhY3Jvc3MgY2VsbCB0eXBlcy4gIEkgc3VwcG9zZSB0aGlzIG1lYW5zCnRob3NlIGRpZmZlcmVuY2VzIHdlcmUgYWN0dWFsbHkgY29taW5nIGZyb20gdGhlIHVuYmFsYW5jZWQgc3RhdGUgb2YKdGhlIHR3byBjbGluaWNzIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIGNsaW5pYy4KCmBgYHtyIHZpZXdfY2xpbmljYWxfY2VsbF90eXBlX2NmfQp0X2NsaW5pY2FsX2NvbmNhdF9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KHRfY2xpbmljYWxfY29uY2F0LCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybSA9ICJxdWFudCIsIGZpbHRlciA9IFRSVUUpCnRfY2xpbmljYWxfY29uY2F0X25vcm1fcGNhIDwtIHBsb3RfcGNhKHRfY2xpbmljYWxfY29uY2F0X25vcm0pCnRfY2xpbmljYWxfY29uY2F0X25vcm1fcGNhJHBsb3QKCnRfY2xpbmljYWxfY29uY2F0X25iIDwtIG5vcm1hbGl6ZV9leHB0KHRfY2xpbmljYWxfY29uY2F0LCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKdF9jbGluaWNhbF9jb25jYXRfbmJfcGNhIDwtIHBsb3RfcGNhKHRfY2xpbmljYWxfY29uY2F0X25iKQp0X2NsaW5pY2FsX2NvbmNhdF9uYl9wY2EkcGxvdApgYGAKCiMgVmlzaXQgY29tcGFyaXNvbnMKCkxldCB1cyBzaGlmdCB0aGUgZm9jdXMgZnJvbSBjZWxsIHR5cGUgYW5kL29yIEN1cmUvRmFpbCB0byB0aGUgdmlzaXQKbnVtYmVyLiAgQXMgeW91IGFyZSBsaWtlbHkgYXdhcmUsIHRoZSB0aHJlZSB2aXNpdHMgYXJlIHNpZ25pZmljYW50bHkKc3ByZWFkIGFwYXJ0IGFjY29yZGluZyB0byB0aGUgY2xpbmljYWwgdHJlYXRtZW50IG9mIGVhY2ggcGF0aWVudC4KVGh1cyB3ZSB3aWxsIG5vdyBzZXBhcmF0ZSB0aGUgc2FtcGxlcyBieSB2aXNpdCBpbiBvcmRlciB0byBtb3JlIGVhc2lseQpzZWUgd2hhdCBuZXcgcGF0dGVybnMgZW1lcmdlLgoKIyMgUmVjYXRlZ29yaXplOiBBbGwgdmlzaXRzIHRvZ2V0aGVyCgpOb3cgbGV0IHVzIHNoaWZ0IHRoZSB2aWV3IHNsaWdodGx5IHRvIGZvY3VzIG9uIGNoYW5nZXMgb2JzZXJ2ZWQgb3ZlciB0aW1lLgoKYGBge3IgY29tcGFyZV9hbGxfdmlzaXRzfQp0Y192aXNpdF9leHB0IDwtIHNldF9leHB0X2NvbmRpdGlvbnModGNfY2xpbmljYWwsIGZhY3QgPSAidmlzaXRudW1iZXIiKSAlPiUKICBzZXRfZXhwdF9iYXRjaGVzKGZhY3QgPSAiZmluYWxvdXRjb21lIikgJT4lCiAgc2V0X2V4cHRfY29sb3JzKGNvbG9yX2Nob2ljZXNbWyJ2aXNpdDIiXV0pCnRjX3Zpc2l0X25vcm0gPC0gbm9ybWFsaXplX2V4cHQodGNfdmlzaXRfZXhwdCwgZmlsdGVyID0gVFJVRSwgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2ggPSAic3Zhc2VxIikKcGxvdF9wY2EodGNfdmlzaXRfbm9ybSkkcGxvdAoKdF92aXNpdF9leHB0IDwtIHNldF9leHB0X2NvbmRpdGlvbnModF9jbGluaWNhbCwgZmFjdCA9ICJ2aXNpdG51bWJlciIpICU+JQogIHNldF9leHB0X2JhdGNoZXMoZmFjdCA9ICJmaW5hbG91dGNvbWUiKSAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQ9InR5cGVvZmNlbGxzIT0nYmlvcHN5JyIpCgp0X3Zpc2l0X25vcm0gPC0gbm9ybWFsaXplX2V4cHQodF92aXNpdF9leHB0LCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtID0gInF1YW50IiwgZmlsdGVyID0gVFJVRSkKcGxvdF9wY2EodF92aXNpdF9ub3JtKSRwbG90CnRfdmlzaXRfbmIgPC0gbm9ybWFsaXplX2V4cHQodF92aXNpdF9leHB0LCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp0X3Zpc2l0X25iX3BjYSA8LSBwbG90X3BjYSh0X3Zpc2l0X25iKQp0X3Zpc2l0X25iX3BjYSRwbG90CmBgYAoKV2hlbiBsb29raW5nIGF0IGFsbCBjZWxsIHR5cGVzLCBpdCBpcyBxdWl0ZSBkaWZmaWN1bHQgdG8gc2VlCmRpZmZlcmVuY2VzIGFtb25nIHRoZSB0aHJlZSB2aXNpdHMuCgojIyBWaXN1YWxpemU6IEMvRiBmb3Igb25seSB0aGUgdmlzaXQgMSBzYW1wbGVzCgpXZW4gd2UgaGFkIGJvdGggQ2FsaSBhbmQgVHVtYWNvIHNhbXBsZXMsIGl0IGxvb2tlZCBsaWtlIHRoZXJlIHdhcwp2YXJpYW5jZSBzdWdnZXN0aW5nIGRpZmZlcmVuY2VzIGJldHdlZW4gY3VyZSBhbmQgZmFpbCBmb3IgdmlzaXQgMS4gIEkKdGhpbmsgdGhlIGZvbGxvd2luZyBibG9jayB3aWxsIHN1Z2dlc3QgcHJldHR5IHN0cm9uZ2x5IHRoYXQgdGhpcyB3YXMKbm90IHRydWUuCgpgYGB7ciB2aXNpdDFfZGF0YX0KdHYxX25vcm0gPC0gbm9ybWFsaXplX2V4cHQodHYxX3NhbXBsZXMsIHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm0gPSAicXVhbnQiLCBmaWx0ZXIgPSBUUlVFKQpwbG90X3BjYSh0djFfbm9ybSkkcGxvdAp0djFfbmIgPC0gbm9ybWFsaXplX2V4cHQodHYxX3NhbXBsZXMsIHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQpwbG90X3BjYSh0djFfbmIsIHBsb3RfbGFiZWxzID0gRkFMU0UpJHBsb3QKYGBgCgojIyBWaXN1YWxpemU6IEMvRiBmb3Igb25seSB0aGUgdmlzaXQgMiBzYW1wbGVzCgpgYGB7ciB2aXNpdDJfZGF0YX0KdHYyX2NsaW5pY2FsIDwtIHN1YnNldF9leHB0KHR2Ml9zYW1wbGVzLCBzdWJzZXQgPSAidmlzaXRudW1iZXI9PScyJyIpICU+JQogIHNldF9leHB0X2NvbmRpdGlvbnMoZmFjdCA9ICJmaW5hbG91dGNvbWUiKSAlPiUKICBzZXRfZXhwdF9iYXRjaGVzKGZhY3QgPSAidHlwZW9mY2VsbHMiKQoKdHYyX25iIDwtIG5vcm1hbGl6ZV9leHB0KHR2Ml9jbGluaWNhbCwgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIsIG5vcm0gPSAicXVhbnQiLAogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQpwbG90X3BjYSh0djJfbmIsIHBsb3RfbGFiZWxzID0gRkFMU0UpJHBsb3QKYGBgCgojIyBWaXN1YWxpemU6IEMvRiBmb3Igb25seSB0aGUgdmlzaXQgMyBzYW1wbGVzCgpgYGB7ciB2aXNpdDNfZGF0YX0KdHYzX2NsaW5pY2FsIDwtIHN1YnNldF9leHB0KHR2M19zYW1wbGVzLCBzdWJzZXQgPSAidmlzaXRudW1iZXI9PSczJyIpICU+JQogIHNldF9leHB0X2NvbmRpdGlvbnMoZmFjdCA9ICJmaW5hbG91dGNvbWUiKSAlPiUKICBzZXRfZXhwdF9iYXRjaGVzKGZhY3QgPSAidHlwZW9mY2VsbHMiKQoKdHYzX25iIDwtIG5vcm1hbGl6ZV9leHB0KHR2M19jbGluaWNhbCwgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIsIG5vcm0gPSAicXVhbnQiLAogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQpwbG90X3BjYSh0djNfbmIsIHBsb3RfbGFiZWxzID0gRkFMU0UpJHBsb3QKYGBgCgojIyMgVmlzdWFsaXplOiBDb21wYXJpbmcgMyB2aXNpdHMgYnkgY2VsbCB0eXBlCgpTZXBhcmF0ZSB0aGUgc2FtcGxlcyBieSBjZWxsIHR5cGUgaW4gb3JkZXIgdG8gbW9yZSBlYXNpbHkgb2JzZXJ2ZQpwYXR0ZXJucyB3aXRoIHJlc3BlY3QgdG8gdmlzaXQgYW5kIGNsaW5pY2FsIG91dGNvbWUuCgojIyMjIE1vbm9jeXRlcyBhY3Jvc3MgdmlzaXRzCgpgYGB7ciBtb25vY3l0ZV92aXNpdF9zZXBhcmF0ZX0KdF92aXNpdGNmX21vbm9jeXRlX25vcm0gPC0gbm9ybWFsaXplX2V4cHQodF92aXNpdGNmX21vbm9jeXRlLCBub3JtID0gInF1YW50IiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSA9ICJsb2cyIiwgZmlsdGVyID0gVFJVRSkKdF92aXNpdGNmX21vbm9jeXRlX3BjYSA8LSBwbG90X3BjYSh0X3Zpc2l0Y2ZfbW9ub2N5dGVfbm9ybSwgcGxvdF9sYWJlbHMgPSBGQUxTRSkKdF92aXNpdGNmX21vbm9jeXRlX3BjYSRwbG90Cgp0X3Zpc2l0Y2ZfbW9ub2N5dGVfZGlzaGVhdCA8LSBwbG90X2Rpc2hlYXQodF92aXNpdGNmX21vbm9jeXRlX25vcm0pCnRfdmlzaXRjZl9tb25vY3l0ZV9kaXNoZWF0JHBsb3QKCnRfdmlzaXRjZl9tb25vY3l0ZV9uYiA8LSBub3JtYWxpemVfZXhwdCh0X3Zpc2l0Y2ZfbW9ub2N5dGUsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtID0gImxvZzIiLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp0X3Zpc2l0Y2ZfbW9ub2N5dGVfbmJfcGNhIDwtIHBsb3RfcGNhKHRfdmlzaXRjZl9tb25vY3l0ZV9uYiwgcGxvdF9sYWJlbHMgPSBGQUxTRSkKdF92aXNpdGNmX21vbm9jeXRlX25iX3BjYSRwbG90CmBgYAoKIyMjIyBFb3Npbm9waGlscyBhY3Jvc3MgdmlzaXRzCgpgYGB7ciBlb3Npbm9waGlsX3Zpc2l0X3NlcGFyYXRlfQp0X3Zpc2l0Y2ZfZW9zaW5vcGhpbF9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KHRfdmlzaXRjZl9lb3Npbm9waGlsLCBub3JtID0gInF1YW50IiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSA9ICJsb2cyIiwgZmlsdGVyID0gVFJVRSkKdF92aXNpdGNmX2Vvc2lub3BoaWxfcGNhIDwtIHBsb3RfcGNhKHRfdmlzaXRjZl9lb3Npbm9waGlsX25vcm0sIHBsb3RfbGFiZWxzID0gRkFMU0UpCnRfdmlzaXRjZl9lb3Npbm9waGlsX3BjYSRwbG90Cgp0X3Zpc2l0Y2ZfZW9zaW5vcGhpbF9kaXNoZWF0IDwtIHBsb3RfZGlzaGVhdCh0X3Zpc2l0Y2ZfZW9zaW5vcGhpbF9ub3JtKQp0X3Zpc2l0Y2ZfZW9zaW5vcGhpbF9kaXNoZWF0JHBsb3QKCnRfdmlzaXRjZl9lb3Npbm9waGlsX25iIDwtIG5vcm1hbGl6ZV9leHB0KHRfdmlzaXRjZl9lb3Npbm9waGlsLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSA9ICJsb2cyIiwgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikKdF92aXNpdGNmX2Vvc2lub3BoaWxfbmJfcGNhIDwtIHBsb3RfcGNhKHRfdmlzaXRjZl9lb3Npbm9waGlsX25iLCBwbG90X2xhYmVscyA9IEZBTFNFKQp0X3Zpc2l0Y2ZfZW9zaW5vcGhpbF9uYl9wY2EkcGxvdApgYGAKCiMjIyMgTmV1dHJvcGhpbHMgYWNyb3NzIHZpc2l0cwoKYGBge3IgbmV1dHJvcGhpbF92aXNpdF9zZXBhcmF0ZX0KdF92aXNpdGNmX25ldXRyb3BoaWxfbm9ybSA8LSBub3JtYWxpemVfZXhwdCh0X3Zpc2l0Y2ZfbmV1dHJvcGhpbCwgbm9ybSA9ICJxdWFudCIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSAibG9nMiIsIGZpbHRlciA9IFRSVUUpCnRfdmlzaXRjZl9uZXV0cm9waGlsX3BjYSA8LSBwbG90X3BjYSh0X3Zpc2l0Y2ZfbmV1dHJvcGhpbF9ub3JtLCBwbG90X2xhYmVscyA9IEZBTFNFKQp0X3Zpc2l0Y2ZfbmV1dHJvcGhpbF9wY2EkcGxvdAoKdF92aXNpdGNmX25ldXRyb3BoaWxfZGlzaGVhdCA8LSBwbG90X2Rpc2hlYXQodF92aXNpdGNmX25ldXRyb3BoaWxfbm9ybSkKdF92aXNpdGNmX25ldXRyb3BoaWxfZGlzaGVhdCRwbG90Cgp0X3Zpc2l0Y2ZfbmV1dHJvcGhpbF9uYiA8LSBub3JtYWxpemVfZXhwdCh0X3Zpc2l0Y2ZfbmV1dHJvcGhpbCwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSAibG9nMiIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCnRfdmlzaXRjZl9uZXV0cm9waGlsX25iX3BjYSA8LSBwbG90X3BjYSh0X3Zpc2l0Y2ZfbmV1dHJvcGhpbF9uYiwgcGxvdF9sYWJlbHMgPSBGQUxTRSkKdF92aXNpdGNmX25ldXRyb3BoaWxfbmJfcGNhJHBsb3QKYGBgCgojIyMjIENlbGx0eXBlcyBieSB2aXNpdCwgQy9GIGJhdGNoOiBNb25vY3l0ZXMKCmBgYHtyIG1vbm9jeXRlc192aXNpdGNmX2NmYmF0Y2h9CnRfdmlzaXRjZl9tb25vY3l0ZSA8LSBzZXRfZXhwdF9jb25kaXRpb25zKHRfdmlzaXRjZl9tb25vY3l0ZSwgcHJlZml4ID0gInYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0ID0gInZpc2l0bnVtYmVyIikgJT4lCiAgc2V0X2V4cHRfYmF0Y2hlcygiZmluYWxvdXRjb21lIikgJT4lCiAgc2V0X2V4cHRfY29sb3JzKGNvbG9yX2Nob2ljZXNbWyJ2aXNpdCJdXSkKdF92aXNpdGNmX21vbm9jeXRlX25vcm0gPC0gbm9ybWFsaXplX2V4cHQodF92aXNpdGNmX21vbm9jeXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybSA9ICJxdWFudCIsIGZpbHRlciA9IFRSVUUpCnRfdmlzaXRjZl9tb25vY3l0ZV9wY2EgPC0gcGxvdF9wY2EodF92aXNpdGNmX21vbm9jeXRlX25vcm0sIHBsb3RfbGFiZWxzID0gRkFMU0UpCnRfdmlzaXRjZl9tb25vY3l0ZV9wY2EkcGxvdApgYGAKCiMjIyMgQ2VsbHR5cGVzIGJ5IHZpc2l0LCBDL0YgYmF0Y2g6IEVvc2lub3BoaWxzCgpgYGB7ciBlb3Npbm9waGlsc192aXNpdGNmX2NmYmF0Y2h9CnRfdmlzaXRjZl9lb3Npbm9waGlsIDwtIHNldF9leHB0X2NvbmRpdGlvbnModF92aXNpdGNmX2Vvc2lub3BoaWwsIHByZWZpeCA9ICJ2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0ID0gInZpc2l0bnVtYmVyIikgJT4lCiAgc2V0X2V4cHRfYmF0Y2hlcygiZmluYWxvdXRjb21lIikgJT4lCiAgc2V0X2V4cHRfY29sb3JzKGNvbG9yX2Nob2ljZXNbWyJ2aXNpdCJdXSkKdF92aXNpdGNmX2Vvc2lub3BoaWxfbm9ybSA8LSBub3JtYWxpemVfZXhwdCh0X3Zpc2l0Y2ZfZW9zaW5vcGhpbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm0gPSAicXVhbnQiLCBmaWx0ZXIgPSBUUlVFKQp0X3Zpc2l0Y2ZfZW9zaW5vcGhpbF9wY2EgPC0gcGxvdF9wY2EodF92aXNpdGNmX2Vvc2lub3BoaWxfbm9ybSwgcGxvdF9sYWJlbHMgPSBGQUxTRSkKdF92aXNpdGNmX2Vvc2lub3BoaWxfcGNhJHBsb3QKYGBgCgojIyMjIENlbGx0eXBlcyBieSB2aXNpdCwgQy9GIGJhdGNoOiBOZXV0cm9waGlscwoKYGBge3IgbmV1dHJvcGhpbHNfdmlzaXRjZl9jZmJhdGNofQp0X3Zpc2l0Y2ZfbmV1dHJvcGhpbCA8LSBzZXRfZXhwdF9jb25kaXRpb25zKHRfdmlzaXRjZl9uZXV0cm9waGlsLCBwcmVmaXggPSAidiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdCA9ICJ2aXNpdG51bWJlciIpICU+JQogIHNldF9leHB0X2JhdGNoZXMoImZpbmFsb3V0Y29tZSIpICU+JQogIHNldF9leHB0X2NvbG9ycyhjb2xvcl9jaG9pY2VzW1sidmlzaXQiXV0pCnRfdmlzaXRjZl9uZXV0cm9waGlsX25vcm0gPC0gbm9ybWFsaXplX2V4cHQodF92aXNpdGNmX25ldXRyb3BoaWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtID0gInF1YW50IiwgZmlsdGVyID0gVFJVRSkKdF92aXNpdGNmX25ldXRyb3BoaWxfcGNhIDwtIHBsb3RfcGNhKHRfdmlzaXRjZl9uZXV0cm9waGlsX25vcm0sIHBsb3RfbGFiZWxzID0gRkFMU0UpCnRfdmlzaXRjZl9uZXV0cm9waGlsX3BjYSRwbG90CmBgYAoKIyBQZXJzaXN0ZW5jZQoKIyMjIFRha2UgYSBsb29rCgpTZWUgaWYgdGhlcmUgYXJlIGFueSBwYXR0ZXJucyB3aGljaCBsb29rIHVzYWJsZS4KCmBgYHtyIHBlcnNpc3RlbmNlX3Bsb3R9CiMjIEFsbAp0X3BlcnNpc3RlbmNlX25vcm0gPC0gbm9ybWFsaXplX2V4cHQodF9wZXJzaXN0ZW5jZSwgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybSA9ICJxdWFudCIsIGZpbHRlciA9IFRSVUUpCnBsb3RfcGNhKHRfcGVyc2lzdGVuY2Vfbm9ybSkkcGxvdAp0X3BlcnNpc3RlbmNlX25iIDwtIG5vcm1hbGl6ZV9leHB0KHRfcGVyc2lzdGVuY2UsIHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQpwbG90X3BjYSh0X3BlcnNpc3RlbmNlX25iKSRwbG90CgojIyBCaW9wc2llcwojI3BlcnNpc3RlbmNlX2Jpb3BzeV9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KHBlcnNpc3RlbmNlX2Jpb3BzeSwgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIsCiMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtID0gInF1YW50IiwgZmlsdGVyID0gVFJVRSkKIyNwbG90X3BjYShwZXJzaXN0ZW5jZV9iaW9wc3lfbm9ybSkkcGxvdAojIyBJbnN1ZmZpY2llbnQgZGF0YQoKIyMgTW9ub2N5dGVzCnRfcGVyc2lzdGVuY2VfbW9ub2N5dGVfbm9ybSA8LSBub3JtYWxpemVfZXhwdCh0X3BlcnNpc3RlbmNlX21vbm9jeXRlLCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm0gPSAicXVhbnQiLCBmaWx0ZXIgPSBUUlVFKQpwbG90X3BjYSh0X3BlcnNpc3RlbmNlX21vbm9jeXRlX25vcm0pJHBsb3QKdF9wZXJzaXN0ZW5jZV9tb25vY3l0ZV9uYiA8LSBub3JtYWxpemVfZXhwdCh0X3BlcnNpc3RlbmNlX21vbm9jeXRlLCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKcGxvdF9wY2EodF9wZXJzaXN0ZW5jZV9tb25vY3l0ZV9uYikkcGxvdAoKIyMgTmV1dHJvcGhpbHMKdF9wZXJzaXN0ZW5jZV9uZXV0cm9waGlsX25vcm0gPC0gbm9ybWFsaXplX2V4cHQodF9wZXJzaXN0ZW5jZV9uZXV0cm9waGlsLCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybSA9ICJxdWFudCIsIGZpbHRlciA9IFRSVUUpCnBsb3RfcGNhKHRfcGVyc2lzdGVuY2VfbmV1dHJvcGhpbF9ub3JtKSRwbG90CnRfcGVyc2lzdGVuY2VfbmV1dHJvcGhpbF9uYiA8LSBub3JtYWxpemVfZXhwdCh0X3BlcnNpc3RlbmNlX25ldXRyb3BoaWwsIHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQpwbG90X3BjYSh0X3BlcnNpc3RlbmNlX25ldXRyb3BoaWxfbmIpJHBsb3QKCiMjIEVvc2lub3BoaWxzCnRfcGVyc2lzdGVuY2VfZW9zaW5vcGhpbF9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KHRfcGVyc2lzdGVuY2VfZW9zaW5vcGhpbCwgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybSA9ICJxdWFudCIsIGZpbHRlciA9IFRSVUUpCnBsb3RfcGNhKHRfcGVyc2lzdGVuY2VfZW9zaW5vcGhpbF9ub3JtKSRwbG90CnRfcGVyc2lzdGVuY2VfZW9zaW5vcGhpbF9uYiA8LSBub3JtYWxpemVfZXhwdCh0X3BlcnNpc3RlbmNlX2Vvc2lub3BoaWwsIHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQpwbG90X3BjYSh0X3BlcnNpc3RlbmNlX2Vvc2lub3BoaWxfbmIpJHBsb3QKYGBgCgojIENsYXNzaWZ5IG1lIQoKSSB3cm90ZSBvdXQgYWxsIHRoZSB6Mi4yIGFuZCB6Mi4zIHNwZWNpZmljIHZhcmlhbnRzIHRvIGEgY291cGxlIGZpbGVzLApJIHdhbnQgdG8gc2VlIGlmIEkgY2FuIGNsYXNzaWZ5IGEgaHVtYW4gc2FtcGxlIGFzIGluZmVjdGVkIHdpdGggMi4yIG9yCjIuMy4KCmBgYHtyIGNsYXNzaWZ5bWUsIGV2YWw9RkFMU0V9CnoyMiA8LSByZWFkLmNzdigiY3N2L3ZhcmlhbnRzXzIyLmNzdiIpCnoyMyA8LSByZWFkLmNzdigiY3N2L3ZhcmlhbnRzXzIzLmNzdiIpCmN1cmUgPC0gcmVhZC5jc3YoImNzdi9jdXJlX3ZhcmlhbnRzLnR4dCIpCmZhaWwgPC0gcmVhZC5jc3YoImNzdi9mYWlsX3ZhcmlhbnRzLnR4dCIpCnoyMl92ZWMgPC0gZ3N1YihwYXR0ZXJuPSJcXC0iLCByZXBsYWNlbWVudD0iXyIsIHg9ejIyW1sieCJdXSkKejIzX3ZlYyA8LSBnc3ViKHBhdHRlcm49IlxcLSIsIHJlcGxhY2VtZW50PSJfIiwgeD16MjNbWyJ4Il1dKQpjdXJlX3ZlYyA8LSBnc3ViKHBhdHRlcm49IlxcLSIsIHJlcGxhY2VtZW50PSJfIiwgeD1jdXJlKQpmYWlsX3ZlYyA8LSBnc3ViKHBhdHRlcm49IlxcLSIsIHJlcGxhY2VtZW50PSJfIiwgeD1mYWlsKQoKY2xhc3NpZnlfenltbyA8LSBmdW5jdGlvbihzYW1wbGUpIHsKICBhcmJpdHJhcnlfdGFncyA8LSBzbShyZWFkcjo6cmVhZF90c3Yoc2FtcGxlKSkKICBhcmJpdHJhcnlfaWRzIDwtIGFyYml0cmFyeV90YWdzW1sicG9zaXRpb24iXV0KICBtZXNzYWdlKCJMZW5ndGg6ICIsIGxlbmd0aChhcmJpdHJhcnlfaWRzKSwgIiwgejIyOiAiLAogICAgICAgICAgc3VtKGFyYml0cmFyeV9pZHMgJWluJSB6MjJfdmVjKSAvIChsZW5ndGgoejIyX3ZlYykpLCAiIHoyMzogIiwKICAgICAgICAgIHN1bShhcmJpdHJhcnlfaWRzICVpbiUgejIzX3ZlYykgLyAobGVuZ3RoKHoyM192ZWMpKSkKfQoKYXJiaXRyYXJ5X3NhbXBsZSA8LSAicHJlcHJvY2Vzc2luZy9UTVJDMzAxNTYvb3V0cHV0cy80MGZyZWViYXllc19scGFuYW1lbnNpc192MzYvYWxsX3RhZ3MudHh0Lnh6IgpjbGFzc2lmeV96eW1vKGFyYml0cmFyeV9zYW1wbGUpCmBgYAoKYGBge3Igc2F2ZW1lLCBldmFsPUZBTFNFfQojI2lmICghaXNUUlVFKGdldDAoInNraXBfbG9hZCIpKSkgewojIyAgcGFuZGVyOjpwYW5kZXIoc2Vzc2lvbkluZm8oKSkKIyMgIG1lc3NhZ2UoIlRoaXMgaXMgaHBnbHRvb2xzIGNvbW1pdDogIiwgZ2V0X2dpdF9jb21taXQoKSkKIyMgIG1lc3NhZ2UoIlNhdmluZyB0byAiLCBzYXZlZmlsZSkKIyMgIHRtcCA8LSBzbShzYXZlbWUoZmlsZW5hbWU9c2F2ZWZpbGUpKQojI30KYGBgCgojIFZpc3VhbGl6aW5nIGNvbXBvc2l0ZSBzY29yZXMKCkZpcnN0IGxldHMgZ2V0IHRoZSBnZW5lIElEcyBhbmQgY29sb3JzIGZvciB0aGVzZSBwbG90cy4KCmBgYHtyIGdlbmVzX2FuZF9jb2xvcnN9CmxpYnJhcnkodmlyaWRpcykKd2FudGVkX2dlbmVzIDwtIGMoIklGSTQ0TCIsICJJRkkyNyIsICJQUlI1IiwgIlBSUjUtQVJIR0FQOCIsICJSSENFIiwKICAgICAgICAgICAgICAgICAgIkZCWE8zOSIsICJSU0FEMiIsICJTTVROTDEiLCAiVVNQMTgiLCAiQUZBUDEiKQp3YW50ZWRfaWR4IDwtIGZEYXRhKHRjX3ZhbGlkKVtbImhnbmNfc3ltYm9sIl1dICVpbiUgd2FudGVkX2dlbmVzCndhbnRlZF9pZHMgPC0gcm93bmFtZXMoZkRhdGEodGNfdmFsaWQpKVt3YW50ZWRfaWR4XQpgYGAKCiMjIEFsbCBzYW1wbGVzLCBhbGwgdmlzaXRzCgpgYGB7ciBjb21wb3NpdGVfYWxsX3NhbXBsZXN9CmZldyA8LSAgc3Vic2V0X2dlbmVzKHRjX3ZhbGlkLCBpZHMgPSB3YW50ZWRfaWRzLCBtZXRob2QgPSAia2VlcCIpICU+JQogIHNldF9leHB0X2NvbmRpdGlvbnMoZmFjdCA9ICJmaW5hbG91dGNvbWUiKSAlPiUKICBub3JtYWxpemVfZXhwdCh0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCnNocCA8LSBwbG90X3NhbXBsZV9oZWF0bWFwKGZldywgaGVhdG1hcF9jb2xvcnMgPSB2aXJpZGlzLCByb3dfbGFiZWwgPSB3YW50ZWRfZ2VuZXMpCnNocAoKZmV3IDwtICBzdWJzZXRfZ2VuZXModF9jbGluaWNhbCwgaWRzID0gd2FudGVkX2lkcywgbWV0aG9kID0gImtlZXAiKSAlPiUKICBzZXRfZXhwdF9jb25kaXRpb25zKGZhY3QgPSAiZmluYWxvdXRjb21lIikgJT4lCiAgbm9ybWFsaXplX2V4cHQodHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQpzaHAgPC0gcGxvdF9zYW1wbGVfaGVhdG1hcChmZXcsIGhlYXRtYXBfY29sb3JzID0gdmlyaWRpcywgcm93X2xhYmVsID0gd2FudGVkX2dlbmVzKQpzaHAKYGBgCgojIyBBbGwgc2FtcGxlcywgdmlzaXQgMQoKYGBge3IgY29tcG9zaXRlX2FsbF92MX0KZmV3IDwtIHN1YnNldF9nZW5lcyh0Y19jbGluaWNhbCwgaWRzID0gd2FudGVkX2lkcywgbWV0aG9kID0gImtlZXAiKSAlPiUKICBzZXRfZXhwdF9jb25kaXRpb25zKGZhY3QgPSAiZmluYWxvdXRjb21lIikgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gInZpc2l0bnVtYmVyPT0nMSciKSAlPiUKICBub3JtYWxpemVfZXhwdCh0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCnNocCA8LSBwbG90X3NhbXBsZV9oZWF0bWFwKGZldywgaGVhdG1hcF9jb2xvcnMgPSB2aXJpZGlzLCByb3dfbGFiZWwgPSB3YW50ZWRfZ2VuZXMpCnNocAoKZmV3IDwtIHN1YnNldF9nZW5lcyh0X2NsaW5pY2FsLCBpZHMgPSB3YW50ZWRfaWRzLCBtZXRob2QgPSAia2VlcCIpICU+JQogIHNldF9leHB0X2NvbmRpdGlvbnMoZmFjdCA9ICJmaW5hbG91dGNvbWUiKSAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAidmlzaXRudW1iZXI9PScxJyIpICU+JQogIG5vcm1hbGl6ZV9leHB0KHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJycGttIiwKICAgICAgICAgICAgICAgICBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIikKc2hwIDwtIHBsb3Rfc2FtcGxlX2hlYXRtYXAoZmV3LCBoZWF0bWFwX2NvbG9ycyA9IHZpcmlkaXMsIHJvd19sYWJlbCA9IHdhbnRlZF9nZW5lcykKc2hwCmBgYAoKIyMgRW9zaW5vcGhpbHMsIGFsbCB0aW1lcwoKYGBge3IgY29tcG9zaXRlX2Vvc2lub3BoaWxzX3ZhbGx9CmZldyA8LSAgc3Vic2V0X2dlbmVzKHRjX2Vvc2lub3BoaWxzLCBpZHMgPSB3YW50ZWRfaWRzLCBtZXRob2QgPSAia2VlcCIpICU+JQogIHNldF9leHB0X2NvbmRpdGlvbnMoZmFjdCA9ICJmaW5hbG91dGNvbWUiKSAlPiUKICBub3JtYWxpemVfZXhwdCh0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCnNocCA8LSBwbG90X3NhbXBsZV9oZWF0bWFwKGZldywgaGVhdG1hcF9jb2xvcnMgPSB2aXJpZGlzLCByb3dfbGFiZWwgPSB3YW50ZWRfZ2VuZXMpCnNocAoKZmV3IDwtICBzdWJzZXRfZ2VuZXModF9lb3Npbm9waGlscywgaWRzID0gd2FudGVkX2lkcywgbWV0aG9kID0gImtlZXAiKSAlPiUKICBzZXRfZXhwdF9jb25kaXRpb25zKGZhY3QgPSAiZmluYWxvdXRjb21lIikgJT4lCiAgbm9ybWFsaXplX2V4cHQodHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQpzaHAgPC0gcGxvdF9zYW1wbGVfaGVhdG1hcChmZXcsIGhlYXRtYXBfY29sb3JzID0gdmlyaWRpcywgcm93X2xhYmVsID0gd2FudGVkX2dlbmVzKQpzaHAKYGBgCgojIyBFb3Npbm9waGlscywgdjEKCmBgYHtyIGNvbXBvc2l0ZV9lb3Npbm9waGlsc192MX0KZmV3IDwtICBzdWJzZXRfZ2VuZXModGNfZW9zaW5vcGhpbHMsIGlkcyA9IHdhbnRlZF9pZHMsIG1ldGhvZCA9ICJrZWVwIikgJT4lCiAgc2V0X2V4cHRfY29uZGl0aW9ucyhmYWN0ID0gImZpbmFsb3V0Y29tZSIpICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJ2aXNpdG51bWJlcj09JzEnIikgJT4lCiAgbm9ybWFsaXplX2V4cHQodHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQpzaHAgPC0gcGxvdF9zYW1wbGVfaGVhdG1hcChmZXcsIGhlYXRtYXBfY29sb3JzID0gdmlyaWRpcywgcm93X2xhYmVsID0gd2FudGVkX2dlbmVzKQpzaHAKCmZldyA8LSAgc3Vic2V0X2dlbmVzKHRfZW9zaW5vcGhpbHMsIGlkcyA9IHdhbnRlZF9pZHMsIG1ldGhvZCA9ICJrZWVwIikgJT4lCiAgc2V0X2V4cHRfY29uZGl0aW9ucyhmYWN0ID0gImZpbmFsb3V0Y29tZSIpICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJ2aXNpdG51bWJlcj09JzEnIikgJT4lCiAgbm9ybWFsaXplX2V4cHQodHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQpzaHAgPC0gcGxvdF9zYW1wbGVfaGVhdG1hcChmZXcsIGhlYXRtYXBfY29sb3JzID0gdmlyaWRpcywgcm93X2xhYmVsID0gd2FudGVkX2dlbmVzKQpzaHAKYGBgCgojIyBNb25vY3l0ZXMgYWxsCgpgYGB7ciBjb21wb3NpdGVfbW9ub2N5dGVzX2FsbH0KZmV3IDwtICBzdWJzZXRfZ2VuZXModGNfbW9ub2N5dGVzLCBpZHMgPSB3YW50ZWRfaWRzLCBtZXRob2QgPSAia2VlcCIpICU+JQogIHNldF9leHB0X2NvbmRpdGlvbnMoZmFjdCA9ICJmaW5hbG91dGNvbWUiKSAlPiUKICBub3JtYWxpemVfZXhwdCh0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCnNocCA8LSBwbG90X3NhbXBsZV9oZWF0bWFwKGZldywgaGVhdG1hcF9jb2xvcnMgPSB2aXJpZGlzLCByb3dfbGFiZWwgPSB3YW50ZWRfZ2VuZXMpCnNocAoKZmV3IDwtICBzdWJzZXRfZ2VuZXModF9tb25vY3l0ZXMsIGlkcyA9IHdhbnRlZF9pZHMsIG1ldGhvZCA9ICJrZWVwIikgJT4lCiAgc2V0X2V4cHRfY29uZGl0aW9ucyhmYWN0ID0gImZpbmFsb3V0Y29tZSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJycGttIiwKICAgICAgICAgICAgICAgICBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIikKc2hwIDwtIHBsb3Rfc2FtcGxlX2hlYXRtYXAoZmV3LCBoZWF0bWFwX2NvbG9ycyA9IHZpcmlkaXMsIHJvd19sYWJlbCA9IHdhbnRlZF9nZW5lcykKc2hwCmBgYAoKIyMgTW9ub2N5dGVzIHYxCgpgYGB7ciBjb21wb3NpdGVfbW9ub2N5dGVzX3YxfQpmZXcgPC0gIHN1YnNldF9nZW5lcyh0Y19tb25vY3l0ZXMsIGlkcyA9IHdhbnRlZF9pZHMsIG1ldGhvZCA9ICJrZWVwIikgJT4lCiAgc2V0X2V4cHRfY29uZGl0aW9ucyhmYWN0ID0gImZpbmFsb3V0Y29tZSIpICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJ2aXNpdG51bWJlcj09JzEnIikgJT4lCiAgbm9ybWFsaXplX2V4cHQodHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQpzaHAgPC0gcGxvdF9zYW1wbGVfaGVhdG1hcChmZXcsIGhlYXRtYXBfY29sb3JzID0gdmlyaWRpcywgcm93X2xhYmVsID0gd2FudGVkX2dlbmVzKQpzaHAKCmZldyA8LSAgc3Vic2V0X2dlbmVzKHRfbW9ub2N5dGVzLCBpZHMgPSB3YW50ZWRfaWRzLCBtZXRob2QgPSAia2VlcCIpICU+JQogIHNldF9leHB0X2NvbmRpdGlvbnMoZmFjdCA9ICJmaW5hbG91dGNvbWUiKSAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAidmlzaXRudW1iZXI9PScxJyIpICU+JQogIG5vcm1hbGl6ZV9leHB0KHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJycGttIiwKICAgICAgICAgICAgICAgICBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIikKc2hwIDwtIHBsb3Rfc2FtcGxlX2hlYXRtYXAoZmV3LCBoZWF0bWFwX2NvbG9ycyA9IHZpcmlkaXMsIHJvd19sYWJlbCA9IHdhbnRlZF9nZW5lcykKc2hwCmBgYAoKIyMgTmV1dHJvcGhpbHMgYWxsCgpgYGB7ciBjb21wb3NpdGVfbmV1dHJvcGhpbHNfYWxsfQpmZXcgPC0gIHN1YnNldF9nZW5lcyh0Y19uZXV0cm9waGlscywgaWRzID0gd2FudGVkX2lkcywgbWV0aG9kID0gImtlZXAiKSAlPiUKICBzZXRfZXhwdF9jb25kaXRpb25zKGZhY3QgPSAiZmluYWxvdXRjb21lIikgJT4lCiAgbm9ybWFsaXplX2V4cHQodHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQpzaHAgPC0gcGxvdF9zYW1wbGVfaGVhdG1hcChmZXcsIGhlYXRtYXBfY29sb3JzID0gdmlyaWRpcywgcm93X2xhYmVsID0gd2FudGVkX2dlbmVzKQpzaHAKCmZldyA8LSAgc3Vic2V0X2dlbmVzKHRfbmV1dHJvcGhpbHMsIGlkcyA9IHdhbnRlZF9pZHMsIG1ldGhvZCA9ICJrZWVwIikgJT4lCiAgc2V0X2V4cHRfY29uZGl0aW9ucyhmYWN0ID0gImZpbmFsb3V0Y29tZSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJycGttIiwKICAgICAgICAgICAgICAgICBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIikKc2hwIDwtIHBsb3Rfc2FtcGxlX2hlYXRtYXAoZmV3LCBoZWF0bWFwX2NvbG9ycyA9IHZpcmlkaXMsIHJvd19sYWJlbCA9IHdhbnRlZF9nZW5lcykKc2hwCmBgYAoKIyMgTmV1dHJvcGhpbHMgdjEKCmBgYHtyIGNvbXBvc2l0ZV9uZXV0cm9waGlsc192MX0KZmV3IDwtICBzdWJzZXRfZ2VuZXModGNfbmV1dHJvcGhpbHMsIGlkcyA9IHdhbnRlZF9pZHMsIG1ldGhvZCA9ICJrZWVwIikgJT4lCiAgc2V0X2V4cHRfY29uZGl0aW9ucyhmYWN0ID0gImZpbmFsb3V0Y29tZSIpICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJ2aXNpdG51bWJlcj09JzEnIikgJT4lCiAgbm9ybWFsaXplX2V4cHQodHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQpzaHAgPC0gcGxvdF9zYW1wbGVfaGVhdG1hcChmZXcsIGhlYXRtYXBfY29sb3JzID0gdmlyaWRpcywgcm93X2xhYmVsID0gd2FudGVkX2dlbmVzKQpzaHAKCmZldyA8LSAgc3Vic2V0X2dlbmVzKHRfbmV1dHJvcGhpbHMsIGlkcyA9IHdhbnRlZF9pZHMsIG1ldGhvZCA9ICJrZWVwIikgJT4lCiAgc2V0X2V4cHRfY29uZGl0aW9ucyhmYWN0ID0gImZpbmFsb3V0Y29tZSIpICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJ2aXNpdG51bWJlcj09JzEnIikgJT4lCiAgbm9ybWFsaXplX2V4cHQodHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQpzaHAgPC0gcGxvdF9zYW1wbGVfaGVhdG1hcChmZXcsIGhlYXRtYXBfY29sb3JzID0gdmlyaWRpcywgcm93X2xhYmVsID0gd2FudGVkX2dlbmVzKQpzaHAKYGBgCgpgYGB7ciBsb2FkbWVfYWZ0ZXIsIGV2YWw9RkFMU0V9CnRtcCA8LSBsb2FkbWUoZmlsZW5hbWU9c2F2ZWZpbGUpCmBgYAo=