3/28/20
- Download metaT file
Example with xml link:
curl 'https://genome.jgi.doe.gov/portal/ext-api/downloads/get_tape_file?blocking=true&url=/IncBWC4MmetaG/download/_JAMO/59a93bde7ded5e41edd8f2b0/11860.3.224398.ATTGAGC-GGCTCAA.fastq.gz' -b cookies > Inc_BW-C-4-M_metag.fastq.qz
- run FastQC *found out adapter is Illumina universal adapter
- run trimmomatic with the following command on a screen on genobacter
java -jar /usr/share/java/trimmomatic-0.39.jar SE -threads 4 MetaT/Native-BW-C-4-M_metat.fastq.gz MetaT/trimmed/Native-BW-C-4-M_metat.trim.fastq.gz ILLUMINACLIP:TruSeq2-SE.fa:2:40:15 SLIDINGWINDOW:4:20
note: unsure if unpaired, but only 1 file
used TruSeq2-SE for time being
followed steps from workshop
- BWA
potentially useful: https://github.com/McMahonLab/geodes/blob/c4e056ff1e34d29c8fbd9e2a72b1701faf82a8c8/bioinformatics_workflow/lab_notebooks/labnotebook_02mapping.Rmd another scripting option: https://pyjip.readthedocs.io/en/latest/examples/bwa.html
First, index genomes (can be fa or fasta file)
bwa index
RUN IN THE FOLLOWING IN FOLDER WITH INDEXED GENOMES
bwa mem -t 10 3300020651.fa.6.fa MetaT/trimmed/Native-BW-C-4-M_metat.trim.fastq.gz > Results/sam/Native-BW-C-4-M_metat_330002065.aligned.sam
Here’s what the same output should look like:
I can’t seem to figure out how to specify differenct cutoffs-it seems that many people edit the sam output using grep to get the quality scores they want.
4/6/20
Scripting the process for Native-BW-C-4-M_metat alignment to all genomes:
*this doesn't work, use below*
for file in `dir -d *fa` ; do
echo "working with file $file"
bwa index $file
sam=../Results/sam/Native-BW-C-4-M_metat_$file.aligned.sam
bam=../Results/bam/Native-BW-C-4-M_metat_$file.aligned.bam
sorted_bam=../Results/sorted_bam/Native-BW-C-4-M_metat_$file.aligned.sorted.bam
bwa mem -t 20 $file ../MetaT/trimmed/Native-BW-C-4-M_metat.trim.fastq.gz > $sam
samtools view -S -b $sam > $bam
samtools sort -o $sorted_bam $bam
samtools index $sorted_bam
done
Ran the script, mostly worked except none of the bam files were sorted and therefore couldn’t be indexed.
Error message:
[E::hts_open] fail to open file '../Results/sorted_bam/Native-BW-C-4-M_metat_3300020916.fa.5.fa.aligned.sorted.bam'
[bam_sort_core] fail to open file ../Results/sorted_bam/Native-BW-C-4-M_metat_3300020916.fa.5.fa.aligned.sorted.bam
[E::hts_open] fail to open file '../Results/sorted_bam/Native-BW-C-4-M_metat_3300020916.fa.5.fa.aligned.sorted.bam'
I also got an error with one of the genomes, but this was the only one:
working with file 3300020916.fa.5.fa
[M::bwa_idx_load_from_disk] read 0 ALT contigs
[M::process] read 1405888 sequences (200000023 bp)...
[E::bns_fetch_seq] begin=7100674, mid=7100745, end=6522026, len=578648, seq=0x7fd56fb09010, rid=466, far_beg=6519512, far_end=6522026
bwa: bntseq.c:450: bns_fetch_seq: Assertion `seq && *end - *beg == len' failed.
Aborted (core dumped)
4/7/20: Today I’d like to 1) figure out what caused this genome to fail 2) fix what’s wrong with the sorted bam script
Moving forward, I want to * write a script to download the remaining MetaT files OR use SRA toolkit
Looking online, it seems to be an indexing error. I reran the index and ran bwa mem again, and it seems to be working. Make sure to convert to bam.
Turns out the code from DataCarpentry was for a different version of samtools I think - the syntax was wrong. Now samtools should run as samtools sort -o INPUT OUTPUT. Unsure why this works but it did.
NEW SCRIPT, should work:
for file in `dir -d *fa` ; do
echo "working with file $file"
bwa index $file
sam=../Results/sam/Inc_BW-C-4-M_metag_$file.aligned.sam
sorted_bam=../Results/sorted_bam/Inc_BW-C-4-M_metag_$file.aligned.sorted.bam
bwa mem -t 40 $file ../MetaG/trimmed/Inc_BW-C-4-M_metag.trim.fastq.qz > $sam
echo "now converting sam to sorted bam $file"
samtools sort -O bam -T tmp -@ 40 $sam > $sorted_bam
echo "now indexing sorted bam $file"
samtools index $sorted_bam
done
For now, sort all bams.
In bam directory:
for file in `dir -d *bam` ; do
sorted_bam=`echo "$file" | sed 's/.bam/.sorted.bam/'`;
echo "working with $file"
samtools sort -O bam -T tmp $file > ../sorted_bam/$sorted_bam;
done
Then index in sorted_bam directory:
for file in `dir -d *bam` ; do
echo "working with $file"
samtools index $file
done
4/13/20 Indexing worked, so we’re through that part of the workflow.
Still don’t know what the max mapq score is (37 vs 42), but have figured out that for BWA the calculation is -10 log(Pr) (https://sequencing.qcfail.com/articles/mapq-values-are-really-useful-but-their-implementation-is-a-mess/). Therfore, a score of 20 has a 1% probability of being mismatched.
There’s a program called BAMQC which plots the quality scores, which may be useful so I can see what kind of scores I’m getting. It’s not on genobacter or MGHPCC so I could download if I really need it.
Looking at the sam files I got so far, there seem to be few matches, so a lot of mapq scores of 0. I also figured out what the most common flags were:
flag 4: unmapped flag 0: fwd strand flag 16: reverse strand
I found a list of samtools commands which are useful: https://gist.github.com/davfre/8596159
Most useful: Number of reads:
samtools view -c file.bam
Stats:
samtools flagstat filename.bam
Example output: 137136530 + 0 in total (QC-passed reads + QC-failed reads) 0 + 0 secondary 1898 + 0 supplementary 0 + 0 duplicates 603518 + 0 mapped (0.44%:-nan%) 0 + 0 paired in sequencing 0 + 0 read1 0 + 0 read2 0 + 0 properly paired (-nan%:-nan%) 0 + 0 with itself and mate mapped 0 + 0 singletons (-nan%:-nan%) 0 + 0 with mate mapped to a different chr 0 + 0 with mate mapped to a different chr (mapQ>=5)
Supplementary means chimeric/non-linear alignment
Output only mapped reads:
samtools view -F 0x04 -b in.bam > out.aligned.bam
Minimum alignment quality (in this example, mapq>=30 so probability .1%?)
samtools view -q 30 -b in.bam > aligned_reads.q30.bam
samtools view -q 30 -c in.bam #to count alignments with score >30
Different mapq levels to try: 99.9% or mapq of 30 99% or mapq of 20 97% or mapq of 15 95% or mapq of 13
4/16/20:
All genomes and reads summary:
parallel --tag samtools view -c ::: *.bam > reads.csv
Tomorrow: do the whole pipeline with the metaG file
can i adjust samtool threads?
4/18/20: Adjust sam tools threads with @
Ran out of space, trying to convert all sams to sorted bams (deleting all bams to secure space)
for file in `dir -d *sam` ; do
echo "working with file $file"
sorted_bam=../sorted_bam/$file.sorted.bam
samtools sort -O bam -T tmp -@ 40 $file > $sorted_bam
echo "now indexing sorted bam $sorted_bam"
samtools index $sorted_bam
done
4/28/20
For some reason the bams are empty. I think I’m just going to rerun everything:
for file in `dir -d *fa` ; do
echo "working with file $file"
sorted_bam=../Results/sorted_bam/Native-BW-C-4-M_metat/Native-BW-C-4-M_metat_$file.sorted.bam
bwa mem -t 60 $file ../MetaT/trimmed/Native-BW-C-4-M_metat.trim.fastq.gz | samtools sort -O bam -T tmp -@ 60 > $sorted_bam
echo "now indexing sorted bam $file"
samtools index $sorted_bam
done
Get 3 quality files for all bams:
CHECK BEFORE USING
for file in `dir -d *.sorted.bam` ; do
echo "working with file $file"
q30=`echo "$file" | sed 's/.sorted.bam/.q30.sorted.bam/'`
q20=`echo "$file" | sed 's/.sorted.bam/.q20.sorted.bam/'`
q15=`echo "$file" | sed 's/.sorted.bam/.q15.sorted.bam/'`
samtools view -q 30 -b $file > $q30
samtools view -q 20 -b $file > $q20
samtools view -q 15 -b $file > $q15
done
Get all reads Repeat for all other files?
5/3/20 Downloaded all files, now trim them all:
for file in `dir -d *.fastq.gz` ; do
echo "working with file $file"
trim=`echo "$file" | sed 's/.fastq.gz/.trim.fastq.gz/'`
java -jar /usr/share/java/trimmomatic-0.39.jar SE -threads 40 $file ./Trim/$trim ILLUMINACLIP:../TruSeq2-SE.fa:2:40:15 SLIDINGWINDOW:4:20
done
Then map and sort
for genome in `dir -d *fa` ; do
for meta in ../MetaT/*.trim.fastq.gz ; do
echo "working with genome $genome and metat $meta"
file=`echo "$meta" | sed 's/.fastq.gz//' | sed 's/..\/MetaT\///'`
echo "$file"
sorted_bam=../../../BHD1/Arianna/Results/$file.$genome.sorted.bam
echo "$sorted_bam"
bwa mem -t 60 $genome $meta | samtools sort -O bam -T tmp -@ 60 > $sorted_bam
echo "now indexing sorted bam $sorted_bam"
samtools index $sorted_bam
done
done
LS0tCnRpdGxlOiAiUmVhZCBNYXBwaW5nIFRyaWFscyIKb3V0cHV0OiBodG1sX25vdGVib29rCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCi0tLQozLzI4LzIwCgoxKSBEb3dubG9hZCBtZXRhVCBmaWxlCgpFeGFtcGxlIHdpdGggeG1sIGxpbms6CmBgYApjdXJsICdodHRwczovL2dlbm9tZS5qZ2kuZG9lLmdvdi9wb3J0YWwvZXh0LWFwaS9kb3dubG9hZHMvZ2V0X3RhcGVfZmlsZT9ibG9ja2luZz10cnVlJnVybD0vSW5jQldDNE1tZXRhRy9kb3dubG9hZC9fSkFNTy81OWE5M2JkZTdkZWQ1ZTQxZWRkOGYyYjAvMTE4NjAuMy4yMjQzOTguQVRUR0FHQy1HR0NUQ0FBLmZhc3RxLmd6JyAtYiBjb29raWVzID4gSW5jX0JXLUMtNC1NX21ldGFnLmZhc3RxLnF6CmBgYAoyKSBydW4gRmFzdFFDCipmb3VuZCBvdXQgYWRhcHRlciBpcyBJbGx1bWluYSB1bml2ZXJzYWwgYWRhcHRlcgozKSBydW4gdHJpbW1vbWF0aWMgd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmQgb24gYSBzY3JlZW4gb24gZ2Vub2JhY3RlcgoKYGBgCmphdmEgLWphciAvdXNyL3NoYXJlL2phdmEvdHJpbW1vbWF0aWMtMC4zOS5qYXIgU0UgLXRocmVhZHMgNCBNZXRhVC9OYXRpdmUtQlctQy00LU1fbWV0YXQuZmFzdHEuZ3ogTWV0YVQvdHJpbW1lZC9OYXRpdmUtQlctQy00LU1fbWV0YXQudHJpbS5mYXN0cS5neiBJTExVTUlOQUNMSVA6VHJ1U2VxMi1TRS5mYToyOjQwOjE1ICBTTElESU5HV0lORE9XOjQ6MjAKYGBgCgpub3RlOiB1bnN1cmUgaWYgdW5wYWlyZWQsIGJ1dCBvbmx5IDEgZmlsZQoKICAgIHVzZWQgVHJ1U2VxMi1TRSBmb3IgdGltZSBiZWluZwogICAgCiAgICBmb2xsb3dlZCBzdGVwcyBmcm9tIHdvcmtzaG9wCgo0KSBCV0EKCnBvdGVudGlhbGx5IHVzZWZ1bDogaHR0cHM6Ly9naXRodWIuY29tL01jTWFob25MYWIvZ2VvZGVzL2Jsb2IvYzRlMDU2ZmYxZTM0ZDI5YzhmYmQ5ZTJhNzJiMTcwMWZhZjgyYThjOC9iaW9pbmZvcm1hdGljc193b3JrZmxvdy9sYWJfbm90ZWJvb2tzL2xhYm5vdGVib29rXzAybWFwcGluZy5SbWQKYW5vdGhlciBzY3JpcHRpbmcgb3B0aW9uOiBodHRwczovL3B5amlwLnJlYWR0aGVkb2NzLmlvL2VuL2xhdGVzdC9leGFtcGxlcy9id2EuaHRtbAoKRmlyc3QsIGluZGV4IGdlbm9tZXMgKGNhbiBiZSBmYSBvciBmYXN0YSBmaWxlKQoKYGBgCmJ3YSBpbmRleApgYGAKClJVTiBJTiBUSEUgRk9MTE9XSU5HIElOIEZPTERFUiBXSVRIIElOREVYRUQgR0VOT01FUwoKYGBgCmJ3YSBtZW0gLXQgMTAgMzMwMDAyMDY1MS5mYS42LmZhIE1ldGFUL3RyaW1tZWQvTmF0aXZlLUJXLUMtNC1NX21ldGF0LnRyaW0uZmFzdHEuZ3ogPiBSZXN1bHRzL3NhbS9OYXRpdmUtQlctQy00LU1fbWV0YXRfMzMwMDAyMDY1LmFsaWduZWQuc2FtCmBgYApIZXJlJ3Mgd2hhdCB0aGUgc2FtZSBvdXRwdXQgc2hvdWxkIGxvb2sgbGlrZToKIVtdKGV4cGxhbmF0aW9uLnBuZykKSSBjYW4ndCBzZWVtIHRvIGZpZ3VyZSBvdXQgaG93IHRvIHNwZWNpZnkgZGlmZmVyZW5jdCBjdXRvZmZzLWl0IHNlZW1zIHRoYXQgbWFueSBwZW9wbGUgZWRpdCB0aGUgc2FtIG91dHB1dCB1c2luZyBncmVwIHRvIGdldCB0aGUgcXVhbGl0eSBzY29yZXMgdGhleSB3YW50LgoKNC82LzIwCgpTY3JpcHRpbmcgdGhlIHByb2Nlc3MgZm9yIE5hdGl2ZS1CVy1DLTQtTV9tZXRhdCBhbGlnbm1lbnQgdG8gYWxsIGdlbm9tZXM6CmBgYAoqdGhpcyBkb2Vzbid0IHdvcmssIHVzZSBiZWxvdyoKZm9yIGZpbGUgaW4gYGRpciAtZCAqZmFgIDsgZG8KICAgIGVjaG8gIndvcmtpbmcgd2l0aCBmaWxlICRmaWxlIiAKICAgIGJ3YSBpbmRleCAkZmlsZQogICAgc2FtPS4uL1Jlc3VsdHMvc2FtL05hdGl2ZS1CVy1DLTQtTV9tZXRhdF8kZmlsZS5hbGlnbmVkLnNhbQogICAgYmFtPS4uL1Jlc3VsdHMvYmFtL05hdGl2ZS1CVy1DLTQtTV9tZXRhdF8kZmlsZS5hbGlnbmVkLmJhbQogICAgc29ydGVkX2JhbT0uLi9SZXN1bHRzL3NvcnRlZF9iYW0vTmF0aXZlLUJXLUMtNC1NX21ldGF0XyRmaWxlLmFsaWduZWQuc29ydGVkLmJhbQogICAgYndhIG1lbSAtdCAyMCAkZmlsZSAuLi9NZXRhVC90cmltbWVkL05hdGl2ZS1CVy1DLTQtTV9tZXRhdC50cmltLmZhc3RxLmd6ID4gJHNhbQogICAgc2FtdG9vbHMgdmlldyAtUyAtYiAkc2FtID4gJGJhbSAKICAgIHNhbXRvb2xzIHNvcnQgLW8gJHNvcnRlZF9iYW0gJGJhbQogICAgc2FtdG9vbHMgaW5kZXggJHNvcnRlZF9iYW0KZG9uZQpgYGAgCgpSYW4gdGhlIHNjcmlwdCwgbW9zdGx5IHdvcmtlZCBleGNlcHQgbm9uZSBvZiB0aGUgYmFtIGZpbGVzIHdlcmUgc29ydGVkIGFuZCB0aGVyZWZvcmUgY291bGRuJ3QgYmUgaW5kZXhlZC4KCkVycm9yIG1lc3NhZ2U6CmBgYApbRTo6aHRzX29wZW5dIGZhaWwgdG8gb3BlbiBmaWxlICcuLi9SZXN1bHRzL3NvcnRlZF9iYW0vTmF0aXZlLUJXLUMtNC1NX21ldGF0XzMzMDAwMjA5MTYuZmEuNS5mYS5hbGlnbmVkLnNvcnRlZC5iYW0nCltiYW1fc29ydF9jb3JlXSBmYWlsIHRvIG9wZW4gZmlsZSAuLi9SZXN1bHRzL3NvcnRlZF9iYW0vTmF0aXZlLUJXLUMtNC1NX21ldGF0XzMzMDAwMjA5MTYuZmEuNS5mYS5hbGlnbmVkLnNvcnRlZC5iYW0KW0U6Omh0c19vcGVuXSBmYWlsIHRvIG9wZW4gZmlsZSAnLi4vUmVzdWx0cy9zb3J0ZWRfYmFtL05hdGl2ZS1CVy1DLTQtTV9tZXRhdF8zMzAwMDIwOTE2LmZhLjUuZmEuYWxpZ25lZC5zb3J0ZWQuYmFtJwpgYGAKCkkgYWxzbyBnb3QgYW4gZXJyb3Igd2l0aCBvbmUgb2YgdGhlIGdlbm9tZXMsIGJ1dCB0aGlzIHdhcyB0aGUgb25seSBvbmU6CgpgYGAKd29ya2luZyB3aXRoIGZpbGUgMzMwMDAyMDkxNi5mYS41LmZhCltNOjpid2FfaWR4X2xvYWRfZnJvbV9kaXNrXSByZWFkIDAgQUxUIGNvbnRpZ3MKW006OnByb2Nlc3NdIHJlYWQgMTQwNTg4OCBzZXF1ZW5jZXMgKDIwMDAwMDAyMyBicCkuLi4KW0U6OmJuc19mZXRjaF9zZXFdIGJlZ2luPTcxMDA2NzQsIG1pZD03MTAwNzQ1LCBlbmQ9NjUyMjAyNiwgbGVuPTU3ODY0OCwgc2VxPTB4N2ZkNTZmYjA5MDEwLCByaWQ9NDY2LCBmYXJfYmVnPTY1MTk1MTIsIGZhcl9lbmQ9NjUyMjAyNgpid2E6IGJudHNlcS5jOjQ1MDogYm5zX2ZldGNoX3NlcTogQXNzZXJ0aW9uIGBzZXEgJiYgKmVuZCAtICpiZWcgPT0gbGVuJyBmYWlsZWQuCkFib3J0ZWQgKGNvcmUgZHVtcGVkKQpgYGAgCgo0LzcvMjA6ClRvZGF5IEknZCBsaWtlIHRvCjEpIGZpZ3VyZSBvdXQgd2hhdCBjYXVzZWQgdGhpcyBnZW5vbWUgdG8gZmFpbAoyKSBmaXggd2hhdCdzIHdyb25nIHdpdGggdGhlIHNvcnRlZCBiYW0gc2NyaXB0CgpNb3ZpbmcgZm9yd2FyZCwgSSB3YW50IHRvCiogd3JpdGUgYSBzY3JpcHQgdG8gZG93bmxvYWQgdGhlIHJlbWFpbmluZyBNZXRhVCBmaWxlcyBPUiB1c2UgU1JBIHRvb2xraXQKCjEpIExvb2tpbmcgb25saW5lLCBpdCBzZWVtcyB0byBiZSBhbiBpbmRleGluZyBlcnJvci4gSSByZXJhbiB0aGUgaW5kZXggYW5kIHJhbiBid2EgbWVtIGFnYWluLCBhbmQgaXQgc2VlbXMgdG8gYmUgd29ya2luZy4gTWFrZSBzdXJlIHRvIGNvbnZlcnQgdG8gYmFtLgoKMikgVHVybnMgb3V0IHRoZSBjb2RlIGZyb20gRGF0YUNhcnBlbnRyeSB3YXMgZm9yIGEgZGlmZmVyZW50IHZlcnNpb24gb2Ygc2FtdG9vbHMgSSB0aGluayAtIHRoZSBzeW50YXggd2FzIHdyb25nLiBOb3cgc2FtdG9vbHMgc2hvdWxkIHJ1biBhcyBzYW10b29scyBzb3J0IC1vIElOUFVUIE9VVFBVVC4gVW5zdXJlIHdoeSB0aGlzIHdvcmtzIGJ1dCBpdCBkaWQuCgpORVcgU0NSSVBULCBzaG91bGQgd29yazoKYGBgCmZvciBmaWxlIGluIGBkaXIgLWQgKmZhYCA7IGRvCiAgICBlY2hvICJ3b3JraW5nIHdpdGggZmlsZSAkZmlsZSIgCiAgICBid2EgaW5kZXggJGZpbGUKICAgIHNhbT0uLi9SZXN1bHRzL3NhbS9JbmNfQlctQy00LU1fbWV0YWdfJGZpbGUuYWxpZ25lZC5zYW0KICAgIHNvcnRlZF9iYW09Li4vUmVzdWx0cy9zb3J0ZWRfYmFtL0luY19CVy1DLTQtTV9tZXRhZ18kZmlsZS5hbGlnbmVkLnNvcnRlZC5iYW0KICAgIGJ3YSBtZW0gLXQgNDAgJGZpbGUgLi4vTWV0YUcvdHJpbW1lZC9JbmNfQlctQy00LU1fbWV0YWcudHJpbS5mYXN0cS5xeiA+ICRzYW0KICAgIGVjaG8gIm5vdyBjb252ZXJ0aW5nIHNhbSB0byBzb3J0ZWQgYmFtICRmaWxlIgogICAgc2FtdG9vbHMgc29ydCAtTyBiYW0gLVQgdG1wIC1AIDQwICRzYW0gPiAkc29ydGVkX2JhbSAKICAgIGVjaG8gIm5vdyBpbmRleGluZyBzb3J0ZWQgYmFtICRmaWxlIgogICAgc2FtdG9vbHMgaW5kZXggJHNvcnRlZF9iYW0KZG9uZQpgYGAgCgpGb3Igbm93LCBzb3J0IGFsbCBiYW1zLgoKSW4gYmFtIGRpcmVjdG9yeToKYGBgCmZvciBmaWxlIGluIGBkaXIgLWQgKmJhbWAgOyBkbwogICAgc29ydGVkX2JhbT1gZWNobyAiJGZpbGUiIHwgc2VkICdzLy5iYW0vLnNvcnRlZC5iYW0vJ2A7ICAgCiAgICBlY2hvICJ3b3JraW5nIHdpdGggJGZpbGUiCiAgICBzYW10b29scyBzb3J0IC1PIGJhbSAtVCB0bXAgJGZpbGUgPiAuLi9zb3J0ZWRfYmFtLyRzb3J0ZWRfYmFtOyAgICAgCmRvbmUKYGBgClRoZW4gaW5kZXggaW4gc29ydGVkX2JhbSBkaXJlY3Rvcnk6CmBgYApmb3IgZmlsZSBpbiBgZGlyIC1kICpiYW1gIDsgZG8KICAgIGVjaG8gIndvcmtpbmcgd2l0aCAkZmlsZSIKICAgIHNhbXRvb2xzIGluZGV4ICRmaWxlICAgICAKZG9uZQpgYGAKNC8xMy8yMApJbmRleGluZyB3b3JrZWQsIHNvIHdlJ3JlIHRocm91Z2ggdGhhdCBwYXJ0IG9mIHRoZSB3b3JrZmxvdy4KClN0aWxsIGRvbid0IGtub3cgd2hhdCB0aGUgbWF4IG1hcHEgc2NvcmUgaXMgKDM3IHZzIDQyKSwgYnV0IGhhdmUgZmlndXJlZCBvdXQgdGhhdCBmb3IgQldBIHRoZSBjYWxjdWxhdGlvbiBpcyAtMTAgbG9nKFByKSAoaHR0cHM6Ly9zZXF1ZW5jaW5nLnFjZmFpbC5jb20vYXJ0aWNsZXMvbWFwcS12YWx1ZXMtYXJlLXJlYWxseS11c2VmdWwtYnV0LXRoZWlyLWltcGxlbWVudGF0aW9uLWlzLWEtbWVzcy8pLgpUaGVyZm9yZSwgYSBzY29yZSBvZiAyMCBoYXMgYSAxJSBwcm9iYWJpbGl0eSBvZiBiZWluZyBtaXNtYXRjaGVkLgoKVGhlcmUncyBhIHByb2dyYW0gY2FsbGVkIEJBTVFDIHdoaWNoIHBsb3RzIHRoZSBxdWFsaXR5IHNjb3Jlcywgd2hpY2ggbWF5IGJlIHVzZWZ1bCBzbyBJIGNhbiBzZWUgd2hhdCBraW5kIG9mIHNjb3JlcyBJJ20gZ2V0dGluZy4gSXQncyBub3Qgb24gZ2Vub2JhY3RlciBvciBNR0hQQ0Mgc28gSSBjb3VsZCBkb3dubG9hZCBpZiBJIHJlYWxseSBuZWVkIGl0LgoKTG9va2luZyBhdCB0aGUgc2FtIGZpbGVzIEkgZ290IHNvIGZhciwgdGhlcmUgc2VlbSB0byBiZSBmZXcgbWF0Y2hlcywgc28gYSBsb3Qgb2YgbWFwcSBzY29yZXMgb2YgMC4KSSBhbHNvIGZpZ3VyZWQgb3V0IHdoYXQgdGhlIG1vc3QgY29tbW9uIGZsYWdzIHdlcmU6CgpmbGFnIDQ6IHVubWFwcGVkCmZsYWcgMDogZndkIHN0cmFuZApmbGFnIDE2OiByZXZlcnNlIHN0cmFuZAoKSSBmb3VuZCBhIGxpc3Qgb2Ygc2FtdG9vbHMgY29tbWFuZHMgd2hpY2ggYXJlIHVzZWZ1bDoKaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vZGF2ZnJlLzg1OTYxNTkKCk1vc3QgdXNlZnVsOgpOdW1iZXIgb2YgcmVhZHM6CmBgYApzYW10b29scyB2aWV3IC1jIGZpbGUuYmFtCmBgYAoKU3RhdHM6CmBgYApzYW10b29scyBmbGFnc3RhdCBmaWxlbmFtZS5iYW0KYGBgCkV4YW1wbGUgb3V0cHV0OgoxMzcxMzY1MzAgKyAwIGluIHRvdGFsIChRQy1wYXNzZWQgcmVhZHMgKyBRQy1mYWlsZWQgcmVhZHMpCjAgKyAwIHNlY29uZGFyeQoxODk4ICsgMCBzdXBwbGVtZW50YXJ5CjAgKyAwIGR1cGxpY2F0ZXMKNjAzNTE4ICsgMCBtYXBwZWQgKDAuNDQlOi1uYW4lKQowICsgMCBwYWlyZWQgaW4gc2VxdWVuY2luZwowICsgMCByZWFkMQowICsgMCByZWFkMgowICsgMCBwcm9wZXJseSBwYWlyZWQgKC1uYW4lOi1uYW4lKQowICsgMCB3aXRoIGl0c2VsZiBhbmQgbWF0ZSBtYXBwZWQKMCArIDAgc2luZ2xldG9ucyAoLW5hbiU6LW5hbiUpCjAgKyAwIHdpdGggbWF0ZSBtYXBwZWQgdG8gYSBkaWZmZXJlbnQgY2hyCjAgKyAwIHdpdGggbWF0ZSBtYXBwZWQgdG8gYSBkaWZmZXJlbnQgY2hyIChtYXBRPj01KQoKU3VwcGxlbWVudGFyeSBtZWFucyBjaGltZXJpYy9ub24tbGluZWFyIGFsaWdubWVudAoKT3V0cHV0IG9ubHkgbWFwcGVkIHJlYWRzOgpgYGAKc2FtdG9vbHMgdmlldyAtRiAweDA0IC1iIGluLmJhbSA+IG91dC5hbGlnbmVkLmJhbQpgYGAKCk1pbmltdW0gYWxpZ25tZW50IHF1YWxpdHkgKGluIHRoaXMgZXhhbXBsZSwgbWFwcT49MzAgc28gcHJvYmFiaWxpdHkgLjElPykKYGBgCnNhbXRvb2xzIHZpZXcgLXEgMzAgLWIgaW4uYmFtID4gYWxpZ25lZF9yZWFkcy5xMzAuYmFtCnNhbXRvb2xzIHZpZXcgLXEgMzAgLWMgaW4uYmFtICN0byBjb3VudCBhbGlnbm1lbnRzIHdpdGggc2NvcmUgPjMwCmBgYAoKRGlmZmVyZW50IG1hcHEgbGV2ZWxzIHRvIHRyeToKOTkuOSUgb3IgbWFwcSBvZiAzMAo5OSUgb3IgbWFwcSBvZiAyMAo5NyUgb3IgbWFwcSBvZiAxNQo5NSUgb3IgbWFwcSBvZiAxMwoKNC8xNi8yMDoKCkFsbCBnZW5vbWVzIGFuZCByZWFkcyBzdW1tYXJ5OgoKYGBgCnBhcmFsbGVsIC0tdGFnIHNhbXRvb2xzIHZpZXcgLWMgIDo6OiAqLmJhbSA+IHJlYWRzLmNzdgpgYGAKClRvbW9ycm93OgpkbyB0aGUgd2hvbGUgcGlwZWxpbmUgd2l0aCB0aGUgbWV0YUcgZmlsZQoKY2FuIGkgYWRqdXN0IHNhbXRvb2wgdGhyZWFkcz8KCjQvMTgvMjA6CkFkanVzdCBzYW0gdG9vbHMgdGhyZWFkcyB3aXRoIEAKClJhbiBvdXQgb2Ygc3BhY2UsIHRyeWluZyB0byBjb252ZXJ0IGFsbCBzYW1zIHRvIHNvcnRlZCBiYW1zIChkZWxldGluZyBhbGwgYmFtcyB0byBzZWN1cmUgc3BhY2UpCmBgYApmb3IgZmlsZSBpbiBgZGlyIC1kICpzYW1gIDsgZG8KICAgIGVjaG8gIndvcmtpbmcgd2l0aCBmaWxlICRmaWxlIiAKICAgIHNvcnRlZF9iYW09Li4vc29ydGVkX2JhbS8kZmlsZS5zb3J0ZWQuYmFtCiAgICBzYW10b29scyBzb3J0IC1PIGJhbSAtVCB0bXAgLUAgNDAgJGZpbGUgPiAkc29ydGVkX2JhbSAKICAgIGVjaG8gIm5vdyBpbmRleGluZyBzb3J0ZWQgYmFtICRzb3J0ZWRfYmFtIgogICAgc2FtdG9vbHMgaW5kZXggJHNvcnRlZF9iYW0KZG9uZQpgYGAKCjQvMjgvMjAKCkZvciBzb21lIHJlYXNvbiB0aGUgYmFtcyBhcmUgZW1wdHkuIEkgdGhpbmsgSSdtIGp1c3QgZ29pbmcgdG8gcmVydW4gZXZlcnl0aGluZzoKYGBgCmZvciBmaWxlIGluIGBkaXIgLWQgKmZhYCA7IGRvCiAgICBlY2hvICJ3b3JraW5nIHdpdGggZmlsZSAkZmlsZSIgCiAgICBzb3J0ZWRfYmFtPS4uL1Jlc3VsdHMvc29ydGVkX2JhbS9OYXRpdmUtQlctQy00LU1fbWV0YXQvTmF0aXZlLUJXLUMtNC1NX21ldGF0XyRmaWxlLnNvcnRlZC5iYW0KICAgIGJ3YSBtZW0gLXQgNjAgJGZpbGUgLi4vTWV0YVQvdHJpbW1lZC9OYXRpdmUtQlctQy00LU1fbWV0YXQudHJpbS5mYXN0cS5neiB8IHNhbXRvb2xzIHNvcnQgLU8gYmFtIC1UIHRtcCAtQCA2MCA+ICRzb3J0ZWRfYmFtCiAgICBlY2hvICJub3cgaW5kZXhpbmcgc29ydGVkIGJhbSAkZmlsZSIKICAgIHNhbXRvb2xzIGluZGV4ICRzb3J0ZWRfYmFtCmRvbmUKYGBgCgpHZXQgMyBxdWFsaXR5IGZpbGVzIGZvciBhbGwgYmFtczoKCmBgYApDSEVDSyBCRUZPUkUgVVNJTkcKZm9yIGZpbGUgaW4gYGRpciAtZCAqLnNvcnRlZC5iYW1gIDsgZG8KICBlY2hvICJ3b3JraW5nIHdpdGggZmlsZSAkZmlsZSIKICBxMzA9YGVjaG8gIiRmaWxlIiB8IHNlZCAncy8uc29ydGVkLmJhbS8ucTMwLnNvcnRlZC5iYW0vJ2AKICBxMjA9YGVjaG8gIiRmaWxlIiB8IHNlZCAncy8uc29ydGVkLmJhbS8ucTIwLnNvcnRlZC5iYW0vJ2AKICBxMTU9YGVjaG8gIiRmaWxlIiB8IHNlZCAncy8uc29ydGVkLmJhbS8ucTE1LnNvcnRlZC5iYW0vJ2AKICBzYW10b29scyB2aWV3IC1xIDMwIC1iICRmaWxlID4gJHEzMAogIHNhbXRvb2xzIHZpZXcgLXEgMjAgLWIgJGZpbGUgPiAkcTIwCiAgc2FtdG9vbHMgdmlldyAtcSAxNSAtYiAkZmlsZSA+ICRxMTUKZG9uZQpgYGAKCkdldCBhbGwgcmVhZHMKUmVwZWF0IGZvciBhbGwgb3RoZXIgZmlsZXM/Cgo1LzMvMjAKRG93bmxvYWRlZCBhbGwgZmlsZXMsIG5vdyB0cmltIHRoZW0gYWxsOgoKYGBgCmZvciBmaWxlIGluIGBkaXIgLWQgKi5mYXN0cS5nemAgOyBkbwogIGVjaG8gIndvcmtpbmcgd2l0aCBmaWxlICRmaWxlIgogIHRyaW09YGVjaG8gIiRmaWxlIiB8IHNlZCAncy8uZmFzdHEuZ3ovLnRyaW0uZmFzdHEuZ3ovJ2AKamF2YSAtamFyIC91c3Ivc2hhcmUvamF2YS90cmltbW9tYXRpYy0wLjM5LmphciBTRSAtdGhyZWFkcyA0MCAkZmlsZSAuL1RyaW0vJHRyaW0gSUxMVU1JTkFDTElQOi4uL1RydVNlcTItU0UuZmE6Mjo0MDoxNSAgU0xJRElOR1dJTkRPVzo0OjIwCmRvbmUKYGBgCgpUaGVuIG1hcCBhbmQgc29ydAoKYGBgCmZvciBnZW5vbWUgaW4gYGRpciAtZCAqZmFgIDsgZG8KICBmb3IgbWV0YSBpbiAuLi9NZXRhVC8qLnRyaW0uZmFzdHEuZ3ogOyBkbwogICAgZWNobyAid29ya2luZyB3aXRoIGdlbm9tZSAkZ2Vub21lIGFuZCBtZXRhdCAkbWV0YSIgCiAgICBmaWxlPWBlY2hvICIkbWV0YSIgfCBzZWQgJ3MvLmZhc3RxLmd6Ly8nIHwgc2VkICdzLy4uXC9NZXRhVFwvLy8nYAogICAgZWNobyAiJGZpbGUiCiAgICBzb3J0ZWRfYmFtPS4uLy4uLy4uL0JIRDEvQXJpYW5uYS9SZXN1bHRzLyRmaWxlLiRnZW5vbWUuc29ydGVkLmJhbQogICAgZWNobyAiJHNvcnRlZF9iYW0iCiAgICBid2EgbWVtIC10IDYwICRnZW5vbWUgJG1ldGEgfCBzYW10b29scyBzb3J0IC1PIGJhbSAtVCB0bXAgLUAgNjAgPiAkc29ydGVkX2JhbQogICAgZWNobyAibm93IGluZGV4aW5nIHNvcnRlZCBiYW0gJHNvcnRlZF9iYW0iCiAgICBzYW10b29scyBpbmRleCAkc29ydGVkX2JhbQogIGRvbmUKZG9uZQpgYGAKCgo=