1. Data, Reference and Resources

Machine

AWS r5-2xlarge (64 GB RAM)

Reference

Mapping RNA-seq Reads with STAR. Curr Protoc Bioinformatics. 2015; 51: 11.14.1-11.14.19.

Downloading pre-built genome indices and check some file contents

$wget http://labshare.cshl.edu/shares/gingeraslab/www-data/dobin/STAR/STARgenomes/ENSEMBL/homo_sapiens/ENSEMBL.homo_sapiens.release-83/

ENSEMBL.homo_sapiens.release-83$ ls -l

-rw-rw-r– 1 ubuntu ubuntu 3208460789 Mar 7 2017 Genome

-rw-rw-r– 1 ubuntu ubuntu 1402373249 Mar 6 2017 Homo_sapiens.GRCh38.83.gtf

-rw-rw-r– 1 ubuntu ubuntu 3151425857 Mar 6 2017 Homo_sapiens.GRCh38.dna.primary_assembly.fa

-rw-rw-r– 1 ubuntu ubuntu 36852 Mar 7 2017 Log.out

-rw-rw-r– 1 ubuntu ubuntu 24878479456 Mar 7 2017 SA

-rw-rw-r– 1 ubuntu ubuntu 1565873619 Mar 7 2017 SAindex

-rw-rw-r– 1 ubuntu ubuntu 1200 Mar 7 2017 chrLength.txt

-rw-rw-r– 1 ubuntu ubuntu 1923 Mar 7 2017 chrName.txt

-rw-rw-r– 1 ubuntu ubuntu 3123 Mar 7 2017 chrNameLength.txt

-rw-rw-r– 1 ubuntu ubuntu 2129 Mar 7 2017 chrStart.txt

-rw-rw-r– 1 ubuntu ubuntu 41683445 Mar 7 2017 exonGeTrInfo.tab

-rw-rw-r– 1 ubuntu ubuntu 16888430 Mar 7 2017 exonInfo.tab

-rw-rw-r– 1 ubuntu ubuntu 970806 Mar 7 2017 geneInfo.tab

-rw-rw-r– 1 ubuntu ubuntu 644 Mar 7 2017 genomeParameters.txt

-rw-rw-r– 1 ubuntu ubuntu 763 Mar 7 2017 log

-rw-rw-r– 1 ubuntu ubuntu 10176231 Mar 7 2017 sjdbInfo.txt

-rw-rw-r– 1 ubuntu ubuntu 7974201 Mar 7 2017 sjdbList.fromGTF.out.tab

-rw-rw-r– 1 ubuntu ubuntu 7972476 Mar 7 2017 sjdbList.out.tab

-rw-rw-r– 1 ubuntu ubuntu 11757123 Mar 7 2017 transcriptInfo.tab

$ cat Homo_sapiens.GRCh38.dna.primary_assembly.fa | grep ">" | head -n 30
>1 dna:chromosome chromosome:GRCh38:1:1:248956422:1 REF
>10 dna:chromosome chromosome:GRCh38:10:1:133797422:1 REF
>11 dna:chromosome chromosome:GRCh38:11:1:135086622:1 REF
>12 dna:chromosome chromosome:GRCh38:12:1:133275309:1 REF
>13 dna:chromosome chromosome:GRCh38:13:1:114364328:1 REF
>14 dna:chromosome chromosome:GRCh38:14:1:107043718:1 REF
>15 dna:chromosome chromosome:GRCh38:15:1:101991189:1 REF
>16 dna:chromosome chromosome:GRCh38:16:1:90338345:1 REF
>17 dna:chromosome chromosome:GRCh38:17:1:83257441:1 REF
>18 dna:chromosome chromosome:GRCh38:18:1:80373285:1 REF
>19 dna:chromosome chromosome:GRCh38:19:1:58617616:1 REF
>2 dna:chromosome chromosome:GRCh38:2:1:242193529:1 REF
>20 dna:chromosome chromosome:GRCh38:20:1:64444167:1 REF
>21 dna:chromosome chromosome:GRCh38:21:1:46709983:1 REF
>22 dna:chromosome chromosome:GRCh38:22:1:50818468:1 REF
>3 dna:chromosome chromosome:GRCh38:3:1:198295559:1 REF
>4 dna:chromosome chromosome:GRCh38:4:1:190214555:1 REF
>5 dna:chromosome chromosome:GRCh38:5:1:181538259:1 REF
>6 dna:chromosome chromosome:GRCh38:6:1:170805979:1 REF
>7 dna:chromosome chromosome:GRCh38:7:1:159345973:1 REF
>8 dna:chromosome chromosome:GRCh38:8:1:145138636:1 REF
>9 dna:chromosome chromosome:GRCh38:9:1:138394717:1 REF
>MT dna:chromosome chromosome:GRCh38:MT:1:16569:1 REF
>X dna:chromosome chromosome:GRCh38:X:1:156040895:1 REF
>Y dna:chromosome chromosome:GRCh38:Y:2781480:56887902:1 REF
>KI270728.1 dna:scaffold scaffold:GRCh38:KI270728.1:1:1872759:1 REF
>KI270727.1 dna:scaffold scaffold:GRCh38:KI270727.1:1:448248:1 REF
>KI270442.1 dna:scaffold scaffold:GRCh38:KI270442.1:1:392061:1 REF
>KI270729.1 dna:scaffold scaffold:GRCh38:KI270729.1:1:280839:1 REF
>GL000225.1 dna:scaffold scaffold:GRCh38:GL000225.1:1:211173:1 REF
$ head -n 6 Homo_sapiens.GRCh38.83.gtf 
#!genome-build GRCh38.p5
#!genome-version GRCh38
#!genome-date 2013-12
#!genome-build-accession NCBI:GCA_000001405.20
#!genebuild-last-updated 2015-10

1   havana  gene    11869   14409   .   +   .   gene_id "ENSG00000223972"; gene_version "5"; gene_name "DDX11L1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; havana_gene "OTTHUMG00000000961"; havana_gene_version "2";
ENSEMBL.homo_sapiens.release-83$ head genomeParameters.txt 
### /sonas-hs/gingeras/nlsas_norepl/user/dobin/STAR/Releases/FromGitHub/STAR-2.5.2b/bin/Linux_x86_64/STAR   --runMode genomeGenerate   --runThreadN 12   --genomeDir ./   --genomeFastaFiles Homo_sapiens.GRCh38.dna.primary_assembly.fa      --sjdbGTFfile Homo_sapiens.GRCh38.83.gtf

versionGenome   20201

genomeFastaFiles    Homo_sapiens.GRCh38.dna.primary_assembly.fa 

genomeSAindexNbases 14

genomeChrBinNbits   18

genomeSAsparseD 1

sjdbOverhang    100

sjdbFileChrStartEnd
- 
sjdbGTFfile Homo_sapiens.GRCh38.83.gtf

sjdbGTFchrPrefix

Download data for analysis and check some of its contents

~/cpb_PMID_26334920$ wget https://www.encodeproject.org/files/ENCFF001RFG/@@download/ENCFF001RFG.fastq.gz

ENCFF001RFG.fastq.gz 100%[==================================================================>] 7.96G

~/cpb_PMID_26334920$ wget https://www.encodeproject.org/files/ENCFF001RFH/@@download/ENCFF001RFH.fastq.gz

ENCFF001RFH.fastq.gz 100%[====================================================================>] 7.81G

~/cpb_PMID_26334920$ wc -l ENCFF001RFG.fastq.gz 

32937626 ENCFF001RFG.fastq.gz

~/cpb_PMID_26334920$ wc -l ENCFF001RFH.fastq.gz 

32147739 ENCFF001RFH.fastq.gz

CurrProtBio-PMID-26334920$ ls -l

-rw-rw-r– 1 ubuntu ubuntu 8543476007 Feb 9 01:31 ENCFF001RFG.fastq.gz

-rw-rw-r– 1 ubuntu ubuntu 8385864242 Feb 9 01:32 ENCFF001RFH.fastq.gz

2. Alignment using STAR to obtain a SAM file for further manipulation and downstream analysis

 ~/cpb_PMID_26334920/basic$ STAR --runThreadN 12 --genomeDir ../ENSEMBL.homo_sapiens.release-83/ --sjdbGTFfile ../ENSEMBL.homo_sapiens.release-83/Homo_sapiens.GRCh38.83.gtf --sjdbOverhang 100 --readFilesIn ../ENCFF001RFH.fastq.gz ../ENCFF001RFG.fastq.gz --readFilesCommand zcat
 

Apr 09 16:12:40 ….. started STAR run

Apr 09 16:12:40 ….. loading genome

Apr 09 16:14:17 ….. processing annotations GTF

Apr 09 16:14:29 ….. inserting junctions into the genome indices

Apr 09 16:15:52 ….. started mapping

Apr 09 16:44:15 ….. finished successfully

~/cpb_PMID_26334920$ ls -l basic/

-rw-rw-r– 1 ubuntu ubuntu 75865701604 Apr 9 16:44 Aligned.out.sam

-rw-rw-r– 1 ubuntu ubuntu 1870 Apr 9 16:44 Log.final.out

-rw-rw-r– 1 ubuntu ubuntu 26046 Apr 9 16:44 Log.out

-rw-rw-r– 1 ubuntu ubuntu 3432 Apr 9 16:44 Log.progress.out

-rw-rw-r– 1 ubuntu ubuntu 8888522 Apr 9 16:44 SJ.out.tab

drwx—— 2 ubuntu ubuntu 4096 Apr 9 16:14 _STARgenome

~/cpb_PMID_26334920/basic$ cat Log.final.out

                                 Started job on |   Apr 09 16:12:40
                             Started mapping on |   Apr 09 16:15:52
                                    Finished on |   Apr 09 16:44:15
       Mapping speed, Million of reads per hour |   222.15

                          Number of input reads |   105089150
                      Average input read length |   202
                                    UNIQUE READS:
                   Uniquely mapped reads number |   96824749
                        Uniquely mapped reads % |   92.14%
                          Average mapped length |   200.92
                       Number of splices: Total |   41730816
            Number of splices: Annotated (sjdb) |   41099145
                       Number of splices: GT/AG |   41211200
                       Number of splices: GC/AG |   342564
                       Number of splices: AT/AC |   42231
               Number of splices: Non-canonical |   134821
                      Mismatch rate per base, % |   0.29%
                         Deletion rate per base |   0.02%
                        Deletion average length |   1.57
                        Insertion rate per base |   0.01%
                       Insertion average length |   1.48
                             MULTI-MAPPING READS:
        Number of reads mapped to multiple loci |   6263113
             % of reads mapped to multiple loci |   5.96%
        Number of reads mapped to too many loci |   62633
             % of reads mapped to too many loci |   0.06%
                                  UNMAPPED READS:
       % of reads unmapped: too many mismatches |   0.00%
                 % of reads unmapped: too short |   1.82%
                     % of reads unmapped: other |   0.02%
                                  CHIMERIC READS:
                       Number of chimeric reads |   0
                            % of chimeric reads |   0.00%

Analysis and and further processing of the SAM file

~/cpb_PMID_26334920$ samtools view -Su basic/Aligned.out.sam |head

##IVN:1.4

@SQ SN:1 LN:248956422

@SQ SN:10 LN:133797422

@SQ SN:11 LN:135086622

@SQ SN:12 LN:133275309

@SQ SN:13 LN:114364328

@SQ SN:14 LN:107043718

@SQ SN:15 LN:101991189

@SQ SN:16 LN:90338345

@SQ SN:17 LN:83257441

~/cpb_PMID_26334920$ samtools view -Su basic/Aligned.out.sam | samtools sort -o basic/Aligned.out.bam

[bam_sort_core] merging from 98 files…

basic$ ls -l

-rw-rw-r– 1 ubuntu ubuntu 15276811925 Apr 9 19:18 Aligned.out.bam

Analysis and further processing of the BAM file

basic$ samtools flagstat Aligned.out.bam

239994382 + 0 in total (QC-passed reads + QC-failed reads)

33818658 + 0 secondary

0 + 0 supplementary

0 + 0 duplicates

239994382 + 0 mapped (100.00% : N/A)

206175724 + 0 paired in sequencing

103087862 + 0 read1

103087862 + 0 read2

206175724 + 0 properly paired (100.00% : N/A)

206175724 + 0 with itself and mate mapped

0 + 0 singletons (0.00% : N/A)

0 + 0 with mate mapped to a different chr

0 + 0 with mate mapped to a different chr (mapQ>=5)
~/cpb_PMID_26334920/BasicBamToCufflinks$ cufflinks -p 12 --library-type fr-firststrand ../basic/Aligned.out.bam 

Warning: Could not connect to update server to verify current version. Please check at the Cufflinks website (http://cufflinks.cbcb.umd.edu).

[02:57:40] Inspecting reads and determining fragment length distribution.

> Processing Locus 14:49247828-49247929 [ ] 2%

4. Alignment using STAR (to obtain a SAM and BAM file) for transcriptome analysis using RSEM

~/cpb_PMID_26334920/rnaseq$ STAR --runThreadN 12 --genomeDir ../ENSEMBL.homo_sapiens.release-83/ --sjdbGTFfile ../ENSEMBL.homo_sapiens.release-83/Homo_sapiens.GRCh38.83.gtf --sjdbOverhang 100 --readFilesIn ../ENCFF001RFG.fastq.gz ../ENCFF001RFH.fastq.gz --readFilesCommand zcat --quantMode TranscriptomeSAM --outFileNamePrefix 1align/

Apr 09 22:39:15 ….. started STAR run

Apr 09 22:39:15 ….. loading genome

Apr 09 22:41:07 ….. processing annotations GTF

Apr 09 22:41:24 ….. inserting junctions into the genome indices

Apr 09 22:42:43 ….. started mapping

Apr 09 23:13:35 ….. finished successfully

~/cpb_PMID_26334920/rnaseq$ ls -l 1align/

-rw-rw-r– 1 ubuntu ubuntu 75864947151 Apr 9 23:13 Aligned.out.sam

-rw-rw-r– 1 ubuntu ubuntu 19449197988 Apr 9 23:13 Aligned.toTranscriptome.out.bam

-rw-rw-r– 1 ubuntu ubuntu 1870 Apr 9 23:13 Log.final.out

-rw-rw-r– 1 ubuntu ubuntu 26491 Apr 9 23:13 Log.out

-rw-rw-r– 1 ubuntu ubuntu 3786 Apr 9 23:13 Log.progress.out

-rw-rw-r– 1 ubuntu ubuntu 8887960 Apr 9 23:13 SJ.out.tab

drwx—— 2 ubuntu ubuntu 4096 Apr 9 22:41 _STARgenome

~/cpb_PMID_26334920/rnaseq/1align$ ls -sh1

total 89G

 71G Aligned.out.sam
 
 19G Aligned.toTranscriptome.out.bam
 
4.0K Log.final.out

 28K Log.out
 
4.0K Log.progress.out

8.5M SJ.out.tab

4.0K _STARgenome

rnaseq$ ls -l 1align/

-rw-rw-r– 1 ubuntu ubuntu 75864947151 Apr 9 23:13 Aligned.out.sam

-rw-rw-r– 1 ubuntu ubuntu 19449197988 Apr 9 23:13 Aligned.toTranscriptome.out.bam

-rw-rw-r– 1 ubuntu ubuntu 1870 Apr 9 23:13 Log.final.out

-rw-rw-r– 1 ubuntu ubuntu 26491 Apr 9 23:13 Log.out

-rw-rw-r– 1 ubuntu ubuntu 3786 Apr 9 23:13 Log.progress.out

-rw-rw-r– 1 ubuntu ubuntu 8887960 Apr 9 23:13 SJ.out.tab

drwx—— 2 ubuntu ubuntu 4096 Apr 9 22:41 _STARgenome

1align$ cat Log.final.out

                                 Started job on |   Apr 09 22:39:15
                             Started mapping on |   Apr 09 22:42:43
                                    Finished on |   Apr 09 23:13:35
       Mapping speed, Million of reads per hour |   204.28

                          Number of input reads |   105089150
                      Average input read length |   202
                                    UNIQUE READS:
                   Uniquely mapped reads number |   96824009
                        Uniquely mapped reads % |   92.14%
                          Average mapped length |   200.92
                       Number of splices: Total |   41731310
            Number of splices: Annotated (sjdb) |   41099477
                       Number of splices: GT/AG |   41211630
                       Number of splices: GC/AG |   342569
                       Number of splices: AT/AC |   42225
               Number of splices: Non-canonical |   134886
                      Mismatch rate per base, % |   0.29%
                         Deletion rate per base |   0.02%
                        Deletion average length |   1.57
                        Insertion rate per base |   0.01%
                       Insertion average length |   1.48
                             MULTI-MAPPING READS:
        Number of reads mapped to multiple loci |   6262912
             % of reads mapped to multiple loci |   5.96%
        Number of reads mapped to too many loci |   62642
             % of reads mapped to too many loci |   0.06%
                                  UNMAPPED READS:
       % of reads unmapped: too many mismatches |   0.00%
                 % of reads unmapped: too short |   1.83%
                     % of reads unmapped: other |   0.02%
                                  CHIMERIC READS:
                       Number of chimeric reads |   0
                            % of chimeric reads |   0.00%

1align$ samtools flagstat Aligned.toTranscriptome.out.bam

399348542 + 0 in total (QC-passed reads + QC-failed reads)
260569470 + 0 secondary
0 + 0 supplementary
0 + 0 duplicates
399348542 + 0 mapped (100.00% : N/A)
138779072 + 0 paired in sequencing
69389536 + 0 read1
69389536 + 0 read2
138779072 + 0 properly paired (100.00% : N/A)
138779072 + 0 with itself and mate mapped
0 + 0 singletons (0.00% : N/A)
0 + 0 with mate mapped to a different chr
0 + 0 with mate mapped to a different chr (mapQ>=5)
LS0tDQp0aXRsZTogIk1hcHBpbmcgYW5kIGFuYWx5emluZyBSTkEtc2VxIHJlYWRzIHdpdGggU1RBUiBhbmQgb3RoZXIgdG9vbHMiDQphdXRob3I6ICJCaGFnaXJhdGhpIERhc2giDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIyAxLiBEYXRhLCBSZWZlcmVuY2UgYW5kIFJlc291cmNlcyANCg0KIyMjIE1hY2hpbmUNCg0KQVdTIHI1LTJ4bGFyZ2UgKDY0IEdCIFJBTSkNCg0KIyMjIFJlZmVyZW5jZQ0KDQoqKk1hcHBpbmcgUk5BLXNlcSBSZWFkcyB3aXRoIFNUQVIuIEN1cnIgUHJvdG9jIEJpb2luZm9ybWF0aWNzLiAyMDE1OyA1MTogMTEuMTQuMS0xMS4xNC4xOS4qKg0KDQoNCg0KIyMjIERvd25sb2FkaW5nIHByZS1idWlsdCBnZW5vbWUgaW5kaWNlcyBhbmQgY2hlY2sgc29tZSBmaWxlIGNvbnRlbnRzDQoNCg0KYGBgDQokd2dldCBodHRwOi8vbGFic2hhcmUuY3NobC5lZHUvc2hhcmVzL2dpbmdlcmFzbGFiL3d3dy1kYXRhL2RvYmluL1NUQVIvU1RBUmdlbm9tZXMvRU5TRU1CTC9ob21vX3NhcGllbnMvRU5TRU1CTC5ob21vX3NhcGllbnMucmVsZWFzZS04My8NCg0KYGBgDQoNCg0KIyMjIyBFTlNFTUJMLmhvbW9fc2FwaWVucy5yZWxlYXNlLTgzJCBscyAtbA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgMzIwODQ2MDc4OSBNYXIgIDcgIDIwMTcgIEdlbm9tZQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgMTQwMjM3MzI0OSBNYXIgIDYgIDIwMTcgIEhvbW9fc2FwaWVucy5HUkNoMzguODMuZ3RmDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAzMTUxNDI1ODU3IE1hciAgNiAgMjAxNyAgSG9tb19zYXBpZW5zLkdSQ2gzOC5kbmEucHJpbWFyeV9hc3NlbWJseS5mYQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAzNjg1MiBNYXIgIDcgIDIwMTcgIExvZy5vdXQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgMjQ4Nzg0Nzk0NTYgTWFyICA3ICAyMDE3ICBTQQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgMTU2NTg3MzYxOSBNYXIgIDcgIDIwMTcgIFNBaW5kZXgNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgIDEyMDAgTWFyICA3ICAyMDE3ICBjaHJMZW5ndGgudHh0DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgICAxOTIzIE1hciAgNyAgMjAxNyAgY2hyTmFtZS50eHQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgIDMxMjMgTWFyICA3ICAyMDE3ICBjaHJOYW1lTGVuZ3RoLnR4dA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAgMjEyOSBNYXIgIDcgIDIwMTcgIGNoclN0YXJ0LnR4dA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICA0MTY4MzQ0NSBNYXIgIDcgIDIwMTcgIGV4b25HZVRySW5mby50YWINCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgMTY4ODg0MzAgTWFyICA3ICAyMDE3ICBleG9uSW5mby50YWINCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICA5NzA4MDYgTWFyICA3ICAyMDE3ICBnZW5lSW5mby50YWINCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgICA2NDQgTWFyICA3ICAyMDE3ICBnZW5vbWVQYXJhbWV0ZXJzLnR4dA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAgIDc2MyBNYXIgIDcgIDIwMTcgIGxvZw0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAxMDE3NjIzMSBNYXIgIDcgIDIwMTcgIHNqZGJJbmZvLnR4dA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgNzk3NDIwMSBNYXIgIDcgIDIwMTcgIHNqZGJMaXN0LmZyb21HVEYub3V0LnRhYg0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgNzk3MjQ3NiBNYXIgIDcgIDIwMTcgIHNqZGJMaXN0Lm91dC50YWINCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgMTE3NTcxMjMgTWFyICA3ICAyMDE3ICB0cmFuc2NyaXB0SW5mby50YWINCg0KDQoNCmBgYA0KJCBjYXQgSG9tb19zYXBpZW5zLkdSQ2gzOC5kbmEucHJpbWFyeV9hc3NlbWJseS5mYSB8IGdyZXAgIj4iIHwgaGVhZCAtbiAzMA0KDQpgYGANCg0KYGBgDQo+MSBkbmE6Y2hyb21vc29tZSBjaHJvbW9zb21lOkdSQ2gzODoxOjE6MjQ4OTU2NDIyOjEgUkVGDQo+MTAgZG5hOmNocm9tb3NvbWUgY2hyb21vc29tZTpHUkNoMzg6MTA6MToxMzM3OTc0MjI6MSBSRUYNCj4xMSBkbmE6Y2hyb21vc29tZSBjaHJvbW9zb21lOkdSQ2gzODoxMToxOjEzNTA4NjYyMjoxIFJFRg0KPjEyIGRuYTpjaHJvbW9zb21lIGNocm9tb3NvbWU6R1JDaDM4OjEyOjE6MTMzMjc1MzA5OjEgUkVGDQo+MTMgZG5hOmNocm9tb3NvbWUgY2hyb21vc29tZTpHUkNoMzg6MTM6MToxMTQzNjQzMjg6MSBSRUYNCj4xNCBkbmE6Y2hyb21vc29tZSBjaHJvbW9zb21lOkdSQ2gzODoxNDoxOjEwNzA0MzcxODoxIFJFRg0KPjE1IGRuYTpjaHJvbW9zb21lIGNocm9tb3NvbWU6R1JDaDM4OjE1OjE6MTAxOTkxMTg5OjEgUkVGDQo+MTYgZG5hOmNocm9tb3NvbWUgY2hyb21vc29tZTpHUkNoMzg6MTY6MTo5MDMzODM0NToxIFJFRg0KPjE3IGRuYTpjaHJvbW9zb21lIGNocm9tb3NvbWU6R1JDaDM4OjE3OjE6ODMyNTc0NDE6MSBSRUYNCj4xOCBkbmE6Y2hyb21vc29tZSBjaHJvbW9zb21lOkdSQ2gzODoxODoxOjgwMzczMjg1OjEgUkVGDQo+MTkgZG5hOmNocm9tb3NvbWUgY2hyb21vc29tZTpHUkNoMzg6MTk6MTo1ODYxNzYxNjoxIFJFRg0KPjIgZG5hOmNocm9tb3NvbWUgY2hyb21vc29tZTpHUkNoMzg6MjoxOjI0MjE5MzUyOToxIFJFRg0KPjIwIGRuYTpjaHJvbW9zb21lIGNocm9tb3NvbWU6R1JDaDM4OjIwOjE6NjQ0NDQxNjc6MSBSRUYNCj4yMSBkbmE6Y2hyb21vc29tZSBjaHJvbW9zb21lOkdSQ2gzODoyMToxOjQ2NzA5OTgzOjEgUkVGDQo+MjIgZG5hOmNocm9tb3NvbWUgY2hyb21vc29tZTpHUkNoMzg6MjI6MTo1MDgxODQ2ODoxIFJFRg0KPjMgZG5hOmNocm9tb3NvbWUgY2hyb21vc29tZTpHUkNoMzg6MzoxOjE5ODI5NTU1OToxIFJFRg0KPjQgZG5hOmNocm9tb3NvbWUgY2hyb21vc29tZTpHUkNoMzg6NDoxOjE5MDIxNDU1NToxIFJFRg0KPjUgZG5hOmNocm9tb3NvbWUgY2hyb21vc29tZTpHUkNoMzg6NToxOjE4MTUzODI1OToxIFJFRg0KPjYgZG5hOmNocm9tb3NvbWUgY2hyb21vc29tZTpHUkNoMzg6NjoxOjE3MDgwNTk3OToxIFJFRg0KPjcgZG5hOmNocm9tb3NvbWUgY2hyb21vc29tZTpHUkNoMzg6NzoxOjE1OTM0NTk3MzoxIFJFRg0KPjggZG5hOmNocm9tb3NvbWUgY2hyb21vc29tZTpHUkNoMzg6ODoxOjE0NTEzODYzNjoxIFJFRg0KPjkgZG5hOmNocm9tb3NvbWUgY2hyb21vc29tZTpHUkNoMzg6OToxOjEzODM5NDcxNzoxIFJFRg0KPk1UIGRuYTpjaHJvbW9zb21lIGNocm9tb3NvbWU6R1JDaDM4Ok1UOjE6MTY1Njk6MSBSRUYNCj5YIGRuYTpjaHJvbW9zb21lIGNocm9tb3NvbWU6R1JDaDM4Olg6MToxNTYwNDA4OTU6MSBSRUYNCj5ZIGRuYTpjaHJvbW9zb21lIGNocm9tb3NvbWU6R1JDaDM4Olk6Mjc4MTQ4MDo1Njg4NzkwMjoxIFJFRg0KPktJMjcwNzI4LjEgZG5hOnNjYWZmb2xkIHNjYWZmb2xkOkdSQ2gzODpLSTI3MDcyOC4xOjE6MTg3Mjc1OToxIFJFRg0KPktJMjcwNzI3LjEgZG5hOnNjYWZmb2xkIHNjYWZmb2xkOkdSQ2gzODpLSTI3MDcyNy4xOjE6NDQ4MjQ4OjEgUkVGDQo+S0kyNzA0NDIuMSBkbmE6c2NhZmZvbGQgc2NhZmZvbGQ6R1JDaDM4OktJMjcwNDQyLjE6MTozOTIwNjE6MSBSRUYNCj5LSTI3MDcyOS4xIGRuYTpzY2FmZm9sZCBzY2FmZm9sZDpHUkNoMzg6S0kyNzA3MjkuMToxOjI4MDgzOToxIFJFRg0KPkdMMDAwMjI1LjEgZG5hOnNjYWZmb2xkIHNjYWZmb2xkOkdSQ2gzODpHTDAwMDIyNS4xOjE6MjExMTczOjEgUkVGDQoNCmBgYA0KDQoNCmBgYA0KJCBoZWFkIC1uIDYgSG9tb19zYXBpZW5zLkdSQ2gzOC44My5ndGYgDQpgYGANCg0KDQpgYGANCiMhZ2Vub21lLWJ1aWxkIEdSQ2gzOC5wNQ0KIyFnZW5vbWUtdmVyc2lvbiBHUkNoMzgNCiMhZ2Vub21lLWRhdGUgMjAxMy0xMg0KIyFnZW5vbWUtYnVpbGQtYWNjZXNzaW9uIE5DQkk6R0NBXzAwMDAwMTQwNS4yMA0KIyFnZW5lYnVpbGQtbGFzdC11cGRhdGVkIDIwMTUtMTANCg0KMQloYXZhbmEJZ2VuZQkxMTg2OQkxNDQwOQkuCSsJLglnZW5lX2lkICJFTlNHMDAwMDAyMjM5NzIiOyBnZW5lX3ZlcnNpb24gIjUiOyBnZW5lX25hbWUgIkREWDExTDEiOyBnZW5lX3NvdXJjZSAiaGF2YW5hIjsgZ2VuZV9iaW90eXBlICJ0cmFuc2NyaWJlZF91bnByb2Nlc3NlZF9wc2V1ZG9nZW5lIjsgaGF2YW5hX2dlbmUgIk9UVEhVTUcwMDAwMDAwMDk2MSI7IGhhdmFuYV9nZW5lX3ZlcnNpb24gIjIiOw0KDQpgYGANCg0KDQpgYGANCkVOU0VNQkwuaG9tb19zYXBpZW5zLnJlbGVhc2UtODMkIGhlYWQgZ2Vub21lUGFyYW1ldGVycy50eHQgDQoNCmBgYA0KDQpgYGANCiMjIyAvc29uYXMtaHMvZ2luZ2VyYXMvbmxzYXNfbm9yZXBsL3VzZXIvZG9iaW4vU1RBUi9SZWxlYXNlcy9Gcm9tR2l0SHViL1NUQVItMi41LjJiL2Jpbi9MaW51eF94ODZfNjQvU1RBUiAgIC0tcnVuTW9kZSBnZW5vbWVHZW5lcmF0ZSAgIC0tcnVuVGhyZWFkTiAxMiAgIC0tZ2Vub21lRGlyIC4vICAgLS1nZW5vbWVGYXN0YUZpbGVzIEhvbW9fc2FwaWVucy5HUkNoMzguZG5hLnByaW1hcnlfYXNzZW1ibHkuZmEgICAgICAtLXNqZGJHVEZmaWxlIEhvbW9fc2FwaWVucy5HUkNoMzguODMuZ3RmDQoNCnZlcnNpb25HZW5vbWUJMjAyMDENCg0KZ2Vub21lRmFzdGFGaWxlcwlIb21vX3NhcGllbnMuR1JDaDM4LmRuYS5wcmltYXJ5X2Fzc2VtYmx5LmZhIA0KDQpnZW5vbWVTQWluZGV4TmJhc2VzCTE0DQoNCmdlbm9tZUNockJpbk5iaXRzCTE4DQoNCmdlbm9tZVNBc3BhcnNlRAkxDQoNCnNqZGJPdmVyaGFuZwkxMDANCg0Kc2pkYkZpbGVDaHJTdGFydEVuZA0KLSANCnNqZGJHVEZmaWxlCUhvbW9fc2FwaWVucy5HUkNoMzguODMuZ3RmDQoNCnNqZGJHVEZjaHJQcmVmaXgNCg0KYGBgDQoNCg0KIyMjIERvd25sb2FkIGRhdGEgZm9yIGFuYWx5c2lzIGFuZCBjaGVjayBzb21lIG9mIGl0cyBjb250ZW50cw0KDQoNCg0KDQoNCmBgYA0Kfi9jcGJfUE1JRF8yNjMzNDkyMCQgd2dldCBodHRwczovL3d3dy5lbmNvZGVwcm9qZWN0Lm9yZy9maWxlcy9FTkNGRjAwMVJGRy9AQGRvd25sb2FkL0VOQ0ZGMDAxUkZHLmZhc3RxLmd6DQoNCmBgYA0KDQoNCkVOQ0ZGMDAxUkZHLmZhc3RxLmd6ICAxMDAlWz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT5dICAgNy45NkcgIA0KDQoNCg0KYGBgDQp+L2NwYl9QTUlEXzI2MzM0OTIwJCB3Z2V0IGh0dHBzOi8vd3d3LmVuY29kZXByb2plY3Qub3JnL2ZpbGVzL0VOQ0ZGMDAxUkZIL0BAZG93bmxvYWQvRU5DRkYwMDFSRkguZmFzdHEuZ3oNCg0KYGBgDQoNCkVOQ0ZGMDAxUkZILmZhc3RxLmd6ICAxMDAlWz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Pl0gICA3LjgxRyAgDQoNCg0KDQpgYGANCn4vY3BiX1BNSURfMjYzMzQ5MjAkIHdjIC1sIEVOQ0ZGMDAxUkZHLmZhc3RxLmd6IA0KYGBgDQoNCjMyOTM3NjI2IEVOQ0ZGMDAxUkZHLmZhc3RxLmd6DQoNCg0KDQpgYGANCn4vY3BiX1BNSURfMjYzMzQ5MjAkIHdjIC1sIEVOQ0ZGMDAxUkZILmZhc3RxLmd6IA0KDQpgYGANCg0KMzIxNDc3MzkgRU5DRkYwMDFSRkguZmFzdHEuZ3oNCg0KDQoNCiMjIyMgQ3VyclByb3RCaW8tUE1JRC0yNjMzNDkyMCQgbHMgLWwNCg0KDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDg1NDM0NzYwMDcgRmViICA5IDAxOjMxIEVOQ0ZGMDAxUkZHLmZhc3RxLmd6DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDgzODU4NjQyNDIgRmViICA5IDAxOjMyIEVOQ0ZGMDAxUkZILmZhc3RxLmd6DQoNCg0KDQoNCiMjIDIuIEFsaWdubWVudCB1c2luZyBTVEFSIHRvIG9idGFpbiBhIFNBTSBmaWxlIGZvciBmdXJ0aGVyIG1hbmlwdWxhdGlvbiBhbmQgZG93bnN0cmVhbSBhbmFseXNpcw0KDQoNCmBgYA0KIH4vY3BiX1BNSURfMjYzMzQ5MjAvYmFzaWMkIFNUQVIgLS1ydW5UaHJlYWROIDEyIC0tZ2Vub21lRGlyIC4uL0VOU0VNQkwuaG9tb19zYXBpZW5zLnJlbGVhc2UtODMvIC0tc2pkYkdURmZpbGUgLi4vRU5TRU1CTC5ob21vX3NhcGllbnMucmVsZWFzZS04My9Ib21vX3NhcGllbnMuR1JDaDM4LjgzLmd0ZiAtLXNqZGJPdmVyaGFuZyAxMDAgLS1yZWFkRmlsZXNJbiAuLi9FTkNGRjAwMVJGSC5mYXN0cS5neiAuLi9FTkNGRjAwMVJGRy5mYXN0cS5neiAtLXJlYWRGaWxlc0NvbW1hbmQgemNhdA0KIA0KIGBgYA0KDQoNCkFwciAwOSAxNjoxMjo0MCAuLi4uLiBzdGFydGVkIFNUQVIgcnVuDQoNCkFwciAwOSAxNjoxMjo0MCAuLi4uLiBsb2FkaW5nIGdlbm9tZQ0KDQpBcHIgMDkgMTY6MTQ6MTcgLi4uLi4gcHJvY2Vzc2luZyBhbm5vdGF0aW9ucyBHVEYNCg0KQXByIDA5IDE2OjE0OjI5IC4uLi4uIGluc2VydGluZyBqdW5jdGlvbnMgaW50byB0aGUgZ2Vub21lIGluZGljZXMNCg0KQXByIDA5IDE2OjE1OjUyIC4uLi4uIHN0YXJ0ZWQgbWFwcGluZw0KDQpBcHIgMDkgMTY6NDQ6MTUgLi4uLi4gZmluaXNoZWQgc3VjY2Vzc2Z1bGx5DQoNCg0KDQojIyMjIH4vY3BiX1BNSURfMjYzMzQ5MjAkIGxzIC1sIGJhc2ljLw0KDQoNCioqLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgNzU4NjU3MDE2MDQgQXByICA5IDE2OjQ0IEFsaWduZWQub3V0LnNhbSoqDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgICAxODcwIEFwciAgOSAxNjo0NCBMb2cuZmluYWwub3V0DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgIDI2MDQ2IEFwciAgOSAxNjo0NCBMb2cub3V0DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgICAzNDMyIEFwciAgOSAxNjo0NCBMb2cucHJvZ3Jlc3Mub3V0DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICA4ODg4NTIyIEFwciAgOSAxNjo0NCBTSi5vdXQudGFiDQoNCmRyd3gtLS0tLS0gMiB1YnVudHUgdWJ1bnR1ICAgICAgICA0MDk2IEFwciAgOSAxNjoxNCBfU1RBUmdlbm9tZQ0KDQoNCg0KIyMjIyB+L2NwYl9QTUlEXzI2MzM0OTIwL2Jhc2ljJCBjYXQgTG9nLmZpbmFsLm91dCANCg0KDQoNCmBgYA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRlZCBqb2Igb24gfAlBcHIgMDkgMTY6MTI6NDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRlZCBtYXBwaW5nIG9uIHwJQXByIDA5IDE2OjE1OjUyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaW5pc2hlZCBvbiB8CUFwciAwOSAxNjo0NDoxNQ0KICAgICAgIE1hcHBpbmcgc3BlZWQsIE1pbGxpb24gb2YgcmVhZHMgcGVyIGhvdXIgfAkyMjIuMTUNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2YgaW5wdXQgcmVhZHMgfAkxMDUwODkxNTANCiAgICAgICAgICAgICAgICAgICAgICBBdmVyYWdlIGlucHV0IHJlYWQgbGVuZ3RoIHwJMjAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTklRVUUgUkVBRFM6DQogICAgICAgICAgICAgICAgICAgVW5pcXVlbHkgbWFwcGVkIHJlYWRzIG51bWJlciB8CTk2ODI0NzQ5DQogICAgICAgICAgICAgICAgICAgICAgICBVbmlxdWVseSBtYXBwZWQgcmVhZHMgJSB8CTkyLjE0JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICBBdmVyYWdlIG1hcHBlZCBsZW5ndGggfAkyMDAuOTINCiAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIHNwbGljZXM6IFRvdGFsIHwJNDE3MzA4MTYNCiAgICAgICAgICAgIE51bWJlciBvZiBzcGxpY2VzOiBBbm5vdGF0ZWQgKHNqZGIpIHwJNDEwOTkxNDUNCiAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIHNwbGljZXM6IEdUL0FHIHwJNDEyMTEyMDANCiAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIHNwbGljZXM6IEdDL0FHIHwJMzQyNTY0DQogICAgICAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBzcGxpY2VzOiBBVC9BQyB8CTQyMjMxDQogICAgICAgICAgICAgICBOdW1iZXIgb2Ygc3BsaWNlczogTm9uLWNhbm9uaWNhbCB8CTEzNDgyMQ0KICAgICAgICAgICAgICAgICAgICAgIE1pc21hdGNoIHJhdGUgcGVyIGJhc2UsICUgfAkwLjI5JQ0KICAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0aW9uIHJhdGUgcGVyIGJhc2UgfAkwLjAyJQ0KICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRpb24gYXZlcmFnZSBsZW5ndGggfAkxLjU3DQogICAgICAgICAgICAgICAgICAgICAgICBJbnNlcnRpb24gcmF0ZSBwZXIgYmFzZSB8CTAuMDElDQogICAgICAgICAgICAgICAgICAgICAgIEluc2VydGlvbiBhdmVyYWdlIGxlbmd0aCB8CTEuNDgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVVMVEktTUFQUElORyBSRUFEUzoNCiAgICAgICAgTnVtYmVyIG9mIHJlYWRzIG1hcHBlZCB0byBtdWx0aXBsZSBsb2NpIHwJNjI2MzExMw0KICAgICAgICAgICAgICUgb2YgcmVhZHMgbWFwcGVkIHRvIG11bHRpcGxlIGxvY2kgfAk1Ljk2JQ0KICAgICAgICBOdW1iZXIgb2YgcmVhZHMgbWFwcGVkIHRvIHRvbyBtYW55IGxvY2kgfAk2MjYzMw0KICAgICAgICAgICAgICUgb2YgcmVhZHMgbWFwcGVkIHRvIHRvbyBtYW55IGxvY2kgfAkwLjA2JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOTUFQUEVEIFJFQURTOg0KICAgICAgICUgb2YgcmVhZHMgdW5tYXBwZWQ6IHRvbyBtYW55IG1pc21hdGNoZXMgfAkwLjAwJQ0KICAgICAgICAgICAgICAgICAlIG9mIHJlYWRzIHVubWFwcGVkOiB0b28gc2hvcnQgfAkxLjgyJQ0KICAgICAgICAgICAgICAgICAgICAgJSBvZiByZWFkcyB1bm1hcHBlZDogb3RoZXIgfAkwLjAyJQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENISU1FUklDIFJFQURTOg0KICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2YgY2hpbWVyaWMgcmVhZHMgfAkwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJSBvZiBjaGltZXJpYyByZWFkcyB8CTAuMDAlDQpgYGANCg0KIyMjIEFuYWx5c2lzIGFuZCBhbmQgZnVydGhlciBwcm9jZXNzaW5nIG9mIHRoZSBTQU0gZmlsZQ0KDQoNCmBgYA0Kfi9jcGJfUE1JRF8yNjMzNDkyMCQgc2FtdG9vbHMgdmlldyAtU3UgYmFzaWMvQWxpZ25lZC5vdXQuc2FtIHxoZWFkDQoNCmBgYA0KDQoqXHVmZmZkQkNcdWZmZmQjXHVmZmZkI0lcdWZmZmRCQU1ASEQJVk46MS40Kg0KDQoqQFNRCVNOOjEJTE46MjQ4OTU2NDIyKg0KDQoqQFNRCVNOOjEwCUxOOjEzMzc5NzQyMioNCg0KKkBTUQlTTjoxMQlMTjoxMzUwODY2MjIqDQoNCipAU1EJU046MTIJTE46MTMzMjc1MzA5Kg0KDQoqQFNRCVNOOjEzCUxOOjExNDM2NDMyOCoNCg0KKkBTUQlTTjoxNAlMTjoxMDcwNDM3MTgqDQoNCipAU1EJU046MTUJTE46MTAxOTkxMTg5Kg0KDQoqQFNRCVNOOjE2CUxOOjkwMzM4MzQ1Kg0KDQoqQFNRCVNOOjE3CUxOOjgzMjU3NDQxKg0KDQoNCmBgYA0Kfi9jcGJfUE1JRF8yNjMzNDkyMCQgc2FtdG9vbHMgdmlldyAtU3UgYmFzaWMvQWxpZ25lZC5vdXQuc2FtIHwgc2FtdG9vbHMgc29ydCAtbyBiYXNpYy9BbGlnbmVkLm91dC5iYW0NCg0KYGBgDQoNCltiYW1fc29ydF9jb3JlXSBtZXJnaW5nIGZyb20gOTggZmlsZXMuLi4NCg0KDQojIyMjIGJhc2ljJCBscyAtbA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAxNTI3NjgxMTkyNSBBcHIgIDkgMTk6MTggQWxpZ25lZC5vdXQuYmFtDQoNCg0KIyMjIEFuYWx5c2lzIGFuZCBmdXJ0aGVyIHByb2Nlc3Npbmcgb2YgdGhlIEJBTSBmaWxlDQoNCg0KIyMjIyBiYXNpYyQgc2FtdG9vbHMgZmxhZ3N0YXQgQWxpZ25lZC5vdXQuYmFtIA0KDQpgYGANCjIzOTk5NDM4MiArIDAgaW4gdG90YWwgKFFDLXBhc3NlZCByZWFkcyArIFFDLWZhaWxlZCByZWFkcykNCg0KMzM4MTg2NTggKyAwIHNlY29uZGFyeQ0KDQowICsgMCBzdXBwbGVtZW50YXJ5DQoNCjAgKyAwIGR1cGxpY2F0ZXMNCg0KMjM5OTk0MzgyICsgMCBtYXBwZWQgKDEwMC4wMCUgOiBOL0EpDQoNCjIwNjE3NTcyNCArIDAgcGFpcmVkIGluIHNlcXVlbmNpbmcNCg0KMTAzMDg3ODYyICsgMCByZWFkMQ0KDQoxMDMwODc4NjIgKyAwIHJlYWQyDQoNCjIwNjE3NTcyNCArIDAgcHJvcGVybHkgcGFpcmVkICgxMDAuMDAlIDogTi9BKQ0KDQoyMDYxNzU3MjQgKyAwIHdpdGggaXRzZWxmIGFuZCBtYXRlIG1hcHBlZA0KDQowICsgMCBzaW5nbGV0b25zICgwLjAwJSA6IE4vQSkNCg0KMCArIDAgd2l0aCBtYXRlIG1hcHBlZCB0byBhIGRpZmZlcmVudCBjaHINCg0KMCArIDAgd2l0aCBtYXRlIG1hcHBlZCB0byBhIGRpZmZlcmVudCBjaHIgKG1hcFE+PTUpDQoNCmBgYA0KDQoNCg0KDQpgYGANCn4vY3BiX1BNSURfMjYzMzQ5MjAvQmFzaWNCYW1Ub0N1ZmZsaW5rcyQgY3VmZmxpbmtzIC1wIDEyIC0tbGlicmFyeS10eXBlIGZyLWZpcnN0c3RyYW5kIC4uL2Jhc2ljL0FsaWduZWQub3V0LmJhbSANCg0KYGBgDQoNCldhcm5pbmc6IENvdWxkIG5vdCBjb25uZWN0IHRvIHVwZGF0ZSBzZXJ2ZXIgdG8gdmVyaWZ5IGN1cnJlbnQgdmVyc2lvbi4gUGxlYXNlIGNoZWNrIGF0IHRoZSBDdWZmbGlua3Mgd2Vic2l0ZSAoaHR0cDovL2N1ZmZsaW5rcy5jYmNiLnVtZC5lZHUpLg0KDQpbMDI6NTc6NDBdIEluc3BlY3RpbmcgcmVhZHMgYW5kIGRldGVybWluaW5nIGZyYWdtZW50IGxlbmd0aCBkaXN0cmlidXRpb24uDQoNCioqPiBQcm9jZXNzaW5nIExvY3VzIDE0OjQ5MjQ3ODI4LTQ5MjQ3OTI5ICAgICAgICBbICAgICAgICAgICAgICAgICAgICAgICAgIF0gICAyJSAqKg0KDQoNCg0KIyMgMy4gQWxpZ25tZW50IHVzaW5nIFNUQVIgKHRvIGRpcmVjdGx5IG9idGFpbiBhIEJBTSBmaWxlKSBmb3IgZG93bnN0cmVhbSBhbmFseXNpcyAoZS5nLiwgQ3VmZmxpbmtzKQ0KDQoNCmBgYA0Kfi9jcGJfUE1JRF8yNjMzNDkyMC9hbGlnbmVkT3V0QmFtJCBTVEFSIC0tcnVuVGhyZWFkTiAxMiAtLWdlbm9tZURpciAuLi9FTlNFTUJMLmhvbW9fc2FwaWVucy5yZWxlYXNlLTgzLyAtLXNqZGJHVEZmaWxlIC4uL0VOU0VNQkwuaG9tb19zYXBpZW5zLnJlbGVhc2UtODMvSG9tb19zYXBpZW5zLkdSQ2gzOC44My5ndGYgLS1zamRiT3ZlcmhhbmcgMTAwIC0tcmVhZEZpbGVzSW4gLi4vRU5DRkYwMDFSRkcuZmFzdHEuZ3ogLi4vRU5DRkYwMDFSRkguZmFzdHEuZ3ogLS1yZWFkRmlsZXNDb21tYW5kIHpjYXQgLS1vdXRTQU10eXBlIEJBTSBTb3J0ZWRCeUNvb3JkaW5hdGUNCg0KYGBgDQoNCkFwciAxMCAwMzo0NTo1MCAuLi4uLiBzdGFydGVkIFNUQVIgcnVuDQoNCkFwciAxMCAwMzo0NTo1MSAuLi4uLiBsb2FkaW5nIGdlbm9tZQ0KDQpBcHIgMTAgMDM6NDc6NDMgLi4uLi4gcHJvY2Vzc2luZyBhbm5vdGF0aW9ucyBHVEYNCg0KQXByIDEwIDAzOjQ3OjU5IC4uLi4uIGluc2VydGluZyBqdW5jdGlvbnMgaW50byB0aGUgZ2Vub21lIGluZGljZXMNCg0KQXByIDEwIDAzOjQ5OjE5IC4uLi4uIHN0YXJ0ZWQgbWFwcGluZw0KDQpBcHIgMTAgMDQ6MTI6NDcgLi4uLi4gc3RhcnRlZCBzb3J0aW5nIEJBTQ0KDQpBcHIgMTAgMDQ6MjI6MTIgLi4uLi4gZmluaXNoZWQgc3VjY2Vzc2Z1bGx5DQoNCg0KDQojIyMjIGFsaWduZWRPdXRCYW0kIGxzIC1sDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDE3ODE5NTM4NzEzIEFwciAxMCAwNDoyMiBBbGlnbmVkLnNvcnRlZEJ5Q29vcmQub3V0LmJhbQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAgMTg3MCBBcHIgMTAgMDQ6MjIgTG9nLmZpbmFsLm91dA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAyNzE5MSBBcHIgMTAgMDQ6MjIgTG9nLm91dA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAgMzA3OCBBcHIgMTAgMDQ6MjIgTG9nLnByb2dyZXNzLm91dA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgODg4Nzk2MCBBcHIgMTAgMDQ6MjIgU0oub3V0LnRhYg0KDQpkcnd4LS0tLS0tIDIgdWJ1bnR1IHVidW50dSAgICAgICAgNDA5NiBBcHIgMTAgMDM6NDcgX1NUQVJnZW5vbWUNCg0KDQojIyMjIGFsaWduZWRPdXRCYW0kIGNhdCBMb2cuZmluYWwub3V0IA0KDQpgYGANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0ZWQgam9iIG9uIHwJQXByIDEwIDAzOjQ1OjUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0ZWQgbWFwcGluZyBvbiB8CUFwciAxMCAwMzo0OToxOQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmluaXNoZWQgb24gfAlBcHIgMTAgMDQ6MjI6MTINCiAgICAgICBNYXBwaW5nIHNwZWVkLCBNaWxsaW9uIG9mIHJlYWRzIHBlciBob3VyIHwJMTkxLjc1DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIGlucHV0IHJlYWRzIHwJMTA1MDg5MTUwDQogICAgICAgICAgICAgICAgICAgICAgQXZlcmFnZSBpbnB1dCByZWFkIGxlbmd0aCB8CTIwMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5JUVVFIFJFQURTOg0KICAgICAgICAgICAgICAgICAgIFVuaXF1ZWx5IG1hcHBlZCByZWFkcyBudW1iZXIgfAk5NjgyNDAwOQ0KICAgICAgICAgICAgICAgICAgICAgICAgVW5pcXVlbHkgbWFwcGVkIHJlYWRzICUgfAk5Mi4xNCUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgQXZlcmFnZSBtYXBwZWQgbGVuZ3RoIHwJMjAwLjkyDQogICAgICAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBzcGxpY2VzOiBUb3RhbCB8CTQxNzMxMzEwDQogICAgICAgICAgICBOdW1iZXIgb2Ygc3BsaWNlczogQW5ub3RhdGVkIChzamRiKSB8CTQxMDk5NDc3DQogICAgICAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBzcGxpY2VzOiBHVC9BRyB8CTQxMjExNjMwDQogICAgICAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBzcGxpY2VzOiBHQy9BRyB8CTM0MjU2OQ0KICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2Ygc3BsaWNlczogQVQvQUMgfAk0MjIyNQ0KICAgICAgICAgICAgICAgTnVtYmVyIG9mIHNwbGljZXM6IE5vbi1jYW5vbmljYWwgfAkxMzQ4ODYNCiAgICAgICAgICAgICAgICAgICAgICBNaXNtYXRjaCByYXRlIHBlciBiYXNlLCAlIHwJMC4yOSUNCiAgICAgICAgICAgICAgICAgICAgICAgICBEZWxldGlvbiByYXRlIHBlciBiYXNlIHwJMC4wMiUNCiAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0aW9uIGF2ZXJhZ2UgbGVuZ3RoIHwJMS41Nw0KICAgICAgICAgICAgICAgICAgICAgICAgSW5zZXJ0aW9uIHJhdGUgcGVyIGJhc2UgfAkwLjAxJQ0KICAgICAgICAgICAgICAgICAgICAgICBJbnNlcnRpb24gYXZlcmFnZSBsZW5ndGggfAkxLjQ4DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1VTFRJLU1BUFBJTkcgUkVBRFM6DQogICAgICAgIE51bWJlciBvZiByZWFkcyBtYXBwZWQgdG8gbXVsdGlwbGUgbG9jaSB8CTYyNjI5MTINCiAgICAgICAgICAgICAlIG9mIHJlYWRzIG1hcHBlZCB0byBtdWx0aXBsZSBsb2NpIHwJNS45NiUNCiAgICAgICAgTnVtYmVyIG9mIHJlYWRzIG1hcHBlZCB0byB0b28gbWFueSBsb2NpIHwJNjI2NDINCiAgICAgICAgICAgICAlIG9mIHJlYWRzIG1hcHBlZCB0byB0b28gbWFueSBsb2NpIHwJMC4wNiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTk1BUFBFRCBSRUFEUzoNCiAgICAgICAlIG9mIHJlYWRzIHVubWFwcGVkOiB0b28gbWFueSBtaXNtYXRjaGVzIHwJMC4wMCUNCiAgICAgICAgICAgICAgICAgJSBvZiByZWFkcyB1bm1hcHBlZDogdG9vIHNob3J0IHwJMS44MyUNCiAgICAgICAgICAgICAgICAgICAgICUgb2YgcmVhZHMgdW5tYXBwZWQ6IG90aGVyIHwJMC4wMiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSElNRVJJQyBSRUFEUzoNCiAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIGNoaW1lcmljIHJlYWRzIHwJMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgb2YgY2hpbWVyaWMgcmVhZHMgfAkwLjAwJQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KYGBgDQoNCg0KDQojIyMjIGFsaWduZWRPdXRCYW0kIHNhbXRvb2xzIGZsYWdzdGF0IEFsaWduZWQuc29ydGVkQnlDb29yZC5vdXQuYmFtIA0KDQpgYGANCjIzOTk5MTk5MiArIDAgaW4gdG90YWwgKFFDLXBhc3NlZCByZWFkcyArIFFDLWZhaWxlZCByZWFkcykNCjMzODE4MTUwICsgMCBzZWNvbmRhcnkNCjAgKyAwIHN1cHBsZW1lbnRhcnkNCjAgKyAwIGR1cGxpY2F0ZXMNCjIzOTk5MTk5MiArIDAgbWFwcGVkICgxMDAuMDAlIDogTi9BKQ0KMjA2MTczODQyICsgMCBwYWlyZWQgaW4gc2VxdWVuY2luZw0KMTAzMDg2OTIxICsgMCByZWFkMQ0KMTAzMDg2OTIxICsgMCByZWFkMg0KMjA2MTczODQyICsgMCBwcm9wZXJseSBwYWlyZWQgKDEwMC4wMCUgOiBOL0EpDQoyMDYxNzM4NDIgKyAwIHdpdGggaXRzZWxmIGFuZCBtYXRlIG1hcHBlZA0KMCArIDAgc2luZ2xldG9ucyAoMC4wMCUgOiBOL0EpDQowICsgMCB3aXRoIG1hdGUgbWFwcGVkIHRvIGEgZGlmZmVyZW50IGNocg0KMCArIDAgd2l0aCBtYXRlIG1hcHBlZCB0byBhIGRpZmZlcmVudCBjaHIgKG1hcFE+PTUpDQoNCmBgYA0KDQoNCg0KDQojIyA0LiBBbGlnbm1lbnQgdXNpbmcgU1RBUiAodG8gb2J0YWluIGEgU0FNIGFuZCBCQU0gZmlsZSkgZm9yIHRyYW5zY3JpcHRvbWUgYW5hbHlzaXMgdXNpbmcgUlNFTSANCg0KYGBgDQp+L2NwYl9QTUlEXzI2MzM0OTIwL3JuYXNlcSQgU1RBUiAtLXJ1blRocmVhZE4gMTIgLS1nZW5vbWVEaXIgLi4vRU5TRU1CTC5ob21vX3NhcGllbnMucmVsZWFzZS04My8gLS1zamRiR1RGZmlsZSAuLi9FTlNFTUJMLmhvbW9fc2FwaWVucy5yZWxlYXNlLTgzL0hvbW9fc2FwaWVucy5HUkNoMzguODMuZ3RmIC0tc2pkYk92ZXJoYW5nIDEwMCAtLXJlYWRGaWxlc0luIC4uL0VOQ0ZGMDAxUkZHLmZhc3RxLmd6IC4uL0VOQ0ZGMDAxUkZILmZhc3RxLmd6IC0tcmVhZEZpbGVzQ29tbWFuZCB6Y2F0IC0tcXVhbnRNb2RlIFRyYW5zY3JpcHRvbWVTQU0gLS1vdXRGaWxlTmFtZVByZWZpeCAxYWxpZ24vDQoNCmBgYA0KDQpBcHIgMDkgMjI6Mzk6MTUgLi4uLi4gc3RhcnRlZCBTVEFSIHJ1bg0KDQpBcHIgMDkgMjI6Mzk6MTUgLi4uLi4gbG9hZGluZyBnZW5vbWUNCg0KQXByIDA5IDIyOjQxOjA3IC4uLi4uIHByb2Nlc3NpbmcgYW5ub3RhdGlvbnMgR1RGDQoNCkFwciAwOSAyMjo0MToyNCAuLi4uLiBpbnNlcnRpbmcganVuY3Rpb25zIGludG8gdGhlIGdlbm9tZSBpbmRpY2VzDQoNCkFwciAwOSAyMjo0Mjo0MyAuLi4uLiBzdGFydGVkIG1hcHBpbmcNCg0KQXByIDA5IDIzOjEzOjM1IC4uLi4uIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseQ0KDQoNCiMjIyMgfi9jcGJfUE1JRF8yNjMzNDkyMC9ybmFzZXEkIGxzIC1sIDFhbGlnbi8NCg0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSA3NTg2NDk0NzE1MSBBcHIgIDkgMjM6MTMgQWxpZ25lZC5vdXQuc2FtDQoNCioqLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgMTk0NDkxOTc5ODggQXByICA5IDIzOjEzIEFsaWduZWQudG9UcmFuc2NyaXB0b21lLm91dC5iYW0qKg0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAgMTg3MCBBcHIgIDkgMjM6MTMgTG9nLmZpbmFsLm91dA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAyNjQ5MSBBcHIgIDkgMjM6MTMgTG9nLm91dA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAgMzc4NiBBcHIgIDkgMjM6MTMgTG9nLnByb2dyZXNzLm91dA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgODg4Nzk2MCBBcHIgIDkgMjM6MTMgU0oub3V0LnRhYg0KDQpkcnd4LS0tLS0tIDIgdWJ1bnR1IHVidW50dSAgICAgICAgNDA5NiBBcHIgIDkgMjI6NDEgX1NUQVJnZW5vbWUNCg0KDQojIyMjIH4vY3BiX1BNSURfMjYzMzQ5MjAvcm5hc2VxLzFhbGlnbiQgbHMgLXNoMQ0KDQoNCmBgYA0KdG90YWwgODlHDQoNCiA3MUcgQWxpZ25lZC5vdXQuc2FtDQogDQogMTlHIEFsaWduZWQudG9UcmFuc2NyaXB0b21lLm91dC5iYW0NCiANCjQuMEsgTG9nLmZpbmFsLm91dA0KDQogMjhLIExvZy5vdXQNCiANCjQuMEsgTG9nLnByb2dyZXNzLm91dA0KDQo4LjVNIFNKLm91dC50YWINCg0KNC4wSyBfU1RBUmdlbm9tZQ0KDQpgYGANCg0KDQoNCiMjIyMgcm5hc2VxJCBscyAtbCAxYWxpZ24vDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDc1ODY0OTQ3MTUxIEFwciAgOSAyMzoxMyBBbGlnbmVkLm91dC5zYW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgMTk0NDkxOTc5ODggQXByICA5IDIzOjEzIEFsaWduZWQudG9UcmFuc2NyaXB0b21lLm91dC5iYW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgIDE4NzAgQXByICA5IDIzOjEzIExvZy5maW5hbC5vdXQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgMjY0OTEgQXByICA5IDIzOjEzIExvZy5vdXQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgIDM3ODYgQXByICA5IDIzOjEzIExvZy5wcm9ncmVzcy5vdXQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgIDg4ODc5NjAgQXByICA5IDIzOjEzIFNKLm91dC50YWINCg0KZHJ3eC0tLS0tLSAyIHVidW50dSB1YnVudHUgICAgICAgIDQwOTYgQXByICA5IDIyOjQxIF9TVEFSZ2Vub21lDQoNCg0KDQojIyMjIDFhbGlnbiQgY2F0IExvZy5maW5hbC5vdXQgDQoNCmBgYA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRlZCBqb2Igb24gfAlBcHIgMDkgMjI6Mzk6MTUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRlZCBtYXBwaW5nIG9uIHwJQXByIDA5IDIyOjQyOjQzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaW5pc2hlZCBvbiB8CUFwciAwOSAyMzoxMzozNQ0KICAgICAgIE1hcHBpbmcgc3BlZWQsIE1pbGxpb24gb2YgcmVhZHMgcGVyIGhvdXIgfAkyMDQuMjgNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2YgaW5wdXQgcmVhZHMgfAkxMDUwODkxNTANCiAgICAgICAgICAgICAgICAgICAgICBBdmVyYWdlIGlucHV0IHJlYWQgbGVuZ3RoIHwJMjAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTklRVUUgUkVBRFM6DQogICAgICAgICAgICAgICAgICAgVW5pcXVlbHkgbWFwcGVkIHJlYWRzIG51bWJlciB8CTk2ODI0MDA5DQogICAgICAgICAgICAgICAgICAgICAgICBVbmlxdWVseSBtYXBwZWQgcmVhZHMgJSB8CTkyLjE0JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICBBdmVyYWdlIG1hcHBlZCBsZW5ndGggfAkyMDAuOTINCiAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIHNwbGljZXM6IFRvdGFsIHwJNDE3MzEzMTANCiAgICAgICAgICAgIE51bWJlciBvZiBzcGxpY2VzOiBBbm5vdGF0ZWQgKHNqZGIpIHwJNDEwOTk0NzcNCiAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIHNwbGljZXM6IEdUL0FHIHwJNDEyMTE2MzANCiAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIHNwbGljZXM6IEdDL0FHIHwJMzQyNTY5DQogICAgICAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBzcGxpY2VzOiBBVC9BQyB8CTQyMjI1DQogICAgICAgICAgICAgICBOdW1iZXIgb2Ygc3BsaWNlczogTm9uLWNhbm9uaWNhbCB8CTEzNDg4Ng0KICAgICAgICAgICAgICAgICAgICAgIE1pc21hdGNoIHJhdGUgcGVyIGJhc2UsICUgfAkwLjI5JQ0KICAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0aW9uIHJhdGUgcGVyIGJhc2UgfAkwLjAyJQ0KICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRpb24gYXZlcmFnZSBsZW5ndGggfAkxLjU3DQogICAgICAgICAgICAgICAgICAgICAgICBJbnNlcnRpb24gcmF0ZSBwZXIgYmFzZSB8CTAuMDElDQogICAgICAgICAgICAgICAgICAgICAgIEluc2VydGlvbiBhdmVyYWdlIGxlbmd0aCB8CTEuNDgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVVMVEktTUFQUElORyBSRUFEUzoNCiAgICAgICAgTnVtYmVyIG9mIHJlYWRzIG1hcHBlZCB0byBtdWx0aXBsZSBsb2NpIHwJNjI2MjkxMg0KICAgICAgICAgICAgICUgb2YgcmVhZHMgbWFwcGVkIHRvIG11bHRpcGxlIGxvY2kgfAk1Ljk2JQ0KICAgICAgICBOdW1iZXIgb2YgcmVhZHMgbWFwcGVkIHRvIHRvbyBtYW55IGxvY2kgfAk2MjY0Mg0KICAgICAgICAgICAgICUgb2YgcmVhZHMgbWFwcGVkIHRvIHRvbyBtYW55IGxvY2kgfAkwLjA2JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOTUFQUEVEIFJFQURTOg0KICAgICAgICUgb2YgcmVhZHMgdW5tYXBwZWQ6IHRvbyBtYW55IG1pc21hdGNoZXMgfAkwLjAwJQ0KICAgICAgICAgICAgICAgICAlIG9mIHJlYWRzIHVubWFwcGVkOiB0b28gc2hvcnQgfAkxLjgzJQ0KICAgICAgICAgICAgICAgICAgICAgJSBvZiByZWFkcyB1bm1hcHBlZDogb3RoZXIgfAkwLjAyJQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENISU1FUklDIFJFQURTOg0KICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2YgY2hpbWVyaWMgcmVhZHMgfAkwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJSBvZiBjaGltZXJpYyByZWFkcyB8CTAuMDAlDQoNCmBgYA0KDQoNCiMjIyMgMWFsaWduJCBzYW10b29scyBmbGFnc3RhdCBBbGlnbmVkLnRvVHJhbnNjcmlwdG9tZS5vdXQuYmFtIA0KDQpgYGANCjM5OTM0ODU0MiArIDAgaW4gdG90YWwgKFFDLXBhc3NlZCByZWFkcyArIFFDLWZhaWxlZCByZWFkcykNCjI2MDU2OTQ3MCArIDAgc2Vjb25kYXJ5DQowICsgMCBzdXBwbGVtZW50YXJ5DQowICsgMCBkdXBsaWNhdGVzDQozOTkzNDg1NDIgKyAwIG1hcHBlZCAoMTAwLjAwJSA6IE4vQSkNCjEzODc3OTA3MiArIDAgcGFpcmVkIGluIHNlcXVlbmNpbmcNCjY5Mzg5NTM2ICsgMCByZWFkMQ0KNjkzODk1MzYgKyAwIHJlYWQyDQoxMzg3NzkwNzIgKyAwIHByb3Blcmx5IHBhaXJlZCAoMTAwLjAwJSA6IE4vQSkNCjEzODc3OTA3MiArIDAgd2l0aCBpdHNlbGYgYW5kIG1hdGUgbWFwcGVkDQowICsgMCBzaW5nbGV0b25zICgwLjAwJSA6IE4vQSkNCjAgKyAwIHdpdGggbWF0ZSBtYXBwZWQgdG8gYSBkaWZmZXJlbnQgY2hyDQowICsgMCB3aXRoIG1hdGUgbWFwcGVkIHRvIGEgZGlmZmVyZW50IGNociAobWFwUT49NSkNCg0KYGBgDQoNCg0KDQoNCg0K