1 Analyzing data from openMS and friends.

1.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.

1.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.

1.2 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.

## Attempting to read the tsv file for: 2019_0801Briken01: preprocessing/08pyprophet/20190801/whole_8mz_tuberculist/2019_0801Briken01_vs_20190801_whole_HCD_dia_scored.tsv.
## Attempting to read the tsv file for: 2019_0801Briken02: preprocessing/08pyprophet/20190801/whole_8mz_tuberculist/2019_0801Briken02_vs_20190801_whole_HCD_dia_scored.tsv.
## Attempting to read the tsv file for: 2019_0801Briken03: preprocessing/08pyprophet/20190801/whole_8mz_tuberculist/2019_0801Briken03_vs_20190801_whole_HCD_dia_scored.tsv.
## Attempting to read the tsv file for: 2019_0801Briken04: preprocessing/08pyprophet/20190801/whole_8mz_tuberculist/2019_0801Briken04_vs_20190801_whole_HCD_dia_scored.tsv.
## Attempting to read the tsv file for: 2019_0801Briken06: preprocessing/08pyprophet/20190801/whole_8mz_tuberculist/2019_0801Briken06_vs_20190801_whole_HCD_dia_scored.tsv.
## Attempting to read the tsv file for: 2019_0801Briken07: preprocessing/08pyprophet/20190801/whole_8mz_tuberculist/2019_0801Briken07_vs_20190801_whole_HCD_dia_scored.tsv.
## Attempting to read the tsv file for: 2019_0801Briken08: preprocessing/08pyprophet/20190801/whole_8mz_tuberculist/2019_0801Briken08_vs_20190801_whole_HCD_dia_scored.tsv.
## Attempting to read the tsv file for: 2019_0801Briken09: preprocessing/08pyprophet/20190801/whole_8mz_tuberculist/2019_0801Briken09_vs_20190801_whole_HCD_dia_scored.tsv.
## Attempting to read the tsv file for: 2019_0801Briken10: preprocessing/08pyprophet/20190801/whole_8mz_tuberculist/2019_0801Briken10_vs_20190801_whole_HCD_dia_scored.tsv.
## Attempting to read the tsv file for: 2019_0801Briken11: preprocessing/08pyprophet/20190801/whole_8mz_tuberculist/2019_0801Briken11_vs_20190801_whole_HCD_dia_scored.tsv.
## Attempting to read the tsv file for: 2019_0801Briken12: preprocessing/08pyprophet/20190801/whole_8mz_tuberculist/2019_0801Briken12_vs_20190801_whole_HCD_dia_scored.tsv.
## Attempting to read the tsv file for: 2019_0801Briken13: preprocessing/08pyprophet/20190801/whole_8mz_tuberculist/2019_0801Briken13_vs_20190801_whole_HCD_dia_scored.tsv.
## Attempting to read the tsv file for: 2019_0801Briken14: preprocessing/08pyprophet/20190801/whole_8mz_tuberculist/2019_0801Briken14_vs_20190801_whole_HCD_dia_scored.tsv.
## Attempting to read the tsv file for: 2019_0801Briken15: preprocessing/08pyprophet/20190801/whole_8mz_tuberculist/2019_0801Briken15_vs_20190801_whole_HCD_dia_scored.tsv.
## Attempting to read the tsv file for: 2019_0801Briken16: preprocessing/08pyprophet/20190801/whole_8mz_tuberculist/2019_0801Briken16_vs_20190801_whole_HCD_dia_scored.tsv.
## Attempting to read the tsv file for: 2019_0801Briken17: preprocessing/08pyprophet/20190801/whole_8mz_tuberculist/2019_0801Briken17_vs_20190801_whole_HCD_dia_scored.tsv.
## Attempting to read the tsv file for: 2019_0801Briken18: preprocessing/08pyprophet/20190801/whole_8mz_tuberculist/2019_0801Briken18_vs_20190801_whole_HCD_dia_scored.tsv.
## Adding 2019_0801Briken01
## Adding 2019_0801Briken02
## Adding 2019_0801Briken03
## Adding 2019_0801Briken04
## Adding 2019_0801Briken06
## Adding 2019_0801Briken07
## Adding 2019_0801Briken08
## Adding 2019_0801Briken09
## Adding 2019_0801Briken10
## Adding 2019_0801Briken11
## Adding 2019_0801Briken12
## Adding 2019_0801Briken13
## Adding 2019_0801Briken14
## Adding 2019_0801Briken15
## Adding 2019_0801Briken16
## Adding 2019_0801Briken17
## Adding 2019_0801Briken18
## Writing the image to: images/whole_masses_observed.png and calling dev.off().

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

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

## Adding 2019_0801Briken01
## Adding 2019_0801Briken02
## Adding 2019_0801Briken03
## Adding 2019_0801Briken04
## Adding 2019_0801Briken06
## Adding 2019_0801Briken07
## Adding 2019_0801Briken08
## Adding 2019_0801Briken09
## Adding 2019_0801Briken10
## Adding 2019_0801Briken11
## Adding 2019_0801Briken12
## Adding 2019_0801Briken13
## Adding 2019_0801Briken14
## Adding 2019_0801Briken15
## Adding 2019_0801Briken16
## Adding 2019_0801Briken17
## Adding 2019_0801Briken18
## Adding 2019_0801Briken01
## Adding 2019_0801Briken02
## Adding 2019_0801Briken03
## Adding 2019_0801Briken04
## Adding 2019_0801Briken06
## Adding 2019_0801Briken07
## Adding 2019_0801Briken08
## Adding 2019_0801Briken09
## Adding 2019_0801Briken10
## Adding 2019_0801Briken11
## Adding 2019_0801Briken12
## Adding 2019_0801Briken13
## Adding 2019_0801Briken14
## Adding 2019_0801Briken15
## Adding 2019_0801Briken16
## Adding 2019_0801Briken17
## Adding 2019_0801Briken18
## Writing the image to: images/whole_counts_vs_intensities.png and calling dev.off().

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

1.3 Show a series of all identifications for marker proteins

There are a few proteins for which Volker has relatively specific assumptions/expectations. Let us see what they look like and if they follow a trend which makes some sense…

The primary thing to recall, I think, is that in our previous data sets, there were a pretty large number of samples for which no identifications were made for many of these proteins. Does that remain true?

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

## Adding 2019_0801Briken01
## Adding 2019_0801Briken02
## Adding 2019_0801Briken03
## Adding 2019_0801Briken04
## Adding 2019_0801Briken06
## Adding 2019_0801Briken07
## Adding 2019_0801Briken08
## Adding 2019_0801Briken09
## Adding 2019_0801Briken10
## Adding 2019_0801Briken11
## Adding 2019_0801Briken12
## Adding 2019_0801Briken13
## Adding 2019_0801Briken14
## Adding 2019_0801Briken15
## Adding 2019_0801Briken16
## Adding 2019_0801Briken17
## Adding 2019_0801Briken18
## This data will benefit from being displayed on the log scale.
## If this is not desired, set scale='raw'
## Some data are negative.  We are on log scale, setting them to 0.
## Changed 38 negative features.
## Some entries are 0.  We are on log scale, adding 1 to the data.
## Changed 38 zero count features.

## Adding 2019_0801Briken01
## Adding 2019_0801Briken02
## Adding 2019_0801Briken03
## Adding 2019_0801Briken04
## Adding 2019_0801Briken06
## Adding 2019_0801Briken07
## Adding 2019_0801Briken08
## Adding 2019_0801Briken09
## Adding 2019_0801Briken10
## Adding 2019_0801Briken11
## Adding 2019_0801Briken12
## Adding 2019_0801Briken13
## Adding 2019_0801Briken14
## Adding 2019_0801Briken15
## Adding 2019_0801Briken16
## Adding 2019_0801Briken17
## Adding 2019_0801Briken18
## Writing the image to: images/whole_osw_esxH_intensities-v20190801.png and calling dev.off().

## Adding 2019_0801Briken01
## Adding 2019_0801Briken02
## Adding 2019_0801Briken03
## Adding 2019_0801Briken04
## Adding 2019_0801Briken06
## Adding 2019_0801Briken07
## Adding 2019_0801Briken08
## Adding 2019_0801Briken09
## Adding 2019_0801Briken10
## Adding 2019_0801Briken11
## Adding 2019_0801Briken12
## Adding 2019_0801Briken13
## Adding 2019_0801Briken14
## Adding 2019_0801Briken15
## Adding 2019_0801Briken16
## Adding 2019_0801Briken17
## Adding 2019_0801Briken18
## Writing the image to: images/whole_osw_lpqh_intensities-v20190801.png and calling dev.off().

## Adding 2019_0801Briken01
## Adding 2019_0801Briken02
## Adding 2019_0801Briken03
## Adding 2019_0801Briken04
## Adding 2019_0801Briken06
## Adding 2019_0801Briken07
## Adding 2019_0801Briken08
## Adding 2019_0801Briken09
## Adding 2019_0801Briken10
## Adding 2019_0801Briken11
## Adding 2019_0801Briken12
## Adding 2019_0801Briken13
## Adding 2019_0801Briken14
## Adding 2019_0801Briken15
## Adding 2019_0801Briken16
## Adding 2019_0801Briken17
## Adding 2019_0801Briken18
## Writing the image to: images/whole_osw_groel1_intensities-v20190801.png and calling dev.off().

## Adding 2019_0801Briken01
## Adding 2019_0801Briken02
## Adding 2019_0801Briken03
## Adding 2019_0801Briken04
## Adding 2019_0801Briken06
## Adding 2019_0801Briken07
## Adding 2019_0801Briken08
## Adding 2019_0801Briken09
## Adding 2019_0801Briken10
## Adding 2019_0801Briken11
## Adding 2019_0801Briken12
## Adding 2019_0801Briken13
## Adding 2019_0801Briken14
## Adding 2019_0801Briken15
## Adding 2019_0801Briken16
## Adding 2019_0801Briken17
## Adding 2019_0801Briken18
## Writing the image to: images/whole_osw_groel2_intensities-v20190801.png and calling dev.off().

## Adding 2019_0801Briken01
## Adding 2019_0801Briken02
## Adding 2019_0801Briken03
## Adding 2019_0801Briken04
## Adding 2019_0801Briken06
## Adding 2019_0801Briken07
## Adding 2019_0801Briken08
## Adding 2019_0801Briken09
## Adding 2019_0801Briken10
## Adding 2019_0801Briken11
## Adding 2019_0801Briken12
## Adding 2019_0801Briken13
## Adding 2019_0801Briken14
## Adding 2019_0801Briken15
## Adding 2019_0801Briken16
## Adding 2019_0801Briken17
## Adding 2019_0801Briken18
## Writing the image to: images/whole_osw_fap_intensities-v20190801.png and calling dev.off().

## Adding 2019_0801Briken01
## Adding 2019_0801Briken02
## Adding 2019_0801Briken03
## Adding 2019_0801Briken04
## Adding 2019_0801Briken06
## Adding 2019_0801Briken07
## Adding 2019_0801Briken08
## Adding 2019_0801Briken09
## Adding 2019_0801Briken10
## Adding 2019_0801Briken11
## Adding 2019_0801Briken12
## Adding 2019_0801Briken13
## Adding 2019_0801Briken14
## Adding 2019_0801Briken15
## Adding 2019_0801Briken16
## Adding 2019_0801Briken17
## Adding 2019_0801Briken18
## Writing the image to: images/whole_osw_katg_intensities.png and calling dev.off().

2 Start SWATH2stats

I want to load the data and metadata into SWATH2stats in preparation for MSstats and my own hpgltools-base analyses.

## Parsed with column specification:
## cols(
##   .default = col_double(),
##   run_id = col_character(),
##   filename = col_character(),
##   Sequence = col_character(),
##   FullPeptideName = col_character(),
##   aggr_Peak_Area = col_logical(),
##   aggr_Peak_Apex = col_logical(),
##   aggr_Fragment_Annotation = col_logical(),
##   ProteinName = col_character(),
##   align_runid = col_character(),
##   align_origfilename = col_character()
## )
## See spec(...) for full column specifications.
## Loading SWATH2stats
## Found the same mzXML files in the annotations and data.
## preprocessing/01mzXML/dia/20190801/2019_0801Briken01.mzXML
## preprocessing/01mzXML/dia/20190801/2019_0801Briken02.mzXML
## preprocessing/01mzXML/dia/20190801/2019_0801Briken03.mzXML
## preprocessing/01mzXML/dia/20190801/2019_0801Briken04.mzXML
## preprocessing/01mzXML/dia/20190801/2019_0801Briken06.mzXML
## preprocessing/01mzXML/dia/20190801/2019_0801Briken07.mzXML
## preprocessing/01mzXML/dia/20190801/2019_0801Briken08.mzXML
## preprocessing/01mzXML/dia/20190801/2019_0801Briken09.mzXML
## preprocessing/01mzXML/dia/20190801/2019_0801Briken10.mzXML
## preprocessing/01mzXML/dia/20190801/2019_0801Briken11.mzXML
## preprocessing/01mzXML/dia/20190801/2019_0801Briken12.mzXML
## preprocessing/01mzXML/dia/20190801/2019_0801Briken13.mzXML
## preprocessing/01mzXML/dia/20190801/2019_0801Briken14.mzXML
## preprocessing/01mzXML/dia/20190801/2019_0801Briken15.mzXML
## preprocessing/01mzXML/dia/20190801/2019_0801Briken16.mzXML
## preprocessing/01mzXML/dia/20190801/2019_0801Briken17.mzXML
## preprocessing/01mzXML/dia/20190801/2019_0801Briken18.mzXML
## 17 samples were read from the annotations.
## 211121 transitions were read from the data and merged with the annotations.

Now I have a couple data structures which should prove useful for the metrics provided by SWATH2stats, MSstats, and my own hpgltools.

3 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()).

3.2 Perform SWATH2stats filters

I just realized something which should be added to me SWATH2stats fork: A simplified filter functions which invokes all of these so that I can make sure that there are no typeographikal errors introduced by my invocation of each of these things, one at a time.

## Number of non-decoy peptides: 17193
## Number of decoy peptides: 1095
## Decoy rate: 0.0637
## The average FDR by run on assay level is 0.011
## The average FDR by run on peptide level is 0.013
## The average FDR by run on protein level is 0.057
## Target assay FDR: 0.02
## Required overall m-score cutoff: 0.0044668
## achieving assay FDR: 0.0179
## Target protein FDR: 0.02
## Required overall m-score cutoff: 0.001
## achieving protein FDR: 0.0194
## Original dimension: 207731, new dimension: 189352, difference: 18379.
## Peptides need to have been quantified in more conditions than: 13.6 in order to pass this percentage-based threshold.
## Fraction of peptides selected: 0.42
## Original dimension: 207731, new dimension: 136725, difference: 71006.
## Target protein FDR: 0.001
## 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: 2760
## Final target proteins: 2760
## Final decoy proteins: 0
## Peptides mapping to these protein entries selected:
## Total mapping peptides: 15689
## Final target peptides: 15689
## Final decoy peptides: 0
## Total peptides selected from:
## Total peptides: 15689
## Final target peptides: 15689
## 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: 2776
## Protein identifiers: Rv3570c, Rv2524c, Rv3908, Rv2427c, Rv1579c, Rv0913c
## Number of proteins detected that are supported by a proteotypic peptide: 2666
## Number of proteotypic peptides detected: 15575
## Number of proteins detected: 2666
## First 6 protein identifiers: Rv3570c, Rv2524c, Rv3908, Rv2427c, Rv1579c, Rv0913c
## Before filtering:
##   Number of proteins: 2666
##   Number of peptides: 15575
## 
## Percentage of peptides removed: 16.71%
## 
## After filtering:
##   Number of proteins: 2666
##   Number of peptides: 12973
## Before filtering:
##   Number of proteins: 2666
##   Number of peptides: 12973
## 
## Percentage of peptides removed: 9.43%
## 
## After filtering:
##   Number of proteins: 1794
##   Number of peptides: 11749
## Number of non-decoy peptides: 17193
## Number of decoy peptides: 1095
## Decoy rate: 0.0637
## There were 207731 observations and 3390 decoy observations.
## The average FDR by run on assay level is 0.011
## The average FDR by run on peptide level is 0.013
## The average FDR by run on protein level is 0.057
## Target assay FDR: 0.1
## Required overall m-score cutoff: 0.01
## achieving assay FDR: 0.0383
## Target protein FDR: 0.1
## Required overall m-score cutoff: 0.0039811
## achieving protein FDR: 0.0969
## Starting mscore filter.
## Starting mscore filter.
## Original dimension: 207731, new dimension: 207731, difference: 0.
## Starting freqobs filter.
## Peptides need to have been quantified in more conditions than: 12.75 in order to pass this percentage-based threshold.
## Fraction of peptides selected: 0.47
## Original dimension: 207731, new dimension: 148880, difference: 58851.
## Starting fdr filter.
## Target protein FDR: 0.00398107170553497
## 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.1
## Required overall m-score cutoff: 0.01
## Achieving peptide FDR: 0
## Proteins selected: 
## Total proteins selected: 1965
## Final target proteins: 1965
## Final decoy proteins: 0
## Peptides mapping to these protein entries selected:
## Total mapping peptides: 8495
## Final target peptides: 8495
## Final decoy peptides: 0
## Total peptides selected from:
## Total peptides: 8495
## Final target peptides: 8495
## 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.
## Starting proteotypic filter.
## Number of proteins detected: 1981
## Protein identifiers: Rv1611, Rv3044, Rv0873, Rv1248c, Rv3879c, Rv2921c
## Number of proteins detected that are supported by a proteotypic peptide: 1912
## Number of proteotypic peptides detected: 8434
## Starting peptide filter.
## Number of proteins detected: 1912
## First 6 protein identifiers: Rv1611, Rv3044, Rv0873, Rv1248c, Rv3879c, Rv2921c
## Starting maximum peptide filter.
## Before filtering:
##   Number of proteins: 1912
##   Number of peptides: 8434
## 
## Percentage of peptides removed: 5.21%
## 
## After filtering:
##   Number of proteins: 1912
##   Number of peptides: 7995
## Skipping min peptide filter.
## We went from 3874/18288 proteins/peptides to:
##              1912/7995 proteins/peptides.

3.3 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.

Let us reset the version back to 20190327 here.

## Protein overview matrix preprocessing/10swath2stats/20190801/protein_matrix_unfiltered.csv written to working folder.
## [1] 3874   18
## Protein overview matrix preprocessing/10swath2stats/20190801/protein_matrix_mscore.csv written to working folder.
## [1] 2986   18
## Peptide overview matrix preprocessing/10swath2stats/20190801/peptide_matrix_mscore.csv written to working folder.
## [1] 17193    18
## Protein overview matrix preprocessing/10swath2stats/20190801/protein_matrix_filtered.csv written to working folder.
## [1] 1912   18
## Peptide overview matrix preprocessing/10swath2stats/20190801/peptide_matrix_filtered.csv written to working folder.
## [1] 7995   18

## The library contains 1 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.

4 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.

4.1 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.

5 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.

5.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.

5.2 Massaging the intensity matrix

I do not want the \1 before the protein names, I already merged them into one entry per gene via SWATH2stats.

5.4 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.

## Reading the sample metadata.
## The sample definitions comprises: 17 rows(samples) and 19 columns(metadata fields).
## Matched 1908 annotations and counts.
## Bringing together the count matrix and gene information.
## Some annotations were lost in merging, setting them to 'undefined'.
## The final expressionset has 1911 rows and 17 columns.
## Reading the sample metadata.
## The sample definitions comprises: 17 rows(samples) and 19 columns(metadata fields).
## Matched 2856 annotations and counts.
## Bringing together the count matrix and gene information.
## Some annotations were lost in merging, setting them to 'undefined'.
## The final expressionset has 2874 rows and 17 columns.
## Writing the first sheet, containing a legend and some summary data.
## Writing the raw reads.
## Graphing the raw reads.
## varpart sees only 1 batch, adjusting the model accordingly.
## Attempting mixed linear model with: ~  (1|condition)
## Fitting the expressionset to the model, this is slow.
## Dividing work into 100 chunks...
## Warning in serialize(data, node$con, xdr = FALSE):
## 'package:variancePartition' may not be available when loading

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

## Warning in serialize(data, node$con, xdr = FALSE):
## 'package:variancePartition' may not be available when loading
## 
## Total:10 s
## Placing factor: condition at the beginning of the model.
## Writing the normalized reads.
## Graphing the normalized reads.
## varpart sees only 1 batch, adjusting the model accordingly.
## Attempting mixed linear model with: ~  (1|condition)
## Fitting the expressionset to the model, this is slow.
## Dividing work into 100 chunks...
## 
## Total:10 s
## Placing factor: condition at the beginning of the model.
## Writing the median reads by factor.
## Note: zip::zip() is deprecated, please use zip::zipr() instead
## Writing the first sheet, containing a legend and some summary data.
## Writing the raw reads.
## Graphing the raw reads.
## varpart sees only 1 batch, adjusting the model accordingly.
## Attempting mixed linear model with: ~  (1|condition)
## Fitting the expressionset to the model, this is slow.
## Dividing work into 100 chunks...
## 
## Total:12 s
## Placing factor: condition at the beginning of the model.
## Writing the normalized reads.
## Graphing the normalized reads.
## varpart sees only 1 batch, adjusting the model accordingly.
## Attempting mixed linear model with: ~  (1|condition)
## Fitting the expressionset to the model, this is slow.
## Dividing work into 100 chunks...
## 
## Total:14 s
## Placing factor: condition at the beginning of the model.
## Writing the median reads by factor.
## This function will replace the expt$expressionset slot with:
## log2(cpm(quant(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
## 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 0 low-count genes (1911 remaining).
## Step 2: normalizing the data with quant.
## Step 3: converting the data with cpm.
## Step 4: transforming the data with log2.
## transform_counts: Found 56 values equal to 0, adding 1 to the matrix.
## Step 5: not doing batch correction.
## Writing a legend of columns.
## Writing excel data according to limma for dt_wt: 1/10.
## After (adj)p filter, the up genes table has 0 genes.
## After (adj)p filter, the down genes table has 0 genes.
## After fold change filter, the up genes table has 0 genes.
## After fold change filter, the down genes table has 0 genes.
## Writing excel data according to limma for cp_wt: 2/10.
## After (adj)p filter, the up genes table has 2 genes.
## After (adj)p filter, the down genes table has 0 genes.
## After fold change filter, the up genes table has 2 genes.
## After fold change filter, the down genes table has 0 genes.
## Printing significant genes to the file: excel/sig_20191018_tables_v20190801.xlsx
## The up table dt_wt is empty.
## The down table dt_wt is empty.
## 2/2: Creating significant table up_limma_cp_wt
## The down table cp_wt is empty.
## Writing excel data according to edger for dt_wt: 1/10.
## After (adj)p filter, the up genes table has 22 genes.
## After (adj)p filter, the down genes table has 2 genes.
## After fold change filter, the up genes table has 21 genes.
## After fold change filter, the down genes table has 2 genes.
## Writing excel data according to edger for cp_wt: 2/10.
## After (adj)p filter, the up genes table has 0 genes.
## After (adj)p filter, the down genes table has 0 genes.
## After fold change filter, the up genes table has 0 genes.
## After fold change filter, the down genes table has 0 genes.
## Printing significant genes to the file: excel/sig_20191018_tables_v20190801.xlsx
## 1/2: Creating significant table up_edger_dt_wt
## The up table cp_wt is empty.
## The down table cp_wt is empty.
## Writing excel data according to deseq for dt_wt: 1/10.
## After (adj)p filter, the up genes table has 145 genes.
## After (adj)p filter, the down genes table has 40 genes.
## After fold change filter, the up genes table has 56 genes.
## After fold change filter, the down genes table has 11 genes.
## Writing excel data according to deseq for cp_wt: 2/10.
## After (adj)p filter, the up genes table has 0 genes.
## After (adj)p filter, the down genes table has 0 genes.
## After fold change filter, the up genes table has 0 genes.
## After fold change filter, the down genes table has 0 genes.
## Printing significant genes to the file: excel/sig_20191018_tables_v20190801.xlsx
## 1/2: Creating significant table up_deseq_dt_wt
## The up table cp_wt is empty.
## The down table cp_wt is empty.
## Writing excel data according to ebseq for dt_wt: 1/10.
## After (adj)p filter, the up genes table has 1 genes.
## After (adj)p filter, the down genes table has 2 genes.
## After fold change filter, the up genes table has 0 genes.
## After fold change filter, the down genes table has 1 genes.
## Writing excel data according to ebseq for cp_wt: 2/10.
## After (adj)p filter, the up genes table has 3 genes.
## After (adj)p filter, the down genes table has 5 genes.
## After fold change filter, the up genes table has 2 genes.
## After fold change filter, the down genes table has 2 genes.
## Printing significant genes to the file: excel/sig_20191018_tables_v20190801.xlsx
## The up table dt_wt is empty.
## 2/2: Creating significant table up_ebseq_cp_wt
## Writing excel data according to basic for dt_wt: 1/10.
## After (adj)p filter, the up genes table has 0 genes.
## After (adj)p filter, the down genes table has 0 genes.
## After fold change filter, the up genes table has 0 genes.
## After fold change filter, the down genes table has 0 genes.
## Writing excel data according to basic for cp_wt: 2/10.
## After (adj)p filter, the up genes table has 0 genes.
## After (adj)p filter, the down genes table has 0 genes.
## After fold change filter, the up genes table has 0 genes.
## After fold change filter, the down genes table has 0 genes.
## Printing significant genes to the file: excel/sig_20191018_tables_v20190801.xlsx
## The up table dt_wt is empty.
## The down table dt_wt is empty.
## The up table cp_wt is empty.
## The down table cp_wt is empty.
## Adding significance bar plots.
## Writing a legend of columns.
## Writing excel data according to limma for dt_wt: 1/10.
## After (adj)p filter, the up genes table has 4 genes.
## After (adj)p filter, the down genes table has 0 genes.
## After fold change filter, the up genes table has 4 genes.
## After fold change filter, the down genes table has 0 genes.
## Writing excel data according to limma for cp_wt: 2/10.
## After (adj)p filter, the up genes table has 0 genes.
## After (adj)p filter, the down genes table has 0 genes.
## After fold change filter, the up genes table has 0 genes.
## After fold change filter, the down genes table has 0 genes.
## Printing significant genes to the file: excel/sig_20191018_unfilt_tables_v20190801.xlsx
## 1/2: Creating significant table up_limma_dt_wt
## The down table dt_wt is empty.
## The up table cp_wt is empty.
## The down table cp_wt is empty.
## Writing excel data according to edger for dt_wt: 1/10.
## After (adj)p filter, the up genes table has 55 genes.
## After (adj)p filter, the down genes table has 40 genes.
## After fold change filter, the up genes table has 51 genes.
## After fold change filter, the down genes table has 40 genes.
## Writing excel data according to edger for cp_wt: 2/10.
## After (adj)p filter, the up genes table has 10 genes.
## After (adj)p filter, the down genes table has 27 genes.
## After fold change filter, the up genes table has 10 genes.
## After fold change filter, the down genes table has 27 genes.
## Printing significant genes to the file: excel/sig_20191018_unfilt_tables_v20190801.xlsx
## 1/2: Creating significant table up_edger_dt_wt
## 2/2: Creating significant table up_edger_cp_wt
## Writing excel data according to deseq for dt_wt: 1/10.
## After (adj)p filter, the up genes table has 190 genes.
## After (adj)p filter, the down genes table has 150 genes.
## After fold change filter, the up genes table has 123 genes.
## After fold change filter, the down genes table has 122 genes.
## Writing excel data according to deseq for cp_wt: 2/10.
## After (adj)p filter, the up genes table has 48 genes.
## After (adj)p filter, the down genes table has 58 genes.
## After fold change filter, the up genes table has 47 genes.
## After fold change filter, the down genes table has 57 genes.
## Printing significant genes to the file: excel/sig_20191018_unfilt_tables_v20190801.xlsx
## 1/2: Creating significant table up_deseq_dt_wt
## 2/2: Creating significant table up_deseq_cp_wt
## Writing excel data according to ebseq for dt_wt: 1/10.
## After (adj)p filter, the up genes table has 10 genes.
## After (adj)p filter, the down genes table has 13 genes.
## After fold change filter, the up genes table has 9 genes.
## After fold change filter, the down genes table has 13 genes.
## Writing excel data according to ebseq for cp_wt: 2/10.
## After (adj)p filter, the up genes table has 22 genes.
## After (adj)p filter, the down genes table has 47 genes.
## After fold change filter, the up genes table has 18 genes.
## After fold change filter, the down genes table has 43 genes.
## Printing significant genes to the file: excel/sig_20191018_unfilt_tables_v20190801.xlsx
## 1/2: Creating significant table up_ebseq_dt_wt
## 2/2: Creating significant table up_ebseq_cp_wt
## Writing excel data according to basic for dt_wt: 1/10.
## After (adj)p filter, the up genes table has 0 genes.
## After (adj)p filter, the down genes table has 1 genes.
## After fold change filter, the up genes table has 0 genes.
## After fold change filter, the down genes table has 1 genes.
## Writing excel data according to basic for cp_wt: 2/10.
## After (adj)p filter, the up genes table has 0 genes.
## After (adj)p filter, the down genes table has 0 genes.
## After fold change filter, the up genes table has 0 genes.
## After fold change filter, the down genes table has 0 genes.
## Printing significant genes to the file: excel/sig_20191018_unfilt_tables_v20190801.xlsx
## The up table dt_wt is empty.
## The up table cp_wt is empty.
## The down table cp_wt is empty.
## Adding significance bar plots.
## Before removal, there were 1911 entries.
## Now there are 1909 entries.
## Percent kept: 99.976, 99.977, 99.989, 99.957, 99.980, 99.971, 99.981, 99.976, 99.930, 98.853, 99.955, 99.929, 98.904, 99.951, 99.318, 98.749, 99.882
## Percent removed: 0.024, 0.023, 0.011, 0.043, 0.020, 0.029, 0.019, 0.024, 0.070, 1.147, 0.045, 0.071, 1.096, 0.049, 0.682, 1.251, 0.118
## This function will replace the expt$expressionset slot with:
## log2(cpm(quant(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
## 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 0 low-count genes (1909 remaining).
## Step 2: normalizing the data with quant.
## Step 3: converting the data with cpm.
## Step 4: transforming the data with log2.
## transform_counts: Found 56 values equal to 0, adding 1 to the matrix.
## Step 5: not doing batch correction.

5.5 Lets see what happens if we rewrite the expressionset with NAs

## In condition wt_wh there are 184 rows which are all zero.
## In condition dt_wh there are 290 rows which are all zero.
## In condition cp_wh there are 189 rows which are all zero.
## Starting basic_pairwise().
## Starting basic pairwise comparison.
## Leaving the data alone, regardless of normalization state.
## Basic step 0/3: Transforming data.
## Basic step 1/3: Creating mean and variance tables.
## Basic step 2/3: Performing 6 comparisons.
## Basic step 3/3: Creating faux DE Tables.
## Basic: Returning tables.
## Starting deseq_pairwise().
## Starting DESeq2 pairwise comparisons.
## About to round the data, this is a pretty terrible thing to do. But if you, like me, want to see what happens when you put non-standard data into deseq, then here you go.
## Warning in choose_binom_dataset(input, force = force): This data was
## inappropriately forced into integers.
## Choosing the non-intercept containing model.
## DESeq2 step 1/5: Including only condition in the deseq model.
## Warning in import_deseq(data, column_data, model_string, tximport =
## input[["tximport"]][["raw"]]): Converted down 1225 elements because they
## are larger than the maximum integer size.
## converting counts to integer mode
## DESeq2 step 2/5: Estimate size factors.
## DESeq2 step 3/5: Estimate dispersions.
## gene-wise dispersion estimates
## mean-dispersion relationship
## final dispersion estimates
## Using a parametric fitting seems to have worked.
## DESeq2 step 4/5: nbinomWaldTest.
## Starting edger_pairwise().
## Starting edgeR pairwise comparisons.
## About to round the data, this is a pretty terrible thing to do. But if you, like me, want to see what happens when you put non-standard data into deseq, then here you go.
## Warning in choose_binom_dataset(input, force = force): This data was
## inappropriately forced into integers.
## 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.

## Starting limma_pairwise().
## Starting limma pairwise comparison.
## Leaving the data alone, regardless of normalization state.
## libsize was not specified, this parameter has profound effects on limma's result.
## Using the libsize from expt$libsize.
## Limma step 1/6: choosing model.
## Choosing the non-intercept containing model.
## Limma step 2/6: running hpgl_voom(), switch with the argument 'which_voom'.
## The voom input was not cpm, converting now.
## The voom input was not log2, transforming now.
## Limma step 3/6: running lmFit with method: ls.
## Limma step 4/6: making and fitting contrasts with no intercept. (~ 0 + factors)
## Limma step 5/6: Running eBayes with robust=FALSE and trend=FALSE.
## Limma step 6/6: Writing limma outputs.
## Limma step 6/6: 1/3: Creating table: dt_wh_vs_cp_wh.  Adjust=BH
## Limma step 6/6: 2/3: Creating table: wt_wh_vs_cp_wh.  Adjust=BH
## Limma step 6/6: 3/3: Creating table: wt_wh_vs_dt_wh.  Adjust=BH
## Limma step 6/6: 1/3: Creating table: cp_wh.  Adjust=BH
## Limma step 6/6: 2/3: Creating table: dt_wh.  Adjust=BH
## Limma step 6/6: 3/3: Creating table: wt_wh.  Adjust=BH
## Comparing analyses.

## Deleting the file excel/unfilt_nas_table.xlsx before writing the tables.
## Writing a legend of columns.
## Printing a pca plot before/after surrogates/batch estimation.
## Working on 1/2: dt_wt which is: dt_wh/wt_wh.
## Found inverse table with wt_wh_vs_dt_wh
## The ebseq table is null.
## 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/2: cp_wt which is: cp_wh/wt_wh.
## Found inverse table with wt_wh_vs_cp_wh
## The ebseq table is null.
## 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 dt_wt.

## Limma expression coefficients for dt_wt; R^2: 0.987; equation: y = 0.973x - 0.0103
## Edger expression coefficients for dt_wt; R^2: 0.982; equation: y = 1x - 0.186
## DESeq2 expression coefficients for dt_wt; R^2: 0.99; equation: y = 0.987x + 0.199
## Adding venn plots for cp_wt.

## Limma expression coefficients for cp_wt; R^2: 0.993; equation: y = 1.01x - 0.00611
## Edger expression coefficients for cp_wt; R^2: 0.991; equation: y = 0.992x + 0.189
## DESeq2 expression coefficients for cp_wt; R^2: 0.995; equation: y = 1x - 0.0126
## Writing summary information.
## Performing save of excel/unfilt_nas_table.xlsx.

6 A nice subset request from Volker

Let us pull the following subset from the DE tables for Volker, it should provide a set of proteins most obviously of interest; assuming the false negatives are not too severe.

  1. lfc <= -6 for delta/wt && lfc >= -3 for comp/wt
  2. lfc >= 10 delta/wt && lfc <= 4 comp/wt

This will hopefully find things which are sufficiently different from the deletion and complement samples to be interesting.

## Saving to: excel/de_20191018_more_down_delta.xlsx
## Saving to: excel/de_20191018_more_up_delta.xlsx
## If you wish to reproduce this exact build of hpgltools, invoke the following:
## > git clone http://github.com/abelew/hpgltools.git
## > git reset 083922869a37724ece10beed7b0bb758a179fdfb
## This is hpgltools commit: Thu Oct 17 11:43:00 2019 -0400: 083922869a37724ece10beed7b0bb758a179fdfb
## Saving to 03_swath2stats_20190801-v20190801.rda.xz

R version 3.6.1 (2019-07-05)

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

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

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

other attached packages: foreach(v.1.4.7), edgeR(v.3.27.13), variancePartition(v.1.15.8), SWATH2stats(v.1.13.5), testthat(v.2.2.1), hpgltools(v.1.0), Biobase(v.2.45.1) and BiocGenerics(v.0.31.6)

loaded via a namespace (and not attached): rappdirs(v.0.3.1), rtracklayer(v.1.45.6), pkgmaker(v.0.27), tidyr(v.1.0.0), ggplot2(v.3.2.1), acepack(v.1.4.1), bit64(v.0.9-7), knitr(v.1.25), DelayedArray(v.0.11.8), data.table(v.1.12.4), rpart(v.4.1-15), RCurl(v.1.95-4.12), doParallel(v.1.0.15), snow(v.0.4-3), GenomicFeatures(v.1.37.4), preprocessCore(v.1.47.1), callr(v.3.3.2), cowplot(v.1.0.0), usethis(v.1.5.1), RSQLite(v.2.1.2), europepmc(v.0.3), bit(v.1.1-14), enrichplot(v.1.5.2), xml2(v.1.2.2), SummarizedExperiment(v.1.15.9), assertthat(v.0.2.1), viridis(v.0.5.1), xfun(v.0.10), hms(v.0.5.1), evaluate(v.0.14), DEoptimR(v.1.0-8), progress(v.1.2.2), caTools(v.1.17.1.2), dbplyr(v.1.4.2), igraph(v.1.2.4.1), DBI(v.1.0.0), geneplotter(v.1.63.0), htmlwidgets(v.1.5.1), stats4(v.3.6.1), purrr(v.0.3.2), ellipsis(v.0.3.0), dplyr(v.0.8.3), backports(v.1.1.5), annotate(v.1.63.0), biomaRt(v.2.41.9), blockmodeling(v.0.3.4), vctrs(v.0.2.0), remotes(v.2.1.0), BRAIN(v.1.31.0), withr(v.2.1.2), ggforce(v.0.3.1), triebeard(v.0.3.0), robustbase(v.0.93-5), checkmate(v.1.9.4), GenomicAlignments(v.1.21.7), prettyunits(v.1.0.2), cluster(v.2.1.0), DOSE(v.3.11.2), lazyeval(v.0.2.2), crayon(v.1.3.4), genefilter(v.1.67.1), pkgconfig(v.2.0.3), labeling(v.0.3), tweenr(v.1.0.1), GenomeInfoDb(v.1.21.2), nlme(v.3.1-141), PolynomF(v.2.0-2), pkgload(v.1.0.2), nnet(v.7.3-12), devtools(v.2.2.1), rlang(v.0.4.0), lifecycle(v.0.1.0), registry(v.0.5-1), BiocFileCache(v.1.9.1), doSNOW(v.1.0.18), directlabels(v.2018.05.22), rprojroot(v.1.3-2), polyclip(v.1.10-0), matrixStats(v.0.55.0), graph(v.1.63.0), rngtools(v.1.4), Matrix(v.1.2-17), urltools(v.1.7.3), boot(v.1.3-23), base64enc(v.0.1-3), ggridges(v.0.5.1), processx(v.3.4.1), viridisLite(v.0.3.0), bitops(v.1.0-6), KernSmooth(v.2.23-16), pander(v.0.6.3), Biostrings(v.2.53.2), EBSeq(v.1.25.0), blob(v.1.2.0), doRNG(v.1.7.1), stringr(v.1.4.0), qvalue(v.2.17.0), readr(v.1.3.1), gridGraphics(v.0.4-1), S4Vectors(v.0.23.25), scales(v.1.0.0), memoise(v.1.1.0), magrittr(v.1.5), plyr(v.1.8.4), gplots(v.3.0.1.1), bibtex(v.0.4.2), gdata(v.2.18.0), zlibbioc(v.1.31.0), compiler(v.3.6.1), RColorBrewer(v.1.1-2), lme4(v.1.1-21), DESeq2(v.1.25.16), Rsamtools(v.2.1.7), cli(v.1.1.0), XVector(v.0.25.0), ps(v.1.3.0), htmlTable(v.1.13.2), Formula(v.1.2-3), MASS(v.7.3-51.4), mgcv(v.1.8-29), tidyselect(v.0.2.5), stringi(v.1.4.3), yaml(v.2.2.0), GOSemSim(v.2.11.0), askpass(v.1.1), locfit(v.1.5-9.1), latticeExtra(v.0.6-28), ggrepel(v.0.8.1), grid(v.3.6.1), fastmatch(v.1.1-0), tools(v.3.6.1), rstudioapi(v.0.10), foreign(v.0.8-72), gridExtra(v.2.3), farver(v.1.1.0), Rtsne(v.0.15), ggraph(v.2.0.0), digest(v.0.6.21), rvcheck(v.0.1.5), BiocManager(v.1.30.8), quadprog(v.1.5-7), Rcpp(v.1.0.2), GenomicRanges(v.1.37.17), httr(v.1.4.1), AnnotationDbi(v.1.47.1), colorspace(v.1.4-1), XML(v.3.98-1.20), fs(v.1.3.1), IRanges(v.2.19.17), splines(v.3.6.1), RBGL(v.1.61.0), graphlayouts(v.0.5.0), ggplotify(v.0.0.4), sessioninfo(v.1.1.1), xtable(v.1.8-4), jsonlite(v.1.6), nloptr(v.1.2.1), tidygraph(v.1.1.2), corpcor(v.1.6.9), zeallot(v.0.1.0), R6(v.2.4.0), Vennerable(v.3.1.0.9000), Hmisc(v.4.2-0), pillar(v.1.4.2), htmltools(v.0.4.0), glue(v.1.3.1), minqa(v.1.2.4), clusterProfiler(v.3.13.0), BiocParallel(v.1.19.3), codetools(v.0.2-16), fgsea(v.1.11.1), pkgbuild(v.1.0.6), lattice(v.0.20-38), tibble(v.2.1.3), sva(v.3.33.1), pbkrtest(v.0.4-7), curl(v.4.2), colorRamps(v.2.3), gtools(v.3.8.1), zip(v.2.0.4), GO.db(v.3.8.2), openxlsx(v.4.1.0.1), openssl(v.1.4.1), survival(v.2.44-1.1), limma(v.3.41.18), rmarkdown(v.1.16), desc(v.1.2.0), munsell(v.0.5.0), DO.db(v.2.9), fastcluster(v.1.1.25), GenomeInfoDbData(v.1.2.1), iterators(v.1.0.12), reshape2(v.1.4.3) and gtable(v.0.3.0)

LS0tCnRpdGxlOiAiTS50dWJlcmN1bG9zaXMgMjAxOTA4MDE6IFdob2xlIENlbGwgU2FtcGxlcyBPcGVuU3dhdGhXb3JrRmxvdy9UUklDLiIKYXV0aG9yOiAiYXRiIGFiZWxld0BnbWFpbC5jb20iCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBkZl9wcmludDogcGFnZWQKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIHdpZHRoOiAzMDAKICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICB0b2NfZmxvYXQ6IHRydWUKICBCaW9jU3R5bGU6Omh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICB0b2NfZmxvYXQ6IHRydWUKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQogICAgdGhlbWU6IHJlYWRhYmxlCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiBmYWxzZQogICAgICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQotLS0KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CmJvZHksIHRkIHsKICBmb250LXNpemU6IDE2cHg7Cn0KY29kZS5yewogIGZvbnQtc2l6ZTogMTZweDsKfQpwcmUgewogZm9udC1zaXplOiAxNnB4Cn0KPC9zdHlsZT4KCmBgYHtyIG9wdGlvbnMsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoImhwZ2x0b29scyIpCnR0IDwtIGRldnRvb2xzOjpsb2FkX2FsbCgiL2RhdGEvaHBnbHRvb2xzIikKa25pdHI6Om9wdHNfa25pdCRzZXQod2lkdGg9MTIwLAogICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcz1UUlVFLAogICAgICAgICAgICAgICAgICAgICB2ZXJib3NlPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgIGVjaG89VFJVRSkKa25pdHI6Om9wdHNfY2h1bmskc2V0KGVycm9yPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgICBkcGk9OTYpCm9sZF9vcHRpb25zIDwtIG9wdGlvbnMoZGlnaXRzPTQsCiAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nc0FzRmFjdG9ycz1GQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICBrbml0ci5kdXBsaWNhdGUubGFiZWw9ImFsbG93IikKZ2dwbG90Mjo6dGhlbWVfc2V0KGdncGxvdDI6OnRoZW1lX2J3KGJhc2Vfc2l6ZT0xMCkpCnByZXZpb3VzX2ZpbGUgPC0gIjAxX2Fubm90YXRpb25fMjAxOTA4MDEuUm1kIgpydW5kYXRlIDwtIGZvcm1hdChTeXMuRGF0ZSgpLCBmb3JtYXQ9IiVZJW0lZCIpCnZlciA8LSAiMjAxOTA4MDEiCnRtcCA8LSB0cnkoc20obG9hZG1lKGZpbGVuYW1lPXBhc3RlMChnc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IiIsIHg9cHJldmlvdXNfZmlsZSksICItdiIsIHZlciwgIi5yZGEueHoiKSkpKQoKcm1kX2ZpbGUgPC0gcGFzdGUwKCIwM19zd2F0aDJzdGF0c18iLCB2ZXIsICIuUm1kIikKYGBgCgpBbmFseXppbmcgZGF0YSBmcm9tIG9wZW5NUyBhbmQgZnJpZW5kcy4KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojIyBTV0FUSDJzdGF0cyBwcmVwcm9jZXNzaW5nCgpJIGFtIHVzaW5nIG15IHNsaWdodGx5IG1vZGlmaWVkIGNvcHkgb2YgU1dBVEgyc3RhdHMuICBUaGlzIHNlZWtzIHRvIGVuc3VyZSB0aGF0CmNoYW5nZXMgaW4gdGhlIGNhc2Ugb2YgY29sdW1ucyBpbiB0aGUgbWV0YWRhdGEgZnJvbSBvbmUgdmVyc2lvbiBvZiBPcGVuTVMgdG8KYW5vdGhlciBkbyBub3QgdHJvdWJsZSBtZS4KCiMjIyBDcmVhdGluZyBhIHN3YXRoMnN0YXRzIGV4cGVyaW1lbnQgdXNpbmcgdGhlIHR1YmVyY3VsaXN0LWRlcml2ZWQgbGlicmFyeSBkYXRhCgpUaGVyZSBpcyBvbmUgaW1wb3J0YW50IGNhdmVhdCBpbiB0aGUgZm9sbG93aW5nIGJsb2NrOiBJIHVzZWQgYSByZWdleCB0byByZW1vdmUKdGhlIHNlY29uZCBoYWxmIG9mIGdlbmVJRF9nZW5lTmFtZSBzbyB0aGF0IGxhdGVyIHdoZW4gSSBtZXJnZSBpbiB0aGUgYW5ub3RhdGlvbgpkYXRhIEkgaGF2ZSBpdCB3aWxsIG1hdGNoLgoKIyMgU29tZSBuZXcgcGxvdHMKCkluIHJlc3BvbnNlIHRvIHNvbWUgaW50ZXJlc3RpbmcgcXVlcmllcyBmcm9tIFlhbiwgSSBtYWRlIGEgZmV3IGxpdHRsZSBmdW5jdGlvbnMKd2hpY2ggcXVlcnkgYW5kIHBsb3QgZGF0YSBmcm9tIHRoZSBzY29yZWQgZGF0YSBwcm92aWRlZCBieSBvcGVuc3dhdGgvcHlwcm9waGV0LgpMZXQgdXMgbG9vayBhdCB0aGVpciByZXN1bHRzIGhlcmUuCgpgYGB7ciB0Yl9weXByb3BoZXRfcGxvdHN9CnB5cF9tZXRhZGF0YSA8LSBnbHVlOjpnbHVlKCJzYW1wbGVfc2hlZXRzL010Yl9kaWFfc2FtcGxlc197dmVyfS54bHN4IikKcHlwcm9waGV0X2Z1biA8LSBleHRyYWN0X3B5cHJvcGhldF9kYXRhKG1ldGFkYXRhPXB5cF9tZXRhZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHlwcm9waGV0X2NvbHVtbj0iZGlhc2NvcmVkIikKIyMgVmlzdWFsaXplIHRoZSBtYXNzIGRpc3RyaWJ1dGlvbnMgb2YgZWFjaCBzYW1wbGUKbWFzc19wbG90IDwtIHBsb3RfcHlwcm9waGV0X2Rpc3RyaWJ1dGlvbihweXByb3BoZXRfZnVuLCBjb2x1bW49Im1hc3MiKQpwcChmaWxlPSJpbWFnZXMvd2hvbGVfbWFzc2VzX29ic2VydmVkLnBuZyIsIGltYWdlPW1hc3NfcGxvdFtbInZpb2xpbiJdXSkKIyMgVGhhdCBzZWNvbmQgdG8gbGFzdCBzYW1wbGUgbG9va3MgcHJldHR5IG9kZC4KCiMjIExvb2sgYXQgdGhlIGRlbHRhIHJ0IHRpbWVzIG9ic2VydmVkLiAgSSBhbSBjb250aW51YWxseSBwdXp6bGVkIGFzIHRvIHdoeSB0aGVzZSBudW1iZXJzCiMjIGdldCBzbyBoaWdoLiAgSSBzdXNwZWMgdGhlIGFjdHVhbCByZWFzb24gaXMgdGhhdCBJIGRvIG5vdCB1bmRlcnN0YW5kIHRoaXMgY29sdW1uIGluIHRoZQojIyBkYXRhLCBidXQgZmluZGluZyByZWxpYWJsZSBkb2N1bWVudGF0aW9uIGlzIG5vbi10cml2aWFsLCBJIGp1c3QgYmxldyA0NSBtaW51dGVzIChyZSlyZWFkaW5nCiMjIGEgY291cGxlIG9mIHJldmlld3MgYW5kIHNvbWUgcGFwZXJzIGluIHdoaWNoIEkgdGhvdWdodCBJIHNhdyByZWxldmFudCBpbmZvcm1hdGlvbgojIyBhbmQgZm91bmQgbm90aGluZy4KZGVsdGFydF9wbG90X2FsbCA8LSBzbShwbG90X3B5cHJvcGhldF9kaXN0cmlidXRpb24oCiAgcHlwcm9waGV0X2Z1biwgY29sdW1uPSJkZWx0YV9ydCIpKQpwcChmaWxlPSJpbWFnZXMvd2hvbGVfZHJ0X29ic2VydmVkLnBuZyIsIGltYWdlPWRlbHRhcnRfcGxvdF9hbGxbWyJ2aW9saW4iXV0pCgojIyBUaGlzIHBsb3QgaXMgdGhlIHNhbWUgYXMgYWJvdmUsIGJ1dCBpbmNsdWRlcyBfb25seV8gdGhlIG5vbi1kZWNveSB2YWx1ZXMuCmRlbHRhcnRfcGxvdF9yZWFsIDwtIHNtKHBsb3RfcHlwcm9waGV0X2Rpc3RyaWJ1dGlvbigKICBweXByb3BoZXRfZnVuLAogIGNvbHVtbj0iZGVsdGFfcnQiLCBrZWVwX2RlY295cz1GQUxTRSkpCmRlbHRhcnRfcGxvdF9yZWFsW1sidmlvbGluIl1dCiMjIEFuZCB0aGlzIHRpbWUgd2UgaGF2ZSBfb25seV8gdGhlIGRlY295cy4gIEkgYW0gbm90IHJlYWxseSBzdXJlIHdoYXQgb25lIHNob3VsZCBleHBlY3QgaW4KIyMgdGhlc2UsIGJ1dCB0aGUgZGlmZmVyZW5jZXMgYXJlIGRlZmluaXRlbHkgaW50cmlndWluZy4KZGVsdGFydF9wbG90X2RlY295cyA8LSBzbShwbG90X3B5cHJvcGhldF9kaXN0cmlidXRpb24oCiAgcHlwcm9waGV0X2Z1biwKICBjb2x1bW49ImRlbHRhX3J0Iiwga2VlcF9yZWFsPUZBTFNFKSkKZGVsdGFydF9wbG90X2RlY295c1tbInZpb2xpbiJdXQoKIyMgSG93IG1hbnkgaWRlbnRpZmljYXRpb25zIHdlcmUgb2JzZXJ2ZWQgaW4gZWFjaCBzYW1wbGU/CnB5cHJvcGhldF9pZGVudGlmaWNhdGlvbnMgPC0gc20ocGxvdF9weXByb3BoZXRfY291bnRzKAogIHB5cHJvcGhldF9mdW4sIGtlZXBfZGVjb3lzPUZBTFNFLAogIHR5cGU9ImNvdW50IikpCnBwKGZpbGU9ImltYWdlcy93aG9sZV9udW1faWRlbnRpZmljYXRpb25zLnBuZyIsIGltYWdlPXB5cHJvcGhldF9pZGVudGlmaWNhdGlvbnMkcGxvdCkKIyMgVGhlIHJhbmdlIGluIHZhbHVlcyBpcyBhIGxpdHRsZSBzdXJwcmlzaW5nIHRvIG1lLCBidXQgSSBkbyBub3QKIyMgdGhpbmsgaXQgaXMgY3Jhenl0b3duLgoKIyMgU3VtKGludGVuc2l0eSkgdnMuIHN1bShpZGVudGlmaWNhdGlvbnMpLiAgV2Ugc2F3IGluIGEgcHJldmlvdXMgcGxvdCB0aGF0IHNhbXBsZQojIyAxNyB3YXMgb2RkLCBzbyBJIHdvdWxkIHNvcnQgb2YgZXhwZWN0IGl0IHRvIGJlIGZhciBhd2F5IG9uIHRoaXMgcGxvdD8KcHlwcm9waGV0X3h5IDwtIHBsb3RfcHlwcm9waGV0X3h5KAogIHB5cHJvcGhldF9mdW4sCiAgeF90eXBlPSJjb3VudCIsIHlfdHlwZT0iaW50ZW5zaXR5IikKcHAoZmlsZT0iaW1hZ2VzL3dob2xlX2NvdW50c192c19pbnRlbnNpdGllcy5wbmciLCBpbWFnZT1weXByb3BoZXRfeHkpCiMjIGhtbSBJIGRvIG5vdCBzZWUgYSBzdHJvbmcgdHJlbmQKCiMjIFRoaXMgaGFzIHNvIGZhciBiZWVuIGEgcHJldHR5IHJlbGlhYmxlIHBsb3QgdG8gc2hvdyB0aGF0IHRoZSBvYnNlcnZlZCBwZWFrIHdpZHRocyBhcmUKIyMgdmVyeSBjb25zaXN0ZW50IGFjcm9zcyBzYW1wbGVzLgpweXByb3BoZXRfbHdpZHRocyA8LSBzbShwbG90X3B5cHJvcGhldF94eSgKICBweXByb3BoZXRfZnVuLAogIHhfdHlwZT0iY291bnQiLCB5X3R5cGU9ImxlZnR3aWR0aCIpKQpwcChmaWxlPSJpbWFnZXMvd2hvbGVfbHdpZHRoc192c19jb3VudHMucG5nIiwgaW1hZ2U9cHlwcm9waGV0X2x3aWR0aHMpCiMjIEluIHRoaXMgY2FzZSwgd2UgY2FuIHNlZSBzdHJvbmdseSB0aGF0IHNhbXBsZSAjMTcgaXMgc3RyYW5nZS4KYGBgCgojIyBTaG93IGEgc2VyaWVzIG9mIGFsbCBpZGVudGlmaWNhdGlvbnMgZm9yIG1hcmtlciBwcm90ZWlucwoKVGhlcmUgYXJlIGEgZmV3IHByb3RlaW5zIGZvciB3aGljaCBWb2xrZXIgaGFzIHJlbGF0aXZlbHkgc3BlY2lmaWMKYXNzdW1wdGlvbnMvZXhwZWN0YXRpb25zLiAgTGV0IHVzIHNlZSB3aGF0IHRoZXkgbG9vayBsaWtlIGFuZCBpZiB0aGV5IGZvbGxvdyBhCnRyZW5kIHdoaWNoIG1ha2VzIHNvbWUgc2Vuc2UuLi4KClRoZSBwcmltYXJ5IHRoaW5nIHRvIHJlY2FsbCwgSSB0aGluaywgaXMgdGhhdCBpbiBvdXIgcHJldmlvdXMgZGF0YSBzZXRzLCB0aGVyZQp3ZXJlIGEgcHJldHR5IGxhcmdlIG51bWJlciBvZiBzYW1wbGVzIGZvciB3aGljaCBubyBpZGVudGlmaWNhdGlvbnMgd2VyZSBtYWRlIGZvcgptYW55IG9mIHRoZXNlIHByb3RlaW5zLiAgRG9lcyB0aGF0IHJlbWFpbiB0cnVlPwoKYGBge3IgcGxvdF9pbmRpdmlkdWFsX3Byb3RlaW5zfQppbnRlbnNpdGllc19lc3hHIDwtIHNtKHBsb3RfcHlwcm9waGV0X3Byb3RlaW4ocHlwcm9waGV0X2Z1biwgc2NhbGU9ImxvZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT0iZXN4RyBJbnRlbnNpdGllcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW49ImludGVuc2l0eSIsIHByb3RlaW49IlJ2MDI4NyIpKQpwcChmaWxlPXBhc3RlMCgiaW1hZ2VzL3dob2xlX29zd19lc3hHX2ludGVuc2l0aWVzLXYiLCB2ZXIsICIucG5nIiksIGltYWdlPWludGVuc2l0aWVzX2VzeEcpCiMjIElzIHRoaXMgYSBnb29kIG9yIHRlcnJpYmxlIHNwcmVhZCBvZiBvYnNlcnZlZCBpbnRlbnNpdGllcyBmb3IgcHJvdGVvbWljcyBkYXRhPwojIyBJZiBJIGZvdW5kIGEgcmFuZ2UgbGlrZSB0aGlzIGluIFJOQVNlcSBkYXRhLCBJIHdvdWxkIGp1c3QgdGhyb3cgaXQgYXdheSBvdXQgb2YgaGFuZC4KIyMgU2FtcGxlIDE3IGRpZCBub3QgaGF2ZSBhbnkgb2JzZXJ2YXRpb25zLCBidXQgZXZlcnl0aGluZyBlbHNlIGRpZC4KCiMjIFRoZSByYW5nZSBvZiBkUlQgdmFsdWVzLiBJIHdpc2ggdGhpcyBtZXRyaWMgbWFkZSBzZW5zZSB0byBtZSEKZHJ0X2VzeEcgPC0gcGxvdF9weXByb3BoZXRfcHJvdGVpbihweXByb3BoZXRfZnVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbj0iZGVsdGFfcnQiLCBwcm90ZWluPSJSdjAyODciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9kYXRhPTEwMCwgbWF4X2RhdGE9MTAwMCkKZHJ0X2VzeEcKCmludGVuc2l0aWVzX2VzeEggPC0gcGxvdF9weXByb3BoZXRfcHJvdGVpbihweXByb3BoZXRfZnVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9ImVzeEggSW50ZW5zaXRpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU9ImxvZyIsIGNvbHVtbj0iaW50ZW5zaXR5IiwgcHJvdGVpbj0iUnYwMjg4IikKcHAoZmlsZT1wYXN0ZTAoImltYWdlcy93aG9sZV9vc3dfZXN4SF9pbnRlbnNpdGllcy12IiwgdmVyLCAiLnBuZyIpLCBpbWFnZT1pbnRlbnNpdGllc19lc3hIKQojIyBBbGwgc2FtcGxlcyBoYXZlIG9ic2VydmF0aW9ucywgYnV0IGEgYml0IHNwYXJzZXIuCgppbnRlbnNpdGllc19scHFIIDwtIHBsb3RfcHlwcm9waGV0X3Byb3RlaW4ocHlwcm9waGV0X2Z1biwgc2NhbGU9ImxvZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT0ibHBxSF9pbnRlbnNpdGllcyIsIGNvbHVtbj0iaW50ZW5zaXR5IiwgcHJvdGVpbj0iUnYzNzYzIikKcHAoZmlsZT1wYXN0ZTAoImltYWdlcy93aG9sZV9vc3dfbHBxaF9pbnRlbnNpdGllcy12IiwgdmVyLCAiLnBuZyIpLCBpbWFnZT1pbnRlbnNpdGllc19scHFIKQojIyBWZXJ5IGZldyBvYnNlcnZhdGlvbnMsIGJ1dCB0aGV5IGFyZSByZWxhdGl2ZWx5IGNvbnNpc3RlbnQ/CgppbnRlbnNpdGllc19ncm9lbDEgPC0gcGxvdF9weXByb3BoZXRfcHJvdGVpbihweXByb3BoZXRfZnVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT0iZ3JvRUwxIGludGVuc2l0aWVzIiwgc2NhbGU9ImxvZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbj0iaW50ZW5zaXR5IiwgcHJvdGVpbj0iUnYzNDE3IikKcHAoZmlsZT1wYXN0ZTAoImltYWdlcy93aG9sZV9vc3dfZ3JvZWwxX2ludGVuc2l0aWVzLXYiLCB2ZXIsICIucG5nIiksIGltYWdlPWludGVuc2l0aWVzX2dyb2VsMSkKCmludGVuc2l0aWVzX2dyb2VsMiA8LSBwbG90X3B5cHJvcGhldF9wcm90ZWluKHB5cHJvcGhldF9mdW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPSJncm9FTDIgaW50ZW5zaXRpZXMiLCBzY2FsZT0ibG9nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uPSJpbnRlbnNpdHkiLCBwcm90ZWluPSJSdjA0NDAiKQpwcChmaWxlPXBhc3RlMCgiaW1hZ2VzL3dob2xlX29zd19ncm9lbDJfaW50ZW5zaXRpZXMtdiIsIHZlciwgIi5wbmciKSwgaW1hZ2U9aW50ZW5zaXRpZXNfZ3JvZWwyKQojIyBNYW4gSSBhbSBsb3ZpbmcgdGhlIGRlbnNpdHkgb2Ygb2JzZXJ2YXRpb24sIGJ1dCBJIHdpc2ggdGhleSB3ZXJlIG1vcmUgY29uc2lzdGVudCEKIyMgQWxzbywgc2FtcGxlIDE3IGlzIHNwYXJzZXIuCgppbnRlbnNpdGllc19mYXAgPC0gcGxvdF9weXByb3BoZXRfcHJvdGVpbihweXByb3BoZXRfZnVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT0iZmFwIGludGVuc2l0aWVzIiwgc2NhbGU9ImxvZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbj0iaW50ZW5zaXR5IiwgcHJvdGVpbj0iUnYxODYwIikKcHAoZmlsZT1wYXN0ZTAoImltYWdlcy93aG9sZV9vc3dfZmFwX2ludGVuc2l0aWVzLXYiLCB2ZXIsICIucG5nIiksIGltYWdlPWludGVuc2l0aWVzX2ZhcCkKIyMgU2FtcGxlIDE3IGlzIGJhc2ljYWxseSBhIG51bGwuCgppbnRlbnNpdGllc19rYXRnIDwtIHBsb3RfcHlwcm9waGV0X3Byb3RlaW4ocHlwcm9waGV0X2Z1biwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPSJrYXRHIGludGVuc2l0aWVzIiwgc2NhbGU9ImxvZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW49ImludGVuc2l0eSIsIHByb3RlaW49IlJ2MTkwOCIpCnBwKGZpbGU9ImltYWdlcy93aG9sZV9vc3dfa2F0Z19pbnRlbnNpdGllcy5wbmciLCBpbWFnZT1pbnRlbnNpdGllc19rYXRnKQojIyBXaGF0IGlzIHVwIHdpdGggdGhhdCBvbmUsIHdlaXJkbHkgbG93LCBvYnNlcnZhdGlvbiBmb3IgZWFjaCBzYW1wbGU/CmBgYAoKIyBTdGFydCBTV0FUSDJzdGF0cwoKSSB3YW50IHRvIGxvYWQgdGhlIGRhdGEgYW5kIG1ldGFkYXRhIGludG8gU1dBVEgyc3RhdHMgaW4gcHJlcGFyYXRpb24gZm9yIE1Tc3RhdHMKYW5kIG15IG93biBocGdsdG9vbHMtYmFzZSBhbmFseXNlcy4KCmBgYHtyIHRiX3N3YXRoMnN0YXRzX2luaXRpYWx9CnRyaWNfZmlsZSA8LSBmaWxlLnBhdGgoInByZXByb2Nlc3NpbmciLCAiMDl0cmljIiwgdmVyLCAid2hvbGVfOG16X3R1YmVyY3VsaXN0IiwgImNvbWV0X0hDRC50c3YiKQp0cmljX2RhdGEgPC0gcmVhZHI6OnJlYWRfdHN2KHRyaWNfZmlsZSkKdHJpY19kYXRhW1siUHJvdGVpbk5hbWUiXV0gPC0gZ3N1YihwYXR0ZXJuPSJeKC4qKV8uKiQiLCByZXBsYWNlbWVudD0iXFwxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4PXRyaWNfZGF0YVtbIlByb3RlaW5OYW1lIl1dKQpzYW1wbGVfc2hlZXQgPC0gZmlsZS5wYXRoKCJzYW1wbGVfc2hlZXRzIiwgZ2x1ZTo6Z2x1ZSgiTXRiX2RpYV9zYW1wbGVzX3t2ZXJ9Lnhsc3giKSkKc2FtcGxlX2Fubm90IDwtIGV4dHJhY3RfbWV0YWRhdGEoc2FtcGxlX3NoZWV0KQprZXB0IDwtICEgZ3JlcGwoeD1yb3duYW1lcyhzYW1wbGVfYW5ub3QpLCBwYXR0ZXJuPSJec1xcLlxcLiIpCnNhbXBsZV9hbm5vdCA8LSBzYW1wbGVfYW5ub3Rba2VwdCwgXQpkZXZ0b29sczo6bG9hZF9hbGwoIn4vc2NyYXRjaC9naXQvU1dBVEgyc3RhdHNfbXlmb3JrZWQiKQpzMnNfZXhwIDwtIHNhbXBsZV9hbm5vdGF0aW9uKGRhdGE9dHJpY19kYXRhLCB2ZXJib3NlPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlX2Fubm90YXRpb249c2FtcGxlX2Fubm90LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxwZXB0aWRlbmFtZV9jb2x1bW49ImZ1bGxwZXB0aWRlbmFtZSIpCmBgYAoKTm93IEkgaGF2ZSBhIGNvdXBsZSBkYXRhIHN0cnVjdHVyZXMgd2hpY2ggc2hvdWxkIHByb3ZlIHVzZWZ1bCBmb3IgdGhlIG1ldHJpY3MKcHJvdmlkZWQgYnkgU1dBVEgyc3RhdHMsIE1Tc3RhdHMsIGFuZCBteSBvd24gaHBnbHRvb2xzLgoKIyBTV0FUSDJzdGF0cyBjb250aW51ZWQKClRoZSB2YXJpb3VzIG1ldHJpY3MgYW5kIGZpbHRlcnMgcHJvdmlkZWQgYnkgU1dBVEgyc3RhdHMgc2VlbSBxdWl0ZSByZWFzb25hYmxlIHRvCm1lLiAgVGhlIG9ubHkgdGhpbmcgdGhhdCByZWFsbHkgYm90aGVycyBtZSBpcyB0aGF0IHRoZXkgYXJlIGFsbCBjYXNlIHNlbnNpdGl2ZQphbmQgSSBmb3VuZCB0aGF0IHRoZSBtb3N0IHJlY2VudCB0cmljIGNoYW5nZWQgdGhlIGNhcGl0YWxpemF0aW9uIG9mIGEgY29sdW1uLApjYXVzaW5nIHRoZXNlIHRvIGFsbCBmYWxsIGRvd24uICBUaGVyZWZvcmUgSSB3ZW50IGluIGFuZCBtYWRlIGV2ZXJ5dGhpbmcgY2FzZQppbnNlbnNpdGl2ZSBpbiBhIGZhc2hpb24gc2ltaWxhciB0byB0aGF0IGRvbmUgYnkgTVNzdGF0cyAoZXhjZXB0IEkgaGF0ZSBjYXBpdGFsCmxldHRlcnMsIHNvIEkgdXNlZCB0b2xvd2VyKCkgcmF0aGVyIHRoYW4gdG91cHBlcigpKS4KCiMjIFBlcmZvcm0gZmlsdGVycwoKVGhlIGZvbGxvd2luZyBibG9jayBwZXJmb3JtcyB0aGUgbWV0cmljcyBhbmQgZmlsdGVycyBzdWdnZXN0ZWQgYnkgc3dhdGgyc3RhdHMuClRoZXNlIGZpcnN0IGRlZmluZSB0aGUgZGVjb3kgaGl0IHJhdGUgaW4gdGhlIGRhdGEsIHRoZW4gZmlsdGVyIHRoZSBkYXRhIGJhc2VkIG9uCnRoYXQuICBJdCBhbHNvIGZpbHRlcnMgb3V0IGhpdHMgd2l0aCBsZXNzIHRoYW4gaWRlYWwgbS1zY29yZXMgYW5kIHByb3RlaW5zIHdpdGgKbm9uLW9wdGltYWwgZGlzdHJpYnV0aW9ucyBvZiBwZXB0aWRlIGhpdHMgKGVpdGhlciBkdWUgdG8gdG9vIGZldyBwZXB0aWRlcyBvciBhCndlaXJkIGRpc3RyaWJ1dGlvbiBvZiBpbnRlbnNpdGllcykuCgpgYGB7ciB0Yl9zd2F0aDJzdGF0c19wcm9jZXNzaW5nfQojIyBHZXQgY29ycmVsYXRpb25zIG9uIGEgc2FtcGxlIGJ5IHNhbXBsZSBiYXNpcwpwcChmaWxlPWdsdWU6OmdsdWUoImltYWdlcy9zMnNfY29ycmVsYXRpb24tdnt2ZXJ9LnBuZyIpKQpzYW1wbGVfY29uZF9yZXBfY29yIDwtIHBsb3RfY29ycmVsYXRpb25fYmV0d2Vlbl9zYW1wbGVzKAogIHMyc19leHAsIHNpemU9MiwKICBjb21wYXJpc29uPXRyYW5zaXRpb25fZ3JvdXBfaWQgfgogICAgY29uZGl0aW9uICsgYmlvcmVwbGljYXRlICsgcnVuLAogIGZ1bi5hZ2dyZWdhdGU9bWVhbiwKICBjb2x1bW4udmFsdWVzPSJpbnRlbnNpdHkiKQpkZXYub2ZmKCkKCiMjIERvIHRoZSBzYW1lIHRoaW5nLCBidXQgdXNlIHRoZSBzdW0gb2YgdGhlIGludGVuc2l0aWVzIHBlcHRpZGUvcHJvdGVpbgojIyBpbnN0ZWFkIG9mIHRoZSBtZWFuLi4uCnNhbXBsZV9jb25kX3JlcF9jb3IgPC0gcGxvdF9jb3JyZWxhdGlvbl9iZXR3ZWVuX3NhbXBsZXMoCiAgczJzX2V4cCwgc2l6ZT0yLAogIGNvbXBhcmlzb249dHJhbnNpdGlvbl9ncm91cF9pZCB+CiAgICBjb25kaXRpb24gKyBiaW9yZXBsaWNhdGUgKyBydW4sCiAgZnVuLmFnZ3JlZ2F0ZT1zdW0sCiAgY29sdW1uLnZhbHVlcz0iaW50ZW5zaXR5IikKCiMjIEkgd291bGQgbG92ZSB0byBrbm93IHdoeSBpdCBpcyB0aGF0IHRoZSBzcGVhcm1hbiBhbmQgcGVhcnNvbiBjb3JyZWxhdGlvbnMKIyMgaW4gdGhpcyBkYXRhIGFyZSBzbyBvZGRseSBkaWZmZXJlbnQgY29tcGFyZSB0byBwcmV2aW91cyBkYXRhIHNldHMuICBJcyB0aGlzCiMjIGFuIGFydGlmYWN0IG9mIHRoZSBmYWN0IHRoYXQgdGhpcyB0aW1lIEkgYW0gX29ubHlfIGxvb2tpbmcgYXQgQ0Ygc2FtcGxlcz8KIyMgQXJlIHRoZSBoaWdoIGludGVuc2l0eSBudW1iZXJzIG1lc3Npbmcgd2l0aCBub24tcmFuay1iYXNlZCBjb3JyZWxhdGlvbnM/CmBgYAoKIyMgUGVyZm9ybSBTV0FUSDJzdGF0cyBmaWx0ZXJzCgpJIGp1c3QgcmVhbGl6ZWQgc29tZXRoaW5nIHdoaWNoIHNob3VsZCBiZSBhZGRlZCB0byBtZSBTV0FUSDJzdGF0cyBmb3JrOgpBIHNpbXBsaWZpZWQgZmlsdGVyIGZ1bmN0aW9ucyB3aGljaCBpbnZva2VzIGFsbCBvZiB0aGVzZSBzbyB0aGF0IEkgY2FuIG1ha2Ugc3VyZQp0aGF0IHRoZXJlIGFyZSBubyB0eXBlb2dyYXBoaWthbCBlcnJvcnMgaW50cm9kdWNlZCBieSBteSBpbnZvY2F0aW9uIG9mIGVhY2ggb2YKdGhlc2UgdGhpbmdzLCBvbmUgYXQgYSB0aW1lLgoKYGBge3Igc3dhdGgyc3RhdHNfZmlsdGVycywgZmlnLnNob3c9ImhpZGUifQpkZWNveV9saXN0cyA8LSBhc3Nlc3NfZGVjb3lfcmF0ZShzMnNfZXhwKQojIyBUaGlzIHNlZW1zIGEgYml0IGhpZ2ggdG8gbWUsIHllc25vPwpmZHJfb3ZlcmFsbCA8LSBhc3Nlc3NfZmRyX292ZXJhbGwoczJzX2V4cCwgb3V0cHV0PSJSY29uc29sZSIsIHBsb3Q9VFJVRSkKCmJ5cnVuX2ZkciA8LSBhc3Nlc3NfZmRyX2J5cnVuKHMyc19leHAsIEZGVD0wLjcsIHBsb3Q9VFJVRSwgb3V0cHV0PSJSY29uc29sZSIpCmNob3Nlbl9tc2NvcmUgPC0gbXNjb3JlNGFzc2F5ZmRyKHMyc19leHAsIEZGVD0wLjcsIGZkcl90YXJnZXQ9MC4wMikKcHJvdF9zY29yZSA8LSBtc2NvcmU0cHJvdGZkcihzMnNfZXhwLCBGRlQ9MC43LCBmZHJfdGFyZ2V0PTAuMDIpCgpmaWx0ZXJlZF9tcyA8LSBmaWx0ZXJfbXNjb3JlKHMyc19leHAsIGNob3Nlbl9tc2NvcmUsIHJtLmRlY295PVRSVUUpCmZpbHRlcmVkX2ZxIDwtIGZpbHRlcl9tc2NvcmVfZnJlcW9icyhzMnNfZXhwLCAwLjAxLCAwLjgsIHJtLmRlY295PVRSVUUpCmZpbHRlcmVkX21zX2ZkciA8LSBmaWx0ZXJfbXNjb3JlX2ZkcihmaWx0ZXJlZF9tcywgRkZUPTAuNywgcm0uZGVjb3k9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJhbGxfcHJvdGVpbl9mZHJfdGFyZ2V0PXByb3Rfc2NvcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlcl9vdmVyYWxsX3BlcHRpZGVfZmRyX2xpbWl0PTAuMDUpCmZpbHRlcmVkX21zX2Zkcl9wciA8LSBmaWx0ZXJfcHJvdGVvdHlwaWNfcGVwdGlkZXMoZmlsdGVyZWRfbXMsIHJtLmRlY295PVRSVUUpCmZpbHRlcmVkX21zX2Zkcl9wcl9hbGwgPC0gZmlsdGVyX2FsbF9wZXB0aWRlcyhmaWx0ZXJlZF9tc19mZHJfcHIpCmZpbHRlcmVkX21zX2Zkcl9wcl9hbGxfc3RyIDwtIGZpbHRlcl9vbl9tYXhfcGVwdGlkZXMoZGF0YT1maWx0ZXJlZF9tc19mZHJfcHJfYWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fcGVwdGlkZXM9MTAsIHJtLmRlY295PVRSVUUpCm9sZF9maWx0ZXJlZF9hbGxfZmlsdGVycyA8LSBmaWx0ZXJfb25fbWluX3BlcHRpZGVzKGRhdGE9ZmlsdGVyZWRfbXNfZmRyX3ByX2FsbF9zdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9wZXB0aWRlcz0zLCBybS5kZWNveT1UUlVFKQoKZmlsdGVyZWRfYWxsX2ZpbHRlcnMgPC0gczJzX2FsbF9maWx0ZXJzKHMyc19leHAsIHRhcmdldF9mZHI9MC4xLCBtc2NvcmU9MC4xLCB1cHBlcl9mZHI9MC4xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9fbWluPUZBTFNFKQpgYGAKCiMjIFdyaXRlIG91dCBtYXRyaWNlcyBvZiB0aGUgcmVzdWx0cwoKc3dhdGgyc3RhdHMgcHJvdmlkZXMgYSBjb3VwbGUgb2Ygd2F5cyB0byBwcmludCBvdXQgaXRzIHJlc3VsdHMsIG9uZSBpbiBhIGZvcm1hdApzcGVjaWZpY2FsbHkgaW50ZW5kZWQgZm9yIE1Tc3RhdHMsIGFuZCBhbm90aGVyIGFzIGEgbW9yZSBjYW5vbmljYWwgbWF0cml4IG9mCnJvd3MgPSBwcm90ZWlucywgY29sdW1ucyA9IHNhbXBsZXMuCgpMZXQgdXMgcmVzZXQgdGhlIHZlcnNpb24gYmFjayB0byAyMDE5MDMyNyBoZXJlLgoKYGBge3Igc3dhdGgyc3RhdHNfbWF0cmljZXN9CiMjIEkgdGhpbmsgdGhlc2UgbWF0cml4ZXMgYXJlIHByb2JhYmx5IHNtYXJ0ZXIgdG8gdXNlIHRoYW4gdGhlIHJhdyBvdXRtYXRyaXggZnJvbSB0cmljLgojIyBCdXQgSSBhbSBub3QgYSBmYW4gb2YgcmVyd3JpdGluZyB0aGUgc2FtcGxlIGNvbHVtbiBuYW1lcy4KbWF0cml4X3ByZWZpeCA8LSBmaWxlLnBhdGgoInByZXByb2Nlc3NpbmciLCAiMTBzd2F0aDJzdGF0cyIsIHZlcikKaWYgKCFmaWxlLmV4aXN0cyhtYXRyaXhfcHJlZml4KSkgewogIGRpci5jcmVhdGUobWF0cml4X3ByZWZpeCkKfQoKIyMgSSB3YW50IHRvIHdyaXRlIGEgZmV3IGl0ZXJhdGlvbnMgb2YgdGhlIGZpbHRlcmVkIGRhdGEKIyMgU3RhcnRpbmcgd2l0aCB0aGUgcmF3IGFuZCBtb3ZpbmcgZG93biwgcGVyaGFwcyBJIHNob3VsZCBqdXN0CiMjIGFkZCB0aGlzIGxvZ2ljIHRvIG15IGZhbmN5IG5ldyBmaWx0ZXJpbmcgZnVuY3Rpb24/CnByb3RlaW5fbWF0cml4X3VuZmlsdCA8LSB3cml0ZV9tYXRyaXhfcHJvdGVpbnMoCiAgZmlsdGVyZWRfYWxsX2ZpbHRlcnNbWyJyYXciXV0sIHdyaXRlLmNzdj1UUlVFLAogIGZpbGVuYW1lPWZpbGUucGF0aChtYXRyaXhfcHJlZml4LCAicHJvdGVpbl9tYXRyaXhfdW5maWx0ZXJlZC5jc3YiKSkKZGltKHByb3RlaW5fbWF0cml4X3VuZmlsdCkKcHJvdGVpbl9tYXRyaXhfbXNjb3JlIDwtIHdyaXRlX21hdHJpeF9wcm90ZWlucygKICBmaWx0ZXJlZF9hbGxfZmlsdGVyc1tbIm1zY29yZV9maWx0ZXJlZCJdXSwgd3JpdGUuY3N2PVRSVUUsCiAgZmlsZW5hbWU9ZmlsZS5wYXRoKG1hdHJpeF9wcmVmaXgsICJwcm90ZWluX21hdHJpeF9tc2NvcmUuY3N2IikpCmRpbShwcm90ZWluX21hdHJpeF9tc2NvcmUpCnBlcHRpZGVfbWF0cml4X21zY29yZSA8LSB3cml0ZV9tYXRyaXhfcGVwdGlkZXMoCiAgZmlsdGVyZWRfYWxsX2ZpbHRlcnNbWyJtc2NvcmVfZmlsdGVyZWQiXV0sIHdyaXRlLmNzdj1UUlVFLAogIGZpbGVuYW1lPWZpbGUucGF0aChtYXRyaXhfcHJlZml4LCAicGVwdGlkZV9tYXRyaXhfbXNjb3JlLmNzdiIpKQpkaW0ocGVwdGlkZV9tYXRyaXhfbXNjb3JlKQpwcm90ZWluX21hdHJpeF9maWx0ZXJlZCA8LSB3cml0ZV9tYXRyaXhfcHJvdGVpbnMoCiAgZmlsdGVyZWRfYWxsX2ZpbHRlcnNbWyJmaW5hbCJdXSwgd3JpdGUuY3N2PVRSVUUsCiAgZmlsZW5hbWU9ZmlsZS5wYXRoKG1hdHJpeF9wcmVmaXgsICJwcm90ZWluX21hdHJpeF9maWx0ZXJlZC5jc3YiKSkKZGltKHByb3RlaW5fbWF0cml4X2ZpbHRlcmVkKQpwZXB0aWRlX21hdHJpeF9maWx0ZXJlZCA8LSB3cml0ZV9tYXRyaXhfcGVwdGlkZXMoCiAgZmlsdGVyZWRfYWxsX2ZpbHRlcnNbWyJmaW5hbCJdXSwgd3JpdGUuY3N2PVRSVUUsCiAgZmlsZW5hbWU9ZmlsZS5wYXRoKG1hdHJpeF9wcmVmaXgsICJwZXB0aWRlX21hdHJpeF9maWx0ZXJlZC5jc3YiKSkKZGltKHBlcHRpZGVfbWF0cml4X2ZpbHRlcmVkKQoKIyMgRG8gdGhlIGNvcnJlbGF0aW9uIG9mIHRoZSBzdW0gb2YgcGVwdGlkZXMvcHJvdGVpbgpydF9zdW1fY29yIDwtIHBsb3RfY29ycmVsYXRpb25fYmV0d2Vlbl9zYW1wbGVzKAogIGZpbHRlcmVkX2FsbF9maWx0ZXJzW1siZmluYWwiXV0sIGNvbHVtbi52YWx1ZXM9ImludGVuc2l0eSIsCiAgZnVuLmFnZ3JlZ2F0ZT1zdW0sIHNpemU9MiwKICBjb21wYXJpc29uPXRyYW5zaXRpb25fZ3JvdXBfaWQgfgogICAgY29uZGl0aW9uICsgYmlvcmVwbGljYXRlICsgcnVuKQoKIyMgQW5kIHRoZWlyIG1lYW5zCnJ0X21lYW5fY29yIDwtIHBsb3RfY29ycmVsYXRpb25fYmV0d2Vlbl9zYW1wbGVzKAogIGZpbHRlcmVkX2FsbF9maWx0ZXJzW1siZmluYWwiXV0sIGNvbHVtbi52YWx1ZXM9ImludGVuc2l0eSIsCiAgZnVuLmFnZ3JlZ2F0ZT1tZWFuLCBzaXplPTIsCiAgY29tcGFyaXNvbj10cmFuc2l0aW9uX2dyb3VwX2lkIH4KICAgIGNvbmRpdGlvbiArIGJpb3JlcGxpY2F0ZSArIHJ1bikKCmNvbHMgPC0gY29sbmFtZXMoZmlsdGVyZWRfYWxsX2ZpbHRlcnNbWyJmaW5hbCJdXSkKZGlzYWdncmVnYXRlZCA8LSBkaXNhZ2dyZWdhdGUoZmlsdGVyZWRfYWxsX2ZpbHRlcnNbWyJmaW5hbCJdXSwgYWxsLmNvbHVtbnM9VFJVRSkKbXNzdGF0c19pbnB1dCA8LSBjb252ZXJ0X01Tc3RhdHMoZGlzYWdncmVnYXRlZCkKYGBgCgojIFRlc3QgYUxGUQoKSSB3YW50IHRvIHJldmlzaXQgYUxGUSwgSSB0aGluayBpdCBtaWdodCBwcm92aWRlIGJldHRlciBwcm90ZWluLWxldmVsCnF1YW50aWZpY2F0aW9uIG1ldGhvZHMuICBhTEZRIGxvb2tzIHByb21pc2luZywgYnV0IEkgaGF2ZSBub3QgZmlndXJlZCBvdXQgdmFsaWQKcGFyYW1ldGVycyBmb3IgdXNpbmcgaXQuCgpgYGB7ciBhbGZxLCBldmFsPUZBTFNFfQpzdW1tYXJ5KG1zc3RhdHNfaW5wdXQpCmRldnRvb2xzOjpsb2FkX2FsbCgifi9zY3JhdGNoL2dpdC9hTEZRIikKYWxmcV9pbnB1dCA8LSB0cmljX2RhdGFbLCBjKCJhbGlnbl9vcmlnZmlsZW5hbWUiLCAiUHJvdGVpbk5hbWUiLCAiRnVsbFBlcHRpZGVOYW1lIiwgInRyYW5zaXRpb25fZ3JvdXBfaWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZ1bGxQZXB0aWRlTmFtZSIsICJDaGFyZ2UiLCAiSW50ZW5zaXR5IildCmNvbG5hbWVzKGFsZnFfaW5wdXQpIDwtIGMoInJ1bl9pZCIsICJwcm90ZWluX2lkIiwgInBlcHRpZGVfaWQiLCAidHJhbnNpdGlvbl9pZCIsICJwZXB0aWRlX3NlcXVlbmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAicHJlY3Vyc29yX2NoYXJnZSIsICJ0cmFuc2l0aW9uX2ludGVuc2l0eSIpCmFsZnFfaW5wdXRbWyJjb25jZW50cmF0aW9uIl1dIDwtICI/IgphbGZxX2luZmVyZW5jZSA8LSBhTEZROjpQcm90ZWluSW5mZXJlbmNlLmRlZmF1bHQoYWxmcV9pbnB1dCwgY29uc2Vuc3VzX3Byb3RlaW5zPUZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc2Vuc3VzX3BlcHRpZGVzPUZBTFNFLCB0cmFuc2l0aW9uX3N0cmljdG5lc3M9Imxvb3NlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNlbnN1c190cmFuc2l0aW9ucz1GQUxTRSkKYWxmcV9xdWFudGl0aWVzIDwtIGFMRlE6OkFic29sdXRlUXVhbnRpZmljYXRpb24uZGVmYXVsdChhbGZxX2luZmVyZW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbF9wcm90ZWluX2NvbmNlbnRyYXRpb249MTAwKQoKc3VtbWFyeShhbGZxX3F1YW50aXRpZXNbWzJdXSkKYWxmcV9ub3JtIDwtIGFsZnFfcXVhbnRpdGllc1tbMl1dCmFsZnFfbWluIDwtIG1pbihhbGZxX25vcm1bWyJub3JtYWxpemVkX2NvbmNlbnRyYXRpb24iXV0pCmFsZnFfbm9ybVtbIm5vcm0iXV0gPC0gYWxmcV9ub3JtW1sibm9ybWFsaXplZF9jb25jZW50cmF0aW9uIl1dIC8gYWxmcV9taW4KIyMgSG1tIHRoYXQgZG9lcyBub3QgbG9vayByaWdodC4KYGBgCgojIyBNU3N0YXRzCgptc3N0YXRzLm9yZyBzZWVtcyB0byBwcm92aWRlIGEgY29tcGxldGUgc29sdXRpb24gZm9yIHBlcmZvcm1pbmcgcmVhc29uYWJsZSBtZXRyaWNzIG9mIHRoaXMgZGF0YS4KCkkgYW0gY3VycmVudGx5IHJlYWRpbmc6IGh0dHA6Ly9tc3N0YXRzLm9yZy93cC1jb250ZW50L3VwbG9hZHMvMjAxNy8wMS9NU3N0YXRzX3YzLjcuM19tYW51YWwucGRmCgpJIG1hZGUgc29tZSBtb2RlcmF0ZWx5IGludHJ1c2l2ZSBjaGFuZ2VzIHRvIE1Tc3RhdHMgdG8gbWFrZSBpdCBjbGVhcmVyLCBhcyB3ZWxsLgoKYGBge3IgdGJfbXNzdGF0c19xdWFudCwgZXZhbD1GQUxTRX0KdHQgPC0gc20oZGV2dG9vbHM6OmxvYWRfYWxsKCJ+L3NjcmF0Y2gvZ2l0L01Tc3RhdHMiKSkKCm1zc3RhdHNfdmVyIDwtICIyMDE5MDgwMSIKY2hlY2twb2ludCA8LSBwYXN0ZTAoIm1zc3RhdHNfZGF0YXByb2Nlc3MtdiIsIG1zc3RhdHNfdmVyLCAiLnJkYSIpCmlmIChmaWxlLmV4aXN0cyhjaGVja3BvaW50KSkgewogIGxvYWQoZmlsZT1jaGVja3BvaW50KQp9IGVsc2UgewogIG1zc3RhdHNfcXVhbnQgPC0gZGF0YVByb2Nlc3MobXNzdGF0c19pbnB1dCkKICBzYXZlKGZpbGU9Y2hlY2twb2ludCwgbGlzdD1jKCJtc3N0YXRzX3F1YW50IikpCn0KCiMjY2hlY2twb2ludCA8LSBwYXN0ZTAoIm1zc3RhdHNfcGxvdHMtdiIsIG1zc3RhdHNfdmVyLCAiLnJkYSIpCiMjaWYgKGZpbGUuZXhpc3RzKGNoZWNrcG9pbnQpKSB7CiMjICBsb2FkKGZpbGU9Y2hlY2twb2ludCkKIyN9IGVsc2UgewojIyAgbXNzdGF0c19wbG90cyA8LSBkYXRhUHJvY2Vzc1Bsb3RzKG1zc3RhdHNfcXVhbnQsIHR5cGU9IlFDUExPVCIpCiMjICBzYXZlKGZpbGU9Y2hlY2twb2ludCwgbGlzdD1jKCJtc3N0YXRzX3Bsb3RzIikpCiMjfQoKbXlfbGV2ZWxzIDwtIGxldmVscyhhcy5mYWN0b3IobXNzdGF0c19pbnB1dCRjb25kaXRpb24pKQpteV9sZXZlbHMKY29tcGFyaXNvbnMgPC0gbWFrZV9zaW1wbGlmaWVkX2NvbnRyYXN0X21hdHJpeCgKICBudW1lcmF0b3JzPWMoImR0X3dob2xlIiwgImNwX3dob2xlIiksCiAgZGVub21pbmF0b3JzPWMoInd0X3dob2xlIiwgInd0X3dob2xlIikpCgptc3N0YXRzX3Jlc3VsdHMgPC0gbGlzdCgpCmNoZWNrcG9pbnQgPC0gcGFzdGUwKCJtc3N0YXRzX2dyb3VwLXYiLCB2ZXIsICIucmRhIikKaWYgKGZpbGUuZXhpc3RzKGNoZWNrcG9pbnQpKSB7CiAgbG9hZChmaWxlPWNoZWNrcG9pbnQpCn0gZWxzZSB7CiAgZm9yIChjIGluIDE6bGVuZ3RoKHJvd25hbWVzKGNvbXBhcmlzb25zKSkpIHsKICAgIG5hbWUgPC0gcm93bmFtZXMoY29tcGFyaXNvbnMpW2NdCiAgICBtZXNzYWdlKCJTdGFydGluZyAiLCBuYW1lKQogICAgY29tcCA8LSBjb21wYXJpc29uc1tjLCBdCiAgICBjb21wIDwtIHQoYXMubWF0cml4KGNvbXApKQogICAgcm93bmFtZXMoY29tcCkgPC0gbmFtZQogICAgbXNzdGF0c19yZXN1bHRzW1tuYW1lXV0gPC0gc20oTVNzdGF0czo6Z3JvdXBDb21wYXJpc29uKGNvbnRyYXN0Lm1hdHJpeD1jb21wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE9bXNzdGF0c19xdWFudCkpCiAgICBtZXNzYWdlKCJGaW5pc2hlZCAiLCBuYW1lKQogIH0KICBzYXZlKGZpbGU9Y2hlY2twb2ludCwgbGlzdD1jKCJtc3N0YXRzX3Jlc3VsdHMiKSkKfQpgYGAKCiMjIyBQL1BFIHByb3RlaW4gUUMgcGxvdHMgZm9yIFlhbgoKWWFuIGFza2VkIGZvciB0aGUgcC9wZSBwcm90ZWluIHFjIHBsb3RzLiBvay4gIEkgY2hhbmdlZCB0aGUgZGF0YVByb2Nlc3NQbG90cyB0bwpyZXR1cm4gc29tZXRoaW5nIHVzZWZ1bCwgc28gdGhhdCBzaG91bGQgYmUgcG9zc2libGUgbm93LgoKYGBge3IgcGUsIGV2YWw9RkFMU0V9CnBlX2dlbmVzIDwtIHJlYWQudGFibGUoInJlZmVyZW5jZS9hbm5vdGF0ZWRfcGVfZ2VuZXMudHh0IilbWzFdXQoKIyMgVW5mb3J0dW5hdGVseSwgdGhlIG5hbWVzIGRpZCBub3QgZ2V0IHNldCBpbiBteSBjaGFuZ2VkIHZlcnNpb24gb2YgZGF0YVByb2Nlc3NQbG90cy4uLgpwbG90bHN0IDwtIG1zc3RhdHNfcGxvdHMkUUNQTE9UCmF2YWlsYWJsZV9wbG90cyA8LSBnc3ViKHBhdHRlcm49Il4xLyIsIHJlcGxhY2VtZW50PSIiLAogICAgICAgICAgICAgICAgICAgICAgICB4PWxldmVscyhtc3N0YXRzX3F1YW50JFByb2Nlc3NlZERhdGEkUFJPVEVJTikpCm5hbWVzKHBsb3Rsc3QpIDwtIGF2YWlsYWJsZV9wbG90cwoKcGVfaW5fYXZhaWxfaWR4IDwtIHBlX2dlbmVzICVpbiUgYXZhaWxhYmxlX3Bsb3RzCnBlX2luX2F2YWlsIDwtIHBlX2dlbmVzW3BlX2luX2F2YWlsX2lkeF0KcGVfcGxvdHMgPC0gcGxvdGxzdFtwZV9pbl9hdmFpbF0KcGRmKGZpbGU9InBlX3FjX3Bsb3RzLnBkZiIpCmZvciAocCBpbiAxOmxlbmd0aChwZV9wbG90cykpIHsKICBwbG90KHBlX3Bsb3RzW1twXV0pCn0KZGV2Lm9mZigpCmxlbmd0aChwZV9wbG90cykKYGBgCgojIENyZWF0ZSBocGdsdG9vbHMgZXhwcmVzc2lvbnNldAoKU2luY2UgSSBhbSBub3QgY2VydGFpbiBJIHVuZGVyc3RhbmQgdGhlc2UgZGF0YSwgSSB3aWxsIHRha2UgdGhlIGludGVuc2l0aWVzIGZyb20KU1dBVEgyc3RhdHMsIG1ldGFkYXRhLCBhbmQgYW5ub3RhdGlvbiBkYXRhOyAgYXR0ZW1wdCB0byBjcmVhdGUgYSAnbm9ybWFsJwpleHByZXNzaW9uc2V0OyBwb2tlIGF0IGl0IHRvIHNlZSB3aGF0IEkgY2FuIGxlYXJuLgoKIyMgTWFzc2FnaW5nIHRoZSBtZXRhZGF0YQoKSSB3YW50IHRvIHVzZSB0aGUgc2FtZSBtZXRhZGF0YSBhcyB3ZXJlIHVzZWQgZm9yIE1Tc3RhdHMuICBJdCBoYXMgYSBmZXcKaW1wb3J0YW50IGRpZmZlcmVuY2VzIGZyb20gdGhlIHJlcXVpcmVtZW50cyBvZiBocGdsdG9vbHM6IHByZXR0eSBtdWNoIG9ubHkgdGhhdApJIGRvIG5vdCBhbGxvdyByb3duYW1lcy9zYW1wbGVJRHMgdG8gc3RhcnQgd2l0aCBhIG51bWJlci4KCiMjIE1hc3NhZ2luZyB0aGUgaW50ZW5zaXR5IG1hdHJpeAoKSSBkbyBub3Qgd2FudCB0aGUgXDEgYmVmb3JlIHRoZSBwcm90ZWluIG5hbWVzLCBJIGFscmVhZHkgbWVyZ2VkIHRoZW0gaW50byBvbmUKZW50cnkgcGVyIGdlbmUgdmlhIFNXQVRIMnN0YXRzLgoKIyMjIFB5cHJvcGhldCBtYXRyaXgKClRoZXJlIGFyZSB0d28gd2F5cyB0byBnZXQgdGhlIG1hdHJpeCBvZiBpbnRlbnNpdGllcywgZWl0aGVyIGRpcmVjdGx5IGZyb20gcHlwcm9waGV0LCBvciBmcm9tCnRoZSBmaWx0ZXJlZCBkYXRhIHByb3ZpZGVkIGJ5IHN3YXRoMnN0YXRzLiAgSGVyZSBpcyB0aGUgZm9ybWVyLCBidXQgSSBzaG91bGQgYmUgdXNpbmcgdGhlIGxhdHRlci4KCmBgYHtyIHRiX3Byb3RlaW5fbWF0cml4LCBldmFsPUZBTFNFfQpwcm90X210cnggPC0gcmVhZC5jc3YoZmlsZS5wYXRoKCJwcmVwcm9jZXNzaW5nIiwgIjEwc3dhdGgyc3RhdHMiLCB2ZXIsICJwcm90ZWluX21hdHJpeF9maWx0ZXJlZC5jc3YiKSkKcm93bmFtZXMocHJvdF9tdHJ4KSA8LSBnc3ViKHBhdHRlcm49Il4xXFwvIiwgcmVwbGFjZW1lbnQ9IiIsIHg9cHJvdF9tdHJ4W1sicHJvdGVpbm5hbWUiXV0pCnByb3RfbXRyeCA8LSBwcm90X210cnhbLCAtMV0KcHJvdF9rZWVwZXJzIDwtIGdyZXBsKHBhdHRlcm49Il5SdiIsIHg9cm93bmFtZXMocHJvdF9tdHJ4KSkKcHJvdF9tdHJ4IDwtIHByb3RfbXRyeFtwcm90X2tlZXBlcnMsIF0KIyMgSW1wb3J0YW50IHF1ZXN0aW9uOiBEaWQgU1dBVEgyc3RhdHMgcmVvcmRlciBteSBkYXRhPwpjb2xuYW1lcyhwcm90X210cngpIDwtIGdzdWIocGF0dGVybj0iXiguKikoMjAxOC4qKSQiLCByZXBsYWNlbWVudD0ic1xcMiIsIHg9Y29sbmFtZXMocHJvdF9tdHJ4KSkKCnVuZmlsdF9tdHJ4IDwtIHJlYWQuY3N2KGZpbGUucGF0aCgicHJlcHJvY2Vzc2luZyIsICIxMHN3YXRoMnN0YXRzIiwgdmVyLCAicHJvdGVpbl9tYXRyaXhfdW5maWx0ZXJlZC5jc3YiKSkKcm93bmFtZXModW5maWx0X210cngpIDwtIGdzdWIocGF0dGVybj0iXjFcXC8iLCByZXBsYWNlbWVudD0iIiwgeD11bmZpbHRfbXRyeFtbInByb3RlaW5uYW1lIl1dKQp1bmZpbHRfbXRyeCA8LSB1bmZpbHRfbXRyeFssIC0xXQp1bmZpbHRfa2VlcGVycyA8LSBncmVwbChwYXR0ZXJuPSJeUnYiLCB4PXJvd25hbWVzKHVuZmlsdF9tdHJ4KSkKdW5maWx0X210cnggPC0gdW5maWx0X210cnhbdW5maWx0X2tlZXBlcnMsIF0KIyMgSW1wb3J0YW50IHF1ZXN0aW9uOiBEaWQgU1dBVEgyc3RhdHMgcmVvcmRlciBteSBkYXRhPwpjb2xuYW1lcyh1bmZpbHRfbXRyeCkgPC0gZ3N1YihwYXR0ZXJuPSJeKC4qKSgyMDE4LiopJCIsIHJlcGxhY2VtZW50PSJzXFwyIiwgeD1jb2xuYW1lcyh1bmZpbHRfbXRyeCkpCmBgYAoKIyMjIEZyb20gU1dBVEgyc3RhdHMKCmBgYHtyIHByb3RfbWF0cml4X3N3YXRoMnN0YXRzfQpwcm90X210cnggPC0gcHJvdGVpbl9tYXRyaXhfZmlsdGVyZWQKY29sbmFtZXMocHJvdF9tdHJ4KSA8LSBnc3ViKHg9Y29sbmFtZXMocHJvdF9tdHJ4KSwgcGF0dGVybj0iXiguKilfKDIwMTkuKikkIiwgcmVwbGFjZW1lbnQ9IlxcMiIpCnJvd25hbWVzKHByb3RfbXRyeCkgPC0gcHJvdF9tdHJ4W1sicHJvdGVpbm5hbWUiXV0KcHJvdF9tdHJ4W1sicHJvdGVpbm5hbWUiXV0gPC0gTlVMTApydl9pZHggPC0gZ3JlcGwoeD1yb3duYW1lcyhwcm90X210cngpLCBwYXR0ZXJuPSJeUnYiKQpwcm90X210cnggPC0gcHJvdF9tdHJ4W3J2X2lkeCwgXQoKdW5maWx0X210cnggPC0gcHJvdGVpbl9tYXRyaXhfdW5maWx0CmNvbG5hbWVzKHVuZmlsdF9tdHJ4KSA8LSBnc3ViKHg9Y29sbmFtZXModW5maWx0X210cngpLCBwYXR0ZXJuPSJeKC4qKV8oMjAxOS4qKSQiLCByZXBsYWNlbWVudD0iXFwyIikKcm93bmFtZXModW5maWx0X210cngpIDwtIGdzdWIocGF0dGVybj0iXjFcXC8iLCByZXBsYWNlbWVudD0iIiwgeD11bmZpbHRfbXRyeFtbInByb3RlaW5uYW1lIl1dKQp1bmZpbHRfbXRyeFtbInByb3RlaW5uYW1lIl1dIDwtIE5VTEwKcnZfaWR4IDwtIGdyZXBsKHg9cm93bmFtZXModW5maWx0X210cngpLCBwYXR0ZXJuPSJeUnYiKQp1bmZpbHRfbXRyeCA8LSB1bmZpbHRfbXRyeFtydl9pZHgsIF0KYGBgCgojIyBHcmFiIGFubm90YXRpb25zCgpgYGB7ciBtdGJfYW5ub3RhdGlvbnN9CiMjIFRoZSBvbGQgd2F5IG9mIGdldHRpbmcgZ2Vub21lL2Fubm90YXRpb24gZGF0YQptdGJfZ2ZmIDwtICJyZWZlcmVuY2UvbXljb2JhY3Rlcml1bV90dWJlcmN1bG9zaXNfaDM3cnZfMi5nZmYuZ3oiCm10Yl9nZW5vbWUgPC0gInJlZmVyZW5jZS9tdHViZXJjdWxvc2lzX2gzN3J2X2dlbmJhbmsuZmFzdGEiCm10Yl9jZHMgPC0gInJlZmVyZW5jZS9tdGJfY2RzLmZhc3RhIgoKbXRiX2Fubm90YXRpb25zIDwtIHNtKGxvYWRfZ2ZmX2Fubm90YXRpb25zKG10Yl9nZmYsIHR5cGU9ImdlbmUiKSkKY29sbmFtZXMobXRiX2Fubm90YXRpb25zKSA8LSBnc3ViKHBhdHRlcm49IlxcLiIsIHJlcGxhY2VtZW50PSIiLCB4PWNvbG5hbWVzKG10Yl9hbm5vdGF0aW9ucykpCm10Yl9hbm5vdGF0aW9uc1tbImRlc2NyaXB0aW9uIl1dIDwtIGdzdWIocGF0dGVybj0iXFwrIiwgcmVwbGFjZW1lbnQ9IiAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg9bXRiX2Fubm90YXRpb25zW1siZGVzY3JpcHRpb24iXV0pCm10Yl9hbm5vdGF0aW9uc1tbImZ1bmN0aW9uIl1dIDwtIGdzdWIocGF0dGVybj0iXFwrIiwgcmVwbGFjZW1lbnQ9IiAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg9bXRiX2Fubm90YXRpb25zW1siZnVuY3Rpb24iXV0pCnJvd25hbWVzKG10Yl9hbm5vdGF0aW9ucykgPC0gbXRiX2Fubm90YXRpb25zW1siSUQiXV0KYGBgCgojIyBNZXJnZSB0aGUgcGllY2VzCgpOb3cgd2Ugc2hvdWxkIGhhdmUgc3VmZmljaWVudCBwaWVjZXMgdG8gbWFrZSBhbiBleHByZXNzaW9uc2V0LgoKV2hpbGUgaGVyZSwgSSB3aWxsIGFsc28gc3BsaXQgdGhlIGRhdGEgaW50byBhIGNmIGFuZCB3aG9sZS1jZWxsIHBhaXIgb2YgZGF0YSBzdHJ1Y3R1cmVzLgoKYGBge3IgdGJfZXhwdCwgZmlnLnNob3c9ImhpZGUifQojIyBEcm9wIHRoZSBtZXRhZGF0YSBub3QgaW4gdGhlIHByb3RlaW4gbWF0cml4OgojIyBBbmQgZW5zdXJlIHRoYXQgdGhleSBhcmUgdGhlIHNhbWUgb3JkZXIuCnJlb3JkZXJlZCA8LSBjb2xuYW1lcyhwcm90X210cngpCm1ldGFkYXRhIDwtIHNhbXBsZV9hbm5vdFtyZW9yZGVyZWQsIF0KY29sbmFtZXMocHJvdF9tdHJ4KSA8LSBnc3ViKHg9Y29sbmFtZXMocHJvdF9tdHJ4KSwgcGF0dGVybj0iXi4qKDIwMTkuKiQpIiwgcmVwbGFjZW1lbnQ9InNcXDEiKQptdGJfYW5ub3RhdGlvbnMgPC0gbXRiX2Fubm90YXRpb25zWywgLTFdCnByb3RlaW5fZXhwdCA8LSBjcmVhdGVfZXhwdChzYW1wbGVfYW5ub3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudF9kYXRhZnJhbWU9cHJvdF9tdHJ4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZV9pbmZvPW10Yl9hbm5vdGF0aW9ucykKCnJlb3JkZXJlZCA8LSBjb2xuYW1lcyh1bmZpbHRfbXRyeCkKbWV0YWRhdGEgPC0gc2FtcGxlX2Fubm90W3Jlb3JkZXJlZCwgXQpjb2xuYW1lcyh1bmZpbHRfbXRyeCkgPC0gZ3N1Yih4PWNvbG5hbWVzKHVuZmlsdF9tdHJ4KSwgcGF0dGVybj0iXi4qKDIwMTkuKiQpIiwgcmVwbGFjZW1lbnQ9InNcXDEiKQptdGJfYW5ub3RhdGlvbnMgPC0gbXRiX2Fubm90YXRpb25zWywgLTFdCnVuZmlsdF9leHB0IDwtIGNyZWF0ZV9leHB0KHNhbXBsZV9hbm5vdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRfZGF0YWZyYW1lPXVuZmlsdF9tdHJ4LAogICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lX2luZm89bXRiX2Fubm90YXRpb25zKQoKd3JpdHRlbl9maWxlIDwtIGdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV9wcm90ZWluX2V4cHQtdnt2ZXJ9Lnhsc3giKQpwcm90ZWluX3dyaXRlIDwtIHdyaXRlX2V4cHQocHJvdGVpbl9leHB0LCB2aW9saW49VFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhdGNoPSJyYXciLCBleGNlbD13cml0dGVuX2ZpbGUpCndyaXR0ZW5fZmlsZSA8LSBnbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX1fdW5maWx0X3Byb3RlaW5fZXhwdC12e3Zlcn0ueGxzeCIpCnVuZmlsdF93cml0ZSA8LSB3cml0ZV9leHB0KHVuZmlsdF9leHB0LCB2aW9saW49VFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhdGNoPSJyYXciLCBleGNlbD13cml0dGVuX2ZpbGUpCgpwcm90ZWluX2ZpbHQgPC0gc20obm9ybWFsaXplX2V4cHQocHJvdGVpbl9leHB0LCBmaWx0ZXI9VFJVRSkpCnByb3RlaW5fbm9ybSA8LSBub3JtYWxpemVfZXhwdChwcm90ZWluX2ZpbHQsIG5vcm09InF1YW50IiwgdHJhbnNmb3JtPSJsb2cyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnQ9ImNwbSIsIGZpbHRlcj1UUlVFKQoKcHJvdGVpbl91bmZpbHQgPC0gc20obm9ybWFsaXplX2V4cHQodW5maWx0X2V4cHQsIGZpbHRlcj1UUlVFKSkKcHJvdGVpbl9kZSA8LSBzbShhbGxfcGFpcndpc2UocHJvdGVpbl9maWx0LCBtb2RlbF9iYXRjaD1GQUxTRSwgZm9yY2U9VFJVRSwgcGFyYWxsZWw9RkFMU0UpKQp1bmZpbHRfZGUgPC0gc20oYWxsX3BhaXJ3aXNlKHByb3RlaW5fdW5maWx0LCBtb2RlbF9iYXRjaD1GQUxTRSwgZm9yY2U9VFJVRSwgcGFyYWxsZWw9RkFMU0UpKQprZWVwZXJzIDwtIGxpc3QoCiAgImR0X3d0IiA9IGMoImR0X3doIiwgInd0X3doIiksCiAgImNwX3d0IiA9IGMoImNwX3doIiwgInd0X3doIikpCgpwcm90ZWluX3RhYmxlcyA8LSBzbShjb21iaW5lX2RlX3RhYmxlcygKICBwcm90ZWluX2RlLCBrZWVwZXJzPWtlZXBlcnMsCiAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiZXhjZWwvZGVfe3J1bmRhdGV9X3RhYmxlc192e3Zlcn0ueGxzeCIpKSkKcHJvdGVpbl9zaWcgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICBwcm90ZWluX3RhYmxlcywKICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC9zaWdfe3J1bmRhdGV9X3RhYmxlc192e3Zlcn0ueGxzeCIpKQoKdW5maWx0X3RhYmxlcyA8LSBzbShjb21iaW5lX2RlX3RhYmxlcygKICB1bmZpbHRfZGUsIGtlZXBlcnM9a2VlcGVycywKICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC9kZV97cnVuZGF0ZX1fdW5maWx0X3RhYmxlc192e3Zlcn0ueGxzeCIpKSkKdW5maWx0X3NpZyA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogIHVuZmlsdF90YWJsZXMsCiAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiZXhjZWwvc2lnX3tydW5kYXRlfV91bmZpbHRfdGFibGVzX3Z7dmVyfS54bHN4IikpCgpyZW1vdmVfdHdvIDwtIGV4Y2x1ZGVfZ2VuZXNfZXhwdChwcm90ZWluX2V4cHQsIGlkcz1jKCJSdjIwMzFjIiwgIlJ2MDU2OSIpKQpyZW1vdmVfbm9ybSA8LSBub3JtYWxpemVfZXhwdChyZW1vdmVfdHdvLCB0cmFuc2Zvcm09ImxvZzIiLCBjb252ZXJ0PSJjcG0iLCBub3JtPSJxdWFudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcj1UUlVFKQpwbG90X3BjYShyZW1vdmVfbm9ybSkkcGxvdApgYGAKCiMjIExldHMgc2VlIHdoYXQgaGFwcGVucyBpZiB3ZSByZXdyaXRlIHRoZSBleHByZXNzaW9uc2V0IHdpdGggTkFzCgpgYGB7ciBuYV9leHBlcmltZW50fQojIyBQdXQgTkFzIGludG8gdGhlIGRhdGEgZm9yIHRoZSBzZXQgb2YgcHJvdGVpbnMgZm9yIHdoaWNoIHRoZXJlIGFyZQojIyAwcyBpbiBfbm90X2FsbF8gb2YgdGhlIHNhbXBsZXMgZm9yIGVhY2ggY29uZGl0aW9uLgpwcm90ZWluX25hcyA8LSBhZGRfY29uZGl0aW9uYWxfbmFzKHVuZmlsdF9leHB0KQp1bmZpbHRfbmFzX2RlIDwtIGFsbF9wYWlyd2lzZShwcm90ZWluX25hcywgbW9kZWxfYmF0Y2g9RkFMU0UsIHBhcmFsbGVsPUZBTFNFLCBkb19lYnNlcT1GQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9wY2E9RkFMU0UsIGZvcmNlPVRSVUUpCnVuZmlsdF9uYXNfdGFibGVzIDwtIGNvbWJpbmVfZGVfdGFibGVzKHVuZmlsdF9uYXNfZGUsIGtlZXBlcnM9a2VlcGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZWw9ImV4Y2VsL3VuZmlsdF9uYXNfdGFibGUueGxzeCIpCmBgYAoKIyBBIG5pY2Ugc3Vic2V0IHJlcXVlc3QgZnJvbSBWb2xrZXIKCkxldCB1cyBwdWxsIHRoZSBmb2xsb3dpbmcgc3Vic2V0IGZyb20gdGhlIERFIHRhYmxlcyBmb3IgVm9sa2VyLCBpdCBzaG91bGQKcHJvdmlkZSBhIHNldCBvZiBwcm90ZWlucyBtb3N0IG9idmlvdXNseSBvZiBpbnRlcmVzdDsgYXNzdW1pbmcgdGhlIGZhbHNlCm5lZ2F0aXZlcyBhcmUgbm90IHRvbyBzZXZlcmUuCgoxLiAgbGZjIDw9IC02IGZvciBkZWx0YS93dCAmJiBsZmMgPj0gLTMgZm9yIGNvbXAvd3QKMi4gIGxmYyA+PSAxMCBkZWx0YS93dCAmJiBsZmMgPD0gNCBjb21wL3d0CgpUaGlzIHdpbGwgaG9wZWZ1bGx5IGZpbmQgdGhpbmdzIHdoaWNoIGFyZSBzdWZmaWNpZW50bHkgZGlmZmVyZW50IGZyb20gdGhlCmRlbGV0aW9uIGFuZCBjb21wbGVtZW50IHNhbXBsZXMgdG8gYmUgaW50ZXJlc3RpbmcuCgpgYGB7ciBpbnRlcmVzdGluZ19zdWJzZXR9CmR0X3d0IDwtIHVuZmlsdF9uYXNfdGFibGVzW1siZGF0YSJdXVtbImR0X3d0Il1dCmNwX3d0IDwtIHVuZmlsdF9uYXNfdGFibGVzW1siZGF0YSJdXVtbImNwX3d0Il1dCmRvd25faWR4IDwtIGR0X3d0W1siZGVzZXFfbG9nZmMiXV0gPD0gLTYgJiBjcF93dFtbImRlc2VxX2xvZ2ZjIl1dID49IC0zCmRvd25fdGFibGUgPC0gZHRfd3RbZG93bl9pZHgsIF0KdXBfaWR4IDwtIGR0X3d0W1siZGVzZXFfbG9nZmMiXV0gPj0gMTAgJiBjcF93dFtbImRlc2VxX2xvZ2ZjIl1dIDw9IDQKdXBfdGFibGUgPC0gZHRfd3RbdXBfaWR4LCBdCgpkb3duX3N1YnNldCA8LSB3cml0ZV94bHMoCiAgZGF0YT1kb3duX3RhYmxlLAogIGV4Y2VsPWdsdWU6OmdsdWUoImV4Y2VsL2RlX3tydW5kYXRlfV9tb3JlX2Rvd25fZGVsdGEueGxzeCIpKQp1cF9zdWJzZXQgPC0gd3JpdGVfeGxzKAogIGRhdGE9dXBfdGFibGUsCiAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiZXhjZWwvZGVfe3J1bmRhdGV9X21vcmVfdXBfZGVsdGEueGxzeCIpKQpgYGAKCgpgYGB7ciBzYXZlbWV9CmlmICghaXNUUlVFKGdldDAoInNraXBfbG9hZCIpKSkgewogIG1lc3NhZ2UocGFzdGUwKCJUaGlzIGlzIGhwZ2x0b29scyBjb21taXQ6ICIsIGdldF9naXRfY29tbWl0KCkpKQogIHRoaXNfc2F2ZSA8LSBwYXN0ZTAoZ3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSIiLCB4PXJtZF9maWxlKSwgIi12IiwgdmVyLCAiLnJkYS54eiIpCiAgbWVzc2FnZShwYXN0ZTAoIlNhdmluZyB0byAiLCB0aGlzX3NhdmUpKQogIHRtcCA8LSBzbShzYXZlbWUoZmlsZW5hbWU9dGhpc19zYXZlKSkKICBwYW5kZXI6OnBhbmRlcihzZXNzaW9uSW5mbygpKQp9CmBgYAoKYGBge3IgbG9hZG1lLCBldmFsPUZBTFNFfQp0bXAgPC0gbG9hZG1lKGZpbGVuYW1lPXRoaXNfc2F2ZSkKYGBgCg==