Introduction

The below code is written for the Agriculture Victoria BASC computing cluster.

This workflow currently only works with insect COI sequencing using a single primer set

Clone the pipeRline github repository

# Define the directory you will be running the analysis in
working_dir=/group/pathogens/IAWS/Personal/Alexp/metabarcoding/marine_surveillance #CHANGE TO YOUR DIRECTORY

git clone https://github.com/alexpiper/piperline.git $working_dir
cd $working_dir

Updating the pipeline

To update to the latest version of the pipeline, run the below code in the terminal.

cd $working_dir
git pull

# if an error occurs, run:
git stash
git pull

Prior to analysis

The PipeRline workflow assumes that your sequencing data meets certain criteria:

  1. Samples have been demultiplexed, i.e. split into individual per-sample fastq files. If you want the pipeline to calculate the index-switching rate, the fastq files need to be re-demultiplexed as the miseq does not put indexes in fasta headers by default
  2. For paired-end sequencing data, the forward and reverse reads are in separate files (ie. not interleaved) with reads arranged in matched order.

The output directory should be unique for each sequencing run, named as the flowcell id, within a directory called data

For example:

root/
  ├── data/
     ├── CJL7D/
     
     

Demultiplex MiSeq run

For this workflow to run, we will need some sequencing runs to work with. If you are working with MiSeq data, it is recommended that the data is demultiplexed again using bcl2fastq, as the miseq does not put indexes in fasta headers by default which is required for the index swtiching calculation.

The below code is written for the Agriculture Victoria BASC computing cluster, and the locations will be different if you are using a different HPC cluster.

#load module
module load bcl2fastq2/2.20.0-foss-2018b

#raise amount of available file handles
ulimit -n 4000

###Run1

#Set up input and outputs
inputdir=/group/sequencing/210219_M03633_0489_000000000-JDYG3 #CHANGE TO YOUR SEQ RUN

fcid=$(echo $input_dir | sed 's/^.*-//')
outputdir=$working_dir/data/$fcid
samplesheet=$input_dir/SampleSheet.csv

# convert samplesheet to unix format
dos2unix $samplesheet

#Demultiplex
bcl2fastq -p 12 --runfolder-dir $input_dir \
--output-dir $outputdir \
--sample-sheet $samplesheet \
--no-lane-splitting --barcode-mismatches 1

# Copy other necessary files and move fastqs
cd $outputdir
cp -r $input_dir/InterOp $outputdir
cp $input_dir/RunInfo.xml $outputdir
cp $input_dir/[Rr]unParameters.xml $outputdir
cp $samplesheet $outputdir
mv **/*.fastq.gz $outputdir

# Append fcid to start of sample names if missing
for i in *.fastq.gz; do
  if ! [[ $i == $fcid* ]]; then
  new=$(echo ${fcid} ${i}) #append together
  new=$(echo ${new// /_}) #remove any white space
  mv -v "$i" "$new"
  fi
done

Reference databases

The pipeRline workflow uses the IDTAXA and BLAST software to assign taxonomy to the sequence reads. These require a pre-trained IDTAXA model, and a fasta file with heirarchial taxonomy. For insects, these

Copy reference databases

Reference databases are stored in the referencedata directory on BASC

# Change 'folder-name' to the directory you are running the analysis in
cp /group/referencedata/mspd-db/metabarcoding/arthropod/imappests_coi_18_08_2020/* $working_dir/reference/.

Submit job with parameters

The parameters for the run are parsed along with the slurm script.

if you wish to use multiple values (i.e. multiple reference databases, multiple primers per index) encapsulate them in a ’’ and seperate them with a ;

You will need to change your email address and account code below, see BASC account code lists

# Change 'folder-name' to the directory you are running the analysis in
cd $working_dir

# Submit slurm job - CHANGE EMAIL TO YOUR OWN EMAIL
sbatch --mail-user=your.name@email.com --account=your.account --cpus-per-task=10 \
supplementary_scripts/basc_shifter.slurm \
  --pcr_primers fwhF2-fwhR2n \
  --for_primer_seq GGDACWGGWTGAACWGTWTAYCCHCC \
  --rev_primer_seq GTRATWGCHCCDGCTARWACWGG \
  --target_gene COI \
  --max_primer_mismatch 0 \
  --read_min_length 20 \
  --read_max_length Inf \
  --read_max_ee 1 \
  --read_trunc_length 150 \
  --read_trim_left 0 \
  --read_trim_right 0 \
  --asv_min_length 195 \
  --asv_max_length 215 \
  --high_sensitivity TRUE \
  --concat_unmerged FALSE \
  --genetic_code SGC4 \
  --coding TRUE \
  --phmm reference/folmer_fullength_model.rds \
  --idtaxa_db reference/idtaxa_bftrimmed.rds \
  --ref_fasta reference/insecta_hierarchial_bftrimmed.fa.gz \
  --idtaxa_confidence 60 \
  --run_blast TRUE \
  --blast_min_identity 97 \
  --blast_min_coverage 90 \
  --target_kingdom Metazoa \
  --target_phylum Arthropoda \
  --target_class NA \
  --target_order NA \
  --target_family NA \
  --target_genus NA \
  --target_species NA \
  --min_sample_reads 1000 \
  --min_taxa_reads NA \
  --min_taxa_ra 1e-4 \
  --start_fresh FALSE

Parameter descriptions

  • Primer parameters:
    • pcr_primers - Name of PCR primers
    • for_primer_seq - Forward primer sequence
    • rev_primer_seq - Reverse primer sequence
    • target_gene - Name of target gene
    • max_primer_mismatch - How much mismatch to allow when detecting primer sequences
  • Read filtering:
    • read_min_length - Minimum length of primer trimmed reads
    • read_max_length - Maximum length of primer trimmed reads
    • read_max_ee - Maximum expected errors of primer trimmed reads
    • read_trunc_length - Length to cut all longer reads to
    • read_trim_left - Remove this many bp from left side of primer trimmed reads
    • read_trim_right - Remove this many bp from right side of primer trimmed reads
  • ASV filtering
    • asv_min_length - Minimum length of amplicon
    • asv_max_length - Maximum length of amplicon
    • high_sensitivity - Option to turn on pseudo pooling, setting this to FALSE greatly speeds up ASV inference at the expense of detecting fewer rare (<5 reads) taxa.
    • concat_unmerged - Retain any unmerged read pairs by concatenating them together separated by a string of 10 N bases
    • genetic_code - Genetic code for amplicon - see Biostrings::GENETIC_CODE_TABLE
    • coding - Is the amplicon from a protein coding gene
    • phmm - Path to profile hidden markov model (Optional)
  • Taxonomic assignment:
    • idtaxa_db - Path to trained IDTAXA model
    • ref_fasta - Path to fasta file of reference database
    • idtaxa_confidence - Minimum bootstrap confidence for IDTAXA
    • run_blast - Whether a blast top hit search should be conducted in addition to IDTAXA
    • blast_min_identity - Minimum nucleotide identity for BLAST
    • blast_min_coverage - Minimum query coverage for BLAST
    • target_kingdom - Subset to target kingdom
    • target_phylum - Subset to target phylum
    • target_class - Subset to target class
    • target_order - Subset to target order
    • target_family - Subset to target family
    • target_genus - Subset to target genus
    • target_species - Subset to target species
  • Sample & Taxon filtering:
    • min_sample_reads - Minimum reads per sample after filtering
    • min_taxa_reads - Minimum reads per ASV to retain
    • min_taxa_ra - Minimum relative abundance per ASV to retain. 1e-4 is 0.01%
  • General pipeline parameters
    • threads - Number of CPU threads to run the pipeline across - NOT USED FOR BASC
    • start_fresh - Whether to remove all intermediate files and start the pipeline fresh
LS0tDQp0aXRsZTogIlBpcGVSbGluZSINCnN1YnRpdGxlOiAiQkFTQyBleGFtcGxlIHVzaW5nIFNMVVJNIg0KYXV0aG9yOiAiQS5NLiBQaXBlciINCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCm91dHB1dDoNCiAgDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgaGlnaGxpZ2h0ZXI6IG51bGwNCiAgICB0aGVtZTogImZsYXRseSINCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBzaG93DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiANCiAgICAgIGNvbGxhcHNlZDogZmFsc2UNCiAgICAgIHNtb290aF9zY3JvbGw6IHRydWUNCiAgICBkZl9wcmludDogcGFnZWQgICAgDQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogY29uc29sZQ0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KIyBLbml0ciBnbG9iYWwgc2V0dXAgLSBjaGFuZ2UgZXZhbCB0byB0cnVlIHRvIHJ1biBjb2RlDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeSh0YXJnZXRzKQ0KbGlicmFyeSh0YXJjaGV0eXBlcykNCg0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBldmFsPUZBTFNFLCBtZXNzYWdlPUZBTFNFLGVycm9yPUZBTFNFLCBmaWcuc2hvdyA9ICJob2xkIiwgZmlnLmtlZXAgPSAiYWxsIikNCm9wdHNfY2h1bmskc2V0KGRldiA9ICdwbmcnKQ0KYGBgDQoNCiMgSW50cm9kdWN0aW9uDQoNClRoZSBiZWxvdyBjb2RlIGlzIHdyaXR0ZW4gZm9yIHRoZSBBZ3JpY3VsdHVyZSBWaWN0b3JpYSBCQVNDIGNvbXB1dGluZyBjbHVzdGVyLg0KDQpUaGlzIHdvcmtmbG93IGN1cnJlbnRseSBvbmx5IHdvcmtzIHdpdGggaW5zZWN0IENPSSBzZXF1ZW5jaW5nIHVzaW5nIGEgc2luZ2xlIHByaW1lciBzZXQNCg0KIyBDbG9uZSB0aGUgcGlwZVJsaW5lIGdpdGh1YiByZXBvc2l0b3J5DQoNCmBgYHtiYXNofQ0KIyBEZWZpbmUgdGhlIGRpcmVjdG9yeSB5b3Ugd2lsbCBiZSBydW5uaW5nIHRoZSBhbmFseXNpcyBpbg0Kd29ya2luZ19kaXI9L2dyb3VwL3BhdGhvZ2Vucy9JQVdTL1BlcnNvbmFsL0FsZXhwL21ldGFiYXJjb2RpbmcvbWFyaW5lX3N1cnZlaWxsYW5jZSAjQ0hBTkdFIFRPIFlPVVIgRElSRUNUT1JZDQoNCmdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vYWxleHBpcGVyL3BpcGVybGluZS5naXQgJHdvcmtpbmdfZGlyDQpjZCAkd29ya2luZ19kaXINCmBgYA0KDQoNCiMjIFVwZGF0aW5nIHRoZSBwaXBlbGluZQ0KDQpUbyB1cGRhdGUgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBwaXBlbGluZSwgcnVuIHRoZSBiZWxvdyBjb2RlIGluIHRoZSB0ZXJtaW5hbC4NCg0KYGBge2Jhc2h9DQpjZCAkd29ya2luZ19kaXINCmdpdCBwdWxsDQoNCiMgaWYgYW4gZXJyb3Igb2NjdXJzLCBydW46DQpnaXQgc3Rhc2gNCmdpdCBwdWxsDQpgYGANCg0KDQojIFByaW9yIHRvIGFuYWx5c2lzDQpUaGUgUGlwZVJsaW5lIHdvcmtmbG93IGFzc3VtZXMgdGhhdCB5b3VyIHNlcXVlbmNpbmcgZGF0YSBtZWV0cyBjZXJ0YWluIGNyaXRlcmlhOg0KDQoxLiBTYW1wbGVzIGhhdmUgYmVlbiBkZW11bHRpcGxleGVkLCBpLmUuIHNwbGl0IGludG8gaW5kaXZpZHVhbCBwZXItc2FtcGxlIGZhc3RxIGZpbGVzLiBJZiB5b3Ugd2FudCB0aGUgcGlwZWxpbmUgdG8gY2FsY3VsYXRlIHRoZSBpbmRleC1zd2l0Y2hpbmcgcmF0ZSwgdGhlIGZhc3RxIGZpbGVzIG5lZWQgdG8gYmUgcmUtZGVtdWx0aXBsZXhlZCBhcyB0aGUgbWlzZXEgZG9lcyBub3QgcHV0IGluZGV4ZXMgaW4gZmFzdGEgaGVhZGVycyBieSBkZWZhdWx0DQoyLiBGb3IgcGFpcmVkLWVuZCBzZXF1ZW5jaW5nIGRhdGEsIHRoZSBmb3J3YXJkIGFuZCByZXZlcnNlIHJlYWRzIGFyZSBpbiBzZXBhcmF0ZSBmaWxlcyAoaWUuIG5vdCBpbnRlcmxlYXZlZCkgd2l0aCByZWFkcyBhcnJhbmdlZCBpbiBtYXRjaGVkIG9yZGVyLg0KDQpUaGUgb3V0cHV0IGRpcmVjdG9yeSBzaG91bGQgYmUgdW5pcXVlIGZvciBlYWNoIHNlcXVlbmNpbmcgcnVuLCBuYW1lZCBhcyB0aGUgZmxvd2NlbGwgaWQsIHdpdGhpbiBhIGRpcmVjdG9yeSBjYWxsZWQgZGF0YQ0KDQpGb3IgZXhhbXBsZToNCg0KICAgIHJvb3QvDQogICAgICDilJzilIDilIAgZGF0YS8NCiAgICAgICAgIOKUnOKUgOKUgCBDSkw3RC8NCiAgICAgICAgIA0KICAgICAgICAgDQojIERlbXVsdGlwbGV4IE1pU2VxIHJ1bg0KDQpGb3IgdGhpcyB3b3JrZmxvdyB0byBydW4sIHdlIHdpbGwgbmVlZCBzb21lIHNlcXVlbmNpbmcgcnVucyB0byB3b3JrIHdpdGguIElmIHlvdSBhcmUgd29ya2luZyB3aXRoIE1pU2VxIGRhdGEsIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhlIGRhdGEgaXMgZGVtdWx0aXBsZXhlZCBhZ2FpbiB1c2luZyBiY2wyZmFzdHEsIGFzIHRoZSBtaXNlcSBkb2VzIG5vdCBwdXQgaW5kZXhlcyBpbiBmYXN0YSBoZWFkZXJzIGJ5IGRlZmF1bHQgd2hpY2ggaXMgcmVxdWlyZWQgZm9yIHRoZSBpbmRleCBzd3RpY2hpbmcgY2FsY3VsYXRpb24uDQoNClRoZSBiZWxvdyBjb2RlIGlzIHdyaXR0ZW4gZm9yIHRoZSBBZ3JpY3VsdHVyZSBWaWN0b3JpYSBCQVNDIGNvbXB1dGluZyBjbHVzdGVyLCBhbmQgdGhlIGxvY2F0aW9ucyB3aWxsIGJlIGRpZmZlcmVudCBpZiB5b3UgYXJlIHVzaW5nIGEgZGlmZmVyZW50IEhQQyBjbHVzdGVyLg0KDQpgYGB7YmFzaCBkZW11bHRpcGxleCAxIG1pc21hdGNofQ0KI2xvYWQgbW9kdWxlDQptb2R1bGUgbG9hZCBiY2wyZmFzdHEyLzIuMjAuMC1mb3NzLTIwMThiDQoNCiNyYWlzZSBhbW91bnQgb2YgYXZhaWxhYmxlIGZpbGUgaGFuZGxlcw0KdWxpbWl0IC1uIDQwMDANCg0KIyMjUnVuMQ0KDQojU2V0IHVwIGlucHV0IGFuZCBvdXRwdXRzDQppbnB1dGRpcj0vZ3JvdXAvc2VxdWVuY2luZy8yMTAyMTlfTTAzNjMzXzA0ODlfMDAwMDAwMDAwLUpEWUczICNDSEFOR0UgVE8gWU9VUiBTRVEgUlVODQoNCmZjaWQ9JChlY2hvICRpbnB1dF9kaXIgfCBzZWQgJ3MvXi4qLS8vJykNCm91dHB1dGRpcj0kd29ya2luZ19kaXIvZGF0YS8kZmNpZA0Kc2FtcGxlc2hlZXQ9JGlucHV0X2Rpci9TYW1wbGVTaGVldC5jc3YNCg0KIyBjb252ZXJ0IHNhbXBsZXNoZWV0IHRvIHVuaXggZm9ybWF0DQpkb3MydW5peCAkc2FtcGxlc2hlZXQNCg0KI0RlbXVsdGlwbGV4DQpiY2wyZmFzdHEgLXAgMTIgLS1ydW5mb2xkZXItZGlyICRpbnB1dF9kaXIgXA0KLS1vdXRwdXQtZGlyICRvdXRwdXRkaXIgXA0KLS1zYW1wbGUtc2hlZXQgJHNhbXBsZXNoZWV0IFwNCi0tbm8tbGFuZS1zcGxpdHRpbmcgLS1iYXJjb2RlLW1pc21hdGNoZXMgMQ0KDQojIENvcHkgb3RoZXIgbmVjZXNzYXJ5IGZpbGVzIGFuZCBtb3ZlIGZhc3Rxcw0KY2QgJG91dHB1dGRpcg0KY3AgLXIgJGlucHV0X2Rpci9JbnRlck9wICRvdXRwdXRkaXINCmNwICRpbnB1dF9kaXIvUnVuSW5mby54bWwgJG91dHB1dGRpcg0KY3AgJGlucHV0X2Rpci9bUnJddW5QYXJhbWV0ZXJzLnhtbCAkb3V0cHV0ZGlyDQpjcCAkc2FtcGxlc2hlZXQgJG91dHB1dGRpcg0KbXYgKiovKi5mYXN0cS5neiAkb3V0cHV0ZGlyDQoNCiMgQXBwZW5kIGZjaWQgdG8gc3RhcnQgb2Ygc2FtcGxlIG5hbWVzIGlmIG1pc3NpbmcNCmZvciBpIGluICouZmFzdHEuZ3o7IGRvDQogIGlmICEgW1sgJGkgPT0gJGZjaWQqIF1dOyB0aGVuDQogIG5ldz0kKGVjaG8gJHtmY2lkfSAke2l9KSAjYXBwZW5kIHRvZ2V0aGVyDQogIG5ldz0kKGVjaG8gJHtuZXcvLyAvX30pICNyZW1vdmUgYW55IHdoaXRlIHNwYWNlDQogIG12IC12ICIkaSIgIiRuZXciDQogIGZpDQpkb25lDQoNCmBgYA0KDQojIFJlZmVyZW5jZSBkYXRhYmFzZXMgDQoNClRoZSBwaXBlUmxpbmUgd29ya2Zsb3cgdXNlcyB0aGUgW0lEVEFYQV0oaHR0cHM6Ly9taWNyb2Jpb21lam91cm5hbC5iaW9tZWRjZW50cmFsLmNvbS9hcnRpY2xlcy8xMC4xMTg2L3M0MDE2OC0wMTgtMDUyMS01KSBhbmQgQkxBU1Qgc29mdHdhcmUgdG8gYXNzaWduIHRheG9ub215IHRvIHRoZSBzZXF1ZW5jZSByZWFkcy4gVGhlc2UgcmVxdWlyZSBhIHByZS10cmFpbmVkIElEVEFYQSBtb2RlbCwgYW5kIGEgZmFzdGEgZmlsZSB3aXRoIGhlaXJhcmNoaWFsIHRheG9ub215LiBGb3IgaW5zZWN0cywgdGhlc2UgDQoNCiMjIENvcHkgcmVmZXJlbmNlIGRhdGFiYXNlcw0KDQpSZWZlcmVuY2UgZGF0YWJhc2VzIGFyZSBzdG9yZWQgaW4gdGhlIHJlZmVyZW5jZWRhdGEgZGlyZWN0b3J5IG9uIEJBU0MNCg0KYGBge2Jhc2h9DQojIENoYW5nZSAnZm9sZGVyLW5hbWUnIHRvIHRoZSBkaXJlY3RvcnkgeW91IGFyZSBydW5uaW5nIHRoZSBhbmFseXNpcyBpbg0KY3AgL2dyb3VwL3JlZmVyZW5jZWRhdGEvbXNwZC1kYi9tZXRhYmFyY29kaW5nL2FydGhyb3BvZC9pbWFwcGVzdHNfY29pXzE4XzA4XzIwMjAvKiAkd29ya2luZ19kaXIvcmVmZXJlbmNlLy4NCmBgYA0KDQojIFN1Ym1pdCBqb2Igd2l0aCBwYXJhbWV0ZXJzDQoNClRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgcnVuIGFyZSBwYXJzZWQgYWxvbmcgd2l0aCB0aGUgc2x1cm0gc2NyaXB0Lg0KDQppZiB5b3Ugd2lzaCB0byB1c2UgbXVsdGlwbGUgdmFsdWVzIChpLmUuIG11bHRpcGxlIHJlZmVyZW5jZSBkYXRhYmFzZXMsIG11bHRpcGxlIHByaW1lcnMgcGVyIGluZGV4KSBlbmNhcHN1bGF0ZSB0aGVtIGluIGEgJycgYW5kIHNlcGVyYXRlIHRoZW0gd2l0aCBhIDsNCg0KKipZb3Ugd2lsbCBuZWVkIHRvIGNoYW5nZSB5b3VyIGVtYWlsIGFkZHJlc3MgYW5kIGFjY291bnQgY29kZSBiZWxvdywgc2VlIFtCQVNDIGFjY291bnQgY29kZSBsaXN0c10oaHR0cHM6Ly91c2Vycy5iYXNjLnNjaWVuY2UuZGVwaS52aWMuZ292LmF1L2pvYnMvc2x1cm0vc2x1cm1fYWNjb3VudHMvKSoqDQoNCmBgYHtiYXNofQ0KIyBDaGFuZ2UgJ2ZvbGRlci1uYW1lJyB0byB0aGUgZGlyZWN0b3J5IHlvdSBhcmUgcnVubmluZyB0aGUgYW5hbHlzaXMgaW4NCmNkICR3b3JraW5nX2Rpcg0KDQojIFN1Ym1pdCBzbHVybSBqb2IgLSBDSEFOR0UgRU1BSUwgVE8gWU9VUiBPV04gRU1BSUwNCnNiYXRjaCAtLW1haWwtdXNlcj15b3VyLm5hbWVAZW1haWwuY29tIC0tYWNjb3VudD15b3VyLmFjY291bnQgLS1jcHVzLXBlci10YXNrPTEwIFwNCnN1cHBsZW1lbnRhcnlfc2NyaXB0cy9iYXNjX3NoaWZ0ZXIuc2x1cm0gXA0KICAtLXBjcl9wcmltZXJzIGZ3aEYyLWZ3aFIybiBcDQogIC0tZm9yX3ByaW1lcl9zZXEgR0dEQUNXR0dXVEdBQUNXR1RXVEFZQ0NIQ0MgXA0KICAtLXJldl9wcmltZXJfc2VxIEdUUkFUV0dDSENDREdDVEFSV0FDV0dHIFwNCiAgLS10YXJnZXRfZ2VuZSBDT0kgXA0KICAtLW1heF9wcmltZXJfbWlzbWF0Y2ggMCBcDQogIC0tcmVhZF9taW5fbGVuZ3RoIDIwIFwNCiAgLS1yZWFkX21heF9sZW5ndGggSW5mIFwNCiAgLS1yZWFkX21heF9lZSAxIFwNCiAgLS1yZWFkX3RydW5jX2xlbmd0aCAxNTAgXA0KICAtLXJlYWRfdHJpbV9sZWZ0IDAgXA0KICAtLXJlYWRfdHJpbV9yaWdodCAwIFwNCiAgLS1hc3ZfbWluX2xlbmd0aCAxOTUgXA0KICAtLWFzdl9tYXhfbGVuZ3RoIDIxNSBcDQogIC0taGlnaF9zZW5zaXRpdml0eSBUUlVFIFwNCiAgLS1jb25jYXRfdW5tZXJnZWQgRkFMU0UgXA0KICAtLWdlbmV0aWNfY29kZSBTR0M0IFwNCiAgLS1jb2RpbmcgVFJVRSBcDQogIC0tcGhtbSByZWZlcmVuY2UvZm9sbWVyX2Z1bGxlbmd0aF9tb2RlbC5yZHMgXA0KICAtLWlkdGF4YV9kYiByZWZlcmVuY2UvaWR0YXhhX2JmdHJpbW1lZC5yZHMgXA0KICAtLXJlZl9mYXN0YSByZWZlcmVuY2UvaW5zZWN0YV9oaWVyYXJjaGlhbF9iZnRyaW1tZWQuZmEuZ3ogXA0KICAtLWlkdGF4YV9jb25maWRlbmNlIDYwIFwNCiAgLS1ydW5fYmxhc3QgVFJVRSBcDQogIC0tYmxhc3RfbWluX2lkZW50aXR5IDk3IFwNCiAgLS1ibGFzdF9taW5fY292ZXJhZ2UgOTAgXA0KICAtLXRhcmdldF9raW5nZG9tIE1ldGF6b2EgXA0KICAtLXRhcmdldF9waHlsdW0gQXJ0aHJvcG9kYSBcDQogIC0tdGFyZ2V0X2NsYXNzIE5BIFwNCiAgLS10YXJnZXRfb3JkZXIgTkEgXA0KICAtLXRhcmdldF9mYW1pbHkgTkEgXA0KICAtLXRhcmdldF9nZW51cyBOQSBcDQogIC0tdGFyZ2V0X3NwZWNpZXMgTkEgXA0KICAtLW1pbl9zYW1wbGVfcmVhZHMgMTAwMCBcDQogIC0tbWluX3RheGFfcmVhZHMgTkEgXA0KICAtLW1pbl90YXhhX3JhIDFlLTQgXA0KICAtLXN0YXJ0X2ZyZXNoIEZBTFNFDQoNCmBgYA0KDQojIFBhcmFtZXRlciBkZXNjcmlwdGlvbnMNCg0KKiAqKlByaW1lciBwYXJhbWV0ZXJzOioqDQogICAgKyAqKnBjcl9wcmltZXJzKiogLSBOYW1lIG9mIFBDUiBwcmltZXJzIA0KICAgICsgKipmb3JfcHJpbWVyX3NlcSoqIC0gRm9yd2FyZCBwcmltZXIgc2VxdWVuY2UNCiAgICArICoqcmV2X3ByaW1lcl9zZXEqKiAtIFJldmVyc2UgcHJpbWVyIHNlcXVlbmNlDQogICAgKyAqKnRhcmdldF9nZW5lKiogLSBOYW1lIG9mIHRhcmdldCBnZW5lDQogICAgKyAqKm1heF9wcmltZXJfbWlzbWF0Y2gqKiAtIEhvdyBtdWNoIG1pc21hdGNoIHRvIGFsbG93IHdoZW4gZGV0ZWN0aW5nIHByaW1lciBzZXF1ZW5jZXMNCg0KKiAqKlJlYWQgZmlsdGVyaW5nOioqDQogICAgKyAqKnJlYWRfbWluX2xlbmd0aCoqIC0gTWluaW11bSBsZW5ndGggb2YgcHJpbWVyIHRyaW1tZWQgcmVhZHMNCiAgICArICoqcmVhZF9tYXhfbGVuZ3RoKiogLSBNYXhpbXVtIGxlbmd0aCBvZiBwcmltZXIgdHJpbW1lZCByZWFkcw0KICAgICsgKipyZWFkX21heF9lZSoqIC0gTWF4aW11bSBleHBlY3RlZCBlcnJvcnMgb2YgcHJpbWVyIHRyaW1tZWQgcmVhZHMNCiAgICArICoqcmVhZF90cnVuY19sZW5ndGgqKiAtIExlbmd0aCB0byBjdXQgYWxsIGxvbmdlciByZWFkcyB0bw0KICAgICsgKipyZWFkX3RyaW1fbGVmdCoqIC0gUmVtb3ZlIHRoaXMgbWFueSBicCBmcm9tIGxlZnQgc2lkZSBvZiBwcmltZXIgdHJpbW1lZCByZWFkcw0KICAgICsgKipyZWFkX3RyaW1fcmlnaHQqKiAtIFJlbW92ZSB0aGlzIG1hbnkgYnAgZnJvbSByaWdodCBzaWRlIG9mIHByaW1lciB0cmltbWVkIHJlYWRzDQoNCiogKipBU1YgZmlsdGVyaW5nKioNCiAgICArICoqYXN2X21pbl9sZW5ndGgqKiAtIE1pbmltdW0gbGVuZ3RoIG9mIGFtcGxpY29uDQogICAgKyAqKmFzdl9tYXhfbGVuZ3RoKiogLSBNYXhpbXVtIGxlbmd0aCBvZiBhbXBsaWNvbg0KICAgICsgKipoaWdoX3NlbnNpdGl2aXR5KiogLSBPcHRpb24gdG8gdHVybiBvbiBbcHNldWRvIHBvb2xpbmddKGh0dHBzOi8vYmVuampuZWIuZ2l0aHViLmlvL2RhZGEyL3BzZXVkby5odG1sKSwgc2V0dGluZyB0aGlzIHRvIEZBTFNFIGdyZWF0bHkgc3BlZWRzIHVwIEFTViBpbmZlcmVuY2UgYXQgdGhlIGV4cGVuc2Ugb2YgZGV0ZWN0aW5nIGZld2VyIHJhcmUgKDw1IHJlYWRzKSB0YXhhLg0KICAgICsgKipjb25jYXRfdW5tZXJnZWQqKiAtIFJldGFpbiBhbnkgdW5tZXJnZWQgcmVhZCBwYWlycyBieSBjb25jYXRlbmF0aW5nIHRoZW0gdG9nZXRoZXIgc2VwYXJhdGVkIGJ5IGEgc3RyaW5nIG9mIDEwIE4gYmFzZXMNCiAgICArICoqZ2VuZXRpY19jb2RlKiogLSBHZW5ldGljIGNvZGUgZm9yIGFtcGxpY29uIC0gc2VlIEJpb3N0cmluZ3M6OkdFTkVUSUNfQ09ERV9UQUJMRQ0KICAgICsgKipjb2RpbmcqKiAtIElzIHRoZSBhbXBsaWNvbiBmcm9tIGEgcHJvdGVpbiBjb2RpbmcgZ2VuZQ0KICAgICsgKipwaG1tKiogLSBQYXRoIHRvIHByb2ZpbGUgaGlkZGVuIG1hcmtvdiBtb2RlbCAoT3B0aW9uYWwpDQoNCiogKipUYXhvbm9taWMgYXNzaWdubWVudDoqKg0KICAgICsgKippZHRheGFfZGIqKiAtIFBhdGggdG8gdHJhaW5lZCBJRFRBWEEgbW9kZWwNCiAgICArICoqcmVmX2Zhc3RhKiogLSBQYXRoIHRvIGZhc3RhIGZpbGUgb2YgcmVmZXJlbmNlIGRhdGFiYXNlDQogICAgKyAqKmlkdGF4YV9jb25maWRlbmNlKiogLSBNaW5pbXVtIGJvb3RzdHJhcCBjb25maWRlbmNlIGZvciBJRFRBWEENCiAgICArICoqcnVuX2JsYXN0KiogLSBXaGV0aGVyIGEgYmxhc3QgdG9wIGhpdCBzZWFyY2ggc2hvdWxkIGJlIGNvbmR1Y3RlZCBpbiBhZGRpdGlvbiB0byBJRFRBWEENCiAgICArICoqYmxhc3RfbWluX2lkZW50aXR5KiogLSBNaW5pbXVtIG51Y2xlb3RpZGUgaWRlbnRpdHkgZm9yIEJMQVNUDQogICAgKyAqKmJsYXN0X21pbl9jb3ZlcmFnZSoqIC0gTWluaW11bSBxdWVyeSBjb3ZlcmFnZSBmb3IgQkxBU1QNCiAgICArICoqdGFyZ2V0X2tpbmdkb20qKiAtIFN1YnNldCB0byB0YXJnZXQga2luZ2RvbQ0KICAgICsgKip0YXJnZXRfcGh5bHVtKiogLSBTdWJzZXQgdG8gdGFyZ2V0IHBoeWx1bQ0KICAgICsgKip0YXJnZXRfY2xhc3MqKiAtIFN1YnNldCB0byB0YXJnZXQgY2xhc3MNCiAgICArICoqdGFyZ2V0X29yZGVyKiogLSBTdWJzZXQgdG8gdGFyZ2V0IG9yZGVyDQogICAgKyAqKnRhcmdldF9mYW1pbHkqKiAtIFN1YnNldCB0byB0YXJnZXQgZmFtaWx5DQogICAgKyAqKnRhcmdldF9nZW51cyoqIC0gU3Vic2V0IHRvIHRhcmdldCBnZW51cw0KICAgICsgKip0YXJnZXRfc3BlY2llcyoqIC0gU3Vic2V0IHRvIHRhcmdldCBzcGVjaWVzDQoNCiogKipTYW1wbGUgJiBUYXhvbiBmaWx0ZXJpbmc6KioNCiAgICArICoqbWluX3NhbXBsZV9yZWFkcyoqIC0gTWluaW11bSByZWFkcyBwZXIgc2FtcGxlIGFmdGVyIGZpbHRlcmluZw0KICAgICsgKiptaW5fdGF4YV9yZWFkcyoqIC0gTWluaW11bSByZWFkcyBwZXIgQVNWIHRvIHJldGFpbg0KICAgICsgKiptaW5fdGF4YV9yYSoqIC0gTWluaW11bSByZWxhdGl2ZSBhYnVuZGFuY2UgcGVyIEFTViB0byByZXRhaW4uIDFlLTQgaXMgMC4wMSUNCiAgICANCiAgICANCiogKipHZW5lcmFsIHBpcGVsaW5lIHBhcmFtZXRlcnMqKg0KICAgICsgKip0aHJlYWRzKiogLSBOdW1iZXIgb2YgQ1BVIHRocmVhZHMgdG8gcnVuIHRoZSBwaXBlbGluZSBhY3Jvc3MgLSAqKk5PVCBVU0VEIEZPUiBCQVNDKioNCiAgICArICoqc3RhcnRfZnJlc2gqKiAtIFdoZXRoZXIgdG8gcmVtb3ZlIGFsbCBpbnRlcm1lZGlhdGUgZmlsZXMgYW5kIHN0YXJ0IHRoZSBwaXBlbGluZSBmcmVzaA0K