1 20190228

Today in lab meeting, Dallas showed a couple of Western blots which suggest that esxG, esxH, and lpqH are not changing when looking at whole cell lysates between the wild-type and mutant samples.

I would therefore like to step through the data and figure out if I can pinpoint the source of the discrepency.

2 20180913

This is a copy of 20180817 but where I will further simplify to include only the wt/mutant and only the most recent technical replicate.

Therefore, the first thing I did was to copy the sample sheet and remove most of the rows, leaving behind only the 12 which comprise the 3 biological replicates for wt/mutant and the technical run dated 20180817.

3 Notes

  1. Remove complement.
  2. Work only with newest samples.
  3. Define intersections between limma/edger/deseq/msstats for multiple thresholds.
  4. Ontology tests

4 New samples!

In this copy of the worksheet, I am going to deal only with the tuberculist libraries, and only with the most recent technical replicate of the data.

This worksheet is a copy of 20180806 but this time with feeling! (or new samples) A minor caveat: I had some difficulties converting the new data to a openMS suitable format. I am not certain if I messed up a priori, or if a change in the version of the software on the spec caused the problem, but for future reference:

To properly convert the data to mzXML, make sure to use the TPP MSConvert utility and have ‘TPP’ compatibility on.

5 Analyzing data from openMS and friends.

5.1 SWATH2stats preprocessing

I am using my slightly modified copy of SWATH2stats. This seeks to ensure that changes in the case of columns in the metadata from one version of OpenMS to another do not trouble me.

5.1.1 Creating a swath2stats experiment using the tuberculist-derived library data

There is one important caveat in the following block: I used a regex to remove the second half of geneID_geneName so that later when I merge in the annotation data I have it will match.

5.2 Notes 20180913

If I want to subset like this, I need to delete the pyprophet outputs for anything not included in this set and rerun feature_alignment.py.

6 SWATH2stats continued

The various metrics and filters provided by SWATH2stats seem quite reasonable to me. The only thing that really bothers me is that they are all case sensitive and I found that the most recent tric changed the capitalization of a column, causing these to all fall down. Therefore I went in and made everything case insensitive in a fashion similar to that done by MSstats (except I hate capital letters, so I used tolower() rather than toupper()).

6.1 Perform filters

The following block performs the metrics and filters suggested by swath2stats. These first define the decoy hit rate in the data, then filter the data based on that. It also filters out hits with less than ideal m-scores and proteins with non-optimal distributions of peptide hits (either due to too few peptides or a weird distribution of intensities).

## Going to write the image to: images/20190327_tb_swath2stats_sample_cor.png when dev.off() is called.

## PNG 
##   2

## Number of non-decoy peptides: 20811
## Number of decoy peptides: 1002
## Decoy rate: 0.0481

## The average FDR by run on assay level is 0.007
## The average FDR by run on peptide level is 0.007
## The average FDR by run on protein level is 0.023

## Target assay FDR: 0.02
## Required overall m-score cutoff: 0.0070795
## achieving assay FDR: 0.019
## Target protein FDR: 0.02
## Required overall m-score cutoff: 0.00089125
## achieving protein FDR: 0.0172
## Original dimension: 232977, new dimension: 222739, difference: 10238.
## Peptides need to have been quantified in more conditions than: 34.4 in order to pass this percentage-based threshold.
## Fraction of peptides selected: 0.018
## Original dimension: 235512, new dimension: 18173, difference: 217339.
## Target protein FDR: 0.000891250938133746
## Required overall m-score cutoff: 0.01
## achieving protein FDR: 0
## filter_mscore_fdr is filtering the data...
## finding m-score cutoff to achieve desired protein FDR in protein master list..
## finding m-score cutoff to achieve desired global peptide FDR..
## Target peptide FDR: 0.05
## Required overall m-score cutoff: 0.01
## Achieving peptide FDR: 0
## Proteins selected: 
## Total proteins selected: 3044
## Final target proteins: 3044
## Final decoy proteins: 0
## Peptides mapping to these protein entries selected:
## Total mapping peptides: 20243
## Final target peptides: 20243
## Final decoy peptides: 0
## Total peptides selected from:
## Total peptides: 20243
## Final target peptides: 20243
## Final decoy peptides: 0
## Individual run FDR quality of the peptides was not calculated
## as not every run contains a decoy.
## The decoys have been removed from the returned data.
## Number of proteins detected: 3059
## Protein identifiers: Rv1270c, Rv0161, Rv1613, Rv0440, Rv0053, Rv0242c
## Number of proteins detected that are supported by a proteotypic peptide: 2929
## Number of proteotypic peptides detected: 20091
## Number of proteins detected: 2931
## First 6 protein identifiers: Rv1270c, Rv0161, Rv1613, Rv0440, Rv0053, Rv0242c
## Before filtering:
##   Number of proteins: 2929
##   Number of peptides: 20091
## 
## Percentage of peptides removed: 19.21%
## 
## After filtering:
##   Number of proteins: 2903
##   Number of peptides: 16232
## Before filtering:
##   Number of proteins: 2903
##   Number of peptides: 16232
## 
## Percentage of peptides removed: 0.02%
## 
## After filtering:
##   Number of proteins: 2674
##   Number of peptides: 16229

6.2 Write out matrices of the results

swath2stats provides a couple of ways to print out its results, one in a format specifically intended for MSstats, and another as a more canonical matrix of rows = proteins, columns = samples.

## Protein overview matrix results/swath2stats/20190327/protein_all.csv written to working folder.
## [1] 3934   44
## Protein overview matrix results/swath2stats/20190327/protein_matrix_mscore.csv written to working folder.
## [1] 3044   44
## Peptide overview matrix results/swath2stats/20190327/peptide_matrix_mscore.csv written to working folder.
## [1] 20243    44
## Protein overview matrix results/swath2stats/20190327/protein_matrix_filtered.csv written to working folder.
## [1] 2674   44
## Peptide overview matrix results/swath2stats/20190327/peptide_matrix_filtered.csv written to working folder.
## [1] 171784     44

## The library contains 5 transitions per precursor.
## The data table was transformed into a table containing one row per transition.
## One or several columns required by MSstats were not in the data. The columns were created and filled with NAs.
## Missing columns: productcharge, isotopelabeltype
## isotopelabeltype was filled with light.

7 Test aLFQ

I want to revisit aLFQ, I think it might provide better protein-level quantification methods. aLFQ looks promising, but I have not figured out valid parameters for using it.

7.1 Some new plots

In response to some interesting queries from Yan, I made a few little functions which query and plot data from the scored data provided by openswath/pyprophet. Let us look at their results here.

## Warning in if (class(metadata) == "data.frame") {: the condition has length
## > 1 and only the first element will be used
## Attempting to read the tsv file for: 2018_0315Briken02: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0315Briken02.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0315Briken03: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0315Briken03.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0315Briken04: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0315Briken04.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0315Briken05: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0315Briken05.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0315Briken06: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0315Briken06.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0315Briken21: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0315Briken21.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0315Briken22: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0315Briken22.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0315Briken23: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0315Briken23.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0315Briken24: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0315Briken24.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0315Briken25: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0315Briken25.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0315Briken26: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0315Briken26.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0502BrikenDIA01: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0502BrikenDIA01.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0502BrikenDIA02: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0502BrikenDIA02.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0502BrikenDIA03: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0502BrikenDIA03.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0502BrikenDIA04: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0502BrikenDIA04.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0502BrikenDIA05: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0502BrikenDIA05.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0502BrikenDIA06: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0502BrikenDIA06.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0502BrikenDIA08: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0502BrikenDIA08.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0502BrikenDIA09: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0502BrikenDIA09.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0502BrikenDIA11: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0502BrikenDIA11.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0502BrikenDIA12: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0502BrikenDIA12.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0726Briken02: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0726Briken02.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0726Briken05: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0726Briken05.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0726Briken06: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0726Briken06.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0726Briken07: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0726Briken07.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0726Briken08: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0726Briken08.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0726Briken09: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0726Briken09.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0726Briken13: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0726Briken13.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0726Briken16: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0726Briken16.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0817BrikenTrypsinDIA01: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0817BrikenTrypsinDIA01.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0817BrikenTrypsinDIA02: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0817BrikenTrypsinDIA02.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0817BrikenTrypsinDIA03: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0817BrikenTrypsinDIA03.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0817BrikenTrypsinDIA04: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0817BrikenTrypsinDIA04.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0817BrikenTrypsinDIA05: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0817BrikenTrypsinDIA05.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0817BrikenTrypsinDIA06: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0817BrikenTrypsinDIA06.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0817BrikenTrypsinDIA07: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0817BrikenTrypsinDIA07.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0817BrikenTrypsinDIA08: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0817BrikenTrypsinDIA08.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0817BrikenTrypsinDIA09: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0817BrikenTrypsinDIA09.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0817BrikenTrypsinDIA11: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0817BrikenTrypsinDIA11.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0817BrikenTrypsinDIA12: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0817BrikenTrypsinDIA12.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0817BrikenTrypsinDIA13: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0817BrikenTrypsinDIA13.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0817BrikenTrypsinDIA14: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0817BrikenTrypsinDIA14.mzXML.tsv.
## Attempting to read the tsv file for: 2018_0817BrikenTrypsinDIA19: results/08pyprophet/20190327/whole_8mz_tuberculist/2018_0817BrikenTrypsinDIA19.mzXML.tsv.
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page

## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page

## Warning in self$trans$transform(x): NaNs produced
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning in self$trans$transform(x): NaNs produced
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 134 rows containing non-finite values (stat_ydensity).
## Warning: Removed 134 rows containing missing values (geom_point).
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page

## Adding wt_filtrate_01
## Adding wt_filtrate_03
## Adding wt_whole_01
## Adding wt_whole_03
## Adding wt_whole_02
## Adding wt_whole_01.1
## Adding wt_whole_03.1
## Adding wt_filtrate_01.1
## Adding wt_filtrate_03.1
## Adding wt_filtrate_02
## Adding wt_filtrate_02.1
## Adding delta_filtrate_01
## Adding delta_filtrate_02
## Adding delta_filtrate_03
## Adding comp_filtrate_01
## Adding comp_filtrate_02
## Adding comp_filtrate_03
## Adding delta_whole_02
## Adding delta_whole_03
## Adding comp_whole_02
## Adding comp_whole_03
## Adding delta_filtrate_02.1
## Adding comp_filtrate_02.1
## Adding comp_filtrate_03.1
## Adding wt_filtrate_01.2
## Adding wt_filtrate_02.2
## Adding wt_filtrate_03.2
## Adding delta_whole_03.1
## Adding comp_whole_03.1
## Adding delta_filtrate_01.1
## Adding delta_filtrate_02.2
## Adding delta_filtrate_03.1
## Adding comp_filtrate_01.1
## Adding comp_filtrate_02.2
## Adding comp_filtrate_03.2
## Adding wt_filtrate_01.3
## Adding wt_filtrate_02.3
## Adding wt_filtrate_03.3
## Adding delta_whole_01
## Adding delta_whole_02.1
## Adding delta_whole_03.2
## Adding comp_whole_01
## Adding wt_whole_03.2
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page

## Adding wt_filtrate_01
## Adding wt_filtrate_03
## Adding wt_whole_01
## Adding wt_whole_03
## Adding wt_whole_02
## Adding wt_whole_01.1
## Adding wt_whole_03.1
## Adding wt_filtrate_01.1
## Adding wt_filtrate_03.1
## Adding wt_filtrate_02
## Adding wt_filtrate_02.1
## Adding delta_filtrate_01
## Adding delta_filtrate_02
## Adding delta_filtrate_03
## Adding comp_filtrate_01
## Adding comp_filtrate_02
## Adding comp_filtrate_03
## Adding delta_whole_02
## Adding delta_whole_03
## Adding comp_whole_02
## Adding comp_whole_03
## Adding delta_filtrate_02.1
## Adding comp_filtrate_02.1
## Adding comp_filtrate_03.1
## Adding wt_filtrate_01.2
## Adding wt_filtrate_02.2
## Adding wt_filtrate_03.2
## Adding delta_whole_03.1
## Adding comp_whole_03.1
## Adding delta_filtrate_01.1
## Adding delta_filtrate_02.2
## Adding delta_filtrate_03.1
## Adding comp_filtrate_01.1
## Adding comp_filtrate_02.2
## Adding comp_filtrate_03.2
## Adding wt_filtrate_01.3
## Adding wt_filtrate_02.3
## Adding wt_filtrate_03.3
## Adding delta_whole_01
## Adding delta_whole_02.1
## Adding delta_whole_03.2
## Adding comp_whole_01
## Adding wt_whole_03.2
## Warning in self$trans$transform(x): NaNs produced
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning in self$trans$transform(x): NaNs produced
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 185 rows containing non-finite values (stat_ydensity).
## Warning: Removed 185 rows containing missing values (geom_point).
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page

## Adding wt_filtrate_01
## Adding wt_filtrate_03
## Adding wt_whole_01
## Adding wt_whole_03
## Adding wt_whole_02
## Adding wt_whole_01.1
## Adding wt_whole_03.1
## Adding wt_filtrate_01.1
## Adding wt_filtrate_03.1
## Adding wt_filtrate_02
## Adding wt_filtrate_02.1
## Adding delta_filtrate_01
## Adding delta_filtrate_02
## Adding delta_filtrate_03
## Adding comp_filtrate_01
## Adding comp_filtrate_02
## Adding comp_filtrate_03
## Adding delta_whole_02
## Adding delta_whole_03
## Adding comp_whole_02
## Adding comp_whole_03
## Adding delta_filtrate_02.1
## Adding comp_filtrate_02.1
## Adding comp_filtrate_03.1
## Adding wt_filtrate_01.2
## Adding wt_filtrate_02.2
## Adding wt_filtrate_03.2
## Adding delta_whole_03.1
## Adding comp_whole_03.1
## Adding delta_filtrate_01.1
## Adding delta_filtrate_02.2
## Adding delta_filtrate_03.1
## Adding comp_filtrate_01.1
## Adding comp_filtrate_02.2
## Adding comp_filtrate_03.2
## Adding wt_filtrate_01.3
## Adding wt_filtrate_02.3
## Adding wt_filtrate_03.3
## Adding delta_whole_01
## Adding delta_whole_02.1
## Adding delta_whole_03.2
## Adding comp_whole_01
## Adding wt_whole_03.2
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page

## Adding wt_filtrate_01
## Adding wt_filtrate_03
## Adding wt_whole_01
## Adding wt_whole_03
## Adding wt_whole_02
## Adding wt_whole_01.1
## Adding wt_whole_03.1
## Adding wt_filtrate_01.1
## Adding wt_filtrate_03.1
## Adding wt_filtrate_02
## Adding wt_filtrate_02.1
## Adding delta_filtrate_01
## Adding delta_filtrate_02
## Adding delta_filtrate_03
## Adding comp_filtrate_01
## Adding comp_filtrate_02
## Adding comp_filtrate_03
## Adding delta_whole_02
## Adding delta_whole_03
## Adding comp_whole_02
## Adding comp_whole_03
## Adding delta_filtrate_02.1
## Adding comp_filtrate_02.1
## Adding comp_filtrate_03.1
## Adding wt_filtrate_01.2
## Adding wt_filtrate_02.2
## Adding wt_filtrate_03.2
## Adding delta_whole_03.1
## Adding comp_whole_03.1
## Adding delta_filtrate_01.1
## Adding delta_filtrate_02.2
## Adding delta_filtrate_03.1
## Adding comp_filtrate_01.1
## Adding comp_filtrate_02.2
## Adding comp_filtrate_03.2
## Adding wt_filtrate_01.3
## Adding wt_filtrate_02.3
## Adding wt_filtrate_03.3
## Adding delta_whole_01
## Adding delta_whole_02.1
## Adding delta_whole_03.2
## Adding comp_whole_01
## Adding wt_whole_03.2
## Warning in self$trans$transform(x): NaNs produced
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning in self$trans$transform(x): NaNs produced
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 11 rows containing non-finite values (stat_ydensity).
## Warning: Removed 11 rows containing missing values (geom_point).
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page

## Adding wt_filtrate_01
## Adding wt_filtrate_03
## Adding wt_whole_01
## Adding wt_whole_03
## Adding wt_whole_02
## Adding wt_whole_01.1
## Adding wt_whole_03.1
## Adding wt_filtrate_01.1
## Adding wt_filtrate_03.1
## Adding wt_filtrate_02
## Adding wt_filtrate_02.1
## Adding delta_filtrate_01
## Adding delta_filtrate_02
## Adding delta_filtrate_03
## Adding comp_filtrate_01
## Adding comp_filtrate_02
## Adding comp_filtrate_03
## Adding delta_whole_02
## Adding delta_whole_03
## Adding comp_whole_02
## Adding comp_whole_03
## Adding delta_filtrate_02.1
## Adding comp_filtrate_02.1
## Adding comp_filtrate_03.1
## Adding wt_filtrate_01.2
## Adding wt_filtrate_02.2
## Adding wt_filtrate_03.2
## Adding delta_whole_03.1
## Adding comp_whole_03.1
## Adding delta_filtrate_01.1
## Adding delta_filtrate_02.2
## Adding delta_filtrate_03.1
## Adding comp_filtrate_01.1
## Adding comp_filtrate_02.2
## Adding comp_filtrate_03.2
## Adding wt_filtrate_01.3
## Adding wt_filtrate_02.3
## Adding wt_filtrate_03.3
## Adding delta_whole_01
## Adding delta_whole_02.1
## Adding delta_whole_03.2
## Adding comp_whole_01
## Adding wt_whole_03.2
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page

7.2 MSstats

msstats.org seems to provide a complete solution for performing reasonable metrics of this data.

I am currently reading: http://msstats.org/wp-content/uploads/2017/01/MSstats_v3.7.3_manual.pdf

I made some moderately intrusive changes to MSstats to make it clearer, as well.

8 Create hpgltools expressionset

Since I am not certain I understand these data, I will take the intensities from SWATH2stats, metadata, and annotation data; attempt to create a ‘normal’ expressionset; poke at it to see what I can learn.

8.1 Massaging the metadata

I want to use the same metadata as were used for MSstats. It has a few important differences from the requirements of hpgltools: pretty much only that I do not allow rownames/sampleIDs to start with a number.

8.3 Merge the pieces

Now we should have sufficient pieces to make an expressionset.

While here, I will also split the data into a cf and whole-cell pair of data structures.

## There were 43, now there are 17 samples.
## There were 43, now there are 26 samples.
## Writing the first sheet, containing a legend and some summary data.
## Writing the raw reads.
## Hey, you merged the annotation data and did not reset the column names!
## Graphing the raw reads.
## Warning in svg(filename = high_quality): unable to load shared object '/sw/local/R/3.5.3/lib/R/library/grDevices/libs//cairo.so':
##   /sw/local/R/3.5.3/lib/R/library/grDevices/libs//cairo.so: cannot open shared object file: No such file or directory
## Warning in svg(filename = high_quality): failed to load cairo DLL
## Warning in grid.Call.graphics(C_rect, x$x, x$y, x$width, x$height,
## resolveHJust(x$just, : semi-transparency is not supported on this device:
## reported only once per page

## Warning in grid.Call.graphics(C_rect, x$x, x$y, x$width, x$height,
## resolveHJust(x$just, : semi-transparency is not supported on this device:
## reported only once per page
## Warning in grid.Call.graphics(C_polygon, x$x, x$y, index): semi-
## transparency is not supported on this device: reported only once per page
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## Warning in grid.Call.graphics(C_polygon, x$x, x$y, index): semi-
## transparency is not supported on this device: reported only once per page
## Warning in svg(filename = high_quality): failed to load cairo DLL

## Warning in svg(filename = high_quality): failed to load cairo DLL

## Warning in svg(filename = high_quality): failed to load cairo DLL
## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure

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

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

## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure
## Warning in grid.Call.graphics(C_polygon, x$x, x$y, index): semi-
## transparency is not supported on this device: reported only once per page
## Warning in svg(filename = high_quality): failed to load cairo DLL

## Warning in svg(filename = high_quality): failed to load cairo DLL
## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure

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

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

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

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

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

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

## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure
## Warning in grid.Call.graphics(C_polygon, x$x, x$y, index): semi-
## transparency is not supported on this device: reported only once per page
## Warning in svg(filename = high_quality): failed to load cairo DLL
## Warning in grid.Call.graphics(C_polygon, x$x, x$y, index): semi-
## transparency is not supported on this device: reported only once per page
## Warning in svg(filename = high_quality): failed to load cairo DLL
## Warning in grid.Call.graphics(C_polygon, x$x, x$y, index): semi-
## transparency is not supported on this device: reported only once per page
## Attempting mixed linear model with: ~  (1|condition) + (1|batch)
## Fitting the expressionset to the model, this is slow.
## Warning in serialize(data, node$con): 'package:variancePartition' may not
## be available when loading
## Warning in serialize(data, node$con): 'package:variancePartition' may not
## be available when loading

## Warning in serialize(data, node$con): 'package:variancePartition' may not
## be available when loading

## Warning in serialize(data, node$con): 'package:variancePartition' may not
## be available when loading

## Warning in serialize(data, node$con): 'package:variancePartition' may not
## be available when loading

## Warning in serialize(data, node$con): 'package:variancePartition' may not
## be available when loading
## 
## Finished...
## Total: 29 s
## Placing factor: condition at the beginning of the model.
## Writing the normalized reads.
## Graphing the normalized reads.
## Warning in grid.Call.graphics(C_polygon, x$x, x$y, index): semi-
## transparency is not supported on this device: reported only once per page
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## Warning in grid.Call.graphics(C_polygon, x$x, x$y, index): semi-
## transparency is not supported on this device: reported only once per page
## Warning in svg(filename = high_quality): failed to load cairo DLL

## Warning in svg(filename = high_quality): failed to load cairo DLL

## Warning in svg(filename = high_quality): failed to load cairo DLL
## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure

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

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

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

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

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

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

## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure
## Warning in grid.Call.graphics(C_polygon, x$x, x$y, index): semi-
## transparency is not supported on this device: reported only once per page
## Warning in svg(filename = high_quality): failed to load cairo DLL

## Warning in svg(filename = high_quality): failed to load cairo DLL
## Warning in grid.Call.graphics(C_polygon, x$x, x$y, index): semi-
## transparency is not supported on this device: reported only once per page
## Attempting mixed linear model with: ~  (1|condition) + (1|batch)
## Fitting the expressionset to the model, this is slow.
## 
## Finished...
## Total: 30 s
## Placing factor: condition at the beginning of the model.
## Writing the median reads by factor.
## The factor comp_filtrate has 8 rows.
## The factor comp_whole has 4 rows.
## The factor delta_filtrate has 7 rows.
## The factor delta_whole has 6 rows.
## The factor wt_filtrate has 11 rows.
## The factor wt_whole has 7 rows.
## Note: zip::zip() is deprecated, please use zip::zipr() instead

8.4 Metrics of the full data set

Generate some metrics of the full data set, later the same things will be performed using the data subsets. There is a weird caveat: sva fails under some strange circumstances for this data. It seems that if the data is cpmmed, then sva sees the resulting matrix as containing singular values. I am guessing that this means that there are a bunch of low values in the filtrate data which, when cpm(data) is performed get dropped to near 0 and therefore trip up sva. There are two likely ways around this:

  1. Do not cpm the data.
  2. Filter the data more aggressively so that there are no zero-values after cpm().

8.6 Variance partition

This is a potential argument against including only the newest technical replicate of the data; as when all the technicals were included, these metrics looked much more sensible.

## Attempting mixed linear model with: ~  (1|condition) + (1|batch)
## Fitting the expressionset to the model, this is slow.
## 
## Finished...
## Total: 29 s
## Placing factor: condition at the beginning of the model.

## Naively calculating coefficient of variation/dispersion with respect to condition.
## Finished calculating dispersion estimates.

## This data will benefit from being displayed on the log scale.
## If this is not desired, set scale='raw'
## Some entries are 0.  We are on log scale, adding 1 to the data.
## Changed 60551 zero count features.
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page

8.7 Metrics of the filtrate data set

Once again, here we have metrics of the subset data; this time of filtrate data.

## This function will replace the expt$expressionset slot with:
## cbcb(data)
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Leaving the data in its current base format, keep in mind that
##  some metrics are easier to see when the data is log2 transformed, but
##  EdgeR/DESeq do not accept transformed data.
## Leaving the data unconverted.  It is often advisable to cpm/rpkm
##  the data to normalize for sampling differences, keep in mind though that rpkm
##  has some annoying biases, and voom() by default does a cpm (though hpgl_voom()
##  will try to detect this).
## Leaving the data unnormalized.  This is necessary for DESeq, but
##  EdgeR/limma might benefit from normalization.  Good choices include quantile,
##  size-factor, tmm, etc.
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: performing count filter with option: cbcb
## Removing 1315 low-count genes (1359 remaining).
## Step 2: not normalizing the data.
## Step 3: not converting the data.
## Step 4: not transforming the data.
## Step 5: not doing batch correction.
## This function will replace the expt$expressionset slot with:
## cbcb(data)
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Leaving the data in its current base format, keep in mind that
##  some metrics are easier to see when the data is log2 transformed, but
##  EdgeR/DESeq do not accept transformed data.
## Leaving the data unconverted.  It is often advisable to cpm/rpkm
##  the data to normalize for sampling differences, keep in mind though that rpkm
##  has some annoying biases, and voom() by default does a cpm (though hpgl_voom()
##  will try to detect this).
## Leaving the data unnormalized.  This is necessary for DESeq, but
##  EdgeR/limma might benefit from normalization.  Good choices include quantile,
##  size-factor, tmm, etc.
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: performing count filter with option: cbcb
## Removing 1315 low-count genes (1359 remaining).
## Step 2: not normalizing the data.
## Step 3: not converting the data.
## Step 4: not transforming the data.
## Step 5: not doing batch correction.
## This data will benefit from being displayed on the log scale.
## If this is not desired, set scale='raw'
## Some entries are 0.  We are on log scale, setting them to 0.5.
## Changed 15319 zero count features.
## Warning in grid.Call.graphics(C_polygon, x$x, x$y, index): semi-
## transparency is not supported on this device: reported only once per page
## [1] TRUE
## [1] TRUE
## The factor br01 has 5 rows.
## The factor br02 has 4 rows.
## The factor br03 has 3 rows.
## The factor br04 has 2 rows.
## The factor br05 has 3 rows.
## The factor br06 has 3 rows.
## The factor br07 has 2 rows.
## The factor br08 has 2 rows.
## The factor br09 has 2 rows.
## Reading the sample metadata.
## Warning in `[<-.factor`(`*tmp*`, iseq, value = c("undefined",
## "undefined", : invalid factor level, NA generated
## The sample definitions comprises: 9 rows(samples) and 29 columns(metadata fields).
## Matched 613 annotations and counts.
## Bringing together the count matrix and gene information.
## The final expressionset has 613 rows and 9 columns.

mean_by_bioreplicate() does the following:

  1. Extracts the expression matrix.
  2. Backfills all 0s with NA
  3. Performs a cpm on the result.
  4. Does a mean of all non-NA samples by biological replicate.

9 Examine the mean by bioreplicate data

## This function will replace the expt$expressionset slot with:
## log2(cpm(quant(pofa(data))))
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: performing count filter with option: pofa
## Removing 1 low-count genes (612 remaining).
## Step 2: normalizing the data with quant.
## Using normalize.quantiles.robust due to a thread error in preprocessCore.
## Step 3: converting the data with cpm.
## Step 4: transforming the data with log2.
## Step 5: not doing batch correction.
## Warning in grid.Call.graphics(C_segments, x$x0, x$y0, x$x1, x$y1, x$arrow):
## semi-transparency is not supported on this device: reported only once per
## page

9.0.1 Something fun for Najib

## Warning in grid.Call.graphics(C_segments, x$x0, x$y0, x$x1, x$y1, x$arrow):
## semi-transparency is not supported on this device: reported only once per
## page

9.1 Plot some metrics

In the previous blocks, I generated the metrics; in this block I will print them with the assumption that some of them will end up being included in whatever publication comes from this work; with that in mind I should probably change this to sva or pdf or something not png.

## Warning in cairo_pdf(filename = file, ...): failed to load cairo DLL
## Writing the image to: images/20190501_libsize.pdf and calling dev.off().
## Warning in cairo_pdf(filename = file, ...): failed to load cairo DLL
## Going to write the image to: images/20190501_norm_pca.pdf when dev.off() is called.
## Defaulting to tiff.
## Going to write the image to: images/20190501_fsva_pca.pdfg when dev.off() is called.
## Warning in cairo_pdf(filename = file, ...): failed to load cairo DLL
## Writing the image to: images/20190501_norm_corheat.pdf and calling dev.off().
## Warning in cairo_pdf(filename = file, ...): failed to load cairo DLL
## Writing the image to: images/20190501_raw_density.pdf and calling dev.off().
## Warning in cairo_pdf(filename = file, ...): failed to load cairo DLL
## Writing the image to: images/20190501_boxplot.pdf and calling dev.off().
## Warning in cairo_pdf(filename = file, ...): failed to load cairo DLL
## Writing the image to: images/20190501_whole_libsize.pdf and calling dev.off().
## Warning in cairo_pdf(filename = file, ...): failed to load cairo DLL
## Going to write the image to: images/20190501_whole_norm_pca.pdf when dev.off() is called.
## Warning in cairo_pdf(filename = file, ...): failed to load cairo DLL
## Going to write the image to: images/20190501_whole_fsva_pca.pdf when dev.off() is called.
## Warning in cairo_pdf(filename = file, ...): failed to load cairo DLL
## Writing the image to: images/20190501_whole_norm_corheat.pdf and calling dev.off().
## Warning in cairo_pdf(filename = file, ...): failed to load cairo DLL
## Writing the image to: images/20190501_whole_raw_density.pdf and calling dev.off().
## Warning in cairo_pdf(filename = file, ...): failed to load cairo DLL
## Writing the image to: images/20190501_whole_boxplot.pdf and calling dev.off().
## Warning in cairo_pdf(filename = file, ...): failed to load cairo DLL
## Writing the image to: images/20190501_libsize.pdf and calling dev.off().
## Warning in cairo_pdf(filename = file, ...): failed to load cairo DLL
## Going to write the image to: images/20190501_norm_pca.pdf when dev.off() is called.
## Warning in cairo_pdf(filename = file, ...): failed to load cairo DLL
## Going to write the image to: images/20190501_fsva_pca.pdf when dev.off() is called.
## Warning in cairo_pdf(filename = file, ...): failed to load cairo DLL
## Writing the image to: images/20190501_norm_corheat.pdf and calling dev.off().
## Warning in cairo_pdf(filename = file, ...): failed to load cairo DLL
## Writing the image to: images/20190501_raw_density.pdf and calling dev.off().
## Warning in cairo_pdf(filename = file, ...): failed to load cairo DLL
## Writing the image to: images/20190501_boxplot.pdf and calling dev.off().

10 Perform hpgltools Differential Expression Analyses

Earlier MSstats was used to contrast the various conditions in this data. In this block the same will be performed using the limma/deseq/edger/ebseq/basic methods. As an aside, running all of these methods in serial takes ~ 1/5th the time of running any one step of MSstats.

10.1 Idea from Volker

Given the initial pairwise data, look at wt edgeR results ratio filtrate/culture; then set a cutoff as log2fc <= 0.75. Proteins which survive this cutoff are then used in the ratio of ratios and analyses of mutant/wt.

The survivors of this initial cutoff is the set of secreted proteins. Compare this set with the set of known secreted proteins from other papers (Cox). Also Collins, Abesol (likely same as the synthetic Mtb library).

Separate, simultaneous filter: Look at the distribution of the culture filtrate data and filter out the (relatively) low-intensity bump. Then take the surviving set and perform all analyses with it. In theory, these two filter methods should get us to a similar place.

10.2 lfc cutoff cutoff

As mentioned below, Volker had an interesting cutoff suggestion: keep only those with lfc >= 0.75 filtrate/whole

## Before removal, there were 2674 entries.
## Now there are 1359 entries.
## Percent kept: 99.994, 99.985, 99.995, 99.867, 99.990, 99.995, 99.998, 99.993, 92.738, 90.837, 89.258, 94.174, 99.998, 99.968, 99.996, 100.000, 99.893, 99.970, 99.991, 89.431, 90.287, 90.537, 92.753, 96.150, 90.465, 100.000, 99.996, 99.995, 99.997, 99.988, 99.942, 99.997, 99.920, 99.995, 99.980, 99.994, 92.805, 91.347, 92.444, 90.941, 92.021, 91.954, 89.626
## Percent removed: 0.006, 0.015, 0.005, 0.133, 0.010, 0.005, 0.002, 0.007, 7.262, 9.163, 10.742, 5.826, 0.002, 0.032, 0.004, 0.000, 0.107, 0.030, 0.009, 10.569, 9.713, 9.463, 7.247, 3.850, 9.535, 0.000, 0.004, 0.005, 0.003, 0.012, 0.058, 0.003, 0.080, 0.005, 0.020, 0.006, 7.195, 8.653, 7.556, 9.059, 7.979, 8.046, 10.374
## Starting edgeR pairwise comparisons.
## The data should be suitable for EdgeR/DESeq/EBSeq. If they freak out, check the state of the count table and ensure that it is in integer counts.
## Choosing the non-intercept containing model.
## EdgeR step 1/9: Importing and normalizing data.
## EdgeR step 2/9: Estimating the common dispersion.
## EdgeR step 3/9: Estimating dispersion across genes.
## EdgeR step 4/9: Estimating GLM Common dispersion.
## EdgeR step 5/9: Estimating GLM Trended dispersion.
## EdgeR step 6/9: Estimating GLM Tagged dispersion.
## EdgeR step 7/9: Running glmFit, switch to glmQLFit by changing the argument 'edger_test'.
## EdgeR step 8/9: Making pairwise contrasts.

## Before removal, there were 2674 entries.
## Now there are 1359 entries.
## Percent kept: 99.994, 99.985, 99.995, 99.867, 99.990, 99.995, 99.998, 99.993, 92.738, 90.837, 89.258, 94.174, 99.998, 99.968, 99.996, 100.000, 99.893, 99.970, 99.991, 89.431, 90.287, 90.537, 92.753, 96.150, 90.465, 100.000, 99.996, 99.995, 99.997, 99.988, 99.942, 99.997, 99.920, 99.995, 99.980, 99.994, 92.805, 91.347, 92.444, 90.941, 92.021, 91.954, 89.626
## Percent removed: 0.006, 0.015, 0.005, 0.133, 0.010, 0.005, 0.002, 0.007, 7.262, 9.163, 10.742, 5.826, 0.002, 0.032, 0.004, 0.000, 0.107, 0.030, 0.009, 10.569, 9.713, 9.463, 7.247, 3.850, 9.535, 0.000, 0.004, 0.005, 0.003, 0.012, 0.058, 0.003, 0.080, 0.005, 0.020, 0.006, 7.195, 8.653, 7.556, 9.059, 7.979, 8.046, 10.374
## Before removal, there were 2674 entries.
## Now there are 311 entries.
## Percent kept: 84.415, 77.586, 87.214, 94.832, 72.157, 83.903, 84.976, 69.529, 22.867, 18.218, 14.713, 18.716, 93.900, 75.232, 86.505, 97.506, 74.756, 90.158, 83.104, 17.095, 17.639, 18.935, 12.986, 17.680, 19.688, 85.951, 92.342, 83.666, 92.711, 82.561, 89.206, 84.308, 86.852, 83.157, 85.627, 81.339, 21.076, 16.414, 21.305, 18.076, 20.558, 20.299, 18.363
## Percent removed: 15.585, 22.414, 12.786, 5.168, 27.843, 16.097, 15.024, 30.471, 77.133, 81.782, 85.287, 81.284, 6.100, 24.768, 13.495, 2.494, 25.244, 9.842, 16.896, 82.905, 82.361, 81.065, 87.014, 82.320, 80.312, 14.049, 7.658, 16.334, 7.289, 17.439, 10.794, 15.692, 13.148, 16.843, 14.373, 18.661, 78.924, 83.586, 78.695, 81.924, 79.442, 79.701, 81.637
## Deleting the file excel/20190501_combined_contrasts_all-v20190327.xlsx before writing the tables.
## Writing a legend of columns.
## Printing a pca plot before/after surrogates/batch estimation.
## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure

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

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

## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure
## Warning in grid.Call.graphics(C_polygon, x$x, x$y, index): semi-
## transparency is not supported on this device: reported only once per page
## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure

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

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

## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure
## Warning in grid.Call.graphics(C_polygon, x$x, x$y, index): semi-
## transparency is not supported on this device: reported only once per page
## Working on 1/5: wt_cfwhole which is: wt_filtrate/wt_whole.
## Found inverse table with wt_whole_vs_wt_filtrate
## 20181210 a pthread error in normalize.quantiles leads me to robust.
## Used Bon Ferroni corrected t test(s) between columns.
## Used Bon Ferroni corrected t test(s) between columns.
## Used Bon Ferroni corrected t test(s) between columns.
## Working on 2/5: delta_cfwhole which is: delta_filtrate/delta_whole.
## Found inverse table with delta_whole_vs_delta_filtrate
## 20181210 a pthread error in normalize.quantiles leads me to robust.
## Used Bon Ferroni corrected t test(s) between columns.
## Used Bon Ferroni corrected t test(s) between columns.
## Used Bon Ferroni corrected t test(s) between columns.
## Working on 3/5: whole_deltawt which is: delta_whole/wt_whole.
## Found inverse table with wt_whole_vs_delta_whole
## 20181210 a pthread error in normalize.quantiles leads me to robust.
## Used Bon Ferroni corrected t test(s) between columns.
## Used Bon Ferroni corrected t test(s) between columns.
## Used Bon Ferroni corrected t test(s) between columns.
## Working on 4/5: cf_deltawt which is: delta_filtrate/wt_filtrate.
## Found inverse table with wt_filtrate_vs_delta_filtrate
## 20181210 a pthread error in normalize.quantiles leads me to robust.
## Used Bon Ferroni corrected t test(s) between columns.
## Used Bon Ferroni corrected t test(s) between columns.
## Used Bon Ferroni corrected t test(s) between columns.
## Working on 5/5: rofr which is: delta_cfwhole/wt_cfwhole.
## Found table with delta_cfwhole_vs_wt_cfwhole
## Used the inverse table, might need to -1 the logFC and stat.
## Warning in combine_single_de_table(li = limma, ed = edger, eb = ebseq, de =
## deseq, : The deseq table seems to be missing.
## Used the inverse table, might need to -1 the logFC.
## Warning in combine_single_de_table(li = limma, ed = edger, eb = ebseq, de =
## deseq, : The ebseq table seems to be missing.
## Used the inverse table, might need to -1 the logFC.
## Warning in combine_single_de_table(li = limma, ed = edger, eb = ebseq, de =
## deseq, : The basic table seems to be missing.
## 20181210 a pthread error in normalize.quantiles leads me to robust.
## Used Bon Ferroni corrected t test(s) between columns.
## Used Bon Ferroni corrected t test(s) between columns.
## Used Bon Ferroni corrected t test(s) between columns.
## Adding venn plots for wt_cfwhole.
## Limma expression coefficients for wt_cfwhole; R^2: 0.25; equation: y = 0.41x - 0.276
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page

## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## Warning in grid.Call.graphics(C_rect, x$x, x$y, x$width, x$height,
## resolveHJust(x$just, : semi-transparency is not supported on this device:
## reported only once per page
## Edger expression coefficients for wt_cfwhole; R^2: 0.532; equation: y = 0.859x + 1.78
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page

## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## Warning in grid.Call.graphics(C_rect, x$x, x$y, x$width, x$height,
## resolveHJust(x$just, : semi-transparency is not supported on this device:
## reported only once per page
## DESeq2 expression coefficients for wt_cfwhole; R^2: 0.677; equation: y = 0.834x + 1.61
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page

## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## Warning in grid.Call.graphics(C_rect, x$x, x$y, x$width, x$height,
## resolveHJust(x$just, : semi-transparency is not supported on this device:
## reported only once per page
## Adding venn plots for delta_cfwhole.
## Limma expression coefficients for delta_cfwhole; R^2: 0.21; equation: y = 0.378x - 0.222
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page

## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## Warning in grid.Call.graphics(C_rect, x$x, x$y, x$width, x$height,
## resolveHJust(x$just, : semi-transparency is not supported on this device:
## reported only once per page
## Edger expression coefficients for delta_cfwhole; R^2: 0.0469; equation: y = 0.15x + 16.1
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page

## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## Warning in grid.Call.graphics(C_rect, x$x, x$y, x$width, x$height,
## resolveHJust(x$just, : semi-transparency is not supported on this device:
## reported only once per page
## DESeq2 expression coefficients for delta_cfwhole; R^2: 0.515; equation: y = 0.739x + 4.53
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page

## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## Warning in grid.Call.graphics(C_rect, x$x, x$y, x$width, x$height,
## resolveHJust(x$just, : semi-transparency is not supported on this device:
## reported only once per page
## Adding venn plots for whole_deltawt.
## Limma expression coefficients for whole_deltawt; R^2: 0.882; equation: y = 0.898x + 0.164
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page

## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## Warning in grid.Call.graphics(C_rect, x$x, x$y, x$width, x$height,
## resolveHJust(x$just, : semi-transparency is not supported on this device:
## reported only once per page
## Edger expression coefficients for whole_deltawt; R^2: 0.972; equation: y = 0.984x + 0.17
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page

## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## Warning in grid.Call.graphics(C_rect, x$x, x$y, x$width, x$height,
## resolveHJust(x$just, : semi-transparency is not supported on this device:
## reported only once per page
## DESeq2 expression coefficients for whole_deltawt; R^2: 0.982; equation: y = 0.955x + 0.651
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page

## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## Warning in grid.Call.graphics(C_rect, x$x, x$y, x$width, x$height,
## resolveHJust(x$just, : semi-transparency is not supported on this device:
## reported only once per page
## Adding venn plots for cf_deltawt.
## Limma expression coefficients for cf_deltawt; R^2: 0.766; equation: y = 0.85x - 0.093
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page

## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## Warning in grid.Call.graphics(C_rect, x$x, x$y, x$width, x$height,
## resolveHJust(x$just, : semi-transparency is not supported on this device:
## reported only once per page
## Edger expression coefficients for cf_deltawt; R^2: 0.944; equation: y = 0.965x + 0.733
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page

## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## Warning in grid.Call.graphics(C_rect, x$x, x$y, x$width, x$height,
## resolveHJust(x$just, : semi-transparency is not supported on this device:
## reported only once per page
## DESeq2 expression coefficients for cf_deltawt; R^2: 0.965; equation: y = 0.926x + 1.74
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page

## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## Warning in grid.Call.graphics(C_rect, x$x, x$y, x$width, x$height,
## resolveHJust(x$just, : semi-transparency is not supported on this device:
## reported only once per page
## Adding venn plots for rofr.
## Writing summary information.
## Attempting to add the comparison plot to pairwise_summary at row: 27 and column: 1
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page

## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page

## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page

## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page

## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page

## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page

## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page

## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page

## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page

## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page

## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page

## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page

## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page

## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## Performing save of the workbook.
## Writing a legend of columns.
## The count is: 1 and the test is: edger.
## Writing excel data according to edger for wt_cfwhole: 1/5.
## After (adj)p filter, the up genes table has 111 genes.
## After (adj)p filter, the down genes table has 470 genes.
## After fold change filter, the up genes table has 111 genes.
## After fold change filter, the down genes table has 470 genes.
## Writing excel data according to edger for delta_cfwhole: 2/5.
## After (adj)p filter, the up genes table has 135 genes.
## After (adj)p filter, the down genes table has 309 genes.
## After fold change filter, the up genes table has 135 genes.
## After fold change filter, the down genes table has 309 genes.
## Writing excel data according to edger for whole_deltawt: 3/5.
## After (adj)p filter, the up genes table has 13 genes.
## After (adj)p filter, the down genes table has 15 genes.
## After fold change filter, the up genes table has 13 genes.
## After fold change filter, the down genes table has 14 genes.
## Writing excel data according to edger for cf_deltawt: 4/5.
## After (adj)p filter, the up genes table has 188 genes.
## After (adj)p filter, the down genes table has 148 genes.
## After fold change filter, the up genes table has 187 genes.
## After fold change filter, the down genes table has 148 genes.
## Writing excel data according to edger for rofr: 5/5.
## After (adj)p filter, the up genes table has 117 genes.
## After (adj)p filter, the down genes table has 100 genes.
## After fold change filter, the up genes table has 114 genes.
## After fold change filter, the down genes table has 100 genes.
## Printing significant genes to the file: excel/20190501_siglfc0.75_proteins_all-v20190327.xlsx
## 1/5: Creating significant table up_1edger_wt_cfwhole
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## 2/5: Creating significant table up_2edger_delta_cfwhole
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## 3/5: Creating significant table up_3edger_whole_deltawt
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## 4/5: Creating significant table up_4edger_cf_deltawt
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## 5/5: Creating significant table up_5edger_rofr
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## Adding significance bar plots.
## Writing a legend of columns.
## The count is: 1 and the test is: edger.
## Writing excel data according to edger for wt_cfwhole: 1/5.
## After (adj)p filter, the up genes table has 418 genes.
## After (adj)p filter, the down genes table has 926 genes.
## After fold change filter, the up genes table has 299 genes.
## After fold change filter, the down genes table has 801 genes.
## Writing excel data according to edger for delta_cfwhole: 2/5.
## After (adj)p filter, the up genes table has 516 genes.
## After (adj)p filter, the down genes table has 835 genes.
## After fold change filter, the up genes table has 385 genes.
## After fold change filter, the down genes table has 712 genes.
## Writing excel data according to edger for whole_deltawt: 3/5.
## After (adj)p filter, the up genes table has 502 genes.
## After (adj)p filter, the down genes table has 833 genes.
## After fold change filter, the up genes table has 159 genes.
## After fold change filter, the down genes table has 304 genes.
## Writing excel data according to edger for cf_deltawt: 4/5.
## After (adj)p filter, the up genes table has 678 genes.
## After (adj)p filter, the down genes table has 640 genes.
## After fold change filter, the up genes table has 455 genes.
## After fold change filter, the down genes table has 390 genes.
## Writing excel data according to edger for rofr: 5/5.
## After (adj)p filter, the up genes table has 788 genes.
## After (adj)p filter, the down genes table has 569 genes.
## After fold change filter, the up genes table has 534 genes.
## After fold change filter, the down genes table has 338 genes.
## Printing significant genes to the file: excel/20190501_siglfc0.75_proteins_all-v20190327.xlsx
## 1/5: Creating significant table up_1edger_wt_cfwhole
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## 2/5: Creating significant table up_2edger_delta_cfwhole
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## 3/5: Creating significant table up_3edger_whole_deltawt
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## 4/5: Creating significant table up_4edger_cf_deltawt
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## 5/5: Creating significant table up_5edger_rofr
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## Adding significance bar plots.
## Writing a legend of columns.
## The count is: 1 and the test is: edger.
## Writing excel data according to edger for wt_cfwhole: 1/5.
## After (adj)p filter, the up genes table has 144 genes.
## After (adj)p filter, the down genes table has 167 genes.
## After fold change filter, the up genes table has 123 genes.
## After fold change filter, the down genes table has 105 genes.
## Writing excel data according to edger for delta_cfwhole: 2/5.
## After (adj)p filter, the up genes table has 164 genes.
## After (adj)p filter, the down genes table has 143 genes.
## After fold change filter, the up genes table has 142 genes.
## After fold change filter, the down genes table has 87 genes.
## Writing excel data according to edger for whole_deltawt: 3/5.
## After (adj)p filter, the up genes table has 97 genes.
## After (adj)p filter, the down genes table has 199 genes.
## After fold change filter, the up genes table has 40 genes.
## After fold change filter, the down genes table has 106 genes.
## Writing excel data according to edger for cf_deltawt: 4/5.
## After (adj)p filter, the up genes table has 134 genes.
## After (adj)p filter, the down genes table has 177 genes.
## After fold change filter, the up genes table has 67 genes.
## After fold change filter, the down genes table has 80 genes.
## Writing excel data according to edger for rofr: 5/5.
## After (adj)p filter, the up genes table has 180 genes.
## After (adj)p filter, the down genes table has 131 genes.
## After fold change filter, the up genes table has 106 genes.
## After fold change filter, the down genes table has 68 genes.
## Printing significant genes to the file: excel/20190501_siglfc0.75_proteins_prefiltered-v20190327.xlsx
## 1/5: Creating significant table up_1edger_wt_cfwhole
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## 2/5: Creating significant table up_2edger_delta_cfwhole
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## 3/5: Creating significant table up_3edger_whole_deltawt
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## 4/5: Creating significant table up_4edger_cf_deltawt
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## 5/5: Creating significant table up_5edger_rofr
## Warning in grid.Call.graphics(C_points, x$x, x$y, x$pch, x$size): semi-
## transparency is not supported on this device: reported only once per page
## Adding significance bar plots.

10.2.1 Show a few metrics from the hpgltools pairwise comparisons

## Writing the image to: images/de_heat.png and calling dev.off().

11 For each msstats run, do a DE table

11.1 wt_cf vs wt_whole

## Error in eval(expr, envir, enclos): object 'msstats_results' not found
## Error in eval(expr, envir, enclos): object 'msstats_result' not found
## Error in combine_de_tables(extra_lfc_filter_de, keepers = keepers, extra_annot = msstats_result, : object 'msstats_result' not found
## Error in eval(expr, envir, enclos): object 'wtcf_nobatch_wtwhole_tables' not found
## Error in cor.test(comp_table$log2fc, comp_table$deseq_logfc, method = "spearman"): object 'comp_table' not found
## Error in cor.test(comp_table$log2fc, comp_table$limma_logfc, method = "spearman"): object 'comp_table' not found
## Error in cor.test(comp_table$log2fc, comp_table$ebseq_logfc, method = "spearman"): object 'comp_table' not found
## Error in extract_significant_genes(wtcf_nobatch_wtwhole_tables, lfc = 0.75, : object 'wtcf_nobatch_wtwhole_tables' not found

11.2 delta_cf vs delta_whole

## Error in eval(expr, envir, enclos): object 'msstats_results' not found
## Error in eval(expr, envir, enclos): object 'msstats_result' not found
## Error in combine_de_tables(extra_lfc_filter_de, keepers = keepers, extra_annot = msstats_result, : object 'msstats_result' not found
## Error in eval(expr, envir, enclos): object 'deltacf_deltawhole_tables' not found
## Error in cor.test(comp_table$log2fc, comp_table$deseq_logfc, method = "spearman"): object 'comp_table' not found
## Error in data.frame(df[, c(1, 2)]): object 'comp_table' not found
## NULL
## Error in extract_significant_genes(deltacf_deltawhole_tables, lfc = 0.75, : object 'deltacf_deltawhole_tables' not found

11.3 delta_cf vs wt_cf

Something is weird about this particular contrast, I keep getting negative correlations!

## Error in eval(expr, envir, enclos): object 'msstats_results' not found
## Error in eval(expr, envir, enclos): object 'msstats_result' not found
## Error in combine_de_tables(extra_lfc_filter_de, keepers = keepers, extra_annot = msstats_result, : object 'msstats_result' not found
## Error in eval(expr, envir, enclos): object 'deltacf_wtcf_tables' not found
## Error in cor.test(comp_table$log2fc, comp_table$deseq_logfc, method = "spearman"): object 'comp_table' not found
## Error in cor.test(comp_table$log2fc, comp_table$limma_logfc, method = "spearman"): object 'comp_table' not found
## Error in cor.test(comp_table$log2fc, comp_table$edger_logfc, method = "spearman"): object 'comp_table' not found
## Error in cor.test(comp_table$log2fc, comp_table$ebseq_logfc, method = "spearman"): object 'comp_table' not found
## Error in data.frame(df[, c(1, 2)]): object 'comp_table' not found
## Error in eval(expr, envir, enclos): object 'scatter_test' not found
## Error in eval(expr, envir, enclos): object 'comp_table' not found
## Error in eval(expr, envir, enclos): object 'comp_table' not found
## Error in eval(expr, envir, enclos): object 'com_table' not found
## Error in com_table[neg_inf_idx, "log2fc"] <- -100: object 'com_table' not found
## Error in eval(expr, envir, enclos): object 'com_table' not found
## Error in com_table[pos_inf_idx, "log2fc"] <- 100: object 'com_table' not found
## Error in cor.test(com_table$log2fc, com_table$deseq_logfc): object 'com_table' not found
## Error in data.frame(df[, c(1, 2)]): object 'com_table' not found
## Error in extract_significant_genes(deltacf_wtcf_tables, lfc = 0.75, p = 0.1, : object 'deltacf_wtcf_tables' not found

Ok, I have been resisting this, but lets look more closely at the data for this contrast. One thing I can do to look for correctness in what I am seeing is to look at the mean numerators/denominators for this contrast and see if they agree with msstats or the others.

11.4 delta_whole vs wt_whole

## Error in eval(expr, envir, enclos): object 'msstats_results' not found
## Error in eval(expr, envir, enclos): object 'msstats_result' not found
## Error in combine_de_tables(extra_lfc_filter_de, keepers = keepers, extra_annot = msstats_result, : object 'msstats_result' not found
## Error in eval(expr, envir, enclos): object 'deltawhole_wtwhole_tables' not found
## Error in cor.test(comp_table$log2fc, comp_table$deseq_logfc, method = "spearman"): object 'comp_table' not found
## Error in extract_significant_genes(deltawhole_wtwhole_tables, lfc = 0.75, : object 'deltawhole_wtwhole_tables' not found

11.5 Venn of MSstats vs. others for wt whole/cf

Najib asked for the overlap in perceived significance.

## Error in eval(expr, envir, enclos): object 'wtcf_nobatch_wtwhole_tables' not found
## Error in start[["adjpvalue"]]: object of type 'closure' is not subsettable
## Error in `[<-`(`*tmp*`, na_idx, "adjpvalue", value = 1): object 'na_idx' not found
## Error in start[["adjpvalue"]]: object of type 'closure' is not subsettable
## Error in start[["deseq_adjp"]]: object of type 'closure' is not subsettable
## Error in start[["edger_adjp"]]: object of type 'closure' is not subsettable
## Error in start[["limma_adjp"]]: object of type 'closure' is not subsettable
## Error in start[["ebseq_ppee"]]: object of type 'closure' is not subsettable
## Error in start[ms_sig_idx, ]: object 'ms_sig_idx' not found
## Error in start[de_sig_idx, ]: object 'de_sig_idx' not found
## Error in start[ed_sig_idx, ]: object 'ed_sig_idx' not found
## Error in start[lm_sig_idx, ]: object 'lm_sig_idx' not found
## Error in start[eb_sig_idx, ]: object 'eb_sig_idx' not found
## Error in rownames(ms_sig): object 'ms_sig' not found
## Error in Vennerable::Venn(Sets = method_lst): object 'method_lst' not found
## Error in Vennerable::plot(method_venn, doWeights = FALSE): object 'method_venn' not found

13 Ontology tests

13.1 Wt CF vs Wt whole

## The species being downloaded is: Mycobacterium tuberculosis H37Rv and is being downloaded as 83332.tab.
## # A tibble: 6 x 2
##   sysName GO        
##   <chr>   <chr>     
## 1 Rv0001  GO:0006270
## 2 Rv0001  GO:0006275
## 3 Rv0001  GO:0003688
## 4 Rv0001  GO:0017111
## 5 Rv0001  GO:0005524
## 6 Rv0002  GO:0006260
## Error in eval(expr, envir, enclos): object 'wtcf_nobatch_wtwhole_sig' not found
## Error in simple_goseq(sig_genes = wtcf_wtwhole_up, go_db = mtb_go, length_db = mtb_lengths, : object 'wtcf_wtwhole_up' not found
## Error in eval(expr, envir, enclos): object 'wtcf_wtwhole_up_goseq_nb' not found
## Error in eval(expr, envir, enclos): object 'wtcf_nobatch_wtwhole_sig' not found
## Error in simple_goseq(sig_genes = wtcf_wtwhole_down, go_db = mtb_go, length_db = mtb_lengths, : object 'wtcf_wtwhole_down' not found
## Error in eval(expr, envir, enclos): object 'wtcf_wtwhole_down_goseq_nb' not found

13.2 delta CF vs delta whole

## Error in eval(expr, envir, enclos): object 'deltacf_deltawhole_sig' not found
## Error in simple_goseq(sig_genes = deltacf_deltawhole_up, go_db = mtb_go, : object 'deltacf_deltawhole_up' not found
## Error in eval(expr, envir, enclos): object 'deltacf_deltawhole_up_goseq_nb' not found
## Error in eval(expr, envir, enclos): object 'deltacf_deltawhole_sig' not found
## Error in simple_goseq(sig_genes = deltacf_deltawhole_down, go_db = mtb_go, : object 'deltacf_deltawhole_down' not found
## Error in eval(expr, envir, enclos): object 'deltacf_deltawhole_down_goseq_nb' not found

13.3 delta filtrate vs wt filtrate

## Error in eval(expr, envir, enclos): object 'deltacf_wtcf_sig' not found
## Error in simple_goseq(sig_genes = deltacf_wtcf_up, go_db = mtb_go, length_db = mtb_lengths, : object 'deltacf_wtcf_up' not found
## Error in eval(expr, envir, enclos): object 'deltacf_wtcf_up_goseq_nb' not found
## Error in eval(expr, envir, enclos): object 'deltacf_wtcf_sig' not found
## Error in simple_goseq(sig_genes = deltacf_wtcf_down, go_db = mtb_go, length_db = mtb_lengths, : object 'deltacf_wtcf_down' not found
## Error in eval(expr, envir, enclos): object 'deltacf_wtcf_down_goseq_nb' not found

13.4 delta whole vs wt whole

## Error in eval(expr, envir, enclos): object 'deltawhole_wtwhole_sig' not found
## Error in simple_goseq(sig_genes = deltawhole_wtwhole_up, go_db = mtb_go, : object 'deltawhole_wtwhole_up' not found
## Error in eval(expr, envir, enclos): object 'deltawhole_wtwhole_up_goseq_nb' not found
## Error in eval(expr, envir, enclos): object 'deltawhole_wtwhole_sig' not found
## Error in simple_goseq(sig_genes = deltawhole_wtwhole_down, go_db = mtb_go, : object 'deltawhole_wtwhole_down' not found
## Error in eval(expr, envir, enclos): object 'deltawhole_wtwhole_down_goseq_nb' not found

14 circos

## Trying attempt: rtracklayer::import.gff3(gff, sequenceRegionsAsSeqinfo=TRUE)
## Trying attempt: rtracklayer::import.gff3(gff, sequenceRegionsAsSeqinfo=FALSE)
## Had a successful gff import with rtracklayer::import.gff3(gff, sequenceRegionsAsSeqinfo=FALSE)
## Returning a df with 15 columns and 4093 rows.
## The species being downloaded is: Mycobacterium tuberculosis H37Rv
## Warning: Setting row names on a tibble is deprecated.
## This assumes you have a colors.conf in circos/colors/ and fonts.conf in circos/fonts/
## It also assumes you have conf/ideogram.conf, conf/ticks.conf, and conf/housekeeping.conf
## It will write circos/conf/mtb.conf with a reasonable first approximation config file.
## Wrote karyotype to circos/conf/ideograms/mtb.conf
## This should match the karyotype= line in mtb.conf
## Wrote ticks to circos/conf/ticks_mtb.conf
## Wrote karyotype to circos/conf/karyotypes/mtb.conf
## This should match the karyotype= line in mtb.conf
## Writing data file: circos/data/mtb_plus_go.txt with the + strand GO data.
## Writing data file: circos/data/mtb_minus_go.txt with the - strand GO data.
## Wrote the +/- config files.  Appending their inclusion to the master file.
## Returning the inner width: 0.84.  Use it as the outer for the next ring.
## Warning in merge.data.frame(df, annot_df, by = "row.names"): column name
## 'Row.names' is duplicated in the result
## Writing data file: circos/data/mtb_wt_wholewt_whole_heatmap.txt with the wt_wholewt_whole column.
## Warning in merge.data.frame(df, annot_df, by = "row.names"): column name
## 'Row.names' is duplicated in the result
## Writing data file: circos/data/mtb_delta_wholedelta_whole_heatmap.txt with the delta_wholedelta_whole column.
## Warning in merge.data.frame(df, annot_df, by = "row.names"): column name
## 'Row.names' is duplicated in the result
## Writing data file: circos/data/mtb_wt_filtratewt_filtrate_heatmap.txt with the wt_filtratewt_filtrate column.
## Warning in merge.data.frame(df, annot_df, by = "row.names"): column name
## 'Row.names' is duplicated in the result
## Writing data file: circos/data/mtb_delta_filtratedelta_filtrate_heatmap.txt with the delta_filtratedelta_filtrate column.
## Warning in merge.data.frame(df, annot_df, by = "row.names"): column name
## 'Row.names' is duplicated in the result
## Writing data file: circos/data/mtb_delta_filtrate_heatdelta_filtrate_heatmap.txt with the delta_filtrate_heatdelta_filtrate column.

circos plot

15 TODO

  • 2018-04-10: Make sure my invocations of SWATH2stats/MSstats are correct.
## If you wish to reproduce this exact build of hpgltools, invoke the following:
## > git clone http://github.com/abelew/hpgltools.git
## > git reset ecdbbe5efd47607d11e6bdd0b8ebf489a1cef51a
## This is hpgltools commit: Mon Apr 29 16:23:57 2019 -0400: ecdbbe5efd47607d11e6bdd0b8ebf489a1cef51a
## Saving to 03_swath2stats_20190327-v20190327.rda.xz
## Error in save(list = ls(all.names = TRUE, envir = globalenv()), envir = globalenv(), : error writing to connection
LS0tCnRpdGxlOiAiTS50dWJlcmN1bG9zaXMgMjAxODExMTI6IE1vc3Qgc2FtcGxlcyEgQW5hbHl6aW5nIGRhdGEgZnJvbSBFbmN5Y2xvcGVESUEgYW5kIE9wZW5Td2F0aFdvcmtGbG93L1RSSUMuIgphdXRob3I6ICJhdGIgYWJlbGV3QGdtYWlsLmNvbSIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiAgcm1kZm9ybWF0czo6cmVhZHRoZWRvd246CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGRmX3ByaW50OiBwYWdlZAogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGZpZ19oZWlnaHQ6IDcKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAgd2lkdGg6IDMwMAogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIHRvY19mbG9hdDogdHJ1ZQogIEJpb2NTdHlsZTo6aHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGZpZ19oZWlnaHQ6IDcKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIHRvY19mbG9hdDogdHJ1ZQogIGh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgICB0aGVtZTogcmVhZGFibGUKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IGZhbHNlCiAgICAgIHNtb290aF9zY3JvbGw6IGZhbHNlCi0tLQoKPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KYm9keSwgdGQgewogIGZvbnQtc2l6ZTogMTZweDsKfQpjb2RlLnJ7CiAgZm9udC1zaXplOiAxNnB4Owp9CnByZSB7CiBmb250LXNpemU6IDE2cHgKfQo8L3N0eWxlPgoKYGBge3Igb3B0aW9ucywgaW5jbHVkZT1GQUxTRX0KbGlicmFyeSgiaHBnbHRvb2xzIikKdHQgPC0gZGV2dG9vbHM6OmxvYWRfYWxsKCJ+L2hwZ2x0b29scyIpCmtuaXRyOjpvcHRzX2tuaXQkc2V0KHdpZHRoPTEyMCwKICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3M9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZT1UUlVFLAogICAgICAgICAgICAgICAgICAgICBlY2hvPVRSVUUpCmtuaXRyOjpvcHRzX2NodW5rJHNldChlcnJvcj1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgZHBpPTk2KQpvbGRfb3B0aW9ucyA8LSBvcHRpb25zKGRpZ2l0cz00LAogICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAga25pdHIuZHVwbGljYXRlLmxhYmVsPSJhbGxvdyIpCmdncGxvdDI6OnRoZW1lX3NldChnZ3Bsb3QyOjp0aGVtZV9idyhiYXNlX3NpemU9MTApKQpwcmV2aW91c19maWxlIDwtICIwMV9hbm5vdGF0aW9uXzIwMTgxMTEyLlJtZCIKcnVuZGF0ZSA8LSBmb3JtYXQoU3lzLkRhdGUoKSwgZm9ybWF0PSIlWSVtJWQiKQp2ZXIgPC0gIjIwMTgxMTEyIgp0bXAgPC0gdHJ5KHNtKGxvYWRtZShmaWxlbmFtZT1wYXN0ZTAoZ3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSIiLCB4PXByZXZpb3VzX2ZpbGUpLCAiLXYiLCB2ZXIsICIucmRhLnh6IikpKSkKCnZlciA8LSAiMjAxOTAzMjciCnJtZF9maWxlIDwtIHBhc3RlMCgiMDNfc3dhdGgyc3RhdHNfIiwgdmVyLCAiLlJtZCIpCmBgYAoKIyAyMDE5MDIyOAoKVG9kYXkgaW4gbGFiIG1lZXRpbmcsIERhbGxhcyBzaG93ZWQgYSBjb3VwbGUgb2YgV2VzdGVybiBibG90cyB3aGljaCBzdWdnZXN0IHRoYXQKZXN4RywgZXN4SCwgYW5kIGxwcUggYXJlIG5vdCBjaGFuZ2luZyB3aGVuIGxvb2tpbmcgYXQgd2hvbGUgY2VsbCBseXNhdGVzIGJldHdlZW4KdGhlIHdpbGQtdHlwZSBhbmQgbXV0YW50IHNhbXBsZXMuCgpJIHdvdWxkIHRoZXJlZm9yZSBsaWtlIHRvIHN0ZXAgdGhyb3VnaCB0aGUgZGF0YSBhbmQgZmlndXJlIG91dCBpZiBJIGNhbiBwaW5wb2ludAp0aGUgc291cmNlIG9mIHRoZSBkaXNjcmVwZW5jeS4KCiMgMjAxODA5MTMKClRoaXMgaXMgYSBjb3B5IG9mIDIwMTgwODE3IGJ1dCB3aGVyZSBJIHdpbGwgZnVydGhlciBzaW1wbGlmeSB0byBpbmNsdWRlIG9ubHkgdGhlCnd0L211dGFudCBhbmQgb25seSB0aGUgbW9zdCByZWNlbnQgdGVjaG5pY2FsIHJlcGxpY2F0ZS4KClRoZXJlZm9yZSwgdGhlIGZpcnN0IHRoaW5nIEkgZGlkIHdhcyB0byBjb3B5IHRoZSBzYW1wbGUgc2hlZXQgYW5kIHJlbW92ZSBtb3N0IG9mCnRoZSByb3dzLCBsZWF2aW5nIGJlaGluZCBvbmx5IHRoZSAxMiB3aGljaCBjb21wcmlzZSB0aGUgMyBiaW9sb2dpY2FsIHJlcGxpY2F0ZXMKZm9yIHd0L211dGFudCBhbmQgdGhlIHRlY2huaWNhbCBydW4gZGF0ZWQgMjAxODA4MTcuCgojIE5vdGVzCgoxLiAgUmVtb3ZlIGNvbXBsZW1lbnQuCjIuICBXb3JrIG9ubHkgd2l0aCBuZXdlc3Qgc2FtcGxlcy4KMy4gIERlZmluZSBpbnRlcnNlY3Rpb25zIGJldHdlZW4gbGltbWEvZWRnZXIvZGVzZXEvbXNzdGF0cyBmb3IgbXVsdGlwbGUgdGhyZXNob2xkcy4KNC4gIE9udG9sb2d5IHRlc3RzCgojIE5ldyBzYW1wbGVzIQoKSW4gdGhpcyBjb3B5IG9mIHRoZSB3b3Jrc2hlZXQsIEkgYW0gZ29pbmcgdG8gZGVhbCBfb25seV8gd2l0aCB0aGUgdHViZXJjdWxpc3QKbGlicmFyaWVzLCBhbmQgb25seSB3aXRoIHRoZSBtb3N0IHJlY2VudCB0ZWNobmljYWwgcmVwbGljYXRlIG9mIHRoZSBkYXRhLgoKVGhpcyB3b3Jrc2hlZXQgaXMgYSBjb3B5IG9mIDIwMTgwODA2IGJ1dCB0aGlzIHRpbWUgd2l0aCBmZWVsaW5nISAob3IgbmV3IHNhbXBsZXMpCkEgbWlub3IgY2F2ZWF0OiBJIGhhZCBzb21lIGRpZmZpY3VsdGllcyBjb252ZXJ0aW5nIHRoZSBuZXcgZGF0YSB0byBhIG9wZW5NUwpzdWl0YWJsZSBmb3JtYXQuICBJIGFtIG5vdCBjZXJ0YWluIGlmIEkgbWVzc2VkIHVwIGEgcHJpb3JpLCBvciBpZiBhIGNoYW5nZSBpbgp0aGUgdmVyc2lvbiBvZiB0aGUgc29mdHdhcmUgb24gdGhlIHNwZWMgY2F1c2VkIHRoZSBwcm9ibGVtLCBidXQgZm9yIGZ1dHVyZQpyZWZlcmVuY2U6CgpUbyBwcm9wZXJseSBjb252ZXJ0IHRoZSBkYXRhIHRvIG16WE1MLCBtYWtlIHN1cmUgdG8gdXNlIHRoZSBUUFAgTVNDb252ZXJ0CnV0aWxpdHkgYW5kIGhhdmUgJ1RQUCcgY29tcGF0aWJpbGl0eSBvbi4KCkFuYWx5emluZyBkYXRhIGZyb20gb3Blbk1TIGFuZCBmcmllbmRzLgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiMjIFNXQVRIMnN0YXRzIHByZXByb2Nlc3NpbmcKCkkgYW0gdXNpbmcgbXkgc2xpZ2h0bHkgbW9kaWZpZWQgY29weSBvZiBTV0FUSDJzdGF0cy4gIFRoaXMgc2Vla3MgdG8gZW5zdXJlIHRoYXQKY2hhbmdlcyBpbiB0aGUgY2FzZSBvZiBjb2x1bW5zIGluIHRoZSBtZXRhZGF0YSBmcm9tIG9uZSB2ZXJzaW9uIG9mIE9wZW5NUyB0bwphbm90aGVyIGRvIG5vdCB0cm91YmxlIG1lLgoKIyMjIENyZWF0aW5nIGEgc3dhdGgyc3RhdHMgZXhwZXJpbWVudCB1c2luZyB0aGUgdHViZXJjdWxpc3QtZGVyaXZlZCBsaWJyYXJ5IGRhdGEKClRoZXJlIGlzIG9uZSBpbXBvcnRhbnQgY2F2ZWF0IGluIHRoZSBmb2xsb3dpbmcgYmxvY2s6IEkgdXNlZCBhIHJlZ2V4IHRvIHJlbW92ZQp0aGUgc2Vjb25kIGhhbGYgb2YgZ2VuZUlEX2dlbmVOYW1lIHNvIHRoYXQgbGF0ZXIgd2hlbiBJIG1lcmdlIGluIHRoZSBhbm5vdGF0aW9uCmRhdGEgSSBoYXZlIGl0IHdpbGwgbWF0Y2guCgojIyBOb3RlcyAyMDE4MDkxMwoKSWYgSSB3YW50IHRvIHN1YnNldCBsaWtlIHRoaXMsIEkgbmVlZCB0byBkZWxldGUgdGhlIHB5cHJvcGhldCBvdXRwdXRzCmZvciBhbnl0aGluZyBub3QgaW5jbHVkZWQgaW4gdGhpcyBzZXQgYW5kIHJlcnVuIGZlYXR1cmVfYWxpZ25tZW50LnB5LgoKIyMgTm90ZXMgMjAxOTA0MzAKCkluIG15IHJlY2VudCBydW4gb2YgdGhpcyByZXBvcnQsIEkgYWNjaWRlbnRseSB1c2VkIGEgZGlmZmVyZW50IHZlcnNpb24gb2YKU1dBVEgyc3RhdHMgYW5kIHNvIG11Y2ggb2YgdGhpcyBmYWlsZWQuCgpgYGB7ciB0Yl9zd2F0aDJzdGF0c19pbml0aWFsfQp0cmljX2RhdGEgPC0gcmVhZC5jc3YoCiAgcGFzdGUwKCJyZXN1bHRzL3RyaWMvIiwgdmVyLCAiL3dob2xlXzhtel90dWJlcmN1bGlzdC9jb21ldF9IQ0QudHN2IiksIHNlcD0iXHQiKQp0cmljX2RhdGFbWyJQcm90ZWluTmFtZSJdXSA8LSBnc3ViKHBhdHRlcm49Il4oLiopXy4qJCIsIHJlcGxhY2VtZW50PSJcXDEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg9dHJpY19kYXRhW1siUHJvdGVpbk5hbWUiXV0pCnNhbXBsZV9hbm5vdCA8LSBleHRyYWN0X21ldGFkYXRhKHBhc3RlMCgic2FtcGxlX3NoZWV0cy9NdGJfZGlhX3NhbXBsZXNfIiwgdmVyLCAiLnhsc3giKSkKa2VwdCA8LSAhIGdyZXBsKHg9cm93bmFtZXMoc2FtcGxlX2Fubm90KSwgcGF0dGVybj0iXnNcXC5cXC4iKQpzYW1wbGVfYW5ub3QgPC0gc2FtcGxlX2Fubm90W2tlcHQsIF0KZGV2dG9vbHM6OmxvYWRfYWxsKCJ+L3NjcmF0Y2gvZ2l0L1NXQVRIMnN0YXRzX215Zm9ya2VkIikKczJzX2V4cCA8LSBzYW1wbGVfYW5ub3RhdGlvbihkYXRhPXRyaWNfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVfYW5ub3RhdGlvbj1zYW1wbGVfYW5ub3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHBlcHRpZGVuYW1lX2NvbHVtbj0iZnVsbHBlcHRpZGVuYW1lIikKYGBgCgpOb3cgSSBoYXZlIGEgY291cGxlIGRhdGEgc3RydWN0dXJlcyB3aGljaCBzaG91bGQgcHJvdmUgdXNlZnVsIGZvciB0aGUgbWV0cmljcwpwcm92aWRlZCBieSBTV0FUSDJzdGF0cywgTVNzdGF0cywgYW5kIG15IG93biBocGdsdG9vbHMuCgojIFNXQVRIMnN0YXRzIGNvbnRpbnVlZAoKVGhlIHZhcmlvdXMgbWV0cmljcyBhbmQgZmlsdGVycyBwcm92aWRlZCBieSBTV0FUSDJzdGF0cyBzZWVtIHF1aXRlIHJlYXNvbmFibGUgdG8KbWUuICBUaGUgb25seSB0aGluZyB0aGF0IHJlYWxseSBib3RoZXJzIG1lIGlzIHRoYXQgdGhleSBhcmUgYWxsIGNhc2Ugc2Vuc2l0aXZlCmFuZCBJIGZvdW5kIHRoYXQgdGhlIG1vc3QgcmVjZW50IHRyaWMgY2hhbmdlZCB0aGUgY2FwaXRhbGl6YXRpb24gb2YgYSBjb2x1bW4sCmNhdXNpbmcgdGhlc2UgdG8gYWxsIGZhbGwgZG93bi4gIFRoZXJlZm9yZSBJIHdlbnQgaW4gYW5kIG1hZGUgZXZlcnl0aGluZyBjYXNlCmluc2Vuc2l0aXZlIGluIGEgZmFzaGlvbiBzaW1pbGFyIHRvIHRoYXQgZG9uZSBieSBNU3N0YXRzIChleGNlcHQgSSBoYXRlIGNhcGl0YWwKbGV0dGVycywgc28gSSB1c2VkIHRvbG93ZXIoKSByYXRoZXIgdGhhbiB0b3VwcGVyKCkpLgoKIyMgUGVyZm9ybSBmaWx0ZXJzCgpUaGUgZm9sbG93aW5nIGJsb2NrIHBlcmZvcm1zIHRoZSBtZXRyaWNzIGFuZCBmaWx0ZXJzIHN1Z2dlc3RlZCBieSBzd2F0aDJzdGF0cy4KVGhlc2UgZmlyc3QgZGVmaW5lIHRoZSBkZWNveSBoaXQgcmF0ZSBpbiB0aGUgZGF0YSwgdGhlbiBmaWx0ZXIgdGhlIGRhdGEgYmFzZWQgb24KdGhhdC4gIEl0IGFsc28gZmlsdGVycyBvdXQgaGl0cyB3aXRoIGxlc3MgdGhhbiBpZGVhbCBtLXNjb3JlcyBhbmQgcHJvdGVpbnMgd2l0aApub24tb3B0aW1hbCBkaXN0cmlidXRpb25zIG9mIHBlcHRpZGUgaGl0cyAoZWl0aGVyIGR1ZSB0byB0b28gZmV3IHBlcHRpZGVzIG9yIGEKd2VpcmQgZGlzdHJpYnV0aW9uIG9mIGludGVuc2l0aWVzKS4KCmBgYHtyIHRiX3N3YXRoMnN0YXRzX3Byb2Nlc3Npbmd9CiMjIEdldCBjb3JyZWxhdGlvbnMgb24gYSBzYW1wbGUgYnkgc2FtcGxlIGJhc2lzCnBwKGZpbGU9ImltYWdlcy8yMDE5MDMyN190Yl9zd2F0aDJzdGF0c19zYW1wbGVfY29yLnBuZyIpCnNhbXBsZV9jb3IgPC0gcGxvdF9jb3JyZWxhdGlvbl9iZXR3ZWVuX3NhbXBsZXMoCiAgczJzX2V4cCwgc2l6ZT0yLAogIGZ1bi5hZ2dyZWdhdGU9bWVhbiwKICBjb21wYXJpc29uPXRyYW5zaXRpb25fZ3JvdXBfaWQgfiBjb25kaXRpb24gKyBiaW9yZXBsaWNhdGUsCiAgY29sdW1uLnZhbHVlcz0iaW50ZW5zaXR5IikKZGV2Lm9mZigpCnNhbXBsZV9jb25kX3JlcF9jb3IgPC0gcGxvdF9jb3JyZWxhdGlvbl9iZXR3ZWVuX3NhbXBsZXMoCiAgczJzX2V4cCwgc2l6ZT0yLAogIGNvbXBhcmlzb249dHJhbnNpdGlvbl9ncm91cF9pZCB+CiAgICBjb25kaXRpb24gKyBiaW9yZXBsaWNhdGUgKyBydW4sCiAgZnVuLmFnZ3JlZ2F0ZT1tZWFuLAogIGNvbHVtbi52YWx1ZXM9ImludGVuc2l0eSIpCgpkZWNveV9saXN0cyA8LSBhc3Nlc3NfZGVjb3lfcmF0ZShzMnNfZXhwKQojIyBUaGlzIHNlZW1zIGEgYml0IGhpZ2ggdG8gbWUsIHllc25vPwpmZHJfb3ZlcmFsbCA8LSBhc3Nlc3NfZmRyX292ZXJhbGwoczJzX2V4cCwgb3V0cHV0PSJSY29uc29sZSIsIHBsb3Q9VFJVRSkKCmJ5cnVuX2ZkciA8LSBhc3Nlc3NfZmRyX2J5cnVuKHMyc19leHAsIEZGVD0wLjcsIHBsb3Q9VFJVRSwgb3V0cHV0PSJSY29uc29sZSIpCmNob3Nlbl9tc2NvcmUgPC0gbXNjb3JlNGFzc2F5ZmRyKHMyc19leHAsIEZGVD0wLjcsIGZkcl90YXJnZXQ9MC4wMikKcHJvdF9zY29yZSA8LSBtc2NvcmU0cHJvdGZkcihzMnNfZXhwLCBGRlQ9MC43LCBmZHJfdGFyZ2V0PTAuMDIpCgpmaWx0ZXJlZF9tcyA8LSBmaWx0ZXJfbXNjb3JlKHMyc19leHAsIGNob3Nlbl9tc2NvcmUpCmZpbHRlcmVkX2ZxIDwtIGZpbHRlcl9tc2NvcmVfZnJlcW9icyhzMnNfZXhwLCAwLjAxLCAwLjgsIHJtLmRlY295PUZBTFNFKQpmaWx0ZXJlZF9tc19mZHIgPC0gZmlsdGVyX21zY29yZV9mZHIoZmlsdGVyZWRfbXMsIEZGVD0wLjcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyYWxsX3Byb3RlaW5fZmRyX3RhcmdldD1wcm90X3Njb3JlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXJfb3ZlcmFsbF9wZXB0aWRlX2Zkcl9saW1pdD0wLjA1KQpmaWx0ZXJlZF9tc19mZHJfcHIgPC0gZmlsdGVyX3Byb3Rlb3R5cGljX3BlcHRpZGVzKGZpbHRlcmVkX21zX2ZkcikKZmlsdGVyZWRfbXNfZmRyX3ByX2FsbCA8LSBmaWx0ZXJfYWxsX3BlcHRpZGVzKGZpbHRlcmVkX21zX2Zkcl9wcikKZmlsdGVyZWRfbXNfZmRyX3ByX2FsbF9zdHIgPC0gZmlsdGVyX29uX21heF9wZXB0aWRlcyhkYXRhPWZpbHRlcmVkX21zX2Zkcl9wcl9hbGwsIG5fcGVwdGlkZXM9MTApCmZpbHRlcmVkX2FsbF9maWx0ZXJzIDwtIGZpbHRlcl9vbl9taW5fcGVwdGlkZXMoZGF0YT1maWx0ZXJlZF9tc19mZHJfcHJfYWxsX3N0ciwgbl9wZXB0aWRlcz0zKQpgYGAKCiMjIFdyaXRlIG91dCBtYXRyaWNlcyBvZiB0aGUgcmVzdWx0cwoKc3dhdGgyc3RhdHMgcHJvdmlkZXMgYSBjb3VwbGUgb2Ygd2F5cyB0byBwcmludCBvdXQgaXRzIHJlc3VsdHMsIG9uZSBpbiBhIGZvcm1hdApzcGVjaWZpY2FsbHkgaW50ZW5kZWQgZm9yIE1Tc3RhdHMsIGFuZCBhbm90aGVyIGFzIGEgbW9yZSBjYW5vbmljYWwgbWF0cml4IG9mCnJvd3MgPSBwcm90ZWlucywgY29sdW1ucyA9IHNhbXBsZXMuCgpgYGB7ciBzd2F0aDJzdGF0c19tYXRyaWNlc30KIyMgSSB0aGluayB0aGVzZSBtYXRyaXhlcyBhcmUgcHJvYmFibHkgc21hcnRlciB0byB1c2UgdGhhbiB0aGUgcmF3IG91dG1hdHJpeCBmcm9tIHRyaWMuCiMjIEJ1dCBJIGFtIG5vdCBhIGZhbiBvZiByZXJ3cml0aW5nIHRoZSBzYW1wbGUgY29sdW1uIG5hbWVzLgptYXRyaXhfcHJlZml4IDwtIGZpbGUucGF0aCgicmVzdWx0cyIsICJzd2F0aDJzdGF0cyIsIHZlcikKaWYgKCFmaWxlLmV4aXN0cyhtYXRyaXhfcHJlZml4KSkgewogIGRpci5jcmVhdGUobWF0cml4X3ByZWZpeCkKfQpwcm90ZWluX21hdHJpeF9hbGwgPC0gd3JpdGVfbWF0cml4X3Byb3RlaW5zKAogIHMyc19leHAsIHdyaXRlLmNzdj1UUlVFLAogIGZpbGVuYW1lPWZpbGUucGF0aChtYXRyaXhfcHJlZml4LCAicHJvdGVpbl9hbGwuY3N2IikpCmRpbShwcm90ZWluX21hdHJpeF9hbGwpCnByb3RlaW5fbWF0cml4X21zY29yZSA8LSB3cml0ZV9tYXRyaXhfcHJvdGVpbnMoCiAgZmlsdGVyZWRfbXMsIHdyaXRlLmNzdj1UUlVFLAogIGZpbGVuYW1lPWZpbGUucGF0aChtYXRyaXhfcHJlZml4LCAicHJvdGVpbl9tYXRyaXhfbXNjb3JlLmNzdiIpKQpkaW0ocHJvdGVpbl9tYXRyaXhfbXNjb3JlKQpwZXB0aWRlX21hdHJpeF9tc2NvcmUgPC0gd3JpdGVfbWF0cml4X3BlcHRpZGVzKAogIGZpbHRlcmVkX21zLCB3cml0ZS5jc3Y9VFJVRSwKICBmaWxlbmFtZT1maWxlLnBhdGgobWF0cml4X3ByZWZpeCwgInBlcHRpZGVfbWF0cml4X21zY29yZS5jc3YiKSkKZGltKHBlcHRpZGVfbWF0cml4X21zY29yZSkKcHJvdGVpbl9tYXRyaXhfZmlsdGVyZWQgPC0gd3JpdGVfbWF0cml4X3Byb3RlaW5zKAogIGZpbHRlcmVkX2FsbF9maWx0ZXJzLCB3cml0ZS5jc3Y9VFJVRSwKICBmaWxlbmFtZT1maWxlLnBhdGgobWF0cml4X3ByZWZpeCwgInByb3RlaW5fbWF0cml4X2ZpbHRlcmVkLmNzdiIpKQpkaW0ocHJvdGVpbl9tYXRyaXhfZmlsdGVyZWQpCnBlcHRpZGVfbWF0cml4X2ZpbHRlcmVkIDwtIHdyaXRlX21hdHJpeF9wZXB0aWRlcygKICBmaWx0ZXJlZF9hbGxfZmlsdGVycywgd3JpdGUuY3N2PVRSVUUsCiAgZmlsZW5hbWU9ZmlsZS5wYXRoKG1hdHJpeF9wcmVmaXgsICJwZXB0aWRlX21hdHJpeF9maWx0ZXJlZC5jc3YiKSkKZGltKHBlcHRpZGVfbWF0cml4X2ZpbHRlcmVkKQoKcnRfY29yIDwtIHBsb3RfY29ycmVsYXRpb25fYmV0d2Vlbl9zYW1wbGVzKAogIGZpbHRlcmVkX2FsbF9maWx0ZXJzLCBjb2x1bW4udmFsdWVzPSJpbnRlbnNpdHkiLCBmdW4uYWdncmVnYXRlPXN1bSwgc2l6ZT0yKQojIyBJIGhhdmUgbm8gZWZmaW5nIGNsdWUgd2hhdCB0aGlzIHBsb3QgbWVhbnMuCnZhcmlhdGlvbiA8LSBwbG90X3ZhcmlhdGlvbihmaWx0ZXJlZF9hbGxfZmlsdGVycywgZnVuLmFnZ3JlZ2F0ZT1zdW0pCgpjb2xzIDwtIGNvbG5hbWVzKGZpbHRlcmVkX2FsbF9maWx0ZXJzKQpkaXNhZ2dyZWdhdGVkIDwtIGRpc2FnZ3JlZ2F0ZShmaWx0ZXJlZF9hbGxfZmlsdGVycywgYWxsLmNvbHVtbnM9VFJVRSkKbXNzdGF0c19pbnB1dCA8LSBjb252ZXJ0X01Tc3RhdHMoZGlzYWdncmVnYXRlZCkKYGBgCgojIFRlc3QgYUxGUQoKSSB3YW50IHRvIHJldmlzaXQgYUxGUSwgSSB0aGluayBpdCBtaWdodCBwcm92aWRlIGJldHRlciBwcm90ZWluLWxldmVsCnF1YW50aWZpY2F0aW9uIG1ldGhvZHMuICBhTEZRIGxvb2tzIHByb21pc2luZywgYnV0IEkgaGF2ZSBub3QgZmlndXJlZCBvdXQgdmFsaWQKcGFyYW1ldGVycyBmb3IgdXNpbmcgaXQuCgpgYGB7ciBhbGZxLCBldmFsPUZBTFNFfQpzdW1tYXJ5KG1zc3RhdHNfaW5wdXQpCmRldnRvb2xzOjpsb2FkX2FsbCgifi9zY3JhdGNoL2dpdC9hTEZRIikKYWxmcV9pbnB1dCA8LSB0cmljX2RhdGFbLCBjKCJhbGlnbl9vcmlnZmlsZW5hbWUiLCAiUHJvdGVpbk5hbWUiLCAiRnVsbFBlcHRpZGVOYW1lIiwgInRyYW5zaXRpb25fZ3JvdXBfaWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZ1bGxQZXB0aWRlTmFtZSIsICJDaGFyZ2UiLCAiSW50ZW5zaXR5IildCmNvbG5hbWVzKGFsZnFfaW5wdXQpIDwtIGMoInJ1bl9pZCIsICJwcm90ZWluX2lkIiwgInBlcHRpZGVfaWQiLCAidHJhbnNpdGlvbl9pZCIsICJwZXB0aWRlX3NlcXVlbmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAicHJlY3Vyc29yX2NoYXJnZSIsICJ0cmFuc2l0aW9uX2ludGVuc2l0eSIpCmFsZnFfaW5wdXRbWyJjb25jZW50cmF0aW9uIl1dIDwtICI/IgphbGZxX2luZmVyZW5jZSA8LSBhTEZROjpQcm90ZWluSW5mZXJlbmNlLmRlZmF1bHQoYWxmcV9pbnB1dCwgY29uc2Vuc3VzX3Byb3RlaW5zPUZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc2Vuc3VzX3BlcHRpZGVzPUZBTFNFLCB0cmFuc2l0aW9uX3N0cmljdG5lc3M9Imxvb3NlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNlbnN1c190cmFuc2l0aW9ucz1GQUxTRSkKYWxmcV9xdWFudGl0aWVzIDwtIGFMRlE6OkFic29sdXRlUXVhbnRpZmljYXRpb24uZGVmYXVsdChhbGZxX2luZmVyZW5jZSkKYGBgCgojIyBTb21lIG5ldyBwbG90cwoKSW4gcmVzcG9uc2UgdG8gc29tZSBpbnRlcmVzdGluZyBxdWVyaWVzIGZyb20gWWFuLCBJIG1hZGUgYSBmZXcgbGl0dGxlIGZ1bmN0aW9ucwp3aGljaCBxdWVyeSBhbmQgcGxvdCBkYXRhIGZyb20gdGhlIHNjb3JlZCBkYXRhIHByb3ZpZGVkIGJ5IG9wZW5zd2F0aC9weXByb3BoZXQuCkxldCB1cyBsb29rIGF0IHRoZWlyIHJlc3VsdHMgaGVyZS4KCmBgYHtyIHRiX3B5cHJvcGhldF9wbG90c30KcHlwX21ldGFkYXRhIDwtIGdsdWU6OmdsdWUoInNhbXBsZV9zaGVldHMvTXRiX2RpYV9zYW1wbGVzX3t2ZXJ9Lnhsc3giKQpweXByb3BoZXRfZnVuIDwtIGV4dHJhY3RfcHlwcm9waGV0X2RhdGEobWV0YWRhdGE9cHlwX21ldGFkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBweXByb3BoZXRfY29sdW1uPSJkaWFzY29yZWQiKQptYXNzX3Bsb3QgPC0gc20ocGxvdF9weXByb3BoZXRfZGlzdHJpYnV0aW9uKHB5cHJvcGhldF9mdW4sIGNvbHVtbj0ibWFzcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwdF9uYW1lcz0iZmlndXJlbmFtZSIpKQptYXNzX3Bsb3RbWyJ2aW9saW4iXV0KCmRlbHRhcnRfcGxvdF9hbGwgPC0gc20ocGxvdF9weXByb3BoZXRfZGlzdHJpYnV0aW9uKAogIHB5cHJvcGhldF9mdW4sIGNvbHVtbj0iZGVsdGFfcnQiLCBleHB0X25hbWVzPSJmaWd1cmVuYW1lIikpCmRlbHRhcnRfcGxvdF9hbGxbWyJ2aW9saW4iXV0KCmRlbHRhcnRfcGxvdF9yZWFsIDwtIHNtKHBsb3RfcHlwcm9waGV0X2Rpc3RyaWJ1dGlvbigKICBweXByb3BoZXRfZnVuLCBleHB0X25hbWVzPSJmaWd1cmVuYW1lIiwKICBjb2x1bW49ImRlbHRhX3J0Iiwga2VlcF9kZWNveXM9RkFMU0UpKQpkZWx0YXJ0X3Bsb3RfcmVhbFtbInZpb2xpbiJdXQoKZGVsdGFydF9wbG90X2RlY295cyA8LSBzbShwbG90X3B5cHJvcGhldF9kaXN0cmlidXRpb24oCiAgcHlwcm9waGV0X2Z1biwgZXhwdF9uYW1lcz0iZmlndXJlbmFtZSIsCiAgY29sdW1uPSJkZWx0YV9ydCIsIGtlZXBfcmVhbD1GQUxTRSkpCmRlbHRhcnRfcGxvdF9kZWNveXNbWyJ2aW9saW4iXV0KCmludGVuc2l0aWVzX2VzeEcgPC0gc20ocGxvdF9weXByb3BoZXRfcHJvdGVpbihweXByb3BoZXRfZnVuLCBleHB0X25hbWVzPSJmaWd1cmVuYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbj0iaW50ZW5zaXR5IiwgcHJvdGVpbj0iUnYwMjg3IikpCmludGVuc2l0aWVzX2VzeEcKZHJ0X2VzeEcgPC0gc20ocGxvdF9weXByb3BoZXRfcHJvdGVpbihweXByb3BoZXRfZnVuLCBleHB0X25hbWVzPSJmaWd1cmVuYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW49ImRlbHRhX3J0IiwgcHJvdGVpbj0iUnYwMjg3IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fZGF0YT0xMDAsIG1heF9kYXRhPTEwMDApKQpkcnRfZXN4RwoKaW50ZW5zaXRpZXNfZXN4SCA8LSBwbG90X3B5cHJvcGhldF9wcm90ZWluKHB5cHJvcGhldF9mdW4sIGV4cHRfbmFtZXM9ImZpZ3VyZW5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uPSJpbnRlbnNpdHkiLCBwcm90ZWluPSJSdjAyODgiKQppbnRlbnNpdGllc19lc3hICmRydF9lc3hIIDwtIHBsb3RfcHlwcm9waGV0X3Byb3RlaW4ocHlwcm9waGV0X2Z1biwgZXhwdF9uYW1lcz0iZmlndXJlbmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uPSJkZWx0YV9ydCIsIHByb3RlaW49IlJ2MDI4OCIsIG1pbl9kYXRhPTEwMCwgbWF4X2RhdGE9MTAwMCkKZHJ0X2VzeEgKCmludGVuc2l0aWVzX2xwcUggPC0gcGxvdF9weXByb3BoZXRfcHJvdGVpbihweXByb3BoZXRfZnVuLCBleHB0X25hbWVzPSJmaWd1cmVuYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbj0iaW50ZW5zaXR5IiwgcHJvdGVpbj0ibHBxSCIpCmludGVuc2l0aWVzX2xwcUgKZHJ0X2xwcUggPC0gcGxvdF9weXByb3BoZXRfcHJvdGVpbihweXByb3BoZXRfZnVuLCBleHB0X25hbWVzPSJmaWd1cmVuYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW49ImRlbHRhX3J0IiwgcHJvdGVpbj0ibHBxSCIsIG1pbl9kYXRhPTEwMCwgbWF4X2RhdGE9MTAwMCkKZHJ0X2xwcUgKCgpwbG90X3B5cHJvcGhldF9wcm90ZWluKHB5cHJvcGhldF9mdW4sIGV4cHRfbmFtZXM9ImZpZ3VyZW5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbj0iaW50ZW5zaXR5IiwgcHJvdGVpbj0iMDU2MiIpCmBgYAoKIyMgTVNzdGF0cwoKbXNzdGF0cy5vcmcgc2VlbXMgdG8gcHJvdmlkZSBhIGNvbXBsZXRlIHNvbHV0aW9uIGZvciBwZXJmb3JtaW5nIHJlYXNvbmFibGUgbWV0cmljcyBvZiB0aGlzIGRhdGEuCgpJIGFtIGN1cnJlbnRseSByZWFkaW5nOiBodHRwOi8vbXNzdGF0cy5vcmcvd3AtY29udGVudC91cGxvYWRzLzIwMTcvMDEvTVNzdGF0c192My43LjNfbWFudWFsLnBkZgoKSSBtYWRlIHNvbWUgbW9kZXJhdGVseSBpbnRydXNpdmUgY2hhbmdlcyB0byBNU3N0YXRzIHRvIG1ha2UgaXQgY2xlYXJlciwgYXMgd2VsbC4KCmBgYHtyIHRiX21zc3RhdHNfcXVhbnQsIGV2YWw9RkFMU0V9CnR0IDwtIHNtKGRldnRvb2xzOjpsb2FkX2FsbCgifi9zY3JhdGNoL2dpdC9NU3N0YXRzIikpCmNoZWNrcG9pbnQgPC0gcGFzdGUwKCJtc3N0YXRzX2RhdGFwcm9jZXNzLXYiLCB2ZXIsICIucmRhIikKaWYgKGZpbGUuZXhpc3RzKGNoZWNrcG9pbnQpKSB7CiAgbG9hZChmaWxlPWNoZWNrcG9pbnQpCn0gZWxzZSB7CiAgbXNzdGF0c19xdWFudCA8LSBkYXRhUHJvY2Vzcyhtc3N0YXRzX2lucHV0KQogIHNhdmUoZmlsZT1jaGVja3BvaW50LCBsaXN0PWMoIm1zc3RhdHNfcXVhbnQiKSkKfQptc3N0YXRzX3Bsb3RzIDwtIHNtKGRhdGFQcm9jZXNzUGxvdHMobXNzdGF0c19xdWFudCwgdHlwZT0iUUNQTE9UIikpCgpteV9sZXZlbHMgPC0gbGV2ZWxzKGFzLmZhY3Rvcihtc3N0YXRzX2lucHV0JGNvbmRpdGlvbikpCm15X2xldmVscwpjb21wYXJpc29ucyA8LSBtYWtlX3NpbXBsaWZpZWRfY29udHJhc3RfbWF0cml4KAogIG51bWVyYXRvcnM9Yygid3RfZmlsdHJhdGUiLCAiZGVsdGFfZmlsdHJhdGUiLCAiZGVsdGFfZmlsdHJhdGUiLCAiZGVsdGFfd2hvbGUiKSwKICBkZW5vbWluYXRvcnM9Yygid3Rfd2hvbGUiLCAiZGVsdGFfd2hvbGUiLCAid3RfZmlsdHJhdGUiLCAid3Rfd2hvbGUiKSkKCm1zc3RhdHNfcmVzdWx0cyA8LSBsaXN0KCkKY2hlY2twb2ludCA8LSBwYXN0ZTAoIm1zc3RhdHNfZ3JvdXAtdiIsIHZlciwgIi5yZGEiKQppZiAoZmlsZS5leGlzdHMoY2hlY2twb2ludCkpIHsKICBsb2FkKGZpbGU9Y2hlY2twb2ludCkKfSBlbHNlIHsKICBmb3IgKGMgaW4gMTpsZW5ndGgocm93bmFtZXMoY29tcGFyaXNvbnMpKSkgewogICAgbmFtZSA8LSByb3duYW1lcyhjb21wYXJpc29ucylbY10KICAgIG1lc3NhZ2UoIlN0YXJ0aW5nICIsIG5hbWUpCiAgICBjb21wIDwtIGNvbXBhcmlzb25zW2MsIF0KICAgIGNvbXAgPC0gdChhcy5tYXRyaXgoY29tcCkpCiAgICByb3duYW1lcyhjb21wKSA8LSBuYW1lCiAgICBtc3N0YXRzX3Jlc3VsdHNbW25hbWVdXSA8LSBzbShNU3N0YXRzOjpncm91cENvbXBhcmlzb24oY29udHJhc3QubWF0cml4PWNvbXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YT1tc3N0YXRzX3F1YW50KSkKICAgIG1lc3NhZ2UoIkZpbmlzaGVkICIsIG5hbWUpCiAgfQogIHNhdmUoZmlsZT1jaGVja3BvaW50LCBsaXN0PWMoIm1zc3RhdHNfcmVzdWx0cyIpKQp9CmBgYAoKIyMjIFAvUEUgcHJvdGVpbiBRQyBwbG90cyBmb3IgWWFuCgpZYW4gYXNrZWQgZm9yIHRoZSBwL3BlIHByb3RlaW4gcWMgcGxvdHMuIG9rLiAgSSBjaGFuZ2VkIHRoZSBkYXRhUHJvY2Vzc1Bsb3RzIHRvCnJldHVybiBzb21ldGhpbmcgdXNlZnVsLCBzbyB0aGF0IHNob3VsZCBiZSBwb3NzaWJsZSBub3cuCgpgYGB7ciBwZSwgZXZhbD1GQUxTRX0KcGVfZ2VuZXMgPC0gcmVhZC50YWJsZSgicmVmZXJlbmNlL2Fubm90YXRlZF9wZV9nZW5lcy50eHQiKVtbMV1dCgojIyBVbmZvcnR1bmF0ZWx5LCB0aGUgbmFtZXMgZGlkIG5vdCBnZXQgc2V0IGluIG15IGNoYW5nZWQgdmVyc2lvbiBvZiBkYXRhUHJvY2Vzc1Bsb3RzLi4uCnBsb3Rsc3QgPC0gbXNzdGF0c19wbG90cyRRQ1BMT1QKYXZhaWxhYmxlX3Bsb3RzIDwtIGdzdWIocGF0dGVybj0iXjEvIiwgcmVwbGFjZW1lbnQ9IiIsCiAgICAgICAgICAgICAgICAgICAgICAgIHg9bGV2ZWxzKG1zc3RhdHNfcXVhbnQkUHJvY2Vzc2VkRGF0YSRQUk9URUlOKSkKbmFtZXMocGxvdGxzdCkgPC0gYXZhaWxhYmxlX3Bsb3RzCgpwZV9pbl9hdmFpbF9pZHggPC0gcGVfZ2VuZXMgJWluJSBhdmFpbGFibGVfcGxvdHMKcGVfaW5fYXZhaWwgPC0gcGVfZ2VuZXNbcGVfaW5fYXZhaWxfaWR4XQpwZV9wbG90cyA8LSBwbG90bHN0W3BlX2luX2F2YWlsXQpwZGYoZmlsZT0icGVfcWNfcGxvdHMucGRmIikKZm9yIChwIGluIDE6bGVuZ3RoKHBlX3Bsb3RzKSkgewogIHBsb3QocGVfcGxvdHNbW3BdXSkKfQpkZXYub2ZmKCkKbGVuZ3RoKHBlX3Bsb3RzKQpgYGAKCiMgQ3JlYXRlIGhwZ2x0b29scyBleHByZXNzaW9uc2V0CgpTaW5jZSBJIGFtIG5vdCBjZXJ0YWluIEkgdW5kZXJzdGFuZCB0aGVzZSBkYXRhLCBJIHdpbGwgdGFrZSB0aGUgaW50ZW5zaXRpZXMgZnJvbQpTV0FUSDJzdGF0cywgbWV0YWRhdGEsIGFuZCBhbm5vdGF0aW9uIGRhdGE7ICBhdHRlbXB0IHRvIGNyZWF0ZSBhICdub3JtYWwnCmV4cHJlc3Npb25zZXQ7IHBva2UgYXQgaXQgdG8gc2VlIHdoYXQgSSBjYW4gbGVhcm4uCgojIyBNYXNzYWdpbmcgdGhlIG1ldGFkYXRhCgpJIHdhbnQgdG8gdXNlIHRoZSBzYW1lIG1ldGFkYXRhIGFzIHdlcmUgdXNlZCBmb3IgTVNzdGF0cy4gIEl0IGhhcyBhIGZldwppbXBvcnRhbnQgZGlmZmVyZW5jZXMgZnJvbSB0aGUgcmVxdWlyZW1lbnRzIG9mIGhwZ2x0b29sczogcHJldHR5IG11Y2ggb25seSB0aGF0CkkgZG8gbm90IGFsbG93IHJvd25hbWVzL3NhbXBsZUlEcyB0byBzdGFydCB3aXRoIGEgbnVtYmVyLgoKIyMgTWFzc2FnaW5nIHRoZSBpbnRlbnNpdHkgbWF0cml4CgpJIGRvIG5vdCB3YW50IHRoZSBcMSBiZWZvcmUgdGhlIHByb3RlaW4gbmFtZXMsIEkgYWxyZWFkeSBtZXJnZWQgdGhlbSBpbnRvIG9uZQplbnRyeSBwZXIgZ2VuZSB2aWEgU1dBVEgyc3RhdHMuCgpgYGB7ciB0Yl9wcm90ZWluX21hdHJpeH0KcHJvdF9tdHJ4IDwtIHJlYWQuY3N2KGZpbGUucGF0aCgicmVzdWx0cyIsICJzd2F0aDJzdGF0cyIsIHZlciwgInByb3RlaW5fbWF0cml4X2ZpbHRlcmVkLmNzdiIpKQpyb3duYW1lcyhwcm90X210cngpIDwtIGdzdWIocGF0dGVybj0iXjFcXC8iLCByZXBsYWNlbWVudD0iIiwgeD1wcm90X210cnhbWyJwcm90ZWlubmFtZSJdXSkKcHJvdF9tdHJ4IDwtIHByb3RfbXRyeFssIC0xXQojIyBJbXBvcnRhbnQgcXVlc3Rpb246IERpZCBTV0FUSDJzdGF0cyByZW9yZGVyIG15IGRhdGE/CmNvbG5hbWVzKHByb3RfbXRyeCkgPC0gZ3N1YihwYXR0ZXJuPSJeKC4qKSgyMDE4LiopJCIsIHJlcGxhY2VtZW50PSJzXFwyIiwgeD1jb2xuYW1lcyhwcm90X210cngpKQpgYGAKCiMjIE1lcmdlIHRoZSBwaWVjZXMKCk5vdyB3ZSBzaG91bGQgaGF2ZSBzdWZmaWNpZW50IHBpZWNlcyB0byBtYWtlIGFuIGV4cHJlc3Npb25zZXQuCgpXaGlsZSBoZXJlLCBJIHdpbGwgYWxzbyBzcGxpdCB0aGUgZGF0YSBpbnRvIGEgY2YgYW5kIHdob2xlLWNlbGwgcGFpciBvZiBkYXRhIHN0cnVjdHVyZXMuCgpgYGB7ciB0Yl9leHB0LCBmaWcuc2hvdz0iaGlkZSJ9CiMjIERyb3AgdGhlIG1ldGFkYXRhIG5vdCBpbiB0aGUgcHJvdGVpbiBtYXRyaXg6CiMjIEFuZCBlbnN1cmUgdGhhdCB0aGV5IGFyZSB0aGUgc2FtZSBvcmRlci4KcmVvcmRlcmVkIDwtIGNvbG5hbWVzKHByb3RfbXRyeCkKbWV0YWRhdGEgPC0gc2FtcGxlX2Fubm90W3Jlb3JkZXJlZCwgXQpwcm90ZWluX2V4cHQgPC0gc20oY3JlYXRlX2V4cHQobWV0YWRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudF9kYXRhZnJhbWU9cHJvdF9tdHJ4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZV9pbmZvPW10Yl9hbm5vdGF0aW9ucykpCgp3cml0dGVuX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X3Byb3RlaW5fZXhwdC12e3Zlcn0ueGxzeCIpCndob2xlX2V4cHQgPC0gc3Vic2V0X2V4cHQocHJvdGVpbl9leHB0LCBzdWJzZXQ9ImNvbGxlY3Rpb250eXBlPT0nd2hvbGUnIikKY2ZfZXhwdCA8LSBzdWJzZXRfZXhwdChwcm90ZWluX2V4cHQsIHN1YnNldD0iY29sbGVjdGlvbnR5cGU9PSdmaWx0cmF0ZSciKQpwcm90ZWluX3dyaXRlIDwtIHdyaXRlX2V4cHQocHJvdGVpbl9leHB0LCBleHB0X25hbWVzPSJmaWd1cmVuYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpb2xpbj1UUlVFLCBiYXRjaD0icmF3IiwgZXhjZWw9d3JpdHRlbl9maWxlKQpgYGAKIyMgTWV0cmljcyBvZiB0aGUgZnVsbCBkYXRhIHNldAoKR2VuZXJhdGUgc29tZSBtZXRyaWNzIG9mIHRoZSBmdWxsIGRhdGEgc2V0LCBsYXRlciB0aGUgc2FtZSB0aGluZ3Mgd2lsbCBiZQpwZXJmb3JtZWQgdXNpbmcgdGhlIGRhdGEgc3Vic2V0cy4gIFRoZXJlIGlzIGEgd2VpcmQgY2F2ZWF0OiBzdmEgZmFpbHMgdW5kZXIgc29tZQpzdHJhbmdlIGNpcmN1bXN0YW5jZXMgZm9yIHRoaXMgZGF0YS4gIEl0IHNlZW1zIHRoYXQgaWYgdGhlIGRhdGEgaXMgY3BtbWVkLCB0aGVuCnN2YSBzZWVzIHRoZSByZXN1bHRpbmcgbWF0cml4IGFzIGNvbnRhaW5pbmcgc2luZ3VsYXIgdmFsdWVzLiAgSSBhbSBndWVzc2luZyB0aGF0CnRoaXMgbWVhbnMgdGhhdCB0aGVyZSBhcmUgYSBidW5jaCBvZiBsb3cgdmFsdWVzIGluIHRoZSBmaWx0cmF0ZSBkYXRhIHdoaWNoLCB3aGVuCmNwbShkYXRhKSBpcyBwZXJmb3JtZWQgZ2V0IGRyb3BwZWQgdG8gbmVhciAwIGFuZCB0aGVyZWZvcmUgdHJpcCB1cCBzdmEuICBUaGVyZQphcmUgdHdvIGxpa2VseSB3YXlzIGFyb3VuZCB0aGlzOgoKMS4gIERvIG5vdCBjcG0gdGhlIGRhdGEuCjIuICBGaWx0ZXIgdGhlIGRhdGEgbW9yZSBhZ2dyZXNzaXZlbHkgc28gdGhhdCB0aGVyZSBhcmUgbm8gemVyby12YWx1ZXMgYWZ0ZXIgY3BtKCkuCgpgYGB7ciB0Yl9wcm90ZWluX21ldHJpY3MsIGZpZy5zaG93PSdoaWRlJ30KcHJvdGVpbl9tZXRyaWNzIDwtIHNtKGdyYXBoX21ldHJpY3MocHJvdGVpbl9leHB0KSkKcHJvdGVpbl9ub3JtIDwtIHNtKG5vcm1hbGl6ZV9leHB0KHByb3RlaW5fZXhwdCwgdHJhbnNmb3JtPSJsb2cyIiwgY29udmVydD0iY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm09InF1YW50IiwgZmlsdGVyPVRSVUUpKQpwcm90ZWluX25vcm1fbWV0cmljcyA8LSBzbShncmFwaF9tZXRyaWNzKHByb3RlaW5fbm9ybSkpCnByb3RlaW5fc3ZhIDwtIHNtKG5vcm1hbGl6ZV9leHB0KHByb3RlaW5fZXhwdCwgdHJhbnNmb3JtPSJsb2cyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2g9InN2YXNlcSIsIGZpbHRlcj1UUlVFKSkKcHJvdGVpbl9zdmFfbWV0cmljcyA8LSBzbShncmFwaF9tZXRyaWNzKHByb3RlaW5fc3ZhKSkKYGBgCgojIyBNZXRyaWNzIG9mIHRoZSB3aG9sZS1jZWxsIGRhdGEgc2V0CgpIZXJlIGFyZSBzb21lIG9mIHRoZSBwcm9taXNlZCBzdWJzZXQgZGF0YS4KCmBgYHtyIHRiX3dob2xlX21ldHJpY3MsIGZpZy5zaG93PSdoaWRlJ30Kd2hvbGVfbWV0cmljcyA8LSBzbShncmFwaF9tZXRyaWNzKHdob2xlX2V4cHQpKQp3aG9sZV9ub3JtIDwtIHNtKG5vcm1hbGl6ZV9leHB0KHdob2xlX2V4cHQsIHRyYW5zZm9ybT0ibG9nMiIsIGNvbnZlcnQ9ImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybT0icXVhbnQiLCBmaWx0ZXI9VFJVRSkpCndob2xlX25vcm1fbWV0cmljcyA8LSBzbShncmFwaF9tZXRyaWNzKHdob2xlX25vcm0pKQp3aG9sZV9zdmEgPC0gc20obm9ybWFsaXplX2V4cHQod2hvbGVfZXhwdCwgdHJhbnNmb3JtPSJsb2cyIiwgY29udmVydD0iY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhdGNoPSJzdmFzZXEiLCBmaWx0ZXI9VFJVRSkpCndob2xlX3N2YV9tZXRyaWNzIDwtIHNtKGdyYXBoX21ldHJpY3Mod2hvbGVfc3ZhKSkKYGBgCgojIyBWYXJpYW5jZSBwYXJ0aXRpb24KClRoaXMgaXMgYSBwb3RlbnRpYWwgYXJndW1lbnQgYWdhaW5zdCBpbmNsdWRpbmcgb25seSB0aGUgbmV3ZXN0IHRlY2huaWNhbApyZXBsaWNhdGUgb2YgdGhlIGRhdGE7IGFzIHdoZW4gYWxsIHRoZSB0ZWNobmljYWxzIHdlcmUgaW5jbHVkZWQsIHRoZXNlIG1ldHJpY3MKbG9va2VkIG11Y2ggbW9yZSBzZW5zaWJsZS4KCmBgYHtyIHRiX3ZhcmlhbmNlfQp3aG9sZV92YXJwYXJ0IDwtIHNpbXBsZV92YXJwYXJ0KHdob2xlX25vcm0pCndob2xlX3ZhcnBhcnQkcGFydGl0aW9uX3Bsb3QKd2hvbGVfY3YgPC0gcGxvdF92YXJpYW5jZV9jb2VmZmljaWVudHMocHJvdGVpbl9leHB0KQp3aG9sZV9jdiRkaXNwCiMjdGJfYmF0Y2hfY3YgPC0gcGxvdF92YXJpYW5jZV9jb2VmZmljaWVudHModGJfcHJvdGVpbl9leHB0LCB4X2F4aXM9ImJhdGNoIikKIyN0Yl9iYXRjaF9jdiRkaXNwCiMjZ2Vub3R5cGVfY3YgPC0gcGxvdF92YXJpYW5jZV9jb2VmZmljaWVudHMocHJvdGVpbl9leHB0LCB4X2F4aXM9Imdlbm90eXBlIikKIyNnZW5vdHlwZV9jdiRkaXNwCiMjdGJfcHJlcF9jdiA8LSBwbG90X3ZhcmlhbmNlX2NvZWZmaWNpZW50cyh0Yl9wcm90ZWluX2V4cHQsIHhfYXhpcz0icHJlcGRhdGUiKQojI3RiX3ByZXBfY3YkZGlzcAoKdmlvIDwtIHBsb3RfYm94cGxvdChwcm90ZWluX2V4cHQsIHZpb2xpbj1UUlVFKQp2aW8KYGBgCgojIyBNZXRyaWNzIG9mIHRoZSBmaWx0cmF0ZSBkYXRhIHNldAoKT25jZSBhZ2FpbiwgaGVyZSB3ZSBoYXZlIG1ldHJpY3Mgb2YgdGhlIHN1YnNldCBkYXRhOyB0aGlzIHRpbWUgb2YgZmlsdHJhdGUgZGF0YS4KCmBgYHtyIHRiX2NmX21ldHJpY3MsIGZpZy5zaG93PSdoaWRlJ30KY2ZfbWV0cmljcyA8LSBzbShncmFwaF9tZXRyaWNzKGNmX2V4cHQpKQpjZl9ub3JtIDwtIHNtKG5vcm1hbGl6ZV9leHB0KGNmX2V4cHQsIHRyYW5zZm9ybT0ibG9nMiIsIGNvbnZlcnQ9ImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybT0icXVhbnQiLCBmaWx0ZXI9VFJVRSkpCmNmX25vcm1fbWV0cmljcyA8LSBzbShncmFwaF9tZXRyaWNzKGNmX25vcm0pKQpjZl9zdmEgPC0gc20obm9ybWFsaXplX2V4cHQoY2ZfZXhwdCwgdHJhbnNmb3JtPSJsb2cyIiwgY29udmVydD0iY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaD0ic3Zhc2VxIiwgZmlsdGVyPVRSVUUpKQpjZl9zdmFfbWV0cmljcyA8LSBzbShncmFwaF9tZXRyaWNzKGNmX3N2YSkpCgojIyBHZXQgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgZmlsdHJhdGUgZGF0YQpjZl9maWx0IDwtIG5vcm1hbGl6ZV9leHB0KGNmX2V4cHQsIGZpbHRlcj1UUlVFKQpzYW1wbGVfc3VtbWFyeSA8LSBzdW1tYXJ5KGV4cHJzKGNmX2ZpbHQpKQoKY2ZfcmVtYWluaW5nIDwtIG5vcm1hbGl6ZV9leHB0KGNmX2V4cHQsIGZpbHRlcj0iY2JjYiIpCnBsb3RfZGVuc2l0eShjZl9yZW1haW5pbmcpJHBsb3QKa2VlcGVyX2lkcyA8LSByb3duYW1lcyhleHBycyhjZl9yZW1haW5pbmcpKQoiUnYxNzQ2IiAlaW4lIHJvd25hbWVzKGV4cHJzKGNmX3JlbWFpbmluZykpCiJSdjMwMTljIiAlaW4lIHJvd25hbWVzKGV4cHJzKGNmX3JlbWFpbmluZykpCgpjaGFuZ2VkX2lkcyA8LSBjKCJzMjAxOF8wNTAyQnJpa2VuRElBMDQiLCAiczIwMThfMDgxN0JyaWtlblRyeXBzaW5ESUEwNCIsICJzMjAxOF8wNTAyQnJpa2VuRElBMDUiLAogICAgICAgICAgICAgICAgICJzMjAxOF8wNzI2QnJpa2VuMDUiLCAiczIwMThfMDgxN0JyaWtlblRyeXBzaW5ESUEwNSIsICJzMjAxOF8wNTAyQnJpa2VuRElBMDYiLAogICAgICAgICAgICAgICAgICJzMjAxOF8wNzI2QnJpa2VuMDYiLCAiczIwMThfMDgxN0JyaWtlblRyeXBzaW5ESUEwNiIsICJzMjAxOF8wNTAyQnJpa2VuRElBMDEiLAogICAgICAgICAgICAgICAgICJzMjAxOF8wODE3QnJpa2VuVHJ5cHNpbkRJQTAxIiwgInMyMDE4XzA1MDJCcmlrZW5ESUEwMiIsICJzMjAxOF8wNzI2QnJpa2VuMDIiLAogICAgICAgICAgICAgICAgICJzMjAxOF8wODE3QnJpa2VuVHJ5cHNpbkRJQTAyIiwgInMyMDE4XzA1MDJCcmlrZW5ESUEwMyIsCiAgICAgICAgICAgICAgICAgInMyMDE4XzA4MTdCcmlrZW5Ucnlwc2luRElBMDMiKQpuZXdfZmFjdCA8LSByZXAoIm5vdF93dCIsIGxlbmd0aChjaGFuZ2VkX2lkcykpCnRlc3QgPC0gc2V0X2V4cHRfY29uZGl0aW9ucyhjZl9leHB0LCBmYWN0PW5ld19mYWN0LCBpZHM9Y2hhbmdlZF9pZHMpCmNmX21lcmdlZCA8LSBtZWFuX2J5X2Jpb3JlcGxpY2F0ZSh0ZXN0KQpgYGAKCm1lYW5fYnlfYmlvcmVwbGljYXRlKCkgZG9lcyB0aGUgZm9sbG93aW5nOgoKMS4gIEV4dHJhY3RzIHRoZSBleHByZXNzaW9uIG1hdHJpeC4KMi4gIEJhY2tmaWxscyBhbGwgMHMgd2l0aCBOQQozLiAgUGVyZm9ybXMgYSBjcG0gb24gdGhlIHJlc3VsdC4KNC4gIERvZXMgYSBtZWFuIG9mIGFsbCBub24tTkEgc2FtcGxlcyBieSBiaW9sb2dpY2FsIHJlcGxpY2F0ZS4KCiMgRXhhbWluZSB0aGUgbWVhbiBieSBiaW9yZXBsaWNhdGUgZGF0YQoKYGBge3IgYmlvcmVwbGljYXRlfQpjZl9tZXJnZWRfbm9ybSA8LSBub3JtYWxpemVfZXhwdChjZl9tZXJnZWQsIG5vcm09InF1YW50IiwgY29udmVydD0iY3BtIiwgZmlsdGVyPSJwb2ZhIiwgcD0wLjksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT0ibG9nMiIpCnBsb3RfcGNhKGNmX21lcmdlZF9ub3JtKSRwbG90CmBgYAoKIyMjIFNvbWV0aGluZyBmdW4gZm9yIE5hamliCgpgYGB7ciBwY2EzZH0KcGNhM2QgPC0gcGxvdF9wY2EoY2ZfbWVyZ2VkX25vcm0pCnBjYTNkJHBsb3QKc2lsbHkgPC0gcGxvdF8zZF9wY2EocGNhM2QpCnNpbGx5JHBsb3QKYGBgCgojIyBQbG90IHNvbWUgbWV0cmljcwoKSW4gdGhlIHByZXZpb3VzIGJsb2NrcywgSSBnZW5lcmF0ZWQgdGhlIG1ldHJpY3M7IGluIHRoaXMgYmxvY2sgSSB3aWxsIHByaW50IHRoZW0Kd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IHNvbWUgb2YgdGhlbSB3aWxsIGVuZCB1cCBiZWluZyBpbmNsdWRlZCBpbiB3aGF0ZXZlcgpwdWJsaWNhdGlvbiBjb21lcyBmcm9tIHRoaXMgd29yazsgd2l0aCB0aGF0IGluIG1pbmQgSSBzaG91bGQgcHJvYmFibHkgY2hhbmdlCnRoaXMgdG8gc3ZhIG9yIHBkZiBvciBzb21ldGhpbmcgbm90IHBuZy4KCmBgYHtyIHRiX3ByaW50X21ldHJpY3N9CnBwKGltYWdlPXByb3RlaW5fbWV0cmljcyRsaWJzaXplLAogICBmaWxlPWZpbGUucGF0aCgiaW1hZ2VzIiwgcGFzdGUwKHJ1bmRhdGUsICJfbGlic2l6ZS5wZGYiKSkpCiMjIEl0IHNlZW1zIHRvIG1lIHRoYXQgdGhlIHNjYWxlIG9mIHRoZSBkYXRhIGlzIGFsbCB3aXRoaW4gYW4gb3JkZXIgb2YgbWFnbml0dWRlIG9yIHR3by4KIyMgSSBjYW5ub3QgZ2V0IHVzZWQgdG8gdGhlc2UgYWJzdXJkbHkgbGFyZ2UgbnVtYmVycyB0aG91Z2guCnBwKGltYWdlPXByb3RlaW5fbm9ybV9tZXRyaWNzJHBjYXBsb3QsCiAgIGZpbGU9ZmlsZS5wYXRoKCJpbWFnZXMiLCBwYXN0ZTAocnVuZGF0ZSwgIl9ub3JtX3BjYS5wZGYiKSkpCiMjIFRoZXJlIGFwcGVhcnMgdG8gYmUgYSBuaWNlIHNwbGl0IGluIHRoZSBkYXRhLCBob3dldmVyIHRoZSB1bi1hc3NheWFibGUgYmF0Y2gKIyMgZWZmZWN0IGlzIGEgcHJvYmxlbS4KcHAoaW1hZ2U9cHJvdGVpbl9ub3JtX21ldHJpY3MkcGNhcGxvdCwKICAgZmlsZT1maWxlLnBhdGgoImltYWdlcyIsIHBhc3RlMChydW5kYXRlLCAiX2ZzdmFfcGNhLnBkZmciKSkpCiMjIGZzdmEgc2VlbXMgdG8gZ2V0IHNvbWUgaGFuZGxlIG9uIHRoZSBkYXRhLCBidXQgSSBkb24ndCB0aGluayB3ZSBzaG91bGQgcmVseQojIyB1cG9uIGl0LgpwcChpbWFnZT1wcm90ZWluX25vcm1fbWV0cmljcyRjb3JoZWF0LAogICBmaWxlPWZpbGUucGF0aCgiaW1hZ2VzIiwgcGFzdGUwKHJ1bmRhdGUsICJfbm9ybV9jb3JoZWF0LnBkZiIpKSkKIyMgT25jZSBhZ2FpbiwgdGhlIHdob2xlLWNlbGwvY3VsdHVyZS1maWx0cmF0ZSBzcGxpdCBpcyB2ZXJ5IGxhcmdlLgpwcChpbWFnZT1wcm90ZWluX21ldHJpY3MkZGVuc2l0eSwKICAgZmlsZT1maWxlLnBhdGgoImltYWdlcyIsIHBhc3RlMChydW5kYXRlLCAiX3Jhd19kZW5zaXR5LnBkZiIpKSkKIyMgVGhlcmUgYXJlIHR3byBvYnZpb3VzIGRpc3RyaWJ1dGlvbnMgaW4gdGhlIGRhdGEsIG9uY2UgYWdhaW4gc3BsaXQgYmV0d2VlbiB0eXBlcy4KcHAoaW1hZ2U9cHJvdGVpbl9tZXRyaWNzJGJveHBsb3QsCiAgIGZpbGU9ZmlsZS5wYXRoKCJpbWFnZXMiLCBwYXN0ZTAocnVuZGF0ZSwgIl9ib3hwbG90LnBkZiIpKSkKIyMgVGhpcyByZWNhcGl0dWxhdGVzIHRoZSBwcmV2aW91cyBwbG90LgoKcHAoaW1hZ2U9d2hvbGVfbWV0cmljcyRsaWJzaXplLAogICBmaWxlPWZpbGUucGF0aCgiaW1hZ2VzIiwgcGFzdGUwKHJ1bmRhdGUsICJfd2hvbGVfbGlic2l6ZS5wZGYiKSkpCnBwKGltYWdlPXdob2xlX25vcm1fbWV0cmljcyRwY2FwbG90LAogICBmaWxlPWZpbGUucGF0aCgiaW1hZ2VzIiwgcGFzdGUwKHJ1bmRhdGUsICJfd2hvbGVfbm9ybV9wY2EucGRmIikpKQpwcChpbWFnZT13aG9sZV9zdmFfbWV0cmljcyRwY2FwbG90LAogICBmaWxlPWZpbGUucGF0aCgiaW1hZ2VzIiwgcGFzdGUwKHJ1bmRhdGUsICJfd2hvbGVfZnN2YV9wY2EucGRmIikpKQpwcChpbWFnZT13aG9sZV9ub3JtX21ldHJpY3MkY29yaGVhdCwKICAgZmlsZT1maWxlLnBhdGgoImltYWdlcyIsIHBhc3RlMChydW5kYXRlLCAiX3dob2xlX25vcm1fY29yaGVhdC5wZGYiKSkpCnBwKGltYWdlPXdob2xlX21ldHJpY3MkZGVuc2l0eSwKICAgZmlsZT1maWxlLnBhdGgoImltYWdlcyIsIHBhc3RlMChydW5kYXRlLCAiX3dob2xlX3Jhd19kZW5zaXR5LnBkZiIpKSkKcHAoaW1hZ2U9d2hvbGVfbWV0cmljcyRib3hwbG90LAogICBmaWxlPWZpbGUucGF0aCgiaW1hZ2VzIiwgcGFzdGUwKHJ1bmRhdGUsICJfd2hvbGVfYm94cGxvdC5wZGYiKSkpCgpwcChpbWFnZT1jZl9tZXRyaWNzJGxpYnNpemUsCiAgIGZpbGU9ZmlsZS5wYXRoKCJpbWFnZXMiLCBwYXN0ZTAocnVuZGF0ZSwgIl9saWJzaXplLnBkZiIpKSkKcHAoaW1hZ2U9Y2Zfbm9ybV9tZXRyaWNzJHBjYXBsb3QsCiAgIGZpbGU9ZmlsZS5wYXRoKCJpbWFnZXMiLCBwYXN0ZTAocnVuZGF0ZSwgIl9ub3JtX3BjYS5wZGYiKSkpCnBwKGltYWdlPWNmX3N2YV9tZXRyaWNzJHBjYXBsb3QsCiAgIGZpbGU9ZmlsZS5wYXRoKCJpbWFnZXMiLCBwYXN0ZTAocnVuZGF0ZSwgIl9mc3ZhX3BjYS5wZGYiKSkpCnBwKGltYWdlPWNmX25vcm1fbWV0cmljcyRjb3JoZWF0LAogICBmaWxlPWZpbGUucGF0aCgiaW1hZ2VzIiwgcGFzdGUwKHJ1bmRhdGUsICJfbm9ybV9jb3JoZWF0LnBkZiIpKSkKcHAoaW1hZ2U9Y2ZfbWV0cmljcyRkZW5zaXR5LAogICBmaWxlPWZpbGUucGF0aCgiaW1hZ2VzIiwgcGFzdGUwKHJ1bmRhdGUsICJfcmF3X2RlbnNpdHkucGRmIikpKQpwcChpbWFnZT1jZl9tZXRyaWNzJGJveHBsb3QsCiAgIGZpbGU9ZmlsZS5wYXRoKCJpbWFnZXMiLCBwYXN0ZTAocnVuZGF0ZSwgIl9ib3hwbG90LnBkZiIpKSkKYGBgCgojIFBlcmZvcm0gaHBnbHRvb2xzIERpZmZlcmVudGlhbCBFeHByZXNzaW9uIEFuYWx5c2VzCgpFYXJsaWVyIE1Tc3RhdHMgd2FzIHVzZWQgdG8gY29udHJhc3QgdGhlIHZhcmlvdXMgY29uZGl0aW9ucyBpbiB0aGlzIGRhdGEuICBJbgp0aGlzIGJsb2NrIHRoZSBzYW1lIHdpbGwgYmUgcGVyZm9ybWVkIHVzaW5nIHRoZSBsaW1tYS9kZXNlcS9lZGdlci9lYnNlcS9iYXNpYwptZXRob2RzLiAgQXMgYW4gYXNpZGUsIHJ1bm5pbmcgYWxsIG9mIHRoZXNlIG1ldGhvZHMgaW4gc2VyaWFsIHRha2VzIH4gMS81dGggdGhlCnRpbWUgb2YgcnVubmluZyBhbnkgb25lIHN0ZXAgb2YgTVNzdGF0cy4KCiMjIElkZWEgZnJvbSBWb2xrZXIKCkdpdmVuIHRoZSBpbml0aWFsIHBhaXJ3aXNlIGRhdGEsIGxvb2sgYXQgd3QgZWRnZVIgcmVzdWx0cyByYXRpbwpmaWx0cmF0ZS9jdWx0dXJlOyB0aGVuIHNldCBhIGN1dG9mZiBhcyBsb2cyZmMgPD0gMC43NS4gIFByb3RlaW5zIHdoaWNoIHN1cnZpdmUKdGhpcyBjdXRvZmYgYXJlIHRoZW4gdXNlZCBpbiB0aGUgcmF0aW8gb2YgcmF0aW9zIGFuZCBhbmFseXNlcyBvZiBtdXRhbnQvd3QuCgpUaGUgc3Vydml2b3JzIG9mIHRoaXMgaW5pdGlhbCBjdXRvZmYgaXMgdGhlIHNldCBvZiBzZWNyZXRlZCBwcm90ZWlucy4KQ29tcGFyZSB0aGlzIHNldCB3aXRoIHRoZSBzZXQgb2Yga25vd24gc2VjcmV0ZWQgcHJvdGVpbnMgZnJvbSBvdGhlciBwYXBlcnMKKENveCkuICBBbHNvIENvbGxpbnMsIEFiZXNvbCAobGlrZWx5IHNhbWUgYXMgdGhlIHN5bnRoZXRpYyBNdGIgbGlicmFyeSkuCgpTZXBhcmF0ZSwgc2ltdWx0YW5lb3VzIGZpbHRlcjogIExvb2sgYXQgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgY3VsdHVyZSBmaWx0cmF0ZQpkYXRhIGFuZCBmaWx0ZXIgb3V0IHRoZSAocmVsYXRpdmVseSkgbG93LWludGVuc2l0eSBidW1wLiAgVGhlbiB0YWtlIHRoZQpzdXJ2aXZpbmcgc2V0IGFuZCBwZXJmb3JtIGFsbCBhbmFseXNlcyB3aXRoIGl0LiAgSW4gdGhlb3J5LCB0aGVzZSB0d28gZmlsdGVyCm1ldGhvZHMgc2hvdWxkIGdldCB1cyB0byBhIHNpbWlsYXIgcGxhY2UuCgojIyBsZmMgY3V0b2ZmIGN1dG9mZgoKQXMgbWVudGlvbmVkIGJlbG93LCBWb2xrZXIgaGFkIGFuIGludGVyZXN0aW5nIGN1dG9mZiBzdWdnZXN0aW9uOiBrZWVwIG9ubHkgdGhvc2UKd2l0aCBsZmMgPj0gMC43NSBmaWx0cmF0ZS93aG9sZQoKYGBge3IgbGZjX2ZpbHRlcn0KbGZjX2lucHV0IDwtIGV4Y2x1ZGVfZ2VuZXNfZXhwdChwcm90ZWluX2V4cHQsIG1ldGhvZD0ia2VlcCIsIGlkcz1rZWVwZXJfaWRzKQp0ZXN0IDwtIGVkZ2VyX3BhaXJ3aXNlKGxmY19pbnB1dCkKcXVlcnkgPC0gdGVzdFtbImFsbF90YWJsZXMiXV1bWyJ3dF93aG9sZV92c193dF9maWx0cmF0ZSJdXQojIyBUaGlzIG9uZSBvZiBjb3Vyc2UgcHV0IHRoZSBkZXNpcmVkIGZhY3RvciBvbiB0aGUgYm90dG9tLCBzbyBJIHdpbGwgbG9vayBmb3IgbGZjIDw9IC0wLjc1CmxmY19rZWVwZXJfaWR4IDwtIHF1ZXJ5W1sibG9nRkMiXV0gPD0gLTAuNzUKbGZjX2tlZXBlcl9pZHMgPC0gcm93bmFtZXMocXVlcnlbbGZjX2tlZXBlcl9pZHgsIF0pCgojIyBrZWVwZXJfaWRzIGlzIGNvbXByaXNlZCBvZiBhbGwgdGhlIGZpbHRyYXRlIElEcwp0ZXN0X3Zlbm5fbHN0IDwtIGxpc3QoImZpbHRyYXRlIiA9IGtlZXBlcl9pZHMsCiAgICAgICAgICAgICAgICAgICAgICAibGZjX3NpZyIgPSBsZmNfa2VlcGVyX2lkcykKdGVzdF92ZW5uIDwtIFZlbm5lcmFibGU6OlZlbm4oU2V0cz10ZXN0X3Zlbm5fbHN0KQpWZW5uZXJhYmxlOjpwbG90KHRlc3RfdmVubikKYGBgCgpgYGB7ciBjb21wcmVzc2VkX2RlLCBmaWcuc2hvdz0iaGlkZSJ9CiMjIEhlcmUgSSBwZXJmb3JtIHRoZSBzYW1lIGN1dG9mZiBhcyBzaG93biBpbiB0aGUgZGVuc2l0eSBwbG90cyBhYm92ZS4KIyMga2VlcGVyX2lkcyBjb21lcyBmcm9tIHNlY3Rpb24gJ3RiX2NmX21ldHJpY3MnIGZvbGxvd2luZyBmaWx0ZXJpbmcgb2YgdGhlIGZpbHRyYXRlIGRhdGEuCmlucHV0IDwtIGV4Y2x1ZGVfZ2VuZXNfZXhwdChwcm90ZWluX2V4cHQsIG1ldGhvZD0ia2VlcCIsIGlkcz1rZWVwZXJfaWRzKQpsZmNfY3V0b2ZmX2lucHV0IDwtIGV4Y2x1ZGVfZ2VuZXNfZXhwdChwcm90ZWluX2V4cHQsIG1ldGhvZD0ia2VlcCIsIGlkcz1sZmNfa2VlcGVyX2lkcykKCmZpbHRlcl9kZSA8LSBzbShhbGxfcGFpcndpc2UoCiAgaW5wdXQsIG1vZGVsX2JhdGNoPUZBTFNFLCBmb3JjZT1UUlVFLAogIGRvX2Vic2VxPVRSVUUsIHBhcmFsbGVsPUZBTFNFKSkKbGZjX2ZpbHRlcl9kZSA8LSBzbShhbGxfcGFpcndpc2UoCiAgbGZjX2N1dG9mZl9pbnB1dCwgbW9kZWxfYmF0Y2g9RkFMU0UsIGZvcmNlPVRSVUUsCiAgZG9fZWJzZXE9VFJVRSwgcGFyYWxsZWw9RkFMU0UpKQojIyBJbnRlcmVzdGluZywgd2hlbiBJIHJ1biB0aGlzIGludGVyYWN0aXZlbHksIG5vIGVycm9yLCBidXQgaXQgYXBwZWFycyB0aGF0IHRoZSByZXBvcnQKIyMgaGFkIHByb2JsZW1zIHdpdGggaXQuCmV4dHJhIDwtICJkZWx0YV9jZndob2xlX3ZzX3d0X2Nmd2hvbGU9KGRlbHRhX2ZpbHRyYXRlLWRlbHRhX3dob2xlKS0od3RfZmlsdHJhdGUtd3Rfd2hvbGUpIgpleHRyYV9maWx0ZXJfZGUgPC0gc20oYWxsX3BhaXJ3aXNlKAogIGlucHV0LCBtb2RlbF9iYXRjaD1GQUxTRSwgZm9yY2U9VFJVRSwKICBkb19lYnNlcT1UUlVFLCBwYXJhbGxlbD1GQUxTRSwKICBleHRyYV9jb250cmFzdHM9ZXh0cmEpKQpleHRyYV9sZmNfZmlsdGVyX2RlIDwtIHNtKGFsbF9wYWlyd2lzZSgKICBsZmNfY3V0b2ZmX2lucHV0LCBtb2RlbF9iYXRjaD1GQUxTRSwgZm9yY2U9VFJVRSwKICBkb19lYnNlcT1UUlVFLCBwYXJhbGxlbD1GQUxTRSwKICBleHRyYV9jb250cmFzdHM9ZXh0cmEpKQoKZXh0cmFfa2VlcGVycyA8LSBsaXN0KAogICJ3dF9jZndob2xlIiA9IGMoInd0X2ZpbHRyYXRlIiwgInd0X3dob2xlIiksCiAgImRlbHRhX2Nmd2hvbGUiID0gYygiZGVsdGFfZmlsdHJhdGUiLCAiZGVsdGFfd2hvbGUiKSwKICAid2hvbGVfZGVsdGF3dCIgPSBjKCJkZWx0YV93aG9sZSIsICJ3dF93aG9sZSIpLAogICJjZl9kZWx0YXd0IiA9IGMoImRlbHRhX2ZpbHRyYXRlIiwgInd0X2ZpbHRyYXRlIiksCiAgInJvZnIiID0gYygiZGVsdGFfY2Z3aG9sZSIsICJ3dF9jZndob2xlIikpCgphbGxfY29udHJhc3RfZmlsZSA8LSBnbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX1fY29tYmluZWRfY29udHJhc3RzX2FsbC12e3Zlcn0ueGxzeCIpCmV4dHJhX2ZpbHRlcl90YWJsZXMgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgZXh0cmFfZmlsdGVyX2RlLAogIGtlZXBlcnM9ZXh0cmFfa2VlcGVycywKICBleGNlbD1hbGxfY29udHJhc3RfZmlsZSkKCmxmY19maWx0X2NvbnRyYXN0X2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2NvbWJpbmVkX2NvbnRyYXN0c19wcmVmaWx0ZXJlZC12e3Zlcn0ueGxzeCIpCiAgZXh0cmFfbGZjX2ZpbHRlcl90YWJsZXMgPC0gc20oY29tYmluZV9kZV90YWJsZXMoCiAgZXh0cmFfbGZjX2ZpbHRlcl9kZSwKICBrZWVwZXJzPWV4dHJhX2tlZXBlcnMsCiAgZXhjZWw9bGZjX2ZpbHRfY29udHJhc3RfZmlsZSkpCgojIyBGSVhNRToKIyMgTm8taW50ZW5zaXR5IGZpbHRlcmVkIGFsbCBjb250cmFzdHMgZGF0YTogIHtydW5kYXRlfV9jb21iaW5lZF9jb250cmFzdHMte3ZlcnNpb259Lnhsc3gKIyMgTG93LWludGVuc2l0eSBmaWx0ZXJlZCBhbGwgY29udHJhc3RzIGRhdGE6IHtydW5kYXRlfV9jb21iaW5lZF9jb250cmFzdHNfbGkte3ZlcnNpb259Lnhsc3gKIyMgRm9yIGVhY2ggb2YgdGhlc2UsIGhhdmUgc2lnbmlmaWNhbmNlIGZpbHRlcnM6IDIuMCBhbmQgMC43NQojIyAgIHtydW5kYXRlfV9jb21iaW5lZF9jb250cmFzdHNfbGlfbGZjMi4wLXt2ZXJzaW9ufS54bHN4CiMjICAge3J1bmRhdGV9X2NvbWJpbmVkX2NvbnRyYXN0c19saV9sZmMwLjc1LXt2ZXJzaW9ufS54bHN4CiMjIE5vdGUgdG8gc2VsZiwgSSBlZmZlZCB0aGlzIHVwIGFuZCB0aGVzZSBhcmUgbm90IHByb3Blcmx5IG5hbWVkIGJlbG93LgojIyBBbHNvLCBjaGFuZ2UgdGhlc2UgdG8gMTAlIGFkanVzdGVkIEZEUi4KCnNpZ19maWxlIDwtIGdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV9zaWdsZmMwLjc1X3Byb3RlaW5zX2FsbC12e3Zlcn0ueGxzeCIpCmV4dHJhX2ZpbHRlcl9zaWcgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICBleHRyYV9maWx0ZXJfdGFibGVzLCBhY2NvcmRpbmdfdG89ImVkZ2VyIiwKICBsZmM9MC43NSwgcD0wLjEwLAogIGV4Y2VsPXNpZ19maWxlKQoKbm9wX3NpZ19maWxlIDwtIGdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV9zaWdsZmMwLjc1bm9wX3Byb3RlaW5zX2FsbC12e3Zlcn0ueGxzeCIpCmV4dHJhX2ZpbHRlcl9zaWcgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICBleHRyYV9maWx0ZXJfdGFibGVzLCBhY2NvcmRpbmdfdG89ImVkZ2VyIiwKICBsZmM9MC43NSwgcD0xLjAsCiAgZXhjZWw9c2lnX2ZpbGUpCgpzaWdfZmlsZSA8LSBnbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX1fc2lnbGZjMC43NV9wcm90ZWluc19wcmVmaWx0ZXJlZC12e3Zlcn0ueGxzeCIpCmV4dHJhX2xmY19maWx0ZXJfc2lnIDwtIHNtKGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgZXh0cmFfbGZjX2ZpbHRlcl90YWJsZXMsIGFjY29yZGluZ190bz0iZWRnZXIiLAogIGxmYz0wLjc1LCBwPTAuMTAsCiAgZXhjZWw9c2lnX2ZpbGUpKQoKbm9wX3NpZ19maWxlIDwtIGdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV9zaWdsZmMwLjc1bm9wX3Byb3RlaW5zX3ByZWZpbHRlcmVkLXZ7dmVyfS54bHN4IikKZXh0cmFfZmlsdGVyX3NpZyA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogIGV4dHJhX2xmY19maWx0ZXJfdGFibGVzLCBhY2NvcmRpbmdfdG89ImVkZ2VyIiwKICBsZmM9MC43NSwgcD0xLjAsCiAgZXhjZWw9c2lnX2ZpbGUpCmBgYAoKYGBge3IgcGxheV9kZSwgZXZhbD1GQUxTRX0KdGVzdF9saW1tYSA8LSBzbShsaW1tYV9wYWlyd2lzZShpbnB1dCwgbW9kZWxfYmF0Y2g9RkFMU0UsIGV4dHJhX2NvbnRyYXN0cz1leHRyYSkpCnRlc3RfZWRnZXIgPC0gc20oZWRnZXJfcGFpcndpc2UoaW5wdXQsIG1vZGVsX2JhdGNoPUZBTFNFLCBleHRyYV9jb250cmFzdHM9ZXh0cmEpKQp0ZXN0X2Rlc2VxIDwtIHNtKGRlc2VxX3BhaXJ3aXNlKGlucHV0LCBtb2RlbF9iYXRjaD1GQUxTRSwgZXh0cmFfY29udHJhc3RzPWV4dHJhLCBmb3JjZT1UUlVFKSkKdGVzdF9iYXNpYyA8LSBzbShiYXNpY19wYWlyd2lzZShpbnB1dCwgbW9kZWxfYmF0Y2g9RkFMU0UsIGV4dHJhX2NvbnRyYXN0cz1leHRyYSwgZm9yY2U9VFJVRSkpCnRlc3RfZWJzZXEgPC0gc20oZWJzZXFfcGFpcndpc2UoaW5wdXQsIG1vZGVsX2JhdGNoPUZBTFNFLCBleHRyYV9jb250cmFzdHM9ZXh0cmEsIGZvcmNlPVRSVUUpKQpgYGAKCiMjIyBTaG93IGEgZmV3IG1ldHJpY3MgZnJvbSB0aGUgaHBnbHRvb2xzIHBhaXJ3aXNlIGNvbXBhcmlzb25zCgpgYGB7ciBzaG93X2RlX3Rlc3Rpbmd9CnBwKGZpbGU9ImltYWdlcy9kZV9oZWF0LnBuZyIsIGltYWdlPWV4dHJhX2xmY19maWx0ZXJfZGUkY29tcGFyaXNvbiRoZWF0KQpleHRyYV9sZmNfZmlsdGVyX2RlJGNvbXBhcmlzb24kaGVhdApgYGAKCiMgRm9yIGVhY2ggbXNzdGF0cyBydW4sIGRvIGEgREUgdGFibGUKCiMjIHd0X2NmIHZzIHd0X3dob2xlCgpgYGB7ciB0Yl9jb21iaW5lX3d0Y2Zfd3R3aG9sZSwgZmlnLnNob3c9J2hpZGUnfQprZWVwZXJzIDwtIGxpc3QoCiAgInd0Y2ZfdnNfd3R3aG9sZSIgPSBjKCJ3dF9maWx0cmF0ZSIsICJ3dF93aG9sZSIpKQptc19zZXRfbmFtZSA8LSAid3RfZmlsdHJhdGVfdnNfd3Rfd2hvbGUiCm1zc3RhdHNfcmVzdWx0IDwtIG1zc3RhdHNfcmVzdWx0c1tbbXNfc2V0X25hbWVdXVtbIkNvbXBhcmlzb25SZXN1bHQiXV0KZHJvcHBlcnMgPC0gYygidW5kZWZpbmVkIikKbmFtZXMoZHJvcHBlcnMpIDwtICJsb2cyZmMiCiMjIE1ha2Ugc3VyZSB0byBzZXQgdGhlIHJvd25hbWVzIHNvIGl0IHdpbGwgbWVyZ2UgaW50byB0aGUgZXhjZWwgZmlsZS4Kcm93bmFtZXMobXNzdGF0c19yZXN1bHQpIDwtIG1zc3RhdHNfcmVzdWx0W1siUHJvdGVpbiJdXQpjb21iaW5lZF9maWxlIDwtIGdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV93dGNmX3ZzX3d0d2hvbGVfYWxsLXZ7dmVyfS54bHN4IikKd3RjZl9ub2JhdGNoX3d0d2hvbGVfdGFibGVzIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKAogIGV4dHJhX2xmY19maWx0ZXJfZGUsIGtlZXBlcnM9a2VlcGVycywgZXh0cmFfYW5ub3Q9bXNzdGF0c19yZXN1bHQsCiAgZXhjbHVkZXM9ZHJvcHBlcnMsCiAgZXhjZWw9Y29tYmluZWRfZmlsZSkpCmNvbXBfdGFibGUgPC0gd3RjZl9ub2JhdGNoX3d0d2hvbGVfdGFibGVzJGRhdGFbW25hbWVzKGtlZXBlcnMpXV0KY29yLnRlc3QoY29tcF90YWJsZSRsb2cyZmMsIGNvbXBfdGFibGUkZGVzZXFfbG9nZmMsIG1ldGhvZD0ic3BlYXJtYW4iKQpjb3IudGVzdChjb21wX3RhYmxlJGxvZzJmYywgY29tcF90YWJsZSRsaW1tYV9sb2dmYywgbWV0aG9kPSJzcGVhcm1hbiIpCmNvci50ZXN0KGNvbXBfdGFibGUkbG9nMmZjLCBjb21wX3RhYmxlJGVic2VxX2xvZ2ZjLCBtZXRob2Q9InNwZWFybWFuIikKc2lnX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X3d0Y2ZfdnNfd3R3aG9sZV9zaWdsZmMwLjc1X3Byb3RlaW5zX2FsbC12e3Zlcn0ueGxzeCIpCnd0Y2Zfbm9iYXRjaF93dHdob2xlX3NpZyA8LSBzbShleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogIHd0Y2Zfbm9iYXRjaF93dHdob2xlX3RhYmxlcywgbGZjPTAuNzUsIHA9MC4xMCwKICBleGNlbD1zaWdfZmlsZSkpCmBgYAoKIyMgZGVsdGFfY2YgdnMgZGVsdGFfd2hvbGUKCmBgYHtyIHRiX2NvbWJpbmVfZGVsdGFjZl9kZWx0YXdob2xlLCBmaWcuc2hvdz0naGlkZSd9CmtlZXBlcnMgPC0gbGlzdCgKICAiZGVsdGFjZl92c19kZWx0YXdob2xlIiA9IGMoImRlbHRhX2ZpbHRyYXRlIiwgImRlbHRhX3dob2xlIikpCm1zX3NldF9uYW1lIDwtICJkZWx0YV9maWx0cmF0ZV92c19kZWx0YV93aG9sZSIKbXNzdGF0c19yZXN1bHQgPC0gbXNzdGF0c19yZXN1bHRzW1ttc19zZXRfbmFtZV1dW1siQ29tcGFyaXNvblJlc3VsdCJdXQojIyBNYWtlIHN1cmUgdG8gc2V0IHRoZSByb3duYW1lcyBzbyBpdCB3aWxsIG1lcmdlIGludG8gdGhlIGV4Y2VsIGZpbGUuCnJvd25hbWVzKG1zc3RhdHNfcmVzdWx0KSA8LSBtc3N0YXRzX3Jlc3VsdFtbIlByb3RlaW4iXV0KY29tYmluZWRfZmlsZSA8LSBnbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX1fZGVsdGFjZl92c19kZWx0YXdob2xlX2FsbC12e3Zlcn0ueGxzeCIpCmRlbHRhY2ZfZGVsdGF3aG9sZV90YWJsZXMgPC0gc20oY29tYmluZV9kZV90YWJsZXMoCiAgZXh0cmFfbGZjX2ZpbHRlcl9kZSwga2VlcGVycz1rZWVwZXJzLCBleHRyYV9hbm5vdD1tc3N0YXRzX3Jlc3VsdCwKICBleGNlbD1jb21iaW5lZF9maWxlKSkKY29tcF90YWJsZSA8LSBkZWx0YWNmX2RlbHRhd2hvbGVfdGFibGVzJGRhdGFbW25hbWVzKGtlZXBlcnMpXV0KY29yLnRlc3QoY29tcF90YWJsZSRsb2cyZmMsIGNvbXBfdGFibGUkZGVzZXFfbG9nZmMsIG1ldGhvZD0ic3BlYXJtYW4iKQp0dCA8LSBwbG90X2xpbmVhcl9zY2F0dGVyKGNvbXBfdGFibGVbLCBjKCJsb2cyZmMiLCAiZWRnZXJfbG9nZmMiKV0pCnR0JHNjYXR0ZXIKCnNpZ19maWxlIDwtIGdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV9kZWx0YWNmX3ZzX2RlbHRhd2hvbGVfc2lnbGZjMC43NV9wcm90ZWluc19hbGwtdnt2ZXJ9Lnhsc3giKQpkZWx0YWNmX2RlbHRhd2hvbGVfc2lnIDwtIHNtKGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgZGVsdGFjZl9kZWx0YXdob2xlX3RhYmxlcywgbGZjPTAuNzUsIHA9MC4xMCwKICBleGNlbD1zaWdfZmlsZSkpCmBgYAoKIyMgZGVsdGFfY2YgdnMgd3RfY2YKClNvbWV0aGluZyBpcyB3ZWlyZCBhYm91dCB0aGlzIHBhcnRpY3VsYXIgY29udHJhc3QsIEkga2VlcCBnZXR0aW5nIG5lZ2F0aXZlIGNvcnJlbGF0aW9ucyEKCmBgYHtyIHRiX2NvbWJpbmVfZGVsdGFjZl93dGNmLCBmaWcuc2hvdz0naGlkZSd9CmtlZXBlcnMgPC0gbGlzdCgKICAiZGVsdGFjZl92c193dGNmIiA9IGMoImRlbHRhX2ZpbHRyYXRlIiwgInd0X2ZpbHRyYXRlIikpCm1zX3NldF9uYW1lIDwtICJkZWx0YV9maWx0cmF0ZV92c193dF9maWx0cmF0ZSIKbXNzdGF0c19yZXN1bHQgPC0gbXNzdGF0c19yZXN1bHRzW1ttc19zZXRfbmFtZV1dW1siQ29tcGFyaXNvblJlc3VsdCJdXQpyb3duYW1lcyhtc3N0YXRzX3Jlc3VsdCkgPC0gbXNzdGF0c19yZXN1bHRbWyJQcm90ZWluIl1dCmNvbWJpbmVkX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2RlbHRhY2ZfdnNfd3RjZl9hbGwtdnt2ZXJ9Lnhsc3giKQpkZWx0YWNmX3d0Y2ZfdGFibGVzIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKAogIGV4dHJhX2xmY19maWx0ZXJfZGUsIGtlZXBlcnM9a2VlcGVycywgZXh0cmFfYW5ub3Q9bXNzdGF0c19yZXN1bHQsCiAgY29tYmluZWRfZmlsZSkpCgpjb21wX3RhYmxlIDwtIGRlbHRhY2Zfd3RjZl90YWJsZXMkZGF0YVtbbmFtZXMoa2VlcGVycyldXQpjb3IudGVzdChjb21wX3RhYmxlJGxvZzJmYywgY29tcF90YWJsZSRkZXNlcV9sb2dmYywgbWV0aG9kPSJzcGVhcm1hbiIpCmNvci50ZXN0KGNvbXBfdGFibGUkbG9nMmZjLCBjb21wX3RhYmxlJGxpbW1hX2xvZ2ZjLCBtZXRob2Q9InNwZWFybWFuIikKY29yLnRlc3QoY29tcF90YWJsZSRsb2cyZmMsIGNvbXBfdGFibGUkZWRnZXJfbG9nZmMsIG1ldGhvZD0ic3BlYXJtYW4iKQpjb3IudGVzdChjb21wX3RhYmxlJGxvZzJmYywgY29tcF90YWJsZSRlYnNlcV9sb2dmYywgbWV0aG9kPSJzcGVhcm1hbiIpCnNjYXR0ZXJfdGVzdCA8LSBwbG90X2xpbmVhcl9zY2F0dGVyKGNvbXBfdGFibGVbLCBjKCJsb2cyZmMiLCAibGltbWFfbG9nZmMiKV0pCnNjYXR0ZXJfdGVzdCRzY2F0dGVyCmZpbHRlcmVkX2lkeCA8LSAhIGlzLm5hKGNvbXBfdGFibGUkbG9nMmZjKQpjb21fdGFibGUgPC0gY29tcF90YWJsZVtmaWx0ZXJlZF9pZHgsIF0KbmVnX2luZl9pZHggPC0gY29tX3RhYmxlJGxvZzJmYyA9PSAtSW5mCmNvbV90YWJsZVtuZWdfaW5mX2lkeCwgImxvZzJmYyJdIDwtIC0xMDAKcG9zX2luZl9pZHggPC0gY29tX3RhYmxlJGxvZzJmYyA9PSBJbmYKY29tX3RhYmxlW3Bvc19pbmZfaWR4LCAibG9nMmZjIl0gPC0gMTAwCmNvci50ZXN0KGNvbV90YWJsZSRsb2cyZmMsIGNvbV90YWJsZSRkZXNlcV9sb2dmYykKc2NhdHRlcl90ZXN0IDwtIHBsb3RfbGluZWFyX3NjYXR0ZXIoY29tX3RhYmxlWywgYygibG9nMmZjIiwgImVkZ2VyX2xvZ2ZjIildKQoKc2lnX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2RlbHRhY2ZfdnNfd3RjZl9zaWdsZmMwLjc1X3Byb3RlaW5zX2FsbC12e3Zlcn0ueGxzeCIpCmRlbHRhY2Zfd3RjZl9zaWcgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICBkZWx0YWNmX3d0Y2ZfdGFibGVzLCBsZmM9MC43NSwgcD0wLjEwLAogIGV4Y2VsPXNpZ19maWxlKQpgYGAKCk9rLCBJIGhhdmUgYmVlbiByZXNpc3RpbmcgdGhpcywgYnV0IGxldHMgbG9vayBtb3JlIGNsb3NlbHkgYXQgdGhlIGRhdGEgZm9yIHRoaXMKY29udHJhc3QuCk9uZSB0aGluZyBJIGNhbiBkbyB0byBsb29rIGZvciBjb3JyZWN0bmVzcyBpbiB3aGF0IEkgYW0gc2VlaW5nIGlzIHRvIGxvb2sgYXQgdGhlCm1lYW4gbnVtZXJhdG9ycy9kZW5vbWluYXRvcnMgZm9yIHRoaXMgY29udHJhc3QgYW5kIHNlZSBpZiB0aGV5IGFncmVlIHdpdGgKbXNzdGF0cyBvciB0aGUgb3RoZXJzLgoKIyMgZGVsdGFfd2hvbGUgdnMgd3Rfd2hvbGUKCmBgYHtyIHRiX2NvbWJpbmVfZGVsdGF3aG9sZV93dHdob2xlLCBmaWcuc2hvdz0naGlkZSd9CmtlZXBlcnMgPC0gbGlzdCgKICAiZGVsdGF3aG9sZV92c193dHdob2xlIiA9IGMoImRlbHRhX3dob2xlIiwgInd0X3dob2xlIikpCm1zX3NldF9uYW1lIDwtICJkZWx0YV93aG9sZV92c193dF93aG9sZSIKbXNzdGF0c19yZXN1bHQgPC0gbXNzdGF0c19yZXN1bHRzW1ttc19zZXRfbmFtZV1dW1siQ29tcGFyaXNvblJlc3VsdCJdXQpyb3duYW1lcyhtc3N0YXRzX3Jlc3VsdCkgPC0gbXNzdGF0c19yZXN1bHRbWyJQcm90ZWluIl1dCmNvbWJpbmVkX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2RlbHRhd2hvbGVfdnNfd3R3aG9sZV9hbGwtdnt2ZXJ9Lnhsc3giKQpkZWx0YXdob2xlX3d0d2hvbGVfdGFibGVzIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKAogIGV4dHJhX2xmY19maWx0ZXJfZGUsIGtlZXBlcnM9a2VlcGVycywgZXh0cmFfYW5ub3Q9bXNzdGF0c19yZXN1bHQsCiAgZXhjZWw9Y29tYmluZWRfZmlsZSkpCmNvbXBfdGFibGUgPC0gZGVsdGF3aG9sZV93dHdob2xlX3RhYmxlcyRkYXRhW1tuYW1lcyhrZWVwZXJzKV1dCmNvci50ZXN0KGNvbXBfdGFibGUkbG9nMmZjLCBjb21wX3RhYmxlJGRlc2VxX2xvZ2ZjLCBtZXRob2Q9InNwZWFybWFuIikKc2lnX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2RlbHRhd2hvbGVfdnNfd3R3aG9sZV9zaWdsZmMwLjc1X3Byb3RlaW5zX2FsbC12e3Zlcn0ueGxzeCIpCmRlbHRhd2hvbGVfd3R3aG9sZV9zaWcgPC0gc20oZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICBkZWx0YXdob2xlX3d0d2hvbGVfdGFibGVzLCBsZmM9MC43NSwgcD0wLjEwLAogIGV4Y2VsPXNpZ19maWxlKSkKYGBgCgojIyBWZW5uIG9mIE1Tc3RhdHMgdnMuIG90aGVycyBmb3Igd3Qgd2hvbGUvY2YKCk5hamliIGFza2VkIGZvciB0aGUgb3ZlcmxhcCBpbiBwZXJjZWl2ZWQgc2lnbmlmaWNhbmNlLgoKYGBge3IgbXNzdGF0c19vdGhlcl92ZW5ufQpzdGFydCA8LSB3dGNmX25vYmF0Y2hfd3R3aG9sZV90YWJsZXNbWyJkYXRhIl1dW1sxXV0KbmFfaWR4IDwtIGlzLm5hKHN0YXJ0W1siYWRqcHZhbHVlIl1dKQpzdGFydFtuYV9pZHgsICJhZGpwdmFsdWUiXSA8LSAxCm1zX3NpZ19pZHggPC0gc3RhcnRbWyJhZGpwdmFsdWUiXV0gPD0gMC4wNQoKZGVfc2lnX2lkeCA8LSBzdGFydFtbImRlc2VxX2FkanAiXV0gPD0gMC4wNQplZF9zaWdfaWR4IDwtIHN0YXJ0W1siZWRnZXJfYWRqcCJdXSA8PSAwLjA1CmxtX3NpZ19pZHggPC0gc3RhcnRbWyJsaW1tYV9hZGpwIl1dIDw9IDAuMDUKZWJfc2lnX2lkeCA8LSBzdGFydFtbImVic2VxX3BwZWUiXV0gPD0gMC4wNQoKbXNfc2lnIDwtIHN0YXJ0W21zX3NpZ19pZHgsIF0KZGVfc2lnIDwtIHN0YXJ0W2RlX3NpZ19pZHgsIF0KZWRfc2lnIDwtIHN0YXJ0W2VkX3NpZ19pZHgsIF0KbG1fc2lnIDwtIHN0YXJ0W2xtX3NpZ19pZHgsIF0KZWJfc2lnIDwtIHN0YXJ0W2ViX3NpZ19pZHgsIF0KCm1ldGhvZF9sc3QgPC0gbGlzdCgKICAibXNzdGF0cyIgPSByb3duYW1lcyhtc19zaWcpLAogICJkZXNlcSIgPSByb3duYW1lcyhkZV9zaWcpLAogICJlZGdlciIgPSByb3duYW1lcyhlZF9zaWcpLAogICJsaW1tYSIgPSByb3duYW1lcyhsbV9zaWcpKQptZXRob2RfdmVubiA8LSBWZW5uZXJhYmxlOjpWZW5uKFNldHM9bWV0aG9kX2xzdCkKVmVubmVyYWJsZTo6cGxvdChtZXRob2RfdmVubiwgZG9XZWlnaHRzPUZBTFNFKQpgYGAKCiMgSW50ZXJzZWN0aW9ucwoKYGBge3IgaW50ZXJzZWN0fQpjaG9zZW5faW50ZXJzZWN0aW9uIDwtIGludGVyc2VjdF9zaWduaWZpY2FudCgKICB3dGNmX25vYmF0Y2hfd3R3aG9sZV90YWJsZXMsCiAgc2VsZWN0b3JzPWMoImxpbW1hIiwgIm1zc3RhdHMiKSwKICBmY19jb2x1bW49ImxvZzJmYyIsIHBfY29sdW1uPSJhZGpwdmFsdWUiLAogIGV4Y2VsPSJleGNlbC90ZXN0aW5nX2ludGVyc2VjdGlvbnNfdHdvLnhsc3giKQpjaG9zZW5faW50ZXJzZWN0aW9uIDwtIGludGVyc2VjdF9zaWduaWZpY2FudCgKICB3dGNmX25vYmF0Y2hfd3R3aG9sZV90YWJsZXMsCiAgc2VsZWN0b3JzPWMoImxpbW1hIiwgImVic2VxIiwgImRlc2VxIiksCiAgZmNfY29sdW1uPSJsb2cyZmMiLCBwX2NvbHVtbj0iYWRqcHZhbHVlIiwKICBleGNlbD0iZXhjZWwvdGVzdGluZ19pbnRlcnNlY3Rpb25zX3RocmVlLnhsc3giKQpjaG9zZW5faW50ZXJzZWN0aW9uIDwtIGludGVyc2VjdF9zaWduaWZpY2FudCgKICB3dGNmX25vYmF0Y2hfd3R3aG9sZV90YWJsZXMsCiAgc2VsZWN0b3JzPWMoImxpbW1hIiwgImVic2VxIiwgImRlc2VxIiwgImVkZ2VyIiksCiAgZmNfY29sdW1uPSJsb2cyZmMiLCBwX2NvbHVtbj0iYWRqcHZhbHVlIiwKICBleGNlbD0iZXhjZWwvdGVzdGluZ19pbnRlcnNlY3Rpb25zX2ZvdXIueGxzeCIpCmBgYAoKIyBPbnRvbG9neSB0ZXN0cwoKIyMgV3QgQ0YgdnMgV3Qgd2hvbGUKCmBgYHtyIG9udG9sb2d5d3RjZnd0d2hvbGV9Cm10Yl9nbyA8LSBsb2FkX21pY3JvYmVzb25saW5lX2dvKGlkPTgzMzMyLCBpZF9jb2x1bW49InN5c05hbWUiKQpoZWFkKG10Yl9nbykKY29sbmFtZXMobXRiX2dvKSA8LSBjKCJJRCIsICJHTyIpCm10Yl9sZW5ndGhzIDwtIG10Yl9hbm5vdGF0aW9uc1ssIGMoIklEIiwgIndpZHRoIildCgojIyBXaGF0IHNldHMgb2YgZ2VuZXMgdG8gcGVyZm9ybSBnb3NlcSBvbj8KIyMgQXJiaXRyYXJ5IGRlY2lzaW9uIHRpbWUsIGxldHMgdXNlIGRlc2VxIGRhdGEgZm9yIGVhY2ggY29udHJhc3QsIG9uY2Ugd2l0aG91dCBzdmEsIG9uY2Ugd2l0aC4Kd3RjZl93dHdob2xlX3VwIDwtIHd0Y2Zfbm9iYXRjaF93dHdob2xlX3NpZ1tbImRlc2VxIl1dW1sidXBzIl1dW1sxXV0Kd3RjZl93dHdob2xlX3VwX2dvc2VxX25iIDwtIHNpbXBsZV9nb3NlcSgKICBzaWdfZ2VuZXM9d3RjZl93dHdob2xlX3VwLCBnb19kYj1tdGJfZ28sIGxlbmd0aF9kYj1tdGJfbGVuZ3RocywKICBleGNlbD1wYXN0ZTAoImV4Y2VsL3d0Y2Zfd3R3aG9sZV91cF9kZXNlcV9ub2JhdGNoX2dvc2VxLXYiLCB2ZXIsICIueGxzeCIpKQp3dGNmX3d0d2hvbGVfdXBfZ29zZXFfbmIkcHZhbHVlX3Bsb3RzW1sxXV0KCnd0Y2Zfd3R3aG9sZV9kb3duIDwtIHd0Y2Zfbm9iYXRjaF93dHdob2xlX3NpZ1tbImRlc2VxIl1dW1siZG93bnMiXV1bWzFdXQp3dGNmX3d0d2hvbGVfZG93bl9nb3NlcV9uYiA8LSBzaW1wbGVfZ29zZXEoCiAgc2lnX2dlbmVzPXd0Y2Zfd3R3aG9sZV9kb3duLCBnb19kYj1tdGJfZ28sIGxlbmd0aF9kYj1tdGJfbGVuZ3RocywKICBleGNlbD1wYXN0ZTAoImV4Y2VsL3d0Y2Zfd3R3aG9sZV9kb3duX2Rlc2VxX25vYmF0Y2hfZ29zZXEtdiIsIHZlciwgIi54bHN4IikpCnd0Y2Zfd3R3aG9sZV9kb3duX2dvc2VxX25iJHB2YWx1ZV9wbG90c1tbMV1dCmBgYAoKIyMgZGVsdGEgQ0YgdnMgZGVsdGEgd2hvbGUKCmBgYHtyIG9udG9sb2d5X2RjZl9kd2hvbGV9CmRlbHRhY2ZfZGVsdGF3aG9sZV91cCA8LSBkZWx0YWNmX2RlbHRhd2hvbGVfc2lnW1siZGVzZXEiXV1bWyJ1cHMiXV1bWzFdXQpkZWx0YWNmX2RlbHRhd2hvbGVfdXBfZ29zZXFfbmIgPC0gc2ltcGxlX2dvc2VxKAogIHNpZ19nZW5lcz1kZWx0YWNmX2RlbHRhd2hvbGVfdXAsIGdvX2RiPW10Yl9nbywgbGVuZ3RoX2RiPW10Yl9sZW5ndGhzLAogIGV4Y2VsPXBhc3RlMCgiZXhjZWwvZGVsdGFjZl9kZWx0YXdob2xlX3VwX2Rlc2VxX25vYmF0Y2hfZ29zZXEtdiIsIHZlciwgIi54bHN4IikpCmRlbHRhY2ZfZGVsdGF3aG9sZV91cF9nb3NlcV9uYiRwdmFsdWVfcGxvdHNbWzFdXQoKZGVsdGFjZl9kZWx0YXdob2xlX2Rvd24gPC0gZGVsdGFjZl9kZWx0YXdob2xlX3NpZ1tbImRlc2VxIl1dW1siZG93bnMiXV1bWzFdXQpkZWx0YWNmX2RlbHRhd2hvbGVfZG93bl9nb3NlcV9uYiA8LSBzaW1wbGVfZ29zZXEoCiAgc2lnX2dlbmVzPWRlbHRhY2ZfZGVsdGF3aG9sZV9kb3duLCBnb19kYj1tdGJfZ28sIGxlbmd0aF9kYj1tdGJfbGVuZ3RocywKICBleGNlbD1wYXN0ZTAoImV4Y2VsL2RlbHRhY2ZfZGVsdGF3aG9sZV9kb3duX2Rlc2VxX25vYmF0Y2hfZ29zZXEtdiIsIHZlciwgIi54bHN4IikpCmRlbHRhY2ZfZGVsdGF3aG9sZV9kb3duX2dvc2VxX25iJHB2YWx1ZV9wbG90c1tbMV1dCmBgYAoKIyMgZGVsdGEgZmlsdHJhdGUgdnMgd3QgZmlsdHJhdGUKCmBgYHtyIG9udG9sb2d5X2RjZl93dGNmfQpkZWx0YWNmX3d0Y2ZfdXAgPC0gZGVsdGFjZl93dGNmX3NpZ1tbImRlc2VxIl1dW1sidXBzIl1dW1sxXV0KZGVsdGFjZl93dGNmX3VwX2dvc2VxX25iIDwtIHNpbXBsZV9nb3NlcSgKICBzaWdfZ2VuZXM9ZGVsdGFjZl93dGNmX3VwLCBnb19kYj1tdGJfZ28sIGxlbmd0aF9kYj1tdGJfbGVuZ3RocywKICBleGNlbD1wYXN0ZTAoImV4Y2VsL2RlbHRhY2Zfd3RjZl91cF9kZXNlcV9ub2JhdGNoX2dvc2VxLXYiLCB2ZXIsICIueGxzeCIpKQpkZWx0YWNmX3d0Y2ZfdXBfZ29zZXFfbmIkcHZhbHVlX3Bsb3RzW1sxXV0KCmRlbHRhY2Zfd3RjZl9kb3duIDwtIGRlbHRhY2Zfd3RjZl9zaWdbWyJkZXNlcSJdXVtbImRvd25zIl1dW1sxXV0KZGVsdGFjZl93dGNmX2Rvd25fZ29zZXFfbmIgPC0gc2ltcGxlX2dvc2VxKAogIHNpZ19nZW5lcz1kZWx0YWNmX3d0Y2ZfZG93biwgZ29fZGI9bXRiX2dvLCBsZW5ndGhfZGI9bXRiX2xlbmd0aHMsCiAgZXhjZWw9cGFzdGUwKCJleGNlbC9kZWx0YWNmX3d0Y2ZfZG93bl9kZXNlcV9ub2JhdGNoX2dvc2VxLXYiLCB2ZXIsICIueGxzeCIpKQpkZWx0YWNmX3d0Y2ZfZG93bl9nb3NlcV9uYiRwdmFsdWVfcGxvdHNbWzFdXQpgYGAKCiMjIGRlbHRhIHdob2xlIHZzIHd0IHdob2xlCgpgYGB7ciBvbnRvbG9neV9kd2hvbGVfd3R3aG9sZX0KZGVsdGF3aG9sZV93dHdob2xlX3VwIDwtIGRlbHRhd2hvbGVfd3R3aG9sZV9zaWdbWyJkZXNlcSJdXVtbInVwcyJdXVtbMV1dCmRlbHRhd2hvbGVfd3R3aG9sZV91cF9nb3NlcV9uYiA8LSBzaW1wbGVfZ29zZXEoCiAgc2lnX2dlbmVzPWRlbHRhd2hvbGVfd3R3aG9sZV91cCwgZ29fZGI9bXRiX2dvLCBsZW5ndGhfZGI9bXRiX2xlbmd0aHMsCiAgZXhjZWw9cGFzdGUwKCJleGNlbC9kZWx0YXdob2xlX3d0d2hvbGVfdXBfZGVzZXFfbm9iYXRjaF9nb3NlcS12IiwgdmVyLCAiLnhsc3giKSkKZGVsdGF3aG9sZV93dHdob2xlX3VwX2dvc2VxX25iJHB2YWx1ZV9wbG90c1tbMV1dCgpkZWx0YXdob2xlX3d0d2hvbGVfZG93biA8LSBkZWx0YXdob2xlX3d0d2hvbGVfc2lnW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbMV1dCmRlbHRhd2hvbGVfd3R3aG9sZV9kb3duX2dvc2VxX25iIDwtIHNpbXBsZV9nb3NlcSgKICBzaWdfZ2VuZXM9ZGVsdGF3aG9sZV93dHdob2xlX2Rvd24sIGdvX2RiPW10Yl9nbywgbGVuZ3RoX2RiPW10Yl9sZW5ndGhzLAogIGV4Y2VsPXBhc3RlMCgiZXhjZWwvZGVsdGF3aG9sZV93dHdob2xlX2Rvd25fZGVzZXFfbm9iYXRjaF9nb3NlcS12IiwgdmVyLCAiLnhsc3giKSkKZGVsdGF3aG9sZV93dHdob2xlX2Rvd25fZ29zZXFfbmIkcHZhbHVlX3Bsb3RzW1sxXV0KYGBgCgojIGNpcmNvcwoKYGBge3IgY2lyY29zfQpnZmZfZGYgPC0gbG9hZF9nZmZfYW5ub3RhdGlvbnMoInJlZmVyZW5jZS9tdHViZXJjdWxvc2lzX2gzN3J2Mi5nZmYiKQpyb3duYW1lcyhnZmZfZGYpIDwtIG1ha2UubmFtZXMoZ2ZmX2RmW1siSUQiXV0sIHVuaXF1ZT1UUlVFKQptaWNyb2Jlc19hbm5vdCA8LSBsb2FkX21pY3JvYmVzb25saW5lX2Fubm90YXRpb25zKGlkPTgzMzMyKQpyb3duYW1lcyhtaWNyb2Jlc19hbm5vdCkgPC0gbWFrZS5uYW1lcyhtaWNyb2Jlc19hbm5vdFtbInN5c05hbWUiXV0sIHVuaXF1ZT1UUlVFKQoKY29lZmZpY2llbnRzIDwtIGV4dHJhX2xmY19maWx0ZXJfZGUkZGVzZXEkY29lZmZpY2llbnRzCnZhbHVlcyA8LSBtZXJnZShtaWNyb2Jlc19hbm5vdCwgY29lZmZpY2llbnRzLCBieT0icm93Lm5hbWVzIikKCmNvZ19ncm91cHMgPC0gdmFsdWVzWywgYygiUm93Lm5hbWVzIiwgInN0YXJ0IiwgInN0b3AiLCAic3RyYW5kIiwgIkNPR0Z1biIpXQpjb2xuYW1lcyhjb2dfZ3JvdXBzKSA8LSBjKCJzZXFuYW1lcyIsICJzdGFydCIsICJzdG9wIiwgInN0cmFuZCIsICJDT0dGdW4iKQpyb3duYW1lcyhjb2dfZ3JvdXBzKSA8LSBjb2dfZ3JvdXBzW1sic2VxbmFtZXMiXV0KCnd0X3dob2xlIDwtIHZhbHVlc1ssIGMoIlJvdy5uYW1lcyIsICJ3dF93aG9sZSIpXQpyb3duYW1lcyh3dF93aG9sZSkgPC0gd3Rfd2hvbGVbWyJSb3cubmFtZXMiXV0Kd3RjZiA8LSB2YWx1ZXNbLCBjKCJSb3cubmFtZXMiLCAid3RfZmlsdHJhdGUiKV0Kcm93bmFtZXMod3RjZikgPC0gd3RjZltbIlJvdy5uYW1lcyJdXQpkZWx0YV93aG9sZSA8LSB2YWx1ZXNbLCBjKCJSb3cubmFtZXMiLCAiZGVsdGFfd2hvbGUiKV0Kcm93bmFtZXMoZGVsdGFfd2hvbGUpIDwtIGRlbHRhX3dob2xlW1siUm93Lm5hbWVzIl1dCmRlbHRhX2ZpbHRyYXRlIDwtIHZhbHVlc1ssIGMoIlJvdy5uYW1lcyIsICJkZWx0YV9maWx0cmF0ZSIpXQpyb3duYW1lcyhkZWx0YV9maWx0cmF0ZSkgPC0gZGVsdGFfZmlsdHJhdGVbWyJSb3cubmFtZXMiXV0KCmNpcmNvc19tdGIgPC0gY2lyY29zX3ByZWZpeChuYW1lPSJtdGIiKQptdGJfa2FyeW90eXBlIDwtIGNpcmNvc19rYXJ5b3R5cGUoIm10YiIsIGxlbmd0aD00NDExNTMyKQptdGJfcGx1cyA8LSBjaXJjb3NfcGx1c19taW51cyhjb2dfZ3JvdXBzLCBjaXJjb3NfbXRiKQptdGJfd3R3aG9sZSA8LSBjaXJjb3NfaGVhdG1hcCgKICB3dF93aG9sZSwgZ2ZmX2RmLCBjb2xuYW1lPSJ3dF93aG9sZSIsCiAgY2Znb3V0PWNpcmNvc19tdGIsIGJhc2VuYW1lPSJ3dF93aG9sZSIsIG91dGVyPW10Yl9wbHVzKQptdGJfZGVsdGF3aG9sZSA8LSBjaXJjb3NfaGVhdG1hcCgKICBkZWx0YV93aG9sZSwgZ2ZmX2RmLCBjb2xuYW1lPSJkZWx0YV93aG9sZSIsCiAgY2Znb3V0PWNpcmNvc19tdGIsIGJhc2VuYW1lPSJkZWx0YV93aG9sZSIsIG91dGVyPW10Yl93dHdob2xlKQptdGJfd3RjZiA8LSBjaXJjb3NfaGVhdG1hcCgKICB3dGNmLCBnZmZfZGYsIGNvbG5hbWU9Ind0X2ZpbHRyYXRlIiwKICBjZmdvdXQ9Y2lyY29zX210YiwgYmFzZW5hbWU9Ind0X2ZpbHRyYXRlIiwgb3V0ZXI9bXRiX2RlbHRhd2hvbGUpCm10Yl9kZWx0YWNmIDwtIGNpcmNvc19oZWF0bWFwKAogIGRlbHRhX2ZpbHRyYXRlLCBnZmZfZGYsIGNvbG5hbWU9ImRlbHRhX2ZpbHRyYXRlIiwKICBjZmdvdXQ9Y2lyY29zX210YiwgYmFzZW5hbWU9ImRlbHRhX2ZpbHRyYXRlIiwgb3V0ZXI9bXRiX3d0Y2YpCm10Yl9kZWx0YWNmX2hlYXQgPC0gY2lyY29zX2hlYXRtYXAoCiAgZGVsdGFfZmlsdHJhdGUsIGdmZl9kZiwgY29sbmFtZT0iZGVsdGFfZmlsdHJhdGUiLAogIGNmZ291dD1jaXJjb3NfbXRiLCBiYXNlbmFtZT0iZGVsdGFfZmlsdHJhdGVfaGVhdCIsIG91dGVyPW10Yl9kZWx0YWNmKQpjaXJjb3Nfc3VmZml4KGNmZ291dD1jaXJjb3NfbXRiKQpjaXJjb3NfbWFkZSA8LSBzbShjaXJjb3NfbWFrZSh0YXJnZXQ9Im10YiIpKQpgYGAKCltjaXJjb3MgcGxvdF0oY2lyY29zL210Yi5wbmcpCgojIFRPRE8KCiogMjAxOC0wNC0xMDogIE1ha2Ugc3VyZSBteSBpbnZvY2F0aW9ucyBvZiBTV0FUSDJzdGF0cy9NU3N0YXRzIGFyZSBjb3JyZWN0LgoKYGBge3Igc2F2ZW1lfQppZiAoIWlzVFJVRShnZXQwKCJza2lwX2xvYWQiKSkpIHsKICBtZXNzYWdlKHBhc3RlMCgiVGhpcyBpcyBocGdsdG9vbHMgY29tbWl0OiAiLCBnZXRfZ2l0X2NvbW1pdCgpKSkKICB0aGlzX3NhdmUgPC0gcGFzdGUwKGdzdWIocGF0dGVybj0iXFwuUm1kIiwgcmVwbGFjZT0iIiwgeD1ybWRfZmlsZSksICItdiIsIHZlciwgIi5yZGEueHoiKQogIG1lc3NhZ2UocGFzdGUwKCJTYXZpbmcgdG8gIiwgdGhpc19zYXZlKSkKICB0bXAgPC0gc20oc2F2ZW1lKGZpbGVuYW1lPXRoaXNfc2F2ZSkpCiAgcGFuZGVyOjpwYW5kZXIoc2Vzc2lvbkluZm8oKSkKfQpgYGAKCmBgYHtyIGxvYWRtZSwgZXZhbD1GQUxTRX0KdG1wIDwtIGxvYWRtZShmaWxlbmFtZT10aGlzX3NhdmUpCmBgYAo=