1 Cross reference some putative variants across multiple samples

A quick introduction. I received 5 samples of DNA sequencing data with a question: are there some shared/unique variants compared to the reference genome. As a reminder, these are orn deletion strains of pseudomonas.

I did the following:

  1. Trim the data aggressively to attempt to make sure there are as few sequencing mishaps as possible left in the data. This includes trimming off the first 10 nucleotides of every read.
  2. Pass the data to a mapper (bowtie2).
  3. Pass those results to my own samtools-based variant finder, which is quite conservative.
  4. Pass those results to the snippy software package.

The agreement is quite nice between the tools, which is encouraging. My tool is perhaps too conservative and suggests that more coverage is needed. Snippy suggests to me that the coverage is sufficient. I think I agree with snippy at this time.

There are a series of images in the igv/ directory which in theory back up these suppositions. I took one picture for each variant observed by snippy. Now I am going to read the results from it and look to see how many of these variants are shared among all samples vs. are unique.

Depending on what these results look like, I may do some venn or other shenanigans.

## Parsed with column specification:
## cols(
##   CHROM = col_character(),
##   POS = col_double(),
##   TYPE = col_character(),
##   REF = col_character(),
##   ALT = col_character(),
##   EVIDENCE = col_character(),
##   FTYPE = col_character(),
##   STRAND = col_character(),
##   NT_POS = col_character(),
##   AA_POS = col_character(),
##   EFFECT = col_character(),
##   LOCUS_TAG = col_character(),
##   GENE = col_character(),
##   PRODUCT = col_character()
## )
## Warning: 85 parsing failures.
## row col   expected    actual                                                               file
##   1  -- 14 columns 6 columns 'preprocessing/070919_21/outputs/snippy_paeruginosa_pa14/snps.csv'
##   2  -- 14 columns 6 columns 'preprocessing/070919_21/outputs/snippy_paeruginosa_pa14/snps.csv'
##   3  -- 14 columns 6 columns 'preprocessing/070919_21/outputs/snippy_paeruginosa_pa14/snps.csv'
##   4  -- 14 columns 6 columns 'preprocessing/070919_21/outputs/snippy_paeruginosa_pa14/snps.csv'
##   5  -- 14 columns 6 columns 'preprocessing/070919_21/outputs/snippy_paeruginosa_pa14/snps.csv'
## ... ... .......... ......... ..................................................................
## See problems(...) for more details.
## Parsed with column specification:
## cols(
##   CHROM = col_character(),
##   POS = col_double(),
##   TYPE = col_character(),
##   REF = col_character(),
##   ALT = col_character(),
##   EVIDENCE = col_character(),
##   FTYPE = col_character(),
##   STRAND = col_character(),
##   NT_POS = col_character(),
##   AA_POS = col_character(),
##   EFFECT = col_character(),
##   LOCUS_TAG = col_character(),
##   GENE = col_character(),
##   PRODUCT = col_character()
## )
## Warning: 81 parsing failures.
## row col   expected    actual                                                               file
##   1  -- 14 columns 6 columns 'preprocessing/070919_32/outputs/snippy_paeruginosa_pa14/snps.csv'
##   2  -- 14 columns 6 columns 'preprocessing/070919_32/outputs/snippy_paeruginosa_pa14/snps.csv'
##   3  -- 14 columns 6 columns 'preprocessing/070919_32/outputs/snippy_paeruginosa_pa14/snps.csv'
##   4  -- 14 columns 6 columns 'preprocessing/070919_32/outputs/snippy_paeruginosa_pa14/snps.csv'
##   5  -- 14 columns 6 columns 'preprocessing/070919_32/outputs/snippy_paeruginosa_pa14/snps.csv'
## ... ... .......... ......... ..................................................................
## See problems(...) for more details.
## Parsed with column specification:
## cols(
##   CHROM = col_character(),
##   POS = col_double(),
##   TYPE = col_character(),
##   REF = col_character(),
##   ALT = col_character(),
##   EVIDENCE = col_character(),
##   FTYPE = col_character(),
##   STRAND = col_character(),
##   NT_POS = col_character(),
##   AA_POS = col_character(),
##   EFFECT = col_character(),
##   LOCUS_TAG = col_character(),
##   GENE = col_character(),
##   PRODUCT = col_character()
## )
## Warning: 102 parsing failures.
## row col   expected    actual                                                               file
##   1  -- 14 columns 6 columns 'preprocessing/070919_54/outputs/snippy_paeruginosa_pa14/snps.csv'
##   2  -- 14 columns 6 columns 'preprocessing/070919_54/outputs/snippy_paeruginosa_pa14/snps.csv'
##   3  -- 14 columns 6 columns 'preprocessing/070919_54/outputs/snippy_paeruginosa_pa14/snps.csv'
##   4  -- 14 columns 6 columns 'preprocessing/070919_54/outputs/snippy_paeruginosa_pa14/snps.csv'
##   5  -- 14 columns 6 columns 'preprocessing/070919_54/outputs/snippy_paeruginosa_pa14/snps.csv'
## ... ... .......... ......... ..................................................................
## See problems(...) for more details.
## Parsed with column specification:
## cols(
##   CHROM = col_character(),
##   POS = col_double(),
##   TYPE = col_character(),
##   REF = col_character(),
##   ALT = col_character(),
##   EVIDENCE = col_character(),
##   FTYPE = col_character(),
##   STRAND = col_character(),
##   NT_POS = col_character(),
##   AA_POS = col_character(),
##   EFFECT = col_character(),
##   LOCUS_TAG = col_character(),
##   GENE = col_character(),
##   PRODUCT = col_character()
## )
## Warning: 102 parsing failures.
## row col   expected    actual                                                               file
##   1  -- 14 columns 6 columns 'preprocessing/070919_65/outputs/snippy_paeruginosa_pa14/snps.csv'
##   2  -- 14 columns 6 columns 'preprocessing/070919_65/outputs/snippy_paeruginosa_pa14/snps.csv'
##   3  -- 14 columns 6 columns 'preprocessing/070919_65/outputs/snippy_paeruginosa_pa14/snps.csv'
##   4  -- 14 columns 6 columns 'preprocessing/070919_65/outputs/snippy_paeruginosa_pa14/snps.csv'
##   5  -- 14 columns 6 columns 'preprocessing/070919_65/outputs/snippy_paeruginosa_pa14/snps.csv'
## ... ... .......... ......... ..................................................................
## See problems(...) for more details.
## Parsed with column specification:
## cols(
##   CHROM = col_character(),
##   POS = col_double(),
##   TYPE = col_character(),
##   REF = col_character(),
##   ALT = col_character(),
##   EVIDENCE = col_character(),
##   FTYPE = col_character(),
##   STRAND = col_character(),
##   NT_POS = col_character(),
##   AA_POS = col_character(),
##   EFFECT = col_character(),
##   LOCUS_TAG = col_character(),
##   GENE = col_character(),
##   PRODUCT = col_character()
## )
## Warning: 84 parsing failures.
## row col   expected    actual                                                               file
##   1  -- 14 columns 6 columns 'preprocessing/070919_76/outputs/snippy_paeruginosa_pa14/snps.csv'
##   2  -- 14 columns 6 columns 'preprocessing/070919_76/outputs/snippy_paeruginosa_pa14/snps.csv'
##   3  -- 14 columns 6 columns 'preprocessing/070919_76/outputs/snippy_paeruginosa_pa14/snps.csv'
##   4  -- 14 columns 6 columns 'preprocessing/070919_76/outputs/snippy_paeruginosa_pa14/snps.csv'
##   5  -- 14 columns 6 columns 'preprocessing/070919_76/outputs/snippy_paeruginosa_pa14/snps.csv'
## ... ... .......... ......... ..................................................................
## See problems(...) for more details.
## [1] 146   5
##    070919_21      070919_32      070919_54      070919_65   
##  Min.   : 9.0   Min.   : 7.0   Min.   :10.0   Min.   :10.0  
##  1st Qu.:12.0   1st Qu.:12.0   1st Qu.:12.0   1st Qu.:12.0  
##  Median :14.0   Median :14.0   Median :15.0   Median :14.0  
##  Mean   :16.4   Mean   :15.6   Mean   :17.2   Mean   :17.1  
##  3rd Qu.:19.0   3rd Qu.:17.0   3rd Qu.:19.0   3rd Qu.:18.0  
##  Max.   :69.0   Max.   :46.0   Max.   :58.0   Max.   :65.0  
##  NA's   :61     NA's   :65     NA's   :44     NA's   :44    
##    070919_76   
##  Min.   :10.0  
##  1st Qu.:11.0  
##  Median :13.0  
##  Mean   :15.5  
##  3rd Qu.:17.2  
##  Max.   :40.0  
##  NA's   :62

2 Get positions unique to each sample

## [1] "2341567_del_GC_G" "2341608_del_GC_G" "6070084_snp_T_C"
## [1] "3373667_snp_G_C"   "5103224_mnp_AG_CA" "5791972_del_CA_C"
##  [1] "2034305_del_TA_T"          "2787829_mnp_CT_AG"        
##  [3] "2885933_snp_G_C"           "3387854_snp_A_C"          
##  [5] "3387865_complex_ATTA_CTTC" "3387881_complex_ATGT_CTGC"
##  [7] "3387941_snp_A_C"           "4819712_del_GC_G"         
##  [9] "945882_del_CG_C"           "945892_del_GC_G"          
## [11] "96350_snp_T_C"             "96391_complex_ACA_GCC"    
## [13] "96401_snp_G_C"             "96406_complex_TCG_GCC"
## [1] "2033089_del_AT_A" "2407435_snp_C_G"  "2955357_snp_A_G" 
## [4] "3051413_snp_T_C"  "3051443_snp_T_C"  "3374601_snp_A_G" 
## [7] "3670384_snp_A_G"  "5256362_snp_N_C"  "791890_snp_A_G"
## [1] "208430_complex_TCCG_GCCC" "5757525_snp_G_C"

4 Get shared positions by gene

## Loading required package: stats4
## Loading required package: S4Vectors
## 
## Attaching package: 'S4Vectors'
## The following object is masked from 'package:base':
## 
##     expand.grid
## Loading required package: IRanges
## Loading required package: GenomeInfoDb
## Loading required namespace: rentrez
## Done Parsing raw GenBank file text. [ 21.443 seconds ]
## 2019-07-29 17:46:27 Starting creation of gene GRanges
## 2019-07-29 17:46:29 Starting creation of CDS GRanges
## Translation product seems to be missing for 77 of 6102 CDS annotations. Setting to ''
## 2019-07-29 17:46:32 Starting creation of exon GRanges
## No exons read from genbank file. Assuming sections of CDS are full exons
## 2019-07-29 17:46:32 Starting creation of variant VRanges
## 2019-07-29 17:46:32 Starting creation of transcript GRanges
## No transcript features (mRNA) found, using spans of CDSs
## 2019-07-29 17:46:32 Starting creation of misc feature GRanges
## Warning in fill_stack_df(feats[!typs %in% c("gene", "exon", "CDS",
## "variation", : Got unexpected multi-value field(s) [ inference ]. The
## resulting column(s) will be of class CharacterList, rather than vector(s).
## Please contact the maintainer if multi-valuedness is expected/meaningful
## for the listed field(s).
## 2019-07-29 17:46:33 - Done creating GenBankRecord object [ 5.70699999999999 seconds ]
## GRanges object with 6102 ranges and 19 metadata columns:
##            seqnames          ranges strand |        type    locus_tag
##               <Rle>       <IRanges>  <Rle> | <character>  <character>
##      [1] UCBPP-PA14        483-2027      + |         CDS PA14_RS00005
##      [2] UCBPP-PA14       2056-3159      + |         CDS PA14_RS00010
##      [3] UCBPP-PA14       3169-4271      + |         CDS PA14_RS00015
##      [4] UCBPP-PA14       4275-6695      + |         CDS PA14_RS00020
##      [5] UCBPP-PA14       7018-7791      - |         CDS PA14_RS00025
##      ...        ...             ...    ... .         ...          ...
##   [6098] UCBPP-PA14 6533464-6533652      + |         CDS PA14_RS31130
##   [6099] UCBPP-PA14 6533634-6535001      - |         CDS PA14_RS29880
##   [6100] UCBPP-PA14 6535072-6536808      - |         CDS PA14_RS29885
##   [6101] UCBPP-PA14 6537049-6537456      - |         CDS PA14_RS29890
##   [6102] UCBPP-PA14 6537471-6537605      - |         CDS PA14_RS29895
##            old_locus_tag
##          <CharacterList>
##      [1]      PA14_00010
##      [2]      PA14_00020
##      [3]      PA14_00030
##      [4]      PA14_00050
##      [5]      PA14_00060
##      ...             ...
##   [6098]            <NA>
##   [6099]      PA14_73400
##   [6100]      PA14_73410
##   [6101]      PA14_73420
##   [6102]            <NA>
##                                                         inference
##                                                       <character>
##      [1]    COORDINATES: similar to AAsequence:RefSeq:NP_064721.1
##      [2] COORDINATES: similar to AAsequence:RefSeq:WP_002551317.1
##      [3] COORDINATES: similar to AAsequence:RefSeq:WP_003253154.1
##      [4]    COORDINATES: similar to AAsequence:RefSeq:NP_064724.1
##      [5]    COORDINATES: similar to AAsequence:RefSeq:NP_064725.1
##      ...                                                      ...
##   [6098] COORDINATES: similar to AAsequence:RefSeq:WP_019727085.1
##   [6099]    COORDINATES: similar to AAsequence:RefSeq:NP_254254.1
##   [6100]    COORDINATES: similar to AAsequence:RefSeq:NP_254255.1
##   [6101]    COORDINATES: similar to AAsequence:RefSeq:NP_254256.1
##   [6102] COORDINATES: similar to AAsequence:RefSeq:WP_002551315.1
##                                                                                                                                                            note
##                                                                                                                                                     <character>
##      [1]                                                             Derived by automated computational analysis usinggene prediction method: Protein Homology.
##      [2]                                                             Derived by automated computational analysis usinggene prediction method: Protein Homology.
##      [3]                                               frameshifted; Derived by automated computationalanalysis using gene prediction method: Protein Homology.
##      [4]                                                             Derived by automated computational analysis usinggene prediction method: Protein Homology.
##      [5]                                                             Derived by automated computational analysis usinggene prediction method: Protein Homology.
##      ...                                                                                                                                                    ...
##   [6098] incomplete; partial in the middle of a contig;missing stop; Derived by automated computational analysisusing gene prediction method: Protein Homology.
##   [6099]                                                             Derived by automated computational analysis usinggene prediction method: Protein Homology.
##   [6100]                                                             Derived by automated computational analysis usinggene prediction method: Protein Homology.
##   [6101]                                                             Derived by automated computational analysis usinggene prediction method: Protein Homology.
##   [6102]                                                             Derived by automated computational analysis usinggene prediction method: Protein Homology.
##          codon_start transl_table
##            <numeric>    <numeric>
##      [1]           1           11
##      [2]           1           11
##      [3]           1           11
##      [4]           1           11
##      [5]           1           11
##      ...         ...          ...
##   [6098]           1           11
##   [6099]           1           11
##   [6100]           1           11
##   [6101]           1           11
##   [6102]           1           11
##                                                                   product
##                                                               <character>
##      [1]                   chromosomal replication initiator protein DnaA
##      [2]                                  DNA polymerase III subunit beta
##      [3]                              DNA replication/repair protein RecF
##      [4]                                             DNA gyrase subunit B
##      [5]                   1-acyl-sn-glycerol-3-phosphate acyltransferase
##      ...                                                              ...
##   [6098]                                             hypothetical protein
##   [6099] tRNA uridine-5-carboxymethylaminomethyl(34)synthesis GTPase MnmE
##   [6100]                                  membrane protein insertase YidC
##   [6101]                                 ribonuclease P protein component
##   [6102]                                        50S ribosomal protein L34
##              protein_id   translation     loctype       EC_number
##             <character> <AAStringSet> <character> <CharacterList>
##      [1] WP_003109151.1     MSV...LTT      normal            <NA>
##      [2] WP_003097262.1     MHF...MRL      normal         2.7.7.7
##      [3]           <NA>                    normal            <NA>
##      [4] WP_003097268.1     MSE...LDV      normal            <NA>
##      [5] WP_003100265.1     MST...VVS      normal            <NA>
##      ...            ...           ...         ...             ...
##   [6098]           <NA>                    normal            <NA>
##   [6099] WP_003142192.1     MQA...IGK      normal            <NA>
##   [6100] WP_003097255.1     MDI...KTA      normal            <NA>
##   [6101] WP_003100251.1     MVS...THA      normal        3.1.26.5
##   [6102] WP_003100258.1     MKR...LTV      normal            <NA>
##             pseudo        gene ribosomal_slippage    gene_synonym
##          <logical> <character>          <logical> <CharacterList>
##      [1]     FALSE        <NA>              FALSE            <NA>
##      [2]     FALSE        <NA>              FALSE            <NA>
##      [3]      TRUE        <NA>              FALSE            <NA>
##      [4]     FALSE        gyrB              FALSE            <NA>
##      [5]     FALSE        <NA>              FALSE            <NA>
##      ...       ...         ...                ...             ...
##   [6098]      TRUE        <NA>              FALSE            <NA>
##   [6099]     FALSE        <NA>              FALSE            <NA>
##   [6100]     FALSE        <NA>              FALSE            <NA>
##   [6101]     FALSE        <NA>              FALSE            <NA>
##   [6102]     FALSE        <NA>              FALSE            <NA>
##          transl_except      gene_id  transcript_id
##            <character>  <character>    <character>
##      [1]          <NA> PA14_RS00005 PA14_RS00005.1
##      [2]          <NA> PA14_RS00010 PA14_RS00010.1
##      [3]          <NA> PA14_RS00015 PA14_RS00015.1
##      [4]          <NA> PA14_RS00020 PA14_RS00020.1
##      [5]          <NA> PA14_RS00025 PA14_RS00025.1
##      ...           ...          ...            ...
##   [6098]          <NA> PA14_RS31130 PA14_RS31130.1
##   [6099]          <NA> PA14_RS29880 PA14_RS29880.1
##   [6100]          <NA> PA14_RS29885 PA14_RS29885.1
##   [6101]          <NA> PA14_RS29890 PA14_RS29890.1
##   [6102]          <NA> PA14_RS29895 PA14_RS29895.1
##   -------
##   seqinfo: 1 sequence (1 circular) from NC_008463.1 genome
##      start     end width    locus_tag     protein_id
## 1    72417   72833   417 PA14_RS00315 WP_011666524.1
## 2   155072  156052   981 PA14_RS00700 WP_011666530.1
## 3   480769  481491   723 PA14_RS02220 WP_011666535.1
## 4   982553  983818  1266 PA14_RS04570 WP_003137629.1
## 5  2362217 2362468   252 PA14_RS10995           <NA>
## 6  2362217 2362468   252 PA14_RS10995           <NA>
## 7  2594316 2595665  1350 PA14_RS12215           <NA>
## 8  2978649 2985995  7347 PA14_RS13715 WP_011666646.1
## 9  3198432 3200081  1650 PA14_RS14615           <NA>
## 10 3356421 3356696   276 PA14_RS30570 WP_079261891.1
## 11 3441918 3443309  1392 PA14_RS15680 WP_011666691.1
## 12 3542183 3543730  1548 PA14_RS16110 WP_011666694.1
## 13 3565650 3566924  1275 PA14_RS16215           <NA>
## 14 3662585 3663361   777 PA14_RS16650 WP_003087949.1
## 15 3711641 3712378   738 PA14_RS16860 WP_011666705.1
## 16 3711641 3712378   738 PA14_RS16860 WP_011666705.1
## 17 3879065 3879706   642 PA14_RS17695 WP_011666710.1
## 18 4564368 4565960  1593 PA14_RS20885 WP_011666728.1
## 19 4760148 4760960   813 PA14_RS21850 WP_011666738.1
## 20 4996812 4998302  1491 PA14_RS22840 WP_011666749.1
## 21 5102858 5104042  1185 PA14_RS23350 WP_011666751.1
## 22 5102858 5104042  1185 PA14_RS23350 WP_011666751.1
## 23 5102858 5104042  1185 PA14_RS23350 WP_011666751.1
## 24 5529629 5530636  1008 PA14_RS25330 WP_003095046.1
## 25 5904323 5907271  2949 PA14_RS27055 WP_003141757.1
## 26 5966750 5968429  1680 PA14_RS27265 WP_011666782.1
##                                                                                                                    product
## 1                                                                                                     hypothetical protein
## 2                                                                                                 ABC transporter permease
## 3                                                                           16S rRNA (uracil(1498)-N(3))-methyltransferase
## 4                                                                                                 ABC transporter permease
## 5                                                                                                     hypothetical protein
## 6                                                                                                     hypothetical protein
## 7                                                                                    NADH-quinone oxidoreductase subunit F
## 8                                                                                         non-ribosomal peptide synthetase
## 9                                                                                                      acyl-CoA synthetase
## 10                                                                                                    hypothetical protein
## 11                                                                                                    GntP family permease
## 12                                                                                   PucR family transcriptional regulator
## 13                                                                                                    hypothetical protein
## 14                                                                                        hydroxyacylglutathione hydrolase
## 15                                                                                uroporphyrinogen-III C-methyltransferase
## 16                                                                                uroporphyrinogen-III C-methyltransferase
## 17                                                                                                LysE family translocator
## 18                                                                                       anthranilate synthase component 1
## 19                                                                                                        HNH endonuclease
## 20                                                                                        DUF853 domain-containing protein
## 21                                                                                              cell division protein FtsZ
## 22                                                                                              cell division protein FtsZ
## 23                                                                                              cell division protein FtsZ
## 24                                                                          iron ABC transporter substrate-binding protein
## 25 bifunctional [glutamate--ammonialigase]-adenylyl-L-tyrosinephosphorylase/[glutamate--ammonia-ligase]adenylyltransferase
## 26                                                                          class II poly(R)-hydroxyalkanoic acid synthase
LS0tCnRpdGxlOiAiUC4gYWVydWdpbm9zYSAyMDE5MDcyMDogQ3Jvc3MgcmVmZXJlbmNlIHB1dGF0aXZlIFNOUHMgYWNyb3NzIHNhbXBsZXMuIgphdXRob3I6ICJhdGIgYWJlbGV3QGdtYWlsLmNvbSIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGZpZ19oZWlnaHQ6IDcKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgc2VsZl9jb250YWluZWQ6IHRydWUKICAgIHRoZW1lOiByZWFkYWJsZQogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogZmFsc2UKICAgICAgc21vb3RoX3Njcm9sbDogZmFsc2UKICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICB3aWR0aDogMzAwCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgdG9jX2Zsb2F0OiB0cnVlCiAgQmlvY1N0eWxlOjpodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgdG9jX2Zsb2F0OiB0cnVlCi0tLQoKPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KYm9keSwgdGQgewogIGZvbnQtc2l6ZTogMTZweDsKfQpjb2RlLnJ7CiAgZm9udC1zaXplOiAxNnB4Owp9CnByZSB7CiBmb250LXNpemU6IDE2cHgKfQo8L3N0eWxlPgoKYGBge3Igb3B0aW9ucywgaW5jbHVkZT1GQUxTRX0KbGlicmFyeSgiaHBnbHRvb2xzIikKdHQgPC0gZGV2dG9vbHM6OmxvYWRfYWxsKCIvZGF0YS9ocGdsdG9vbHMiKQprbml0cjo6b3B0c19rbml0JHNldCh3aWR0aD0xMjAsCiAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2U9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgZWNobz1UUlVFKQprbml0cjo6b3B0c19jaHVuayRzZXQoZXJyb3I9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgIGRwaT05NikKb2xkX29wdGlvbnMgPC0gb3B0aW9ucyhkaWdpdHM9NCwKICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzPUZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgIGtuaXRyLmR1cGxpY2F0ZS5sYWJlbD0iYWxsb3ciKQpnZ3Bsb3QyOjp0aGVtZV9zZXQoZ2dwbG90Mjo6dGhlbWVfYncoYmFzZV9zaXplPTEwKSkKcnVuZGF0ZSA8LSBmb3JtYXQoU3lzLkRhdGUoKSwgZm9ybWF0PSIlWSVtJWQiKQpwcmV2aW91c19maWxlIDwtICJpbmRleC5SbWQiCnZlciA8LSAiMjAxOTA3MjAiCgojI3RtcCA8LSBzbShsb2FkbWUoZmlsZW5hbWU9cGFzdGUwKGdzdWIocGF0dGVybj0iXFwuUm1kIiwgcmVwbGFjZT0iIiwgeD1wcmV2aW91c19maWxlKSwgIi12IiwgdmVyLCAiLnJkYS54eiIpKSkKIyNybWRfZmlsZSA8LSAiMDNfZXhwcmVzc2lvbl9pbmZlY3Rpb25fMjAxODA4MjIuUm1kIgpgYGAKCiMgQ3Jvc3MgcmVmZXJlbmNlIHNvbWUgcHV0YXRpdmUgdmFyaWFudHMgYWNyb3NzIG11bHRpcGxlIHNhbXBsZXMKCkEgcXVpY2sgaW50cm9kdWN0aW9uLiAgSSByZWNlaXZlZCA1IHNhbXBsZXMgb2YgRE5BIHNlcXVlbmNpbmcgZGF0YSB3aXRoIGEKcXVlc3Rpb246IGFyZSB0aGVyZSBzb21lIHNoYXJlZC91bmlxdWUgdmFyaWFudHMgY29tcGFyZWQgdG8gdGhlIHJlZmVyZW5jZQpnZW5vbWUuICBBcyBhIHJlbWluZGVyLCB0aGVzZSBhcmUgb3JuIGRlbGV0aW9uIHN0cmFpbnMgb2YgcHNldWRvbW9uYXMuCgpJIGRpZCB0aGUgZm9sbG93aW5nOgoKMS4gIFRyaW0gdGhlIGRhdGEgX2FnZ3Jlc3NpdmVseV8gdG8gYXR0ZW1wdCB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIGFzIGZldwogICAgc2VxdWVuY2luZyBtaXNoYXBzIGFzIHBvc3NpYmxlIGxlZnQgaW4gdGhlIGRhdGEuICBUaGlzIGluY2x1ZGVzIHRyaW1taW5nIG9mZgogICAgdGhlIGZpcnN0IDEwIG51Y2xlb3RpZGVzIG9mIGV2ZXJ5IHJlYWQuCjIuICBQYXNzIHRoZSBkYXRhIHRvIGEgbWFwcGVyIChib3d0aWUyKS4KMy4gIFBhc3MgdGhvc2UgcmVzdWx0cyB0byBteSBvd24gc2FtdG9vbHMtYmFzZWQgdmFyaWFudCBmaW5kZXIsIHdoaWNoIGlzIHF1aXRlCiAgICBjb25zZXJ2YXRpdmUuCjQuICBQYXNzIHRob3NlIHJlc3VsdHMgdG8gdGhlIHNuaXBweSBzb2Z0d2FyZSBwYWNrYWdlLgoKVGhlIGFncmVlbWVudCBpcyBxdWl0ZSBuaWNlIGJldHdlZW4gdGhlIHRvb2xzLCB3aGljaCBpcyBlbmNvdXJhZ2luZy4gIE15IHRvb2wgaXMKcGVyaGFwcyB0b28gY29uc2VydmF0aXZlIGFuZCBzdWdnZXN0cyB0aGF0IG1vcmUgY292ZXJhZ2UgaXMgbmVlZGVkLiAgU25pcHB5CnN1Z2dlc3RzIHRvIG1lIHRoYXQgdGhlIGNvdmVyYWdlIGlzIHN1ZmZpY2llbnQuICBJIHRoaW5rIEkgYWdyZWUgd2l0aCBzbmlwcHkgYXQKdGhpcyB0aW1lLgoKVGhlcmUgYXJlIGEgc2VyaWVzIG9mIGltYWdlcyBpbiB0aGUgaWd2LyBkaXJlY3Rvcnkgd2hpY2ggaW4gdGhlb3J5IGJhY2sgdXAgdGhlc2UKc3VwcG9zaXRpb25zLiAgSSB0b29rIG9uZSBwaWN0dXJlIGZvciBlYWNoIHZhcmlhbnQgb2JzZXJ2ZWQgYnkgc25pcHB5LiAgTm93IEkgYW0KZ29pbmcgdG8gcmVhZCB0aGUgcmVzdWx0cyBmcm9tIGl0IGFuZCBsb29rIHRvIHNlZSBob3cgbWFueSBvZiB0aGVzZSB2YXJpYW50cyBhcmUKc2hhcmVkIGFtb25nIGFsbCBzYW1wbGVzIHZzLiBhcmUgdW5pcXVlLgoKRGVwZW5kaW5nIG9uIHdoYXQgdGhlc2UgcmVzdWx0cyBsb29rIGxpa2UsIEkgbWF5IGRvIHNvbWUgdmVubiBvciBvdGhlciBzaGVuYW5pZ2Fucy4KCmBgYHtyIHJlYWRzX3Blcl9zYW1wbGV9CnNhbXBsZXMgPC0gYygiMDcwOTE5XzIxIiwgIjA3MDkxOV8zMiIsICIwNzA5MTlfNTQiLAogICAgICAgICAgICAgIjA3MDkxOV82NSIsICIwNzA5MTlfNzYiKQpjc3ZfZmlsZXMgPC0gcGFzdGUwKCJwcmVwcm9jZXNzaW5nLyIsIHNhbXBsZXMsICIvb3V0cHV0cy9zbmlwcHlfcGFlcnVnaW5vc2FfcGExNC9zbnBzLmNzdiIpCmBgYAoKYGBge3Igc2VhcmNoX3NoYXJlZF9zbmlwcHl9CnNucF9kZiA8LSBkYXRhLmZyYW1lKCkKZm9yIChmIGluIDE6bGVuZ3RoKGNzdl9maWxlcykpIHsKICBuYW1lIDwtIHNhbXBsZXNbZl0KICBmaWxlIDwtIGNzdl9maWxlc1tmXQogIHRtcGRmIDwtIHJlYWRyOjpyZWFkX2NzdihmaWxlKQogIHRtcGRmW1siZW5jb2RlZCJdXSA8LSBnbHVlOjpnbHVlKCJ7dG1wZGZbWydQT1MnXV19X3t0bXBkZltbJ1RZUEUnXV19X3t0bXBkZltbJ1JFRiddXX1fe3RtcGRmW1snQUxUJ11dfSIpCiAgdG1wZGZbWyJjb3VudCJdXSA8LSBhcy5udW1lcmljKGdzdWIoeD10bXBkZltbIkVWSURFTkNFIl1dLCBwYXR0ZXJuPSJeXFx3KzooXFxkKykgLiokIiwgcmVwbGFjZW1lbnQ9IlxcMSIpKQogIHRtcGRmIDwtIHRtcGRmWywgYygiZW5jb2RlZCIsICJjb3VudCIpXQogIGNvbG5hbWVzKHRtcGRmKSA8LSBjKCJlbmNvZGVkIiwgbmFtZSkKICBpZiAoZiA9PSAxKSB7CiAgICBzbnBfZGYgPC0gdG1wZGYKICB9IGVsc2UgewogICAgc25wX2RmIDwtIG1lcmdlKHNucF9kZiwgdG1wZGYsIGJ5PSJlbmNvZGVkIiwgYWxsPVRSVUUpCiAgfQp9CnJvd25hbWVzKHNucF9kZikgPC0gc25wX2RmW1siZW5jb2RlZCJdXQpzbnBfZGZbWyJlbmNvZGVkIl1dIDwtIE5VTEwKZGltKHNucF9kZikKc3VtbWFyeShzbnBfZGYpCndyaXRlLmNzdihmaWxlPSJzbnBfZGYuY3N2IiwgeD1zbnBfZGYpCgpiaW5hcnkgPC0gc25wX2RmCmlkeCA8LSBiaW5hcnkgPiAwCmJpbmFyeVtpZHhdIDwtIDEKaWR4IDwtIGlzLm5hKGJpbmFyeSkKYmluYXJ5W2lkeF0gPC0gMAoKYmluYXJ5X2xpc3QgPC0gbGlzdCgpCmZvciAoZSBpbiBjb2xuYW1lcyhiaW5hcnkpKSB7CiAgaWR4IDwtIGJpbmFyeVssIGVdID09IDEKICBwb3NpdGlvbnMgPC0gcm93bmFtZXMoYmluYXJ5KVtpZHhdCiAgYmluYXJ5X2xpc3RbW2VdXSA8LSBwb3NpdGlvbnMKfQoKbGlicmFyeShWZW5uZXJhYmxlKQp0ZXN0IDwtIFZlbm5lcmFibGU6OlZlbm4oU2V0cz1iaW5hcnlfbGlzdCkKVmVubmVyYWJsZTo6cGxvdCh0ZXN0LCBkb1dlaWdodHM9RkFMU0UpCmBgYAoKIyBHZXQgcG9zaXRpb25zIHVuaXF1ZSB0byBlYWNoIHNhbXBsZQoKYGBge3IgdW5pcXVlX3Bvc2l0aW9uc30KIyMgRmlyc3Qgc2FtcGxlCnRlc3RASW50ZXJzZWN0aW9uU2V0c1tbIjEwMDAwIl1dCiMjIFNlY29uZCBzYW1wbGUKdGVzdEBJbnRlcnNlY3Rpb25TZXRzW1siMDEwMDAiXV0KIyMgVGhpcmQgc2FtcGxlCnRlc3RASW50ZXJzZWN0aW9uU2V0c1tbIjAwMTAwIl1dCiMjIEZvdXJ0aCBzYW1wbGUKdGVzdEBJbnRlcnNlY3Rpb25TZXRzW1siMDAwMTAiXV0KIyMgRmlmdGggc2FtcGxlCnRlc3RASW50ZXJzZWN0aW9uU2V0c1tbIjAwMDAxIl1dCmBgYAoKIyBTaGFyZWQgYW1vbmcgYWxsIGV4Y2VwdCB0aGUgZmlyc3Qgc2FtcGxlCgpgYGB7ciBzaGFyZWRfbm90X0ZpcnN0fQp0ZXN0QEludGVyc2VjdGlvblNldHNbWyIwMTExMSJdXQojIyAiMjE0OTQyNV9zbnBfVF9DIgojIyBUaGlzIGlzIGdlbmUgUEExNF8yNDYwMC9nZW5lMTY1NDgwNwoKIyMgIjIyNjM2OTZfZGVsX0FDX0EiCiMjIFRoaXMgaXMgYmV0d2VlbjogUEExNF8yNTk0MCBhbmQgUEExNF8yNTk2MAoKIyMgIjUxMDMzMjJfc25wX0dfVCIKIyMgUEExNF81NzI3NQoKCgpgYGAKCgojIEdldCBzaGFyZWQgcG9zaXRpb25zIGJ5IGdlbmUKCmBgYHtyIHNoYXJlZF9ieV9nZW5lfQpsaWJyYXJ5KEdlbm9taWNSYW5nZXMpCnNoYXJlZF9wb3NpdGlvbnMgPC0gdGVzdEBJbnRlcnNlY3Rpb25TZXRzW1siMTExMTEiXV0KcG9zaXRpb25zIDwtIGFzLm51bWVyaWMoZ3N1Yih4PXNoYXJlZF9wb3NpdGlvbnMsIHBhdHRlcm49Il4oXFxkKylfLiokIiwgcmVwbGFjZW1lbnQ9IlxcMSIpKQpwb3NfZ3JhbmdlcyA8LSBHUmFuZ2VzKHNlcW5hbWVzPSJVQ0JQUC1QQTE0IiwKICAgICAgICAgICAgICAgICAgICAgICByYW5nZXM9SVJhbmdlcyhzdGFydD1wb3NpdGlvbnMsIHdpZHRoPTEpKQoKYW5ub3RhdGlvbnMgPC0gaHBnbHRvb2xzOjpsb2FkX2dlbmJhbmtfYW5ub3RhdGlvbnMoIk5DXzAwODQ2MyIpCmNkcyA8LSBhbm5vdGF0aW9ucyRjZHMKY2RzCgpoaXRzIDwtIGZpbmRPdmVybGFwcyhjZHMsIHBvc19ncmFuZ2VzLCBpZ25vcmUuc3RyYW5kPVRSVUUpCmlkeCA8LSBhcy5kYXRhLmZyYW1lKGhpdHMpW1sicXVlcnlIaXRzIl1dCgp3YW50ZWRfY29sdW1ucyA8LSBjKCJzdGFydCIsICJlbmQiLCAid2lkdGgiLCAibG9jdXNfdGFnIiwgInByb3RlaW5faWQiLCAicHJvZHVjdCIpCmtlcHQgPC0gYXMuZGF0YS5mcmFtZShjZHNbaWR4LCBdKQprZXB0IDwtIGtlcHRbLCB3YW50ZWRfY29sdW1uc10Ka2VwdApgYGAKCgpgYGB7ciBzYXZlbWUsIGV2YWw9RkFMU0V9CnBhbmRlcjo6cGFuZGVyKHNlc3Npb25JbmZvKCkpCm1lc3NhZ2UocGFzdGUwKCJUaGlzIGlzIGhwZ2x0b29scyBjb21taXQ6ICIsIGdldF9naXRfY29tbWl0KCkpKQp0aGlzX3NhdmUgPC0gcGFzdGUwKGdzdWIocGF0dGVybj0iXFwuUm1kIiwgcmVwbGFjZT0iIiwgeD1ybWRfZmlsZSksICItdiIsIHZlciwgIi5yZGEueHoiKQptZXNzYWdlKHBhc3RlMCgiU2F2aW5nIHRvICIsIHRoaXNfc2F2ZSkpCnRtcCA8LSBzbShzYXZlbWUoZmlsZW5hbWU9dGhpc19zYXZlKSkKYGBgCg==