1 Annotation version: 20180606

1.1 Genome annotation input

There are a few methods of importing annotation data into R. I will attempt some of them in preparation for loading them into the S.cerevisiae RNASeq data.

1.1.1 AnnotationHub: loading OrgDb

AnnotationHub is a newer service and has promise to be an excellent top-level resource for gathering annotation data. Its organization is peculiar, one connects to the database with AnnotationHub() and downloads lists of sqlite databases via query(). The primary problem with AnnotationHub is that it seems difficult to keep up with the changes in their database – so one must double-check the downloaded data to be sure that it is still actually data and not just a message saying ‘Public’.

Once it does download data, one may use normal orgdb functions to query it.

tmp <- sm(library(AnnotationHub))
ah <- sm(AnnotationHub())
orgdbs <- sm(query(ah, "OrgDb"))
sc_orgdb <- sm(query(ah, c("OrgDB", "Saccharomyces"))) ##   AH49589 | org.Sc.sgd.db.sqlite
sc_orgdb <- sc_orgdb[[1]]
## downloading 0 resources
## loading from cache 
##     '/home/trey//.AnnotationHub/68530'
## Loading required package: AnnotationDbi
## Loading required package: stats4
## Loading required package: Biobase
## Welcome to Bioconductor
## 
##     Vignettes contain introductory material; view with
##     'browseVignettes()'. To cite Bioconductor, see
##     'citation("Biobase")', and for packages 'citation("pkgname")'.
## 
## Attaching package: 'Biobase'
## The following object is masked from 'package:AnnotationHub':
## 
##     cache
## Loading required package: IRanges
## Loading required package: S4Vectors
## 
## Attaching package: 'S4Vectors'
## The following object is masked from 'package:base':
## 
##     expand.grid
sc_orgdb
## OrgDb object:
## | DBSCHEMAVERSION: 2.1
## | Db type: OrgDb
## | Supporting package: AnnotationDbi
## | DBSCHEMA: YEAST_DB
## | ORGANISM: Saccharomyces cerevisiae
## | SPECIES: Yeast
## | YGSOURCENAME: Yeast Genome
## | YGSOURCEURL: http://downloads.yeastgenome.org/
## | YGSOURCEDATE: 14-Jan-2017
## | CENTRALID: ORF
## | TAXID: 559292
## | KEGGSOURCENAME: KEGG GENOME
## | KEGGSOURCEURL: ftp://ftp.genome.jp/pub/kegg/genomes
## | KEGGSOURCEDATE: 2011-Mar15
## | GOSOURCENAME: Gene Ontology
## | GOSOURCEURL: ftp://ftp.geneontology.org/pub/go/godatabase/archive/latest-lite/
## | GOSOURCEDATE: 2018-Mar28
## | EGSOURCEDATE: 2018-Apr4
## | EGSOURCENAME: Entrez Gene
## | EGSOURCEURL: ftp://ftp.ncbi.nlm.nih.gov/gene/DATA
## | ENSOURCEDATE: 2017-Dec04
## | ENSOURCENAME: Ensembl
## | ENSOURCEURL: ftp://ftp.ensembl.org/pub/current_fasta
## | UPSOURCENAME: Uniprot
## | UPSOURCEURL: http://www.UniProt.org/
## | UPSOURCEDATE: Mon Apr  9 21:11:24 2018
## 
## Please see: help('select') for usage information
## Holy crap it worked!
sc_annotv1 <- load_orgdb_annotations(
  sc_orgdb,
  fields=c("alias", "description", "entrezid", "genename", "sgd"))
## Unable to find CDSNAME, setting it to GENENAME.
## Unable to find GENE_TYPE in the db, removing it.
## Unable to find CDSCHROM in the db, removing it.
## Unable to find CDSSTRAND in the db, removing it.
## Unable to find CDSSTART in the db, removing it.
## Unable to find CDSEND in the db, removing it.
## Extracted all gene ids.
## Attempting to select: GENENAME, ALIAS, DESCRIPTION, ENTREZID, GENENAME, SGD
## 'select()' returned 1:many mapping between keys and columns
sc_annotv1 <- sc_annotv1[["genes"]]

1.1.2 TxDb

In yeast, the transcript database is not super-useful, given that there are only 80 some genes wit introns, but it does provide a quick way to get transcript lengths.

tt <- please_install("TxDb.Scerevisiae.UCSC.sacCer3.sgdGene")
tmp <- sm(library(TxDb.Scerevisiae.UCSC.sacCer3.sgdGene))
sc_txdb <- TxDb.Scerevisiae.UCSC.sacCer3.sgdGene

2 Loading a genome

There is a non-zero chance we will want to use the actual genome sequence along with these annotations. The BSGenome packages provide that functionality.

tt <- sm(please_install("BSgenome.Scerevisiae.UCSC.sacCer3"))

3 Loading from biomart

A completely separate and competing annotation source is biomart. Biomart provides programmatic access to the tremendous quantity of ensembl data. Their data is organized in some weird ways, including tables with thousands of available columns; but man is it awesome to have so much available stuff to sift through and learn about.

sc_annotv2 <- sm(load_biomart_annotations("scerevisiae"))
sc_annotv2 <- sc_annotv2[["annotation"]]
head(sc_annotv2)
##           transcriptID   geneID
## X15S_rRNA     15S_rRNA 15S_rRNA
## X21S_rRNA     21S_rRNA 21S_rRNA
## HRA1              HRA1     HRA1
## ICR1              ICR1     ICR1
## LSR1              LSR1     LSR1
## NME1              NME1     NME1
##                                                                                                                                                                                                                                                                                    Description
## X15S_rRNA                                                                                                            Ribosomal RNA of the small mitochondrial ribosomal subunit; MSU1 allele suppresses ochre stop mutations in mitochondrial protein-coding genes [Source:SGD;Acc:S000007287]
## X21S_rRNA                                                                                                                                                                                       Mitochondrial 21S rRNA; intron encodes the I-SceI DNA endonuclease [Source:SGD;Acc:S000007288]
## HRA1                                                                                                         Non-protein-coding RNA; substrate of RNase P, possibly involved in rRNA processing, specifically maturation of 20S precursor into the mature 18S rRNA [Source:SGD;Acc:S000119380]
## ICR1      Long intergenic regulatory ncRNA; has a key role in regulating transcription of the nearby protein-coding ORF FLO11; initiated far upstream from FLO11 and transcribed across much of the large promoter of FLO11, repressing FLO11 transcription in cis [Source:SGD;Acc:S000132612]
## LSR1           U2 spliceosomal RNA (U2 snRNA), component of the spliceosome; pairs with the branchpoint sequence; functionally equivalent to mammalian U2 snRNA; stress-induced pseudouridylations at positions 56 and 93 may contribute to regulation of splicing [Source:SGD;Acc:S000006478]
## NME1                                                    RNA component of RNase MRP; RNase MRP cleaves pre-rRNA and has a role in cell cycle-regulated degradation of daughter cell-specific mRNAs; human ortholog is implicated in cartilage-hair hypoplasia (CHH) [Source:SGD;Acc:S000007436]
##             Type length chromosome strand  start    end
## X15S_rRNA   rRNA     NA       Mito      1   6546   8194
## X21S_rRNA   rRNA     NA       Mito      1  58009  62447
## HRA1       ncRNA     NA          I      1  99305  99868
## ICR1       ncRNA     NA         IX     -1 393884 397082
## LSR1       snRNA     NA         II     -1 680688 681862
## NME1      snoRNA     NA        XIV      1 585587 585926
sc_ontology <- sm(load_biomart_go("scerevisiae"))
sc_ontology <- sc_ontology[["go"]]
head(sc_ontology)
##        ID         GO
## 1 YHR055C GO:0046872
## 2 YHR055C GO:0005829
## 3 YHR055C GO:0016209
## 4 YHR055C GO:0004784
## 5 YHR055C GO:0019430
## 6 YHR055C GO:0005507

4 Read a gff file

In contrast, it is possible to load most annotations of interest directly from the gff files used in the alignments. The main problem with gff data is that the format is incredibly inconsistent; but it is often the most direct way to go from the IDs of the genome to some immediately useful data.

## The old way of getting genome/annotation data
sc_gff <- "reference/scerevisiae.gff.gz"
sc_gff_annotations <- load_gff_annotations(sc_gff, type="gene")
## Trying attempt: rtracklayer::import.gff3(gff, sequenceRegionsAsSeqinfo=TRUE)
## Trying attempt: rtracklayer::import.gff3(gff, sequenceRegionsAsSeqinfo=FALSE)
## Trying attempt: rtracklayer::import.gff2(gff, sequenceRegionsAsSeqinfo=TRUE)
## Had a successful gff import with rtracklayer::import.gff2(gff, sequenceRegionsAsSeqinfo=TRUE)
## Returning a df with 18 columns and 7050 rows.
rownames(sc_gff_annotations) <- make.names(sc_gff_annotations$transcript_name, unique=TRUE)
head(sc_gff_annotations)
##           seqnames start   end width strand         source type score
## YAL069W          I   335   646   312      + protein_coding gene    NA
## YAL068W.A        I   538   789   252      + protein_coding gene    NA
## PAU8             I  1810  2169   360      - protein_coding gene    NA
## YAL067W.A        I  2480  2704   225      + protein_coding gene    NA
## SEO1             I  7238  9016  1779      - protein_coding gene    NA
## YAL066W          I 10091 10396   306      + protein_coding gene    NA
##           phase exon_number   gene_id        ID  p_id protein_id
## YAL069W       0           1   YAL069W   YAL069W P3633    YAL069W
## YAL068W.A     0           1 YAL068W-A YAL068W-A P5377  YAL068W-A
## PAU8          0           1   YAL068C      PAU8 P6023    YAL068C
## YAL067W.A     0           1 YAL067W-A YAL067W-A P4547  YAL067W-A
## SEO1          0           1   YAL067C      SEO1 P5747    YAL067C
## YAL066W       0           1   YAL066W   YAL066W P1766    YAL066W
##           transcript_id transcript_name  tss_id seqedit
## YAL069W         YAL069W         YAL069W TSS1128    <NA>
## YAL068W.A     YAL068W-A       YAL068W-A TSS5439    <NA>
## PAU8            YAL068C            PAU8  TSS249    <NA>
## YAL067W.A     YAL067W-A       YAL067W-A TSS1248    <NA>
## SEO1            YAL067C            SEO1 TSS5464    <NA>
## YAL066W         YAL066W         YAL066W TSS2674    <NA>

5 Putting the pieces together

In the following block we create an expressionset using the sample sheet and the annotations.

Annoyingly, the gff annotations are keyed in a peculiar fashion. Therefore I need to do a little work to merge them.

In the following block, I spend a little time setting up locations by chromosome/start/end and using those to merge the gff data and biomart data, thus solving the problem of inconsistent IDs. It is worth noting that I split this process between the genes on the + strand and those on the - strand because the definitions of ‘beginning of gene’ and ‘start’ mean different things: ‘beginning of gene’ refers to the location with respect to the start codon and is used by biomart, ‘start’ refers to the location with respect to the beginning of the chromosome and is used by the gff data.

## Start by making locations for the biomart data
sc_annotv2[["fwd_location"]] <- paste0(sc_annotv2[["chromosome"]], "_", sc_annotv2[["start"]])
sc_annotv2[["rev_location"]] <- paste0(sc_annotv2[["chromosome"]], "_", sc_annotv2[["end"]])
## Do the same for the gff annotations
sc_gff_annotations[["fwd_location"]] <- paste0(sc_gff_annotations[["seqnames"]], "_",
                                               sc_gff_annotations[["start"]])
sc_gff_annotations[["rev_location"]] <- paste0(sc_gff_annotations[["seqnames"]], "_",
                                               sc_gff_annotations[["end"]])
sc_gff_annotations[["gff_rowname"]] <- rownames(sc_gff_annotations)
## Now merge them.
sc_fwd_annotations <- merge(sc_annotv2, sc_gff_annotations, by="fwd_location")
sc_rev_annotations <- merge(sc_annotv2, sc_gff_annotations, by="rev_location")
colnames(sc_fwd_annotations) <- c("location","transcriptID","geneID", "Description",
                                  "Type", "length", "chromosome", "strand.x", "start.x",
                                  "end.x", "location.x", "seqnames",
                                  "start.y", "end.y", "width", "strand.y", "source", "type",
                                  "score", "phase", "exon_number", "gene_id", "ID", "p_id",
                                  "protein_id", "transcript_id", "transcript_name", "tss_id",
                                  "seqedit", "location.y", "gff_rowname")
colnames(sc_rev_annotations) <- colnames(sc_fwd_annotations)
sc_all_annotations <- rbind(sc_fwd_annotations, sc_rev_annotations)
rownames(sc_all_annotations) <- make.names(sc_all_annotations[["gff_rowname"]], unique=TRUE)
sc_all_annotations <- sc_all_annotations[, c("transcriptID", "geneID", "Description", "Type",
                                             "length", "chromosome", "strand.x", "start.x", "end.x",
                                             "tss_id")]
colnames(sc_all_annotations) <- c("transcriptID", "geneID", "Description", "Type", "length",
                                  "chromosome", "strand", "start", "end", "tss_id")
sc_all_annotations[["location"]] <- paste0(sc_all_annotations[["chromosome"]], "_",
                                           sc_all_annotations[["start"]], "_",
                                           sc_all_annotations[["end"]])

5.0.1 Make the expressionset

The function ’create_expt() gathers the annotation data, metadata, and counts, and invokes the various R functions to create an expressionset. This function is more complex than it should be, primarily because I go to some effort to accept a large array of inputs including: raw data frames of counts vs. sets of filenames of counts/hdf5/tpm/etc, data frames of metadata vs. excel sheets with varying columns, and arbitrary annotation data which may include all, some, or none of the included genes.

sc2_expt <- create_expt(
  metadata="sample_sheets/all_samples.xlsx",
  gene_info=sc_all_annotations,
  file_column="bt2file")
## Reading the sample metadata.
## The sample definitions comprises: 28, 19 rows, columns.
## Reading count tables.
## Reading count tables with read.table().
## /cbcb/nelsayed-scratch/atb/rnaseq/scerevisiae_cbf5_2017/preprocessing/v2/hpgl0774/outputs/bowtie2_scerevisiae/hpgl0774_forward-trimmed.count.xz contains 7131 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/scerevisiae_cbf5_2017/preprocessing/v2/hpgl0775/outputs/bowtie2_scerevisiae/hpgl0775_forward-trimmed.count.xz contains 7131 rows and merges to 7131 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/scerevisiae_cbf5_2017/preprocessing/v2/hpgl0776/outputs/bowtie2_scerevisiae/hpgl0776_forward-trimmed.count.xz contains 7131 rows and merges to 7131 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/scerevisiae_cbf5_2017/preprocessing/v2/hpgl0777/outputs/bowtie2_scerevisiae/hpgl0777_forward-trimmed.count.xz contains 7131 rows and merges to 7131 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/scerevisiae_cbf5_2017/preprocessing/v2/hpgl0778/outputs/bowtie2_scerevisiae/hpgl0778_forward-trimmed.count.xz contains 7131 rows and merges to 7131 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/scerevisiae_cbf5_2017/preprocessing/v2/hpgl0779/outputs/bowtie2_scerevisiae/hpgl0779_forward-trimmed.count.xz contains 7131 rows and merges to 7131 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/scerevisiae_cbf5_2017/preprocessing/v2/hpgl0780/outputs/bowtie2_scerevisiae/hpgl0780_forward-trimmed.count.xz contains 7131 rows and merges to 7131 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/scerevisiae_cbf5_2017/preprocessing/v2/hpgl0781/outputs/bowtie2_scerevisiae/hpgl0781_forward-trimmed.count.xz contains 7131 rows and merges to 7131 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/scerevisiae_cbf5_2017/preprocessing/v2/hpgl0782/outputs/bowtie2_scerevisiae/hpgl0782_forward-trimmed.count.xz contains 7131 rows and merges to 7131 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/scerevisiae_cbf5_2017/preprocessing/v2/hpgl0783/outputs/bowtie2_scerevisiae/hpgl0783_forward-trimmed.count.xz contains 7131 rows and merges to 7131 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/scerevisiae_cbf5_2017/preprocessing/v2/hpgl0784/outputs/bowtie2_scerevisiae/hpgl0784_forward-trimmed.count.xz contains 7131 rows and merges to 7131 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/scerevisiae_cbf5_2017/preprocessing/v2/hpgl0785/outputs/bowtie2_scerevisiae/hpgl0785_forward-trimmed.count.xz contains 7131 rows and merges to 7131 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/scerevisiae_cbf5_2017/preprocessing/v2/hpgl0786/outputs/bowtie2_scerevisiae/hpgl0786_forward-trimmed.count.xz contains 7131 rows and merges to 7131 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/scerevisiae_cbf5_2017/preprocessing/v2/hpgl0787/outputs/bowtie2_scerevisiae/hpgl0787_forward-trimmed.count.xz contains 7131 rows and merges to 7131 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/scerevisiae_cbf5_2017/preprocessing/v2/hpgl0788/outputs/bowtie2_scerevisiae/hpgl0788_forward-trimmed.count.xz contains 7131 rows and merges to 7131 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/scerevisiae_cbf5_2017/preprocessing/v2/hpgl0789/outputs/bowtie2_scerevisiae/hpgl0789_forward-trimmed.count.xz contains 7131 rows and merges to 7131 rows.
## Finished reading count tables.
## Matched 6540 annotations and counts.
## Bringing together the count matrix and gene information.
## Some annotations were lost in merging, setting them to 'undefined'.
knitr::kable(head(exprs(sc2_expt$expressionset)))
hpgl0774 hpgl0775 hpgl0776 hpgl0777 hpgl0778 hpgl0779 hpgl0780 hpgl0781 hpgl0782 hpgl0783 hpgl0784 hpgl0785 hpgl0786 hpgl0787 hpgl0788 hpgl0789
X15S_rRNA 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
X21S_rRNA 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
AAC1 536 477 743 443 634 188 763 414 175 145 140 237 124 142 141 181
AAC3 126 216 93 765 152 154 102 738 295 119 341 542 210 118 438 1071
AAD10 1784 1928 2327 3869 2172 994 2472 3551 365 589 1476 1593 352 542 1782 2082
AAD14 1054 901 1222 1863 1106 836 1307 1588 542 766 1580 1814 439 795 1924 2333
knitr::kable(head(fData(sc2_expt$expressionset)))
transcriptID geneID Description Type length chromosome strand start end tss_id location
X15S_rRNA undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined
X21S_rRNA undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined
AAC1 YMR056C YMR056C Mitochondrial inner membrane ADP/ATP translocator; exchanges cytosolic ADP for mitochondrially synthesized ATP; phosphorylated; Aac1p is a minor isoform while Pet9p is the major ADP/ATP translocator; relocalizes from mitochondrion to cytoplasm upon DNA replication stress [Source:SGD;Acc:S000004660] protein_coding 930 XIII -1 387315 388244 TSS5132 XIII_387315_388244
AAC3 YBR085W YBR085W Mitochondrial inner membrane ADP/ATP translocator; exchanges cytosolic ADP for mitochondrially synthesized ATP; expressed under anaerobic conditions; similar to Aac1p; has roles in maintenance of viability and in respiration; AAC3 has a paralog, PET9, that arose from the whole genome duplication [Source:SGD;Acc:S000000289] protein_coding 924 II 1 415983 416906 TSS1609 II_415983_416906
AAD10 YJR155W YJR155W Putative aryl-alcohol dehydrogenase; similar to P. chrysosporium aryl-alcohol dehydrogenase; mutational analysis has not yet revealed a physiological role; members of the AAD gene family comprise three pairs (AAD3 + AAD15, AAD6/AAD16 + AAD4, AAD10 + AAD14) whose two genes are more related to one another than to other members of the family [Source:SGD;Acc:S000003916] protein_coding 867 X 1 727405 728271 TSS5024 X_727405_728271
AAD14 YNL331C YNL331C Putative aryl-alcohol dehydrogenase; similar to P. chrysosporium aryl-alcohol dehydrogenase; mutational analysis has not yet revealed a physiological role; members of the AAD gene family comprise three pairs (AAD3 + AAD15, AAD6/AAD16 + AAD4, AAD10 + AAD14) whose two genes are more related to one another than to other members of the family [Source:SGD;Acc:S000005275] protein_coding 1131 XIV -1 16118 17248 TSS6941 XIV_16118_17248
knitr::kable(head(pData(sc2_expt$expressionset)))
sampleid strain condition batch originalbatch tube cbf5igv upf1igv incubationtime genotype conc bttotalreads bttotalmapped btleftmapped btrightmapped bowtiefile bt2file intronfile allfile file
hpgl0774 hpgl0774 yJD1524 WT E2B1 E2B1 f wt wt 18h wt ade2-1 can1-100 his3-11 leu2-3, 112 trp1-1 ura3-1 cbf5::TRP1 + CBF5 on pRS313 NA NA NA NA NA NA preprocessing/v2/hpgl0774/outputs/bowtie2_scerevisiae/hpgl0774_forward-trimmed.count.xz preprocessing/v2/hpgl0774/outputs/bowtie2_scerevisiae/introns.count.xz preprocessing/v2/hpgl0774/outputs/bowtie2_scerevisiae/hpgl0774_forward-trimmed.count.xz null
hpgl0775 hpgl0775 yJD1525 cbf5_D95A E2B1 E2B1 f mut wt 18h d95a ade2-1 can1-100 his3-11 leu2-3, 112 trp1-1 ura3-1 cbf5::TRP1 + CBF5 D95A on pRS313 NA NA NA NA NA NA preprocessing/v2/hpgl0775/outputs/bowtie2_scerevisiae/hpgl0775_forward-trimmed.count.xz preprocessing/v2/hpgl0775/outputs/bowtie2_scerevisiae/introns.count.xz preprocessing/v2/hpgl0775/outputs/bowtie2_scerevisiae/hpgl0775_forward-trimmed.count.xz null
hpgl0776 hpgl0776 yJD1745 upf1d E2B1 E2B1 f wt mut 18h wt ade2-1 can1-100 his3-11 leu2-3, 112 trp1-1 ura3-1 cbf5::TRP1 upf1::LEU2 + CBF5 on pRS313 (yJD1524 upf1Δ) NA NA NA NA NA NA preprocessing/v2/hpgl0776/outputs/bowtie2_scerevisiae/hpgl0776_forward-trimmed.count.xz preprocessing/v2/hpgl0776/outputs/bowtie2_scerevisiae/introns.count.xz preprocessing/v2/hpgl0776/outputs/bowtie2_scerevisiae/hpgl0776_forward-trimmed.count.xz null
hpgl0777 hpgl0777 yJD1746 cbf5_D95A upf1d E2B1 E2B1 f mut mut 18h d95a ade2-1 can1-100 his3-11 leu2-3, 112 trp1-1 ura3-1 cbf5::TRP1 upf1::LEU2 + CBF5 D95A on pRS313 (yJD1525 upf1Δ) NA NA NA NA NA NA preprocessing/v2/hpgl0777/outputs/bowtie2_scerevisiae/hpgl0777_forward-trimmed.count.xz preprocessing/v2/hpgl0777/outputs/bowtie2_scerevisiae/introns.count.xz preprocessing/v2/hpgl0777/outputs/bowtie2_scerevisiae/hpgl0777_forward-trimmed.count.xz null
hpgl0778 hpgl0778 yJD1524 WT E2B1 E2B2 g wt wt 18h wt ade2-1 can1-100 his3-11 leu2-3, 112 trp1-1 ura3-1 cbf5::TRP1 + CBF5 on pRS313 NA NA NA NA NA NA preprocessing/v2/hpgl0778/outputs/bowtie2_scerevisiae/hpgl0778_forward-trimmed.count.xz preprocessing/v2/hpgl0778/outputs/bowtie2_scerevisiae/introns.count.xz preprocessing/v2/hpgl0778/outputs/bowtie2_scerevisiae/hpgl0778_forward-trimmed.count.xz null
hpgl0779 hpgl0779 yJD1525 cbf5_D95A E2B1 E2B2 g mut wt 18h d95a ade2-1 can1-100 his3-11 leu2-3, 112 trp1-1 ura3-1 cbf5::TRP1 + CBF5 D95A on pRS313 NA NA NA NA NA NA preprocessing/v2/hpgl0779/outputs/bowtie2_scerevisiae/hpgl0779_forward-trimmed.count.xz preprocessing/v2/hpgl0779/outputs/bowtie2_scerevisiae/introns.count.xz preprocessing/v2/hpgl0779/outputs/bowtie2_scerevisiae/hpgl0779_forward-trimmed.count.xz null
if (!isTRUE(get0("skip_load"))) {
  pander::pander(sessionInfo())
  message(paste0("This is hpgltools commit: ", get_git_commit()))
  this_save <- paste0(gsub(pattern="\\.Rmd", replace="", x=rmd_file), "-v", ver, ".rda.xz")
  tmp <- sm(saveme(filename=this_save))
}
## If you wish to reproduce this exact build of hpgltools, invoke the following:
## > git clone http://github.com/abelew/hpgltools.git
## > git reset 0fd517d16f810afd23cc836b4ed74dafdf5274ba
## R> packrat::restore()
## This is hpgltools commit: Tue Jun 5 16:40:52 2018 -0400: 0fd517d16f810afd23cc836b4ed74dafdf5274ba
LS0tCnRpdGxlOiAiUy5jZXJldmlzaWFlIDIwMTc6IENvbGxlY3RpbmcgYW5ub3RhdGlvbiBkYXRhICgyMDE4MDYwNikuIgphdXRob3I6ICJhdGIgYWJlbGV3QGdtYWlsLmNvbSIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiBodG1sX2RvY3VtZW50OgogIGNvZGVfZG93bmxvYWQ6IHRydWUKICBjb2RlX2ZvbGRpbmc6IHNob3cKICBmaWdfY2FwdGlvbjogdHJ1ZQogIGZpZ19oZWlnaHQ6IDcKICBmaWdfd2lkdGg6IDcKICBoaWdobGlnaHQ6IGRlZmF1bHQKICBrZWVwX21kOiBmYWxzZQogIG1vZGU6IHNlbGZjb250YWluZWQKICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQogIHRoZW1lOiByZWFkYWJsZQogIHRvYzogdHJ1ZQogIHRvY19mbG9hdDoKICAgIGNvbGxhcHNlZDogZmFsc2UKICAgIHNtb290aF9zY3JvbGw6IGZhbHNlCi0tLQoKPHN0eWxlPgogIGJvZHkgLm1haW4tY29udGFpbmVyIHsKICAgIG1heC13aWR0aDogMTYwMHB4OwogIH0KPC9zdHlsZT4KCmBgYHtyIG9wdGlvbnMsIGluY2x1ZGU9RkFMU0V9CmlmICghaXNUUlVFKGdldDAoInNraXBfbG9hZCIpKSkgewogIGxpYnJhcnkoImhwZ2x0b29scyIpCiAgdHQgPC0gZGV2dG9vbHM6OmxvYWRfYWxsKCJ+L2hwZ2x0b29scyIpCiAga25pdHI6Om9wdHNfa25pdCRzZXQocHJvZ3Jlc3M9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9OTAsCiAgICAgICAgICAgICAgICAgICAgICAgZWNobz1UUlVFKQogIGtuaXRyOjpvcHRzX2NodW5rJHNldChlcnJvcj1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgICBmaWcud2lkdGg9OCwKICAgICAgICAgICAgICAgICAgICAgICAgZmlnLmhlaWdodD04LAogICAgICAgICAgICAgICAgICAgICAgICBkcGk9OTYpCiAgb2xkX29wdGlvbnMgPC0gb3B0aW9ucyhkaWdpdHM9NCwKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICBrbml0ci5kdXBsaWNhdGUubGFiZWw9ImFsbG93IikKICBnZ3Bsb3QyOjp0aGVtZV9zZXQoZ2dwbG90Mjo6dGhlbWVfYncoYmFzZV9zaXplPTEwKSkKICB2ZXIgPC0gIjIwMTgwNjA2IgogIHByZXZpb3VzX2ZpbGUgPC0gImluZGV4LlJtZCIKCiAgdG1wIDwtIHRyeShzbShsb2FkbWUoZmlsZW5hbWU9cGFzdGUwKGdzdWIocGF0dGVybj0iXFwuUm1kIiwgcmVwbGFjZT0iIiwgeD1wcmV2aW91c19maWxlKSwgIi12IiwgdmVyLCAiLnJkYS54eiIpKSkpCiAgcm1kX2ZpbGUgPC0gcGFzdGUwKCIwMV9hbm5vdGF0aW9uLXYiLCB2ZXIsICIuUm1kIikKfQpgYGAKCiMgQW5ub3RhdGlvbiB2ZXJzaW9uOiBgciB2ZXJgCgojIyBHZW5vbWUgYW5ub3RhdGlvbiBpbnB1dAoKVGhlcmUgYXJlIGEgZmV3IG1ldGhvZHMgb2YgaW1wb3J0aW5nIGFubm90YXRpb24gZGF0YSBpbnRvIFIuICBJIHdpbGwgYXR0ZW1wdApzb21lIG9mIHRoZW0gaW4gcHJlcGFyYXRpb24gZm9yIGxvYWRpbmcgdGhlbSBpbnRvIHRoZSBTLmNlcmV2aXNpYWUgUk5BU2VxIGRhdGEuCgojIyMgQW5ub3RhdGlvbkh1YjogbG9hZGluZyBPcmdEYgoKQW5ub3RhdGlvbkh1YiBpcyBhIG5ld2VyIHNlcnZpY2UgYW5kIGhhcyBwcm9taXNlIHRvIGJlIGFuIGV4Y2VsbGVudCB0b3AtbGV2ZWwKcmVzb3VyY2UgZm9yIGdhdGhlcmluZyBhbm5vdGF0aW9uIGRhdGEuICBJdHMgb3JnYW5pemF0aW9uIGlzIHBlY3VsaWFyLCBvbmUKY29ubmVjdHMgdG8gdGhlIGRhdGFiYXNlIHdpdGggQW5ub3RhdGlvbkh1YigpIGFuZCBkb3dubG9hZHMgbGlzdHMgb2Ygc3FsaXRlCmRhdGFiYXNlcyB2aWEgcXVlcnkoKS4gIFRoZSBwcmltYXJ5IHByb2JsZW0gd2l0aCBBbm5vdGF0aW9uSHViIGlzIHRoYXQgaXQgc2VlbXMKZGlmZmljdWx0IHRvIGtlZXAgdXAgd2l0aCB0aGUgY2hhbmdlcyBpbiB0aGVpciBkYXRhYmFzZSAtLSBzbyBvbmUgbXVzdApkb3VibGUtY2hlY2sgdGhlIGRvd25sb2FkZWQgZGF0YSB0byBiZSBzdXJlIHRoYXQgaXQgaXMgc3RpbGwgYWN0dWFsbHkgZGF0YSBhbmQKbm90IGp1c3QgYSBtZXNzYWdlIHNheWluZyAnUHVibGljJy4KCk9uY2UgaXQgZG9lcyBkb3dubG9hZCBkYXRhLCBvbmUgbWF5IHVzZSBub3JtYWwgb3JnZGIgZnVuY3Rpb25zIHRvIHF1ZXJ5IGl0LgoKYGBge3IgZGF0YV9pbnB1dF9nZW5vbWV9CnRtcCA8LSBzbShsaWJyYXJ5KEFubm90YXRpb25IdWIpKQphaCA8LSBzbShBbm5vdGF0aW9uSHViKCkpCm9yZ2RicyA8LSBzbShxdWVyeShhaCwgIk9yZ0RiIikpCnNjX29yZ2RiIDwtIHNtKHF1ZXJ5KGFoLCBjKCJPcmdEQiIsICJTYWNjaGFyb215Y2VzIikpKSAjIyAgIEFINDk1ODkgfCBvcmcuU2Muc2dkLmRiLnNxbGl0ZQpzY19vcmdkYiA8LSBzY19vcmdkYltbMV1dCnNjX29yZ2RiCgojIyBIb2x5IGNyYXAgaXQgd29ya2VkIQpzY19hbm5vdHYxIDwtIGxvYWRfb3JnZGJfYW5ub3RhdGlvbnMoCiAgc2Nfb3JnZGIsCiAgZmllbGRzPWMoImFsaWFzIiwgImRlc2NyaXB0aW9uIiwgImVudHJlemlkIiwgImdlbmVuYW1lIiwgInNnZCIpKQpzY19hbm5vdHYxIDwtIHNjX2Fubm90djFbWyJnZW5lcyJdXQpgYGAKCiMjIyBUeERiCgpJbiB5ZWFzdCwgdGhlIHRyYW5zY3JpcHQgZGF0YWJhc2UgaXMgbm90IHN1cGVyLXVzZWZ1bCwgZ2l2ZW4gdGhhdCB0aGVyZSBhcmUgb25seQo4MCBzb21lIGdlbmVzIHdpdCBpbnRyb25zLCBidXQgaXQgZG9lcyBwcm92aWRlIGEgcXVpY2sgd2F5IHRvIGdldCB0cmFuc2NyaXB0IGxlbmd0aHMuCgpgYGB7ciBzY2VyZXZpc2lhZV90eGRifQp0dCA8LSBwbGVhc2VfaW5zdGFsbCgiVHhEYi5TY2VyZXZpc2lhZS5VQ1NDLnNhY0NlcjMuc2dkR2VuZSIpCnRtcCA8LSBzbShsaWJyYXJ5KFR4RGIuU2NlcmV2aXNpYWUuVUNTQy5zYWNDZXIzLnNnZEdlbmUpKQpzY190eGRiIDwtIFR4RGIuU2NlcmV2aXNpYWUuVUNTQy5zYWNDZXIzLnNnZEdlbmUKYGBgCgojIExvYWRpbmcgYSBnZW5vbWUKClRoZXJlIGlzIGEgbm9uLXplcm8gY2hhbmNlIHdlIHdpbGwgd2FudCB0byB1c2UgdGhlIGFjdHVhbCBnZW5vbWUgc2VxdWVuY2UgYWxvbmcgd2l0aCB0aGVzZQphbm5vdGF0aW9ucy4gIFRoZSBCU0dlbm9tZSBwYWNrYWdlcyBwcm92aWRlIHRoYXQgZnVuY3Rpb25hbGl0eS4KCmBgYHtyIHNjZXJldmlzaWFlX2JzZ2Vub21lfQp0dCA8LSBzbShwbGVhc2VfaW5zdGFsbCgiQlNnZW5vbWUuU2NlcmV2aXNpYWUuVUNTQy5zYWNDZXIzIikpCmBgYAoKIyBMb2FkaW5nIGZyb20gYmlvbWFydAoKQSBjb21wbGV0ZWx5IHNlcGFyYXRlIGFuZCBjb21wZXRpbmcgYW5ub3RhdGlvbiBzb3VyY2UgaXMgYmlvbWFydC4gIEJpb21hcnQKcHJvdmlkZXMgcHJvZ3JhbW1hdGljIGFjY2VzcyB0byB0aGUgdHJlbWVuZG91cyBxdWFudGl0eSBvZiBlbnNlbWJsIGRhdGEuClRoZWlyIGRhdGEgaXMgb3JnYW5pemVkIGluIHNvbWUgd2VpcmQgd2F5cywgaW5jbHVkaW5nIHRhYmxlcyB3aXRoIHRob3VzYW5kcyBvZgphdmFpbGFibGUgY29sdW1uczsgYnV0IG1hbiBpcyBpdCBhd2Vzb21lIHRvIGhhdmUgc28gbXVjaCBhdmFpbGFibGUgc3R1ZmYgdG8Kc2lmdCB0aHJvdWdoIGFuZCBsZWFybiBhYm91dC4KCmBgYHtyIHNjZXJldmlzaWFlX2Jpb21hcnR9CnNjX2Fubm90djIgPC0gc20obG9hZF9iaW9tYXJ0X2Fubm90YXRpb25zKCJzY2VyZXZpc2lhZSIpKQpzY19hbm5vdHYyIDwtIHNjX2Fubm90djJbWyJhbm5vdGF0aW9uIl1dCmhlYWQoc2NfYW5ub3R2MikKc2Nfb250b2xvZ3kgPC0gc20obG9hZF9iaW9tYXJ0X2dvKCJzY2VyZXZpc2lhZSIpKQpzY19vbnRvbG9neSA8LSBzY19vbnRvbG9neVtbImdvIl1dCmhlYWQoc2Nfb250b2xvZ3kpCmBgYAoKIyBSZWFkIGEgZ2ZmIGZpbGUKCkluIGNvbnRyYXN0LCBpdCBpcyBwb3NzaWJsZSB0byBsb2FkIG1vc3QgYW5ub3RhdGlvbnMgb2YgaW50ZXJlc3QgZGlyZWN0bHkgZnJvbSB0aGUgZ2ZmIGZpbGVzIHVzZWQgaW4KdGhlIGFsaWdubWVudHMuICBUaGUgbWFpbiBwcm9ibGVtIHdpdGggZ2ZmIGRhdGEgaXMgdGhhdCB0aGUgZm9ybWF0IGlzIGluY3JlZGlibHkKaW5jb25zaXN0ZW50OyBidXQgaXQgaXMgb2Z0ZW4gdGhlIG1vc3QgZGlyZWN0IHdheSB0byBnbyBmcm9tIHRoZSBJRHMgb2YgdGhlCmdlbm9tZSB0byBzb21lIGltbWVkaWF0ZWx5IHVzZWZ1bCBkYXRhLgoKYGBge3IgZ2Vub21lX2lucHV0fQojIyBUaGUgb2xkIHdheSBvZiBnZXR0aW5nIGdlbm9tZS9hbm5vdGF0aW9uIGRhdGEKc2NfZ2ZmIDwtICJyZWZlcmVuY2Uvc2NlcmV2aXNpYWUuZ2ZmLmd6IgpzY19nZmZfYW5ub3RhdGlvbnMgPC0gbG9hZF9nZmZfYW5ub3RhdGlvbnMoc2NfZ2ZmLCB0eXBlPSJnZW5lIikKcm93bmFtZXMoc2NfZ2ZmX2Fubm90YXRpb25zKSA8LSBtYWtlLm5hbWVzKHNjX2dmZl9hbm5vdGF0aW9ucyR0cmFuc2NyaXB0X25hbWUsIHVuaXF1ZT1UUlVFKQpoZWFkKHNjX2dmZl9hbm5vdGF0aW9ucykKYGBgCgojIFB1dHRpbmcgdGhlIHBpZWNlcyB0b2dldGhlcgoKSW4gdGhlIGZvbGxvd2luZyBibG9jayB3ZSBjcmVhdGUgYW4gZXhwcmVzc2lvbnNldCB1c2luZyB0aGUgc2FtcGxlIHNoZWV0IGFuZCB0aGUKYW5ub3RhdGlvbnMuCgpBbm5veWluZ2x5LCB0aGUgZ2ZmIGFubm90YXRpb25zIGFyZSBrZXllZCBpbiBhIHBlY3VsaWFyIGZhc2hpb24uICBUaGVyZWZvcmUgSQpuZWVkIHRvIGRvIGEgbGl0dGxlIHdvcmsgdG8gbWVyZ2UgdGhlbS4KCkluIHRoZSBmb2xsb3dpbmcgYmxvY2ssIEkgc3BlbmQgYSBsaXR0bGUgdGltZSBzZXR0aW5nIHVwIGxvY2F0aW9ucyBieQpjaHJvbW9zb21lL3N0YXJ0L2VuZCBhbmQgdXNpbmcgdGhvc2UgdG8gbWVyZ2UgdGhlIGdmZiBkYXRhIGFuZCBiaW9tYXJ0IGRhdGEsCnRodXMgc29sdmluZyB0aGUgcHJvYmxlbSBvZiBpbmNvbnNpc3RlbnQgSURzLiAgSXQgaXMgd29ydGggbm90aW5nIHRoYXQgSSBzcGxpdAp0aGlzIHByb2Nlc3MgYmV0d2VlbiB0aGUgZ2VuZXMgb24gdGhlICsgc3RyYW5kIGFuZCB0aG9zZSBvbiB0aGUgLSBzdHJhbmQgYmVjYXVzZQp0aGUgZGVmaW5pdGlvbnMgb2YgJ2JlZ2lubmluZyBvZiBnZW5lJyBhbmQgJ3N0YXJ0JyBtZWFuIGRpZmZlcmVudCB0aGluZ3M6CidiZWdpbm5pbmcgb2YgZ2VuZScgcmVmZXJzIHRvIHRoZSBsb2NhdGlvbiB3aXRoIHJlc3BlY3QgdG8gdGhlIHN0YXJ0IGNvZG9uIGFuZAppcyB1c2VkIGJ5IGJpb21hcnQsICdzdGFydCcgcmVmZXJzIHRvIHRoZSBsb2NhdGlvbiB3aXRoIHJlc3BlY3QgdG8gdGhlIGJlZ2lubmluZwpvZiB0aGUgY2hyb21vc29tZSBhbmQgaXMgdXNlZCBieSB0aGUgZ2ZmIGRhdGEuCgpgYGB7ciBjcmVhdGVfZXhwdH0KIyMgU3RhcnQgYnkgbWFraW5nIGxvY2F0aW9ucyBmb3IgdGhlIGJpb21hcnQgZGF0YQpzY19hbm5vdHYyW1siZndkX2xvY2F0aW9uIl1dIDwtIHBhc3RlMChzY19hbm5vdHYyW1siY2hyb21vc29tZSJdXSwgIl8iLCBzY19hbm5vdHYyW1sic3RhcnQiXV0pCnNjX2Fubm90djJbWyJyZXZfbG9jYXRpb24iXV0gPC0gcGFzdGUwKHNjX2Fubm90djJbWyJjaHJvbW9zb21lIl1dLCAiXyIsIHNjX2Fubm90djJbWyJlbmQiXV0pCiMjIERvIHRoZSBzYW1lIGZvciB0aGUgZ2ZmIGFubm90YXRpb25zCnNjX2dmZl9hbm5vdGF0aW9uc1tbImZ3ZF9sb2NhdGlvbiJdXSA8LSBwYXN0ZTAoc2NfZ2ZmX2Fubm90YXRpb25zW1sic2VxbmFtZXMiXV0sICJfIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY19nZmZfYW5ub3RhdGlvbnNbWyJzdGFydCJdXSkKc2NfZ2ZmX2Fubm90YXRpb25zW1sicmV2X2xvY2F0aW9uIl1dIDwtIHBhc3RlMChzY19nZmZfYW5ub3RhdGlvbnNbWyJzZXFuYW1lcyJdXSwgIl8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjX2dmZl9hbm5vdGF0aW9uc1tbImVuZCJdXSkKc2NfZ2ZmX2Fubm90YXRpb25zW1siZ2ZmX3Jvd25hbWUiXV0gPC0gcm93bmFtZXMoc2NfZ2ZmX2Fubm90YXRpb25zKQojIyBOb3cgbWVyZ2UgdGhlbS4Kc2NfZndkX2Fubm90YXRpb25zIDwtIG1lcmdlKHNjX2Fubm90djIsIHNjX2dmZl9hbm5vdGF0aW9ucywgYnk9ImZ3ZF9sb2NhdGlvbiIpCnNjX3Jldl9hbm5vdGF0aW9ucyA8LSBtZXJnZShzY19hbm5vdHYyLCBzY19nZmZfYW5ub3RhdGlvbnMsIGJ5PSJyZXZfbG9jYXRpb24iKQpjb2xuYW1lcyhzY19md2RfYW5ub3RhdGlvbnMpIDwtIGMoImxvY2F0aW9uIiwidHJhbnNjcmlwdElEIiwiZ2VuZUlEIiwgIkRlc2NyaXB0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUeXBlIiwgImxlbmd0aCIsICJjaHJvbW9zb21lIiwgInN0cmFuZC54IiwgInN0YXJ0LngiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVuZC54IiwgImxvY2F0aW9uLngiLCAic2VxbmFtZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0YXJ0LnkiLCAiZW5kLnkiLCAid2lkdGgiLCAic3RyYW5kLnkiLCAic291cmNlIiwgInR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNjb3JlIiwgInBoYXNlIiwgImV4b25fbnVtYmVyIiwgImdlbmVfaWQiLCAiSUQiLCAicF9pZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvdGVpbl9pZCIsICJ0cmFuc2NyaXB0X2lkIiwgInRyYW5zY3JpcHRfbmFtZSIsICJ0c3NfaWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlcWVkaXQiLCAibG9jYXRpb24ueSIsICJnZmZfcm93bmFtZSIpCmNvbG5hbWVzKHNjX3Jldl9hbm5vdGF0aW9ucykgPC0gY29sbmFtZXMoc2NfZndkX2Fubm90YXRpb25zKQpzY19hbGxfYW5ub3RhdGlvbnMgPC0gcmJpbmQoc2NfZndkX2Fubm90YXRpb25zLCBzY19yZXZfYW5ub3RhdGlvbnMpCnJvd25hbWVzKHNjX2FsbF9hbm5vdGF0aW9ucykgPC0gbWFrZS5uYW1lcyhzY19hbGxfYW5ub3RhdGlvbnNbWyJnZmZfcm93bmFtZSJdXSwgdW5pcXVlPVRSVUUpCnNjX2FsbF9hbm5vdGF0aW9ucyA8LSBzY19hbGxfYW5ub3RhdGlvbnNbLCBjKCJ0cmFuc2NyaXB0SUQiLCAiZ2VuZUlEIiwgIkRlc2NyaXB0aW9uIiwgIlR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGVuZ3RoIiwgImNocm9tb3NvbWUiLCAic3RyYW5kLngiLCAic3RhcnQueCIsICJlbmQueCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0c3NfaWQiKV0KY29sbmFtZXMoc2NfYWxsX2Fubm90YXRpb25zKSA8LSBjKCJ0cmFuc2NyaXB0SUQiLCAiZ2VuZUlEIiwgIkRlc2NyaXB0aW9uIiwgIlR5cGUiLCAibGVuZ3RoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaHJvbW9zb21lIiwgInN0cmFuZCIsICJzdGFydCIsICJlbmQiLCAidHNzX2lkIikKc2NfYWxsX2Fubm90YXRpb25zW1sibG9jYXRpb24iXV0gPC0gcGFzdGUwKHNjX2FsbF9hbm5vdGF0aW9uc1tbImNocm9tb3NvbWUiXV0sICJfIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjX2FsbF9hbm5vdGF0aW9uc1tbInN0YXJ0Il1dLCAiXyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY19hbGxfYW5ub3RhdGlvbnNbWyJlbmQiXV0pCmBgYAoKIyMjIE1ha2UgdGhlIGV4cHJlc3Npb25zZXQKClRoZSBmdW5jdGlvbiAnY3JlYXRlX2V4cHQoKSBnYXRoZXJzIHRoZSBhbm5vdGF0aW9uIGRhdGEsIG1ldGFkYXRhLCBhbmQgY291bnRzLAphbmQgaW52b2tlcyB0aGUgdmFyaW91cyBSIGZ1bmN0aW9ucyB0byBjcmVhdGUgYW4gZXhwcmVzc2lvbnNldC4gIFRoaXMgZnVuY3Rpb24KaXMgbW9yZSBjb21wbGV4IHRoYW4gaXQgc2hvdWxkIGJlLCBwcmltYXJpbHkgYmVjYXVzZSBJIGdvIHRvIHNvbWUgZWZmb3J0IHRvCmFjY2VwdCBhIGxhcmdlIGFycmF5IG9mIGlucHV0cyBpbmNsdWRpbmc6ICByYXcgZGF0YSBmcmFtZXMgb2YgY291bnRzIHZzLiBzZXRzIG9mCmZpbGVuYW1lcyBvZiBjb3VudHMvaGRmNS90cG0vZXRjLCBkYXRhIGZyYW1lcyBvZiBtZXRhZGF0YSB2cy4gZXhjZWwgc2hlZXRzIHdpdGgKdmFyeWluZyBjb2x1bW5zLCBhbmQgYXJiaXRyYXJ5IGFubm90YXRpb24gZGF0YSB3aGljaCBtYXkgaW5jbHVkZSBhbGwsIHNvbWUsIG9yCm5vbmUgb2YgdGhlIGluY2x1ZGVkIGdlbmVzLgoKYGBge3IgZXhwdH0Kc2MyX2V4cHQgPC0gY3JlYXRlX2V4cHQoCiAgbWV0YWRhdGE9InNhbXBsZV9zaGVldHMvYWxsX3NhbXBsZXMueGxzeCIsCiAgZ2VuZV9pbmZvPXNjX2FsbF9hbm5vdGF0aW9ucywKICBmaWxlX2NvbHVtbj0iYnQyZmlsZSIpCmtuaXRyOjprYWJsZShoZWFkKGV4cHJzKHNjMl9leHB0JGV4cHJlc3Npb25zZXQpKSkKa25pdHI6OmthYmxlKGhlYWQoZkRhdGEoc2MyX2V4cHQkZXhwcmVzc2lvbnNldCkpKQprbml0cjo6a2FibGUoaGVhZChwRGF0YShzYzJfZXhwdCRleHByZXNzaW9uc2V0KSkpCmBgYAoKYGBge3Igc2F2ZW1lfQppZiAoIWlzVFJVRShnZXQwKCJza2lwX2xvYWQiKSkpIHsKICBwYW5kZXI6OnBhbmRlcihzZXNzaW9uSW5mbygpKQogIG1lc3NhZ2UocGFzdGUwKCJUaGlzIGlzIGhwZ2x0b29scyBjb21taXQ6ICIsIGdldF9naXRfY29tbWl0KCkpKQogIHRoaXNfc2F2ZSA8LSBwYXN0ZTAoZ3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSIiLCB4PXJtZF9maWxlKSwgIi12IiwgdmVyLCAiLnJkYS54eiIpCiAgdG1wIDwtIHNtKHNhdmVtZShmaWxlbmFtZT10aGlzX3NhdmUpKQp9CmBgYAo=